From bc416b7a9800cf408ea95a1e580089d537c1385f Mon Sep 17 00:00:00 2001 From: spatialfree Date: Tue, 9 Jan 2024 15:48:00 -0500 Subject: [PATCH] testing --- README.md | 10 ---- add/shaders/above.hlsl | 12 +++-- add/shaders/compositor.hlsl | 41 +++------------- oriels.csproj | 4 +- oriels.sln | 25 ++++++++++ src/Functions.cs | 19 +++++++- src/Functions/clasp/pattern copy.txt | 16 +++++++ src/Functions/clasp/pattern.txt | 4 ++ src/Functions/stretch/pattern.txt | 0 src/Interactions/rolls-cursor/RollsCursor.cs | 14 +++--- src/Mono.cs | 50 ++++++++++++++++---- src/PR.cs | 23 +++++++-- src/Rig.cs | 16 ++++--- src/_Init.cs | 2 +- 14 files changed, 158 insertions(+), 78 deletions(-) create mode 100644 oriels.sln create mode 100644 src/Functions/clasp/pattern copy.txt create mode 100644 src/Functions/clasp/pattern.txt create mode 100644 src/Functions/stretch/pattern.txt diff --git a/README.md b/README.md index 9ab86a5..77aa96e 100644 --- a/README.md +++ b/README.md @@ -21,13 +21,3 @@ mapped by ###



