2026-02-03 03:53:40 +01:00

97 lines
2.8 KiB
ActionScript

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;
}
}