You need to sign in or sign up before continuing.
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