diff --git a/source/Irrlicht/COctTreeSceneNode.cpp b/source/Irrlicht/COctTreeSceneNode.cpp index 24907824..3a9b662c 100644 --- a/source/Irrlicht/COctTreeSceneNode.cpp +++ b/source/Irrlicht/COctTreeSceneNode.cpp @@ -22,7 +22,7 @@ namespace scene //! constructor COctTreeSceneNode::COctTreeSceneNode(ISceneNode* parent, ISceneManager* mgr, s32 id, s32 minimalPolysPerNode) -: ISceneNode(parent, mgr, id), StdOctTree(0), LightMapOctTree(0), +: ISceneNode(parent, mgr, id), StdOctTree(0), LightMapOctTree(0), TangentsOctTree(0), MinimalPolysPerNode(minimalPolysPerNode) //,Mesh(0) { @@ -215,6 +215,52 @@ void COctTreeSceneNode::render() } } break; + case video::EVT_TANGENTS: + { + //TangentsOctTree->calculatePolys(box); + TangentsOctTree->calculatePolys(frust); + + OctTree::SIndexData* d = TangentsOctTree->getIndexData(); + + for (u32 i=0; igetMaterialRenderer(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 &box = frust.getBoundingBox(); + core::array< core::aabbox3d > boxes; + video::SMaterial m; + m.Lighting = false; + driver->setMaterial(m); + if ( DebugDataVisible & scene::EDS_BBOX_BUFFERS ) + { + TangentsOctTree->renderBoundingBoxes(box, boxes); + for (u32 b=0; bdraw3DBox(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; } break; + case video::EVT_TANGENTS: + { + for (u32 i=0; igetMeshBufferCount(); ++i) + { + IMeshBuffer* b = mesh->getMeshBuffer(i); + + if (b->getVertexCount() && b->getIndexCount()) + { + Materials.push_back(b->getMaterial()); + + OctTree::SMeshChunk chunk; + chunk.MaterialId = Materials.size() - 1; + TangentsMeshes.push_back(chunk); + OctTree::SMeshChunk& nchunk = + TangentsMeshes[TangentsMeshes.size()-1]; + + u32 v; + + for (v=0; vgetVertexCount(); ++v) + nchunk.Vertices.push_back(((video::S3DVertexTangents*)b->getVertices())[v]); + + polyCount += b->getIndexCount(); + + for (v=0; vgetIndexCount(); ++v) + nchunk.Indices.push_back(b->getIndices()[v]); + } + } + + TangentsOctTree = new OctTree(TangentsMeshes, MinimalPolysPerNode); + nodeCount = TangentsOctTree->nodeCount; + } + break; } } @@ -414,6 +492,10 @@ void COctTreeSceneNode::deleteTree() LightMapOctTree = 0; LightMapMeshes.clear(); + delete TangentsOctTree; + TangentsOctTree = 0; + TangentsMeshes.clear(); + Materials.clear(); } diff --git a/source/Irrlicht/COctTreeSceneNode.h b/source/Irrlicht/COctTreeSceneNode.h index 87f6718b..5315ad0c 100644 --- a/source/Irrlicht/COctTreeSceneNode.h +++ b/source/Irrlicht/COctTreeSceneNode.h @@ -67,6 +67,9 @@ namespace scene OctTree* LightMapOctTree; core::array< OctTree::SMeshChunk > LightMapMeshes; + OctTree* TangentsOctTree; + core::array< OctTree::SMeshChunk > TangentsMeshes; + video::E_VERTEX_TYPE vertexType; core::array< video::SMaterial > Materials;