# HG changeset patch # User John Tsiombikas # Date 1344482427 -10800 # Node ID 1f61f2a02832cd55eea107d62dd1769903b49864 # Parent 96de911d05d4ffc58b3d03ba4880348793825b05 added mesh class diff -r 96de911d05d4 -r 1f61f2a02832 prototype/src/mesh.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/prototype/src/mesh.cc Thu Aug 09 06:20:27 2012 +0300 @@ -0,0 +1,122 @@ +#include "mesh.h" +#include "opengl.h" + +Mesh::Mesh() +{ + nverts = nfaces = 0; + for(int i=0; imNumVertices; + nfaces = aim->mNumFaces; + + glGenBuffers(1, vbo + MESH_ATTR_VERTEX); + glBindBuffer(GL_ARRAY_BUFFER, vbo[MESH_ATTR_VERTEX]); + glBufferData(GL_ARRAY_BUFFER, nverts * sizeof *aim->mVertices, aim->mVertices, GL_STATIC_DRAW); + + if(aim->mNormals) { + glGenBuffers(1, vbo + MESH_ATTR_NORMAL); + glBindBuffer(GL_ARRAY_BUFFER, vbo[MESH_ATTR_NORMAL]); + glBufferData(GL_ARRAY_BUFFER, nverts * sizeof *aim->mNormals, aim->mNormals, GL_STATIC_DRAW); + } + if(aim->mTangents) { + glGenBuffers(1, vbo + MESH_ATTR_TANGENT); + glBindBuffer(GL_ARRAY_BUFFER, vbo[MESH_ATTR_TANGENT]); + glBufferData(GL_ARRAY_BUFFER, nverts * sizeof *aim->mTangents, aim->mTangents, GL_STATIC_DRAW); + } + if(aim->mTextureCoords[0]) { + glGenBuffers(1, vbo + MESH_ATTR_TEXCOORD); + glBindBuffer(GL_ARRAY_BUFFER, vbo[MESH_ATTR_TEXCOORD]); + glBufferData(GL_ARRAY_BUFFER, nverts * sizeof *aim->mTextureCoords[0], aim->mTextureCoords[0], GL_STATIC_DRAW); + } + + glGenBuffers(1, &ibo); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, nfaces * 3 * sizeof *aim->mFaces[0].mIndices, 0, GL_STATIC_DRAW); + + /* map the buffer and fill it up */ + unsigned int *iptr = (unsigned int*)glMapBuffer(GL_ELEMENT_ARRAY_BUFFER, GL_WRITE_ONLY); + + for(int i=0; imFaces[i].mIndices[j]; + } + } + glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER); + return true; +} + +void Mesh::destroy() +{ + for(int i=0; i= 0) { + glBindBuffer(GL_ARRAY_BUFFER, vbo[MESH_ATTR_TANGENT]); + glVertexAttribPointer(tang_loc, 3, GL_FLOAT, GL_FALSE, 0, 0); + glEnableVertexAttribArray(tang_loc); + } + if(vbo[MESH_ATTR_TEXCOORD]) { + glBindBuffer(GL_ARRAY_BUFFER, vbo[MESH_ATTR_TEXCOORD]); + glTexCoordPointer(3, GL_FLOAT, 0, 0); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + } + + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo); + glDrawElements(GL_TRIANGLES, nfaces * 3, GL_UNSIGNED_INT, 0); + + glDisableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_NORMAL_ARRAY); + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + if(tang_loc >= 0) { + glDisableVertexAttribArray(tang_loc); + } +} diff -r 96de911d05d4 -r 1f61f2a02832 prototype/src/mesh.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/prototype/src/mesh.h Thu Aug 09 06:20:27 2012 +0300 @@ -0,0 +1,42 @@ +#ifndef MESH_H_ +#define MESH_H_ + +#include +#include +#include + +enum { + MESH_ATTR_VERTEX, + MESH_ATTR_NORMAL, + MESH_ATTR_TANGENT, + MESH_ATTR_TEXCOORD, + + NUM_MESH_ATTR +}; + + +class Mesh { +private: + std::string name; + + unsigned int nverts, nfaces; + + unsigned int vbo[NUM_MESH_ATTR]; + unsigned int ibo; + + int tang_loc; + +public: + Mesh(); + ~Mesh(); + + bool create(const aiScene *scn, aiMesh *aim); + void destroy(); + + void set_attrib_location(int attr, int loc); + int get_attrib_location(int attr) const; + + void draw() const; +}; + +#endif // MESH_H_ diff -r 96de911d05d4 -r 1f61f2a02832 prototype/src/tile.h --- a/prototype/src/tile.h Thu Jun 28 06:05:50 2012 +0300 +++ b/prototype/src/tile.h Thu Aug 09 06:20:27 2012 +0300 @@ -1,7 +1,13 @@ #ifndef TILE_H_ #define TILE_H_ +#include +#include "mesh.h" + class Tile { +private: + std::vector meshes; + public: bool load(const char *fname);