| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- // Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
- // SPDX-FileCopyrightText: 2025 Jorrit Rouwe
- // SPDX-License-Identifier: MIT
- #pragma once
- // Jolt includes
- #include <Jolt/Physics/Collision/Shape/BoxShape.h>
- #include <Jolt/Physics/Body/BodyCreationSettings.h>
- // Local includes
- #include "PerformanceTestScene.h"
- #include "Layers.h"
- // A scene that creates the max number of bodies that Jolt supports and simulates them
- class MaxBodiesScene : public PerformanceTestScene
- {
- public:
- virtual const char * GetName() const override
- {
- return "MaxBodies";
- }
- virtual uint GetTempAllocatorSizeMB() const override
- {
- return 256;
- }
- virtual uint GetMaxBodies() const override
- {
- return BodyID::cMaxBodyIndex + 1;
- }
- virtual void StartTest(PhysicsSystem &inPhysicsSystem, EMotionQuality inMotionQuality) override
- {
- BodyInterface &bi = inPhysicsSystem.GetBodyInterface();
- // Reduce the solver iteration count in the interest of performance
- PhysicsSettings settings = inPhysicsSystem.GetPhysicsSettings();
- settings.mNumVelocitySteps = 4;
- settings.mNumPositionSteps = 1;
- inPhysicsSystem.SetPhysicsSettings(settings);
- // Create the bodies
- uint num_bodies = GetMaxBodies();
- BodyIDVector body_ids;
- body_ids.reserve(num_bodies);
- uint num_per_axis = uint(pow(float(num_bodies), 1.0f / 3.0f)) + 1;
- BodyCreationSettings bcs(new BoxShape(Vec3::sReplicate(0.5f)), RVec3::sZero(), Quat::sIdentity(), EMotionType::Dynamic, Layers::MOVING);
- for (uint x = 0; x < num_per_axis && body_ids.size() < num_bodies; ++x)
- for (uint y = 0; y < num_per_axis && body_ids.size() < num_bodies; ++y)
- for (uint z = 0; z < num_per_axis && body_ids.size() < num_bodies; ++z)
- {
- bcs.mPosition = RVec3(Real(x), Real(y), Real(z));
- body_ids.push_back(bi.CreateBody(bcs)->GetID());
- }
- // Add the bodies to the simulation
- BodyInterface::AddState state = bi.AddBodiesPrepare(body_ids.data(), num_bodies);
- bi.AddBodiesFinalize(body_ids.data(), num_bodies, state, EActivation::Activate);
- }
- };
|