From 100f62881aad4ee19df755fa0d1bbef2c1348f18 Mon Sep 17 00:00:00 2001 From: Satvik-Singh192 Date: Tue, 31 Mar 2026 10:47:41 +0530 Subject: [PATCH] feat: added styling to the main menu --- engine/core/rigidbody.hpp | 1 + engine/world/physicsworld.cpp | 1 + engine/world/physicsworld.hpp | 1 + renderer/drawbodies.cpp | 43 +++++++++++++++---- renderer/window.cpp | 81 +++++++++++++++++++++++++++++++++-- renderer/window.hpp | 3 +- 6 files changed, 117 insertions(+), 13 deletions(-) diff --git a/engine/core/rigidbody.hpp b/engine/core/rigidbody.hpp index a8cad69..716b919 100644 --- a/engine/core/rigidbody.hpp +++ b/engine/core/rigidbody.hpp @@ -27,6 +27,7 @@ class Rigidbody { float heat_capacity = 900.0f; float thermal_conductivity = 0.5f; float thermal_emissivity = 0.85f; + float render_alpha = 1.0f; /* - Collider is a pointer cuz if we just write "Collider collider;" then the collider will always be a generic one diff --git a/engine/world/physicsworld.cpp b/engine/world/physicsworld.cpp index 11b22b8..0fe82fa 100644 --- a/engine/world/physicsworld.cpp +++ b/engine/world/physicsworld.cpp @@ -7,6 +7,7 @@ #include #include #include "core/buoyancy.hpp" +PhysicsWorld::PhysicsWorld(float gravi) : gravity(0.0f, gravi, 0.0f), next_body_id(1) {} PhysicsWorld::PhysicsWorld() : gravity(0.0f, PHYSICS_GRAVITY, 0.0f), next_body_id(1) {} std::uint32_t PhysicsWorld::addBody(const Rigidbody &body) diff --git a/engine/world/physicsworld.hpp b/engine/world/physicsworld.hpp index a097b0e..4c5b916 100644 --- a/engine/world/physicsworld.hpp +++ b/engine/world/physicsworld.hpp @@ -54,6 +54,7 @@ class PhysicsWorld { ThermalSettings thermal_settings; ThermalSpawnControls thermal_spawn_controls; + PhysicsWorld(float gravi); PhysicsWorld(); Rigidbody* getBodyByID(uint32_t body_id); std::uint32_t addBody(const Rigidbody& body); diff --git a/renderer/drawbodies.cpp b/renderer/drawbodies.cpp index 1152523..ed779aa 100644 --- a/renderer/drawbodies.cpp +++ b/renderer/drawbodies.cpp @@ -707,11 +707,16 @@ void RenderBodies(PhysicsWorld &world, const Camera &camera, float aspectRatio) } if (solidVerts.empty()) return; - glBufferData(GL_ARRAY_BUFFER, solidVerts.size() * sizeof(float), solidVerts.data(), GL_DYNAMIC_DRAW); - if (smFloor >= 0) - glUniform1f(smFloor, floorFlag); + const bool isSelected = (body.id == GetSelectedBodyId()); - float cr = ar, cg = ag, cb = ab, ca = aa; + float cr = ar; + float cg = ag; + float cb = ab; + float ca = aa; + if (ca < 0.0f) + ca = 0.0f; + if (ca > 1.0f) + ca = 1.0f; if (isSelected && floorFlag < 0.5f) { cr = 1.0f; @@ -719,6 +724,15 @@ void RenderBodies(PhysicsWorld &world, const Camera &camera, float aspectRatio) cb = 0.35f; ca = 1.0f; } + + glColor4f(cr, cg, cb, ca); + if (ca <= 0.0f) + return; + + glBufferData(GL_ARRAY_BUFFER, solidVerts.size() * sizeof(float), solidVerts.data(), GL_DYNAMIC_DRAW); + if (smFloor >= 0) + glUniform1f(smFloor, floorFlag); + if (smCol >= 0) { glUniform4f(smCol, cr, cg, cb, ca); @@ -877,7 +891,7 @@ void RenderBodies(PhysicsWorld &world, const Camera &camera, float aspectRatio) b = thermal.b; } applyBodyTint(r, g, b); - drawSolidBody(body, 0.0f, r, g, b, 1.0f); + drawSolidBody(body, 0.0f, r, g, b, body.render_alpha); } float tintR, tintG, tintB; @@ -897,7 +911,7 @@ void RenderBodies(PhysicsWorld &world, const Camera &camera, float aspectRatio) { if (!looksLikeFloor(body)) continue; - drawSolidBody(body, 1.0f, 0.26f, 0.28f, 0.31f, 0.78f); + drawSolidBody(body, 1.0f, 0.26f, 0.28f, 0.31f, 0.78f * body.render_alpha); } if (world.enable_buoyancy) @@ -947,6 +961,11 @@ void RenderBodies(PhysicsWorld &world, const Camera &camera, float aspectRatio) continue; if (isBuoyancyHelperWallBody(body)) continue; + if (body.render_alpha <= 0.0f) + { + glColor4f(0.0f, 0.0f, 0.0f, 0.0f); + continue; + } const glm::vec3 c(body.position.x, body.position.y, body.position.z); Mat3 R = body.orientation.toMat3(); @@ -1051,11 +1070,15 @@ void RenderBodies(PhysicsWorld &world, const Camera &camera, float aspectRatio) { glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glUniform4f(colorLoc, 0.34f, 0.36f, 0.40f, 0.72f); + float alpha = 0.72f * body.render_alpha; + glUniform4f(colorLoc, 0.34f, 0.36f, 0.40f, alpha); + glColor4f(0.34f, 0.36f, 0.40f, alpha); } else if (isSelected) { - glUniform4f(colorLoc, 1.0f, 1.0f, 0.2f, 1.0f); + float alpha = body.render_alpha; + glUniform4f(colorLoc, 1.0f, 1.0f, 0.2f, alpha); + glColor4f(1.0f, 1.0f, 0.2f, alpha); } else { @@ -1070,7 +1093,9 @@ void RenderBodies(PhysicsWorld &world, const Camera &camera, float aspectRatio) tb = thermal.b; } applyBodyTint(tr, tg, tb); - glUniform4f(colorLoc, tr, tg, tb, 1.0f); + float alpha = body.render_alpha; + glUniform4f(colorLoc, tr, tg, tb, alpha); + glColor4f(tr, tg, tb, alpha); } } if (looksLikeFloor(body)) diff --git a/renderer/window.cpp b/renderer/window.cpp index ff07ebd..f3eb5e6 100644 --- a/renderer/window.cpp +++ b/renderer/window.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include "../engine/world/physicsworld.hpp" #include "camera.hpp" @@ -238,6 +239,56 @@ void CreateWindow(PhysicsWorld &world) simulation_time = 0.0f; frame = 0; }; +PhysicsWorld main_menu_world = PhysicsWorld(-6.0); +BoxCollider horizontal_bound(Vec3(10.0f, 0.5f, 5.0f)); +const uint32_t menu_floor_id = main_menu_world.addBody(Rigidbody(Vec3(0.0f, -1.5f, 0.0f), Vec3(), &horizontal_bound, 0.0f, 0.0f, 1.0f)); // floor +const uint32_t menu_ceiling_id = main_menu_world.addBody(Rigidbody(Vec3(0.0f, 13.5f, 0.0f), Vec3(), &horizontal_bound, 0.0f, 0.0f, 1.0f)); // ceiling +BoxCollider vertical_bound(Vec3(0.5f, 8.0f, 5.0f)); +const uint32_t menu_right_wall_id = main_menu_world.addBody(Rigidbody(Vec3(10.5f, 5.0f, 0.0f), Vec3(), &vertical_bound, 0.0f, 0.0f, 1.0f)); // right +const uint32_t menu_left_wall_id = main_menu_world.addBody(Rigidbody(Vec3(-10.5f, 5.0f, 0.0f), Vec3(), &vertical_bound, 0.0f, 0.0f, 1.0f)); // left +const std::array menu_wall_ids = {menu_floor_id, menu_ceiling_id, menu_right_wall_id, menu_left_wall_id}; +BoxCollider face_bound(Vec3(10.0f, 8.0f, 0.5f)); +// main_menu_world.addBody(Rigidbody(Vec3(0.0f, 5.0f, 5.0f), Vec3(), &face_bound, 0.0f)); // front +// main_menu_world.addBody(Rigidbody(Vec3(0.0f, 5.0f, -5.0f), Vec3(), &face_bound, 0.0f)); // back +double mouseX, mouseY; +SphereCollider cursor_ghost_collider(1.5f); +glfwGetCursorPos(window, &mouseX, &mouseY); + +SphereCollider nig(1.011f); +//main_menu_world.addBody(Rigidbody(Vec3(1.0f, 5.0f, 0.0f),Vec3(),&nig, 0.5f)); +//main_menu_world.addBody(Rigidbody(Vec3(5.0f, 5.0f, 0.0f),Vec3(),&nig, 0.5f)); + +for(int i=0; i<10; i++){ +Rigidbody(Vec3((i-9)*1.0f, 1.0f, 0.0f),Vec3(),&nig, 0.5f); + main_menu_world.addBody(Rigidbody(Vec3((i-9)*1.0f, 5.0f, 0.0f),Vec3(),&nig, 0.5f, 0.0f, 1.1f)); +} +for(int i=0; i<10; i++){ +Rigidbody(Vec3((i-9)*1.0f, 4.0f, 0.0f),Vec3(),&nig, 0.5f); + main_menu_world.addBody(Rigidbody(Vec3((i-9)*1.0f, 5.0f, 0.0f),Vec3(),&nig, 0.5f, 0.0f, 1.1f)); +} +for(int i=0; i<10; i++){ +Rigidbody(Vec3((i-9)*1.0f, 7.0f, 0.0f),Vec3(),&nig, 0.5f); + main_menu_world.addBody(Rigidbody(Vec3((i-9)*1.0f, 5.0f, 0.0f),Vec3(),&nig, 0.5f, 0.0f, 1.1f)); +} +const uint32_t ghost_id=main_menu_world.addBody(Rigidbody(Vec3(0.0f,0.0f ,0.0f),Vec3(),&cursor_ghost_collider,0.0f,0.0f,1.0f)); +// PhysicsWorld can reallocate its body buffer during step(), so always re-fetch the ghost pointer by ID. +auto reacquireGhost = [&]() -> Rigidbody * +{ + return main_menu_world.getBodyByID(ghost_id); +}; +auto enforceMenuInvisibility = [&]() +{ + for (uint32_t wall_id : menu_wall_ids) + { + if (Rigidbody *wall = main_menu_world.getBodyByID(wall_id)) + { + wall->render_alpha = 0.0f; + } + } +}; +enforceMenuInvisibility(); +glfwGetCursorPos(window, &mouseX, &mouseY); + // Loop to render frames while (!glfwWindowShouldClose(window)) @@ -433,10 +484,34 @@ void CreateWindow(PhysicsWorld &world) const ImVec2 displaySize = ImGui::GetIO().DisplaySize; ImGui::SetNextWindowPos(ImVec2(displaySize.x * 0.5f, displaySize.y * 0.5f), ImGuiCond_Always, ImVec2(0.5f, 0.5f)); ImGui::SetNextWindowSize(ImVec2(640.0f, 460.0f), ImGuiCond_Always); - + enforceMenuInvisibility(); + glfwGetCursorPos(window, &mouseX, &mouseY); + mouseY = framebufferHeight - mouseY; + float x = (10.0 * mouseX / framebufferHeight) - 9.0f; + float y = (10.0 * mouseY / framebufferHeight) -0.0f; + Vec3 ghostTarget(x, y, 0.0f); + if (Rigidbody *ghost = reacquireGhost()) + { + ghost->render_alpha = 0.0f; + ghost->position = ghostTarget; + } + + main_menu_world.step(dt); + + if (Rigidbody *ghost = reacquireGhost()) + { + ghost->render_alpha = 0.0f; + ghost->position = ghostTarget; + std::cout<position.x<<" "<position.y<<'\n'; + } + RenderBodies(main_menu_world,camera,aspectRatio); + float aspectRatio = framebufferHeight > 0 + ? static_cast(framebufferWidth) / static_cast(framebufferHeight) + : 1.0f; const char *startWindowTitle = hasActiveSim ? "Aether Studio - Menu" : "Aether Studio - Start"; if (ImGui::Begin(startWindowTitle, nullptr, ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize)) - { + { + auto centerText = [](const char *text, bool disabled) { const float textWidth = ImGui::CalcTextSize(text).x; @@ -505,7 +580,7 @@ void CreateWindow(PhysicsWorld &world) ImGui::Dummy(ImVec2(0.0f, 20.0f)); ImGui::Separator(); ImGui::Dummy(ImVec2(0.0f, 4.0f)); - centerText("v1.0.0 | Built with OpenGL + ImGui", true); + centerText("v1.0.0 | Built with OpenGL + ImGui", true); } ImGui::End(); } diff --git a/renderer/window.hpp b/renderer/window.hpp index 60476e9..9d6a8e4 100644 --- a/renderer/window.hpp +++ b/renderer/window.hpp @@ -1,5 +1,6 @@ #pragma once - +#include"engine_configs.hpp" +#include class PhysicsWorld; void CreateWindow(PhysicsWorld& world); \ No newline at end of file