Hi,
I’m currently trying to load some obj for a rigid static actor.
loadTriangleMesh("box.obj");
int nbVertices = vertices.size(), nbTriangles = faces.size()/3;
PxTriangleMeshDesc meshDesc;
meshDesc.points.count = nbVertices;
meshDesc.points.stride = sizeof(PxVec3);
meshDesc.points.data = &vertices[0];
meshDesc.triangles.count = nbTriangles;
meshDesc.triangles.stride = 3*sizeof(PxU32);
meshDesc.triangles.data = &faces[0];
PxDefaultMemoryOutputStream writeBuffer;
mCooking->cookTriangleMesh(meshDesc, writeBuffer);
//mesh creation
PxDefaultMemoryInputData readBuffer = PxDefaultMemoryInputData(writeBuffer.getData(), writeBuffer.getSize());
PxTriangleMesh * tm = mPhysics->createTriangleMesh(readBuffer);
//actor
PxRigidStatic *meshActor = mPhysics->createRigidStatic(PxTransform());
PxTriangleMeshGeometry *meshGeo = new PxTriangleMeshGeometry(tm);
PxShape *meshShape = meshActor->createShape(*meshGeo, *sol);
mScene->addActor(*meshActor);
here is my loading function :
vector<PxVec3> vertices;
vector<PxU32> faces;
vector<PxVec3> normals;
void loadTriangleMesh(std::string file)
{
ifstream f(file);
char line[255];
while(f.good())
{
f.getline(line,255);
istringstream iss(line);
string firstWord;
iss>>firstWord;
if(firstWord == "v")
{
PxVec3 v;
iss>>v.x;
iss>>v.y;
iss>>v.z;
vertices.push_back(v);
}
if(firstWord == "vn")
{
PxVec3 v;
iss>>v.x;
iss>>v.y;
iss>>v.z;
normals.push_back(v);
}
if(firstWord == "f")
{
PxU32 t1,t2,t3;
iss>>t1;
iss>>t2;
iss>>t3;
faces.push_back(t1);
faces.push_back(t2);
faces.push_back(t3);
}
}
f.close();
}
At the execution here is what i get when i call “PxTriangleMesh * tm = mPhysics->createTriangleMesh(readBuffer);” :
./../../GeomUtils/src/GuTriangleMesh.cpp (105) : invalid operation : Gu::TriangleMesh::release: double deletion detected!
Besides i get a segfault when creating the actor.
Any idea ? Thanks !
Mathias
Up ?
Here is my current code :
void Simulator::addTriangleMesh(std::string file)
{
vector<PxVec3> pos, normals;
vector<PxU32> indices;
MeshLoader m(file);
m.loadMesh();
pos = m.getPos();
normals = m.getNormals();
indices = m.getIndices();
PxTriangleMeshDesc meshDesc;
meshDesc.points.count = pos.size();
meshDesc.points.stride = sizeof(PxVec3);
meshDesc.points.data = &pos[0];
meshDesc.triangles.count = indices.size()/3;
meshDesc.triangles.stride = 3*sizeof(PxU32);
meshDesc.triangles.data = &indices[0]; //OK mais il faut pouvoir lire un buffer de PxU32 par pas de 1*sizeof(PxU32) et non pas 3*
PxDefaultMemoryOutputStream writeBuffer;
mCooking->cookTriangleMesh(meshDesc, writeBuffer);
//mesh creation
PxDefaultMemoryInputData readBuffer = PxDefaultMemoryInputData(writeBuffer.getData(), writeBuffer.getSize());
PxTriangleMesh * tm = mPhysics->createTriangleMesh(readBuffer);
//actor
PxRigidStatic *meshActor = mPhysics->createRigidStatic(PxTransform());
PxTriangleMeshGeometry *meshGeo = new PxTriangleMeshGeometry(tm);
PxShape *meshShape = meshActor->createShape(*meshGeo, *(mPhysics->createMaterial(0.5,0.5,0.5)));
mScene->addActor(*meshActor);
actors.push_back(meshActor);
}
void MeshLoader::loadMesh()
{
ifstream f(fileName);
char line[255];
while(f.good())
{
f.getline(line,255);
istringstream iss(line);
string firstWord;
iss>>firstWord;
if(firstWord == "v")
{
PxVec3 v;
iss>>v.x;
iss>>v.y;
iss>>v.z;
pos.push_back(v);
}
if(firstWord == "vn")
{
PxVec3 v;
iss>>v.x;
iss>>v.y;
iss>>v.z;
normals.push_back(v);
}
if(firstWord == "f")
{
string t1,t2,t3;
int it1, it2, it3;
iss>>t1;
iss>>t2;
iss>>t3;
sscanf(t1.c_str(),"%d//",&it1);
sscanf(t2.c_str(),"%d//",&it2);
sscanf(t3.c_str(),"%d//",&it3);
indices.push_back(it1);
indices.push_back(it2);
indices.push_back(it3);
}
}
f.close();
}
if(shapes[i]->getGeometryType() == PxGeometryType::eTRIANGLEMESH)
{
PxTriangleMeshGeometry ptmg;
shapes[i]->getTriangleMeshGeometry(ptmg);
vector<PxVec3> v;
for(int k = 0; k < ptmg.triangleMesh->getNbVertices(); k++)
{
v.push_back(ptmg.triangleMesh->getVertices()[k]);
}
std::cout<<"v.size() "<<v.size()<<endl;
vector<PxU32> indexes;
const PxU32 *ind;
ind = (const PxU32*)(ptmg.triangleMesh->getTriangles());
for(int k=0;k<ptmg.triangleMesh->getNbTriangles();k++)
{
indexes.push_back(ind[k]);
}
epv->exportMesh(v, indexes);
}
Just to be clearer
pos = m->getPos();
normals = m->getNormals();
indices = m->getIndices();
cout<<"1 nbVertices "<< pos.size()<<" nbTriangles "<<indices.size()/3<<endl;
PxTriangleMeshDesc *meshDesc = new PxTriangleMeshDesc();
meshDesc->points.count = pos.size();
meshDesc->points.stride = sizeof(PxVec3);
meshDesc->points.data = pos.data();
meshDesc->triangles.count = indices.size()/3;
meshDesc->triangles.stride = 3*sizeof(PxU32);
meshDesc->triangles.data = indices.data(); //OK mais il faut pouvoir lire un buffer de PxU32 par pas de 1*sizeof(PxU32) et non pas 3*
cout<<"2 nbVertices "<< meshDesc->points.count<<" nbTriangles "<<meshDesc->triangles.count<<endl;
PxDefaultMemoryOutputStream *writeBuffer = new PxDefaultMemoryOutputStream();
bool status = mCooking->cookTriangleMesh(*meshDesc, *writeBuffer);
if(!status)
exit(0);
//mesh creation
PxDefaultMemoryInputData *readBuffer = new PxDefaultMemoryInputData(writeBuffer->getData(), writeBuffer->getSize());
PxTriangleMesh * tm = mPhysics->createTriangleMesh(*readBuffer);
cout<<"3 nbVertices "<< tm->getNbVertices()<<" nbTriangles "<<tm->getNbTriangles()<<endl;
this produces the following output :
1 nbVertices 8 nbTriangles 12
2 nbVertices 8 nbTriangles 12
3 nbVertices 7 nbTriangles 7
I’m getting the same error. Anyone know how to fix this? It only happens for me in release mode but its 100% reproducable.