]> git.tdb.fi Git - libs/game.git/commitdiff
Use AffineTransform instead of Matrix in the Transform component
authorMikko Rasa <tdb@tdb.fi>
Fri, 28 Mar 2025 19:13:32 +0000 (21:13 +0200)
committerMikko Rasa <tdb@tdb.fi>
Fri, 28 Mar 2025 19:13:32 +0000 (21:13 +0200)
source/game/transform.cpp
source/game/transform.h
source/game/transformpropagator.cpp
source/gameview/lightemitter.cpp
source/gameview/meshrenderer.cpp
source/gameview/renderer.cpp

index 09345449a28eca7dcd135bbf7ad0ec527ff6ea62..b201a01bc3cc2410b9d8ab7d01a8ceb7caf0e33a 100644 (file)
@@ -1,5 +1,4 @@
 #include "transform.h"
-#include <msp/geometry/affinetransform.h>
 
 namespace Msp::Game {
 
@@ -38,17 +37,17 @@ void Transform::set_scale(const LinAl::Vector<float, 3> &s)
        write().values.scale = s;
 }
 
-void Transform::update_world_matrix(const Transform *parent)
+void Transform::update_world_transform(const Transform *parent)
 {
        using Affine = Geometry::AffineTransform<float, 3>;
 
        Data &d = write();
-       d.local_matrix = Affine::translation(d.values.position)*
+       d.local_transform = Affine::translation(d.values.position)*
                Affine::rotation(d.values.rotation)*Affine::scaling(d.values.scale);
        if(parent)
-               d.world_matrix = parent->get_world_matrix()*d.local_matrix;
+               d.world_transform = parent->get_world_transform()*d.local_transform;
        else
-               d.world_matrix = d.local_matrix;
+               d.world_transform = d.local_transform;
 }
 
 } // namespace Msp::Game
index 4dd2fbc5b5648c71353623b503f3492b9b76d699..c8c93bde8ec4f0cc44963285c183b660eb3a07d2 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef MSP_GAME_TRANSFORM_H_
 #define MSP_GAME_TRANSFORM_H_
 
+#include <msp/geometry/affinetransform.h>
 #include <msp/geometry/quaternion.h>
 #include <msp/linal/matrix.h>
 #include <msp/linal/vector.h>
@@ -29,8 +30,8 @@ struct MSPGAME_API TransformValues
 struct TransformData
 {
        TransformValues values;
-       LinAl::Matrix<float, 4, 4> local_matrix = LinAl::Matrix<float, 4, 4>::identity();
-       LinAl::Matrix<float, 4, 4> world_matrix = LinAl::Matrix<float, 4, 4>::identity();
+       Geometry::AffineTransform<float, 3> local_transform;
+       Geometry::AffineTransform<float, 3> world_transform;
 };
 
 class MSPGAME_API Transform: public BufferedComponent<TransformData>
@@ -48,9 +49,9 @@ public:
        const LinAl::Vector<float, 3> &get_position() const { return read().values.position; }
        const Geometry::Quaternion<float> &get_rotation() const { return read().values.rotation; }
        const LinAl::Vector<float, 3> &get_scale() const { return read().values.scale; }
-       const LinAl::Matrix<float, 4, 4> &get_world_matrix() const { return read().world_matrix; }
+       const Geometry::AffineTransform<float, 3> &get_world_transform() const { return read().world_transform; }
 
-       void update_world_matrix(const Transform *);
+       void update_world_transform(const Transform *);
 };
 
 } // namespace Msp::Game
index 1052f089ee34dc2f0d8baec11904d2c193a84a4a..b6229a5b3107f40dc0a1587d41c89a9d07278875 100644 (file)
@@ -25,7 +25,7 @@ void TransformPropagator::commit(Mode mode)
                        rebuild_transform_order();
 
                for(const ParentedTransform &t: transforms)
-                       t.transform->update_world_matrix(t.parent.get());
+                       t.transform->update_world_transform(t.parent.get());
                block(RDWR);
        }
 
index 8b52b885399ed6e624edd964653e91b3be143a59..fc7fd153082db9bc7d5a83c3d18240e7843cf05d 100644 (file)
@@ -43,7 +43,7 @@ void LightEmitter::set_intensity(float i)
 
 void LightEmitter::update_matrix()
 {
-       light->set_matrix(entity->get_transform()->get_world_matrix());
+       light->set_matrix(entity->get_transform()->get_world_transform().get_matrix());
 }
 
 } // namespace Msp::GameView
index 872ecce1acf5305ddfb8d87bc00230bb572ec239..1d1ff2a6ed1e8db4f5b6b44b0a108210219f5b6c 100644 (file)
@@ -27,7 +27,7 @@ void MeshRenderer::set_scene(GL::Scene *s)
 
 void MeshRenderer::update_matrix()
 {
-       instance.set_matrix(entity->get_transform()->get_world_matrix());
+       instance.set_matrix(entity->get_transform()->get_world_transform().get_matrix());
 }
 
 } // namespace Msp::GameView
index 2c1ccb6ec1daf1a134e839fb3f1aa431b74d0784..ee247bf208cc44a6e6963467c783b05bf4e0402f 100644 (file)
@@ -270,7 +270,7 @@ void Renderer::tick(Time::TimeDelta)
                {
                        Game::Handle<Game::Transform> transform = active_camera->get_entity()->get_transform();
                        if(transform)
-                               gl_camera.set_object_matrix(transform->get_world_matrix());
+                               gl_camera.set_object_matrix(transform->get_world_transform().get_matrix());
                        else
                                gl_camera.set_object_matrix(GL::Matrix());
                }
@@ -293,10 +293,10 @@ void Renderer::tick(Time::TimeDelta)
                {
                        if(tracking_anchor)
                        {
-                               const GL::Matrix &anchor_matrix = tracking_anchor->get_entity()->get_transform()->get_world_matrix();
-                               vr_tracking->set_position(anchor_matrix*GL::Vector3(0.0f, 0.0f, 0.0f));
-                               vr_tracking->set_up_direction((anchor_matrix*GL::Vector4(0.0f, 0.0f, 1.0f, 0.0f)).slice<3>(0));
-                               vr_tracking->set_forward_direction((anchor_matrix*GL::Vector4(1.0f, 0.0f, 0.0f, 0.0f)).slice<3>(0));
+                               const Geometry::AffineTransform<float, 3> &anchor_tr = tracking_anchor->get_entity()->get_transform()->get_world_transform();
+                               vr_tracking->set_position(anchor_tr.transform(LinAl::Vector<float, 3>(0.0f, 0.0f, 0.0f)));
+                               vr_tracking->set_up_direction(anchor_tr.transform_linear(LinAl::Vector<float, 3>(0.0f, 0.0f, 1.0f)));
+                               vr_tracking->set_forward_direction(anchor_tr.transform_linear(LinAl::Vector<float, 3>(1.0f, 0.0f, 0.0f)));
                        }
                        vr_tracking->update_for_render();
                }