TazGraph Project v0.1.0
Loading...
Searching...
No Matches
ColliderComponent.h
1#pragma once
2#include <string>
3#include <unordered_set>
4#include <SDL2/SDL.h>
5#include <glm/glm.hpp>
6#include "../../../Components.h"
7#include "../../../UtilComponents.h"
8#include "../../../../TextureManager/TextureManager.h"
9
10
11class ColliderComponent : public NodeComponent //collider -> transform
12{
13private:
14 Manager* _manager = nullptr;
15 float _collisionPadding = 100.0f;
16 std::unordered_set<Group> _groupChecks;
17 float repulsion_strength = 100.0f;
18public:
19 glm::vec3 box_collider = glm::vec3(0.0f);
20
21 TransformComponent* transform = nullptr;
22
24 {
25 }
26
27 // todo instead have offset
28 ColliderComponent(Manager* manager, glm::vec3 boxCollider_size)
29 {
30 _manager = manager;
31 box_collider = boxCollider_size;
32 }
33
34 void init() override
35 {
36 if (!entity->hasComponent<TransformComponent>()) //todo: problem: having transform on top left grid, not every collider its own
37 {
39 }
40 transform = &entity->GetComponent<TransformComponent>();
41
42 }
43
44 void update(float deltaTime) override
45 {
46
47
48 }
49
50 void collisionPhysics() {
51 glm::vec3 nodePosition = transform->bodyCenter;
52 glm::vec3 nodeHalfSize = 0.5f * transform->size;
53
54 for (Group group : _groupChecks) {
55 const auto& adjacentEntities = _manager->adjacentEntities(entity, group);
56
57 for (Entity* other : adjacentEntities) {
58
59 auto areEntitiesLinked = [&](NodeEntity* main, Entity* other)
60 {
61 for (auto& i : main->getOutLinks()) {
62 if (i->getToNode() == other) {
63 return true;
64 }
65 }
66 return false;
67 };
68
69 if (areEntitiesLinked(entity, other)) {
70 //continue;
71 }
72
73 glm::vec3 otherPosition = other->GetComponent<TransformComponent>().bodyCenter;
74 glm::vec3 otherHalfSize = 0.5f * other->GetComponent<TransformComponent>().size;
75
76 glm::vec3 delta = nodePosition - otherPosition;
77
78 float dist = std::max(length(delta), 1e-4f);
79 glm::vec3 repulsion = repulsion_strength * normalize(delta) / (dist * dist);
80
81 transform->velocity += repulsion;
82 other->GetComponent<TransformComponent>().velocity -= repulsion;
83
84 }
85 }
86 }
87
88
89 void draw(size_t e_index, PlaneModelRenderer& batch, TazGraphEngine::Window& window) override
90 {
91 }
92
93 std::string GetComponentName() override {
94 return "ColliderComponent";
95 }
96
97 void addCollisionGroup(Group g) {
98 _groupChecks.insert(g);
99 }
100
101 void removeCollisionGroup(Group g) {
102 _groupChecks.erase(g);
103 }
104};
Definition ColliderComponent.h:12
Definition GECS.h:140
T & addComponent(TArgs &&... mArgs)
have addScript function
Definition GECS.h:239
Definition GECSManager.h:14
Definition GECS.h:128
Definition GECSEntity.h:43
Definition PlaneModelRenderer.h:21
Definition Window.h:18
Definition TransformComponent.h:6