/** * Method is used to add heightfield actor to physics scene. * @param entity is actor logic object. * @param heightData is terrain height map data. * @param params is terrain parameters: heightmap size, row/column scale, max. height. * @param filterGroup is actor own id. * @param filterMask is mask to filter pairs that trigger a contact callback. */ void PhysicsManager::addHeightFieldActor(SceneEntity* entity, unsigned char* heightData, const Vector4D& params, PxU32 filterGroup, PxU32 filterMask) { int terrainSize = static_cast<int>(params.x()); PxHeightFieldSample* samples = new PxHeightFieldSample[terrainSize*terrainSize]; PxHeightFieldDesc descriptor; descriptor.nbColumns = static_cast<int>(terrainSize); descriptor.nbRows = static_cast<int>(terrainSize); for(int i = 0; i < terrainSize*terrainSize; ++i) samples[i].height = static_cast<PxI16>(heightData[i]); descriptor.samples.data = samples; descriptor.samples.stride = sizeof(PxHeightFieldSample); PxHeightField* heightField = physicsSDK->createHeightField(descriptor); PxHeightFieldGeometry geometry(heightField, PxMeshGeometryFlags(),params.w()*0.00390625f,params.y(),params.z()); PxTransform transformation = PxTransform(PxVec3(-terrainSize*0.5f*params.y(),0.0f,-terrainSize*0.5f*params.z()),PxQuat::createIdentity()); PxRigidStatic* heightFieldActor = physicsSDK->createRigidStatic(transformation); PxShape* aHeightFieldShape = heightFieldActor->createShape(geometry,*materials[0].second); heightFieldActor->setName(entity->entityName.c_str()); setupFiltering(heightFieldActor,filterGroup,filterMask); scene->addActor(*heightFieldActor); StaticActor* s = new StaticActor(); s->entityLogic = entity; s->entityPhysics = heightFieldActor; staticActors.push_back(s); }
void PhysXHeightfield::InitHeightfield(PxPhysics* physics, PxScene* scene, const char* filename) { float xScale = 0.0025f; float yScale = 0.0025f; float zScale = 10.00f; // NOTE: Assuming that heightfield texture has B8G8R8A8 format. if(LoadHeightfield(filename)) { PxU16 nbColumns = PxU16(mHeightfield.width); PxU16 nbRows = PxU16(mHeightfield.height); PxHeightFieldDesc heightFieldDesc; heightFieldDesc.format = PxHeightFieldFormat::eS16_TM; heightFieldDesc.nbColumns = nbColumns; heightFieldDesc.nbRows = nbRows; heightFieldDesc.samples.data = mHeightfield.data; heightFieldDesc.samples.stride = sizeof(PxHeightFieldSample); //heightFieldDesc.convexEdgeThreshold = 0; PxHeightField* heightField = physics->createHeightField(heightFieldDesc); // create shape for heightfield PxTransform pose(PxVec3(-((PxReal)nbRows*yScale) / 2.0f, 0.0f, -((PxReal)nbColumns*xScale) / 2.0f), PxQuat::createIdentity()); // PxTransform pose = PxTransform::createIdentity(); pose.p = PxVec3(-((nbColumns/2)*xScale),0.0,-((nbColumns/2)*xScale)); PxRigidActor* hf = physics->createRigidStatic(pose); if(!hf) return; const PxMaterial* mMat = physics->createMaterial(0.9f, 0.9f, 0.001f); //PxShape* shape = hf->createShape((PxHeightFieldGeometry(heightField, PxMeshGeometryFlags(), yScale, xScale, xScale)), *mMat); //PxHeightFieldGeometry hfGeom(heightField, PxMeshGeometryFlags(), heightScale, rowScale, colScale); //PxShape* aHeightFieldShape = aHeightFieldActor->createShape(hfGeom, aMaterialArray, nbMaterials); PxHeightFieldGeometry hfGeom(heightField, PxMeshGeometryFlags(), yScale, xScale, xScale); PxShape* hfShape = hf->createShape(hfGeom, *mMat); if(!hfShape) return; //shape->setFlag(PxShapeFlag::ePARTICLE_DRAIN, false); //shape->setFlag(PxShapeFlag::eSIMULATION_SHAPE, true); //shape->setFlag(PxShapeFlag::eUSE_SWEPT_BOUNDS, true); // add actor to the scene scene->addActor(*hf); } }