36 EditorLayer* EditorLayer::s_Instance =
nullptr;
38 EditorLayer::EditorLayer()
48 void EditorLayer::OnAttach()
54 m_CameraObject->AddComponent<EditorCamera>(60.0f);
58 "editor://Shaders/grid.vert",
59 "editor://Shaders/grid.frag",
64 gridMaterial->Set<glm::vec4>(
"lineColor", { 0.9, 0.9, 0.9, 0.5 });
65 gridMaterial->Set<glm::vec4>(
"backgroundColor", { 0.6, 0.6, 0.6, 0.025 });
71 RenderState& state = gridModel.GetRenderState();
72 state.Cullface =
false;
73 state.DepthWrite =
true;
74 state.DepthTest =
true;
75 gridModel.SetMaterial(gridMaterial);
76 m_GridObject->SetScale({ 50, 50, 50 });
78 CreateWidget<SkyboxEditorWidget>();
81 void EditorLayer::OnUpdate()
83 for (
auto& widgetPtr : m_widgets)
84 widgetPtr->OnUpdate();
86 m_EditorScene->UpdateScene();
91 void EditorLayer::OnRender()
94 glm::vec3 camPos = m_CameraObject->GetPosition();
97 m_GridShader->SetProjectionViewMatrix(*GetCamera());
98 m_GridObject->SetPosition({ camPos.x, 0, camPos.z });
100 m_EditorScene->RenderScene(GetCamera());
102 if (m_SelectedObject.lock())
104 m_SelectedObject.lock()->RenderWhenSelected();
108 void EditorLayer::OnImGuiRender()
110 ImGuiIO& io = ImGui::GetIO();
113 if (ImGui::BeginMainMenuBar())
115 if (ImGui::BeginMenu(
"File"))
119 if (ImGui::MenuItem(
"New project")) { }
120 if (ImGui::MenuItem(
"Open project")) { }
121 if (ImGui::MenuItem(
"Save")) { }
122 if (ImGui::MenuItem(
"Exit")) { exit(0); }
126 if (ImGui::BeginMenu(
"Edit"))
129 if (ImGui::MenuItem(
"Undo")) { }
130 if (ImGui::MenuItem(
"Redo")) { }
134 if (ImGui::BeginMenu(
"Objects"))
137 if (ImGui::MenuItem(
"Cube")) {
142 if (ImGui::MenuItem(
"Plane")) {
147 if (ImGui::MenuItem(
"Quad")) {
152 if (ImGui::MenuItem(
"UV Sphere")) {
161 if (ImGui::BeginMenu(
"Preferences"))
163 if (ImGui::BeginMenu(
"Theme"))
178 ImGui::EndMainMenuBar();
181 ImGuiViewport* viewport = ImGui::GetMainViewport();
183 float toolbarHeight = 50.0f;
185 ImGui::SetNextWindowPos(ImVec2(viewport->Pos.x, viewport->Pos.y + toolbarHeight + ImGui::GetFrameHeight()));
186 ImGui::SetNextWindowSize(ImVec2(viewport->Size.x, viewport->Size.y - ImGui::GetFrameHeight() - toolbarHeight));
187 ImGui::SetNextWindowViewport(viewport->ID);
189 ImGuiWindowFlags window_flags = ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse |
190 ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoBringToFrontOnFocus |
191 ImGuiWindowFlags_NoNavFocus | ImGuiWindowFlags_NoBackground;
193 ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0, 0));
194 ImGui::Begin(
"DockSpaceWindow",
nullptr, window_flags);
196 ImGuiID dockspace_id = ImGui::GetID(
"MyDockspace");
197 ImGui::DockSpace(dockspace_id, ImVec2(0.0f, 0.0f), ImGuiDockNodeFlags_None);
200 ImGui::PopStyleVar();
202 ImGui::SetNextWindowPos(viewport->Pos + ImVec2(0, ImGui::GetFrameHeight()));
203 ImGui::SetNextWindowSize(ImVec2(viewport->Size.x, toolbarHeight));
204 ImGuiWindowFlags toolbarFlags = ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize |
205 ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoDocking;
207 ImGui::Begin(
"Toolbar",
nullptr, toolbarFlags);
209 ImGui::SetCursorPosX(viewport->Size.x / 2 - toolbarHeight);
212 ImTextureID playTexID = isPlaying ? (ImTextureID)m_pauseTexture->GetNativeHandle() : (ImTextureID)m_playTexture->GetNativeHandle();
213 ImGui::BeginDisabled(!isPlaying && !canPlay);
214 if (ImGui::ImageButton(isPlaying ?
"Pause" :
"Play", playTexID, ImVec2(32, 32)))
225 ImGui::EndDisabled();
229 ImTextureID stopTexID = isInEditorMode ? (ImTextureID)m_stopTexture->GetNativeHandle() : (ImTextureID)m_coloredStopTexture->GetNativeHandle();
230 ImGui::BeginDisabled(isInEditorMode);
231 if (ImGui::ImageButton(
"Stop", stopTexID, ImVec2(32, 32)))
235 ImGui::EndDisabled();
238 for (
auto& widgetPtr : m_widgets)
239 widgetPtr->OnImGuiRender();
242 void EditorLayer::OnEvent(Event& event)
244 switch (event.GetEventType())
248 KeyEvent& ke = (KeyEvent&)event;
251 Execute(std::make_unique<DeleteGameobjectCommand>(m_SelectedObject));
257 }
else if (ke.GetKeyCode() ==
EE_KEY_Y) {
267 m_EditorScene->Notify(event);
270 EditorCamera* EditorLayer::GetCamera()
272 return m_CameraObject->GetComponent<EditorCamera>();
275 void EditorLayer::SelectObject(std::shared_ptr<GameObject> newSelection)
278 m_SelectedObject = newSelection;
281 m_SelectedObject.reset();
#define EE_KEY_LEFT_CONTROL
static void SetGameState(GameContextState newState)
static const GameContextState & GetGameState()
static Camera * GetRuntime()
static std::shared_ptr< GameObject > Create(std::string name, std::shared_ptr< Scene > scene, std::shared_ptr< GameObject > parent=nullptr)
static MaterialPtr LoadMaterial(const std::shared_ptr< Shader > &shader)
static bool BindShader(const std::shared_ptr< Shader > &shader)
static ScenePtr GetCurrentScene()
static ScenePtr Create(std::string name, SceneType type=SceneType::RuntimeScene)
static std::shared_ptr< Shader > CreateFromFiles(const std::string &vertexSrcPath, const std::string &fragSrcPath)
static TexturePtr CreateFromFile(const std::string &path, TextureType usage=TextureType::Diffuse)
UITheme GetCurrentTheme()
std::shared_ptr< Material > MaterialPtr
std::shared_ptr< Scene > ScenePtr