calls so that they take a number of vertices or indexes, not elements.legacy
| @@ -125,7 +125,7 @@ void EasyMesh::Render(mat4 const &model, float damage) | |||||
| m_gpu.ibo->Bind(); | m_gpu.ibo->Bind(); | ||||
| m_gpu.vdecl->DrawIndexedElements(MeshPrimitive::Triangles, | m_gpu.vdecl->DrawIndexedElements(MeshPrimitive::Triangles, | ||||
| 0, 0, m_gpu.vertexcount, | 0, 0, m_gpu.vertexcount, | ||||
| 0, m_gpu.indexcount / 3); | |||||
| 0, m_gpu.indexcount); | |||||
| m_gpu.ibo->Unbind(); | m_gpu.ibo->Unbind(); | ||||
| m_gpu.vdecl->Unbind(); | m_gpu.vdecl->Unbind(); | ||||
| } | } | ||||
| @@ -135,11 +135,23 @@ void VertexDeclaration::DrawElements(MeshPrimitive type, int skip, int count) | |||||
| switch (type) | switch (type) | ||||
| { | { | ||||
| case MeshPrimitive::Triangles: | case MeshPrimitive::Triangles: | ||||
| if (FAILED(g_d3ddevice->DrawPrimitive(D3DPT_TRIANGLELIST, skip, count))) | |||||
| if (FAILED(g_d3ddevice->DrawPrimitive(D3DPT_TRIANGLELIST, | |||||
| skip, count))) | |||||
| Abort(); | |||||
| break; | |||||
| case MeshPrimitive::TriangleStrips: | |||||
| if (FAILED(g_d3ddevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, | |||||
| skip, count))) | |||||
| Abort(); | |||||
| break; | |||||
| case MeshPrimitive::TriangleFans: | |||||
| if (FAILED(g_d3ddevice->DrawPrimitive(D3DPT_TRIANGLEFAN, | |||||
| skip, count))) | |||||
| Abort(); | Abort(); | ||||
| break; | break; | ||||
| case MeshPrimitive::Points: | case MeshPrimitive::Points: | ||||
| if (FAILED(g_d3ddevice->DrawPrimitive(D3DPT_POINTLIST, skip, count))) | |||||
| if (FAILED(g_d3ddevice->DrawPrimitive(D3DPT_POINTLIST, | |||||
| skip, count))) | |||||
| Abort(); | Abort(); | ||||
| break; | break; | ||||
| } | } | ||||
| @@ -157,7 +169,13 @@ void VertexDeclaration::DrawElements(MeshPrimitive type, int skip, int count) | |||||
| switch (type) | switch (type) | ||||
| { | { | ||||
| case MeshPrimitive::Triangles: | case MeshPrimitive::Triangles: | ||||
| glDrawArrays(GL_TRIANGLES, skip * 3, count * 3); | |||||
| glDrawArrays(GL_TRIANGLES, skip, count); | |||||
| break; | |||||
| case MeshPrimitive::TriangleStrips: | |||||
| glDrawArrays(GL_TRIANGLE_STRIP, skip, count); | |||||
| break; | |||||
| case MeshPrimitive::TriangleFans: | |||||
| glDrawArrays(GL_TRIANGLE_FAN, skip, count); | |||||
| break; | break; | ||||
| case MeshPrimitive::Points: | case MeshPrimitive::Points: | ||||
| glDrawArrays(GL_POINTS, skip, count); | glDrawArrays(GL_POINTS, skip, count); | ||||
| @@ -185,11 +203,23 @@ void VertexDeclaration::DrawIndexedElements(MeshPrimitive type, int vbase, | |||||
| switch (type) | switch (type) | ||||
| { | { | ||||
| case MeshPrimitive::Triangles: | case MeshPrimitive::Triangles: | ||||
| if (FAILED(g_d3ddevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, vbase, vskip, vcount, skip, count))) | |||||
| if (FAILED(g_d3ddevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, | |||||
| vbase, vskip, vcount, skip, count))) | |||||
| Abort(); | |||||
| break; | |||||
| case MeshPrimitive::TriangleStrips: | |||||
| if (FAILED(g_d3ddevice->DrawIndexedPrimitive(D3DPT_TRIANGLESTRIP, | |||||
| vbase, vskip, vcount, skip, count))) | |||||
| Abort(); | |||||
| break; | |||||
| case MeshPrimitive::TriangleFans: | |||||
| if (FAILED(g_d3ddevice->DrawIndexedPrimitive(D3DPT_TRIANGLEFAN, | |||||
| vbase, vskip, vcount, skip, count))) | |||||
| Abort(); | Abort(); | ||||
| break; | break; | ||||
| case MeshPrimitive::Points: | case MeshPrimitive::Points: | ||||
| if (FAILED(g_d3ddevice->DrawIndexedPrimitive(D3DPT_POINTLIST, vbase, vskip, vcount, skip, count))) | |||||
| if (FAILED(g_d3ddevice->DrawIndexedPrimitive(D3DPT_POINTLIST, | |||||
| vbase, vskip, vcount, skip, count))) | |||||
| Abort(); | Abort(); | ||||
| break; | break; | ||||
| } | } | ||||
| @@ -209,7 +239,17 @@ void VertexDeclaration::DrawIndexedElements(MeshPrimitive type, int vbase, | |||||
| case MeshPrimitive::Triangles: | case MeshPrimitive::Triangles: | ||||
| /* FIXME: ignores most of the arguments! */ | /* FIXME: ignores most of the arguments! */ | ||||
| (void)vbase; (void)vskip; (void)vcount; (void)skip; | (void)vbase; (void)vskip; (void)vcount; (void)skip; | ||||
| glDrawElements(GL_TRIANGLES, count * 3, GL_UNSIGNED_SHORT, 0); | |||||
| glDrawElements(GL_TRIANGLES, count, GL_UNSIGNED_SHORT, 0); | |||||
| break; | |||||
| case MeshPrimitive::TriangleStrips: | |||||
| /* FIXME: ignores most of the arguments! */ | |||||
| (void)vbase; (void)vskip; (void)vcount; (void)skip; | |||||
| glDrawElements(GL_TRIANGLE_STRIP, count, GL_UNSIGNED_SHORT, 0); | |||||
| break; | |||||
| case MeshPrimitive::TriangleFans: | |||||
| /* FIXME: ignores most of the arguments! */ | |||||
| (void)vbase; (void)vskip; (void)vcount; (void)skip; | |||||
| glDrawElements(GL_TRIANGLE_FAN, count, GL_UNSIGNED_SHORT, 0); | |||||
| break; | break; | ||||
| case MeshPrimitive::Points: | case MeshPrimitive::Points: | ||||
| /* FIXME: ignores most of the arguments! */ | /* FIXME: ignores most of the arguments! */ | ||||
| @@ -72,6 +72,8 @@ struct MeshPrimitive | |||||
| enum Value | enum Value | ||||
| { | { | ||||
| Triangles, | Triangles, | ||||
| TriangleStrips, | |||||
| TriangleFans, | |||||
| Points, | Points, | ||||
| } | } | ||||
| m_value; | m_value; | ||||
| @@ -184,9 +186,16 @@ public: | |||||
| ~VertexDeclaration(); | ~VertexDeclaration(); | ||||
| void Bind(); | void Bind(); | ||||
| /* Draw elements. See MeshPrimitive for a list of all available | |||||
| * types. Both skip and count are numbers of vertices, not primitives. */ | |||||
| void DrawElements(MeshPrimitive type, int skip, int count); | void DrawElements(MeshPrimitive type, int skip, int count); | ||||
| /* Draw elements. See MeshPrimitive for a list of all available | |||||
| * types. Both skip and count are numbers of indices, not primitives. */ | |||||
| void DrawIndexedElements(MeshPrimitive type, int vbase, int vskip, | void DrawIndexedElements(MeshPrimitive type, int vbase, int vskip, | ||||
| int vcount, int skip, int count); | int vcount, int skip, int count); | ||||
| void Unbind(); | void Unbind(); | ||||
| void SetStream(VertexBuffer *vb, ShaderAttrib attr1, | void SetStream(VertexBuffer *vb, ShaderAttrib attr1, | ||||
| ShaderAttrib attr2 = ShaderAttrib(), | ShaderAttrib attr2 = ShaderAttrib(), | ||||
| @@ -117,7 +117,7 @@ void Gradient::TickDraw(float seconds) | |||||
| data->m_vdecl->SetStream(data->m_cbo, attr_col); | data->m_vdecl->SetStream(data->m_cbo, attr_col); | ||||
| /* Draw arrays */ | /* Draw arrays */ | ||||
| data->m_vdecl->DrawElements(MeshPrimitive::Triangles, 0, 2); | |||||
| data->m_vdecl->DrawElements(MeshPrimitive::Triangles, 0, 6); | |||||
| } | } | ||||
| Gradient::~Gradient() | Gradient::~Gradient() | ||||
| @@ -255,7 +255,7 @@ void Scene::Render() // XXX: rename to Blit() | |||||
| data->m_vdecl->SetStream(vb2, attr_tex); | data->m_vdecl->SetStream(vb2, attr_tex); | ||||
| /* Draw arrays */ | /* Draw arrays */ | ||||
| data->m_vdecl->DrawElements(MeshPrimitive::Triangles, 0, (n - i) * 2); | |||||
| data->m_vdecl->DrawElements(MeshPrimitive::Triangles, 0, (n - i) * 6); | |||||
| data->m_vdecl->Unbind(); | data->m_vdecl->Unbind(); | ||||
| data->tiles[i].tileset->Unbind(); | data->tiles[i].tileset->Unbind(); | ||||
| } | } | ||||
| @@ -59,7 +59,7 @@ public: | |||||
| m_shader->Bind(); | m_shader->Bind(); | ||||
| m_vdecl->SetStream(m_vbo, m_coord); | m_vdecl->SetStream(m_vbo, m_coord); | ||||
| m_vdecl->Bind(); | m_vdecl->Bind(); | ||||
| m_vdecl->DrawElements(MeshPrimitive::Triangles, 0, 1); | |||||
| m_vdecl->DrawElements(MeshPrimitive::Triangles, 0, 3); | |||||
| m_vdecl->Unbind(); | m_vdecl->Unbind(); | ||||
| } | } | ||||
| @@ -112,7 +112,7 @@ public: | |||||
| m_vdecl->Bind(); | m_vdecl->Bind(); | ||||
| m_ibo->Bind(); | m_ibo->Bind(); | ||||
| m_vdecl->DrawIndexedElements(MeshPrimitive::Triangles, 0, 0, | m_vdecl->DrawIndexedElements(MeshPrimitive::Triangles, 0, 0, | ||||
| m_mesh.Count(), 0, m_indices.Count()); | |||||
| m_mesh.Count(), 0, m_indices.Count() * 3); | |||||
| m_ibo->Unbind(); | m_ibo->Unbind(); | ||||
| m_vdecl->Unbind(); | m_vdecl->Unbind(); | ||||
| } | } | ||||
| @@ -68,7 +68,7 @@ public: | |||||
| m_shader->SetUniform(m_time_uni, m_time); | m_shader->SetUniform(m_time_uni, m_time); | ||||
| m_vdecl->SetStream(m_vbo, m_coord); | m_vdecl->SetStream(m_vbo, m_coord); | ||||
| m_vdecl->Bind(); | m_vdecl->Bind(); | ||||
| m_vdecl->DrawElements(MeshPrimitive::Triangles, 0, 2); | |||||
| m_vdecl->DrawElements(MeshPrimitive::Triangles, 0, 6); | |||||
| m_vdecl->Unbind(); | m_vdecl->Unbind(); | ||||
| } | } | ||||
| @@ -99,7 +99,7 @@ public: | |||||
| m_shader->SetUniform(m_uni_texture, m_fbo->GetTexture(), 0); | m_shader->SetUniform(m_uni_texture, m_fbo->GetTexture(), 0); | ||||
| m_vdecl->SetStream(m_vbo, m_coord); | m_vdecl->SetStream(m_vbo, m_coord); | ||||
| m_vdecl->Bind(); | m_vdecl->Bind(); | ||||
| m_vdecl->DrawElements(MeshPrimitive::Triangles, 0, 2); | |||||
| m_vdecl->DrawElements(MeshPrimitive::Triangles, 0, 6); | |||||
| m_vdecl->Unbind(); | m_vdecl->Unbind(); | ||||
| #endif | #endif | ||||
| @@ -108,7 +108,7 @@ public: | |||||
| m_shader->SetUniform(m_uni_color, m_color); | m_shader->SetUniform(m_uni_color, m_color); | ||||
| m_vdecl->SetStream(m_vbo, m_coord); | m_vdecl->SetStream(m_vbo, m_coord); | ||||
| m_vdecl->Bind(); | m_vdecl->Bind(); | ||||
| m_vdecl->DrawElements(MeshPrimitive::Triangles, 0, 2); | |||||
| m_vdecl->DrawElements(MeshPrimitive::Triangles, 0, 6); | |||||
| m_vdecl->Unbind(); | m_vdecl->Unbind(); | ||||
| m_shader->Unbind(); | m_shader->Unbind(); | ||||
| m_fbo->Unbind(); | m_fbo->Unbind(); | ||||
| @@ -118,7 +118,7 @@ public: | |||||
| m_shader->SetUniform(m_uni_texture, m_fbo->GetTexture(), 0); | m_shader->SetUniform(m_uni_texture, m_fbo->GetTexture(), 0); | ||||
| m_vdecl->SetStream(m_vbo, m_coord); | m_vdecl->SetStream(m_vbo, m_coord); | ||||
| m_vdecl->Bind(); | m_vdecl->Bind(); | ||||
| m_vdecl->DrawElements(MeshPrimitive::Triangles, 0, 2); | |||||
| m_vdecl->DrawElements(MeshPrimitive::Triangles, 0, 6); | |||||
| m_vdecl->Unbind(); | m_vdecl->Unbind(); | ||||
| m_shader->Unbind(); | m_shader->Unbind(); | ||||
| } | } | ||||
| @@ -578,7 +578,7 @@ public: | |||||
| #elif !defined __CELLOS_LV2__ && !defined __ANDROID__ | #elif !defined __CELLOS_LV2__ && !defined __ANDROID__ | ||||
| #else | #else | ||||
| #endif | #endif | ||||
| m_vdecl->DrawElements(MeshPrimitive::Triangles, 0, 2); | |||||
| m_vdecl->DrawElements(MeshPrimitive::Triangles, 0, 6); | |||||
| m_vdecl->Unbind(); | m_vdecl->Unbind(); | ||||
| } | } | ||||