void STKMeshSceneNode::updatevbo() { for (unsigned i = 0; i < Mesh->getMeshBufferCount(); ++i) { scene::IMeshBuffer* mb = Mesh->getMeshBuffer(i); if (!mb) continue; GLMesh &mesh = GLmeshes[i]; glDeleteBuffers(1, &(mesh.vertex_buffer)); glDeleteBuffers(1, &(mesh.index_buffer)); glDeleteVertexArrays(1, &(mesh.vao)); fillLocalBuffer(mesh, mb); mesh.vao = createVAO(mesh.vertex_buffer, mesh.index_buffer, mb->getVertexType()); } }
void STKMeshSceneNode::updateGL() { if (isGLInitialized) return; for (u32 i = 0; i < Mesh->getMeshBufferCount(); ++i) { scene::IMeshBuffer* mb = Mesh->getMeshBuffer(i); if (!mb) continue; GLMesh &mesh = GLmeshes[i]; irr::video::IVideoDriver* driver = irr_driver->getVideoDriver(); video::E_MATERIAL_TYPE type = mb->getMaterial().MaterialType; video::IMaterialRenderer* rnd = driver->getMaterialRenderer(type); if (!rnd->isTransparent()) { Material* material = material_manager->getMaterialFor(mb->getMaterial().getTexture(0), mb); Material* material2 = NULL; if (mb->getMaterial().getTexture(1) != NULL) material2 = material_manager->getMaterialFor(mb->getMaterial().getTexture(1), mb); Material::ShaderType MatType = MaterialTypeToMeshMaterial(type, mb->getVertexType(), material, material2); if (!immediate_draw) InitTextures(mesh, MatType); } else if (!immediate_draw) InitTexturesTransparent(mesh); if (!immediate_draw && irr_driver->hasARB_base_instance()) { std::pair<unsigned, unsigned> p = VAOManager::getInstance()->getBase(mb); mesh.vaoBaseVertex = p.first; mesh.vaoOffset = p.second; } else { fillLocalBuffer(mesh, mb); mesh.vao = createVAO(mesh.vertex_buffer, mesh.index_buffer, mb->getVertexType()); glBindVertexArray(0); } } isGLInitialized = true; }