void MeshBase::loadFromObj( const std::string& filename ) { preProcess(); loadInfoFromObj( filename ); allocateData(); startWritingData(); loadDataFromObj( filename ); computeAabb(); postProcess(); finishWritingData(); }
void processRaycastTask(void* userPtr, void* lsMemory) { RaycastTask_LocalStoreMemory* localMemory = (RaycastTask_LocalStoreMemory*)lsMemory; SpuRaycastTaskDesc* taskDescPtr = (SpuRaycastTaskDesc*)userPtr; SpuRaycastTaskDesc& taskDesc = *taskDescPtr; SpuCollisionObjectWrapper* cows = (SpuCollisionObjectWrapper*)taskDesc.spuCollisionObjectsWrappers; //spu_printf("in processRaycastTask %d\n", taskDesc.numSpuCollisionObjectWrappers); /* for each object */ RaycastGatheredObjectData gatheredObjectData; for (int objectId = 0; objectId < taskDesc.numSpuCollisionObjectWrappers; objectId++) { //spu_printf("%d / %d\n", objectId, taskDesc.numSpuCollisionObjectWrappers); /* load initial collision shape */ GatherCollisionObjectAndShapeData (&gatheredObjectData, localMemory, (ppu_address_t)&cows[objectId]); if (btBroadphaseProxy::isConcave (gatheredObjectData.m_shapeType)) { SpuRaycastTaskWorkUnitOut tWorkUnitsOut[SPU_RAYCAST_WORK_UNITS_PER_TASK]; for (int rayId = 0; rayId < taskDesc.numWorkUnits; rayId++) { tWorkUnitsOut[rayId].hitFraction = 1.0; } performRaycastAgainstConcave (&gatheredObjectData, &taskDesc.workUnits[0], &tWorkUnitsOut[0], taskDesc.numWorkUnits, localMemory); for (int rayId = 0; rayId < taskDesc.numWorkUnits; rayId++) { const SpuRaycastTaskWorkUnit& workUnit = taskDesc.workUnits[rayId]; if (tWorkUnitsOut[rayId].hitFraction == 1.0) continue; ATTRIBUTE_ALIGNED16(SpuRaycastTaskWorkUnitOut workUnitOut); dmaLoadRayOutput ((ppu_address_t)workUnit.output, &workUnitOut, 1); cellDmaWaitTagStatusAll(DMA_MASK(1)); /* XXX Only support taking the closest hit for now */ if (tWorkUnitsOut[rayId].hitFraction < workUnitOut.hitFraction) { workUnitOut.hitFraction = tWorkUnitsOut[rayId].hitFraction; workUnitOut.hitNormal = tWorkUnitsOut[rayId].hitNormal; } /* write ray cast data back */ dmaStoreRayOutput ((ppu_address_t)workUnit.output, &workUnitOut, 1); cellDmaWaitTagStatusAll(DMA_MASK(1)); } } else if (btBroadphaseProxy::isConvex (gatheredObjectData.m_shapeType)) { btVector3 objectBoxMin, objectBoxMax; computeAabb (objectBoxMin, objectBoxMax, (btConvexInternalShape*)gatheredObjectData.m_spuCollisionShape, gatheredObjectData.m_collisionShape, gatheredObjectData.m_shapeType, gatheredObjectData.m_worldTransform); for (unsigned int rayId = 0; rayId < taskDesc.numWorkUnits; rayId++) { const SpuRaycastTaskWorkUnit& workUnit = taskDesc.workUnits[rayId]; btScalar ignored_param = 1.0; btVector3 ignored_normal; if (btRayAabb(workUnit.rayFrom, workUnit.rayTo, objectBoxMin, objectBoxMax, ignored_param, ignored_normal)) { ATTRIBUTE_ALIGNED16(SpuRaycastTaskWorkUnitOut workUnitOut); SpuRaycastTaskWorkUnitOut tWorkUnitOut; tWorkUnitOut.hitFraction = 1.0; performRaycastAgainstConvex (&gatheredObjectData, workUnit, &tWorkUnitOut, localMemory); if (tWorkUnitOut.hitFraction == 1.0) continue; dmaLoadRayOutput ((ppu_address_t)workUnit.output, &workUnitOut, 1); cellDmaWaitTagStatusAll(DMA_MASK(1)); /* XXX Only support taking the closest hit for now */ if (tWorkUnitOut.hitFraction < workUnitOut.hitFraction) { workUnitOut.hitFraction = tWorkUnitOut.hitFraction; workUnitOut.hitNormal = tWorkUnitOut.hitNormal; /* write ray cast data back */ dmaStoreRayOutput ((ppu_address_t)workUnit.output, &workUnitOut, 1); cellDmaWaitTagStatusAll(DMA_MASK(1)); } } } } else if (btBroadphaseProxy::isCompound (gatheredObjectData.m_shapeType)) { for (unsigned int rayId = 0; rayId < taskDesc.numWorkUnits; rayId++) { const SpuRaycastTaskWorkUnit& workUnit = taskDesc.workUnits[rayId]; ATTRIBUTE_ALIGNED16(SpuRaycastTaskWorkUnitOut workUnitOut); SpuRaycastTaskWorkUnitOut tWorkUnitOut; tWorkUnitOut.hitFraction = 1.0; performRaycastAgainstCompound (&gatheredObjectData, workUnit, &tWorkUnitOut, localMemory); if (tWorkUnitOut.hitFraction == 1.0) continue; dmaLoadRayOutput ((ppu_address_t)workUnit.output, &workUnitOut, 1); cellDmaWaitTagStatusAll(DMA_MASK(1)); /* XXX Only support taking the closest hit for now */ if (tWorkUnitOut.hitFraction < workUnitOut.hitFraction) { workUnitOut.hitFraction = tWorkUnitOut.hitFraction; workUnitOut.hitNormal = tWorkUnitOut.hitNormal; } /* write ray cast data back */ dmaStoreRayOutput ((ppu_address_t)workUnit.output, &workUnitOut, 1); cellDmaWaitTagStatusAll(DMA_MASK(1)); } } } }