Logo Search packages:      
Sourcecode: blender version File versions  Download package

void btStridingMeshInterface::InternalProcessAllTriangles ( btInternalTriangleIndexCallback *  callback,
const btVector3 aabbMin,
const btVector3 aabbMax 
) const [inherited]

if the number of parts is big, the performance might drop due to the innerloop switch on indextype

Definition at line 24 of file btStridingMeshInterface.cpp.

References btStridingMeshInterface::getNumSubParts(), btQuadWord::getX(), btQuadWord::getY(), btQuadWord::getZ(), and btQuadWord::setValue().

Referenced by btStridingMeshInterface::calculateAabbBruteForce(), and btDiscreteDynamicsWorld::debugDrawObject().

{
      (void)aabbMin;
      (void)aabbMax;
      int numtotalphysicsverts = 0;
      int part,graphicssubparts = getNumSubParts();
      const unsigned char * vertexbase;
      const unsigned char * indexbase;
      int indexstride;
      PHY_ScalarType type;
      PHY_ScalarType gfxindextype;
      int stride,numverts,numtriangles;
      int gfxindex;
      btVector3 triangle[3];
      btScalar* graphicsbase;

      btVector3 meshScaling = getScaling();

      ///if the number of parts is big, the performance might drop due to the innerloop switch on indextype
      for (part=0;part<graphicssubparts ;part++)
      {
            getLockedReadOnlyVertexIndexBase(&vertexbase,numverts,type,stride,&indexbase,indexstride,numtriangles,gfxindextype,part);
            numtotalphysicsverts+=numtriangles*3; //upper bound

            switch (gfxindextype)
            {
            case PHY_INTEGER:
                  {
                        for (gfxindex=0;gfxindex<numtriangles;gfxindex++)
                        {
                              int* tri_indices= (int*)(indexbase+gfxindex*indexstride);
                              graphicsbase = (btScalar*)(vertexbase+tri_indices[0]*stride);
                              triangle[0].setValue(graphicsbase[0]*meshScaling.getX(),graphicsbase[1]*meshScaling.getY(),graphicsbase[2]*meshScaling.getZ());
                              graphicsbase = (btScalar*)(vertexbase+tri_indices[1]*stride);
                              triangle[1].setValue(graphicsbase[0]*meshScaling.getX(),graphicsbase[1]*meshScaling.getY(),     graphicsbase[2]*meshScaling.getZ());
                              graphicsbase = (btScalar*)(vertexbase+tri_indices[2]*stride);
                              triangle[2].setValue(graphicsbase[0]*meshScaling.getX(),graphicsbase[1]*meshScaling.getY(),     graphicsbase[2]*meshScaling.getZ());
                              callback->internalProcessTriangleIndex(triangle,part,gfxindex);
                        }
                        break;
                  }
            case PHY_SHORT:
                  {
                        for (gfxindex=0;gfxindex<numtriangles;gfxindex++)
                        {
                              short int* tri_indices= (short int*)(indexbase+gfxindex*indexstride);
                              graphicsbase = (btScalar*)(vertexbase+tri_indices[0]*stride);
                              triangle[0].setValue(graphicsbase[0]*meshScaling.getX(),graphicsbase[1]*meshScaling.getY(),graphicsbase[2]*meshScaling.getZ());
                              graphicsbase = (btScalar*)(vertexbase+tri_indices[1]*stride);
                              triangle[1].setValue(graphicsbase[0]*meshScaling.getX(),graphicsbase[1]*meshScaling.getY(),     graphicsbase[2]*meshScaling.getZ());
                              graphicsbase = (btScalar*)(vertexbase+tri_indices[2]*stride);
                              triangle[2].setValue(graphicsbase[0]*meshScaling.getX(),graphicsbase[1]*meshScaling.getY(),     graphicsbase[2]*meshScaling.getZ());
                              callback->internalProcessTriangleIndex(triangle,part,gfxindex);
                        }
                        break;
                  }
            default:
                  btAssert((gfxindextype == PHY_INTEGER) || (gfxindextype == PHY_SHORT));
            }

            unLockReadOnlyVertexBase(part);
      }
}


Generated by  Doxygen 1.6.0   Back to index