feat: add spherecollidor
This commit is contained in:
@@ -12,6 +12,7 @@ set(SRC_FILES
|
||||
|
||||
"src/Components/Physics/Rigidbody.cpp"
|
||||
"src/Components/Physics/BoxCollider.cpp"
|
||||
"src/Components/Physics/SphereCollider.cpp"
|
||||
|
||||
"src/Graphics/BindlessSetManager.cpp"
|
||||
"src/Graphics/Camera.cpp"
|
||||
|
||||
Binary file not shown.
@@ -2,7 +2,7 @@
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
#include <destrum/Components/Collider.h>
|
||||
#include <destrum/Components/Physics/Collider.h>
|
||||
|
||||
class SphereCollider final : public Collider {
|
||||
public:
|
||||
@@ -10,6 +10,8 @@ public:
|
||||
: Collider(owner)
|
||||
, m_Radius(radius) {}
|
||||
|
||||
void Update() override {}
|
||||
|
||||
[[nodiscard]] PhysicsShapeDesc BuildPhysicsShape() const override {
|
||||
return PhysicsShapeDesc::Sphere(m_Radius, m_CenterOffset, m_IsTrigger);
|
||||
}
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
#include <destrum/Components/Physics/SphereCollider.h>
|
||||
@@ -25,9 +25,8 @@ private:
|
||||
|
||||
Camera camera{glm::vec3(0.f, 0.f, -5.f), glm::vec3(0, 1, 0)};
|
||||
|
||||
CPUMesh testMesh{};
|
||||
MeshID testMeshID;
|
||||
MaterialID testMaterialID;
|
||||
MeshID sphereMesh;
|
||||
MaterialID sphereMaterial;
|
||||
|
||||
std::unique_ptr<CubeMap> skyboxCubemap;
|
||||
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
#include <string>
|
||||
|
||||
#include "imgui.h"
|
||||
#include "destrum/Components/Physics/SphereCollider.h"
|
||||
#include "destrum/Util/ModelDocUtils.h"
|
||||
|
||||
|
||||
@@ -52,10 +53,10 @@ void LightKeeper::customInit()
|
||||
ModelDocUtils::LogModelDocSummary(kittyModel, "kitty.glb");
|
||||
|
||||
const auto& kittyPrimitive = ModelDocUtils::GetFirstPrimitiveOrThrow(kittyModel, "game://kitty.glb");
|
||||
testMesh = kittyPrimitive.mesh;
|
||||
auto testMesh = kittyPrimitive.mesh;
|
||||
testMesh.name = "Test Mesh";
|
||||
|
||||
testMeshID = meshCache.addMesh(gfxDevice, testMesh);
|
||||
auto testMeshID = meshCache.addMesh(gfxDevice, testMesh);
|
||||
spdlog::info("TestMesh uploaded with id: {}", testMeshID);
|
||||
|
||||
const auto testTexturePath = ModelDocUtils::PickTexturePath(
|
||||
@@ -67,7 +68,7 @@ void LightKeeper::customInit()
|
||||
const auto testimgID = gfxDevice.loadImageFromFile(testTexturePath);
|
||||
spdlog::info("Test image loaded from '{}' with id: {}", testTexturePath.generic_string(), testimgID);
|
||||
|
||||
testMaterialID = materialCache.addMaterial(gfxDevice, {
|
||||
auto testMaterialID = materialCache.addMaterial(gfxDevice, {
|
||||
.baseColor = ModelDocUtils::GetImportedBaseColor(
|
||||
kittyModel, kittyPrimitive),
|
||||
.diffuseTexture = testimgID,
|
||||
@@ -152,7 +153,7 @@ void LightKeeper::customInit()
|
||||
);
|
||||
ModelDocUtils::LogModelDocSummary(charModel, "capybara.fbx");
|
||||
|
||||
const auto &charPrimitive = ModelDocUtils::GetFirstSkinnedPrimitiveOrFirstOrThrow(
|
||||
const auto& charPrimitive = ModelDocUtils::GetFirstSkinnedPrimitiveOrFirstOrThrow(
|
||||
charModel,
|
||||
"engine://cotw-capybara-male/source/capybara.fbx"
|
||||
);
|
||||
@@ -185,7 +186,8 @@ void LightKeeper::customInit()
|
||||
|
||||
std::string firstAnimationName;
|
||||
|
||||
for (auto &clip: charModel.animations) {
|
||||
for (auto& clip : charModel.animations)
|
||||
{
|
||||
spdlog::info("Loaded animation: '{}' ({:.2f}s)", clip.name, clip.duration);
|
||||
|
||||
if (firstAnimationName.empty())
|
||||
@@ -194,7 +196,8 @@ void LightKeeper::customInit()
|
||||
animator->addClip(std::make_shared<SkeletalAnimation>(std::move(clip)));
|
||||
}
|
||||
|
||||
if (!firstAnimationName.empty()) {
|
||||
if (!firstAnimationName.empty())
|
||||
{
|
||||
spdlog::info("Playing animation: '{}'", firstAnimationName);
|
||||
animator->play(firstAnimationName);
|
||||
}
|
||||
@@ -275,7 +278,7 @@ void LightKeeper::customInit()
|
||||
characterOptions
|
||||
);
|
||||
|
||||
const auto &charPrimitive =
|
||||
const auto& charPrimitive =
|
||||
ModelDocUtils::GetFirstSkinnedPrimitiveOrFirstOrThrow(
|
||||
charModel,
|
||||
"engine://characterMedium.fbx"
|
||||
@@ -312,12 +315,14 @@ void LightKeeper::customInit()
|
||||
charModel.skeleton
|
||||
);
|
||||
|
||||
for (auto &clip: runClips) {
|
||||
for (auto& clip : runClips)
|
||||
{
|
||||
spdlog::info("Loaded animation: '{}' ({:.2f}s)", clip.name, clip.duration);
|
||||
animator->addClip(std::make_shared<SkeletalAnimation>(std::move(clip)));
|
||||
}
|
||||
|
||||
if (!runClips.empty()) {
|
||||
if (!runClips.empty())
|
||||
{
|
||||
animator->play("Root|Run");
|
||||
}
|
||||
|
||||
@@ -379,7 +384,7 @@ void LightKeeper::customInit()
|
||||
//
|
||||
// for (int x = 0; x < cubeCount; x++)
|
||||
// {
|
||||
// for (int y = 0; y < cubeCount; y++)
|
||||
// for (int y = 0; y < 3; y++)
|
||||
// {
|
||||
// for (int z = 0; z < cubeCount; z++)
|
||||
// {
|
||||
@@ -394,7 +399,7 @@ void LightKeeper::customInit()
|
||||
//
|
||||
// cube->GetTransform().SetWorldPosition(glm::vec3(
|
||||
// (x - cubeCount / 2.0f) * spacing,
|
||||
// y * spacing + 5,
|
||||
// y * spacing + 0,
|
||||
// (z - cubeCount / 2.0f) * spacing
|
||||
// ));
|
||||
//
|
||||
@@ -405,6 +410,37 @@ void LightKeeper::customInit()
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
|
||||
{
|
||||
auto sphereModel = ModelDoc::LoadModel(
|
||||
AssetFS::GetInstance().GetFullPath("engine://sphere.fbx").generic_string(),
|
||||
staticModelOptions
|
||||
);
|
||||
ModelDocUtils::LogModelDocSummary(sphereModel, "sphere.fbx");
|
||||
|
||||
const auto& spherePrimitive = ModelDocUtils::GetFirstPrimitiveOrThrow(sphereModel, "game://sphere.fbx");
|
||||
|
||||
|
||||
const auto sphereTexturePath = ModelDocUtils::PickTexturePath(
|
||||
sphereModel,
|
||||
spherePrimitive,
|
||||
AssetFS::GetInstance().GetFullPath("game://238882.png")
|
||||
);
|
||||
|
||||
const auto sphereTextureID = gfxDevice.loadImageFromFile(sphereTexturePath);
|
||||
sphereMaterial = materialCache.addMaterial(gfxDevice, {
|
||||
.baseColor = ModelDocUtils::GetImportedBaseColor(planeModel, planePrimitive),
|
||||
.textureFilteringMode =TextureFilteringMode::Anisotropic,
|
||||
.diffuseTexture = sphereTextureID,
|
||||
.name = ModelDocUtils::GetImportedMaterialName(
|
||||
planeModel, planePrimitive,
|
||||
"GroundPlaneMaterial"),
|
||||
});
|
||||
|
||||
sphereMesh = meshCache.addMesh(gfxDevice, spherePrimitive.mesh);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void LightKeeper::customUpdate(float dt)
|
||||
@@ -416,6 +452,27 @@ void LightKeeper::customUpdate(float dt)
|
||||
{
|
||||
renderer.setRenderWireframe(!renderer.getRenderWireframe());
|
||||
}
|
||||
|
||||
ImGui::Begin("Test");
|
||||
if (ImGui::Button("SPawn ball"))
|
||||
{
|
||||
auto sphere = std::make_shared<GameObject>("Sphere");
|
||||
sphere->AddComponent<SphereCollider>(1.5f);
|
||||
auto rb = sphere->AddComponent<Rigidbody>();
|
||||
rb->SetMass(1000);
|
||||
|
||||
auto meshRenderComp = sphere->AddComponent<MeshRendererComponent>();
|
||||
meshRenderComp->SetMaterialID(sphereMaterial);
|
||||
meshRenderComp->SetMeshID(sphereMesh);
|
||||
|
||||
sphere->GetTransform().SetWorldPosition(0, 100, 0);
|
||||
sphere->GetTransform().SetWorldScale(glm::vec3{0.015f});
|
||||
|
||||
|
||||
SceneManager::GetInstance().GetCurrentScene().Add(sphere);
|
||||
SceneManager::GetInstance().GetCurrentScene().GetPhysics().RegisterGameObject(*sphere);
|
||||
}
|
||||
ImGui::End();
|
||||
}
|
||||
|
||||
void LightKeeper::customDraw()
|
||||
|
||||
Reference in New Issue
Block a user