Patch by pc0de which gives CMeshSceneNode the same debug elements as CAnimatedMeshSN.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@1221 dfc29bdd-3216-0410-991c-e03cc46cb475
master
hybrid 2008-01-31 00:12:39 +00:00
parent 134fe5f7a5
commit 6f15d5d025
1 changed files with 88 additions and 28 deletions

View File

@ -127,9 +127,58 @@ void CMeshSceneNode::render()
driver->setTransform(video::ETS_WORLD, AbsoluteTransformation);
Box = Mesh->getBoundingBox();
// for debug purposes only:
bool renderMeshes = true;
video::SMaterial mat;
if (DebugDataVisible && PassCount==1)
{
// overwrite half transparency
if ( DebugDataVisible & scene::EDS_HALF_TRANSPARENCY )
{
for (u32 g=0; g<Mesh->getMeshBufferCount(); ++g)
{
mat = Materials[g];
mat.MaterialType = video::EMT_TRANSPARENT_ADD_COLOR;
driver->setMaterial(mat);
driver->drawMeshBuffer ( Mesh->getMeshBuffer(g) );
}
renderMeshes = false;
}
}
// render original meshes
if ( renderMeshes )
{
for (u32 i=0; i<Mesh->getMeshBufferCount(); ++i)
{
scene::IMeshBuffer* mb = Mesh->getMeshBuffer(i);
if (mb)
{
const video::SMaterial& material = ReadOnlyMaterials ? mb->getMaterial() : Materials[i];
video::IMaterialRenderer* rnd = driver->getMaterialRenderer(material.MaterialType);
bool transparent = (rnd && rnd->isTransparent());
// only render transparent buffer if this is the transparent render pass
// and solid only in solid pass
if (transparent == isTransparentPass)
{
driver->setMaterial(material);
driver->drawMeshBuffer(mb);
}
}
}
}
driver->setTransform(video::ETS_WORLD, AbsoluteTransformation);
// for debug purposes only:
if ( DebugDataVisible && PassCount==1)
{
mat.Lighting = false;
driver->setMaterial(mat);
if ( DebugDataVisible & scene::EDS_BBOX )
{
video::SMaterial m;
@ -146,51 +195,62 @@ void CMeshSceneNode::render()
{
driver->draw3DBox(
Mesh->getMeshBuffer(g)->getBoundingBox(),
video::SColor(0,255,255,255));
video::SColor(0,190,128,128));
}
}
if ( DebugDataVisible & scene::EDS_NORMALS )
{
IAnimatedMesh * arrow = SceneManager->addArrowMesh (
"__debugnormal", 0xFFECEC00,
0xFF999900, 4, 8, 1.f, 0.6f, 0.05f,
0.3f);
if ( 0 == arrow )
{
arrow = SceneManager->getMesh ( "__debugnormal" );
}
IMesh *mesh = arrow->getMesh ( 0 );
// find a good scaling factor
core::matrix4 m2;
// draw normals
for (u32 g=0; g<Mesh->getMeshBufferCount(); ++g)
{
scene::IMeshBuffer* mb = Mesh->getMeshBuffer(g);
u32 vSize;
u32 i;
vSize = video::getVertexPitchFromType(mb->getVertexType());
const scene::IMeshBuffer* mb = Mesh->getMeshBuffer(g);
const u32 vSize = video::getVertexPitchFromType(mb->getVertexType());
const video::S3DVertex* v = ( const video::S3DVertex*)mb->getVertices();
video::SColor c ( 255, 128 ,0, 0 );
video::SColor c1 ( 255, 255 ,0, 0 );
for ( i = 0; i != mb->getVertexCount(); ++i )
for ( u32 i=0; i != mb->getVertexCount(); ++i )
{
core::vector3df h = v->Normal * 5.f;
core::vector3df h1 = h.crossProduct ( core::vector3df ( 0.f, 1.f, 0.f ) );
// align to v->Normal
core::quaternion quatRot(v->Normal.X, 0.f, -up.X, 1+up.Y);
quatRot.normalize();
quatRot.getMatrix(m2);
m2.setTranslation(v->Pos);
m2*=AbsoluteTransformation;
driver->setTransform(video::ETS_WORLD, m2 );
for ( u32 a = 0; a != mesh->getMeshBufferCount(); ++a )
driver->drawMeshBuffer ( mesh->getMeshBuffer ( a ) );
driver->draw3DLine ( v->Pos, v->Pos + h, c );
driver->draw3DLine ( v->Pos + h, v->Pos + h + h1, c1 );
v = (const video::S3DVertex*) ( (u8*) v + vSize );
}
}
driver->setTransform(video::ETS_WORLD, AbsoluteTransformation);
}
}
for (u32 i=0; i<Mesh->getMeshBufferCount(); ++i)
{
scene::IMeshBuffer* mb = Mesh->getMeshBuffer(i);
if (mb)
// show mesh
if ( DebugDataVisible & scene::EDS_MESH_WIRE_OVERLAY )
{
const video::SMaterial& material = ReadOnlyMaterials ? mb->getMaterial() : Materials[i];
mat.Lighting = false;
mat.Wireframe = true;
driver->setMaterial(mat);
video::IMaterialRenderer* rnd = driver->getMaterialRenderer(material.MaterialType);
bool transparent = (rnd && rnd->isTransparent());
// only render transparent buffer if this is the transparent render pass
// and solid only in solid pass
if (transparent == isTransparentPass)
for (u32 g=0; g<Mesh->getMeshBufferCount(); ++g)
{
driver->setMaterial(material);
driver->drawMeshBuffer(mb);
driver->drawMeshBuffer( Mesh->getMeshBuffer(g) );
}
}
}