class, so that the calling code does not need to know what the backend is.legacy
| @@ -118,15 +118,39 @@ void VertexDeclaration::Bind() | |||
| #endif | |||
| } | |||
| void VertexDeclaration::DrawElements(MeshPrimitive type, int skip, int count) | |||
| { | |||
| #if defined _XBOX || defined USE_D3D9 | |||
| g_d3ddevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW); | |||
| switch (type) | |||
| { | |||
| case MeshPrimitive::Triangles: | |||
| g_d3ddevice->DrawPrimitive(D3DPT_TRIANGLELIST, skip, count); | |||
| break; | |||
| } | |||
| #else | |||
| switch (type) | |||
| { | |||
| case MeshPrimitive::Triangles: | |||
| glDrawArrays(GL_TRIANGLES, skip * 3, count * 3); | |||
| break; | |||
| } | |||
| #endif | |||
| } | |||
| void VertexDeclaration::Unbind() | |||
| { | |||
| #if defined _XBOX || defined USE_D3D9 | |||
| /* FIXME: Nothing to do? */ | |||
| #else | |||
| /* FIXME: we need to record what happens */ | |||
| /* FIXME: we need to unbind what we bound */ | |||
| //glDisableVertexAttribArray(m_attrib); | |||
| /* FIXME: only useful for VAOs */ | |||
| //glBindBuffer(GL_ARRAY_BUFFER, 0); | |||
| /* Or: */ | |||
| //glDisableVertexAttribArray(m_attrib); | |||
| /* Or even: */ | |||
| //glDisableClientState(GL_VERTEX_ARRAY); | |||
| #endif | |||
| } | |||
| @@ -185,15 +209,12 @@ void VertexDeclaration::SetStream(VertexBuffer *vb, ShaderAttrib attr1, | |||
| /* We need to parse the whole vertex declaration to retrieve | |||
| * the information. It sucks. */ | |||
| int attr_index = 0, usage_index = 0, stream = -1; | |||
| int attr_index = 0, usage_index = 0; | |||
| /* First, find the stream index */ | |||
| for (; attr_index < m_count; attr_index++) | |||
| if (m_streams[attr_index].usage == usage) | |||
| if (usage_index++ == index) | |||
| { | |||
| stream = m_streams[attr_index].index; | |||
| break; | |||
| } | |||
| /* Now compute the stride and offset up to this stream index */ | |||
| int stride = 0, offset = 0; | |||
| @@ -61,6 +61,18 @@ struct VertexUsage | |||
| inline operator Value() { return m_value; } | |||
| }; | |||
| struct MeshPrimitive | |||
| { | |||
| enum Value | |||
| { | |||
| Triangles, | |||
| } | |||
| m_value; | |||
| inline MeshPrimitive(Value v) { m_value = v; } | |||
| inline operator Value() { return m_value; } | |||
| }; | |||
| class VertexStreamBase | |||
| { | |||
| friend class VertexDeclaration; | |||
| @@ -164,6 +176,7 @@ public: | |||
| ~VertexDeclaration(); | |||
| void Bind(); | |||
| void DrawElements(MeshPrimitive type, int skip, int count); | |||
| void Unbind(); | |||
| void SetStream(VertexBuffer *vb, ShaderAttrib attr1, | |||
| ShaderAttrib attr2 = ShaderAttrib(), | |||
| @@ -13,18 +13,11 @@ | |||
| #endif | |||
| #include "core.h" | |||
| #include "lolgl.h" | |||
| #include "loldebug.h" | |||
| using namespace std; | |||
| using namespace lol; | |||
| #if defined _WIN32 && defined USE_D3D9 | |||
| # define FAR | |||
| # define NEAR | |||
| # include <d3d9.h> | |||
| #endif | |||
| #if USE_SDL && defined __APPLE__ | |||
| # include <SDL_main.h> | |||
| #endif | |||
| @@ -38,12 +31,6 @@ using namespace lol; | |||
| # include <direct.h> | |||
| #endif | |||
| #if defined USE_D3D9 | |||
| extern IDirect3DDevice9 *g_d3ddevice; | |||
| #elif defined _XBOX | |||
| extern D3DDevice *g_d3ddevice; | |||
| #endif | |||
| class Triangle : public WorldEntity | |||
| { | |||
| public: | |||
| @@ -61,21 +48,6 @@ public: | |||
| if (!m_ready) | |||
| { | |||
| m_shader = Shader::Create( | |||
| #if !defined __CELLOS_LV2__ && !defined _XBOX && !defined USE_D3D9 | |||
| "#version 120\n" | |||
| @@ -116,36 +88,16 @@ public: | |||
| m_shader->Bind(); | |||
| m_vdecl->Bind(); | |||
| m_vdecl->SetStream(m_vbo, m_coord); | |||
| #if defined _XBOX || defined USE_D3D9 | |||
| g_d3ddevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW); | |||
| #endif | |||
| #if defined _XBOX || defined USE_D3D9 | |||
| g_d3ddevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1); | |||
| #else | |||
| glDrawArrays(GL_TRIANGLES, 0, 3); | |||
| #endif | |||
| m_vdecl->DrawElements(MeshPrimitive::Triangles, 0, 1); | |||
| m_vdecl->Unbind(); | |||
| #if defined _XBOX || defined USE_D3D9 | |||
| /* FIXME: do we need to unset anything here? */ | |||
| #elif !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined __APPLE__ | |||
| //glDisableVertexAttribArray(m_attrib); | |||
| //glBindBuffer(GL_ARRAY_BUFFER, 0); | |||
| #elif !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined __APPLE__ | |||
| /* Never used for now */ | |||
| glDisableVertexAttribArray(m_attrib); | |||
| #else | |||
| glDisableClientState(GL_VERTEX_ARRAY); | |||
| #endif | |||
| } | |||
| private: | |||
| vec2 m_vertices[3]; | |||
| Shader *m_shader; | |||
| ShaderAttrib m_coord; | |||
| VertexDeclaration *m_vdecl; | |||
| VertexBuffer *m_vbo; | |||
| ShaderAttrib m_coord; | |||
| bool m_ready; | |||
| }; | |||