//============================================================================== OdeMesh::~OdeMesh() { dGeomDestroy(mGeomId); if (mOdeTriMeshDataId) dGeomTriMeshDataDestroy(mOdeTriMeshDataId); }
void PhysicsTriMeshGeom::onDestroy() { PhysicsTriMeshGeomPtr tmpPtr(*this); if (tmpPtr->data) dGeomTriMeshDataDestroy(tmpPtr->data); if(vertexData) free((void*)vertexData); if(faceData) free((void*)faceData); if(normalData) free((void*)normalData); geoNode=NullFC; }
void Solid::onClose() { InternalMessage("Physic","Ode::Solid::onClose entering " + Kernel::toString(getObject()->getIdentifier())) ; dGeomTriMeshDataDestroy(m_data) ; delete[] m_vertices ; delete[] m_indices ; onCloseCollideable() ; InternalMessage("Physic","Ode::Solid::onClose leaving " + Kernel::toString(getObject()->getIdentifier())) ; }
StaticWorldObject::~StaticWorldObject() { unsigned int i; // destroy the trimesh data for (i=0; i<dataids.size(); i++) dGeomTriMeshDataDestroy(dataids[i]); dataids.clear(); // destroy the trimeshes for (i=0; i<geomids.size(); i++) dGeomDestroy(geomids[i]); geomids.clear(); dSpaceDestroy(space); }
void CMeshShape::Detach() { n_assert(IsAttached()); n_assert(pVBuffer); n_assert(pIBuffer); dGeomTriMeshDataDestroy(ODETriMeshDataID); n_free(pVBuffer); n_free(pIBuffer); pVBuffer = NULL; pIBuffer = NULL; CShape::Detach(); };
void stop() { dGeomDestroy(mesh_geom); dGeomTriMeshDataDestroy(mesh_data); dBodyDestroy(ball1_body); dBodyDestroy(ball2_body); dGeomDestroy(ground); dJointGroupDestroy(contact_group); dSpaceDestroy(space); // will destroy all geoms dWorldDestroy(world); }
void Obstacle::on_removeFromScene() { delete node_; node_ = 0; for (std::vector<dGeomID>::iterator gptr(geom_.begin()), gend(geom_.end()); gptr != gend; ++gptr) { dSpaceRemove(gStaticSpace, *gptr); dGeomDestroy(*gptr); } for (std::vector<dTriMeshDataID>::iterator dptr(tmd_.begin()), dend(tmd_.end()); dptr != dend; ++dptr) { dGeomTriMeshDataDestroy(*dptr); } }
void ODE_Link::destroy() { if(jointType!=FREE_JOINT) dJointDestroy(odeJointId); for(int i=0; i<geomIds.size(); i++) dGeomDestroy(geomIds.at(i)); if(triMeshDataId) dGeomTriMeshDataDestroy(triMeshDataId); dBodyDestroy(bodyId); ODE_Link* link = static_cast<ODE_Link*>(child); while(link){ ODE_Link* linkToDelete = (ODE_Link*)link; link = static_cast<ODE_Link*>(link->sibling); linkToDelete->destroy(); } }
void PhyMeshDataPool::Remove(PhyMeshData * data) { dGeomTriMeshDataDestroy((dTriMeshDataID)(data->_dataId)); LINKER_REMOVE(mMeshDataLinker, data); }
/***************************************************************************\ * Field Set * \***************************************************************************/ void PhysicsTriMeshGeom::setGeometryNode(NodePtr& node) { PhysicsTriMeshGeomPtr tmpPtr(*this); GeometryPtr geo = GeometryPtr::dcast(node->getCore()); if(geo!=NullFC) { calcVertexNormals(geo, deg2rad( 30)); separateProperties(geo); createSingleIndex(geo); GeoPositions3f::StoredFieldType* positions = GeoPositions3fPtr::dcast( geo->getPositions())->getFieldPtr(); GeoIndicesUI32::StoredFieldType* indices = GeoIndicesUI32Ptr::dcast( geo->getIndices())->getFieldPtr(); GeoNormals3f::StoredFieldType* normals = GeoNormals3fPtr::dcast( geo->getNormals())->getFieldPtr(); GeoPTypesPtr geoTypes = geo->getTypes(); bool triangles = false; //has to be some triangle soup! for( Int32 i=0; i < geoTypes->size(); ++i) { switch( geoTypes->getValue(i)) { case GL_TRIANGLES: triangles=true; break; case GL_TRIANGLE_STRIP: triangles=true; break; case GL_TRIANGLE_FAN: triangles=true; break; } } UInt32 vertexCount = GeoPositions3fPtr::dcast(geo->getPositions())->getSize(); UInt32 vertexStride = 3*sizeof(Real32); UInt32 indexCount = GeoIndicesUI32Ptr::dcast(geo->getIndices())->getSize(); UInt32 indexStride = 3*sizeof(UInt32); //pass the pointers to ODE if(tmpPtr->data) dGeomTriMeshDataDestroy(tmpPtr->data); tmpPtr->data = dGeomTriMeshDataCreate(); if(triangles) { dGeomTriMeshDataBuildSingle(tmpPtr->data, (Real32*)&positions->front(), vertexStride, vertexCount, (Int32*)&indices->front(), indexCount, indexStride/* just can't use this, (Real32*)&normals->front()*/); tmpPtr->setData(tmpPtr->data); /* use this method if you build with single precision dGeomTriMeshDataBuildSingle1(tmpPtr->data, (Real32*)&positions->front(), vertexStride, vertexCount, (Int32*)&indices->front(), indexCount, indexStride, (Real32*)&normals->front()); tmpPtr->setData(tmpPtr->data); */ } else { FWARNING(("No triangle mesh given to ODE! Convert to triangles first!\n")); tmpPtr->setData(tmpPtr->data); } } tmpPtr->geoNode=node; PhysicsTriMeshGeomBase::setGeometryNode(node); }
// called when a key pressed static void command( int cmd ) { int i,k; dReal sides[3]; dMass m; cmd = locase( cmd ); if ( cmd == 'v' || cmd == 'b' || cmd == 'c' || cmd == 's' ) { if ( num < NUM ) { i = num; num++; } else { i = nextobj; nextobj++; if ( nextobj >= num ) nextobj = 0; // destroy the body and geoms for slot i dBodyDestroy( obj[i].body ); for ( k=0; k < GPB; k++ ) { if ( obj[i].geom[k] ) dGeomDestroy( obj[i].geom[k] ); } memset( &obj[i],0,sizeof( obj[i] ) ); } obj[i].body = dBodyCreate( world ); for ( k=0; k<3; k++ ) sides[k] = dRandReal()*0.5+0.1; dMatrix3 R; if ( random_pos ) { dBodySetPosition( obj[i].body, dRandReal()*2-1,dRandReal()*2-1,dRandReal()+3 ); dRFromAxisAndAngle( R,dRandReal()*2.0-1.0,dRandReal()*2.0-1.0, dRandReal()*2.0-1.0,dRandReal()*10.0-5.0 ); } else { dReal maxheight = 0; for ( k=0; k<num; k++ ) { const dReal *pos = dBodyGetPosition( obj[k].body ); if ( pos[2] > maxheight ) maxheight = pos[2]; } dBodySetPosition( obj[i].body, 0,0,maxheight+1 ); dRFromAxisAndAngle( R,0,0,1,dRandReal()*10.0-5.0 ); } dBodySetRotation( obj[i].body,R ); dBodySetData( obj[i].body,( void* )( size_t )i ); if ( cmd == 'b' ) { dMassSetBox( &m,DENSITY,sides[0],sides[1],sides[2] ); obj[i].geom[0] = dCreateBox( space,sides[0],sides[1],sides[2] ); } else if ( cmd == 'c' ) { sides[0] *= 0.5; dMassSetCapsule( &m,DENSITY,3,sides[0],sides[1] ); obj[i].geom[0] = dCreateCapsule( space,sides[0],sides[1] ); } else if ( cmd == 's' ) { sides[0] *= 0.5; dMassSetSphere( &m,DENSITY,sides[0] ); obj[i].geom[0] = dCreateSphere( space,sides[0] ); } else if ( cmd == 'v' ) { obj[i].geom[0] = dCreateConvex( space, convexBunnyPlanes, convexBunnyPlaneCount, convexBunnyPoints, convexBunnyPointCount, convexBunnyPolygons ); /// Use equivalent TriMesh to set mass dTriMeshDataID new_tmdata = dGeomTriMeshDataCreate(); dGeomTriMeshDataBuildSingle( new_tmdata, &Vertices[0], 3 * sizeof( float ), VertexCount, ( dTriIndex* )&Indices[0], IndexCount, 3 * sizeof( dTriIndex ) ); dGeomID triMesh = dCreateTriMesh( 0, new_tmdata, 0, 0, 0 ); dMassSetTrimesh( &m, DENSITY, triMesh ); dGeomDestroy( triMesh ); dGeomTriMeshDataDestroy( new_tmdata ); printf( "mass at %f %f %f\n", m.c[0], m.c[1], m.c[2] ); dGeomSetPosition( obj[i].geom[0], -m.c[0], -m.c[1], -m.c[2] ); dMassTranslate( &m, -m.c[0], -m.c[1], -m.c[2] ); } for ( k=0; k < GPB; k++ ) { if ( obj[i].geom[k] ) dGeomSetBody( obj[i].geom[k],obj[i].body ); } dBodySetMass( obj[i].body,&m ); } if ( cmd == ' ' ) { selected++; if ( selected >= num ) selected = 0; if ( selected < 0 ) selected = 0; } else if ( cmd == 'd' && selected >= 0 && selected < num ) { dBodyDisable( obj[selected].body ); } else if ( cmd == 'e' && selected >= 0 && selected < num ) { dBodyEnable( obj[selected].body ); } else if ( cmd == 'a' ) { show_aabb ^= 1; } else if ( cmd == 't' ) { show_contacts ^= 1; } else if ( cmd == 'r' ) { random_pos ^= 1; } }
OdeTriMesh::~OdeTriMesh() { dGeomTriMeshDataDestroy(mTriMeshId); }