diff --git a/library/libvitaboy/Renderer.cpp b/library/libvitaboy/Renderer.cpp index c4d8add..49b38eb 100644 --- a/library/libvitaboy/Renderer.cpp +++ b/library/libvitaboy/Renderer.cpp @@ -255,7 +255,7 @@ static void DrawMeshes() glColor3f(1.0, 1.0, 1.0); glPushMatrix(); glLoadIdentity(); - TransformVertices(Skeleton.Bones[0]); + //TransformVertices(Skeleton.Bones[0]); glPopMatrix(); BlendVertices(); @@ -424,7 +424,7 @@ static int Startup() ReadAnimation(Animation); free(InData); - AdvanceFrame(Skeleton, Animation, 0); + //AdvanceFrame(Skeleton, Animation, 0); return 1; } diff --git a/library/renderdemo_ray/main.cpp b/library/renderdemo_ray/main.cpp index 6e6c197..d905829 100644 --- a/library/renderdemo_ray/main.cpp +++ b/library/renderdemo_ray/main.cpp @@ -3,13 +3,14 @@ #include "utils.h" // Required for: TRACELOG(), LoadFileData(), LoadFileText(), SaveFileText() #include +#include #include #include #include "../libvitaboy/libvitaboy.hpp" -#define SCREEN_WIDTH (1920) -#define SCREEN_HEIGHT (1080) +#define SCREEN_WIDTH (800) +#define SCREEN_HEIGHT (600) #define WINDOW_TITLE "libvitaboy - Renderer - Ray" //we dont look in this mess for now @@ -28,10 +29,26 @@ static bool Read(const char* Filename, uint8_t** InData) { //globals //skeleton static Skeleton_t Skeleton; -static void DrawBonesSkeleton(Bone_t& Bone) +static Model box_model; +static void DrawBonesSkeleton(Bone_t& Bone, const Matrix& M) { - const float size = 0.1f; - const Vector3 position{Bone.Translation.x, Bone.Translation.y, Bone.Translation.z}; + 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")) { @@ -45,25 +62,55 @@ static void DrawBonesSkeleton(Bone_t& Bone) { color = GREEN; } - DrawCube(position, size, size, size, color); + DrawModel(box_model, Vector3Transform(bonePos, M), 1.f, color); + + for (unsigned i = 0; i < Bone.ChildrenCount; i++) + { + DrawBonesSkeleton(*Bone.Children[i], modelMatrix); + } +} - if(Bone.ChildrenCount == 1) +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) { - DrawBonesSkeleton(*Bone.Children[0]); - } - else if(Bone.ChildrenCount > 1) - { - for(unsigned i=0; i