diff --git a/CMakeLists.txt b/CMakeLists.txt index 0e66fe63..35d5cbc9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,6 +30,7 @@ SET(INC_FILES include/MaterialMapManager.h include/MaterialMapSerializer.h include/PolyVoxSceneManager.h + include/RegionGeometry.h include/SurfaceEdge.h include/SurfaceTypes.h include/SurfacePatchRenderable.h diff --git a/include/IntegralVector3.h b/include/IntegralVector3.h index 2fb58321..90bad209 100644 --- a/include/IntegralVector3.h +++ b/include/IntegralVector3.h @@ -41,6 +41,13 @@ namespace Ogre { } + void setData(Type xToSet, Type yToSet, Type zToSet) + { + x = xToSet; + y = yToSet; + z = zToSet; + } + bool operator==(const IntegralVector3& rhs) const throw() { return ((x == rhs.x) && (y == rhs.y) && (z == rhs.z)); diff --git a/include/PolyVoxSceneManager.h b/include/PolyVoxSceneManager.h index 907c473f..eeea6273 100644 --- a/include/PolyVoxSceneManager.h +++ b/include/PolyVoxSceneManager.h @@ -31,6 +31,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include "TypeDef.h" #include "Volume.h" #include "SurfaceVertex.h" +#include "RegionGeometry.h" #include @@ -73,7 +74,9 @@ namespace Ogre void setNormalGenerationMethod(NormalGenerationMethod method); void _findVisibleObjects(Camera* cam, VisibleObjectsBoundsInfo * visibleBounds, bool onlyShadowCasters); - void setAllUpToDateFalse(void); + std::list getChangedRegionGeometry(void); + + void setAllUpToDateFlagsTo(bool newUpToDateValue); void createSphereAt(Vector3 centre, Real radius, uchar value, bool painting); bool loadScene(const String& filename); diff --git a/include/RegionGeometry.h b/include/RegionGeometry.h new file mode 100644 index 00000000..b71556ad --- /dev/null +++ b/include/RegionGeometry.h @@ -0,0 +1,41 @@ +/****************************************************************************** +This file is part of a voxel plugin for OGRE +Copyright (C) 2006 David Williams + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +******************************************************************************/ + +#ifndef __RegionGeometry_H__ +#define __RegionGeometry_H__ + +#include "IndexedSurfacePatch.h" +#include "IntegralVector3.h" + +namespace Ogre +{ + class RegionGeometry + { + public: + RegionGeometry(){}; + + bool m_bIsEmpty; + UIntVector3 m_v3dRegionPosition; + IndexedSurfacePatch* m_patchSingleMaterial; + IndexedSurfacePatch* m_patchMultiMaterial; + + }; +} + +#endif diff --git a/source/PolyVoxSceneManager.cpp b/source/PolyVoxSceneManager.cpp index 5cc890c2..1553d471 100644 --- a/source/PolyVoxSceneManager.cpp +++ b/source/PolyVoxSceneManager.cpp @@ -29,6 +29,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include "OgreStringConverter.h" #include "OgreLogManager.h" +#include + namespace Ogre { @@ -105,7 +107,7 @@ namespace Ogre //for(std::map::iterator iterSurfaces = m_mapSurfaces[blockX][blockY][blockZ].begin(); iterSurfaces != m_mapSurfaces[blockX][blockY][blockZ].end(); ++iterSurfaces) //{ - //delete iterSurfaces->second; + //delete iterSurfaces->second; //} //m_mapSurfaces[blockX][blockY][blockZ].clear(); @@ -120,7 +122,7 @@ namespace Ogre createAxis(256); setAxisVisible(false); - + return true; @@ -130,99 +132,74 @@ namespace Ogre { if(!volumeData.isNull()) { - unsigned long triangleCounter = 0; - //Regenerate meshes. - for(uint regionZ = 0; regionZ < OGRE_VOLUME_SIDE_LENGTH_IN_REGIONS; ++regionZ) - { - //LogManager::getSingleton().logMessage("regionZ = " + StringConverter::toString(regionZ)); - for(uint regionY = 0; regionY < OGRE_VOLUME_SIDE_LENGTH_IN_REGIONS; ++regionY) + std::list listChangedRegionGeometry = getChangedRegionGeometry(); + + for(std::list::iterator iterRegionGeometry = listChangedRegionGeometry.begin(); iterRegionGeometry != listChangedRegionGeometry.end(); iterRegionGeometry++) + { + std::string location(""); + location = location + "(" + iterRegionGeometry->m_v3dRegionPosition.x + "," + iterRegionGeometry->m_v3dRegionPosition.y + "," + iterRegionGeometry->m_v3dRegionPosition.z + ")"; + + //Generate the surface + IndexedSurfacePatch* singleMaterialPatch = iterRegionGeometry->m_patchSingleMaterial; + IndexedSurfacePatch* multiMaterialPatch = iterRegionGeometry->m_patchMultiMaterial; + + if((singleMaterialPatch->m_vecVertices.size() == 0) && (singleMaterialPatch->m_vecTriangleIndices.size() == 0)) { - //LogManager::getSingleton().logMessage("regionY = " + StringConverter::toString(regionY)); - for(uint regionX = 0; regionX < OGRE_VOLUME_SIDE_LENGTH_IN_REGIONS; ++regionX) + //No geometry exists. We can delete the scene node if it exists + std::map::iterator iterSceneNode = sceneNodes.find(iterRegionGeometry->m_v3dRegionPosition); + if(iterSceneNode != sceneNodes.end()) { - //LogManager::getSingleton().logMessage("regionX = " + StringConverter::toString(regionX)); - if(surfaceUpToDate[regionX][regionY][regionZ] == false) - { - std::stringstream locationStream; - locationStream << "(" << regionX << "," << regionY << "," << regionZ << ")"; - std::string location = locationStream.str(); - - //Generate the surface - IndexedSurfacePatch* singleMaterialPatch = new IndexedSurfacePatch(false); - IndexedSurfacePatch* multiMaterialPatch = new IndexedSurfacePatch(true); - - generateMeshDataForRegion(regionX,regionY,regionZ, singleMaterialPatch, multiMaterialPatch); - - if((singleMaterialPatch->m_vecVertices.size() == 0) && (singleMaterialPatch->m_vecTriangleIndices.size() == 0)) - { - //No geometry exists. We can delete the scene node if it exists - std::map::iterator iterSceneNode = sceneNodes.find(UIntVector3(regionX,regionY,regionZ)); - if(iterSceneNode != sceneNodes.end()) - { - getRootSceneNode()->removeChild(location); - } - surfaceUpToDate[regionX][regionY][regionZ] = true; - continue; - } - - //If a SceneNode doesn't exist in this position then create one. - std::map::iterator iterSceneNode = sceneNodes.find(UIntVector3(regionX,regionY,regionZ)); - SceneNode* sceneNode; - if(iterSceneNode == sceneNodes.end()) - { - sceneNode = getRootSceneNode()->createChildSceneNode(location, Vector3(regionX*OGRE_REGION_SIDE_LENGTH,regionY*OGRE_REGION_SIDE_LENGTH,regionZ*OGRE_REGION_SIDE_LENGTH)); - sceneNodes.insert(std::make_pair(UIntVector3(regionX,regionY,regionZ),sceneNode)); - } - else - { - sceneNode = iterSceneNode->second; - sceneNode->detachAllObjects(); - } - - //For each surface attach it to the scene node. - //for(uint meshCt = 1; meshCt < 256; ++meshCt) - //for(std::map::iterator iterSurfacePatch = mapSurfacePatch.begin(); iterSurfacePatch != mapSurfacePatch.end(); ++iterSurfacePatch) - { - /*std::vector vertexData; - std::vector indexData; - iterSurfacePatch->second.getVertexAndIndexData(vertexData, indexData); - triangleCounter += iterSurfacePatch->second.getNoOfTriangles();*/ - - SurfacePatchRenderable* singleMaterialSurfacePatchRenderable = m_singleMaterialSurfaces[regionX][regionY][regionZ]; - SurfacePatchRenderable* multiMaterialSurfacePatchRenderable = m_multiMaterialSurfaces[regionX][regionY][regionZ]; - if(singleMaterialSurfacePatchRenderable == 0) //if single is null then multi should also be null - { - //We have to create the surfaces - singleMaterialSurfacePatchRenderable = new SurfacePatchRenderable(singleMaterialPatch,materialMap->getMaterialAtIndex(1)); - multiMaterialSurfacePatchRenderable = new SurfacePatchRenderable(multiMaterialPatch,materialMap->getMaterialAtIndex(2)); - - multiMaterialSurfacePatchRenderable->setRenderQueueGroup(RENDER_QUEUE_3); - singleMaterialSurfacePatchRenderable->setRenderQueueGroup(RENDER_QUEUE_4); - - m_singleMaterialSurfaces[regionX][regionY][regionZ] = singleMaterialSurfacePatchRenderable; - sceneNode->attachObject(singleMaterialSurfacePatchRenderable); - - m_multiMaterialSurfaces[regionX][regionY][regionZ] = multiMaterialSurfacePatchRenderable; - sceneNode->attachObject(multiMaterialSurfacePatchRenderable); - } - else - { - //We just update the existing surfaces - singleMaterialSurfacePatchRenderable->updateWithNewSurfacePatch(singleMaterialPatch); - sceneNode->attachObject(singleMaterialSurfacePatchRenderable); - - multiMaterialSurfacePatchRenderable->updateWithNewSurfacePatch(multiMaterialPatch); - sceneNode->attachObject(multiMaterialSurfacePatchRenderable); - } - } - //sceneNode->showBoundingBox(true); - surfaceUpToDate[regionX][regionY][regionZ] = true; - } + getRootSceneNode()->removeChild(location); } + continue; + } + + //If a SceneNode doesn't exist in this position then create one. + std::map::iterator iterSceneNode = sceneNodes.find(iterRegionGeometry->m_v3dRegionPosition); + SceneNode* sceneNode; + if(iterSceneNode == sceneNodes.end()) + { + sceneNode = getRootSceneNode()->createChildSceneNode(location, Vector3(iterRegionGeometry->m_v3dRegionPosition.x*OGRE_REGION_SIDE_LENGTH,iterRegionGeometry->m_v3dRegionPosition.y*OGRE_REGION_SIDE_LENGTH,iterRegionGeometry->m_v3dRegionPosition.z*OGRE_REGION_SIDE_LENGTH)); + sceneNodes.insert(std::make_pair(iterRegionGeometry->m_v3dRegionPosition, sceneNode)); + } + else + { + sceneNode = iterSceneNode->second; + sceneNode->detachAllObjects(); + } + + SurfacePatchRenderable* singleMaterialSurfacePatchRenderable = m_singleMaterialSurfaces[iterRegionGeometry->m_v3dRegionPosition.x][iterRegionGeometry->m_v3dRegionPosition.y][iterRegionGeometry->m_v3dRegionPosition.z]; + SurfacePatchRenderable* multiMaterialSurfacePatchRenderable = m_multiMaterialSurfaces[iterRegionGeometry->m_v3dRegionPosition.x][iterRegionGeometry->m_v3dRegionPosition.y][iterRegionGeometry->m_v3dRegionPosition.z]; + if(singleMaterialSurfacePatchRenderable == 0) //if single is null then multi should also be null + { + //We have to create the surfaces + singleMaterialSurfacePatchRenderable = new SurfacePatchRenderable(singleMaterialPatch,materialMap->getMaterialAtIndex(1)); + multiMaterialSurfacePatchRenderable = new SurfacePatchRenderable(multiMaterialPatch,materialMap->getMaterialAtIndex(2)); + + multiMaterialSurfacePatchRenderable->setRenderQueueGroup(RENDER_QUEUE_3); + singleMaterialSurfacePatchRenderable->setRenderQueueGroup(RENDER_QUEUE_4); + + m_singleMaterialSurfaces[iterRegionGeometry->m_v3dRegionPosition.x][iterRegionGeometry->m_v3dRegionPosition.y][iterRegionGeometry->m_v3dRegionPosition.z] = singleMaterialSurfacePatchRenderable; + sceneNode->attachObject(singleMaterialSurfacePatchRenderable); + + m_multiMaterialSurfaces[iterRegionGeometry->m_v3dRegionPosition.x][iterRegionGeometry->m_v3dRegionPosition.y][iterRegionGeometry->m_v3dRegionPosition.z] = multiMaterialSurfacePatchRenderable; + sceneNode->attachObject(multiMaterialSurfacePatchRenderable); + } + else + { + //We just update the existing surfaces + singleMaterialSurfacePatchRenderable->updateWithNewSurfacePatch(singleMaterialPatch); + sceneNode->attachObject(singleMaterialSurfacePatchRenderable); + + multiMaterialSurfacePatchRenderable->updateWithNewSurfacePatch(multiMaterialPatch); + sceneNode->attachObject(multiMaterialSurfacePatchRenderable); } } - //LogManager::getSingleton().logMessage("No of tris = " + StringConverter::toString(triangleCounter)); + + setAllUpToDateFlagsTo(true); } + + //showBoundingBoxes(true); //Now call the base class to do the actual visibility determination... @@ -233,7 +210,40 @@ namespace Ogre //LogManager::getSingleton().logMessage("No of vertices accepted = " + StringConverter::toString(IndexedSurfacePatch::noOfVerticesAccepted)); } - void PolyVoxSceneManager::setAllUpToDateFalse(void) + std::list PolyVoxSceneManager::getChangedRegionGeometry(void) + { + std::list listChangedRegionGeometry; + + //Regenerate meshes. + for(uint regionZ = 0; regionZ < OGRE_VOLUME_SIDE_LENGTH_IN_REGIONS; ++regionZ) + { + //LogManager::getSingleton().logMessage("regionZ = " + StringConverter::toString(regionZ)); + for(uint regionY = 0; regionY < OGRE_VOLUME_SIDE_LENGTH_IN_REGIONS; ++regionY) + { + //LogManager::getSingleton().logMessage("regionY = " + StringConverter::toString(regionY)); + for(uint regionX = 0; regionX < OGRE_VOLUME_SIDE_LENGTH_IN_REGIONS; ++regionX) + { + //LogManager::getSingleton().logMessage("regionX = " + StringConverter::toString(regionX)); + if(surfaceUpToDate[regionX][regionY][regionZ] == false) + { + //Generate the surface + RegionGeometry regionGeometry; + regionGeometry.m_patchSingleMaterial = new IndexedSurfacePatch(false); + regionGeometry.m_patchMultiMaterial = new IndexedSurfacePatch(true); + regionGeometry.m_v3dRegionPosition.setData(regionX, regionY, regionZ); + + generateMeshDataForRegion(regionX,regionY,regionZ, regionGeometry.m_patchSingleMaterial, regionGeometry.m_patchMultiMaterial); + + listChangedRegionGeometry.push_back(regionGeometry); + } + } + } + } + + return listChangedRegionGeometry; + } + + void PolyVoxSceneManager::setAllUpToDateFlagsTo(bool newUpToDateValue) { for(uint blockZ = 0; blockZ < OGRE_VOLUME_SIDE_LENGTH_IN_REGIONS; ++blockZ) { @@ -241,7 +251,7 @@ namespace Ogre { for(uint blockX = 0; blockX < OGRE_VOLUME_SIDE_LENGTH_IN_REGIONS; ++blockX) { - surfaceUpToDate[blockX][blockY][blockZ] = false; + surfaceUpToDate[blockX][blockY][blockZ] = newUpToDateValue; } } } @@ -537,7 +547,7 @@ namespace Ogre const uchar material0 = vertMaterials[triTable[iCubeIndex][i ]]; const uchar material1 = vertMaterials[triTable[iCubeIndex][i+1]]; const uchar material2 = vertMaterials[triTable[iCubeIndex][i+2]]; - + //If all the materials are the same, we just need one triangle for that material with all the alphas set high. if((material0 == material1) && (material1 == material2)) @@ -550,49 +560,49 @@ namespace Ogre else if(material0 == material1) { { - SurfaceVertex surfaceVertex0Alpha1(vertex0,material0 + 0.1,1.0); - SurfaceVertex surfaceVertex1Alpha1(vertex1,material0 + 0.1,1.0); - SurfaceVertex surfaceVertex2Alpha1(vertex2,material0 + 0.1,0.0); - multiMaterialPatch->addTriangle(surfaceVertex0Alpha1, surfaceVertex1Alpha1, surfaceVertex2Alpha1); + SurfaceVertex surfaceVertex0Alpha1(vertex0,material0 + 0.1,1.0); + SurfaceVertex surfaceVertex1Alpha1(vertex1,material0 + 0.1,1.0); + SurfaceVertex surfaceVertex2Alpha1(vertex2,material0 + 0.1,0.0); + multiMaterialPatch->addTriangle(surfaceVertex0Alpha1, surfaceVertex1Alpha1, surfaceVertex2Alpha1); } { - SurfaceVertex surfaceVertex0Alpha1(vertex0,material2 + 0.1,0.0); - SurfaceVertex surfaceVertex1Alpha1(vertex1,material2 + 0.1,0.0); - SurfaceVertex surfaceVertex2Alpha1(vertex2,material2 + 0.1,1.0); - multiMaterialPatch->addTriangle(surfaceVertex0Alpha1, surfaceVertex1Alpha1, surfaceVertex2Alpha1); + SurfaceVertex surfaceVertex0Alpha1(vertex0,material2 + 0.1,0.0); + SurfaceVertex surfaceVertex1Alpha1(vertex1,material2 + 0.1,0.0); + SurfaceVertex surfaceVertex2Alpha1(vertex2,material2 + 0.1,1.0); + multiMaterialPatch->addTriangle(surfaceVertex0Alpha1, surfaceVertex1Alpha1, surfaceVertex2Alpha1); } } else if(material0 == material2) { { - SurfaceVertex surfaceVertex0Alpha1(vertex0,material0 + 0.1,1.0); - SurfaceVertex surfaceVertex1Alpha1(vertex1,material0 + 0.1,0.0); - SurfaceVertex surfaceVertex2Alpha1(vertex2,material0 + 0.1,1.0); - multiMaterialPatch->addTriangle(surfaceVertex0Alpha1, surfaceVertex1Alpha1, surfaceVertex2Alpha1); + SurfaceVertex surfaceVertex0Alpha1(vertex0,material0 + 0.1,1.0); + SurfaceVertex surfaceVertex1Alpha1(vertex1,material0 + 0.1,0.0); + SurfaceVertex surfaceVertex2Alpha1(vertex2,material0 + 0.1,1.0); + multiMaterialPatch->addTriangle(surfaceVertex0Alpha1, surfaceVertex1Alpha1, surfaceVertex2Alpha1); } { - SurfaceVertex surfaceVertex0Alpha1(vertex0,material1 + 0.1,0.0); - SurfaceVertex surfaceVertex1Alpha1(vertex1,material1 + 0.1,1.0); - SurfaceVertex surfaceVertex2Alpha1(vertex2,material1 + 0.1,0.0); - multiMaterialPatch->addTriangle(surfaceVertex0Alpha1, surfaceVertex1Alpha1, surfaceVertex2Alpha1); + SurfaceVertex surfaceVertex0Alpha1(vertex0,material1 + 0.1,0.0); + SurfaceVertex surfaceVertex1Alpha1(vertex1,material1 + 0.1,1.0); + SurfaceVertex surfaceVertex2Alpha1(vertex2,material1 + 0.1,0.0); + multiMaterialPatch->addTriangle(surfaceVertex0Alpha1, surfaceVertex1Alpha1, surfaceVertex2Alpha1); } } else if(material1 == material2) { { - SurfaceVertex surfaceVertex0Alpha1(vertex0,material1 + 0.1,0.0); - SurfaceVertex surfaceVertex1Alpha1(vertex1,material1 + 0.1,1.0); - SurfaceVertex surfaceVertex2Alpha1(vertex2,material1 + 0.1,1.0); - multiMaterialPatch->addTriangle(surfaceVertex0Alpha1, surfaceVertex1Alpha1, surfaceVertex2Alpha1); + SurfaceVertex surfaceVertex0Alpha1(vertex0,material1 + 0.1,0.0); + SurfaceVertex surfaceVertex1Alpha1(vertex1,material1 + 0.1,1.0); + SurfaceVertex surfaceVertex2Alpha1(vertex2,material1 + 0.1,1.0); + multiMaterialPatch->addTriangle(surfaceVertex0Alpha1, surfaceVertex1Alpha1, surfaceVertex2Alpha1); } { - SurfaceVertex surfaceVertex0Alpha1(vertex0,material0 + 0.1,1.0); - SurfaceVertex surfaceVertex1Alpha1(vertex1,material0 + 0.1,0.0); - SurfaceVertex surfaceVertex2Alpha1(vertex2,material0 + 0.1,0.0); - multiMaterialPatch->addTriangle(surfaceVertex0Alpha1, surfaceVertex1Alpha1, surfaceVertex2Alpha1); + SurfaceVertex surfaceVertex0Alpha1(vertex0,material0 + 0.1,1.0); + SurfaceVertex surfaceVertex1Alpha1(vertex1,material0 + 0.1,0.0); + SurfaceVertex surfaceVertex2Alpha1(vertex2,material0 + 0.1,0.0); + multiMaterialPatch->addTriangle(surfaceVertex0Alpha1, surfaceVertex1Alpha1, surfaceVertex2Alpha1); } } else @@ -622,31 +632,31 @@ namespace Ogre //We'll also need some vertices with low alphas for blending. /*else { - SurfaceVertex surfaceVertex0Alpha0(vertex0,0.0); - SurfaceVertex surfaceVertex1Alpha0(vertex1,0.0); - SurfaceVertex surfaceVertex2Alpha0(vertex2,0.0); + SurfaceVertex surfaceVertex0Alpha0(vertex0,0.0); + SurfaceVertex surfaceVertex1Alpha0(vertex1,0.0); + SurfaceVertex surfaceVertex2Alpha0(vertex2,0.0); - if(material0 == material1) - { - surfacePatchMapResult[material0]->addTriangle(surfaceVertex0Alpha1, surfaceVertex1Alpha1, surfaceVertex2Alpha0); - surfacePatchMapResult[material2]->addTriangle(surfaceVertex0Alpha0, surfaceVertex1Alpha0, surfaceVertex2Alpha1); - } - else if(material1 == material2) - { - surfacePatchMapResult[material1]->addTriangle(surfaceVertex0Alpha0, surfaceVertex1Alpha1, surfaceVertex2Alpha1); - surfacePatchMapResult[material0]->addTriangle(surfaceVertex0Alpha1, surfaceVertex1Alpha0, surfaceVertex2Alpha0); - } - else if(material2 == material0) - { - surfacePatchMapResult[material0]->addTriangle(surfaceVertex0Alpha1, surfaceVertex1Alpha0, surfaceVertex2Alpha1); - surfacePatchMapResult[material1]->addTriangle(surfaceVertex0Alpha0, surfaceVertex1Alpha1, surfaceVertex2Alpha0); - } - else - { - surfacePatchMapResult[material0]->addTriangle(surfaceVertex0Alpha1, surfaceVertex1Alpha0, surfaceVertex2Alpha0); - surfacePatchMapResult[material1]->addTriangle(surfaceVertex0Alpha0, surfaceVertex1Alpha1, surfaceVertex2Alpha0); - surfacePatchMapResult[material2]->addTriangle(surfaceVertex0Alpha0, surfaceVertex1Alpha0, surfaceVertex2Alpha1); - } + if(material0 == material1) + { + surfacePatchMapResult[material0]->addTriangle(surfaceVertex0Alpha1, surfaceVertex1Alpha1, surfaceVertex2Alpha0); + surfacePatchMapResult[material2]->addTriangle(surfaceVertex0Alpha0, surfaceVertex1Alpha0, surfaceVertex2Alpha1); + } + else if(material1 == material2) + { + surfacePatchMapResult[material1]->addTriangle(surfaceVertex0Alpha0, surfaceVertex1Alpha1, surfaceVertex2Alpha1); + surfacePatchMapResult[material0]->addTriangle(surfaceVertex0Alpha1, surfaceVertex1Alpha0, surfaceVertex2Alpha0); + } + else if(material2 == material0) + { + surfacePatchMapResult[material0]->addTriangle(surfaceVertex0Alpha1, surfaceVertex1Alpha0, surfaceVertex2Alpha1); + surfacePatchMapResult[material1]->addTriangle(surfaceVertex0Alpha0, surfaceVertex1Alpha1, surfaceVertex2Alpha0); + } + else + { + surfacePatchMapResult[material0]->addTriangle(surfaceVertex0Alpha1, surfaceVertex1Alpha0, surfaceVertex2Alpha0); + surfacePatchMapResult[material1]->addTriangle(surfaceVertex0Alpha0, surfaceVertex1Alpha1, surfaceVertex2Alpha0); + surfacePatchMapResult[material2]->addTriangle(surfaceVertex0Alpha0, surfaceVertex1Alpha0, surfaceVertex2Alpha1); + } }*/ }//For each triangle }//For each cell @@ -701,7 +711,7 @@ namespace Ogre Vector3 result; - + if(normalGenerationMethod == SOBEL) { volIter.setPosition(static_cast(posX),static_cast(posY),static_cast(posZ)); @@ -951,21 +961,21 @@ namespace Ogre //Create remainder of box ManualObject* remainingBox = createManualObject("Remaining Box"); remainingBox->begin("BaseWhiteNoLighting",RenderOperation::OT_LINE_LIST); - remainingBox->position(0.0, 0.0, 0.0 ); remainingBox->position(0.0, 0.0, fSideLength ); - remainingBox->position(0.0, fSideLength, 0.0 ); remainingBox->position(0.0, fSideLength, fSideLength ); - remainingBox->position(fSideLength, 0.0, 0.0 ); remainingBox->position(fSideLength, 0.0, fSideLength ); - remainingBox->position(fSideLength, fSideLength, 0.0 ); remainingBox->position(fSideLength, fSideLength, fSideLength ); + remainingBox->position(0.0, 0.0, 0.0 ); remainingBox->position(0.0, 0.0, fSideLength ); + remainingBox->position(0.0, fSideLength, 0.0 ); remainingBox->position(0.0, fSideLength, fSideLength ); + remainingBox->position(fSideLength, 0.0, 0.0 ); remainingBox->position(fSideLength, 0.0, fSideLength ); + remainingBox->position(fSideLength, fSideLength, 0.0 ); remainingBox->position(fSideLength, fSideLength, fSideLength ); - remainingBox->position(0.0, 0.0, 0.0 ); remainingBox->position(0.0, fSideLength, 0.0 ); - remainingBox->position(0.0, 0.0, fSideLength ); remainingBox->position(0.0, fSideLength, fSideLength ); - remainingBox->position(fSideLength, 0.0, 0.0 ); remainingBox->position(fSideLength, fSideLength, 0.0 ); - remainingBox->position(fSideLength, 0.0, fSideLength ); remainingBox->position(fSideLength, fSideLength, fSideLength ); + remainingBox->position(0.0, 0.0, 0.0 ); remainingBox->position(0.0, fSideLength, 0.0 ); + remainingBox->position(0.0, 0.0, fSideLength ); remainingBox->position(0.0, fSideLength, fSideLength ); + remainingBox->position(fSideLength, 0.0, 0.0 ); remainingBox->position(fSideLength, fSideLength, 0.0 ); + remainingBox->position(fSideLength, 0.0, fSideLength ); remainingBox->position(fSideLength, fSideLength, fSideLength ); - remainingBox->position(0.0, 0.0, 0.0 ); remainingBox->position(fSideLength, 0.0, 0.0 ); - remainingBox->position(0.0, 0.0, fSideLength ); remainingBox->position(fSideLength, 0.0, fSideLength ); - remainingBox->position(0.0, fSideLength, 0.0 ); remainingBox->position(fSideLength, fSideLength, 0.0 ); - remainingBox->position(0.0, fSideLength, fSideLength ); remainingBox->position(fSideLength, fSideLength, fSideLength ); - remainingBox->end(); + remainingBox->position(0.0, 0.0, 0.0 ); remainingBox->position(fSideLength, 0.0, 0.0 ); + remainingBox->position(0.0, 0.0, fSideLength ); remainingBox->position(fSideLength, 0.0, fSideLength ); + remainingBox->position(0.0, fSideLength, 0.0 ); remainingBox->position(fSideLength, fSideLength, 0.0 ); + remainingBox->position(0.0, fSideLength, fSideLength ); remainingBox->position(fSideLength, fSideLength, fSideLength ); + remainingBox->end(); SceneNode *remainingBoxNode = m_axisNode->createChildSceneNode(); remainingBoxNode->attachObject(remainingBox); }