From 500a4fefde5016215db37229aaeb6cc5f0789877 Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Tue, 23 Jan 2018 22:53:51 +0100 Subject: [PATCH 01/85] fixed compilation under Windows --- Final/Polygon.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/Final/Polygon.cpp b/Final/Polygon.cpp index 7d23656..16957b1 100644 --- a/Final/Polygon.cpp +++ b/Final/Polygon.cpp @@ -33,11 +33,11 @@ Polygon::Polygon(Vector2 pos, int vertices) : center(pos.x(),pos.y()), this->points = vector(vertices); const auto angle = 360.0 / (double)vertices; - std::uniform_real_distribution rnd_distr_distance(-angle/2, angle/2); + std::uniform_real_distribution<> rnd_distr_distance(-angle/2, angle/2); for (int i = 0; i < vertices; ++i) { - const Vector2 direction = {cos((double)i * (angle + rnd_distr_distance(rng)) * PI / 180), - sin((double)i * (angle + rnd_distr_distance(rng)) * PI / 180)}; + const Vector2 direction = {std::cos((double)i * (angle + rnd_distr_distance(rng)) * PI / 180), + std::sin((double)i * (angle + rnd_distr_distance(rng)) * PI / 180)}; this->points[i] = direction; } @@ -72,9 +72,13 @@ sf::ConvexShape Polygon::draw() const { convex.setPointCount(points.size()); - for(int i=0;icenter - (points[i] * this->scale); - convex.setPoint(i, sf::Vector2f(point.x(), point.y())); + for(auto i = 0u; i < points.size(); i++) + { + auto point = center - points[i] * scale; + + convex.setPoint(i, sf::Vector2f( + static_cast(point.x()), + static_cast(point.y()))); } return convex; } From c6999c62d29ae7d2dc25c5a3e8fe3afa094727e0 Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Wed, 24 Jan 2018 00:20:58 +0100 Subject: [PATCH 02/85] refactoring & code cleanup fixed interval game loop circle creation disabled for now --- Final/Main.cpp | 160 +++++++++++++++++++++++++-------------- Final/Polygon.cpp | 189 ++++++++++++++++++++++++---------------------- Final/Polygon.h | 35 +++++---- Final/globals.h | 20 ----- 4 files changed, 220 insertions(+), 184 deletions(-) delete mode 100644 Final/globals.h diff --git a/Final/Main.cpp b/Final/Main.cpp index de85acb..fa3f938 100644 --- a/Final/Main.cpp +++ b/Final/Main.cpp @@ -17,89 +17,135 @@ #include #include #include -#include /* Local includes */ #include "Polygon.h" -#include "globals.h" -#include "chrono_timer.h" +#include /*----------------------------------------------------------------*/ -bool add_polygon = false; -bool increase_polygon = false; -bool random_polygon = false; -int polygon = 3; -std::vector > polygons (0); +int main() +{ + auto increase_polygon = false; + auto polygon_vertex_count = 3; -double xs = 0; -double ys = 0; + std::vector polygons; -int width = 600; -int height = 600; + double xs = 0; + double ys = 0; -long long dt = 0; + constexpr auto width = 600; + constexpr auto height = 600; -int main() -{ sf::RenderWindow window(sf::VideoMode(width, height), "2D Collision detection"); - ChronoTimer t("Unnamed"); - { - Polygon p = Polygon::Circle(Vector2(200,300),30); - std::shared_ptr < Polygon > sp = std::make_shared(p); - polygons.push_back(sp); - Polygon p1 = Polygon::Square(Vector2(200,500),Vector2(-300,50)); - std::shared_ptr < Polygon > sp1 = std::make_shared(p1); - polygons.push_back(sp1); - } + polygons.emplace_back(polygon::create_circle(Vector2(200, 300), 30)); + polygons.emplace_back(polygon::create_rectangle(Vector2(200, 500), Vector2(300, 50))); + + using namespace std::chrono; + using clock = std::chrono::high_resolution_clock; + + const auto interval = 10s / 1000.0; + + auto last_time = clock::now(); + while (window.isOpen()) { - dt = t.get_milliseconds(); + auto elapsed_ms = duration_cast(clock::now() - last_time); + + if (elapsed_ms < interval) + { + std::this_thread::sleep_for(0ms); + continue; + } sf::Event event; while (window.pollEvent(event)) - { - if (event.type == sf::Event::Closed || - sf::Keyboard::isKeyPressed(sf::Keyboard::Escape) || - sf::Keyboard::isKeyPressed(sf::Keyboard::Q) ) - window.close(); - if(event.type == sf::Event::MouseMoved) { // <- this is how you check to see if an event - xs = sf::Mouse::getPosition().x - window.getPosition().x - 10; - ys = sf::Mouse::getPosition().y - window.getPosition().y - 35; - } - if(event.type == sf::Event::MouseButtonPressed) { // <- this is how you check to see if an event - Polygon p=Polygon(Vector2(xs,ys),polygon); - std::shared_ptr sp = std::make_shared(p); - polygons.push_back(sp); - increase_polygon = true; - } - if(event.type == sf::Event::MouseButtonReleased) { // <- this is how you check to see if an event - increase_polygon = false; - polygons.at(polygons.size()-1)->set_ready(); + { + switch (event.type) + { + case sf::Event::Closed: window.close(); break; + case sf::Event::MouseMoved: + { + xs = sf::Mouse::getPosition().x - window.getPosition().x - 10; + ys = sf::Mouse::getPosition().y - window.getPosition().y - 35; + } break; + + case sf::Event::MouseButtonPressed: + { + polygons.emplace_back(polygon::create_random( + Vector2(xs, ys), polygon_vertex_count)); + + increase_polygon = true; + + } break; + + case sf::Event::MouseButtonReleased: + { + increase_polygon = false; + + polygons.at(polygons.size() - 1).set_ready(); + + std::cout << polygons.size() << std::endl; + + } break; + + case sf::Event::KeyPressed: + { + if (sf::Keyboard::isKeyPressed(sf::Keyboard::Escape) || + sf::Keyboard::isKeyPressed(sf::Keyboard::Q)) + { + window.close(); + } + + if (sf::Keyboard::isKeyPressed(sf::Keyboard::I)) + { + polygon_vertex_count = ((polygon_vertex_count + 1) % 7) + 3; + } + + if (sf::Keyboard::isKeyPressed(sf::Keyboard::D)) + { + polygon_vertex_count = ((polygon_vertex_count - 1) % 7) + 3; + } + + /*if (sf::Keyboard::isKeyPressed(sf::Keyboard::C)) + { + polygon_vertex_count = circle; + }*/ + + } break; + + default: break; + } } - if(sf::Keyboard::isKeyPressed(sf::Keyboard::I)) { // <- this is how you check to see if an event - polygon = ((polygon + 1) % 7) + 3; - } - if(sf::Keyboard::isKeyPressed(sf::Keyboard::D)) { // <- this is how you check to see if an event - polygon = ((polygon - 1) % 7) + 3; + + window.display(); + + while(elapsed_ms >= interval) + { + if (increase_polygon) + { + polygons.back().increase(1 + interval.count() * 2); } - if(sf::Keyboard::isKeyPressed(sf::Keyboard::C)) { // <- this is how you check to see if an event - polygon = circle; + + for (auto& polygon : polygons) + { + polygon.update(interval.count()); } + + elapsed_ms = duration_cast(elapsed_ms - interval); } - if(increase_polygon) - polygons.at(polygons.size()-1)->increase(.01); - std::cout<draw()); - polygon->update(t.get_milliseconds() - dt); + + for (auto& polygon : polygons) + { + window.draw(polygon.get_shape()); } - window.display(); + + last_time = clock::now(); } return 0; diff --git a/Final/Polygon.cpp b/Final/Polygon.cpp index 16957b1..05e7b52 100644 --- a/Final/Polygon.cpp +++ b/Final/Polygon.cpp @@ -2,126 +2,137 @@ // Created by ivan on 16/01/18. // -#include #include #include -#include - -#include -#include "Polygon.h" -#include "globals.h" -#define PI 3.14159265 +#define _USE_MATH_DEFINES +#include +#include "Polygon.h" using namespace std; -Polygon::Polygon(Vector2 pos) : center(pos.x(),pos.y()), - vertices(4), - scale(1), - velocity({0,0}), - ready(false) { - this->points = vector(vertices); -} +polygon::polygon(const Vector2& center, std::vector points) + : velocity_({0,0}), ready_(false) +{ + shape_.setPointCount(points.size()); -Polygon::Polygon(Vector2 pos, int vertices) : center(pos.x(),pos.y()), - vertices((vertices==10)?100:vertices), - scale(1), - velocity({0,0}), - ready(false) { - if (vertices != circle) { - this->points = vector(vertices); - const auto angle = 360.0 / (double)vertices; + for (auto i = 0u; i < points.size(); i++) + { + auto point = points[i]; - std::uniform_real_distribution<> rnd_distr_distance(-angle/2, angle/2); + shape_.setPoint(i, sf::Vector2f( + static_cast(point.x()), + static_cast(point.y()))); + } - for (int i = 0; i < vertices; ++i) { - const Vector2 direction = {std::cos((double)i * (angle + rnd_distr_distance(rng)) * PI / 180), - std::sin((double)i * (angle + rnd_distr_distance(rng)) * PI / 180)}; + shape_.setPosition( + static_cast(center.x()), + static_cast(center.y())); +} - this->points[i] = direction; - } - } else { - this->points = vector(vertices); +void polygon::update(const double dt) +{ + if (!ready_) return; - const auto angle = 360.0 / (double)vertices; + velocity_ += gravity * dt; + + shape_.move( + static_cast(velocity_.x()), + static_cast(velocity_.y())); - for (int i = 0; i < vertices; ++i) { - const Vector2 direction = {cos((double)i * angle * PI / 180), sin((double)i * angle * PI / 180)}; +} - this->points[i] = direction; - } - } + +void polygon::increase(const double factor) +{ + shape_.scale( + static_cast(factor), + static_cast(factor)); } -void Polygon::update(double dt) { - dt /= 50; - if(ready) { - this->velocity += gravity * dt; - auto old_center = this->center; - this->center += this->velocity * dt; - ///////////////////////////////// - //////COLLISION DETECTION//////// - ///////////////////////////////// - } +void polygon::set_ready() +{ + this->ready_=true; } -sf::ConvexShape Polygon::draw() const { - // create an empty shape - sf::ConvexShape convex; +std::ostream& operator<<(std::ostream& os, const polygon& p) +{ + os << "Polygon:"; - convex.setPointCount(points.size()); + const auto& shape = p.get_shape(); - for(auto i = 0u; i < points.size(); i++) + for (auto i = 0u; i < shape.getPointCount(); ++i) { - auto point = center - points[i] * scale; + const auto point = shape.getPoint(i); - convex.setPoint(i, sf::Vector2f( - static_cast(point.x()), - static_cast(point.y()))); + os<< " " << point.x << ":" << point.y; } - return convex; + + return os; } -void Polygon::increase(double dt) { - this->scale+=dt; +polygon polygon::create_rectangle(const Vector2 pos, const Vector2 scale) +{ + const vector points = + { + Vector2(0,0), + Vector2(0, scale.y()), + scale, + Vector2(scale.x(), 0) + }; + + return { pos, points }; } -void Polygon::set_ready() { - this->ready=true; +polygon polygon::create_line(const Vector2 start, const Vector2 end) +{ + const vector points = + { + Vector2(0,0), + Vector2(0.0001, 0.0001), + end, + Vector2(end.x() - 0.0001, end.y() - 0.0001) + }; + + return { (end - start) / 2, points }; } -std::ostream& operator<<(std::ostream& os, const Polygon& p) +polygon polygon::create_circle(const Vector2 center, const double radius) { - os << "Polygon:"; - for (auto & point : p.points) { - Vector2 real_pos = - p.center + (p.scale * point); - os<< " " << real_pos.x() << ":" << real_pos.y(); + constexpr auto vertex_count = 100; + + const auto angle = 360.0 / vertex_count; + + vector points; + for (auto i = 0; i < vertex_count; ++i) + { + points.emplace_back( + cos(i * angle * M_PI / 180.0), + sin(i * angle * M_PI / 180.0)); } - return os; -} -Polygon Polygon::Square(Vector2 pos, Vector2 scale){ - Polygon retval = Polygon(pos); - retval.points[0] = Vector2(0,0); - retval.points[1] = Vector2(0,scale.y()); - retval.points[2] = scale; - retval.points[3] = Vector2(scale.x(),0); - return retval; -} -Polygon Polygon::Line(Vector2 start, Vector2 end){ - Polygon retval = Polygon(start); - - retval.points[0] = Vector2(0,0); - retval.points[1] = Vector2(0.0001,0.0001); - retval.points[2] = end; - retval.points[3] = Vector2(end.x()-0.0001,end.y()-0.0001); - return retval; + polygon p(center, points); + + p.increase(radius); + + return p; } -Polygon Polygon::Circle(Vector2 center, double radius){ - Polygon retval = Polygon(center,circle); - retval.increase(radius); - return retval; -} \ No newline at end of file +polygon polygon::create_random(const Vector2 center, const size_t vertex_count) +{ + const auto angle = 360.0 / vertex_count; + + std::default_random_engine rng; + const std::uniform_real_distribution<> rnd_distr_distance(-angle / 2, angle / 2); + + vector points; + for (auto i = 0u; i < vertex_count; ++i) + { + points.emplace_back( + std::cos(i * (angle + rnd_distr_distance(rng)) * M_PI / 180.0), + std::sin(i * (angle + rnd_distr_distance(rng)) * M_PI / 180.0)); + } + + return { center, points }; +} diff --git a/Final/Polygon.h b/Final/Polygon.h index e55e08f..3959130 100644 --- a/Final/Polygon.h +++ b/Final/Polygon.h @@ -6,37 +6,36 @@ #define PHYSICALLYBASEDSIMULATION_POLYGON_H #include -#include #include #include "Vec2.h" static const Vector2 gravity = Vector2(0, 9.81); -class Polygon { - const int vertices; - double scale; - Vector2 center; - Vector2 velocity; - std::vector points; - bool ready; - - Polygon(Vector2 pos); - +class polygon +{ public: + polygon(const Vector2& center, std::vector points); - Polygon(Vector2 pos, int vertices); - - static Polygon Square(Vector2 pos, Vector2 scale); - static Polygon Line(Vector2 start, Vector2 end); - static Polygon Circle(Vector2 center, double radius); + static polygon create_rectangle(const Vector2 pos, const Vector2 scale); + static polygon create_line(const Vector2 start, const Vector2 end); + static polygon create_circle(const Vector2 center, const double radius); + static polygon create_random(const Vector2 center, const size_t vertex_count); void update(double dt); - sf::ConvexShape draw() const; + + const sf::ConvexShape& get_shape() const { return shape_; } + void increase(double dt); + void set_ready(); - friend std::ostream& operator<<(std::ostream& os, const Polygon& p); + friend std::ostream& operator<<(std::ostream& os, const polygon& p); + +private: + sf::ConvexShape shape_; + Vector2 velocity_; + bool ready_; }; #endif //PHYSICALLYBASEDSIMULATION_POLYGON_H diff --git a/Final/globals.h b/Final/globals.h deleted file mode 100644 index 0d7fc19..0000000 --- a/Final/globals.h +++ /dev/null @@ -1,20 +0,0 @@ -// -// Created by ivan on 17/01/18. -// - -#ifndef PHYSICALLYBASEDSIMULATION_GLOBALS_H -#define PHYSICALLYBASEDSIMULATION_GLOBALS_H - -constexpr int circle = 30; - -extern int width; -extern int height; -constexpr double camera[] = {0.0, 1.0, 0.0, 1.0}; - -extern double xs; /* Coordinates of mouse */ -extern double ys; - - -static std::default_random_engine rng; - -#endif //PHYSICALLYBASEDSIMULATION_GLOBALS_H From 924f987da0ea92c269e1df6042352ed39c46eca4 Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Wed, 24 Jan 2018 13:21:40 +0100 Subject: [PATCH 03/85] fixed game loop timing --- Final/Main.cpp | 100 +++++++++++++++++++++++----------------------- Final/Polygon.cpp | 9 ++--- Final/Polygon.h | 4 +- 3 files changed, 56 insertions(+), 57 deletions(-) diff --git a/Final/Main.cpp b/Final/Main.cpp index fa3f938..972271f 100644 --- a/Final/Main.cpp +++ b/Final/Main.cpp @@ -60,69 +60,69 @@ int main() continue; } + last_time = clock::now(); + sf::Event event; while (window.pollEvent(event)) + { + switch (event.type) { - switch (event.type) - { - case sf::Event::Closed: window.close(); break; + case sf::Event::Closed: window.close(); break; - case sf::Event::MouseMoved: - { - xs = sf::Mouse::getPosition().x - window.getPosition().x - 10; - ys = sf::Mouse::getPosition().y - window.getPosition().y - 35; - } break; + case sf::Event::MouseMoved: + { + xs = sf::Mouse::getPosition().x - window.getPosition().x - 10; + ys = sf::Mouse::getPosition().y - window.getPosition().y - 35; + } break; - case sf::Event::MouseButtonPressed: - { - polygons.emplace_back(polygon::create_random( - Vector2(xs, ys), polygon_vertex_count)); + case sf::Event::MouseButtonPressed: + { + polygons.emplace_back(polygon::create_random( + Vector2(xs, ys), polygon_vertex_count)); - increase_polygon = true; + increase_polygon = true; - } break; + } break; - case sf::Event::MouseButtonReleased: - { - increase_polygon = false; + case sf::Event::MouseButtonReleased: + { + increase_polygon = false; - polygons.at(polygons.size() - 1).set_ready(); + polygons.at(polygons.size() - 1).enable(); - std::cout << polygons.size() << std::endl; + std::cout << polygons.size() << std::endl; - } break; + } break; - case sf::Event::KeyPressed: + case sf::Event::KeyPressed: + { + if (sf::Keyboard::isKeyPressed(sf::Keyboard::Escape) || + sf::Keyboard::isKeyPressed(sf::Keyboard::Q)) { - if (sf::Keyboard::isKeyPressed(sf::Keyboard::Escape) || - sf::Keyboard::isKeyPressed(sf::Keyboard::Q)) - { - window.close(); - } - - if (sf::Keyboard::isKeyPressed(sf::Keyboard::I)) - { - polygon_vertex_count = ((polygon_vertex_count + 1) % 7) + 3; - } - - if (sf::Keyboard::isKeyPressed(sf::Keyboard::D)) - { - polygon_vertex_count = ((polygon_vertex_count - 1) % 7) + 3; - } - - /*if (sf::Keyboard::isKeyPressed(sf::Keyboard::C)) - { - polygon_vertex_count = circle; - }*/ - - } break; - - default: break; + window.close(); } + + if (sf::Keyboard::isKeyPressed(sf::Keyboard::I)) + { + polygon_vertex_count = ((polygon_vertex_count + 1) % 7) + 3; + } + + if (sf::Keyboard::isKeyPressed(sf::Keyboard::D)) + { + polygon_vertex_count = ((polygon_vertex_count - 1) % 7) + 3; + } + + /*if (sf::Keyboard::isKeyPressed(sf::Keyboard::C)) + { + polygon_vertex_count = circle; + }*/ + + } break; + + default: break; } + } - window.display(); - while(elapsed_ms >= interval) { if (increase_polygon) @@ -143,9 +143,9 @@ int main() for (auto& polygon : polygons) { window.draw(polygon.get_shape()); - } - - last_time = clock::now(); + } + + window.display(); } return 0; diff --git a/Final/Polygon.cpp b/Final/Polygon.cpp index 05e7b52..07d0245 100644 --- a/Final/Polygon.cpp +++ b/Final/Polygon.cpp @@ -13,7 +13,7 @@ using namespace std; polygon::polygon(const Vector2& center, std::vector points) - : velocity_({0,0}), ready_(false) + : velocity_({0,0}), enabled_(false) { shape_.setPointCount(points.size()); @@ -33,14 +33,13 @@ polygon::polygon(const Vector2& center, std::vector points) void polygon::update(const double dt) { - if (!ready_) return; + if (!enabled_) return; velocity_ += gravity * dt; shape_.move( static_cast(velocity_.x()), static_cast(velocity_.y())); - } @@ -51,9 +50,9 @@ void polygon::increase(const double factor) static_cast(factor)); } -void polygon::set_ready() +void polygon::enable() { - this->ready_=true; + enabled_ = true; } std::ostream& operator<<(std::ostream& os, const polygon& p) diff --git a/Final/Polygon.h b/Final/Polygon.h index 3959130..5a5132b 100644 --- a/Final/Polygon.h +++ b/Final/Polygon.h @@ -28,14 +28,14 @@ class polygon void increase(double dt); - void set_ready(); + void enable(); friend std::ostream& operator<<(std::ostream& os, const polygon& p); private: sf::ConvexShape shape_; Vector2 velocity_; - bool ready_; + bool enabled_; }; #endif //PHYSICALLYBASEDSIMULATION_POLYGON_H From c4dcf738e82db7448382f9719d0fda871a7f0f19 Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Wed, 24 Jan 2018 13:39:08 +0100 Subject: [PATCH 04/85] file cleanup --- build_instructions => Assignment3/build_instructions | 0 CMakeLists.txt | 8 -------- 2 files changed, 8 deletions(-) rename build_instructions => Assignment3/build_instructions (100%) delete mode 100644 CMakeLists.txt diff --git a/build_instructions b/Assignment3/build_instructions similarity index 100% rename from build_instructions rename to Assignment3/build_instructions diff --git a/CMakeLists.txt b/CMakeLists.txt deleted file mode 100644 index 1b2b496..0000000 --- a/CMakeLists.txt +++ /dev/null @@ -1,8 +0,0 @@ -cmake_minimum_required(VERSION 3.6) -project(PhysicallyBasedSimulation LANGUAGES CXX) - - -add_subdirectory( - Final -) - From 29d4dff415a249369dc043fccb6a19dbd2ae2259 Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Wed, 24 Jan 2018 13:45:21 +0100 Subject: [PATCH 05/85] create circles only to keep it simple --- Final/Main.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Final/Main.cpp b/Final/Main.cpp index 972271f..adb0a76 100644 --- a/Final/Main.cpp +++ b/Final/Main.cpp @@ -77,8 +77,10 @@ int main() case sf::Event::MouseButtonPressed: { - polygons.emplace_back(polygon::create_random( - Vector2(xs, ys), polygon_vertex_count)); + /*polygons.emplace_back(polygon::create_random( + Vector2(xs, ys), polygon_vertex_count));*/ + + polygons.emplace_back(polygon::create_circle(Vector2(xs, ys), 5)); increase_polygon = true; @@ -102,6 +104,7 @@ int main() window.close(); } + /* if (sf::Keyboard::isKeyPressed(sf::Keyboard::I)) { polygon_vertex_count = ((polygon_vertex_count + 1) % 7) + 3; @@ -112,7 +115,7 @@ int main() polygon_vertex_count = ((polygon_vertex_count - 1) % 7) + 3; } - /*if (sf::Keyboard::isKeyPressed(sf::Keyboard::C)) + if (sf::Keyboard::isKeyPressed(sf::Keyboard::C)) { polygon_vertex_count = circle; }*/ From 7273dd23ab3a5d35fed38a51607a529547f355c7 Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Wed, 24 Jan 2018 13:54:18 +0100 Subject: [PATCH 06/85] refactoring --- Final/Main.cpp | 73 ++++++++++++++++++++++++++++++-------------------- 1 file changed, 44 insertions(+), 29 deletions(-) diff --git a/Final/Main.cpp b/Final/Main.cpp index adb0a76..8c474a2 100644 --- a/Final/Main.cpp +++ b/Final/Main.cpp @@ -25,6 +25,26 @@ /*----------------------------------------------------------------*/ +void render(sf::RenderWindow& window, const std::vector& polygons) +{ + window.clear(); + + for (auto& polygon : polygons) + { + window.draw(polygon.get_shape()); + } + + window.display(); +} + +void update(std::vector& polygons, const double dt) +{ + for (auto& polygon : polygons) + { + polygon.update(dt); + } +} + int main() { auto increase_polygon = false; @@ -44,24 +64,14 @@ int main() polygons.emplace_back(polygon::create_rectangle(Vector2(200, 500), Vector2(300, 50))); using namespace std::chrono; - using clock = std::chrono::high_resolution_clock; + using clock = high_resolution_clock; - const auto interval = 10s / 1000.0; + const auto interval = duration(10ms); auto last_time = clock::now(); - while (window.isOpen()) + auto process_events = [&]() { - auto elapsed_ms = duration_cast(clock::now() - last_time); - - if (elapsed_ms < interval) - { - std::this_thread::sleep_for(0ms); - continue; - } - - last_time = clock::now(); - sf::Event event; while (window.pollEvent(event)) { @@ -78,7 +88,7 @@ int main() case sf::Event::MouseButtonPressed: { /*polygons.emplace_back(polygon::create_random( - Vector2(xs, ys), polygon_vertex_count));*/ + Vector2(xs, ys), polygon_vertex_count));*/ polygons.emplace_back(polygon::create_circle(Vector2(xs, ys), 5)); @@ -107,17 +117,17 @@ int main() /* if (sf::Keyboard::isKeyPressed(sf::Keyboard::I)) { - polygon_vertex_count = ((polygon_vertex_count + 1) % 7) + 3; + polygon_vertex_count = ((polygon_vertex_count + 1) % 7) + 3; } if (sf::Keyboard::isKeyPressed(sf::Keyboard::D)) { - polygon_vertex_count = ((polygon_vertex_count - 1) % 7) + 3; + polygon_vertex_count = ((polygon_vertex_count - 1) % 7) + 3; } if (sf::Keyboard::isKeyPressed(sf::Keyboard::C)) { - polygon_vertex_count = circle; + polygon_vertex_count = circle; }*/ } break; @@ -125,6 +135,21 @@ int main() default: break; } } + }; + + while (window.isOpen()) + { + auto elapsed_ms = duration_cast(clock::now() - last_time); + + if (elapsed_ms < interval) + { + std::this_thread::sleep_for(0ms); + continue; + } + + last_time = clock::now(); + + process_events(); while(elapsed_ms >= interval) { @@ -133,22 +158,12 @@ int main() polygons.back().increase(1 + interval.count() * 2); } - for (auto& polygon : polygons) - { - polygon.update(interval.count()); - } + update(polygons, interval.count()); elapsed_ms = duration_cast(elapsed_ms - interval); } - window.clear(); - - for (auto& polygon : polygons) - { - window.draw(polygon.get_shape()); - } - - window.display(); + render(window, polygons); } return 0; From 2c18e8c7b16ab1ec6af9a5cd169b381118736e3f Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Wed, 24 Jan 2018 13:58:52 +0100 Subject: [PATCH 07/85] fixed polygon update --- Final/Polygon.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Final/Polygon.cpp b/Final/Polygon.cpp index 07d0245..7b19541 100644 --- a/Final/Polygon.cpp +++ b/Final/Polygon.cpp @@ -38,8 +38,8 @@ void polygon::update(const double dt) velocity_ += gravity * dt; shape_.move( - static_cast(velocity_.x()), - static_cast(velocity_.y())); + static_cast(velocity_.x() * dt), + static_cast(velocity_.y() * dt)); } From bad6175835cb600e298d96efb1e94f4552af5190 Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Wed, 24 Jan 2018 13:59:07 +0100 Subject: [PATCH 08/85] added world scale --- Final/Polygon.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Final/Polygon.h b/Final/Polygon.h index 5a5132b..bc76945 100644 --- a/Final/Polygon.h +++ b/Final/Polygon.h @@ -10,7 +10,8 @@ #include "Vec2.h" -static const Vector2 gravity = Vector2(0, 9.81); +constexpr auto world_scale = 50; // px = 1m +const Vector2 gravity = Vector2(0, 9.81) * world_scale; class polygon { From c55fe8d9231f97b9df27f1fd58ae43cb284c94af Mon Sep 17 00:00:00 2001 From: Ivan Waldboth Date: Wed, 24 Jan 2018 15:03:52 +0100 Subject: [PATCH 09/85] uniform_real_distribution<> didn't work for me --- CMakeLists.txt | 6 ++++++ Final/Polygon.cpp | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..bef4920 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,6 @@ +cmake_minimum_required(VERSION 3.5.1) +project(FinalProject LANGUAGES CXX) + +add_subdirectory( + Final +) \ No newline at end of file diff --git a/Final/Polygon.cpp b/Final/Polygon.cpp index 7b19541..455b7b0 100644 --- a/Final/Polygon.cpp +++ b/Final/Polygon.cpp @@ -123,7 +123,7 @@ polygon polygon::create_random(const Vector2 center, const size_t vertex_count) const auto angle = 360.0 / vertex_count; std::default_random_engine rng; - const std::uniform_real_distribution<> rnd_distr_distance(-angle / 2, angle / 2); + const std::uniform_real_distribution rnd_distr_distance(-angle / 2, angle / 2); vector points; for (auto i = 0u; i < vertex_count; ++i) From 09512ddef1a2873e0778f08f4b1a38f1a3b63b93 Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Wed, 24 Jan 2018 17:53:03 +0100 Subject: [PATCH 10/85] fixed uniform_real_distribution again --- Final/Polygon.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Final/Polygon.cpp b/Final/Polygon.cpp index 455b7b0..3e998b6 100644 --- a/Final/Polygon.cpp +++ b/Final/Polygon.cpp @@ -123,7 +123,7 @@ polygon polygon::create_random(const Vector2 center, const size_t vertex_count) const auto angle = 360.0 / vertex_count; std::default_random_engine rng; - const std::uniform_real_distribution rnd_distr_distance(-angle / 2, angle / 2); + const std::uniform_real_distribution rnd_distr_distance(-angle / 2, angle / 2); vector points; for (auto i = 0u; i < vertex_count; ++i) From f4c6b05ab5b0a08ab2361d2a3270af99c9659d25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20H=C3=B6lzl?= Date: Wed, 24 Jan 2018 20:49:43 +0100 Subject: [PATCH 11/85] added Console, variable game loop, fps counters --- Final/Console.hpp | 72 +++++++++++++++++++ Final/Main.cpp | 176 ++++++++++++++++++++++++++++++++++++++-------- Final/arial.ttf | Bin 0 -> 311636 bytes 3 files changed, 219 insertions(+), 29 deletions(-) create mode 100644 Final/Console.hpp create mode 100644 Final/arial.ttf diff --git a/Final/Console.hpp b/Final/Console.hpp new file mode 100644 index 0000000..87e6cf6 --- /dev/null +++ b/Final/Console.hpp @@ -0,0 +1,72 @@ +#pragma once + +#include + +#include +#include +#include +#include + +class Console +{ +private: + Console() + { + + } + +public: + static Console& instance() + { + static Console console; + return console; + } + + void init() + { + if (!font.loadFromFile("arial.ttf")) + { + // error... + } + + m_text.setFont(font); + m_text.setCharacterSize(12); + m_text.setColor(sf::Color::White); + } + + template + void set_param(const std::string& name, const T& value) + { + std::stringstream stm; + stm << std::fixed << std::setprecision(2) << value; + + m_params[name] = stm.str(); + update(); + } + + void print(sf::RenderWindow& window) + { + std::lock_guard ga{ m_lock }; + + window.draw(m_text); + } + +private: + void update() + { + std::stringstream stm; + + for (auto itr : m_params) + stm << itr.first + ": " + itr.second << std::endl; + + { + std::lock_guard ga{ m_lock }; + m_text.setString(stm.str()); + } + } + + std::mutex m_lock; + sf::Text m_text; + std::unordered_map m_params; + sf::Font font; +}; \ No newline at end of file diff --git a/Final/Main.cpp b/Final/Main.cpp index 8c474a2..f8477b1 100644 --- a/Final/Main.cpp +++ b/Final/Main.cpp @@ -20,7 +20,17 @@ /* Local includes */ #include "Polygon.h" +#include "Console.hpp" #include +#include + + +enum class GameLoopType +{ + Fixed = 0, + Variable, + Unkown +}; /*----------------------------------------------------------------*/ @@ -29,11 +39,14 @@ void render(sf::RenderWindow& window, const std::vector& polygons) { window.clear(); + for (auto& polygon : polygons) { window.draw(polygon.get_shape()); } + Console::instance().print(window); + window.display(); } @@ -45,6 +58,29 @@ void update(std::vector& polygons, const double dt) } } +#include + +template +class Smoother +{ +public: + + void add(T v) + { + data.push_back(v); + if (data.size() > MAX) + data.pop_front(); + } + + T get() + { + return std::accumulate(data.begin(), data.end(), 0.0) / data.size(); + } + +private: + std::deque data; +}; + int main() { auto increase_polygon = false; @@ -58,6 +94,8 @@ int main() constexpr auto width = 600; constexpr auto height = 600; + Console::instance().init(); + sf::RenderWindow window(sf::VideoMode(width, height), "2D Collision detection"); polygons.emplace_back(polygon::create_circle(Vector2(200, 300), 30)); @@ -66,10 +104,29 @@ int main() using namespace std::chrono; using clock = high_resolution_clock; - const auto interval = duration(10ms); - + const auto fps_60 = duration(16ms); + const auto fps_30 = duration(32ms); + const auto interval = fps_60; + + + auto game_loop_type = GameLoopType::Fixed; + + Smoother draw_time_smooth; + Smoother update_time_smooth; + auto last_time = clock::now(); + auto measure = [&](auto name, auto& smoother, auto func) { + + auto start_frame = clock::now(); + + func(); + + auto elapsed_s = duration{ clock::now() - start_frame }; + smoother.add(1.0 / elapsed_s.count()); + Console::instance().set_param(name, smoother.get()); + }; + auto process_events = [&]() { sf::Event event; @@ -114,6 +171,15 @@ int main() window.close(); } + if (sf::Keyboard::isKeyPressed(sf::Keyboard::G)) + { + game_loop_type = (GameLoopType)(((int)game_loop_type) + 1); + if (game_loop_type == GameLoopType::Unkown) + game_loop_type = GameLoopType::Fixed; + + + } + /* if (sf::Keyboard::isKeyPressed(sf::Keyboard::I)) { @@ -137,34 +203,86 @@ int main() } }; - while (window.isOpen()) - { - auto elapsed_ms = duration_cast(clock::now() - last_time); - - if (elapsed_ms < interval) - { - std::this_thread::sleep_for(0ms); - continue; - } - - last_time = clock::now(); - - process_events(); - - while(elapsed_ms >= interval) - { - if (increase_polygon) - { - polygons.back().increase(1 + interval.count() * 2); - } + auto fixed_game_loop = [&]() + { + auto elapsed_ms = duration_cast(clock::now() - last_time); + + if (elapsed_ms < interval) + { + auto interval_ms = duration_cast(interval); + auto wait = interval_ms - elapsed_ms; + std::this_thread::sleep_for(0ms); + return; + } + + last_time = clock::now(); + + process_events(); + + while (elapsed_ms >= interval) + { + if (increase_polygon) + { + polygons.back().increase(1 + interval.count() * 2); + } + + measure("Update", update_time_smooth, [&] + { + update(polygons, interval.count()); + }); + + elapsed_ms = duration_cast(elapsed_ms - interval); + } + + Console::instance().set_param("Update", update_time_smooth.get()); + + measure("Draw", draw_time_smooth, [&] + { + render(window, polygons); + }); + }; + + auto variable_game_loop = [&]() + { + auto elapsed_s = duration_cast>(clock::now() - last_time); + last_time = clock::now(); + + process_events(); + + if (increase_polygon) + polygons.back().increase(1 + elapsed_s.count() * 2); + + + measure("Update", update_time_smooth, [&] + { + update(polygons, elapsed_s.count()); + }); + + measure("Draw", draw_time_smooth, [&] + { + render(window, polygons); + }); + }; + + while (window.isOpen()) + { + + switch (game_loop_type) + { + case GameLoopType::Fixed: + Console::instance().set_param("GameLoop", "Fixed"); + fixed_game_loop(); + break; + case GameLoopType::Variable: + Console::instance().set_param("GameLoop", "Variable"); + variable_game_loop(); + break; + case GameLoopType::Unkown: + default: + break; + } + } - update(polygons, interval.count()); - - elapsed_ms = duration_cast(elapsed_ms - interval); - } - - render(window, polygons); - } return 0; } \ No newline at end of file diff --git a/Final/arial.ttf b/Final/arial.ttf new file mode 100644 index 0000000000000000000000000000000000000000..886789b85b4b4e662519fcb7fe4d88ddf2205c5b GIT binary patch literal 311636 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 VXQc0|TekeI1$m{%qWu+${|A Date: Thu, 25 Jan 2018 14:25:42 +0100 Subject: [PATCH 12/85] circle collision detection --- Final/CMakeLists.txt | 2 +- Final/Main.cpp | 24 +++++++++++------------- Final/Polygon.cpp | 35 +++++++++++++++++++++++++++-------- Final/Polygon.h | 4 +++- Final/Vec2.h | 3 +-- 5 files changed, 43 insertions(+), 25 deletions(-) diff --git a/Final/CMakeLists.txt b/Final/CMakeLists.txt index 9c4a4b6..ca6518d 100644 --- a/Final/CMakeLists.txt +++ b/Final/CMakeLists.txt @@ -14,7 +14,7 @@ endif() set(SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/Main.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Polygon.cpp -) + ) add_executable(FinalProject ${SOURCE_FILES}) diff --git a/Final/Main.cpp b/Final/Main.cpp index 8c474a2..0c1bf5d 100644 --- a/Final/Main.cpp +++ b/Final/Main.cpp @@ -41,13 +41,14 @@ void update(std::vector& polygons, const double dt) { for (auto& polygon : polygons) { - polygon.update(dt); + polygon.update(polygons,dt); } } int main() { auto increase_polygon = false; + auto draw_circle = false; auto polygon_vertex_count = 3; std::vector polygons; @@ -87,10 +88,12 @@ int main() case sf::Event::MouseButtonPressed: { - /*polygons.emplace_back(polygon::create_random( - Vector2(xs, ys), polygon_vertex_count));*/ + if(draw_circle) + polygons.emplace_back(polygon::create_circle(Vector2(xs, ys), 5)); + else + polygons.emplace_back(polygon::create_random( + Vector2(xs, ys), polygon_vertex_count)); - polygons.emplace_back(polygon::create_circle(Vector2(xs, ys), 5)); increase_polygon = true; @@ -114,21 +117,16 @@ int main() window.close(); } - /* - if (sf::Keyboard::isKeyPressed(sf::Keyboard::I)) + if(event.key.code > sf::Keyboard::Num2 && event.key.code < sf::Keyboard::Escape) { - polygon_vertex_count = ((polygon_vertex_count + 1) % 7) + 3; + polygon_vertex_count = event.key.code - sf::Keyboard::Num0; } - if (sf::Keyboard::isKeyPressed(sf::Keyboard::D)) - { - polygon_vertex_count = ((polygon_vertex_count - 1) % 7) + 3; - } if (sf::Keyboard::isKeyPressed(sf::Keyboard::C)) { - polygon_vertex_count = circle; - }*/ + draw_circle = true; + } } break; diff --git a/Final/Polygon.cpp b/Final/Polygon.cpp index 455b7b0..15ed456 100644 --- a/Final/Polygon.cpp +++ b/Final/Polygon.cpp @@ -9,12 +9,16 @@ #include #include "Polygon.h" +#include using namespace std; +std::default_random_engine rng; polygon::polygon(const Vector2& center, std::vector points) - : velocity_({0,0}), enabled_(false) + : velocity_({0,0}), enabled_(false) { + + shape_.setPointCount(points.size()); for (auto i = 0u; i < points.size(); i++) @@ -31,15 +35,29 @@ polygon::polygon(const Vector2& center, std::vector points) static_cast(center.y())); } -void polygon::update(const double dt) +void polygon::update(std::vector& polygons, const double dt) { if (!enabled_) return; - velocity_ += gravity * dt; - shape_.move( static_cast(velocity_.x() * dt), static_cast(velocity_.y() * dt)); + + velocity_ += gravity * dt; + + for(const auto & poly : polygons) { + if(this == &poly) + continue; + if (shape_.getPointCount() == 100 && poly.shape_.getPointCount() == 100) + { + sf::Vector2f distance = { shape_.getPosition() - poly.shape_.getPosition() }; + if( (this->shape_.getScale() + poly.shape_.getScale()).x > Vector2(distance.x,distance.y).length() ) + shape_.move( + static_cast(- velocity_.x() * dt), + static_cast(- velocity_.y() * dt)); + } + + } } @@ -122,16 +140,17 @@ polygon polygon::create_random(const Vector2 center, const size_t vertex_count) { const auto angle = 360.0 / vertex_count; - std::default_random_engine rng; - const std::uniform_real_distribution rnd_distr_distance(-angle / 2, angle / 2); + const std::uniform_real_distribution rnd_distr_distance(- angle / vertex_count, angle / vertex_count); vector points; for (auto i = 0u; i < vertex_count; ++i) { + const auto final_angle = angle + rnd_distr_distance(rng); points.emplace_back( - std::cos(i * (angle + rnd_distr_distance(rng)) * M_PI / 180.0), - std::sin(i * (angle + rnd_distr_distance(rng)) * M_PI / 180.0)); + std::cos(i * final_angle * M_PI / 180.0), + std::sin(i * final_angle * M_PI / 180.0)); } return { center, points }; } + diff --git a/Final/Polygon.h b/Final/Polygon.h index bc76945..5fa7fce 100644 --- a/Final/Polygon.h +++ b/Final/Polygon.h @@ -23,7 +23,7 @@ class polygon static polygon create_circle(const Vector2 center, const double radius); static polygon create_random(const Vector2 center, const size_t vertex_count); - void update(double dt); + void update(std::vector& polygons, const double dt); const sf::ConvexShape& get_shape() const { return shape_; } @@ -32,11 +32,13 @@ class polygon void enable(); friend std::ostream& operator<<(std::ostream& os, const polygon& p); + bool operator ==(const polygon &other) const; private: sf::ConvexShape shape_; Vector2 velocity_; bool enabled_; + }; #endif //PHYSICALLYBASEDSIMULATION_POLYGON_H diff --git a/Final/Vec2.h b/Final/Vec2.h index 27dd020..f62acc9 100644 --- a/Final/Vec2.h +++ b/Final/Vec2.h @@ -16,7 +16,6 @@ #ifndef __VEC2_T_H__ #define __VEC2_T_H__ - template class Vector2T { @@ -25,7 +24,7 @@ class Vector2T Vector2T(T v) { m_xy[0] = v; m_xy[1] = v; } Vector2T(const T x, const T y) { m_xy[0] = x; m_xy[1] = y; } Vector2T(const Vector2T &other) { *this = other; } - + Vector2T & operator=( const Vector2T &other ) { m_xy[0]= other.m_xy[0]; m_xy[1] = other.m_xy[1]; return *this; From 432086107b12f1f20e6464e0e8abb00defab92ce Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Sat, 27 Jan 2018 13:33:05 +0100 Subject: [PATCH 13/85] fixed uniform distribution again... --- Final/Polygon.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Final/Polygon.cpp b/Final/Polygon.cpp index a23b9ee..85d218c 100644 --- a/Final/Polygon.cpp +++ b/Final/Polygon.cpp @@ -17,8 +17,6 @@ std::default_random_engine rng; polygon::polygon(const Vector2& center, std::vector points) : velocity_({0,0}), enabled_(false) { - - shape_.setPointCount(points.size()); for (auto i = 0u; i < points.size(); i++) @@ -140,7 +138,7 @@ polygon polygon::create_random(const Vector2 center, const size_t vertex_count) { const auto angle = 360.0 / vertex_count; - const std::uniform_real_distribution rnd_distr_distance(- angle / vertex_count, angle / vertex_count); + const std::uniform_real_distribution rnd_distr_distance(- angle / vertex_count, angle / vertex_count); vector points; for (auto i = 0u; i < vertex_count; ++i) From 6ab18ade0b04cbee0a4247139e3149d68f496c3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20H=C3=B6lzl?= Date: Sat, 27 Jan 2018 15:37:09 +0100 Subject: [PATCH 14/85] add collision detection --- .gitignore | 4 + Final/CMakeLists.txt | 13 ++- Final/ContactInfo.hpp | 11 +++ Final/Main.cpp | 198 ++++++++++++++++++++++++++++++++++++++++-- Final/Polygon.cpp | 29 ++++++- Final/Polygon.h | 37 +++++++- 6 files changed, 274 insertions(+), 18 deletions(-) create mode 100644 Final/ContactInfo.hpp diff --git a/.gitignore b/.gitignore index 1139ed6..c1907ec 100644 --- a/.gitignore +++ b/.gitignore @@ -43,3 +43,7 @@ Assignment1/CMakeSettings.json **/.vs/VSWorkspaceState.json .idea/ cmake-build-debug/ + + +Final/SFML-2.4.2 +Final/.vs diff --git a/Final/CMakeLists.txt b/Final/CMakeLists.txt index 9c4a4b6..41c5165 100644 --- a/Final/CMakeLists.txt +++ b/Final/CMakeLists.txt @@ -4,26 +4,31 @@ project(FinalProject LANGUAGES CXX) set(CMAKE_BUILD_TYPE Debug) if(MSVC) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++latest /wd4141") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++14 /wd4141") set(CMAKE_CXX_FLAGS_RELEASE "/Ox /Ot /DNDEBUG") else() - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 -Wall") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -Wall") set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG") endif() set(SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/Main.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Polygon.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Polygon.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Console.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/ContactInfo.hpp ) -add_executable(FinalProject ${SOURCE_FILES}) +add_executable(FinalProject ${SOURCE_FILES} ${HEADERS}) target_include_directories(FinalProject PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/modules/" ${CMAKE_MODULE_PATH}) +set(SFML_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/SFML-2.4.2) + find_package(SFML 2 REQUIRED network audio graphics window system) + if(SFML_FOUND) include_directories(${SFML_INCLUDE_DIR}) target_link_libraries(FinalProject ${SFML_LIBRARIES} ${SFML_DEPENDENCIES}) diff --git a/Final/ContactInfo.hpp b/Final/ContactInfo.hpp new file mode 100644 index 0000000..579f8e4 --- /dev/null +++ b/Final/ContactInfo.hpp @@ -0,0 +1,11 @@ +#pragma once + +#include "Polygon.h" +#include "Vec2.h" + +struct ContactInfo +{ + polygon* a; + polygon* b; + std::vector contact_points; +}; \ No newline at end of file diff --git a/Final/Main.cpp b/Final/Main.cpp index f8477b1..8cf4175 100644 --- a/Final/Main.cpp +++ b/Final/Main.cpp @@ -21,6 +21,7 @@ /* Local includes */ #include "Polygon.h" #include "Console.hpp" +#include "ContactInfo.hpp" #include #include @@ -43,6 +44,40 @@ void render(sf::RenderWindow& window, const std::vector& polygons) for (auto& polygon : polygons) { window.draw(polygon.get_shape()); + + + if (polygon.get_enabled()) + { + auto center = polygon.get_center_local(); + auto center_world = polygon.get_shape().getTransform() * sf::Vector2f(center.x(), center.y()); + + // draw center + sf::CircleShape circle(1); + circle.setPosition({ center_world.x, center_world.y }); + circle.setFillColor(sf::Color{ 0, 255, 0 }); + window.draw(circle); + + // draw contact + for (auto& contact_point : polygon.get_contacts()) + { + auto contact_f = sf::Vector2f{ (float)contact_point.x(), (float)contact_point.y() }; + + sf::CircleShape circle(3); + circle.setPosition(contact_f); + circle.setFillColor(sf::Color{ 255, 0, 255 }); + window.draw(circle); + + auto direction = contact_f - center_world; + + sf::Vertex line[] = + { + sf::Vertex(center_world, sf::Color{ 255,0,255 }), + sf::Vertex(center_world + direction, sf::Color{ 255,0,255 }) + }; + + window.draw(line, 2, sf::Lines); + } + } } Console::instance().print(window); @@ -50,12 +85,162 @@ void render(sf::RenderWindow& window, const std::vector& polygons) window.display(); } + +#include +#include +#include +using namespace std; + +bool lineSegmentIntersection( + double Ax, double Ay, + double Bx, double By, + double Cx, double Cy, + double Dx, double Dy, + double& X, double& Y) { + + double distAB, theCos, theSin, newX, ABpos; + + // Fail if either line segment is zero-length. + if (Ax == Bx && Ay == By || Cx == Dx && Cy == Dy) return false; + + // Fail if the segments share an end-point. + if (Ax == Cx && Ay == Cy || Bx == Cx && By == Cy + || Ax == Dx && Ay == Dy || Bx == Dx && By == Dy) { + return false; + } + + // (1) Translate the system so that point A is on the origin. + Bx -= Ax; By -= Ay; + Cx -= Ax; Cy -= Ay; + Dx -= Ax; Dy -= Ay; + + // Discover the length of segment A-B. + distAB = sqrt(Bx*Bx + By * By); + + // (2) Rotate the system so that point B is on the positive X axis. + theCos = Bx / distAB; + theSin = By / distAB; + newX = Cx * theCos + Cy * theSin; + Cy = Cy * theCos - Cx * theSin; Cx = newX; + newX = Dx * theCos + Dy * theSin; + Dy = Dy * theCos - Dx * theSin; Dx = newX; + + // Fail if segment C-D doesn't cross line A-B. + if (Cy<0. && Dy<0. || Cy >= 0. && Dy >= 0.) return false; + + // (3) Discover the position of the intersection point along line A-B. + ABpos = Dx + (Cx - Dx)*Dy / (Dy - Cy); + + // Fail if segment C-D crosses line A-B outside of segment A-B. + if (ABpos<0. || ABpos>distAB) return false; + + // (4) Apply the discovered position to line A-B in the original coordinate system. + X = Ax + ABpos * theCos; + Y = Ay + ABpos * theSin; + + // Success. + return true; +} + + +void intersects(const polygon& a, const polygon& b, std::vector& contact_points) +{ + auto get_points = [](auto shape) + { + using line_t = std::tuple; + std::vector lines; + auto transform = shape.get_shape().getTransform(); + for (size_t i = 0; i < shape.get_shape().getPointCount(); i++) + { + auto end_index = (i == shape.get_shape().getPointCount() - 1) ? 0 : i + 1; + + auto start = transform * shape.get_shape().getPoint(i); + auto end = transform * shape.get_shape().getPoint(end_index); + + lines.push_back(line_t{ start, end }); + } + + return lines; + }; + + auto lines_a = get_points(a); + auto lines_b = get_points(b); + + for (auto& line_a : lines_a) + { + for (auto& line_b : lines_b) + { + auto x1 = std::get<0>(line_a).x; + auto y1 = std::get<0>(line_a).y; + + auto x2 = std::get<1>(line_a).x; + auto y2 = std::get<1>(line_a).y; + + + auto x3 = std::get<0>(line_b).x; + auto y3 = std::get<0>(line_b).y; + + auto x4 = std::get<1>(line_b).x; + auto y4 = std::get<1>(line_b).y; + + double ix, iy; + auto hit = lineSegmentIntersection(x1, y1, x2, y2, x3, y3, x4, y4, ix, iy); + + if(hit) + contact_points.emplace_back(ix, iy); + } + } +} + + +std::vector collision_detection(std::vector& polygons) +{ + std::vector constacts; + for (auto& polygon_a : polygons) + { + polygon_a.clear_contacts(); + + for (auto& polygon_b : polygons) + { + if (&polygon_a == &polygon_b) + continue; + + if (!polygon_a.get_enabled() && !polygon_b.get_enabled()) + continue; + + ContactInfo info; + intersects(polygon_a, polygon_b, info.contact_points); + if (!info.contact_points.empty()) + { + polygon_a.add_contacts(info.contact_points); + polygon_b.add_contacts(info.contact_points); + + info.a = &polygon_a; + info.b = &polygon_b; + constacts.push_back(std::move(info)); + } + } + } + + return constacts; +} + +void collision_resolution(const std::vector& contacts) +{ + +} + void update(std::vector& polygons, const double dt) { - for (auto& polygon : polygons) - { - polygon.update(dt); - } + auto contacts = collision_detection(polygons); + + if (!contacts.empty()) + collision_resolution(contacts); + + for (auto& polygon : polygons) + { + polygon.update(dt); + } } #include @@ -98,8 +283,8 @@ int main() sf::RenderWindow window(sf::VideoMode(width, height), "2D Collision detection"); - polygons.emplace_back(polygon::create_circle(Vector2(200, 300), 30)); - polygons.emplace_back(polygon::create_rectangle(Vector2(200, 500), Vector2(300, 50))); + polygons.emplace_back(polygon::create_rectangle(Vector2(200, 500), Vector2(300, 50))); + polygons.emplace_back(polygon::create_rectangle(Vector2(200, 200), Vector2(300, 50))); using namespace std::chrono; using clock = high_resolution_clock; @@ -266,7 +451,6 @@ int main() while (window.isOpen()) { - switch (game_loop_type) { case GameLoopType::Fixed: diff --git a/Final/Polygon.cpp b/Final/Polygon.cpp index 3e998b6..a368954 100644 --- a/Final/Polygon.cpp +++ b/Final/Polygon.cpp @@ -17,15 +17,36 @@ polygon::polygon(const Vector2& center, std::vector points) { shape_.setPointCount(points.size()); + auto accum = Vector2{ 0, 0 }; for (auto i = 0u; i < points.size(); i++) { auto point = points[i]; + accum += point; shape_.setPoint(i, sf::Vector2f( static_cast(point.x()), static_cast(point.y()))); } + // Initialze area + area_ = 0.0; + + // Calculate value of shoelace formula + int j = points.size() - 1; + for (int i = 0; i < points.size(); i++) + { + auto point_i = points[i]; + auto point_j = points[j]; + + area_ += (point_j.x() + point_i.x()) * (point_j.y() - point_i.y()); + j = i; // j is previous vertex to i + } + + // Return absolute value + area_ = abs(area_ / 2.0); + + center_ = accum / points.size(); + shape_.setPosition( static_cast(center.x()), static_cast(center.y())); @@ -71,14 +92,14 @@ std::ostream& operator<<(std::ostream& os, const polygon& p) return os; } -polygon polygon::create_rectangle(const Vector2 pos, const Vector2 scale) +polygon polygon::create_rectangle(const Vector2 pos, const Vector2 size) { const vector points = { Vector2(0,0), - Vector2(0, scale.y()), - scale, - Vector2(scale.x(), 0) + Vector2(0, size.y()), + size, + Vector2(size.x(), 0) }; return { pos, points }; diff --git a/Final/Polygon.h b/Final/Polygon.h index bc76945..9abefd4 100644 --- a/Final/Polygon.h +++ b/Final/Polygon.h @@ -5,13 +5,17 @@ #ifndef PHYSICALLYBASEDSIMULATION_POLYGON_H #define PHYSICALLYBASEDSIMULATION_POLYGON_H -#include -#include #include "Vec2.h" +#include + +#include + + constexpr auto world_scale = 50; // px = 1m -const Vector2 gravity = Vector2(0, 9.81) * world_scale; +// const Vector2 gravity = Vector2(0, 9.81) * world_scale; +const Vector2 gravity = Vector2(0, 0.1) * world_scale; class polygon { @@ -31,12 +35,39 @@ class polygon void enable(); + bool get_enabled() const { return enabled_; } + + void add_contacts(const std::vector& contacts) + { + for (auto& contact : contacts) + contacts_.push_back(contact); + } + + void clear_contacts() + { + contacts_.clear(); + } + + const std::vector& get_contacts() const + { + return contacts_; + } + + const Vector2& get_center_local() const + { + return center_; + } + friend std::ostream& operator<<(std::ostream& os, const polygon& p); private: sf::ConvexShape shape_; Vector2 velocity_; + Vector2 center_; bool enabled_; + double area_; + double mass_; + std::vector contacts_; }; #endif //PHYSICALLYBASEDSIMULATION_POLYGON_H From e9e0d2ae94999904f5d4a5158db6607a5de416bb Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Sat, 27 Jan 2018 18:55:16 +0100 Subject: [PATCH 15/85] fixed merge --- Final/Polygon.cpp | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/Final/Polygon.cpp b/Final/Polygon.cpp index 3f19cbd..e202775 100644 --- a/Final/Polygon.cpp +++ b/Final/Polygon.cpp @@ -54,7 +54,7 @@ polygon::polygon(const Vector2& center, std::vector points) static_cast(center.y())); } -void polygon::update(std::vector& polygons, const double dt) +void polygon::update(const double dt) { if (!enabled_) return; @@ -63,20 +63,6 @@ void polygon::update(std::vector& polygons, const double dt) static_cast(velocity_.y() * dt)); velocity_ += gravity * dt; - - for(const auto & poly : polygons) { - if(this == &poly) - continue; - if (shape_.getPointCount() == 100 && poly.shape_.getPointCount() == 100) - { - sf::Vector2f distance = { shape_.getPosition() - poly.shape_.getPosition() }; - if( (this->shape_.getScale() + poly.shape_.getScale()).x > Vector2(distance.x,distance.y).length() ) - shape_.move( - static_cast(- velocity_.x() * dt), - static_cast(- velocity_.y() * dt)); - } - - } } From 75937d033d1b794369d58e29bc30b188d9a100c5 Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Sat, 27 Jan 2018 18:58:09 +0100 Subject: [PATCH 16/85] updated git ignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 1139ed6..1647709 100644 --- a/.gitignore +++ b/.gitignore @@ -43,3 +43,5 @@ Assignment1/CMakeSettings.json **/.vs/VSWorkspaceState.json .idea/ cmake-build-debug/ +**/.vs/ +**/CMakeSettings.json From 906932e466555e8dcb2f26f09c0fb1401251b375 Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Sat, 27 Jan 2018 18:58:56 +0100 Subject: [PATCH 17/85] added eigen3 library --- Final/CMakeLists.txt | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/Final/CMakeLists.txt b/Final/CMakeLists.txt index ca6518d..8d3ff7e 100644 --- a/Final/CMakeLists.txt +++ b/Final/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.5.1) project(FinalProject LANGUAGES CXX) -set(CMAKE_BUILD_TYPE Debug) +set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/modules/" ${CMAKE_MODULE_PATH}) if(MSVC) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++latest /wd4141") @@ -11,20 +11,18 @@ else() set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG") endif() -set(SOURCE_FILES - ${CMAKE_CURRENT_SOURCE_DIR}/Main.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Polygon.cpp - ) +file(GLOB SOURCE_FILES + "*.h" + "*.cpp" +) add_executable(FinalProject ${SOURCE_FILES}) target_include_directories(FinalProject PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) -set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/modules/" ${CMAKE_MODULE_PATH}) - find_package(SFML 2 REQUIRED network audio graphics window system) +include_directories(${SFML_INCLUDE_DIR}) +target_link_libraries(FinalProject ${SFML_LIBRARIES} ${SFML_DEPENDENCIES}) -if(SFML_FOUND) - include_directories(${SFML_INCLUDE_DIR}) - target_link_libraries(FinalProject ${SFML_LIBRARIES} ${SFML_DEPENDENCIES}) -endif() \ No newline at end of file +find_package(Eigen3 REQUIRED) +include_directories(${EIGEN3_INCLUDE_DIR}) \ No newline at end of file From 12b4b13c638b1a05753783e31361d4b6dd54a3f1 Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Sat, 27 Jan 2018 20:15:20 +0100 Subject: [PATCH 18/85] moved physical calculations to separate class implemented forward Euler update step removed old collision detection --- Final/Main.cpp | 17 ++++++++-- Final/Polygon.cpp | 48 ++++++++++++++-------------- Final/Polygon.h | 33 ++++++++++++++++---- Final/physical_object.cpp | 66 +++++++++++++++++++++++++++++++++++++++ Final/physical_object.h | 42 +++++++++++++++++++++++++ 5 files changed, 172 insertions(+), 34 deletions(-) create mode 100644 Final/physical_object.cpp create mode 100644 Final/physical_object.h diff --git a/Final/Main.cpp b/Final/Main.cpp index 4273305..de184c2 100644 --- a/Final/Main.cpp +++ b/Final/Main.cpp @@ -23,6 +23,7 @@ #include "Console.hpp" #include #include +#include enum class GameLoopType @@ -54,7 +55,7 @@ void update(std::vector& polygons, const double dt) { for (auto& polygon : polygons) { - polygon.update(polygons,dt); + polygon.update(dt); } } @@ -128,6 +129,8 @@ int main() Console::instance().set_param(name, smoother.get()); }; + std::default_random_engine rng; + auto process_events = [&]() { sf::Event event; @@ -148,9 +151,17 @@ int main() if(draw_circle) polygons.emplace_back(polygon::create_circle(Vector2(xs, ys), 5)); else - polygons.emplace_back(polygon::create_random( - Vector2(xs, ys), polygon_vertex_count)); + polygons.emplace_back(polygon::create_random(Vector2(xs, ys), + polygon_vertex_count)); + + auto& polygon = polygons.back(); + const auto& shape = polygon.get_shape(); + + std::uniform_int_distribution rnd(0, shape.getPointCount() - 1); + const auto random_point = polygon.get_shape().getPoint(rnd(rng)); + polygons.back().get_physical_object().accelerate( + to_eigen_vector(random_point), { 0, -150.0f }); increase_polygon = true; diff --git a/Final/Polygon.cpp b/Final/Polygon.cpp index 85d218c..255a0c0 100644 --- a/Final/Polygon.cpp +++ b/Final/Polygon.cpp @@ -11,11 +11,23 @@ #include "Polygon.h" #include -using namespace std; std::default_random_engine rng; +std::vector> create_mass_points( + const double mass_per_point, + const std::vector& points) +{ + std::vector> mass_points; + for(const auto& p : points) + { + mass_points.push_back({ to_eigen_vector(p), mass_per_point }); + } + + return mass_points; +} + polygon::polygon(const Vector2& center, std::vector points) - : velocity_({0,0}), enabled_(false) + : enabled_(false), physical_object_(to_eigen_vector(center), create_mass_points(0.5, points)) { shape_.setPointCount(points.size()); @@ -33,29 +45,15 @@ polygon::polygon(const Vector2& center, std::vector points) static_cast(center.y())); } -void polygon::update(std::vector& polygons, const double dt) +void polygon::update(const double dt) { if (!enabled_) return; - shape_.move( - static_cast(velocity_.x() * dt), - static_cast(velocity_.y() * dt)); - - velocity_ += gravity * dt; + physical_object_.accelerate({ gravity.x(), gravity.y() }); + physical_object_.update(dt); - for(const auto & poly : polygons) { - if(this == &poly) - continue; - if (shape_.getPointCount() == 100 && poly.shape_.getPointCount() == 100) - { - sf::Vector2f distance = { shape_.getPosition() - poly.shape_.getPosition() }; - if( (this->shape_.getScale() + poly.shape_.getScale()).x > Vector2(distance.x,distance.y).length() ) - shape_.move( - static_cast(- velocity_.x() * dt), - static_cast(- velocity_.y() * dt)); - } - - } + shape_.setPosition(to_sf_vector(physical_object_.position())); + shape_.setRotation(static_cast(physical_object_.rotation().angle())); } @@ -89,7 +87,7 @@ std::ostream& operator<<(std::ostream& os, const polygon& p) polygon polygon::create_rectangle(const Vector2 pos, const Vector2 scale) { - const vector points = + const std::vector points = { Vector2(0,0), Vector2(0, scale.y()), @@ -102,7 +100,7 @@ polygon polygon::create_rectangle(const Vector2 pos, const Vector2 scale) polygon polygon::create_line(const Vector2 start, const Vector2 end) { - const vector points = + const std::vector points = { Vector2(0,0), Vector2(0.0001, 0.0001), @@ -119,7 +117,7 @@ polygon polygon::create_circle(const Vector2 center, const double radius) const auto angle = 360.0 / vertex_count; - vector points; + std::vector points; for (auto i = 0; i < vertex_count; ++i) { points.emplace_back( @@ -140,7 +138,7 @@ polygon polygon::create_random(const Vector2 center, const size_t vertex_count) const std::uniform_real_distribution rnd_distr_distance(- angle / vertex_count, angle / vertex_count); - vector points; + std::vector points; for (auto i = 0u; i < vertex_count; ++i) { const auto final_angle = angle + rnd_distr_distance(rng); diff --git a/Final/Polygon.h b/Final/Polygon.h index 5fa7fce..dc7acfc 100644 --- a/Final/Polygon.h +++ b/Final/Polygon.h @@ -9,9 +9,10 @@ #include #include "Vec2.h" +#include "physical_object.h" constexpr auto world_scale = 50; // px = 1m -const Vector2 gravity = Vector2(0, 9.81) * world_scale; +const Vector2 gravity = Vector2(0, 9.81); class polygon { @@ -23,22 +24,42 @@ class polygon static polygon create_circle(const Vector2 center, const double radius); static polygon create_random(const Vector2 center, const size_t vertex_count); - void update(std::vector& polygons, const double dt); + void update(const double dt); - const sf::ConvexShape& get_shape() const { return shape_; } + const sf::Shape& get_shape() const { return shape_; } + physical_object& get_physical_object() { return physical_object_; } void increase(double dt); void enable(); friend std::ostream& operator<<(std::ostream& os, const polygon& p); - bool operator ==(const polygon &other) const; private: sf::ConvexShape shape_; - Vector2 velocity_; - bool enabled_; + + physical_object physical_object_; + bool enabled_; }; +inline sf::Vector2f to_sf_vector(Vector2d v) +{ + return + { + static_cast(v.x()), + static_cast(v.y()) + }; +} + +inline Vector2d to_eigen_vector(const Vector2& v) +{ + return { v.x(), v.y() }; +} + +inline Vector2d to_eigen_vector(const sf::Vector2f& v) +{ + return { v.x, v.y }; +} + #endif //PHYSICALLYBASEDSIMULATION_POLYGON_H diff --git a/Final/physical_object.cpp b/Final/physical_object.cpp new file mode 100644 index 0000000..9898ebf --- /dev/null +++ b/Final/physical_object.cpp @@ -0,0 +1,66 @@ +#include "physical_object.h" +#include + +constexpr auto world_scale = 50; // px = 1m + +physical_object::physical_object(const Vector2d position, + const std::vector>& points) + : position_(position), rotation_(0), velocity_(0, 0), force_(0, 0), torque_(0), angular_momentum_(0) +{ + // total mass + mass_ = std::accumulate(points.begin(), points.end(), 0.0, + [](auto current_sum, auto p) + { + return current_sum + std::get<1>(p); + }); + + // initial position of center of mass + center_of_mass_ = std::accumulate(points.begin(), points.end(), Vector2d(0, 0), + [](auto current_sum, auto p) + { + return current_sum + std::get<0>(p) * std::get<1>(p); + }) / mass_; + + // inertia + const auto inertia = std::accumulate(points.begin(), points.end(), 0.0, + [cof = center_of_mass_](auto current_sum, auto p) + { + const Vector2d offset = std::get<0>(p) - cof; + return current_sum + std::get<1>(p) * offset.squaredNorm(); + }); + + inverse_inertia_ = 1 / inertia; + + // initial angular velocity + angular_velocity_ = inverse_inertia_ * angular_momentum_; +} + +void physical_object::update(const double dt) +{ + center_of_mass_ += velocity_ * dt; + position_ += velocity_ * dt; + + velocity_ += force_ / mass_ * dt * world_scale; + rotation_ = Rotation2D(rotation_.angle() + angular_velocity_ * dt * world_scale); + + angular_momentum_ += torque_ * dt; + angular_velocity_ = inverse_inertia_ * angular_momentum_; + + force_ = { 0.0, 0.0 }; + torque_ = 0.0; +} + +void physical_object::accelerate(const Vector2d point, const Vector2d acceleration) +{ + accelerate(acceleration); + + const auto offset = point - center_of_mass_; + const auto force = acceleration * mass_; + + torque_ += offset.x() * force.y() - force.x() * offset.y(); +} + +void physical_object::accelerate(const Vector2d acceleration) +{ + force_ += acceleration * mass_; +} \ No newline at end of file diff --git a/Final/physical_object.h b/Final/physical_object.h new file mode 100644 index 0000000..7d700aa --- /dev/null +++ b/Final/physical_object.h @@ -0,0 +1,42 @@ +#ifndef PHYSICAL_OBJECT_H +#define PHYSICAL_OBJECT_H + +#include "Eigen/Core" +#include "Eigen/Geometry" + +using Eigen::Vector2d; +using Eigen::Matrix2d; +using Rotation2D = Eigen::Rotation2D; + +class physical_object +{ +public: + explicit physical_object( + const Vector2d position, + const std::vector>& points); + + void update(const double dt); + void accelerate(Vector2d point, Vector2d acceleration); + void accelerate(Vector2d force); + + Vector2d position() const { return position_; } + Rotation2D rotation() const { return rotation_; } + Vector2d center_of_mass() const { return center_of_mass_; } + +private: + double mass_; + + Vector2d center_of_mass_; + Vector2d position_; + Rotation2D rotation_; + + Vector2d velocity_; + Vector2d force_; + + double torque_; + double angular_momentum_; + double angular_velocity_; + double inverse_inertia_; +}; + +#endif // PHYSICAL_OBJECT_H From b41b3a678e7879bca9c17bd501966a2b7bca44dc Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Sat, 27 Jan 2018 20:20:31 +0100 Subject: [PATCH 19/85] updated render call --- Final/Main.cpp | 5 ++--- Final/Polygon.cpp | 5 +++++ Final/Polygon.h | 1 + 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Final/Main.cpp b/Final/Main.cpp index de184c2..637a3c1 100644 --- a/Final/Main.cpp +++ b/Final/Main.cpp @@ -39,11 +39,10 @@ enum class GameLoopType void render(sf::RenderWindow& window, const std::vector& polygons) { window.clear(); - - + for (auto& polygon : polygons) { - window.draw(polygon.get_shape()); + polygon.draw(window); } Console::instance().print(window); diff --git a/Final/Polygon.cpp b/Final/Polygon.cpp index 255a0c0..273efa0 100644 --- a/Final/Polygon.cpp +++ b/Final/Polygon.cpp @@ -56,6 +56,11 @@ void polygon::update(const double dt) shape_.setRotation(static_cast(physical_object_.rotation().angle())); } +void polygon::draw(sf::RenderWindow& window) const +{ + window.draw(shape_); +} + void polygon::increase(const double factor) { diff --git a/Final/Polygon.h b/Final/Polygon.h index dc7acfc..8624b67 100644 --- a/Final/Polygon.h +++ b/Final/Polygon.h @@ -25,6 +25,7 @@ class polygon static polygon create_random(const Vector2 center, const size_t vertex_count); void update(const double dt); + void draw(sf::RenderWindow& window) const; const sf::Shape& get_shape() const { return shape_; } physical_object& get_physical_object() { return physical_object_; } From f750b7745cb8ba9fb1b7153aeb298e94f7a1ef1c Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Sat, 27 Jan 2018 22:32:45 +0100 Subject: [PATCH 20/85] fixed center of mass and added indicator --- Final/Main.cpp | 2 +- Final/Polygon.cpp | 45 ++++++++++++++++++++++++++++++--------- Final/Polygon.h | 5 ++++- Final/physical_object.cpp | 7 +++--- 4 files changed, 44 insertions(+), 15 deletions(-) diff --git a/Final/Main.cpp b/Final/Main.cpp index 637a3c1..73faaed 100644 --- a/Final/Main.cpp +++ b/Final/Main.cpp @@ -160,7 +160,7 @@ int main() const auto random_point = polygon.get_shape().getPoint(rnd(rng)); polygons.back().get_physical_object().accelerate( - to_eigen_vector(random_point), { 0, -150.0f }); + to_eigen_vector(random_point), { 0, -15.0f }); increase_polygon = true; diff --git a/Final/Polygon.cpp b/Final/Polygon.cpp index 273efa0..7dd9350 100644 --- a/Final/Polygon.cpp +++ b/Final/Polygon.cpp @@ -27,7 +27,7 @@ std::vector> create_mass_points( } polygon::polygon(const Vector2& center, std::vector points) - : enabled_(false), physical_object_(to_eigen_vector(center), create_mass_points(0.5, points)) + : physical_object_(to_eigen_vector(center), create_mass_points(0.5, points)), enabled_(false) { shape_.setPointCount(points.size()); @@ -40,9 +40,13 @@ polygon::polygon(const Vector2& center, std::vector points) static_cast(point.y()))); } - shape_.setPosition( - static_cast(center.x()), - static_cast(center.y())); + shape_.setOrigin(to_sf_vector(physical_object_.center_of_mass())); + + cof_shape_.setRadius(0.05f); + cof_shape_.setFillColor(sf::Color::Red); + cof_shape_.setOrigin(cof_shape_.getRadius(), cof_shape_.getRadius()); + + update_shapes(); } void polygon::update(const double dt) @@ -52,13 +56,21 @@ void polygon::update(const double dt) physical_object_.accelerate({ gravity.x(), gravity.y() }); physical_object_.update(dt); + update_shapes(); +} + +void polygon::update_shapes() +{ + shape_.setRotation(static_cast(physical_object_.rotation().angle() * 180 / M_PI)); shape_.setPosition(to_sf_vector(physical_object_.position())); - shape_.setRotation(static_cast(physical_object_.rotation().angle())); + + cof_shape_.setPosition(to_sf_vector(physical_object_.position())); } void polygon::draw(sf::RenderWindow& window) const { window.draw(shape_); + window.draw(cof_shape_); } @@ -67,6 +79,11 @@ void polygon::increase(const double factor) shape_.scale( static_cast(factor), static_cast(factor)); + + cof_shape_.scale( + static_cast(factor), + static_cast(factor)); + } void polygon::enable() @@ -92,15 +109,23 @@ std::ostream& operator<<(std::ostream& os, const polygon& p) polygon polygon::create_rectangle(const Vector2 pos, const Vector2 scale) { + const auto aspect = scale.x() / scale.y(); + const auto half_height = 0.5; + const auto half_width = half_height * aspect; + const std::vector points = { - Vector2(0,0), - Vector2(0, scale.y()), - scale, - Vector2(scale.x(), 0) + Vector2(-half_width, -half_height), + Vector2(-half_width, half_height), + Vector2( half_width, half_height), + Vector2( half_width, -half_height) }; - return { pos, points }; + polygon p(pos, points); + + p.increase(scale.x() / half_width / 2); + + return p; } polygon polygon::create_line(const Vector2 start, const Vector2 end) diff --git a/Final/Polygon.h b/Final/Polygon.h index 8624b67..3438fa0 100644 --- a/Final/Polygon.h +++ b/Final/Polygon.h @@ -11,8 +11,8 @@ #include "Vec2.h" #include "physical_object.h" -constexpr auto world_scale = 50; // px = 1m const Vector2 gravity = Vector2(0, 9.81); +//const Vector2 gravity = Vector2(0, 01); class polygon { @@ -38,10 +38,13 @@ class polygon private: sf::ConvexShape shape_; + sf::CircleShape cof_shape_; physical_object physical_object_; bool enabled_; + + void update_shapes(); }; inline sf::Vector2f to_sf_vector(Vector2d v) diff --git a/Final/physical_object.cpp b/Final/physical_object.cpp index 9898ebf..1602a0f 100644 --- a/Final/physical_object.cpp +++ b/Final/physical_object.cpp @@ -1,7 +1,7 @@ #include "physical_object.h" #include -constexpr auto world_scale = 50; // px = 1m +constexpr auto world_scale = 10; // px = 1m physical_object::physical_object(const Vector2d position, const std::vector>& points) @@ -15,12 +15,14 @@ physical_object::physical_object(const Vector2d position, }); // initial position of center of mass - center_of_mass_ = std::accumulate(points.begin(), points.end(), Vector2d(0, 0), + center_of_mass_ = std::accumulate(points.begin(), points.end(), Vector2d(0, 0), [](auto current_sum, auto p) { return current_sum + std::get<0>(p) * std::get<1>(p); }) / mass_; + position_ = position + center_of_mass_; + // inertia const auto inertia = std::accumulate(points.begin(), points.end(), 0.0, [cof = center_of_mass_](auto current_sum, auto p) @@ -37,7 +39,6 @@ physical_object::physical_object(const Vector2d position, void physical_object::update(const double dt) { - center_of_mass_ += velocity_ * dt; position_ += velocity_ * dt; velocity_ += force_ / mass_ * dt * world_scale; From b63db95d27cb50a46f14a6b14250da5bf8758d02 Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Sun, 28 Jan 2018 13:22:11 +0100 Subject: [PATCH 21/85] added colors --- Final/Main.cpp | 4 ++-- Final/Polygon.cpp | 57 +++++++++++++++++++++++++++++++++++------------ Final/Polygon.h | 4 ++-- 3 files changed, 47 insertions(+), 18 deletions(-) diff --git a/Final/Main.cpp b/Final/Main.cpp index 73faaed..b9eb5c6 100644 --- a/Final/Main.cpp +++ b/Final/Main.cpp @@ -231,7 +231,7 @@ int main() { if (increase_polygon) { - polygons.back().increase(1 + interval.count() * 2); + polygons.back().scale(1 + interval.count() * 2); } measure("Update", update_time_smooth, [&] @@ -258,7 +258,7 @@ int main() process_events(); if (increase_polygon) - polygons.back().increase(1 + elapsed_s.count() * 2); + polygons.back().scale(1 + elapsed_s.count() * 2); measure("Update", update_time_smooth, [&] diff --git a/Final/Polygon.cpp b/Final/Polygon.cpp index 7dd9350..588f6b3 100644 --- a/Final/Polygon.cpp +++ b/Final/Polygon.cpp @@ -40,12 +40,17 @@ polygon::polygon(const Vector2& center, std::vector points) static_cast(point.y()))); } - shape_.setOrigin(to_sf_vector(physical_object_.center_of_mass())); + shape_.setOutlineThickness(-0.05); + shape_.setOrigin( + { + static_cast(physical_object_.center_of_mass().x()), + static_cast(physical_object_.center_of_mass().y()) + }); cof_shape_.setRadius(0.05f); - cof_shape_.setFillColor(sf::Color::Red); - cof_shape_.setOrigin(cof_shape_.getRadius(), cof_shape_.getRadius()); - + cof_shape_.setOrigin({ cof_shape_.getRadius(), cof_shape_.getRadius() }); + cof_shape_.setFillColor(sf::Color::Yellow); + update_shapes(); } @@ -74,7 +79,7 @@ void polygon::draw(sf::RenderWindow& window) const } -void polygon::increase(const double factor) +void polygon::scale(const double factor) { shape_.scale( static_cast(factor), @@ -86,6 +91,18 @@ void polygon::increase(const double factor) } +void polygon::set_color(const sf::Color& color) +{ + const sf::Color dark = { + static_cast(color.r / 2), + static_cast(color.g / 2), + static_cast(color.b / 2), + }; + + shape_.setFillColor(dark); + shape_.setOutlineColor(color); +} + void polygon::enable() { enabled_ = true; @@ -123,7 +140,8 @@ polygon polygon::create_rectangle(const Vector2 pos, const Vector2 scale) polygon p(pos, points); - p.increase(scale.x() / half_width / 2); + p.scale(scale.x() / half_width / 2); + p.set_color(sf::Color::Blue); return p; } @@ -138,7 +156,11 @@ polygon polygon::create_line(const Vector2 start, const Vector2 end) Vector2(end.x() - 0.0001, end.y() - 0.0001) }; - return { (end - start) / 2, points }; + polygon p((end - start) / 2, points); + + p.set_color(sf::Color::White); + + return p; } polygon polygon::create_circle(const Vector2 center, const double radius) @@ -157,25 +179,32 @@ polygon polygon::create_circle(const Vector2 center, const double radius) polygon p(center, points); - p.increase(radius); + p.scale(radius); + p.set_color(sf::Color::Red); return p; } polygon polygon::create_random(const Vector2 center, const size_t vertex_count) { - const auto angle = 360.0 / vertex_count; + const auto angle = 2 * M_PI / vertex_count; - const std::uniform_real_distribution rnd_distr_distance(- angle / vertex_count, angle / vertex_count); + const std::uniform_real_distribution rnd( + -angle / vertex_count, angle / vertex_count); std::vector points; for (auto i = 0u; i < vertex_count; ++i) { - const auto final_angle = angle + rnd_distr_distance(rng); + const auto final_angle = i * angle + rnd(rng); points.emplace_back( - std::cos(i * final_angle * M_PI / 180.0), - std::sin(i * final_angle * M_PI / 180.0)); + std::cos(final_angle), + std::sin(final_angle)); } - return { center, points }; + polygon p(center, points); + + p.scale(5); + p.set_color(sf::Color::Green); + + return p; } diff --git a/Final/Polygon.h b/Final/Polygon.h index 3438fa0..e5f8a97 100644 --- a/Final/Polygon.h +++ b/Final/Polygon.h @@ -30,8 +30,7 @@ class polygon const sf::Shape& get_shape() const { return shape_; } physical_object& get_physical_object() { return physical_object_; } - void increase(double dt); - + void scale(double dt); void enable(); friend std::ostream& operator<<(std::ostream& os, const polygon& p); @@ -45,6 +44,7 @@ class polygon bool enabled_; void update_shapes(); + void set_color(const sf::Color& color); }; inline sf::Vector2f to_sf_vector(Vector2d v) From d6402294a8ad7270de60bc13ed68bfad5c4bddff Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Sun, 28 Jan 2018 13:32:16 +0100 Subject: [PATCH 22/85] fixed shape transform origin fixed physical object initial position --- Final/Polygon.cpp | 2 +- Final/physical_object.cpp | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/Final/Polygon.cpp b/Final/Polygon.cpp index 588f6b3..2205120 100644 --- a/Final/Polygon.cpp +++ b/Final/Polygon.cpp @@ -44,7 +44,7 @@ polygon::polygon(const Vector2& center, std::vector points) shape_.setOrigin( { static_cast(physical_object_.center_of_mass().x()), - static_cast(physical_object_.center_of_mass().y()) + -static_cast(physical_object_.center_of_mass().y()) }); cof_shape_.setRadius(0.05f); diff --git a/Final/physical_object.cpp b/Final/physical_object.cpp index 1602a0f..79acf4c 100644 --- a/Final/physical_object.cpp +++ b/Final/physical_object.cpp @@ -21,8 +21,6 @@ physical_object::physical_object(const Vector2d position, return current_sum + std::get<0>(p) * std::get<1>(p); }) / mass_; - position_ = position + center_of_mass_; - // inertia const auto inertia = std::accumulate(points.begin(), points.end(), 0.0, [cof = center_of_mass_](auto current_sum, auto p) From cdce67bac7acaec2d2f0cf57e9ba9d471f200425 Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Sun, 28 Jan 2018 14:16:35 +0100 Subject: [PATCH 23/85] added points velocity update --- Final/physical_object.cpp | 25 +++++++++++++++++++++++-- Final/physical_object.h | 10 ++++++++-- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/Final/physical_object.cpp b/Final/physical_object.cpp index 79acf4c..7daed55 100644 --- a/Final/physical_object.cpp +++ b/Final/physical_object.cpp @@ -5,7 +5,8 @@ constexpr auto world_scale = 10; // px = 1m physical_object::physical_object(const Vector2d position, const std::vector>& points) - : position_(position), rotation_(0), velocity_(0, 0), force_(0, 0), torque_(0), angular_momentum_(0) + : position_(position), rotation_(0), velocity_(0, 0), force_(0, 0), + torque_(0), angular_momentum_(0), velocities_(points.size()) { // total mass mass_ = std::accumulate(points.begin(), points.end(), 0.0, @@ -23,9 +24,13 @@ physical_object::physical_object(const Vector2d position, // inertia const auto inertia = std::accumulate(points.begin(), points.end(), 0.0, - [cof = center_of_mass_](auto current_sum, auto p) + [cof = center_of_mass_, this](auto current_sum, auto p) { const Vector2d offset = std::get<0>(p) - cof; + + // save offset + offsets_.push_back(offset); + return current_sum + std::get<1>(p) * offset.squaredNorm(); }); @@ -45,6 +50,22 @@ void physical_object::update(const double dt) angular_momentum_ += torque_ * dt; angular_velocity_ = inverse_inertia_ * angular_momentum_; + for(auto i = 0u; i < velocities_.size(); ++i) + { + // transform offset + const auto offset = rotation_.toRotationMatrix() * offsets_[i]; + + // calculate norm of angular velocity part (v = r * omega) + const auto velocity_norm = offset.norm() * angular_velocity_; + const auto normalized_offset = offset.normalized(); + + velocities_[i] = velocity_ + Vector2d + { + velocity_norm * normalized_offset.y(), + velocity_norm * normalized_offset.x(), + }; + } + force_ = { 0.0, 0.0 }; torque_ = 0.0; } diff --git a/Final/physical_object.h b/Final/physical_object.h index 7d700aa..17584ea 100644 --- a/Final/physical_object.h +++ b/Final/physical_object.h @@ -1,13 +1,16 @@ #ifndef PHYSICAL_OBJECT_H #define PHYSICAL_OBJECT_H -#include "Eigen/Core" -#include "Eigen/Geometry" +#include +#include +#include using Eigen::Vector2d; using Eigen::Matrix2d; using Rotation2D = Eigen::Rotation2D; +EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(Vector2d) + class physical_object { public: @@ -37,6 +40,9 @@ class physical_object double angular_momentum_; double angular_velocity_; double inverse_inertia_; + + std::vector offsets_; + std::vector velocities_; }; #endif // PHYSICAL_OBJECT_H From 4f68d663b3c8cbe63ba38719c91eca08f915132e Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Sun, 28 Jan 2018 14:38:26 +0100 Subject: [PATCH 24/85] explicit conversion between screen coordinates and world coordinates --- Final/Main.cpp | 8 ++++---- Final/Polygon.cpp | 26 ++++++++++++++------------ Final/Polygon.h | 19 ++++++++++--------- 3 files changed, 28 insertions(+), 25 deletions(-) diff --git a/Final/Main.cpp b/Final/Main.cpp index b9eb5c6..090b397 100644 --- a/Final/Main.cpp +++ b/Final/Main.cpp @@ -160,7 +160,7 @@ int main() const auto random_point = polygon.get_shape().getPoint(rnd(rng)); polygons.back().get_physical_object().accelerate( - to_eigen_vector(random_point), { 0, -15.0f }); + as_world_coordinates(random_point), { 0, 15.0f }); increase_polygon = true; @@ -186,7 +186,7 @@ int main() if (sf::Keyboard::isKeyPressed(sf::Keyboard::G)) { - game_loop_type = (GameLoopType)(((int)game_loop_type) + 1); + game_loop_type = static_cast(static_cast(game_loop_type) + 1); if (game_loop_type == GameLoopType::Unkown) game_loop_type = GameLoopType::Fixed; @@ -217,8 +217,8 @@ int main() if (elapsed_ms < interval) { - auto interval_ms = duration_cast(interval); - auto wait = interval_ms - elapsed_ms; + //auto interval_ms = duration_cast(interval); + //auto wait = interval_ms - elapsed_ms; std::this_thread::sleep_for(0ms); return; } diff --git a/Final/Polygon.cpp b/Final/Polygon.cpp index 2205120..5b8b199 100644 --- a/Final/Polygon.cpp +++ b/Final/Polygon.cpp @@ -20,14 +20,14 @@ std::vector> create_mass_points( std::vector> mass_points; for(const auto& p : points) { - mass_points.push_back({ to_eigen_vector(p), mass_per_point }); + mass_points.push_back({ as_world_coordinates(p), mass_per_point }); } return mass_points; } polygon::polygon(const Vector2& center, std::vector points) - : physical_object_(to_eigen_vector(center), create_mass_points(0.5, points)), enabled_(false) + : physical_object_(as_world_coordinates(center), create_mass_points(0.5, points)), enabled_(false) { shape_.setPointCount(points.size()); @@ -40,17 +40,19 @@ polygon::polygon(const Vector2& center, std::vector points) static_cast(point.y()))); } + const auto cof = as_screen_coordinates(physical_object_.center_of_mass()); + shape_.setOutlineThickness(-0.05); - shape_.setOrigin( - { - static_cast(physical_object_.center_of_mass().x()), - -static_cast(physical_object_.center_of_mass().y()) - }); + shape_.setOrigin(cof); - cof_shape_.setRadius(0.05f); - cof_shape_.setOrigin({ cof_shape_.getRadius(), cof_shape_.getRadius() }); cof_shape_.setFillColor(sf::Color::Yellow); - + cof_shape_.setRadius(0.05f); + cof_shape_.setOrigin( + { + cof.x + cof_shape_.getRadius(), + cof.y + cof_shape_.getRadius() + }); + update_shapes(); } @@ -67,9 +69,9 @@ void polygon::update(const double dt) void polygon::update_shapes() { shape_.setRotation(static_cast(physical_object_.rotation().angle() * 180 / M_PI)); - shape_.setPosition(to_sf_vector(physical_object_.position())); + shape_.setPosition(as_screen_coordinates(physical_object_.position())); - cof_shape_.setPosition(to_sf_vector(physical_object_.position())); + cof_shape_.setPosition(as_screen_coordinates(physical_object_.position())); } void polygon::draw(sf::RenderWindow& window) const diff --git a/Final/Polygon.h b/Final/Polygon.h index e5f8a97..7acb697 100644 --- a/Final/Polygon.h +++ b/Final/Polygon.h @@ -11,8 +11,9 @@ #include "Vec2.h" #include "physical_object.h" -const Vector2 gravity = Vector2(0, 9.81); -//const Vector2 gravity = Vector2(0, 01); +const Vector2 gravity = Vector2(0, -9.81); + +constexpr auto screen_scale = 10; // px = 1m class polygon { @@ -47,23 +48,23 @@ class polygon void set_color(const sf::Color& color); }; -inline sf::Vector2f to_sf_vector(Vector2d v) +inline sf::Vector2f as_screen_coordinates(Vector2d v) { return { - static_cast(v.x()), - static_cast(v.y()) + static_cast(v.x()) * screen_scale, + -static_cast(v.y() * screen_scale) }; } -inline Vector2d to_eigen_vector(const Vector2& v) +inline Vector2d as_world_coordinates(const Vector2& v) { - return { v.x(), v.y() }; + return { v.x() / screen_scale, -v.y() / screen_scale}; } -inline Vector2d to_eigen_vector(const sf::Vector2f& v) +inline Vector2d as_world_coordinates(const sf::Vector2f& v) { - return { v.x, v.y }; + return { v.x / screen_scale, -v.y / screen_scale }; } #endif //PHYSICALLYBASEDSIMULATION_POLYGON_H From e485ac6ce62ff2520b07124f23ecfc01028cf361 Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Sun, 28 Jan 2018 14:39:12 +0100 Subject: [PATCH 25/85] see last commit --- Final/physical_object.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Final/physical_object.cpp b/Final/physical_object.cpp index 7daed55..3d91f46 100644 --- a/Final/physical_object.cpp +++ b/Final/physical_object.cpp @@ -1,8 +1,6 @@ #include "physical_object.h" #include -constexpr auto world_scale = 10; // px = 1m - physical_object::physical_object(const Vector2d position, const std::vector>& points) : position_(position), rotation_(0), velocity_(0, 0), force_(0, 0), @@ -44,8 +42,8 @@ void physical_object::update(const double dt) { position_ += velocity_ * dt; - velocity_ += force_ / mass_ * dt * world_scale; - rotation_ = Rotation2D(rotation_.angle() + angular_velocity_ * dt * world_scale); + velocity_ += force_ / mass_ * dt; + rotation_ = Rotation2D(rotation_.angle() + angular_velocity_ * dt); angular_momentum_ += torque_ * dt; angular_velocity_ = inverse_inertia_ * angular_momentum_; From 7b1892f81b67e55d1c3132418c65b05e73b1173e Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Sun, 28 Jan 2018 21:58:23 +0100 Subject: [PATCH 26/85] added object types (fixed, dynamic, kinematic) removed polygon enabling --- Final/Main.cpp | 13 +++++++++---- Final/Polygon.cpp | 13 +++---------- Final/Polygon.h | 7 ------- Final/physical_object.cpp | 7 +++++++ Final/physical_object.h | 13 +++++++++++++ 5 files changed, 32 insertions(+), 21 deletions(-) diff --git a/Final/Main.cpp b/Final/Main.cpp index 198ad7f..e84d380 100644 --- a/Final/Main.cpp +++ b/Final/Main.cpp @@ -123,7 +123,7 @@ void intersects(const polygon& a, const polygon& b, std::vector& contac { auto end_index = (i == shape.get_shape().getPointCount() - 1) ? 0 : i + 1; - auto start = as_world_coordinates(transform *shape.get_shape().getPoint(i)); + auto start = as_world_coordinates(transform * shape.get_shape().getPoint(i)); auto end = as_world_coordinates(transform * shape.get_shape().getPoint(end_index)); lines.emplace_back(start, end); @@ -173,7 +173,8 @@ std::vector collision_detection(std::vector& polygons) if (&polygon_a == &polygon_b) continue; - if (!polygon_a.get_enabled() && !polygon_b.get_enabled()) + if (polygon_a.get_physical_object().get_type() == object_type::fixed && + polygon_b.get_physical_object().get_type() == object_type::fixed) continue; ContactInfo info; @@ -304,13 +305,15 @@ int main() polygons.emplace_back(polygon::create_circle(Vector2(xs, ys), 5)); + //auto& polygon = polygons.back(); + /*if(draw_circle) polygons.emplace_back(polygon::create_circle(Vector2(xs, ys), 5)); else polygons.emplace_back(polygon::create_random(Vector2(xs, ys), polygon_vertex_count)); - auto& polygon = polygons.back(); + const auto& shape = polygon.get_shape(); std::uniform_int_distribution rnd(0, shape.getPointCount() - 1); @@ -327,7 +330,9 @@ int main() { increase_polygon = false; - polygons.at(polygons.size() - 1).enable(); + polygons.at(polygons.size() - 1) + .get_physical_object() + .set_type(object_type::dynamic); std::cout << polygons.size() << std::endl; diff --git a/Final/Polygon.cpp b/Final/Polygon.cpp index ad186c3..21adaf2 100644 --- a/Final/Polygon.cpp +++ b/Final/Polygon.cpp @@ -46,7 +46,7 @@ std::vector> create_mass_points( } polygon::polygon(const Vector2& center, std::vector points) - : physical_object_(as_world_coordinates(center), create_mass_points(0.5, points)), enabled_(false) + : physical_object_(as_world_coordinates(center), create_mass_points(0.5, points)) { shape_.setPointCount(points.size()); @@ -79,9 +79,6 @@ polygon::polygon(const Vector2& center, std::vector points) void polygon::update(const double dt) { - if (!enabled_) return; - - physical_object_.accelerate({ gravity.x(), gravity.y() }); physical_object_.update(dt); update_shapes(); @@ -100,7 +97,8 @@ void polygon::draw(sf::RenderWindow& window) const window.draw(shape_); window.draw(cof_shape_); - if (!enabled_) return; + if (physical_object_.get_type() == object_type::fixed) + return; // draw contact for (auto &contact_point : get_contacts()) @@ -154,11 +152,6 @@ void polygon::set_color(const sf::Color& color) shape_.setOutlineColor(color); } -void polygon::enable() -{ - enabled_ = true; -} - std::ostream& operator<<(std::ostream& os, const polygon& p) { os << "Polygon:"; diff --git a/Final/Polygon.h b/Final/Polygon.h index 6f315be..471118d 100644 --- a/Final/Polygon.h +++ b/Final/Polygon.h @@ -12,8 +12,6 @@ #include #include -const Vector2 gravity = Vector2(0, -9.81); - constexpr auto screen_scale = 10; // px = 1m class polygon @@ -33,9 +31,6 @@ class polygon physical_object& get_physical_object() { return physical_object_; } void scale(double dt); - void enable(); - - bool get_enabled() const { return enabled_; } void add_contacts(const std::vector& contacts) { @@ -70,8 +65,6 @@ class polygon physical_object physical_object_; - bool enabled_; - std::vector contacts_; void update_shapes(); diff --git a/Final/physical_object.cpp b/Final/physical_object.cpp index 3d91f46..2118783 100644 --- a/Final/physical_object.cpp +++ b/Final/physical_object.cpp @@ -40,6 +40,13 @@ physical_object::physical_object(const Vector2d position, void physical_object::update(const double dt) { + switch (type_) + { + case object_type::fixed: return; + case object_type::dynamic: accelerate(gravity); + default: break; + } + position_ += velocity_ * dt; velocity_ += force_ / mass_ * dt; diff --git a/Final/physical_object.h b/Final/physical_object.h index 17584ea..9873be3 100644 --- a/Final/physical_object.h +++ b/Final/physical_object.h @@ -11,6 +11,15 @@ using Rotation2D = Eigen::Rotation2D; EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(Vector2d) +static const Vector2d gravity = { 0, -9.81 }; + +enum class object_type +{ + fixed, + dynamic, + kinematic +}; + class physical_object { public: @@ -26,6 +35,9 @@ class physical_object Rotation2D rotation() const { return rotation_; } Vector2d center_of_mass() const { return center_of_mass_; } + void set_type(const object_type type) { type_ = type; } + object_type get_type() const { return type_; } + private: double mass_; @@ -43,6 +55,7 @@ class physical_object std::vector offsets_; std::vector velocities_; + object_type type_ = object_type::fixed; }; #endif // PHYSICAL_OBJECT_H From 6729ae372ed8be86600eb30198de1efd532740b2 Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Sun, 28 Jan 2018 22:27:51 +0100 Subject: [PATCH 27/85] added scale to physical object implemented intersection test with points from physical object --- Final/Main.cpp | 24 ++++++++++++-------- Final/Polygon.cpp | 1 + Final/Polygon.h | 2 ++ Final/physical_object.cpp | 47 ++++++++++++++++++++++++--------------- Final/physical_object.h | 17 ++++++++++++-- 5 files changed, 62 insertions(+), 29 deletions(-) diff --git a/Final/Main.cpp b/Final/Main.cpp index e84d380..34c07fa 100644 --- a/Final/Main.cpp +++ b/Final/Main.cpp @@ -111,20 +111,26 @@ bool lineSegmentIntersection( void intersects(const polygon& a, const polygon& b, std::vector& contact_points) { - auto get_points = [](auto shape) + auto get_points = [](const physical_object& object) { using line_t = std::tuple; std::vector lines; - const auto transform = shape.get_shape().getTransform(); + const auto position = + object.position() + + object.center_of_mass(); - for (size_t i = 0; i < shape.get_shape().getPointCount(); i++) - { - auto end_index = (i == shape.get_shape().getPointCount() - 1) ? 0 : i + 1; + const auto& points = object.get_points(); + + for (size_t i = 0; i < points.size(); i++) + { + auto end_index = i == points.size() - 1 + ? 0 + : i + 1; - auto start = as_world_coordinates(transform * shape.get_shape().getPoint(i)); - auto end = as_world_coordinates(transform * shape.get_shape().getPoint(end_index)); + auto start = position + std::get<0>(points[i]); + auto end = position + std::get<0>(points[end_index]); lines.emplace_back(start, end); } @@ -132,8 +138,8 @@ void intersects(const polygon& a, const polygon& b, std::vector& contac return lines; }; - auto lines_a = get_points(a); - auto lines_b = get_points(b); + auto lines_a = get_points(a.get_physical_object()); + auto lines_b = get_points(b.get_physical_object()); for (auto& line_a : lines_a) { diff --git a/Final/Polygon.cpp b/Final/Polygon.cpp index 21adaf2..8507803 100644 --- a/Final/Polygon.cpp +++ b/Final/Polygon.cpp @@ -138,6 +138,7 @@ void polygon::scale(const double factor) static_cast(factor), static_cast(factor)); + physical_object_.set_scale(shape_.getScale().x); } void polygon::set_color(const sf::Color& color) diff --git a/Final/Polygon.h b/Final/Polygon.h index 471118d..841b929 100644 --- a/Final/Polygon.h +++ b/Final/Polygon.h @@ -28,7 +28,9 @@ class polygon void draw(sf::RenderWindow& window) const; const sf::Shape& get_shape() const { return shape_; } + physical_object& get_physical_object() { return physical_object_; } + const physical_object& get_physical_object() const { return physical_object_; } void scale(double dt); diff --git a/Final/physical_object.cpp b/Final/physical_object.cpp index 2118783..c1cab9e 100644 --- a/Final/physical_object.cpp +++ b/Final/physical_object.cpp @@ -4,7 +4,7 @@ physical_object::physical_object(const Vector2d position, const std::vector>& points) : position_(position), rotation_(0), velocity_(0, 0), force_(0, 0), - torque_(0), angular_momentum_(0), velocities_(points.size()) + torque_(0), angular_momentum_(0), points_(points.size()), scale_(1) { // total mass mass_ = std::accumulate(points.begin(), points.end(), 0.0, @@ -27,7 +27,7 @@ physical_object::physical_object(const Vector2d position, const Vector2d offset = std::get<0>(p) - cof; // save offset - offsets_.push_back(offset); + initial_offsets_.push_back(offset); return current_sum + std::get<1>(p) * offset.squaredNorm(); }); @@ -36,6 +36,8 @@ physical_object::physical_object(const Vector2d position, // initial angular velocity angular_velocity_ = inverse_inertia_ * angular_momentum_; + + update_points(); } void physical_object::update(const double dt) @@ -55,21 +57,7 @@ void physical_object::update(const double dt) angular_momentum_ += torque_ * dt; angular_velocity_ = inverse_inertia_ * angular_momentum_; - for(auto i = 0u; i < velocities_.size(); ++i) - { - // transform offset - const auto offset = rotation_.toRotationMatrix() * offsets_[i]; - - // calculate norm of angular velocity part (v = r * omega) - const auto velocity_norm = offset.norm() * angular_velocity_; - const auto normalized_offset = offset.normalized(); - - velocities_[i] = velocity_ + Vector2d - { - velocity_norm * normalized_offset.y(), - velocity_norm * normalized_offset.x(), - }; - } + update_points(); force_ = { 0.0, 0.0 }; torque_ = 0.0; @@ -88,4 +76,27 @@ void physical_object::accelerate(const Vector2d point, const Vector2d accelerati void physical_object::accelerate(const Vector2d acceleration) { force_ += acceleration * mass_; -} \ No newline at end of file +} + +void physical_object::update_points() +{ + for (auto i = 0u; i < points_.size(); ++i) + { + // transform offset + const auto offset = rotation_.toRotationMatrix() * initial_offsets_[i] * scale_; + + // calculate norm of angular velocity part (v = r * omega) + const auto velocity_norm = offset.norm() * angular_velocity_; + const auto normalized_offset = offset.normalized(); + + points_[i] = + { + offset, + velocity_ + Vector2d + { + velocity_norm * normalized_offset.y(), + velocity_norm * normalized_offset.x(), + } + }; + } +} diff --git a/Final/physical_object.h b/Final/physical_object.h index 9873be3..96646b5 100644 --- a/Final/physical_object.h +++ b/Final/physical_object.h @@ -9,7 +9,11 @@ using Eigen::Vector2d; using Eigen::Matrix2d; using Rotation2D = Eigen::Rotation2D; +// offset, velocity +using point_t = std::tuple; + EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(Vector2d) +EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(point_t) static const Vector2d gravity = { 0, -9.81 }; @@ -35,11 +39,17 @@ class physical_object Rotation2D rotation() const { return rotation_; } Vector2d center_of_mass() const { return center_of_mass_; } + void set_scale(const double scale) { scale_ = scale; update_points(); } + double get_scale() const { return scale_; } + void set_type(const object_type type) { type_ = type; } object_type get_type() const { return type_; } + const std::vector& get_points() const { return points_; } + private: double mass_; + double scale_; Vector2d center_of_mass_; Vector2d position_; @@ -53,9 +63,12 @@ class physical_object double angular_velocity_; double inverse_inertia_; - std::vector offsets_; - std::vector velocities_; + std::vector initial_offsets_; + std::vector points_; + object_type type_ = object_type::fixed; + + void update_points(); }; #endif // PHYSICAL_OBJECT_H From 7e7abb2fb3105447241ad8ae2d25cd2320b7a03c Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Sun, 28 Jan 2018 22:39:17 +0100 Subject: [PATCH 28/85] added bounding sphere test --- Final/Main.cpp | 17 +++++++++++++---- Final/Polygon.cpp | 4 ++-- Final/Polygon.h | 4 ++-- Final/physical_object.cpp | 5 ++++- Final/physical_object.h | 7 ++++++- 5 files changed, 27 insertions(+), 10 deletions(-) diff --git a/Final/Main.cpp b/Final/Main.cpp index 34c07fa..5f603ae 100644 --- a/Final/Main.cpp +++ b/Final/Main.cpp @@ -111,7 +111,7 @@ bool lineSegmentIntersection( void intersects(const polygon& a, const polygon& b, std::vector& contact_points) { - auto get_points = [](const physical_object& object) + const auto get_points = [](const physical_object& object) { using line_t = std::tuple; @@ -119,7 +119,7 @@ void intersects(const polygon& a, const polygon& b, std::vector& contac const auto position = object.position() + - object.center_of_mass(); + object.center_of_mass_local(); const auto& points = object.get_points(); @@ -138,8 +138,17 @@ void intersects(const polygon& a, const polygon& b, std::vector& contac return lines; }; - auto lines_a = get_points(a.get_physical_object()); - auto lines_b = get_points(b.get_physical_object()); + const auto& object_a = a.get_physical_object(); + const auto& object_b = b.get_physical_object(); + + if ((object_a.center_of_mass_global() - + object_b.center_of_mass_global()).norm() > + object_a.bounding_radius() + + object_b.bounding_radius()) + return; + + auto lines_a = get_points(object_a); + auto lines_b = get_points(object_b); for (auto& line_a : lines_a) { diff --git a/Final/Polygon.cpp b/Final/Polygon.cpp index 8507803..54b2478 100644 --- a/Final/Polygon.cpp +++ b/Final/Polygon.cpp @@ -61,7 +61,7 @@ polygon::polygon(const Vector2& center, std::vector points) static_cast(point.y()))); } - const auto cof = as_screen_coordinates(physical_object_.center_of_mass()); + const auto cof = as_screen_coordinates(physical_object_.center_of_mass_local()); shape_.setOutlineThickness(-0.05); shape_.setOrigin(cof); @@ -114,7 +114,7 @@ void polygon::draw(sf::RenderWindow& window) const circle.setFillColor(sf::Color{255, 0, 255}); window.draw(circle); - const auto center = physical_object_.center_of_mass() + physical_object_.position(); + const auto center = physical_object_.center_of_mass_local() + physical_object_.position(); const auto direction = contact - center; sf::Vertex line[] = diff --git a/Final/Polygon.h b/Final/Polygon.h index 841b929..6d83fd0 100644 --- a/Final/Polygon.h +++ b/Final/Polygon.h @@ -54,8 +54,8 @@ class polygon { return { - physical_object_.center_of_mass().x(), - physical_object_.center_of_mass().y() + physical_object_.center_of_mass_local().x(), + physical_object_.center_of_mass_local().y() }; } diff --git a/Final/physical_object.cpp b/Final/physical_object.cpp index c1cab9e..4f3f685 100644 --- a/Final/physical_object.cpp +++ b/Final/physical_object.cpp @@ -4,7 +4,7 @@ physical_object::physical_object(const Vector2d position, const std::vector>& points) : position_(position), rotation_(0), velocity_(0, 0), force_(0, 0), - torque_(0), angular_momentum_(0), points_(points.size()), scale_(1) + torque_(0), angular_momentum_(0), points_(points.size()), scale_(1), radius_(0) { // total mass mass_ = std::accumulate(points.begin(), points.end(), 0.0, @@ -98,5 +98,8 @@ void physical_object::update_points() velocity_norm * normalized_offset.x(), } }; + + // save maximum offset + radius_ = std::max(radius_, offset.norm()); } } diff --git a/Final/physical_object.h b/Final/physical_object.h index 96646b5..4389ba2 100644 --- a/Final/physical_object.h +++ b/Final/physical_object.h @@ -37,7 +37,11 @@ class physical_object Vector2d position() const { return position_; } Rotation2D rotation() const { return rotation_; } - Vector2d center_of_mass() const { return center_of_mass_; } + + Vector2d center_of_mass_local() const { return center_of_mass_; } + Vector2d center_of_mass_global() const { return position_ + center_of_mass_; } + + double bounding_radius() const { return radius_; } void set_scale(const double scale) { scale_ = scale; update_points(); } double get_scale() const { return scale_; } @@ -50,6 +54,7 @@ class physical_object private: double mass_; double scale_; + double radius_; Vector2d center_of_mass_; Vector2d position_; From d1657420727b612f291bb6fcd350ab418a68f166 Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Sun, 28 Jan 2018 22:55:02 +0100 Subject: [PATCH 29/85] refactoring --- Final/Main.cpp | 46 +++++++-------------------------------- Final/Polygon.cpp | 7 +++--- Final/physical_object.cpp | 4 ++-- Final/smoother.h | 27 +++++++++++++++++++++++ 4 files changed, 41 insertions(+), 43 deletions(-) create mode 100644 Final/smoother.h diff --git a/Final/Main.cpp b/Final/Main.cpp index 5f603ae..132dc96 100644 --- a/Final/Main.cpp +++ b/Final/Main.cpp @@ -14,6 +14,10 @@ *******************************************************************/ /* Standard includes */ +#include +#include +#include +#include #include #include #include @@ -22,10 +26,7 @@ #include "Polygon.h" #include "Console.hpp" #include "ContactInfo.hpp" -#include -#include -#include - +#include "smoother.h" enum class GameLoopType { @@ -34,7 +35,6 @@ enum class GameLoopType Unkown }; - /*----------------------------------------------------------------*/ void render(sf::RenderWindow& window, const std::vector& polygons) @@ -51,12 +51,6 @@ void render(sf::RenderWindow& window, const std::vector& polygons) window.display(); } - -#include -#include -#include -using namespace std; - bool lineSegmentIntersection( double Ax, double Ay, double Bx, double By, @@ -175,7 +169,6 @@ void intersects(const polygon& a, const polygon& b, std::vector& contac } } - std::vector collision_detection(std::vector& polygons) { std::vector constacts; @@ -216,7 +209,7 @@ void collision_resolution(const std::vector& contacts) void update(std::vector& polygons, const double dt) { - auto contacts = collision_detection(polygons); + const auto contacts = collision_detection(polygons); if (!contacts.empty()) collision_resolution(contacts); @@ -227,29 +220,6 @@ void update(std::vector& polygons, const double dt) } } -#include - -template -class Smoother -{ -public: - - void add(T v) - { - data.push_back(v); - if (data.size() > MAX) - data.pop_front(); - } - - T get() - { - return std::accumulate(data.begin(), data.end(), 0.0) / data.size(); - } - -private: - std::deque data; -}; - int main() { auto increase_polygon = false; @@ -280,8 +250,8 @@ int main() auto game_loop_type = GameLoopType::Fixed; - Smoother draw_time_smooth; - Smoother update_time_smooth; + smoother draw_time_smooth; + smoother update_time_smooth; auto last_time = clock::now(); diff --git a/Final/Polygon.cpp b/Final/Polygon.cpp index 54b2478..3443281 100644 --- a/Final/Polygon.cpp +++ b/Final/Polygon.cpp @@ -21,8 +21,9 @@ std::vector> create_mass_points( // Calculate value of shoelace formula auto area = 0.0; - int j = points.size() - 1; - for (int i = 0; i < points.size(); i++) + auto j = points.size() - 1; + + for (auto i = 0u; i < points.size(); i++) { auto point_i = points[i]; auto point_j = points[j]; @@ -114,7 +115,7 @@ void polygon::draw(sf::RenderWindow& window) const circle.setFillColor(sf::Color{255, 0, 255}); window.draw(circle); - const auto center = physical_object_.center_of_mass_local() + physical_object_.position(); + const auto center = physical_object_.center_of_mass_global(); const auto direction = contact - center; sf::Vertex line[] = diff --git a/Final/physical_object.cpp b/Final/physical_object.cpp index 4f3f685..8a5e945 100644 --- a/Final/physical_object.cpp +++ b/Final/physical_object.cpp @@ -3,8 +3,8 @@ physical_object::physical_object(const Vector2d position, const std::vector>& points) - : position_(position), rotation_(0), velocity_(0, 0), force_(0, 0), - torque_(0), angular_momentum_(0), points_(points.size()), scale_(1), radius_(0) + : scale_(1), radius_(0), position_(position), rotation_(0), + velocity_(0, 0), force_(0, 0), torque_(0), angular_momentum_(0), points_(points.size()) { // total mass mass_ = std::accumulate(points.begin(), points.end(), 0.0, diff --git a/Final/smoother.h b/Final/smoother.h new file mode 100644 index 0000000..ebedcf3 --- /dev/null +++ b/Final/smoother.h @@ -0,0 +1,27 @@ +#ifndef SMOOTHER_H +#define SMOOTHER_H + +#include +#include + +template +class smoother +{ +public: + void add(T v) + { + data.push_back(v); + if (data.size() > MAX) + data.pop_front(); + } + + T get() + { + return std::accumulate(data.begin(), data.end(), 0.0) / data.size(); + } + +private: + std::deque data; +}; + +#endif // SMOOTHER_H From 3320a5d874503ade7d969a93583479e72c0e6d13 Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Mon, 29 Jan 2018 13:17:30 +0100 Subject: [PATCH 30/85] reworked collision detection to give additional info --- Final/ContactInfo.hpp | 27 ++++++-- Final/Main.cpp | 149 +++++++++++++++++++++++----------------- Final/Polygon.cpp | 43 ++++++++---- Final/Polygon.h | 19 ++--- Final/physical_object.h | 2 +- 5 files changed, 146 insertions(+), 94 deletions(-) diff --git a/Final/ContactInfo.hpp b/Final/ContactInfo.hpp index 579f8e4..be9bd36 100644 --- a/Final/ContactInfo.hpp +++ b/Final/ContactInfo.hpp @@ -1,11 +1,26 @@ #pragma once -#include "Polygon.h" -#include "Vec2.h" +#include "physical_object.h" -struct ContactInfo +using line_t = std::tuple; + +struct contact_info { - polygon* a; - polygon* b; - std::vector contact_points; + contact_info( + physical_object& point_owner, + const point_t& point, + physical_object& line_owner, + const line_t& line) + : point_owner(point_owner), + point(point), + line_owner(line_owner), + line(line) + { + } + + physical_object& point_owner; + point_t point; + + physical_object& line_owner; + line_t line; }; \ No newline at end of file diff --git a/Final/Main.cpp b/Final/Main.cpp index 132dc96..1adaadb 100644 --- a/Final/Main.cpp +++ b/Final/Main.cpp @@ -103,19 +103,13 @@ bool lineSegmentIntersection( } -void intersects(const polygon& a, const polygon& b, std::vector& contact_points) +void find_intersections(physical_object& object_a, physical_object& object_b, std::vector& contacts) { - const auto get_points = [](const physical_object& object) - { - using line_t = std::tuple; - - std::vector lines; - - const auto position = - object.position() + - object.center_of_mass_local(); + const auto get_lines = [](const physical_object& object) + { + std::vector lines; - const auto& points = object.get_points(); + const auto& points = object.points(); for (size_t i = 0; i < points.size(); i++) { @@ -123,83 +117,112 @@ void intersects(const polygon& a, const polygon& b, std::vector& contac ? 0 : i + 1; - auto start = position + std::get<0>(points[i]); - auto end = position + std::get<0>(points[end_index]); + lines.emplace_back(points[i], points[end_index]); + } - lines.emplace_back(start, end); - } + return lines; + }; - return lines; - }; + const auto points_a = object_a.points(); + const auto lines_b = get_lines(object_b); + + const auto position_a = object_a.position(); + const auto position_b = object_b.position(); - const auto& object_a = a.get_physical_object(); - const auto& object_b = b.get_physical_object(); + for (const auto& point_a : points_a) + { + line_t line; + auto intersections = 0; + auto distance = std::numeric_limits::max(); - if ((object_a.center_of_mass_global() - - object_b.center_of_mass_global()).norm() > - object_a.bounding_radius() + - object_b.bounding_radius()) - return; + for (const auto& line_b : lines_b) + { + const auto x1 = position_a.x() + std::get<0>(point_a).x(); + const auto y1 = position_a.y() + std::get<0>(point_a).y(); - auto lines_a = get_points(object_a); - auto lines_b = get_points(object_b); + const auto x2 = position_a.x() + std::get<0>(point_a).x() * 100000.0; + const auto y2 = position_a.y() + std::get<0>(point_a).y() * 100000.0; - for (auto& line_a : lines_a) - { - for (auto& line_b : lines_b) - { - auto x1 = std::get<0>(line_a).x(); - auto y1 = std::get<0>(line_a).y(); + const auto x3 = position_b.x() + std::get<0>(std::get<0>(line_b)).x(); + const auto y3 = position_b.y() + std::get<0>(std::get<0>(line_b)).y(); - auto x2 = std::get<1>(line_a).x(); - auto y2 = std::get<1>(line_a).y(); + const auto x4 = position_b.x() + std::get<0>(std::get<1>(line_b)).x(); + const auto y4 = position_b.y() + std::get<0>(std::get<1>(line_b)).y(); - auto x3 = std::get<0>(line_b).x(); - auto y3 = std::get<0>(line_b).y(); + double ix, iy; + if (!lineSegmentIntersection(x1, y1, x2, y2, x3, y3, x4, y4, ix, iy)) + continue; - auto x4 = std::get<1>(line_b).x(); - auto y4 = std::get<1>(line_b).y(); + ++intersections; - double ix, iy; - if(!lineSegmentIntersection(x1, y1, x2, y2, x3, y3, x4, y4, ix, iy)) + const auto current_distance = + (Vector2d(ix, iy) - Vector2d(x1, y2)).norm(); + + if (current_distance >= distance) continue; - contact_points.emplace_back(ix, iy); - } - } + distance = current_distance; + line = line_b; + } + + if (intersections % 2 == 0) continue; + + contacts.emplace_back(object_a, point_a, object_b, line); + } } -std::vector collision_detection(std::vector& polygons) +bool intersects(physical_object& a, physical_object& b, std::vector& contacts) { - std::vector constacts; - for (auto& polygon_a : polygons) + if ((a.center_of_mass_global() - + b.center_of_mass_global()).norm() > + a.bounding_radius() + + b.bounding_radius()) + return false; + + find_intersections(a, b, contacts); + find_intersections(b, a, contacts); + + return !contacts.empty(); +} + +std::vector collision_detection(std::vector& polygons) +{ + for (auto& polygon_a : polygons) + { + polygon_a.clear_contacts(); + } + + std::vector global_contacts; + for (auto i = 0u; i < polygons.size(); ++i) { - polygon_a.clear_contacts(); + auto& polygon_a = polygons[i]; - for (auto& polygon_b : polygons) + for (auto j = i + 1; j < polygons.size(); ++j) { - if (&polygon_a == &polygon_b) - continue; + auto& polygon_b = polygons[j]; + + auto& object_a = polygon_a.get_physical_object(); + auto& object_b = polygon_b.get_physical_object(); - if (polygon_a.get_physical_object().get_type() == object_type::fixed && - polygon_b.get_physical_object().get_type() == object_type::fixed) + if (object_a.get_type() == object_type::fixed && + object_b.get_type() == object_type::fixed) continue; - ContactInfo info; - intersects(polygon_a, polygon_b, info.contact_points); - if (!info.contact_points.empty()) - { - polygon_a.add_contacts(info.contact_points); - polygon_b.add_contacts(info.contact_points); + std::vector local_contacts; + if (!intersects(object_a, object_b, local_contacts)) + continue; - info.a = &polygon_a; - info.b = &polygon_b; - constacts.push_back(std::move(info)); - } + polygon_a.add_contacts(local_contacts); + polygon_b.add_contacts(local_contacts); + + std::move( + local_contacts.begin(), + local_contacts.end(), + std::back_inserter(global_contacts)); } } - return constacts; + return global_contacts; } void collision_resolution(const std::vector& contacts) diff --git a/Final/Polygon.cpp b/Final/Polygon.cpp index 3443281..bcaff55 100644 --- a/Final/Polygon.cpp +++ b/Final/Polygon.cpp @@ -98,33 +98,46 @@ void polygon::draw(sf::RenderWindow& window) const window.draw(shape_); window.draw(cof_shape_); - if (physical_object_.get_type() == object_type::fixed) - return; - // draw contact - for (auto &contact_point : get_contacts()) + for (const auto& contact : contacts_) { - const Vector2d contact = - { - static_cast(contact_point.x()), - static_cast(contact_point.y()) - }; + const auto center = physical_object_.center_of_mass_global(); + const auto point = center + std::get<0>(contact.point); + sf::CircleShape circle(3); - circle.setPosition(as_screen_coordinates(contact)); + circle.setPosition(as_screen_coordinates(point)); circle.setFillColor(sf::Color{255, 0, 255}); window.draw(circle); - - const auto center = physical_object_.center_of_mass_global(); - const auto direction = contact - center; + + const auto direction = point - center; sf::Vertex line[] = { sf::Vertex(as_screen_coordinates(center), sf::Color{255, 0, 255}), - sf::Vertex(as_screen_coordinates(center + direction), sf::Color{255, 0, 255} - )}; + sf::Vertex(as_screen_coordinates(center + direction), sf::Color{255, 0, 255}) + }; window.draw(line, 2, sf::Lines); + + const auto position_line_owner = contact.line_owner.center_of_mass_global(); + const auto position_point_owner = contact.line_owner.center_of_mass_global(); + + const auto line_start = std::get<0>(std::get<0>(contact.line)); + const auto line_end = std::get<0>(std::get<1>(contact.line)); + + const auto normal = Vector2d( + -(line_end - line_start).y(), + (line_end - line_start).x() + ).normalized(); + + sf::Vertex normal_line[] = + { + sf::Vertex(as_screen_coordinates(point), sf::Color{ 255, 127, 0 }), + sf::Vertex(as_screen_coordinates(point + normal * 5), sf::Color{ 255, 127, 0 }) + }; + + window.draw(normal_line, 2, sf::Lines); } } diff --git a/Final/Polygon.h b/Final/Polygon.h index 6d83fd0..3b78993 100644 --- a/Final/Polygon.h +++ b/Final/Polygon.h @@ -11,6 +11,7 @@ #include #include +#include "ContactInfo.hpp" constexpr auto screen_scale = 10; // px = 1m @@ -34,10 +35,15 @@ class polygon void scale(double dt); - void add_contacts(const std::vector& contacts) + void add_contacts(const std::vector& contacts) { - for (auto& contact : contacts) - contacts_.push_back(contact); + for (auto& contact : contacts) + { + if(&contact.point_owner != &physical_object_) + continue; + + contacts_.push_back(contact); + } } void clear_contacts() @@ -45,11 +51,6 @@ class polygon contacts_.clear(); } - const std::vector& get_contacts() const - { - return contacts_; - } - const Vector2& get_center_local() const { return @@ -67,7 +68,7 @@ class polygon physical_object physical_object_; - std::vector contacts_; + std::vector contacts_; void update_shapes(); void set_color(const sf::Color& color); diff --git a/Final/physical_object.h b/Final/physical_object.h index 4389ba2..69c7747 100644 --- a/Final/physical_object.h +++ b/Final/physical_object.h @@ -49,7 +49,7 @@ class physical_object void set_type(const object_type type) { type_ = type; } object_type get_type() const { return type_; } - const std::vector& get_points() const { return points_; } + const std::vector& points() const { return points_; } private: double mass_; From e37e5f305bf11c2a9deeb751a76a05bcaf924e38 Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Mon, 29 Jan 2018 14:32:24 +0100 Subject: [PATCH 31/85] fixed warnings --- Final/Console.hpp | 2 +- Final/Polygon.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Final/Console.hpp b/Final/Console.hpp index 87e6cf6..69939d9 100644 --- a/Final/Console.hpp +++ b/Final/Console.hpp @@ -31,7 +31,7 @@ class Console m_text.setFont(font); m_text.setCharacterSize(12); - m_text.setColor(sf::Color::White); + m_text.setFillColor(sf::Color::White); } template diff --git a/Final/Polygon.cpp b/Final/Polygon.cpp index bcaff55..295048d 100644 --- a/Final/Polygon.cpp +++ b/Final/Polygon.cpp @@ -64,7 +64,7 @@ polygon::polygon(const Vector2& center, std::vector points) const auto cof = as_screen_coordinates(physical_object_.center_of_mass_local()); - shape_.setOutlineThickness(-0.05); + shape_.setOutlineThickness(-0.05f); shape_.setOrigin(cof); cof_shape_.setFillColor(sf::Color::Yellow); From f586c3e1bba0a7d975357f0884d9d118e8315c03 Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Mon, 29 Jan 2018 14:33:35 +0100 Subject: [PATCH 32/85] added linear collision resolution --- Final/Main.cpp | 38 +++++++++++++++++++++++++++++++++++--- Final/Polygon.cpp | 7 ++----- Final/Polygon.h | 2 +- Final/physical_object.cpp | 9 ++++++++- Final/physical_object.h | 27 +++++++++++++++++++++++++-- 5 files changed, 71 insertions(+), 12 deletions(-) diff --git a/Final/Main.cpp b/Final/Main.cpp index 1adaadb..3040431 100644 --- a/Final/Main.cpp +++ b/Final/Main.cpp @@ -225,9 +225,41 @@ std::vector collision_detection(std::vector& polygons) return global_contacts; } -void collision_resolution(const std::vector& contacts) +void collision_resolution(const std::vector& contacts) { - + for (const auto& contact : contacts) + { + const auto line_start = std::get<0>(std::get<0>(contact.line)); + const auto line_end = std::get<0>(std::get<1>(contact.line)); + + const auto normal = Vector2d( + -(line_end - line_start).y(), + (line_end - line_start).x() + ).normalized(); + + auto& a = contact.line_owner; + auto& b = contact.point_owner; + + constexpr auto e = 0.99; + + const auto relative_linear_velocity = + (a.linear_velocity() - b.linear_velocity()).dot(normal); + + //if(relative_linear_velocity < 0) + // continue; + + const auto j = -(1 + e) * relative_linear_velocity / + (normal.dot(normal) * (a.inverse_mass() + b.inverse_mass())); + + const auto impulse = j * normal; + + const auto total_mass = a.mass() + b.mass(); + + assert(total_mass > 0); + + a.add_linear_velocity(impulse * a.inverse_mass() * a.mass() / total_mass); + b.add_linear_velocity(-impulse * b.inverse_mass() * b.mass() / total_mass); + } } void update(std::vector& polygons, const double dt) @@ -285,7 +317,7 @@ int main() func(); auto elapsed_s = duration{ clock::now() - start_frame }; - smoother.add(1.0 / elapsed_s.count()); + smoother.add(elapsed_s.count()); Console::instance().set_param(name, smoother.get()); }; diff --git a/Final/Polygon.cpp b/Final/Polygon.cpp index 295048d..0189d4f 100644 --- a/Final/Polygon.cpp +++ b/Final/Polygon.cpp @@ -120,9 +120,6 @@ void polygon::draw(sf::RenderWindow& window) const window.draw(line, 2, sf::Lines); - const auto position_line_owner = contact.line_owner.center_of_mass_global(); - const auto position_point_owner = contact.line_owner.center_of_mass_global(); - const auto line_start = std::get<0>(std::get<0>(contact.line)); const auto line_end = std::get<0>(std::get<1>(contact.line)); @@ -134,7 +131,7 @@ void polygon::draw(sf::RenderWindow& window) const sf::Vertex normal_line[] = { sf::Vertex(as_screen_coordinates(point), sf::Color{ 255, 127, 0 }), - sf::Vertex(as_screen_coordinates(point + normal * 5), sf::Color{ 255, 127, 0 }) + sf::Vertex(as_screen_coordinates(point + normal * 0.5), sf::Color{ 255, 127, 0 }) }; window.draw(normal_line, 2, sf::Lines); @@ -224,7 +221,7 @@ polygon polygon::create_line(const Vector2 start, const Vector2 end) polygon polygon::create_circle(const Vector2 center, const double radius) { - constexpr auto vertex_count = 100; + constexpr auto vertex_count = 20; const auto angle = 360.0 / vertex_count; diff --git a/Final/Polygon.h b/Final/Polygon.h index 3b78993..7beb12b 100644 --- a/Final/Polygon.h +++ b/Final/Polygon.h @@ -13,7 +13,7 @@ #include #include "ContactInfo.hpp" -constexpr auto screen_scale = 10; // px = 1m +constexpr auto screen_scale = 30; // px = 1m class polygon { diff --git a/Final/physical_object.cpp b/Final/physical_object.cpp index 8a5e945..361e8f5 100644 --- a/Final/physical_object.cpp +++ b/Final/physical_object.cpp @@ -49,9 +49,11 @@ void physical_object::update(const double dt) default: break; } + const auto scaled_mass = mass_ * scale_; + position_ += velocity_ * dt; - velocity_ += force_ / mass_ * dt; + velocity_ += force_ / scaled_mass * dt; rotation_ = Rotation2D(rotation_.angle() + angular_velocity_ * dt); angular_momentum_ += torque_ * dt; @@ -78,6 +80,11 @@ void physical_object::accelerate(const Vector2d acceleration) force_ += acceleration * mass_; } +void physical_object::add_force(Vector2d force) +{ + force_ += force; +} + void physical_object::update_points() { for (auto i = 0u; i < points_.size(); ++i) diff --git a/Final/physical_object.h b/Final/physical_object.h index 69c7747..750bdab 100644 --- a/Final/physical_object.h +++ b/Final/physical_object.h @@ -33,17 +33,39 @@ class physical_object void update(const double dt); void accelerate(Vector2d point, Vector2d acceleration); - void accelerate(Vector2d force); + void accelerate(Vector2d acceleration); + void add_force(Vector2d force); Vector2d position() const { return position_; } Rotation2D rotation() const { return rotation_; } + Vector2d linear_velocity() const { return velocity_; } + void add_linear_velocity(const Vector2d v) { velocity_ += v; } + + double mass() const + { + return type_ == object_type::fixed + ? 0 + : mass_; + } + + double inverse_mass() const + { + return type_ == object_type::fixed + ? 0 + : 1.0 / mass_; + } Vector2d center_of_mass_local() const { return center_of_mass_; } Vector2d center_of_mass_global() const { return position_ + center_of_mass_; } double bounding_radius() const { return radius_; } - void set_scale(const double scale) { scale_ = scale; update_points(); } + void set_scale(const double scale) + { + scale_ = scale; + update_points(); + } + double get_scale() const { return scale_; } void set_type(const object_type type) { type_ = type; } @@ -51,6 +73,7 @@ class physical_object const std::vector& points() const { return points_; } + private: double mass_; double scale_; From 99686c6d8b72e6abe3c75b4b0db14b244f126550 Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Mon, 29 Jan 2018 16:33:45 +0100 Subject: [PATCH 33/85] remove const qualifier from uniform_real_distribution --- Final/Polygon.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Final/Polygon.cpp b/Final/Polygon.cpp index 0189d4f..21fe536 100644 --- a/Final/Polygon.cpp +++ b/Final/Polygon.cpp @@ -245,7 +245,7 @@ polygon polygon::create_random(const Vector2 center, const size_t vertex_count) { const auto angle = 2 * M_PI / vertex_count; - const std::uniform_real_distribution rnd( + std::uniform_real_distribution rnd( -angle / vertex_count, angle / vertex_count); std::vector points; From 874d0ec986ccba59f1c826130fdb37679de4878b Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Mon, 29 Jan 2018 20:20:38 +0100 Subject: [PATCH 34/85] added position correction added point of intersection and penetration depth to contact info added mass scaling --- Final/ContactInfo.hpp | 14 ++--- Final/Main.cpp | 104 +++++++++++++++++++++++++++----------- Final/Polygon.cpp | 9 +++- Final/physical_object.cpp | 4 +- Final/physical_object.h | 1 + 5 files changed, 92 insertions(+), 40 deletions(-) diff --git a/Final/ContactInfo.hpp b/Final/ContactInfo.hpp index be9bd36..913fc75 100644 --- a/Final/ContactInfo.hpp +++ b/Final/ContactInfo.hpp @@ -6,15 +6,14 @@ using line_t = std::tuple; struct contact_info { - contact_info( - physical_object& point_owner, - const point_t& point, - physical_object& line_owner, - const line_t& line) + contact_info(physical_object& point_owner, const point_t& point, physical_object& line_owner, const line_t& line, + double penetration_depth, const Vector2d& point_of_intersection) : point_owner(point_owner), point(point), line_owner(line_owner), - line(line) + line(line), + penetration_depth(penetration_depth), + point_of_intersection(point_of_intersection) { } @@ -23,4 +22,7 @@ struct contact_info physical_object& line_owner; line_t line; + + double penetration_depth; + Vector2d point_of_intersection; }; \ No newline at end of file diff --git a/Final/Main.cpp b/Final/Main.cpp index 3040431..19eac09 100644 --- a/Final/Main.cpp +++ b/Final/Main.cpp @@ -102,6 +102,36 @@ bool lineSegmentIntersection( return true; } +bool inside(const Vector2d point, + const Vector2d point_offset, + const std::vector& lines, + const Vector2d line_offset) +{ + auto intersections = 0; + + for (const auto& line_b : lines) + { + const auto x1 = point_offset.x() + point.x(); + const auto y1 = point_offset.y() + point.y(); + + const auto x2 = point_offset.x() + point.x() * 100000.0; + const auto y2 = point_offset.y() + point.y() * 100000.0; + + const auto x3 = line_offset.x() + std::get<0>(std::get<0>(line_b)).x(); + const auto y3 = line_offset.y() + std::get<0>(std::get<0>(line_b)).y(); + + const auto x4 = line_offset.x() + std::get<0>(std::get<1>(line_b)).x(); + const auto y4 = line_offset.y() + std::get<0>(std::get<1>(line_b)).y(); + + double ix, iy; + if (!lineSegmentIntersection(x1, y1, x2, y2, x3, y3, x4, y4, ix, iy)) + continue; + + ++intersections; + } + + return intersections % 2 == 1; +} void find_intersections(physical_object& object_a, physical_object& object_b, std::vector& contacts) { @@ -131,43 +161,50 @@ void find_intersections(physical_object& object_a, physical_object& object_b, st for (const auto& point_a : points_a) { + const auto point = std::get<0>(point_a); + + if (!inside(point, position_a, lines_b, position_b)) + continue; + line_t line; - auto intersections = 0; auto distance = std::numeric_limits::max(); + auto penetration_depth = 0.0; + Vector2d point_of_intersection; for (const auto& line_b : lines_b) { - const auto x1 = position_a.x() + std::get<0>(point_a).x(); - const auto y1 = position_a.y() + std::get<0>(point_a).y(); + const auto line_start = position_b + std::get<0>(std::get<0>(line_b)); + const auto line_end = position_b + std::get<0>(std::get<1>(line_b)); - const auto x2 = position_a.x() + std::get<0>(point_a).x() * 100000.0; - const auto y2 = position_a.y() + std::get<0>(point_a).y() * 100000.0; + const auto x1 = position_a.x(); + const auto y1 = position_a.y(); - const auto x3 = position_b.x() + std::get<0>(std::get<0>(line_b)).x(); - const auto y3 = position_b.y() + std::get<0>(std::get<0>(line_b)).y(); + const auto x2 = position_a.x() + point.x(); + const auto y2 = position_a.y() + point.y(); - const auto x4 = position_b.x() + std::get<0>(std::get<1>(line_b)).x(); - const auto y4 = position_b.y() + std::get<0>(std::get<1>(line_b)).y(); + const auto x3 = line_start.x(); + const auto y3 = line_start.y(); + + const auto x4 = line_end.x(); + const auto y4 = line_end.y(); double ix, iy; if (!lineSegmentIntersection(x1, y1, x2, y2, x3, y3, x4, y4, ix, iy)) continue; - ++intersections; - const auto current_distance = - (Vector2d(ix, iy) - Vector2d(x1, y2)).norm(); + (Vector2d(x2, y2)-Vector2d(ix, iy)).norm(); if (current_distance >= distance) continue; distance = current_distance; line = line_b; + penetration_depth = current_distance; + point_of_intersection = Vector2d(ix, iy); } - if (intersections % 2 == 0) continue; - - contacts.emplace_back(object_a, point_a, object_b, line); + contacts.emplace_back(object_a, point_a, object_b, line, penetration_depth, point_of_intersection); } } @@ -232,15 +269,12 @@ void collision_resolution(const std::vector& contacts) const auto line_start = std::get<0>(std::get<0>(contact.line)); const auto line_end = std::get<0>(std::get<1>(contact.line)); - const auto normal = Vector2d( - -(line_end - line_start).y(), - (line_end - line_start).x() - ).normalized(); + const auto normal = ((line_end + line_start) / 2.0).normalized(); auto& a = contact.line_owner; auto& b = contact.point_owner; - constexpr auto e = 0.99; + constexpr auto e = 0.5; const auto relative_linear_velocity = (a.linear_velocity() - b.linear_velocity()).dot(normal); @@ -257,8 +291,18 @@ void collision_resolution(const std::vector& contacts) assert(total_mass > 0); - a.add_linear_velocity(impulse * a.inverse_mass() * a.mass() / total_mass); - b.add_linear_velocity(-impulse * b.inverse_mass() * b.mass() / total_mass); + a.add_linear_velocity(impulse * a.inverse_mass()); + b.add_linear_velocity(-impulse * b.inverse_mass()); + + // positional correction + const auto percent = 0.2; // usually 20% to 80% + const auto slop = 0.01; // usually 0.01 to 0.1 + + const Vector2d correction = std::max(contact.penetration_depth - slop, 0.0) + / (a.inverse_mass() + b.inverse_mass()) * percent * normal; + + a.move(-a.inverse_mass() * correction); + b.move(b.inverse_mass() * correction); } } @@ -285,15 +329,15 @@ int main() double xs = 0; double ys = 0; - constexpr auto width = 600; - constexpr auto height = 600; + constexpr auto width = 1280; + constexpr auto height = 800; Console::instance().init(); sf::RenderWindow window(sf::VideoMode(width, height), "2D Collision detection"); - polygons.emplace_back(polygon::create_rectangle(Vector2(200, 500), Vector2(300, 50))); - polygons.emplace_back(polygon::create_rectangle(Vector2(200, 200), Vector2(300, 50))); + polygons.emplace_back(polygon::create_rectangle(Vector2(400, 600), Vector2(500, 80))); + polygons.emplace_back(polygon::create_rectangle(Vector2(400, 300), Vector2(500, 80))); using namespace std::chrono; using clock = high_resolution_clock; @@ -305,8 +349,8 @@ int main() auto game_loop_type = GameLoopType::Fixed; - smoother draw_time_smooth; - smoother update_time_smooth; + smoother draw_time_smooth; + smoother update_time_smooth; auto last_time = clock::now(); @@ -316,8 +360,8 @@ int main() func(); - auto elapsed_s = duration{ clock::now() - start_frame }; - smoother.add(elapsed_s.count()); + auto elapsed = duration_cast(clock::now() - start_frame); + smoother.add(elapsed.count()); Console::instance().set_param(name, smoother.get()); }; diff --git a/Final/Polygon.cpp b/Final/Polygon.cpp index 21fe536..31178e7 100644 --- a/Final/Polygon.cpp +++ b/Final/Polygon.cpp @@ -105,9 +105,14 @@ void polygon::draw(sf::RenderWindow& window) const const auto point = center + std::get<0>(contact.point); - sf::CircleShape circle(3); + sf::CircleShape circle(1); circle.setPosition(as_screen_coordinates(point)); circle.setFillColor(sf::Color{255, 0, 255}); + circle.setOrigin(circle.getRadius(), circle.getRadius()); + window.draw(circle); + + circle.setPosition(as_screen_coordinates(contact.point_of_intersection)); + circle.setFillColor(sf::Color{ 255, 255, 255 }); window.draw(circle); const auto direction = point - center; @@ -131,7 +136,7 @@ void polygon::draw(sf::RenderWindow& window) const sf::Vertex normal_line[] = { sf::Vertex(as_screen_coordinates(point), sf::Color{ 255, 127, 0 }), - sf::Vertex(as_screen_coordinates(point + normal * 0.5), sf::Color{ 255, 127, 0 }) + sf::Vertex(as_screen_coordinates(point + normal * 0.3), sf::Color{ 255, 127, 0 }) }; window.draw(normal_line, 2, sf::Lines); diff --git a/Final/physical_object.cpp b/Final/physical_object.cpp index 361e8f5..524bdb4 100644 --- a/Final/physical_object.cpp +++ b/Final/physical_object.cpp @@ -70,14 +70,14 @@ void physical_object::accelerate(const Vector2d point, const Vector2d accelerati accelerate(acceleration); const auto offset = point - center_of_mass_; - const auto force = acceleration * mass_; + const auto force = acceleration * mass_ * scale_; torque_ += offset.x() * force.y() - force.x() * offset.y(); } void physical_object::accelerate(const Vector2d acceleration) { - force_ += acceleration * mass_; + force_ += acceleration * mass_ * scale_; } void physical_object::add_force(Vector2d force) diff --git a/Final/physical_object.h b/Final/physical_object.h index 750bdab..f5eeb48 100644 --- a/Final/physical_object.h +++ b/Final/physical_object.h @@ -72,6 +72,7 @@ class physical_object object_type get_type() const { return type_; } const std::vector& points() const { return points_; } + void move(const Vector2d& v) { position_ += v; } private: From d7ba3a84447eb0cf9b8059e87605e3c65d23e14c Mon Sep 17 00:00:00 2001 From: Ivan Waldboth Date: Mon, 29 Jan 2018 21:25:52 +0100 Subject: [PATCH 35/85] stimmp des? --- Final/CMakeLists.txt | 4 ++-- Final/Console.hpp | 2 +- Final/Main.cpp | 12 +++++++++--- Final/physical_object.h | 5 +++++ 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/Final/CMakeLists.txt b/Final/CMakeLists.txt index c4a08c5..045a3e1 100644 --- a/Final/CMakeLists.txt +++ b/Final/CMakeLists.txt @@ -4,10 +4,10 @@ project(FinalProject LANGUAGES CXX) set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/modules/" ${CMAKE_MODULE_PATH}) if(MSVC) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++14 /wd4141") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++1z /wd4141") set(CMAKE_CXX_FLAGS_RELEASE "/Ox /Ot /DNDEBUG") else() - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -Wall") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1z -Wall") set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG") endif() diff --git a/Final/Console.hpp b/Final/Console.hpp index 69939d9..87e6cf6 100644 --- a/Final/Console.hpp +++ b/Final/Console.hpp @@ -31,7 +31,7 @@ class Console m_text.setFont(font); m_text.setCharacterSize(12); - m_text.setFillColor(sf::Color::White); + m_text.setColor(sf::Color::White); } template diff --git a/Final/Main.cpp b/Final/Main.cpp index 19eac09..a8e2427 100644 --- a/Final/Main.cpp +++ b/Final/Main.cpp @@ -102,9 +102,9 @@ bool lineSegmentIntersection( return true; } -bool inside(const Vector2d point, - const Vector2d point_offset, - const std::vector& lines, +bool inside(const Vector2d point, + const Vector2d point_offset, + const std::vector& lines, const Vector2d line_offset) { auto intersections = 0; @@ -279,6 +279,12 @@ void collision_resolution(const std::vector& contacts) const auto relative_linear_velocity = (a.linear_velocity() - b.linear_velocity()).dot(normal); + const auto angular_part = normal.cross(a.get_inverse_inertia() * a + .bounding_radius()); + + + + //if(relative_linear_velocity < 0) // continue; diff --git a/Final/physical_object.h b/Final/physical_object.h index f5eeb48..d1b1804 100644 --- a/Final/physical_object.h +++ b/Final/physical_object.h @@ -41,6 +41,11 @@ class physical_object Vector2d linear_velocity() const { return velocity_; } void add_linear_velocity(const Vector2d v) { velocity_ += v; } + double get_torque() const { return torque_; } + double get_angular_momentum() const { return angular_momentum_; } + double get_angular_velocity() const { return angular_velocity_; } + double get_inverse_inertia() const { return inverse_inertia_; } + double mass() const { return type_ == object_type::fixed From 88420a7739a12620ad56e658732a48328384b82e Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Tue, 30 Jan 2018 00:12:01 +0100 Subject: [PATCH 36/85] added angular impulse resolution (not correct, rotates around center of mass instead of contact point) fixed mass scaling (inertia scaling only partially correct) --- Final/Main.cpp | 50 +++++++++++++++++++++++++++---------- Final/Polygon.cpp | 15 +++++------ Final/Polygon.h | 3 +-- Final/physical_object.cpp | 52 +++++++++++++++++---------------------- Final/physical_object.h | 51 ++++++++++++++++++++++++++++++-------- 5 files changed, 107 insertions(+), 64 deletions(-) diff --git a/Final/Main.cpp b/Final/Main.cpp index 19eac09..4487aa7 100644 --- a/Final/Main.cpp +++ b/Final/Main.cpp @@ -276,22 +276,44 @@ void collision_resolution(const std::vector& contacts) constexpr auto e = 0.5; - const auto relative_linear_velocity = + /* + const auto relative_linear_velocity = (a.linear_velocity() - b.linear_velocity()).dot(normal); - //if(relative_linear_velocity < 0) - // continue; - const auto j = -(1 + e) * relative_linear_velocity / (normal.dot(normal) * (a.inverse_mass() + b.inverse_mass())); - + + */ + const auto b_point_offset = std::get<0>(contact.point); + const auto b_point_velocity = std::get<1>(contact.point); + + const Vector2d a_point_offset = + (std::get<0>(std::get<0>(contact.line)) + + std::get<0>(std::get<1>(contact.line))) / 2.0; + + const Vector2d a_point_velocity = + (std::get<1>(std::get<0>(contact.line)) + + std::get<1>(std::get<1>(contact.line))) / 2.0; + + const auto relative_velocity = + (a_point_velocity - b_point_velocity).dot(normal); + + const auto ra_n = cross2(a_point_offset, normal); + const auto rb_n = cross2(b_point_offset, normal); + + const auto t_a = a.inverse_inertia() * ra_n * ra_n; + const auto t_b = b.inverse_inertia() * rb_n * rb_n; + + const auto j = -(1 + e) * relative_velocity + / (normal.dot(normal) * (a.inverse_mass() + b.inverse_mass() + t_a + t_b)); + const auto impulse = j * normal; - const auto total_mass = a.mass() + b.mass(); + a.add_angular_velocity( a.inverse_inertia() * cross2(a_point_offset, impulse)); + b.add_angular_velocity( b.inverse_inertia() * cross2(b_point_offset, -impulse)); + /* */ - assert(total_mass > 0); - - a.add_linear_velocity(impulse * a.inverse_mass()); + a.add_linear_velocity( impulse * a.inverse_mass()); b.add_linear_velocity(-impulse * b.inverse_mass()); // positional correction @@ -384,12 +406,14 @@ int main() case sf::Event::MouseButtonPressed: { - /*polygons.emplace_back(polygon::create_random( - Vector2(xs, ys), polygon_vertex_count));*/ + polygons.emplace_back(polygon::create_random( + Vector2(xs, ys), 4)); - polygons.emplace_back(polygon::create_circle(Vector2(xs, ys), 5)); + //polygons.emplace_back(polygon::create_circle(Vector2(xs, ys), 5)); - //auto& polygon = polygons.back(); + auto& polygon = polygons.back(); + + polygon.get_physical_object().rotate(M_PI / 2); /*if(draw_circle) polygons.emplace_back(polygon::create_circle(Vector2(xs, ys), 5)); diff --git a/Final/Polygon.cpp b/Final/Polygon.cpp index 31178e7..4002769 100644 --- a/Final/Polygon.cpp +++ b/Final/Polygon.cpp @@ -5,9 +5,6 @@ #include #include -#define _USE_MATH_DEFINES -#include - #include "Polygon.h" #include @@ -47,7 +44,7 @@ std::vector> create_mass_points( } polygon::polygon(const Vector2& center, std::vector points) - : physical_object_(as_world_coordinates(center), create_mass_points(0.5, points)) + : physical_object_(as_world_coordinates(center), create_mass_points(0.05, points)) { shape_.setPointCount(points.size()); @@ -71,8 +68,8 @@ polygon::polygon(const Vector2& center, std::vector points) cof_shape_.setRadius(0.05f); cof_shape_.setOrigin( { - cof.x + cof_shape_.getRadius(), - cof.y + cof_shape_.getRadius() + cof_shape_.getRadius(), + cof_shape_.getRadius() }); update_shapes(); @@ -87,10 +84,10 @@ void polygon::update(const double dt) void polygon::update_shapes() { - shape_.setRotation(static_cast(physical_object_.rotation().angle() * 180 / M_PI)); + shape_.setRotation(-static_cast(physical_object_.rotation().angle() * 180 / M_PI)); shape_.setPosition(as_screen_coordinates(physical_object_.position())); - cof_shape_.setPosition(as_screen_coordinates(physical_object_.position())); + cof_shape_.setPosition(as_screen_coordinates(physical_object_.center_of_mass_global())); } void polygon::draw(sf::RenderWindow& window) const @@ -264,7 +261,7 @@ polygon polygon::create_random(const Vector2 center, const size_t vertex_count) polygon p(center, points); - p.scale(5); + p.scale(15); p.set_color(sf::Color::Green); return p; diff --git a/Final/Polygon.h b/Final/Polygon.h index 7beb12b..414953d 100644 --- a/Final/Polygon.h +++ b/Final/Polygon.h @@ -5,7 +5,6 @@ #ifndef PHYSICALLYBASEDSIMULATION_POLYGON_H #define PHYSICALLYBASEDSIMULATION_POLYGON_H - #include "Vec2.h" #include "physical_object.h" @@ -13,7 +12,7 @@ #include #include "ContactInfo.hpp" -constexpr auto screen_scale = 30; // px = 1m +constexpr auto screen_scale = 10; // px = 1m class polygon { diff --git a/Final/physical_object.cpp b/Final/physical_object.cpp index 524bdb4..757047f 100644 --- a/Final/physical_object.cpp +++ b/Final/physical_object.cpp @@ -4,15 +4,17 @@ physical_object::physical_object(const Vector2d position, const std::vector>& points) : scale_(1), radius_(0), position_(position), rotation_(0), - velocity_(0, 0), force_(0, 0), torque_(0), angular_momentum_(0), points_(points.size()) + velocity_(0, 0), force_(0, 0), torque_(0), angular_momentum_(0), angular_velocity_(0), points_(points.size()) { // total mass - mass_ = std::accumulate(points.begin(), points.end(), 0.0, + initial_mass_ = std::accumulate(points.begin(), points.end(), 0.0, [](auto current_sum, auto p) { return current_sum + std::get<1>(p); }); + mass_ = initial_mass_; + // initial position of center of mass center_of_mass_ = std::accumulate(points.begin(), points.end(), Vector2d(0, 0), [](auto current_sum, auto p) @@ -20,22 +22,12 @@ physical_object::physical_object(const Vector2d position, return current_sum + std::get<0>(p) * std::get<1>(p); }) / mass_; - // inertia - const auto inertia = std::accumulate(points.begin(), points.end(), 0.0, - [cof = center_of_mass_, this](auto current_sum, auto p) + // get offsets + for(const auto& point : points) { - const Vector2d offset = std::get<0>(p) - cof; - - // save offset - initial_offsets_.push_back(offset); - - return current_sum + std::get<1>(p) * offset.squaredNorm(); - }); - - inverse_inertia_ = 1 / inertia; - - // initial angular velocity - angular_velocity_ = inverse_inertia_ * angular_momentum_; + initial_offsets_.push_back( + std::get<0>(point) - center_of_mass_); + } update_points(); } @@ -49,11 +41,9 @@ void physical_object::update(const double dt) default: break; } - const auto scaled_mass = mass_ * scale_; - position_ += velocity_ * dt; - velocity_ += force_ / scaled_mass * dt; + velocity_ += force_ / mass_ * dt; rotation_ = Rotation2D(rotation_.angle() + angular_velocity_ * dt); angular_momentum_ += torque_ * dt; @@ -70,14 +60,14 @@ void physical_object::accelerate(const Vector2d point, const Vector2d accelerati accelerate(acceleration); const auto offset = point - center_of_mass_; - const auto force = acceleration * mass_ * scale_; + const auto force = acceleration * mass_; - torque_ += offset.x() * force.y() - force.x() * offset.y(); + torque_ += cross2(offset, force); } void physical_object::accelerate(const Vector2d acceleration) { - force_ += acceleration * mass_ * scale_; + force_ += acceleration * mass_; } void physical_object::add_force(Vector2d force) @@ -87,26 +77,28 @@ void physical_object::add_force(Vector2d force) void physical_object::update_points() { + auto inertia = 0.0; for (auto i = 0u; i < points_.size(); ++i) { // transform offset const auto offset = rotation_.toRotationMatrix() * initial_offsets_[i] * scale_; // calculate norm of angular velocity part (v = r * omega) - const auto velocity_norm = offset.norm() * angular_velocity_; - const auto normalized_offset = offset.normalized(); + //const auto velocity_norm = offset.norm() * angular_velocity_; + //const auto normalized_offset = offset.normalized(); points_[i] = { offset, - velocity_ + Vector2d - { - velocity_norm * normalized_offset.y(), - velocity_norm * normalized_offset.x(), - } + velocity_ + cross2(angular_velocity_, offset) }; // save maximum offset radius_ = std::max(radius_, offset.norm()); + + // update inertia + inertia += initial_mass_ / points().size() * offset.squaredNorm(); } + + inverse_inertia_ = 1.0 / inertia; } diff --git a/Final/physical_object.h b/Final/physical_object.h index f5eeb48..855b42f 100644 --- a/Final/physical_object.h +++ b/Final/physical_object.h @@ -5,6 +5,9 @@ #include #include +#define _USE_MATH_DEFINES +#include + using Eigen::Vector2d; using Eigen::Matrix2d; using Rotation2D = Eigen::Rotation2D; @@ -32,20 +35,27 @@ class physical_object const std::vector>& points); void update(const double dt); + void accelerate(Vector2d point, Vector2d acceleration); void accelerate(Vector2d acceleration); void add_force(Vector2d force); + void add_linear_velocity(const Vector2d v) { velocity_ += v; update_points(); } + void add_angular_velocity(const double v) { angular_velocity_ += v; update_points(); } Vector2d position() const { return position_; } Rotation2D rotation() const { return rotation_; } Vector2d linear_velocity() const { return velocity_; } - void add_linear_velocity(const Vector2d v) { velocity_ += v; } + Vector2d center_of_mass_local() const { return center_of_mass_; } + Vector2d center_of_mass_global() const { return position_ + center_of_mass_; } + double inverse_inertia() const { return inverse_inertia_; } + double bounding_radius() const { return radius_; } + const std::vector& points() const { return points_; } double mass() const { return type_ == object_type::fixed ? 0 - : mass_; + : mass_; } double inverse_mass() const @@ -55,27 +65,33 @@ class physical_object : 1.0 / mass_; } - Vector2d center_of_mass_local() const { return center_of_mass_; } - Vector2d center_of_mass_global() const { return position_ + center_of_mass_; } - - double bounding_radius() const { return radius_; } - void set_scale(const double scale) { scale_ = scale; + mass_ = initial_mass_ * scale; + + // updates offsets, inertia + // and bounding radius update_points(); } - double get_scale() const { return scale_; } void set_type(const object_type type) { type_ = type; } object_type get_type() const { return type_; } - const std::vector& points() const { return points_; } - void move(const Vector2d& v) { position_ += v; } + void move(const Vector2d& v) + { + position_ += v; + } + void rotate(const double a) + { + rotation_ = Rotation2D(rotation_.angle() + a); + update_points(); + } private: + double initial_mass_; double mass_; double scale_; double radius_; @@ -100,4 +116,19 @@ class physical_object void update_points(); }; +inline double cross2(const Vector2d a, const Vector2d b) +{ + return a.x() * b.y() - b.x() * a.y(); +} + +inline Vector2d cross2(const Vector2d v, const double s) +{ + return { s * v.y(), -s * v.x() }; +} + +inline Vector2d cross2(const double s, const Vector2d v) +{ + return { -s * v.y(), s * v.x() }; +} + #endif // PHYSICAL_OBJECT_H From d4d9b4f972b1d5f80d95e6ee976854cb950d15db Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Tue, 30 Jan 2018 13:25:47 +0100 Subject: [PATCH 37/85] fixed rotation/inertia bug --- Final/physical_object.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Final/physical_object.cpp b/Final/physical_object.cpp index 757047f..2d36967 100644 --- a/Final/physical_object.cpp +++ b/Final/physical_object.cpp @@ -47,7 +47,7 @@ void physical_object::update(const double dt) rotation_ = Rotation2D(rotation_.angle() + angular_velocity_ * dt); angular_momentum_ += torque_ * dt; - angular_velocity_ = inverse_inertia_ * angular_momentum_; + angular_velocity_ += inverse_inertia_ * angular_momentum_; update_points(); @@ -97,7 +97,7 @@ void physical_object::update_points() radius_ = std::max(radius_, offset.norm()); // update inertia - inertia += initial_mass_ / points().size() * offset.squaredNorm(); + inertia += mass_ / points().size() * offset.squaredNorm(); } inverse_inertia_ = 1.0 / inertia; From 2aafa45cb3ef7b6218e33e0499c081070df6d45d Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Tue, 30 Jan 2018 13:28:12 +0100 Subject: [PATCH 38/85] added friction moved position correction to the of the update cycle refactored impulse application --- Final/Main.cpp | 86 +++++++++++++++++++++++++-------------- Final/physical_object.cpp | 9 ---- Final/physical_object.h | 37 +++++++++-------- 3 files changed, 76 insertions(+), 56 deletions(-) diff --git a/Final/Main.cpp b/Final/Main.cpp index 4487aa7..081f389 100644 --- a/Final/Main.cpp +++ b/Final/Main.cpp @@ -274,71 +274,95 @@ void collision_resolution(const std::vector& contacts) auto& a = contact.line_owner; auto& b = contact.point_owner; - constexpr auto e = 0.5; - - /* - const auto relative_linear_velocity = - (a.linear_velocity() - b.linear_velocity()).dot(normal); - - const auto j = -(1 + e) * relative_linear_velocity / - (normal.dot(normal) * (a.inverse_mass() + b.inverse_mass())); - - */ const auto b_point_offset = std::get<0>(contact.point); const auto b_point_velocity = std::get<1>(contact.point); const Vector2d a_point_offset = (std::get<0>(std::get<0>(contact.line)) + - std::get<0>(std::get<1>(contact.line))) / 2.0; + std::get<0>(std::get<1>(contact.line))) / 2.0; const Vector2d a_point_velocity = (std::get<1>(std::get<0>(contact.line)) + - std::get<1>(std::get<1>(contact.line))) / 2.0; - - const auto relative_velocity = - (a_point_velocity - b_point_velocity).dot(normal); + std::get<1>(std::get<1>(contact.line))) / 2.0; + + const Vector2d rv = b_point_velocity - a_point_velocity; + const auto relative_velocity = rv.dot(normal); + + if (relative_velocity > 0) + continue; + + const auto e = rv.squaredNorm() < (gravity * 0.016).squaredNorm() + 0.01 + ? 0 + : 0.5; const auto ra_n = cross2(a_point_offset, normal); const auto rb_n = cross2(b_point_offset, normal); - const auto t_a = a.inverse_inertia() * ra_n * ra_n; - const auto t_b = b.inverse_inertia() * rb_n * rb_n; + const auto t_a = a.inverse_mass() + a.inverse_inertia() * ra_n * ra_n; + const auto t_b = b.inverse_mass() + b.inverse_inertia() * rb_n * rb_n; + const auto denom = t_a + t_b; - const auto j = -(1 + e) * relative_velocity - / (normal.dot(normal) * (a.inverse_mass() + b.inverse_mass() + t_a + t_b)); + const auto j = -(1 + e) * relative_velocity / denom; - const auto impulse = j * normal; + const auto normal_impulse = j * normal; + + a.apply_impulse(-normal_impulse, a_point_offset); + b.apply_impulse( normal_impulse, b_point_offset); + + // friction + const auto tangent = (rv - normal * rv.dot(normal)).normalized(); + + const auto jt = -rv.dot(tangent) / denom; + + if (std::abs(jt) < 0.000001) continue; + + const auto static_friction = 0.61; + const auto dynamic_friction = 0.47; + + const auto tangent_impulse = std::abs(jt) < j * static_friction + ? (tangent * jt).eval() + : (tangent * -j * dynamic_friction).eval(); - a.add_angular_velocity( a.inverse_inertia() * cross2(a_point_offset, impulse)); - b.add_angular_velocity( b.inverse_inertia() * cross2(b_point_offset, -impulse)); - /* */ + a.apply_impulse(-tangent_impulse, a_point_offset); + b.apply_impulse(tangent_impulse, b_point_offset); + } +} - a.add_linear_velocity( impulse * a.inverse_mass()); - b.add_linear_velocity(-impulse * b.inverse_mass()); +void correct_positions(const std::vector& contacts) +{ + for (const auto& contact : contacts) + { + const auto line_start = std::get<0>(std::get<0>(contact.line)); + const auto line_end = std::get<0>(std::get<1>(contact.line)); + const auto normal = ((line_end + line_start) / 2.0).normalized(); + + auto& a = contact.line_owner; + auto& b = contact.point_owner; - // positional correction const auto percent = 0.2; // usually 20% to 80% - const auto slop = 0.01; // usually 0.01 to 0.1 + const auto slop = 0.05; // usually 0.01 to 0.1 const Vector2d correction = std::max(contact.penetration_depth - slop, 0.0) - / (a.inverse_mass() + b.inverse_mass()) * percent * normal; + / (a.inverse_mass() + b.inverse_mass()) * percent * normal; a.move(-a.inverse_mass() * correction); - b.move(b.inverse_mass() * correction); + b.move( b.inverse_mass() * correction); } } + void update(std::vector& polygons, const double dt) { const auto contacts = collision_detection(polygons); - if (!contacts.empty()) - collision_resolution(contacts); + collision_resolution(contacts); for (auto& polygon : polygons) { polygon.update(dt); } + + correct_positions(contacts); } int main() diff --git a/Final/physical_object.cpp b/Final/physical_object.cpp index 2d36967..74b2509 100644 --- a/Final/physical_object.cpp +++ b/Final/physical_object.cpp @@ -70,11 +70,6 @@ void physical_object::accelerate(const Vector2d acceleration) force_ += acceleration * mass_; } -void physical_object::add_force(Vector2d force) -{ - force_ += force; -} - void physical_object::update_points() { auto inertia = 0.0; @@ -83,10 +78,6 @@ void physical_object::update_points() // transform offset const auto offset = rotation_.toRotationMatrix() * initial_offsets_[i] * scale_; - // calculate norm of angular velocity part (v = r * omega) - //const auto velocity_norm = offset.norm() * angular_velocity_; - //const auto normalized_offset = offset.normalized(); - points_[i] = { offset, diff --git a/Final/physical_object.h b/Final/physical_object.h index 855b42f..db056ae 100644 --- a/Final/physical_object.h +++ b/Final/physical_object.h @@ -18,6 +18,21 @@ using point_t = std::tuple; EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(Vector2d) EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(point_t) +inline double cross2(const Vector2d a, const Vector2d b) +{ + return a.x() * b.y() - b.x() * a.y(); +} + +inline Vector2d cross2(const Vector2d v, const double s) +{ + return { s * v.y(), -s * v.x() }; +} + +inline Vector2d cross2(const double s, const Vector2d v) +{ + return { -s * v.y(), s * v.x() }; +} + static const Vector2d gravity = { 0, -9.81 }; enum class object_type @@ -38,9 +53,12 @@ class physical_object void accelerate(Vector2d point, Vector2d acceleration); void accelerate(Vector2d acceleration); - void add_force(Vector2d force); - void add_linear_velocity(const Vector2d v) { velocity_ += v; update_points(); } - void add_angular_velocity(const double v) { angular_velocity_ += v; update_points(); } + + void apply_impulse(const Vector2d impulse, const Vector2d offset) + { + velocity_ += inverse_mass() * impulse; + angular_velocity_ += inverse_inertia_ * cross2(offset, impulse); + } Vector2d position() const { return position_; } Rotation2D rotation() const { return rotation_; } @@ -116,19 +134,6 @@ class physical_object void update_points(); }; -inline double cross2(const Vector2d a, const Vector2d b) -{ - return a.x() * b.y() - b.x() * a.y(); -} -inline Vector2d cross2(const Vector2d v, const double s) -{ - return { s * v.y(), -s * v.x() }; -} - -inline Vector2d cross2(const double s, const Vector2d v) -{ - return { -s * v.y(), s * v.x() }; -} #endif // PHYSICAL_OBJECT_H From ef3329a02e914e3cbaa9a51526492def083a5a78 Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Tue, 30 Jan 2018 13:49:55 +0100 Subject: [PATCH 39/85] new scene adjusted screen scaling --- Final/Main.cpp | 21 +++++++++++++++++---- Final/Polygon.h | 2 +- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/Final/Main.cpp b/Final/Main.cpp index 081f389..8bf9dc0 100644 --- a/Final/Main.cpp +++ b/Final/Main.cpp @@ -293,7 +293,7 @@ void collision_resolution(const std::vector& contacts) const auto e = rv.squaredNorm() < (gravity * 0.016).squaredNorm() + 0.01 ? 0 - : 0.5; + : 0.3; const auto ra_n = cross2(a_point_offset, normal); const auto rb_n = cross2(b_point_offset, normal); @@ -382,8 +382,22 @@ int main() sf::RenderWindow window(sf::VideoMode(width, height), "2D Collision detection"); - polygons.emplace_back(polygon::create_rectangle(Vector2(400, 600), Vector2(500, 80))); - polygons.emplace_back(polygon::create_rectangle(Vector2(400, 300), Vector2(500, 80))); + polygons.emplace_back(polygon::create_rectangle(Vector2(400, 700), Vector2(710, 40))); + polygons.back().get_physical_object().rotate(-5 * M_PI / 180); + + polygons.emplace_back(polygon::create_rectangle(Vector2(900, 650), Vector2(700, 40))); + polygons.back().get_physical_object().rotate(30 * M_PI / 180); + + polygons.emplace_back(polygon::create_rectangle(Vector2(50, 400), Vector2(700, 40))); + polygons.back().get_physical_object().rotate(-70 * M_PI / 180); + + polygons.emplace_back(polygon::create_random(Vector2(600, 400), 6)); + polygons.back().scale(8); + + polygons.emplace_back(polygon::create_random(Vector2(200, 420), 4)); + polygons.back().scale(5); + + polygons.emplace_back(polygon::create_circle(Vector2(900, 300), 60)); using namespace std::chrono; using clock = high_resolution_clock; @@ -392,7 +406,6 @@ int main() const auto fps_30 = duration(32ms); const auto interval = fps_60; - auto game_loop_type = GameLoopType::Fixed; smoother draw_time_smooth; diff --git a/Final/Polygon.h b/Final/Polygon.h index 414953d..1fefd70 100644 --- a/Final/Polygon.h +++ b/Final/Polygon.h @@ -12,7 +12,7 @@ #include #include "ContactInfo.hpp" -constexpr auto screen_scale = 10; // px = 1m +constexpr auto screen_scale = 20; // px = 1m class polygon { From bf0e97331bcb40287465b353a9ce9bc4e7a6de4d Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Tue, 30 Jan 2018 14:32:33 +0100 Subject: [PATCH 40/85] implemented symplectic euler --- Final/physical_object.cpp | 13 +++++++------ Final/physical_object.h | 1 - 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Final/physical_object.cpp b/Final/physical_object.cpp index 74b2509..c2ba170 100644 --- a/Final/physical_object.cpp +++ b/Final/physical_object.cpp @@ -4,7 +4,7 @@ physical_object::physical_object(const Vector2d position, const std::vector>& points) : scale_(1), radius_(0), position_(position), rotation_(0), - velocity_(0, 0), force_(0, 0), torque_(0), angular_momentum_(0), angular_velocity_(0), points_(points.size()) + velocity_(0, 0), force_(0, 0), torque_(0), angular_velocity_(0), points_(points.size()) { // total mass initial_mass_ = std::accumulate(points.begin(), points.end(), 0.0, @@ -41,13 +41,14 @@ void physical_object::update(const double dt) default: break; } - position_ += velocity_ * dt; - + // symplectic euler + // 1. velocity update + // 2. position update velocity_ += force_ / mass_ * dt; - rotation_ = Rotation2D(rotation_.angle() + angular_velocity_ * dt); + angular_velocity_ += inverse_inertia_ * torque_ * dt; - angular_momentum_ += torque_ * dt; - angular_velocity_ += inverse_inertia_ * angular_momentum_; + position_ += velocity_ * dt; + rotation_ = Rotation2D(rotation_.angle() + angular_velocity_ * dt); update_points(); diff --git a/Final/physical_object.h b/Final/physical_object.h index db056ae..f834d8c 100644 --- a/Final/physical_object.h +++ b/Final/physical_object.h @@ -122,7 +122,6 @@ class physical_object Vector2d force_; double torque_; - double angular_momentum_; double angular_velocity_; double inverse_inertia_; From 80fca7ab22e5f0dbade294fab3a3061be7d85cfe Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Tue, 30 Jan 2018 16:36:18 +0100 Subject: [PATCH 41/85] added contact count scaling --- Final/Main.cpp | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/Final/Main.cpp b/Final/Main.cpp index 8bf9dc0..f181f4e 100644 --- a/Final/Main.cpp +++ b/Final/Main.cpp @@ -274,6 +274,13 @@ void collision_resolution(const std::vector& contacts) auto& a = contact.line_owner; auto& b = contact.point_owner; + const auto contact_points = std::count_if(contacts.begin(), contacts.end(), + [&b, &a](const contact_info& c) + { + return &c.point_owner == &b && &c.line_owner == &a || + &c.point_owner == &a && &c.line_owner == &b; + }); + const auto b_point_offset = std::get<0>(contact.point); const auto b_point_velocity = std::get<1>(contact.point); @@ -302,7 +309,7 @@ void collision_resolution(const std::vector& contacts) const auto t_b = b.inverse_mass() + b.inverse_inertia() * rb_n * rb_n; const auto denom = t_a + t_b; - const auto j = -(1 + e) * relative_velocity / denom; + const auto j = -(1 + e) * relative_velocity / denom / contact_points; const auto normal_impulse = j * normal; @@ -312,7 +319,7 @@ void collision_resolution(const std::vector& contacts) // friction const auto tangent = (rv - normal * rv.dot(normal)).normalized(); - const auto jt = -rv.dot(tangent) / denom; + const auto jt = -rv.dot(tangent) / denom / contact_points; if (std::abs(jt) < 0.000001) continue; @@ -350,7 +357,6 @@ void correct_positions(const std::vector& contacts) } } - void update(std::vector& polygons, const double dt) { const auto contacts = collision_detection(polygons); @@ -443,10 +449,10 @@ int main() case sf::Event::MouseButtonPressed: { - polygons.emplace_back(polygon::create_random( - Vector2(xs, ys), 4)); + //polygons.emplace_back(polygon::create_random( + // Vector2(xs, ys), 4)); - //polygons.emplace_back(polygon::create_circle(Vector2(xs, ys), 5)); + polygons.emplace_back(polygon::create_circle(Vector2(xs, ys), 5)); auto& polygon = polygons.back(); From 68e4f07e037bf83f58a101efd2eaaca0e6585833 Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Tue, 30 Jan 2018 17:17:38 +0100 Subject: [PATCH 42/85] fixed line normal vector calculation updated debug info --- Final/Main.cpp | 20 ++++++++++---------- Final/Polygon.cpp | 30 +++++++++--------------------- Final/physical_object.h | 15 +++++++++++++++ 3 files changed, 34 insertions(+), 31 deletions(-) diff --git a/Final/Main.cpp b/Final/Main.cpp index f181f4e..e60f2e5 100644 --- a/Final/Main.cpp +++ b/Final/Main.cpp @@ -269,8 +269,8 @@ void collision_resolution(const std::vector& contacts) const auto line_start = std::get<0>(std::get<0>(contact.line)); const auto line_end = std::get<0>(std::get<1>(contact.line)); - const auto normal = ((line_end + line_start) / 2.0).normalized(); - + const auto n = normal(line_start, line_end); + auto& a = contact.line_owner; auto& b = contact.point_owner; @@ -293,7 +293,7 @@ void collision_resolution(const std::vector& contacts) std::get<1>(std::get<1>(contact.line))) / 2.0; const Vector2d rv = b_point_velocity - a_point_velocity; - const auto relative_velocity = rv.dot(normal); + const auto relative_velocity = rv.dot(n); if (relative_velocity > 0) continue; @@ -302,8 +302,8 @@ void collision_resolution(const std::vector& contacts) ? 0 : 0.3; - const auto ra_n = cross2(a_point_offset, normal); - const auto rb_n = cross2(b_point_offset, normal); + const auto ra_n = cross2(a_point_offset, n); + const auto rb_n = cross2(b_point_offset, n); const auto t_a = a.inverse_mass() + a.inverse_inertia() * ra_n * ra_n; const auto t_b = b.inverse_mass() + b.inverse_inertia() * rb_n * rb_n; @@ -311,13 +311,13 @@ void collision_resolution(const std::vector& contacts) const auto j = -(1 + e) * relative_velocity / denom / contact_points; - const auto normal_impulse = j * normal; + const auto normal_impulse = j * n; a.apply_impulse(-normal_impulse, a_point_offset); b.apply_impulse( normal_impulse, b_point_offset); // friction - const auto tangent = (rv - normal * rv.dot(normal)).normalized(); + const auto tangent = (rv - n * rv.dot(n)).normalized(); const auto jt = -rv.dot(tangent) / denom / contact_points; @@ -449,10 +449,10 @@ int main() case sf::Event::MouseButtonPressed: { - //polygons.emplace_back(polygon::create_random( - // Vector2(xs, ys), 4)); + polygons.emplace_back(polygon::create_random( + Vector2(xs, ys), 4)); - polygons.emplace_back(polygon::create_circle(Vector2(xs, ys), 5)); + //polygons.emplace_back(polygon::create_circle(Vector2(xs, ys), 5)); auto& polygon = polygons.back(); diff --git a/Final/Polygon.cpp b/Final/Polygon.cpp index 4002769..ea44f7f 100644 --- a/Final/Polygon.cpp +++ b/Final/Polygon.cpp @@ -101,39 +101,27 @@ void polygon::draw(sf::RenderWindow& window) const const auto center = physical_object_.center_of_mass_global(); const auto point = center + std::get<0>(contact.point); - - sf::CircleShape circle(1); + + sf::CircleShape circle(2); circle.setPosition(as_screen_coordinates(point)); - circle.setFillColor(sf::Color{255, 0, 255}); + circle.setOutlineColor(sf::Color{ 255, 0, 255 }); + circle.setOutlineThickness(1); circle.setOrigin(circle.getRadius(), circle.getRadius()); window.draw(circle); - circle.setPosition(as_screen_coordinates(contact.point_of_intersection)); - circle.setFillColor(sf::Color{ 255, 255, 255 }); - window.draw(circle); - - const auto direction = point - center; - - sf::Vertex line[] = - { - sf::Vertex(as_screen_coordinates(center), sf::Color{255, 0, 255}), - sf::Vertex(as_screen_coordinates(center + direction), sf::Color{255, 0, 255}) - }; - - window.draw(line, 2, sf::Lines); + //circle.setPosition(as_screen_coordinates(contact.point_of_intersection)); + //circle.setFillColor(sf::Color{ 255, 255, 255 }); + //window.draw(circle); const auto line_start = std::get<0>(std::get<0>(contact.line)); const auto line_end = std::get<0>(std::get<1>(contact.line)); - const auto normal = Vector2d( - -(line_end - line_start).y(), - (line_end - line_start).x() - ).normalized(); + const auto n = normal(line_start, line_end); sf::Vertex normal_line[] = { sf::Vertex(as_screen_coordinates(point), sf::Color{ 255, 127, 0 }), - sf::Vertex(as_screen_coordinates(point + normal * 0.3), sf::Color{ 255, 127, 0 }) + sf::Vertex(as_screen_coordinates(point + n), sf::Color{ 255, 127, 0 }) }; window.draw(normal_line, 2, sf::Lines); diff --git a/Final/physical_object.h b/Final/physical_object.h index f834d8c..6d46eef 100644 --- a/Final/physical_object.h +++ b/Final/physical_object.h @@ -18,6 +18,21 @@ using point_t = std::tuple; EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(Vector2d) EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(point_t) +inline Vector2d normal(const Vector2d a, const Vector2d b) +{ + const auto dir = ((a + b) / 2.0).normalized(); + + const auto normal = Vector2d( + -(b - a).y(), + (b - a).x() + ).normalized(); + + return normal.dot(dir) < 0 + ? Vector2d(-normal.x(), -normal.y()) + : normal; +} + + inline double cross2(const Vector2d a, const Vector2d b) { return a.x() * b.y() - b.x() * a.y(); From 77816169d05552c5662527892ae0df9b8b41dab0 Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Tue, 30 Jan 2018 17:41:33 +0100 Subject: [PATCH 43/85] added more detailed time measurements --- Final/Main.cpp | 88 +++++++++++++++++++++++++++++++++++++---------- Final/Polygon.cpp | 4 --- 2 files changed, 70 insertions(+), 22 deletions(-) diff --git a/Final/Main.cpp b/Final/Main.cpp index e60f2e5..5380592 100644 --- a/Final/Main.cpp +++ b/Final/Main.cpp @@ -37,6 +37,57 @@ enum class GameLoopType /*----------------------------------------------------------------*/ +template +void measure(const std::string name, SmootherType& smoother, const FuncType& func) +{ + using namespace std::chrono; + using clock = high_resolution_clock; + + const auto start_frame = clock::now(); + + func(); + + const auto elapsed = duration_cast(clock::now() - start_frame); + + smoother.add(static_cast(elapsed.count())); + + Console::instance().set_param(name, smoother.get()); +}; + +template()>>>> +void measure(const std::string name, const FuncType& func) +{ + using namespace std::chrono; + using clock = high_resolution_clock; + + const auto start_frame = clock::now(); + + func(); + + const auto elapsed = duration_cast(clock::now() - start_frame); + + Console::instance().set_param(name, elapsed.count()); +}; + +template()>>>> +auto measure(const std::string name, const FuncType& func) +{ + using namespace std::chrono; + using clock = high_resolution_clock; + + const auto start_frame = clock::now(); + + auto result = func(); + + const auto elapsed = duration_cast(clock::now() - start_frame); + + Console::instance().set_param(name, elapsed.count()); + + return result; +}; + void render(sf::RenderWindow& window, const std::vector& polygons) { window.clear(); @@ -359,16 +410,28 @@ void correct_positions(const std::vector& contacts) void update(std::vector& polygons, const double dt) { - const auto contacts = collision_detection(polygons); + auto contacts = measure("Update: Collision Detection", [&] + { + return collision_detection(polygons); + }); - collision_resolution(contacts); + measure("Update: Collision Resolution", [&] + { + collision_resolution(contacts); + }); - for (auto& polygon : polygons) - { - polygon.update(dt); - } + measure("Update: Integration", [&] + { + for (auto& polygon : polygons) + { + polygon.update(dt); + } + }); - correct_positions(contacts); + measure("Update: Position Correction", [&] + { + correct_positions(contacts); + }); } int main() @@ -419,17 +482,6 @@ int main() auto last_time = clock::now(); - auto measure = [&](auto name, auto& smoother, auto func) { - - auto start_frame = clock::now(); - - func(); - - auto elapsed = duration_cast(clock::now() - start_frame); - smoother.add(elapsed.count()); - Console::instance().set_param(name, smoother.get()); - }; - std::default_random_engine rng; auto process_events = [&]() diff --git a/Final/Polygon.cpp b/Final/Polygon.cpp index ea44f7f..1627e3a 100644 --- a/Final/Polygon.cpp +++ b/Final/Polygon.cpp @@ -109,10 +109,6 @@ void polygon::draw(sf::RenderWindow& window) const circle.setOrigin(circle.getRadius(), circle.getRadius()); window.draw(circle); - //circle.setPosition(as_screen_coordinates(contact.point_of_intersection)); - //circle.setFillColor(sf::Color{ 255, 255, 255 }); - //window.draw(circle); - const auto line_start = std::get<0>(std::get<0>(contact.line)); const auto line_end = std::get<0>(std::get<1>(contact.line)); From 91aa32a393eb426a1db5d8f536119242eb72ba00 Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Tue, 30 Jan 2018 17:51:00 +0100 Subject: [PATCH 44/85] toggle debug info --- Final/Main.cpp | 8 ++++++-- Final/Polygon.cpp | 34 ++++++++++++++++++++-------------- Final/Polygon.h | 31 ++++++++++++++++++------------- 3 files changed, 44 insertions(+), 29 deletions(-) diff --git a/Final/Main.cpp b/Final/Main.cpp index 5380592..55526e7 100644 --- a/Final/Main.cpp +++ b/Final/Main.cpp @@ -554,10 +554,14 @@ int main() game_loop_type = static_cast(static_cast(game_loop_type) + 1); if (game_loop_type == GameLoopType::Unkown) game_loop_type = GameLoopType::Fixed; - - } + if (sf::Keyboard::isKeyPressed(sf::Keyboard::D)) + { + for (auto& polygon : polygons) + polygon.toggle_debug_info(); + } + /* if (sf::Keyboard::isKeyPressed(sf::Keyboard::I)) { diff --git a/Final/Polygon.cpp b/Final/Polygon.cpp index 1627e3a..39f16ec 100644 --- a/Final/Polygon.cpp +++ b/Final/Polygon.cpp @@ -90,23 +90,22 @@ void polygon::update_shapes() cof_shape_.setPosition(as_screen_coordinates(physical_object_.center_of_mass_global())); } -void polygon::draw(sf::RenderWindow& window) const +void polygon::draw_debug(sf::RenderWindow& window) const { - window.draw(shape_); - window.draw(cof_shape_); + sf::CircleShape circle(2); + + circle.setOutlineColor(sf::Color{ 255, 0, 255 }); + circle.setOutlineThickness(1); + circle.setOrigin(circle.getRadius(), circle.getRadius()); + + sf::Vertex normal_line[2]; - // draw contact for (const auto& contact : contacts_) { const auto center = physical_object_.center_of_mass_global(); - const auto point = center + std::get<0>(contact.point); - sf::CircleShape circle(2); circle.setPosition(as_screen_coordinates(point)); - circle.setOutlineColor(sf::Color{ 255, 0, 255 }); - circle.setOutlineThickness(1); - circle.setOrigin(circle.getRadius(), circle.getRadius()); window.draw(circle); const auto line_start = std::get<0>(std::get<0>(contact.line)); @@ -114,16 +113,23 @@ void polygon::draw(sf::RenderWindow& window) const const auto n = normal(line_start, line_end); - sf::Vertex normal_line[] = - { - sf::Vertex(as_screen_coordinates(point), sf::Color{ 255, 127, 0 }), - sf::Vertex(as_screen_coordinates(point + n), sf::Color{ 255, 127, 0 }) - }; + normal_line[0] = sf::Vertex(as_screen_coordinates(point), sf::Color{ 255, 127, 0 }); + normal_line[1] = sf::Vertex(as_screen_coordinates(point + n), sf::Color{ 255, 127, 0 }); window.draw(normal_line, 2, sf::Lines); } } +void polygon::draw(sf::RenderWindow& window) const +{ + window.draw(shape_); + window.draw(cof_shape_); + + if (!debug_output_) return; + + draw_debug(window); +} + void polygon::scale(const double factor) { diff --git a/Final/Polygon.h b/Final/Polygon.h index 1fefd70..5535686 100644 --- a/Final/Polygon.h +++ b/Final/Polygon.h @@ -14,7 +14,7 @@ constexpr auto screen_scale = 20; // px = 1m -class polygon +class polygon { public: polygon(const Vector2& center, std::vector points); @@ -34,30 +34,33 @@ class polygon void scale(double dt); - void add_contacts(const std::vector& contacts) - { + void add_contacts(const std::vector& contacts) + { for (auto& contact : contacts) { - if(&contact.point_owner != &physical_object_) + if (&contact.point_owner != &physical_object_) continue; contacts_.push_back(contact); } - } + } - void clear_contacts() - { - contacts_.clear(); - } + void clear_contacts() + { + contacts_.clear(); + } - const Vector2& get_center_local() const - { + const Vector2& get_center_local() const + { return { physical_object_.center_of_mass_local().x(), physical_object_.center_of_mass_local().y() }; - } + } + + void enable_debug_info(const bool enable) { debug_output_ = enable; } + void toggle_debug_info() { debug_output_ = !debug_output_; } friend std::ostream& operator<<(std::ostream& os, const polygon& p); @@ -66,10 +69,12 @@ class polygon sf::CircleShape cof_shape_; physical_object physical_object_; - std::vector contacts_; + bool debug_output_ = false; + void update_shapes(); + void draw_debug(sf::RenderWindow& window) const; void set_color(const sf::Color& color); }; From c70c0ad62718812ab387c65ff4e6522e26d5cae6 Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Tue, 30 Jan 2018 18:58:19 +0100 Subject: [PATCH 45/85] code clean up & refactoring --- Final/Console.hpp | 68 ++++- Final/ContactInfo.hpp | 8 +- Final/Main.cpp | 471 +++-------------------------------- Final/Polygon.cpp | 56 ++--- Final/Polygon.h | 37 ++- Final/Vec2.h | 154 ------------ Final/chrono_timer.h | 25 -- Final/collision_detection.h | 218 ++++++++++++++++ Final/collision_resolution.h | 96 +++++++ 9 files changed, 447 insertions(+), 686 deletions(-) delete mode 100644 Final/Vec2.h delete mode 100644 Final/chrono_timer.h create mode 100644 Final/collision_detection.h create mode 100644 Final/collision_resolution.h diff --git a/Final/Console.hpp b/Final/Console.hpp index 69939d9..6d6847b 100644 --- a/Final/Console.hpp +++ b/Final/Console.hpp @@ -7,18 +7,12 @@ #include #include -class Console +class console { -private: - Console() - { - - } - public: - static Console& instance() + static console& instance() { - static Console console; + static console console; return console; } @@ -52,6 +46,11 @@ class Console } private: + console() + { + + } + void update() { std::stringstream stm; @@ -69,4 +68,55 @@ class Console sf::Text m_text; std::unordered_map m_params; sf::Font font; +}; + +template +void measure(const std::string name, SmootherType& smoother, const FuncType& func) +{ + using namespace std::chrono; + using clock = high_resolution_clock; + + const auto start_frame = clock::now(); + + func(); + + const auto elapsed = duration_cast(clock::now() - start_frame); + + smoother.add(static_cast(elapsed.count())); + + console::instance().set_param(name, smoother.get()); +}; + +template()>>>> +void measure(const std::string name, const FuncType& func) +{ + using namespace std::chrono; + using clock = high_resolution_clock; + + const auto start_frame = clock::now(); + + func(); + + const auto elapsed = duration_cast(clock::now() - start_frame); + + console::instance().set_param(name, elapsed.count()); +}; + +template()>>>> +auto measure(const std::string name, const FuncType& func) +{ + using namespace std::chrono; + using clock = high_resolution_clock; + + const auto start_frame = clock::now(); + + auto result = func(); + + const auto elapsed = duration_cast(clock::now() - start_frame); + + console::instance().set_param(name, elapsed.count()); + + return result; }; \ No newline at end of file diff --git a/Final/ContactInfo.hpp b/Final/ContactInfo.hpp index 913fc75..7aec57e 100644 --- a/Final/ContactInfo.hpp +++ b/Final/ContactInfo.hpp @@ -6,8 +6,12 @@ using line_t = std::tuple; struct contact_info { - contact_info(physical_object& point_owner, const point_t& point, physical_object& line_owner, const line_t& line, - double penetration_depth, const Vector2d& point_of_intersection) + contact_info(physical_object& point_owner, + const point_t& point, + physical_object& line_owner, + const line_t& line, + const double penetration_depth, + const Vector2d& point_of_intersection) : point_owner(point_owner), point(point), line_owner(line_owner), diff --git a/Final/Main.cpp b/Final/Main.cpp index 55526e7..94c835a 100644 --- a/Final/Main.cpp +++ b/Final/Main.cpp @@ -17,7 +17,6 @@ #include #include #include -#include #include #include #include @@ -25,68 +24,19 @@ /* Local includes */ #include "Polygon.h" #include "Console.hpp" -#include "ContactInfo.hpp" #include "smoother.h" -enum class GameLoopType -{ - Fixed = 0, - Variable, - Unkown -}; - -/*----------------------------------------------------------------*/ +#include "collision_detection.h" +#include "collision_resolution.h" -template -void measure(const std::string name, SmootherType& smoother, const FuncType& func) +enum class game_loop { - using namespace std::chrono; - using clock = high_resolution_clock; - - const auto start_frame = clock::now(); - - func(); - - const auto elapsed = duration_cast(clock::now() - start_frame); - - smoother.add(static_cast(elapsed.count())); - - Console::instance().set_param(name, smoother.get()); + fixed = 0, + variable, + unkown }; -template()>>>> -void measure(const std::string name, const FuncType& func) -{ - using namespace std::chrono; - using clock = high_resolution_clock; - - const auto start_frame = clock::now(); - - func(); - - const auto elapsed = duration_cast(clock::now() - start_frame); - - Console::instance().set_param(name, elapsed.count()); -}; - -template()>>>> -auto measure(const std::string name, const FuncType& func) -{ - using namespace std::chrono; - using clock = high_resolution_clock; - - const auto start_frame = clock::now(); - - auto result = func(); - - const auto elapsed = duration_cast(clock::now() - start_frame); - - Console::instance().set_param(name, elapsed.count()); - - return result; -}; +/*----------------------------------------------------------------*/ void render(sf::RenderWindow& window, const std::vector& polygons) { @@ -97,317 +47,11 @@ void render(sf::RenderWindow& window, const std::vector& polygons) polygon.draw(window); } - Console::instance().print(window); + console::instance().print(window); window.display(); } -bool lineSegmentIntersection( - double Ax, double Ay, - double Bx, double By, - double Cx, double Cy, - double Dx, double Dy, - double& X, double& Y) { - - double distAB, theCos, theSin, newX, ABpos; - - // Fail if either line segment is zero-length. - if (Ax == Bx && Ay == By || Cx == Dx && Cy == Dy) return false; - - // Fail if the segments share an end-point. - if (Ax == Cx && Ay == Cy || Bx == Cx && By == Cy - || Ax == Dx && Ay == Dy || Bx == Dx && By == Dy) { - return false; - } - - // (1) Translate the system so that point A is on the origin. - Bx -= Ax; By -= Ay; - Cx -= Ax; Cy -= Ay; - Dx -= Ax; Dy -= Ay; - - // Discover the length of segment A-B. - distAB = sqrt(Bx*Bx + By * By); - - // (2) Rotate the system so that point B is on the positive X axis. - theCos = Bx / distAB; - theSin = By / distAB; - newX = Cx * theCos + Cy * theSin; - Cy = Cy * theCos - Cx * theSin; Cx = newX; - newX = Dx * theCos + Dy * theSin; - Dy = Dy * theCos - Dx * theSin; Dx = newX; - - // Fail if segment C-D doesn't cross line A-B. - if (Cy<0. && Dy<0. || Cy >= 0. && Dy >= 0.) return false; - - // (3) Discover the position of the intersection point along line A-B. - ABpos = Dx + (Cx - Dx)*Dy / (Dy - Cy); - - // Fail if segment C-D crosses line A-B outside of segment A-B. - if (ABpos<0. || ABpos>distAB) return false; - - // (4) Apply the discovered position to line A-B in the original coordinate system. - X = Ax + ABpos * theCos; - Y = Ay + ABpos * theSin; - - // Success. - return true; -} - -bool inside(const Vector2d point, - const Vector2d point_offset, - const std::vector& lines, - const Vector2d line_offset) -{ - auto intersections = 0; - - for (const auto& line_b : lines) - { - const auto x1 = point_offset.x() + point.x(); - const auto y1 = point_offset.y() + point.y(); - - const auto x2 = point_offset.x() + point.x() * 100000.0; - const auto y2 = point_offset.y() + point.y() * 100000.0; - - const auto x3 = line_offset.x() + std::get<0>(std::get<0>(line_b)).x(); - const auto y3 = line_offset.y() + std::get<0>(std::get<0>(line_b)).y(); - - const auto x4 = line_offset.x() + std::get<0>(std::get<1>(line_b)).x(); - const auto y4 = line_offset.y() + std::get<0>(std::get<1>(line_b)).y(); - - double ix, iy; - if (!lineSegmentIntersection(x1, y1, x2, y2, x3, y3, x4, y4, ix, iy)) - continue; - - ++intersections; - } - - return intersections % 2 == 1; -} - -void find_intersections(physical_object& object_a, physical_object& object_b, std::vector& contacts) -{ - const auto get_lines = [](const physical_object& object) - { - std::vector lines; - - const auto& points = object.points(); - - for (size_t i = 0; i < points.size(); i++) - { - auto end_index = i == points.size() - 1 - ? 0 - : i + 1; - - lines.emplace_back(points[i], points[end_index]); - } - - return lines; - }; - - const auto points_a = object_a.points(); - const auto lines_b = get_lines(object_b); - - const auto position_a = object_a.position(); - const auto position_b = object_b.position(); - - for (const auto& point_a : points_a) - { - const auto point = std::get<0>(point_a); - - if (!inside(point, position_a, lines_b, position_b)) - continue; - - line_t line; - auto distance = std::numeric_limits::max(); - auto penetration_depth = 0.0; - Vector2d point_of_intersection; - - for (const auto& line_b : lines_b) - { - const auto line_start = position_b + std::get<0>(std::get<0>(line_b)); - const auto line_end = position_b + std::get<0>(std::get<1>(line_b)); - - const auto x1 = position_a.x(); - const auto y1 = position_a.y(); - - const auto x2 = position_a.x() + point.x(); - const auto y2 = position_a.y() + point.y(); - - const auto x3 = line_start.x(); - const auto y3 = line_start.y(); - - const auto x4 = line_end.x(); - const auto y4 = line_end.y(); - - double ix, iy; - if (!lineSegmentIntersection(x1, y1, x2, y2, x3, y3, x4, y4, ix, iy)) - continue; - - const auto current_distance = - (Vector2d(x2, y2)-Vector2d(ix, iy)).norm(); - - if (current_distance >= distance) - continue; - - distance = current_distance; - line = line_b; - penetration_depth = current_distance; - point_of_intersection = Vector2d(ix, iy); - } - - contacts.emplace_back(object_a, point_a, object_b, line, penetration_depth, point_of_intersection); - } -} - -bool intersects(physical_object& a, physical_object& b, std::vector& contacts) -{ - if ((a.center_of_mass_global() - - b.center_of_mass_global()).norm() > - a.bounding_radius() + - b.bounding_radius()) - return false; - - find_intersections(a, b, contacts); - find_intersections(b, a, contacts); - - return !contacts.empty(); -} - -std::vector collision_detection(std::vector& polygons) -{ - for (auto& polygon_a : polygons) - { - polygon_a.clear_contacts(); - } - - std::vector global_contacts; - for (auto i = 0u; i < polygons.size(); ++i) - { - auto& polygon_a = polygons[i]; - - for (auto j = i + 1; j < polygons.size(); ++j) - { - auto& polygon_b = polygons[j]; - - auto& object_a = polygon_a.get_physical_object(); - auto& object_b = polygon_b.get_physical_object(); - - if (object_a.get_type() == object_type::fixed && - object_b.get_type() == object_type::fixed) - continue; - - std::vector local_contacts; - if (!intersects(object_a, object_b, local_contacts)) - continue; - - polygon_a.add_contacts(local_contacts); - polygon_b.add_contacts(local_contacts); - - std::move( - local_contacts.begin(), - local_contacts.end(), - std::back_inserter(global_contacts)); - } - } - - return global_contacts; -} - -void collision_resolution(const std::vector& contacts) -{ - for (const auto& contact : contacts) - { - const auto line_start = std::get<0>(std::get<0>(contact.line)); - const auto line_end = std::get<0>(std::get<1>(contact.line)); - - const auto n = normal(line_start, line_end); - - auto& a = contact.line_owner; - auto& b = contact.point_owner; - - const auto contact_points = std::count_if(contacts.begin(), contacts.end(), - [&b, &a](const contact_info& c) - { - return &c.point_owner == &b && &c.line_owner == &a || - &c.point_owner == &a && &c.line_owner == &b; - }); - - const auto b_point_offset = std::get<0>(contact.point); - const auto b_point_velocity = std::get<1>(contact.point); - - const Vector2d a_point_offset = - (std::get<0>(std::get<0>(contact.line)) + - std::get<0>(std::get<1>(contact.line))) / 2.0; - - const Vector2d a_point_velocity = - (std::get<1>(std::get<0>(contact.line)) + - std::get<1>(std::get<1>(contact.line))) / 2.0; - - const Vector2d rv = b_point_velocity - a_point_velocity; - const auto relative_velocity = rv.dot(n); - - if (relative_velocity > 0) - continue; - - const auto e = rv.squaredNorm() < (gravity * 0.016).squaredNorm() + 0.01 - ? 0 - : 0.3; - - const auto ra_n = cross2(a_point_offset, n); - const auto rb_n = cross2(b_point_offset, n); - - const auto t_a = a.inverse_mass() + a.inverse_inertia() * ra_n * ra_n; - const auto t_b = b.inverse_mass() + b.inverse_inertia() * rb_n * rb_n; - const auto denom = t_a + t_b; - - const auto j = -(1 + e) * relative_velocity / denom / contact_points; - - const auto normal_impulse = j * n; - - a.apply_impulse(-normal_impulse, a_point_offset); - b.apply_impulse( normal_impulse, b_point_offset); - - // friction - const auto tangent = (rv - n * rv.dot(n)).normalized(); - - const auto jt = -rv.dot(tangent) / denom / contact_points; - - if (std::abs(jt) < 0.000001) continue; - - const auto static_friction = 0.61; - const auto dynamic_friction = 0.47; - - const auto tangent_impulse = std::abs(jt) < j * static_friction - ? (tangent * jt).eval() - : (tangent * -j * dynamic_friction).eval(); - - a.apply_impulse(-tangent_impulse, a_point_offset); - b.apply_impulse(tangent_impulse, b_point_offset); - } -} - -void correct_positions(const std::vector& contacts) -{ - for (const auto& contact : contacts) - { - const auto line_start = std::get<0>(std::get<0>(contact.line)); - const auto line_end = std::get<0>(std::get<1>(contact.line)); - const auto normal = ((line_end + line_start) / 2.0).normalized(); - - auto& a = contact.line_owner; - auto& b = contact.point_owner; - - const auto percent = 0.2; // usually 20% to 80% - const auto slop = 0.05; // usually 0.01 to 0.1 - - const Vector2d correction = std::max(contact.penetration_depth - slop, 0.0) - / (a.inverse_mass() + b.inverse_mass()) * percent * normal; - - a.move(-a.inverse_mass() * correction); - b.move( b.inverse_mass() * correction); - } -} - void update(std::vector& polygons, const double dt) { auto contacts = measure("Update: Collision Detection", [&] @@ -436,46 +80,36 @@ void update(std::vector& polygons, const double dt) int main() { - auto increase_polygon = false; - auto polygon_vertex_count = 3; - - std::vector polygons; - - double xs = 0; - double ys = 0; + console::instance().init(); constexpr auto width = 1280; constexpr auto height = 800; - Console::instance().init(); - sf::RenderWindow window(sf::VideoMode(width, height), "2D Collision detection"); - polygons.emplace_back(polygon::create_rectangle(Vector2(400, 700), Vector2(710, 40))); + std::vector polygons; + + polygons.emplace_back(polygon::create_rectangle(Vector2d(400, 700), Vector2d(710, 40))); polygons.back().get_physical_object().rotate(-5 * M_PI / 180); - polygons.emplace_back(polygon::create_rectangle(Vector2(900, 650), Vector2(700, 40))); + polygons.emplace_back(polygon::create_rectangle(Vector2d(900, 650), Vector2d(700, 40))); polygons.back().get_physical_object().rotate(30 * M_PI / 180); - polygons.emplace_back(polygon::create_rectangle(Vector2(50, 400), Vector2(700, 40))); + polygons.emplace_back(polygon::create_rectangle(Vector2d(50, 400), Vector2d(700, 40))); polygons.back().get_physical_object().rotate(-70 * M_PI / 180); - polygons.emplace_back(polygon::create_random(Vector2(600, 400), 6)); + polygons.emplace_back(polygon::create_random(Vector2d(600, 400), 6)); polygons.back().scale(8); - polygons.emplace_back(polygon::create_random(Vector2(200, 420), 4)); + polygons.emplace_back(polygon::create_random(Vector2d(200, 420), 4)); polygons.back().scale(5); - polygons.emplace_back(polygon::create_circle(Vector2(900, 300), 60)); + polygons.emplace_back(polygon::create_circle(Vector2d(900, 300), 60)); using namespace std::chrono; using clock = high_resolution_clock; - const auto fps_60 = duration(16ms); - const auto fps_30 = duration(32ms); - const auto interval = fps_60; - - auto game_loop_type = GameLoopType::Fixed; + auto game_loop_type = game_loop::variable; smoother draw_time_smooth; smoother update_time_smooth; @@ -484,7 +118,9 @@ int main() std::default_random_engine rng; - auto process_events = [&]() + auto increase_polygon = false; + + auto process_events = [&, xs = 0, ys = 0] () mutable { sf::Event event; while (window.pollEvent(event)) @@ -502,29 +138,10 @@ int main() case sf::Event::MouseButtonPressed: { polygons.emplace_back(polygon::create_random( - Vector2(xs, ys), 4)); + Vector2d(xs, ys), 4)); //polygons.emplace_back(polygon::create_circle(Vector2(xs, ys), 5)); - - auto& polygon = polygons.back(); - - polygon.get_physical_object().rotate(M_PI / 2); - - /*if(draw_circle) - polygons.emplace_back(polygon::create_circle(Vector2(xs, ys), 5)); - else - polygons.emplace_back(polygon::create_random(Vector2(xs, ys), - polygon_vertex_count)); - - - const auto& shape = polygon.get_shape(); - - std::uniform_int_distribution rnd(0, shape.getPointCount() - 1); - const auto random_point = polygon.get_shape().getPoint(rnd(rng)); - - polygons.back().get_physical_object().accelerate( - as_world_coordinates(random_point), { 0, 15.0f });*/ - + increase_polygon = true; } break; @@ -551,9 +168,9 @@ int main() if (sf::Keyboard::isKeyPressed(sf::Keyboard::G)) { - game_loop_type = static_cast(static_cast(game_loop_type) + 1); - if (game_loop_type == GameLoopType::Unkown) - game_loop_type = GameLoopType::Fixed; + game_loop_type = static_cast(static_cast(game_loop_type) + 1); + if (game_loop_type == game_loop::unkown) + game_loop_type = game_loop::fixed; } if (sf::Keyboard::isKeyPressed(sf::Keyboard::D)) @@ -562,22 +179,6 @@ int main() polygon.toggle_debug_info(); } - /* - if (sf::Keyboard::isKeyPressed(sf::Keyboard::I)) - { - polygon_vertex_count = ((polygon_vertex_count + 1) % 7) + 3; - } - - if (sf::Keyboard::isKeyPressed(sf::Keyboard::D)) - { - polygon_vertex_count = ((polygon_vertex_count - 1) % 7) + 3; - } - - if (sf::Keyboard::isKeyPressed(sf::Keyboard::C)) - { - polygon_vertex_count = circle; - }*/ - } break; default: break; @@ -585,14 +186,12 @@ int main() } }; - auto fixed_game_loop = [&]() + const auto fixed_game_loop = [&, interval = duration(16ms)]() { auto elapsed_ms = duration_cast(clock::now() - last_time); if (elapsed_ms < interval) { - //auto interval_ms = duration_cast(interval); - //auto wait = interval_ms - elapsed_ms; std::this_thread::sleep_for(0ms); return; } @@ -616,7 +215,7 @@ int main() elapsed_ms = duration_cast(elapsed_ms - interval); } - Console::instance().set_param("Update", update_time_smooth.get()); + console::instance().set_param("Update", update_time_smooth.get()); measure("Draw", draw_time_smooth, [&] { @@ -624,7 +223,7 @@ int main() }); }; - auto variable_game_loop = [&]() + const auto variable_game_loop = [&]() { auto elapsed_s = duration_cast>(clock::now() - last_time); last_time = clock::now(); @@ -634,7 +233,6 @@ int main() if (increase_polygon) polygons.back().scale(1 + elapsed_s.count() * 2); - measure("Update", update_time_smooth, [&] { update(polygons, elapsed_s.count()); @@ -650,20 +248,19 @@ int main() { switch (game_loop_type) { - case GameLoopType::Fixed: - Console::instance().set_param("GameLoop", "Fixed"); + case game_loop::fixed: + console::instance().set_param("GameLoop", "Fixed"); fixed_game_loop(); break; - case GameLoopType::Variable: - Console::instance().set_param("GameLoop", "Variable"); + case game_loop::variable: + console::instance().set_param("GameLoop", "Variable"); variable_game_loop(); break; - case GameLoopType::Unkown: + case game_loop::unkown: default: break; } } - return 0; } \ No newline at end of file diff --git a/Final/Polygon.cpp b/Final/Polygon.cpp index 39f16ec..6c0ab65 100644 --- a/Final/Polygon.cpp +++ b/Final/Polygon.cpp @@ -12,7 +12,7 @@ std::default_random_engine rng; std::vector> create_mass_points( const double density, - const std::vector& points) + const std::vector& points) { constexpr auto depth = 1.0; @@ -22,10 +22,11 @@ std::vector> create_mass_points( for (auto i = 0u; i < points.size(); i++) { - auto point_i = points[i]; - auto point_j = points[j]; + const auto point_i = points[i]; + const auto point_j = points[j]; area += (point_j.x() + point_i.x()) * (point_j.y() - point_i.y()); + j = i; // j is previous vertex to i } @@ -43,20 +44,14 @@ std::vector> create_mass_points( return mass_points; } -polygon::polygon(const Vector2& center, std::vector points) +polygon::polygon(const Vector2d& center, std::vector points) : physical_object_(as_world_coordinates(center), create_mass_points(0.05, points)) { shape_.setPointCount(points.size()); - auto accum = Vector2{ 0, 0 }; for (auto i = 0u; i < points.size(); i++) { - auto point = points[i]; - accum += point; - - shape_.setPoint(i, sf::Vector2f( - static_cast(point.x()), - static_cast(point.y()))); + shape_.setPoint(i, to_sf(points[i])); } const auto cof = as_screen_coordinates(physical_object_.center_of_mass_local()); @@ -172,19 +167,17 @@ std::ostream& operator<<(std::ostream& os, const polygon& p) return os; } -polygon polygon::create_rectangle(const Vector2 pos, const Vector2 size) +polygon polygon::create_rectangle(const Vector2d pos, const Vector2d size) { const auto aspect = size.x() / size.y(); const auto half_height = 0.5; const auto half_width = half_height * aspect; - const std::vector points = - { - Vector2(-half_width, -half_height), - Vector2(-half_width, half_height), - Vector2( half_width, half_height), - Vector2( half_width, -half_height) - }; + std::vector points; + points.emplace_back(-half_width, -half_height); + points.emplace_back(-half_width, half_height); + points.emplace_back(half_width, half_height); + points.emplace_back(half_width, -half_height); polygon p(pos, points); @@ -194,30 +187,13 @@ polygon polygon::create_rectangle(const Vector2 pos, const Vector2 size) return p; } -polygon polygon::create_line(const Vector2 start, const Vector2 end) -{ - const std::vector points = - { - Vector2(0,0), - Vector2(0.0001, 0.0001), - end, - Vector2(end.x() - 0.0001, end.y() - 0.0001) - }; - - polygon p((end - start) / 2, points); - - p.set_color(sf::Color::White); - - return p; -} - -polygon polygon::create_circle(const Vector2 center, const double radius) +polygon polygon::create_circle(const Vector2d center, const double radius) { constexpr auto vertex_count = 20; const auto angle = 360.0 / vertex_count; - std::vector points; + std::vector points; for (auto i = 0; i < vertex_count; ++i) { points.emplace_back( @@ -233,14 +209,14 @@ polygon polygon::create_circle(const Vector2 center, const double radius) return p; } -polygon polygon::create_random(const Vector2 center, const size_t vertex_count) +polygon polygon::create_random(const Vector2d center, const size_t vertex_count) { const auto angle = 2 * M_PI / vertex_count; std::uniform_real_distribution rnd( -angle / vertex_count, angle / vertex_count); - std::vector points; + std::vector points; for (auto i = 0u; i < vertex_count; ++i) { const auto final_angle = i * angle + rnd(rng); diff --git a/Final/Polygon.h b/Final/Polygon.h index 5535686..f26777f 100644 --- a/Final/Polygon.h +++ b/Final/Polygon.h @@ -5,7 +5,6 @@ #ifndef PHYSICALLYBASEDSIMULATION_POLYGON_H #define PHYSICALLYBASEDSIMULATION_POLYGON_H -#include "Vec2.h" #include "physical_object.h" #include @@ -17,12 +16,11 @@ constexpr auto screen_scale = 20; // px = 1m class polygon { public: - polygon(const Vector2& center, std::vector points); + polygon(const Vector2d& center, std::vector points); - static polygon create_rectangle(const Vector2 pos, const Vector2 scale); - static polygon create_line(const Vector2 start, const Vector2 end); - static polygon create_circle(const Vector2 center, const double radius); - static polygon create_random(const Vector2 center, const size_t vertex_count); + static polygon create_rectangle(const Vector2d pos, const Vector2d scale); + static polygon create_circle(const Vector2d center, const double radius); + static polygon create_random(const Vector2d center, const size_t vertex_count); void update(const double dt); void draw(sf::RenderWindow& window) const; @@ -50,15 +48,6 @@ class polygon contacts_.clear(); } - const Vector2& get_center_local() const - { - return - { - physical_object_.center_of_mass_local().x(), - physical_object_.center_of_mass_local().y() - }; - } - void enable_debug_info(const bool enable) { debug_output_ = enable; } void toggle_debug_info() { debug_output_ = !debug_output_; } @@ -87,14 +76,24 @@ inline sf::Vector2f as_screen_coordinates(Vector2d v) }; } -inline Vector2d as_world_coordinates(const Vector2& v) +inline Vector2d as_world_coordinates(const sf::Vector2f& v) { - return { v.x() / screen_scale, -v.y() / screen_scale}; + return { v.x / screen_scale, -v.y / screen_scale}; } -inline Vector2d as_world_coordinates(const sf::Vector2f& v) +inline Vector2d as_world_coordinates(const Vector2d& v) { - return { v.x / screen_scale, -v.y / screen_scale }; + return { v.x() / screen_scale, -v.y() / screen_scale }; } +inline sf::Vector2f to_sf(const Vector2d& v) +{ + return + { + static_cast(v.x()), + static_cast(v.y()) + }; +} + + #endif //PHYSICALLYBASEDSIMULATION_POLYGON_H diff --git a/Final/Vec2.h b/Final/Vec2.h deleted file mode 100644 index f62acc9..0000000 --- a/Final/Vec2.h +++ /dev/null @@ -1,154 +0,0 @@ -/****************************************************************** -* -* Vec2.h -* -* Description: Code providing helper function for handling 2D -* vectors; standard operators are provided -* -* Physically-Based Simulation Proseminar WS 2015 -* -* Interactive Graphics and Simulation Group -* Institute of Computer Science -* University of Innsbruck -* -*******************************************************************/ - -#ifndef __VEC2_T_H__ -#define __VEC2_T_H__ - -template -class Vector2T -{ -public: - Vector2T() { m_xy[0] = (T)0; m_xy[1] = (T)0;} - Vector2T(T v) { m_xy[0] = v; m_xy[1] = v; } - Vector2T(const T x, const T y) { m_xy[0] = x; m_xy[1] = y; } - Vector2T(const Vector2T &other) { *this = other; } - - Vector2T & operator=( const Vector2T &other ) - { - m_xy[0]= other.m_xy[0]; m_xy[1] = other.m_xy[1]; return *this; - } - - T& operator[](int i) { return m_xy[i]; } - - const T& x() const { return m_xy[0]; } - const T& y() const { return m_xy[1]; } - - const T& operator[](int i) const { return m_xy[i]; } - - bool operator==(const Vector2T &other) const - { - if(x()!=other.x()) return false; - if(y()!=other.y()) return false; - return true; - } - - bool operator!=(const Vector2T &other) const - { - return !(*this == other); - } - - Vector2T operator*( T s ) const - { - return Vector2T(m_xy[0]*s, m_xy[1]*s); - } - - Vector2T& operator*=( T s ) - { - m_xy[0] = m_xy[0] * s; - m_xy[1] = m_xy[1] * s; - return *this; - } - - Vector2T operator/( T s ) const - { - return Vector2T(m_xy[0]/s, m_xy[1]/s); - } - - Vector2T& operator/=( T s ) - { - m_xy[0] = m_xy[0] / s; - m_xy[1] = m_xy[1] / s; - return *this; - } - - Vector2T operator+( const Vector2T &v2 ) const - { - return Vector2T(x()+v2.x(),y()+v2.y()); - } - - Vector2T& operator+=( const Vector2T &v ) - { - m_xy[0] += v.x(); - m_xy[1] += v.y(); - return *this; - } - - Vector2T operator-( const Vector2T &v2 ) const - { - return Vector2T(x()-v2.x(),y()-v2.y()); - } - - Vector2T& operator-=( const Vector2T &v ) - { - m_xy[0] -= v.x(); - m_xy[1] -= v.y(); - return *this; - } - - Vector2T operator-() const - { - return Vector2T(-m_xy[0], -m_xy[1]); - } - - T operator|(const Vector2T &v2) const - { - return (*this)[0] * v2[0] + (*this)[1] * v2[1]; - } - - Vector2T normalized() const - { - return *this / length(); - } - - T norm() const - { - return length(); - } - - T sqrnorm() const - { - return squaredLength(); - } - - T length() const - { - return sqrt(x()*x() + y()*y()); - } - - T squaredLength() const - { - return (x()*x() + y()*y()); - } - - T magnitude() const - { - return sqrt(x() * x() + y() * y()); - } - - static int dim() { return 2; } - -private: - T m_xy[2]; -}; - -template -Vector2T operator*(T const &s, Vector2T const &v) -{ - return v*s; -} - -typedef Vector2T Vector2; - -#endif diff --git a/Final/chrono_timer.h b/Final/chrono_timer.h deleted file mode 100644 index 36336c5..0000000 --- a/Final/chrono_timer.h +++ /dev/null @@ -1,25 +0,0 @@ -#pragma once - -#include -#include -#include - -class ChronoTimer { - const std::string name; - const std::chrono::time_point start; -public: - ChronoTimer(const std::string& name = "Unnamed") - : name(name), - start(std::chrono::high_resolution_clock::now()) { - } - ~ChronoTimer() { - auto elapsed = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - start); - std::cout << "Timer - " << name << ": " << elapsed.count() << " ms " << std::endl; - } - - long long get_milliseconds() - { - auto elapsed = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - start); - return elapsed.count(); - } -}; diff --git a/Final/collision_detection.h b/Final/collision_detection.h new file mode 100644 index 0000000..4d670ef --- /dev/null +++ b/Final/collision_detection.h @@ -0,0 +1,218 @@ +#ifndef COLLISION_DETECTION_H +#define COLLISION_DETECTION_H + +#include "physical_object.h" +#include "ContactInfo.hpp" +#include "Polygon.h" + +inline bool lineSegmentIntersection( + double Ax, double Ay, + double Bx, double By, + double Cx, double Cy, + double Dx, double Dy, + double& X, double& Y) { + + double distAB, theCos, theSin, newX, ABpos; + + // Fail if either line segment is zero-length. + if (Ax == Bx && Ay == By || Cx == Dx && Cy == Dy) return false; + + // Fail if the segments share an end-point. + if (Ax == Cx && Ay == Cy || Bx == Cx && By == Cy + || Ax == Dx && Ay == Dy || Bx == Dx && By == Dy) { + return false; + } + + // (1) Translate the system so that point A is on the origin. + Bx -= Ax; By -= Ay; + Cx -= Ax; Cy -= Ay; + Dx -= Ax; Dy -= Ay; + + // Discover the length of segment A-B. + distAB = sqrt(Bx*Bx + By * By); + + // (2) Rotate the system so that point B is on the positive X axis. + theCos = Bx / distAB; + theSin = By / distAB; + newX = Cx * theCos + Cy * theSin; + Cy = Cy * theCos - Cx * theSin; Cx = newX; + newX = Dx * theCos + Dy * theSin; + Dy = Dy * theCos - Dx * theSin; Dx = newX; + + // Fail if segment C-D doesn't cross line A-B. + if (Cy<0. && Dy<0. || Cy >= 0. && Dy >= 0.) return false; + + // (3) Discover the position of the intersection point along line A-B. + ABpos = Dx + (Cx - Dx)*Dy / (Dy - Cy); + + // Fail if segment C-D crosses line A-B outside of segment A-B. + if (ABpos<0. || ABpos>distAB) return false; + + // (4) Apply the discovered position to line A-B in the original coordinate system. + X = Ax + ABpos * theCos; + Y = Ay + ABpos * theSin; + + // Success. + return true; +} + +inline bool inside(const Vector2d point, + const Vector2d point_offset, + const std::vector& lines, + const Vector2d line_offset) +{ + auto intersections = 0; + + for (const auto& line_b : lines) + { + const auto x1 = point_offset.x() + point.x(); + const auto y1 = point_offset.y() + point.y(); + + const auto x2 = point_offset.x() + point.x() * 100000.0; + const auto y2 = point_offset.y() + point.y() * 100000.0; + + const auto x3 = line_offset.x() + std::get<0>(std::get<0>(line_b)).x(); + const auto y3 = line_offset.y() + std::get<0>(std::get<0>(line_b)).y(); + + const auto x4 = line_offset.x() + std::get<0>(std::get<1>(line_b)).x(); + const auto y4 = line_offset.y() + std::get<0>(std::get<1>(line_b)).y(); + + double ix, iy; + if (!lineSegmentIntersection(x1, y1, x2, y2, x3, y3, x4, y4, ix, iy)) + continue; + + ++intersections; + } + + return intersections % 2 == 1; +} + +inline void find_intersections(physical_object& object_a, physical_object& object_b, std::vector& contacts) +{ + const auto get_lines = [](const physical_object& object) + { + std::vector lines; + + const auto& points = object.points(); + + for (size_t i = 0; i < points.size(); i++) + { + auto end_index = i == points.size() - 1 + ? 0 + : i + 1; + + lines.emplace_back(points[i], points[end_index]); + } + + return lines; + }; + + const auto points_a = object_a.points(); + const auto lines_b = get_lines(object_b); + + const auto position_a = object_a.position(); + const auto position_b = object_b.position(); + + for (const auto& point_a : points_a) + { + const auto point = std::get<0>(point_a); + + if (!inside(point, position_a, lines_b, position_b)) + continue; + + line_t line; + auto distance = std::numeric_limits::max(); + auto penetration_depth = 0.0; + Vector2d point_of_intersection; + + for (const auto& line_b : lines_b) + { + const auto line_start = position_b + std::get<0>(std::get<0>(line_b)); + const auto line_end = position_b + std::get<0>(std::get<1>(line_b)); + + const auto x1 = position_a.x(); + const auto y1 = position_a.y(); + + const auto x2 = position_a.x() + point.x(); + const auto y2 = position_a.y() + point.y(); + + const auto x3 = line_start.x(); + const auto y3 = line_start.y(); + + const auto x4 = line_end.x(); + const auto y4 = line_end.y(); + + double ix, iy; + if (!lineSegmentIntersection(x1, y1, x2, y2, x3, y3, x4, y4, ix, iy)) + continue; + + const auto current_distance = + (Vector2d(x2, y2) - Vector2d(ix, iy)).norm(); + + if (current_distance >= distance) + continue; + + distance = current_distance; + line = line_b; + penetration_depth = current_distance; + point_of_intersection = Vector2d(ix, iy); + } + + contacts.emplace_back(object_a, point_a, object_b, line, penetration_depth, point_of_intersection); + } +} + +inline bool intersects(physical_object& a, physical_object& b, std::vector& contacts) +{ + if ((a.center_of_mass_global() - + b.center_of_mass_global()).norm() > + a.bounding_radius() + + b.bounding_radius()) + return false; + + find_intersections(a, b, contacts); + find_intersections(b, a, contacts); + + return !contacts.empty(); +} + +inline std::vector collision_detection(std::vector& polygons) +{ + for (auto& polygon_a : polygons) + { + polygon_a.clear_contacts(); + } + + std::vector global_contacts; + for (auto i = 0u; i < polygons.size(); ++i) + { + auto& polygon_a = polygons[i]; + + for (auto j = i + 1; j < polygons.size(); ++j) + { + auto& polygon_b = polygons[j]; + + auto& object_a = polygon_a.get_physical_object(); + auto& object_b = polygon_b.get_physical_object(); + + if (object_a.get_type() == object_type::fixed && + object_b.get_type() == object_type::fixed) + continue; + + std::vector local_contacts; + if (!intersects(object_a, object_b, local_contacts)) + continue; + + polygon_a.add_contacts(local_contacts); + polygon_b.add_contacts(local_contacts); + + std::move( + local_contacts.begin(), + local_contacts.end(), + std::back_inserter(global_contacts)); + } + } + + return global_contacts; +} +#endif // COLLISION_DETECTION_H diff --git a/Final/collision_resolution.h b/Final/collision_resolution.h new file mode 100644 index 0000000..f0cb032 --- /dev/null +++ b/Final/collision_resolution.h @@ -0,0 +1,96 @@ +#include "ContactInfo.hpp" + +inline void collision_resolution(const std::vector& contacts) +{ + for (const auto& contact : contacts) + { + const auto line_start = std::get<0>(std::get<0>(contact.line)); + const auto line_end = std::get<0>(std::get<1>(contact.line)); + + const auto n = normal(line_start, line_end); + + auto& a = contact.line_owner; + auto& b = contact.point_owner; + + const auto contact_points = std::count_if(contacts.begin(), contacts.end(), + [&b, &a](const contact_info& c) + { + return &c.point_owner == &b && &c.line_owner == &a || + &c.point_owner == &a && &c.line_owner == &b; + }); + + const auto b_point_offset = std::get<0>(contact.point); + const auto b_point_velocity = std::get<1>(contact.point); + + const Vector2d a_point_offset = + (std::get<0>(std::get<0>(contact.line)) + + std::get<0>(std::get<1>(contact.line))) / 2.0; + + const Vector2d a_point_velocity = + (std::get<1>(std::get<0>(contact.line)) + + std::get<1>(std::get<1>(contact.line))) / 2.0; + + const Vector2d rv = b_point_velocity - a_point_velocity; + const auto relative_velocity = rv.dot(n); + + if (relative_velocity > 0) + continue; + + const auto e = rv.squaredNorm() < (gravity * 0.016).squaredNorm() + 0.01 + ? 0 + : 0.3; + + const auto ra_n = cross2(a_point_offset, n); + const auto rb_n = cross2(b_point_offset, n); + + const auto t_a = a.inverse_mass() + a.inverse_inertia() * ra_n * ra_n; + const auto t_b = b.inverse_mass() + b.inverse_inertia() * rb_n * rb_n; + const auto denom = t_a + t_b; + + const auto j = -(1 + e) * relative_velocity / denom / contact_points; + + const auto normal_impulse = j * n; + + a.apply_impulse(-normal_impulse, a_point_offset); + b.apply_impulse(normal_impulse, b_point_offset); + + // friction + const auto tangent = (rv - n * rv.dot(n)).normalized(); + + const auto jt = -rv.dot(tangent) / denom / contact_points; + + if (std::abs(jt) < 0.000001) continue; + + const auto static_friction = 0.61; + const auto dynamic_friction = 0.47; + + const auto tangent_impulse = std::abs(jt) < j * static_friction + ? (tangent * jt).eval() + : (tangent * -j * dynamic_friction).eval(); + + a.apply_impulse(-tangent_impulse, a_point_offset); + b.apply_impulse(tangent_impulse, b_point_offset); + } +} + +inline void correct_positions(const std::vector& contacts) +{ + for (const auto& contact : contacts) + { + const auto line_start = std::get<0>(std::get<0>(contact.line)); + const auto line_end = std::get<0>(std::get<1>(contact.line)); + const auto normal = ((line_end + line_start) / 2.0).normalized(); + + auto& a = contact.line_owner; + auto& b = contact.point_owner; + + const auto percent = 0.2; // usually 20% to 80% + const auto slop = 0.05; // usually 0.01 to 0.1 + + const Vector2d correction = std::max(contact.penetration_depth - slop, 0.0) + / (a.inverse_mass() + b.inverse_mass()) * percent * normal; + + a.move(-a.inverse_mass() * correction); + b.move(b.inverse_mass() * correction); + } +} From 639f4f97abbc964d350417f037e4d0712d7a1e02 Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Tue, 30 Jan 2018 19:36:00 +0100 Subject: [PATCH 46/85] updated visuals fixed debug mode toggling (use 'D') --- Final/Main.cpp | 17 ++++++++++--- Final/Polygon.cpp | 63 +++++++++++++++++++++++++++++++++++++++-------- Final/Polygon.h | 6 ++++- 3 files changed, 71 insertions(+), 15 deletions(-) diff --git a/Final/Main.cpp b/Final/Main.cpp index 94c835a..9be1721 100644 --- a/Final/Main.cpp +++ b/Final/Main.cpp @@ -40,13 +40,18 @@ enum class game_loop void render(sf::RenderWindow& window, const std::vector& polygons) { - window.clear(); + window.clear({10, 10, 20}); for (auto& polygon : polygons) { polygon.draw(window); } + for (auto& polygon : polygons) + { + polygon.draw_debug(window); + } + console::instance().print(window); window.display(); @@ -86,7 +91,7 @@ int main() constexpr auto height = 800; sf::RenderWindow window(sf::VideoMode(width, height), "2D Collision detection"); - + std::vector polygons; polygons.emplace_back(polygon::create_rectangle(Vector2d(400, 700), Vector2d(710, 40))); @@ -120,7 +125,7 @@ int main() auto increase_polygon = false; - auto process_events = [&, xs = 0, ys = 0] () mutable + auto process_events = [&, xs = 0, ys = 0, debug = false] () mutable { sf::Event event; while (window.pollEvent(event)) @@ -142,6 +147,8 @@ int main() //polygons.emplace_back(polygon::create_circle(Vector2(xs, ys), 5)); + polygons.back().enable_debug_info(debug); + increase_polygon = true; } break; @@ -175,8 +182,10 @@ int main() if (sf::Keyboard::isKeyPressed(sf::Keyboard::D)) { + debug = !debug; + for (auto& polygon : polygons) - polygon.toggle_debug_info(); + polygon.enable_debug_info(debug); } } break; diff --git a/Final/Polygon.cpp b/Final/Polygon.cpp index 6c0ab65..dccc630 100644 --- a/Final/Polygon.cpp +++ b/Final/Polygon.cpp @@ -75,6 +75,8 @@ void polygon::update(const double dt) physical_object_.update(dt); update_shapes(); + + update_color(color_); } void polygon::update_shapes() @@ -87,9 +89,14 @@ void polygon::update_shapes() void polygon::draw_debug(sf::RenderWindow& window) const { + if (!debug_output_) return; + + window.draw(cof_shape_); + sf::CircleShape circle(2); - circle.setOutlineColor(sf::Color{ 255, 0, 255 }); + circle.setOutlineColor(sf::Color{ 255, 127, 0 }); + circle.setFillColor(sf::Color{ 255, 127, 0 }); circle.setOutlineThickness(1); circle.setOrigin(circle.getRadius(), circle.getRadius()); @@ -118,14 +125,8 @@ void polygon::draw_debug(sf::RenderWindow& window) const void polygon::draw(sf::RenderWindow& window) const { window.draw(shape_); - window.draw(cof_shape_); - - if (!debug_output_) return; - - draw_debug(window); } - void polygon::scale(const double factor) { shape_.scale( @@ -139,16 +140,58 @@ void polygon::scale(const double factor) physical_object_.set_scale(shape_.getScale().x); } -void polygon::set_color(const sf::Color& color) +void polygon::update_color(const sf::Color& color) { + const sf::Color debug_color = { 100, 100, 100 }; + const sf::Color debug_color_dark = { 15, 15, 15 }; + const sf::Color debug_color_light = { 50, 50, 50 }; + + if(debug_output_) + { + switch (physical_object_.get_type()) + { + case object_type::fixed: + shape_.setOutlineColor(debug_color); + shape_.setFillColor(debug_color_light); + break; + + default: + shape_.setOutlineColor(debug_color); + shape_.setFillColor(debug_color_dark); + break; + } + + return; + } + + shape_.setOutlineColor(color); + const sf::Color dark = { static_cast(color.r / 2), static_cast(color.g / 2), static_cast(color.b / 2), }; - shape_.setFillColor(dark); - shape_.setOutlineColor(color); + const sf::Color darker = { + static_cast(color.r / 10), + static_cast(color.g / 10), + static_cast(color.b / 10), + }; + + switch (physical_object_.get_type()) + { + case object_type::fixed: shape_.setFillColor(darker); break; + case object_type::dynamic: shape_.setFillColor(dark);; + case object_type::kinematic: shape_.setFillColor(dark);; + default: ; + } +} + +void polygon::set_color(const sf::Color& color) +{ + color_ = color; + + update_color(color); } std::ostream& operator<<(std::ostream& os, const polygon& p) diff --git a/Final/Polygon.h b/Final/Polygon.h index f26777f..183379a 100644 --- a/Final/Polygon.h +++ b/Final/Polygon.h @@ -24,6 +24,7 @@ class polygon void update(const double dt); void draw(sf::RenderWindow& window) const; + void draw_debug(sf::RenderWindow& window) const; const sf::Shape& get_shape() const { return shape_; } @@ -31,6 +32,7 @@ class polygon const physical_object& get_physical_object() const { return physical_object_; } void scale(double dt); + void update_color(const sf::Color& color); void add_contacts(const std::vector& contacts) { @@ -62,8 +64,10 @@ class polygon bool debug_output_ = false; + sf::Color color_; + void update_shapes(); - void draw_debug(sf::RenderWindow& window) const; + void set_color(const sf::Color& color); }; From 362a4b9746cd48c0a696956ed89158c152a6f865 Mon Sep 17 00:00:00 2001 From: Ivan Waldboth Date: Tue, 30 Jan 2018 19:41:14 +0100 Subject: [PATCH 47/85] fixed some warnings and u can now draw polygons --- Final/Console.hpp | 2 +- Final/Main.cpp | 106 +++++++++++++++++++++++++++------------------- Final/Polygon.cpp | 73 +++++++++++++++++++++++++++++++ Final/Polygon.h | 1 + 4 files changed, 138 insertions(+), 44 deletions(-) diff --git a/Final/Console.hpp b/Final/Console.hpp index 69939d9..87e6cf6 100644 --- a/Final/Console.hpp +++ b/Final/Console.hpp @@ -31,7 +31,7 @@ class Console m_text.setFont(font); m_text.setCharacterSize(12); - m_text.setFillColor(sf::Color::White); + m_text.setColor(sf::Color::White); } template diff --git a/Final/Main.cpp b/Final/Main.cpp index 55526e7..2ae084e 100644 --- a/Final/Main.cpp +++ b/Final/Main.cpp @@ -88,7 +88,8 @@ auto measure(const std::string name, const FuncType& func) return result; }; -void render(sf::RenderWindow& window, const std::vector& polygons) +void render(sf::RenderWindow& window, const std::vector& polygons, + const sf::VertexArray custom_polygon) { window.clear(); @@ -99,6 +100,9 @@ void render(sf::RenderWindow& window, const std::vector& polygons) Console::instance().print(window); + if(custom_polygon.getVertexCount()!=0) + window.draw(custom_polygon); + window.display(); } @@ -112,11 +116,11 @@ bool lineSegmentIntersection( double distAB, theCos, theSin, newX, ABpos; // Fail if either line segment is zero-length. - if (Ax == Bx && Ay == By || Cx == Dx && Cy == Dy) return false; + if ( (Ax == Bx && Ay == By) || (Cx == Dx && Cy == Dy) ) return false; // Fail if the segments share an end-point. - if (Ax == Cx && Ay == Cy || Bx == Cx && By == Cy - || Ax == Dx && Ay == Dy || Bx == Dx && By == Dy) { + if ( (Ax == Cx && Ay == Cy) || (Bx == Cx && By == Cy) + || (Ax == Dx && Ay == Dy) || (Bx == Dx && By == Dy) ) { return false; } @@ -137,7 +141,7 @@ bool lineSegmentIntersection( Dy = Dy * theCos - Dx * theSin; Dx = newX; // Fail if segment C-D doesn't cross line A-B. - if (Cy<0. && Dy<0. || Cy >= 0. && Dy >= 0.) return false; + if ( (Cy<0. && Dy<0.) || (Cy >= 0. && Dy >= 0.) ) return false; // (3) Discover the position of the intersection point along line A-B. ABpos = Dx + (Cx - Dx)*Dy / (Dy - Cy); @@ -437,13 +441,18 @@ void update(std::vector& polygons, const double dt) int main() { auto increase_polygon = false; - auto polygon_vertex_count = 3; + auto create_custom_polygon = false; + + auto polygon_vertex_count = 4; + auto scroll_vertex_count = 0; + auto custom_polygon = sf::VertexArray(sf::Lines); std::vector polygons; double xs = 0; double ys = 0; + constexpr auto MAX_VERTICES = 10; constexpr auto width = 1280; constexpr auto height = 800; @@ -499,33 +508,40 @@ int main() ys = sf::Mouse::getPosition().y - window.getPosition().y - 35; } break; - case sf::Event::MouseButtonPressed: + case sf::Event::MouseWheelScrolled: { - polygons.emplace_back(polygon::create_random( - Vector2(xs, ys), 4)); - - //polygons.emplace_back(polygon::create_circle(Vector2(xs, ys), 5)); - - auto& polygon = polygons.back(); + scroll_vertex_count++; + if(scroll_vertex_count >= 10) + { + scroll_vertex_count = 0; + polygon_vertex_count = ( (polygon_vertex_count - 2) % + (MAX_VERTICES - 3) ) + 3; + } + } break; - polygon.get_physical_object().rotate(M_PI / 2); + case sf::Event::MouseButtonPressed: + { + if(event.mouseButton.button == sf::Mouse::Left) + { - /*if(draw_circle) - polygons.emplace_back(polygon::create_circle(Vector2(xs, ys), 5)); - else - polygons.emplace_back(polygon::create_random(Vector2(xs, ys), - polygon_vertex_count)); + custom_polygon.append(sf::Vertex(sf::Vector2f(xs,ys), + sf::Color::Yellow)); + if(create_custom_polygon) + custom_polygon.append(sf::Vertex(sf::Vector2f(xs,ys), + sf::Color::Yellow)); + create_custom_polygon = true; - - const auto& shape = polygon.get_shape(); + } else if(event.mouseButton.button == sf::Mouse::Right) + { + polygons.emplace_back(polygon::create_random( + Vector2(xs, ys), polygon_vertex_count)); - std::uniform_int_distribution rnd(0, shape.getPointCount() - 1); - const auto random_point = polygon.get_shape().getPoint(rnd(rng)); + auto& polygon = polygons.back(); - polygons.back().get_physical_object().accelerate( - as_world_coordinates(random_point), { 0, 15.0f });*/ + polygon.get_physical_object().rotate(M_PI / 2); - increase_polygon = true; + increase_polygon = true; + } } break; @@ -537,8 +553,6 @@ int main() .get_physical_object() .set_type(object_type::dynamic); - std::cout << polygons.size() << std::endl; - } break; case sf::Event::KeyPressed: @@ -562,22 +576,24 @@ int main() polygon.toggle_debug_info(); } - /* - if (sf::Keyboard::isKeyPressed(sf::Keyboard::I)) - { - polygon_vertex_count = ((polygon_vertex_count + 1) % 7) + 3; - } - - if (sf::Keyboard::isKeyPressed(sf::Keyboard::D)) + if(sf::Keyboard::isKeyPressed(sf::Keyboard::Return)) { - polygon_vertex_count = ((polygon_vertex_count - 1) % 7) + 3; + if(create_custom_polygon) + { + create_custom_polygon = false; + polygons.emplace_back(polygon::create_custom + (custom_polygon)); + custom_polygon.clear(); + + polygons.at(polygons.size() - 1).get_physical_object + ().rotate(0); + + polygons.at(polygons.size() - 1) + .get_physical_object() + .set_type(object_type::dynamic); + } } - if (sf::Keyboard::isKeyPressed(sf::Keyboard::C)) - { - polygon_vertex_count = circle; - }*/ - } break; default: break; @@ -620,7 +636,7 @@ int main() measure("Draw", draw_time_smooth, [&] { - render(window, polygons); + render(window, polygons,custom_polygon); }); }; @@ -642,10 +658,11 @@ int main() measure("Draw", draw_time_smooth, [&] { - render(window, polygons); + render(window, polygons,custom_polygon); }); }; + while (window.isOpen()) { switch (game_loop_type) @@ -662,6 +679,9 @@ int main() default: break; } + + Console::instance().set_param("Vertex Count", polygon_vertex_count); + } diff --git a/Final/Polygon.cpp b/Final/Polygon.cpp index 39f16ec..cdbd012 100644 --- a/Final/Polygon.cpp +++ b/Final/Polygon.cpp @@ -256,3 +256,76 @@ polygon polygon::create_random(const Vector2 center, const size_t vertex_count) return p; } + +Vector2 calc_centroid(const std::vector vertices) +{ + + auto x = 0.0f; + auto y = 0.0f; + auto signedArea = 0.0f; + auto x0 = 0.0f; // Current vertex X + auto y0 = 0.0f; // Current vertex Y + auto x1 = 0.0f; // Next vertex X + auto y1 = 0.0f; // Next vertex Y + auto a = 0.0f; // Partial signed area + + // For all vertices except last + int i=0; + for (i=0; i temp_points(actual_vertex_count); + temp_points[0] = Vector2({custom_polygon[0].position.x, + custom_polygon[0].position.y}); + for (auto i = 1u, j = 1u; i < custom_polygon.getVertexCount(); i+=2) + { + + temp_points[j++] = Vector2({ custom_polygon[i].position.x, + custom_polygon[i].position.y}); + } + + auto center = calc_centroid(temp_points); + + std::vector points(actual_vertex_count); + + for (auto i = 0u; i < actual_vertex_count; ++i) + { + points[i] = (temp_points[i] - center); + } + + polygon p(center, points); + + p.set_color(sf::Color::Green); + + return p; +} diff --git a/Final/Polygon.h b/Final/Polygon.h index 5535686..3b8d5be 100644 --- a/Final/Polygon.h +++ b/Final/Polygon.h @@ -23,6 +23,7 @@ class polygon static polygon create_line(const Vector2 start, const Vector2 end); static polygon create_circle(const Vector2 center, const double radius); static polygon create_random(const Vector2 center, const size_t vertex_count); + static polygon create_custom(sf::VertexArray custom_polygon); void update(const double dt); void draw(sf::RenderWindow& window) const; From 41ca9c1de585d3177353b6c568f0092dd1d6a50c Mon Sep 17 00:00:00 2001 From: Ivan Waldboth Date: Tue, 30 Jan 2018 19:53:22 +0100 Subject: [PATCH 48/85] fixed some warnings and u can now draw polygons and scroll to change vertex count --- Final/Main.cpp | 1 - Final/Polygon.cpp | 10 +++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/Final/Main.cpp b/Final/Main.cpp index a0811c1..ec5af03 100644 --- a/Final/Main.cpp +++ b/Final/Main.cpp @@ -40,7 +40,6 @@ enum class game_loop void render(sf::RenderWindow& window, const std::vector& polygons, const sf::VertexArray custom_polygon) -void render(sf::RenderWindow& window, const std::vector& polygons) { window.clear({10, 10, 20}); diff --git a/Final/Polygon.cpp b/Final/Polygon.cpp index 72a35ef..58072a7 100644 --- a/Final/Polygon.cpp +++ b/Final/Polygon.cpp @@ -276,7 +276,7 @@ polygon polygon::create_random(const Vector2d center, const size_t vertex_count) return p; } -Vector2 calc_centroid(const std::vector vertices) +Vector2d calc_centroid(const std::vector vertices) { auto x = 0.0f; @@ -323,19 +323,19 @@ Vector2 calc_centroid(const std::vector vertices) polygon polygon::create_custom(sf::VertexArray custom_polygon) { unsigned actual_vertex_count = ((custom_polygon.getVertexCount()-1) / 2) + 1; - std::vector temp_points(actual_vertex_count); - temp_points[0] = Vector2({custom_polygon[0].position.x, + std::vector temp_points(actual_vertex_count); + temp_points[0] = Vector2d({custom_polygon[0].position.x, custom_polygon[0].position.y}); for (auto i = 1u, j = 1u; i < custom_polygon.getVertexCount(); i+=2) { - temp_points[j++] = Vector2({ custom_polygon[i].position.x, + temp_points[j++] = Vector2d({ custom_polygon[i].position.x, custom_polygon[i].position.y}); } auto center = calc_centroid(temp_points); - std::vector points(actual_vertex_count); + std::vector points(actual_vertex_count); for (auto i = 0u; i < actual_vertex_count; ++i) { From e59ab0f109c0e47a82dbceb3576d4156869573ae Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Tue, 30 Jan 2018 20:31:53 +0100 Subject: [PATCH 49/85] adjusted custom polygon scaling right click cancels creation added corner indicators --- Final/Main.cpp | 64 +++++++++++++++++++++++++++++++++++------------ Final/Polygon.cpp | 32 ++++++++++++++++++------ 2 files changed, 73 insertions(+), 23 deletions(-) diff --git a/Final/Main.cpp b/Final/Main.cpp index ec5af03..f43fc1c 100644 --- a/Final/Main.cpp +++ b/Final/Main.cpp @@ -29,6 +29,8 @@ #include "collision_detection.h" #include "collision_resolution.h" +const sf::Color clear_color({ 10, 10, 20 }); + enum class game_loop { fixed = 0, @@ -39,9 +41,9 @@ enum class game_loop /*----------------------------------------------------------------*/ void render(sf::RenderWindow& window, const std::vector& polygons, - const sf::VertexArray custom_polygon) + const sf::VertexArray& custom_polygon) { - window.clear({10, 10, 20}); + window.clear(clear_color); for (auto& polygon : polygons) { @@ -55,8 +57,23 @@ void render(sf::RenderWindow& window, const std::vector& polygons, console::instance().print(window); - if(custom_polygon.getVertexCount()!=0) + if(custom_polygon.getVertexCount() != 0) + { window.draw(custom_polygon); + + for(auto i = 0; i < custom_polygon.getVertexCount(); ++i) + { + sf::CircleShape corner(4); + corner.setOrigin(corner.getRadius(), corner.getRadius()); + corner.setPosition(custom_polygon[i].position); + corner.setFillColor(sf::Color::Transparent); + corner.setOutlineColor(sf::Color::Yellow); + corner.setOutlineThickness(2); + + window.draw(corner); + } + } + window.display(); } @@ -168,7 +185,6 @@ int main() { if(event.mouseButton.button == sf::Mouse::Left) { - custom_polygon.append(sf::Vertex(sf::Vector2f(xs,ys), sf::Color::Yellow)); if(create_custom_polygon) @@ -178,25 +194,37 @@ int main() } else if(event.mouseButton.button == sf::Mouse::Right) { - polygons.emplace_back(polygon::create_random( + if(create_custom_polygon) + { + // cancel + custom_polygon.clear(); + create_custom_polygon = false; + } + else + { + polygons.emplace_back(polygon::create_random( Vector2d(xs, ys), polygon_vertex_count)); - auto& polygon = polygons.back(); + auto& polygon = polygons.back(); - polygon.get_physical_object().rotate(M_PI / 2); + polygon.get_physical_object().rotate(M_PI / 2); - increase_polygon = true; + increase_polygon = true; + } } } break; case sf::Event::MouseButtonReleased: { - increase_polygon = false; + if(increase_polygon) + { + increase_polygon = false; - polygons.at(polygons.size() - 1) - .get_physical_object() - .set_type(object_type::dynamic); + polygons.at(polygons.size() - 1) + .get_physical_object() + .set_type(object_type::dynamic); + } } break; @@ -228,16 +256,20 @@ int main() if(create_custom_polygon) { create_custom_polygon = false; - polygons.emplace_back(polygon::create_custom - (custom_polygon)); + + polygons.emplace_back( + polygon::create_custom(custom_polygon)); + custom_polygon.clear(); - polygons.at(polygons.size() - 1).get_physical_object + polygons.back().get_physical_object ().rotate(0); - polygons.at(polygons.size() - 1) + polygons.back() .get_physical_object() .set_type(object_type::dynamic); + + polygons.back().enable_debug_info(debug); } } diff --git a/Final/Polygon.cpp b/Final/Polygon.cpp index 58072a7..b1de71b 100644 --- a/Final/Polygon.cpp +++ b/Final/Polygon.cpp @@ -322,18 +322,19 @@ Vector2d calc_centroid(const std::vector vertices) polygon polygon::create_custom(sf::VertexArray custom_polygon) { - unsigned actual_vertex_count = ((custom_polygon.getVertexCount()-1) / 2) + 1; + const unsigned actual_vertex_count = ((custom_polygon.getVertexCount() - 1) / 2) + 1; std::vector temp_points(actual_vertex_count); - temp_points[0] = Vector2d({custom_polygon[0].position.x, - custom_polygon[0].position.y}); - for (auto i = 1u, j = 1u; i < custom_polygon.getVertexCount(); i+=2) + temp_points[0] = Vector2d({ custom_polygon[0].position.x, + custom_polygon[0].position.y }); + + for (auto i = 1u, j = 1u; i < custom_polygon.getVertexCount(); i += 2) { temp_points[j++] = Vector2d({ custom_polygon[i].position.x, - custom_polygon[i].position.y}); + custom_polygon[i].position.y }); } - auto center = calc_centroid(temp_points); + const auto center = calc_centroid(temp_points); std::vector points(actual_vertex_count); @@ -342,9 +343,26 @@ polygon polygon::create_custom(sf::VertexArray custom_polygon) points[i] = (temp_points[i] - center); } + auto max = points[0]; + for (auto i = 0u; i < actual_vertex_count; ++i) + { + if (points[i].squaredNorm() < max.squaredNorm()) + continue; + + max = points[i]; + } + + const auto max_norm = max.norm() / 1.7; + for (auto i = 0u; i < actual_vertex_count; ++i) + { + points[i] /= max_norm; + } + + polygon p(center, points); - p.set_color(sf::Color::Green); + p.scale(max_norm); + p.set_color(sf::Color::Yellow); return p; } From a283e4bfe9b8f4e6e164d54fee4ce915b1f4ca8f Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Tue, 30 Jan 2018 20:41:28 +0100 Subject: [PATCH 50/85] tweaked custom polygon scaling --- Final/Polygon.cpp | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/Final/Polygon.cpp b/Final/Polygon.cpp index b1de71b..abe77e9 100644 --- a/Final/Polygon.cpp +++ b/Final/Polygon.cpp @@ -338,30 +338,34 @@ polygon polygon::create_custom(sf::VertexArray custom_polygon) std::vector points(actual_vertex_count); - for (auto i = 0u; i < actual_vertex_count; ++i) - { - points[i] = (temp_points[i] - center); - } + Vector2d min = temp_points[0] - center; + Vector2d max = temp_points[0] - center; - auto max = points[0]; for (auto i = 0u; i < actual_vertex_count; ++i) { - if (points[i].squaredNorm() < max.squaredNorm()) - continue; + points[i] = temp_points[i] - center; + + if (points[i].squaredNorm() < min.squaredNorm()) + { + min = points[i]; + } - max = points[i]; + if (points[i].squaredNorm() > min.squaredNorm()) + { + max = points[i]; + } } - const auto max_norm = max.norm() / 1.7; + const auto scale = (max.norm() + min.norm()) / 2.0; for (auto i = 0u; i < actual_vertex_count; ++i) { - points[i] /= max_norm; + points[i] /= scale; } polygon p(center, points); - p.scale(max_norm); + p.scale(scale); p.set_color(sf::Color::Yellow); return p; From 9c113caee2b4d5856349e1fd07663279b1f6f25a Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Tue, 30 Jan 2018 21:47:55 +0100 Subject: [PATCH 51/85] added scene resetting --- Final/Main.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Final/Main.cpp b/Final/Main.cpp index f43fc1c..3786016 100644 --- a/Final/Main.cpp +++ b/Final/Main.cpp @@ -143,6 +143,8 @@ int main() polygons.emplace_back(polygon::create_circle(Vector2d(900, 300), 60)); + const auto static_scene_size = polygons.size(); + using namespace std::chrono; using clock = high_resolution_clock; @@ -236,6 +238,12 @@ int main() window.close(); } + if (sf::Keyboard::isKeyPressed(sf::Keyboard::R)) + { + while (polygons.size() > static_scene_size) + polygons.pop_back(); + } + if (sf::Keyboard::isKeyPressed(sf::Keyboard::G)) { game_loop_type = static_cast(static_cast(game_loop_type) + 1); From f87d20e58b328b4db38c4145c98e116308b2b7f7 Mon Sep 17 00:00:00 2001 From: Ivan Waldboth Date: Wed, 31 Jan 2018 00:33:46 +0100 Subject: [PATCH 52/85] u can now move fixed objects --- Final/Main.cpp | 89 +++++++++++++++++++++++++++------------ Final/Polygon.cpp | 4 ++ Final/Polygon.h | 1 + Final/physical_object.cpp | 4 ++ Final/physical_object.h | 2 + 5 files changed, 72 insertions(+), 28 deletions(-) diff --git a/Final/Main.cpp b/Final/Main.cpp index 3786016..8a8159f 100644 --- a/Final/Main.cpp +++ b/Final/Main.cpp @@ -60,7 +60,7 @@ void render(sf::RenderWindow& window, const std::vector& polygons, if(custom_polygon.getVertexCount() != 0) { window.draw(custom_polygon); - + for(auto i = 0; i < custom_polygon.getVertexCount(); ++i) { sf::CircleShape corner(4); @@ -108,6 +108,7 @@ int main() { auto increase_polygon = false; auto create_custom_polygon = false; + polygon *selected = nullptr; auto polygon_vertex_count = 4; auto scroll_vertex_count = 0; @@ -170,48 +171,80 @@ int main() { xs = sf::Mouse::getPosition().x - window.getPosition().x - 10; ys = sf::Mouse::getPosition().y - window.getPosition().y - 35; + if(selected != nullptr) + selected->set_center(as_world_coordinates(Vector2d({xs, + ys}))); } break; case sf::Event::MouseWheelScrolled: { + scroll_vertex_count++; - if(scroll_vertex_count >= 10) + if(scroll_vertex_count >= 5) { scroll_vertex_count = 0; - polygon_vertex_count = ( (polygon_vertex_count - 2) % - (MAX_VERTICES - 3) ) + 3; + if(event.mouseWheelScroll.delta > 0) + polygon_vertex_count++; + else + polygon_vertex_count--; + if(polygon_vertex_count < 3) + polygon_vertex_count = MAX_VERTICES; + if(polygon_vertex_count > MAX_VERTICES) + polygon_vertex_count = 3; } } break; case sf::Event::MouseButtonPressed: { - if(event.mouseButton.button == sf::Mouse::Left) + for(auto &polygon : polygons) { - custom_polygon.append(sf::Vertex(sf::Vector2f(xs,ys), - sf::Color::Yellow)); - if(create_custom_polygon) - custom_polygon.append(sf::Vertex(sf::Vector2f(xs,ys), - sf::Color::Yellow)); - create_custom_polygon = true; - - } else if(event.mouseButton.button == sf::Mouse::Right) - { - if(create_custom_polygon) + if(polygon.get_physical_object().get_type() != + object_type::fixed) + continue; + //Check if touching a polygon + const auto polypos = as_screen_coordinates(polygon.get_physical_object() + .center_of_mass_global()); + const auto polypos2 = Vector2d(polypos.x,polypos.y); + + const auto distance_to_center = (polypos2 - Vector2d({xs, + ys}) + ).norm(); + + const auto radius = polygon.get_physical_object() + .get_scale() / 2; + if (distance_to_center < radius) { - // cancel - custom_polygon.clear(); - create_custom_polygon = false; + selected = &polygon; + break; } - else - { - polygons.emplace_back(polygon::create_random( - Vector2d(xs, ys), polygon_vertex_count)); - - auto& polygon = polygons.back(); + } - polygon.get_physical_object().rotate(M_PI / 2); + if(selected == nullptr) { + if (event.mouseButton.button == sf::Mouse::Left) { - increase_polygon = true; + custom_polygon.append(sf::Vertex(sf::Vector2f(xs, ys), + sf::Color::Yellow)); + if (create_custom_polygon) + custom_polygon.append( + sf::Vertex(sf::Vector2f(xs, ys), + sf::Color::Yellow)); + create_custom_polygon = true; + + } else if (event.mouseButton.button == sf::Mouse::Right) { + if (create_custom_polygon) { + // cancel + custom_polygon.clear(); + create_custom_polygon = false; + } else { + polygons.emplace_back(polygon::create_random( + Vector2d(xs, ys), polygon_vertex_count)); + + auto &polygon = polygons.back(); + + polygon.get_physical_object().rotate(M_PI / 2); + + increase_polygon = true; + } } } @@ -227,7 +260,7 @@ int main() .get_physical_object() .set_type(object_type::dynamic); } - + selected = nullptr; } break; case sf::Event::KeyPressed: @@ -267,7 +300,7 @@ int main() polygons.emplace_back( polygon::create_custom(custom_polygon)); - + custom_polygon.clear(); polygons.back().get_physical_object diff --git a/Final/Polygon.cpp b/Final/Polygon.cpp index abe77e9..170668b 100644 --- a/Final/Polygon.cpp +++ b/Final/Polygon.cpp @@ -194,6 +194,10 @@ void polygon::set_color(const sf::Color& color) update_color(color); } +void polygon::set_center(const Vector2d new_center) { + this->physical_object_.position(new_center); +} + std::ostream& operator<<(std::ostream& os, const polygon& p) { os << "Polygon:"; diff --git a/Final/Polygon.h b/Final/Polygon.h index d830f65..700f293 100644 --- a/Final/Polygon.h +++ b/Final/Polygon.h @@ -34,6 +34,7 @@ class polygon void scale(double dt); void update_color(const sf::Color& color); + void set_center(const Vector2d new_center); void add_contacts(const std::vector& contacts) { diff --git a/Final/physical_object.cpp b/Final/physical_object.cpp index c2ba170..edff599 100644 --- a/Final/physical_object.cpp +++ b/Final/physical_object.cpp @@ -94,3 +94,7 @@ void physical_object::update_points() inverse_inertia_ = 1.0 / inertia; } + +void physical_object::position(const Vector2d new_center) { + this->position_ = new_center; +} diff --git a/Final/physical_object.h b/Final/physical_object.h index 6d46eef..2adb3ce 100644 --- a/Final/physical_object.h +++ b/Final/physical_object.h @@ -83,6 +83,7 @@ class physical_object double inverse_inertia() const { return inverse_inertia_; } double bounding_radius() const { return radius_; } const std::vector& points() const { return points_; } + void position(const Vector2d new_center); double mass() const { @@ -123,6 +124,7 @@ class physical_object update_points(); } + private: double initial_mass_; double mass_; From ad9c17578aa8151830d39088e32d8068e73ad1d5 Mon Sep 17 00:00:00 2001 From: Ivan Waldboth Date: Wed, 31 Jan 2018 00:35:37 +0100 Subject: [PATCH 53/85] also added possibility to create fixed objects by pressing space instead of enter --- Final/Main.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/Final/Main.cpp b/Final/Main.cpp index 8a8159f..ba766a9 100644 --- a/Final/Main.cpp +++ b/Final/Main.cpp @@ -313,6 +313,27 @@ int main() polygons.back().enable_debug_info(debug); } } + if(sf::Keyboard::isKeyPressed(sf::Keyboard::Space)) + { + if(create_custom_polygon) + { + create_custom_polygon = false; + + polygons.emplace_back( + polygon::create_custom(custom_polygon)); + + custom_polygon.clear(); + + polygons.back().get_physical_object + ().rotate(0); + + polygons.back() + .get_physical_object() + .set_type(object_type::fixed); + + polygons.back().enable_debug_info(debug); + } + } } break; From c088cb8bf28bf52c08d592ec0260ccb4fda546da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20H=C3=B6lzl?= Date: Wed, 31 Jan 2018 01:18:56 +0100 Subject: [PATCH 54/85] fix vector pass by value --- Final/Main.cpp | 45 ++++++++++++++++++++++++------------ Final/Polygon.cpp | 6 ++--- Final/Polygon.h | 8 +++---- Final/collision_detection.h | 6 ++--- Final/collision_resolution.h | 11 ++++----- Final/physical_object.cpp | 15 +++++++----- Final/physical_object.h | 26 ++++++++++----------- 7 files changed, 66 insertions(+), 51 deletions(-) diff --git a/Final/Main.cpp b/Final/Main.cpp index 3786016..3b17091 100644 --- a/Final/Main.cpp +++ b/Final/Main.cpp @@ -84,7 +84,7 @@ void update(std::vector& polygons, const double dt) { return collision_detection(polygons); }); - + measure("Update: Collision Resolution", [&] { collision_resolution(contacts); @@ -114,8 +114,6 @@ int main() auto custom_polygon = sf::VertexArray(sf::Lines); - double xs = 0; - double ys = 0; console::instance().init(); constexpr auto MAX_VERTICES = 10; @@ -125,23 +123,40 @@ int main() sf::RenderWindow window(sf::VideoMode(width, height), "2D Collision detection"); std::vector polygons; + { + Vector2d position(400, 700); + Vector2d scale(710, 40); - polygons.emplace_back(polygon::create_rectangle(Vector2d(400, 700), Vector2d(710, 40))); - polygons.back().get_physical_object().rotate(-5 * M_PI / 180); - - polygons.emplace_back(polygon::create_rectangle(Vector2d(900, 650), Vector2d(700, 40))); - polygons.back().get_physical_object().rotate(30 * M_PI / 180); + polygons.emplace_back(polygon::create_rectangle(position, scale)); + polygons.back().get_physical_object().rotate(-5 * M_PI / 180); + polygons.back().scale(1); + } - polygons.emplace_back(polygon::create_rectangle(Vector2d(50, 400), Vector2d(700, 40))); - polygons.back().get_physical_object().rotate(-70 * M_PI / 180); + { + Vector2d position(900, 650); + Vector2d scale(700, 40); - polygons.emplace_back(polygon::create_random(Vector2d(600, 400), 6)); - polygons.back().scale(8); + polygons.emplace_back(polygon::create_rectangle(position, scale)); + polygons.back().get_physical_object().rotate(30 * M_PI / 180); + polygons.back().scale(1); + } - polygons.emplace_back(polygon::create_random(Vector2d(200, 420), 4)); - polygons.back().scale(5); + { + Vector2d position(600, 400); + polygons.emplace_back(polygon::create_random(position, 6)); + polygons.back().scale(8); + } + + { + Vector2d position(200, 420); + polygons.emplace_back(polygon::create_random(position, 6)); + polygons.back().scale(8); + } - polygons.emplace_back(polygon::create_circle(Vector2d(900, 300), 60)); + { + Vector2d position(900, 300); + polygons.emplace_back(polygon::create_circle(position, 60)); + } const auto static_scene_size = polygons.size(); diff --git a/Final/Polygon.cpp b/Final/Polygon.cpp index abe77e9..6100b2b 100644 --- a/Final/Polygon.cpp +++ b/Final/Polygon.cpp @@ -210,7 +210,7 @@ std::ostream& operator<<(std::ostream& os, const polygon& p) return os; } -polygon polygon::create_rectangle(const Vector2d pos, const Vector2d size) +polygon polygon::create_rectangle(const Vector2d& pos, const Vector2d& size) { const auto aspect = size.x() / size.y(); const auto half_height = 0.5; @@ -230,7 +230,7 @@ polygon polygon::create_rectangle(const Vector2d pos, const Vector2d size) return p; } -polygon polygon::create_circle(const Vector2d center, const double radius) +polygon polygon::create_circle(const Vector2d& center, const double radius) { constexpr auto vertex_count = 20; @@ -252,7 +252,7 @@ polygon polygon::create_circle(const Vector2d center, const double radius) return p; } -polygon polygon::create_random(const Vector2d center, const size_t vertex_count) +polygon polygon::create_random(const Vector2d& center, const size_t vertex_count) { const auto angle = 2 * M_PI / vertex_count; diff --git a/Final/Polygon.h b/Final/Polygon.h index d830f65..a27bc91 100644 --- a/Final/Polygon.h +++ b/Final/Polygon.h @@ -18,9 +18,9 @@ class polygon public: polygon(const Vector2d& center, std::vector points); - static polygon create_rectangle(const Vector2d pos, const Vector2d scale); - static polygon create_circle(const Vector2d center, const double radius); - static polygon create_random(const Vector2d center, const size_t vertex_count); + static polygon create_rectangle(const Vector2d& pos, const Vector2d& scale); + static polygon create_circle(const Vector2d& center, const double radius); + static polygon create_random(const Vector2d& center, const size_t vertex_count); static polygon create_custom(sf::VertexArray custom_polygon); void update(const double dt); @@ -72,7 +72,7 @@ class polygon void set_color(const sf::Color& color); }; -inline sf::Vector2f as_screen_coordinates(Vector2d v) +inline sf::Vector2f as_screen_coordinates(const Vector2d& v) { return { diff --git a/Final/collision_detection.h b/Final/collision_detection.h index 4d670ef..43bdec9 100644 --- a/Final/collision_detection.h +++ b/Final/collision_detection.h @@ -56,10 +56,10 @@ inline bool lineSegmentIntersection( return true; } -inline bool inside(const Vector2d point, - const Vector2d point_offset, +inline bool inside(const Vector2d& point, + const Vector2d& point_offset, const std::vector& lines, - const Vector2d line_offset) + const Vector2d& line_offset) { auto intersections = 0; diff --git a/Final/collision_resolution.h b/Final/collision_resolution.h index f0cb032..d849caa 100644 --- a/Final/collision_resolution.h +++ b/Final/collision_resolution.h @@ -22,13 +22,10 @@ inline void collision_resolution(const std::vector& contacts) const auto b_point_offset = std::get<0>(contact.point); const auto b_point_velocity = std::get<1>(contact.point); - const Vector2d a_point_offset = - (std::get<0>(std::get<0>(contact.line)) + - std::get<0>(std::get<1>(contact.line))) / 2.0; - - const Vector2d a_point_velocity = - (std::get<1>(std::get<0>(contact.line)) + - std::get<1>(std::get<1>(contact.line))) / 2.0; + auto tmp = std::get<0>(contact.line); + auto tmp2 = std::get<1>(contact.line); + const Vector2d a_point_offset = (std::get<0>(tmp) + std::get<0>(tmp2)) / 2.0; + const Vector2d a_point_velocity = (std::get<1>(tmp) + std::get<1>(tmp2)) / 2.0; const Vector2d rv = b_point_velocity - a_point_velocity; const auto relative_velocity = rv.dot(n); diff --git a/Final/physical_object.cpp b/Final/physical_object.cpp index c2ba170..6ec0302 100644 --- a/Final/physical_object.cpp +++ b/Final/physical_object.cpp @@ -1,7 +1,7 @@ #include "physical_object.h" #include -physical_object::physical_object(const Vector2d position, +physical_object::physical_object(const Vector2d& position, const std::vector>& points) : scale_(1), radius_(0), position_(position), rotation_(0), velocity_(0, 0), force_(0, 0), torque_(0), angular_velocity_(0), points_(points.size()) @@ -16,8 +16,9 @@ physical_object::physical_object(const Vector2d position, mass_ = initial_mass_; // initial position of center of mass - center_of_mass_ = std::accumulate(points.begin(), points.end(), Vector2d(0, 0), - [](auto current_sum, auto p) + auto tmp = Vector2d(0, 0); + center_of_mass_ = std::accumulate(points.begin(), points.end(), tmp, + [](const auto& current_sum, auto p) { return current_sum + std::get<0>(p) * std::get<1>(p); }) / mass_; @@ -56,7 +57,7 @@ void physical_object::update(const double dt) torque_ = 0.0; } -void physical_object::accelerate(const Vector2d point, const Vector2d acceleration) +void physical_object::accelerate(const Vector2d& point, const Vector2d& acceleration) { accelerate(acceleration); @@ -66,7 +67,7 @@ void physical_object::accelerate(const Vector2d point, const Vector2d accelerati torque_ += cross2(offset, force); } -void physical_object::accelerate(const Vector2d acceleration) +void physical_object::accelerate(const Vector2d& acceleration) { force_ += acceleration * mass_; } @@ -77,7 +78,9 @@ void physical_object::update_points() for (auto i = 0u; i < points_.size(); ++i) { // transform offset - const auto offset = rotation_.toRotationMatrix() * initial_offsets_[i] * scale_; + auto rot = rotation_.toRotationMatrix(); + const auto offset = rot * initial_offsets_[i] * scale_; + printf("%f/n", scale_); points_[i] = { diff --git a/Final/physical_object.h b/Final/physical_object.h index 6d46eef..768d5a9 100644 --- a/Final/physical_object.h +++ b/Final/physical_object.h @@ -18,7 +18,7 @@ using point_t = std::tuple; EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(Vector2d) EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(point_t) -inline Vector2d normal(const Vector2d a, const Vector2d b) +inline Vector2d normal(const Vector2d& a, const Vector2d& b) { const auto dir = ((a + b) / 2.0).normalized(); @@ -33,17 +33,17 @@ inline Vector2d normal(const Vector2d a, const Vector2d b) } -inline double cross2(const Vector2d a, const Vector2d b) +inline double cross2(const Vector2d& a, const Vector2d& b) { return a.x() * b.y() - b.x() * a.y(); } -inline Vector2d cross2(const Vector2d v, const double s) +inline Vector2d cross2(const Vector2d& v, const double s) { return { s * v.y(), -s * v.x() }; } -inline Vector2d cross2(const double s, const Vector2d v) +inline Vector2d cross2(const double s, const Vector2d& v) { return { -s * v.y(), s * v.x() }; } @@ -61,25 +61,25 @@ class physical_object { public: explicit physical_object( - const Vector2d position, + const Vector2d& position, const std::vector>& points); void update(const double dt); - void accelerate(Vector2d point, Vector2d acceleration); - void accelerate(Vector2d acceleration); + void accelerate(const Vector2d& point, const Vector2d& acceleration); + void accelerate(const Vector2d& acceleration); - void apply_impulse(const Vector2d impulse, const Vector2d offset) + void apply_impulse(const Vector2d& impulse, const Vector2d& offset) { velocity_ += inverse_mass() * impulse; angular_velocity_ += inverse_inertia_ * cross2(offset, impulse); } - Vector2d position() const { return position_; } - Rotation2D rotation() const { return rotation_; } - Vector2d linear_velocity() const { return velocity_; } - Vector2d center_of_mass_local() const { return center_of_mass_; } - Vector2d center_of_mass_global() const { return position_ + center_of_mass_; } + const Vector2d& position() const { return position_; } + const Rotation2D& rotation() const { return rotation_; } + const Vector2d& linear_velocity() const { return velocity_; } + const Vector2d& center_of_mass_local() const { return center_of_mass_; } + const Vector2d& center_of_mass_global() const { return position_ + center_of_mass_; } double inverse_inertia() const { return inverse_inertia_; } double bounding_radius() const { return radius_; } const std::vector& points() const { return points_; } From 7125248ca04abc6cee605758cfa2e2dbb7c24be1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20H=C3=B6lzl?= Date: Wed, 31 Jan 2018 01:19:16 +0100 Subject: [PATCH 55/85] remove printf --- Final/physical_object.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/Final/physical_object.cpp b/Final/physical_object.cpp index 6ec0302..7ac19e4 100644 --- a/Final/physical_object.cpp +++ b/Final/physical_object.cpp @@ -80,7 +80,6 @@ void physical_object::update_points() // transform offset auto rot = rotation_.toRotationMatrix(); const auto offset = rot * initial_offsets_[i] * scale_; - printf("%f/n", scale_); points_[i] = { From ef01e439c494e13c3d3dc8498574f2baa3965616 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20H=C3=B6lzl?= Date: Wed, 31 Jan 2018 01:22:08 +0100 Subject: [PATCH 56/85] fix pass by value; release working now --- Final/Polygon.cpp | 2 +- Final/Polygon.h | 2 +- Final/physical_object.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Final/Polygon.cpp b/Final/Polygon.cpp index 48fb3f4..ca033f9 100644 --- a/Final/Polygon.cpp +++ b/Final/Polygon.cpp @@ -194,7 +194,7 @@ void polygon::set_color(const sf::Color& color) update_color(color); } -void polygon::set_center(const Vector2d new_center) { +void polygon::set_center(const Vector2d& new_center) { this->physical_object_.position(new_center); } diff --git a/Final/Polygon.h b/Final/Polygon.h index ade6c7d..186325e 100644 --- a/Final/Polygon.h +++ b/Final/Polygon.h @@ -34,7 +34,7 @@ class polygon void scale(double dt); void update_color(const sf::Color& color); - void set_center(const Vector2d new_center); + void set_center(const Vector2d& new_center); void add_contacts(const std::vector& contacts) { diff --git a/Final/physical_object.cpp b/Final/physical_object.cpp index 0f501ee..abe35ea 100644 --- a/Final/physical_object.cpp +++ b/Final/physical_object.cpp @@ -97,6 +97,6 @@ void physical_object::update_points() inverse_inertia_ = 1.0 / inertia; } -void physical_object::position(const Vector2d new_center) { +void physical_object::position(const Vector2d& new_center) { this->position_ = new_center; } From 05b6b73ac198e40af8e757fc9d74d7a790e6850e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20H=C3=B6lzl?= Date: Wed, 31 Jan 2018 01:27:31 +0100 Subject: [PATCH 57/85] fix missing pass by value --- Final/physical_object.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Final/physical_object.h b/Final/physical_object.h index 24cbcfa..32d2a7b 100644 --- a/Final/physical_object.h +++ b/Final/physical_object.h @@ -83,7 +83,7 @@ class physical_object double inverse_inertia() const { return inverse_inertia_; } double bounding_radius() const { return radius_; } const std::vector& points() const { return points_; } - void position(const Vector2d new_center); + void position(const Vector2d& new_center); double mass() const { From 0de632272d59f5041ddf943a8ae1ea33366631a9 Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Wed, 31 Jan 2018 11:05:55 +0100 Subject: [PATCH 58/85] fixed global center of mass accessor fixed debug info --- Final/Main.cpp | 1 + Final/physical_object.h | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Final/Main.cpp b/Final/Main.cpp index 06facf3..4981caa 100644 --- a/Final/Main.cpp +++ b/Final/Main.cpp @@ -256,6 +256,7 @@ int main() auto &polygon = polygons.back(); + polygon.enable_debug_info(debug); polygon.get_physical_object().rotate(M_PI / 2); increase_polygon = true; diff --git a/Final/physical_object.h b/Final/physical_object.h index 32d2a7b..da2ef32 100644 --- a/Final/physical_object.h +++ b/Final/physical_object.h @@ -32,7 +32,6 @@ inline Vector2d normal(const Vector2d& a, const Vector2d& b) : normal; } - inline double cross2(const Vector2d& a, const Vector2d& b) { return a.x() * b.y() - b.x() * a.y(); @@ -79,7 +78,7 @@ class physical_object const Rotation2D& rotation() const { return rotation_; } const Vector2d& linear_velocity() const { return velocity_; } const Vector2d& center_of_mass_local() const { return center_of_mass_; } - const Vector2d& center_of_mass_global() const { return position_ + center_of_mass_; } + Vector2d center_of_mass_global() const { return position_ + center_of_mass_; } double inverse_inertia() const { return inverse_inertia_; } double bounding_radius() const { return radius_; } const std::vector& points() const { return points_; } From 6d28478980e796d77cfe601a0b560080bda0598f Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Wed, 31 Jan 2018 16:13:51 +0100 Subject: [PATCH 59/85] improve collision resolution stability --- Final/Main.cpp | 4 +--- Final/collision_resolution.h | 6 +++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/Final/Main.cpp b/Final/Main.cpp index 4981caa..de3bec6 100644 --- a/Final/Main.cpp +++ b/Final/Main.cpp @@ -16,8 +16,6 @@ /* Standard includes */ #include #include -#include -#include #include #include @@ -87,7 +85,7 @@ void update(std::vector& polygons, const double dt) measure("Update: Collision Resolution", [&] { - collision_resolution(contacts); + collision_resolution(contacts, dt); }); measure("Update: Integration", [&] diff --git a/Final/collision_resolution.h b/Final/collision_resolution.h index d849caa..7edd8a2 100644 --- a/Final/collision_resolution.h +++ b/Final/collision_resolution.h @@ -1,6 +1,6 @@ #include "ContactInfo.hpp" -inline void collision_resolution(const std::vector& contacts) +inline void collision_resolution(const std::vector& contacts, const double dt) { for (const auto& contact : contacts) { @@ -33,7 +33,7 @@ inline void collision_resolution(const std::vector& contacts) if (relative_velocity > 0) continue; - const auto e = rv.squaredNorm() < (gravity * 0.016).squaredNorm() + 0.01 + const auto e = rv.squaredNorm() < (gravity * dt).squaredNorm() + 0.01 ? 0 : 0.3; @@ -81,7 +81,7 @@ inline void correct_positions(const std::vector& contacts) auto& a = contact.line_owner; auto& b = contact.point_owner; - const auto percent = 0.2; // usually 20% to 80% + const auto percent = 0.6; // usually 20% to 80% const auto slop = 0.05; // usually 0.01 to 0.1 const Vector2d correction = std::max(contact.penetration_depth - slop, 0.0) From f6e3997e851eafea0908f49239d1fe627dd0f8ea Mon Sep 17 00:00:00 2001 From: Ivan Waldboth Date: Wed, 31 Jan 2018 17:24:07 +0100 Subject: [PATCH 60/85] circles if u scroll up to 10 vertices & center points for moving objects --- Final/CMakeLists.txt | 1 + Final/Main.cpp | 14 +++++++++++--- Final/Polygon.cpp | 8 +++++++- Final/collision_detection.h | 2 +- Final/physical_object.h | 2 +- 5 files changed, 21 insertions(+), 6 deletions(-) diff --git a/Final/CMakeLists.txt b/Final/CMakeLists.txt index 045a3e1..da9611f 100644 --- a/Final/CMakeLists.txt +++ b/Final/CMakeLists.txt @@ -28,3 +28,4 @@ target_link_libraries(FinalProject ${SFML_LIBRARIES} ${SFML_DEPENDENCIES}) find_package(Eigen3 REQUIRED) include_directories(${EIGEN3_INCLUDE_DIR}) +target_link_libraries(FinalProject ${EIGEN3_LIBRARIES} ${EIGEN3_DEPENDENCIES}) diff --git a/Final/Main.cpp b/Final/Main.cpp index de3bec6..7ba0f0d 100644 --- a/Final/Main.cpp +++ b/Final/Main.cpp @@ -249,7 +249,13 @@ int main() custom_polygon.clear(); create_custom_polygon = false; } else { - polygons.emplace_back(polygon::create_random( + if(polygon_vertex_count == MAX_VERTICES) + polygons.emplace_back(polygon::create_circle + (Vector2d(xs, + ys), + 10)); + else + polygons.emplace_back(polygon::create_random( Vector2d(xs, ys), polygon_vertex_count)); auto &polygon = polygons.back(); @@ -431,8 +437,10 @@ int main() default: break; } - - console::instance().set_param("Vertex Count", polygon_vertex_count); + if(polygon_vertex_count == MAX_VERTICES) + console::instance().set_param("Vertex Count", "Circle"); + else + console::instance().set_param("Vertex Count", polygon_vertex_count); } diff --git a/Final/Polygon.cpp b/Final/Polygon.cpp index ca033f9..53652cc 100644 --- a/Final/Polygon.cpp +++ b/Final/Polygon.cpp @@ -125,6 +125,12 @@ void polygon::draw_debug(sf::RenderWindow& window) const void polygon::draw(sf::RenderWindow& window) const { window.draw(shape_); + const auto center = as_screen_coordinates(get_physical_object() + .center_of_mass_global()); + sf::CircleShape circle(3); + circle.setFillColor(shape_.getOutlineColor()); + circle.setPosition(center.x,center.y); + window.draw(circle); } void polygon::scale(const double factor) @@ -236,7 +242,7 @@ polygon polygon::create_rectangle(const Vector2d& pos, const Vector2d& size) polygon polygon::create_circle(const Vector2d& center, const double radius) { - constexpr auto vertex_count = 20; + constexpr auto vertex_count = 50; const auto angle = 360.0 / vertex_count; diff --git a/Final/collision_detection.h b/Final/collision_detection.h index 43bdec9..fdb4b86 100644 --- a/Final/collision_detection.h +++ b/Final/collision_detection.h @@ -91,7 +91,7 @@ inline void find_intersections(physical_object& object_a, physical_object& objec { const auto get_lines = [](const physical_object& object) { - std::vector lines; + std::vector lines = std::vector(); const auto& points = object.points(); diff --git a/Final/physical_object.h b/Final/physical_object.h index da2ef32..ffa088f 100644 --- a/Final/physical_object.h +++ b/Final/physical_object.h @@ -20,7 +20,7 @@ EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(point_t) inline Vector2d normal(const Vector2d& a, const Vector2d& b) { - const auto dir = ((a + b) / 2.0).normalized(); + const auto dir = ((a + b) / 2.00).normalized(); const auto normal = Vector2d( -(b - a).y(), From 8d760949dd509f0228ab3ab3b62d4aaec7eeae73 Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Wed, 31 Jan 2018 17:28:36 +0100 Subject: [PATCH 61/85] fixed normals used by position correction --- Final/collision_resolution.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Final/collision_resolution.h b/Final/collision_resolution.h index 7edd8a2..4f9f8c2 100644 --- a/Final/collision_resolution.h +++ b/Final/collision_resolution.h @@ -76,7 +76,7 @@ inline void correct_positions(const std::vector& contacts) { const auto line_start = std::get<0>(std::get<0>(contact.line)); const auto line_end = std::get<0>(std::get<1>(contact.line)); - const auto normal = ((line_end + line_start) / 2.0).normalized(); + const auto n = normal(line_start, line_end); auto& a = contact.line_owner; auto& b = contact.point_owner; @@ -85,7 +85,7 @@ inline void correct_positions(const std::vector& contacts) const auto slop = 0.05; // usually 0.01 to 0.1 const Vector2d correction = std::max(contact.penetration_depth - slop, 0.0) - / (a.inverse_mass() + b.inverse_mass()) * percent * normal; + / (a.inverse_mass() + b.inverse_mass()) * percent * n; a.move(-a.inverse_mass() * correction); b.move(b.inverse_mass() * correction); From 0644a15e3a59baacbaab4d789b087d27327c342b Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Wed, 31 Jan 2018 17:30:52 +0100 Subject: [PATCH 62/85] disable eigen3 alignment for debugging --- Final/physical_object.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Final/physical_object.h b/Final/physical_object.h index da2ef32..027194c 100644 --- a/Final/physical_object.h +++ b/Final/physical_object.h @@ -1,6 +1,9 @@ #ifndef PHYSICAL_OBJECT_H #define PHYSICAL_OBJECT_H +#define EIGEN_DONT_ALIGN_STATICALLY +#define EIGEN_DONT_VECTORIZE + #include #include #include @@ -107,6 +110,7 @@ class physical_object // and bounding radius update_points(); } + double get_scale() const { return scale_; } void set_type(const object_type type) { type_ = type; } From b2cfe7c78bde8a6a6aea68462194b744e37e7b7a Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Wed, 31 Jan 2018 18:07:57 +0100 Subject: [PATCH 63/85] added contact scaling to position correction --- Final/collision_resolution.h | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/Final/collision_resolution.h b/Final/collision_resolution.h index 4f9f8c2..5982535 100644 --- a/Final/collision_resolution.h +++ b/Final/collision_resolution.h @@ -84,10 +84,17 @@ inline void correct_positions(const std::vector& contacts) const auto percent = 0.6; // usually 20% to 80% const auto slop = 0.05; // usually 0.01 to 0.1 + const auto contact_points = std::count_if(contacts.begin(), contacts.end(), + [&b, &a](const contact_info& c) + { + return &c.point_owner == &b && &c.line_owner == &a || + &c.point_owner == &a && &c.line_owner == &b; + }); + const Vector2d correction = std::max(contact.penetration_depth - slop, 0.0) - / (a.inverse_mass() + b.inverse_mass()) * percent * n; + / (a.inverse_mass() + b.inverse_mass()) * percent * n ; - a.move(-a.inverse_mass() * correction); - b.move(b.inverse_mass() * correction); + a.move(-a.inverse_mass() * correction / contact_points); + b.move(b.inverse_mass() * correction / contact_points); } } From f690c5d13891c7499258d202992e2447773f25f8 Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Wed, 31 Jan 2018 18:30:29 +0100 Subject: [PATCH 64/85] removed cof indicator in normal mode --- Final/Polygon.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/Final/Polygon.cpp b/Final/Polygon.cpp index 53652cc..54b70f3 100644 --- a/Final/Polygon.cpp +++ b/Final/Polygon.cpp @@ -125,12 +125,6 @@ void polygon::draw_debug(sf::RenderWindow& window) const void polygon::draw(sf::RenderWindow& window) const { window.draw(shape_); - const auto center = as_screen_coordinates(get_physical_object() - .center_of_mass_global()); - sf::CircleShape circle(3); - circle.setFillColor(shape_.getOutlineColor()); - circle.setPosition(center.x,center.y); - window.draw(circle); } void polygon::scale(const double factor) From 5b5f953a7de1faed190d5a8085d3bf35e88c9fba Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Wed, 31 Jan 2018 18:31:43 +0100 Subject: [PATCH 65/85] fixed bug in custom polygon --- Final/Main.cpp | 42 +++++++++++++++++++++++++----------------- Final/Polygon.cpp | 10 ++++------ 2 files changed, 29 insertions(+), 23 deletions(-) diff --git a/Final/Main.cpp b/Final/Main.cpp index 7ba0f0d..e9d58ae 100644 --- a/Final/Main.cpp +++ b/Final/Main.cpp @@ -111,7 +111,7 @@ int main() auto polygon_vertex_count = 4; auto scroll_vertex_count = 0; - auto custom_polygon = sf::VertexArray(sf::Lines); + auto custom_polygon = sf::VertexArray(sf::LineStrip); console::instance().init(); @@ -232,31 +232,36 @@ int main() } } - if(selected == nullptr) { - if (event.mouseButton.button == sf::Mouse::Left) { + if(selected == nullptr) + { + if (event.mouseButton.button == sf::Mouse::Left) + { + custom_polygon.append(sf::Vertex(sf::Vector2f(xs, ys), + sf::Color::Yellow)); - custom_polygon.append(sf::Vertex(sf::Vector2f(xs, ys), - sf::Color::Yellow)); - if (create_custom_polygon) - custom_polygon.append( - sf::Vertex(sf::Vector2f(xs, ys), - sf::Color::Yellow)); create_custom_polygon = true; - } else if (event.mouseButton.button == sf::Mouse::Right) { - if (create_custom_polygon) { + } + else if (event.mouseButton.button == sf::Mouse::Right) + { + if (create_custom_polygon) + { // cancel custom_polygon.clear(); create_custom_polygon = false; - } else { + } + else + { if(polygon_vertex_count == MAX_VERTICES) + { polygons.emplace_back(polygon::create_circle - (Vector2d(xs, - ys), - 10)); + (Vector2d(xs, ys), 10)); + } else + { polygons.emplace_back(polygon::create_random( Vector2d(xs, ys), polygon_vertex_count)); + } auto &polygon = polygons.back(); @@ -280,7 +285,9 @@ int main() .get_physical_object() .set_type(object_type::dynamic); } + selected = nullptr; + } break; case sf::Event::KeyPressed: @@ -314,7 +321,7 @@ int main() if(sf::Keyboard::isKeyPressed(sf::Keyboard::Return)) { - if(create_custom_polygon) + if(create_custom_polygon && custom_polygon.getVertexCount() > 2) { create_custom_polygon = false; @@ -333,9 +340,10 @@ int main() polygons.back().enable_debug_info(debug); } } + if(sf::Keyboard::isKeyPressed(sf::Keyboard::Space)) { - if(create_custom_polygon) + if(create_custom_polygon && custom_polygon.getVertexCount() > 2) { create_custom_polygon = false; diff --git a/Final/Polygon.cpp b/Final/Polygon.cpp index 54b70f3..a7e01a2 100644 --- a/Final/Polygon.cpp +++ b/Final/Polygon.cpp @@ -326,15 +326,13 @@ Vector2d calc_centroid(const std::vector vertices) polygon polygon::create_custom(sf::VertexArray custom_polygon) { - const unsigned actual_vertex_count = ((custom_polygon.getVertexCount() - 1) / 2) + 1; + const auto actual_vertex_count = custom_polygon.getVertexCount(); + std::vector temp_points(actual_vertex_count); - temp_points[0] = Vector2d({ custom_polygon[0].position.x, - custom_polygon[0].position.y }); - for (auto i = 1u, j = 1u; i < custom_polygon.getVertexCount(); i += 2) + for (auto i = 0u; i < custom_polygon.getVertexCount(); ++i) { - - temp_points[j++] = Vector2d({ custom_polygon[i].position.x, + temp_points[i] = Vector2d({ custom_polygon[i].position.x, custom_polygon[i].position.y }); } From 1319508c43411a18b4372a19a1a3175ba16824b2 Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Wed, 31 Jan 2018 18:45:29 +0100 Subject: [PATCH 66/85] fixed duplicate application of contact scaling tweaked position correction added sanity check --- Final/collision_resolution.h | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/Final/collision_resolution.h b/Final/collision_resolution.h index 5982535..170abd8 100644 --- a/Final/collision_resolution.h +++ b/Final/collision_resolution.h @@ -1,3 +1,6 @@ +#ifndef COLLISION_RESOLUTION_H +#define COLLISION_RESOLUTION_H + #include "ContactInfo.hpp" inline void collision_resolution(const std::vector& contacts, const double dt) @@ -19,11 +22,13 @@ inline void collision_resolution(const std::vector& contacts, cons &c.point_owner == &a && &c.line_owner == &b; }); + assert(contact_points > 0); + const auto b_point_offset = std::get<0>(contact.point); const auto b_point_velocity = std::get<1>(contact.point); - auto tmp = std::get<0>(contact.line); - auto tmp2 = std::get<1>(contact.line); + auto tmp = std::get<0>(contact.line); + auto tmp2 = std::get<1>(contact.line); const Vector2d a_point_offset = (std::get<0>(tmp) + std::get<0>(tmp2)) / 2.0; const Vector2d a_point_velocity = (std::get<1>(tmp) + std::get<1>(tmp2)) / 2.0; @@ -42,9 +47,13 @@ inline void collision_resolution(const std::vector& contacts, cons const auto t_a = a.inverse_mass() + a.inverse_inertia() * ra_n * ra_n; const auto t_b = b.inverse_mass() + b.inverse_inertia() * rb_n * rb_n; - const auto denom = t_a + t_b; + const auto denom = (t_a + t_b) * contact_points; + + assert(std::abs(denom) > 0); + + const auto j = -(1 + e) * relative_velocity / denom; - const auto j = -(1 + e) * relative_velocity / denom / contact_points; + assert(j != std::numeric_limits::infinity()); const auto normal_impulse = j * n; @@ -54,7 +63,7 @@ inline void collision_resolution(const std::vector& contacts, cons // friction const auto tangent = (rv - n * rv.dot(n)).normalized(); - const auto jt = -rv.dot(tangent) / denom / contact_points; + const auto jt = -rv.dot(tangent) / denom; if (std::abs(jt) < 0.000001) continue; @@ -81,8 +90,8 @@ inline void correct_positions(const std::vector& contacts) auto& a = contact.line_owner; auto& b = contact.point_owner; - const auto percent = 0.6; // usually 20% to 80% - const auto slop = 0.05; // usually 0.01 to 0.1 + const auto percent = 0.5; // usually 20% to 80% + const auto slop = 0.01; // usually 0.01 to 0.1 const auto contact_points = std::count_if(contacts.begin(), contacts.end(), [&b, &a](const contact_info& c) @@ -98,3 +107,4 @@ inline void correct_positions(const std::vector& contacts) b.move(b.inverse_mass() * correction / contact_points); } } +#endif // COLLISION_RESOLUTION_H From f4982fb9b893ef514d2ef31c48632cd502aeea09 Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Wed, 31 Jan 2018 21:17:58 +0100 Subject: [PATCH 67/85] refactored collision resolution --- Final/collision_resolution.h | 144 ++++++++++++++++++++++++----------- 1 file changed, 100 insertions(+), 44 deletions(-) diff --git a/Final/collision_resolution.h b/Final/collision_resolution.h index 170abd8..09d67df 100644 --- a/Final/collision_resolution.h +++ b/Final/collision_resolution.h @@ -3,12 +3,89 @@ #include "ContactInfo.hpp" +inline void apply_friction( + physical_object& a, + physical_object& b, + const Vector2d& offset_a, + const Vector2d& offset_b, + const Vector2d& normal, + const Vector2d& rel_v, + const double rel_v_n, + const double j, + const int num_contacts) +{ + const auto tangent = (rel_v - normal * rel_v_n) + .normalized(); + + const auto ra_n = cross2(offset_a, tangent); + const auto rb_n = cross2(offset_b, tangent); + + const auto t_a = a.inverse_mass() + a.inverse_inertia() * ra_n * ra_n; + const auto t_b = b.inverse_mass() + b.inverse_inertia() * rb_n * rb_n; + const auto denom = (t_a + t_b) * num_contacts; + + assert(std::abs(denom) > 0); + + const auto jt = -rel_v.dot(tangent) / denom; + + if (std::abs(jt) < 0.000001) return; + + const auto static_friction = 0.61; + const auto dynamic_friction = 0.47; + + const auto tangent_impulse = std::abs(jt) < j * static_friction + ? (tangent * jt).eval() + : (tangent * -j * dynamic_friction).eval(); + + a.apply_impulse(-tangent_impulse, offset_a); + b.apply_impulse(tangent_impulse, offset_b); +} + +inline double calc_impulse_norm( + const physical_object& a, + const physical_object& b, + const Vector2d& offset_a, + const Vector2d& offset_b, + const Vector2d& normal, + const double rel_v_n, + const double restitution, + const int num_contacts) +{ + const auto ra_n = cross2(offset_a, normal); + const auto rb_n = cross2(offset_b, normal); + + const auto t_a = a.inverse_mass() + a.inverse_inertia() * ra_n * ra_n; + const auto t_b = b.inverse_mass() + b.inverse_inertia() * rb_n * rb_n; + const auto denom = (t_a + t_b) * num_contacts; + + assert(std::abs(denom) > 0); + + return -(1 + restitution) * rel_v_n / denom; +} + +inline void apply_impulse( + physical_object& a, + physical_object& b, + const Vector2d& offset_a, + const Vector2d& offset_b, + const Vector2d n, + const double j) +{ + const auto normal_impulse = j * n; + + a.apply_impulse(-normal_impulse, offset_a); + b.apply_impulse( normal_impulse, offset_b); +} + inline void collision_resolution(const std::vector& contacts, const double dt) { for (const auto& contact : contacts) { - const auto line_start = std::get<0>(std::get<0>(contact.line)); - const auto line_end = std::get<0>(std::get<1>(contact.line)); + const auto& line_start_point = std::get<0>(contact.line); + const auto& line_end_point = std::get<1>(contact.line); + + const auto& line_start = std::get<0>(line_start_point); + const auto& line_end = std::get<0>(line_end_point); const auto n = normal(line_start, line_end); @@ -24,58 +101,37 @@ inline void collision_resolution(const std::vector& contacts, cons assert(contact_points > 0); - const auto b_point_offset = std::get<0>(contact.point); - const auto b_point_velocity = std::get<1>(contact.point); + const auto offset_b = std::get<0>(contact.point); + const auto velocity_b = std::get<1>(contact.point); - auto tmp = std::get<0>(contact.line); - auto tmp2 = std::get<1>(contact.line); - const Vector2d a_point_offset = (std::get<0>(tmp) + std::get<0>(tmp2)) / 2.0; - const Vector2d a_point_velocity = (std::get<1>(tmp) + std::get<1>(tmp2)) / 2.0; + const Vector2d offset_a = (line_start + line_end) / 2.0; + const Vector2d velocity_a = + (std::get<1>(line_start_point) + + std::get<1>(line_end_point)) / 2.0; - const Vector2d rv = b_point_velocity - a_point_velocity; - const auto relative_velocity = rv.dot(n); + const Vector2d rel_v = velocity_b - velocity_a; + const auto rel_v_n = rel_v.dot(n); - if (relative_velocity > 0) + if (rel_v_n > 0) continue; - const auto e = rv.squaredNorm() < (gravity * dt).squaredNorm() + 0.01 + // if relative velocity + const auto e = rel_v.squaredNorm() < (gravity * dt).squaredNorm() + 0.01 ? 0 : 0.3; - const auto ra_n = cross2(a_point_offset, n); - const auto rb_n = cross2(b_point_offset, n); - - const auto t_a = a.inverse_mass() + a.inverse_inertia() * ra_n * ra_n; - const auto t_b = b.inverse_mass() + b.inverse_inertia() * rb_n * rb_n; - const auto denom = (t_a + t_b) * contact_points; - - assert(std::abs(denom) > 0); - - const auto j = -(1 + e) * relative_velocity / denom; - - assert(j != std::numeric_limits::infinity()); - - const auto normal_impulse = j * n; - - a.apply_impulse(-normal_impulse, a_point_offset); - b.apply_impulse(normal_impulse, b_point_offset); - - // friction - const auto tangent = (rv - n * rv.dot(n)).normalized(); - - const auto jt = -rv.dot(tangent) / denom; - - if (std::abs(jt) < 0.000001) continue; - - const auto static_friction = 0.61; - const auto dynamic_friction = 0.47; + const auto j = calc_impulse_norm(a, b, + offset_a, + offset_b, + n, + rel_v_n, + e, + contact_points); - const auto tangent_impulse = std::abs(jt) < j * static_friction - ? (tangent * jt).eval() - : (tangent * -j * dynamic_friction).eval(); + assert(std::abs(j) < 100000); - a.apply_impulse(-tangent_impulse, a_point_offset); - b.apply_impulse(tangent_impulse, b_point_offset); + apply_impulse(a, b, offset_a, offset_b, n, j); + apply_friction(a, b, offset_a, offset_b, n, rel_v, rel_v_n, j, contact_points); } } From 0688f2b5ae39d4e75553b9f29319190cf4610b45 Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Wed, 31 Jan 2018 21:18:14 +0100 Subject: [PATCH 68/85] fixed warnings --- Final/Console.hpp | 2 +- Final/Main.cpp | 13 +++++++++--- Final/Polygon.cpp | 52 +++++++++++++++++++++++++++-------------------- 3 files changed, 41 insertions(+), 26 deletions(-) diff --git a/Final/Console.hpp b/Final/Console.hpp index a1b49b4..6d6847b 100644 --- a/Final/Console.hpp +++ b/Final/Console.hpp @@ -25,7 +25,7 @@ class console m_text.setFont(font); m_text.setCharacterSize(12); - m_text.setColor(sf::Color::White); + m_text.setFillColor(sf::Color::White); } template diff --git a/Final/Main.cpp b/Final/Main.cpp index e9d58ae..6280ead 100644 --- a/Final/Main.cpp +++ b/Final/Main.cpp @@ -59,7 +59,7 @@ void render(sf::RenderWindow& window, const std::vector& polygons, { window.draw(custom_polygon); - for(auto i = 0; i < custom_polygon.getVertexCount(); ++i) + for(auto i = 0u; i < custom_polygon.getVertexCount(); ++i) { sf::CircleShape corner(4); corner.setOrigin(corner.getRadius(), corner.getRadius()); @@ -236,8 +236,15 @@ int main() { if (event.mouseButton.button == sf::Mouse::Left) { - custom_polygon.append(sf::Vertex(sf::Vector2f(xs, ys), - sf::Color::Yellow)); + custom_polygon.append( + { + { + static_cast(xs), + static_cast(ys) + }, + + sf::Color::Yellow + }); create_custom_polygon = true; diff --git a/Final/Polygon.cpp b/Final/Polygon.cpp index a7e01a2..c8fa9ec 100644 --- a/Final/Polygon.cpp +++ b/Final/Polygon.cpp @@ -236,7 +236,7 @@ polygon polygon::create_rectangle(const Vector2d& pos, const Vector2d& size) polygon polygon::create_circle(const Vector2d& center, const double radius) { - constexpr auto vertex_count = 50; + constexpr auto vertex_count = 20; const auto angle = 360.0 / vertex_count; @@ -282,46 +282,54 @@ polygon polygon::create_random(const Vector2d& center, const size_t vertex_count Vector2d calc_centroid(const std::vector vertices) { - - auto x = 0.0f; - auto y = 0.0f; - auto signedArea = 0.0f; - auto x0 = 0.0f; // Current vertex X - auto y0 = 0.0f; // Current vertex Y - auto x1 = 0.0f; // Next vertex X - auto y1 = 0.0f; // Next vertex Y - auto a = 0.0f; // Partial signed area + auto x = 0.0; + auto y = 0.0; + auto signed_area = 0.0; + auto x0 = 0.0; // Current vertex X + auto y0 = 0.0; // Current vertex Y + auto x1 = 0.0; // Next vertex X + auto y1 = 0.0; // Next vertex Y + auto a = 0.0; // Partial signed area // For all vertices except last - int i=0; - for (i=0; i Date: Wed, 31 Jan 2018 21:51:33 +0100 Subject: [PATCH 69/85] refactored integration --- Final/physical_object.cpp | 27 +++++++++++++++++++-------- Final/physical_object.h | 1 + 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/Final/physical_object.cpp b/Final/physical_object.cpp index abe35ea..dbf65d3 100644 --- a/Final/physical_object.cpp +++ b/Final/physical_object.cpp @@ -33,6 +33,18 @@ physical_object::physical_object(const Vector2d& position, update_points(); } +void physical_object::perform_symplectic_euler_step(const double dt) +{ + const auto a = force_ / mass_; + const auto a_m = inverse_inertia_ * torque_; + + velocity_ += a * dt; + angular_velocity_ += a_m * dt; + + position_ += velocity_ * dt; + rotation_ = Rotation2D(rotation_.angle() + angular_velocity_ * dt); +} + void physical_object::update(const double dt) { switch (type_) @@ -42,17 +54,15 @@ void physical_object::update(const double dt) default: break; } - // symplectic euler - // 1. velocity update - // 2. position update - velocity_ += force_ / mass_ * dt; - angular_velocity_ += inverse_inertia_ * torque_ * dt; - - position_ += velocity_ * dt; - rotation_ = Rotation2D(rotation_.angle() + angular_velocity_ * dt); + perform_leapfrog_step(dt); update_points(); + assert(velocity_.squaredNorm() < 100000000); + assert(std::abs(angular_velocity_) < 100000000); + assert(position_.squaredNorm() < 100000000); + assert(std::abs(rotation_.angle()) < 100000000); + force_ = { 0.0, 0.0 }; torque_ = 0.0; } @@ -97,6 +107,7 @@ void physical_object::update_points() inverse_inertia_ = 1.0 / inertia; } + void physical_object::position(const Vector2d& new_center) { this->position_ = new_center; } diff --git a/Final/physical_object.h b/Final/physical_object.h index 389eb89..90c1c6d 100644 --- a/Final/physical_object.h +++ b/Final/physical_object.h @@ -151,6 +151,7 @@ class physical_object object_type type_ = object_type::fixed; void update_points(); + void perform_symplectic_euler_step(const double dt); }; From 178a94140b501fe97ca815c2e4cb7b713f351476 Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Wed, 31 Jan 2018 21:56:24 +0100 Subject: [PATCH 70/85] fix previous commit --- Final/physical_object.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Final/physical_object.cpp b/Final/physical_object.cpp index dbf65d3..35fe495 100644 --- a/Final/physical_object.cpp +++ b/Final/physical_object.cpp @@ -54,7 +54,7 @@ void physical_object::update(const double dt) default: break; } - perform_leapfrog_step(dt); + perform_symplectic_euler_step(dt); update_points(); From 29a116f8b93491115c78dad04bb228b3dca18cdc Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Wed, 31 Jan 2018 23:18:39 +0100 Subject: [PATCH 71/85] reworked contact info --- Final/ContactInfo.hpp | 71 ++++++++++++++++++-------- Final/Polygon.cpp | 7 +-- Final/Polygon.h | 2 +- Final/collision_detection.h | 98 +++++++++++++++--------------------- Final/collision_resolution.h | 56 +++++++++------------ Final/physical_object.cpp | 14 +++--- Final/physical_object.h | 6 +++ 7 files changed, 133 insertions(+), 121 deletions(-) diff --git a/Final/ContactInfo.hpp b/Final/ContactInfo.hpp index 7aec57e..fc24eaa 100644 --- a/Final/ContactInfo.hpp +++ b/Final/ContactInfo.hpp @@ -2,31 +2,62 @@ #include "physical_object.h" -using line_t = std::tuple; -struct contact_info +class contact_info { - contact_info(physical_object& point_owner, - const point_t& point, - physical_object& line_owner, - const line_t& line, - const double penetration_depth, - const Vector2d& point_of_intersection) - : point_owner(point_owner), - point(point), - line_owner(line_owner), - line(line), - penetration_depth(penetration_depth), - point_of_intersection(point_of_intersection) +public: + contact_info(physical_object& point_owner, + const point_t& point, + physical_object& line_owner, + const line_t& line, + const double penetration_depth, + const Vector2d& point_of_intersection) + : point_owner_(point_owner), + point_(point), + line_owner_(line_owner), + line_(line), + penetration_depth_(penetration_depth), + point_of_intersection_(point_of_intersection) { } - physical_object& point_owner; - point_t point; + physical_object& line_owner() const { return line_owner_; } + physical_object& point_owner() const { return point_owner_; } - physical_object& line_owner; - line_t line; + point_t line_start_point() const { return line_owner_.points()[std::get<0>(line_)]; } + point_t line_end_point() const { return line_owner_.points()[std::get<1>(line_)]; } - double penetration_depth; - Vector2d point_of_intersection; + Vector2d line_start_offset() const { return std::get<0>(line_start_point()); } + Vector2d line_end_offset() const { return std::get<0>(line_end_point()); } + Vector2d line_offset() const { return (line_start_offset() + line_end_offset()) / 2.0; } + + point_t contact_point() const { return point_; } + Vector2d contact_point_offset() const { return std::get<0>(point_); } + Vector2d contact_point_velocity() const { return std::get<1>(point_); } + + Vector2d relative_velocity() const + { + const Vector2d line_velocity = + (std::get<1>(line_start_point()) + + std::get<1>(line_end_point())) / 2.0; + + return contact_point_velocity() - line_velocity; + } + + Vector2d normal() const + { + return ::normal(line_start_offset(), line_end_offset()); + } + + double penetration_depth() const { return penetration_depth_; } + +private: + physical_object& point_owner_; + point_t point_; + + physical_object& line_owner_; + line_t line_; + + double penetration_depth_; + Vector2d point_of_intersection_; }; \ No newline at end of file diff --git a/Final/Polygon.cpp b/Final/Polygon.cpp index c8fa9ec..459bfd4 100644 --- a/Final/Polygon.cpp +++ b/Final/Polygon.cpp @@ -105,15 +105,12 @@ void polygon::draw_debug(sf::RenderWindow& window) const for (const auto& contact : contacts_) { const auto center = physical_object_.center_of_mass_global(); - const auto point = center + std::get<0>(contact.point); + const auto point = center + contact.contact_point_offset(); circle.setPosition(as_screen_coordinates(point)); window.draw(circle); - const auto line_start = std::get<0>(std::get<0>(contact.line)); - const auto line_end = std::get<0>(std::get<1>(contact.line)); - - const auto n = normal(line_start, line_end); + const auto n = contact.normal(); normal_line[0] = sf::Vertex(as_screen_coordinates(point), sf::Color{ 255, 127, 0 }); normal_line[1] = sf::Vertex(as_screen_coordinates(point + n), sf::Color{ 255, 127, 0 }); diff --git a/Final/Polygon.h b/Final/Polygon.h index 186325e..b28fcaf 100644 --- a/Final/Polygon.h +++ b/Final/Polygon.h @@ -40,7 +40,7 @@ class polygon { for (auto& contact : contacts) { - if (&contact.point_owner != &physical_object_) + if (&contact.point_owner() != &physical_object_) continue; contacts_.push_back(contact); diff --git a/Final/collision_detection.h b/Final/collision_detection.h index fdb4b86..0d96087 100644 --- a/Final/collision_detection.h +++ b/Final/collision_detection.h @@ -56,29 +56,35 @@ inline bool lineSegmentIntersection( return true; } -inline bool inside(const Vector2d& point, - const Vector2d& point_offset, - const std::vector& lines, - const Vector2d& line_offset) +inline bool inside( + const Vector2d& point, + const physical_object& object) { auto intersections = 0; - for (const auto& line_b : lines) - { - const auto x1 = point_offset.x() + point.x(); - const auto y1 = point_offset.y() + point.y(); + const Vector2d ray_dir = { 1, 0 }; + + const auto x2 = point.x() + ray_dir.x() * 100000.0; + const auto y2 = point.y() + ray_dir.y() * 100000.0; - const auto x2 = point_offset.x() + point.x() * 100000.0; - const auto y2 = point_offset.y() + point.y() * 100000.0; + for (const auto& line : object.lines()) + { + const auto line_start_index = std::get<0>(line); + const auto line_end_index = std::get<1>(line); - const auto x3 = line_offset.x() + std::get<0>(std::get<0>(line_b)).x(); - const auto y3 = line_offset.y() + std::get<0>(std::get<0>(line_b)).y(); + const auto line_start_point = object.points()[line_start_index]; + const auto line_end_point = object.points()[line_end_index]; - const auto x4 = line_offset.x() + std::get<0>(std::get<1>(line_b)).x(); - const auto y4 = line_offset.y() + std::get<0>(std::get<1>(line_b)).y(); + const auto line_start = object.position() + std::get<0>(line_start_point); + const auto line_end = object.position() + std::get<0>(line_end_point); double ix, iy; - if (!lineSegmentIntersection(x1, y1, x2, y2, x3, y3, x4, y4, ix, iy)) + if (!lineSegmentIntersection( + point.x(), point.y(), + x2, y2, + line_start.x(), line_start.y(), + line_end.x(), line_end.y(), + ix, iy)) continue; ++intersections; @@ -89,76 +95,54 @@ inline bool inside(const Vector2d& point, inline void find_intersections(physical_object& object_a, physical_object& object_b, std::vector& contacts) { - const auto get_lines = [](const physical_object& object) - { - std::vector lines = std::vector(); - - const auto& points = object.points(); - - for (size_t i = 0; i < points.size(); i++) - { - auto end_index = i == points.size() - 1 - ? 0 - : i + 1; - - lines.emplace_back(points[i], points[end_index]); - } - - return lines; - }; - - const auto points_a = object_a.points(); - const auto lines_b = get_lines(object_b); - const auto position_a = object_a.position(); const auto position_b = object_b.position(); - for (const auto& point_a : points_a) + for (const auto& point_a : object_a.points()) { - const auto point = std::get<0>(point_a); + const auto point_pos = position_a + std::get<0>(point_a); - if (!inside(point, position_a, lines_b, position_b)) + if (!inside(point_pos, object_b)) continue; - line_t line; + line_t nearest_line; auto distance = std::numeric_limits::max(); auto penetration_depth = 0.0; Vector2d point_of_intersection; - for (const auto& line_b : lines_b) + for (const auto& line : object_b.lines()) { - const auto line_start = position_b + std::get<0>(std::get<0>(line_b)); - const auto line_end = position_b + std::get<0>(std::get<1>(line_b)); - - const auto x1 = position_a.x(); - const auto y1 = position_a.y(); - - const auto x2 = position_a.x() + point.x(); - const auto y2 = position_a.y() + point.y(); + const auto line_start_index = std::get<0>(line); + const auto line_end_index = std::get<1>(line); - const auto x3 = line_start.x(); - const auto y3 = line_start.y(); + const auto& line_start_point = object_b.points()[line_start_index]; + const auto& line_end_point = object_b.points()[line_end_index]; - const auto x4 = line_end.x(); - const auto y4 = line_end.y(); + const auto line_start = position_b + std::get<0>(line_start_point); + const auto line_end = position_b + std::get<0>(line_end_point); double ix, iy; - if (!lineSegmentIntersection(x1, y1, x2, y2, x3, y3, x4, y4, ix, iy)) + if (!lineSegmentIntersection( + position_a.x(), position_a.y(), + point_pos.x(), point_pos.y(), + line_start.x(), line_start.y(), + line_end.x(), line_end.y(), + ix, iy)) continue; const auto current_distance = - (Vector2d(x2, y2) - Vector2d(ix, iy)).norm(); + (Vector2d(point_pos.x(), point_pos.y()) - Vector2d(ix, iy)).norm(); if (current_distance >= distance) continue; distance = current_distance; - line = line_b; + nearest_line = line; penetration_depth = current_distance; point_of_intersection = Vector2d(ix, iy); } - contacts.emplace_back(object_a, point_a, object_b, line, penetration_depth, point_of_intersection); + contacts.emplace_back(object_a, point_a, object_b, nearest_line, penetration_depth, point_of_intersection); } } diff --git a/Final/collision_resolution.h b/Final/collision_resolution.h index 09d67df..5f41da7 100644 --- a/Final/collision_resolution.h +++ b/Final/collision_resolution.h @@ -81,35 +81,21 @@ inline void collision_resolution(const std::vector& contacts, cons { for (const auto& contact : contacts) { - const auto& line_start_point = std::get<0>(contact.line); - const auto& line_end_point = std::get<1>(contact.line); + auto& a = contact.line_owner(); + auto& b = contact.point_owner(); - const auto& line_start = std::get<0>(line_start_point); - const auto& line_end = std::get<0>(line_end_point); - - const auto n = normal(line_start, line_end); - - auto& a = contact.line_owner; - auto& b = contact.point_owner; + const auto n = contact.normal(); const auto contact_points = std::count_if(contacts.begin(), contacts.end(), [&b, &a](const contact_info& c) { - return &c.point_owner == &b && &c.line_owner == &a || - &c.point_owner == &a && &c.line_owner == &b; + return &c.point_owner() == &b && &c.line_owner() == &a || + &c.point_owner() == &a && &c.line_owner() == &b; }); assert(contact_points > 0); - const auto offset_b = std::get<0>(contact.point); - const auto velocity_b = std::get<1>(contact.point); - - const Vector2d offset_a = (line_start + line_end) / 2.0; - const Vector2d velocity_a = - (std::get<1>(line_start_point) - + std::get<1>(line_end_point)) / 2.0; - - const Vector2d rel_v = velocity_b - velocity_a; + const auto rel_v = contact.relative_velocity(); const auto rel_v_n = rel_v.dot(n); if (rel_v_n > 0) @@ -121,8 +107,8 @@ inline void collision_resolution(const std::vector& contacts, cons : 0.3; const auto j = calc_impulse_norm(a, b, - offset_a, - offset_b, + contact.line_offset(), + contact.contact_point_offset(), n, rel_v_n, e, @@ -130,8 +116,16 @@ inline void collision_resolution(const std::vector& contacts, cons assert(std::abs(j) < 100000); - apply_impulse(a, b, offset_a, offset_b, n, j); - apply_friction(a, b, offset_a, offset_b, n, rel_v, rel_v_n, j, contact_points); + apply_impulse(a, b, + contact.line_offset(), + contact.contact_point_offset(), + n, j); + + apply_friction(a, b, + contact.line_offset(), + contact.contact_point_offset(), + n, rel_v, rel_v_n, j, + contact_points); } } @@ -139,12 +133,10 @@ inline void correct_positions(const std::vector& contacts) { for (const auto& contact : contacts) { - const auto line_start = std::get<0>(std::get<0>(contact.line)); - const auto line_end = std::get<0>(std::get<1>(contact.line)); - const auto n = normal(line_start, line_end); + auto& a = contact.line_owner(); + auto& b = contact.point_owner(); - auto& a = contact.line_owner; - auto& b = contact.point_owner; + const auto n = contact.normal(); const auto percent = 0.5; // usually 20% to 80% const auto slop = 0.01; // usually 0.01 to 0.1 @@ -152,11 +144,11 @@ inline void correct_positions(const std::vector& contacts) const auto contact_points = std::count_if(contacts.begin(), contacts.end(), [&b, &a](const contact_info& c) { - return &c.point_owner == &b && &c.line_owner == &a || - &c.point_owner == &a && &c.line_owner == &b; + return &c.point_owner() == &b && &c.line_owner() == &a || + &c.point_owner() == &a && &c.line_owner() == &b; }); - const Vector2d correction = std::max(contact.penetration_depth - slop, 0.0) + const Vector2d correction = std::max(contact.penetration_depth() - slop, 0.0) / (a.inverse_mass() + b.inverse_mass()) * percent * n ; a.move(-a.inverse_mass() * correction / contact_points); diff --git a/Final/physical_object.cpp b/Final/physical_object.cpp index 35fe495..7bda130 100644 --- a/Final/physical_object.cpp +++ b/Final/physical_object.cpp @@ -23,11 +23,15 @@ physical_object::physical_object(const Vector2d& position, return current_sum + std::get<0>(p) * std::get<1>(p); }) / mass_; - // get offsets - for(const auto& point : points) + + for(auto i = 0u; i < points.size(); ++i) { + // save offset initial_offsets_.push_back( - std::get<0>(point) - center_of_mass_); + std::get<0>(points[i]) - center_of_mass_); + + // save line + lines_.emplace_back(i, (i + 1) % points_.size()); } update_points(); @@ -58,9 +62,7 @@ void physical_object::update(const double dt) update_points(); - assert(velocity_.squaredNorm() < 100000000); assert(std::abs(angular_velocity_) < 100000000); - assert(position_.squaredNorm() < 100000000); assert(std::abs(rotation_.angle()) < 100000000); force_ = { 0.0, 0.0 }; @@ -88,7 +90,7 @@ void physical_object::update_points() for (auto i = 0u; i < points_.size(); ++i) { // transform offset - auto rot = rotation_.toRotationMatrix(); + const auto rot = rotation_.toRotationMatrix(); const auto offset = rot * initial_offsets_[i] * scale_; points_[i] = diff --git a/Final/physical_object.h b/Final/physical_object.h index 90c1c6d..5b32073 100644 --- a/Final/physical_object.h +++ b/Final/physical_object.h @@ -18,6 +18,9 @@ using Rotation2D = Eigen::Rotation2D; // offset, velocity using point_t = std::tuple; +// point indices +using line_t = std::tuple; + EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(Vector2d) EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(point_t) @@ -85,6 +88,7 @@ class physical_object double inverse_inertia() const { return inverse_inertia_; } double bounding_radius() const { return radius_; } const std::vector& points() const { return points_; } + const std::vector& lines() const { return lines_; } void position(const Vector2d& new_center); double mass() const @@ -114,6 +118,7 @@ class physical_object double get_scale() const { return scale_; } void set_type(const object_type type) { type_ = type; } + object_type get_type() const { return type_; } void move(const Vector2d& v) @@ -147,6 +152,7 @@ class physical_object std::vector initial_offsets_; std::vector points_; + std::vector lines_; object_type type_ = object_type::fixed; From 0b305b9e36d2c85611b302a31fe8c27dc5a990a9 Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Wed, 31 Jan 2018 23:35:36 +0100 Subject: [PATCH 72/85] OpenMP parallelization --- Final/Main.cpp | 5 +-- Final/collision_detection.h | 65 ++++++++++++++++++++---------------- Final/collision_resolution.h | 56 +++++++++++++++++++------------ 3 files changed, 74 insertions(+), 52 deletions(-) diff --git a/Final/Main.cpp b/Final/Main.cpp index 6280ead..e0a3484 100644 --- a/Final/Main.cpp +++ b/Final/Main.cpp @@ -90,9 +90,10 @@ void update(std::vector& polygons, const double dt) measure("Update: Integration", [&] { - for (auto& polygon : polygons) + #pragma omp parallel for + for (auto i = 0; i < polygons.size(); ++i) { - polygon.update(dt); + polygons[i].update(dt); } }); diff --git a/Final/collision_detection.h b/Final/collision_detection.h index 0d96087..ad9d02c 100644 --- a/Final/collision_detection.h +++ b/Final/collision_detection.h @@ -162,38 +162,47 @@ inline bool intersects(physical_object& a, physical_object& b, std::vector collision_detection(std::vector& polygons) { - for (auto& polygon_a : polygons) - { - polygon_a.clear_contacts(); - } - std::vector global_contacts; - for (auto i = 0u; i < polygons.size(); ++i) - { - auto& polygon_a = polygons[i]; - for (auto j = i + 1; j < polygons.size(); ++j) + #pragma omp parallel shared(global_contacts) + { + #pragma omp for + for (auto i = 0; i < polygons.size(); ++i) { - auto& polygon_b = polygons[j]; - - auto& object_a = polygon_a.get_physical_object(); - auto& object_b = polygon_b.get_physical_object(); - - if (object_a.get_type() == object_type::fixed && - object_b.get_type() == object_type::fixed) - continue; - - std::vector local_contacts; - if (!intersects(object_a, object_b, local_contacts)) - continue; - - polygon_a.add_contacts(local_contacts); - polygon_b.add_contacts(local_contacts); + polygons[i].clear_contacts(); + } - std::move( - local_contacts.begin(), - local_contacts.end(), - std::back_inserter(global_contacts)); + #pragma omp for schedule(dynamic) + for (auto i = 0; i < polygons.size(); ++i) + { + auto& polygon_a = polygons[i]; + + for (auto j = i + 1; j < polygons.size(); ++j) + { + auto& polygon_b = polygons[j]; + + auto& object_a = polygon_a.get_physical_object(); + auto& object_b = polygon_b.get_physical_object(); + + if (object_a.get_type() == object_type::fixed && + object_b.get_type() == object_type::fixed) + continue; + + std::vector local_contacts; + if (!intersects(object_a, object_b, local_contacts)) + continue; + + #pragma omp critical + { + polygon_a.add_contacts(local_contacts); + polygon_b.add_contacts(local_contacts); + + std::move( + local_contacts.begin(), + local_contacts.end(), + std::back_inserter(global_contacts)); + } + } } } diff --git a/Final/collision_resolution.h b/Final/collision_resolution.h index 5f41da7..c2bf7a4 100644 --- a/Final/collision_resolution.h +++ b/Final/collision_resolution.h @@ -79,8 +79,11 @@ inline void apply_impulse( inline void collision_resolution(const std::vector& contacts, const double dt) { - for (const auto& contact : contacts) + #pragma omp parallel for + for (auto i = 0; i < contacts.size(); ++i) { + const auto& contact = contacts[i]; + auto& a = contact.line_owner(); auto& b = contact.point_owner(); @@ -90,7 +93,7 @@ inline void collision_resolution(const std::vector& contacts, cons [&b, &a](const contact_info& c) { return &c.point_owner() == &b && &c.line_owner() == &a || - &c.point_owner() == &a && &c.line_owner() == &b; + &c.point_owner() == &a && &c.line_owner() == &b; }); assert(contact_points > 0); @@ -106,33 +109,39 @@ inline void collision_resolution(const std::vector& contacts, cons ? 0 : 0.3; - const auto j = calc_impulse_norm(a, b, - contact.line_offset(), - contact.contact_point_offset(), - n, - rel_v_n, + const auto j = calc_impulse_norm(a, b, + contact.line_offset(), + contact.contact_point_offset(), + n, + rel_v_n, e, contact_points); assert(std::abs(j) < 100000); - apply_impulse(a, b, - contact.line_offset(), - contact.contact_point_offset(), - n, j); - - apply_friction(a, b, - contact.line_offset(), - contact.contact_point_offset(), - n, rel_v, rel_v_n, j, - contact_points); + #pragma omp critical + { + apply_impulse(a, b, + contact.line_offset(), + contact.contact_point_offset(), + n, j); + + apply_friction(a, b, + contact.line_offset(), + contact.contact_point_offset(), + n, rel_v, rel_v_n, j, + contact_points); + } } } inline void correct_positions(const std::vector& contacts) { - for (const auto& contact : contacts) + #pragma omp parallel for + for (auto i = 0; i < contacts.size(); ++i) { + const auto& contact = contacts[i]; + auto& a = contact.line_owner(); auto& b = contact.point_owner(); @@ -145,14 +154,17 @@ inline void correct_positions(const std::vector& contacts) [&b, &a](const contact_info& c) { return &c.point_owner() == &b && &c.line_owner() == &a || - &c.point_owner() == &a && &c.line_owner() == &b; + &c.point_owner() == &a && &c.line_owner() == &b; }); const Vector2d correction = std::max(contact.penetration_depth() - slop, 0.0) - / (a.inverse_mass() + b.inverse_mass()) * percent * n ; + / (a.inverse_mass() + b.inverse_mass()) * percent * n; - a.move(-a.inverse_mass() * correction / contact_points); - b.move(b.inverse_mass() * correction / contact_points); + #pragma omp critical + { + a.move(-a.inverse_mass() * correction / contact_points); + b.move(b.inverse_mass() * correction / contact_points); + } } } #endif // COLLISION_RESOLUTION_H From 7d4115953ab4ec829dbaa9443d38ff1be244df7f Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Thu, 1 Feb 2018 10:19:59 +0100 Subject: [PATCH 73/85] refactoring --- Final/collision_resolution.h | 86 ++++++++++++++++++------------------ 1 file changed, 44 insertions(+), 42 deletions(-) diff --git a/Final/collision_resolution.h b/Final/collision_resolution.h index c2bf7a4..8ab631c 100644 --- a/Final/collision_resolution.h +++ b/Final/collision_resolution.h @@ -3,22 +3,18 @@ #include "ContactInfo.hpp" -inline void apply_friction( - physical_object& a, - physical_object& b, +inline double calc_impulse_norm( + const physical_object& a, + const physical_object& b, const Vector2d& offset_a, const Vector2d& offset_b, const Vector2d& normal, - const Vector2d& rel_v, const double rel_v_n, - const double j, + const double restitution, const int num_contacts) { - const auto tangent = (rel_v - normal * rel_v_n) - .normalized(); - - const auto ra_n = cross2(offset_a, tangent); - const auto rb_n = cross2(offset_b, tangent); + const auto ra_n = cross2(offset_a, normal); + const auto rb_n = cross2(offset_b, normal); const auto t_a = a.inverse_mass() + a.inverse_inertia() * ra_n * ra_n; const auto t_b = b.inverse_mass() + b.inverse_inertia() * rb_n * rb_n; @@ -26,33 +22,25 @@ inline void apply_friction( assert(std::abs(denom) > 0); - const auto jt = -rel_v.dot(tangent) / denom; - - if (std::abs(jt) < 0.000001) return; - - const auto static_friction = 0.61; - const auto dynamic_friction = 0.47; - - const auto tangent_impulse = std::abs(jt) < j * static_friction - ? (tangent * jt).eval() - : (tangent * -j * dynamic_friction).eval(); - - a.apply_impulse(-tangent_impulse, offset_a); - b.apply_impulse(tangent_impulse, offset_b); + return -(1 + restitution) * rel_v_n / denom; } -inline double calc_impulse_norm( - const physical_object& a, - const physical_object& b, +inline Vector2d calc_friction_impulse( + physical_object& a, + physical_object& b, const Vector2d& offset_a, const Vector2d& offset_b, const Vector2d& normal, + const Vector2d& rel_v, const double rel_v_n, - const double restitution, + const double j, const int num_contacts) { - const auto ra_n = cross2(offset_a, normal); - const auto rb_n = cross2(offset_b, normal); + const auto tangent = (rel_v - normal * rel_v_n) + .normalized(); + + const auto ra_n = cross2(offset_a, tangent); + const auto rb_n = cross2(offset_b, tangent); const auto t_a = a.inverse_mass() + a.inverse_inertia() * ra_n * ra_n; const auto t_b = b.inverse_mass() + b.inverse_inertia() * rb_n * rb_n; @@ -60,7 +48,16 @@ inline double calc_impulse_norm( assert(std::abs(denom) > 0); - return -(1 + restitution) * rel_v_n / denom; + const auto jt = -rel_v.dot(tangent) / denom; + + if (std::abs(jt) < 0.000001) return { 0, 0 }; + + const auto static_friction = 0.61; + const auto dynamic_friction = 0.47; + + return std::abs(jt) < j * static_friction + ? (tangent * jt).eval() + : (tangent * -j * dynamic_friction).eval(); } inline void apply_impulse( @@ -68,13 +65,10 @@ inline void apply_impulse( physical_object& b, const Vector2d& offset_a, const Vector2d& offset_b, - const Vector2d n, - const double j) + const Vector2d& impulse) { - const auto normal_impulse = j * n; - - a.apply_impulse(-normal_impulse, offset_a); - b.apply_impulse( normal_impulse, offset_b); + a.apply_impulse(-impulse, offset_a); + b.apply_impulse( impulse, offset_b); } inline void collision_resolution(const std::vector& contacts, const double dt) @@ -119,18 +113,26 @@ inline void collision_resolution(const std::vector& contacts, cons assert(std::abs(j) < 100000); + const auto normal_impulse = j * n; + + const auto friction_impulse = calc_friction_impulse(a, b, + contact.line_offset(), + contact.contact_point_offset(), + n, rel_v, rel_v_n, j, + contact_points); + #pragma omp critical { apply_impulse(a, b, contact.line_offset(), contact.contact_point_offset(), - n, j); + normal_impulse); - apply_friction(a, b, + + apply_impulse(a, b, contact.line_offset(), contact.contact_point_offset(), - n, rel_v, rel_v_n, j, - contact_points); + friction_impulse); } } } @@ -147,8 +149,8 @@ inline void correct_positions(const std::vector& contacts) const auto n = contact.normal(); - const auto percent = 0.5; // usually 20% to 80% - const auto slop = 0.01; // usually 0.01 to 0.1 + const auto percent = 0.3; // usually 20% to 80% + const auto slop = 0.05; // usually 0.01 to 0.1 const auto contact_points = std::count_if(contacts.begin(), contacts.end(), [&b, &a](const contact_info& c) From f038c7353b031c169378a2258d866be579aa4472 Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Thu, 1 Feb 2018 10:20:23 +0100 Subject: [PATCH 74/85] fixed debug output in release --- Final/ContactInfo.hpp | 10 +++++----- Final/Polygon.cpp | 6 +++++- Final/physical_object.cpp | 4 ++++ Final/physical_object.h | 3 ++- 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/Final/ContactInfo.hpp b/Final/ContactInfo.hpp index fc24eaa..c5b06d6 100644 --- a/Final/ContactInfo.hpp +++ b/Final/ContactInfo.hpp @@ -24,16 +24,16 @@ class contact_info physical_object& line_owner() const { return line_owner_; } physical_object& point_owner() const { return point_owner_; } - point_t line_start_point() const { return line_owner_.points()[std::get<0>(line_)]; } - point_t line_end_point() const { return line_owner_.points()[std::get<1>(line_)]; } + const point_t& line_start_point() const { return line_owner_.points()[std::get<0>(line_)]; } + const point_t& line_end_point() const { return line_owner_.points()[std::get<1>(line_)]; } Vector2d line_start_offset() const { return std::get<0>(line_start_point()); } Vector2d line_end_offset() const { return std::get<0>(line_end_point()); } Vector2d line_offset() const { return (line_start_offset() + line_end_offset()) / 2.0; } - point_t contact_point() const { return point_; } - Vector2d contact_point_offset() const { return std::get<0>(point_); } - Vector2d contact_point_velocity() const { return std::get<1>(point_); } + const point_t& contact_point() const { return point_; } + const Vector2d& contact_point_offset() const { return std::get<0>(point_); } + const Vector2d& contact_point_velocity() const { return std::get<1>(point_); } Vector2d relative_velocity() const { diff --git a/Final/Polygon.cpp b/Final/Polygon.cpp index 459bfd4..09007f6 100644 --- a/Final/Polygon.cpp +++ b/Final/Polygon.cpp @@ -226,7 +226,11 @@ polygon polygon::create_rectangle(const Vector2d& pos, const Vector2d& size) polygon p(pos, points); p.scale(size.x() / half_width / 2); - p.set_color(sf::Color::Blue); + p.set_color({ + static_cast(sf::Color::Cyan.r * 0.7), + static_cast(sf::Color::Cyan.g * 0.7), + static_cast(sf::Color::Cyan.b * 0.7), + }); return p; } diff --git a/Final/physical_object.cpp b/Final/physical_object.cpp index 7bda130..3b647af 100644 --- a/Final/physical_object.cpp +++ b/Final/physical_object.cpp @@ -34,6 +34,8 @@ physical_object::physical_object(const Vector2d& position, lines_.emplace_back(i, (i + 1) % points_.size()); } + center_of_mass_global_ = position_ + center_of_mass_; + update_points(); } @@ -47,6 +49,8 @@ void physical_object::perform_symplectic_euler_step(const double dt) position_ += velocity_ * dt; rotation_ = Rotation2D(rotation_.angle() + angular_velocity_ * dt); + + center_of_mass_global_ = position_ + center_of_mass_; } void physical_object::update(const double dt) diff --git a/Final/physical_object.h b/Final/physical_object.h index 5b32073..99a814e 100644 --- a/Final/physical_object.h +++ b/Final/physical_object.h @@ -84,7 +84,7 @@ class physical_object const Rotation2D& rotation() const { return rotation_; } const Vector2d& linear_velocity() const { return velocity_; } const Vector2d& center_of_mass_local() const { return center_of_mass_; } - Vector2d center_of_mass_global() const { return position_ + center_of_mass_; } + const Vector2d& center_of_mass_global() const { return center_of_mass_global_; } double inverse_inertia() const { return inverse_inertia_; } double bounding_radius() const { return radius_; } const std::vector& points() const { return points_; } @@ -140,6 +140,7 @@ class physical_object double radius_; Vector2d center_of_mass_; + Vector2d center_of_mass_global_; Vector2d position_; Rotation2D rotation_; From 1e1bdf85630b4925a71225d3f36fd08903a57c14 Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Thu, 1 Feb 2018 10:40:19 +0100 Subject: [PATCH 75/85] fixed center of mass --- Final/physical_object.cpp | 15 +++++++++------ Final/physical_object.h | 6 ++++-- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/Final/physical_object.cpp b/Final/physical_object.cpp index 3b647af..5504eb0 100644 --- a/Final/physical_object.cpp +++ b/Final/physical_object.cpp @@ -17,18 +17,19 @@ physical_object::physical_object(const Vector2d& position, // initial position of center of mass auto tmp = Vector2d(0, 0); - center_of_mass_ = std::accumulate(points.begin(), points.end(), tmp, + initial_center_of_mass_ = std::accumulate(points.begin(), points.end(), tmp, [](const auto& current_sum, auto p) { return current_sum + std::get<0>(p) * std::get<1>(p); }) / mass_; - + center_of_mass_ = initial_center_of_mass_; + for(auto i = 0u; i < points.size(); ++i) { // save offset initial_offsets_.push_back( - std::get<0>(points[i]) - center_of_mass_); + std::get<0>(points[i]) - initial_center_of_mass_); // save line lines_.emplace_back(i, (i + 1) % points_.size()); @@ -49,8 +50,6 @@ void physical_object::perform_symplectic_euler_step(const double dt) position_ += velocity_ * dt; rotation_ = Rotation2D(rotation_.angle() + angular_velocity_ * dt); - - center_of_mass_global_ = position_ + center_of_mass_; } void physical_object::update(const double dt) @@ -90,11 +89,12 @@ void physical_object::accelerate(const Vector2d& acceleration) void physical_object::update_points() { + const auto rot = rotation_.toRotationMatrix(); + auto inertia = 0.0; for (auto i = 0u; i < points_.size(); ++i) { // transform offset - const auto rot = rotation_.toRotationMatrix(); const auto offset = rot * initial_offsets_[i] * scale_; points_[i] = @@ -111,6 +111,9 @@ void physical_object::update_points() } inverse_inertia_ = 1.0 / inertia; + + center_of_mass_ = rot * initial_center_of_mass_ * scale_; + center_of_mass_global_ = position_ + center_of_mass_; } diff --git a/Final/physical_object.h b/Final/physical_object.h index 99a814e..dadcab5 100644 --- a/Final/physical_object.h +++ b/Final/physical_object.h @@ -109,7 +109,8 @@ class physical_object { scale_ = scale; mass_ = initial_mass_ * scale; - + center_of_mass_ = initial_center_of_mass_ * scale; + // updates offsets, inertia // and bounding radius update_points(); @@ -139,7 +140,8 @@ class physical_object double scale_; double radius_; - Vector2d center_of_mass_; + Vector2d initial_center_of_mass_; + Vector2d center_of_mass_; Vector2d center_of_mass_global_; Vector2d position_; Rotation2D rotation_; From 51e56a26acc93d053a666def459a4e85c7f570d4 Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Thu, 1 Feb 2018 11:00:34 +0100 Subject: [PATCH 76/85] restitution slop --- Final/collision_resolution.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Final/collision_resolution.h b/Final/collision_resolution.h index 8ab631c..a9fa9d9 100644 --- a/Final/collision_resolution.h +++ b/Final/collision_resolution.h @@ -99,7 +99,8 @@ inline void collision_resolution(const std::vector& contacts, cons continue; // if relative velocity - const auto e = rel_v.squaredNorm() < (gravity * dt).squaredNorm() + 0.01 + const auto restitution_slop_sq = 0.5 * 0.5; + const auto e = rel_v.squaredNorm() < restitution_slop_sq ? 0 : 0.3; From 11394a721653668ebbfb3199fb1313879a47d1d9 Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Thu, 1 Feb 2018 11:00:48 +0100 Subject: [PATCH 77/85] fixed penetration depth --- Final/collision_detection.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Final/collision_detection.h b/Final/collision_detection.h index ad9d02c..d6e774e 100644 --- a/Final/collision_detection.h +++ b/Final/collision_detection.h @@ -130,8 +130,10 @@ inline void find_intersections(physical_object& object_a, physical_object& objec ix, iy)) continue; + const auto n = ::normal(line_start, line_end); + const auto current_distance = - (Vector2d(point_pos.x(), point_pos.y()) - Vector2d(ix, iy)).norm(); + (Vector2d(point_pos.x(), point_pos.y()) - Vector2d(ix, iy)).dot(n); if (current_distance >= distance) continue; From 083a9b22b3e09c07571c1f6c3e217115079c28a4 Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Thu, 1 Feb 2018 11:27:53 +0100 Subject: [PATCH 78/85] fixed collision detection --- Final/collision_detection.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Final/collision_detection.h b/Final/collision_detection.h index d6e774e..3ac00b9 100644 --- a/Final/collision_detection.h +++ b/Final/collision_detection.h @@ -135,7 +135,7 @@ inline void find_intersections(physical_object& object_a, physical_object& objec const auto current_distance = (Vector2d(point_pos.x(), point_pos.y()) - Vector2d(ix, iy)).dot(n); - if (current_distance >= distance) + if (std::abs(current_distance) >= distance) continue; distance = current_distance; From 29d9bce7abced415ead46c8f2e131ebf6fb10188 Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Thu, 1 Feb 2018 11:43:13 +0100 Subject: [PATCH 79/85] revert penetration depth fix --- Final/collision_detection.h | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Final/collision_detection.h b/Final/collision_detection.h index 3ac00b9..ad9d02c 100644 --- a/Final/collision_detection.h +++ b/Final/collision_detection.h @@ -130,12 +130,10 @@ inline void find_intersections(physical_object& object_a, physical_object& objec ix, iy)) continue; - const auto n = ::normal(line_start, line_end); - const auto current_distance = - (Vector2d(point_pos.x(), point_pos.y()) - Vector2d(ix, iy)).dot(n); + (Vector2d(point_pos.x(), point_pos.y()) - Vector2d(ix, iy)).norm(); - if (std::abs(current_distance) >= distance) + if (current_distance >= distance) continue; distance = current_distance; From 14962e08f2e2b3da6c23f1702b1734bf4c4670ec Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Thu, 1 Feb 2018 11:43:27 +0100 Subject: [PATCH 80/85] added presentation --- Final/presentation/rigid_body_simulation.pdf | Bin 0 -> 448790 bytes Final/presentation/rigid_body_simulation.pptx | Bin 0 -> 104893 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 Final/presentation/rigid_body_simulation.pdf create mode 100644 Final/presentation/rigid_body_simulation.pptx diff --git a/Final/presentation/rigid_body_simulation.pdf b/Final/presentation/rigid_body_simulation.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4fb4e26f7b5209e080b194bb0e4872a2959b589d GIT binary patch literal 448790 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 Date: Thu, 1 Feb 2018 12:07:20 +0100 Subject: [PATCH 81/85] fix center of mass --- Final/physical_object.cpp | 15 ++++++--------- Final/physical_object.h | 4 +--- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/Final/physical_object.cpp b/Final/physical_object.cpp index 5504eb0..0cd9933 100644 --- a/Final/physical_object.cpp +++ b/Final/physical_object.cpp @@ -17,26 +17,22 @@ physical_object::physical_object(const Vector2d& position, // initial position of center of mass auto tmp = Vector2d(0, 0); - initial_center_of_mass_ = std::accumulate(points.begin(), points.end(), tmp, + center_of_mass_ = std::accumulate(points.begin(), points.end(), tmp, [](const auto& current_sum, auto p) { return current_sum + std::get<0>(p) * std::get<1>(p); }) / mass_; - center_of_mass_ = initial_center_of_mass_; - for(auto i = 0u; i < points.size(); ++i) { // save offset initial_offsets_.push_back( - std::get<0>(points[i]) - initial_center_of_mass_); + std::get<0>(points[i]) - center_of_mass_); // save line lines_.emplace_back(i, (i + 1) % points_.size()); } - center_of_mass_global_ = position_ + center_of_mass_; - update_points(); } @@ -112,11 +108,12 @@ void physical_object::update_points() inverse_inertia_ = 1.0 / inertia; - center_of_mass_ = rot * initial_center_of_mass_ * scale_; center_of_mass_global_ = position_ + center_of_mass_; } -void physical_object::position(const Vector2d& new_center) { - this->position_ = new_center; +void physical_object::position(const Vector2d& new_center) +{ + position_ = new_center; + update_points(); } diff --git a/Final/physical_object.h b/Final/physical_object.h index dadcab5..ec698b0 100644 --- a/Final/physical_object.h +++ b/Final/physical_object.h @@ -109,7 +109,6 @@ class physical_object { scale_ = scale; mass_ = initial_mass_ * scale; - center_of_mass_ = initial_center_of_mass_ * scale; // updates offsets, inertia // and bounding radius @@ -140,8 +139,7 @@ class physical_object double scale_; double radius_; - Vector2d initial_center_of_mass_; - Vector2d center_of_mass_; + Vector2d center_of_mass_; Vector2d center_of_mass_global_; Vector2d position_; Rotation2D rotation_; From f510f9cc236f4a5c67b8d0bd09ae15cb518676b7 Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Thu, 1 Feb 2018 12:07:49 +0100 Subject: [PATCH 82/85] added fullscreen mode for presentation --- Final/Main.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/Final/Main.cpp b/Final/Main.cpp index e0a3484..6f7bc0c 100644 --- a/Final/Main.cpp +++ b/Final/Main.cpp @@ -120,7 +120,16 @@ int main() constexpr auto width = 1280; constexpr auto height = 800; + sf::RenderWindow window(sf::VideoMode(width, height), "2D Collision detection"); + const auto mouse_correction_x = 10; + const auto mouse_correction_y = 35; + +/* + sf::RenderWindow window(sf::VideoMode::getFullscreenModes().front(), "2D Collision detection", sf::Style::Fullscreen); + const auto mouse_correction_x = 0; + const auto mouse_correction_y = 0; +*/ std::vector polygons; { @@ -183,8 +192,8 @@ int main() case sf::Event::MouseMoved: { - xs = sf::Mouse::getPosition().x - window.getPosition().x - 10; - ys = sf::Mouse::getPosition().y - window.getPosition().y - 35; + xs = sf::Mouse::getPosition().x - window.getPosition().x - mouse_correction_x; + ys = sf::Mouse::getPosition().y - window.getPosition().y - mouse_correction_y; if(selected != nullptr) selected->set_center(as_world_coordinates(Vector2d({xs, ys}))); From e16a159b41abcb3d82af099f9f2beb214b2e1b22 Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Thu, 1 Feb 2018 12:09:54 +0100 Subject: [PATCH 83/85] updated presentation --- Final/presentation/rigid_body_simulation.pdf | Bin 448790 -> 449244 bytes Final/presentation/rigid_body_simulation.pptx | Bin 104893 -> 104950 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Final/presentation/rigid_body_simulation.pdf b/Final/presentation/rigid_body_simulation.pdf index 4fb4e26f7b5209e080b194bb0e4872a2959b589d..f176a4e3b41c2d55d5be81667907af8edcac39b3 100644 GIT binary patch delta 10525 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 diff --git a/Final/presentation/rigid_body_simulation.pptx b/Final/presentation/rigid_body_simulation.pptx index 465888b790cbf64781f7a366f22abaea1f42d53e..9e47744952a32f43e8f9e3ffb7d0ba053a46b287 100644 GIT binary patch delta 2971 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 F{RapjIrIPk delta 2864 zcmY+Gc{o(<8^`C2kS&a1G-JzB*~Y$P%ZSJl#+D>0OGXOGQZkk|Q5nlH$5t3h$iAN^dG3u$mgY*9GIs&?6z9ecSob}Dz@1r;8H9h)>;zNSJF&Ys5YJ_ zt|uf>UtMJJG>I5XfQN*=U8Px-{#rs20&P(zJLF=}EC89Dq{g>dIbPZb%LkN6G3mb2 z^KzP2d`E;vr#DOEa+8Rb2o%4t!J&*4%+V66d9?*i2I37cP!t51ry;o94S z6$Kx2xr)!Pt)JQPZ}#AqcdPb!T~^F%ai*N7enipzzBg6K+th~1qiG{50ezwp*Ws;! zx|c6~PqzF)(SYes9G)H)RK!~ZltS40Aaa;t;ehLVHcNDII%c=UC21k77^QLU_RX_+ z4hTI8b*|QUQ^0Q7pb`-~ZhKG#(-dUpY(kZVQtd7b4P!LiF49^iKc^~1Po z;FdtB3`J8^o^k{%d)Fyu>DywieC0!Xz;VkiBOM`p;P>9(%U)FLmK}Tf-mSlKqU|mt z>uV4xx3miXJOTX4c|{1sO#V&m^oTP4i?4vZc&1w}yyp}J#!YJX(@KZ`4z&$kfrO|2 z8S&%|+zyQ0G!(oiU-Xs>28;1;s%d&iyxAF0`CaURRd}L1>D$E;-Lx^=j%TA@!gFY za1r5X-2qEJy(PA{Fx0zZYv1R4ezJwu^rsarAB?OGnd>P3@Lue5CFDS(>jY2cHknsq z63xR-{&_PdYIOBQung@7J$Z}YN6@2HuPD`sBF`F~TDEqTPj+465lv^YTiGaOI

x z4D|O=V_}P|o&g`V<+|4cq&TC#<4I179&QEYM|YI5unHxG<>hp?CucZCWPQG860Q!J z*MY}ik5P6b>QBI9ld}Wo;62TYE_=IEthzE(Cvs=j{>|rw@W%sFN7*xX;>*C zPggaz&xZVT?u@tnvp9>SXM5AMq54u&e(IeSb*tq*d}mn}weD_4+57DhUS~XK|+-l-oZPd72RO zXL*`5l86R=M<|#mvF2&3R@|yn66q3+89no9Z>QwuNOhu!f6|6hrApBN)vqdg+17B` zxgDV)<=MriP`!xUt9-a!G0n-R$@W2efYxlVSGPy^;-@~hzjIbx0{U1@waHSt-zb9Y zAVB-TI`g__z1M)O7>IxLjCTJ0AiUPykzb%{N<}a1$ZD;Ve19b($__1jfvlWhqO+kj z9xEUEm%QO4Lt^hx66duYqZK6Ke9i7Py!Ka*E}Gi$AifL7I>T0{CfFvUgKz2zocCGB zbdH)ZCB>Vz6#85b&fc{Ts@=?NOQ36Pd$#t|k`Q2VF?ap%32(gJ4AxKg4%I046JHQxWHhP37pwyga>%~e`=9Arp^-unEwn02-{TSe99$k39;7~gr1*ih} z3!|;s$0gPK;3mji`#v=ZLLNpMD|USD?u)TJ#G*+Bf1@>1-B_?*e0=W5w24#kFFnkB zMT*l5+jlYVTl4I5I#2al__qWJDT(G;W1X0Y^K793;$v^8?t04l0&OZ}#V{EE3EL^n z4KLv3+Mi_g;+&T_Hj3W_iZGUH0AM{`MjO`Q8?g|{vb z&D|m9KiN8Bnf<1UQ>+A~Y8G=Wc=S=o^{9R}k{AnoMQE>GYo>#?74xyU)3V6)h71$i z$r8nTgFocT_*X~u!ZVyyBR*#6CvoVc3{m8R(G)!)0=M2j_`10x zS!Sp1o+^6xG`HtSh~KtBE>z*X&Q(Wx2G^Q#);A;_ngXrt!Uj|392{)o?1+~#LK987 zY+zV7?1R2Vsa6I3K?`MY{%AetlvG}u*6iPD-`(Kl+6y@(JWT%OIWL3$cbD_a@6AN< z)sBl$1&+1~cugpB^jTZd>dvXo;%D0|P~06DCb21tYZNu6_-*ubyYQ!;;`8@aIJ1N5 zT>J6orc}vE&GJE!n5ehiuK|Pjo%Xg@bPL|%Eg#+dfHwPw&(%_pt3oX)H^5Xx4x+bP z{|;4q_VsX@o#m~FndaLK4T$XyY|(P+wy6#0`r3X5X|PS$b*HB%yQ*}|(7TxKa@mEv zy>O@SeK)naJpJjimXZ8U)0tWLpdI&3NBU|WpV%@%+r>NTx9Fh!bjl9=k z?szKg0!cYAzg6uLYA{81wq2*C+te~L)m~%kt-0>(wNr}-vRM@-Ze z0SgF#0`!Lx(N$d%+#>+0&lM23Dx|1hs2k+J{Sh`4Sf0kSZB00gL% z1UN#4FCIpfB{8BTEQyJh=z|y@VyqPpC* Date: Sun, 4 Feb 2018 16:37:52 +0100 Subject: [PATCH 84/85] OpenMP flags --- Final/CMakeLists.txt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Final/CMakeLists.txt b/Final/CMakeLists.txt index da9611f..3b5b3e3 100644 --- a/Final/CMakeLists.txt +++ b/Final/CMakeLists.txt @@ -4,7 +4,7 @@ project(FinalProject LANGUAGES CXX) set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/modules/" ${CMAKE_MODULE_PATH}) if(MSVC) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++1z /wd4141") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /fp:strict /std:c++latest /wd4141") set(CMAKE_CXX_FLAGS_RELEASE "/Ox /Ot /DNDEBUG") else() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1z -Wall") @@ -29,3 +29,9 @@ target_link_libraries(FinalProject ${SFML_LIBRARIES} ${SFML_DEPENDENCIES}) find_package(Eigen3 REQUIRED) include_directories(${EIGEN3_INCLUDE_DIR}) target_link_libraries(FinalProject ${EIGEN3_LIBRARIES} ${EIGEN3_DEPENDENCIES}) + +FIND_PACKAGE(OpenMP) +IF(OPENMP_FOUND) + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") +ENDIF() From 3f44197a0d5da4cb7017ced132afc6751a869905 Mon Sep 17 00:00:00 2001 From: Florian Tischler Date: Sun, 4 Feb 2018 17:38:42 +0100 Subject: [PATCH 85/85] force integration fix comments --- Final/Main.cpp | 113 ++++++++++++++--------------------- Final/Polygon.cpp | 3 + Final/Polygon.h | 14 +++-- Final/collision_detection.h | 52 ++++++++++++++++ Final/collision_resolution.h | 62 ++++++++++++++++++- Final/physical_object.cpp | 20 ++++--- Final/physical_object.h | 19 +++++- 7 files changed, 194 insertions(+), 89 deletions(-) diff --git a/Final/Main.cpp b/Final/Main.cpp index 6f7bc0c..4a5d653 100644 --- a/Final/Main.cpp +++ b/Final/Main.cpp @@ -1,25 +1,8 @@ -/****************************************************************** -* -* Main.cpp -* -* Description: This is an implementation of a collision detection -* exmple. -* -* Physically-Based Simulation Proseminar WS 2016 -* -* Interactive Graphics and Simulation Group -* Institute of Computer Science -* University of Innsbruck -* -*******************************************************************/ - -/* Standard includes */ #include #include #include #include -/* Local includes */ #include "Polygon.h" #include "Console.hpp" #include "smoother.h" @@ -36,8 +19,6 @@ enum class game_loop unkown }; -/*----------------------------------------------------------------*/ - void render(sf::RenderWindow& window, const std::vector& polygons, const sf::VertexArray& custom_polygon) { @@ -55,6 +36,9 @@ void render(sf::RenderWindow& window, const std::vector& polygons, console::instance().print(window); + // --------------------------------------------------- + // draw custom polygon being created + if(custom_polygon.getVertexCount() != 0) { window.draw(custom_polygon); @@ -72,22 +56,26 @@ void render(sf::RenderWindow& window, const std::vector& polygons, } } + // --------------------------------------------------- window.display(); } void update(std::vector& polygons, const double dt) { + // detect collisions auto contacts = measure("Update: Collision Detection", [&] { return collision_detection(polygons); }); + // apply impulses measure("Update: Collision Resolution", [&] { collision_resolution(contacts, dt); }); + // integrate positions/velocities measure("Update: Integration", [&] { #pragma omp parallel for @@ -97,6 +85,7 @@ void update(std::vector& polygons, const double dt) } }); + // apply position correction measure("Update: Position Correction", [&] { correct_positions(contacts); @@ -111,76 +100,53 @@ int main() auto polygon_vertex_count = 4; auto scroll_vertex_count = 0; + constexpr auto max_vertices = 10; auto custom_polygon = sf::VertexArray(sf::LineStrip); console::instance().init(); - constexpr auto MAX_VERTICES = 10; constexpr auto width = 1280; - constexpr auto height = 800; - + constexpr auto height = 800; - sf::RenderWindow window(sf::VideoMode(width, height), "2D Collision detection"); const auto mouse_correction_x = 10; const auto mouse_correction_y = 35; - -/* + + sf::RenderWindow window(sf::VideoMode(width, height), "2D Collision detection"); + +/* sf::RenderWindow window(sf::VideoMode::getFullscreenModes().front(), "2D Collision detection", sf::Style::Fullscreen); const auto mouse_correction_x = 0; const auto mouse_correction_y = 0; */ + // --------------------------------------------------------------------------- + // prepare scene std::vector polygons; - { - Vector2d position(400, 700); - Vector2d scale(710, 40); - - polygons.emplace_back(polygon::create_rectangle(position, scale)); - polygons.back().get_physical_object().rotate(-5 * M_PI / 180); - polygons.back().scale(1); - } - { - Vector2d position(900, 650); - Vector2d scale(700, 40); + polygons.emplace_back(polygon::create_rectangle(Vector2d(400, 700), Vector2d(710, 40))); + polygons.back().get_physical_object().rotate(-5 * M_PI / 180); + polygons.back().scale(1); - polygons.emplace_back(polygon::create_rectangle(position, scale)); - polygons.back().get_physical_object().rotate(30 * M_PI / 180); - polygons.back().scale(1); - } + polygons.emplace_back(polygon::create_rectangle(Vector2d(900, 650), Vector2d(700, 40))); + polygons.back().get_physical_object().rotate(30 * M_PI / 180); + polygons.back().scale(1); - { - Vector2d position(600, 400); - polygons.emplace_back(polygon::create_random(position, 6)); - polygons.back().scale(8); - } + polygons.emplace_back(polygon::create_random(Vector2d(600, 400), 6)); + polygons.back().scale(8); - { - Vector2d position(200, 420); - polygons.emplace_back(polygon::create_random(position, 6)); - polygons.back().scale(8); - } + polygons.emplace_back(polygon::create_random(Vector2d(200, 420), 6)); + polygons.back().scale(8); - { - Vector2d position(900, 300); - polygons.emplace_back(polygon::create_circle(position, 60)); - } + polygons.emplace_back(polygon::create_circle(Vector2d(900, 300), 60)); const auto static_scene_size = polygons.size(); - using namespace std::chrono; - using clock = high_resolution_clock; - - auto game_loop_type = game_loop::variable; - - smoother draw_time_smooth; - smoother update_time_smooth; - - auto last_time = clock::now(); + // --------------------------------------------------------------------------- - std::default_random_engine rng; + auto game_loop_type = game_loop::variable; + // function object used to process windows messages auto process_events = [&, xs = 0, ys = 0, debug = false] () mutable { sf::Event event; @@ -211,8 +177,8 @@ int main() else polygon_vertex_count--; if(polygon_vertex_count < 3) - polygon_vertex_count = MAX_VERTICES; - if(polygon_vertex_count > MAX_VERTICES) + polygon_vertex_count = max_vertices; + if(polygon_vertex_count > max_vertices) polygon_vertex_count = 3; } } break; @@ -269,7 +235,7 @@ int main() } else { - if(polygon_vertex_count == MAX_VERTICES) + if(polygon_vertex_count == max_vertices) { polygons.emplace_back(polygon::create_circle (Vector2d(xs, ys), 10)); @@ -386,7 +352,16 @@ int main() } } }; + + using namespace std::chrono; + using clock = high_resolution_clock; + smoother draw_time_smooth; + smoother update_time_smooth; + + auto last_time = clock::now(); + + // fixed game loop function object const auto fixed_game_loop = [&, interval = duration(16ms)]() { auto elapsed_ms = duration_cast(clock::now() - last_time); @@ -424,6 +399,7 @@ int main() }); }; + // variable game loop function object const auto variable_game_loop = [&]() { auto elapsed_s = duration_cast>(clock::now() - last_time); @@ -445,7 +421,6 @@ int main() }); }; - while (window.isOpen()) { switch (game_loop_type) @@ -462,7 +437,7 @@ int main() default: break; } - if(polygon_vertex_count == MAX_VERTICES) + if(polygon_vertex_count == max_vertices) console::instance().set_param("Vertex Count", "Circle"); else console::instance().set_param("Vertex Count", polygon_vertex_count); diff --git a/Final/Polygon.cpp b/Final/Polygon.cpp index 09007f6..62e4ed5 100644 --- a/Final/Polygon.cpp +++ b/Final/Polygon.cpp @@ -32,9 +32,11 @@ std::vector> create_mass_points( area = abs(area / 2.0); + // uniformly distribute mass const auto total_mass = area * depth * density; const auto mass_per_point = total_mass / points.size(); + // create mass points std::vector> mass_points; for(const auto& p : points) { @@ -47,6 +49,7 @@ std::vector> create_mass_points( polygon::polygon(const Vector2d& center, std::vector points) : physical_object_(as_world_coordinates(center), create_mass_points(0.05, points)) { + // initialize shape shape_.setPointCount(points.size()); for (auto i = 0u; i < points.size(); i++) diff --git a/Final/Polygon.h b/Final/Polygon.h index b28fcaf..4d7a2ae 100644 --- a/Final/Polygon.h +++ b/Final/Polygon.h @@ -1,7 +1,3 @@ -// -// Created by ivan on 16/01/18. -// - #ifndef PHYSICALLYBASEDSIMULATION_POLYGON_H #define PHYSICALLYBASEDSIMULATION_POLYGON_H @@ -13,6 +9,9 @@ constexpr auto screen_scale = 20; // px = 1m +/** + * \brief Visual representation of physical object + */ class polygon { public: @@ -73,6 +72,10 @@ class polygon void set_color(const sf::Color& color); }; +// ============================================================ +// utility functions to transform coordinates +// from/to screen space using a fixed scaling + inline sf::Vector2f as_screen_coordinates(const Vector2d& v) { return @@ -92,6 +95,8 @@ inline Vector2d as_world_coordinates(const Vector2d& v) return { v.x() / screen_scale, -v.y() / screen_scale }; } +// ============================================================ + inline sf::Vector2f to_sf(const Vector2d& v) { return @@ -101,5 +106,4 @@ inline sf::Vector2f to_sf(const Vector2d& v) }; } - #endif //PHYSICALLYBASEDSIMULATION_POLYGON_H diff --git a/Final/collision_detection.h b/Final/collision_detection.h index ad9d02c..7c3579c 100644 --- a/Final/collision_detection.h +++ b/Final/collision_detection.h @@ -5,6 +5,22 @@ #include "ContactInfo.hpp" #include "Polygon.h" + +/** + * \brief Returns if two line segments are intesecting + * and stores the intersection point in X and Y + * \param Ax Segment A starting x + * \param Ay Segment A starting y + * \param Bx Segment A ending x + * \param By Segment A ending y + * \param Cx Segment B starting x + * \param Cy Segment B starting y + * \param Dx Segment B ending x + * \param Dy Segment B ending y + * \param X [out] intersection x + * \param Y [out] intersection y + * \return True if segment A and B intersect, false otherwise + */ inline bool lineSegmentIntersection( double Ax, double Ay, double Bx, double By, @@ -56,6 +72,15 @@ inline bool lineSegmentIntersection( return true; } + +/** + * \brief Determines if a point is inside of the given object + * by shooting a ray from the point into a fixed direction. + * If the intersection count is odd, the point is inside + * \param point + * \param object + * \return True if inside, false otherwise + */ inline bool inside( const Vector2d& point, const physical_object& object) @@ -93,6 +118,15 @@ inline bool inside( return intersections % 2 == 1; } +/** + * \brief Collects contacts between two objects + * Determines for each point in object_a if its + * in object_b and then finds the closest intersecting + * line and saves the contact + * \param object_a + * \param object_b + * \param [inout] contacts + */ inline void find_intersections(physical_object& object_a, physical_object& object_b, std::vector& contacts) { const auto position_a = object_a.position(); @@ -146,8 +180,19 @@ inline void find_intersections(physical_object& object_a, physical_object& objec } } + +/** + * \brief Collects ALL intersections between a and b. + * Does a bounding sphere test first to improve + * performance + * \param a + * \param b + * \param [inout] contacts + * \return True if a and b intersect, false otherwise + */ inline bool intersects(physical_object& a, physical_object& b, std::vector& contacts) { + // check bounding sphere if ((a.center_of_mass_global() - b.center_of_mass_global()).norm() > a.bounding_radius() + @@ -160,6 +205,11 @@ inline bool intersects(physical_object& a, physical_object& b, std::vector collision_detection(std::vector& polygons) { std::vector global_contacts; @@ -184,6 +234,7 @@ inline std::vector collision_detection(std::vector& polyg auto& object_a = polygon_a.get_physical_object(); auto& object_b = polygon_b.get_physical_object(); + // do not test fixed objects if (object_a.get_type() == object_type::fixed && object_b.get_type() == object_type::fixed) continue; @@ -192,6 +243,7 @@ inline std::vector collision_detection(std::vector& polyg if (!intersects(object_a, object_b, local_contacts)) continue; + // add contacts to polygons for debug info #pragma omp critical { polygon_a.add_contacts(local_contacts); diff --git a/Final/collision_resolution.h b/Final/collision_resolution.h index a9fa9d9..b0914f4 100644 --- a/Final/collision_resolution.h +++ b/Final/collision_resolution.h @@ -3,6 +3,18 @@ #include "ContactInfo.hpp" +/** + * \brief Calculates impulse norm J as shown in lecture + * \param a + * \param b + * \param offset_a + * \param offset_b + * \param normal + * \param rel_v_n + * \param restitution + * \param num_contacts + * \return Impulse norm + */ inline double calc_impulse_norm( const physical_object& a, const physical_object& b, @@ -25,6 +37,22 @@ inline double calc_impulse_norm( return -(1 + restitution) * rel_v_n / denom; } +/** + * \brief Calculates the friction impulse using the tangential vector. + * Friction impulse norm is calculated the same way as the + * normal impulse norm but using the tangent instead of the normal. + * Distinguishes between static and dynamic friction + * \param a + * \param b + * \param offset_a + * \param offset_b + * \param normal + * \param rel_v + * \param rel_v_n + * \param j + * \param num_contacts + * \return + */ inline Vector2d calc_friction_impulse( physical_object& a, physical_object& b, @@ -60,6 +88,14 @@ inline Vector2d calc_friction_impulse( : (tangent * -j * dynamic_friction).eval(); } +/** + * \brief Applies the contact impulse to the objects + * \param a + * \param b + * \param offset_a + * \param offset_b + * \param impulse + */ inline void apply_impulse( physical_object& a, physical_object& b, @@ -71,6 +107,14 @@ inline void apply_impulse( b.apply_impulse( impulse, offset_b); } +/** + * \brief Applies normal and friction impulses to every object in the scene + * Uses a fixed restitution (0.3) if relative velocity is above a certain threshold + * (0 otherwise) to reduce jitter (restitution slop). + * Skips resolution if objects moving apart + * \param contacts + * \param dt + */ inline void collision_resolution(const std::vector& contacts, const double dt) { #pragma omp parallel for @@ -83,6 +127,7 @@ inline void collision_resolution(const std::vector& contacts, cons const auto n = contact.normal(); + // find the number of contacts between these two objects const auto contact_points = std::count_if(contacts.begin(), contacts.end(), [&b, &a](const contact_info& c) { @@ -92,18 +137,22 @@ inline void collision_resolution(const std::vector& contacts, cons assert(contact_points > 0); + // compute relative velocity const auto rel_v = contact.relative_velocity(); const auto rel_v_n = rel_v.dot(n); + // do not apply impulses to objects + // which a parting if (rel_v_n > 0) continue; - // if relative velocity + // apply restitution slop const auto restitution_slop_sq = 0.5 * 0.5; const auto e = rel_v.squaredNorm() < restitution_slop_sq ? 0 : 0.3; + // normal impulse const auto j = calc_impulse_norm(a, b, contact.line_offset(), contact.contact_point_offset(), @@ -138,6 +187,12 @@ inline void collision_resolution(const std::vector& contacts, cons } } +/** + * \brief Correct positions according to penetration depth + * to avoid objects sinking into each other. Also + * apply a slop here to avoid very small corrections + * \param contacts + */ inline void correct_positions(const std::vector& contacts) { #pragma omp parallel for @@ -150,9 +205,10 @@ inline void correct_positions(const std::vector& contacts) const auto n = contact.normal(); - const auto percent = 0.3; // usually 20% to 80% - const auto slop = 0.05; // usually 0.01 to 0.1 + const auto percent = 0.3; // usually 20% to 80% + const auto slop = 0.05; // usually 0.01 to 0.1 + // find the number of contacts between these two objects const auto contact_points = std::count_if(contacts.begin(), contacts.end(), [&b, &a](const contact_info& c) { diff --git a/Final/physical_object.cpp b/Final/physical_object.cpp index 0cd9933..8b35d74 100644 --- a/Final/physical_object.cpp +++ b/Final/physical_object.cpp @@ -38,6 +38,8 @@ physical_object::physical_object(const Vector2d& position, void physical_object::perform_symplectic_euler_step(const double dt) { + // integrate position/velocity + const auto a = force_ / mass_; const auto a_m = inverse_inertia_ * torque_; @@ -52,8 +54,8 @@ void physical_object::update(const double dt) { switch (type_) { - case object_type::fixed: return; - case object_type::dynamic: accelerate(gravity); + case object_type::fixed: return; // do not update fixed objects + case object_type::dynamic: accelerate(gravity); // apply gravity to dynamic objects only default: break; } @@ -61,25 +63,24 @@ void physical_object::update(const double dt) update_points(); - assert(std::abs(angular_velocity_) < 100000000); - assert(std::abs(rotation_.angle()) < 100000000); - + // reset force_ = { 0.0, 0.0 }; torque_ = 0.0; } void physical_object::accelerate(const Vector2d& point, const Vector2d& acceleration) { - accelerate(acceleration); - - const auto offset = point - center_of_mass_; + // integrate force const auto force = acceleration * mass_; + // integrate torque + const auto offset = point - center_of_mass_; torque_ += cross2(offset, force); } void physical_object::accelerate(const Vector2d& acceleration) { + // integrate force force_ += acceleration * mass_; } @@ -90,7 +91,8 @@ void physical_object::update_points() auto inertia = 0.0; for (auto i = 0u; i < points_.size(); ++i) { - // transform offset + // transform offset according to + // current rotation and scale const auto offset = rot * initial_offsets_[i] * scale_; points_[i] = diff --git a/Final/physical_object.h b/Final/physical_object.h index ec698b0..2ac1103 100644 --- a/Final/physical_object.h +++ b/Final/physical_object.h @@ -15,15 +15,17 @@ using Eigen::Vector2d; using Eigen::Matrix2d; using Rotation2D = Eigen::Rotation2D; -// offset, velocity +// stores (offset, velocity) using point_t = std::tuple; -// point indices +// stores point indices (start, end) using line_t = std::tuple; EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(Vector2d) EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(point_t) +// ============================================================ +// utility functions inline Vector2d normal(const Vector2d& a, const Vector2d& b) { const auto dir = ((a + b) / 2.00).normalized(); @@ -53,15 +55,20 @@ inline Vector2d cross2(const double s, const Vector2d& v) return { -s * v.y(), s * v.x() }; } +// ============================================================ + static const Vector2d gravity = { 0, -9.81 }; enum class object_type { fixed, dynamic, - kinematic + kinematic // not implemented }; +/** + * \brief Main class for handling object movement + */ class physical_object { public: @@ -105,6 +112,10 @@ class physical_object : 1.0 / mass_; } + /** + * \brief Scale object by moving points and updating mass + * \param scale + */ void set_scale(const double scale) { scale_ = scale; @@ -134,7 +145,9 @@ class physical_object private: + // save initial mass to allow scaling double initial_mass_; + double mass_; double scale_; double radius_;

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ⅈ)p=x# z=48tDX9oFnYXNDFlhVI%z)TgGyN?!n?9JBiDBpoU;e|rw>=^l2Ozb0f5y?vr2cnJw z@NB-F0@=I}Qc^Pa+UN=B2lgfu#K+NpWJELP$$u!kO*fM+3Oit&6R-VLJHu8LH_0pxU?q2YKe?rPRdm1$a8v%`8C6q{j6$2q?~ZS*!!6QQ_!Zz^-co z6qq^xKI;3~vQ4Y%>onoJOVIVlSTiOOuDK^i|Lb5?>kH}et!WrGGBNwZ<*JQdyxQI8 z%OtWxHugak#m1(cla9&Od8M5S@fL(ni}yCWMTUK#I8+t>ej3hH(g8kM2}o+q5s*oNNVx90n({}G{Kr|fg_66IBf zoNu=`)%IQHIA+?UYf@;v*IuX12K8I5PgUXWFp~~ljf?T1C4OsD{&py29$2SW>>p3u zYtrIb7&PZK)raL3;w36~=j zLlkD|KIP6$&4WnEJyR$h15Cvg@zfFn|^>>S*2FLmj?uJH5XXCJER==Jn z=fr)_Z3q|{|JGpLz<%MAh}r$ktzo5_68}UP3;Qw`V5FBEjOg}qOqJ=1=|Hr5b$BVX zq|uc&oh(nyJbc+0dr{t#h;>L3c79@-BloIjfjcFqJv-xLb(B0lsS zJ6hc7XSq}~ZO;CC@VAqWPic~cu>;YZo5CVk-AmDEdg?JjlM@f-B4898&A#KDOBiBvVWg;260uFj#h+rca_0lt7eH6td6;cJtPoAeRNZJ zGlRHn(GSIqF0fDcr}V(}fI{K%9Tv?kxZB+aRfADAh&M;?ub5xAj-^2%nf_+DmLD1; z)p>bF2?U1dC+H`an7b7=O}~f;n7QeRuv{pnGno#hf`(1VGD%m9qJp32f&yc|x-Rc@ zt(mzT17ntW8fE8nIk!uFz3m4873*Z??Kst58#C$^s^?YSEjaLEc4u9>;hWB~icY_A z^|BmD49VD@f3oyY6hA*;)#>0HuSPwxpjxm=HL4i*cpvlGjkctsS19Xr+ihieiUX>= z2GG|tkdzys%b}`PwR4`ptZ#d2-bSaZ=*!CGm#2Rp%gqbJtDc%p{;9c(PiXt2j0;=RWARPbw8Ug@f8Lw6fZp!AddqAqdu9d*_fHR^ z#g@wGds&g2Qj zMVIj=C$l}6XbWo=2Dia6%`i+bOk#fB-bV683r#@NryIDO?HX}0n_0Ct^t1{^`^vaP zc-1G4f3>v<9$a!bwUjhvGz{gj;q_tvt8aWyLcS$m5C+N=P;_`lMK@^0Y3)=pQ~l7V zQ&KX^mbrMS-OQuISgb$Z7EqQ3e6H*!9y%@3rLFql0aDYn+fOF``2hO}dubC9OMXCwfj8O9|yLpu&f&reW5`?q3fzX?`Zh;0r1x4sL}LUoYZ@~ zidQ{O5mz7Cu!mkYI~<=8d6~}aJEtlm(EQ*h-2d2~ewLii@4)|?cQy*8}X90Ps&;!fi3MekUy*oE1&px`0rRTcza`rdL z>5DA-JZkspbK=4dz7r7%mib(E)o>jWu^haVJ9tm8e4AA1?l$}*nk3yIaM$Mgh$?io zfHA@Wx74zn&h&A3(A*{4Y@7lQPZP5oj&N_IT`3=*WG6oIaWLmjynI0W$c-0I)zfmY z)B4Dpx4n!7j(c92;pE+AlBR3lJYLSrd;fbNz&t~S4`9YEuXg3lJ)Y$|GCq1JXR(`I z`ktRz6`5$Ms4_-}#k}CwS2wP!#eyB>q)0fhI+!v`FWpshRrE@q5j-|IVZGp zBSnW|;XJ;J)6gUu;J5Le=G8Td^{-sIE?LhTmpy1#IMwsUzHo>A;!!8XxZ}83p6tqs zK>-E#Ib2{OWNzPEFRC`nJik|wrx4EIDLvG-UaMUk8FSg0=KjC|bVltLFy+Y#Dg$DOoScDLK! zd`(>*StDdEUFMqE_;(%ZCU`fKZ!H;o?_xN0qY884O4u^_e00_^d!0F4=zxKo1Kplw z2dTQ(onbaq8UZwX>k-u|o{=^|d)s6j#kCFr7@yW1h+7 zjajeMve`cyyzekwozgt8($Z2iLEXiIO!(7#*D@oIguKzT@9U7@Z|NEEoQR!0UWi$b zGqNMTZJMDWG{Uz0#n5TXMk)!Auy^ioKZK??{xtBr?yL^ry4f8Ntq3QQ4~vhi5R?=l<9wy%CuCjZsu-1s<7Z49`lB_%nMM)R3a@8Gx;9=jh0=4Qd~ z*!YfKeXqd9RrDwcUBs%cgpu82dFn}Ui3Iqg;6m2p5pmEbR;?hK;OxR?R4BXZ_SxHrP?Z=B z35x`cY%!&xbfM)Fx!L;aBy?v)*cD8|dgHHg)MvCPAxjTRCI=o7q*l z(0vktPTYQz&gW1XkWtO>#AgaO@#(|rZrn8TD`mjN!g_7K#1*E+v}-+|(PhfO=p}7^L$8Em&K-FWLSisppP-zv;)wr##%qr z`X%vo`i4flr6wF|1LeVY`GY~5X$NRawsRHy73+E3O%8wk%zog~! zmSWfDFB)no2uC)`k(TZ4=}gXZEjw-+L_OK zq$V}*w#jt-BC5n+=eCG765V4t5DSeAZ`6 z!IS1-lyltv*|VH&ad+m7TYp?>Gn?(KY1sd3nTotPYRO>DmL`qizWNAItKLPnDuU*n ze>Q`kk9@@4S*oVQy%RGMgr3~imCk}Y{lvxNQg+!OS+pzp3E`WktZLA5X|aCjuZUN@ zaq{y5gTjXw#>L29Js~nzS;Gb{4&C$dydL-yfQoZrr10~ z9lo&W4M5T=?=T-NW;jBoTdcw9IEo0`U*z(%3K1>zhIv6L;&l#tuWU0F%u&$mTJ76*&9+N3#ZtWC6qgZLqeOnhekk?Z;aS%kQh13* zy~(KV^Iq7IJ%M9*_~gRm$3Qyzy}1q2RTvIbRW?6tVHW`CrgaU zaF96~{W*s-rO5cA+Pz4=;7NF@u2*a7*66w-Sl}0?XEQ1Lli9S~qOw|$L!mp7?@%06 z-m#SaJ(=Ur-{SnSl3*o}yaBf9z5`u|zNiJ|&+)g{9_jC!dZC_;^>df$5MKi73YwnF zo+VZdTkVyc8k{fj*Ej`)1-wZi+fX`l?)pv%MlWIU_TVnAAiVdqm`2Uy-pRHGf9suH zXz^I)DI_bB$YCy?GafjX%lohIa$=B}<|jOO9eT65$d!l`X|U71$A@F0H1byod#r37 z1|wjvZD5Ko@9AoixKdpG=&}}(Zb*B7(TMpre!iE%ZCN1s69Sl;c{OjZ_KM-S0?D^U zl~6O9g3a*Fsb|g0JT?e5Yo*zE2E<(o7c_5Ko)#pc-&h)TSt>K@_FDss4p_z}mf`Tt zxmDie>>o(h%g~0Qof1>_7gk*|F^ifgGS=aQuk&tUw;R^C!K z9M4KMR#4D$RWq95OyTOhln9!Tb!knfkz!1fO^9jA_vLv%EjiTJcQ>wuK0ZNh|Dv7R zi{=1%L6|XXIM@!>gb##7d@LdS@vIhw_tVR-4a z@$W8U5EHR2yj`Wdy22$ncU31S)W_zRt6Sl_*9o1yB{V35f?><{d53qh-5_I&1ni=x z*T!P4&2zgv+mDJl`A_G$vnCT0*A~?7nL1lXMZ7{v7lvF9r@+fwTgT+h3F%ztv0LHu zWemt5$VMWU3OZ>vK{mr zD@*+QwN0_d{Qb3wj~L5pkB=3e_m?o|dWj>+ZkuwoD?J~RuZc9O%JGya-lcA(Z%4*t zbjCx^^uxhjpVpX-psqF1(*gf7GJB+Far7w}u~UoBWD zV;dt!CkJDF>wl}Z1{SbTOss4K^aTG_xw+{?&8?h_9q2@@^qq`_jSX#$jOnC|ZA_ia zzJEnx<>iHi`u~QzWorNFvlyU<3Ay%x!d(}#PoHps@SkHG)!$TW2Dh^!WumT^&lKA7 zsYmBb?FD=J;=9#+o!9323we(XzHS)somo<=e;iG}cPxQZb*EF>Q`LqmqqMR2qnRX= z3oFn9YxbImHk^%}yN!NF{#4avG@FdwOUL8%jb+$2GY(0q+`4b~SD=nmXBwse`o#jr zocEec|2qe7bC_Jp=R5W=Sg0g3+Ujgjd0C-`S$2^|@WJOP7faORgq;f?Z&*k5S$pf# z)8ygxrqF7V`rky{L;{Wg^3EEHkkm3SpC91ww&ec@wAlZz&|+m}W@q|;p<^ImVrF4y zVEo_VyU2pnLlJrW(p7%KX(RW?F^ZRx4T*{;1nEbFU`WdhLxdpF0}CVx;^#-8&vgq` zMi~Ki)>hG0AyF|LyPlTmO^N}g{zD-LOI1VV^KV;C6L3#G7QaJmMW#|ysr_bn zZ%sF%o7YBbdD&24cWMUAU)=K_w7yS?l#0^FN|tq0iC3oNsXr z{jf!U)TUrhtCw@Px{oyV0(gPwvsp}UH-ZbUW$b>k>ANGIZM+^0(f_zm(;-PVP3zd{ zAEr50o1{UNU3#}x|bzGTKd(zDy`7*cG%zITH|{IaZiIIq`~fK zVf3soGH9)H(p#E~VuNvU9ftxsad;~xmRVaMS|i1fQzP4D4to=*=hmI>P} zNd5@Oog8Max%V$p7ufHIASBRU3vRL1lx;BBz$1) z?(uCurk$Q2159?BvaG{zyTvxm9s4OOJsU8GVhy-G_$r@BZ}2Q$RMarexDWvZ-z7|M zh0|KG^xUoxqtd&i8bkmgFUY@nENU8v*#_zR)BkT7tcj~t+{xCh=YAO&@U?wVgqgvy zA?^X(x%}H5N7evaI;szN7!Q`X185>>5I6Z6BH}@7OZM~w4a6R$Hd{KTKk?+}a48Gq zKTJF)0X8q?2&}{Yr0%Pr2N1+?ApMro`$IB(>;7x(#(WU%dAQOab5a95NFdb(p`Q?k z1&BzFm=K8tDqpU^IojV$33@PhIREp9JwoIf{GQyK5Z{8^!ZqQ~*8(y@ZVRL{SNb1F z44E*%^j5(}3n1`^8I* z<@_|@g4cdxfZHr2l$`^WifKbM(0@>y z@qhn2XOLRu4I!C}_+XV9xmJ0uU^dU|XG{16G1vVdBP^1xOrwGN!p&rzCk+Kx26=rV9vi}L`*4)2Vb8S6o+ zm3s+9rxoUbsue_`T5uI$xnrs^|%g=ikxDrXN`C>(7_>x?{5tZ3llwri~x$TpHWwy@q|m zz7hMXs?9b4T&lS(Xv z^V2r(6TdV1)mFPF$h8T5hsq89!O{)?0sEV6%@zMw+za6kJeR!B+;f4I0v>SOT6E<= z-~9PhpNo@O`Y0iPYCkEyG73F$UlXZ1}z*aQL2wkE!^2 zZseXPH2SpTfx-KU(D2p9TWY&1_Ot^Y6X1%=T711Qa-a2@+T8#jb7~uGCgqzn?1Tk) z+eqD7z6QKqrG7d-oiY~#Qnx-*KQF#|Q{mY61g#W>129Q;9AcT+i>v)OexVUO`_|q6 zk2Sg>X5;BhK^B9K{0-rZ`X8$(D5=C|&ckDb2r`ErE(L}B1zCKo9#fmkzoP%r7YH=f zfbdmxZ;(CYbzyN^5hz9$+z$00Lzzd~p3&GVq@*SnMG(d-t>nNyN`UFX3^Q3N3^D}t zUUEmxv+PIU^Rtkct;juD7Y;88=Zx|{Mm8w7IOJs2Zt@%S}eJp!|;&hX{b6soN}kxQ|^05x5tjmMBa$ zJsr}FxZg&_U9)s6letQnfW($Vy%lggEygn zdROf2oqUc+%0^x_(7%sjVY9IlGMZ;G z;QJXbklP;rE;qk#LA#ru_tr}<<*NDZj4f}?q|ffH4ch0S-%*Et)zIvj#a#~lcl_zq zL!`fZa$zop0D^aVl%m478={BK+S(dwE$DwGxJ>rX{B~{s&Oh+SUgEzZ)cV$!FSFbZ zHok8ZpGGTH2$1qUb=EkmsCFPCKp{R!!31H3V}CTjg#{Xm#DqLm35dVdx4zj9ow(fe!)w5~%yHG$ff_pU!yp zPUsJ5VE?NQ;{OsjnNf}T&&h|BH079|@At{e6y>*TVcS1k%oKL%QgYRqA_qLroDLyP z{YR~j;wSzWMC&pd1+@M11Q@;-!i;JuD#T6l_->LUukD}k4;o*glGiEYGFPiX1fP!7 zVm6%jYKyz7ztx7)|GPCZm!#MJRQHztM={Dhp$HJc?!RfgSM#g?v$=9---_x_H);RT ztnan7kZ{{O1*vW#|JRbV+suc!g5DojWbP}YexKqfnz|W(ha6<5Xi;84DSg`q82E@) zxQT1XqGe5lLHXIpqQGIi4vqJ-u*!%38qmW@n|V=J(1`ySBojW(pA>%_o;}lj$H%n& z%m2}FfxIV4V?e&_Hz&uWIl!&4{|Hxj%7^v8ws5lxZKtrhckEw4I2B4He-@9V7{CZ! zc>T!(8{|r-N$n@ZmC*lAbh>KSJXcj{i52#em{Vx(>GS@cdu4S&eMe4D48n+U>{s+P z_#?~er0&drSrQ)A;dzF87<8!kQEf|KYwk@tCe?7M{R*H;Yt8F9wkKjrqh)vW?k??k z%sibg@3_`jwwOSM)&>nNGmf9ZX5w@;ia6jH0y~8l&$5!laWaUUi3yB*>N1p^oNgeE z_a`wGVY^3HtCEzAlai5$d(w&#%P5=)L+j{QjiQoi79|%hc}^zjUW|uSDIZCmj52*0 z_ll_UnG+M~%6xRPqmRMqqh>pB@?`#jkk67{(PUn!rX+4etaOf6;I5?vE}qC{NhtZr z?)kkPO30r&Val9;%m+mfCcY;3O{NXUZl$ev2F zTJQZ2S?USPL%o=OiL$Ync}8cy0;L81B*yVG(~6`7%W;V+mkx5v+HnaioCYO3lnMsg zO%RFu&C+3{#lmaRH1Zg*Y6T5&+gqK>hTcj})dQ=Mi`O+QcQJx zyfL#Ebu$g6>c1cf%iSmNs}8(Z*Pc0)rKROZrb^so8sI|TKaW=S9Y41Y)UD*_hE9Pe ztu#MmcUoEbbZBSpRCw8>1|v2ZJ4EwU_flJ8w>D_wB`t?%(r9zsDvHQRs>sa zjSjO2ZIbS_E)tu58X}g3D;>hTGo595G|w0f>y(wy7il#uWL>Drwr=_aVZSs28&GY& z**8pEl)G2&Jg?-s$vqHtA*raj{Eav})vbC&j6cPApq+mVBf|<=rB;KQ z4KW+hYXwcLhZsvv#(0lRbjBoM{=f|$?HRNWdNMx zRff4dN_LF`d8#PMTemJKADk6RSb)VlW&O$y3iVh)^W<55Q?XvoGXqw5#@R9TGra^?;!0fW1xG)WR!Vr2siLDIv+&6MRoy^Z0vcsb67TIEmq zvL$fd=PI65cAE)gGL%_%-B?Sy=Lo@6mG51B&m%d<)woK_<@?SaIBVhcQJKc)Fd|*c zMUUNfcfT(q7j(;StWF`axkP_z!c|spapp5yrVU&PAZO>bkh0?Fm^B13yA65oM{%Mz z3sGG%Ft2^S zarzCKaS+c)i2pIkYFIu+p0#o%Rd4Mpg$2SjXKyZ-LABT{&nX~bjcw`pMk3~^B-z9fZNBn->65IbIUgQm<^k?KZm<;U zpb>(Po6=NLJ|NK#Jk1YPH){M@5n%vhWyggAPsvG((WSVxsP)l*I@G-O7H z)jD!;E#JT~qQ7nUX&*Tw+IRTr#qqiO@nj{lNu=av^M<~C>V%{lo3G=Uwl(M)#X3eK z%!cN>tvPQ!c6!ux&lKEe>-bs-#uvVR4mCd`{NFDh3z%-7$!lNqo(=uo0t$%{_OA5wRm$ucqSsxFh7=x z6*>L#+g0$;9HzhU5x0K1v*PV8(Y9Z;p~D*21x3wrv+zZIdZ+w#LOHjXrx`UJmbc7s z&)JyU0k?U1qU5wPAxCq9^2yzfKGy{&G}kt#oX>Q3Y2AvAzrA!s-Hb|llk&{;Cyb^$ ziLc^~?r(|n7wD(!rZ3zF^L@^-Y)jE(sfwZ5_j{R;vWnv&1;4K`mS~BZ)+^y!q;eQVi38x=K?$4*tF9%Wmstp zW!aX{#9W^osXhU<6hEUetw%$<6yL8guNIln#62!*sMtvV^qPBu;fiGGp54Sfs*$c9 znb2fZo9tgHqTgnN-_jC|U+rn!zN|w+%Xu$L**ixbvR)^0xpI8TPG%*#86pEPv|(15 z{}=|I56aofRzHb_ADd7QN|{M$-A!=A$_~OkG2#}GHDL2Vf_6uO4ilgeW<%aYb9$RI zKZ!ESib2(_vV^fD{QEZpv@b~E4fyPgxnx>M#!w>%_&RHy zS=}PodJBc8HGau6I~bpY`@&<$UV?hYC5x21Uf|_oB9--w@!MqT-&DZJ?0VrzF}9-U zI-Zvfo3=k@OXDgn+7{Tl2*tjYY4HhW^k)=PI>S*+owU77OIFljQt@PcTSna^Y;%7i zlhun)MVvtfY;&F(XbN9ycoJ@6{`Ep!2*tTIaf!^-LmkD?qa;>^Igv7+B}zPPll8fsC=-9wtn zaM^=i`LN<fd>r!fHir zzIYTA85)&kC8fp2=+3Xt1%uf1f>0LN0n{_wA*D&tM^G*~mG(GqT5j1X(K0`8c~+4^ zNzfuZ+2B}dz$L$aP64h<){HY3laC}cm)xYePlx8a3uY_N8Y~LlT5zyHh)oJ2TJidr z)JhX8JT;XyF1uWdxKgfqi@A&vT$4L5ur(v2Q$`S)n@)>6Z=T3XDQLU61XOxq(Fqwf zrh-!fN^)g})Y}|M2jF1bZ!GCGo8+-TI%1p5!ZbyCL8j3jmm+$I7Tps6+`JSOpynJ? zFY4rcrhLpy8qVcV)YJ#y=sB#+SezyC>Lh<)$C6wG6DynNY;MlD(1_z%l3#;rGG1h< zYPuSpZ?3zlGmd#xkbP?%M{E;#YiF#jK}_02QK5jsCVXU}ZOORMisO;Fpi=#(SY~== zcGJyvco<7pU`FteHu>~qi3J(9R1Lg6?}1G00d>L0Hj!&vZ3eZ_o)h#R$`j)bS)g#n zB`GH=lhohLBdO0BRM#_6o$l4SoRc+IGff1H)x{Xt(P%Gq!o-gsCB1&7BT8wsOEI_V zYESWjA0?Gtz0MyM{Xn%aQ4ZD!gYT&#LoQwl7gD%upC=+3_gX{q-9wO?L=KNfp+_-) zA)=wK1l-)*^;81r5LE@BeH*jd04oY+kH0N6L|8@;^V%I1%#gR#!mlGt;PLdB9P5s% z896I19sK#=_EI}G=8d!RrkmB)PTyJvrPDjoN&L*HRda`u&xX#X{vQB(K!v~Qs;w!C zmPSe0P=xo+L($JdKMVaF^mC+acbwBE@myP&IoB2uUTQNLOKn}HdR$=G1Ow0|8}5Yx zvJ;X3v=7mJB>awf+D9T^`1}(bHGQ29U>!Wj=D~xo8J=JVaI1%5BdiB;S5*qP!i8`n zT!G(|(=p{rn1UYzrr*d0XzL*x?!fQLJ76o?o(31gCP-jO+Q)DStdw5CtyV%5q~pO< z!XmhaovJN^TG%093b}A9oCS+ni&mputKFde3GRlC(zDt@h=62hz|U6gGsBzOyVwA= z@H@B}cCZ`59sxJ*r3Eej2xr4B(hQktbG7fV26i|X>mb7f*vhtW7na@#AF?ENp;UsU z+@-17Q)ra}GoT4>flX{A8^`U2T5W>16%ueC%dym(p$#_R#|MwY+bq&>K>L$+00zKd z7>~!Z9$sQwq>h6tItsDH4A@G8U<~Fgg1^Euu$?*B-}oX!q#?)PHk_}$3jJXiOvT#X zi(7uczUCL>=Mw2@xm+uTXl$43MQg*~VHZng*=!P<#s~35{5I)qFykJF;b%6?!}h)j zOMf3b;|3ndw@G)&56IseQ#*EQ(RfCj@CW!K{EbE7kt(d2{f52H_V5xulmCJ5mTr{q zlV3K~<58ah3*j1g0KR5%Y&4t9PG?Q*LUskap54s0vhD06Uc{^UnS8(0BrTC1my7XJ zB{$2L8ZI|nW&Eh4rsJuOe{_7UC z*;IA`elBL$ushj0b{|`hd)dx*vybtM?MwDO$FFT}sYVtf_OZK_#K4LaQRsKdi>1C^SuUp+{5q+i^R4|W|^#j zor*0plg(#K*m7*i%h)aKZoTdgvB$8L-eCK&&QUx?uk#Q-k{9zy_&I|&@+Ek0cLQI~ zU+3RRCMiOSk>aIHX`D1eYLu2r=SgcMReDi+PueYgCH;UOO%9iBa=Pr4UGg}2ro2qP zP5w~+&`@i5!SGLGxN)KJa-+}qIo=`_m?}+^O*2fZO&d(Fn(MH4J_(P&Uk?2@J+@O? zA(cswz_on1JOH1HUc&x76J|>jIQCS&j;-PsvGshQVYzWEAIm1f0ojRd{WM?8zv5%1 z39N!u!F)cIt?-bvgk1!W@G^k#@6A_ZKc2|$$8n*W<*;ug z4IhXnVlT>-_Q0iZCVvz5;dQ(Ue$QshbKzPT&Mt%x;U2sy1{uyWW*Xz!b9|oc<^9-t z;PQQVbYs{+CK>v}Wo(9Yi*Y}H3zoq)IUL@X{*1NX#vhU<$OjBlSQB0W7s2JQL|Xyp z8EWL0*<6s=G{}&5;^=mvlq1{GzXV5>S{&0h;MKhe$AKbg0;VKk&p8$Q#Z(+2Zo$t@ zI8MmegXZBiej1KqFTr|aHTS_>Lo~xt2S9$IV+u^y?tz=Nxp0@CF^{qAy$AO~;lU3It*t3~t`l=P7{eo8 zkizl|qvd=UjdoH#=L%!&h4Ao*74|!B!W(t0)r|ZJmVK7JSj1k-XHZx;!E*2eyh(32 z;0+YB2~ z3p1M~iG#_UA089d62`;uPRAV|6*D62eJ08IoVlZ7N3a2rOYTh)Rd!Ge)>!Lz&BEbw@JU6b=R>K4$q3!17e$82tdS?$U5wuglq*_1>_pL#1|> zc;GqU7W8XJqj(2TUP zwW34%@1n5XQ1d&ZGxmvFGtoZ__3l}6o_myJHQ@uQ0UuFi?y@2!TvO zz(_&@2?7Bs2_zxGkkBNAN5!(qZph-24Vw)yXw}aLC`z?fDW%kYT13icEh1W)QbmhY zDOFq0zeTH7X%#BAwY0UUng84~cXoF+8_1I+uxGOOo^$6u&OP^>b04$W5kJ{S5zx<1 z^3y41jG?zR7NaVPaJ)XsU?%z~KH8wA(l=PC#0?+7!{w8g~dWn`e1W{}a6h36;h1cO1lSc{AbLH=N7Ihe+7Q7?e$Lm> zujTMH`6hx55v{CDSS{gbU(RNqMWvZDd$!b>6;f}4wh*K9Zy~%zAIp!{tJfJf7+(fa z8cU6(7S)yN@up1kQq|Yg>r6M8H=6VYUZc-5O*2>U*Qg40`TB*Xx#sAt{C8DbbX)Yh zRFCVlF}%fWo~+?xH5y)TG?^xA^nmJ(m6l2_pW}JGJ}TN^FqzC|D;=kmF}KF>G41>= zu)ryMHG+OWH{}^)6gWW1x}u{cql&7D7V?d^7&t>ablc1sATPfkA`3?fqQQh^b0%oc zVCFxqA%dmJ%31gGH9r+JD>b)jRN#AeJ#Cw{EFohQ_*L+%313q4I+HlcdIqS(AoAo2 z>W5~d&yuf1>zOkfHCY)Ozj0_|RsxNtOopAG0d{_4VdwV?ViZ3IjeV2w;+r#O%vi=< zv&RVc(!aWV4?k~D{-Wie&?fP-r_9mxCT;>v;_+uw^30hjd8YkQbP}@cnexi0euz>huxe)Pv+l?f!3zXknh zN{qqG#Y{_Do?NeAldO)iqPk+J!!Ql}Kl(CY`79zv88OI6%zp9xr(+VQLj3oqQ?Hn6 zqx6_7rdnBSVKLnQ{nKM6NcSPXmBsXaekma1%?pwi2vvq_lh!18qi!&_S?-L!%kmx5 zk1YEwADKV2Si!^un0+!rT|84Wc7l1kcE9)$x)H7H-nI0Ya1`yhR!c>s zT_L13rQMpQN=r@PQJMGEB*>FTLbTB&%^3+7oHHapNVI6`;iispvvx_dt~_}xlxB|= zIDL#dnZV``s>*Z*iOB;80rT_hyln6coGm_Yqd6->^9?JgHMc@>NI)IM3Q*YmXnnpV z&tjcviJ4RCOXKP~8bXJx|y#>|tSvAk=Uemp+6Lsoj-5gzoPNf@5`O+m&-PVnz9O!T| z(;3mrB;rgtYV6cSL8`rCZAQjIs?1*ospyKe;JG1&<>u^@RL{@Aqz4}xU1)-zUcpfx zI{GQq$o;D9{Ajnzz?sb?+Atc(eQtx!f(y@#Ik_=;xb#W6N;@uf!i1})#!So2iHnDo zG#49}n}f=is#VQ!9=hd?met2^U%4gw=`V#RTGl&6=%+3@hapa1X&oNCio3wZOn zVm{{Rkrxi1IC_Y#dhUe9>S6WO#K!4R-)3cx;H+wHoO-Hyp1Mk1ulA|6Q8s;)KFT!0 z7G)wTJ!eSL>NqWlj!M5@&*@Wz5!?tq)h2rnn=E^qEPLB{j?g8!HFw(7ztcw%0(qUh z2iq4qc=EC*-$sXi^ac~(4%W9kC}fcuqwp?z?JDq>x#2p*xAgP zbH)Y>`n)_`*c0n38_hU3uJFS8@~0%4(?+SZhW)B(d)-M%`ju@;GI5#Tk-)26jbzRrygQAv^ImbTcuP4kWk~7}hlpHMkyn$kp%= z|ElZ32VH;@PHcz0?Jn*Z>>d+-L3sXeu$=rW4B6kG(s0>U=p|IhrCgQ5?dpi(KH zY`bS+7P8Jf}{xS_BJkvBZxYPxOMG*GFgQqeo_t{i=!7 z$w04GoPlX;#To3=h!la?tRy96dT!3u{8g0kaa*}3xl}Htkj2y>9 zb!XITJ5G0;?D(MLoriN9e&BB0dfk<5ccjS%PDYYP@~_<*%eBRFOJljxSS~guX1rPz zt5(IRHyXZU;MWi~3GAueMq=YMpB2 zc%F~f>c*2O0XFWcSZa_H_i5CeKAH~Fp*gvSa%f+2pfhK3VMRcP#!6n;sL6mO0k^_W zCiv+olT*go#=$BRLb~pZi_e_~OV3Sv_Z2cy81g)jeOd zsJ4IMP_O+mZfdQNylOW84wL;W(BpXUS4;CJ#l}(Jmu967%$7!ytVu$WDk&*CH9I@~oZE7t7hfK-;h5yW$CigD4JojQP>n-QsaC<# zVq{!Amm+!e6!j}7-x&XuISZyd+Ri6A{)8)xZ|Oh>Id?riM#NntvJv1kAc5*$&o8^ zMXtzo$y|8@a#cmH$TbA7HM)(uMN^az(Dl6}ci;vX*>Us1CoSLBLZkt=dVuE;esE<(sm{y8H3(kkH-@n61F_^SrdNKu?8W_~-7 zf04D2znS6cpgbCqz`w|FE#yDJa2;{@^XSQB{@)CbBAYZ?hMUY<&HeIkhH|D6TNus} zP3#XD&J$hi2Mkw{)Y#(;R|nIybkatxaak^Blx+WOmYF6;HRdOOyt21H8eq90ot`gJG72Eay`qt0H_8?rFUC^ z$7X+@s2p6_4|kXR)T1l}G8gDtxIF7gJgw zmjfjyK)O60rN9%Fjtk2*qHJejc_-#@k~PpKm9zsxfpH|~6)?RSQmFiz{396X2fgnD zE?iKu8Kh8vIi()Sy|5!sR0AB?BIWsd>|K4Yv?ny@Ohv0yhgN|++}Msl(jmVKd*JcQ z?MhOEvTFACXByO-M`i@ov=BJExOyIqpNOsx7hUhH2Z2#4L``Ugyp13aI*#>lxmcej zq3k`tj|*EU$2$#>LZ#V^W3vb~$%}VfXhT&H2Kr8AHU)JyCya*EezyQGP1sARzxBwk z565pA%2+^aY(tq!GVuAwRnAS*Jg8k%`jjUp^5?*OO>F!#(asyOohIa3DqF{DaWdMD zbvI!T)<7;F-lL^zkq>!1L&wI)N=TaG?UYjQ??a}a4(LW_=`2D{r2hxbOqMYi`a>B{1mG#txHswa^ku5z`_Oy%}v2@6Pr9xN3*DmqUTiFI%f~=oj z)O}gsWZe(f1G)9ie9a2d0ooI(FFtHf_KjY&o;K7U4@jvIJ%+u@o=UoBS7?=F`5qQZ zy^?V1gPNEpqTI@(Dc3`DQh#?o9hJOxBO94O?Xrcqn3TQf8(nC_J~p;=ts>77^=Qp* z?4>MarB-L+$k-8gFg@t((LyaD9X&hk=S-3fmlHiQZR2|MTTUERJETzwt%4l#y=+$J z*F(JImCSkr-lEwrF`1j5%tPJu`$AGk9c6MI!Wh3cuZA>foMf$W;+*Mb^F=_r&o`IJ zTG{n{Mn`Uu-*TFRRtC~|OIqM$ZLLCGZe-)0iGB96c}DU*)HB#o{?a(hdMxQx6Z7Cw z3v?ck=9Najrr1efJ`eS0127hT3E8pl9yaI5{=o!Tpx`3aqvQ zRuhix7cNJFUKl18W*Y75M;64$lJi<8Y%E&j0#_9fC7X0s7*Mk{gq zd64Z|sY~6LYVZs%^)h&-QR;L+60Io5HN6~1c{ZS{!A2$-XAlPt3~8GIxvYj9bwP87 z?>zok^860$fjr~QRCsYa)aXHv6MlUyt^ed%CLkYqCJV?Y*rzBcPmISP)lI8ti+U3NTci4O1M)4R3W4m zLdq48ql(?X0!L~I&O;@TZ!yksQXQ2LmIJ*EeOxgSkfzi%kiQ)2qGgN7Qf#9LYOBJW zm00&eNG*f7h~=Xt=0VD0pea5dy`a=yIh2xi3#DvMlsK)1biv<4C0C``qRiPspemvM z5_Y!$>Mq6lDF3wmV#Le+d=@iK3s6S1W?JVw;HV5Knz|U`MUbxw+b_UAOWc-YABy3= z)R!XUfVP~)`YPq4@~L5W=onG{%HRt0ssLqBg4_h;HxJ@Pz&WjdKHROw8KMG87Gh7U zPZ9hg3C=6}_9u#0Re^WC7AOqspS)8Z4{o>i_o zq0ZCP=A~r>TK(i)VFHb&X9|^ecTtLP?9GnYL8j;A$4!!S&R8 zyuw^pt=m;+cMGgV$m4-Vg=SBSx6TPsy|2~obqXzw4yRY}(SDRx3uUf4XJfN-meA~U z3eGjPPKU$k5ZqF#;BYqAd0kDkgV=_{>9f1s%~=Ir7c>Md*ae^0?r^TLd#@Kf^<7Ix zPMj%~taPqwaofE@`a)No*F#ymvc~Ccrp-*t%A0|i7FPRfLctY!?X9lHRYFC5J#Z&X z5-L5lu12BURoCEg+nY0mMRuRpRp+t`Rd(!SvoIxZMvlJ)p}D20$?byP)q5I!S;8_; zi?GJtCbU35eN>_}S@3y;IJQsIEZSOj<^606Ny%06h!htQ8t{ zHP*RX98|Gn?mdm}HX+@0r8IUy*`bE>aVrfqm8aL)Oyx$0DbN5d?yqYWN+8_@t@xa4 z=$Lw4(5l1J+UWM!9ZKohB~gKjL3cdR6of6lCQwy}lXjElX>humloAE=X>4QJ>3~3m zAfEvw2=uKoj>wYgNL-yuo4_FS>4~M6&WetpoT{3!?8zhrXYgF`BsABHq*p)2*$2u*9WNNKWa#G;0JXQ0BB83HxOz!JWsy)?B`m6}s3|QhDip3L zr~>+mOkqiBbxFnIY5{Uo7L->n6Do>@g7Rg;HKpZ+nL^RhMU_QWRYFCjP`YqYS!ofZ zm6p#dTU=OLK3|v%<;p8y@+k#Ngi5O`1ll00s z<+RRXsI)*>R8U!6I&X1VL8Y*0apj_lsv>B<5UMRNEibNwR*DuDl~-p$tB@uX)c_$> zl@yefVN(T*f%{72Z(hZsWtFA#OR9yEin78YNSs>)oE6M1E0UUmPR%PTC|#H-6c#Kj zm|ujYDxj81%*MD|Qc{FT&|U%j&8sf0D5u?+S5aPF31lYpva;G=bV+GdQKnE(Sz1K} zQe0U9)l+doi3+R)%9R&MwNOzDiV=YsGtn$s-lI1GiRA#Y2(3d65X;i z;&!B#v~ecbbgTyY6mFR0`&Dd<SE|F~UxWEwegAD&0<(&$Bw-6O~Dkz@DBv3saDj~u-#kKSeJM2_Dh$M2Ej_aS%u z4z?NC#oBS6km*0+uGXp8NhFnrTgcu3o8~JsFhfWawUc&L4`R@`Hzm4Ap`1knl0luBz4*2)^ zhXMZq|98Ou!G8w$e^oZZsbW+yM5P*`Dh7PM>KeeyR5t^Di|Q7_t8P`D1^i#CF982i z)d9Fj-x{MP>Sn^JeQF=zE$TMF*Q?h9exv$ZfIp!AHsBAc9|Zg%^+SMf(c}bMOtWATc%wIc)7L;@M`*7{@NPt62O;gmjb>_`!&F?)%pN$ z(Y64-PTLCj4ca>iuic>C2>4yvy8+*%+d(+pW4gzPO1D$@4B*e|3ka{DtG|h;^xx1! z@AS9mw*&rt{U?C`O@9{fe?>tnQOlxQi7M&_Llof*(FPMy8O(-sz^^pq0zTF7IN-Ys zKLLD?;RV27G#mo_CBv@)KWg|5;SH}EP62+}a0b#pG5izovxa{I{vX4C0RPMYk~jR< za1QX#VenK&&iG5h84nqM1^COxPXYg@@hstu|1wz#XR?__5tS*?R0H@D({+G<-3;xT zUo^i+c=InU352tZvZN5+l4_YiRF*3&S3}Ai%N)S-Ew2Ioy5%(Bf3o#_=Qt$6Xq6 zX{^~OgM=$Vp4EC7HT_aO$Wy;u4?OGb`Z@^f^-U12)3-sm9>#)>!v8>coBlRPxm|xd z;CJXZ0KQRwH{hG}_W*uBj1(QCPuYm@FcukrXBx6Wl9LUSQQCh6{A0t%D9M)~JZwA+ z^86J@mC7&=BR(YM*lT8iIS})n| zw)+~%E|Nsl#RZkHxL;VdOdwOM$_oXOzqqoHI&C7-|2fcr9VaqeORQux!*yWgNetJM z7&3<8QDg)ei!!CO8aat2$w4U`F_4i&@TYJj4(jF0s!Ieiwz~2f0UWcGlLs#lPf{4A z0{53dQW>QtW-^M5BWZO_%}wM4h9@!n1jEm0$nn=Zy^Wj^!!!(MV_1!$8^b#=+=Su% z7;eFEJAItTJ&NHT44=dBD2Bhs@GlsCOhcYvI2Xej3|FtYe$Dm#%@}UL@S7NJ!SG=W zcVhS?hRGL1|pGe{n624<1jJRifS@;UrmzLKwnx$t+YXw_WRdevUldup?Kwt6-Au1)G~ z>gUw2s=v^Dsw>l7t8?p4>&@Vc_88QLSVJ24`a(ms!C~+jwt~k$YBU>X8_SH>8aElY z8Fw4ojYo_pjHiv~Owr(-Cz@uO7MPZsR-4wFHkr1WcAMHwM@%P7r%mU~(dI<+MDtAZ z0`qe7YV&&YCi6D)Zgac&i1~#1wE3JR+LCCQXqjnQU|DWiZCP*GWZ7ofZE3e0v7E4+ zww$v@TNAAltuw6)tjn#dt?R9utlO-+t?kw$))R#OFBFF#o)8PAIYxumc=uT){qL)h z=3!)FFqQoGS{C0GloPb*zi$W8^fNPv*21SuNo$s)*2yh#+7n7TD?v$Tmni9+5W47f zB|ZO;k}l;*6dy#_s7Vw@0{ql_Nt7yxUTqC350^VjNw3+jq#KVTtpQz2AoNIQvUJb4 zg~fYVe1yd(S=-2;`dnGMgLljES|{X5*F99_zo;b=b||9gA-WlgDl?1;^Qnn8!q<^ zS{BQ6F^lWN=DvZ&TUorH#lH`m`?M6dMYEXoqiuo0g1EL?CB2>~?c~-(q*dVeV!`K2 zX$x4qp2d5Vb=>+6(jgq(b{&g-EIug3x0^9{0(j@EVbfC%8{F$iJ#0PJk(mSm|^YFJf^ci`h8e&c^wUsVru^-?2-I?_~YFb2W>f zlj04rEN1B&SbZB4S|Nz%sAf6EdHA{EM|IkpOwX%Sj>8Me<6#R#J<%a z#SbvaJ-{UPZIV~m1*==X4zXir1-nc zKE8Wasg2usrAGg78`4J9%&ah4C*?XU#XFdd?zoA?XQlWt<{uto{^zmXEM~pl$)vV( zC5st%I}dlZr^i{39(S;K3+6Gv{WMs|Oog>dAd>Kan5KW}jeOKf!GE$IQxp{66NMMQ$Q@kbB94WINeG zo*?_k0dj~OCCACzF`i;Q-pl;u(@YZknD=^y`K4!>p8k}1%Kb4c{-zZFjOq2ym}ayy+59|{ z#mv(jVD;ga_+{p?US{d9FusqlejZ`+`8BhzqiPm2Kk*x8*RL{def4!IevSE$*PfK( z*O^_v&OGyPS$)6DVey+%eC$>!KF-=d&eGqwO=-7prYr6C54VQU4}{RWgH}9XwSPFM zT+yAFp`_pXW@k%$n~n9`Y)sxhtt|6LYv(e5WES@h^RMqbhy`F#(ygRV znU(bEy-ND8Ta@&fq!4I;sXA?u{yOi|5Le~HP4p}XIwpB@=o2&FD zU!;c6H;2&59Xt2sG$k$GM)+SQ(7pRhQ;*yLEBl8@1o{!g`{45yVsG`amizE}i`LVZ zx*{-iL7dSKbu{$7j>`+Eb#+Q>fNNiPSyCHRTHtV%d2lbqJ$fY;K>H}}^iyg5TK8L>z1pP*eeWe( z%ZG*+ad3Zpdw5hD$ z*cg^@Ijrgi3Wl#2i@;z&f1L$HKmzf%ov{c6gSa~Q^hDIkX%{H9x!?I1hP&SWl3h>s zSK;L}9Hke5p21-3D=s#OE4xk;4~PdYCNB{P5A57{CE|MqmzUuR)RH66GwA#Cipv)+ zk0%TL0|R#Ep4?Z?I>8RHkX~K3xGPNJ(thWn+W@@!&yN9HK6soU2h1YG=cLcj2JsCH z{d^8C$Kp!?E{1{ZUJ9WHg=6u9Zsz+#5dO-*@G^Wr{6LahIOzq_Lhs6ScV!-d!GyqG z7O6hYvzHI_=kwXi5iWdIcX2^{BXp)>>A33&?0G`I_xM)0)WHGh0o|j?tAio2OB?#@ z6AFX5z7sdYRm^Z2?+)5&G1N*K^=-AfEHC%iE?(j^VhQRNl!Qw*+^oi4O zdFs@&=VX0}UJfek)33 zx7Zr?p5$3~qi=jTKm~G0p9owS!rATR3%%Qu$@pOJ$p#n1KZ$?BIE)XK?u0G#Tk$nH z2T-pK9DhR@#8;%}tl^%v2GW#wj|zG18R&21JLBgA@nn#sj)|X8N<0Oh=K=qCFgY8pfYLkFZ?&!LubPGy zh`Fd~sC%7#lenW_+PFmbpcg}Smn_69Y;zI~#8d1WXOjklq2UC9xs+nkJS(U5&kCde z|F0CF5IyoF4GQF>w0c{1Auogc6*G}lqW`!+<^d&&E z(x?13*5h7_4=H5luLrm|rf6wM?JK0(L3*1(+ctNe(?Bkp+3C2<2RkpvtCdmy`CrP} z3qCHDeMLNucKGjAEB|{)_Hz9@7qVKYZOAY;9`53VXb#c2pQ=Mu8zBrqnBI^ zZJi4T3a$fk=`5l6ppRUl-{d&dWrr){5TAndj?hyL<-FIqPkrg7_{X62?+)bZLzLW( z!1)S=j&I03cf00+*u~0q!-^N@hs`u(dons(ur+efj(nx^|LQQUQ%Z1&9&qtyK*xZe zF3zHc8pv9Qdsm5P{7o5<nmK~9pVx2qUh}$p<{tPx_iom^lbtIJ%$|%&DxT@w zjzFp(JBBtSaUku#b|OzZFkVS_W^5<6(|@-YcG9`+a3j(2cg9mUWkLDus;<5RSjZ09 z&Xi|p7)x47EqVvYiJlT{#`BdOv>XfB?lq|Qz1hzW`1xJ`gUn$N@0;0JNfzA2O0R$S z=fOJ`Ix_uP_dtW}>13JsNBjb7WdEM5&zjMBEQYGKg@-PN{Fvxlr{Om>f zRFXZ>JrJ2;Ltv6$oBU72{IQf0uh7hhzv~_-!^qLa1#j{artQr=m0T^!e;ygJ09=3fTXx&%ig#Iz9g$NM3S# zTx3u^vHbmilwIKLQ?kR`U%eW_L$4-oip8kpGf4*BLNWK$FSS)coYvwB`!A* z?-LvP_70Yz@vF)`2XRBtd)_znp`KoxK@GQas{kl}iMThvFw08r>+7%K_t&rKUu@{F zcc^xJc5%uK4G?cqP&fCw9_hDo$Mjr#Xqn-ubKvRT3cR1Z_cqJQ7xqGSg~L{M4f0w7 zsXo4~45ZNG-`A#PhQfPxdJgyt)&be|`Wyf3x9~sf`YpR%0WH(>QbPgyPw)Et&g5bG zUoPUSbU!5e5bx!?-Y?fRO5cI*EBaW&Fx^*#g8Z%{X?NcJUiIdEDFg6+^Ff5+>A8mn z46S#S4>#!fyWJ${%{#UR;=Nph2fg>&5q}r*o~Ryx^q#1m0WC9l@7L*Xkl)vX_+|5k zwf=$7H^6p(t_Yke^q{p~lo`6vn`bV)f4AGEX|wDdTiq?y%e`EGl^?1gmMN$%^-|RK z{3$gpb7?=@7M~%~+rl3Ze?{cqg%`rF4b=bie>+wz3+jps=CrY_q_LR5_0c(@7??Uzkngc5JCtDhzJo75kf#j zzz`4+5iughh%sV}2#6_SM4%99hEk-I(ljEaG!t1Y#sP|1jKiQJWf(+6N-6)LT>zBK}efQb-{6Bkt=iEo~xbpi^_`6!#zT0bN>@Vs6|33S*Kh1-` zlsfcn_2WDF6a3OCBKDWeU;U2Wrn9lX5dRy_98~7}{hO%RTVub~)O=8U?RN+Mz2AEJ zzxl1H-{w!t|NRmB`Of^`AOAOgzMKE|$N!C==3jj2+gU%N@11SF(DHrm^o_UQX5YSJ zKi{A4UHpIW)BN(6{`%k@{-1F8TaxH4Y5R8M*8day>i=8m?>sSoUr*dup1rMRXUv#P#9^aii#mlEcNFVuF|`CW&d{UhxxABVG}|7QYd-Vw>14 z_K13MOnf9h)}-dtOwFx%wXhb|uF*PbUA0WDo7P?HsrAw-wb!&=+8f$i+B@1o?LF;% z?E~#Y?f2Rz+Gkp$_Gj%c+UHV8O}b>9jF$Ryk6cQ`^p<-KiOYq%bVl?IZzIgH_O5D7CA)TDu>EpGDi-VxpIUYDQ}ab zzrctS}!lOU&oYCFTlqm04x3HrJRxF<&-+W>%ZOG;7RP%uVL2<}P!$ z`CD_3dCdI4JZ^qyer%pL|7d<{o;N=;8_h4wCbL-yr75W#Do(XihBB2`*~+IvDx#89 zd(}ZDtBxu~rK!#;U1g}QDpPe+S*p9bPW4i~)%B{6x6P)F^ek8l%RlJ5`<Jc?tJ*tY;W2!_w zuI8vGRH=GWl?jRUb>PzAA0|>hTn_k2s&K+rx(FBirMuAKGrdF{{N{QQ58t^#B*1@e z6z$+c{X`=CC|eltrQxXKPFxB;H9@%HR}+N?zBLIt`Ii?S_7h>TmwDl5zZN!p?Kfz% z7MCABw@n1#ce`;~+=I&t|Eq^QhARX={0L7!#ubJ?O5uf1Iw4KX6cPBQ8`7(JMF>6` z7E$Kp1-|{3=mh_MM+D&G2a)GJ?LAoD*WQQxK>GmlL+wL6{k`^kkqY1cL|hC1 z|4gJI1{y_Y#KE6MI%453qKo#q_PNMFObF2xL(xPgV#6i6AwJ?n7Gfk`bVr;dh#rWQ zcH%n3iy?Xk&gy(FbvqByK<~T_gG;o{|N{R7Y_m;wn}2 zLu{qN(nWTG>?*rLX39*_AF-AtvJr3H#Z8F0>%;)WU2icEv3I=~g!sEb+>99PD+VJD zZ^YAnvY)sG@z`GsK}=?gTM?HxiJ^$i0b&^9bD+pUj1CgR5vMncT#8kc8X|{?5s27Z z#YjZ$P;na~cNpwBGDnO;1P_OvD|5x|h~yDsG@^N=xC0S=n;3(r9wo*ivTqmT5Z$B2 zofP57KUR(vd5H6IVmxB~PFV6}p2$bcj~5dV_xWNXVt)ec6Xis47dYT9F$p{{NlXS8 zOcqnX2UEn|;Do!yRPe%7aSyoR9x)C4FkRdWj<`=u2T#lp_kk-4#0>DoOmROr<3UjX z-k2pG0CzkjW`aKo#e?9Ghs7-LNRfC5T=J+W1fP_Mhrub2iz4vK9PtRarCiJgzbq1u z$_iN_ior9F3F4X(L45O^cpRLwM9cy2tPoFtdsc~3@K2S9f`e9zC&5E&L>ai~C*mpa z(aT~kIO%8NY4FmkD7(wt1a9Dfs1MpY} zu?Sq2ES>|ObrcpjEd}}0R2uSkR-MIS@LM|U87c#MSJhSY2iIka=fQW~Ln@gn`>qo&690*%V8H9eGO%DDu^dczgZLrX@J6u$jMz`C1S|Fzm0-qf)Nqr!NxTGx z9Dte!s)5KqNDac%ThuMkhpAy=6h7j2DDBSaM#bR_D$P2DE`0ZckdtOlFj zj(WzZF_2@`SoGmebtfd)6*Wvy6U2|fv5$zyz^P@T1VMZ%#-T1;60Fz`lK9jC-gARV zJ-A%pF)wstSY5Qo6(>62if6V>5Iu3VV{T1kZZ()&P3Bf5hTw9Gp}0IE2bY)G))FIe z*`|#c`f*km~^P@EIWhm(q%f@B38|j88QQ`N8CD8c9Y$}eSKsfNMg(p z%#S0P8E<1|9K~#SJG0?v=D|Cd2gfi2j%5ZM#|(HUGhiMw;COJ~9pE@(y$Q^8EgW|j zbKE56xXH|MQ<&rKW{#W69Cr_M+%)F6d*w7a4eWNWycg_7d^dyn?tbRG0(rl@AM8e~ zH&Z?!ABb_^gUo%inEM`L?ki;OdziVeh`H}>`G|Z3OgCH3hE6;}n+_-np7AMzRV8So(SP&xy+JJGfU26mYi??)cmPfV6HdUBhLnNgLsA+^GS2Fxfzyi z<_<_=&-u)rPnvI-dtrIod>8Vlc@(XjG8>?OYJP_L8^NIqnM3C>ht6jXeNx4%c(7-J zN&xE-pFYb>`YbbPIdkZ<%%SDXo&}Gb_FENL%Qa7ucVId}6riQ2?$aAY23Y}Q>MU?|qUB;~XBD3le zX4RFGyY;9Bfb;HL}lVkvC-iM$|$!*W<6-Z9KELL|6)xq1ub>g(z+Jo>Hr z2;tL5>0?Dy&(p_?j`{@sF3~A*W8$kKE%9?hh%9rwIYsn#r?}HZwtJv^pt#w+-~Fx_ z>^|ad5IG*F$0^2pp7cB^@;xg(E5W7I>YwCUw0eyrMMy_yM<1a(<~z=dfGgdVDHgl3 z_5R{TeSm(8_M$#Xzh7IaKcGLLy{tc|&(hZEv-L-{^@+bqtkX8&aQCpbNxkn5$s~7Y zH_kEc4eo!Fg`NV>gL0MUAy27X?RmkoLRN#lh0z=6Cp2Ra?n8l*(8u7O4@`;O3Dd98 zX97h)2~Y+sK$%6jF9BA>P!+qcjbQ^&69eg6P^RvR^aiAN#O}Ls-wW&q4gyDjt;raZuWrQ z2lwo+&v#Y2wTv(a13C0eZb>|m*pPTOu`%(IAqhr2jz$EZ5iyd1G$WJI)9A|>U<@&G zfzd`DV-j@2H0Xo^qtGZeN{x9&xlv&(H&)@k2KV(wHDj|;Yiu`m8uiGx5BUxlhZ&oZ zZ@aM^eK_B=q(tDxr2M(G?7{@WbQ|1}GZC@lPVH{Svc?Ks~ixD#N7#&n9BLmL}J#d;NWUIl9 z9557N9Lf_Ws;O#*(S*0>*?3c)s}>s7gv;w!pcWg&YN-*gDhY{~%yw9h!)i6K4)t$D zUp5)#YOAqaZNvR_tnp^G$JnmkY+XzBHtHlCis7hHs7@HAs=;i>IE%UnjnD~~paY4Q z+>&6#yWY-3tT3i|s(`gfZ$Nqj^crAGYkv5A9wQcSo;vg$xSZaB^p3Afdv-H2Fn&Ug zXD?%%agyNKuSPKrwgAtLFvh{(0nc&Rfi@oVoFaJ6c+Pt+8clfZ(!B;?dG*#K^uJdj*_j@;~9^S3qZQj?td%SOY-!_JL4*^HbL4?*= z@Sae!y$xz^>pk(3_bkDP_cjvDfN_kGWSk_l?PuOg1k-6qh6g%;SE+b{8fPg&;w8&R zFygHU!AdsU5xn3^f|X`O7@1}|p^XDPrwHz8R!@T2&+5x)-A^vhg^}kzY0k6;m}{*e zW{s6=XkWNQBozixe-P`VG#M^@i_E4jmF*1fR-nn+Zcd+(NjV#(98IqAa@%SO9$iorCN}MzOsFZLJ`*uG8h`ye@W?G1@8zD(toB z?*@uB^cApckltdHnjSleVAmnN1L-8Bfwps!y_?YHpY~qDSI!%k`562RnCI>N1SP=V zI&jrG+6Pr1#t}7`ppM$d)d`#j4xl}tHLb=$2h5T7DMBmf*k|nX1S{D%MrbW(_OmZC zN_>J*=F?xAq4v*GR{sb*+&1<>l&z&he zmO1FBlk;5UvHSy-<=?fVdb*KBInucm#~&f*hzC&W0Vifd`+#$9b^MxS^Q}UY5$9&u zGn${H*>Jv1vZ*61Yn(4bZ)mbuUkSP1`4aNyH%*4j&|Q!#n$uw~bD}mmtNAa`>qyr! zT|cG#Y${&XITlb*V+rJ9}V$l`j7^ZbQJ_cH7Ev3(WmMBT*&r|&L8R!MhnL=~qG|y-KHJ&S~`53nqagqlf{o)|60(oWw>zU4f z~;C3`is{6s<|C%8|CEHBwfsD+QVx!mFxKd%WJ65&ZpTc2C`QSWIdbpY|bBI zPY7{sdq}$OW3M~N{#H(Fs;}iWJ;J(^^)mL5)$IAb$p@P2xwZ;^I*6aT_^F@gxt3R- zVJnake#sb%9 z@+)quf#>0@Uci!d>J{dE7ta8-o=H)!6_7;4)v^EF47rKw#BBc#exAiXu-;{(6@z2S z)F0+L(NFEIxFM{QzkSg3F6HE2)iFPmQA9w0ir19vgPM0Uhj`dyJ#0C|rHZ&eG^=Oh zCb6Wx-N1dD->j1dQru}D>9m6Lo0?f~StE-52AU-;Eye(O(A$weYeSpgBT1eEd7AyF zGs_o9>RouGAG3v4*`l2S-bFlika!HS@H6(b_jvXm;+$PL&l#T8LF`2>zMV|Ha=Z%p zN)y;g-XniN`WHXt{!b%|1ODUmG$(S5cjQ(6BhLV>siSEztpzjo)}|+T#Y4PC$vmGw zl>HJev;2CJDL6Jr|kLMmaCp4QRj9?kv&dwJnrCVJ;Loi$DYi) zUdvviKhKuuc?JKKcY%RC10&h;Z)~}lXN*|4LbmA1ECcKtyyDJ>c?J9P3Wiy~iS;P2 z(Yq`^=IB5i$>Ai?f0nc}qPCy2p3eO6Tb_qoxeuSPj~yl5>0tW?*8hd`U&EtDlxcm4 z)iqn^Jo?kjtJg4B&|ZIxx%5~w?LOz5#`6wUOw7>Kgq+8nJcqQ;${dcGCz;KTHT{bA zIPwrgC7pQ;LBCb8Ksq6<|E15R8^mD#M0zrRB0Ysak*0HxmY5)>;wZBSplDu!dlf() zx&ikZU`y;ysJlYn0qh3$0{a2l9gg6RQ+mgUw50*?LF^ua zy#tU6WB@&YKCoxwJ{ZV}VH87?<6`zvJQnKD)u8@yALT><EnXt8^X zKKHWT`m6;DV>a-IT#9?;HK91)ciyeP*oOOKSIOoc74cB|>y{HzwpWa^|pbu=VO?{!7+@0O&SJvv@>E7ku z<9?&9eg5~Q?K16K`}d^;$J36d(duW8OG4A<=+BCT#5WWFRRoPsjq@U`cB-8s>JGb; zM3Vbs_i2&rad})Kh5n7mf#`A|x*Uiu2cpOUZgwD&9Ed8%#MqrM^$H!)6=hy>lJBmq+?s`{yOe^fH#4+fkOaT+i?Q-2Hw7iqVgGJeK7&56Hbq z+o~PaFn(>jwo^Nx)nkU{YGrbvwn$r|t>AVSpl3^{BVt13WKo)8XWhpc~(@M4F z+-E%3&;ztlfi{*4r*>L9Cwpr>k+vxq_ zqT>M9M(<9^)I&rel|891MO!;Xm@I6srM583^bWI@->gp38=!W+ITdmoN!Zi)GCjJ#?YG#+M?D^k?vYXZD9=PCuW&P zK{6rBaY|@$v*-*Lm*m7*)-{Jt#?Iq8AL+!Ku>6!hn{X8IxDLd| zTh4nvwOC7br%vN_Ea5z-STCY=bQHz%x9FAp-itYLNYqI?TI7mdklu)-{IfZp?rNvU z#rx5EI>SnO`_ILGbWWa^pUFSV3)q#0IdUAs9l4GXv@2mxy3y4id(u#Sn4Y5#*K_p| z*qd(GN9%X!V`+cVCt_#%MPha0FB5ALHzmHB_<7=`#4i$?4S`)M-<)7hH19GeVXx}s zPIX_4ed;auJMIJSgYMtC4`IK0&;7ppnEM0whwc;ZKe$i1KXNx<|9TSr8uqR9>zjL& zi|GVwgGq#jod;|qH0(Uuq1c^p^a>q2k%k>d!!D#@*U_*8NsyL|k3q%mz8E4vatx%W zU7@!EJBGwABeBa!>>P3kfPR5nTaXt+Zp)qfdg-f>lYnVJ0Z<4OUxm^uKl1?pC zwgb<5==bepl1zb~F0-&F^wZ*58zhIyk=Q}T@IEtL&cvQj0{)IMIPY9*k=hWuYUCDK zcNHgJ$;N*x5C69r_`l-YuQ2U5acqpkn@_i~>sLN^cIx9;E@gR;B}M%aeKxT~+%y_p z+gj?gYvBQkDye)#E2&t}5tL3Go4q z0%PRQS@bHN8CoNuEhQ;?u+FQXoo7oL>r+^AiyHS(JI1X~r}>n_nH}k~&Kcr$$bkG* zHoE%hW9Sr~_)21vIoX`zPQ$7DZTGwGe|H~t|A+gi`?&k}?voz+T-g4r`P*^^(Axz7 zeg8V%NCn=m1>Ua3T7do{y(VTS;4NF!#h&ko-CMEys&tjGMUf~GWvG1-O0R%rEo!Vm zEp;eOe-E((*IvLV?54cC)mbW>V#J~mpgwb zq;sWnB@XO^i9N))#D>JvVv@1jcthN6dd;x77j5(ssp2M#Z-|(TophR*FM5mTaE%j7#WHax z=JRDS9&@?@Z&o!pp-&XA;go*2*dyK*_lRTS_u>)p2b|U)7mcD>Jf%r3L;OHntW}83 zIHkWUeyzQS-QiQ`Oy@(0`1Q`8gNL>||5>2)3y8J65@i|%DDD%9klgv9pj$XHY7ZqP%d2w z&m}CEX2MGeRWg|HNXJcL;kFFbfoynpu@}e66PCtM8Oy&KSO;tbHeJr&)+fAw+Sv8c2VuX? zbx@yM%CxjAY@7z{H#wiQ-;UW1{SScCgMH!(;Phah<@u0yBXH?5gipq7I9d4Oxo<7~ zqqO=)v^@9GT^_XxtU{~UDz)ZW<@6g1)+%d_wce_>He0pUcIZ3tv>ujy)&a=F)-mg( zb=o>dzYoBc?Y7fyXM3y*^qT>c)Qd#}CUK4>3- z{kVO~K7%}U_IdlFPxy35!)KAj7xH!RrTQ{_J$!w9*}lQB7-{$$wGFs`pi zf2O~uZ?V6xe}H|&I_4kZ&xIUqo%ZMXC)suWY5oG#^9|Bx`3wEUBsnLfy@ll&l-+Bs z_m}$TS@r&MI~_f!@GtkT@=x-wu`c-6`>Xw%{k3+!f4hGtMtaF#k2Rg=-{(KzKkPr| zKj}Y>oag)({7rUNz!_*~=LbAA11+Tj0bfHPsl^gV38V+I0=*&o1qKC%LXHfK3FHT+ zP@P|r(*rZD!;nQRNiPYMS*PtYR$*WPR(5}2QD8}6g_}5@WX@MH@ zH>;Y)71-iC5va4vT6$=$3G9F$l6`kzZ(zTj-m!j>D4+tlGdS-!{7@a3*j* za4{%?deE?|f)?u`)^)2k*ui%qm}-~M+65K_GlD&WeS+D(O~Jvz9Dlu49UO&NDCgMO z9vl~(7@Qi+4$i>SS;5(ulRST6utRW8a4yO&3@-Mi2A2ja0}Jf)RsrdDJB%(AsPd%- zru&<$!^oe8c2|=gTo>F3eN%8N*62)d8`kuMzbPpEnZehCdobJ3gKzqW1mE^=_B8|# z1&;<#1Zsi}*7D%lU}Nx7NQUCE3gyAZkP7)i5vntk9D-l9=sqiy2_Hk*P|r}`(11Wq zOdmqJRT0Xyszakgd7(+6X`uo;i~J#YC{#!z3KgSSd~aYn z>F_=1q2;89Rr-akPS>fK{ ze&Io(+VD{OOn78?OgJA*Qb!CH9LzbVP%Gi-zU=T!^rQk@Gzh#=8LEc=H`(c-LRt&> zD(m4QyDD5_tq%_kmxULE7X_T;?ZKmd6<%UH$sdA^;T68c;i{H-M*h0++7_K+ux0)^ zPV2%OsNHalZ&au{yd_-cKN;Q;-fbNY??s;C;L&hVc)ve0e9)JQr$_9W;p5>`zKzh& zuzsHPHv8W2MXc0mUuAf|RUZ-HqMV3sS6K%l21b;Fb=(`Vtinhr(!pL4Newt@7l>p; zdPMrz2P4^$!NjqVoPZ~iZEcT?ij2cLvhL3#?u|^0OpVNl%!?T%cB+1<idR~QGJEQf{ebF`6flzHwL=V`VVA_NialtyZ*`IrdP!2d;L`AzV57Yu$pcSL z`A_z~2D+-NT6e8|e)c~9Cnq5!C+GhlO(DfdQv^hshlnYqh$*F%Mnpu4G$N%)BQKAp z6nlBOh>`NRTpl7uq8(iAC0KrTh3De@2~QsnZG((vZ|*4`&4r=jQ= z@97=mI`)`z&&)N~TyxDe*U#Q(Wo?=_4~7m$3Ym^XO177b?JFXw{OU+)WKg6cGQ7|9 zus2d!;t#Eej3GUnBjae)S`n$H5rap<5Zf7E5}6#CN-@wGnGu;CnHyOUsgEpn)Q>eu8?p0BB2uZ#90dMo$$=z#EzP+PP-IwU$Gv@bfUsEy+%T2(kTI=+aT@u=#+v`bQ<-7H=S>f zZjK)6d$nX_^cbye<`h>K)<;i9Pe;!cHAF8(uSRd=?9IttfBqmEmkRnMN)8vzBFT-hve@9*(EQHW z;Lt)^L3PANlD5$_{%r0Wi;WF6M5}0oyv{Knn*cnCWNKp5W3yr-3D1H2oY;KA3kw&- z8e-2;Un`^5sfsOQOucVSYz66G9a|UMkUxfFiAGeE#W+SIGp(ok#kPc(SUCTBXkl!- z!UfL4HL*6Lc9$HF?Ta0V9R^nPDef=D)og!pwTiTYD$=|rb|!WqKT^CncA3X#j?D0q z*tJ+!aWJ$l))ih-av^Rnm=<@(gN$Qsj0;4(Fdiu`rBxq~7`uvQ6)!Jnil^eGWXYEJ zpm;^-aC~^2T9W%zd`x^?_*}dqUR|(=@Hq11viu$KNPIH+le|&9JT^aik~B2Orxvut z#+IxoUQV-2Cvm8~3NJE_&&c0cG%G%v$Km+wcm>H&EOE<{o%@PQ3r0}sbJeOWHb1_= zw5LA4IKGrDq}6GBIYq*<_&DYlAB@$+SH{=$nN)n8Mu}kl)M9FPnk74;qvGr18$%o7 zt?{k#9r0c9JtZsROH03fdW)g8r0Lk(eCMC7{@F`DTb68(4uo)}Qbv)+8FOG85N zdOlGOdI;zdeWo+bGiG8`pGl#H_*~}qomLPcn%Do^6IIlXdlDh0i4VGO6+eR{#`9{w zaBA`O#6()#cgANIh3R>rvTq&R!+j(%C1#Kf)1v2?pO~59*MdI}bRE<2xyA0#nc}7V zybuo-21$NUVo|<3I)Zx8hHyLACA^L4#1hc`C}K$iMQkkGm}n%rDX}UvE3p>*Cgvxa zLANj+4<`b)xS&`VB*b90;(K{1|62}rJ6Q>i$qUWf8Rq}jVxV2;g)$3fr z2%2+Oft~`ois@LG>G<3}TN0P37dI7*Dmk7_7t<=f@3F*Hj^yG>viU|*i@TEs=vvVJ zK3kFnp|+AO`K`%tXjZZyF(R2DxqRq+>+d0(2{IR?(UNa4@m9{pG+P|9xf2c zscQ9%oSIy4E;W^(G*dJ9DKa%XH8-_@Rt4$_S3TR}sW$tG zRXwY!r_@w^YH`nJRrNHQTAEs(TA5mtTA$jOYE5lT?MUrP?MZc{4yKN#PNX_hM+=0~ zlRBHan7<};B8Jd%>4Q-)yPFs3jx-Pv)y^By!{pls?#&lD9ReEi@S-o>mep7E1 z)bo3~CA~SlO|^)6KVZJW!21f$m8ebcOt*)t(tFeUlm7IG^r7^z^vU$;^ttq<;`&HX z$gW>Gx`cfHP2S1d^?Tm)+w~6P_s3&rpRjKNehu%kW1wFIz6$)bkT?I;l$k^LD<=J~ zc&Gmd;NRg*=`+BrGhk}o2^x|no(((%7^U2N75G_Tyl1~T0dG^!gI>n(ayjqKt2gnk z)q&p?>@Nc!0RBGk6v(f@`|;i2pe)|We)9tM2p0fbzfYWC&5FajvkC73p3i&YoCW;* zC1Y(J*F}4RY5O>Eo&e_}IGvCz1gDW{M*(CS!TAAXwt&;d9Qz{3CxC}R<_J=cU=Ll2 zY55dz3aRfwvKpNI;4A>A1Gy$M$LUux(68hZkX*^wri0^EHY*K`9Rk+g1wAd0Y-d`p zh5YM~Y(eS|K>wrZhbWcu58x-c6>QCnwQ{5;!S4_L67WNcgVfRBzYhLr)VE1_2DNj+ z{xDMezt8)ZM>AiXN9t5XBd*>8T?d)|pie-i9`swN%S_hexQ-HMqV(aQPbzB}+daTT z!MT^U$qkSxVJy#q{<@-JZ9Yob?f3)sU^3?lWZr>H7fSgJwEYG)oCW_BGrj9v~c@HuPrYX8A(RR#fb|6X_YxnUlQkwDparQ8N z5uByk4zwNgy^y>J&KYK(te=J(fTKuwtK)SWl3Gd|J{h3I;Nc)P zwbwXRJBSu31E-NwWtr+z%#lSVJsR=GzcpTmWPg?v*I`2foFk0M!))gar3dZUggT;^ zi4&@Kz>))yxdOj^9UglEC0-#UG(z4P^ePVgPONab-W~M&zn={GM=&diK zMq9z@Lf+>gS*u1`{=WoqQ;l`1-!VsPfITJPG(p30l}O;odi9PA=L}bhrzL7 z+*^<6Lal8xLBFXygB?HP;DLci)lk+)QJ06%Pumd5o$$b3lsg`hRi0g zp}#-+=^r5ZUlBi_fu7ft-(bldNWF--DuTAt%6ls2!M{U|MZlj%Szc&+7OA@trH7Dr zIDCFTN9muVqT~s!se;tSB zfoim8zW!}k{yTX7gwm<{2=sgt^Uk-C>o<@&kI|q3^e&9#V=(3%MXWvx&dX|cR^SEzLe;$ax{U_5awR;7c#1nu%Yl(htY`;{7pk@xqIyasJy&<4h+=aFlO>epzs z$*j$>4E)V%)PkK)0?zZ7XNnPXslc28lS8x@!V5oxX!h)m2i&auofDwyM($Q(mMiIs@AeV{SQ zIUYi}KUVz$`q65xL5O^;FrEJcH0EOG9q`5o)nDMf3uqk)ZxoSkY)bUP8{!w9+z5v>O4fzOj1jaG>2x4y{a(xD+RKt6fpsV1+D#RgXXWQdQ z^`os%K-*)`GghscQP%sgGuk4#QU$RJ1F9V&06Xbr)>A5B&Q;KZtm^52I@X@NnQ3;0W+a;H{8< z4Rzm)nSCU59z^Or!1t=T4D@v1-yqj$@VA2V1ZKKg>>4_c|6=@=qA^C*!fy{l|HEis z^dqMWEsMF^IT7@y(IPdNBWl1YLcR7fht`(dQqQ1v$1(dnqap$HRLH!jMq0$i?~(dj zSonhCz~*m5{uJadKz^2b5(NKC_`kg&$h819Jq~PBSVcIeI@YT>UHJs~F=*&g^BVA8 z=*P%FGk!hi!W?=9v+X-f+uFftf^CnXcGK*q$+iV{{@M0N9PDPxf7tj+Q+k;Wa zre+F^2DWAJ@G^LBx=O`U!%FqM!13nz64uX!i0%IT|Bm*3_|N8YaGrqV0z~FH=tm@DpNXdc zJX728Oe)@H8Tks!h_}Hx&m4L_y@)j!=N$t*%M=aGyWz8PRW^U&`3Ov@wef4gZFWL7&2;$UXcR;wp&w7VDo zBQ-(r4of@lpff&Y@E*#rR;CTrhHLlYMC>Z<0qvp8iPvAyrfXl)W@%s5zK&C^zo9ME zo^$kbz9H;Fh$@2d1QQAPM9}d>O%c@G>KJWt!Soui`Xo-iJhWd z>=paPA#qH|oB6y`wCmT{FX}SinQg}`#A5@VS=E~)b5(Lt^<(DSN)Wm2-K#LQ9=8qX zUOTJzCDu5HUWK;^+QIJk6WU9_n0eH5y!jO6Rr93jKmLC)-c>1S6#k*mL}8Epf?pAH zM1`0uo)W{wH^ehy6!r_=FSgM2fcObrC>2h(1J2(TD59#iRNNeT1mdKciQP&+CusHR22URDG)WBHqRA zr&d+|JSk3-_DkZbxFI!ZNWUzQVg6r2StbX|q3XX?>8QaDq^?!o%fa9k$j)fp8fxik3 zyPtmtqZD6Ip8UKOyI`H>w)az|W99ud5n4?uYI*2~a=PuY@ zV2&)~-Q@D4jBP_e_h)%$$kgy7!Y?yld)gi)`t!C{^!j^<{uy#T&zM&4{qZi2@mk=2 zhPLPIr5M{w`K4#u^k-k3C7ePVnUN%Nu#3Bjc*ytjce%Qj=T>>=!yeG9u~-*!FiF3?6{59~4Qf&Dk^fqfHuVBf+X*z>#x z))wYHu(nd(18cjJ_rTi9c@M1ZW4s5}HdyFFcrOrK7Sel-?p;Fo>_Yn71VP)~e7<7# z8H=EUzCvHbmjbWUH^^7v8xB67mN?E=4L+rVXUb*rS@dMz)QoQCTc<5nWSzXox-FW| zS!CdJzH>Rsx?yD<9Kr3*RlMr}FAmeNgsdN?%Gg@;z5yZ#HGymJPScn+sf5 zK68ov!sixQb+_zdTR5H1kh1(*-wSM{GP8m6S-^F%z_N{f#`(A|tyHGv8>{T>He?-E z9k=>+^zh?i^G@lOd?p{K?egu(_}0?R_YTtrrVsj#;(o%{nen@Ix60u-)9rmcKbmcO6k<=!nB|A5S?pz1WxTluB8d&i%c zeml88r<{$Ze=R>pa@y;|?j7BK`=^-ozSZ6IORlf|)0CfXch9tYeJ}UydSu5w>!0bb zwZ;wWBv#PoJ#+4@*+2b_{-%t~D*sw8m*d_Vul>#b7XN1dHp^!jyUZB%@AS84>d5kY z{rmlgNXIe%Nvoe*dHkpS=lqxaSK)grCh6|K5ztsizzFy=@oL@8u`W;$2nP~@{-DbO zg9AeYBLkxYWBD{y9@lYdD)VLq<^<*k7DBGUJQp{&jmd|6a_R^8)c*s^0xP&~fz{n* zSm}JGD%T;?Z*CWR8*}=0ZcOElSGnVo=_9r&uqm*`8bbox18srbfqj7kfx{VJ)#r?> zS#|AoF3KKLOb8qgoPwVj&IB$5E(fk<&r^Y}pgriud90Bhx~zGYAeai41_uQzKo1XA zV$QX|l;=}eajyQ23xb| zp5WFX=Az)PU_JcE?VCNfSEx7$?g@5qeNo4Q!K1+w!A|5m8@!n9FFqaBJR3EXSCkja z>z6kmuRL#vI^Q&JeBQ*oDSV!3UTxmI+_A9NxzCzYvd7_D-Rp0o&r0WcY-3iu^)~Kz z^rGJy6Rq`u*-xzgo9X*jo0E>bI&*%W(S6Tbq}toMXW(}Ayv11CBbKx8R==_5^rM{l zFMBLSzt6g7=KY*8smJ|R_AbuxXHI#UxiWWN&Aqo~jd$61t4*x&x>EU@&&IX-TV7M% zD((k-3T|FY-e#P9Yn^^ekXeUY`Yhc9d^&EX4|6%$>tn0`S!-i6Kabx$PvjlTJDKVC z-1n&8asSKKmv=hvT(4_yQ*Yj-ysJI>Va^z3jYWLAZjW_5r%^u+86m&-TByKh=ks+# z{XtiT%6t`}!M+)xp`nqX(fFIveRD%&kxpr$386{glMLT29pIIQY9KQ`G>gmPXH~~b zgzNeLnQuONvy8w+U(Nt=9=b`XH^=erAjc%Unfy`L14O?9`faA|Z-ah&S8uVXtqPM zj^8V7%T?)|YJZ!t^}os}UHwx3b!7>sY7asG0OV=~J&9=>a>)ji`xbIt0v~ot*lEYU z2yHfGUIl$x)dd!wfIV}Ns@|V}54A=vo67Yl_&)~!1ach#c0fi0KM%A4`AW#I2Y(^> zpM)jz!5T)`jj{$ zE{MzGn&^^t>6SrpSQg5NOyMde7$hqQ52veAj*;VJHT^YNPL(s{Y&lmhpsQXkR_8O} zs*r1_6uL+oYox#AN(Q-}WZklY=9)|P!TdV`pFLq4z}Oyk%)wrfIXudl9L8I~`99M! z3VAR1&oXvA33?o4h61kuo&;^}pl6$Uw&7j$Hr{IodIj*E(D^vtraq5Sy1;oJ=kVQR zZ1aMC3njh`$%Wl-Uu{b`ReQ{SH}5&YJLG)F7XmCUBLak+&J=l^wtt z94ZF*w-}Cr8H7_51N}v*7$C~TAn{T0F)>)&LlN+CF_c<&47Kc7F;0vZpB0}I)#4#B zNjyw3G+!(bi$nu{Tll5Ki5?`CBB(}$%@DJ3>crF!Id@`*=nx0RQE@_a5X<$3{H@^(5ym_6sM3XnaOg*aqe}=c)*vVdN8|a1dCk%d=UROZ zYq2iUp|1J*LT8=cK%D1T7tzb~75W6Sr&X6{R6-p}p-bODC4`A0yUB`0 z`X;h$g0oTILYDcdwC#Eu$zEm9=aZfmeYd`k{BeV159o(Us|F1gY$NL!I8QtM-L4;J z?fNPGjB~#}l1eNCaA^uI=$BcqRSGm(z%~%**XX{AauMho$OCl26J3Vg*{mlFH`TX5 z_ZvZ@(Ai={j8sNjyHSeTWtUB03^FRHy_&eTWF=D;aQ!(aOR`;m4lFT-_prYQP}*8O zY*ZR!jB!SF#=SWy+rHBv4m$kFVUS-7CGyT zx%zxQCB|56EOj;+%Z-)B8j6ioh|@A-y>pwfk)&FUt;P<0i?NG+NPgX8bg(ClgT_(P zUqB^N8yY8!PSU#HII9mfE*e*i>n`DPy1cHCtH>2|^>YoNxNLHjqcy1n*AUkT2IGXQ zoZ1dKIL$T6RfX8ecvE>!-{2aL7SFUP#c;c8B3Ursxz{y?W6L$oH50mPUGt2^&Uvmn z#Oii^I&yF;Yt9>FOF!p+*CN*vi{^`{Mv5^%-J1v~#*CC}BCfS`HM?3|n_b&nJ1I{) zmC(<%*R|hu$aRdallm6DOAotFyUsbUx-Pk{x^B2Nx8e4?3s6Fx^M;%J=}x%&>yx+) zcbR*zd#JGoR#D0Bk?zstz5T{U*J<}y*8ukf_ar0Yu5oU2Pv=&0&(aIvi+RpV?m6!H z?uG6Ky@qNXjTxrjovX-7-1P$Y7WZ~{ zn|n9+B8z9Z-3?UsJ_h#z_hI*O_bKOQy?+MKw~eFjGbFdXdtAuCPJJ){{oZ|n;IjLg z`!L6jyUSxoKeT9yBC`B~$L$Fkd)$Vx+*9a@cv7BH&!9|%AJRvYtm>!7Jj0zQDSjDF ztGIKXbDi^4dd7IhQQvMNUW;p@rdkB4Mmi*vvGIF+=3 z#^)R4m(4Vq3?_Ls8dLjt>dALuZh5N3A?GE}V$V{~a^kP_tnsY(Y}5z4s*Dq!R?k+? z4!y>+%d^MR;W_9z>N(-+=jrsE^<4DqqVZ=3wbou9bE!RObn;yBT!&A{Zm&=yB}Xt( zBfUNrB(pI+c8^TV{D&zUf>qwS_1kYv|R_?#{0bZoLg%>A%57kkhFoe%~gEJ%*Bo{ zoG>g;A+;LxSfq{wrvf|O@FfE|5vhLg`TQ@b8?dtu{LSi|NpRo?nF96!7s0lzX6gJ4 zaS)nEGj@z%Y*^FFX*y)Al1aX=?LHNm=F?s?+O!6(!<4ay`&HiojXK&^ zLt7Kp&HHdReG%|H@Ta20S!mOF&^e}i-E2DxJ)6}E8+f$Y?_9iB1s*OpJ;^>f3YqDw z-+n>)3Y-OqigGhT4h!r1A1lFW0o?%k{%V&f@I`nAXR+GN=L$Y;j%;p51U92zaNfN* zZSJ}m72FFhnHmnGZyts}4kaU#}Ul&2=>3rBf_p|D<|8 zf&2{M?}9%No@s||mGtx_?cYM%Ed!pR+6ee-d_KJ`in3P2!$qKLVEJ{l!U=Gi!C8g6 zoCc>Ft-lC(HgFht98$MKvW1=l`5PN^;U(69)^Yp-{ip$vmWCy26pffqM1?}5Cvw6< z()`6^(0{HyKQ!-nPYLNggS|h}d)an3zNV_asH%YJYXn{DZ=apOt@yqmL7^$vWy*Ht z*Zeb^=4DHZP{?E zyg7in4pL?MD!S{Qv8zj^vwwQnn*+J!qYhnJ{=S^mKBoVW&uy0J?yhr&Z?++9Fzd)y zwjVS83}(q&cTO9g)y7$AnKtBmrFkEdWy9s3W#jMCtb4ZYcJn^2m;Bdy*3nl@FqvR# zj-A&Gd`rO-s+!Q?_8TAS?yr;8IzZL&&bRs zm`kvLp#DSr@*m`$@vnKmWqaM`o~ie3?jP{6>8IP>d-Si|dsaPi>=pzcK1c=e$do$ z)Z25cxz;__`A!gYn)F$Miv(8)u6r@A`-S59odjM}j>p7`UfR&|WiFq}@`ud2WtCy2 z`-@Z^dW?a$i?y8b_Cv?3-o_=nvdJIo=KK2*3?L}a^3|=zADWXpF%Lrq-UzO$$+J&*1XRns3TaU>VGTnFHvB{oxjn%H+g%^ zrT$d}YrQ?jX@9eMZ!!HC%Bs6Hzmu>0n^k>L$87{V&3x@W{pH_Fu%F-%!7+l91g8nk z5nLj;N^rw_A)x&UV^VfM{E%_^PmQtQC)-cAm@|7Vzn8n!CfVyJ_HV%G?r#CV>IZ=Wf-phC zg#HSw^=fAQW$7jelx6i{d(S?a>3`PR*eajLZ<;3pgS%}&-&?EtU$(x$P;c*RZ&Pnz zWKLhq9iz;#C@|XFa~&U4{WvhTyMBQQS>vuL7nqb2C#JsxH9ccC<0H!tEHhoD^HaBD zJ@4>gO!P~jU&4->3jSq?vEvoS_O}^3hcVWG?MSsh3H~O=`nMQM$ZOyjkkO-%JP-au zz^#mJO8;A+k=K3%oL8aq1n7G~EB>RP9l&|uRDxcJyz_y(P@)$&fz->8d>FI~GT_)e z;J*j{AaH&J{9DFu*zZDJj2XaBBXun_FGsF{&{l)gF-Tnmog2YF3j7>6zXSGx69BFQ z)_{KxpR5C(1J3inwJ7C5VEDm46Il7M0Qfa=d+=|zzFA@tk_{x)a;-%$a2J?P26 zXTU*(ILZ-w{B=YrF35}gb;J*T7r+>0R13Q?*_bT)7z>ShQAq9cj3_pqHJ%j_H*-A>LQKuZW?(JYS(0<}30QiF^Oz zo_tzf9Alq2LQStZBIiE@gZCTHTB zn03`=sClwZE|N>k^g4n@*(6udwHBD~ifT6hnn_Z1X5JRcyP2-Fa$DB5^VTQ7{l7T# z4QIRcIE_u60{6i)**@$vwp*RR*43%6BFj(f!`X7)Bh=NYb~fU46!YsW_-?TIy%y)s zMEBQO<^gXInXk66p3K)@3WW957J+Z%2w!N7{0w^Q48m=4HuWAqzS$v+iN?b; zy6`tU9QbC38{h2k84HYWh$3ULv6%YJ65~1QH;u;Mi-f1l^HGuVob#L){k?m=dqt_Q zudlDT(^u>(76bmj=^e3F}NkfvE*oTBUFqLZ$n z;xt{u#Q&yixcD7ipAhHi8X>OI^+|C}{85Y)@6lB$-lyxoNKI;D6d!3OJ|&&BS{W@3 z=@Oro9_bOEkv{1YRWcw0;y#%t^Tb%0FZ0FyvXAT|#>u|2uXsQf%VIHJmdFzESs9g4 zF+s*PE*WF@< z+#2n#SA|W5g6=n$j4NB4R{DM2a+~6l07C0Wn~RGz3ISDW#NB{*=FJ3e}m2DZ}Kb}Dh;3+`;Suo-jdOcMjMGd!>>SvL2sjJ+ zUZf{Ea`N_R9b_Q z5$n#-wBlcj7^@&GR%66iUkQt~Ct|G8Vc1uK!d?b{Zm|Dq#4=Adsd1Cmm|4hwjDUUXSa(OjUZTu3{z)YMw~kdD0sGdm?u~$b>sVtWV6UVy zR4J+Fsqj?Ou{{ap{ zzZ!jcZ_R6{;_$VIxdITJsjL=~Ixa%|v{JGthbp!A65kg;qTT9a;xQHz_fp&z78`de z?iA}m?|h65CjsctyO+u5uoB9%kVBVz&@Yb!=$D(S-MD=1}L9&okjM%Fn}$ z3YQ+E!ty=$PMiCt#fxH#*d}(0-D0nJTO1Nc$vz=YQ-g7&U-pzKGEHX4ESV$w%RvD< z_Y;p_2!3k_FD(7Bi8XC{im!Z+p=TrL_68;W%sr-?Y?$D zd!RkoDzS&zBLnqh7ubdNSbJh1+@4}jvuE0K?D_U0d#SzroaJKh3ih(YfDZur&}%B; z26r#N9U*@K1P{ID8fX6>@FoSD!8fnDpZVVbzks*kq1Sw<{09gD&piWYJo_xZ{XJkB z;=~|)As{$_n;%6A;9}?B0mN5q8Qhfe`R3GjPf_LlQvq7ITC!(A&HV z=_4=xAAq;u?MA#s%1!^S;Mq46Jfq72yw|jzP;veV2yT83?rr`xKw!e=!u=8;%8I=S z2o81jb$t6>xc>k+0Pqfk--FzrK<+<53Z;1aXF!xjGq}t}3Em=Q{xm{%0-~(=_uvLE zIM?`}Lc!ckO8(i=F3WVS->kA0!1qMk+b}4e7hM15~V1GggxcQsjNBR