This commit is contained in:
ethan merchant 2023-07-20 18:40:38 -04:00
parent 99c99dde80
commit 8312e55863
12 changed files with 405 additions and 395 deletions

111
src/Design.cs Normal file
View file

@ -0,0 +1,111 @@
namespace Oriels;
public class Design {
public string str;
public string term;
public float min = float.NegativeInfinity;
public float max = float.PositiveInfinity;
public float unit = U.m;
public float value {
get {
try {
float value = PR.Clamp(float.Parse(str), min, max);
// if clamped, update string
if (value != float.Parse(str)) {
if (Input.Key(Key.Return).IsJustActive()) {
str = value.ToString();
}
}
return value * unit;
} catch {
return MathF.Max(0, min) * unit;
}
}
}
// public int integer {};
}
// Chiral : handedness implies symmetry
public class Chiral : Interaction {
public Chiral(Interaction[] dofs) => this.dofs = dofs;
private bool active;
public bool Active {
get { return this.active; }
set {
this.active = value;
for (int i = 0; i < this.dofs.Length; i++) {
Interaction dof = this.dofs[i];
if ((int)this.handed == 2 || i == (int)this.handed) {
dof.Active = value;
} else {
dof.Active = false;
}
}
}
}
public Interaction[] dofs = new Interaction[2];
// public Design handed = new Design { str = "2", min = 0, max = 2};
public Handed handed = Handed.Max;
public void Init() {
dofs[0].Init();
dofs[1].Init();
}
public void Frame() {
// sync the left design variables to the right
System.Reflection.FieldInfo[] fields = dofs[0].GetType().GetFields();
foreach (System.Reflection.FieldInfo field in fields) {
if (field.FieldType == typeof(Design)) {
Design design = (Design)field.GetValue(dofs[0]); // define type?
field.SetValue(dofs[1], design);
}
}
for (int i = 0; i < dofs.Length; i++) {
Interaction dof = dofs[i];
if ((int)handed == 2 || i == (int)handed) {
dof.Frame();
dof.Active = true;
}
else {
dof.Active = false;
}
}
}
}
/*
ranges
0+1
1-0
1-0+1
-0+
0+&&-
0+||-
units
m
cm
mm
t
demo
seperate the demos from the dofs, and make them rebindable (assigning input using reflection?)
virtual shapes(scalable) -> that can be slotted
physics boxes
mirror
mirroring vectors(line segments) is really easy
easier than rendering.. actually just render twice with the material chain
stereonick mentioned
debug bool
rendering the raw output
particularly for hand tracking dofs (so Moses can better test them!)
raw = 0.333f alpha ~
*/

View file

