7#include <IconsFontAwesome6.h>
11#include <Instrumentor.h>
13#define baseFontSize 24.0f
24Editor::Editor(
unsigned int width,
unsigned int height,
float fullscreen_width,
float fullscreen_height,
bool resizable){
37 m_SceneSerializer->
SetScene(m_Scene);
40 m_SceneSerializer->Deserialize(
"test.scene",m_ScriptComponents);
45 ImGuiIO &io=ImGui::GetIO();
46 io.Fonts->AddFontDefault();
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");
64 delete m_SceneFramebuffer;
71 #ifdef ENABLE_PROFILING
83 #ifdef ENABLE_PROFILING
86 Instrumentor::Get().BeginSession(
"Editor",
"Editor.json");
94 RENDERER->DrawEditorScene(m_SceneFramebuffer);
108 #ifdef ENABLE_PROFILING
110 Instrumentor::Get().EndSession();
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);
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);
143 Window::VertexCount-=8;
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);
153 Window::VertexCount-=8;
163 Window::VertexCount-=1;
173 if(ImGui::BeginMainMenuBar()){
174 tempvec=ImGui::GetWindowSize();
175 if(ImGui::BeginMenu(
"File")){
176 if(ImGui::MenuItem(
"New")){
179 m_SceneSerializer->
SetScene(m_Scene);
181 if(ImGui::MenuItem(
"Open")){
182 nfdchar_t *outPath=NULL;
183 nfdresult_t result=NFD_OpenDialog(
"scene",NULL,&outPath);
185 if(result==NFD_OKAY){
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());
194 if(ImGui::MenuItem(
"Save")){
195 m_SceneSerializer->
Serialize(m_ScenePath,m_ScriptComponents);
198 if(ImGui::MenuItem(
"Save As")){
199 nfdchar_t *outPath=NULL;
200 nfdresult_t result=NFD_SaveDialog(
"scene",NULL,&outPath);
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());
209 if(ImGui::MenuItem(
"Exit")){
214 if(ImGui::BeginMenu(
"Edit")){
217 if(ImGui::BeginMenu(
"Reload")){
218 if(ImGui::MenuItem(
"Reload Shaders")){
223 if(ImGui::BeginMenu(
"Effects")){
224 if(ImGui::MenuItem(
"HDR")){
229 ImGui::EndMainMenuBar();
231 HdrWindow(&m_HdrOpen);
235 EntitiesMenu({0,tempvec.y});
240 ImGui::Begin(
"Viewport",
nullptr,ImGuiWindowFlags_NoMove|ImGuiWindowFlags_NoResize|ImGuiWindowFlags_NoCollapse|ImGuiWindowFlags_NoTitleBar);
248 ImGui::Image((
void*)m_SceneFramebuffer->
GetColorbufferID(),ImGui::GetContentRegionAvail(),ImVec2(0,1),ImVec2(1,0));
251 ImVec2 pos=ImGui::GetCursorPos();
259 ImGui::SetCursorPos({10,10});
260 ImGui::Text(
"(%.2f, %.2f)",cameraPos.
x,cameraPos.
y);
262 if(ImGui::Button(
"Reset")){
271void Editor::EntitiesMenu(ImVec2 pos){
272 ImGui::Begin(
"Entities",
nullptr,ImGuiWindowFlags_NoMove|ImGuiWindowFlags_NoResize|ImGuiWindowFlags_NoCollapse|ImGuiWindowFlags_NoTitleBar);
273 ImGui::SetWindowPos(pos);
283 name=
"Entity "+std::to_string(k);
288 if(ImGui::Selectable(name.c_str())){
289 if(m_SelectedEntity!=e.m_UID){
290 m_SelectedEntity=e.m_UID;
292 m_SelectedEntity=std::numeric_limits<uint32_t>::max();
295 ImGui::OpenPopupOnItemClick(
"EntityPopup",ImGuiPopupFlags_MouseButtonRight);
296 if(ImGui::BeginPopupContextItem(
"EntityPopup")){
297 if(ImGui::MenuItem(
"Remove Entity")){
307 if(ImGui::IsWindowHovered() && !ImGui::IsAnyItemHovered() && ImGui::IsMouseClicked(ImGuiMouseButton_Right)){
308 ImGui::OpenPopup(
"CreateEntityPopup");
311 if(ImGui::BeginPopup(
"CreateEntityPopup")){
312 if(ImGui::MenuItem(
"Create Entity")){
321void Editor::ComponentsMenu(ImVec2 pos){
322 ImGui::Begin(
"Components",
nullptr,ImGuiWindowFlags_NoMove|ImGuiWindowFlags_NoResize|ImGuiWindowFlags_NoCollapse|ImGuiWindowFlags_NoTitleBar);
323 ImGui::SetWindowPos(pos);
329 ImGui::SliderFloat(
"X",&e->
m_X,-30.0f,30.0f);
330 ImGui::SliderFloat(
"Y",&e->
m_Y,-30.0f,30.0f);
335 ImGui::PushItemWidth(ImGui::GetWindowWidth()*0.5f);
340 ImGui::InputText(
"Tag",&tag_component->
m_Tag[0],tag_component->
m_Tag.size());
343 ImGui::OpenPopupOnItemClick(
"TagComponentPopup",ImGuiPopupFlags_MouseButtonRight);
344 if(ImGui::BeginPopupContextItem(
"TagComponentPopup")){
345 if(ImGui::MenuItem(
"Remove Component")){
353 if(texture_component){
355 if(ImGui::Button(
"Reload Texture")){
361 ImGui::InputText(
"Path",&texture_component->
m_Texture.get()->m_FilePath[0],
STRLEN);
363 int selectedMagFilter,selectedMinFilter;
365 if(texture_component->
m_Texture.get()->m_MagFilter==GL_LINEAR){
371 if(texture_component->
m_Texture.get()->m_MinFilter==GL_LINEAR){
377 ImGui::Combo(
"Mag Filter",&selectedMagFilter,
"Linear\0Nearest\0");
378 ImGui::Combo(
"Min Filter",&selectedMinFilter,
"Linear\0Nearest\0");
380 if(selectedMagFilter==0){
381 texture_component->
m_Texture.get()->m_MagFilter=GL_LINEAR;
383 texture_component->
m_Texture.get()->m_MagFilter=GL_NEAREST;
386 if(selectedMinFilter==0){
387 texture_component->
m_Texture.get()->m_MinFilter=GL_LINEAR;
389 texture_component->
m_Texture.get()->m_MinFilter=GL_NEAREST;
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);
397 ImGui::OpenPopupOnItemClick(
"TextureComponentPopup",ImGuiPopupFlags_MouseButtonRight);
398 if(ImGui::BeginPopupContextItem(
"TextureComponentPopup")){
399 if(ImGui::MenuItem(
"Remove Component")){
407 if(animated_texture_component){
408 if(
StartNode(
"AnimatedTextureComponent")){
409 if(ImGui::Button(
"Reload Texture")){
417 int selectedMagFilter,selectedMinFilter;
431 ImGui::Combo(
"Mag Filter",&selectedMagFilter,
"Linear\0Nearest\0");
432 ImGui::Combo(
"Min Filter",&selectedMinFilter,
"Linear\0Nearest\0");
434 if(selectedMagFilter==0){
440 if(selectedMinFilter==0){
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);
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);
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);
460 ImGui::OpenPopupOnItemClick(
"AnimatedTextureComponentPopup",ImGuiPopupFlags_MouseButtonRight);
461 if(ImGui::BeginPopupContextItem(
"AnimatedTextureComponentPopup")){
462 if(ImGui::MenuItem(
"Remove Component")){
470 if(rigidbody_component){
472 const char *bodyTypes[]={
"Static",
"Dynamic",
"Kinematic"};
486 ImGui::Combo(
"Body Type",¤tBodyType,bodyTypes,3);
488 switch(currentBodyType){
505 ImGui::OpenPopupOnItemClick(
"RigidbodyComponentPopup",ImGuiPopupFlags_MouseButtonRight);
506 if(ImGui::BeginPopupContextItem(
"RigidbodyComponentPopup")){
507 if(ImGui::MenuItem(
"Remove Component")){
515 if(box_collider_component){
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);
527 ImGui::OpenPopupOnItemClick(
"BoxColliderComponentPopup",ImGuiPopupFlags_MouseButtonRight);
528 if(ImGui::BeginPopupContextItem(
"BoxColliderComponentPopup")){
529 if(ImGui::MenuItem(
"Remove Component")){
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);
548 ImGui::OpenPopupOnItemClick(
"CircleColliderComponentPopup",ImGuiPopupFlags_MouseButtonRight);
549 if(ImGui::BeginPopupContextItem(
"CircleColliderComponentPopup")){
550 if(ImGui::MenuItem(
"Remove Component")){
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);
566 const char *lightTypes[]={
"All Light",
"Spot Light",
"Spot Light (Collisions on)"};
567 int currentLightType;
568 switch(light_component->
m_Type){
580 ImGui::Combo(
"Light Type",¤tLightType,lightTypes,3);
582 switch(currentLightType){
594 if(ImGui::Button(
"Center Light")){
596 if(texture_component){
600 if(animated_texture_component){
608 ImGui::OpenPopupOnItemClick(
"LightComponentPopup",ImGuiPopupFlags_MouseButtonRight);
609 if(ImGui::BeginPopupContextItem(
"LightComponentPopup")){
610 if(ImGui::MenuItem(
"Remove Component")){
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)){
632 if(ImGui::Button(
"Reload Font")){
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")){
642 if(texture_component){
646 if(animated_texture_component){
651 ImGui::SliderFloat(
"Scale",&text_component->
m_Scale,0.0f,10.0f);
652 ImGui::ColorEdit3(
"Color",&text_component->
m_Color.
r);
655 ImGui::SliderInt(
"Layer",&text_component->
m_Layer,-100,100);
659 ImGui::OpenPopupOnItemClick(
"TextComponentPopup",ImGuiPopupFlags_MouseButtonRight);
660 if(ImGui::BeginPopupContextItem(
"TextComponentPopup")){
661 if(ImGui::MenuItem(
"Remove Component")){
668 for(
int i=0;
i<m_ScriptComponents.size();
i++){
669 auto &[name,id]=m_ScriptComponents[
i];
670 if(
id==m_SelectedEntity){
672 ImGui::InputText(
"Function Name",&name[0],name.size());
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);
685 ImGui::PopItemWidth();
687 if(ImGui::IsWindowHovered() && !ImGui::IsAnyItemHovered() && ImGui::IsMouseClicked(ImGuiMouseButton_Right)){
688 ImGui::OpenPopup(
"AddComponentPopup");
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){
697 if(ImGui::MenuItem(
"Texture Component")){
702 if(ImGui::MenuItem(
"Animated Texture Component")){
707 if(ImGui::MenuItem(
"Rigidbody Component")){
712 if(ImGui::MenuItem(
"Box Collider Component")){
717 if(ImGui::MenuItem(
"Circle Collider Component")){
722 if(ImGui::MenuItem(
"Light Component")){
723 if(m_SelectedEntity!=std::numeric_limits<uint32_t>::max() && m_Scene->
GetComponent<
LightComponent>(m_SelectedEntity)==
nullptr){
727 if(ImGui::MenuItem(
"Text Component")){
728 if(m_SelectedEntity!=std::numeric_limits<uint32_t>::max() && m_Scene->
GetComponent<
TextComponent>(m_SelectedEntity)==
nullptr){
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});
746void Editor::DataMenu(ImVec2 pos){
747 ImGui::Begin(
"Data",
nullptr,ImGuiWindowFlags_NoMove|ImGuiWindowFlags_NoResize|ImGuiWindowFlags_NoCollapse|ImGuiWindowFlags_NoTitleBar);
748 ImGui::SetWindowPos(pos);
751 ImGui::Text(
"Vertices Count: %d",Window::VertexCount);
752 ImGui::Text(
"Draw Calls: %d",Window::DrawCalls);
757void Editor::VariablesMenu(ImVec2 pos){
758 ImGui::Begin(
"Variables",
nullptr,ImGuiWindowFlags_NoMove|ImGuiWindowFlags_NoResize|ImGuiWindowFlags_NoCollapse|ImGuiWindowFlags_NoTitleBar);
759 ImGui::SetWindowPos(pos);
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);
765 ImGui::Dummy(ImVec2(0.0f,ImGui::GetTextLineHeight()));
767 ImGui::Text(
"Window variables:");
779void Editor::FileBrowserMenu(ImVec2 pos){
780 ImGui::Begin(
"FileBrowser",
nullptr,ImGuiWindowFlags_NoMove|ImGuiWindowFlags_NoResize|ImGuiWindowFlags_NoCollapse|ImGuiWindowFlags_NoTitleBar);
781 ImGui::SetWindowPos(pos);
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();
799 if(m_CurrentEntries.empty() || m_UpdateFiles){
802 m_CurrentEntries.clear();
805 for(
auto &entry:std::filesystem::directory_iterator(m_CurrentPath)){
806 m_CurrentEntries.push_back(entry);
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()){
814 if(!a.is_directory() && b.is_directory()){
817 return a.path()<b.path();
824 ImGui::Text(
"Current Path: %s",m_CurrentPath.c_str());
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();
837 if(ImGui::Selectable((ICON_FA_FILE+entry.path().filename().string()).c_str())){
838 FILE *file=fopen(entry.path().string().c_str(),
"r");
842 m_SelectedFileContent.clear();
843 while((
ch=fgetc(file))!=EOF){
844 m_SelectedFileContent+=
ch;
848 isFileContentOpen=
true;
854 if(isFileContentOpen && !m_SelectedFileContent.empty()){
855 ImGui::Begin(
"File Content",&isFileContentOpen);
856 ImGui::Text(
"%s",m_SelectedFileContent.c_str());
858 }
else if(!m_SelectedFileContent.empty()){
859 m_SelectedFileContent.clear();
863 ImGui::PopStyleColor();
872void Editor::HdrWindow(
bool *open){
873 ImGui::Begin(
"HDR",open,ImGuiWindowFlags_NoCollapse);
879 const char *items[]={
"Reinhard",
"Filmic",
"Uncharted2",
"ACES",
"Exponential",
"Logarithmic",
"Mantiuk"};
880 static int current_item;
883 for(
int i=0;
i<IM_ARRAYSIZE(items);
i++){
884 if(tonemapName==items[
i]){
890 static int old_item=current_item;
892 ImGui::Combo(
"Tonemap Type",¤t_item,items,IM_ARRAYSIZE(items));
896 if(current_item!=old_item){
898 old_item=current_item;
903 if(ImGui::SliderFloat(
"Gamma",&gamma,0.0f,10.0f)){
908 if(ImGui::SliderFloat(
"Exposure",&exposure,0.0f,10.0f)){
920void Editor::SerializeProject(){
921 printf(
"Starting serialization of project in file %s\n",m_ProjectPath.c_str());
925 out<<YAML::Key<<
"WindowName"<<YAML::Value<<
WINDOW_NAME;
926 out<<YAML::Key<<
"WindowWidth"<<YAML::Value<<
WINDOW_WIDTH;
930 out<<YAML::Key<<
"ScenePath"<<YAML::Value<<
SCENE_PATH;
931 out<<YAML::Key<<
"Resizable"<<YAML::Value<<
RESIZABLE;
938 FILE *fout=fopen(m_ProjectPath.c_str(),
"w");
940 printf(
"Failed to open scene file %s: %s\n",m_ProjectPath.c_str(),strerror(errno));
943 fprintf(fout,
"%s",out.c_str());
945 printf(
"Serialization of scene file %s completed\n",m_ProjectPath.c_str());
948void Editor::DeserializeProject(){
949 YAML::Node
data=YAML::LoadFile(m_ProjectPath);
968void Editor::HandleInputs(){
989 static Vec2 lastMousePos;
990 static bool wheelPressed=
false;
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){
1000 if(wheel.
current && wheelPressed){
1002 m_Camera.
Move(lastMousePos.
x-currentMousePos.
x,lastMousePos.
y-currentMousePos.
y);
1003 lastMousePos=currentMousePos;
std::shared_ptr< SpriteSheet > m_AnimatedTexture
float m_RestitutionThreshold
glm::mat4 GetViewProjMatrix() const
void Move(float x_offset, float y_offset)
glm::mat4 GetProjMatrix() const
void SetPosition(Vec2 pos)
float m_RestitutionThreshold
Editor(unsigned int width, unsigned int height, float fullscreen_width, float fullscreen_height, bool resizable=false)
void HighlightEntity(uint32_t uid)
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 SetCentered(float width, float height)
static void ImGui_End_Frame()
void SetPointSize(float new_size)
void Clear(bool ambient_light=false) const
static void ImGui_Close()
void DrawCircle(Vec2 pos, Vec4 color, float border, int layer)
TonemapType GetTonemapType()
void SetLineWidth(float new_size)
void SetGamma(float gamma)
void SetExposure(float exposure)
static void ImGui_Theme()
void SetTonemapType(TonemapType type)
void DrawLine(Vec2 pos1, Vec2 pos2, Vec4 color, int layer)
static void ImGui_Start_Frame()
void Render(bool post_processing=false)
void SetScene(Scene *scene)
void Serialize(const std::string &path, std::vector< std::pair< std::string, uint32_t > > &script_components)
void AddComponent(uint32_t uid, Args...args)
void RemoveComponent(uint32_t uid)
T * GetComponent(uint32_t uid)
void RemoveEntity(uint32_t uid)
Entity * GetEntity(uint32_t uid)
std::vector< Entity > & GetEntities()
std::shared_ptr< TextRenderer > m_TextRenderer
void SetCentered(float width, float height)
std::shared_ptr< Texture > m_Texture
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
unsigned int WINDOW_HEIGHT
unsigned int WINDOW_WIDTH
unsigned int FULLSCREEN_HEIGHT
unsigned int FULLSCREEN_WIDTH
unsigned int WINDOW_HEIGHT
unsigned int WINDOW_WIDTH
unsigned int FULLSCREEN_HEIGHT
float Interpolate(float current, float previous)
int InitGlfwWindow(const char *window_name, bool resizable)
std::string TonemapTypeToString(TonemapType type)
TonemapType StringToTonemapType(const std::string &type)
bool StartNode(const std::string &name, enum ImGuiTreeNodeFlags_ flags=ImGuiTreeNodeFlags_None)
float GetWidthPercentageInPx(float percentage)
TexturesManager * TEXTURES_MANAGER
The textures manager.
FontManager * FONT_MANAGER
The font manager.
Renderer * RENDERER
The main renderer.
Input * INPUT
The input manager.