Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/fase4/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ Esta fase implementa o **ECS completo** — a arquitetura de dados central que c
| **Event Bus** | [`events.md`](events.md) | `Caffeine::Events` | 4 | ✅ |
| **Audio System** | [`audio.md`](audio.md) | `Caffeine::Audio` | 4 | 📅 |
| **Animation System** | [`animation.md`](animation.md) | `Caffeine::Animation` | 4 | 📅 |
| **Physics 2D** | [`physics.md`](physics.md) | `Caffeine::Physics2D` | 4 | 📅 |
| **Physics 2D** | [`physics.md`](physics.md) | `Caffeine::Physics2D` | 4 | |
| **UI System** | [`ui.md`](ui.md) | `Caffeine::UI` | 4 | 📅 |

---
Expand Down
73 changes: 69 additions & 4 deletions docs/fase4/physics.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
> **Fase:** 4 — O Cérebro
> **Namespace:** `Caffeine::Physics2D`
> **Arquivo:** `src/physics/PhysicsSystem2D.hpp`
> **Status:** 📅 Planejado
> **Status:** ✅ Implementado
> **RF:** RF4.10

---
Expand All @@ -16,7 +16,72 @@ Sistema de física 2D simples com suporte a rigid body dynamics, AABB e circle c

---

## API Planejada
## API

```cpp
namespace Caffeine::Physics2D {

struct PhysicsMaterial {
f32 friction = 0.5f;
f32 restitution = 0.3f;
static PhysicsMaterial ice();
static PhysicsMaterial rubber();
static PhysicsMaterial metal();
static PhysicsMaterial wood();
static PhysicsMaterial stone();
};

struct RigidBody2D {
f32 mass = 1.0f;
f32 restitution = 0.3f;
f32 friction = 0.5f;
f32 linearDamping = 0.0f;
bool isKinematic = false;
bool lockRotation = true;
};

struct Collider2D {
Vec2 size = { 32.0f, 32.0f };
Vec2 offset = { 0.0f, 0.0f };
f32 radius = 16.0f;
u32 layer = 0;
u32 layerMask = 0xFFFFFFFF;
ColliderShape shape = ColliderShape::AABB;
bool isStatic = false;
bool isTrigger = false;
bool isOneWay = false;
};

struct Rect2D { Vec2 position; Vec2 size; };
struct RaycastHit { ECS::Entity entity; Vec2 point; Vec2 normal; f32 distance; bool hit; };
struct CollisionManifold { Vec2 contactPoint; Vec2 normal; f32 penetration; };

class PhysicsSystem2D : public ECS::ISystem {
public:
explicit PhysicsSystem2D(Events::EventBus* eventBus = nullptr);
void onUpdate(ECS::World& world, f32 dt) override;

void setGravity(Vec2 gravity);
Vec2 gravity() const;

RaycastHit raycast(ECS::World& world, Vec2 origin, Vec2 dir, f32 maxDist, u32 layerMask = 0xFFFFFFFF);
std::vector<ECS::Entity> overlapCircle(ECS::World& world, Vec2 center, f32 radius, u32 layerMask = 0xFFFFFFFF);
std::vector<ECS::Entity> overlapAABB(ECS::World& world, Rect2D rect, u32 layerMask = 0xFFFFFFFF);

void applyForce(ECS::Entity e, Vec2 force);
void applyImpulse(ECS::Entity e, Vec2 impulse);
void setKinematic(ECS::Entity e, bool kinematic);
void teleport(ECS::Entity e, Vec2 position);

const std::vector<CollisionManifold>& lastManifolds() const;
};

}
```

---

## API Planejada (original de referência)

```cpp
namespace Caffeine::Physics2D {
Expand Down Expand Up @@ -216,8 +281,8 @@ Se o jogo precisar de:
- [ ] 1K rigid bodies a 60fps
- [ ] Physics step < 3ms para 1K bodies
- [ ] `tsan` clean — `applyForce` thread-safe
- [ ] Raycast retorna hit correto para todos ângulos
- [ ] Colisões publicam `OnCollision2D` corretamente
- [x] Raycast retorna hit correto para todos ângulos
- [x] Colisões publicam `OnCollision2D` corretamente

---

Expand Down
6 changes: 5 additions & 1 deletion src/Caffeine.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -57,4 +57,8 @@
// Scene
#include "scene/SceneComponents.hpp"
#include "scene/SceneSerializer.hpp"
#include "scene/SceneManager.hpp"
#include "scene/SceneManager.hpp"

// Physics
#include "physics/PhysicsComponents2D.hpp"
#include "physics/PhysicsSystem2D.hpp"
46 changes: 46 additions & 0 deletions src/physics/PhysicsComponents2D.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
#pragma once

#include "core/Types.hpp"
#include "math/Vec2.hpp"

namespace Caffeine::Physics2D {

using namespace Caffeine;

enum class ColliderShape : u8 { AABB, Circle };

struct PhysicsMaterial {
f32 friction = 0.5f;
f32 restitution = 0.3f;

static PhysicsMaterial ice() { return { 0.05f, 0.1f }; }
static PhysicsMaterial rubber() { return { 0.8f, 0.9f }; }
static PhysicsMaterial metal() { return { 0.6f, 0.3f }; }
static PhysicsMaterial wood() { return { 0.5f, 0.2f }; }
static PhysicsMaterial stone() { return { 0.7f, 0.1f }; }
};

struct RigidBody2D {
f32 mass = 1.0f;
f32 restitution = 0.3f;
f32 friction = 0.5f;
f32 linearDamping = 0.0f;
bool isKinematic = false;
bool lockRotation = true;
bool isSleeping = false;
f32 sleepTimer = 0.0f;
};

struct Collider2D {
Vec2 size = { 32.0f, 32.0f };
Vec2 offset = { 0.0f, 0.0f };
f32 radius = 16.0f;
u32 layer = 0;
u32 layerMask = 0xFFFFFFFF;
ColliderShape shape = ColliderShape::AABB;
bool isStatic = false;
bool isTrigger = false;
bool isOneWay = false;
};

}
Loading
Loading