CollisionCircle2D.cpp 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. // Copyright (c) 2008-2023 the Urho3D project
  2. // License: MIT
  3. #include "../Precompiled.h"
  4. #include "../Core/Context.h"
  5. #include "../Physics2D/CollisionCircle2D.h"
  6. #include "../Physics2D/PhysicsUtils2D.h"
  7. #include "../DebugNew.h"
  8. namespace Urho3D
  9. {
  10. extern const char* PHYSICS2D_CATEGORY;
  11. static const float DEFAULT_CLRCLE_RADIUS(0.01f);
  12. CollisionCircle2D::CollisionCircle2D(Context* context) :
  13. CollisionShape2D(context),
  14. radius_(DEFAULT_CLRCLE_RADIUS),
  15. center_(Vector2::ZERO)
  16. {
  17. circleShape_.m_radius = DEFAULT_CLRCLE_RADIUS * cachedWorldScale_.x_;
  18. fixtureDef_.shape = &circleShape_;
  19. }
  20. CollisionCircle2D::~CollisionCircle2D() = default;
  21. void CollisionCircle2D::RegisterObject(Context* context)
  22. {
  23. context->RegisterFactory<CollisionCircle2D>(PHYSICS2D_CATEGORY);
  24. URHO3D_ACCESSOR_ATTRIBUTE("Is Enabled", IsEnabled, SetEnabled, true, AM_DEFAULT);
  25. URHO3D_ACCESSOR_ATTRIBUTE("Radius", GetRadius, SetRadius, DEFAULT_CLRCLE_RADIUS, AM_DEFAULT);
  26. URHO3D_ACCESSOR_ATTRIBUTE("Center", GetCenter, SetCenter, Vector2::ZERO, AM_DEFAULT);
  27. URHO3D_COPY_BASE_ATTRIBUTES(CollisionShape2D);
  28. }
  29. void CollisionCircle2D::SetRadius(float radius)
  30. {
  31. if (radius == radius_)
  32. return;
  33. radius_ = radius;
  34. RecreateFixture();
  35. MarkNetworkUpdate();
  36. }
  37. void CollisionCircle2D::SetCenter(const Vector2& center)
  38. {
  39. if (center == center_)
  40. return;
  41. center_ = center;
  42. RecreateFixture();
  43. MarkNetworkUpdate();
  44. }
  45. void CollisionCircle2D::SetCenter(float x, float y)
  46. {
  47. SetCenter(Vector2(x, y));
  48. }
  49. void CollisionCircle2D::ApplyNodeWorldScale()
  50. {
  51. RecreateFixture();
  52. }
  53. void CollisionCircle2D::RecreateFixture()
  54. {
  55. ReleaseFixture();
  56. // Only use scale in x axis for circle
  57. float worldScale = cachedWorldScale_.x_;
  58. circleShape_.m_radius = radius_ * worldScale;
  59. circleShape_.m_p = ToB2Vec2(center_ * worldScale);
  60. CreateFixture();
  61. }
  62. }