Sparkle 0.0.1
Loading...
Searching...
No Matches
spk_transform_2d.hpp
1#pragma once
2
3#include "structure/design_pattern/spk_cached_data.hpp"
4#include "structure/design_pattern/spk_contract_provider.hpp"
5#include "structure/engine/2d/spk_component_2d.hpp"
6#include "structure/engine/2d/spk_force_2d.hpp"
7#include "structure/math/spk_matrix.hpp"
8#include "structure/math/spk_vector2.hpp"
9#include "structure/math/spk_vector3.hpp"
10
11namespace spk
12{
13 class RigidBody2D;
14
19 class Transform2D : public Component2D
20 {
21 public:
23 using EditionContract = spk::ContractProvider::Contract;
26
27 private:
28 spk::Vector2 _position = {0, 0};
29 spk::Vector2 _scale = {1, 1};
30 float _rotation = 0;
31
32 float _layer = 0;
33 spk::Force2D _velocity{};
34 spk::RigidBody2D *_rigidBodyCache = nullptr;
35
36 spk::CachedData<spk::Matrix4x4> _localModelMatrix;
37 spk::CachedData<spk::Matrix4x4> _localInverseModelMatrix;
38 spk::CachedData<spk::Matrix4x4> _modelMatrix;
39 spk::CachedData<spk::Matrix4x4> _inverseModelMatrix;
40
41 spk::ContractProvider _onEditionContractProvider;
42
43 protected:
48 void _onUpdateEvent(spk::UpdateEvent &p_event) override;
49
50 private:
51 bool _checkCollision(const spk::Matrix4x4 &p_futureModelMatrix);
52 spk::Matrix4x4 _composeLocalMatrix(const spk::Vector2 &p_position, const spk::Vector2 &p_scale, float p_rotation) const;
53 void _setPosition(const spk::Vector2 &p_position);
54 void _setScale(const spk::Vector2 &p_scale);
55 void _setRotation(const float &p_rotation);
56
57 protected:
62 const Transform2D *_parentTransform() const;
66 void _notifyEdition();
67
68 public:
73 explicit Transform2D(const std::wstring &p_name);
74
79 const spk::Matrix4x4 &localModelMatrix() const;
84 const spk::Matrix4x4 &modelMatrix() const;
89 const spk::Matrix4x4 &localInverseModelMatrix() const;
94 const spk::Matrix4x4 &inverseModelMatrix() const;
95
100 void setLayer(const float &p_layer);
105 const float &layer() const;
110 float globalLayer() const;
111
116 void setPosition(const spk::Vector2 &p_position);
121 const spk::Vector2 &position() const;
126 spk::Vector2 globalPosition() const;
127
132 void setScale(const spk::Vector2 &p_scale);
137 const spk::Vector2 &scale() const;
142 spk::Vector2 globalScale() const;
143
148 void setRotation(const float &p_rotation);
153 const float &rotation() const;
158 float globalRotation() const;
159
164 void applyForce(const spk::Force2D &p_force);
169 const spk::Force2D &velocity() const;
170
173
180 };
181}
Component2D(const std::wstring &p_name)
Builds a 2D component with a name.
Definition spk_component_2d.cpp:9
Physics component that handles collisions in 2D.
Definition spk_rigid_body_2d.hpp:20
typename Contract::Job Job
Definition spk_contract_provider.hpp:267
const spk::Matrix4x4 & localModelMatrix() const
Returns the local model matrix.
Definition spk_transform_2d.cpp:67
const spk::Matrix4x4 & modelMatrix() const
Returns the world model matrix.
Definition spk_transform_2d.cpp:72
spk::Vector2 globalScale() const
Returns the world scale.
Definition spk_transform_2d.cpp:261
const float & rotation() const
Returns the local rotation.
Definition spk_transform_2d.cpp:284
const float & layer() const
Returns the local layer value.
Definition spk_transform_2d.cpp:96
EditionContract subscribeToEdition(const EditionJob &p_job)
Subscribes to transform edit events.
Definition spk_transform_2d.cpp:312
void setLayer(const float &p_layer)
Sets the rendering layer.
Definition spk_transform_2d.cpp:87
const spk::Vector2 & position() const
Returns the local position.
Definition spk_transform_2d.cpp:234
void applyForce(const spk::Force2D &p_force)
Applies a force to the transform velocity.
Definition spk_transform_2d.cpp:295
void _onUpdateEvent(spk::UpdateEvent &p_event) override
Updates transform state during update events.
Definition spk_transform_2d.cpp:35
const spk::Matrix4x4 & localInverseModelMatrix() const
Returns the inverse local model matrix.
Definition spk_transform_2d.cpp:77
void setScale(const spk::Vector2 &p_scale)
Sets the local scale.
Definition spk_transform_2d.cpp:245
float globalRotation() const
Returns the world rotation.
Definition spk_transform_2d.cpp:289
spk::ContractProvider::Contract EditionContract
Subscription contract type for transform edits.
Definition spk_transform_2d.hpp:23
void notifyParentTransformEdited()
Notifies the parent that this transform changed.
Definition spk_transform_2d.cpp:306
void setPosition(const spk::Vector2 &p_position)
Sets the local position.
Definition spk_transform_2d.cpp:223
float globalLayer() const
Returns the world layer value.
Definition spk_transform_2d.cpp:101
void _releaseGlobalCache()
Clears cached global transform data.
Definition spk_transform_2d.cpp:328
spk::Vector2 globalPosition() const
Returns the world position.
Definition spk_transform_2d.cpp:239
Transform2D(const std::wstring &p_name)
Creates a transform component.
Definition spk_transform_2d.cpp:11
const Transform2D * _parentTransform() const
Returns the parent transform if any.
Definition spk_transform_2d.cpp:317
spk::ContractProvider::Job EditionJob
Job callback type for transform edits.
Definition spk_transform_2d.hpp:25
void setRotation(const float &p_rotation)
Sets the local rotation.
Definition spk_transform_2d.cpp:273
const spk::Vector2 & scale() const
Returns the local scale.
Definition spk_transform_2d.cpp:256
void _notifyEdition()
Notifies subscribers that the transform changed.
Definition spk_transform_2d.cpp:334
const spk::Force2D & velocity() const
Returns the current velocity.
Definition spk_transform_2d.cpp:301
const spk::Matrix4x4 & inverseModelMatrix() const
Returns the inverse world model matrix.
Definition spk_transform_2d.cpp:82
Directional force represented by direction and magnitude.
Definition spk_force_2d.hpp:13