From af9e30003be53b371e1cbc820b4025540c4f81cf Mon Sep 17 00:00:00 2001 From: MrsRina Date: Thu, 3 Oct 2024 00:24:36 -0300 Subject: [PATCH] [update][fix] hardness and flag for user-case reserved, fixed memory issues --- CMakeLists.txt | 2 +- dev/equations.txt | 36 ++++++++++++++++++++++++++++ include/bicudo/bicudo.hpp | 2 +- include/bicudo/physics/placement.hpp | 2 ++ include/bicudo/physics/types.hpp | 1 + src/bicudo.cpp | 16 +++++++++---- src/physics/processor.cpp | 2 +- 7 files changed, 54 insertions(+), 7 deletions(-) create mode 100644 dev/equations.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 228b14b..d41719f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.9) set(CMAKE_CXX_STANDARD 17) -set(BICUDO_VERSIION 1.2.0) +set(BICUDO_VERSIION 1.3.1) if( CMAKE_CXX_COMPILER_ID STREQUAL "Clang" diff --git a/dev/equations.txt b/dev/equations.txt new file mode 100644 index 0000000..0cab7d9 --- /dev/null +++ b/dev/equations.txt @@ -0,0 +1,36 @@ +a equação da energia cinética é (m * v * v) / 2, m é massa e v é velocidade, pro ce usa rina :) By Hamdolf WB s2 + + +m1 : massa do objeto maior. +v1 : velocidade do objeto maior antes da colisão +m2: massa do objeto menor +v2: velocidade do objeto menor (pode ser 0 se estiver parado) +e: energia de deformação/fratura do objeto menor. +F: força de impacto durante a colisão. +K: coeficiente de fratura (o fator que indica o potencial de fratura do objeto menor). + + +A força de impacto pode ser aproximada como: +F = x +// Onde Δv é a variação de velocidade do objeto maior após o impacto e Δt é o tempo de contato + +coeficiente de Fratura (K)Agora, o coeficiente de fratura pode ser relacionado à fração da energia cinética transferida ao objeto menor que excede sua resistência a fratura 𝑒 e, +que pode ser definida como a energia que o objeto menor pode absorver antes de quebrar +K é o coeficiente de fratura; +K = e*F*v*1 + +F×Δv1 é a força efetiva que atinge o objeto menor, levando em conta a variação de velocidade do objeto maior;e é a resistência à fratura do objeto menor (propriedade do material). +Se 𝐾 > 1 K>1, o objeto menor tem grandes chances de se fraturar +Se 𝐾 ≤ 1 K≤1, o objeto menor pode resistir ao impacto. + + + +Ecin = 0.5 * m1 * v1^2 + 0.5 * m2 * v2² +Ecin = 0.5 * m1 * v1 * v1 + 0.5 * m2 * v2 * v2 + + + + +O valor de 𝑒 e precisa ser conhecido ou estimado com base na resistência do material à fratura (como uma função de dureza, rigidez, e absorção de energia do materia + +e = energia cinetica \ No newline at end of file diff --git a/include/bicudo/bicudo.hpp b/include/bicudo/bicudo.hpp index 5f934dd..f78bb7b 100644 --- a/include/bicudo/bicudo.hpp +++ b/include/bicudo/bicudo.hpp @@ -7,7 +7,7 @@ #include "bicudo/physics/placement.hpp" #include -#define bicudo_version "1.2.0" +#define bicudo_version "1.3.1" namespace bicudo { typedef void(*p_on_collision_pre_apply_forces)(bicudo::physics::placement*&, bicudo::physics::placement*&); diff --git a/include/bicudo/physics/placement.hpp b/include/bicudo/physics/placement.hpp index 27d3f68..6883286 100644 --- a/include/bicudo/physics/placement.hpp +++ b/include/bicudo/physics/placement.hpp @@ -10,11 +10,13 @@ namespace bicudo::physics { public: const char *p_tag {}; bicudo::id id {}; + bicudo::flags flags {}; float mass {}; float friction {}; float restitution {}; float inertia {}; + float hardness {}; bicudo::vec2 min {}; bicudo::vec2 max {}; diff --git a/include/bicudo/physics/types.hpp b/include/bicudo/physics/types.hpp index b23e3fe..fa3d05a 100644 --- a/include/bicudo/physics/types.hpp +++ b/include/bicudo/physics/types.hpp @@ -11,6 +11,7 @@ namespace bicudo { typedef uint64_t id; typedef bool collided; + typedef uint64_t flags; } #endif \ No newline at end of file diff --git a/src/bicudo.cpp b/src/bicudo.cpp index 3fea830..3c61bd7 100644 --- a/src/bicudo.cpp +++ b/src/bicudo.cpp @@ -48,12 +48,16 @@ void bicudo::erase( bicudo::physics::placement *p_placement ) { for (uint64_t it {}; it < p_runtime->placement_list.size(); it++) { - bicudo::physics::placement *&p_alive_placement { + bicudo::physics::placement *p_alive_placement { p_runtime->placement_list.at(it) }; if (p_alive_placement != nullptr && p_alive_placement == p_placement) { - p_runtime->placement_list.erase(p_runtime->placement_list.begin() + it); + p_runtime->placement_list.erase( + p_runtime->placement_list.begin() + it + ); + + delete p_alive_placement; break; } } @@ -64,12 +68,16 @@ void bicudo::erase( bicudo::id id ) { for (uint64_t it {}; it < p_runtime->placement_list.size(); it++) { - bicudo::physics::placement *&p_alive_placement { + bicudo::physics::placement *p_alive_placement { p_runtime->placement_list.at(it) }; if (p_alive_placement != nullptr && p_alive_placement->id == id) { - p_runtime->placement_list.erase(p_runtime->placement_list.begin() + it); + p_runtime->placement_list.erase( + p_runtime->placement_list.begin() + it + ); + + delete p_alive_placement; break; } } diff --git a/src/physics/processor.cpp b/src/physics/processor.cpp index 974efbf..47d670e 100644 --- a/src/physics/processor.cpp +++ b/src/physics/processor.cpp @@ -150,7 +150,7 @@ void bicudo::physics_processor_update( p_a->angular_velocity -= c1_cross * jn * p_a->inertia; p_b->angular_velocity += c2_cross * jn * p_b->inertia; - tangent = vdiff - n * vdiff.dot(n); + tangent = vdiff - n * vdiff_dot; tangent = tangent.normalize() * -1.0f; c1_cross = c1.cross(tangent);