void RenderableObject::Init() { //setup vao and vbo stuff glGenVertexArrays(1, &vaoID); glGenBuffers(1, &vboVerticesID); glGenBuffers(1, &vboIndicesID); //get total vertices and indices totalVertices = GetTotalVertices(); totalIndices = GetTotalIndices(); primType = GetPrimitiveType(); //now allocate buffers glBindVertexArray(vaoID); glBindBuffer (GL_ARRAY_BUFFER, vboVerticesID); glBufferData (GL_ARRAY_BUFFER, totalVertices * sizeof(glm::vec3), 0, GL_STATIC_DRAW); GLfloat* pBuffer = static_cast<GLfloat*>(glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY)); FillVertexBuffer(pBuffer); glUnmapBuffer(GL_ARRAY_BUFFER); glEnableVertexAttribArray(shader["vVertex"]); glVertexAttribPointer(shader["vVertex"], 3, GL_FLOAT, GL_FALSE,0,0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboIndicesID); glBufferData(GL_ELEMENT_ARRAY_BUFFER, totalIndices * sizeof(GLuint), 0, GL_STATIC_DRAW); GLuint* pIBuffer = static_cast<GLuint*>(glMapBuffer(GL_ELEMENT_ARRAY_BUFFER, GL_WRITE_ONLY)); FillIndexBuffer(pIBuffer); glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER); glBindVertexArray(0); }
int Load3ds::ProcessNextObjectChunk(Chunk * aPreviousChunk) { mCurrentChunk = new Chunk; size_t numberOfBytesRead; while (aPreviousChunk->mBytesRead < aPreviousChunk->mLength) { ReadChunk(mCurrentChunk); switch (mCurrentChunk->mID) { case OBJTRIMESH: // at this point, mBuffer will contain the name of the object being described ProcessNextObjectChunk(mCurrentChunk); ComputeNormals(); break; case TRIVERT: FillVertexBuffer(mCurrentChunk); break; case TRIFACE: FillIndexBuffer(mCurrentChunk); break; case TRIFACEMAT: // your getting a list of triangles that belong to a certain material SortIndicesByMaterial(mCurrentChunk); break; case TRIUV: FillTexCoordBuffer(mCurrentChunk); break; default: // unrecognized/unsupported chunk mCurrentChunk->mBytesRead += numberOfBytesRead = fread(mBuffer, 1, mCurrentChunk->mLength - mCurrentChunk->mBytesRead, mFile); #ifdef __BIG_ENDIAN__ for (int i = 0; i < numberOfBytesRead; i++) { static_cast<short *>(mBuffer)[i] = OSReadSwapInt16(&static_cast<short*>(mBuffer)[i],0); } #endif break; } aPreviousChunk->mBytesRead += mCurrentChunk->mBytesRead; } delete mCurrentChunk; mCurrentChunk = aPreviousChunk; return 1; }
bool ZTerrain::Cull( Frustum* pFrustum ,float loose ) { if (!m_bShow) return false; cCollision::STATE retCS=cCollision::CheckWorldFrustum(*pFrustum,m_BoundingSphere,0.0f); if( retCS == cCollision::OUTSIDE) return false; FillIndexBuffer(*pFrustum); return true; }