Commit 6f15d5d0 authored by hybrid's avatar hybrid

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
parent 134fe5f7
...@@ -127,9 +127,58 @@ void CMeshSceneNode::render() ...@@ -127,9 +127,58 @@ void CMeshSceneNode::render()
driver->setTransform(video::ETS_WORLD, AbsoluteTransformation); driver->setTransform(video::ETS_WORLD, AbsoluteTransformation);
Box = Mesh->getBoundingBox(); 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: // for debug purposes only:
if ( DebugDataVisible && PassCount==1) if ( DebugDataVisible && PassCount==1)
{ {
mat.Lighting = false;
driver->setMaterial(mat);
if ( DebugDataVisible & scene::EDS_BBOX ) if ( DebugDataVisible & scene::EDS_BBOX )
{ {
video::SMaterial m; video::SMaterial m;
...@@ -146,51 +195,62 @@ void CMeshSceneNode::render() ...@@ -146,51 +195,62 @@ void CMeshSceneNode::render()
{ {
driver->draw3DBox( driver->draw3DBox(
Mesh->getMeshBuffer(g)->getBoundingBox(), Mesh->getMeshBuffer(g)->getBoundingBox(),
video::SColor(0,255,255,255)); video::SColor(0,190,128,128));
} }
} }
if ( DebugDataVisible & scene::EDS_NORMALS ) if ( DebugDataVisible & scene::EDS_NORMALS )
{ {
for (u32 g=0; g<Mesh->getMeshBufferCount(); ++g) IAnimatedMesh * arrow = SceneManager->addArrowMesh (
"__debugnormal", 0xFFECEC00,
0xFF999900, 4, 8, 1.f, 0.6f, 0.05f,
0.3f);
if ( 0 == arrow )
{ {
scene::IMeshBuffer* mb = Mesh->getMeshBuffer(g); arrow = SceneManager->getMesh ( "__debugnormal" );
}
IMesh *mesh = arrow->getMesh ( 0 );
// find a good scaling factor
u32 vSize; core::matrix4 m2;
u32 i;
vSize = video::getVertexPitchFromType(mb->getVertexType());
// draw normals
for (u32 g=0; g<Mesh->getMeshBufferCount(); ++g)
{
const scene::IMeshBuffer* mb = Mesh->getMeshBuffer(g);
const u32 vSize = video::getVertexPitchFromType(mb->getVertexType());
const video::S3DVertex* v = ( const video::S3DVertex*)mb->getVertices(); const video::S3DVertex* v = ( const video::S3DVertex*)mb->getVertices();
video::SColor c ( 255, 128 ,0, 0 ); for ( u32 i=0; i != mb->getVertexCount(); ++i )
video::SColor c1 ( 255, 255 ,0, 0 );
for ( i = 0; i != mb->getVertexCount(); ++i )
{ {
core::vector3df h = v->Normal * 5.f; // align to v->Normal
core::vector3df h1 = h.crossProduct ( core::vector3df ( 0.f, 1.f, 0.f ) ); 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 ); v = (const video::S3DVertex*) ( (u8*) v + vSize );
} }
} }
} driver->setTransform(video::ETS_WORLD, AbsoluteTransformation);
} }
for (u32 i=0; i<Mesh->getMeshBufferCount(); ++i) // show mesh
{ if ( DebugDataVisible & scene::EDS_MESH_WIRE_OVERLAY )
scene::IMeshBuffer* mb = Mesh->getMeshBuffer(i);
if (mb)
{ {
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); for (u32 g=0; g<Mesh->getMeshBufferCount(); ++g)
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( Mesh->getMeshBuffer(g) );
driver->drawMeshBuffer(mb);
} }
} }
} }
......
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