Removed SurfacePatch::getVertexAndIndexData and replaced it with passing a SurfacePatch to a SurfacePatchRenderable.

This commit is contained in:
David Williams
2007-09-29 01:10:01 +00:00
parent 2a6e758e4b
commit d0386f8853
6 changed files with 157 additions and 161 deletions

View File

@ -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);

View File

@ -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;

View File

@ -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

View File

@ -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);
}
}

View File

@ -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;

View File

@ -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();
//Initialization stuff
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();
}