1
0
Fork 0
Toy-Raytracer/main.cpp
Teo-CD 029f753bbf World: Re-use RectangleShapes for rendering
sf::RectangleShapes were created brand new each frame, which takes a lot of time.
Instead, keep an array of them available and update them instead of creating new ones.

This also allows a nice optimization of only updating them if needed, by checking their
previous value.

Update the available number of rects when the window resizes.
2024-01-29 00:25:57 +00:00

144 lines
3.7 KiB
C++

#include <iostream>
#include <SFML/Graphics.hpp>
#ifdef IMGUI
#include <imgui.h>
#include <imgui-SFML.h>
#endif
#include "World.h"
// TODO: Find a way to go to edges instead of just equally split (?)
int main()
{
World world(32,32);
world.setBlock(BlockType::AIR,1,1,30,30);
world.setBlock(BlockType::WALL,4,4,2,2);
world.setBlock(BlockType::WALL, 4, 6, 1, 10);
world.player.move(2,2);
std::cout << world << std::endl;
sf::RenderWindow window(sf::VideoMode(1000,1000),"Da raycasting");
world.resizeWindow(sf::FloatRect(0,0, 1000, 1000));
#ifdef IMGUI
if (!ImGui::SFML::Init(window)) {
std::cout << "Failed to init Dear ImGui SFML" << std::endl;
return -1;
}
sf::Clock fpsDataClock;
float frameTimings[100];
unsigned int frameCount = 0;
#endif
// window.setFramerateLimit(60);
sf::Event event{};
sf::Clock frameTime;
while (window.isOpen())
{
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed) {
window.close();
continue;
}
if (event.type == sf::Event::Resized) {
// Keep the view area fit to the window.
sf::FloatRect newView(0, 0,
static_cast<float>(event.size.width),
static_cast<float>(event.size.height));
window.setView(sf::View(newView));
world.resizeWindow(newView);
continue;
}
#ifdef IMGUI
ImGui::SFML::ProcessEvent(window, event);
// Check if Dear ImGui should process the key events.
ImGuiIO& io = ImGui::GetIO();
if (io.WantCaptureMouse || io.WantCaptureKeyboard)
continue;
#endif
if (event.type == sf::Event::KeyPressed) {
switch (event.key.code) {
case sf::Keyboard::Key::Escape:
window.close();
break;
case sf::Keyboard::Key::Left:
world.player.currentRotationSpeed = -world.player.rotationSpeed;
break;
case sf::Keyboard::Key::Right:
world.player.currentRotationSpeed = world.player.rotationSpeed;
break;
case sf::Keyboard::Key::Up:
world.player.updateSpeed(1, 0);
break;
case sf::Keyboard::Key::Down:
world.player.updateSpeed(-1, 0);
break;
default:
break;
}
}
else if (event.type == sf::Event::KeyReleased) {
switch (event.key.code) {
case sf::Keyboard::Key::Left:
case sf::Keyboard::Key::Right:
world.player.currentRotationSpeed = 0;
break;
case sf::Keyboard::Key::Up:
case sf::Keyboard::Key::Down:
world.player.updateSpeed(0, 0);
break;
default:
break;
}
}
}
window.clear();
const sf::Time& deltaT = frameTime.restart();
#ifdef IMGUI
ImGui::SFML::Update(window, deltaT);
#endif
world.step(deltaT.asSeconds());
world.render(window);
#ifdef IMGUI
// ImGui::ShowDemoWindow();
ImGuiWindowFlags window_flags = ImGuiWindowFlags_NoDecoration
| ImGuiWindowFlags_AlwaysAutoResize
| ImGuiWindowFlags_NoSavedSettings
| ImGuiWindowFlags_NoFocusOnAppearing
| ImGuiWindowFlags_NoNav;
ImVec2 window_area = ImGui::GetMainViewport()->WorkSize;
ImGui::SetNextWindowPos({window_area.x - 20, 20}, ImGuiCond_Always, {1,0});
ImGui::SetNextWindowBgAlpha(0.2f);
ImGui::Begin("FPS", nullptr ,window_flags);
if (fpsDataClock.getElapsedTime().asMilliseconds() > 20) {
if (frameCount >= 100) {
memmove(frameTimings, frameTimings + 1, 99 * sizeof(float));
frameTimings[99] = static_cast<float>(deltaT.asMicroseconds());
} else [[unlikely]] {
frameTimings[frameCount] = static_cast<float>(deltaT.asMicroseconds());
}
frameCount++;
fpsDataClock.restart();
}
ImGui::Text("FPS : %d", (int)(1.0/deltaT.asSeconds()));
ImGui::PlotLines("µs", frameTimings, frameCount >= 100 ? 100 : frameCount);
ImGui::End();
ImGui::SFML::Render(window);
#endif
window.display();
}
#ifdef IMGUI
ImGui::SFML::Shutdown();
#endif
return 0;
}