Jump to content
  • Advertisement
Sign in to follow this  
abeltherock007

converting to PhysX meshes

This topic is 2797 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I am trying to convert the DX10 mesh into Phyx mesh. I am getting an error
" Unhandled exception at 0x004abb18 in DXPHYSX.exe:0xC0000005:Access Violation reading location 0x0057b270.


void Mesh::CreatePhysxActor()
{
///Copy Mesh data into PhysX Mesh Data
m_PhysXVerts.clear();
m_PhysXIndices.clear();

for ( unsigned int i = 0; i < m_Vertices.size(); i++ )
{
m_PhysXVerts.push_back(NxVec3(m_Vertices.vPosition.x, m_Vertices.vPosition.y, m_Vertices.vPosition.z));
}

for ( unsigned int i = 0; i < m_Indices.size(); i++ )
{
m_PhysXIndices.push_back(m_Indices);
}

NxVec3* _pVerts = new NxVec3[m_PhysXVerts.size()/3];
NxU16* _pTriangles = new NxU16[m_PhysXIndices.size()/3];
//Build Physical Model
NxTriangleMeshDesc _triangleDesc;
_triangleDesc.numVertices = (NxU32)(m_PhysXVerts.size()/3);
_triangleDesc.numTriangles = (NxU32)(m_PhysXIndices.size()/3);
_triangleDesc.pointStrideBytes = sizeof(NxVec3);
_triangleDesc.triangleStrideBytes = sizeof(NxU32) * 3;
_triangleDesc.points = _pVerts;
_triangleDesc.triangles = _pTriangles;
_triangleDesc.flags = NX_MF_16_BIT_INDICES;

NxTriangleMeshShapeDesc _triangleMeshShapeDesc;
NxInitCooking();

//Cooking from Memory
MemoryWriteBuffer _writeBuff;
bool bStatus = NxCookTriangleMesh(_triangleDesc, UserStream("C:\stream.bin", false));
_triangleMeshShapeDesc.meshData = PhysicsManager::GetInstance()->GetPhysicsSDKptr()->createTriangleMesh( UserStream("C:\stream.bin", true));

NxCloseCooking();

NxActorDesc _actorDesc;
_actorDesc.shapes.pushBack(&_triangleMeshShapeDesc);
_actorDesc.globalPose.t = NxVec3(m_sNodeInfo.m_sTransformation.m_vTranslation.x, m_sNodeInfo.m_sTransformation.m_vTranslation.y, m_sNodeInfo.m_sTransformation.m_vTranslation.z);

m_sNodeInfo.m_pActor = PhysicsManager::GetInstance()->GetPhysXScene()->createActor(_actorDesc);
}
[\source]

Share this post


Link to post
Share on other sites
Advertisement
I see a few things that are problems. The first biggie is that when you allocate _pVerts you are allocating a too small array. You must not divide m_PhysXVerts.size() by 3! You need _pVerts to have just as many elements as m_PhysXVerts. Same exact thing with _pTriangles. You must not divide m_PhysXIndices.size() by 3 to get the size of the _pTriangles array. Then, same deal when assigning _triangleDesc.numVertices and .numTriangles. Don't divide by 3. The point and triangle stride stuff, I think that looks okay.

Next super big problem...when you assign _triangleDesc.points to be _pVerts, please note that _pVerts doesn't actually have any data in it! You have allocated arrays but you didn't actually put the vertex data into it. Your vertex data is in m_PhysXVerts, but _pVerts is just a blank array that happens to be sized based on m_PhysXverts. You need to put the data into _pVerts. Same deal with _pTriangles. As you have the code, it does not actually contain the indices, which are in m_PhysXIndices but not in _pTriangles.

My suggestion would be to skip m_PhysXVerts and m_PhysXTriangles. Unless you need them later on, just get rid of them and populate _pVerts and _pTriangles up above instead of populating m_PhysX*. (Well, perhaps you're using them for debug visualization? I don't know. You do not use them for anything here, really.)

Share this post


Link to post
Share on other sites

///Copy Mesh data into PhysX Mesh Data
m_PhysXVerts.clear();
m_PhysXIndices.clear();

NxVec3* _pVerts = new NxVec3[m_Vertices.size()];
NxU16* _pTriangles = new NxU16[m_Indices.size()];

for ( unsigned int i = 0; i < m_Vertices.size(); i++ )
{
m_PhysXVerts.push_back(NxVec3(m_Vertices.vPosition.x, m_Vertices.vPosition.y, m_Vertices.vPosition.z));
_pVerts = &m_PhysXVerts;
}

for ( unsigned int i = 0; i < m_Indices.size(); i++ )
{
m_PhysXIndices.push_back(m_Indices);
_pTriangles = &m_PhysXIndices;
}

//Build Physical Model
NxTriangleMeshDesc _triangleDesc;
_triangleDesc.numVertices = (NxU32)(m_PhysXVerts.size());
_triangleDesc.numTriangles = (NxU32)(m_PhysXIndices.size());
_triangleDesc.pointStrideBytes = sizeof(NxVec3);
_triangleDesc.triangleStrideBytes = sizeof(NxU32) * 3;
_triangleDesc.points = _pVerts;
_triangleDesc.triangles = _pTriangles;
_triangleDesc.flags = NX_MF_16_BIT_INDICES;

NxTriangleMeshShapeDesc _triangleMeshShapeDesc;
NxInitCooking();

//Cooking from Memory
MemoryWriteBuffer _writeBuff;
bool bStatus = NxCookTriangleMesh(_triangleDesc, _writeBuff);
_triangleMeshShapeDesc.meshData = PhysicsManager::GetInstance()->GetPhysicsSDKptr()->createTriangleMesh( MemoryReadBuffer(_writeBuff.data) );

NxCloseCooking();

NxActorDesc _actorDesc;
_actorDesc.shapes.pushBack(&_triangleMeshShapeDesc);
_actorDesc.globalPose.t = NxVec3(m_sNodeInfo.m_sTransformation.m_vTranslation.x, m_sNodeInfo.m_sTransformation.m_vTranslation.y, m_sNodeInfo.m_sTransformation.m_vTranslation.z);

m_sNodeInfo.m_pActor = PhysicsManager::GetInstance()->GetPhysXScene()->createActor(_actorDesc);




Thanks for the reply. The above is the modified code.. still the error i receive is
Unhandled exception at 0x0026bb18 in MultiThreaded_DX.exe: 0xC0000005: Access violation reading location 0x003ebda0.
in the line

bool bStatus = NxCookTriangleMesh(_triangleDesc, _writeBuff);

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!