{
int numSubEntities = pEntity->getNumSubEntities();
{
//get VertexData and IndexData
Ogre::SubEntity *pSubEntity = pEntity->getSubEntity( i );
Ogre::VertexData *pSubEntityVertexData = pSubEntity->getVertexDataForBinding();
Ogre::SubMesh *pSubMesh = pSubEntity->getSubMesh();
Ogre::IndexData *pSubEntityIndexData = pSubMesh->indexData;
Ogre::VertexBufferBinding::VertexBufferBindingMap ghm_VBBM = pSubEntityVertexData->vertexBufferBinding->getBindings();
int iPositonIndex = -1;
//find position buffer
DWORD ElementCount = (DWORD)pSubEntityVertexData->vertexDeclaration->getElementCount();
for ( DWORD k = 0; k < ElementCount; i++)
{
const VertexElement *ghm_VE = pSubEntityVertexData->vertexDeclaration->getElement( k );
if ( ghm_VE->getSemantic() == VES_POSITION ) //we are just interested in position
{
//bingo,get it
iPositonIndex = k;
break;
}
}
return false;
Ogre::VertexBufferBinding::VertexBufferBindingMap::iterator vbbm_interator = ghm_VBBM.find( iPositonIndex );
size_t vertexbuffersize = vbbm_interator->second->getNumVertices() * vbbm_interator->second->getVertexSize(); //buffer size
BYTE *VertexBuffer = new BYTE[vertexbuffersize]; //build vertex buffer
vbbm_interator->second->readData( 0, vertexbuffersize, VertexBuffer );
//float *fVertexBuffer = (float*)VertexBuffer;
//check index
Ogre::RenderOperation roSub;
pSubMesh->_getRenderOperation( roSub );
if ( roSub.useIndexes ) //使用index
{
//read index buffer
size_t indexbuffersize = pSubEntityIndexData->indexBuffer->getNumIndexes() * pSubEntityIndexData->indexBuffer->getIndexSize(); //buffer size
BYTE *IndexBuffer = new BYTE[indexbuffersize]; //build index buffer
//read data
pSubEntityIndexData->indexBuffer->readData( 0, indexbuffersize, IndexBuffer );
//check index type
if ( pSubEntityIndexData->indexBuffer->getType() == Ogre::HardwareIndexBuffer::IT_16BIT )
{
short *iIndexBuffer = (short*)IndexBuffer;
for ( size_t j = 0; j<numfaces; j++ )
{
float fa,fb,fc;
memcpy( &fa, &VertexBuffer[ iIndexBuffer[ j * 3 ] * sizeof(float) * 3 + ( iIndexBuffer[ j * 3 ] * PositionElementOffset ) ], sizeof(float) );
memcpy( &fb, &VertexBuffer[ iIndexBuffer[ j * 3 ] * sizeof(float) * 3 + sizeof(float) + ( iIndexBuffer[ j * 3 ] * PositionElementOffset ) ], sizeof(float) );
memcpy( &fc, &VertexBuffer[ iIndexBuffer[ j * 3 ] * sizeof(float) * 3 + sizeof(float) * 2 + ( iIndexBuffer[ j * 3 ] * PositionElementOffset ) ], sizeof(float) );
Vector3 t1 = Vector3( fa, fb, fc );
memcpy( &fb, &VertexBuffer[ iIndexBuffer[ j * 3 + 1 ] * sizeof(float) * 3 + sizeof(float) + ( iIndexBuffer[ j * 3 + 1 ] * PositionElementOffset ) ], sizeof(float) );
memcpy( &fc, &VertexBuffer[ iIndexBuffer[ j * 3 + 1 ] * sizeof(float) * 3 + sizeof(float) * 2 + ( iIndexBuffer[ j * 3 + 1 ] * PositionElementOffset ) ], sizeof(float) );
Vector3 t2 = Vector3( fa, fb, fc );
memcpy( &fb, &VertexBuffer[ iIndexBuffer[ j * 3 + 2 ] * sizeof(float) * 3 + sizeof(float) + ( iIndexBuffer[ j * 3 + 2 ] * PositionElementOffset ) ], sizeof(float) );
memcpy( &fc, &VertexBuffer[ iIndexBuffer[ j * 3 + 2 ] * sizeof(float) * 3 + sizeof(float) * 2 + ( iIndexBuffer[ j * 3 + 2 ] * PositionElementOffset ) ], sizeof(float) );
Vector3 t3 = Vector3( fa, fb, fc );
{
SAFE_DELETE_ARRAY( VertexBuffer );
SAFE_DELETE_ARRAY( IndexBuffer );
{
*SubEntityIndex = i;
}
if ( IntersectTriangleA && IntersectTriangleB && IntersectTriangleC )
{
*IntersectTriangleA = t1;
*IntersectTriangleB = t2;
*IntersectTriangleC = t3;
}
return true;
}
}
else //this is 32 bit index
{
long *iIndexBuffer = (long*)IndexBuffer;
for ( size_t j = 0; j<numfaces; j++ )
{
float fa,fb,fc;
memcpy( &fa, &VertexBuffer[ iIndexBuffer[ j * 3 ] * sizeof(float) * 3 + ( iIndexBuffer[ j * 3 ] * PositionElementOffset ) ], sizeof(float) );
memcpy( &fb, &VertexBuffer[ iIndexBuffer[ j * 3 ] * sizeof(float) * 3 + sizeof(float) + ( iIndexBuffer[ j * 3 ] * PositionElementOffset ) ], sizeof(float) );
memcpy( &fc, &VertexBuffer[ iIndexBuffer[ j * 3 ] * sizeof(float) * 3 + sizeof(float) * 2 + ( iIndexBuffer[ j * 3 ] * PositionElementOffset ) ], sizeof(float) );
Vector3 t1 = Vector3( fa, fb, fc );
memcpy( &fb, &VertexBuffer[ iIndexBuffer[ j * 3 + 1 ] * sizeof(float) * 3 + sizeof(float) + ( iIndexBuffer[ j * 3 + 1 ] * PositionElementOffset ) ], sizeof(float) );
memcpy( &fc, &VertexBuffer[ iIndexBuffer[ j * 3 + 1 ] * sizeof(float) * 3 + sizeof(float) * 2 + ( iIndexBuffer[ j * 3 + 1 ] * PositionElementOffset ) ], sizeof(float) );
Vector3 t2 = Vector3( fa, fb, fc );
memcpy( &fb, &VertexBuffer[ iIndexBuffer[ j * 3 + 2 ] * sizeof(float) * 3 + sizeof(float) + ( iIndexBuffer[ j * 3 + 2 ] * PositionElementOffset ) ], sizeof(float) );
memcpy( &fc, &VertexBuffer[ iIndexBuffer[ j * 3 + 2 ] * sizeof(float) * 3 + sizeof(float) * 2 + ( iIndexBuffer[ j * 3 + 2 ] * PositionElementOffset ) ], sizeof(float) );
Vector3 t3 = Vector3( fa, fb, fc );
if ( rt )
{
SAFE_DELETE_ARRAY( VertexBuffer );
SAFE_DELETE_ARRAY( IndexBuffer );
{
*SubEntityIndex = i;
}
if ( IntersectTriangleA && IntersectTriangleB && IntersectTriangleC )
{
*IntersectTriangleA = t1;
*IntersectTriangleB = t2;
*IntersectTriangleC = t3;
}
return true;
}
}
}
SAFE_DELETE_ARRAY( IndexBuffer );
}
else //don't use index
{
//get face number
size_t numfaces = vbbm_interator->second->getNumVertices() / 3;
for ( size_t j = 0; j<numfaces; j++ )
{
float fa,fb,fc;
memcpy( &fa, &VertexBuffer[ j * 9 + j * 9 * PositionElementOffset ], sizeof(float) );
memcpy( &fb, &VertexBuffer[ j * 9 + sizeof(float) + ( j * 9 + sizeof(float) ) * PositionElementOffset ], sizeof(float) );
memcpy( &fc, &VertexBuffer[ j * 9 + sizeof(float) * 2 + ( j * 9 + sizeof(float) * 2 ) * PositionElementOffset ], sizeof(float) );
Vector3 t1 = Vector3( fa, fb, fc );
memcpy( &fb, &VertexBuffer[ j * 9 + sizeof(float) * 4 + ( j * 9 + sizeof(float) * 4 ) * PositionElementOffset ], sizeof(float) );
memcpy( &fc, &VertexBuffer[ j * 9 + sizeof(float) * 5 + ( j * 9 + sizeof(float) * 5 ) * PositionElementOffset ], sizeof(float) );
Vector3 t2 = Vector3( fa, fb, fc );
memcpy( &fb, &VertexBuffer[ j * 9 + sizeof(float) * 7 + ( j * 9 + sizeof(float) * 7 ) * PositionElementOffset ], sizeof(float) );
memcpy( &fc, &VertexBuffer[ j * 9 + sizeof(float) * 8 + ( j * 9 + sizeof(float) * 8 ) * PositionElementOffset ], sizeof(float) );
Vector3 t3 = Vector3( fa, fb, fc );
bool rt = IntersectTriangle( ray.getOrigin(), ray.getDirection(), t1, t2, t3, t, u, v );
if ( rt )
{
SAFE_DELETE_ARRAY( VertexBuffer );
{
*SubEntityIndex = i;
}
if ( IntersectTriangleA && IntersectTriangleB && IntersectTriangleC )
{
*IntersectTriangleA = t1;
*IntersectTriangleB = t2;
*IntersectTriangleC = t3;
}
return true;
}
}
}
return false;
}
915



被折叠的 条评论
为什么被折叠?



