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); } }