Engine²
Open-source game engine written in C++.
Loading...
Searching...
No Matches
DistanceConstraint.hpp
Go to the documentation of this file.
1/**************************************************************************
2 * EngineSquared v0.1.1
3 *
4 * EngineSquared is a software package, part of the Engine² organization.
5 *
6 * This file is part of the EngineSquared project that is under MIT License.
7 * Copyright © 2025-present by @EngineSquared, All rights reserved.
8 *
9 * EngineSquared is a free software: you can redistribute it and/or modify
10 * it under the terms of the MIT License. See the project's LICENSE file for
11 * the full license text and details.
12 *
13 * @file DistanceConstraint.hpp
14 * @brief Distance constraint component (5 DOF) - rope/spring with min/max distance
15 *
16 * A distance constraint maintains a specific distance between two bodies,
17 * allowing rotation but restricting translation to a range. This is useful
18 * for ropes, chains, springs, tethers, and bungee cords.
19 *
20 * @author @EngineSquared
21 * @version 0.1.1
22 * @date 2025-12-04
23 **************************************************************************/
24
25#pragma once
26
28#include <Engine.hpp>
29#include <glm/glm.hpp>
30#include <utility>
31
32namespace Physics::Component {
33
81 //========================================================================
82 // Constraint Bodies
83 //========================================================================
84
89
93 Engine::EntityId bodyB = Engine::EntityId::Null(); // invalid => world (see IsWorldConstraint)
94
95 //========================================================================
96 // Attachment Points
97 //========================================================================
98
102 glm::vec3 localPointA = glm::vec3(0.0f);
103
112 glm::vec3 localPointB = glm::vec3(0.0f);
113
114 //========================================================================
115 // Distance Properties
116 //========================================================================
117
128 float minDistance = -1.0f;
129
139 float maxDistance = -1.0f;
140
141 //========================================================================
142 // Settings
143 //========================================================================
144
149
150 //========================================================================
151 // Runtime State
152 //========================================================================
153
157 bool broken = false;
158
159 //========================================================================
160 // Factory Methods
161 //========================================================================
162
176 [[nodiscard]] static DistanceConstraint
177 Create(Engine::EntityId a, Engine::EntityId b, float distance, const glm::vec3 &pointA = glm::vec3(0.0f),
178 const glm::vec3 &pointB = glm::vec3(0.0f),
179 const ConstraintSettings &constraintSettings = ConstraintSettings::Rigid())
180 {
181 DistanceConstraint constraint;
182 constraint.bodyA = a;
183 constraint.bodyB = b;
184 constraint.localPointA = pointA;
185 constraint.localPointB = pointB;
186 constraint.minDistance = distance;
187 constraint.maxDistance = distance;
188 constraint.settings = constraintSettings;
189 constraint.broken = false;
190 return constraint;
191 }
192
207 [[nodiscard]] static DistanceConstraint
209 const glm::vec3 &pointA = glm::vec3(0.0f), const glm::vec3 &pointB = glm::vec3(0.0f),
210 const ConstraintSettings &constraintSettings = ConstraintSettings::Soft())
211 {
212 if (min > max)
213 std::swap(min, max);
214
215 DistanceConstraint constraint;
216 constraint.bodyA = a;
217 constraint.bodyB = b;
218 constraint.localPointA = pointA;
219 constraint.localPointB = pointB;
220 constraint.minDistance = min;
221 constraint.maxDistance = max;
222 constraint.settings = constraintSettings;
223 constraint.broken = false;
224 return constraint;
225 }
226
239 [[nodiscard]] static DistanceConstraint
240 CreateToWorld(Engine::EntityId body, const glm::vec3 &worldPoint, float distance,
241 const glm::vec3 &localPoint = glm::vec3(0.0f),
242 const ConstraintSettings &constraintSettings = ConstraintSettings::Rigid())
243 {
244 DistanceConstraint constraint;
245 constraint.bodyA = body;
246 constraint.bodyB = Engine::EntityId::Null(); // Invalid entity = world
247 constraint.localPointA = localPoint;
248 constraint.localPointB = worldPoint; // Used as world position
249 constraint.minDistance = distance;
250 constraint.maxDistance = distance;
251 constraint.settings = constraintSettings;
252 constraint.broken = false;
253 return constraint;
254 }
255
268 [[nodiscard]] static DistanceConstraint
269 CreateAutoDistance(Engine::EntityId a, Engine::EntityId b, const glm::vec3 &pointA = glm::vec3(0.0f),
270 const glm::vec3 &pointB = glm::vec3(0.0f),
271 const ConstraintSettings &constraintSettings = ConstraintSettings::Rigid())
272 {
273 DistanceConstraint constraint;
274 constraint.bodyA = a;
275 constraint.bodyB = b;
276 constraint.localPointA = pointA;
277 constraint.localPointB = pointB;
278 constraint.minDistance = -1.0f; // Auto-detect
279 constraint.maxDistance = -1.0f; // Auto-detect
280 constraint.settings = constraintSettings;
281 constraint.broken = false;
282 return constraint;
283 }
284
289 [[nodiscard]] bool IsWorldConstraint() const { return bodyB.IsNull(); }
290
295 [[nodiscard]] bool IsAutoDistance() const { return minDistance < 0.0f || maxDistance < 0.0f; }
296
301 [[nodiscard]] bool IsFixedDistance() const { return minDistance == maxDistance; }
302};
303
304} // namespace Physics::Component
Definition BoxCollider.hpp:27
Represents a unique identifier for an entity in the Engine's entity-component system....
Definition EntityId.hpp:14
static constexpr EntityId Null()
Returns a null EntityId. A null EntityId is an EntityId that does not correspond to any valid entity ...
Definition EntityId.hpp:40
Definition ConstraintSettings.hpp:52
static ConstraintSettings Soft(float stiff=0.5f, float damp=0.1f)
Create settings for a soft spring-like constraint.
Definition ConstraintSettings.hpp:176
static ConstraintSettings Rigid()
Create settings for a perfectly rigid constraint.
Definition ConstraintSettings.hpp:136
Definition DistanceConstraint.hpp:80
bool IsAutoDistance() const
Check if distances should be auto-detected.
Definition DistanceConstraint.hpp:295
Engine::EntityId bodyB
Second body entity (the entity to connect to).
Definition DistanceConstraint.hpp:93
Engine::EntityId bodyA
First body entity (the entity this component is attached to).
Definition DistanceConstraint.hpp:88
bool broken
Whether this constraint has been broken.
Definition DistanceConstraint.hpp:157
static DistanceConstraint Create(Engine::EntityId a, Engine::EntityId b, float distance, const glm::vec3 &pointA=glm::vec3(0.0f), const glm::vec3 &pointB=glm::vec3(0.0f), const ConstraintSettings &constraintSettings=ConstraintSettings::Rigid())
Create a fixed-distance constraint (rope).
Definition DistanceConstraint.hpp:177
static DistanceConstraint CreateToWorld(Engine::EntityId body, const glm::vec3 &worldPoint, float distance, const glm::vec3 &localPoint=glm::vec3(0.0f), const ConstraintSettings &constraintSettings=ConstraintSettings::Rigid())
Create a distance constraint from body to world.
Definition DistanceConstraint.hpp:240
static DistanceConstraint CreateAutoDistance(Engine::EntityId a, Engine::EntityId b, const glm::vec3 &pointA=glm::vec3(0.0f), const glm::vec3 &pointB=glm::vec3(0.0f), const ConstraintSettings &constraintSettings=ConstraintSettings::Rigid())
Create a distance constraint with auto-detected distance.
Definition DistanceConstraint.hpp:269
glm::vec3 localPointA
Attachment point on bodyA in local body space.
Definition DistanceConstraint.hpp:102
static DistanceConstraint CreateWithRange(Engine::EntityId a, Engine::EntityId b, float min, float max, const glm::vec3 &pointA=glm::vec3(0.0f), const glm::vec3 &pointB=glm::vec3(0.0f), const ConstraintSettings &constraintSettings=ConstraintSettings::Soft())
Create a distance constraint with min/max range (spring).
Definition DistanceConstraint.hpp:208
float maxDistance
Maximum allowed distance between attachment points.
Definition DistanceConstraint.hpp:139
bool IsFixedDistance() const
Check if this is a fixed distance (rope) or range (spring).
Definition DistanceConstraint.hpp:301
glm::vec3 localPointB
Attachment point on bodyB in local body space (or world-space anchor for world constraints).
Definition DistanceConstraint.hpp:112
ConstraintSettings settings
Constraint settings (stiffness, damping, breaking thresholds).
Definition DistanceConstraint.hpp:148
bool IsWorldConstraint() const
Check if this is a world constraint.
Definition DistanceConstraint.hpp:289
float minDistance
Minimum allowed distance between attachment points.
Definition DistanceConstraint.hpp:128