void collisionShapeNode::computeCollisionShape(const MPlug& plug, MDataBlock& data) { //std::cout << collisionShapeNode::collisionMarginOffset << std::endl; MObject thisObject(thisMObject()); MPlug plgInShape(thisObject, ia_shape); if (isCompound(plgInShape)) { m_collision_shape = createCompositeShape(plgInShape); } else { MObject thisObject(thisMObject()); MPlug plgType(thisObject, ia_type); int type; plgType.getValue(type); switch(type) { case 4: //box m_collision_shape = solver_t::create_box_shape(); break; case 5: //sphere m_collision_shape = solver_t::create_sphere_shape(); break; case 6: //plane m_collision_shape = solver_t::create_plane_shape(); break; default: { MPlugArray plgaConnectedTo; plgInShape.connectedTo(plgaConnectedTo, true, true); int numSelectedShapes = plgaConnectedTo.length(); if(numSelectedShapes > 0) { MObject node = plgaConnectedTo[0].node(); m_collision_shape = createCollisionShape(node); } } } } //btAssert(m_collision_shape); data.setClean(plug); }
void collisionShapeNode::computeCollisionShape(const MPlug& plug, MDataBlock& data) { // std::cout << "collisionShapeNode::computeCollisionShape" << std::endl; MObject thisObject(thisMObject()); MPlug plgInShape(thisObject, ia_shape); MPlug plgType(thisObject, ia_type); int type; plgType.getValue(type); switch(type) { case 0: { //convex hull MPlugArray plgaConnectedTo; plgInShape.connectedTo(plgaConnectedTo, true, true); if(plgaConnectedTo.length() > 0) { MObject node = plgaConnectedTo[0].node(); if(node.hasFn(MFn::kMesh)) { MDagPath dagPath; MDagPath::getAPathTo(node, dagPath); MFnMesh fnMesh(dagPath); MFloatPointArray mpoints; MFloatVectorArray mnormals; MIntArray mtrianglecounts; MIntArray mtrianglevertices; fnMesh.getPoints(mpoints, MSpace::kObject); fnMesh.getNormals(mnormals, MSpace::kObject); fnMesh.getTriangles(mtrianglecounts, mtrianglevertices); std::vector<vec3f> vertices(mpoints.length()); std::vector<vec3f> normals(mpoints.length()); std::vector<unsigned int> indices(mtrianglevertices.length()); for(size_t i = 0; i < vertices.size(); ++i) { vertices[i] = vec3f(mpoints[i].x, mpoints[i].y, mpoints[i].z); normals[i] = vec3f(mnormals[i].x, mnormals[i].y, mnormals[i].z); } for(size_t i = 0; i < indices.size(); ++i) { indices[i] = mtrianglevertices[i]; } m_collision_shape = solver_t::create_convex_hull_shape(&(vertices[0]), vertices.size(), &(normals[0]), &(indices[0]), indices.size()); } } } break; case 1: //mesh { //convex hull MPlugArray plgaConnectedTo; plgInShape.connectedTo(plgaConnectedTo, true, true); if(plgaConnectedTo.length() > 0) { MObject node = plgaConnectedTo[0].node(); if(node.hasFn(MFn::kMesh)) { MDagPath dagPath; MDagPath::getAPathTo(node, dagPath); MFnMesh fnMesh(dagPath); MFloatPointArray mpoints; MFloatVectorArray mnormals; MIntArray mtrianglecounts; MIntArray mtrianglevertices; fnMesh.getPoints(mpoints, MSpace::kObject); fnMesh.getNormals(mnormals, MSpace::kObject); fnMesh.getTriangles(mtrianglecounts, mtrianglevertices); std::vector<vec3f> vertices(mpoints.length()); std::vector<vec3f> normals(mpoints.length()); std::vector<unsigned int> indices(mtrianglevertices.length()); for(size_t i = 0; i < vertices.size(); ++i) { vertices[i] = vec3f(mpoints[i].x, mpoints[i].y, mpoints[i].z); normals[i] = vec3f(mnormals[i].x, mnormals[i].y, mnormals[i].z); } for(size_t i = 0; i < indices.size(); ++i) { indices[i] = mtrianglevertices[i]; } m_collision_shape = solver_t::create_mesh_shape(&(vertices[0]), vertices.size(), &(normals[0]), &(indices[0]), indices.size()); } } } break; case 2: //cylinder break; case 3: //capsule break; case 4: //box m_collision_shape = solver_t::create_box_shape(); break; case 5: //sphere m_collision_shape = solver_t::create_sphere_shape(); break; case 6: //plane m_collision_shape = solver_t::create_plane_shape(); break; } assert(m_collision_shape); data.setClean(plug); }