Commit e11859e8 authored by lukeph's avatar lukeph

let skinnedMesh software animate with VBOs, other small changes with VBOs, left in debug output

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@1104 dfc29bdd-3216-0410-991c-e03cc46cb475
parent d9abe1d9
...@@ -1277,7 +1277,7 @@ CNullDriver::SHWBufferLink *CNullDriver::getBufferLink(const scene::IMeshBuffer* ...@@ -1277,7 +1277,7 @@ CNullDriver::SHWBufferLink *CNullDriver::getBufferLink(const scene::IMeshBuffer*
SHWBufferLink *Link=HWBufferLinks[n]; SHWBufferLink *Link=HWBufferLinks[n];
if (Link->MeshBuffer==mb) if (Link->MeshBuffer==mb)
{ {
((scene::IMeshBuffer*)mb)->HardwareHint=n; //((scene::IMeshBuffer*)mb)->HardwareHint=n;
return Link; return Link;
} }
} }
......
...@@ -316,7 +316,7 @@ namespace video ...@@ -316,7 +316,7 @@ namespace video
virtual SHWBufferLink *getBufferLink(const scene::IMeshBuffer* mb); virtual SHWBufferLink *getBufferLink(const scene::IMeshBuffer* mb);
//! updates hardware buffer if needed (only some drivers can) //! updates hardware buffer if needed (only some drivers can)
virtual bool updateHardwareBuffer(SHWBufferLink *HWBuffer) {return true;} virtual bool updateHardwareBuffer(SHWBufferLink *HWBuffer) {return false;}
//! Create hardware buffer from mesh (only some drivers can) //! Create hardware buffer from mesh (only some drivers can)
virtual SHWBufferLink *createHardwareBuffer(const scene::IMeshBuffer* mb) {return 0;} virtual SHWBufferLink *createHardwareBuffer(const scene::IMeshBuffer* mb) {return 0;}
......
...@@ -514,6 +514,8 @@ bool COpenGLDriver::updateVertexHardwareBuffer(SHWBufferLink_opengl *HWBuffer) ...@@ -514,6 +514,8 @@ bool COpenGLDriver::updateVertexHardwareBuffer(SHWBufferLink_opengl *HWBuffer)
if (!FeatureAvailable[IRR_ARB_vertex_buffer_object]) if (!FeatureAvailable[IRR_ARB_vertex_buffer_object])
return false; return false;
#if defined(GL_ARB_vertex_buffer_object)
const scene::IMeshBuffer* mb = HWBuffer->MeshBuffer; const scene::IMeshBuffer* mb = HWBuffer->MeshBuffer;
const void* vertices=mb->getVertices(); const void* vertices=mb->getVertices();
const u32 vertexCount=mb->getVertexCount(); const u32 vertexCount=mb->getVertexCount();
...@@ -570,7 +572,7 @@ bool COpenGLDriver::updateVertexHardwareBuffer(SHWBufferLink_opengl *HWBuffer) ...@@ -570,7 +572,7 @@ bool COpenGLDriver::updateVertexHardwareBuffer(SHWBufferLink_opengl *HWBuffer)
extGlGenBuffers(1, &HWBuffer->vbo_verticesID); extGlGenBuffers(1, &HWBuffer->vbo_verticesID);
newBuffer=true; newBuffer=true;
} }
#if defined(GL_ARB_vertex_buffer_object)
extGlBindBuffer(GL_ARRAY_BUFFER, HWBuffer->vbo_verticesID ); extGlBindBuffer(GL_ARRAY_BUFFER, HWBuffer->vbo_verticesID );
//copy data to graphics card //copy data to graphics card
...@@ -587,9 +589,14 @@ bool COpenGLDriver::updateVertexHardwareBuffer(SHWBufferLink_opengl *HWBuffer) ...@@ -587,9 +589,14 @@ bool COpenGLDriver::updateVertexHardwareBuffer(SHWBufferLink_opengl *HWBuffer)
} }
extGlBindBuffer(GL_ARRAY_BUFFER, 0); extGlBindBuffer(GL_ARRAY_BUFFER, 0);
#endif
return true; return true;
#else
return false;
#endif
} }
...@@ -601,6 +608,14 @@ bool COpenGLDriver::updateIndexHardwareBuffer(SHWBufferLink_opengl *HWBuffer) ...@@ -601,6 +608,14 @@ bool COpenGLDriver::updateIndexHardwareBuffer(SHWBufferLink_opengl *HWBuffer)
if(!FeatureAvailable[IRR_ARB_vertex_buffer_object]) if(!FeatureAvailable[IRR_ARB_vertex_buffer_object])
return false; return false;
#if defined(GL_ARB_vertex_buffer_object)
const scene::IMeshBuffer* mb = HWBuffer->MeshBuffer;
const u16* indices=mb->getIndices();
u32 indexCount= mb->getIndexCount();
u32 indexSize = 2;
//get or create buffer //get or create buffer
bool newBuffer=false; bool newBuffer=false;
if (!HWBuffer->vbo_indicesID) if (!HWBuffer->vbo_indicesID)
...@@ -609,12 +624,7 @@ bool COpenGLDriver::updateIndexHardwareBuffer(SHWBufferLink_opengl *HWBuffer) ...@@ -609,12 +624,7 @@ bool COpenGLDriver::updateIndexHardwareBuffer(SHWBufferLink_opengl *HWBuffer)
newBuffer=true; newBuffer=true;
} }
#if defined(GL_ARB_vertex_buffer_object)
const scene::IMeshBuffer* mb = HWBuffer->MeshBuffer;
const u16* indices=mb->getIndices();
u32 indexCount= mb->getIndexCount();
u32 indexSize = 2;
extGlBindBuffer(GL_ELEMENT_ARRAY_BUFFER, HWBuffer->vbo_indicesID); extGlBindBuffer(GL_ELEMENT_ARRAY_BUFFER, HWBuffer->vbo_indicesID);
//copy data to graphics card //copy data to graphics card
...@@ -631,9 +641,13 @@ bool COpenGLDriver::updateIndexHardwareBuffer(SHWBufferLink_opengl *HWBuffer) ...@@ -631,9 +641,13 @@ bool COpenGLDriver::updateIndexHardwareBuffer(SHWBufferLink_opengl *HWBuffer)
} }
extGlBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); extGlBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
#endif
return true; return true;
#else
return false;
#endif
} }
...@@ -647,6 +661,9 @@ bool COpenGLDriver::updateHardwareBuffer(SHWBufferLink *HWBuffer) ...@@ -647,6 +661,9 @@ bool COpenGLDriver::updateHardwareBuffer(SHWBufferLink *HWBuffer)
|| !((SHWBufferLink_opengl*)HWBuffer)->vbo_indicesID || !((SHWBufferLink_opengl*)HWBuffer)->vbo_indicesID
|| !((SHWBufferLink_opengl*)HWBuffer)->vbo_verticesID) || !((SHWBufferLink_opengl*)HWBuffer)->vbo_verticesID)
{ {
os::Printer::log("updating vbo", ELL_ERROR);
HWBuffer->ChangedID = HWBuffer->MeshBuffer->getChangedID(); HWBuffer->ChangedID = HWBuffer->MeshBuffer->getChangedID();
if (!updateVertexHardwareBuffer((SHWBufferLink_opengl*)HWBuffer)) if (!updateVertexHardwareBuffer((SHWBufferLink_opengl*)HWBuffer))
...@@ -661,12 +678,19 @@ bool COpenGLDriver::updateHardwareBuffer(SHWBufferLink *HWBuffer) ...@@ -661,12 +678,19 @@ bool COpenGLDriver::updateHardwareBuffer(SHWBufferLink *HWBuffer)
//! Create hardware buffer from meshbuffer //! Create hardware buffer from meshbuffer
COpenGLDriver::SHWBufferLink *COpenGLDriver::createHardwareBuffer(const scene::IMeshBuffer* mb) COpenGLDriver::SHWBufferLink *COpenGLDriver::createHardwareBuffer(const scene::IMeshBuffer* mb)
{ {
#if defined(GL_ARB_vertex_buffer_object)
if (!mb || (mb->getHardwareMappingHint()==scene::EHM_NEVER)) if (!mb || (mb->getHardwareMappingHint()==scene::EHM_NEVER))
return 0; return 0;
os::Printer::log("making vbo", ELL_ERROR);
SHWBufferLink_opengl *HWBuffer=new SHWBufferLink_opengl(mb); SHWBufferLink_opengl *HWBuffer=new SHWBufferLink_opengl(mb);
//add to list, in order of their meshbuffer pointer //add to list, in order of their meshbuffer pointer
u32 n; u32 n;
for (n=0;n<HWBufferLinks.size();++n) for (n=0;n<HWBufferLinks.size();++n)
if (HWBufferLinks[n]->MeshBuffer > HWBuffer->MeshBuffer) if (HWBufferLinks[n]->MeshBuffer > HWBuffer->MeshBuffer)
...@@ -674,6 +698,7 @@ COpenGLDriver::SHWBufferLink *COpenGLDriver::createHardwareBuffer(const scene::I ...@@ -674,6 +698,7 @@ COpenGLDriver::SHWBufferLink *COpenGLDriver::createHardwareBuffer(const scene::I
if (n<HWBufferLinks.size()) if (n<HWBufferLinks.size())
HWBufferLinks.insert(HWBuffer,n); HWBufferLinks.insert(HWBuffer,n);
else else
HWBufferLinks.push_back(HWBuffer); HWBufferLinks.push_back(HWBuffer);
HWBuffer->ChangedID=HWBuffer->MeshBuffer->getChangedID(); HWBuffer->ChangedID=HWBuffer->MeshBuffer->getChangedID();
...@@ -691,13 +716,16 @@ COpenGLDriver::SHWBufferLink *COpenGLDriver::createHardwareBuffer(const scene::I ...@@ -691,13 +716,16 @@ COpenGLDriver::SHWBufferLink *COpenGLDriver::createHardwareBuffer(const scene::I
} }
return HWBuffer; return HWBuffer;
#else
return 0;
#endif
} }
void COpenGLDriver::deleteHardwareBuffer(SHWBufferLink *_HWBuffer) void COpenGLDriver::deleteHardwareBuffer(SHWBufferLink *_HWBuffer)
{ {
#if defined(GL_ARB_vertex_buffer_object)
SHWBufferLink_opengl *HWBuffer=(SHWBufferLink_opengl*)_HWBuffer; SHWBufferLink_opengl *HWBuffer=(SHWBufferLink_opengl*)_HWBuffer;
if (HWBuffer->vbo_verticesID) if (HWBuffer->vbo_verticesID)
{ {
extGlDeleteBuffers(1, &HWBuffer->vbo_verticesID); extGlDeleteBuffers(1, &HWBuffer->vbo_verticesID);
...@@ -708,6 +736,7 @@ void COpenGLDriver::deleteHardwareBuffer(SHWBufferLink *_HWBuffer) ...@@ -708,6 +736,7 @@ void COpenGLDriver::deleteHardwareBuffer(SHWBufferLink *_HWBuffer)
extGlDeleteBuffers(1, &HWBuffer->vbo_indicesID); extGlDeleteBuffers(1, &HWBuffer->vbo_indicesID);
HWBuffer->vbo_indicesID=0; HWBuffer->vbo_indicesID=0;
} }
#endif
} }
......
...@@ -459,6 +459,10 @@ void CSkinnedMesh::skinMesh() ...@@ -459,6 +459,10 @@ void CSkinnedMesh::skinMesh()
//skin starting with the root joints //skin starting with the root joints
for (i=0; i<RootJoints.size(); ++i) for (i=0; i<RootJoints.size(); ++i)
SkinJoint(RootJoints[i], 0); SkinJoint(RootJoints[i], 0);
for (i=0; i<SkinningBuffers->size(); ++i)
(*SkinningBuffers)[i]->setDirty();
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment