53 lines
1.7 KiB
C++
53 lines
1.7 KiB
C++
|
#define CGLTF_IMPLEMENTATION
|
||
|
#include "../cgltf.h"
|
||
|
|
||
|
// Performs matrix-vector multiplication, as in (4x4) * (4x1) = (4x1)
|
||
|
static void transform(const cgltf_float matrix[16], const cgltf_float source[4], cgltf_float target[4]) {
|
||
|
target[0] = matrix[0] * source[0] + matrix[4] * source[1] + matrix[ 8] * source[2] + matrix[12] * source[3];
|
||
|
target[1] = matrix[1] * source[0] + matrix[5] * source[1] + matrix[ 9] * source[2] + matrix[13] * source[3];
|
||
|
target[2] = matrix[2] * source[0] + matrix[6] * source[1] + matrix[10] * source[2] + matrix[14] * source[3];
|
||
|
target[3] = matrix[3] * source[0] + matrix[7] * source[1] + matrix[11] * source[2] + matrix[15] * source[3];
|
||
|
}
|
||
|
|
||
|
static void set(cgltf_float target[3], float x, float y, float z) {
|
||
|
target[0] = x;
|
||
|
target[1] = y;
|
||
|
target[2] = z;
|
||
|
}
|
||
|
|
||
|
static void check(cgltf_float target[3], float x, float y, float z) {
|
||
|
if (target[0] != x || target[1] != y || target[2] != z) {
|
||
|
fprintf(stderr, "Mismatch detected.\n");
|
||
|
exit(1);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int main(int, char**)
|
||
|
{
|
||
|
cgltf_node node = {};
|
||
|
|
||
|
cgltf_float matrix[16];
|
||
|
cgltf_float source[4] = {1, 2, 3, 1};
|
||
|
cgltf_float target[4];
|
||
|
|
||
|
set(node.scale, 1, 1, 1);
|
||
|
set(node.translation, 1, 0, 0);
|
||
|
cgltf_node_transform_local(&node, matrix);
|
||
|
transform(matrix, source, target);
|
||
|
check(target, 2, 2, 3);
|
||
|
|
||
|
set(node.scale, 3, 1, 1);
|
||
|
set(node.translation, 0, 0, 0);
|
||
|
cgltf_node_transform_local(&node, matrix);
|
||
|
transform(matrix, source, target);
|
||
|
check(target, 3, 2, 3);
|
||
|
|
||
|
set(node.scale, 1, 3, 1);
|
||
|
set(node.translation, 1, 0, 0);
|
||
|
cgltf_node_transform_local(&node, matrix);
|
||
|
transform(matrix, source, target);
|
||
|
check(target, 2, 6, 3);
|
||
|
|
||
|
return 0;
|
||
|
}
|