various bug fix, serialization, adding shapes
This commit is contained in:
@@ -17,6 +17,7 @@
|
||||
#include <Jolt/Physics/Body/BodyActivationListener.h>
|
||||
|
||||
#include <cstdarg>
|
||||
#include <glm/glm.hpp>
|
||||
|
||||
using namespace JPH;
|
||||
using namespace JPH::literals;
|
||||
@@ -73,6 +74,8 @@ namespace BroadPhaseLayers
|
||||
static constexpr uint NUM_LAYERS(2);
|
||||
};
|
||||
|
||||
inline JPH::Vec3 ToJolt(const glm::vec3& v) { return JPH::Vec3(v.x, v.y, v.z); };
|
||||
|
||||
class BPLayerInterfaceImpl final : public BroadPhaseLayerInterface
|
||||
{
|
||||
public:
|
||||
|
||||
@@ -124,23 +124,27 @@ namespace OpenEngine {
|
||||
float linear_damping = 0.05f;
|
||||
float angular_damping = 0.05f;
|
||||
float gravity_factor = 1.0f;
|
||||
float restitution = 0.8f;
|
||||
float friction = 0.5f;
|
||||
|
||||
EMotionType type = EMotionType::Dynamic;
|
||||
EActivation initial_activation_state = EActivation::Activate;
|
||||
ObjectLayer layer = Layers::MOVING;
|
||||
int type = (int)EMotionType::Static;
|
||||
int initial_activation_state = (int)EActivation::Activate;
|
||||
int layer = (int)Layers::MOVING;
|
||||
|
||||
PhysicsBodyComponent() = default;
|
||||
PhysicsBodyComponent(const PhysicsBodyComponent&) = default;
|
||||
};
|
||||
|
||||
struct PhysicsShapeComponent
|
||||
// TODO: Let's add more shapes
|
||||
struct BoxShapeComponent
|
||||
{
|
||||
ShapeRefC shape;
|
||||
|
||||
float restitution = 0.8f;
|
||||
float friction = 0.5f;
|
||||
glm::vec3 size = { 1.0f, 1.0f, 1.0f };
|
||||
};
|
||||
|
||||
struct SphereShapeComponent
|
||||
{
|
||||
float radius = 1.0f;
|
||||
};
|
||||
}
|
||||
|
||||
#endif // COMPONENTS_HPP
|
||||
|
||||
@@ -18,6 +18,7 @@ namespace OpenEngine {
|
||||
public:
|
||||
Scene() = default;
|
||||
~Scene() = default;
|
||||
Scene(Scene& other) {};
|
||||
|
||||
void OnRuntimeStart();
|
||||
void OnRuntimeStop();
|
||||
@@ -52,8 +53,6 @@ namespace OpenEngine {
|
||||
|
||||
std::vector<entt::entity> pending_deletion;
|
||||
|
||||
//BodyID sphere_id;
|
||||
|
||||
friend class SceneSerializer;
|
||||
friend class Entity;
|
||||
};
|
||||
|
||||
@@ -1,4 +1,9 @@
|
||||
#include "logging.hpp"
|
||||
#include "physics.hpp"
|
||||
#include "ref_scope.hpp"
|
||||
#include <Jolt/Physics/Body/MotionType.h>
|
||||
#include <Jolt/Physics/Collision/ObjectLayer.h>
|
||||
#include <Jolt/Physics/Collision/Shape/ConvexShape.h>
|
||||
#include <pch.hpp>
|
||||
|
||||
#include <renderer/renderer3d.hpp>
|
||||
@@ -8,6 +13,7 @@
|
||||
#include <core/time.hpp>
|
||||
|
||||
#include <Jolt/Physics/Collision/Shape/Shape.h>
|
||||
#include <Jolt/Physics/Collision/Shape/BoxShape.h>
|
||||
#include <Jolt/Physics/Collision/Shape/SphereShape.h>
|
||||
#include <Jolt/Physics/EActivation.h>
|
||||
#include <Jolt/Math/Real.h>
|
||||
@@ -17,37 +23,42 @@
|
||||
|
||||
namespace OpenEngine {
|
||||
|
||||
static Ref<ShapeSettings> CreateShape(entt::registry& reg, entt::entity e)
|
||||
{
|
||||
if (reg.any_of<BoxShapeComponent>(e)) {
|
||||
auto& c = reg.get<BoxShapeComponent>(e);
|
||||
return CreateRef<BoxShapeSettings>(ToJolt(c.size * 0.5f));
|
||||
}
|
||||
if (reg.any_of<SphereShapeComponent>(e)) {
|
||||
auto& c = reg.get<SphereShapeComponent>(e);
|
||||
return CreateRef<SphereShapeSettings>(c.radius);
|
||||
}
|
||||
|
||||
OE_CORE_ERROR("Entity has no shape component!");
|
||||
return nullptr;
|
||||
};
|
||||
|
||||
void Scene::OnRuntimeStart()
|
||||
{
|
||||
body_interface = &physics_engine.GetBodyInterface();
|
||||
|
||||
BoxShapeSettings floor_shape_settings(Vec3(100.0f, 1.0f, 100.0f));
|
||||
floor_shape_settings.SetEmbedded(); // A ref counted object on the stack (base class RefTarget) should be marked as such to prevent it from being freed when its reference count goes to 0.
|
||||
|
||||
// Create the shape
|
||||
ShapeSettings::ShapeResult floor_shape_result = floor_shape_settings.Create();
|
||||
ShapeRefC floor_shape = floor_shape_result.Get(); // We don't expect an error here, but you can check floor_shape_result for HasError() / GetError()
|
||||
|
||||
// Create the settings for the body itself. Note that here you can also set other properties like the restitution / friction.
|
||||
BodyCreationSettings floor_settings(floor_shape, RVec3(0.0_r, -1.0_r, 0.0_r), Quat::sIdentity(), EMotionType::Static, Layers::NON_MOVING);
|
||||
|
||||
// Create the actual rigid body
|
||||
Body *floor = body_interface->CreateBody(floor_settings); // Note that if we run out of bodies this can return nullptr
|
||||
|
||||
// Add it to the world
|
||||
body_interface->AddBody(floor->GetID(), EActivation::DontActivate);
|
||||
|
||||
// TODO: Cleanup components aquisition
|
||||
auto view = registry.view<TransformComponent, PhysicsBodyComponent>();
|
||||
for (auto e : view) {
|
||||
Entity entity = { e, this };
|
||||
|
||||
auto shape_settings = CreateShape(registry, e);
|
||||
if (!shape_settings)
|
||||
shape_settings = CreateRef<BoxShapeSettings>(Vec3(0.5f, 0.5f, 0.5f));
|
||||
|
||||
auto shape_result = shape_settings->Create();
|
||||
if (shape_result.HasError()) {
|
||||
OE_CORE_ERROR("Shape creation failed: {}", shape_result.GetError().c_str());
|
||||
continue;
|
||||
}
|
||||
ShapeRefC shape = shape_result.Get();
|
||||
|
||||
auto& pbc = entity.GetComponents<PhysicsBodyComponent>();
|
||||
auto& tc = entity.GetComponents<TransformComponent>();
|
||||
|
||||
PhysicsShapeComponent* psc = nullptr;
|
||||
if (entity.HasComponent<PhysicsShapeComponent>())
|
||||
psc = &entity.GetComponents<PhysicsShapeComponent>();
|
||||
|
||||
glm::vec3& pos = tc.translation;
|
||||
glm::vec3& scale = tc.scale;
|
||||
@@ -55,22 +66,21 @@ namespace OpenEngine {
|
||||
|
||||
Quat quat = Quat::sEulerAngles(Vec3(rot.x, rot.y, rot.z));
|
||||
BodyCreationSettings settings(
|
||||
new BoxShape(Vec3(scale.x * 0.5, scale.y * 0.5f, scale.z * 0.5f)),
|
||||
shape,
|
||||
//new BoxShape(Vec3(scale.x * 0.5, scale.y * 0.5f, scale.z * 0.5f)),
|
||||
Vec3(pos.x, pos.y, pos.z),
|
||||
quat,
|
||||
pbc.type,
|
||||
(EMotionType)pbc.type,
|
||||
pbc.layer);
|
||||
|
||||
settings.mLinearDamping = pbc.linear_damping;
|
||||
settings.mAngularDamping = pbc.angular_damping;
|
||||
settings.mGravityFactor = pbc.gravity_factor;
|
||||
settings.mRestitution = pbc.restitution;
|
||||
settings.mFriction = pbc.friction;
|
||||
settings.mObjectLayer = (ObjectLayer)pbc.layer;
|
||||
|
||||
if (psc != nullptr) {
|
||||
settings.mRestitution = psc->restitution;
|
||||
settings.mFriction = psc->friction;
|
||||
}
|
||||
|
||||
pbc.body = body_interface->CreateAndAddBody(settings, pbc.initial_activation_state);
|
||||
pbc.body = body_interface->CreateAndAddBody(settings, (EActivation)pbc.initial_activation_state);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -157,14 +167,8 @@ namespace OpenEngine {
|
||||
|
||||
body_interface->SetPosition(body.body, { pos.x, pos.y, pos.z }, EActivation::Activate);
|
||||
|
||||
PhysicsShapeComponent* shape;
|
||||
if (entity.HasComponent<PhysicsShapeComponent>()) {
|
||||
shape = &entity.GetComponents<PhysicsShapeComponent>();
|
||||
|
||||
body_interface->SetRestitution(body.body, shape->restitution);
|
||||
body_interface->SetFriction(body.body, shape->friction);
|
||||
}
|
||||
|
||||
body_interface->SetRestitution(body.body, body.restitution);
|
||||
body_interface->SetFriction(body.body, body.friction);
|
||||
}
|
||||
|
||||
OnUpdatePhysics();
|
||||
@@ -209,14 +213,13 @@ namespace OpenEngine {
|
||||
|
||||
for (const auto& e : view) {
|
||||
auto [transform, mesh] = view.get<TransformComponent, MeshComponent>(e);
|
||||
|
||||
Material* material;
|
||||
|
||||
Entity entity(e, this);
|
||||
if (entity.HasComponent<MaterialComponent>())
|
||||
material = &entity.GetComponents<MaterialComponent>().material;
|
||||
|
||||
Renderer3D::DrawMesh(mesh.mesh, *material, GetTransformFromComp(transform));
|
||||
Material material;
|
||||
if (entity.HasComponent<MaterialComponent>())
|
||||
material = entity.GetComponents<MaterialComponent>().material;
|
||||
|
||||
Renderer3D::DrawMesh(mesh.mesh, material, GetTransformFromComp(transform));
|
||||
/*
|
||||
if (sprite.texture)
|
||||
Renderer2D::DrawQuad(GetTransformFromComp(transform),
|
||||
@@ -247,7 +250,8 @@ namespace OpenEngine {
|
||||
if (_entity.HasComponent<MaterialComponent>())
|
||||
material = _entity.GetComponents<MaterialComponent>().material;
|
||||
|
||||
Renderer3D::DrawMesh(mesh.mesh, material, GetTransformFromComp(transform));
|
||||
if (mesh.mesh)
|
||||
Renderer3D::DrawMesh(mesh.mesh, material, GetTransformFromComp(transform));
|
||||
}
|
||||
|
||||
Renderer3D::EndScene();
|
||||
@@ -328,7 +332,12 @@ namespace OpenEngine {
|
||||
}
|
||||
|
||||
template<>
|
||||
void Scene::OnComponentAdded<PhysicsShapeComponent>(Entity entity, PhysicsShapeComponent& component)
|
||||
void Scene::OnComponentAdded<SphereShapeComponent>(Entity entity, SphereShapeComponent& component)
|
||||
{
|
||||
}
|
||||
|
||||
template<>
|
||||
void Scene::OnComponentAdded<BoxShapeComponent>(Entity entity, BoxShapeComponent& component)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
@@ -115,8 +115,7 @@ namespace OpenEngine {
|
||||
out << YAML::EndMap; // TransformComponent
|
||||
}
|
||||
|
||||
if (entity.HasComponent<CameraComponent>())
|
||||
{
|
||||
if (entity.HasComponent<CameraComponent>()) {
|
||||
out << YAML::Key << "CameraComponent";
|
||||
out << YAML::BeginMap; // CameraComponent
|
||||
|
||||
@@ -151,8 +150,7 @@ namespace OpenEngine {
|
||||
out << YAML::EndMap; // SpriteRendererComponent
|
||||
}
|
||||
|
||||
if (entity.HasComponent<MeshComponent>())
|
||||
{
|
||||
if (entity.HasComponent<MeshComponent>()) {
|
||||
out << YAML::Key << "MeshComponent";
|
||||
out << YAML::BeginMap; // MeshComponent
|
||||
|
||||
@@ -162,8 +160,7 @@ namespace OpenEngine {
|
||||
out << YAML::EndMap; // MeshComponent
|
||||
}
|
||||
|
||||
if (entity.HasComponent<MaterialComponent>())
|
||||
{
|
||||
if (entity.HasComponent<MaterialComponent>()) {
|
||||
out << YAML::Key << "MaterialComponent";
|
||||
out << YAML::BeginMap; // MaterialComponent
|
||||
|
||||
@@ -177,6 +174,44 @@ namespace OpenEngine {
|
||||
out << YAML::EndMap; // MaterialComponent
|
||||
}
|
||||
|
||||
if (entity.HasComponent<PhysicsBodyComponent>()) {
|
||||
out << YAML::Key << "PhysicsBodyComponent";
|
||||
out << YAML::BeginMap; // PhysicsBodyComponent
|
||||
|
||||
auto& pbc = entity.GetComponents<PhysicsBodyComponent>();
|
||||
out << YAML::Key << "LinearDamping" << YAML::Value << pbc.linear_damping;
|
||||
out << YAML::Key << "AngularDamping" << YAML::Value << pbc.angular_damping;
|
||||
out << YAML::Key << "GravityFactor" << YAML::Value << pbc.gravity_factor;
|
||||
out << YAML::Key << "Restitution" << YAML::Value << pbc.restitution;
|
||||
out << YAML::Key << "Friction" << YAML::Value << pbc.friction;
|
||||
|
||||
out << YAML::Key << "Type" << YAML::Value << pbc.type;
|
||||
out << YAML::Key << "ActivationState" << YAML::Value << pbc.initial_activation_state;
|
||||
out << YAML::Key << "Layer" << YAML::Value << pbc.layer;
|
||||
|
||||
out << YAML::EndMap; // PhysicsBodyComponent
|
||||
}
|
||||
|
||||
if (entity.HasComponent<BoxShapeComponent>()) {
|
||||
out << YAML::Key << "BoxShapeComponent";
|
||||
out << YAML::BeginMap; //BoxShapeComponent
|
||||
|
||||
auto& bsc = entity.GetComponents<BoxShapeComponent>();
|
||||
out << YAML::Key << "Size" << YAML::Value << bsc.size;
|
||||
|
||||
out << YAML::EndMap; //BoxShapeComponent
|
||||
}
|
||||
|
||||
if (entity.HasComponent<SphereShapeComponent>()) {
|
||||
out << YAML::Key << "SphereShapeComponent";
|
||||
out << YAML::BeginMap; //SphereShapeComponent
|
||||
|
||||
auto& ssc = entity.GetComponents<SphereShapeComponent>();
|
||||
out << YAML::Key << "Radius" << YAML::Value << ssc.radius;
|
||||
|
||||
out << YAML::EndMap; //SphereShapeComponent
|
||||
}
|
||||
|
||||
out << YAML::EndMap;
|
||||
}
|
||||
|
||||
@@ -292,8 +327,7 @@ namespace OpenEngine {
|
||||
}
|
||||
|
||||
auto material_component = entity["MaterialComponent"];
|
||||
if (material_component)
|
||||
{
|
||||
if (material_component) {
|
||||
auto& material = deserializedEntity.AddComponent<MaterialComponent>();
|
||||
material.material.albedo = material_component["Albedo"].as<glm::vec4>();
|
||||
material.material.roughness = material_component["Roughness"].as<float>();
|
||||
@@ -301,6 +335,35 @@ namespace OpenEngine {
|
||||
material.material.ambient_strength = material_component["AmbiantStrength"].as<float>();
|
||||
material.material.specular_strength = material_component["SpecularStrength"].as<float>();
|
||||
}
|
||||
|
||||
auto physics_body_component = entity["PhysicsBodyComponent"];
|
||||
if (physics_body_component) {
|
||||
auto& pbc = deserializedEntity.AddComponent<PhysicsBodyComponent>();
|
||||
|
||||
pbc.linear_damping = physics_body_component["LinearDamping"].as<float>();
|
||||
pbc.angular_damping = physics_body_component["AngularDamping"].as<float>();
|
||||
pbc.gravity_factor = physics_body_component["GravityFactor"].as<float>();
|
||||
pbc.restitution = physics_body_component["Restitution"].as<float>();
|
||||
pbc.friction = physics_body_component["Friction"].as<float>();
|
||||
|
||||
pbc.type = physics_body_component["Type"].as<int>();
|
||||
pbc.initial_activation_state = physics_body_component["ActivationState"].as<int>();
|
||||
pbc.layer = physics_body_component["Layer"].as<int>();
|
||||
}
|
||||
|
||||
auto box_shape_component = entity["BoxShapeComponent"];
|
||||
if (box_shape_component) {
|
||||
auto& bsc = deserializedEntity.AddComponent<BoxShapeComponent>();
|
||||
|
||||
bsc.size = box_shape_component["Size"].as<glm::vec3>();
|
||||
}
|
||||
|
||||
auto sphere_shape_component = entity["SphereShapeComponent"];
|
||||
if (sphere_shape_component) {
|
||||
auto& ssc = deserializedEntity.AddComponent<SphereShapeComponent>();
|
||||
|
||||
ssc.radius = sphere_shape_component["Radius"].as<float>();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user