2D_Game_Engine
Loading...
Searching...
No Matches
editor.cpp
Go to the documentation of this file.
1#include <pch.hpp>
2#include <editor.hpp>
3#include <window.hpp>
4#include <utilities.hpp>
5#include <scene.hpp>
6#include <sceneserializer.hpp>
7#include <IconsFontAwesome6.h>
8#include <scene_buttons.hpp>
9#include <buttons.hpp>
10#include <global.hpp>
11#include <Instrumentor.h>
12
13#define baseFontSize 24.0f
14#define STRLEN 100
15
16std::string WINDOW_NAME;
17unsigned int WINDOW_WIDTH;
18unsigned int WINDOW_HEIGHT;
19unsigned int FULLSCREEN_WIDTH;
20unsigned int FULLSCREEN_HEIGHT;
21std::string SCENE_PATH;
23
24Editor::Editor(unsigned int width,unsigned int height,float fullscreen_width,float fullscreen_height,bool resizable){
27 Window::FullscreenWidth=fullscreen_width;
28 Window::FullscreenHeight=fullscreen_height;
30
31 Window::InitGlfwWindow("Editor",resizable);
33
34 m_SceneFramebuffer=new Framebuffer;
35 m_Scene=new Scene;
36 m_SceneSerializer=new SceneSerializer;
37 m_SceneSerializer->SetScene(m_Scene);
39
40 m_SceneSerializer->Deserialize("test.scene",m_ScriptComponents);
41 DeserializeProject();
42 //m_SceneSerializer->SerializeEncrypted("test_encrypted.scene");
43 //m_SceneSerializer->DeserializeEncrypted("test_encrypted.scene");
44
45 ImGuiIO &io=ImGui::GetIO();
46 io.Fonts->AddFontDefault();
47 float iconFontSize=baseFontSize*2.0f/3.0f;
48
49 static const ImWchar icons_ranges[]={ICON_MIN_FA,ICON_MAX_FA,0};
50 ImFontConfig icons_config;
51 icons_config.MergeMode=true;
52 icons_config.PixelSnapH=true;
53 icons_config.GlyphMinAdvanceX=iconFontSize;
54 if(io.Fonts->AddFontFromFileTTF("vendor/FontAwesome/fa-solid-900.ttf",iconFontSize,&icons_config,icons_ranges)==NULL){
55 printf("Failed to load FontAwesome font\n");
56 }
57
58 m_UpdateFiles=false;
59 m_HdrOpen=false;
60}
61
63 delete m_Scene;
64 delete m_SceneFramebuffer;
66}
67
69
70
71 #ifdef ENABLE_PROFILING
72
73 #endif
74 while(!glfwWindowShouldClose(Window::Window)){
75 glfwPollEvents();
76
78 m_Camera.InitializeProj();
79 }
80
82 HandleInputs();
83 #ifdef ENABLE_PROFILING
85 if(p.current && !p.previous){
86 Instrumentor::Get().BeginSession("Editor","Editor.json");
87 }
88 #endif
89
90 RENDERER->StartEditorScene(this);
91 m_Camera.ResetSceneProj();
93 m_Camera.DrawSceneProj();
94 RENDERER->DrawEditorScene(m_SceneFramebuffer);
95 HighlightEntity(m_SelectedEntity);
96
98 RENDERER->Clear({0.0,0.0,0.0,1.0});
101
105
106 glfwSwapBuffers(Window::Window);
107
108 #ifdef ENABLE_PROFILING
109 if(p.current && !p.previous){
110 Instrumentor::Get().EndSession();
111 }
112 #endif
113 }
114}
115
117 m_Scene->Render();
118}
119
120void Editor::HighlightEntity(uint32_t uid){
121auto e=m_Scene->GetEntity(uid);
122
123 if(!e)
124 return;
125
126 RENDERER->SetLineWidth(0.05f);
127
128 auto tc=m_Scene->GetComponent<TextureComponent>(uid);
129 if(tc){
130 RENDERER->DrawLine({Interpolate(e->m_X,e->m_PreviousX),Interpolate(e->m_Y,e->m_PreviousY)},{Interpolate(e->m_X,e->m_PreviousX)+tc->m_Width,Interpolate(e->m_Y,e->m_PreviousY)},{0,0,1,1},5);
131 RENDERER->DrawLine({Interpolate(e->m_X,e->m_PreviousX)+tc->m_Width,Interpolate(e->m_Y,e->m_PreviousY)},{Interpolate(e->m_X,e->m_PreviousX)+tc->m_Width,Interpolate(e->m_Y,e->m_PreviousY)+tc->m_Height},{0,0,1,1},5);
132 RENDERER->DrawLine({Interpolate(e->m_X,e->m_PreviousX)+tc->m_Width,Interpolate(e->m_Y,e->m_PreviousY)+tc->m_Height},{Interpolate(e->m_X,e->m_PreviousX),Interpolate(e->m_Y,e->m_PreviousY)+tc->m_Height},{0,0,1,1},5);
133 RENDERER->DrawLine({Interpolate(e->m_X,e->m_PreviousX),Interpolate(e->m_Y,e->m_PreviousY)+tc->m_Height},{Interpolate(e->m_X,e->m_PreviousX),Interpolate(e->m_Y,e->m_PreviousY)},{0,0,1,1},5);
134 }
135
136 auto atc=m_Scene->GetComponent<AnimatedTextureComponent>(uid);
137 if(atc){
138 RENDERER->DrawLine({Interpolate(e->m_X,e->m_PreviousX),Interpolate(e->m_Y,e->m_PreviousY)},{Interpolate(e->m_X,e->m_PreviousX)+atc->m_Width,Interpolate(e->m_Y,e->m_PreviousY)},{1,0.5f,0,1},5);
139 RENDERER->DrawLine({Interpolate(e->m_X,e->m_PreviousX)+atc->m_Width,Interpolate(e->m_Y,e->m_PreviousY)},{Interpolate(e->m_X,e->m_PreviousX)+atc->m_Width,Interpolate(e->m_Y,e->m_PreviousY)+atc->m_Height},{1,0.5f,0,1},5);
140 RENDERER->DrawLine({Interpolate(e->m_X,e->m_PreviousX)+atc->m_Width,Interpolate(e->m_Y,e->m_PreviousY)+atc->m_Height},{Interpolate(e->m_X,e->m_PreviousX),Interpolate(e->m_Y,e->m_PreviousY)+atc->m_Height},{1,0.5f,0,1},5);
141 RENDERER->DrawLine({Interpolate(e->m_X,e->m_PreviousX),Interpolate(e->m_Y,e->m_PreviousY)+atc->m_Height},{Interpolate(e->m_X,e->m_PreviousX),Interpolate(e->m_Y,e->m_PreviousY)},{1,0.5f,0,1},5);
142
143 Window::VertexCount-=8;
144 }
145
146 auto bc=m_Scene->GetComponent<BoxColliderComponent>(uid);
147 if(bc){
148 RENDERER->DrawLine({Interpolate(e->m_X,e->m_PreviousX)+bc->m_XOffset,Interpolate(e->m_Y,e->m_PreviousY)+bc->m_YOffset},{Interpolate(e->m_X,e->m_PreviousX)+bc->m_Width+bc->m_XOffset,Interpolate(e->m_Y,e->m_PreviousY)+bc->m_YOffset},{0,1,0,1},5);
149 RENDERER->DrawLine({Interpolate(e->m_X,e->m_PreviousX)+bc->m_Width+bc->m_XOffset,Interpolate(e->m_Y,e->m_PreviousY)+bc->m_YOffset},{Interpolate(e->m_X,e->m_PreviousX)+bc->m_Width+bc->m_XOffset,Interpolate(e->m_Y,e->m_PreviousY)+bc->m_Height+bc->m_YOffset},{0,1,0,1},5);
150 RENDERER->DrawLine({Interpolate(e->m_X,e->m_PreviousX)+bc->m_Width+bc->m_XOffset,Interpolate(e->m_Y,e->m_PreviousY)+bc->m_Height+bc->m_YOffset},{Interpolate(e->m_X,e->m_PreviousX)+bc->m_XOffset,Interpolate(e->m_Y,e->m_PreviousY)+bc->m_Height+bc->m_YOffset},{0,1,0,1},5);
151 RENDERER->DrawLine({Interpolate(e->m_X,e->m_PreviousX)+bc->m_XOffset,Interpolate(e->m_Y,e->m_PreviousY)+bc->m_Height+bc->m_YOffset},{Interpolate(e->m_X,e->m_PreviousX)+bc->m_XOffset,Interpolate(e->m_Y,e->m_PreviousY)+bc->m_YOffset},{0,1,0,1},5);
152
153 Window::VertexCount-=8;
154 }
155 auto cc=m_Scene->GetComponent<CircleColliderComponent>(uid);
156 if(cc){
157 float current_point_size=RENDERER->GetPointSize();
158 RENDERER->SetPointSize(cc->m_Radius*2);
159 RENDERER->DrawCircle({Interpolate(e->m_X,e->m_PreviousX)+cc->m_XOffset,Interpolate(e->m_Y,e->m_PreviousY)+cc->m_YOffset},{1,0,0,1.0f},0.02f,5);
160 RENDERER->Render();
161 RENDERER->SetPointSize(current_point_size);
162
163 Window::VertexCount-=1;
164 }
165
166 RENDERER->Render();
167}
168
170 ImVec2 tempvec;
171 float tempf;
172
173 if(ImGui::BeginMainMenuBar()){
174 tempvec=ImGui::GetWindowSize();
175 if(ImGui::BeginMenu("File")){
176 if(ImGui::MenuItem("New")){
177 delete m_Scene;
178 m_Scene=new Scene;
179 m_SceneSerializer->SetScene(m_Scene);
180 }
181 if(ImGui::MenuItem("Open")){
182 nfdchar_t *outPath=NULL;
183 nfdresult_t result=NFD_OpenDialog("scene",NULL,&outPath);
184
185 if(result==NFD_OKAY){
186 delete m_Scene;
187 m_Scene=new Scene;
188 m_SceneSerializer->SetScene(m_Scene);
189 m_SceneSerializer->Deserialize((char*)outPath,m_ScriptComponents);
190 }else if(result==NFD_ERROR){
191 printf("Error: %s\n",NFD_GetError());
192 }
193 }
194 if(ImGui::MenuItem("Save")){
195 m_SceneSerializer->Serialize(m_ScenePath,m_ScriptComponents);
196 SerializeProject();
197 }
198 if(ImGui::MenuItem("Save As")){
199 nfdchar_t *outPath=NULL;
200 nfdresult_t result=NFD_SaveDialog("scene",NULL,&outPath);
201
202 if(result==NFD_OKAY){
203 m_SceneSerializer->Serialize((char*)outPath,m_ScriptComponents);
204 m_ScenePath=(char*)outPath;
205 }else if(result==NFD_ERROR){
206 printf("Error: %s\n",NFD_GetError());
207 }
208 }
209 if(ImGui::MenuItem("Exit")){
210 glfwSetWindowShouldClose(Window::Window,true);
211 }
212 ImGui::EndMenu();
213 }
214 if(ImGui::BeginMenu("Edit")){
215 ImGui::EndMenu();
216 }
217 if(ImGui::BeginMenu("Reload")){
218 if(ImGui::MenuItem("Reload Shaders")){
220 }
221 ImGui::EndMenu();
222 }
223 if(ImGui::BeginMenu("Effects")){
224 if(ImGui::MenuItem("HDR")){
225 m_HdrOpen=true;
226 }
227 ImGui::EndMenu();
228 }
229 ImGui::EndMainMenuBar();
230 if(m_HdrOpen){
231 HdrWindow(&m_HdrOpen);
232 }
233 }
234
235 EntitiesMenu({0,tempvec.y});
236 ComponentsMenu({0,(Window::Height-tempvec.y)/2.0f+tempvec.y});
237 DataMenu({GetWidthPercentageInPx(80),tempvec.y});
238 VariablesMenu({GetWidthPercentageInPx(80),(Window::Height-tempvec.y)/2.0f+tempvec.y});
239
240 ImGui::Begin("Viewport",nullptr,ImGuiWindowFlags_NoMove|ImGuiWindowFlags_NoResize|ImGuiWindowFlags_NoCollapse|ImGuiWindowFlags_NoTitleBar);
241 ImGui::SetWindowPos(ImVec2(GetWidthPercentageInPx(20),tempvec.y));
242 tempf=GetWidthPercentageInPx(60);
243 ImGui::SetWindowSize(ImVec2(tempf,tempf*(Window::Height/Window::Width)));
244
247
248 ImGui::Image((void*)m_SceneFramebuffer->GetColorbufferID(),ImGui::GetContentRegionAvail(),ImVec2(0,1),ImVec2(1,0));
249
250 ImGui::SameLine();
251 ImVec2 pos=ImGui::GetCursorPos();
252 ImGui::SetCursorPos(ImVec2(pos.x-GetWidthPercentageInPx(60)/2.0f,pos.y+baseFontSize/2.0f));
253 if(ImGui::Button(ICON_FA_PLAY,ImVec2(baseFontSize*1.5f,baseFontSize*1.5f))){
254 SceneButtons::PlayButton(m_ScriptComponents);
255 }
256
257 Vec2 cameraPos=m_Camera.GetPosition();
258
259 ImGui::SetCursorPos({10,10});
260 ImGui::Text("(%.2f, %.2f)",cameraPos.x,cameraPos.y);
261 ImGui::SameLine();
262 if(ImGui::Button("Reset")){
263 m_Camera.SetPosition({0,0});
264 }
265
266 ImGui::End();
267
268 FileBrowserMenu({GetWidthPercentageInPx(20),tempvec.y+tempf*(Window::Height/Window::Width)});
269}
270
271void Editor::EntitiesMenu(ImVec2 pos){
272 ImGui::Begin("Entities",nullptr,ImGuiWindowFlags_NoMove|ImGuiWindowFlags_NoResize|ImGuiWindowFlags_NoCollapse|ImGuiWindowFlags_NoTitleBar);
273 ImGui::SetWindowPos(pos);
274 ImGui::SetWindowSize(ImVec2(GetWidthPercentageInPx(20),(Window::Height-pos.y)/2.0f));
275
276 auto entities=m_Scene->GetEntities();
277 int k=0;
278 for(auto &e:entities){
279 std::string name;
280 if(m_Scene->GetComponent<TagComponent>(e.m_UID)!=nullptr){
281 name=m_Scene->GetComponent<TagComponent>(e.m_UID)->m_Tag;
282 }else{
283 name="Entity "+std::to_string(k);
284 }
285
286 ImGui::PushID(k);
287
288 if(ImGui::Selectable(name.c_str())){
289 if(m_SelectedEntity!=e.m_UID){
290 m_SelectedEntity=e.m_UID;
291 }else{
292 m_SelectedEntity=std::numeric_limits<uint32_t>::max();
293 }
294 }
295 ImGui::OpenPopupOnItemClick("EntityPopup",ImGuiPopupFlags_MouseButtonRight);
296 if(ImGui::BeginPopupContextItem("EntityPopup")){
297 if(ImGui::MenuItem("Remove Entity")){
298 m_Scene->RemoveEntity(e.m_UID);
299 }
300 ImGui::EndPopup();
301 }
302
303 ImGui::PopID();
304 k++;
305 }
306
307 if(ImGui::IsWindowHovered() && !ImGui::IsAnyItemHovered() && ImGui::IsMouseClicked(ImGuiMouseButton_Right)){
308 ImGui::OpenPopup("CreateEntityPopup");
309 }
310
311 if(ImGui::BeginPopup("CreateEntityPopup")){
312 if(ImGui::MenuItem("Create Entity")){
313 m_Scene->AddEntity();
314 }
315 ImGui::EndPopup();
316 }
317
318 ImGui::End();
319}
320
321void Editor::ComponentsMenu(ImVec2 pos){
322 ImGui::Begin("Components",nullptr,ImGuiWindowFlags_NoMove|ImGuiWindowFlags_NoResize|ImGuiWindowFlags_NoCollapse|ImGuiWindowFlags_NoTitleBar);
323 ImGui::SetWindowPos(pos);
324 ImGui::SetWindowSize(ImVec2(GetWidthPercentageInPx(20),Window::Height-pos.y));
325
326 Entity *e=m_Scene->GetEntity(m_SelectedEntity);
327 if(e){
328 ImGui::Text("Entity: %s",(m_Scene->GetComponent<TagComponent>(m_SelectedEntity))?m_Scene->GetComponent<TagComponent>(m_SelectedEntity)->m_Tag.c_str():"");
329 ImGui::SliderFloat("X",&e->m_X,-30.0f,30.0f);
330 ImGui::SliderFloat("Y",&e->m_Y,-30.0f,30.0f);
331 e->m_PreviousX=e->m_X;
332 e->m_PreviousY=e->m_Y;
333 }
334
335 ImGui::PushItemWidth(ImGui::GetWindowWidth()*0.5f);
336
337 TagComponent *tag_component=m_Scene->GetComponent<TagComponent>(m_SelectedEntity);
338 if(tag_component){
339 if(StartNode("TagComponent")){
340 ImGui::InputText("Tag",&tag_component->m_Tag[0],tag_component->m_Tag.size());
341 ImGui::TreePop();
342 }
343 ImGui::OpenPopupOnItemClick("TagComponentPopup",ImGuiPopupFlags_MouseButtonRight);
344 if(ImGui::BeginPopupContextItem("TagComponentPopup")){
345 if(ImGui::MenuItem("Remove Component")){
346 m_Scene->RemoveComponent<TagComponent>(m_SelectedEntity);
347 }
348 ImGui::EndPopup();
349 }
350 }
351
352 TextureComponent *texture_component=m_Scene->GetComponent<TextureComponent>(m_SelectedEntity);
353 if(texture_component){
354 if(StartNode("TextureComponent")){
355 if(ImGui::Button("Reload Texture")){
356 Texture *t=texture_component->m_Texture.get();
357
358 texture_component->m_Texture=TEXTURES_MANAGER->UpdateTexture(t->m_TexID,t->m_FilePath,t->m_MagFilter,t->m_MinFilter).second;
359 }
360
361 ImGui::InputText("Path",&texture_component->m_Texture.get()->m_FilePath[0],STRLEN);
362
363 int selectedMagFilter,selectedMinFilter;
364
365 if(texture_component->m_Texture.get()->m_MagFilter==GL_LINEAR){
366 selectedMagFilter=0;
367 }else{
368 selectedMagFilter=1;
369 }
370
371 if(texture_component->m_Texture.get()->m_MinFilter==GL_LINEAR){
372 selectedMinFilter=0;
373 }else{
374 selectedMinFilter=1;
375 }
376
377 ImGui::Combo("Mag Filter",&selectedMagFilter,"Linear\0Nearest\0");
378 ImGui::Combo("Min Filter",&selectedMinFilter,"Linear\0Nearest\0");
379
380 if(selectedMagFilter==0){
381 texture_component->m_Texture.get()->m_MagFilter=GL_LINEAR;
382 }else{
383 texture_component->m_Texture.get()->m_MagFilter=GL_NEAREST;
384 }
385
386 if(selectedMinFilter==0){
387 texture_component->m_Texture.get()->m_MinFilter=GL_LINEAR;
388 }else{
389 texture_component->m_Texture.get()->m_MinFilter=GL_NEAREST;
390 }
391
392 ImGui::SliderFloat("Width",&texture_component->m_Width,0.0f,30.0f);
393 ImGui::SliderFloat("Height",&texture_component->m_Height,0.0f,30.0f);
394 ImGui::SliderInt("Layer",&texture_component->m_Layer,-100,100);
395 ImGui::TreePop();
396 }
397 ImGui::OpenPopupOnItemClick("TextureComponentPopup",ImGuiPopupFlags_MouseButtonRight);
398 if(ImGui::BeginPopupContextItem("TextureComponentPopup")){
399 if(ImGui::MenuItem("Remove Component")){
400 m_Scene->RemoveComponent<TextureComponent>(m_SelectedEntity);
401 }
402 ImGui::EndPopup();
403 }
404 }
405
406 AnimatedTextureComponent *animated_texture_component=m_Scene->GetComponent<AnimatedTextureComponent>(m_SelectedEntity);
407 if(animated_texture_component){
408 if(StartNode("AnimatedTextureComponent")){
409 if(ImGui::Button("Reload Texture")){
410 SpriteSheet *s=animated_texture_component->m_AnimatedTexture.get();
411
412 animated_texture_component->m_AnimatedTexture=TEXTURES_MANAGER->UpdateSpriteSheet(s->m_TexID,s->m_FilePath,s->m_TileWidth,s->m_TileHeight,s->m_MagFilter,s->m_MinFilter).second;
413 }
414
415 ImGui::InputText("Path",&animated_texture_component->m_AnimatedTexture.get()->m_FilePath[0],STRLEN);
416
417 int selectedMagFilter,selectedMinFilter;
418
419 if(animated_texture_component->m_AnimatedTexture.get()->m_MagFilter==GL_LINEAR){
420 selectedMagFilter=0;
421 }else{
422 selectedMagFilter=1;
423 }
424
425 if(animated_texture_component->m_AnimatedTexture.get()->m_MinFilter==GL_LINEAR){
426 selectedMinFilter=0;
427 }else{
428 selectedMinFilter=1;
429 }
430
431 ImGui::Combo("Mag Filter",&selectedMagFilter,"Linear\0Nearest\0");
432 ImGui::Combo("Min Filter",&selectedMinFilter,"Linear\0Nearest\0");
433
434 if(selectedMagFilter==0){
435 animated_texture_component->m_AnimatedTexture.get()->m_MagFilter=GL_LINEAR;
436 }else{
437 animated_texture_component->m_AnimatedTexture.get()->m_MagFilter=GL_NEAREST;
438 }
439
440 if(selectedMinFilter==0){
441 animated_texture_component->m_AnimatedTexture.get()->m_MinFilter=GL_LINEAR;
442 }else{
443 animated_texture_component->m_AnimatedTexture.get()->m_MinFilter=GL_NEAREST;
444 }
445
446 ImGui::SliderInt("Tile Width",(int*)&animated_texture_component->m_AnimatedTexture.get()->m_TileWidth,0,500);
447 ImGui::SliderInt("Tile Height",(int*)&animated_texture_component->m_AnimatedTexture.get()->m_TileHeight,0,500);
448
449 ImGui::SliderFloat("Width",&animated_texture_component->m_Width,0.0f,30.0f);
450 ImGui::SliderFloat("Height",&animated_texture_component->m_Height,0.0f,30.0f);
451 ImGui::SliderInt("Layer",&animated_texture_component->m_Layer,-100,100);
452
453 SpriteSheet *s=animated_texture_component->m_AnimatedTexture.get();
454 ImGui::Checkbox("Play Animation",&animated_texture_component->m_PlayAnimation);
455 ImGui::Checkbox("Loop Animation",&animated_texture_component->m_LoopAnimation);
456 ImGui::SliderFloat("Animation Delay",&animated_texture_component->m_AnimationDelay,0.0f,10.0f);
457 ImGui::SliderInt("Animation Index",&animated_texture_component->m_AnimationIndex,0,ceil(((float)s->m_Width)/((float)s->m_TileWidth))-1);
458 ImGui::TreePop();
459 }
460 ImGui::OpenPopupOnItemClick("AnimatedTextureComponentPopup",ImGuiPopupFlags_MouseButtonRight);
461 if(ImGui::BeginPopupContextItem("AnimatedTextureComponentPopup")){
462 if(ImGui::MenuItem("Remove Component")){
463 m_Scene->RemoveComponent<AnimatedTextureComponent>(m_SelectedEntity);
464 }
465 ImGui::EndPopup();
466 }
467 }
468
469 RigidbodyComponent *rigidbody_component=m_Scene->GetComponent<RigidbodyComponent>(m_SelectedEntity);
470 if(rigidbody_component){
471 if(StartNode("RigidbodyComponent")){
472 const char *bodyTypes[]={"Static","Dynamic","Kinematic"};
473 int currentBodyType;
474 switch(rigidbody_component->m_BodyType){
476 currentBodyType=0;
477 break;
479 currentBodyType=1;
480 break;
482 currentBodyType=2;
483 break;
484 }
485
486 ImGui::Combo("Body Type",&currentBodyType,bodyTypes,3);
487
488 switch(currentBodyType){
489 case 0:
491 break;
492 case 1:
494 break;
495 case 2:
497 break;
498 }
499
500 //TO IMPLEMENT:
501 //ImGui::Checkbox("Fixed Rotation",&rigidbody_component->m_FixedRotation);
502
503 ImGui::TreePop();
504 }
505 ImGui::OpenPopupOnItemClick("RigidbodyComponentPopup",ImGuiPopupFlags_MouseButtonRight);
506 if(ImGui::BeginPopupContextItem("RigidbodyComponentPopup")){
507 if(ImGui::MenuItem("Remove Component")){
508 m_Scene->RemoveComponent<RigidbodyComponent>(m_SelectedEntity);
509 }
510 ImGui::EndPopup();
511 }
512 }
513
514 BoxColliderComponent *box_collider_component=m_Scene->GetComponent<BoxColliderComponent>(m_SelectedEntity);
515 if(box_collider_component){
516 if(StartNode("BoxColliderComponent")){
517 ImGui::SliderFloat("X Offset",&box_collider_component->m_XOffset,-30.0f,30.0f);
518 ImGui::SliderFloat("Y Offset",&box_collider_component->m_YOffset,-30.0f,30.0f);
519 ImGui::SliderFloat("Width",&box_collider_component->m_Width,0.0f,30.0f);
520 ImGui::SliderFloat("Height",&box_collider_component->m_Height,0.0f,30.0f);
521 ImGui::SliderFloat("Density",&box_collider_component->m_Density,0.0f,10.0f);
522 ImGui::SliderFloat("Friction",&box_collider_component->m_Friction,0.0f,10.0f);
523 ImGui::SliderFloat("Restitution",&box_collider_component->m_Restitution,0.0f,10.0f);
524 ImGui::SliderFloat("Restitution Threshold",&box_collider_component->m_RestitutionThreshold,0.0f,10.0f);
525 ImGui::TreePop();
526 }
527 ImGui::OpenPopupOnItemClick("BoxColliderComponentPopup",ImGuiPopupFlags_MouseButtonRight);
528 if(ImGui::BeginPopupContextItem("BoxColliderComponentPopup")){
529 if(ImGui::MenuItem("Remove Component")){
530 m_Scene->RemoveComponent<BoxColliderComponent>(m_SelectedEntity);
531 }
532 ImGui::EndPopup();
533 }
534 }
535
536 CircleColliderComponent *circle_collider_component=m_Scene->GetComponent<CircleColliderComponent>(m_SelectedEntity);
537 if(circle_collider_component){
538 if(StartNode("CircleColliderComponent")){
539 ImGui::SliderFloat("X Offset",&circle_collider_component->m_XOffset,-30.0f,30.0f);
540 ImGui::SliderFloat("Y Offset",&circle_collider_component->m_YOffset,-30.0f,30.0f);
541 ImGui::SliderFloat("Radius",&circle_collider_component->m_Radius,0.0f,30.0f);
542 ImGui::SliderFloat("Density",&circle_collider_component->m_Density,0.0f,10.0f);
543 ImGui::SliderFloat("Friction",&circle_collider_component->m_Friction,0.0f,10.0f);
544 ImGui::SliderFloat("Restitution",&circle_collider_component->m_Restitution,0.0f,10.0f);
545 ImGui::SliderFloat("Restitution Threshold",&circle_collider_component->m_RestitutionThreshold,0.0f,10.0f);
546 ImGui::TreePop();
547 }
548 ImGui::OpenPopupOnItemClick("CircleColliderComponentPopup",ImGuiPopupFlags_MouseButtonRight);
549 if(ImGui::BeginPopupContextItem("CircleColliderComponentPopup")){
550 if(ImGui::MenuItem("Remove Component")){
551 m_Scene->RemoveComponent<CircleColliderComponent>(m_SelectedEntity);
552 }
553 ImGui::EndPopup();
554 }
555 }
556
557 LightComponent *light_component=m_Scene->GetComponent<LightComponent>(m_SelectedEntity);
558 if(light_component){
559 if(StartNode("LightComponent")){
560 ImGui::SliderFloat("X Offset",&light_component->m_XOffset,-30.0f,30.0f);
561 ImGui::SliderFloat("Y Offset",&light_component->m_YOffset,-30.0f,30.0f);
562 ImGui::SliderFloat("Radius",&light_component->m_Radius,0.0f,30.0f);
563 ImGui::SliderFloat("Blur",&light_component->m_Blur,0.0f,1.0f);
564 ImGui::ColorEdit3("Color",&light_component->m_Color.r);
565
566 const char *lightTypes[]={"All Light","Spot Light","Spot Light (Collisions on)"};
567 int currentLightType;
568 switch(light_component->m_Type){
570 currentLightType=0;
571 break;
573 currentLightType=1;
574 break;
576 currentLightType=2;
577 break;
578 }
579
580 ImGui::Combo("Light Type",&currentLightType,lightTypes,3);
581
582 switch(currentLightType){
583 case 0:
584 light_component->m_Type=LightType::ALL_LIGHT;
585 break;
586 case 1:
587 light_component->m_Type=LightType::LIGHT_AROUND_POS;
588 break;
589 case 2:
591 break;
592 }
593
594 if(ImGui::Button("Center Light")){
595 TextureComponent *texture_component=m_Scene->GetComponent<TextureComponent>(m_SelectedEntity);
596 if(texture_component){
597 light_component->SetCentered(texture_component->m_Width,texture_component->m_Height);
598 }else{
599 AnimatedTextureComponent *animated_texture_component=m_Scene->GetComponent<AnimatedTextureComponent>(m_SelectedEntity);
600 if(animated_texture_component){
601 light_component->SetCentered(animated_texture_component->m_Width,animated_texture_component->m_Height);
602 }
603 }
604 }
605
606 ImGui::TreePop();
607 }
608 ImGui::OpenPopupOnItemClick("LightComponentPopup",ImGuiPopupFlags_MouseButtonRight);
609 if(ImGui::BeginPopupContextItem("LightComponentPopup")){
610 if(ImGui::MenuItem("Remove Component")){
611 m_Scene->RemoveComponent<LightComponent>(m_SelectedEntity);
612 }
613 ImGui::EndPopup();
614 }
615 }
616
617 TextComponent *text_component=m_Scene->GetComponent<TextComponent>(m_SelectedEntity);
618 if(text_component){
619 if(StartNode("TextComponent")){
620 ImGui::InputText("Font Path",&text_component->m_TextRenderer->m_FontPath[0],text_component->m_TextRenderer->m_FontPath.size());
621 ImGui::SliderFloat("Font Size",&text_component->m_TextRenderer->m_GlyphSize,0,256);
622 if(ImGui::Checkbox("Fixed Position",&text_component->m_TextRenderer->m_Fixed)){
623 glm::mat4 mat;
624 if(text_component->m_TextRenderer->m_Fixed){
625 mat=m_Camera.GetProjMatrix();
626 }else{
627 mat=m_Camera.GetViewProjMatrix();
628 }
629 text_component->m_TextRenderer->UpdateProjMat(mat);
630 }
631
632 if(ImGui::Button("Reload Font")){
633 TextRenderer *t=text_component->m_TextRenderer.get();
634 text_component->m_TextRenderer=FONT_MANAGER->UpdateFont(t->m_ID,t->m_FontPath,t->m_GlyphSize,t->m_Fixed).second;
635 }
636
637 ImGui::InputTextMultiline("Text",&text_component->m_Text[0],text_component->m_Text.size());
638 ImGui::SliderFloat("X Offset",&text_component->m_Offset.x,-10.0f,10.0f);
639 ImGui::SliderFloat("Y Offset",&text_component->m_Offset.y,-10.0f,10.0f);
640 if(ImGui::Button("Center Text")){
641 TextureComponent *texture_component=m_Scene->GetComponent<TextureComponent>(m_SelectedEntity);
642 if(texture_component){
643 text_component->SetCentered(texture_component->m_Width,texture_component->m_Height);
644 }else{
645 AnimatedTextureComponent *animated_texture_component=m_Scene->GetComponent<AnimatedTextureComponent>(m_SelectedEntity);
646 if(animated_texture_component){
647 text_component->SetCentered(animated_texture_component->m_Width,animated_texture_component->m_Height);
648 }
649 }
650 }
651 ImGui::SliderFloat("Scale",&text_component->m_Scale,0.0f,10.0f);
652 ImGui::ColorEdit3("Color",&text_component->m_Color.r);
653 ImGui::Checkbox("Ignore Lighting",&text_component->m_IgnoreLighting);
654 if(!text_component->m_IgnoreLighting){
655 ImGui::SliderInt("Layer",&text_component->m_Layer,-100,100);
656 }
657 ImGui::TreePop();
658 }
659 ImGui::OpenPopupOnItemClick("TextComponentPopup",ImGuiPopupFlags_MouseButtonRight);
660 if(ImGui::BeginPopupContextItem("TextComponentPopup")){
661 if(ImGui::MenuItem("Remove Component")){
662 m_Scene->RemoveComponent<TextComponent>(m_SelectedEntity);
663 }
664 ImGui::EndPopup();
665 }
666 }
667
668 for(int i=0;i<m_ScriptComponents.size();i++){
669 auto &[name,id]=m_ScriptComponents[i];
670 if(id==m_SelectedEntity){
671 if(StartNode("ScriptComponent")){
672 ImGui::InputText("Function Name",&name[0],name.size());
673 ImGui::TreePop();
674 }
675 ImGui::OpenPopupOnItemClick("ScriptComponentPopup",ImGuiPopupFlags_MouseButtonRight);
676 if(ImGui::BeginPopupContextItem("ScriptComponentPopup")){
677 if(ImGui::MenuItem("Remove Component")){
678 m_ScriptComponents.erase(m_ScriptComponents.begin()+i);
679 }
680 ImGui::EndPopup();
681 }
682 }
683 }
684
685 ImGui::PopItemWidth();
686
687 if(ImGui::IsWindowHovered() && !ImGui::IsAnyItemHovered() && ImGui::IsMouseClicked(ImGuiMouseButton_Right)){
688 ImGui::OpenPopup("AddComponentPopup");
689 }
690 if(ImGui::BeginPopup("AddComponentPopup")){
691 if(ImGui::BeginMenu("Add Component")){
692 if(ImGui::MenuItem("Tag Component")){
693 if(m_SelectedEntity!=std::numeric_limits<uint32_t>::max() && m_Scene->GetComponent<TagComponent>(m_SelectedEntity)==nullptr){
694 m_Scene->AddComponent<TagComponent>(m_SelectedEntity,"Entity "+std::to_string(m_SelectedEntity));
695 }
696 }
697 if(ImGui::MenuItem("Texture Component")){
698 if(m_SelectedEntity!=std::numeric_limits<uint32_t>::max() && m_Scene->GetComponent<TextureComponent>(m_SelectedEntity)==nullptr){
699 m_Scene->AddComponent<TextureComponent>(m_SelectedEntity);
700 }
701 }
702 if(ImGui::MenuItem("Animated Texture Component")){
703 if(m_SelectedEntity!=std::numeric_limits<uint32_t>::max() && m_Scene->GetComponent<AnimatedTextureComponent>(m_SelectedEntity)==nullptr){
704 m_Scene->AddComponent<AnimatedTextureComponent>(m_SelectedEntity);
705 }
706 }
707 if(ImGui::MenuItem("Rigidbody Component")){
708 if(m_SelectedEntity!=std::numeric_limits<uint32_t>::max() && m_Scene->GetComponent<RigidbodyComponent>(m_SelectedEntity)==nullptr){
709 m_Scene->AddComponent<RigidbodyComponent>(m_SelectedEntity);
710 }
711 }
712 if(ImGui::MenuItem("Box Collider Component")){
713 if(m_SelectedEntity!=std::numeric_limits<uint32_t>::max() && m_Scene->GetComponent<BoxColliderComponent>(m_SelectedEntity)==nullptr){
714 m_Scene->AddComponent<BoxColliderComponent>(m_SelectedEntity);
715 }
716 }
717 if(ImGui::MenuItem("Circle Collider Component")){
718 if(m_SelectedEntity!=std::numeric_limits<uint32_t>::max() && m_Scene->GetComponent<CircleColliderComponent>(m_SelectedEntity)==nullptr){
719 m_Scene->AddComponent<CircleColliderComponent>(m_SelectedEntity);
720 }
721 }
722 if(ImGui::MenuItem("Light Component")){
723 if(m_SelectedEntity!=std::numeric_limits<uint32_t>::max() && m_Scene->GetComponent<LightComponent>(m_SelectedEntity)==nullptr){
724 m_Scene->AddComponent<LightComponent>(m_SelectedEntity);
725 }
726 }
727 if(ImGui::MenuItem("Text Component")){
728 if(m_SelectedEntity!=std::numeric_limits<uint32_t>::max() && m_Scene->GetComponent<TextComponent>(m_SelectedEntity)==nullptr){
729 m_Scene->AddComponent<TextComponent>(m_SelectedEntity);
730 }
731 }
732 if(ImGui::MenuItem("Script Component")){
733 if(m_SelectedEntity!=std::numeric_limits<uint32_t>::max()){
734 std::string name(100,'\0');
735 m_ScriptComponents.push_back({name,m_SelectedEntity});
736 }
737 }
738 ImGui::EndMenu();
739 }
740 ImGui::EndPopup();
741 }
742
743 ImGui::End();
744}
745
746void Editor::DataMenu(ImVec2 pos){
747 ImGui::Begin("Data",nullptr,ImGuiWindowFlags_NoMove|ImGuiWindowFlags_NoResize|ImGuiWindowFlags_NoCollapse|ImGuiWindowFlags_NoTitleBar);
748 ImGui::SetWindowPos(pos);
749 ImGui::SetWindowSize(ImVec2(GetWidthPercentageInPx(20),(Window::Height-pos.y)/2.0f));
750
751 ImGui::Text("Vertices Count: %d",Window::VertexCount);
752 ImGui::Text("Draw Calls: %d",Window::DrawCalls);
753
754 ImGui::End();
755}
756
757void Editor::VariablesMenu(ImVec2 pos){
758 ImGui::Begin("Variables",nullptr,ImGuiWindowFlags_NoMove|ImGuiWindowFlags_NoResize|ImGuiWindowFlags_NoCollapse|ImGuiWindowFlags_NoTitleBar);
759 ImGui::SetWindowPos(pos);
760 ImGui::SetWindowSize(ImVec2(GetWidthPercentageInPx(20),Window::Height-pos.y));
761 ImGui::ColorEdit3("Clear Color",(float*)&RENDERER->m_ClearColor);
762 ImGui::ColorEdit3("Ambient Light",(float*)&RENDERER->m_AmbientLight);
763 ImGui::Checkbox("Animations Preview",&ANIMATIONS_PREVIEW);
764
765 ImGui::Dummy(ImVec2(0.0f,ImGui::GetTextLineHeight()));
766
767 ImGui::Text("Window variables:");
768 ImGui::InputText("Window Name",&WINDOW_NAME[0],WINDOW_NAME.size());
769 ImGui::InputInt("Window Width",(int*)&WINDOW_WIDTH);
770 ImGui::InputInt("Window Height",(int*)&WINDOW_HEIGHT);
771 ImGui::InputInt("Fullscreen Width",(int*)&FULLSCREEN_WIDTH);
772 ImGui::InputInt("Fullscreen Height",(int*)&FULLSCREEN_HEIGHT);
773 ImGui::InputText("Scene Path",&SCENE_PATH[0],SCENE_PATH.size());
774 ImGui::Checkbox("Resizable",&RESIZABLE);
775
776 ImGui::End();
777}
778
779void Editor::FileBrowserMenu(ImVec2 pos){
780 ImGui::Begin("FileBrowser",nullptr,ImGuiWindowFlags_NoMove|ImGuiWindowFlags_NoResize|ImGuiWindowFlags_NoCollapse|ImGuiWindowFlags_NoTitleBar);
781 ImGui::SetWindowPos(pos);
782 ImGui::SetWindowSize(ImVec2(GetWidthPercentageInPx(60),Window::Height-pos.y));
783
784 if(ImGui::Button(ICON_FA_ARROW_LEFT,ImVec2(baseFontSize*1.5f,baseFontSize*1.5f))){
785 for(int i=m_CurrentPath.size()-1;i>=0;i--){
786 if(m_CurrentPath[i]=='/'){
787 m_CurrentPath=m_CurrentPath.substr(0,i);
788 m_CurrentEntries.clear();
789 break;
790 }
791 }
792 }
793
794 ImGui::SameLine();
795 if(ImGui::Button(ICON_FA_ROTATE,ImVec2(baseFontSize*1.5f,baseFontSize*1.5f))){
796 m_UpdateFiles=true;
797 }
798
799 if(m_CurrentEntries.empty() || m_UpdateFiles){
800 if(m_UpdateFiles){
801 m_UpdateFiles=false;
802 m_CurrentEntries.clear();
803 }
804
805 for(auto &entry:std::filesystem::directory_iterator(m_CurrentPath)){
806 m_CurrentEntries.push_back(entry);
807 }
808
809 std::sort(m_CurrentEntries.begin(),m_CurrentEntries.end(),
810 [](const std::filesystem::directory_entry &a,const std::filesystem::directory_entry &b){
811 if(a.is_directory()&&!b.is_directory()){
812 return true;
813 }
814 if(!a.is_directory() && b.is_directory()){
815 return false;
816 }
817 return a.path()<b.path();
818 }
819 );
820 }
821
822
823 ImGui::SameLine();
824 ImGui::Text("Current Path: %s",m_CurrentPath.c_str());
825
826 ImGui::PushStyleColor(ImGuiCol_Border,IM_COL32(0,0,0,0));
827 ImGui::BeginChild("FileBrowserChild",ImVec2(0,0),true);
828 static bool isFileContentOpen=false;
829 for(auto &entry:m_CurrentEntries){
830 if(entry.is_directory()){
831 if(ImGui::Selectable((ICON_FA_FOLDER+entry.path().filename().string()).c_str())){
832 m_CurrentPath=entry.path().string();
833 m_CurrentEntries.clear();
834 break;
835 }
836 }else{
837 if(ImGui::Selectable((ICON_FA_FILE+entry.path().filename().string()).c_str())){
838 FILE *file=fopen(entry.path().string().c_str(),"r");
839
840 if(file){
841 char ch;
842 m_SelectedFileContent.clear();
843 while((ch=fgetc(file))!=EOF){
844 m_SelectedFileContent+=ch;
845 }
846 fclose(file);
847
848 isFileContentOpen=true;
849 }
850 }
851 }
852 }
853
854 if(isFileContentOpen && !m_SelectedFileContent.empty()){
855 ImGui::Begin("File Content",&isFileContentOpen);
856 ImGui::Text("%s",m_SelectedFileContent.c_str());
857 ImGui::End();
858 }else if(!m_SelectedFileContent.empty()){
859 m_SelectedFileContent.clear();
860 }
861 ImGui::EndChild();
862
863 ImGui::PopStyleColor();
864
865 ImGui::End();
866}
867
871
872void Editor::HdrWindow(bool *open){
873 ImGui::Begin("HDR",open,ImGuiWindowFlags_NoCollapse);
874
876 float gamma=RENDERER->GetGamma();
877 float exposure=RENDERER->GetExposure();
878
879 const char *items[]={"Reinhard","Filmic","Uncharted2","ACES","Exponential","Logarithmic","Mantiuk"};
880 static int current_item;
881
882 std::string tonemapName=TonemapTypeToString(tonemap);
883 for(int i=0;i<IM_ARRAYSIZE(items);i++){
884 if(tonemapName==items[i]){
885 current_item=i;
886 break;
887 }
888 }
889
890 static int old_item=current_item;
891
892 ImGui::Combo("Tonemap Type",&current_item,items,IM_ARRAYSIZE(items));
893
894 bool update=false;
895
896 if(current_item!=old_item){
897 tonemap=StringToTonemapType(items[current_item]);
898 old_item=current_item;
899 RENDERER->SetTonemapType(tonemap);
900 update=true;
901 }
902
903 if(ImGui::SliderFloat("Gamma",&gamma,0.0f,10.0f)){
904 RENDERER->SetGamma(gamma);
905 update=true;
906 }
907
908 if(ImGui::SliderFloat("Exposure",&exposure,0.0f,10.0f)){
909 RENDERER->SetExposure(exposure);
910 update=true;
911 }
912
913 if(update){
915 }
916
917 ImGui::End();
918}
919
920void Editor::SerializeProject(){
921 printf("Starting serialization of project in file %s\n",m_ProjectPath.c_str());
922
923 YAML::Emitter out;
924 out<<YAML::BeginMap;
925 out<<YAML::Key<<"WindowName"<<YAML::Value<<WINDOW_NAME;
926 out<<YAML::Key<<"WindowWidth"<<YAML::Value<<WINDOW_WIDTH;
927 out<<YAML::Key<<"WindowHeight"<<YAML::Value<<WINDOW_HEIGHT;
928 out<<YAML::Key<<"FullscreenWidth"<<YAML::Value<<FULLSCREEN_WIDTH;
929 out<<YAML::Key<<"FullscreenHeight"<<YAML::Value<<FULLSCREEN_HEIGHT;
930 out<<YAML::Key<<"ScenePath"<<YAML::Value<<SCENE_PATH;
931 out<<YAML::Key<<"Resizable"<<YAML::Value<<RESIZABLE;
932
933 out<<YAML::Key<<"ToneMap"<<YAML::Value<<TonemapTypeToString(RENDERER->GetTonemapType());
934 out<<YAML::Key<<"Gamma"<<YAML::Value<<RENDERER->GetGamma();
935 out<<YAML::Key<<"Exposure"<<YAML::Value<<RENDERER->GetExposure();
936 out<<YAML::EndMap;
937
938 FILE *fout=fopen(m_ProjectPath.c_str(),"w");
939 if(fout==NULL){
940 printf("Failed to open scene file %s: %s\n",m_ProjectPath.c_str(),strerror(errno));
941 return;
942 }
943 fprintf(fout,"%s",out.c_str());
944 fclose(fout);
945 printf("Serialization of scene file %s completed\n",m_ProjectPath.c_str());
946}
947
948void Editor::DeserializeProject(){
949 YAML::Node data=YAML::LoadFile(m_ProjectPath);
950
951 //to add: error handling
952
953 WINDOW_NAME=data["WindowName"].as<std::string>();
954 WINDOW_WIDTH=data["WindowWidth"].as<unsigned int>();
955 WINDOW_HEIGHT=data["WindowHeight"].as<unsigned int>();
956 FULLSCREEN_WIDTH=data["FullscreenWidth"].as<unsigned int>();
957 FULLSCREEN_HEIGHT=data["FullscreenHeight"].as<unsigned int>();
958 SCENE_PATH=data["ScenePath"].as<std::string>();
959 RESIZABLE=data["Resizable"].as<bool>();
960
961 RENDERER->SetTonemapType(StringToTonemapType(data["ToneMap"].as<std::string>()));
962 RENDERER->SetGamma(data["Gamma"].as<float>());
963 RENDERER->SetExposure(data["Exposure"].as<float>());
964
966}
967
968void Editor::HandleInputs(){
969 // KeyState left_arrow=INPUT->GetKey(KEY_LEFT);
970 // if(left_arrow.current==BUTTON_DOWN){
971 // m_Camera.Move(-0.1f,0);
972 // }
973
974 // KeyState right_arrow=INPUT->GetKey(KEY_RIGHT);
975 // if(right_arrow.current==BUTTON_DOWN){
976 // m_Camera.Move(0.1f,0);
977 // }
978
979 // KeyState up_arrow=INPUT->GetKey(KEY_UP);
980 // if(up_arrow.current==BUTTON_DOWN){
981 // m_Camera.Move(0,0.1f);
982 // }
983
984 // KeyState down_arrow=INPUT->GetKey(KEY_DOWN);
985 // if(down_arrow.current==BUTTON_DOWN){
986 // m_Camera.Move(0,-0.1f);
987 // }
988
989 static Vec2 lastMousePos;
990 static bool wheelPressed=false;
991
993 if(wheel.current && !wheel.previous){
994 lastMousePos=INPUT->GetMousePosition();
995 if(lastMousePos.x>=m_ScenePos.x && lastMousePos.x<=m_ScenePos.x+m_SceneSize.x && lastMousePos.y<=m_ScenePos.y && lastMousePos.y>=m_ScenePos.y-m_SceneSize.y){
996 wheelPressed=true;
997 }
998 }
999
1000 if(wheel.current && wheelPressed){
1001 Vec2 currentMousePos=INPUT->GetMousePosition();
1002 m_Camera.Move(lastMousePos.x-currentMousePos.x,lastMousePos.y-currentMousePos.y);
1003 lastMousePos=currentMousePos;
1004 }
1005
1006 if(!wheel.current && wheel.previous){
1007 wheelPressed=false;
1008 }
1009}
#define KEY_P
Definition buttons.hpp:39
#define MOUSE_BUTTON_MIDDLE
Definition buttons.hpp:139
std::shared_ptr< SpriteSheet > m_AnimatedTexture
Definition entity.hpp:189
float m_RestitutionThreshold
Definition entity.hpp:234
glm::mat4 GetViewProjMatrix() const
Definition camera.hpp:28
Vec2 GetPosition() const
Definition camera.hpp:75
void DrawSceneProj()
Definition camera.cpp:68
void Move(float x_offset, float y_offset)
Definition camera.cpp:89
void InitializeProj()
Definition camera.cpp:11
glm::mat4 GetProjMatrix() const
Definition camera.hpp:27
void ResetSceneProj()
Definition camera.cpp:75
void SetPosition(Vec2 pos)
Definition camera.cpp:82
Editor(unsigned int width, unsigned int height, float fullscreen_width, float fullscreen_height, bool resizable=false)
Definition editor.cpp:24
void OnImGuiUpdate()
Definition editor.cpp:169
void HighlightEntity(uint32_t uid)
Definition editor.cpp:120
void OnImGuiRender()
Definition editor.cpp:868
~Editor()
Definition editor.cpp:62
void Run()
Definition editor.cpp:68
void OnSceneRender()
Definition editor.cpp:116
float m_PreviousX
Definition entity.hpp:334
float m_X
Definition entity.hpp:333
float m_Y
Definition entity.hpp:333
float m_PreviousY
Definition entity.hpp:334
std::pair< uint32_t, std::shared_ptr< TextRenderer > > UpdateFont(uint32_t font_id, const std::string &path, int glyph_size, bool fixed)
unsigned int GetColorbufferID()
void UpdateStates()
Definition input.cpp:5
Vec2 GetMousePosition()
Definition input.cpp:17
KeyState GetKey(int key)
Definition input.hpp:20
KeyState GetMouseButton(int button)
Definition input.hpp:24
float m_XOffset
Definition entity.hpp:271
void SetCentered(float width, float height)
Definition entity.cpp:140
LightType m_Type
Definition entity.hpp:274
float m_YOffset
Definition entity.hpp:271
static void ImGui_End_Frame()
void SetPointSize(float new_size)
Definition renderer.cpp:423
void Clear(bool ambient_light=false) const
Definition renderer.cpp:732
static void ImGui_Close()
void DrawCircle(Vec2 pos, Vec4 color, float border, int layer)
Definition renderer.cpp:382
TonemapType GetTonemapType()
Definition renderer.cpp:234
void SetLineWidth(float new_size)
Definition renderer.cpp:411
float GetGamma()
Definition renderer.cpp:242
void SetGamma(float gamma)
Definition renderer.cpp:238
float GetExposure()
Definition renderer.cpp:250
void SetExposure(float exposure)
Definition renderer.cpp:246
void StartScene()
Definition renderer.cpp:446
static void ImGui_Theme()
void SetTonemapType(TonemapType type)
Definition renderer.cpp:230
void ReloadShaders()
Definition renderer.cpp:947
void DrawLine(Vec2 pos1, Vec2 pos2, Vec4 color, int layer)
Definition renderer.cpp:396
void DrawScene()
Definition renderer.cpp:481
static void ImGui_Start_Frame()
static void ImGui_Init()
void Render(bool post_processing=false)
Definition renderer.cpp:565
float GetPointSize()
Definition renderer.cpp:430
BodyType m_BodyType
Definition entity.hpp:211
static void PlayButton(std::vector< std::pair< std::string, uint32_t > > &script_components)
void SetScene(Scene *scene)
void Serialize(const std::string &path, std::vector< std::pair< std::string, uint32_t > > &script_components)
Definition scene.hpp:6
void AddComponent(uint32_t uid, Args...args)
Definition scene.hpp:79
uint32_t AddEntity()
Definition scene.cpp:42
void RemoveComponent(uint32_t uid)
T * GetComponent(uint32_t uid)
void Render()
Definition scene.cpp:282
void RemoveEntity(uint32_t uid)
Definition scene.cpp:60
Entity * GetEntity(uint32_t uid)
Definition scene.cpp:51
std::vector< Entity > & GetEntities()
Definition scene.cpp:337
std::string m_Tag
Definition entity.hpp:111
float m_Scale
Definition entity.hpp:316
bool m_IgnoreLighting
Definition entity.hpp:318
std::shared_ptr< TextRenderer > m_TextRenderer
Definition entity.hpp:312
std::string m_Text
Definition entity.hpp:313
void SetCentered(float width, float height)
Definition entity.cpp:191
std::string m_FontPath
std::shared_ptr< Texture > m_Texture
Definition entity.hpp:143
uint32_t m_TexID
Definition texture.hpp:77
int m_MinFilter
Definition texture.hpp:79
std::string m_FilePath
Definition texture.hpp:78
int m_MagFilter
Definition texture.hpp:79
int m_Width
Definition texture.hpp:81
std::pair< uint32_t, std::shared_ptr< Texture > > UpdateTexture(uint32_t texture_id, const std::string &path, int mag_filter, int min_filter)
std::pair< uint32_t, std::shared_ptr< SpriteSheet > > UpdateSpriteSheet(uint32_t texture_id, const std::string &path, unsigned int tile_width, unsigned int tile_height, int mag_filter, int min_filter)
unsigned int FULLSCREEN_WIDTH
Definition editor.cpp:19
#define STRLEN
Definition editor.cpp:14
std::string WINDOW_NAME
Definition editor.cpp:16
unsigned int WINDOW_HEIGHT
Definition editor.cpp:18
unsigned int WINDOW_WIDTH
Definition editor.cpp:17
bool RESIZABLE
Definition editor.cpp:22
#define baseFontSize
Definition editor.cpp:13
std::string SCENE_PATH
Definition editor.cpp:21
unsigned int FULLSCREEN_HEIGHT
Definition editor.cpp:20
unsigned int FULLSCREEN_WIDTH
Definition editor.cpp:19
std::string WINDOW_NAME
Definition editor.cpp:16
unsigned int WINDOW_HEIGHT
Definition editor.cpp:18
unsigned int WINDOW_WIDTH
Definition editor.cpp:17
bool RESIZABLE
Definition editor.cpp:22
std::string SCENE_PATH
Definition editor.cpp:21
unsigned int FULLSCREEN_HEIGHT
Definition editor.cpp:20
float Interpolate(float current, float previous)
Definition entity.hpp:83
@ LIGHT_AROUND_POS_COLL
Definition global.hpp:8
@ ALL_LIGHT
Definition global.hpp:8
@ LIGHT_AROUND_POS
Definition global.hpp:8
GLFWwindow * Window
Definition window.cpp:225
float Height
Definition window.hpp:43
float BaseWidth
Definition window.cpp:228
const float MAX_WIDTH
Definition window.cpp:251
bool ProjUpdate
Definition window.cpp:242
int InitGlfwWindow(const char *window_name, bool resizable)
Definition window.cpp:71
float Width
Definition window.cpp:227
float MAX_HEIGHT
Definition window.cpp:252
float FullscreenWidth
Definition window.cpp:229
float BaseHeight
Definition window.hpp:44
float FullscreenHeight
Definition window.hpp:45
TonemapType
Definition renderer.hpp:26
std::string TonemapTypeToString(TonemapType type)
Definition renderer.cpp:127
TonemapType StringToTonemapType(const std::string &type)
Definition renderer.cpp:151
fclose(fkey)
auto entities
YAML::Node data
int i
char ch
bool previous
Definition input.hpp:11
bool current
Definition input.hpp:10
float y
Definition structs.hpp:9
float x
Definition structs.hpp:5
float r
Definition structs.hpp:17
bool StartNode(const std::string &name, enum ImGuiTreeNodeFlags_ flags=ImGuiTreeNodeFlags_None)
Definition utilities.cpp:13
float GetWidthPercentageInPx(float percentage)
Definition utilities.cpp:5
TexturesManager * TEXTURES_MANAGER
The textures manager.
Definition window.cpp:15
FontManager * FONT_MANAGER
The font manager.
Definition window.cpp:16
Renderer * RENDERER
The main renderer.
Definition window.cpp:12
Input * INPUT
The input manager.
Definition window.cpp:14