class ViewportPanel : Panel { FrameBuffer frameBuffer; WorldCamera sceneCamera; EntityEnvironment env; float pitch = 0; float yaw = 0; float vel = 0.02f; void render() { if (!frameBuffer.isValid()) return; int x = ImGui::getAvailableSizeX(); int y = ImGui::getAvailableSizeY(); if (x < 10 || y < 10) return; frameBuffer.resize(x, y); frameBuffer.clearRGBA(0, 0, 0, 255); sceneCamera.camera.aspect = float(x) / y; env.render(frameBuffer, sceneCamera); ImGui::drawFrameBufferCentered(frameBuffer, x, y); if (!ImGui::isPanelActive()) return; if (ImGui::isMouseDragging(key::MouseRight) && !ImGui::isKeyDown(key::MouseMiddle)) { pitch += ImGui::getMouseDeltaY() * 0.1f; yaw += ImGui::getMouseDeltaX() * 0.1f; sceneCamera.transform.rotation.setEuler(vec3(pitch, yaw, 0)); } if (ImGui::isMouseDragging(key::MouseMiddle) && !ImGui::isKeyDown(key::MouseRight)) { vec3 panDir = vec3(); panDir.x -= ImGui::getMouseDeltaX(); panDir.y += ImGui::getMouseDeltaY(); panDir = panDir * vel * 0.4f; sceneCamera.transform.position = sceneCamera.transform.relative(panDir); } vec3 relDir = vec3(); if (ImGui::isKeyDown(key::W)) relDir.z++; if (ImGui::isKeyDown(key::S)) relDir.z--; if (ImGui::isKeyDown(key::D)) relDir.x++; if (ImGui::isKeyDown(key::A)) relDir.x--; relDir = relDir * vel; sceneCamera.transform.position = sceneCamera.transform.relative(relDir); float vertically = 0; if (ImGui::isKeyDown(key::Space)) vertically++; if (ImGui::isKeyDown(key::LeftCtrl)) vertically--; sceneCamera.transform.position = sceneCamera.transform.position + vec3(0, vertically * vel, 0); } void init() { frameBuffer = Resource::createLoadRGBA8FrameBuffer("MainFrameBuffer", 1000, 1000); env = Resource::getMainEntityEnvironment(); sceneCamera.transform.position = vec3(0, 1, -2); sceneCamera.camera.nearZ = 0.1; sceneCamera.camera.farZ = 100; ImGui::disablePanelPadding(true); } void menuBar() { if (ImGui::menuItem("Start")) { } if (ImGui::menuItem("Camera Props")) { ImGui::openPopup("ViewportCameraProps", any()); } ImGui::simplePopup("ViewportCameraProps", SimpleFunction(this.viewportCameraProps)); } void viewportCameraProps() { sceneCamera.camera.fov = ImGui::slider("Fov", sceneCamera.camera.fov / 3.14f * 180, 10, 160) / 180 * 3.14f; } }