1
0
Fork 0
2022-untitled-game/code/game/engine/node.c

70 lines
1.6 KiB
C

mat4
calc_matrix(transform_t* transform)
{
mat4 translation = mat4_identity();
translation.e03 = transform->position.x;
translation.e13 = transform->position.y;
translation.e23 = transform->position.z;
mat4 rotation;
{
mat4 rotation_x = mat4_identity();
{
float cos_angle = cosf(transform->rotation.x);
float sin_angle = sinf(transform->rotation.x);
rotation_x.e11 = cos_angle;
rotation_x.e12 = -sin_angle;
rotation_x.e21 = sin_angle;
rotation_x.e22 = cos_angle;
}
mat4 rotation_y = mat4_identity();
{
float cos_angle = cosf(transform->rotation.y);
float sin_angle = sinf(transform->rotation.y);
rotation_y.e00 = cos_angle;
rotation_y.e02 = sin_angle;
rotation_y.e20 = -sin_angle;
rotation_y.e22 = cos_angle;
}
mat4 rotation_z = mat4_identity();
{
float cos_angle = cosf(transform->rotation.z);
float sin_angle = sinf(transform->rotation.z);
rotation_z.e00 = cos_angle;
rotation_z.e01 = -sin_angle;
rotation_z.e10 = sin_angle;
rotation_z.e11 = cos_angle;
}
rotation = mat4_multm(rotation_z, mat4_multm(rotation_y, rotation_x));
}
mat4 scale = mat4_identity();
scale.e00 = transform->scale.x;
scale.e11 = transform->scale.y;
scale.e22 = transform->scale.z;
mat4 result = mat4_multm(translation, mat4_multm(rotation, scale));
return result;
}
void
update_transform(transform_t* transform)
{
transform_t* parent = get_transform(transform->parent);
transform->matrix = mat4_multm(parent->matrix, calc_matrix(transform));
for (size_t i = 0; i < transform->child_count; i++)
{
transform_t* child = get_transform(transform->children[i]);
update_transform(child);
}
}