2D_Game_Engine
Loading...
Searching...
No Matches
scene.cpp
Go to the documentation of this file.
1#include <pch.hpp>
2#include <scene.hpp>
3#include <renderer.hpp>
4
5int BinarySearchi(std::vector<Entity> &v,uint32_t uid){
6 int l=0,r=v.size()-1;
7 while(l<=r){
8 int m=(l+r)/2;
9 if(v[m].m_UID==uid)
10 return m;
11 else if(v[m].m_UID<uid)
12 l=m+1;
13 else
14 r=m-1;
15 }
16 return -1;
17}
18
19Scene::Scene(const std::string &name): m_Name(name){
20 m_ScalingFactor=0.5f;
22}
23
24std::string &Scene::GetName(){
25 return m_Name;
26}
27
28void Scene::SetScalingFactor(float scaling_factor){
29 m_ScalingFactor=scaling_factor;
30}
31
32void Scene::SetGravity(float x,float y){
33 m_Gravity={x,y};
34 m_PhysicsWorld->SetGravity(b2Vec2(x,y));
35}
36
37void Scene::SetGravity(Vec2 gravity){
38 m_Gravity=gravity;
39 m_PhysicsWorld->SetGravity(b2Vec2(gravity.x,gravity.y));
40}
41
43 m_Entities.push_back(Entity());
44 return m_Entities.back().m_UID;
45}
46
47void Scene::AddEntity(uint32_t uid){
48 m_Entities.push_back(Entity(uid));
49}
50
51Entity* Scene::GetEntity(uint32_t uid){
53
54 int idx=BinarySearchi(m_Entities,uid);
55 if(idx==-1)
56 return nullptr;
57 return &m_Entities[idx];
58}
59
60void Scene::RemoveEntity(uint32_t uid){
62
63 m_TagComponents.RemoveComponent(uid);
64 m_TextureComponents.RemoveComponent(uid);
65 m_AnimatedTextureComponents.RemoveComponent(uid);
66 m_LightComponents.RemoveComponent(uid);
67 m_BoxColliderComponents.RemoveComponent(uid);
68 m_CircleColliderComponents.RemoveComponent(uid);
69 m_RigidbodyComponents.RemoveComponent(uid);
70 m_NativeScriptComponents.RemoveComponent(uid);
71 m_TextComponents.RemoveComponent(uid);
72
73 int idx=BinarySearchi(m_Entities,uid);
74 if(idx==-1)
75 return;
76 m_Entities.erase(m_Entities.begin()+idx);
77}
78
79template<>
82
83 return m_TagComponents.GetComponent(uid);
84}
85
86template<>
89
90 return m_TextureComponents.GetComponent(uid);
91}
92
93template<>
96
97 return m_AnimatedTextureComponents.GetComponent(uid);
98}
99
100template<>
103
104 return m_LightComponents.GetComponent(uid);
105}
106
107template<>
110
111 return m_RigidbodyComponents.GetComponent(uid);
112}
113
114template<>
117
118 return m_BoxColliderComponents.GetComponent(uid);
119}
120
121template<>
124
125 return m_CircleColliderComponents.GetComponent(uid);
126}
127
128template<>
131
132 return m_NativeScriptComponents.GetComponent(uid);
133}
134
135template<>
138
139 return m_TextComponents.GetComponent(uid);
140}
141
142void Scene::SetEntityPosition(uint32_t uid,float x,float y){
144 if(entity==nullptr)
145 return;
146 entity->m_X=x;
147 entity->m_PreviousX=x;
148 entity->m_Y=y;
149 entity->m_PreviousY=y;
150
151 if(m_PhysicsWorld!=nullptr){
153 if(rigidbody==nullptr){ return; }
154 rigidbody->m_RuntimeBody->SetTransform(b2Vec2(x*m_ScalingFactor,y*m_ScalingFactor),0.0f);
155 }
156}
157
158template<>
161 m_TagComponents.AddComponent(component,uid);
162}
163
164template<>
167 m_TextureComponents.AddComponent(component,uid);
168}
169
170template<>
173 m_AnimatedTextureComponents.AddComponent(component,uid);
174}
175
176template<>
179 m_LightComponents.AddComponent(component,uid);
180}
181
182template<>
185 m_RigidbodyComponents.AddComponent(component,uid);
186}
187
188template<>
191 m_BoxColliderComponents.AddComponent(component,uid);
192}
193
194template<>
197 m_CircleColliderComponents.AddComponent(component,uid);
198}
199
200template<>
203 m_NativeScriptComponents.AddComponent(component,uid);
204}
205
206template<>
209 m_TextComponents.AddComponent(component,uid);
210}
211
212template<>
215
216 m_TagComponents.RemoveComponent(uid);
217}
218
219template<>
222
223 m_TextureComponents.RemoveComponent(uid);
224}
225
226template<>
229
230 m_AnimatedTextureComponents.RemoveComponent(uid);
231}
232
233template<>
236
237 m_LightComponents.RemoveComponent(uid);
238}
239
240template<>
243
244 m_RigidbodyComponents.RemoveComponent(uid);
245}
246
247template<>
250
251 m_BoxColliderComponents.RemoveComponent(uid);
252}
253
254template<>
257
258 m_CircleColliderComponents.RemoveComponent(uid);
259}
260
261template<>
264
265 m_NativeScriptComponents.RemoveComponent(uid);
266}
267
268template<>
271
272 m_TextComponents.RemoveComponent(uid);
273}
274
275void Scene::Update(double frame_time){
277
278 m_NativeScriptComponents.Update(this,frame_time);
280}
281
284
285 m_TextureComponents.Render(this);
286 m_AnimatedTextureComponents.Render(this);
287 m_TextComponents.Render(this);
288 m_LightComponents.Render(this);
289}
290
291void Scene::MoveEntity(uint32_t uid,float x_offset,float y_offset){
293
295 if(rigidbody==nullptr){
296 printf("Entity %d does not have a rigidbody\n",uid);
297 return;
298 }
300
301 const b2Vec2 &vel=rigidbody->m_RuntimeBody->GetLinearVelocity();
302 float mass=rigidbody->m_RuntimeBody->GetMass();
303
304 rigidbody->m_RuntimeBody->ApplyLinearImpulse(b2Vec2(mass*((x_offset*m_ScalingFactor)-vel.x),((y_offset!=0)?(mass*((y_offset*m_ScalingFactor)-vel.y)):0)),rigidbody->m_RuntimeBody->GetWorldCenter(),true);
305}
306
308 m_PhysicsWorld=new b2World(b2Vec2(0.0f,-0.3f));
309}
310
311void Scene::OnPhysicsUpdate(double frame_time){
313
314 const int velocity_iterations=6;
315 const int position_iterations=2;
317
318 std::vector<RigidbodyComponent> &rigidbodies=m_RigidbodyComponents.m_Components;
319 Entity *entity;
320 b2Body *body;
321 for(int i=0;i<rigidbodies.size();i++){
323 body=rigidbodies[i].m_RuntimeBody;
324 const auto &position=body->GetPosition();
325 entity->m_PreviousX=entity->m_X;
326 entity->m_PreviousY=entity->m_Y;
327 entity->m_X=position.x/m_ScalingFactor;
328 entity->m_Y=position.y/m_ScalingFactor;
329 }
330}
331
333 delete m_PhysicsWorld;
334 m_PhysicsWorld=nullptr;
335}
336
337std::vector<Entity> &Scene::GetEntities(){
338 return m_Entities;
339}
340
341template<>
342std::vector<TextureComponent> &Scene::GetComponents<TextureComponent>(){
343 return m_TextureComponents.m_Components;
344}
345
346template<>
347std::vector<AnimatedTextureComponent> &Scene::GetComponents<AnimatedTextureComponent>(){
348 return m_AnimatedTextureComponents.m_Components;
349}
350
351template<>
352std::vector<LightComponent> &Scene::GetComponents<LightComponent>(){
353 return m_LightComponents.m_Components;
354}
355
356template<>
357std::vector<RigidbodyComponent> &Scene::GetComponents<RigidbodyComponent>(){
358 return m_RigidbodyComponents.m_Components;
359}
360
361template<>
362std::vector<BoxColliderComponent> &Scene::GetComponents<BoxColliderComponent>(){
363 return m_BoxColliderComponents.m_Components;
364}
365
366template<>
367std::vector<CircleColliderComponent> &Scene::GetComponents<CircleColliderComponent>(){
368 return m_CircleColliderComponents.m_Components;
369}
370
371template<>
372std::vector<NativeScriptComponent> &Scene::GetComponents<NativeScriptComponent>(){
373 return m_NativeScriptComponents.m_Components;
374}
375
376template<>
377std::vector<TextComponent> &Scene::GetComponents<TextComponent>(){
378 return m_TextComponents.m_Components;
379}
380
383 RENDERER->SetLineWidth(0.03f);
384
385 for(auto &entity:m_Entities){
387 if(box_collider!=nullptr){
388 RENDERER->DrawLine({Interpolate(entity.m_X,entity.m_PreviousX),Interpolate(entity.m_Y,entity.m_PreviousY)},{Interpolate(entity.m_X,entity.m_PreviousX)+box_collider->m_Width,Interpolate(entity.m_Y,entity.m_PreviousY)},{0,1,0.75f,1},5);
389 RENDERER->DrawLine({Interpolate(entity.m_X,entity.m_PreviousX)+box_collider->m_Width,Interpolate(entity.m_Y,entity.m_PreviousY)},{Interpolate(entity.m_X,entity.m_PreviousX)+box_collider->m_Width,Interpolate(entity.m_Y,entity.m_PreviousY)+box_collider->m_Height},{0,1,0.75f,1},5);
390 RENDERER->DrawLine({Interpolate(entity.m_X,entity.m_PreviousX)+box_collider->m_Width,Interpolate(entity.m_Y,entity.m_PreviousY)+box_collider->m_Height},{Interpolate(entity.m_X,entity.m_PreviousX),Interpolate(entity.m_Y,entity.m_PreviousY)+box_collider->m_Height},{0,1,0.75f,1},5);
391 RENDERER->DrawLine({Interpolate(entity.m_X,entity.m_PreviousX),Interpolate(entity.m_Y,entity.m_PreviousY)+box_collider->m_Height},{Interpolate(entity.m_X,entity.m_PreviousX),Interpolate(entity.m_Y,entity.m_PreviousY)},{0,1,0.75f,1},5);
392 }
394 if(circle_collider!=nullptr){
397 RENDERER->DrawCircle({Interpolate(entity.m_X,entity.m_PreviousX)+circle_collider->m_XOffset,Interpolate(entity.m_Y,entity.m_PreviousY)+circle_collider->m_YOffset},{0,1,0.75f,0.5f},0.2f,5);
398 RENDERER->Render();
400 }
401 }
402
403 auto segments=RENDERER->GetSegments();
404 for(auto &segment:segments){
405 RENDERER->DrawLine({segment.first.x,segment.first.y},{segment.second.x,segment.second.y},{0,1,0.75f,1.0f},5);
406 }
407 RENDERER->Render();
409}
T * GetComponent(uint32_t uid)
Definition entity.hpp:389
void Render(Scene *scene)
void AddComponent(T &component, uint32_t uid)
Definition entity.hpp:363
std::vector< T > m_Components
Definition entity.hpp:358
void RemoveComponent(uint32_t uid)
Definition entity.hpp:373
void Update(Scene *scene, float frame_time)
void SetPointSize(float new_size)
Definition renderer.cpp:423
void DrawCircle(Vec2 pos, Vec4 color, float border, int layer)
Definition renderer.cpp:382
std::vector< std::pair< Vec2, Vec2 > > & GetSegments()
Definition renderer.cpp:770
void SetLineWidth(float new_size)
Definition renderer.cpp:411
void DrawLine(Vec2 pos1, Vec2 pos2, Vec4 color, int layer)
Definition renderer.cpp:396
float GetLineWidth()
Definition renderer.cpp:434
void Render(bool post_processing=false)
Definition renderer.cpp:565
float GetPointSize()
Definition renderer.cpp:430
void OnPhysicsUpdate(double frame_time)
Definition scene.cpp:311
void OnPhysicsStart()
Definition scene.cpp:307
uint32_t AddEntity()
Definition scene.cpp:42
void MoveEntity(uint32_t uid, float x_offset, float y_offset)
Definition scene.cpp:291
T * GetComponent(uint32_t uid)
void SetEntityPosition(uint32_t uid, float x, float y)
Definition scene.cpp:142
void DebugDraw()
Definition scene.cpp:381
std::string & GetName()
Definition scene.cpp:24
void SetGravity(float x, float y)
Definition scene.cpp:32
void Render()
Definition scene.cpp:282
void SetScalingFactor(float scaling_factor)
Definition scene.cpp:28
void RemoveEntity(uint32_t uid)
Definition scene.cpp:60
Entity * GetEntity(uint32_t uid)
Definition scene.cpp:51
void Update(double frame_time)
Definition scene.cpp:275
Scene()
Definition scene.hpp:11
std::vector< Entity > & GetEntities()
Definition scene.cpp:337
void OnPhysicsStop()
Definition scene.cpp:332
float Interpolate(float current, float previous)
Definition entity.hpp:83
int BinarySearchi(std::vector< Entity > &v, uint32_t uid)
Definition scene.cpp:5
m_Scene m_Name
int i
m_Scene m_ScalingFactor
Renderer * RENDERER
The main renderer.
Definition window.cpp:12