From 414ad9688d0cd3da2f5768b758af6f2668e29ecc Mon Sep 17 00:00:00 2001 From: Guillaume Blanc Date: Sat, 23 Sep 2023 18:28:10 +0200 Subject: [PATCH 1/5] Adds touchpoints support. --- src/impl/orbit_camera.cpp | 39 ++++++++++++++++++++++++++++++++++++++- src/impl/orbit_camera.h | 5 +++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/src/impl/orbit_camera.cpp b/src/impl/orbit_camera.cpp index 7be7444..376cb7c 100644 --- a/src/impl/orbit_camera.cpp +++ b/src/impl/orbit_camera.cpp @@ -6,7 +6,6 @@ #include "flip/math.h" #include "imgui/imgui.h" -#include "sokol/sokol_app.h" namespace flip { @@ -108,6 +107,44 @@ bool OrbitCamera::Event(const sapp_event& _event) { } } break; + case SAPP_EVENTTYPE_TOUCHES_BEGAN: + for (int i = 0; i < _event.num_touches; ++i) { + const auto& touch = _event.touches[i]; + last_touches_[touch.identifier].X = touch.pos_x; + last_touches_[touch.identifier].Y = touch.pos_y; + } + break; + case SAPP_EVENTTYPE_TOUCHES_MOVED: + if (_event.num_touches == 1) { + const auto& touch = _event.touches[0]; + const auto& last_touch = last_touches_[touch.identifier]; + const auto mouse_offset = + HMM_Vec2{touch.pos_x - last_touch.X, touch.pos_y - last_touch.Y} * + kOrbitTouchFactor; + Orbit(mouse_offset.X, mouse_offset.Y); + } else if (_event.num_touches == 2) { + const auto& touch0 = _event.touches[0]; + const auto& touch1 = _event.touches[1]; + + const auto v0 = HMM_Vec2{touch0.pos_x, touch0.pos_y}; + const auto v1 = HMM_Vec2{touch1.pos_x, touch1.pos_y}; + + const auto& prev_v0 = last_touches_[touch0.identifier]; + const auto& prev_v1 = last_touches_[touch1.identifier]; + + const float length0 = HMM_LenV2(v1 - v0); + const float length1 = HMM_LenV2(prev_v1 - prev_v0); + + Zoom((length1 - length0) * kZoomTouchFactor); + } + + // Updates all touch coords + for (int i = 0; i < _event.num_touches; ++i) { + const auto& touch = _event.touches[i]; + last_touches_[touch.identifier].X = touch.pos_x; + last_touches_[touch.identifier].Y = touch.pos_y; + } + break; default: break; } diff --git a/src/impl/orbit_camera.h b/src/impl/orbit_camera.h index 1022a35..78c4632 100644 --- a/src/impl/orbit_camera.h +++ b/src/impl/orbit_camera.h @@ -1,6 +1,7 @@ #pragma once #include "flip/camera.h" +#include "sokol/sokol_app.h" namespace flip { @@ -24,14 +25,18 @@ class OrbitCamera : public Camera { bool Pan(float _dx, float _dy); bool Move(float _dx, float _dy); + HMM_Vec2 last_touches_[SAPP_MAX_TOUCHPOINTS]; + const float kMinDist = 1.f; const float kMaxDist = 100.f; const float kMinLat = -kPi_2 * .95f; const float kMaxLat = kPi_2 * .95f; const float kOrbitFactor = .01f; + const float kOrbitTouchFactor = .3f; const float kPanFactor = .002f; const float kMoveFactor = .002f; const float kZoomFactor = .5f; + const float kZoomTouchFactor = .02f; float distance_ = 7.f; float latitude_ = 0.f; From 3ee77c439513499df569e4f4d0b67a47efb7874e Mon Sep 17 00:00:00 2001 From: Guillaume Blanc Date: Sat, 23 Sep 2023 19:16:58 +0200 Subject: [PATCH 2/5] Adds grey icons --- samples/media/flip_grey_128.png | Bin 0 -> 11204 bytes samples/media/flip_grey_256.png | Bin 0 -> 13842 bytes samples/media/flip_grey_32.png | Bin 0 -> 6311 bytes samples/media/flip_grey_512.png | Bin 0 -> 12166 bytes samples/media/flip_grey_64.png | Bin 0 -> 8761 bytes 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 samples/media/flip_grey_128.png create mode 100644 samples/media/flip_grey_256.png create mode 100644 samples/media/flip_grey_32.png create mode 100644 samples/media/flip_grey_512.png create mode 100644 samples/media/flip_grey_64.png diff --git a/samples/media/flip_grey_128.png b/samples/media/flip_grey_128.png new file mode 100644 index 0000000000000000000000000000000000000000..5e1c850c325c98bce9d6989a5e331149cf340526 GIT binary patch literal 11204 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 Iik1QY2c7rjf&c&j literal 0 HcmV?d00001 diff --git a/samples/media/flip_grey_256.png b/samples/media/flip_grey_256.png new file mode 100644 index 0000000000000000000000000000000000000000..fe3adf362596019cc971a84dd17e0ee4b119a80e GIT binary patch literal 13842 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 OKwI5FtxCn=*8c)A^nqUh literal 0 HcmV?d00001 diff --git a/samples/media/flip_grey_32.png b/samples/media/flip_grey_32.png new file mode 100644 index 0000000000000000000000000000000000000000..a7581fb24bb0fbc06a5b4c0cd0037d598f87b63d GIT binary patch literal 6311 zcmeHLc~}$I7LQ^P5GvvV1(Y;^+QMX=KoSyA_8a+d~3T{8#lTDv%$Le#DLWh2e;XnbS=9Y}3@(2-*CY{p5Su@3L+x0T2eKVRM5 z10LF#IbTN>XvG&)WEs!>mPlT|w zH`x97)Mw;hTKcW-m*a}a2mOx}iaTu9WG=`Tfp*JL@>X%)w@y3CT=fA5o|dr-RR_Py z2c85D_-{JHyI-hF60>g?6?{|vpbh=G<_f?5v(JCsQV$g5v)kMAD%)?|MVmt^zU zkH@VaCZw;SsgtiA!BdQ+Mo^83K4$ z!B^0i1}H63038)1QpD-ZE}; z-}j0-p6uRw>Rox9@WPDD#DD{=b;84|IQ1#V4M|-EA5Ht&`OvAY!Os`@Hgqg2Z7C3X zM-M!iTxnsW1^dk0ih_MJ2Ud3UHl{#&aYFjdNuN&bFYX8Md(r!j6;P;8>NB@~?=gAT z&*OWmDsZ?_uF`;jC~iQ&i+aVXH2<@#!(la1lQK?~3Fo1tD1VdUR$g}vYCGnG>ZR4q1Hog*mg+kCRy$w$ZD1v-?2cRb#mc3jrTdl7 z+Ha|ph_-#9D0?2OZ0(^-D+{##oxiO*OMTKvUv^o&y5P5&#DJdgPu3;R)t8f!_RNzn zJo_Z!rr#vL4R>c=Cj6YOn-S((Bfb%t&3)V{m6tk8?7Q|HY&my3N5GEH2zSViYWPHK zaPBxXL-U?R#a_2<)6W=qbU~u)`?r5o;SHP7yo{<6R=uDuY8srJo9@F;-od^!ka{pB z|9W22InVK%3gzYVN*XNMT_6M}t3QOcWtI2+o?t_Z;5?}JP960HFUsGa?1sr@n=ZxL z+d^JA3sxi$A(29e5OoPkto`9|Y(Je6f@KJb7a|g=oI|*O;uHZd6>$g)=sYq{8Gyt| zLszH}!HS4zc!dmRiU@wbR%{&$BS=6{2(L?sm#bMi4#C9B!mf?eBm&+9L1i4mLS7U; zK%qkLAQ2>zfgqhUiAwOb!n0K(F^eA_&x(;`$jMu1#`_!lrG7&H44dL#7Kpa6Qvjrg(9LMA~6hz5r_(akT(rrFd1F|l`5usgJf?IBGZOZ zM5?4%B|!1RqcT#7Fe-049RjIBF8~yIc>^E~VE{r%2m?a0m)M&^7SWi@!Dx)%C0d$*2vEqV8pVrA2N_HXo#Mryd3g=SW-_0T zsMJ`N8%Zf-B9&?~7s0Gxj1t1KO_~5n5Ry_ZF)bL+g@x?~Qx-B72gYog$2P+XP$3Yi zP(>>g@f?DY8*ijE)fApRR4uG<1#B`jff13h;D$=hACizvLpJHJz<*#8#3{7$|BmMs z^d-w|6{=OJWRa>!;c^5<|C;B|z%QBjShG{3s$}lpZ0g@|?7@5u#cUO-MfZ~ztYK0ipLMmjo1j_;JoUz(6oil#sVEVl`60VIyjJZXo z(f~3OAk(5LG!})-qI!FfsVp*?FnHucDew>N(VHn|Q0Y`ahKVtRBVq-7KO^9QAX~OO)}m|UK}gi*lT$_*6@R88+$Q}YpghdMyZUK zBC3%I@uEQf18$i8P%-|U`Eb~vb$~*djCHFxG*T=7OZR^Q9ApTW!iZe0_^Z%|Lk49T zcEiPD9-PB&E(mLP&pVo#y|KODzksk14jME$!qERMy@w6%f$lpJlqi{~u8m(^B)Ub(S@P1@LYmr}oCadpgX*H1hTU#5APr~Q61 z7SAX(q^J70JF04?)NQ@6FY->K$2azmwvTsPMw^V^*q?vYFTDDlaYr97ap5cWHNz(^ z>~ddv{BW)0C%cWCz1AY9d<}#Cczb;4;V}Mw>Z7g8`;^os!>s+=MPXCNtIm=QGXTf#3Yx4ztM~lKUC+Fp)l0M9 zVGwreVB6dF%X}Ou#zIqyAaUl0Q y@Y8m7lcKdcd3|E-muA|)Zy)I$Dz^{ZeBuTn?d literal 0 HcmV?d00001 diff --git a/samples/media/flip_grey_512.png b/samples/media/flip_grey_512.png new file mode 100644 index 0000000000000000000000000000000000000000..35078098c0ea88c052eff8cf4ab4f1824921ad54 GIT binary patch literal 12166 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 YS;|s6$lo(^%j}XF>6_|3)NzdbF9S-bP5=M^ literal 0 HcmV?d00001 diff --git a/samples/media/flip_grey_64.png b/samples/media/flip_grey_64.png new file mode 100644 index 0000000000000000000000000000000000000000..4d009a36943a2136c86437a5a427fe84c03091fa GIT binary patch literal 8761 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 A9{>OV literal 0 HcmV?d00001 From 395a4e7fff7520d235bbad878df9997ece9e38db Mon Sep 17 00:00:00 2001 From: Guillaume Blanc Date: Sat, 23 Sep 2023 19:17:12 +0200 Subject: [PATCH 3/5] Adds smaller icons --- samples/media/flip_32.png | Bin 0 -> 6618 bytes samples/media/flip_64.png | Bin 0 -> 9804 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 samples/media/flip_32.png create mode 100644 samples/media/flip_64.png diff --git a/samples/media/flip_32.png b/samples/media/flip_32.png new file mode 100644 index 0000000000000000000000000000000000000000..0d983728478b9f126ec38b08c34011116953117f GIT binary patch literal 6618 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 literal 0 HcmV?d00001 From e43c1aae1eca966a877679ebcc80ac729dbcd12b Mon Sep 17 00:00:00 2001 From: Guillaume Blanc Date: Sat, 23 Sep 2023 19:17:33 +0200 Subject: [PATCH 4/5] Uses grey icon --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a5d38e3..dceca8f 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,6 @@ - ![](samples/media/flip_128.png) + ![](samples/media/flip_grey_256.png) + + [Check live wasm samples](https://guillaumeblanc.github.io/flip/). Flip is a multi-platform 3D programming library designed to simplify the development of basic 3d rendering and viewing applications. From c27a473d434671f92845f32cd24e7880131b2e45 Mon Sep 17 00:00:00 2001 From: Guillaume Blanc Date: Sat, 23 Sep 2023 20:54:45 +0200 Subject: [PATCH 5/5] Adds touch pan --- src/impl/orbit_camera.cpp | 12 +++++++----- src/impl/orbit_camera.h | 1 + 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/impl/orbit_camera.cpp b/src/impl/orbit_camera.cpp index 376cb7c..0e7e168 100644 --- a/src/impl/orbit_camera.cpp +++ b/src/impl/orbit_camera.cpp @@ -129,13 +129,15 @@ bool OrbitCamera::Event(const sapp_event& _event) { const auto v0 = HMM_Vec2{touch0.pos_x, touch0.pos_y}; const auto v1 = HMM_Vec2{touch1.pos_x, touch1.pos_y}; - const auto& prev_v0 = last_touches_[touch0.identifier]; - const auto& prev_v1 = last_touches_[touch1.identifier]; + const auto& pv0 = last_touches_[touch0.identifier]; + const auto& pv1 = last_touches_[touch1.identifier]; - const float length0 = HMM_LenV2(v1 - v0); - const float length1 = HMM_LenV2(prev_v1 - prev_v0); + Zoom((HMM_LenV2(pv1 - pv0) - HMM_LenV2(v1 - v0)) * kZoomTouchFactor); - Zoom((length1 - length0) * kZoomTouchFactor); + const auto m = (v1 + v0) / 2; + const auto pm = (pv1 + pv0) / 2; + const auto dm = (m - pm) * kPanTouchFactor; + Pan(dm.X, dm.Y); } // Updates all touch coords diff --git a/src/impl/orbit_camera.h b/src/impl/orbit_camera.h index 78c4632..90dd364 100644 --- a/src/impl/orbit_camera.h +++ b/src/impl/orbit_camera.h @@ -34,6 +34,7 @@ class OrbitCamera : public Camera { const float kOrbitFactor = .01f; const float kOrbitTouchFactor = .3f; const float kPanFactor = .002f; + const float kPanTouchFactor = .05f; const float kMoveFactor = .002f; const float kZoomFactor = .5f; const float kZoomTouchFactor = .02f;