@ -224,6 +224,8 @@ public class Oriel {
public float crown = 0.16f;
public void Render() {
Mono mono = Mono.inst;
// // matFrame.Wireframe = true;
// matFrame.DepthTest = DepthTest.Always;
// matFrame.SetVector("_cursor", cursor);
@ -304,12 +306,12 @@ public class Oriel {
}
}
Mesh.Sphere.Draw(Mono.inst.matHoloframe,
Mesh.Sphere.Draw(mono.mat.holoframe,
Matrix.TRS(cursor, cursorOri, new Vec3(0.02f, 0.02f, 0.02f)),
cursorColor
);
Mesh.Sphere.Draw(Mono.inst.matHoloframe,
Mesh.Sphere.Draw(mono.mat.holoframe,
Matrix.TS(cursor, new Vec3(1f, 1f, 1f) * cursorRadius * 2),
new Color(0.1f, 0.1f, 0.1f)
);

View file

@ -15,13 +15,14 @@ class RollsCursor : Interaction {
public void Init() { }
public void Frame() {
Rig rig = Mono.inst.rig;
Mono mono = Mono.inst;
Hand hand = Input.Hand(handed);
if (hand.tracked.IsActive() && !hand.tracked.IsJustActive()) {
float fI = rig.Flexion(hand, FingerId.Index);
float fM = rig.Flexion(hand, FingerId.Middle);
float fR = rig.Flexion(hand, FingerId.Ring);
float fL = rig.Flexion(hand, FingerId.Little);
float fI = mono.rig.Flexion(hand, FingerId.Index);
float fM = mono.rig.Flexion(hand, FingerId.Middle);
float fR = mono.rig.Flexion(hand, FingerId.Ring);
float fL = mono.rig.Flexion(hand, FingerId.Little);
float stretch = (fI + fM + fR + fL) / 4f;
@ -43,9 +44,9 @@ class RollsCursor : Interaction {
Vec3 delta = (fIdelta.value + fMdelta.value + fRdelta.value) / 3f;
cursor.raw += delta * reach.value;
Mesh.Sphere.Draw(Mono.inst.matHoloframe, Matrix.TRS(cursor.raw, Quat.Identity, 0.01f), new Color(1, 0, 0));
Mesh.Sphere.Draw(Mono.inst.matHoloframe, Matrix.TRS(cursor.pos, Quat.Identity, 0.01f), new Color(0, 1, 0));
Mesh.Sphere.Draw(Mono.inst.matHoloframe, Matrix.TRS(cursor.smooth, Quat.Identity, 0.01f), new Color(0, 0, 1));
Mesh.Sphere.Draw(mono.mat.holoframe, Matrix.TRS(cursor.raw, Quat.Identity, 0.01f), new Color(1, 0, 0));
Mesh.Sphere.Draw(mono.mat.holoframe, Matrix.TRS(cursor.pos, Quat.Identity, 0.01f), new Color(0, 1, 0));
Mesh.Sphere.Draw(mono.mat.holoframe, Matrix.TRS(cursor.smooth, Quat.Identity, 0.01f), new Color(0, 0, 1));
}
}

View file

@ -40,6 +40,8 @@ class Trackballer : Interaction {
}
public void UpdateMomentum(Hand hand) {
Mono mono = Mono.inst;
// Thumb pad
HandJoint thumbJoint = hand.Get(FingerId.Thumb, JointId.Tip);
oldPad = pad;
@ -48,7 +50,7 @@ class Trackballer : Interaction {
thumbJoint.orientation,
new Vec3(handed == Handed.Left ? -1f : 1f, 1f, 1f) * 0.1666f
);
mesh.Draw(Mono.inst.matHoloframe, pad, new Color(0, 1, 1));
mesh.Draw(mono.mat.holoframe, pad, new Color(0, 1, 1));
// Ball anchor
HandJoint ballJoint = hand.Get(FingerId.Index, JointId.KnuckleMajor);
@ -97,7 +99,7 @@ class Trackballer : Interaction {
btnPull.Frame(pull > 1f, pull > 0.333f); // magic sticky var
float pullScalar = btnPull.held ? MathF.Max((pull - 0.333f) / 0.666f, 0) : MathF.Max(1 - pull, 0);
Mesh.Sphere.Draw(Mono.inst.matHoloframe,
Mesh.Sphere.Draw(mono.mat.holoframe,
Matrix.TRS(anchorPos, thumbJoint.orientation, pullScalar * radius.value),
new Color(0, 1, 1) * (btnPull.held ? 1f : 0.0666f)
);
@ -105,7 +107,7 @@ class Trackballer : Interaction {
anchor.Transform(point), anchorPos,
new Color(0, 1, 1), 1f * U.mm
);
Mesh.Sphere.Draw(Mono.inst.matHoloframe,
Mesh.Sphere.Draw(mono.mat.holoframe,
Matrix.TRS(anchor.Transform(point), thumbJoint.orientation, 2f * U.mm),
new Color(0, 1, 1)
);
@ -116,7 +118,7 @@ class Trackballer : Interaction {
btnPush.Frame(push > 1f, push > 0.333f); // magic sticky var
float pushScalar = btnPush.held ? MathF.Max((MathF.Min(push, 1f) - 0.333f) / 0.666f, 0) : MathF.Max(1 - push, 0);
Mesh.Sphere.Draw(Mono.inst.matHoloframe,
Mesh.Sphere.Draw(mono.mat.holoframe,
Matrix.TRS(anchorPos, ori, (radius.value * 2) * pushScalar),
new Color(1, 0, 0) * (btnPush.held ? 1f : 0.2f)
);
@ -148,7 +150,7 @@ class Trackballer : Interaction {
// Draw ball result
Mesh.Sphere.Draw(
Mono.inst.matHoloframe,
mono.mat.holoframe,
Matrix.TRS(anchorPos, ori, radius.value * 2),
new Color(0.8f, 0, 0)
);
@ -178,7 +180,7 @@ class Trackballer : Interaction {
float width = 52 * U.cm;
float height = 29f * U.cm;
Mesh.Quad.Draw(
Mono.inst.matHoloframe,
Mono.inst.mat.holoframe,
Matrix.S(new Vec3(width, height, 1)) * panel,
new Color(1, 1, 1)
);

View file

@ -12,13 +12,14 @@ class WaveCursor : Interaction {
public void Init() {}
public void Frame() {
Rig rig = Mono.inst.rig;
Mono mono = Mono.inst;
Hand hand = Input.Hand(handed);
if (hand.tracked.IsActive() && !hand.tracked.IsJustActive()) {
float fI = rig.Flexion(hand, FingerId.Index);
float fM = rig.Flexion(hand, FingerId.Middle);
float fR = rig.Flexion(hand, FingerId.Ring);
float fL = rig.Flexion(hand, FingerId.Little);
float fI = mono.rig.Flexion(hand, FingerId.Index);
float fM = mono.rig.Flexion(hand, FingerId.Middle);
float fR = mono.rig.Flexion(hand, FingerId.Ring);
float fL = mono.rig.Flexion(hand, FingerId.Little);
// Biased by finger length
float wave = (fI + fI + fM + fM + fM + fR + fR + fL) / 8f;
@ -30,9 +31,9 @@ class WaveCursor : Interaction {
cursor.raw = to + dir * wave * crest.value;
Mesh.Sphere.Draw(Mono.inst.matHoloframe, Matrix.TRS(cursor.raw, Quat.Identity, 0.01f), new Color(1, 0, 0));
Mesh.Sphere.Draw(Mono.inst.matHoloframe, Matrix.TRS(cursor.pos, Quat.Identity, 0.01f), new Color(0, 1, 0));
Mesh.Sphere.Draw(Mono.inst.matHoloframe, Matrix.TRS(cursor.smooth, Quat.Identity, 0.01f), new Color(0, 0, 1));
Mesh.Sphere.Draw(mono.mat.holoframe, Matrix.TRS(cursor.raw, Quat.Identity, 0.01f), new Color(1, 0, 0));
Mesh.Sphere.Draw(mono.mat.holoframe, Matrix.TRS(cursor.pos, Quat.Identity, 0.01f), new Color(0, 1, 0));
Mesh.Sphere.Draw(mono.mat.holoframe, Matrix.TRS(cursor.smooth, Quat.Identity, 0.01f), new Color(0, 0, 1));
}
}
@ -76,7 +77,7 @@ class WaveCursor : Interaction {
Vec3 from = i > 0 ? points[i - 1] : nextPos;
Quat ori = Quat.LookDir(Vec3.Direction(points[i], from));
Mesh.Cube.Draw(
Mono.inst.matHoloframe,
Mono.inst.mat.holoframe,
Matrix.TRS(
points[i] + ori * new Vec3(0, 0, 0.01f) * scale,
ori,

43
src/Mat.cs Normal file
View file

@ -0,0 +1,43 @@
namespace Oriels;
public class Mat {
public Material dev;
public Material holoframe = new Material(Shader.FromFile("shaders/above.hlsl"));
Material holoframeUnder = new Material(Shader.FromFile("shaders/below.hlsl"));
public Material holoclear = new Material(Shader.FromFile("shaders/above.hlsl"));
Material holoclearUnder = new Material(Shader.FromFile("shaders/below.hlsl"));
public Material holo = new Material(Shader.FromFile("shaders/above.hlsl"));
Material holoUnder = new Material(Shader.FromFile("shaders/below.hlsl"));
public void Init() {
dev = Material.Default.Copy();
dev.SetTexture("diffuse", Tex.DevTex);
holo.SetColor("clearcolor", Renderer.ClearColor);
holoUnder.SetColor("clearcolor", Renderer.ClearColor);
holoUnder.FaceCull = Cull.None;
holo.Chain = holoUnder;
holoclear.SetColor("clearcolor", Color.Black);
holoclear.Transparency = Transparency.Add;
holoclear.DepthWrite = false;
holoclear.FaceCull = Cull.None;
holoclearUnder.SetColor("clearcolor", Color.Black);
holoclearUnder.Transparency = Transparency.Add;
holoclearUnder.DepthWrite = false;
holoclearUnder.FaceCull = Cull.None;
holoclear.Chain = holoclearUnder;
holoframe.SetColor("clearcolor", Color.Black);
holoframe.Transparency = Transparency.Add;
holoframe.DepthWrite = false;
holoframe.FaceCull = Cull.None;
holoframe.Wireframe = true;
holoframeUnder.SetColor("clearcolor", Color.Black);
holoframeUnder.Transparency = Transparency.Add;
holoframeUnder.DepthWrite = false;
holoframeUnder.FaceCull = Cull.None;
holoframeUnder.Wireframe = true;
holoframe.Chain = holoframeUnder;
}
}

View file

@ -6,13 +6,7 @@ public class Mono {
public PR.Noise noise = new PR.Noise(939949595);
public Material matDev;
public Material matHoloframe = new Material(Shader.FromFile("shaders/above.hlsl"));
Material matHoloframeUnder = new Material(Shader.FromFile("shaders/below.hlsl"));
public Material matHoloclear = new Material(Shader.FromFile("shaders/above.hlsl"));
Material matHoloclearUnder = new Material(Shader.FromFile("shaders/below.hlsl"));
public Material matHolo = new Material(Shader.FromFile("shaders/above.hlsl"));
Material matHoloUnder = new Material(Shader.FromFile("shaders/below.hlsl"));
public Mat mat = new Mat();
public Rig rig = new Rig();
public Space space = new Space();
@ -55,35 +49,7 @@ public class Mono {
interactions[i].Init();
}
matDev = Material.Default.Copy();
matDev.SetTexture("diffuse", Tex.DevTex);
matHolo.SetColor("clearcolor", Renderer.ClearColor);
matHoloUnder.SetColor("clearcolor", Renderer.ClearColor);
matHoloUnder.FaceCull = Cull.None;
matHolo.Chain = matHoloUnder;
matHoloclear.SetColor("clearcolor", Color.Black);
matHoloclear.Transparency = Transparency.Add;
matHoloclear.DepthWrite = false;
matHoloclear.FaceCull = Cull.None;
matHoloclearUnder.SetColor("clearcolor", Color.Black);
matHoloclearUnder.Transparency = Transparency.Add;
matHoloclearUnder.DepthWrite = false;
matHoloclearUnder.FaceCull = Cull.None;
matHoloclear.Chain = matHoloclearUnder;
matHoloframe.SetColor("clearcolor", Color.Black);
matHoloframe.Transparency = Transparency.Add;
matHoloframe.DepthWrite = false;
matHoloframe.FaceCull = Cull.None;
matHoloframe.Wireframe = true;
matHoloframeUnder.SetColor("clearcolor", Color.Black);
matHoloframeUnder.Transparency = Transparency.Add;
matHoloframeUnder.DepthWrite = false;
matHoloframeUnder.FaceCull = Cull.None;
matHoloframeUnder.Wireframe = true;
matHoloframe.Chain = matHoloframeUnder;
mat.Init();
}
Pose shape = new Pose(new Vec3(0, 1f, -3f), Quat.FromAngles(45, 0, 45));
@ -109,13 +75,6 @@ public class Mono {
// Console.WriteLine($"{h.pinchPt}, {Input.Head.orientation * -Vec3.Forward}");
// }
// Hand hand = Input.Hand(Handed.Right);
// Controller con = Input.Controller(Handed.Right);
// Mesh.Cube.Draw(
// Material.Default,
// hand.IsJustPinched
// )
// Con -> Hand
// lGlove.Step();
// rGlove.Step();
@ -124,31 +83,34 @@ public class Mono {
spatial.Frame();
// we need cursor abstraction
// so we can plug in different cursor interactions into different elements!
// pinch-cursor?
// {
// float deadzone = 0.01f;
// float strength = 6f;
{
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;
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 delta = indexTip - thumbTip;
float mag = delta.Magnitude;
float pinch = MathF.Max(mag - deadzone, 0);
// Vec3 dir = delta.Normalized;
Vec3 dir = delta.Normalized;
// cursor.raw = indexTip + dir * pinch * strength;
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, );
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, );
// drawerA.Frame(cursor, pinch);
// drawerB.Frame(cursor, pinch);
// drawerC.Frame(cursor, pinch);
// }
drawerA.Frame(cursor, pinch);
drawerB.Frame(cursor, pinch);
drawerC.Frame(cursor, pinch);
}
@ -192,7 +154,7 @@ public class Mono {
// as it's a bit of space hog
Mesh.Cube.Draw(
Mono.inst.matHoloframe,
mat.holoframe,
shape.ToMatrix(0.5f),
new Color(0.5f, 0.55f, 0.75f) * 0.3f
);
@ -212,243 +174,11 @@ public class Mono {
// net.me.Step();
// net.send = true;
ShowWindowButton();
}
int dofIndex = 0;
Pose windowPose = new Pose(-0.333f, 1.2f, -0.5f, Quat.FromAngles(0, 180, 0));
Material windowMat = new Material(Shader.FromFile("shaders/window.hlsl"));
TextStyle style = Text.MakeStyle(Font.FromFile("add/fonts/DM-Mono.ttf"), 1f * U.cm, Color.Black);
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() {
windowMat.Transparency = Transparency.Add;
windowMat.FaceCull = Cull.None;
windowMat.DepthWrite = false;
UI.SetElementVisual(UIVisual.WindowBody, Mesh.Quad, windowMat, Vec2.One);
UI.SetElementVisual(UIVisual.WindowHead, Mesh.Quad, windowMat, Vec2.One);
UI.WindowBegin("design vars", ref windowPose);
// UI.SetThemeColor(UIColor.Primary, new Color(1f, 1f, 1f));
// UI.HandleBegin("design", ref windowPose, new Bounds(V.XYZ(0.02f, 0.02f, 0.02f)), true, UIMove.FaceUser);
UI.SetThemeColor(UIColor.Background, new Color(0.2f, 0.2f, 0.3f));
UI.SetThemeColor(UIColor.Primary, new Color(0.4f, 0.4f, 0.6f));
UI.SetThemeColor(UIColor.Common, new Color(1.0f, 1.0f, 1.0f));
UI.PushTextStyle(style);
// if (UI.Button("Draw Oriel Axis")) { oriel.drawAxis = !oriel.drawAxis; }
// if (UI.Button("Reset Oriel Quat")) { oriel.ori = Quat.Identity; }
// if (UI.Button("Scale w/Height")) { oriel.scaleWithHeight = !oriel.scaleWithHeight; }
// UI.HSlider("Scale", ref oriel.scale, 0.1f, 1f, 0.1f);
// UI.HSlider("Multiplier", ref oriel.multiplier, 0.1f, 1f, 0.1f);
// // UI.Label("Player.y");
// UI.HSlider("Player.y", ref greenyard.height, 1f, 6f, 0.2f);
// UI.Label("pos.y");
// UI.HSlider("pos.y", ref playerY, -1f, 1f, 0.1f);
if (UI.Button("prev") && dofIndex > 0) {
dofIndex--;
}
UI.SameLine();
if (UI.Button("next") && dofIndex < interactions.Length - 1) {
dofIndex++;
}
Interaction dof = interactions[dofIndex];
Type type = dof.GetType();
// active toggle
Color tint = dof.Active ? new Color(0, 1, 0) : new Color(1, 0, 0);
UI.PushTint(tint);
if (UI.Button(dof.Active ? "on" : "off")) {
dof.Active = !dof.Active;
}
UI.PopTint();
if (type == typeof(Chiral)) {
Chiral chiral = (Chiral)dof;
System.Reflection.FieldInfo[] fields = typeof(Chiral).GetFields();
foreach (System.Reflection.FieldInfo field in fields) {
if (field.FieldType == typeof(Handed)) {
Handed handed = (Handed)field.GetValue(chiral);
if (UI.Button("<") && (int)handed > 0) {
handed = (Handed)((int)handed - 1);
field.SetValue(chiral, handed);
}
UI.SameLine();
if (UI.Button(">") && (int)handed < 2) {
handed = (Handed)((int)handed + 1);
field.SetValue(chiral, handed);
}
UI.SameLine(); UI.Label(handed.ToString());
}
}
RenderDof(chiral.dofs[0]);
} else {
RenderDof(dof);
}
UI.WindowEnd();
// UI.HandleEnd();
}
void RenderDof(Interaction dof) {
Type type = dof.GetType();
UI.Label("°" + type.Name);
System.Reflection.FieldInfo[] fields = type.GetFields();
for (int j = 0; j < fields.Length; j++) {
System.Reflection.FieldInfo field = fields[j];
if (field.FieldType == typeof(Design)) {
Design design = (Design)field.GetValue(dof);
UI.Input(field.Name, ref design.str, fieldSize, TextContext.Number);
UI.SameLine();
UI.PushTextStyle(style2);
UI.Label(design.term, new Vec2(4f * U.cm, 3f * U.cm));
UI.PopTextStyle();
UI.SameLine(); UI.Label(field.Name);
}
}
window.Frame();
}
Window window = new Window();
}
// Chiral : handedness implies symmetry
public class Chiral : Interaction {
public Chiral(Interaction[] dofs) => this.dofs = dofs;
private bool active;
public bool Active {
get { return this.active; }
set {
this.active = value;
for (int i = 0; i < this.dofs.Length; i++) {
Interaction dof = this.dofs[i];
if ((int)this.handed == 2 || i == (int)this.handed) {
dof.Active = value;
} else {
dof.Active = false;
}
}
}
}
public Interaction[] dofs = new Interaction[2];
// public Design handed = new Design { str = "2", min = 0, max = 2};
public Handed handed = Handed.Max;
public void Init() {
dofs[0].Init();
dofs[1].Init();
}
public void Frame() {
// sync the left design variables to the right
System.Reflection.FieldInfo[] fields = dofs[0].GetType().GetFields();
foreach (System.Reflection.FieldInfo field in fields) {
if (field.FieldType == typeof(Design)) {
Design design = (Design)field.GetValue(dofs[0]); // define type?
field.SetValue(dofs[1], design);
}
}
for (int i = 0; i < dofs.Length; i++) {
Interaction dof = dofs[i];
if ((int)handed == 2 || i == (int)handed) {
dof.Frame();
dof.Active = true;
}
else {
dof.Active = false;
}
}
}
}
public class Design {
public string str;
public string term;
public float min = float.NegativeInfinity;
public float max = float.PositiveInfinity;
public float unit = U.m;
public float value {
get {
try {
float value = PR.Clamp(float.Parse(str), min, max);
// if clamped, update string
if (value != float.Parse(str)) {
if (Input.Key(Key.Return).IsJustActive()) {
str = value.ToString();
}
}
return value * unit;
} catch {
return MathF.Max(0, min) * unit;
}
}
}
// public int integer {};
}
public class Cursor {
PR.OneEuroFilter xF = new PR.OneEuroFilter(0.001f, 0.1f);
PR.OneEuroFilter yF = new PR.OneEuroFilter(0.001f, 0.1f);
PR.OneEuroFilter zF = new PR.OneEuroFilter(0.001f, 0.1f);
Vec3 _raw;
public Vec3 raw {
get => _raw;
set {
_raw = value;
pos = new Vec3(
(float)xF.Filter(raw.x, (double)Time.Stepf),
(float)yF.Filter(raw.y, (double)Time.Stepf),
(float)zF.Filter(raw.z, (double)Time.Stepf)
);
smooth = Vec3.Lerp(smooth, pos, Time.Stepf * 6f);
}
}
public Vec3 pos { get; private set; }
public Vec3 smooth { get; private set; }
}
/*
COMMENTS
ranges
0+1
1-0
1-0+1
-0+
0+&&-
0+||-
units
m
cm
mm
t
demo
seperate the demos from the dofs, and make them rebindable (assigning input using reflection?)
virtual shapes(scalable) -> that can be slotted
physics boxes
mirror
mirroring vectors(line segments) is really easy
easier than rendering.. actually just render twice with the material chain
stereonick mentioned
debug bool
rendering the raw output
particularly for hand tracking dofs (so Moses can better test them!)
raw = 0.333f alpha ~
*/
/*
we have a whole inspector thing going on here
@ -497,71 +227,4 @@ public class Cursor {
local to palm
dofchan bows on the back of the ankles that double as trackers
*/
public class Spatial {
// example, to build out from!
// rn it's just adding two vectors
// building towards great interactivity and visual feedback
public Spatial(Vec3 origin) {
this.origin = origin;
}
public Vec3 origin;
float scale = 0.2f;
float thickness => 0.02f * scale;
float t = 1.0f;
Vec3 aFrom, aTo;
Vec3 a => Vec3.Lerp(aFrom, aTo, MathF.Min(t, 1f));
Vec3 bFrom, bTo;
Vec3 b => Vec3.Lerp(bFrom, bTo, MathF.Min(t, 1f));
Vec3 c => a + b;
public void Frame() {
// origin axis
Lines.Add(origin, World(new Vec3(1, 0, 0)), new Color(1, 0, 0), thickness * 0.333f);
Lines.Add(origin, World(new Vec3(0, 1, 0)), new Color(0, 1, 0), thickness * 0.333f);
Lines.Add(origin, World(new Vec3(0, 0, 1)), new Color(0, 0, 1), thickness * 0.333f);
Mesh.Sphere.Draw(Material.Unlit, Matrix.TS(origin, thickness), new Color(0.5f, 0.5f, 0.5f));
Random rand = Random.Shared;
if (t >= 1.3f) {
aFrom = aTo;
bFrom = bTo;
if (rand.NextSingle() < 0.5f) {
aTo = new Vec3(rand.NextSingle(), rand.NextSingle(), rand.NextSingle()) * 0.5f;
} else {
bTo = new Vec3(rand.NextSingle(), rand.NextSingle(), rand.NextSingle()) * 0.5f;
}
t = 0.0f;
}
t += Time.Stepf / 2f;
// Lines.Add(origin, World(a), new Color(1, 1, 1, 0.5f), thickness * 2); // they clip with no material way to fix it?
Lines.Add(origin, World(a), new Color(1, 1, 0), thickness);
Mesh.Sphere.Draw(Material.Unlit, Matrix.TS(World(a), thickness), new Color(1, 1, 0));
// Lines.Add(origin, World(b), new Color(1, 1, 1, 0.5f), thickness * 2);
Lines.Add(origin, World(b), new Color(0, 1, 1), thickness);
Mesh.Sphere.Draw(Material.Unlit, Matrix.TS(World(b), thickness), new Color(0, 1, 1));
Lines.Add(World(a), World(c), new Color(0, 1, 1), thickness);
Lines.Add(World(b), World(c), new Color(1, 1, 0), thickness);
// color between yellow and cyan using HSV
Mesh.Sphere.Draw(Material.Unlit, Matrix.TS(World(c), thickness), new Color(0.5f, 1, 1));
}
Vec3 World(Vec3 local) {
return origin + local * scale;
}
//
}
// Volumetric Lines
public class Vine {
}
*/

View file

@ -145,4 +145,25 @@ public struct Btn {
frameUp = !down && held;
held = down;
}
}
public class Cursor {
PR.OneEuroFilter xF = new PR.OneEuroFilter(0.001f, 0.1f);
PR.OneEuroFilter yF = new PR.OneEuroFilter(0.001f, 0.1f);
PR.OneEuroFilter zF = new PR.OneEuroFilter(0.001f, 0.1f);
Vec3 _raw;
public Vec3 raw {
get => _raw;
set {
_raw = value;
pos = new Vec3(
(float)xF.Filter(raw.x, (double)Time.Stepf),
(float)yF.Filter(raw.y, (double)Time.Stepf),
(float)zF.Filter(raw.z, (double)Time.Stepf)
);
smooth = Vec3.Lerp(smooth, pos, Time.Stepf * 6f);
}
}
public Vec3 pos { get; private set; }
public Vec3 smooth { get; private set; }
}

View file

@ -73,6 +73,7 @@ public class Space {
public void Frame() {
Mono mono = Mono.inst;
// Oriel oriel = Mono.inst.oriel;
// data.matrix = (Matrix)System.Numerics.Matrix4x4.Transpose(oriel.matrixInv);
// data.dimensions = oriel.bounds.dimensions;
@ -123,7 +124,7 @@ public class Space {
if (Vec3.Distance(new Vec3(xpos, 0, zpos), Vec3.Zero) < radius / 2) {
Mesh.Cube.Draw(
Mono.inst.matHolo,
mono.mat.holo,
Matrix.TS(
new Vec3(
xpos + x,
@ -143,7 +144,7 @@ public class Space {
xpos += offset.x;
zpos += offset.z;
Mesh.Cube.Draw(
Mono.inst.matHolo,
mono.mat.holo,
Matrix.TRS(
new Vec3(xpos, (height * 0.5f), zpos),
Quat.FromAngles(0, angle, 0),
@ -153,7 +154,7 @@ public class Space {
);
Mesh.Cube.Draw(
Mono.inst.matHolo,
mono.mat.holo,
Matrix.TRS(
new Vec3(xpos, height, zpos),
Quat.FromAngles(0, angle, 0),
@ -178,6 +179,8 @@ public class Space {
Mesh mesh_ripple = Model.FromFile("ripple.glb").FindNode("ripple").Mesh;
public void Frame(int id) {
Mono mono = Mono.inst;
if (!falling) {
PR.Noise noise = Mono.inst.noise;
rippleT += Time.Stepf / 0.5f;
@ -194,7 +197,7 @@ public class Space {
t *= t;
t = 1 - t;
mesh_ripple.Draw(
Mono.inst.matHoloclear,
mono.mat.holoclear,
Matrix.TRS(pos, Quat.Identity, new Vec3(0.333f * t, 0.0133f, 0.333f * t)),
new Color(1f, 1f, 1f, 1f) * (1f - t)
);
@ -210,7 +213,7 @@ public class Space {
}
Mesh.Cube.Draw(
Mono.inst.matHoloclear,
mono.mat.holoclear,
Matrix.TRS(pos, Quat.Identity, new Vec3(0.002f, 0.98f, 0.002f)),
new Color(0.8f, 0.8f, 1f) * 0.1333f
);

62
src/Spatial.cs Normal file
View file

@ -0,0 +1,62 @@
namespace Oriels;
public class Spatial {
// example, to build out from!
// rn it's just adding two vectors
// building towards great interactivity and visual feedback
public Spatial(Vec3 origin) {
this.origin = origin;
}
public Vec3 origin;
float scale = 0.2f;
float thickness => 0.02f * scale;
float t = 1.0f;
Vec3 aFrom, aTo;
Vec3 a => Vec3.Lerp(aFrom, aTo, MathF.Min(t, 1f));
Vec3 bFrom, bTo;
Vec3 b => Vec3.Lerp(bFrom, bTo, MathF.Min(t, 1f));
Vec3 c => a + b;
public void Frame() {
// origin axis
Lines.Add(origin, World(new Vec3(1, 0, 0)), new Color(1, 0, 0), thickness * 0.333f);
Lines.Add(origin, World(new Vec3(0, 1, 0)), new Color(0, 1, 0), thickness * 0.333f);
Lines.Add(origin, World(new Vec3(0, 0, 1)), new Color(0, 0, 1), thickness * 0.333f);
Mesh.Sphere.Draw(Material.Unlit, Matrix.TS(origin, thickness), new Color(0.5f, 0.5f, 0.5f));
Random rand = Random.Shared;
if (t >= 1.3f) {
aFrom = aTo;
bFrom = bTo;
if (rand.NextSingle() < 0.5f) {
aTo = new Vec3(rand.NextSingle(), rand.NextSingle(), rand.NextSingle()) * 0.5f;
} else {
bTo = new Vec3(rand.NextSingle(), rand.NextSingle(), rand.NextSingle()) * 0.5f;
}
t = 0.0f;
}
t += Time.Stepf / 2f;
// Lines.Add(origin, World(a), new Color(1, 1, 1, 0.5f), thickness * 2); // they clip with no material way to fix it?
Lines.Add(origin, World(a), new Color(1, 1, 0), thickness);
Mesh.Sphere.Draw(Material.Unlit, Matrix.TS(World(a), thickness), new Color(1, 1, 0));
// Lines.Add(origin, World(b), new Color(1, 1, 1, 0.5f), thickness * 2);
Lines.Add(origin, World(b), new Color(0, 1, 1), thickness);
Mesh.Sphere.Draw(Material.Unlit, Matrix.TS(World(b), thickness), new Color(0, 1, 1));
Lines.Add(World(a), World(c), new Color(0, 1, 1), thickness);
Lines.Add(World(b), World(c), new Color(1, 1, 0), thickness);
// color between yellow and cyan using HSV
Mesh.Sphere.Draw(Material.Unlit, Matrix.TS(World(c), thickness), new Color(0.5f, 1, 1));
}
Vec3 World(Vec3 local) {
return origin + local * scale;
}
//
}

101
src/Window.cs Normal file
View file

@ -0,0 +1,101 @@
namespace Oriels;
public class Window {
int dofIndex = 0;
Pose windowPose = new Pose(-0.333f, 1.2f, -0.5f, Quat.FromAngles(0, 180, 0));
Material windowMat = new Material(Shader.FromFile("shaders/window.hlsl"));
TextStyle style = Text.MakeStyle(Font.FromFile("add/fonts/DM-Mono.ttf"), 1f * U.cm, Color.Black);
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);
public void Frame() {
Mono mono = Mono.inst;
windowMat.Transparency = Transparency.Add;
windowMat.FaceCull = Cull.None;
windowMat.DepthWrite = false;
UI.SetElementVisual(UIVisual.WindowBody, Mesh.Quad, windowMat, Vec2.One);
UI.SetElementVisual(UIVisual.WindowHead, Mesh.Quad, windowMat, Vec2.One);
UI.WindowBegin("design vars", ref windowPose);
// UI.SetThemeColor(UIColor.Primary, new Color(1f, 1f, 1f));
// UI.HandleBegin("design", ref windowPose, new Bounds(V.XYZ(0.02f, 0.02f, 0.02f)), true, UIMove.FaceUser);
UI.SetThemeColor(UIColor.Background, new Color(0.2f, 0.2f, 0.3f));
UI.SetThemeColor(UIColor.Primary, new Color(0.4f, 0.4f, 0.6f));
UI.SetThemeColor(UIColor.Common, new Color(1.0f, 1.0f, 1.0f));
UI.PushTextStyle(style);
// if (UI.Button("Draw Oriel Axis")) { oriel.drawAxis = !oriel.drawAxis; }
// if (UI.Button("Reset Oriel Quat")) { oriel.ori = Quat.Identity; }
// if (UI.Button("Scale w/Height")) { oriel.scaleWithHeight = !oriel.scaleWithHeight; }
// UI.HSlider("Scale", ref oriel.scale, 0.1f, 1f, 0.1f);
// UI.HSlider("Multiplier", ref oriel.multiplier, 0.1f, 1f, 0.1f);
// // UI.Label("Player.y");
// UI.HSlider("Player.y", ref greenyard.height, 1f, 6f, 0.2f);
// UI.Label("pos.y");
// UI.HSlider("pos.y", ref playerY, -1f, 1f, 0.1f);
if (UI.Button("prev") && dofIndex > 0) {
dofIndex--;
}
UI.SameLine();
if (UI.Button("next") && dofIndex < mono.interactions.Length - 1) {
dofIndex++;
}
Interaction dof = mono.interactions[dofIndex];
Type type = dof.GetType();
// active toggle
Color tint = dof.Active ? new Color(0, 1, 0) : new Color(1, 0, 0);
UI.PushTint(tint);
if (UI.Button(dof.Active ? "on" : "off")) {
dof.Active = !dof.Active;
}
UI.PopTint();
if (type == typeof(Chiral)) {
Chiral chiral = (Chiral)dof;
System.Reflection.FieldInfo[] fields = typeof(Chiral).GetFields();
foreach (System.Reflection.FieldInfo field in fields) {
if (field.FieldType == typeof(Handed)) {
Handed handed = (Handed)field.GetValue(chiral);
if (UI.Button("<") && (int)handed > 0) {
handed = (Handed)((int)handed - 1);
field.SetValue(chiral, handed);
}
UI.SameLine();
if (UI.Button(">") && (int)handed < 2) {
handed = (Handed)((int)handed + 1);
field.SetValue(chiral, handed);
}
UI.SameLine(); UI.Label(handed.ToString());
}
}
RenderDof(chiral.dofs[0]);
} else {
RenderDof(dof);
}
UI.WindowEnd();
// UI.HandleEnd();
}
void RenderDof(Interaction dof) {
Type type = dof.GetType();
UI.Label("°" + type.Name);
System.Reflection.FieldInfo[] fields = type.GetFields();
for (int j = 0; j < fields.Length; j++) {
System.Reflection.FieldInfo field = fields[j];
if (field.FieldType == typeof(Design)) {
Design design = (Design)field.GetValue(dof);
UI.Input(field.Name, ref design.str, fieldSize, TextContext.Number);
UI.SameLine();
UI.PushTextStyle(style2);
UI.Label(design.term, new Vec2(4f * U.cm, 3f * U.cm));
UI.PopTextStyle();
UI.SameLine(); UI.Label(field.Name);
}
}
}
}

View file

@ -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))