* Submeshes can now be switched on and off by GeoSet ID

This commit is contained in:
Shlainn 2011-11-23 18:16:01 +01:00
parent e960db4cd8
commit 6f86fc4e89
4 changed files with 40 additions and 8 deletions

View File

@ -1420,10 +1420,30 @@ void CM2Mesh::newAnimation(u32 id, s32 start, s32 end, f32 probability)
a.end = end;
a.probability = probability + prev_prob;
Animations.push_back(a);
}
void CM2Mesh::setGeoSetRender(u32 id, bool render)//this sets the render status for a geoset ID
{
for(u16 i = 0; i < GeoSetID.size(); i++)
{
if(GeoSetID[i]==id)
{
GeoSetRender[i]=render;
}
}
};
bool CM2Mesh::getGeoSetRender(u32 meshbufferNumber)//This gets the render status for a specific mesh buffer
{
if(GeoSetRender.size()>meshbufferNumber)
{
return GeoSetRender[meshbufferNumber];
}
else
return false;
};
} // end namespace scene

View File

@ -14,7 +14,6 @@ namespace scene
u32 begin;
u32 end;
};
class IAnimatedMeshSceneNode;
class IBoneSceneNode;
@ -133,6 +132,12 @@ namespace scene
//! loaders should call this after populating the mesh
virtual void finalize();
SSkinMeshBuffer *createBuffer(u32 id)
{
GeoSetID.push_back(id);
GeoSetRender.push_back((id==0?true:false));//This may be changed later on when we know more about the submesh switching business
return createBuffer();
};
virtual SSkinMeshBuffer *createBuffer();
virtual SJoint *createJoint(SJoint *parent=0);
@ -146,6 +151,9 @@ namespace scene
//Retrieve animation information
void getFrameLoop(u32 animId, s32 &start, s32 &end);
void newAnimation(u32 id, s32 start, s32 end, f32 probability);
//Retrieve geoset rendering information
void setGeoSetRender(u32 id, bool render);
bool getGeoSetRender(u32 meshbufferNumber);
private:
void checkForAnimation();
@ -172,8 +180,10 @@ private:
core::array<SSkinMeshBuffer*> *SkinningBuffers; //Meshbuffer to skin, default is to skin localBuffers
core::array<SSkinMeshBuffer*> LocalBuffers;
core::array<u32> GeoSetID; //Array of Submesh Meshpart IDs used for switching Geosets on and off
core::array<bool> GeoSetRender;
core::array<SJoint*> AllJoints;
core::array<SJoint*> AllJoints;
core::array<SJoint*> RootJoints;
bool HasAnimation;

View File

@ -115,7 +115,7 @@ void CM2MeshFileLoader::ReadViewData(io::IReadFile* file)
{
file->read(&tempM2Submesh,sizeof(ModelViewSubmesh)-(header.version==0x100?16:0));
M2MSubmeshes.push_back(tempM2Submesh);
DEBUG(logdebug("Submesh %u nBone: %u ofsBone: %u",i,tempM2Submesh.nBone, tempM2Submesh.ofsBone));
DEBUG(logdebug("Submesh %u MeshPartID %u",i,tempM2Submesh.meshpartId));
// std::cout<< "Submesh " <<i<<" ID "<<tempM2Submesh.meshpartId<<" starts at V/T "<<tempM2Submesh.ofsVertex<<"/"<<tempM2Submesh.ofsTris<<" and has "<<tempM2Submesh.nVertex<<"/"<<tempM2Submesh.nTris<<" V/T\n";
}
DEBUG(logdebug("Read %u/%u Submeshes",M2MSubmeshes.size(),currentView.Submesh.num));
@ -716,7 +716,7 @@ for(u32 i=0;i<M2MVertices.size();i++)
for(u32 i=0; i < currentView.Submesh.num;i++)//
{
//Now, M2MTriangles refers to M2MIndices and not to M2MVertices.
scene::SSkinMeshBuffer *MeshBuffer = AnimatedMesh->createBuffer();
scene::SSkinMeshBuffer *MeshBuffer = AnimatedMesh->createBuffer(M2MSubmeshes[i].meshpartId);
//Put the Indices and Vertices of the Submesh into a mesh buffer
//Each Submesh contains only the Indices and Vertices that belong to it.

View File

@ -330,10 +330,12 @@ void CAnimatedMeshSceneNode::render()
{
video::IMaterialRenderer* rnd = driver->getMaterialRenderer(Materials[i].MaterialType);
bool transparent = (rnd && rnd->isTransparent());
bool renderSubmesh = true;
if(Mesh->getMeshType() == EAMT_M2)
renderSubmesh = ((CM2Mesh*)Mesh)->getGeoSetRender(i);
// only render transparent buffer if this is the transparent render pass
// and solid only in solid pass
if (transparent == isTransparentPass)
if (transparent == isTransparentPass && renderSubmesh)
{
scene::IMeshBuffer* mb = m->getMeshBuffer(i);