| 2140 | #endif |
| 2141 | |
| 2142 | void TerrainPatch::CreateCollision() |
| 2143 | { |
| 2144 | PROFILE_CPU(); |
| 2145 | PROFILE_MEM(LevelTerrain); |
| 2146 | ASSERT(!HasCollision()); |
| 2147 | if (CreateHeightField()) |
| 2148 | return; |
| 2149 | ASSERT(_physicsHeightField); |
| 2150 | |
| 2151 | // Create geometry |
| 2152 | const Transform terrainTransform = _terrain->_transform; |
| 2153 | CollisionShape shape; |
| 2154 | const float rowScale = Math::Abs(terrainTransform.Scale.X) * _collisionScaleXZ; |
| 2155 | const float heightScale = Math::Abs(terrainTransform.Scale.Y) * _yHeight / TERRAIN_PATCH_COLLISION_QUANTIZATION; |
| 2156 | const float columnScale = Math::Abs(terrainTransform.Scale.Z) * _collisionScaleXZ; |
| 2157 | shape.SetHeightField(_physicsHeightField, heightScale, rowScale, columnScale); |
| 2158 | |
| 2159 | // Create shape |
| 2160 | JsonAsset* materials[8]; |
| 2161 | for (int32 i = 0; i < 8; i++) |
| 2162 | materials[i] = _terrain->GetPhysicalMaterials()[i]; |
| 2163 | _physicsShape = PhysicsBackend::CreateShape(_terrain, shape, ToSpan(materials, 8), _terrain->IsActiveInHierarchy(), false); |
| 2164 | PhysicsBackend::SetShapeLocalPose(_physicsShape, Vector3(0, _yOffset * terrainTransform.Scale.Y, 0), Quaternion::Identity); |
| 2165 | |
| 2166 | // Create static actor |
| 2167 | void* scene = _terrain->GetPhysicsScene()->GetPhysicsScene(); |
| 2168 | _physicsActor = PhysicsBackend::CreateRigidStaticActor(nullptr, terrainTransform.LocalToWorld(_offset), terrainTransform.Orientation, scene); |
| 2169 | PhysicsBackend::AttachShape(_physicsShape, _physicsActor); |
| 2170 | if (_terrain->IsDuringPlay()) |
| 2171 | PhysicsBackend::AddSceneActor(scene, _physicsActor); |
| 2172 | } |
| 2173 | |
| 2174 | bool TerrainPatch::CreateHeightField() |
| 2175 | { |
no test coverage detected