Added TangentMesh support.
git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@1265 dfc29bdd-3216-0410-991c-e03cc46cb475master
parent
fb9366b41d
commit
ee6f54877e
|
@ -22,7 +22,7 @@ namespace scene
|
||||||
//! constructor
|
//! constructor
|
||||||
COctTreeSceneNode::COctTreeSceneNode(ISceneNode* parent, ISceneManager* mgr,
|
COctTreeSceneNode::COctTreeSceneNode(ISceneNode* parent, ISceneManager* mgr,
|
||||||
s32 id, s32 minimalPolysPerNode)
|
s32 id, s32 minimalPolysPerNode)
|
||||||
: ISceneNode(parent, mgr, id), StdOctTree(0), LightMapOctTree(0),
|
: ISceneNode(parent, mgr, id), StdOctTree(0), LightMapOctTree(0), TangentsOctTree(0),
|
||||||
MinimalPolysPerNode(minimalPolysPerNode)
|
MinimalPolysPerNode(minimalPolysPerNode)
|
||||||
//,Mesh(0)
|
//,Mesh(0)
|
||||||
{
|
{
|
||||||
|
@ -215,6 +215,52 @@ void COctTreeSceneNode::render()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case video::EVT_TANGENTS:
|
||||||
|
{
|
||||||
|
//TangentsOctTree->calculatePolys(box);
|
||||||
|
TangentsOctTree->calculatePolys(frust);
|
||||||
|
|
||||||
|
OctTree<video::S3DVertexTangents>::SIndexData* d = TangentsOctTree->getIndexData();
|
||||||
|
|
||||||
|
for (u32 i=0; i<Materials.size(); ++i)
|
||||||
|
{
|
||||||
|
if ( 0 == d[i].CurrentSize )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
video::IMaterialRenderer* rnd = driver->getMaterialRenderer(Materials[i].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(Materials[i]);
|
||||||
|
driver->drawIndexedTriangleList(
|
||||||
|
&TangentsMeshes[i].Vertices[0], TangentsMeshes[i].Vertices.size(),
|
||||||
|
d[i].Indices, d[i].CurrentSize / 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// for debug purposes only
|
||||||
|
if (DebugDataVisible && !Materials.empty() && PassCount==1)
|
||||||
|
{
|
||||||
|
const core::aabbox3d<float> &box = frust.getBoundingBox();
|
||||||
|
core::array< core::aabbox3d<f32> > boxes;
|
||||||
|
video::SMaterial m;
|
||||||
|
m.Lighting = false;
|
||||||
|
driver->setMaterial(m);
|
||||||
|
if ( DebugDataVisible & scene::EDS_BBOX_BUFFERS )
|
||||||
|
{
|
||||||
|
TangentsOctTree->renderBoundingBoxes(box, boxes);
|
||||||
|
for (u32 b=0; b<boxes.size(); ++b)
|
||||||
|
driver->draw3DBox(boxes[b], video::SColor(0,255,255,255));
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( DebugDataVisible & scene::EDS_BBOX )
|
||||||
|
driver->draw3DBox(Box,video::SColor(0,255,0,0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -316,6 +362,38 @@ bool COctTreeSceneNode::createTree(IMesh* mesh)
|
||||||
nodeCount = LightMapOctTree->nodeCount;
|
nodeCount = LightMapOctTree->nodeCount;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case video::EVT_TANGENTS:
|
||||||
|
{
|
||||||
|
for (u32 i=0; i<mesh->getMeshBufferCount(); ++i)
|
||||||
|
{
|
||||||
|
IMeshBuffer* b = mesh->getMeshBuffer(i);
|
||||||
|
|
||||||
|
if (b->getVertexCount() && b->getIndexCount())
|
||||||
|
{
|
||||||
|
Materials.push_back(b->getMaterial());
|
||||||
|
|
||||||
|
OctTree<video::S3DVertexTangents>::SMeshChunk chunk;
|
||||||
|
chunk.MaterialId = Materials.size() - 1;
|
||||||
|
TangentsMeshes.push_back(chunk);
|
||||||
|
OctTree<video::S3DVertexTangents>::SMeshChunk& nchunk =
|
||||||
|
TangentsMeshes[TangentsMeshes.size()-1];
|
||||||
|
|
||||||
|
u32 v;
|
||||||
|
|
||||||
|
for (v=0; v<b->getVertexCount(); ++v)
|
||||||
|
nchunk.Vertices.push_back(((video::S3DVertexTangents*)b->getVertices())[v]);
|
||||||
|
|
||||||
|
polyCount += b->getIndexCount();
|
||||||
|
|
||||||
|
for (v=0; v<b->getIndexCount(); ++v)
|
||||||
|
nchunk.Indices.push_back(b->getIndices()[v]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TangentsOctTree = new OctTree<video::S3DVertexTangents>(TangentsMeshes, MinimalPolysPerNode);
|
||||||
|
nodeCount = TangentsOctTree->nodeCount;
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -414,6 +492,10 @@ void COctTreeSceneNode::deleteTree()
|
||||||
LightMapOctTree = 0;
|
LightMapOctTree = 0;
|
||||||
LightMapMeshes.clear();
|
LightMapMeshes.clear();
|
||||||
|
|
||||||
|
delete TangentsOctTree;
|
||||||
|
TangentsOctTree = 0;
|
||||||
|
TangentsMeshes.clear();
|
||||||
|
|
||||||
Materials.clear();
|
Materials.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -67,6 +67,9 @@ namespace scene
|
||||||
OctTree<video::S3DVertex2TCoords>* LightMapOctTree;
|
OctTree<video::S3DVertex2TCoords>* LightMapOctTree;
|
||||||
core::array< OctTree<video::S3DVertex2TCoords>::SMeshChunk > LightMapMeshes;
|
core::array< OctTree<video::S3DVertex2TCoords>::SMeshChunk > LightMapMeshes;
|
||||||
|
|
||||||
|
OctTree<video::S3DVertexTangents>* TangentsOctTree;
|
||||||
|
core::array< OctTree<video::S3DVertexTangents>::SMeshChunk > TangentsMeshes;
|
||||||
|
|
||||||
video::E_VERTEX_TYPE vertexType;
|
video::E_VERTEX_TYPE vertexType;
|
||||||
core::array< video::SMaterial > Materials;
|
core::array< video::SMaterial > Materials;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue