diff --git a/add/drawer.glb b/add/drawer.glb new file mode 100644 index 0000000..b72c361 Binary files /dev/null and b/add/drawer.glb differ diff --git a/src/Elements/oriel/Compositor.cs b/src/Elements/oriel/Compositor.cs index 75949b9..b1a09f3 100644 --- a/src/Elements/oriel/Compositor.cs +++ b/src/Elements/oriel/Compositor.cs @@ -28,6 +28,18 @@ public class Compositor { public void Frame() { Mono mono = Mono.inst; + // Renderer.RenderTo(tex, + // Matrix.TR(V.XYZ(0, 1, 0), Quat.FromAngles(0, 180, 0)), + // Matrix.Perspective(60, 1, 0.1f, 100), + // RenderLayer.All // & ~RenderLayer.Layer1 + // ); + + + + // Default.MeshQuad.Draw(mat, + // Matrix.TR(V.XYZ(0, 1, 0), Quat.FromAngles(0, 0, 0)) + // ); + // backrooms.oriel.Frame(); // greenyard.oriel.Frame(); @@ -77,16 +89,6 @@ public class Compositor { // ); // Model model = Model.FromFile("oriel.glb"); // ~ Mesh mesh = model.GetMesh("oriel"); - - Renderer.RenderTo(tex, - Matrix.TR(V.XYZ(0, 1, 0), Quat.FromAngles(0, 180, 0)), - Matrix.Perspective(60, 1, 0.1f, 100), - RenderLayer.All // & ~RenderLayer.Layer1 - ); - - Default.MeshQuad.Draw(mat, - Matrix.TR(V.XYZ(0, 1, 0), Quat.FromAngles(0, 0, 0)) - ); } void Place() { diff --git a/src/Mono.cs b/src/Mono.cs index a793ce5..cdc1dc6 100644 --- a/src/Mono.cs +++ b/src/Mono.cs @@ -82,6 +82,75 @@ public class Mono { Spatial spatial = new Spatial(); + Cursor cursor = new Cursor(); + public class Drawer { + public Pose pose; + public float open; // 0 - 1 + + public Drawer(Pose pose) { + this.pose = pose; + + mat.FaceCull = Cull.None; + } + + public void Frame(Cursor cursor, float pinch) { + float width = 0.4f; + float height = 0.15f; + + Matrix matrix = pose.ToMatrix(); + Vec3 localCursor = matrix.Inverse.Transform(cursor.pos); + + bool inBounds = localCursor.x > width / -2f && localCursor.x < width / 2f && + localCursor.y > height / -2f && localCursor.y < height / 2f; + + if (!opening) { + if (open > 0) { + float delta = localCursor.z - oldZ; + + if (inBounds && localCursor.z < open && delta < -0.5f * Time.Stepf) + open = 0; + } + + if (open == 0 && inBounds && localCursor.z > 0 && oldZ <= 0) { + opening = true; + } + } + + if (opening) { + open = MathF.Max(localCursor.z, 0); + + if (!inBounds || pinch == 0 || open > 0.4f) { + opening = false; + } + // Lines.Add( + // pose.position, + // pose.position + pose.orientation * V.XYZ(0, 0, 0.1f), // -1? + // new Color(0, 1, 0), + // 0.002f + // ); + } + + openSmooth.Update(open); + model.FindNode("Cube").Mesh.Draw(mat, + Matrix.T(V.XYZ(0, 0, 0.5f)) * + Matrix.S(V.XYZ(width, height, MathF.Max(openSmooth.value, 0.01f))) * + pose.ToMatrix(), + new Color(0.8f, 0.8f, 0.8f, 0.5f) + ); + + oldZ = localCursor.z; + } + float oldZ = 0; + bool opening = false; + + PR.PID openSmooth = new PR.PID(10f, 0.01f); + + Model model = Model.FromFile("drawer.glb", Shader.Default); + Material mat = Material.Default.Copy(); + } + Drawer drawerA = new Drawer(new Pose(new Vec3(-0.5f, 0.6f, -0.8f), Quat.Identity)); + Drawer drawerB = new Drawer(new Pose(new Vec3(0, 0.6f, -0.8f), Quat.Identity)); + Drawer drawerC = new Drawer(new Pose(new Vec3(0.5f, 0.6f, -0.8f), Quat.Identity)); public void Frame() { @@ -102,6 +171,33 @@ public class Mono { // rGlove.Step(); compositor.Frame(); + // spatial.Frame(); + { + float deadzone = 0.01f; + 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; + + Vec3 delta = indexTip - thumbTip; + float mag = delta.Magnitude; + float pinch = MathF.Max(mag - deadzone, 0); + + Vec3 dir = delta.Normalized; + + cursor.raw = indexTip + dir * pinch * strength; + + Lines.Add(indexTip, thumbTip, new Color(0, 0, 1), 0.002f); + Mesh.Sphere.Draw(matHolo, Matrix.TS(cursor.pos, 0.01f), new Color(0.5f, 0.5f, 0.5f)); + // V.XYZ(0, 0, ); + + drawerA.Frame(cursor, pinch); + drawerB.Frame(cursor, pinch); + drawerC.Frame(cursor, pinch); + } + + // Input.Subscribe(InputSource.Hand, BtnState.Any, Action); @@ -148,7 +244,6 @@ public class Mono { new Color(0.5f, 0.55f, 0.75f) * 0.3f ); - spatial.Frame(); // @@ -180,12 +275,12 @@ public class Mono { } int dofIndex = 0; - Pose windowPoseButton = new Pose(0, 1f, -0.5f, Quat.FromAngles(0, 0, 0)); + Pose windowPose = new Pose(0, 1.5f, -0.5f, Quat.FromAngles(0, 0, 0)); TextStyle style = Text.MakeStyle(Font.FromFile("add/fonts/DM-Mono.ttf"), 1f * U.cm, Color.White); TextStyle style2 = Text.MakeStyle(Font.FromFile("add/fonts/DM-Mono.ttf"), 1f * U.cm, new Color(0.5f, 0.5f, 0.5f)); Vec2 fieldSize = new Vec2(6f * U.cm, 3f * U.cm); void ShowWindowButton() { - UI.WindowBegin("design vars", ref windowPoseButton); + UI.WindowBegin("design vars", ref windowPose); UI.SetThemeColor(UIColor.Background, new Color(0f, 0f, 0f)); UI.SetThemeColor(UIColor.Primary, new Color(0.5f, 0.5f, 0.5f)); UI.PushTextStyle(style); diff --git a/src/_Init.cs b/src/_Init.cs index d977c5c..9d1d9b0 100644 --- a/src/_Init.cs +++ b/src/_Init.cs @@ -7,7 +7,7 @@ SKSettings settings = new SKSettings { assetsFolder = "add", depthMode = DepthMode.D32, disableUnfocusedSleep = true, - displayPreference = DisplayMode.Flatscreen, + // displayPreference = DisplayMode.Flatscreen, // disableFlatscreenMRSim = true, }; if (!SK.Initialize(settings))