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