diff --git a/src/core/transformable.c b/src/core/transformable.c index ef596f9..e548780 100644 --- a/src/core/transformable.c +++ b/src/core/transformable.c @@ -1,4 +1,5 @@ #include "transformable.h" +#include "utils/debug.h" Transform TransformIdentity() { return (Transform){ @@ -8,14 +9,10 @@ Transform TransformIdentity() { }; } - Matrix TransformGetMatrix(Transform self) { Matrix mat = MatrixScale(self.scale.x, self.scale.y, self.scale.z); mat = MatrixMultiply(mat, QuaternionToMatrix(self.rotation)); - mat.m12 = self.translation.x; - mat.m13 = self.translation.y; - mat.m14 = self.translation.z; - return mat; + return MatrixMultiply(mat, MatrixTranslate(self.translation.x, self.translation.y, self.translation.z)); } Vector3 TransformPosition(Transform self, Vector3 local_pos) { @@ -61,7 +58,7 @@ Vector3 InverseTransformScale(Transform self, Vector3 global_scale) { } Quaternion InverseTransformRotation(Transform self, Quaternion global_rotation) { - return QuaternionMultiply(QuaternionInvert(self.rotation), global_rotation); + return QuaternionDivide(self.rotation, global_rotation); } Transform InverseTransformTransform(Transform self, Transform other) { diff --git a/src/core/transformable.h b/src/core/transformable.h index ac9db49..bab525e 100644 --- a/src/core/transformable.h +++ b/src/core/transformable.h @@ -42,8 +42,8 @@ extern Vector3 InverseTransformScale(Transform self, Vector3 global_scale); extern Quaternion InverseTransformRotation(Transform self, Quaternion quat); extern Transform InverseTransformTransform(Transform self, Transform other); -#define MATRIX_UP(self_) ((Vector3){self_.m0, self_.m1, self_.m2}) -#define MATRIX_RIGHT(self_) ((Vector3){self_.m4, self_.m5, self_.m6}) +#define MATRIX_RIGHT(self_) ((Vector3){self_.m0, self_.m1, self_.m2}) +#define MATRIX_UP(self_) ((Vector3){self_.m4, self_.m5, self_.m6}) #define MATRIX_FORWARD(self_) ((Vector3){self_.m8, self_.m9, self_.m10}) #define VECTOR3_RIGHT ((Vector3){1.f, 0.f, 0.f}) diff --git a/src/main.c b/src/main.c index 22425b4..481ebac 100644 --- a/src/main.c +++ b/src/main.c @@ -10,26 +10,19 @@ Scene *CreateInitialScene() { SceneNode *root = CreateTransformNode(); - SceneNode *camera_parent_parent = CreateTransformNode(); - // create parent of camera parent to test transform hierarchy - Transformable transformable = TC_CAST(camera_parent_parent->entity, Transformable); - Transform transform = transformable.tc->get_transform(transformable.data); - transform.translation = (Vector3){10.f, 0.f, 0.f}; - transform.rotation = QuaternionFromEuler(0.f, -10.f * DEG2RAD, 0.f); - transformable.tc->set_transform(transformable.data, transform); - // create camera with a transform parent - SceneNodeAddChild(root, camera_parent_parent); SceneNode *camera_parent = CreateTransformNode(); // set camera parent location - transformable = TC_CAST(camera_parent->entity, Transformable); - transform = transformable.tc->get_transform(transformable.data); + Transformable transformable = TC_CAST(camera_parent->entity, Transformable); + Transform transform = transformable.tc->get_transform(transformable.data); transform.translation = (Vector3){0.f, 10.f, -10.f}; transform.rotation = QuaternionFromEuler(45.f * DEG2RAD, 0.f, 0.f); transformable.tc->set_transform(transformable.data, transform); - SceneNodeAddChild(camera_parent_parent, camera_parent); SceneNodeAddChild(camera_parent, CreateCameraNode()); - SceneNodeAddChild(camera_parent, CreateTestObject()); - SceneNodeAddChild(root, CreateMeshRenderEntity("spacefighter.glb")); + SceneNode *model_parent = CreateTransformNode(); + SceneNodeAddChild(root, model_parent); + SceneNodeAddChild(model_parent, camera_parent); + SceneNodeAddChild(model_parent, CreateMeshRenderEntity("spacefighter.glb")); + SceneNodeAddChild(model_parent, CreateTestObject()); return CreateScene(root); } diff --git a/src/test_object.c b/src/test_object.c index f744fc0..189ac22 100644 --- a/src/test_object.c +++ b/src/test_object.c @@ -44,7 +44,10 @@ void TestObjectDraw(TestObject *self) { } void TestObjectTick(TestObject *self, double delta) { - Transform local_transform = self->transform.tc->get_transform(self->transform.data); - local_transform.rotation = QuaternionMultiply(QuaternionFromEuler(0.f, 0.01f, 0.f), local_transform.rotation); - self->transform.tc->set_transform(self->transform.data, local_transform); + Transform global_transform = self->transform.tc->get_global_transform(self->transform.data); + Matrix global_matrix = TransformGetMatrix(global_transform); + global_transform.rotation = QuaternionMultiply(global_transform.rotation, QuaternionFromAxisAngle(MATRIX_UP(global_matrix), 0.01f)); + global_matrix = TransformGetMatrix(global_transform); + global_transform.translation = Vector3Add(global_transform.translation, Vector3Scale(MATRIX_FORWARD(global_matrix), 0.1f)); + self->transform.tc->set_global_transform(self->transform.data, global_transform); }