Removed SurfacePatch::getVertexAndIndexData and replaced it with passing a SurfacePatch to a SurfacePatchRenderable.
This commit is contained in:
@ -26,15 +26,9 @@ namespace Ogre
|
||||
SurfaceVertexIterator getVerticesEnd(void);
|
||||
|
||||
//Users of the class might want these for debugging or info purposes.
|
||||
uint getNoOfEdges(void);
|
||||
uint getNoOfTriangles(void);
|
||||
uint getNoOfVertices(void);
|
||||
|
||||
|
||||
|
||||
|
||||
void getVertexAndIndexData(std::vector<SurfaceVertex>& vertexData, std::vector<uint>& indexData);
|
||||
|
||||
uint getNoOfEdges(void) const;
|
||||
uint getNoOfTriangles(void) const;
|
||||
uint getNoOfVertices(void) const;
|
||||
|
||||
bool canRemoveVertexFrom(SurfaceVertexIterator vertexIter, std::list<SurfaceVertexIterator> listConnectedIter, bool isEdge);
|
||||
std::list<SurfaceVertexIterator> findConnectedVertices(SurfaceVertexIterator vertexIter, bool& isEdge);
|
||||
|
@ -4,6 +4,7 @@
|
||||
#include "Ogre.h"
|
||||
#include <vector>
|
||||
|
||||
#include "SurfacePatch.h"
|
||||
#include "SurfaceTriangle.h"
|
||||
#include "SurfaceVertex.h"
|
||||
|
||||
@ -12,10 +13,11 @@ namespace Ogre
|
||||
class SurfacePatchRenderable : public SimpleRenderable
|
||||
{
|
||||
public:
|
||||
SurfacePatchRenderable(const String& material = "BaseWhiteNoLighting");
|
||||
SurfacePatchRenderable(SurfacePatch& patchToRender, const String& material = "BaseWhiteNoLighting");
|
||||
~SurfacePatchRenderable(void);
|
||||
|
||||
void setGeometry(std::vector<SurfaceVertex> verticesToSet, std::vector<uint> indicesToSet);
|
||||
void updateWithNewSurfacePatch(SurfacePatch& patchToRender);
|
||||
void setGeometry(SurfacePatch& patchToRender);
|
||||
|
||||
Real getSquaredViewDepth(const Camera *cam) const;
|
||||
Real getBoundingRadius(void) const;
|
||||
|
@ -5,10 +5,13 @@ namespace Ogre
|
||||
{
|
||||
class SurfaceVertex;
|
||||
typedef std::set<SurfaceVertex>::iterator SurfaceVertexIterator;
|
||||
typedef std::set<SurfaceVertex>::const_iterator SurfaceVertexConstIterator;
|
||||
class SurfaceTriangle;
|
||||
typedef std::set<SurfaceTriangle>::iterator SurfaceTriangleIterator;
|
||||
typedef std::set<SurfaceTriangle>::const_iterator SurfaceTriangleConstIterator;
|
||||
class SurfaceEdge;
|
||||
typedef std::set<SurfaceEdge>::iterator SurfaceEdgeIterator;
|
||||
typedef std::set<SurfaceEdge>::const_iterator SurfaceEdgeConstIterator;
|
||||
}
|
||||
|
||||
#endif
|
@ -279,18 +279,18 @@ namespace Ogre
|
||||
//for(uint meshCt = 1; meshCt < 256; ++meshCt)
|
||||
for(std::map<uchar, SurfacePatch>::iterator iterSurfacePatch = mapSurfacePatch.begin(); iterSurfacePatch != mapSurfacePatch.end(); ++iterSurfacePatch)
|
||||
{
|
||||
std::vector<SurfaceVertex> vertexData;
|
||||
/*std::vector<SurfaceVertex> vertexData;
|
||||
std::vector<uint> indexData;
|
||||
iterSurfacePatch->second.getVertexAndIndexData(vertexData, indexData);
|
||||
triangleCounter += iterSurfacePatch->second.getNoOfTriangles();
|
||||
triangleCounter += iterSurfacePatch->second.getNoOfTriangles();*/
|
||||
|
||||
std::map<uchar,SurfacePatchRenderable*>::iterator iterSurface = m_mapSurfaces[regionX][regionY][regionZ].find(iterSurfacePatch->first);
|
||||
if(iterSurface == m_mapSurfaces[regionX][regionY][regionZ].end())
|
||||
{
|
||||
//We have to create the surface
|
||||
SurfacePatchRenderable* surface = new SurfacePatchRenderable(materialMap->getMaterialAtIndex(iterSurfacePatch->first));
|
||||
SurfacePatchRenderable* surface = new SurfacePatchRenderable(iterSurfacePatch->second,materialMap->getMaterialAtIndex(iterSurfacePatch->first));
|
||||
//surface->setGeometry(vertexData[meshCt],indexData[meshCt]);
|
||||
surface->setGeometry(vertexData, indexData);
|
||||
//surface->setGeometry(vertexData, indexData);
|
||||
|
||||
m_mapSurfaces[regionX][regionY][regionZ].insert(std::make_pair(iterSurfacePatch->first,surface));
|
||||
|
||||
@ -300,7 +300,8 @@ namespace Ogre
|
||||
{
|
||||
//We just update the existing surface
|
||||
//iterSurface->second->setGeometry(vertexData[meshCt],indexData[meshCt]);
|
||||
iterSurface->second->setGeometry(vertexData, indexData);
|
||||
//iterSurface->second->setGeometry(vertexData, indexData);
|
||||
iterSurface->second->updateWithNewSurfacePatch(iterSurfacePatch->second);
|
||||
sceneNode->attachObject(iterSurface->second);
|
||||
}
|
||||
}
|
||||
|
@ -53,17 +53,17 @@ namespace Ogre
|
||||
return m_listVertices.end();
|
||||
}
|
||||
|
||||
uint SurfacePatch::getNoOfEdges(void)
|
||||
uint SurfacePatch::getNoOfEdges(void) const
|
||||
{
|
||||
return m_listEdges.size();
|
||||
}
|
||||
|
||||
uint SurfacePatch::getNoOfTriangles(void)
|
||||
uint SurfacePatch::getNoOfTriangles(void) const
|
||||
{
|
||||
return m_listTriangles.size();
|
||||
}
|
||||
|
||||
uint SurfacePatch::getNoOfVertices(void)
|
||||
uint SurfacePatch::getNoOfVertices(void) const
|
||||
{
|
||||
return m_listVertices.size();
|
||||
}
|
||||
@ -132,48 +132,6 @@ namespace Ogre
|
||||
return edgeIter;
|
||||
}
|
||||
|
||||
void SurfacePatch::getVertexAndIndexData(std::vector<SurfaceVertex>& vertexData, std::vector<uint>& indexData)
|
||||
{
|
||||
vertexData.clear();
|
||||
indexData.clear();
|
||||
|
||||
vertexData.resize(m_listVertices.size());
|
||||
std::copy(m_listVertices.begin(), m_listVertices.end(), vertexData.begin());
|
||||
|
||||
/*LogManager::getSingleton().logMessage("----------Vertex Data----------");
|
||||
for(std::vector<SurfaceVertex>::iterator vertexIter = vertexData.begin(); vertexIter != vertexData.end(); ++vertexIter)
|
||||
{
|
||||
LogManager::getSingleton().logMessage(StringConverter::toString(vertexIter->getPosition().x) + "," + StringConverter::toString(vertexIter->getPosition().y) + "," + StringConverter::toString(vertexIter->getPosition().z));
|
||||
}
|
||||
LogManager::getSingleton().logMessage("----------End Vertex Data----------");*/
|
||||
|
||||
for(SurfaceTriangleIterator iterTriangles = m_listTriangles.begin(); iterTriangles != m_listTriangles.end(); ++iterTriangles)
|
||||
{
|
||||
//LogManager::getSingleton().logMessage("Begin Triangle:");
|
||||
std::vector<SurfaceVertex>::iterator iterVertex;
|
||||
SurfaceEdgeIterator edgeIter;
|
||||
|
||||
edgeIter = iterTriangles->getEdge();
|
||||
//LogManager::getSingleton().logMessage("Edge Target " + StringConverter::toString(edgeIter->target->position.x) + "," + StringConverter::toString(edgeIter->target->position.y) + "," + StringConverter::toString(edgeIter->target->position.z));
|
||||
iterVertex = find(vertexData.begin(), vertexData.end(), *(edgeIter->getTarget()));
|
||||
//LogManager::getSingleton().logMessage("");
|
||||
//LogManager::getSingleton().logMessage(" " + StringConverter::toString(iterVertex->getPosition().x) + "," + StringConverter::toString(iterVertex->getPosition().y) + "," + StringConverter::toString(iterVertex->getPosition().z));
|
||||
indexData.push_back(iterVertex - vertexData.begin());
|
||||
|
||||
edgeIter = edgeIter->getNextHalfEdge();
|
||||
iterVertex = find(vertexData.begin(), vertexData.end(), *(edgeIter->getTarget()));
|
||||
//LogManager::getSingleton().logMessage(" " + StringConverter::toString(iterVertex->getPosition().x) + "," + StringConverter::toString(iterVertex->getPosition().y) + "," + StringConverter::toString(iterVertex->getPosition().z));
|
||||
indexData.push_back(iterVertex - vertexData.begin());
|
||||
|
||||
edgeIter = edgeIter->getNextHalfEdge();
|
||||
iterVertex = find(vertexData.begin(), vertexData.end(), *(edgeIter->getTarget()));
|
||||
//LogManager::getSingleton().logMessage(" " + StringConverter::toString(iterVertex->getPosition().x) + "," + StringConverter::toString(iterVertex->getPosition().y) + "," + StringConverter::toString(iterVertex->getPosition().z));
|
||||
indexData.push_back(iterVertex - vertexData.begin());
|
||||
|
||||
//LogManager::getSingleton().logMessage("End Triangle");
|
||||
}
|
||||
}
|
||||
|
||||
bool SurfacePatch::canRemoveVertexFrom(SurfaceVertexIterator vertexIter, std::list<SurfaceVertexIterator> listConnectedIter, bool isEdge)
|
||||
{
|
||||
bool allXMatch = true;
|
||||
|
@ -1,15 +1,18 @@
|
||||
#include "SurfacePatchRenderable.h"
|
||||
|
||||
#include "SurfaceEdge.h"
|
||||
#include "OgreVertexIndexData.h"
|
||||
|
||||
namespace Ogre
|
||||
{
|
||||
SurfacePatchRenderable::SurfacePatchRenderable(const String& material)
|
||||
SurfacePatchRenderable::SurfacePatchRenderable(SurfacePatch& patchToRender, const String& material)
|
||||
{
|
||||
mRenderOp.vertexData = new VertexData();
|
||||
mRenderOp.indexData = new IndexData();
|
||||
|
||||
this->setMaterial(material);
|
||||
|
||||
setGeometry(patchToRender);
|
||||
}
|
||||
|
||||
SurfacePatchRenderable::~SurfacePatchRenderable(void)
|
||||
@ -18,17 +21,23 @@ namespace Ogre
|
||||
delete mRenderOp.indexData;
|
||||
}
|
||||
|
||||
void SurfacePatchRenderable::setGeometry(std::vector<SurfaceVertex> verticesToSet, std::vector<uint> indicesToSet)
|
||||
void SurfacePatchRenderable::updateWithNewSurfacePatch(SurfacePatch& patchToRender)
|
||||
{
|
||||
setGeometry(patchToRender);
|
||||
}
|
||||
|
||||
void SurfacePatchRenderable::setGeometry(SurfacePatch& patchToRender)
|
||||
{
|
||||
|
||||
|
||||
//LogManager::getSingleton().logMessage("In setGeometry()");
|
||||
//Initialization stuff
|
||||
mRenderOp.vertexData->vertexCount = verticesToSet.size();
|
||||
mRenderOp.vertexData->vertexCount = patchToRender.getNoOfVertices();
|
||||
mRenderOp.vertexData->vertexStart = 0;
|
||||
mRenderOp.operationType = RenderOperation::OT_TRIANGLE_LIST; // OT_LINE_LIST, OT_LINE_STRIP
|
||||
mRenderOp.useIndexes = true;
|
||||
mRenderOp.indexData->indexStart = 0;
|
||||
mRenderOp.indexData->indexCount = indicesToSet.size();
|
||||
mRenderOp.indexData->indexCount = patchToRender.getNoOfTriangles() * 3;
|
||||
|
||||
//LogManager::getSingleton().logMessage("Finished initialisaing stuff");
|
||||
|
||||
@ -61,47 +70,47 @@ namespace Ogre
|
||||
|
||||
mRenderOp.indexData->indexBuffer = ibuf;
|
||||
|
||||
|
||||
// Drawing stuff
|
||||
int size = verticesToSet.size();
|
||||
//int size = verticesToSet.size();
|
||||
Vector3 vaabMin;
|
||||
Vector3 vaabMax;
|
||||
vaabMin.x = verticesToSet[0].getPosition().x/2.0f;
|
||||
vaabMin.y = verticesToSet[0].getPosition().y/2.0f;
|
||||
vaabMin.z = verticesToSet[0].getPosition().z/2.0f;
|
||||
vaabMax.x = verticesToSet[0].getPosition().x/2.0f;
|
||||
vaabMax.y = verticesToSet[0].getPosition().y/2.0f;
|
||||
vaabMax.z = verticesToSet[0].getPosition().z/2.0f;
|
||||
vaabMin.x = patchToRender.getVerticesBegin()->getPosition().x/2.0f;
|
||||
vaabMin.y = patchToRender.getVerticesBegin()->getPosition().y/2.0f;
|
||||
vaabMin.z = patchToRender.getVerticesBegin()->getPosition().z/2.0f;
|
||||
vaabMax.x = patchToRender.getVerticesBegin()->getPosition().x/2.0f;
|
||||
vaabMax.y = patchToRender.getVerticesBegin()->getPosition().y/2.0f;
|
||||
vaabMax.z = patchToRender.getVerticesBegin()->getPosition().z/2.0f;
|
||||
|
||||
//LogManager::getSingleton().logMessage("Setting Vertex Data of size " + StringConverter::toString(size));
|
||||
|
||||
Real *prPos = static_cast<Real*>(vbuf->lock(HardwareBuffer::HBL_DISCARD));
|
||||
|
||||
for(int i = 0; i < size; i++)
|
||||
//for(int i = 0; i < size; i++)
|
||||
for(SurfaceVertexConstIterator vertexIter = patchToRender.getVerticesBegin(); vertexIter != patchToRender.getVerticesEnd(); ++vertexIter)
|
||||
{
|
||||
*prPos++ = verticesToSet[i].getPosition().x/2.0f;
|
||||
*prPos++ = verticesToSet[i].getPosition().y/2.0f;
|
||||
*prPos++ = verticesToSet[i].getPosition().z/2.0f;
|
||||
*prPos++ = vertexIter->getPosition().x/2.0f;
|
||||
*prPos++ = vertexIter->getPosition().y/2.0f;
|
||||
*prPos++ = vertexIter->getPosition().z/2.0f;
|
||||
|
||||
*prPos++ = verticesToSet[i].getNormal().x;
|
||||
*prPos++ = verticesToSet[i].getNormal().y;
|
||||
*prPos++ = verticesToSet[i].getNormal().z;
|
||||
*prPos++ = vertexIter->getNormal().x;
|
||||
*prPos++ = vertexIter->getNormal().y;
|
||||
*prPos++ = vertexIter->getNormal().z;
|
||||
|
||||
*prPos++ = verticesToSet[i].getAlpha();
|
||||
*prPos++ = vertexIter->getAlpha();
|
||||
|
||||
if(verticesToSet[i].getPosition().x < vaabMin.x)
|
||||
vaabMin.x = verticesToSet[i].getPosition().x;
|
||||
if(verticesToSet[i].getPosition().y < vaabMin.y)
|
||||
vaabMin.y = verticesToSet[i].getPosition().y;
|
||||
if(verticesToSet[i].getPosition().z < vaabMin.z)
|
||||
vaabMin.z = verticesToSet[i].getPosition().z;
|
||||
if(vertexIter->getPosition().x < vaabMin.x)
|
||||
vaabMin.x = vertexIter->getPosition().x;
|
||||
if(vertexIter->getPosition().y < vaabMin.y)
|
||||
vaabMin.y = vertexIter->getPosition().y;
|
||||
if(vertexIter->getPosition().z < vaabMin.z)
|
||||
vaabMin.z = vertexIter->getPosition().z;
|
||||
|
||||
if(verticesToSet[i].getPosition().x > vaabMax.x)
|
||||
vaabMax.x = verticesToSet[i].getPosition().x;
|
||||
if(verticesToSet[i].getPosition().y > vaabMax.y)
|
||||
vaabMax.y = verticesToSet[i].getPosition().y;
|
||||
if(verticesToSet[i].getPosition().z > vaabMax.z)
|
||||
vaabMax.z = verticesToSet[i].getPosition().z;
|
||||
if(vertexIter->getPosition().x > vaabMax.x)
|
||||
vaabMax.x = vertexIter->getPosition().x;
|
||||
if(vertexIter->getPosition().y > vaabMax.y)
|
||||
vaabMax.y = vertexIter->getPosition().y;
|
||||
if(vertexIter->getPosition().z > vaabMax.z)
|
||||
vaabMax.z = vertexIter->getPosition().z;
|
||||
}
|
||||
|
||||
vbuf->unlock();
|
||||
@ -111,15 +120,44 @@ namespace Ogre
|
||||
|
||||
mBox.setExtents(vaabMin, vaabMax);
|
||||
|
||||
/*std::vector<SurfaceVertex> verticesToSet;
|
||||
std::vector<uint> indicesToSet;
|
||||
patchToRender.getVertexAndIndexData(verticesToSet, indicesToSet);*/
|
||||
|
||||
unsigned short* pIdx = static_cast<unsigned short*>(ibuf->lock(HardwareBuffer::HBL_DISCARD));
|
||||
for(int i = 0; i < indicesToSet.size(); i++)
|
||||
/*for(int i = 0; i < indicesToSet.size(); i++)
|
||||
{
|
||||
*pIdx = indicesToSet[i];
|
||||
LogManager::getSingleton().logMessage("Correct pIdx = " + StringConverter::toString(*pIdx));
|
||||
pIdx++;
|
||||
/**pIdx = indicesToSet[i].v1;
|
||||
}*/
|
||||
|
||||
std::vector<SurfaceVertex> vertexData;
|
||||
vertexData.resize(patchToRender.getNoOfVertices());
|
||||
std::copy(patchToRender.getVerticesBegin(), patchToRender.getVerticesEnd(), vertexData.begin());
|
||||
|
||||
for(SurfaceTriangleConstIterator iterTriangles = patchToRender.getTrianglesBegin(); iterTriangles != patchToRender.getTrianglesEnd(); ++iterTriangles)
|
||||
{
|
||||
std::vector<SurfaceVertex>::iterator iterVertex;
|
||||
SurfaceEdgeIterator edgeIter;
|
||||
|
||||
edgeIter = iterTriangles->getEdge();
|
||||
iterVertex = find(vertexData.begin(), vertexData.end(), *(edgeIter->getTarget()));
|
||||
*pIdx = (iterVertex - vertexData.begin());
|
||||
//LogManager::getSingleton().logMessage("Wrong pIdx = " + StringConverter::toString(*pIdx));
|
||||
pIdx++;
|
||||
|
||||
edgeIter = edgeIter->getNextHalfEdge();
|
||||
iterVertex = find(vertexData.begin(), vertexData.end(), *(edgeIter->getTarget()));
|
||||
*pIdx = (iterVertex - vertexData.begin());
|
||||
//LogManager::getSingleton().logMessage("Wrong pIdx = " + StringConverter::toString(*pIdx));
|
||||
pIdx++;
|
||||
|
||||
edgeIter = edgeIter->getNextHalfEdge();
|
||||
iterVertex = find(vertexData.begin(), vertexData.end(), *(edgeIter->getTarget()));
|
||||
*pIdx = (iterVertex - vertexData.begin());
|
||||
//LogManager::getSingleton().logMessage("Wrong pIdx = " + StringConverter::toString(*pIdx));
|
||||
pIdx++;
|
||||
*pIdx = indicesToSet[i].v2;
|
||||
pIdx++;*/
|
||||
}
|
||||
ibuf->unlock();
|
||||
}
|
||||
|
Reference in New Issue
Block a user