About to implement physics

This commit is contained in:
2023-03-19 10:17:33 -07:00
parent 704b8f38ef
commit e1d991916c
9 changed files with 109 additions and 69 deletions

View File

@ -14,13 +14,18 @@ PlayerController::PlayerController(SceneItem *item) : SceneItemComponent(item) {
}
void PlayerController::onStart() {
useEvent([&](float_t delta){
auto camera = getScene()->findComponent<Camera>();
assertNotNull(camera);
std::vector<SceneItemComponent*> PlayerController::getDependencies() {
return {
(this->characterController = item->getComponent<CharacterController3D>())
};
}
// Friction
velocity -= velocity * friction * delta;
void PlayerController::onStart() {
assertNotNull(this->characterController);
useEvent([&](float_t delta){
// auto camera = getScene()->findComponent<Camera>();
// assertNotNull(camera);
// Movement
auto inputMove = getGame()->inputManager.getAxis2D(
@ -31,40 +36,7 @@ void PlayerController::onStart() {
if(inputMove.x != 0 || inputMove.y != 0) {
float_t angle = atan2(inputMove.y, inputMove.x);
glm::vec3 movement = glm::vec3(cos(angle), 0, sin(angle));
velocity += movement * delta * moveSpeed;
characterController->velocity += movement * delta * moveSpeed;
}
// Move / Update
transform->setLocalPosition(transform->getLocalPosition() + (velocity * delta));
// tEST
auto collider = item->getComponent<Collider3D>();
assertNotNull(collider);
Collider3DRayResult result;
struct Ray3D ray;
ray.origin = glm::vec3(0, 0.0f, 5);
ray.direction = glm::vec3(0, 0.0f, -4);
struct Color color = COLOR_MAGENTA;
if(collider->raycast(&result, ray)) {
// std::cout << "Collide!" << std::endl;
color = COLOR_WHITE;
getScene()->debugRay({
.start = result.point,
.direction = result.normal,
.color = COLOR_GREEN
});
}
getScene()->debugRay({
.start = ray.origin,
.direction = ray.direction,
.color = color
});
}, getScene()->eventSceneUpdate);
}

View File

@ -4,17 +4,20 @@
// https://opensource.org/licenses/MIT
#pragma once
#include "scene/SceneItemComponent.hpp"
#include "scene/components/physics/3d/CharacterController3D.hpp"
namespace Dawn {
class PlayerController : public SceneItemComponent {
protected:
CharacterController3D *characterController;
public:
glm::vec3 velocity;
float_t moveSpeed = 40.0f;
float_t friction = 12.0f;
PlayerController(SceneItem *item);
std::vector<SceneItemComponent*> getDependencies() override;
void onStart() override;
};
}

View File

@ -14,7 +14,9 @@
#include "scene/components/example/ExampleSpin.hpp"
#include "scene/components/physics/3d/SphereCollider.hpp"
#include "scene/components/physics/3d/CubeCollider.hpp"
#include "scene/components/physics/3d/CapsuleCollider.hpp"
#include "display/mesh/SphereMesh.hpp"
#include "display/mesh/CapsuleMesh.hpp"
namespace Dawn {
class HelloWorldScene : public Scene {
@ -28,16 +30,19 @@ namespace Dawn {
playerItem->addComponent<MeshRenderer>();
auto meshHost = playerItem->addComponent<MeshHost>();
playerItem->addComponent<SimpleTexturedMaterial>();
auto hitbox = playerItem->addComponent<SphereCollider>();
SphereMesh::createSphere(&meshHost->mesh, hitbox->radius, 32, 32);
auto hitbox = playerItem->addComponent<CapsuleCollider>();
playerItem->addComponent<CharacterController3D>();
CapsuleMesh::create(&meshHost->mesh, hitbox->radius, hitbox->height);
playerItem->transform.setLocalPosition(glm::vec3(0, 4, 0));
auto wall = this->createSceneItem();
auto wallHitbox = wall->addComponent<CubeCollider>();
wall->transform.setLocalPosition(glm::vec3(-10, 0, 0));
wallHitbox->min = -(wallHitbox->max = glm::vec3(1, 1, 5));
// wall->transform.setLocalPosition(glm::vec3(-5, -1, -5));
wallHitbox->min = -(wallHitbox->max = glm::vec3(5, 0.25f, 5));
camera = Camera::create(this);
camera->transform->lookAt(glm::vec3(4, 4, 4), glm::vec3(0, 0, 0));
camera->transform->lookAt(glm::vec3(10, 10, 10), glm::vec3(0, 0, 0));
// auto gameCamera = camera->item->addComponent<GameCamera>();
// gameCamera->player = player;
}