#include "raylib.h" #include "raymath.h" // Required for: Vector3, Quaternion and Matrix functionality #include "utils.h" // Required for: TRACELOG(), LoadFileData(), LoadFileText(), SaveFileText() #include #include #include #include #include "../libvitaboy/libvitaboy.hpp" #define SCREEN_WIDTH (800) #define SCREEN_HEIGHT (600) #define WINDOW_TITLE "libvitaboy - Renderer - Ray" //we dont look in this mess for now #pragma region TSO //util static bool Read(const char* Filename, uint8_t** InData) { *InData = File::ReadFile(Filename); if (*InData != NULL) { VBFile.set(*InData, File::FileSize); return true; } return false; } //globals //skeleton static Skeleton_t Skeleton; static Model box_model; static void DrawBonesSkeleton(Bone_t& Bone, const Matrix& M) { Vector3 bonePos = Vector3{ Bone.Translation.x, Bone.Translation.y, Bone.Translation.z }; const Vector3 scale = { 1.f, 1.f, 1.f }; Vector3 axis{ Vector3Zero()}; float angle{ 0 }; const Quaternion rotation = Quaternion{ Bone.Rotation.x, Bone.Rotation.y, Bone.Rotation.z, Bone.Rotation.w }; QuaternionToAxisAngle(rotation, &axis, &angle); Matrix matScale = MatrixScale(scale.x, scale.y, scale.z); Matrix matRotation = MatrixRotate(axis, angle); Matrix matTranslation = MatrixTranslate(bonePos.x, bonePos.y, bonePos.z); //this order is correct, see //Matrix matTransform = MatrixMultiply(MatrixMultiply(matScale, matTranslation), matRotation); Matrix matTransform = MatrixMultiply(matScale, matTranslation); Matrix modelMatrix = MatrixMultiply(M, matTransform); Color color; if(!strcmp(Bone.Name, "ROOT")) { color = RED; } else if(!strcmp(Bone.Name, "HEAD")) { color = YELLOW; } else { color = GREEN; } DrawModel(box_model, Vector3Transform(bonePos, M), 1.f, color); for (unsigned i = 0; i < Bone.ChildrenCount; i++) { DrawBonesSkeleton(*Bone.Children[i], modelMatrix); } } static int counter = 0; static void DrawTest(const Matrix& M) { Vector3 rootPosition = Vector3Transform(Vector3{ 0.f, 0.f, 0.f }, M); DrawModel (box_model, //root rootPosition, 1.f, YELLOW); DrawModel(box_model, //x Vector3Transform(Vector3{ 1.f, 0.f, 0.f }, M), 1.f, RED); DrawModel(box_model, //y Vector3Transform(Vector3{ 0.f, 1.f, 0.f }, M), 1.f, GREEN); DrawModel(box_model, //z Vector3Transform(Vector3{ 0.f, 0.f, 1.f }, M), 1.f, BLUE); Vector3 scale = { 1.f, 1.f, 1.f }; Vector3 rotationAxis = { 0.0f, 0.0f, 1.0f }; Matrix matScale = MatrixScale(scale.x, scale.y, scale.z); Matrix matRotation = MatrixRotate(rotationAxis, 45.f * DEG2RAD); Matrix matTranslation = MatrixTranslate(5.f, 0.f, 0.f); //transform 5 in the X direction // https://github.com/JipBoesenkool/CSE167F17_Project4/blob/master/src/renderer/model/Transform.cpp // SRT = iTRS, for absolute // STR = iRTS, for local transforms Matrix matTransform = MatrixMultiply(MatrixMultiply(matScale, matTranslation), matRotation); Matrix modelMatrix = MatrixMultiply(M, matTransform); if (counter < 3) { counter++; DrawTest(modelMatrix); } counter = 0; } //animation static Animation_t Animation; static float AnimationTime = 0; static void AdvanceFrame(Skeleton_t& Skeleton, Animation_t& Animation, float TimeDelta) { float Duration = (float)Animation.Motions[0].FrameCount/30; AnimationTime += TimeDelta; AnimationTime = fmodf(AnimationTime, Duration); //Loop the animation for(unsigned i=0; i