From 79051b761167d2f9db7d9e68d2e40841012cc68b Mon Sep 17 00:00:00 2001 From: Erwin Coumans Date: Thu, 11 Jan 2018 21:04:08 -0800 Subject: [PATCH] allow to use colors from MJCF file as option (default to random Google colors), use p.loadMJCF(filename, flags=p.URDF_MJCF_COLORS_FROM_FILE fix quadruped.py example. add PyBullet.isConnected() API, more friendly than PyBullet.getConnectionInfo()["connected"] --- data/plane_transparent.urdf | 2 +- data/spider.bullet | Bin 31624 -> 53676 bytes .../CollisionShape2TriangleMesh.cpp | 2 +- examples/ExampleBrowser/OpenGLGuiHelper.cpp | 9 + .../ImportMJCFDemo/BulletMJCFImporter.cpp | 644 +++++++++++++++++- .../ImportMJCFDemo/BulletMJCFImporter.h | 11 +- .../Importers/ImportURDFDemo/URDF2Bullet.h | 1 + examples/SharedMemory/SharedMemoryPublic.h | 1 + .../TinyRendererVisualShapeConverter.cpp | 45 +- examples/pybullet/examples/quadruped.py | 13 +- examples/pybullet/pybullet.c | 34 +- .../CollisionShapes/btShapeHull.cpp | 275 +++++++- .../CollisionShapes/btShapeHull.h | 4 +- 13 files changed, 986 insertions(+), 55 deletions(-) diff --git a/data/plane_transparent.urdf b/data/plane_transparent.urdf index 92279ca1e..1634fd4b7 100644 --- a/data/plane_transparent.urdf +++ b/data/plane_transparent.urdf @@ -15,7 +15,7 @@ - + diff --git a/data/spider.bullet b/data/spider.bullet index 05d17c886ebfffa55fde499dbeb97c2edca12ccc..b7925c5441788c52503aab9f3f8f6455d5fbb4e8 100644 GIT binary patch literal 53676 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 literal 31624 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 QrU6UbuildHull(0.0); + hull->buildHull(0.0, 1); { //int strideInBytes = 9*sizeof(float); diff --git a/examples/ExampleBrowser/OpenGLGuiHelper.cpp b/examples/ExampleBrowser/OpenGLGuiHelper.cpp index 2559d3d3c..97d618aa7 100644 --- a/examples/ExampleBrowser/OpenGLGuiHelper.cpp +++ b/examples/ExampleBrowser/OpenGLGuiHelper.cpp @@ -301,6 +301,15 @@ void OpenGLGuiHelper::changeTexture(int textureUniqueId, const unsigned char* rg int OpenGLGuiHelper::registerGraphicsShape(const float* vertices, int numvertices, const int* indices, int numIndices,int primitiveType, int textureId) { + if (textureId == -2) + { + if (m_data->m_checkedTextureGrey<0) + { + m_data->m_checkedTextureGrey = createCheckeredTexture(192, 192, 192); + } + textureId = m_data->m_checkedTextureGrey; + } + int shapeId = m_data->m_glApp->m_renderer->registerShape(vertices, numvertices,indices,numIndices,primitiveType, textureId); return shapeId; } diff --git a/examples/Importers/ImportMJCFDemo/BulletMJCFImporter.cpp b/examples/Importers/ImportMJCFDemo/BulletMJCFImporter.cpp index 07d4fd26b..daa3a0c59 100644 --- a/examples/Importers/ImportMJCFDemo/BulletMJCFImporter.cpp +++ b/examples/Importers/ImportMJCFDemo/BulletMJCFImporter.cpp @@ -2,7 +2,10 @@ #include "../../ThirdPartyLibs/tinyxml/tinyxml.h" #include "Bullet3Common/b3FileUtils.h" #include "Bullet3Common/b3HashMap.h" - +#include "LinearMath/btQuickprof.h" +#include "BulletCollision/CollisionShapes/btShapeHull.h" +#include "../../CommonInterfaces/CommonRenderInterface.h" +#include "../../CommonInterfaces/CommonGUIHelperInterface.h" #include #include "../../Utils/b3ResourcePath.h" #include @@ -13,6 +16,9 @@ #include "../ImportURDFDemo/urdfLexicalCast.h" #include "../ImportObjDemo/LoadMeshFromObj.h" #include "../ImportSTLDemo/LoadMeshFromSTL.h" +#include "../ImportColladaDemo/LoadMeshFromCollada.h" +#include "../OpenGLWindow/ShapeData.h" + #include"../../ThirdPartyLibs/Wavefront/tiny_obj_loader.h" #include "../ImportMeshUtility/b3ImportMeshUtility.h" @@ -31,6 +37,20 @@ +#define mjcf_sphere_indiced textured_detailed_sphere_indices +#define mjcf_sphere_vertices textured_detailed_sphere_vertices + + + +static btVector4 sGoogleColors[4] = +{ + btVector4(60. / 256., 186. / 256., 84. / 256., 1), + btVector4(244. / 256., 194. / 256., 13. / 256., 1), + btVector4(219. / 256., 50. / 256., 54. / 256., 1), + btVector4(72. / 256., 133. / 256., 237. / 256., 1), +}; + + #include enum ePARENT_LINK_ENUMS @@ -192,12 +212,14 @@ struct BulletMJCFImporterInternalData mutable btAlignedObjectArray m_allocatedMeshInterfaces; int m_flags; + int m_textureId; BulletMJCFImporterInternalData() :m_inertiaFromGeom(true), m_activeModel(-1), m_activeBodyUniqueId(-1), - m_flags(0) + m_flags(0), + m_textureId(-1) { m_pathPrefix[0] = 0; } @@ -705,6 +727,12 @@ struct BulletMJCFImporterInternalData linkPtr->m_contactInfo.m_flags |= URDF_CONTACT_HAS_ROLLING_FRICTION; } + { + geom.m_localMaterial.m_matColor.m_rgbaColor = sGoogleColors[linkIndex & 3]; + geom.m_localMaterial.m_matColor.m_specularColor.setValue(1, 1, 1); + geom.m_hasLocalMaterial = true; + } + std::string rgba = defaults.m_defaultGeomRgba; if (const char* rgbattr = link_xml->Attribute("rgba")) { @@ -713,11 +741,16 @@ struct BulletMJCFImporterInternalData if (!rgba.empty()) { // "0 0.7 0.7 1" - parseVector4(geom.m_localMaterial.m_matColor.m_rgbaColor, rgba); - geom.m_hasLocalMaterial = true; - geom.m_localMaterial.m_name = rgba; + if ((m_flags&CUF_MJCF_COLORS_FROM_FILE)) + { + parseVector4(geom.m_localMaterial.m_matColor.m_rgbaColor, rgba); + geom.m_hasLocalMaterial = true; + geom.m_localMaterial.m_name = rgba; + } } + + const char* posS = link_xml->Attribute("pos"); if (posS) { @@ -880,31 +913,43 @@ struct BulletMJCFImporterInternalData if (handledGeomType) { - UrdfCollision col; - col.m_flags |= URDF_HAS_COLLISION_GROUP; - col.m_collisionGroup = defaults.m_defaultCollisionGroup; - - col.m_flags |= URDF_HAS_COLLISION_MASK; - col.m_collisionMask = defaults.m_defaultCollisionMask; - - //contype, conaffinity - const char* conTypeStr = link_xml->Attribute("contype"); - if (conTypeStr) { + UrdfCollision col; col.m_flags |= URDF_HAS_COLLISION_GROUP; - col.m_collisionGroup = urdfLexicalCast(conTypeStr); - } - const char* conAffinityStr = link_xml->Attribute("conaffinity"); - if (conAffinityStr) - { + col.m_collisionGroup = defaults.m_defaultCollisionGroup; + col.m_flags |= URDF_HAS_COLLISION_MASK; - col.m_collisionMask = urdfLexicalCast(conAffinityStr); + col.m_collisionMask = defaults.m_defaultCollisionMask; + + //contype, conaffinity + const char* conTypeStr = link_xml->Attribute("contype"); + if (conTypeStr) + { + col.m_flags |= URDF_HAS_COLLISION_GROUP; + col.m_collisionGroup = urdfLexicalCast(conTypeStr); + } + const char* conAffinityStr = link_xml->Attribute("conaffinity"); + if (conAffinityStr) + { + col.m_flags |= URDF_HAS_COLLISION_MASK; + col.m_collisionMask = urdfLexicalCast(conAffinityStr); + } + + col.m_geometry = geom; + col.m_linkLocalFrame = linkLocalFrame; + col.m_sourceFileLocation = sourceFileLocation(link_xml); + linkPtr->m_collisionArray.push_back(col); + } + { + UrdfVisual vis; + vis.m_geometry = geom; + vis.m_linkLocalFrame = linkLocalFrame; + vis.m_sourceFileLocation = sourceFileLocation(link_xml); + linkPtr->m_visualArray.push_back(vis); + } - col.m_geometry = geom; - col.m_linkLocalFrame = linkLocalFrame; - col.m_sourceFileLocation = sourceFileLocation(link_xml); - linkPtr->m_collisionArray.push_back(col); + } else { @@ -1380,6 +1425,7 @@ BulletMJCFImporter::BulletMJCFImporter(struct GUIHelperInterface* helper, LinkVi m_data->m_guiHelper = helper; m_data->m_customVisualShapesConverter = customConverter; m_data->m_flags = flags; + m_data->m_textureId = -1; } BulletMJCFImporter::~BulletMJCFImporter() @@ -1525,6 +1571,49 @@ std::string BulletMJCFImporter::getBodyName() const return m_data->m_fileModelName; } + + +bool BulletMJCFImporter::getLinkColor2(int linkIndex, struct UrdfMaterialColor& matCol) const +{ + bool hasLinkColor = false; + { + const UrdfLink* link = m_data->getLink(m_data->m_activeModel, linkIndex); + if (link) + { + for (int i = 0; i < link->m_visualArray.size(); i++) + { + if (link->m_visualArray[i].m_geometry.m_hasLocalMaterial) + { + matCol = link->m_visualArray[i].m_geometry.m_localMaterial.m_matColor; + hasLinkColor = true; + break; + } + } + + if (!hasLinkColor) + { + for (int i = 0; i < link->m_collisionArray.size(); i++) + { + if (link->m_collisionArray[i].m_geometry.m_hasLocalMaterial) + { + matCol = link->m_collisionArray[0].m_geometry.m_localMaterial.m_matColor; + hasLinkColor = true; + } + break; + } + } + } + } + + if (!hasLinkColor) + { + matCol.m_rgbaColor = sGoogleColors[linkIndex & 3]; + matCol.m_specularColor.setValue(1, 1, 1); + hasLinkColor = true; + } + return hasLinkColor; +} + bool BulletMJCFImporter::getLinkColor(int linkIndex, btVector4& colorRGBA) const { // UrdfLink* link = m_data->getLink(linkIndex); @@ -1664,9 +1753,512 @@ bool BulletMJCFImporter::getRootTransformInWorld(btTransform& rootTransformInWor return true; } +void BulletMJCFImporter::convertURDFToVisualShapeInternal(const UrdfVisual* visual, const char* urdfPathPrefix, const btTransform& visualTransform, btAlignedObjectArray& verticesOut, btAlignedObjectArray& indicesOut, btAlignedObjectArray& texturesOut) const +{ + + + GLInstanceGraphicsShape* glmesh = 0; + int strideInBytes = 9 * sizeof(float); + + btConvexShape* convexColShape = 0; + + switch (visual->m_geometry.m_type) + { + case URDF_GEOM_CAPSULE: + { + +#if 1 + + btScalar height = visual->m_geometry.m_capsuleHeight; + + btTransform capsuleTrans; + capsuleTrans.setIdentity(); + if (visual->m_geometry.m_hasFromTo) + { + btVector3 f = visual->m_geometry.m_capsuleFrom; + btVector3 t = visual->m_geometry.m_capsuleTo; + + //compute the local 'fromto' transform + btVector3 localPosition = btScalar(0.5)*(t + f); + btQuaternion localOrn; + localOrn = btQuaternion::getIdentity(); + + btVector3 diff = t - f; + btScalar lenSqr = diff.length2(); + height = 0.f; + + if (lenSqr > SIMD_EPSILON) + { + height = btSqrt(lenSqr); + btVector3 ax = diff / height; + + btVector3 zAxis(0, 0, 1); + localOrn = shortestArcQuat(zAxis, ax); + } + capsuleTrans.setOrigin(localPosition); + capsuleTrans.setRotation(localOrn); + } + + btScalar diam = 2.*visual->m_geometry.m_capsuleRadius; + b3AlignedObjectArray transformedVertices; + int numVertices = sizeof(mjcf_sphere_vertices) / strideInBytes; + transformedVertices.resize(numVertices); + for (int i = 0; i0) + trVer[up] += halfHeight; + else + trVer[up] -= halfHeight; + + trVer = capsuleTrans*trVer; + + transformedVertices[i].xyzw[0] = trVer[0]; + transformedVertices[i].xyzw[1] = trVer[1]; + transformedVertices[i].xyzw[2] = trVer[2]; + transformedVertices[i].xyzw[3] = 0; + transformedVertices[i].normal[0] = mjcf_sphere_vertices[i * 9 + 4]; + transformedVertices[i].normal[1] = mjcf_sphere_vertices[i * 9 + 5]; + transformedVertices[i].normal[2] = mjcf_sphere_vertices[i * 9 + 6]; + //transformedVertices[i].uv[0] = mjcf_sphere_vertices[i * 9 + 7]; + //transformedVertices[i].uv[1] = mjcf_sphere_vertices[i * 9 + 8]; + + btScalar u = btAtan2(transformedVertices[i].normal[0], transformedVertices[i].normal[2]) / (2 * SIMD_PI) + 0.5; + btScalar v = transformedVertices[i].normal[1] * 0.5 + 0.5; + transformedVertices[i].uv[0] = u; + transformedVertices[i].uv[1] = v; + } + + glmesh = new GLInstanceGraphicsShape; + // int index = 0; + glmesh->m_indices = new b3AlignedObjectArray(); + glmesh->m_vertices = new b3AlignedObjectArray(); + + int numIndices = sizeof(mjcf_sphere_indiced) / sizeof(int); + for (int i = 0; i < numIndices; i++) + { + glmesh->m_indices->push_back(mjcf_sphere_indiced[i]); + } + for (int i = 0; i < transformedVertices.size(); i++) + { + glmesh->m_vertices->push_back(transformedVertices[i]); + } + glmesh->m_numIndices = numIndices; + glmesh->m_numvertices = transformedVertices.size(); + glmesh->m_scaling[0] = 1; + glmesh->m_scaling[1] = 1; + glmesh->m_scaling[2] = 1; + glmesh->m_scaling[3] = 1; +#else + if (visual->m_geometry.m_hasFromTo) + { + btVector3 f = visual->m_geometry.m_capsuleFrom; + btVector3 t = visual->m_geometry.m_capsuleTo; + btVector3 fromto[2] = { f, t }; + btScalar radii[2] = { btScalar(visual->m_geometry.m_capsuleRadius) + , btScalar(visual->m_geometry.m_capsuleRadius) }; + + btMultiSphereShape* ms = new btMultiSphereShape(fromto, radii, 2); + convexColShape = ms; + } + else + { + btCapsuleShapeZ* cap = new btCapsuleShapeZ(visual->m_geometry.m_capsuleRadius, + visual->m_geometry.m_capsuleHeight); + convexColShape = cap; + } +#endif + + break; + } + + case URDF_GEOM_CYLINDER: + { + btAlignedObjectArray vertices; + + //int numVerts = sizeof(barrel_vertices)/(9*sizeof(float)); + int numSteps = 32; + for (int i = 0; im_geometry.m_capsuleRadius; + btScalar cylLength = visual->m_geometry.m_capsuleHeight; + + btVector3 vert(cylRadius*btSin(SIMD_2_PI*(float(i) / numSteps)), cylRadius*btCos(SIMD_2_PI*(float(i) / numSteps)), cylLength / 2.); + vertices.push_back(vert); + vert[2] = -cylLength / 2.; + vertices.push_back(vert); + } + + btConvexHullShape* cylZShape = new btConvexHullShape(&vertices[0].x(), vertices.size(), sizeof(btVector3)); + cylZShape->setMargin(m_data->m_globalDefaults.m_defaultCollisionMargin); + cylZShape->recalcLocalAabb(); + convexColShape = cylZShape; + break; + } + + case URDF_GEOM_BOX: + { + btVector3 extents = visual->m_geometry.m_boxSize; + btBoxShape* boxShape = new btBoxShape(extents*0.5f); + //btConvexShape* boxShape = new btConeShapeX(extents[2]*0.5,extents[0]*0.5); + convexColShape = boxShape; + convexColShape->setMargin(m_data->m_globalDefaults.m_defaultCollisionMargin); + break; + } + + case URDF_GEOM_SPHERE: + { +#if 1 + btScalar sphereSize = 2.*visual->m_geometry.m_sphereRadius; + b3AlignedObjectArray transformedVertices; + int numVertices = sizeof(mjcf_sphere_vertices) / strideInBytes; + transformedVertices.resize(numVertices); + + + glmesh = new GLInstanceGraphicsShape; + // int index = 0; + glmesh->m_indices = new b3AlignedObjectArray(); + glmesh->m_vertices = new b3AlignedObjectArray(); + printf("vertices:\n"); + for (int i = 0; im_indices->push_back(mjcf_sphere_indiced[i]); + } + for (int i = 0; i < transformedVertices.size(); i++) + { + glmesh->m_vertices->push_back(transformedVertices[i]); + } + glmesh->m_numIndices = numIndices; + glmesh->m_numvertices = transformedVertices.size(); + glmesh->m_scaling[0] = 1; + glmesh->m_scaling[1] = 1; + glmesh->m_scaling[2] = 1; + glmesh->m_scaling[3] = 1; + +#else + + btScalar radius = visual->m_geometry.m_sphereRadius; + btSphereShape* sphereShape = new btSphereShape(radius); + convexColShape = sphereShape; + convexColShape->setMargin(m_data->m_globalDefaults.m_defaultCollisionMargin); +#endif + break; + } + + case URDF_GEOM_MESH: + { + switch (visual->m_geometry.m_meshFileType) + { + case UrdfGeometry::FILE_OBJ: + { + b3ImportMeshData meshData; + if (b3ImportMeshUtility::loadAndRegisterMeshFromFileInternal(visual->m_geometry.m_meshFileName, meshData)) + { + + if (meshData.m_textureImage1) + { + MJCFURDFTexture texData; + texData.m_width = meshData.m_textureWidth; + texData.m_height = meshData.m_textureHeight; + texData.textureData1 = meshData.m_textureImage1; + texData.m_isCached = meshData.m_isCached; + texturesOut.push_back(texData); + } + glmesh = meshData.m_gfxShape; + } + break; + } + + case UrdfGeometry::FILE_STL: + { + glmesh = LoadMeshFromSTL(visual->m_geometry.m_meshFileName.c_str()); + break; + } + + case UrdfGeometry::FILE_COLLADA: + { + btAlignedObjectArray visualShapes; + btAlignedObjectArray visualShapeInstances; + btTransform upAxisTrans; upAxisTrans.setIdentity(); + float unitMeterScaling = 1; + int upAxis = 2; + + LoadMeshFromCollada(visual->m_geometry.m_meshFileName.c_str(), + visualShapes, + visualShapeInstances, + upAxisTrans, + unitMeterScaling, + upAxis); + + glmesh = new GLInstanceGraphicsShape; + // int index = 0; + glmesh->m_indices = new b3AlignedObjectArray(); + glmesh->m_vertices = new b3AlignedObjectArray(); + + for (int i = 0; im_shapeIndex]; + + b3AlignedObjectArray verts; + verts.resize(gfxShape->m_vertices->size()); + + int baseIndex = glmesh->m_vertices->size(); + + for (int i = 0; im_vertices->size(); i++) + { + verts[i].normal[0] = gfxShape->m_vertices->at(i).normal[0]; + verts[i].normal[1] = gfxShape->m_vertices->at(i).normal[1]; + verts[i].normal[2] = gfxShape->m_vertices->at(i).normal[2]; + verts[i].uv[0] = gfxShape->m_vertices->at(i).uv[0]; + verts[i].uv[1] = gfxShape->m_vertices->at(i).uv[1]; + verts[i].xyzw[0] = gfxShape->m_vertices->at(i).xyzw[0]; + verts[i].xyzw[1] = gfxShape->m_vertices->at(i).xyzw[1]; + verts[i].xyzw[2] = gfxShape->m_vertices->at(i).xyzw[2]; + verts[i].xyzw[3] = gfxShape->m_vertices->at(i).xyzw[3]; + + } + + int curNumIndices = glmesh->m_indices->size(); + int additionalIndices = gfxShape->m_indices->size(); + glmesh->m_indices->resize(curNumIndices + additionalIndices); + for (int k = 0; km_indices->at(curNumIndices + k) = gfxShape->m_indices->at(k) + baseIndex; + } + + //compensate upAxisTrans and unitMeterScaling here + btMatrix4x4 upAxisMat; + upAxisMat.setIdentity(); + // upAxisMat.setPureRotation(upAxisTrans.getRotation()); + btMatrix4x4 unitMeterScalingMat; + unitMeterScalingMat.setPureScaling(btVector3(unitMeterScaling, unitMeterScaling, unitMeterScaling)); + btMatrix4x4 worldMat = unitMeterScalingMat*upAxisMat*instance->m_worldTransform; + //btMatrix4x4 worldMat = instance->m_worldTransform; + int curNumVertices = glmesh->m_vertices->size(); + int additionalVertices = verts.size(); + glmesh->m_vertices->reserve(curNumVertices + additionalVertices); + + for (int v = 0; vm_vertices->push_back(verts[v]); + } + } + glmesh->m_numIndices = glmesh->m_indices->size(); + glmesh->m_numvertices = glmesh->m_vertices->size(); + //glmesh = LoadMeshFromCollada(visual->m_geometry.m_meshFileName); + + break; + } + } // switch file type + + if (!glmesh || !glmesh->m_vertices || glmesh->m_numvertices <= 0) + { + b3Warning("%s: cannot extract anything useful from mesh '%s'\n", urdfPathPrefix, visual->m_geometry.m_meshFileName.c_str()); + break; + } + + //apply the geometry scaling + for (int i = 0; im_vertices->size(); i++) + { + glmesh->m_vertices->at(i).xyzw[0] *= visual->m_geometry.m_meshScale[0]; + glmesh->m_vertices->at(i).xyzw[1] *= visual->m_geometry.m_meshScale[1]; + glmesh->m_vertices->at(i).xyzw[2] *= visual->m_geometry.m_meshScale[2]; + } + break; + } + case URDF_GEOM_PLANE: + { + b3Warning("No default visual for URDF_GEOM_PLANE"); + break; + } + default: + { + b3Warning("Error: unknown visual geometry type %i\n", visual->m_geometry.m_type); + } + } + + //if we have a convex, tesselate into localVertices/localIndices + if ((glmesh == 0) && convexColShape) + { + BT_PROFILE("convexColShape"); + + btShapeHull* hull = new btShapeHull(convexColShape); + hull->buildHull(0.0); + { + // int strideInBytes = 9*sizeof(float); + int numVertices = hull->numVertices(); + int numIndices = hull->numIndices(); + + + glmesh = new GLInstanceGraphicsShape; + // int index = 0; + glmesh->m_indices = new b3AlignedObjectArray(); + glmesh->m_vertices = new b3AlignedObjectArray(); + + + + + for (int i = 0; i < numVertices; i++) + { + GLInstanceVertex vtx; + btVector3 pos = hull->getVertexPointer()[i]; + vtx.xyzw[0] = pos.x(); + vtx.xyzw[1] = pos.y(); + vtx.xyzw[2] = pos.z(); + vtx.xyzw[3] = 1.f; + btVector3 normal = pos.normalized(); + vtx.normal[0] = normal.x(); + vtx.normal[1] = normal.y(); + vtx.normal[2] = normal.z(); + btScalar u = btAtan2(normal[0], normal[2]) / (2 * SIMD_PI) + 0.5; + btScalar v = normal[1] * 0.5 + 0.5; + vtx.uv[0] = u; + vtx.uv[1] = v; + glmesh->m_vertices->push_back(vtx); + } + + btAlignedObjectArray indices; + for (int i = 0; i < numIndices; i++) + { + glmesh->m_indices->push_back(hull->getIndexPointer()[i]); + } + + glmesh->m_numvertices = glmesh->m_vertices->size(); + glmesh->m_numIndices = glmesh->m_indices->size(); + } + delete hull; + delete convexColShape; + convexColShape = 0; + + } + + if (glmesh && glmesh->m_numIndices>0 && glmesh->m_numvertices >0) + { + BT_PROFILE("glmesh"); + int baseIndex = verticesOut.size(); + + + + for (int i = 0; i < glmesh->m_indices->size(); i++) + { + indicesOut.push_back(glmesh->m_indices->at(i) + baseIndex); + } + + for (int i = 0; i < glmesh->m_vertices->size(); i++) + { + GLInstanceVertex& v = glmesh->m_vertices->at(i); + btVector3 vert(v.xyzw[0], v.xyzw[1], v.xyzw[2]); + btVector3 vt = visualTransform*vert; + v.xyzw[0] = vt[0]; + v.xyzw[1] = vt[1]; + v.xyzw[2] = vt[2]; + btVector3 triNormal(v.normal[0], v.normal[1], v.normal[2]); + triNormal = visualTransform.getBasis()*triNormal; + v.normal[0] = triNormal[0]; + v.normal[1] = triNormal[1]; + v.normal[2] = triNormal[2]; + verticesOut.push_back(v); + } + } + delete glmesh; +} + int BulletMJCFImporter::convertLinkVisualShapes(int linkIndex, const char* pathPrefix, const btTransform& inertialFrame) const { - return -1; + int graphicsIndex = -1; + if (m_data->m_flags&CUF_MJCF_COLORS_FROM_FILE) + { + btAlignedObjectArray vertices; + btAlignedObjectArray indices; + btTransform startTrans; startTrans.setIdentity(); + btAlignedObjectArray textures; + + const UrdfModel& model = *m_data->m_models[m_data->m_activeModel]; + UrdfLink* const* linkPtr = model.m_links.getAtIndex(linkIndex); + if (linkPtr) + { + + const UrdfLink* link = *linkPtr; + + for (int v = 0; v < link->m_visualArray.size(); v++) + { + const UrdfVisual& vis = link->m_visualArray[v]; + btTransform childTrans = vis.m_linkLocalFrame; + btHashString matName(vis.m_materialName.c_str()); + UrdfMaterial *const * matPtr = model.m_materials[matName]; + + convertURDFToVisualShapeInternal(&vis, pathPrefix, inertialFrame.inverse()*childTrans, vertices, indices, textures); + + } + } + if (vertices.size() && indices.size()) + { + if (1) + { + int textureIndex = -2; + if (textures.size()) + { + textureIndex = m_data->m_guiHelper->registerTexture(textures[0].textureData1, textures[0].m_width, textures[0].m_height); + } + { + B3_PROFILE("registerGraphicsShape"); + graphicsIndex = m_data->m_guiHelper->registerGraphicsShape(&vertices[0].xyzw[0], vertices.size(), &indices[0], indices.size(), B3_GL_TRIANGLES, textureIndex); + } + + } + } + + //delete textures + for (int i = 0; i < textures.size(); i++) + { + B3_PROFILE("free textureData"); + if (!textures[i].m_isCached) + { + free(textures[i].textureData1); + } + } + } + return graphicsIndex; } bool BulletMJCFImporter::getLinkContactInfo(int linkIndex, URDFLinkContactInfo& contactInfo ) const diff --git a/examples/Importers/ImportMJCFDemo/BulletMJCFImporter.h b/examples/Importers/ImportMJCFDemo/BulletMJCFImporter.h index 39be50898..fa3422bd6 100644 --- a/examples/Importers/ImportMJCFDemo/BulletMJCFImporter.h +++ b/examples/Importers/ImportMJCFDemo/BulletMJCFImporter.h @@ -12,12 +12,20 @@ struct MJCFErrorLogger virtual void printMessage(const char* msg)=0; }; - +struct MJCFURDFTexture +{ + int m_width; + int m_height; + unsigned char* textureData1; + bool m_isCached; +}; class BulletMJCFImporter : public URDFImporterInterface { struct BulletMJCFImporterInternalData* m_data; + void convertURDFToVisualShapeInternal(const struct UrdfVisual* visual, const char* urdfPathPrefix, const btTransform& visualTransform, btAlignedObjectArray& verticesOut, btAlignedObjectArray& indicesOut, btAlignedObjectArray& texturesOut) const; + public: BulletMJCFImporter(struct GUIHelperInterface* helper, LinkVisualShapesConverter* customConverter, int flags); virtual ~BulletMJCFImporter(); @@ -46,6 +54,7 @@ public: /// optional method to provide the link color. return true if the color is available and copied into colorRGBA, return false otherwise virtual bool getLinkColor(int linkIndex, btVector4& colorRGBA) const; + bool getLinkColor2(int linkIndex, struct UrdfMaterialColor& matCol) const; //optional method to get collision group (type) and mask (affinity) virtual int getCollisionGroupAndMask(int linkIndex, int& colGroup, int& colMask) const ; diff --git a/examples/Importers/ImportURDFDemo/URDF2Bullet.h b/examples/Importers/ImportURDFDemo/URDF2Bullet.h index abc4f3573..a3a79be1e 100644 --- a/examples/Importers/ImportURDFDemo/URDF2Bullet.h +++ b/examples/Importers/ImportURDFDemo/URDF2Bullet.h @@ -25,6 +25,7 @@ enum ConvertURDFFlags { CUF_RESERVED=64, CUF_USE_IMPLICIT_CYLINDER=128, CUF_GLOBAL_VELOCITIES_MB=256, + CUF_MJCF_COLORS_FROM_FILE=512, }; void ConvertURDF2Bullet(const URDFImporterInterface& u2b, diff --git a/examples/SharedMemory/SharedMemoryPublic.h b/examples/SharedMemory/SharedMemoryPublic.h index 05a81c8c1..dd7d31db8 100644 --- a/examples/SharedMemory/SharedMemoryPublic.h +++ b/examples/SharedMemory/SharedMemoryPublic.h @@ -674,6 +674,7 @@ enum eURDF_Flags URDF_RESERVED=64, URDF_USE_IMPLICIT_CYLINDER =128, URDF_GLOBAL_VELOCITIES_MB =256, + MJCF_COLORS_FROM_FILE=512, }; enum eUrdfGeomTypes //sync with UrdfParser UrdfGeomTypes diff --git a/examples/SharedMemory/TinyRendererVisualShapeConverter.cpp b/examples/SharedMemory/TinyRendererVisualShapeConverter.cpp index d0a9c321a..aa7756416 100644 --- a/examples/SharedMemory/TinyRendererVisualShapeConverter.cpp +++ b/examples/SharedMemory/TinyRendererVisualShapeConverter.cpp @@ -470,12 +470,14 @@ void convertURDFToVisualShape(const UrdfShape* visual, const char* urdfPathPrefi vtx.xyzw[1] = pos.y(); vtx.xyzw[2] = pos.z(); vtx.xyzw[3] = 1.f; - pos.normalize(); - vtx.normal[0] = pos.x(); - vtx.normal[1] = pos.y(); - vtx.normal[2] = pos.z(); - vtx.uv[0] = 0.5f; - vtx.uv[1] = 0.5f; + btVector3 normal = pos.safeNormalize(); + vtx.normal[0] = normal.x(); + vtx.normal[1] = normal.y(); + vtx.normal[2] = normal.z(); + btScalar u = btAtan2(normal[0], normal[2]) / (2 * SIMD_PI) + 0.5; + btScalar v = normal[1] * 0.5 + 0.5; + vtx.uv[0] = u; + vtx.uv[1] = v; glmesh->m_vertices->push_back(vtx); } @@ -586,18 +588,33 @@ void TinyRendererVisualShapeConverter::convertVisualShapes( { color.setValue(1,1,1,1); } - if (model && useVisual) + if (model) { - btHashString matName(linkPtr->m_visualArray[v1].m_materialName.c_str()); - UrdfMaterial*const* matPtr = model->m_materials[matName]; - if (matPtr) + if (useVisual) { - for (int i=0; i<4; i++) + btHashString matName(linkPtr->m_visualArray[v1].m_materialName.c_str()); + UrdfMaterial*const* matPtr = model->m_materials[matName]; + if (matPtr) { - rgbaColor[i] = (*matPtr)->m_matColor.m_rgbaColor[i]; + for (int i = 0; i < 4; i++) + { + rgbaColor[i] = (*matPtr)->m_matColor.m_rgbaColor[i]; + } + //printf("UrdfMaterial %s, rgba = %f,%f,%f,%f\n",mat->m_name.c_str(),mat->m_rgbaColor[0],mat->m_rgbaColor[1],mat->m_rgbaColor[2],mat->m_rgbaColor[3]); + //m_data->m_linkColors.insert(linkIndex,mat->m_rgbaColor); + } + } + + } + else + { + + if (vis && vis->m_geometry.m_hasLocalMaterial) + { + for (int i = 0; i < 4; i++) + { + rgbaColor[i] = vis->m_geometry.m_localMaterial.m_matColor.m_rgbaColor[i]; } - //printf("UrdfMaterial %s, rgba = %f,%f,%f,%f\n",mat->m_name.c_str(),mat->m_rgbaColor[0],mat->m_rgbaColor[1],mat->m_rgbaColor[2],mat->m_rgbaColor[3]); - //m_data->m_linkColors.insert(linkIndex,mat->m_rgbaColor); } } diff --git a/examples/pybullet/examples/quadruped.py b/examples/pybullet/examples/quadruped.py index dfdd65892..c325ff22b 100644 --- a/examples/pybullet/examples/quadruped.py +++ b/examples/pybullet/examples/quadruped.py @@ -4,7 +4,10 @@ import math def drawInertiaBox(parentUid, parentLinkIndex, color): - mass,frictionCoeff, inertia =p.getDynamicsInfo(bodyUniqueId=parentUid,linkIndex=parentLinkIndex, flags = p.DYNAMICS_INFO_REPORT_INERTIA) + dyn = p.getDynamicsInfo(parentUid, parentLinkIndex) + mass=dyn[0] + frictionCoeff=dyn[1] + inertia = dyn[2] if (mass>0): Ixx = inertia[0] Iyy = inertia[1] @@ -79,7 +82,7 @@ p.setTimeStep(fixedTimeStep) orn = p.getQuaternionFromEuler([0,0,0.4]) p.setRealTimeSimulation(0) -quadruped = p.loadURDF("quadruped/minitaur_v1.urdf",[1,-1,.3],orn,useFixedBase=False, useMaximalCoordinates=useMaximalCoordinates) +quadruped = p.loadURDF("quadruped/minitaur_v1.urdf",[1,-1,.3],orn,useFixedBase=False, useMaximalCoordinates=useMaximalCoordinates, flags=p.URDF_USE_IMPLICIT_CYLINDER) nJoints = p.getNumJoints(quadruped) jointNameToId = {} @@ -123,7 +126,11 @@ halfpi = 1.57079632679 twopi = 4*halfpi kneeangle = -2.1834 -mass, friction, localInertiaDiagonal = p.getDynamicsInfo(quadruped,-1, flags=p.DYNAMICS_INFO_REPORT_INERTIA ) +dyn = p.getDynamicsInfo(quadruped,-1) +mass=dyn[0] +friction=dyn[1] +localInertiaDiagonal = dyn[2] + print("localInertiaDiagonal",localInertiaDiagonal) #this is a no-op, just to show the API diff --git a/examples/pybullet/pybullet.c b/examples/pybullet/pybullet.c index c719bda5c..6ca7252ae 100644 --- a/examples/pybullet/pybullet.c +++ b/examples/pybullet/pybullet.c @@ -526,6 +526,33 @@ void b3pybulletExitFunc(void) } } +static PyObject* pybullet_isConnected(PyObject* self, PyObject* args, PyObject* keywds) +{ + int physicsClientId = 0; + int isConnected = 0; + int method = 0; + PyObject* pylist = 0; + PyObject* val = 0; + b3PhysicsClientHandle sm = 0; + static char* kwlist[] = { "physicsClientId", NULL }; + if (!PyArg_ParseTupleAndKeywords(args, keywds, "|i", kwlist, &physicsClientId)) + { + return NULL; + } + sm = getPhysicsClient(physicsClientId); + if (sm != 0) + { + if (b3CanSubmitCommand(sm)) + { + isConnected = 1; + method = sPhysicsClientsGUI[physicsClientId]; + } + } + + return PyLong_FromLong(isConnected); +} + + static PyObject* pybullet_getConnectionInfo(PyObject* self, PyObject* args, PyObject* keywds) { @@ -8249,6 +8276,10 @@ static PyMethodDef SpamMethods[] = { "getConnectionInfo(physicsClientId=0)\n" "Return if a given client id is connected, and using what method."}, + { "isConnected", (PyCFunction)pybullet_isConnected, METH_VARARGS | METH_KEYWORDS, + "isConnected(physicsClientId=0)\n" + "Return if a given client id is connected." }, + {"resetSimulation", (PyCFunction)pybullet_resetSimulation, METH_VARARGS | METH_KEYWORDS, "resetSimulation(physicsClientId=0)\n" "Reset the simulation: remove all objects and start from an empty world."}, @@ -8818,7 +8849,8 @@ initpybullet(void) PyModule_AddIntConstant(m, "URDF_USE_INERTIA_FROM_FILE", URDF_USE_INERTIA_FROM_FILE); PyModule_AddIntConstant(m, "URDF_USE_IMPLICIT_CYLINDER", URDF_USE_IMPLICIT_CYLINDER); PyModule_AddIntConstant(m, "URDF_GLOBAL_VELOCITIES_MB", URDF_GLOBAL_VELOCITIES_MB); - + PyModule_AddIntConstant(m, "MJCF_COLORS_FROM_FILE", MJCF_COLORS_FROM_FILE); + PyModule_AddIntConstant(m, "URDF_USE_SELF_COLLISION", URDF_USE_SELF_COLLISION); PyModule_AddIntConstant(m, "URDF_USE_SELF_COLLISION_EXCLUDE_PARENT", URDF_USE_SELF_COLLISION_EXCLUDE_PARENT); PyModule_AddIntConstant(m, "URDF_USE_SELF_COLLISION_EXCLUDE_ALL_PARENTS", URDF_USE_SELF_COLLISION_EXCLUDE_ALL_PARENTS); diff --git a/src/BulletCollision/CollisionShapes/btShapeHull.cpp b/src/BulletCollision/CollisionShapes/btShapeHull.cpp index 3beaf8658..9f2686903 100644 --- a/src/BulletCollision/CollisionShapes/btShapeHull.cpp +++ b/src/BulletCollision/CollisionShapes/btShapeHull.cpp @@ -20,6 +20,8 @@ subject to the following restrictions: #include "LinearMath/btConvexHull.h" #define NUM_UNITSPHERE_POINTS 42 +#define NUM_UNITSPHERE_POINTS_HIGHRES 256 + btShapeHull::btShapeHull (const btConvexShape* shape) { @@ -36,9 +38,9 @@ btShapeHull::~btShapeHull () } bool -btShapeHull::buildHull (btScalar /*margin*/) +btShapeHull::buildHull (btScalar /*margin*/, int highres) { - int numSampleDirections = NUM_UNITSPHERE_POINTS; + int numSampleDirections = highres? NUM_UNITSPHERE_POINTS_HIGHRES:NUM_UNITSPHERE_POINTS; { int numPDA = m_shape->getNumPreferredPenetrationDirections(); if (numPDA) @@ -53,11 +55,11 @@ btShapeHull::buildHull (btScalar /*margin*/) } } - btVector3 supportPoints[NUM_UNITSPHERE_POINTS+MAX_PREFERRED_PENETRATION_DIRECTIONS*2]; + btVector3 supportPoints[NUM_UNITSPHERE_POINTS_HIGHRES+MAX_PREFERRED_PENETRATION_DIRECTIONS*2]; int i; for (i = 0; i < numSampleDirections; i++) { - supportPoints[i] = m_shape->localGetSupportingVertex(getUnitSpherePoints()[i]); + supportPoints[i] = m_shape->localGetSupportingVertex(getUnitSpherePoints(highres)[i]); } HullDesc hd; @@ -118,9 +120,268 @@ btShapeHull::numIndices () const } -btVector3* btShapeHull::getUnitSpherePoints() +btVector3* btShapeHull::getUnitSpherePoints(int highres) { - static btVector3 sUnitSpherePoints[NUM_UNITSPHERE_POINTS+MAX_PREFERRED_PENETRATION_DIRECTIONS*2] = + static btVector3 sUnitSpherePointsHighres[NUM_UNITSPHERE_POINTS_HIGHRES + MAX_PREFERRED_PENETRATION_DIRECTIONS * 2] = + { + btVector3(btScalar(0.997604), btScalar(0.067004), btScalar(0.017144)), + btVector3(btScalar(0.984139), btScalar(-0.086784), btScalar(-0.154427)), + btVector3(btScalar(0.971065), btScalar(0.124164), btScalar(-0.203224)), + btVector3(btScalar(0.955844), btScalar(0.291173), btScalar(-0.037704)), + btVector3(btScalar(0.957405), btScalar(0.212238), btScalar(0.195157)), + btVector3(btScalar(0.971650), btScalar(-0.012709), btScalar(0.235561)), + btVector3(btScalar(0.984920), btScalar(-0.161831), btScalar(0.059695)), + btVector3(btScalar(0.946673), btScalar(-0.299288), btScalar(-0.117536)), + btVector3(btScalar(0.922670), btScalar(-0.219186), btScalar(-0.317019)), + btVector3(btScalar(0.928134), btScalar(-0.007265), btScalar(-0.371867)), + btVector3(btScalar(0.875642), btScalar(0.198434), btScalar(-0.439988)), + btVector3(btScalar(0.908035), btScalar(0.325975), btScalar(-0.262562)), + btVector3(btScalar(0.864519), btScalar(0.488706), btScalar(-0.116755)), + btVector3(btScalar(0.893009), btScalar(0.428046), btScalar(0.137185)), + btVector3(btScalar(0.857494), btScalar(0.362137), btScalar(0.364776)), + btVector3(btScalar(0.900815), btScalar(0.132524), btScalar(0.412987)), + btVector3(btScalar(0.934964), btScalar(-0.241739), btScalar(0.259179)), + btVector3(btScalar(0.894570), btScalar(-0.103504), btScalar(0.434263)), + btVector3(btScalar(0.922085), btScalar(-0.376668), btScalar(0.086241)), + btVector3(btScalar(0.862177), btScalar(-0.499154), btScalar(-0.085330)), + btVector3(btScalar(0.861982), btScalar(-0.420218), btScalar(-0.282861)), + btVector3(btScalar(0.818076), btScalar(-0.328256), btScalar(-0.471804)), + btVector3(btScalar(0.762657), btScalar(-0.179329), btScalar(-0.621124)), + btVector3(btScalar(0.826857), btScalar(0.019760), btScalar(-0.561786)), + btVector3(btScalar(0.731434), btScalar(0.206599), btScalar(-0.649817)), + btVector3(btScalar(0.769486), btScalar(0.379052), btScalar(-0.513770)), + btVector3(btScalar(0.796806), btScalar(0.507176), btScalar(-0.328145)), + btVector3(btScalar(0.679722), btScalar(0.684101), btScalar(-0.264123)), + btVector3(btScalar(0.786854), btScalar(0.614886), btScalar(0.050912)), + btVector3(btScalar(0.769486), btScalar(0.571141), btScalar(0.285139)), + btVector3(btScalar(0.707432), btScalar(0.492789), btScalar(0.506288)), + btVector3(btScalar(0.774560), btScalar(0.268037), btScalar(0.572652)), + btVector3(btScalar(0.796220), btScalar(0.031230), btScalar(0.604077)), + btVector3(btScalar(0.837395), btScalar(-0.320285), btScalar(0.442461)), + btVector3(btScalar(0.848127), btScalar(-0.450548), btScalar(0.278307)), + btVector3(btScalar(0.775536), btScalar(-0.206354), btScalar(0.596465)), + btVector3(btScalar(0.816320), btScalar(-0.567007), btScalar(0.109469)), + btVector3(btScalar(0.741191), btScalar(-0.668690), btScalar(-0.056832)), + btVector3(btScalar(0.755632), btScalar(-0.602975), btScalar(-0.254949)), + btVector3(btScalar(0.720311), btScalar(-0.521318), btScalar(-0.457165)), + btVector3(btScalar(0.670746), btScalar(-0.386583), btScalar(-0.632835)), + btVector3(btScalar(0.587031), btScalar(-0.219769), btScalar(-0.778836)), + btVector3(btScalar(0.676015), btScalar(-0.003182), btScalar(-0.736676)), + btVector3(btScalar(0.566932), btScalar(0.186963), btScalar(-0.802064)), + btVector3(btScalar(0.618254), btScalar(0.398105), btScalar(-0.677533)), + btVector3(btScalar(0.653964), btScalar(0.575224), btScalar(-0.490933)), + btVector3(btScalar(0.525367), btScalar(0.743205), btScalar(-0.414028)), + btVector3(btScalar(0.506439), btScalar(0.836528), btScalar(-0.208885)), + btVector3(btScalar(0.651427), btScalar(0.756426), btScalar(-0.056247)), + btVector3(btScalar(0.641670), btScalar(0.745149), btScalar(0.180908)), + btVector3(btScalar(0.602643), btScalar(0.687211), btScalar(0.405180)), + btVector3(btScalar(0.516586), btScalar(0.596999), btScalar(0.613447)), + btVector3(btScalar(0.602252), btScalar(0.387801), btScalar(0.697573)), + btVector3(btScalar(0.646549), btScalar(0.153911), btScalar(0.746956)), + btVector3(btScalar(0.650842), btScalar(-0.087756), btScalar(0.753983)), + btVector3(btScalar(0.740411), btScalar(-0.497404), btScalar(0.451830)), + btVector3(btScalar(0.726946), btScalar(-0.619890), btScalar(0.295093)), + btVector3(btScalar(0.637768), btScalar(-0.313092), btScalar(0.703624)), + btVector3(btScalar(0.678942), btScalar(-0.722934), btScalar(0.126645)), + btVector3(btScalar(0.489072), btScalar(-0.867195), btScalar(-0.092942)), + btVector3(btScalar(0.622742), btScalar(-0.757541), btScalar(-0.194636)), + btVector3(btScalar(0.596788), btScalar(-0.693576), btScalar(-0.403098)), + btVector3(btScalar(0.550150), btScalar(-0.582172), btScalar(-0.598287)), + btVector3(btScalar(0.474436), btScalar(-0.429745), btScalar(-0.768101)), + btVector3(btScalar(0.372574), btScalar(-0.246016), btScalar(-0.894583)), + btVector3(btScalar(0.480095), btScalar(-0.026513), btScalar(-0.876626)), + btVector3(btScalar(0.352474), btScalar(0.177242), btScalar(-0.918787)), + btVector3(btScalar(0.441848), btScalar(0.374386), btScalar(-0.814946)), + btVector3(btScalar(0.492389), btScalar(0.582223), btScalar(-0.646693)), + btVector3(btScalar(0.343498), btScalar(0.866080), btScalar(-0.362693)), + btVector3(btScalar(0.362036), btScalar(0.745149), btScalar(-0.559639)), + btVector3(btScalar(0.334131), btScalar(0.937044), btScalar(-0.099774)), + btVector3(btScalar(0.486925), btScalar(0.871718), btScalar(0.052473)), + btVector3(btScalar(0.452776), btScalar(0.845665), btScalar(0.281820)), + btVector3(btScalar(0.399503), btScalar(0.771785), btScalar(0.494576)), + btVector3(btScalar(0.296469), btScalar(0.673018), btScalar(0.677469)), + btVector3(btScalar(0.392088), btScalar(0.479179), btScalar(0.785213)), + btVector3(btScalar(0.452190), btScalar(0.252094), btScalar(0.855286)), + btVector3(btScalar(0.478339), btScalar(0.013149), btScalar(0.877928)), + btVector3(btScalar(0.481656), btScalar(-0.219380), btScalar(0.848259)), + btVector3(btScalar(0.615327), btScalar(-0.494293), btScalar(0.613837)), + btVector3(btScalar(0.594642), btScalar(-0.650414), btScalar(0.472325)), + btVector3(btScalar(0.562249), btScalar(-0.771345), btScalar(0.297631)), + btVector3(btScalar(0.467411), btScalar(-0.437133), btScalar(0.768231)), + btVector3(btScalar(0.519513), btScalar(-0.847947), btScalar(0.103808)), + btVector3(btScalar(0.297640), btScalar(-0.938159), btScalar(-0.176288)), + btVector3(btScalar(0.446727), btScalar(-0.838615), btScalar(-0.311359)), + btVector3(btScalar(0.331790), btScalar(-0.942437), btScalar(0.040762)), + btVector3(btScalar(0.413358), btScalar(-0.748403), btScalar(-0.518259)), + btVector3(btScalar(0.347596), btScalar(-0.621640), btScalar(-0.701737)), + btVector3(btScalar(0.249831), btScalar(-0.456186), btScalar(-0.853984)), + btVector3(btScalar(0.131772), btScalar(-0.262931), btScalar(-0.955678)), + btVector3(btScalar(0.247099), btScalar(-0.042261), btScalar(-0.967975)), + btVector3(btScalar(0.113624), btScalar(0.165965), btScalar(-0.979491)), + btVector3(btScalar(0.217438), btScalar(0.374580), btScalar(-0.901220)), + btVector3(btScalar(0.307983), btScalar(0.554615), btScalar(-0.772786)), + btVector3(btScalar(0.166702), btScalar(0.953181), btScalar(-0.252021)), + btVector3(btScalar(0.172751), btScalar(0.844499), btScalar(-0.506743)), + btVector3(btScalar(0.177630), btScalar(0.711125), btScalar(-0.679876)), + btVector3(btScalar(0.120064), btScalar(0.992260), btScalar(-0.030482)), + btVector3(btScalar(0.289640), btScalar(0.949098), btScalar(0.122546)), + btVector3(btScalar(0.239879), btScalar(0.909047), btScalar(0.340377)), + btVector3(btScalar(0.181142), btScalar(0.821363), btScalar(0.540641)), + btVector3(btScalar(0.066986), btScalar(0.719097), btScalar(0.691327)), + btVector3(btScalar(0.156750), btScalar(0.545478), btScalar(0.823079)), + btVector3(btScalar(0.236172), btScalar(0.342306), btScalar(0.909353)), + btVector3(btScalar(0.277541), btScalar(0.112693), btScalar(0.953856)), + btVector3(btScalar(0.295299), btScalar(-0.121974), btScalar(0.947415)), + btVector3(btScalar(0.287883), btScalar(-0.349254), btScalar(0.891591)), + btVector3(btScalar(0.437165), btScalar(-0.634666), btScalar(0.636869)), + btVector3(btScalar(0.407113), btScalar(-0.784954), btScalar(0.466664)), + btVector3(btScalar(0.375111), btScalar(-0.888193), btScalar(0.264839)), + btVector3(btScalar(0.275394), btScalar(-0.560591), btScalar(0.780723)), + btVector3(btScalar(0.122015), btScalar(-0.992209), btScalar(-0.024821)), + btVector3(btScalar(0.087866), btScalar(-0.966156), btScalar(-0.241676)), + btVector3(btScalar(0.239489), btScalar(-0.885665), btScalar(-0.397437)), + btVector3(btScalar(0.167287), btScalar(-0.965184), btScalar(0.200817)), + btVector3(btScalar(0.201632), btScalar(-0.776789), btScalar(-0.596335)), + btVector3(btScalar(0.122015), btScalar(-0.637971), btScalar(-0.760098)), + btVector3(btScalar(0.008054), btScalar(-0.464741), btScalar(-0.885214)), + btVector3(btScalar(-0.116054), btScalar(-0.271096), btScalar(-0.955482)), + btVector3(btScalar(-0.000727), btScalar(-0.056065), btScalar(-0.998424)), + btVector3(btScalar(-0.134007), btScalar(0.152939), btScalar(-0.978905)), + btVector3(btScalar(-0.025900), btScalar(0.366026), btScalar(-0.930108)), + btVector3(btScalar(0.081231), btScalar(0.557337), btScalar(-0.826072)), + btVector3(btScalar(-0.002874), btScalar(0.917213), btScalar(-0.398023)), + btVector3(btScalar(-0.050683), btScalar(0.981761), btScalar(-0.182534)), + btVector3(btScalar(-0.040536), btScalar(0.710153), btScalar(-0.702713)), + btVector3(btScalar(-0.139081), btScalar(0.827973), btScalar(-0.543048)), + btVector3(btScalar(-0.101029), btScalar(0.994010), btScalar(0.041152)), + btVector3(btScalar(0.069328), btScalar(0.978067), btScalar(0.196133)), + btVector3(btScalar(0.023860), btScalar(0.911380), btScalar(0.410645)), + btVector3(btScalar(-0.153521), btScalar(0.736789), btScalar(0.658145)), + btVector3(btScalar(-0.070002), btScalar(0.591750), btScalar(0.802780)), + btVector3(btScalar(0.002590), btScalar(0.312948), btScalar(0.949562)), + btVector3(btScalar(0.090988), btScalar(-0.020680), btScalar(0.995627)), + btVector3(btScalar(0.088842), btScalar(-0.250099), btScalar(0.964006)), + btVector3(btScalar(0.083378), btScalar(-0.470185), btScalar(0.878318)), + btVector3(btScalar(0.240074), btScalar(-0.749764), btScalar(0.616374)), + btVector3(btScalar(0.210803), btScalar(-0.885860), btScalar(0.412987)), + btVector3(btScalar(0.077524), btScalar(-0.660524), btScalar(0.746565)), + btVector3(btScalar(-0.096736), btScalar(-0.990070), btScalar(-0.100945)), + btVector3(btScalar(-0.052634), btScalar(-0.990264), btScalar(0.127426)), + btVector3(btScalar(-0.106102), btScalar(-0.938354), btScalar(-0.328340)), + btVector3(btScalar(0.013323), btScalar(-0.863112), btScalar(-0.504596)), + btVector3(btScalar(-0.002093), btScalar(-0.936993), btScalar(0.349161)), + btVector3(btScalar(-0.106297), btScalar(-0.636610), btScalar(-0.763612)), + btVector3(btScalar(-0.229430), btScalar(-0.463769), btScalar(-0.855546)), + btVector3(btScalar(-0.245236), btScalar(-0.066175), btScalar(-0.966999)), + btVector3(btScalar(-0.351587), btScalar(-0.270513), btScalar(-0.896145)), + btVector3(btScalar(-0.370906), btScalar(0.133108), btScalar(-0.918982)), + btVector3(btScalar(-0.264360), btScalar(0.346000), btScalar(-0.900049)), + btVector3(btScalar(-0.151375), btScalar(0.543728), btScalar(-0.825291)), + btVector3(btScalar(-0.218697), btScalar(0.912741), btScalar(-0.344346)), + btVector3(btScalar(-0.274507), btScalar(0.953764), btScalar(-0.121635)), + btVector3(btScalar(-0.259677), btScalar(0.692266), btScalar(-0.673044)), + btVector3(btScalar(-0.350416), btScalar(0.798810), btScalar(-0.488786)), + btVector3(btScalar(-0.320170), btScalar(0.941127), btScalar(0.108297)), + btVector3(btScalar(-0.147667), btScalar(0.952792), btScalar(0.265034)), + btVector3(btScalar(-0.188061), btScalar(0.860636), btScalar(0.472910)), + btVector3(btScalar(-0.370906), btScalar(0.739900), btScalar(0.560941)), + btVector3(btScalar(-0.297143), btScalar(0.585334), btScalar(0.754178)), + btVector3(btScalar(-0.189622), btScalar(0.428241), btScalar(0.883393)), + btVector3(btScalar(-0.091272), btScalar(0.098695), btScalar(0.990747)), + btVector3(btScalar(-0.256945), btScalar(0.228375), btScalar(0.938827)), + btVector3(btScalar(-0.111761), btScalar(-0.133251), btScalar(0.984696)), + btVector3(btScalar(-0.118006), btScalar(-0.356253), btScalar(0.926725)), + btVector3(btScalar(-0.119372), btScalar(-0.563896), btScalar(0.817029)), + btVector3(btScalar(0.041228), btScalar(-0.833949), btScalar(0.550010)), + btVector3(btScalar(-0.121909), btScalar(-0.736543), btScalar(0.665172)), + btVector3(btScalar(-0.307681), btScalar(-0.931160), btScalar(-0.195026)), + btVector3(btScalar(-0.283679), btScalar(-0.957990), btScalar(0.041348)), + btVector3(btScalar(-0.227284), btScalar(-0.935243), btScalar(0.270890)), + btVector3(btScalar(-0.293436), btScalar(-0.858252), btScalar(-0.420860)), + btVector3(btScalar(-0.175767), btScalar(-0.780677), btScalar(-0.599262)), + btVector3(btScalar(-0.170108), btScalar(-0.858835), btScalar(0.482865)), + btVector3(btScalar(-0.332854), btScalar(-0.635055), btScalar(-0.696857)), + btVector3(btScalar(-0.447791), btScalar(-0.445299), btScalar(-0.775128)), + btVector3(btScalar(-0.470622), btScalar(-0.074146), btScalar(-0.879164)), + btVector3(btScalar(-0.639417), btScalar(-0.340505), btScalar(-0.689049)), + btVector3(btScalar(-0.598438), btScalar(0.104722), btScalar(-0.794256)), + btVector3(btScalar(-0.488575), btScalar(0.307699), btScalar(-0.816313)), + btVector3(btScalar(-0.379882), btScalar(0.513592), btScalar(-0.769077)), + btVector3(btScalar(-0.425740), btScalar(0.862775), btScalar(-0.272516)), + btVector3(btScalar(-0.480769), btScalar(0.875412), btScalar(-0.048439)), + btVector3(btScalar(-0.467890), btScalar(0.648716), btScalar(-0.600043)), + btVector3(btScalar(-0.543799), btScalar(0.730956), btScalar(-0.411881)), + btVector3(btScalar(-0.516284), btScalar(0.838277), btScalar(0.174076)), + btVector3(btScalar(-0.353343), btScalar(0.876384), btScalar(0.326519)), + btVector3(btScalar(-0.572875), btScalar(0.614497), btScalar(0.542007)), + btVector3(btScalar(-0.503600), btScalar(0.497261), btScalar(0.706161)), + btVector3(btScalar(-0.530920), btScalar(0.754870), btScalar(0.384685)), + btVector3(btScalar(-0.395884), btScalar(0.366414), btScalar(0.841818)), + btVector3(btScalar(-0.300656), btScalar(0.001678), btScalar(0.953661)), + btVector3(btScalar(-0.461060), btScalar(0.146912), btScalar(0.875000)), + btVector3(btScalar(-0.315486), btScalar(-0.232212), btScalar(0.919893)), + btVector3(btScalar(-0.323682), btScalar(-0.449187), btScalar(0.832644)), + btVector3(btScalar(-0.318999), btScalar(-0.639527), btScalar(0.699134)), + btVector3(btScalar(-0.496771), btScalar(-0.866029), btScalar(-0.055271)), + btVector3(btScalar(-0.496771), btScalar(-0.816257), btScalar(-0.294377)), + btVector3(btScalar(-0.456377), btScalar(-0.869528), btScalar(0.188130)), + btVector3(btScalar(-0.380858), btScalar(-0.827144), btScalar(0.412792)), + btVector3(btScalar(-0.449352), btScalar(-0.727405), btScalar(-0.518259)), + btVector3(btScalar(-0.570533), btScalar(-0.551064), btScalar(-0.608632)), + btVector3(btScalar(-0.656394), btScalar(-0.118280), btScalar(-0.744874)), + btVector3(btScalar(-0.756696), btScalar(-0.438105), btScalar(-0.484882)), + btVector3(btScalar(-0.801773), btScalar(-0.204798), btScalar(-0.561005)), + btVector3(btScalar(-0.785186), btScalar(0.038618), btScalar(-0.617805)), + btVector3(btScalar(-0.709082), btScalar(0.262399), btScalar(-0.654306)), + btVector3(btScalar(-0.583412), btScalar(0.462265), btScalar(-0.667383)), + btVector3(btScalar(-0.616001), btScalar(0.761286), btScalar(-0.201272)), + btVector3(btScalar(-0.660687), btScalar(0.750204), btScalar(0.020072)), + btVector3(btScalar(-0.744987), btScalar(0.435823), btScalar(-0.504791)), + btVector3(btScalar(-0.713765), btScalar(0.605554), btScalar(-0.351373)), + btVector3(btScalar(-0.686251), btScalar(0.687600), btScalar(0.236927)), + btVector3(btScalar(-0.680201), btScalar(0.429407), btScalar(0.593732)), + btVector3(btScalar(-0.733474), btScalar(0.546450), btScalar(0.403814)), + btVector3(btScalar(-0.591023), btScalar(0.292923), btScalar(0.751445)), + btVector3(btScalar(-0.500283), btScalar(-0.080757), btScalar(0.861922)), + btVector3(btScalar(-0.643710), btScalar(0.070115), btScalar(0.761985)), + btVector3(btScalar(-0.506332), btScalar(-0.308425), btScalar(0.805122)), + btVector3(btScalar(-0.503015), btScalar(-0.509847), btScalar(0.697573)), + btVector3(btScalar(-0.482525), btScalar(-0.682105), btScalar(0.549229)), + btVector3(btScalar(-0.680396), btScalar(-0.716323), btScalar(-0.153451)), + btVector3(btScalar(-0.658346), btScalar(-0.746264), btScalar(0.097562)), + btVector3(btScalar(-0.653272), btScalar(-0.646915), btScalar(-0.392948)), + btVector3(btScalar(-0.590828), btScalar(-0.732655), btScalar(0.337645)), + btVector3(btScalar(-0.819140), btScalar(-0.518013), btScalar(-0.246166)), + btVector3(btScalar(-0.900513), btScalar(-0.282178), btScalar(-0.330487)), + btVector3(btScalar(-0.914953), btScalar(-0.028652), btScalar(-0.402122)), + btVector3(btScalar(-0.859924), btScalar(0.220209), btScalar(-0.459898)), + btVector3(btScalar(-0.777185), btScalar(0.613720), btScalar(-0.137836)), + btVector3(btScalar(-0.805285), btScalar(0.586889), btScalar(0.082728)), + btVector3(btScalar(-0.872413), btScalar(0.406077), btScalar(-0.271735)), + btVector3(btScalar(-0.859339), btScalar(0.448072), btScalar(0.246101)), + btVector3(btScalar(-0.757671), btScalar(0.216320), btScalar(0.615594)), + btVector3(btScalar(-0.826165), btScalar(0.348139), btScalar(0.442851)), + btVector3(btScalar(-0.671810), btScalar(-0.162803), btScalar(0.722557)), + btVector3(btScalar(-0.796504), btScalar(-0.004543), btScalar(0.604468)), + btVector3(btScalar(-0.676298), btScalar(-0.378223), btScalar(0.631794)), + btVector3(btScalar(-0.668883), btScalar(-0.558258), btScalar(0.490673)), + btVector3(btScalar(-0.821287), btScalar(-0.570118), btScalar(0.006994)), + btVector3(btScalar(-0.767428), btScalar(-0.587810), btScalar(0.255470)), + btVector3(btScalar(-0.933296), btScalar(-0.349837), btScalar(-0.079865)), + btVector3(btScalar(-0.982667), btScalar(-0.100393), btScalar(-0.155208)), + btVector3(btScalar(-0.961396), btScalar(0.160910), btScalar(-0.222938)), + btVector3(btScalar(-0.934858), btScalar(0.354555), btScalar(-0.006864)), + btVector3(btScalar(-0.941687), btScalar(0.229736), btScalar(0.245711)), + btVector3(btScalar(-0.884317), btScalar(0.131552), btScalar(0.447536)), + btVector3(btScalar(-0.810359), btScalar(-0.219769), btScalar(0.542788)), + btVector3(btScalar(-0.915929), btScalar(-0.210048), btScalar(0.341743)), + btVector3(btScalar(-0.816799), btScalar(-0.407192), btScalar(0.408303)), + btVector3(btScalar(-0.903050), btScalar(-0.392416), btScalar(0.174076)), + btVector3(btScalar(-0.980325), btScalar(-0.170969), btScalar(0.096586)), + btVector3(btScalar(-0.995936), btScalar(0.084891), btScalar(0.029441)), + btVector3(btScalar(-0.960031), btScalar(0.002650), btScalar(0.279283)), + }; + static btVector3 sUnitSpherePoints[NUM_UNITSPHERE_POINTS + MAX_PREFERRED_PENETRATION_DIRECTIONS * 2] = { btVector3(btScalar(0.000000) , btScalar(-0.000000),btScalar(-1.000000)), btVector3(btScalar(0.723608) , btScalar(-0.525725),btScalar(-0.447219)), @@ -165,6 +426,8 @@ btVector3* btShapeHull::getUnitSpherePoints() btVector3(btScalar(-0.425323) , btScalar(0.309011),btScalar(0.850654)), btVector3(btScalar(0.162456) , btScalar(0.499995),btScalar(0.850654)) }; + if (highres) + return sUnitSpherePointsHighres; return sUnitSpherePoints; } diff --git a/src/BulletCollision/CollisionShapes/btShapeHull.h b/src/BulletCollision/CollisionShapes/btShapeHull.h index e959f198b..78ea4b650 100644 --- a/src/BulletCollision/CollisionShapes/btShapeHull.h +++ b/src/BulletCollision/CollisionShapes/btShapeHull.h @@ -34,7 +34,7 @@ protected: unsigned int m_numIndices; const btConvexShape* m_shape; - static btVector3* getUnitSpherePoints(); + static btVector3* getUnitSpherePoints(int highres=0); public: BT_DECLARE_ALIGNED_ALLOCATOR(); @@ -42,7 +42,7 @@ public: btShapeHull (const btConvexShape* shape); ~btShapeHull (); - bool buildHull (btScalar margin); + bool buildHull (btScalar margin, int highres=0); int numTriangles () const; int numVertices () const;