- - start() - c# net6.0 sdk - git &| github - vim || vscode - - dotnet restore - - dotnet build - dotnet run diff --git a/add/shaders/above.hlsl b/add/shaders/above.hlsl index f8ef30f..f811bb6 100644 --- a/add/shaders/above.hlsl +++ b/add/shaders/above.hlsl @@ -21,6 +21,7 @@ struct vsIn { }; struct psIn { float4 pos : SV_Position; + float3 norm : NORMAL0; float2 uv : TEXCOORD0; float4 world : WORLD; float4 color : COLOR0; @@ -38,11 +39,11 @@ psIn vs(vsIn input, uint id : SV_InstanceID) { o.world = mul(input.pos, sk_inst[id].world); o.pos = mul(o.world, sk_viewproj[o.view_id]); - float3 normal = normalize(mul(input.norm, (float3x3)sk_inst[id].world)); + o.norm = normalize(mul(input.norm, (float3x3)sk_inst[id].world)); o.uv = input.uv * tex_scale; o.color = color * input.col * sk_inst[id].color; - o.color.rgb *= Lighting(normal); + o.color.rgb *= Lighting(o.norm); return o; } @@ -62,5 +63,10 @@ float4 ps(psIn input) : SV_TARGET { // dist magnitude from center X0Z float dist = max(1 - (length(input.world.xz) / 10.0), 0.0); - return lerp(clearcolor, col, 1 - ((1 - dist) * (1 - dist))); + float4 color = lerp(clearcolor, col, 1 - ((1 - dist) * (1 - dist))); + + float glow = sk_finger_glow(input.world.xyz, input.norm); + color.rgb += glow * 0.5; + + return color; } \ No newline at end of file diff --git a/add/shaders/compositor.hlsl b/add/shaders/compositor.hlsl index c203e8a..7b8dfa9 100644 --- a/add/shaders/compositor.hlsl +++ b/add/shaders/compositor.hlsl @@ -2,22 +2,12 @@ //--name = dofdev/compositor -//--near = white -//--far = white - -Texture2D near : register(t0); -SamplerState near_s : register(s0); - -Texture2D far : register(t1); -SamplerState far_s : register(s1); - struct vsIn { float4 pos : SV_Position; float3 norm : NORMAL0; float2 uv : TEXCOORD0; }; struct psIn { - float4 screen_pos : SV_Position; float4 pos : SV_Position; float3 world : WORLD; float2 uv : TEXCOORD0; @@ -31,7 +21,7 @@ psIn vs(vsIn input, uint id : SV_InstanceID) { o.world = mul(input.pos, sk_inst[id].world).xyz; o.pos = mul(float4(o.world, 1), sk_viewproj[o.view_id]); - o.screen_pos = input.pos; + // o.screen_pos = input.pos; // float3 normal = normalize(mul(input.norm, (float3x3)sk_inst[id].world)); @@ -41,23 +31,7 @@ psIn vs(vsIn input, uint id : SV_InstanceID) { return o; } -float far_clip = 1.0; // 1.0 for anything behind the near of the oriel is clipped -float near_flatten = 1.0; // 1.0 for anything behind the near of the oriel having its depth be set to the near of the oriel - -float front_clip = 1.0; // same as far_clip -float front_flatten = 1.0; // same as near_flatten - -static const float NEAR = 0.01; -static const float FAR = 100.0; - -// clip depth -> view depth -float depth_cv(float d) { - // 32 bit DepthTexture *clip space - return (NEAR * FAR) / (FAR - d * (FAR - NEAR)); -} - float4 ps(psIn input) : SV_TARGET { - // uint stencil = tex.a * 255.0; // float2 screen_uv = input.pos.xy / input.pos.w; // flip y? // screen_uv.y = 1 - screen_uv.y; @@ -69,13 +43,13 @@ float4 ps(psIn input) : SV_TARGET { // screen_uv.y *= sk_aspect_ratio(input.view_id); - - float oriel_n = depth_cv(near.Sample(near_s, screen_uv).r); + + // float oriel_n = depth_cv(near.Sample(near_s, screen_uv).r); // if (oriel_n < 1.0) { // discard; // } // clip(2 - oriel_n); - + // float oriel_f = depth_cv(far.Sample(far_s, screen_uv).r); // clip @@ -95,9 +69,9 @@ float4 ps(psIn input) : SV_TARGET { // } // screen space checkerboard using fmod - float checkerboard = fmod(floor(input.uv.x * 8.0) + floor(input.uv.y * 8.0), 2); - float checkeruv = fmod(floor(screen_uv.x * 8.0) + floor(screen_uv.y * 8.0), 2); - return float4(checkerboard, screen_uv.y, checkeruv, 1); + // float checkerboard = fmod(floor(input.uv.x * 8.0) + floor(input.uv.y * 8.0), 2); + // float checkeruv = fmod(floor(screen_uv.x * 8.0) + floor(screen_uv.y * 8.0), 2); + // return float4(checkerboard, screen_uv.y, checkeruv, 1); // // new depth @@ -108,7 +82,6 @@ float4 ps(psIn input) : SV_TARGET { // } else { // out_depth = depth; // } - return float4(1,0,1,1); } \ No newline at end of file diff --git a/oriels.csproj b/oriels.csproj index 05ffa75..fd3ae41 100644 --- a/oriels.csproj +++ b/oriels.csproj @@ -2,7 +2,7 @@ true - + Exe net7 add @@ -10,7 +10,7 @@ - + diff --git a/oriels.sln b/oriels.sln new file mode 100644 index 0000000..7e8e81d --- /dev/null +++ b/oriels.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.5.002.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "oriels", "oriels.csproj", "{E7A7B19F-3A85-425C-ACAF-CAC44F70807E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E7A7B19F-3A85-425C-ACAF-CAC44F70807E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E7A7B19F-3A85-425C-ACAF-CAC44F70807E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E7A7B19F-3A85-425C-ACAF-CAC44F70807E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E7A7B19F-3A85-425C-ACAF-CAC44F70807E}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {7B0AFE43-2999-40C1-9A5A-BB1D53BB2164} + EndGlobalSection +EndGlobal diff --git a/src/Functions.cs b/src/Functions.cs index 6b0e28e..e3f0cbe 100644 --- a/src/Functions.cs +++ b/src/Functions.cs @@ -2,11 +2,28 @@ namespace Oriels; public static class Functions { // in SK >= 1.2.0 as Vec3.Direction() - public static Vec3 Dir(Vec3 to, Vec3 from) { + public static Vec3 dir(Vec3 to, Vec3 from) { return (to - from).Normalized; } // deadzone // magnitude // extension + + public static Vec3 reflect(Vec3 v, Vec3 n) { + return v - 2 * Vec3.Dot(v, n) * n; + } + + + /* under construction + claspΔ(aΔ, bΔ, t = 0.5) => + Δ = lerp(aΔ, bΔ, t) * sign(aΔ) == sign(bΔ) ? 1 : 0 + + + with your two index fingers on a larger object to really test this + + */ + // public static float claspΔ(float aΔ, float bΔ) { + + // } } \ No newline at end of file diff --git a/src/Functions/clasp/pattern copy.txt b/src/Functions/clasp/pattern copy.txt new file mode 100644 index 0000000..2f26929 --- /dev/null +++ b/src/Functions/clasp/pattern copy.txt @@ -0,0 +1,16 @@ +# 2023.07.30 -> 2023.07.31 -> + +input + idxΔ + thmΔ + +data + pinch_ptΔ + +frame + pinch_ptΔ = (idxΔ + thmΔ + thmΔ) / 3 + + in_sign(a, b) => sign(a) == sign(b) ? 1 : 0 + pinch_ptΔ.x *= in_sign(idxΔ.x, thmΔ.x) + pinch_ptΔ.y *= in_sign(idxΔ.y, thmΔ.y) + pinch_ptΔ.z *= in_sign(idxΔ.z, thmΔ.z) diff --git a/src/Functions/clasp/pattern.txt b/src/Functions/clasp/pattern.txt new file mode 100644 index 0000000..0496a97 --- /dev/null +++ b/src/Functions/clasp/pattern.txt @@ -0,0 +1,4 @@ +# 2023.07.30 -> 2023.07.31 -> + +claspΔ(aΔ, bΔ, t = 0.5) => + Δ = lerp(aΔ, bΔ, t) * sign(aΔ) == sign(bΔ) ? 1 : 0 diff --git a/src/Functions/stretch/pattern.txt b/src/Functions/stretch/pattern.txt new file mode 100644 index 0000000..e69de29 diff --git a/src/Interactions/rolls-cursor/RollsCursor.cs b/src/Interactions/rolls-cursor/RollsCursor.cs index 51631a1..15fffb8 100644 --- a/src/Interactions/rolls-cursor/RollsCursor.cs +++ b/src/Interactions/rolls-cursor/RollsCursor.cs @@ -8,9 +8,9 @@ class RollsCursor : Interaction { // data public Cursor cursor = new Cursor(); - PR.Delta fIdelta = new PR.Delta(); - PR.Delta fMdelta = new PR.Delta(); - PR.Delta fRdelta = new PR.Delta(); + PR.DeltaV fIdelta = new PR.DeltaV(); + PR.DeltaV fMdelta = new PR.DeltaV(); + PR.DeltaV fRdelta = new PR.DeltaV(); public void Init() { } @@ -37,11 +37,11 @@ class RollsCursor : Interaction { cursor.raw = hand.Get(FingerId.Index, JointId.Tip).position; } - fIdelta.Update(hand.Get(FingerId.Index, JointId.Tip).position); - fMdelta.Update(hand.Get(FingerId.Middle, JointId.Tip).position); - fRdelta.Update(hand.Get(FingerId.Ring, JointId.Tip).position); + fIdelta.Step(hand.Get(FingerId.Index, JointId.Tip).position); + fMdelta.Step(hand.Get(FingerId.Middle, JointId.Tip).position); + fRdelta.Step(hand.Get(FingerId.Ring, JointId.Tip).position); - Vec3 delta = (fIdelta.value + fMdelta.value + fRdelta.value) / 3f; + Vec3 delta = (fIdelta.delta + fMdelta.delta + fRdelta.delta) / 3f; cursor.raw += delta * reach.value; Mesh.Sphere.Draw(mono.mat.holoframe, Matrix.TRS(cursor.raw, Quat.Identity, 0.01f), new Color(1, 0, 0)); diff --git a/src/Mono.cs b/src/Mono.cs index 611fb24..4a3f1bc 100644 --- a/src/Mono.cs +++ b/src/Mono.cs @@ -56,6 +56,7 @@ public class Mono { bool shapeHeld = false; + Pose testPose = new Pose(new Vec3(0, 1f, -1.5f), Quat.FromAngles(45, 0, 45)); Spatial spatial = new (new Vec3(-1, 0.76f, 0.666f)); @@ -92,20 +93,49 @@ public class Mono { float strength = 6f; Hand hand = Input.Hand(Handed.Right); - Vec3 indexTip = hand.Get(FingerId.Index, JointId.Tip).position; - Vec3 thumbTip = hand.Get(FingerId.Thumb, JointId.Tip).position; + // left and right 'click' ~ curl + Btn lBtn = new Btn(); // ~ trigger ~ left click + float indexCurl = rig.FingerFlex(hand, FingerId.Index, 0.15f); + lBtn.Frame(indexCurl < 0.5f); - Vec3 delta = indexTip - thumbTip; - float mag = delta.Magnitude; - float pinch = MathF.Max(mag - deadzone, 0); + // stay in state until both ring and pinky finger 'agree' on curl or uncurl + Btn rBtn = new Btn(); // ~ grip ~ right click + float ringCurl = rig.FingerFlex(hand, FingerId.Ring, 0.15f); + float pinkyCurl = rig.FingerFlex(hand, FingerId.Little, 0.15f); + rBtn.Frame(ringCurl < 0.5f && pinkyCurl < 0.5f); + + // cursor + Vec3 midTip = hand.Get(FingerId.Middle, JointId.Tip).position; + Vec3 thumbTip = hand.Get(FingerId.Thumb, JointId.Tip).position; + + Vec3 delta = midTip - thumbTip; + float mag = delta.Magnitude; + float pinch = MathF.Max(mag - deadzone, 0); Vec3 dir = delta.Normalized; - cursor.raw = indexTip + dir * pinch * strength; + cursor.raw = midTip + dir * pinch * strength; - Lines.Add(indexTip, thumbTip, new Color(0, 0, 1), 0.002f); - Mesh.Sphere.Draw(mat.holo, Matrix.TS(cursor.pos, 0.01f), new Color(0.5f, 0.5f, 0.5f)); - // V.XYZ(0, 0, ); + Lines.Add(midTip, thumbTip, new Color(0, 0, 1), 0.002f); + Mesh.Sphere.Draw( + mat.holo, + Matrix.TS(cursor.pos, 2*U.cm), + new Color( + lBtn.held ? 1.0f : 0.0f, + 0.5f, + rBtn.held ? 1.0f : 0.0f + ) + ); + + if (rBtn.held) { + testPose.position = cursor.smooth; + } + Mesh.Cube.Draw( + mat.holoframe, + testPose.ToMatrix(5*U.cm), + rBtn.held ? new Color(0.5f, 0.55f, 0.75f) : + new Color(0.5f, 0.55f, 0.75f) * 0.3f + ); drawerA.Frame(cursor, pinch); drawerB.Frame(cursor, pinch); @@ -122,7 +152,7 @@ public class Mono { if (interactions[i].Active) { interactions[i].Frame(); } - } + } // WaveCursor lwc = (WaveCursor)((Chiral)interactions[0]).dofs[0]; diff --git a/src/PR.cs b/src/PR.cs index 8dbce5e..b5654b4 100644 --- a/src/PR.cs +++ b/src/PR.cs @@ -302,14 +302,29 @@ public static class PR { // } // } + public static float Diff(float a, float b) { + return MathF.Abs(a - b); + } + public class Delta { - public Vec3 value { get; private set; } + public float delta { get; private set; } + + float last; + public float Step(float current) { + delta = current - last; + last = current; + return delta; + } + } + + public class DeltaV { + public Vec3 delta { get; private set; } Vec3 last; - public Vec3 Update(Vec3 current) { - value = current - last; + public Vec3 Step(Vec3 current) { + delta = current - last; last = current; - return value; + return delta; } } diff --git a/src/Rig.cs b/src/Rig.cs index b4b286f..eff282f 100644 --- a/src/Rig.cs +++ b/src/Rig.cs @@ -82,8 +82,8 @@ public class Rig { lWrist = new Pose(lCon.pos + lCon.ori * new Vec3(0, 0, 0.052f), lCon.ori); } - public float Flexion(Hand hand, FingerId id, float deadzone = 0.15f) { - float fingerFlex = (Vec3.Dot( + public float FingerFlex(Hand hand, FingerId id, float deadzone = 0.15f) { + float fingerFlex = (Vec3.Dot( Vec3.Direction( hand.Get(id, JointId.Tip).position, hand.Get(id, JointId.KnuckleMinor).position @@ -94,8 +94,10 @@ public class Rig { ) ) + 1f) / 2; float fingerTrim = 0f + deadzone; // 180° - fingerFlex = Math.Max(fingerFlex - fingerTrim, 0f) / (1 - fingerTrim); + return Math.Max(fingerFlex - fingerTrim, 0f) / (1 - fingerTrim); + } + public float KnuckleFlex(Hand hand, FingerId id, float deadzone = 0.15f) { float knuckleFlex = (Vec3.Dot( Vec3.Direction( hand.Get(id, JointId.KnuckleMid).position, @@ -107,10 +109,12 @@ public class Rig { ) ) + 1f) / 2; float knuckleTrim = 0.5f + deadzone; // 90° - knuckleFlex = Math.Max(knuckleFlex - knuckleTrim, 0f) / (1 - knuckleTrim); + return Math.Max(knuckleFlex - knuckleTrim, 0f) / (1 - knuckleTrim); + } - float flexion = knuckleFlex + fingerFlex; - return flexion * flexion; + public float Flexion(Hand hand, FingerId id, float deadzone = 0.15f) { + float flexion = KnuckleFlex(hand, id, deadzone) * FingerFlex(hand, id, deadzone); + return flexion * flexion; // why assume this curve? } } diff --git a/src/_Init.cs b/src/_Init.cs index 92aecfc..23e61fc 100644 --- a/src/_Init.cs +++ b/src/_Init.cs @@ -8,7 +8,7 @@ SKSettings settings = new SKSettings { assetsFolder = "add", depthMode = DepthMode.D32, disableUnfocusedSleep = true, - displayPreference = DisplayMode.Flatscreen, + // displayPreference = DisplayMode.Flatscreen, // disableFlatscreenMRSim = true, }; if (!SK.Initialize(settings))