roughed out, sk bugged

This commit is contained in:
spatialfree 2021-11-29 09:36:50 -05:00
parent d46f305ae4
commit a832b4c8bf
3 changed files with 85 additions and 19 deletions

View file

@ -19,6 +19,12 @@ class Program {
public class Mono {
public Mic mic;
public Controller domCon, subCon; public bool lefty;
public float movePress;
public Vec3 dragStart, posStart;
public float railT;
Mesh ball = Default.MeshSphere;
Material ballMat = Default.Material;
public void Run() {
// mic = new Mic();
@ -42,17 +48,60 @@ public class Mono {
else { domCon = Input.Controller(Handed.Right); subCon = Input.Controller(Handed.Left); }
if (subCon.IsX2JustPressed) { lefty = !lefty; }
// ball.Draw(ballMat, Matrix.TS(pos, 0.1f));
Renderer.CameraRoot = Matrix.T(pos);
SpatialCursor cursor = cursors.Step(domCon.aim, subCon.aim);
Quat rot = Quat.FromAngles(subCon.stick.y * -90, 0, subCon.stick.x * 90);
Vec3 dir = Vec3.Up * (subCon.IsStickClicked ? -1 : 1);
Vec3 fullstick = subCon.aim.orientation * rot * dir;
pos += fullstick * subCon.trigger * Time.Elapsedf;
SpatialCursor cursor = cursors.Step(domCon.aim, subCon.aim);
Vec3[] rail = new Vec3[] {
new Vec3(0, 0, -1),
new Vec3(0, 0, -2),
new Vec3(1, 2, -3),
new Vec3(0, 1, -4),
};
Bezier.Draw(rail);
if (subCon.IsX1JustPressed) {
int closest = 0;
float closestDist = float.MaxValue;
Vec3 closestPoint = Vec3.Zero;
for (int i = 0; i < rail.Length; i++) {
Vec3 point = Bezier.Sample(rail, (float)i / (rail.Length - 1f));
float dist = Vec3.Distance(point, subCon.aim.position);
if (dist < closestDist) {
closest = i;
closestDist = dist;
closestPoint = point;
railT = (float)i / (rail.Length - 1f);
}
}
// pos = closestPoint - (subCon.aim.position - pos);
}
if (subCon.IsX1Pressed) {
pos = Bezier.Sample(rail, railT) - (subCon.aim.position - pos);
railT += Time.Elapsedf * 0.1f;
// how to reliably determine and control which direction to go?
}
if (domCon.IsX1JustPressed) {
pos = cursor.p0;
movePress = Time.Totalf;
dragStart = cursor.p0;
posStart = pos;
}
if (domCon.IsX1Pressed) {
pos -= cursor.p0 - dragStart;
dragStart = cursor.p0;
}
if (domCon.IsX1JustUnPressed && Time.Totalf - movePress < 0.2f) {
pos = cursor.p0 - (Input.Head.position - pos);
}
// pos.x = (float)Math.Sin(Time.Total * 0.1f) * 0.5f;
Renderer.CameraRoot = Matrix.T(pos);
// cursor.Step(lHand.aim, rHand.aim); cursor.DrawSelf();
// net.me.cursorA = Vec3.Up * (float)Math.Sin(Time.Total);

View file

@ -25,8 +25,8 @@
switch between cursors with a button (quick press(b) on both hands to switch/cycle through the two handed ones) long press(b) on one hand to swap mainhand
movement:
- fullstick
- ~~teleport~~ and drag
- ~~fullstick~~
- ~~teleport and drag~~
- bezier rails
blocks you can manipulate with spatial cursors (trackballer)

View file

@ -107,20 +107,7 @@ public class CubicFlow : SpatialCursor {
// if toggle
Draw(this.p0, this.p1, this.p2, this.p3);
}
LinePoint[] bezier = new LinePoint[64];
public void Draw(Vec3 p0, Vec3 p1, Vec3 p2, Vec3 p3) {
for (int i = 0; i < bezier.Length; i++) {
float t = i / ((float)bezier.Length - 1);
Vec3 a = Vec3.Lerp(p0, p1, t);
Vec3 b = Vec3.Lerp(p1, p2, t);
Vec3 c = Vec3.Lerp(p2, p3, t);
Vec3 pos = Vec3.Lerp(Vec3.Lerp(a, b, t), Vec3.Lerp(b, c, t), t);
bezier[i] = new LinePoint(pos, Color.White, 0.01f);
}
Lines.Add(bezier);
Bezier.Draw(this.p0, this.p1, this.p2, this.p3);
}
public override void Calibrate() {}
@ -155,6 +142,36 @@ public class SupineCursor : SpatialCursor {
}
}
public static class Bezier {
static int detail = 64;
public static void Draw(Vec3 p0, Vec3 p1, Vec3 p2, Vec3 p3) {
LinePoint[] bezier = new LinePoint[detail];
for (int i = 0; i < bezier.Length; i++) {
float t = i / ((float)bezier.Length - 1);
Vec3 a = Vec3.Lerp(p0, p1, t);
Vec3 b = Vec3.Lerp(p1, p2, t);
Vec3 c = Vec3.Lerp(p2, p3, t);
Vec3 pos = Vec3.Lerp(Vec3.Lerp(a, b, t), Vec3.Lerp(b, c, t), t);
bezier[i] = new LinePoint(pos, Color.White, 0.01f);
}
Lines.Add(bezier);
}
public static void Draw(Vec3[] points) {
Draw(points[0], points[1], points[2], points[3]);
}
public static Vec3 Sample(Vec3 p0, Vec3 p1, Vec3 p2, Vec3 p3, float t) {
Vec3 a = Vec3.Lerp(p0, p1, t);
Vec3 b = Vec3.Lerp(p1, p2, t);
Vec3 c = Vec3.Lerp(p2, p3, t);
Vec3 pos = Vec3.Lerp(Vec3.Lerp(a, b, t), Vec3.Lerp(b, c, t), t);
return pos;
}
public static Vec3 Sample(Vec3[] points, float t) {
return Sample(points[0], points[1], points[2], points[3], t);
}
}
// for fun
// public class ClawCursor : SpatialCursor {