Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions engine/core/rigidbody.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions engine/world/physicsworld.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include <algorithm>
#include <cmath>
#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)
Expand Down
1 change: 1 addition & 0 deletions engine/world/physicsworld.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
43 changes: 34 additions & 9 deletions renderer/drawbodies.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -707,18 +707,32 @@ 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;
cg = 0.92f;
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);
Expand Down Expand Up @@ -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;
Expand All @@ -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)
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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
{
Expand All @@ -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))
Expand Down
81 changes: 78 additions & 3 deletions renderer/window.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <chrono>
#include <array>

#include "../engine/world/physicsworld.hpp"
#include "camera.hpp"
Expand Down Expand Up @@ -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<uint32_t, 4> 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))
Expand Down Expand Up @@ -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<<ghost->position.x<<" "<<ghost->position.y<<'\n';
}
RenderBodies(main_menu_world,camera,aspectRatio);
float aspectRatio = framebufferHeight > 0
? static_cast<float>(framebufferWidth) / static_cast<float>(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;
Expand Down Expand Up @@ -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();
}
Expand Down
3 changes: 2 additions & 1 deletion renderer/window.hpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#pragma once

#include"engine_configs.hpp"
#include<vector>
class PhysicsWorld;

void CreateWindow(PhysicsWorld& world);
Loading