iVertexBuffer* cVertexBufferOGL::CreateCopy(eVertexBufferUsageType aUsageType) { cVertexBufferOGL *pVtxBuff = hplNew( cVertexBufferOGL,(mpLowLevelGraphics, mVertexFlags,mDrawType,aUsageType, GetVertexNum(),GetIndexNum()) ); //Copy the vertices to the new buffer. for(int i=0; i < klNumOfVertexFlags; i++) { if(kvVertexFlags[i] & mVertexFlags) { int lElements = kvVertexElements[i]; if(mbTangents && kvVertexFlags[i] == eVertexFlag_Texture1) lElements=4; pVtxBuff->ResizeArray(kvVertexFlags[i], (int)mvVertexArray[i].size()); memcpy(pVtxBuff->GetArray(kvVertexFlags[i]), &mvVertexArray[i][0], mvVertexArray[i].size() * sizeof(float)); } } //Copy indices to the new buffer pVtxBuff->ResizeIndices(GetIndexNum()); memcpy(pVtxBuff->GetIndices(), GetIndices(), GetIndexNum() * sizeof(unsigned int) ); pVtxBuff->mbTangents = mbTangents; pVtxBuff->mbHasShadowDouble = mbHasShadowDouble; pVtxBuff->Compile(0); return pVtxBuff; }
void TerrainRenderable::MakeIndexBuffer() { auto device = Globals::GetDevice()->GetDeviceD3D9(); HRESULT res = device->CreateIndexBuffer(GetIndexNum() * sizeof(WORD), D3DUSAGE_WRITEONLY, D3DFMT_INDEX16, D3DPOOL_MANAGED, &m_pIB, 0); if (res != S_OK) ReportErr("Terrain CreateIB Failed"); WORD* g_Indices = 0; res = m_pIB->Lock(0, 0, (void**)&g_Indices, 0); for (int y = 0; y < terrain_h-1; ++y) { for (int x = 0; x < terrain_w-1; ++x) { m_IndexData.push_back((x + 0) + (y + 0)*terrain_w); m_IndexData.push_back((x + 0) + (y + 1)*terrain_w); m_IndexData.push_back((x + 1) + (y + 1)*terrain_w); m_IndexData.push_back((x + 0) + (y + 0)*terrain_w); m_IndexData.push_back((x + 1) + (y + 1)*terrain_w); m_IndexData.push_back((x + 1) + (y + 0)*terrain_w); } } WORD* first=&(m_IndexData[0]); memcpy_s(g_Indices,GetIndexNum() * sizeof(WORD),first,GetIndexNum() * sizeof(WORD)); res = m_pIB->Unlock(); }
bool cVertexBufferOGL::Compile(tVertexCompileFlag aFlags) { if(aFlags & eVertexCompileFlag_CreateTangents) { mbTangents = true; mVertexFlags |= eVertexFlag_Texture1; int idx = cMath::Log2ToInt((int)eVertexFlag_Texture1); int lSize = GetVertexNum()*4; mvVertexArray[idx].resize(lSize); cMath::CreateTriTangentVectors(&(mvVertexArray[cMath::Log2ToInt((int)eVertexFlag_Texture1)][0]), &mvIndexArray[0], GetIndexNum(), &(mvVertexArray[cMath::Log2ToInt((int)eVertexFlag_Position)][0]), kvVertexElements[cMath::Log2ToInt((int)eVertexFlag_Position)], &(mvVertexArray[cMath::Log2ToInt((int)eVertexFlag_Texture0)][0]), &(mvVertexArray[cMath::Log2ToInt((int)eVertexFlag_Normal)][0]), GetVertexNum() ); } return true; }
void TerrainRenderablePlane::MakeIndexBuffer() { auto device = Globals::GetDevice()->GetDeviceD3D9(); HRESULT res = device->CreateIndexBuffer(GetIndexNum() * sizeof(WORD), D3DUSAGE_WRITEONLY, D3DFMT_INDEX16, D3DPOOL_MANAGED, &m_pIB, 0); if (res != S_OK) ReportErr("Terrain CreateIB Failed"); WORD* g_Indices = 0; res = m_pIB->Lock(0, 0, (void**)&g_Indices, 0); m_IndexData.push_back(0); m_IndexData.push_back(1); m_IndexData.push_back(2); m_IndexData.push_back(0); m_IndexData.push_back(2); m_IndexData.push_back(3); WORD* first = &(m_IndexData[0]); memcpy_s(g_Indices, GetIndexNum() * sizeof(WORD), first, GetIndexNum() * sizeof(WORD)); res = m_pIB->Unlock(); }
void cVertexBufferOGL::Draw(eVertexBufferDrawType aDrawType) { eVertexBufferDrawType drawType = aDrawType == eVertexBufferDrawType_LastEnum ? mDrawType : aDrawType; /////////////////////////////// //Get the draw type GLenum mode = GL_TRIANGLES; if(drawType==eVertexBufferDrawType_Quad) mode = GL_QUADS; else if(drawType==eVertexBufferDrawType_Lines) mode = GL_LINE_STRIP; int lSize = mlElementNum; if(mlElementNum<0) lSize = GetIndexNum(); glDrawElements(mode,lSize,GL_UNSIGNED_INT, &mvIndexArray[0]); }
void cVertexBufferVBO::Draw(eVertexBufferDrawType aDrawType) { eVertexBufferDrawType drawType = aDrawType == eVertexBufferDrawType_LastEnum ? mDrawType : aDrawType; /////////////////////////////// //Get the draw type GLenum mode = GL_TRIANGLES; if(drawType==eVertexBufferDrawType_Quad) mode = GL_QUADS; else if(drawType==eVertexBufferDrawType_Lines) mode = GL_LINE_STRIP; ////////////////////////////////// //Bind and draw the buffer glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB,mlElementHandle); int lSize = mlElementNum; if(mlElementNum<0) lSize = GetIndexNum(); glDrawElements(mode,lSize,GL_UNSIGNED_INT, (char*) NULL); glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB,0); }
void cVertexBufferVBO::UpdateData(tVertexFlag aTypes, bool abIndices) { GLenum usageType = GL_STATIC_DRAW_ARB; if(mUsageType== eVertexBufferUsageType_Dynamic) usageType = GL_DYNAMIC_DRAW_ARB; else if(mUsageType== eVertexBufferUsageType_Stream) usageType = GL_STREAM_DRAW_ARB; //Create the VBO vertex arrays for(int i=0;i< klNumOfVertexFlags; i++) { if((mVertexFlags & kvVertexFlags[i]) && (aTypes & kvVertexFlags[i])) { glBindBufferARB(GL_ARRAY_BUFFER_ARB, mvArrayHandle[i]); //This was apparently VERY slow. glBufferDataARB(GL_ARRAY_BUFFER_ARB, mvVertexArray[i].size()*sizeof(float), NULL, usageType);//Clear memory glBufferDataARB(GL_ARRAY_BUFFER_ARB, mvVertexArray[i].size()*sizeof(float), &(mvVertexArray[i][0]), usageType); } } glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); //Create the VBO index array if(abIndices) { glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB,mlElementHandle); //glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB,GetIndexNum()*sizeof(unsigned int), // NULL, usageType); glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, GetIndexNum()*sizeof(unsigned int), &mvIndexArray[0], usageType); glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB,0); } }
bool cVertexBufferVBO::Compile(tVertexCompileFlag aFlags) { if(mbCompiled) return false; mbCompiled = true; //Create tangents if(aFlags & eVertexCompileFlag_CreateTangents) { mbTangents = true; mVertexFlags |= eVertexFlag_Texture1; int idx = cMath::Log2ToInt((int)eVertexFlag_Texture1); int lSize = GetVertexNum()*4; mvVertexArray[idx].resize(lSize); cMath::CreateTriTangentVectors(&(mvVertexArray[cMath::Log2ToInt((int)eVertexFlag_Texture1)][0]), &mvIndexArray[0], GetIndexNum(), &(mvVertexArray[cMath::Log2ToInt((int)eVertexFlag_Position)][0]), kvVertexElements[cMath::Log2ToInt((int)eVertexFlag_Position)], &(mvVertexArray[cMath::Log2ToInt((int)eVertexFlag_Texture0)][0]), &(mvVertexArray[cMath::Log2ToInt((int)eVertexFlag_Normal)][0]), GetVertexNum() ); } GLenum usageType = GL_STATIC_DRAW_ARB; if(mUsageType== eVertexBufferUsageType_Dynamic) usageType = GL_DYNAMIC_DRAW_ARB; else if(mUsageType== eVertexBufferUsageType_Stream) usageType = GL_STREAM_DRAW_ARB; //Create the VBO vertex arrays for(int i=0;i< klNumOfVertexFlags; i++) { if(mVertexFlags & kvVertexFlags[i]) { glGenBuffersARB(1,(GLuint *)&mvArrayHandle[i]); glBindBufferARB(GL_ARRAY_BUFFER_ARB, mvArrayHandle[i]); glBufferDataARB(GL_ARRAY_BUFFER_ARB, mvVertexArray[i].size()*sizeof(float), &(mvVertexArray[i][0]), usageType); glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); //Log("%d-Handle: %d, size: %d \n",i,mvArrayHandle[i], mvVertexArray); } } //Create the VBO index array glGenBuffersARB(1,(GLuint *)&mlElementHandle); glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB,mlElementHandle); glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, GetIndexNum()*sizeof(unsigned int), &mvIndexArray[0], usageType); glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB,0); //Log("VBO compile done!\n"); return true; }