PhysicsScene.cpp 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  2. // SPDX-License-Identifier: MIT
  3. #include <Jolt.h>
  4. #include <Physics/PhysicsScene.h>
  5. #include <Physics/PhysicsSystem.h>
  6. #include <ObjectStream/TypeDeclarations.h>
  7. namespace JPH {
  8. JPH_IMPLEMENT_SERIALIZABLE_NON_VIRTUAL(PhysicsScene)
  9. {
  10. JPH_ADD_ATTRIBUTE(PhysicsScene, mBodies)
  11. }
  12. void PhysicsScene::AddBody(const BodyCreationSettings &inBody)
  13. {
  14. mBodies.push_back(inBody);
  15. }
  16. bool PhysicsScene::FixInvalidScales()
  17. {
  18. const Vec3 unit_scale = Vec3::sReplicate(1.0f);
  19. bool success = true;
  20. for (BodyCreationSettings &b : mBodies)
  21. {
  22. // Test if there is an invalid scale in the shape hierarchy
  23. const Shape *shape = b.GetShape();
  24. if (!shape->IsValidScale(unit_scale))
  25. {
  26. // Fix it up
  27. Shape::ShapeResult result = shape->ScaleShape(unit_scale);
  28. if (result.IsValid())
  29. b.SetShape(result.Get());
  30. else
  31. success = false;
  32. }
  33. }
  34. return success;
  35. }
  36. void PhysicsScene::CreateBodies(PhysicsSystem *inSystem)
  37. {
  38. BodyInterface &bi = inSystem->GetBodyInterface();
  39. for (const BodyCreationSettings &b : mBodies)
  40. bi.CreateAndAddBody(b, EActivation::Activate);
  41. }
  42. void PhysicsScene::SaveBinaryState(StreamOut &inStream, bool inSaveShapes, bool inSaveGroupFilter) const
  43. {
  44. BodyCreationSettings::ShapeToIDMap shape_to_id;
  45. BodyCreationSettings::MaterialToIDMap material_to_id;
  46. BodyCreationSettings::GroupFilterToIDMap group_filter_to_id;
  47. // Save bodies
  48. inStream.Write((uint32)mBodies.size());
  49. for (const BodyCreationSettings &b : mBodies)
  50. b.SaveWithChildren(inStream, inSaveShapes? &shape_to_id : nullptr, inSaveShapes? &material_to_id : nullptr, inSaveGroupFilter? &group_filter_to_id : nullptr);
  51. }
  52. PhysicsScene::PhysicsSceneResult PhysicsScene::sRestoreFromBinaryState(StreamIn &inStream)
  53. {
  54. PhysicsSceneResult result;
  55. // Create scene
  56. Ref<PhysicsScene> scene = new PhysicsScene();
  57. BodyCreationSettings::IDToShapeMap id_to_shape;
  58. BodyCreationSettings::IDToMaterialMap id_to_material;
  59. BodyCreationSettings::IDToGroupFilterMap id_to_group_filter;
  60. // Read bodies
  61. uint32 len = 0;
  62. inStream.Read(len);
  63. scene->mBodies.resize(len);
  64. for (BodyCreationSettings &b : scene->mBodies)
  65. {
  66. // Read creation settings
  67. BodyCreationSettings::BCSResult bcs_result = BodyCreationSettings::sRestoreWithChildren(inStream, id_to_shape, id_to_material, id_to_group_filter);
  68. if (bcs_result.HasError())
  69. {
  70. result.SetError(bcs_result.GetError());
  71. return result;
  72. }
  73. b = bcs_result.Get();
  74. }
  75. result.Set(scene);
  76. return result;
  77. }
  78. } // JPH