Ajout de Jolt Physics + 1ere version des factory entitecomposants - camera, transform, rigidbody, collider, renderer

This commit is contained in:
Tom Ray
2026-03-22 00:28:03 +01:00
parent 6695d46bcd
commit 48348936a8
1147 changed files with 214331 additions and 353 deletions

View File

@@ -0,0 +1,117 @@
// Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
// SPDX-FileCopyrightText: 2021 Jorrit Rouwe
// SPDX-License-Identifier: MIT
#include <TestFramework.h>
#include <Tests/Tools/LoadSnapshotTest.h>
#include <Jolt/Physics/PhysicsScene.h>
#include <Jolt/Core/StreamWrapper.h>
#include <Application/DebugUI.h>
#include <Utils/Log.h>
#include <Layers.h>
JPH_SUPPRESS_WARNINGS_STD_BEGIN
#ifdef JPH_PLATFORM_WINDOWS
#include <commdlg.h>
#endif
#include <fstream>
JPH_SUPPRESS_WARNINGS_STD_END
JPH_IMPLEMENT_RTTI_VIRTUAL(LoadSnapshotTest)
{
JPH_ADD_BASE_CLASS(LoadSnapshotTest, Test)
}
void LoadSnapshotTest::Initialize()
{
#ifdef JPH_PLATFORM_WINDOWS
// Let user browse for a file
char file_name[MAX_PATH] = "";
OPENFILENAMEA ofn;
memset(&ofn, 0, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.lpstrFilter = "Snapshots\0*.bin\0";
ofn.lpstrFile = file_name;
ofn.nMaxFile = MAX_PATH;
ofn.lpstrTitle = "Select a Jolt Binary Snapshot";
ofn.Flags = OFN_DONTADDTORECENT | OFN_FILEMUSTEXIST;
if (!GetOpenFileNameA(&ofn))
return;
#else
// Can't browse for a file, use the default name
char file_name[] = "snapshot.bin";
#endif
ifstream stream(file_name, ifstream::in | ifstream::binary);
if (!stream.is_open())
FatalError("Unable to open file");
StreamInWrapper wrapper(stream);
PhysicsScene::PhysicsSceneResult result = PhysicsScene::sRestoreFromBinaryState(wrapper);
if (result.HasError())
FatalError(result.GetError().c_str());
Ref<PhysicsScene> scene = result.Get();
// Determine quaternion that rotates the world so that up is Y
Quat up_rotation;
switch (sUpAxis)
{
case 0: up_rotation = Quat::sRotation(Vec3::sAxisZ(), 0.5f * JPH_PI); break;
case 2: up_rotation = Quat::sRotation(Vec3::sAxisX(), -0.5f * JPH_PI); break;
default: up_rotation = Quat::sIdentity(); break;
}
// Determine if we are forced to override the object layers because one of the bodies has a layer number that is invalid in the context of this application
bool override_layers = sOverrideLayers;
if (!override_layers)
{
for (const BodyCreationSettings &settings : scene->GetBodies())
if (settings.mObjectLayer >= Layers::NUM_LAYERS)
{
override_layers = true;
break;
}
for (const SoftBodyCreationSettings &settings : scene->GetSoftBodies())
if (settings.mObjectLayer >= Layers::NUM_LAYERS)
{
override_layers = true;
break;
}
}
for (BodyCreationSettings &settings : scene->GetBodies())
{
if (override_layers)
{
// Override the layer so that all static objects are in the non-moving layer and everything else is in the moving layer
if (settings.mMotionType == EMotionType::Static)
settings.mObjectLayer = Layers::NON_MOVING;
else
settings.mObjectLayer = Layers::MOVING;
}
// Rotate the body so that it matches Y is up
settings.mPosition = RMat44::sRotation(up_rotation) * settings.mPosition;
settings.mRotation = up_rotation * settings.mRotation;
}
for (SoftBodyCreationSettings &settings : scene->GetSoftBodies())
{
if (override_layers)
settings.mObjectLayer = Layers::MOVING;
// Rotate the body so that it matches Y is up
settings.mPosition = RMat44::sRotation(up_rotation) * settings.mPosition;
settings.mRotation = up_rotation * settings.mRotation;
}
scene->CreateBodies(mPhysicsSystem);
}
void LoadSnapshotTest::CreateSettingsMenu(DebugUI *inUI, UIElement *inSubMenu)
{
inUI->CreateComboBox(inSubMenu, "Up Axis", { "X", "Y", "Z" }, sUpAxis, [](int inItem) { sUpAxis = inItem; });
inUI->CreateCheckBox(inSubMenu, "Override Object Layers", sOverrideLayers, [](UICheckBox::EState inState) { sOverrideLayers = inState == UICheckBox::STATE_CHECKED; });
inUI->CreateTextButton(inSubMenu, "Accept Changes", [this]() { RestartTest(); });
}

View File

@@ -0,0 +1,25 @@
// Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
// SPDX-FileCopyrightText: 2021 Jorrit Rouwe
// SPDX-License-Identifier: MIT
#pragma once
#include <Tests/Test.h>
// This test loads a physics scene from 'snapshot.bin' and runs it
class LoadSnapshotTest : public Test
{
public:
JPH_DECLARE_RTTI_VIRTUAL(JPH_NO_EXPORT, LoadSnapshotTest)
// See: Test
virtual void Initialize() override;
// Optional settings menu
virtual bool HasSettingsMenu() const override { return true; }
virtual void CreateSettingsMenu(DebugUI *inUI, UIElement *inSubMenu) override;
private:
inline static bool sOverrideLayers = false;
inline static int sUpAxis = 1; // 0 = x, 1 = y, 2 = z
};