diff --git a/MAKE.bat b/MAKE.bat index 87f9f59..1974eed 100644 --- a/MAKE.bat +++ b/MAKE.bat @@ -234,9 +234,9 @@ if "%1"=="dpush" ( if "%1"=="push" ( call make.bat tidy - if "%2"=="dp" ( + @REM if "%2"=="dp" ( call MAKE.bat dpush auto - ) + @REM ) git diff --quiet --exit-code if !ERRORLEVEL! neq 0 ( diff --git a/bind/v4k.lua b/bind/v4k.lua index e1c4570..3bee718 100644 --- a/bind/v4k.lua +++ b/bind/v4k.lua @@ -1639,7 +1639,7 @@ typedef struct lightmap_t { bool gizmo_hover(); typedef struct camera_t { mat44 view, proj; - vec3 position, updir, lookdir; + vec3 position, updir, lookdir, rightdir; float yaw, pitch, roll; float speed, fov; float near_clip, far_clip; diff --git a/demos/03-anims.c b/demos/03-anims.c index d073e54..b67bf17 100644 --- a/demos/03-anims.c +++ b/demos/03-anims.c @@ -33,7 +33,7 @@ int main() { for(int z = 0, i = 0; z < 128; ++z) { for(int x = 0; x < 128; ++x, ++i) { vec3 pos = vec3(-x*3,0,-z*3); - vec3 rot = vec3(0,0,-180); // kgirl: 0,0,0 + vec3 rot = vec3(0,180,0); // kgirl: 0,0,0 vec3 sca = vec3(1,1,1); // kgirl: 2,2,2 compose44(M[i], pos, eulerq(rot), sca); } @@ -98,7 +98,7 @@ int main() { } if( do_showgizmo ) { - static vec3 p = {0,0,0}, r = {0,0,0}, s = {1,1,1}; + static vec3 p = {0,0,0}, r = {0,-90,0}, s = {1,1,1}; gizmo(&p, &r, &s); compose44(mdl.pivot, p, eulerq(r), s); } diff --git a/depot b/depot index dc53801..3abeaa4 160000 --- a/depot +++ b/depot @@ -1 +1 @@ -Subproject commit dc53801aafff279cd12903aa85a5091d5a528ed5 +Subproject commit 3abeaa482c1c2f88db6bf5816456d5e2e1faa6fb diff --git a/engine/joint/v4k.h b/engine/joint/v4k.h index 3bd6640..badce07 100644 --- a/engine/joint/v4k.h +++ b/engine/joint/v4k.h @@ -17992,7 +17992,7 @@ API bool gizmo_hover(); typedef struct camera_t { mat44 view, proj; - vec3 position, updir, lookdir; + vec3 position, updir, lookdir, rightdir; float yaw, pitch, roll; // mirror of (x,y) lookdir in deg; float speed, fov; // fov in deg(45) float near_clip, far_clip; @@ -377415,27 +377415,20 @@ vec3 rotate3q(vec3 v, quat r) { // rotate vec3 by quat @testme } // euler <-> quat -vec3 euler (quat q) { // bugs? returns PitchYawRoll (PYR) in degrees. ref: https://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles - float sr_cp = 2*(q.x*q.y + q.z*q.w), cr_cp = 1-2*(q.y*q.y + q.z*q.z); - float sy_cp = 2*(q.x*q.w + q.y*q.z), cy_cp = 1-2*(q.z*q.z + q.w*q.w), sp = 2*(q.x*q.z-q.w*q.y); - float p = fabs(sp) >= 1 ? copysignf(C_PI / 2, sp) : asinf(sp); - float y = atan2f(sy_cp, cy_cp); - float r = atan2f(sr_cp, cr_cp); - return scale3(vec3(p, y, r), TO_DEG); +vec3 euler (quat q) { // returns YawPitchRoll (YPR) in degrees. ref: https://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles + float sr_cy = 2*(q.z*q.w + q.x*q.y), cr_cy = 1-2*(q.y*q.y + q.z*q.z); + float sp_cy = 2*(q.y*q.w - q.x*q.z), cp_cy = 1-2*(q.z*q.z + q.w*q.w), sy = 2*(q.x*q.w+q.y*q.z); + float y = fabs(sy) >= 1 ? copysignf(C_PI / 2, sy) : asinf(sy); + float p = atan2f(sp_cy, cp_cy); + float r = atan2f(sr_cy, cr_cy); + return scale3(vec3(y, p, r), TO_DEG); } -quat eulerq (vec3 pyr_degrees) { // bugs? -#if 0 - quat x = vec3q(vec3(1,0,0),rad(pyr_degrees.x)); // x, not pitch - quat y = vec3q(vec3(0,1,0),rad(pyr_degrees.y)); // y, not yaw - quat z = vec3q(vec3(0,0,1),rad(pyr_degrees.z)); // z, not row - return normq(mulq(mulq(x, y), z)); -#else +quat eulerq (vec3 pyr_degrees) { float p = rad(pyr_degrees.x), y = rad(pyr_degrees.y), r = rad(pyr_degrees.z); - float ha = p * 0.5f, hb = r * 0.5f, hc = y * 0.5f; + float ha = y * 0.5f, hb = r * 0.5f, hc = p * 0.5f; float cp = cosf(ha), sp = sinf(ha), cr = cosf(hb), sr = sinf(hb), cy = cosf(hc), sy = sinf(hc); - return quat(sy*cr*cp - cy*sr*sp, cy*sr*cp - sy*cr*sp, cy*cr*sp + sy*sr*cp, cy*cr*cp + sy*sr*sp); -#endif + return quat(cy*sr*cp - sy*cr*sp, cy*cr*sp + sy*sr*cp, sy*cr*cp - cy*sr*sp, cy*cr*cp + sy*sr*sp); } // ---------------------------------------------------------------------------- @@ -388977,6 +388970,7 @@ camera_t camera() { cam.speed = 0.50f; cam.position = vec3(10,10,10); cam.updir = vec3(0,1,0); + cam.rightdir = vec3(1,0,0); cam.fov = 45; cam.frustum_fov_multiplier = 1.5f; cam.orthographic = false; @@ -389130,6 +389124,7 @@ void camera_fps2(camera_t *cam, float yaw, float pitch, float roll) { float cosfa = cosf(r); float sinfa = sinf(r); vec3 right = cross3(cam->lookdir, up); + cam->rightdir = right; float th = dot3(cam->lookdir, up); cam->updir.x = up.x * cosfa + right.x * sinfa + cam->lookdir.x * th * (1.0f - cosfa); diff --git a/engine/split/v4k_math.c b/engine/split/v4k_math.c index 96a1c88..672f2d5 100644 --- a/engine/split/v4k_math.c +++ b/engine/split/v4k_math.c @@ -292,27 +292,20 @@ vec3 rotate3q(vec3 v, quat r) { // rotate vec3 by quat @testme } // euler <-> quat -vec3 euler (quat q) { // bugs? returns PitchYawRoll (PYR) in degrees. ref: https://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles - float sr_cp = 2*(q.x*q.y + q.z*q.w), cr_cp = 1-2*(q.y*q.y + q.z*q.z); - float sy_cp = 2*(q.x*q.w + q.y*q.z), cy_cp = 1-2*(q.z*q.z + q.w*q.w), sp = 2*(q.x*q.z-q.w*q.y); - float p = fabs(sp) >= 1 ? copysignf(C_PI / 2, sp) : asinf(sp); - float y = atan2f(sy_cp, cy_cp); - float r = atan2f(sr_cp, cr_cp); - return scale3(vec3(p, y, r), TO_DEG); +vec3 euler (quat q) { // returns YawPitchRoll (YPR) in degrees. ref: https://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles + float sr_cy = 2*(q.z*q.w + q.x*q.y), cr_cy = 1-2*(q.y*q.y + q.z*q.z); + float sp_cy = 2*(q.y*q.w - q.x*q.z), cp_cy = 1-2*(q.z*q.z + q.w*q.w), sy = 2*(q.x*q.w+q.y*q.z); + float y = fabs(sy) >= 1 ? copysignf(C_PI / 2, sy) : asinf(sy); + float p = atan2f(sp_cy, cp_cy); + float r = atan2f(sr_cy, cr_cy); + return scale3(vec3(y, p, r), TO_DEG); } -quat eulerq (vec3 pyr_degrees) { // bugs? -#if 0 - quat x = vec3q(vec3(1,0,0),rad(pyr_degrees.x)); // x, not pitch - quat y = vec3q(vec3(0,1,0),rad(pyr_degrees.y)); // y, not yaw - quat z = vec3q(vec3(0,0,1),rad(pyr_degrees.z)); // z, not row - return normq(mulq(mulq(x, y), z)); -#else +quat eulerq (vec3 pyr_degrees) { float p = rad(pyr_degrees.x), y = rad(pyr_degrees.y), r = rad(pyr_degrees.z); - float ha = p * 0.5f, hb = r * 0.5f, hc = y * 0.5f; + float ha = y * 0.5f, hb = r * 0.5f, hc = p * 0.5f; float cp = cosf(ha), sp = sinf(ha), cr = cosf(hb), sr = sinf(hb), cy = cosf(hc), sy = sinf(hc); - return quat(sy*cr*cp - cy*sr*sp, cy*sr*cp - sy*cr*sp, cy*cr*sp + sy*sr*cp, cy*cr*cp + sy*sr*sp); -#endif + return quat(cy*sr*cp - sy*cr*sp, cy*cr*sp + sy*sr*cp, sy*cr*cp - cy*sr*sp, cy*cr*cp + sy*sr*sp); } // ---------------------------------------------------------------------------- diff --git a/engine/split/v4k_scene.c b/engine/split/v4k_scene.c index 4f3569c..0530177 100644 --- a/engine/split/v4k_scene.c +++ b/engine/split/v4k_scene.c @@ -11,6 +11,7 @@ camera_t camera() { cam.speed = 0.50f; cam.position = vec3(10,10,10); cam.updir = vec3(0,1,0); + cam.rightdir = vec3(1,0,0); cam.fov = 45; cam.frustum_fov_multiplier = 1.5f; cam.orthographic = false; @@ -164,6 +165,7 @@ void camera_fps2(camera_t *cam, float yaw, float pitch, float roll) { float cosfa = cosf(r); float sinfa = sinf(r); vec3 right = cross3(cam->lookdir, up); + cam->rightdir = right; float th = dot3(cam->lookdir, up); cam->updir.x = up.x * cosfa + right.x * sinfa + cam->lookdir.x * th * (1.0f - cosfa); diff --git a/engine/split/v4k_scene.h b/engine/split/v4k_scene.h index abf8012..7e97bbd 100644 --- a/engine/split/v4k_scene.h +++ b/engine/split/v4k_scene.h @@ -6,7 +6,7 @@ typedef struct camera_t { mat44 view, proj; - vec3 position, updir, lookdir; + vec3 position, updir, lookdir, rightdir; float yaw, pitch, roll; // mirror of (x,y) lookdir in deg; float speed, fov; // fov in deg(45) float near_clip, far_clip; diff --git a/engine/v4k.c b/engine/v4k.c index 73e6789..d54c7a7 100644 --- a/engine/v4k.c +++ b/engine/v4k.c @@ -12445,27 +12445,20 @@ vec3 rotate3q(vec3 v, quat r) { // rotate vec3 by quat @testme } // euler <-> quat -vec3 euler (quat q) { // bugs? returns PitchYawRoll (PYR) in degrees. ref: https://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles - float sr_cp = 2*(q.x*q.y + q.z*q.w), cr_cp = 1-2*(q.y*q.y + q.z*q.z); - float sy_cp = 2*(q.x*q.w + q.y*q.z), cy_cp = 1-2*(q.z*q.z + q.w*q.w), sp = 2*(q.x*q.z-q.w*q.y); - float p = fabs(sp) >= 1 ? copysignf(C_PI / 2, sp) : asinf(sp); - float y = atan2f(sy_cp, cy_cp); - float r = atan2f(sr_cp, cr_cp); - return scale3(vec3(p, y, r), TO_DEG); +vec3 euler (quat q) { // returns YawPitchRoll (YPR) in degrees. ref: https://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles + float sr_cy = 2*(q.z*q.w + q.x*q.y), cr_cy = 1-2*(q.y*q.y + q.z*q.z); + float sp_cy = 2*(q.y*q.w - q.x*q.z), cp_cy = 1-2*(q.z*q.z + q.w*q.w), sy = 2*(q.x*q.w+q.y*q.z); + float y = fabs(sy) >= 1 ? copysignf(C_PI / 2, sy) : asinf(sy); + float p = atan2f(sp_cy, cp_cy); + float r = atan2f(sr_cy, cr_cy); + return scale3(vec3(y, p, r), TO_DEG); } -quat eulerq (vec3 pyr_degrees) { // bugs? -#if 0 - quat x = vec3q(vec3(1,0,0),rad(pyr_degrees.x)); // x, not pitch - quat y = vec3q(vec3(0,1,0),rad(pyr_degrees.y)); // y, not yaw - quat z = vec3q(vec3(0,0,1),rad(pyr_degrees.z)); // z, not row - return normq(mulq(mulq(x, y), z)); -#else +quat eulerq (vec3 pyr_degrees) { float p = rad(pyr_degrees.x), y = rad(pyr_degrees.y), r = rad(pyr_degrees.z); - float ha = p * 0.5f, hb = r * 0.5f, hc = y * 0.5f; + float ha = y * 0.5f, hb = r * 0.5f, hc = p * 0.5f; float cp = cosf(ha), sp = sinf(ha), cr = cosf(hb), sr = sinf(hb), cy = cosf(hc), sy = sinf(hc); - return quat(sy*cr*cp - cy*sr*sp, cy*sr*cp - sy*cr*sp, cy*cr*sp + sy*sr*cp, cy*cr*cp + sy*sr*sp); -#endif + return quat(cy*sr*cp - sy*cr*sp, cy*cr*sp + sy*sr*cp, sy*cr*cp - cy*sr*sp, cy*cr*cp + sy*sr*sp); } // ---------------------------------------------------------------------------- @@ -24007,6 +24000,7 @@ camera_t camera() { cam.speed = 0.50f; cam.position = vec3(10,10,10); cam.updir = vec3(0,1,0); + cam.rightdir = vec3(1,0,0); cam.fov = 45; cam.frustum_fov_multiplier = 1.5f; cam.orthographic = false; @@ -24160,6 +24154,7 @@ void camera_fps2(camera_t *cam, float yaw, float pitch, float roll) { float cosfa = cosf(r); float sinfa = sinf(r); vec3 right = cross3(cam->lookdir, up); + cam->rightdir = right; float th = dot3(cam->lookdir, up); cam->updir.x = up.x * cosfa + right.x * sinfa + cam->lookdir.x * th * (1.0f - cosfa); diff --git a/engine/v4k.h b/engine/v4k.h index c5dd782..d789780 100644 --- a/engine/v4k.h +++ b/engine/v4k.h @@ -4059,7 +4059,7 @@ API bool gizmo_hover(); typedef struct camera_t { mat44 view, proj; - vec3 position, updir, lookdir; + vec3 position, updir, lookdir, rightdir; float yaw, pitch, roll; // mirror of (x,y) lookdir in deg; float speed, fov; // fov in deg(45) float near_clip, far_clip;