STKMesh: Some more code to load vertex data, but rendering is still using old path

git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@14999 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
vincentlj 2014-01-11 18:12:04 +00:00
parent 2aea7a2624
commit d255f4f049
2 changed files with 107 additions and 1 deletions

View File

@ -2,7 +2,54 @@
#include "graphics/irr_driver.hpp"
#include <ISceneManager.h>
#include <IMaterialRenderer.h>
#include "glwrap.hpp"
static
void allocateMeshBuffer(scene::IMeshBuffer* mb, GLuint &vbo, GLuint idx)
{
GLuint bufferid, indexbufferid;
glGenBuffers(1, &bufferid);
glGenBuffers(1, &indexbufferid);
glBindBuffer(GL_ARRAY_BUFFER, bufferid);
const void* vertices=mb->getVertices();
const u32 vertexCount=mb->getVertexCount();
const irr::video::E_VERTEX_TYPE vType=mb->getVertexType();
const u32 vertexSize = getVertexPitchFromType(vType);
const c8* vbuf = static_cast<const c8*>(vertices);
core::array<c8> buffer;
buffer.set_used(vertexSize * vertexCount);
memcpy(buffer.pointer(), vertices, vertexSize * vertexCount);
vbuf = buffer.const_pointer();
glBufferData(GL_ARRAY_BUFFER, vertexCount * vertexSize, vbuf, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexbufferid);
const void* indices=mb->getIndices();
u32 indexCount= mb->getIndexCount();
GLenum indexSize;
switch (mb->getIndexType())
{
case irr::video::EIT_16BIT:
{
indexSize=sizeof(u16);
break;
}
case irr::video::EIT_32BIT:
{
indexSize=sizeof(u32);
break;
}
default:
{
assert(0 && "Wrong index size");
}
}
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexCount * indexSize, indices, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
vbo = bufferid;
idx = indexbufferid;
}
STKMesh::STKMesh(irr::scene::IMesh* mesh, ISceneNode* parent, irr::scene::ISceneManager* mgr, irr::s32 id,
const irr::core::vector3df& position,
@ -15,9 +62,59 @@ STKMesh::STKMesh(irr::scene::IMesh* mesh, ISceneNode* parent, irr::scene::IScene
scene::IMeshBuffer* mb = Mesh->getMeshBuffer(i);
if (!mb)
continue;
GLuint vbo, idx;
allocateMeshBuffer(mb, vbo, idx);
vertex_buffer.push_back(vbo);
index_buffer.push_back(idx);
Indexcount.push_back(mb->getIndexCount());
switch (mb->getPrimitiveType())
{
case scene::EPT_POINTS:
Primitivetype.push_back(GL_POINTS);
break;
case scene::EPT_TRIANGLE_STRIP:
Primitivetype.push_back(GL_TRIANGLE_STRIP);
break;
case scene::EPT_TRIANGLE_FAN:
Primitivetype.push_back(GL_TRIANGLE_FAN);
break;
case scene::EPT_LINES:
Primitivetype.push_back(GL_LINES);
case scene::EPT_TRIANGLES:
Primitivetype.push_back(GL_TRIANGLES);
break;
case scene::EPT_POINT_SPRITES:
case scene::EPT_LINE_LOOP:
case scene::EPT_POLYGON:
case scene::EPT_LINE_STRIP:
case scene::EPT_QUAD_STRIP:
case scene::EPT_QUADS:
assert(0 && "Unsupported primitive type");
}
}
}
STKMesh::~STKMesh()
{
glDeleteBuffers(vertex_buffer.size(), vertex_buffer.data());
glDeleteBuffers(index_buffer.size(), index_buffer.data());
}
void STKMesh::draw(unsigned i)
{
GLuint vbo = vertex_buffer[i], idx = index_buffer[i];
GLenum ptype = Primitivetype[i];
size_t count = Indexcount[i];
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, idx);
/* glNormalPointer(GL_FLOAT, sizeof(S3DVertex2TCoords), buffer_offset(12));
glColorPointer(colorSize, GL_UNSIGNED_BYTE, sizeof(S3DVertex2TCoords), buffer_offset(24));
glTexCoordPointer(2, GL_FLOAT, sizeof(S3DVertex2TCoords), buffer_offset(28));
glVertexPointer(3, GL_FLOAT, sizeof(S3DVertex2TCoords), buffer_offset(0));*/
glDrawElements(ptype, count, GL_UNSIGNED_BYTE, 0);
}
void STKMesh::render()
{
irr::video::IVideoDriver* driver = irr_driver->getVideoDriver();

View File

@ -5,15 +5,24 @@
#include <IMeshSceneNode.h>
#include <IMesh.h>
#include "../lib/irrlicht/source/Irrlicht/CMeshSceneNode.h"
#include "glwrap.hpp"
#include <vector>
class STKMesh : public irr::scene::CMeshSceneNode
{
protected:
std::vector<GLuint> vertex_buffer, index_buffer;
std::vector<GLenum> Primitivetype;
std::vector<size_t> Indexcount;
void draw(unsigned i);
public:
STKMesh(irr::scene::IMesh* mesh, ISceneNode* parent, irr::scene::ISceneManager* mgr, irr::s32 id,
const irr::core::vector3df& position = irr::core::vector3df(0,0,0),
const irr::core::vector3df& rotation = irr::core::vector3df(0,0,0),
const irr::core::vector3df& scale = irr::core::vector3df(1.0f, 1.0f, 1.0f));
virtual void render();
~STKMesh();
};
#endif // STKMESH_H