diff --git a/include/config.hpp b/include/config.hpp index 03f1c48..f966ed8 100644 --- a/include/config.hpp +++ b/include/config.hpp @@ -48,7 +48,7 @@ constexpr int REPULSION_GRID_REFRESH = 5; // Grid rebuild freq constexpr float VERTEX_SIZE = 0.5; constexpr Color VERTEX_COLOR = GREEN; constexpr Color EDGE_COLOR = DARKGREEN; -constexpr int DRAW_VERTICES_LIMIT = 100000; +constexpr int DRAW_VERTICES_LIMIT = 1000000; // Klotski Drawing constexpr int BOARD_PADDING = 5; diff --git a/include/physics.hpp b/include/physics.hpp index 410d436..ece9442 100644 --- a/include/physics.hpp +++ b/include/physics.hpp @@ -89,6 +89,10 @@ public: MassSpringSystem() { #ifndef BARNES_HUT last_build = REPULSION_GRID_REFRESH; + std::cout << "Using uniform grid repulsion force calculation." << std::endl; +#else + std::cout << "Using Barnes-Hut + octree repulsion force calculation." + << std::endl; #endif #ifndef WEB diff --git a/src/main.cpp b/src/main.cpp index 954a765..3cce126 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -70,7 +70,11 @@ auto main(int argc, char *argv[]) -> int { std::chrono::high_resolution_clock::now(); #endif - while (timestep_accumulator > TIMESTEP) { + // Do not try to catch up if we're falling behind. Frametimes would get + // larger, resulting in more catching up, resulting in even larger + // frametimes. + // while (timestep_accumulator > TIMESTEP) { + if (timestep_accumulator > TIMESTEP) { mass_springs.ClearForces(); mass_springs.CalculateSpringForces(); mass_springs.CalculateRepulsionForces(); @@ -119,7 +123,8 @@ auto main(int argc, char *argv[]) -> int { << render_time_accumulator / loop_count << "." << std::endl; std::cout << " - Physics updates avg: " << static_cast(update_accumulator) / loop_count - << "x per frame." << std::endl; + << "x per frame (" << timestep_accumulator << "s remaining)." + << std::endl; last_print_time = GetTime(); physics_time_accumulator = std::chrono::duration(0); render_time_accumulator = std::chrono::duration(0); diff --git a/src/renderer.cpp b/src/renderer.cpp index 285ff5e..831febd 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -68,16 +68,18 @@ auto Renderer::DrawMassSprings(const MassSpringSystem &mass_springs, ZoneScoped; // Prepare cube instancing - if (transforms == nullptr) { - AllocateGraphInstancing(mass_springs); - } - ReallocateGraphInstancingIfNecessary(mass_springs); + if (mass_springs.masses.size() < DRAW_VERTICES_LIMIT) { + if (transforms == nullptr) { + AllocateGraphInstancing(mass_springs); + } + ReallocateGraphInstancingIfNecessary(mass_springs); - int i = 0; - for (const auto &[state, mass] : mass_springs.masses) { - transforms[i] = - MatrixTranslate(mass.position.x, mass.position.y, mass.position.z); - ++i; + int i = 0; + for (const auto &[state, mass] : mass_springs.masses) { + transforms[i] = + MatrixTranslate(mass.position.x, mass.position.y, mass.position.z); + ++i; + } } BeginTextureMode(render_target); @@ -97,12 +99,14 @@ auto Renderer::DrawMassSprings(const MassSpringSystem &mass_springs, rlEnd(); // Draw masses (instanced) - // NOTE: I don't know if drawing all this inside a shader would make it much - // faster... - // The amount of data sent to the GPU would be reduced (just positions - // instead of matrices), but is this noticable for < 100000 cubes? - DrawMeshInstanced(cube_instance, vertex_mat, transforms, - mass_springs.masses.size()); + if (mass_springs.masses.size() < DRAW_VERTICES_LIMIT) { + // NOTE: I don't know if drawing all this inside a shader would make it much + // faster... + // The amount of data sent to the GPU would be reduced (just positions + // instead of matrices), but is this noticable for < 100000 cubes? + DrawMeshInstanced(cube_instance, vertex_mat, transforms, + mass_springs.masses.size()); + } // Mark winning states if (mark_solutions || connect_solutions) {