Work on mesh generation code.
This commit is contained in:
parent
a2c984408d
commit
e276ada7ce
@ -37,6 +37,8 @@ namespace Ogre
|
|||||||
bool isPolygonConvex(std::list<SurfaceVertexIterator> listVertices, Vector3 normal);
|
bool isPolygonConvex(std::list<SurfaceVertexIterator> listVertices, Vector3 normal);
|
||||||
void addTriangle(const SurfaceVertex& v0,const SurfaceVertex& v1,const SurfaceVertex& v2);
|
void addTriangle(const SurfaceVertex& v0,const SurfaceVertex& v1,const SurfaceVertex& v2);
|
||||||
|
|
||||||
|
void fillVertexAndIndexData(std::vector<SurfaceVertex>& vecVertices, std::vector<ushort>& vecIndices);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -396,4 +396,29 @@ namespace Ogre
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SurfacePatch::fillVertexAndIndexData(std::vector<SurfaceVertex>& vecVertices, std::vector<ushort>& vecIndices)
|
||||||
|
{
|
||||||
|
vecVertices.resize(m_listVertices.size());
|
||||||
|
std::copy(m_listVertices.begin(), m_listVertices.end(), vecVertices.begin());
|
||||||
|
|
||||||
|
//vecIndices.resize(m_listTriangles.size() * 3);
|
||||||
|
for(SurfaceTriangleConstIterator iterTriangles = m_listTriangles.begin(); iterTriangles != m_listTriangles.end(); ++iterTriangles)
|
||||||
|
{
|
||||||
|
std::vector<SurfaceVertex>::iterator iterVertex;
|
||||||
|
SurfaceEdgeIterator edgeIter;
|
||||||
|
|
||||||
|
edgeIter = iterTriangles->getEdge();
|
||||||
|
iterVertex = lower_bound(vecVertices.begin(), vecVertices.end(), *(edgeIter->getTarget()));
|
||||||
|
vecIndices.push_back(iterVertex - vecVertices.begin());
|
||||||
|
|
||||||
|
edgeIter = edgeIter->getNextHalfEdge();
|
||||||
|
iterVertex = lower_bound(vecVertices.begin(), vecVertices.end(), *(edgeIter->getTarget()));
|
||||||
|
vecIndices.push_back(iterVertex - vecVertices.begin());
|
||||||
|
|
||||||
|
edgeIter = edgeIter->getNextHalfEdge();
|
||||||
|
iterVertex = lower_bound(vecVertices.begin(), vecVertices.end(), *(edgeIter->getTarget()));
|
||||||
|
vecIndices.push_back(iterVertex - vecVertices.begin());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -47,9 +47,13 @@ namespace Ogre
|
|||||||
|
|
||||||
void SurfacePatchRenderable::setGeometry(SurfacePatch& patchToRender)
|
void SurfacePatchRenderable::setGeometry(SurfacePatch& patchToRender)
|
||||||
{
|
{
|
||||||
|
std::vector<SurfaceVertex> vecVertices;
|
||||||
|
std::vector<ushort> vecIndices;
|
||||||
|
patchToRender.fillVertexAndIndexData(vecVertices,vecIndices);
|
||||||
|
|
||||||
//Initialization stuff
|
//Initialization stuff
|
||||||
mRenderOp.vertexData->vertexCount = patchToRender.getNoOfVertices();
|
mRenderOp.vertexData->vertexCount = vecVertices.size();
|
||||||
mRenderOp.indexData->indexCount = patchToRender.getNoOfTriangles() * 3;
|
mRenderOp.indexData->indexCount = vecIndices.size();
|
||||||
|
|
||||||
VertexBufferBinding *bind = mRenderOp.vertexData->vertexBufferBinding;
|
VertexBufferBinding *bind = mRenderOp.vertexData->vertexBufferBinding;
|
||||||
|
|
||||||
@ -71,21 +75,13 @@ namespace Ogre
|
|||||||
|
|
||||||
mRenderOp.indexData->indexBuffer = ibuf;
|
mRenderOp.indexData->indexBuffer = ibuf;
|
||||||
|
|
||||||
std::vector<SurfaceVertex> vertexData;
|
|
||||||
vertexData.resize(patchToRender.getNoOfVertices());
|
|
||||||
std::copy(patchToRender.getVerticesBegin(), patchToRender.getVerticesEnd(), vertexData.begin());
|
|
||||||
|
|
||||||
// Drawing stuff
|
// Drawing stuff
|
||||||
Vector3 vaabMin(std::numeric_limits<Real>::max(),std::numeric_limits<Real>::max(),std::numeric_limits<Real>::max());
|
Vector3 vaabMin(std::numeric_limits<Real>::max(),std::numeric_limits<Real>::max(),std::numeric_limits<Real>::max());
|
||||||
Vector3 vaabMax(0.0,0.0,0.0);
|
Vector3 vaabMax(0.0,0.0,0.0);
|
||||||
//Vector3 vaabMin2 = vertexData[0].getPosition().toOgreVector3();
|
|
||||||
//Vector3 vaabMax2 = vertexData[vertexData.size()-1].getPosition().toOgreVector3();
|
|
||||||
|
|
||||||
|
|
||||||
Real *prPos = static_cast<Real*>(vbuf->lock(HardwareBuffer::HBL_DISCARD));
|
Real *prPos = static_cast<Real*>(vbuf->lock(HardwareBuffer::HBL_DISCARD));
|
||||||
|
|
||||||
//for(int i = 0; i < size; i++)
|
for(std::vector<SurfaceVertex>::iterator vertexIter = vecVertices.begin(); vertexIter != vecVertices.end(); ++vertexIter)
|
||||||
for(SurfaceVertexConstIterator vertexIter = patchToRender.getVerticesBegin(); vertexIter != patchToRender.getVerticesEnd(); ++vertexIter)
|
|
||||||
{
|
{
|
||||||
*prPos++ = vertexIter->getPosition().x/2.0f;
|
*prPos++ = vertexIter->getPosition().x/2.0f;
|
||||||
*prPos++ = vertexIter->getPosition().y/2.0f;
|
*prPos++ = vertexIter->getPosition().y/2.0f;
|
||||||
@ -114,51 +110,19 @@ namespace Ogre
|
|||||||
|
|
||||||
vbuf->unlock();
|
vbuf->unlock();
|
||||||
|
|
||||||
//LogManager::getSingleton().logMessage("vaabMin = " + StringConverter::toString(vaabMin ) + ", vaabMax = " + StringConverter::toString(vaabMax ));
|
|
||||||
//LogManager::getSingleton().logMessage("vaabMin2 = " + StringConverter::toString(vaabMin2) + ", vaabMax2 = " + StringConverter::toString(vaabMax2));
|
|
||||||
|
|
||||||
vaabMin /= 2.0f;
|
vaabMin /= 2.0f;
|
||||||
vaabMax /= 2.0f;
|
vaabMax /= 2.0f;
|
||||||
|
|
||||||
mBox.setExtents(vaabMin, vaabMax);
|
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));
|
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 < indexData.size(); i++)
|
||||||
|
for(std::vector<ushort>::iterator indexIter = vecIndices.begin(); indexIter != vecIndices.end(); ++indexIter)
|
||||||
{
|
{
|
||||||
*pIdx = indicesToSet[i];
|
//*pIdx = indexData[i];
|
||||||
LogManager::getSingleton().logMessage("Correct pIdx = " + StringConverter::toString(*pIdx));
|
*pIdx = *indexIter;
|
||||||
pIdx++;
|
|
||||||
}*/
|
|
||||||
|
|
||||||
for(SurfaceTriangleConstIterator iterTriangles = patchToRender.getTrianglesBegin(); iterTriangles != patchToRender.getTrianglesEnd(); ++iterTriangles)
|
|
||||||
{
|
|
||||||
std::vector<SurfaceVertex>::iterator iterVertex;
|
|
||||||
SurfaceEdgeIterator edgeIter;
|
|
||||||
|
|
||||||
edgeIter = iterTriangles->getEdge();
|
|
||||||
SurfaceVertexConstIterator vertexToFindIter = edgeIter->getTarget();
|
|
||||||
SurfaceVertex vertexToFind = *vertexToFindIter;
|
|
||||||
iterVertex = lower_bound(vertexData.begin(), vertexData.end(), *(edgeIter->getTarget()));
|
|
||||||
*pIdx = (iterVertex - vertexData.begin());
|
|
||||||
//LogManager::getSingleton().logMessage("Wrong pIdx = " + StringConverter::toString(*pIdx));
|
|
||||||
pIdx++;
|
|
||||||
|
|
||||||
edgeIter = edgeIter->getNextHalfEdge();
|
|
||||||
iterVertex = lower_bound(vertexData.begin(), vertexData.end(), *(edgeIter->getTarget()));
|
|
||||||
*pIdx = (iterVertex - vertexData.begin());
|
|
||||||
//LogManager::getSingleton().logMessage("Wrong pIdx = " + StringConverter::toString(*pIdx));
|
|
||||||
pIdx++;
|
|
||||||
|
|
||||||
edgeIter = edgeIter->getNextHalfEdge();
|
|
||||||
iterVertex = lower_bound(vertexData.begin(), vertexData.end(), *(edgeIter->getTarget()));
|
|
||||||
*pIdx = (iterVertex - vertexData.begin());
|
|
||||||
//LogManager::getSingleton().logMessage("Wrong pIdx = " + StringConverter::toString(*pIdx));
|
|
||||||
pIdx++;
|
pIdx++;
|
||||||
}
|
}
|
||||||
|
|
||||||
ibuf->unlock();
|
ibuf->unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user