diff --git a/add/shaders/above.hlsl b/add/shaders/above.hlsl
new file mode 100644
index 0000000..1095e9c
--- /dev/null
+++ b/add/shaders/above.hlsl
@@ -0,0 +1,68 @@
+#include "stereokit.hlsli"
+
+//--name = dofdev/above
+
+//--color:color = 1,1,1,1
+//--tex_scale = 1
+//--diffuse = white
+//--clearcolor:color = 0,0,0,0
+
+float4 color;
+float tex_scale;
+Texture2D diffuse : register(t0);
+SamplerState diffuse_s : register(s0);
+float4 clearcolor;
+
+struct vsIn {
+ float4 pos : SV_Position;
+ float3 norm : NORMAL0;
+ float2 uv : TEXCOORD0;
+ float4 col : COLOR0;
+};
+struct psIn {
+ float4 pos : SV_Position;
+ float2 uv : TEXCOORD0;
+ float4 world : WORLD;
+ float4 color : COLOR0;
+ float3 campos : TEXCOORD1;
+ uint view_id : SV_RenderTargetArrayIndex;
+};
+
+psIn vs(vsIn input, uint id : SV_InstanceID) {
+ psIn o;
+ o.view_id = id % sk_view_count;
+ id = id / sk_view_count;
+
+ o.campos = sk_camera_pos[o.view_id].xyz;
+
+ 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.uv = input.uv * tex_scale;
+ o.color = color * input.col * sk_inst[id].color;
+ o.color.rgb *= Lighting(normal);
+ return o;
+}
+
+float4 ps(psIn input) : SV_TARGET {
+ // clip(input.world.y);
+
+ float4 col = diffuse.Sample(diffuse_s, input.uv);
+ col = col * input.color;
+
+ if (input.world.y < 0) {
+ col.r = col.r * 0.0;
+ col.g = col.g * 0.0;
+ col.b = col.b * 0.3;
+
+ col.rgb *= 0.1;
+ } else {
+ col.rgb = lerp(col.rgb, float3(0.3, 1, 0.2), (input.world.y / 20));
+ }
+
+ // 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)));
+}
\ No newline at end of file
diff --git a/add/shaders/below.hlsl b/add/shaders/below.hlsl
new file mode 100644
index 0000000..81cd3f0
--- /dev/null
+++ b/add/shaders/below.hlsl
@@ -0,0 +1,99 @@
+#include "stereokit.hlsli"
+
+//--name = dofdev/below
+
+//--color:color = 1,1,1,1
+//--tex_scale = 1
+//--diffuse = white
+//--clearcolor:color = 0,0,0,0
+
+float4 color;
+float tex_scale;
+Texture2D diffuse : register(t0);
+SamplerState diffuse_s : register(s0);
+float4 clearcolor;
+
+struct vsIn {
+ float4 pos : SV_Position;
+ float3 norm : NORMAL0;
+ float2 uv : TEXCOORD0;
+ float4 col : COLOR0;
+};
+struct psIn {
+ float4 pos : SV_Position;
+ float2 uv : TEXCOORD0;
+ float4 world : WORLD;
+ float4 color : COLOR0;
+ float3 campos : TEXCOORD1;
+ uint view_id : SV_RenderTargetArrayIndex;
+};
+
+psIn vs(vsIn input, uint id : SV_InstanceID) {
+ psIn o;
+ o.view_id = id % sk_view_count;
+ id = id / sk_view_count;
+
+ o.campos = sk_camera_pos[o.view_id].xyz;
+
+ o.world = mul(input.pos, sk_inst[id].world);
+ o.world.y = -o.world.y;
+ o.pos = mul(o.world, sk_viewproj[o.view_id]);
+
+ float3 normal = 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);
+ return o;
+}
+
+float4 ps(psIn input) : SV_TARGET {
+ clip(-input.world.y);
+
+ float4 col = diffuse.Sample(diffuse_s, input.uv);
+ col = col * input.color;
+
+ // dot product of the view direction and the normal
+ float3 tocam = normalize(input.campos - input.world.xyz);
+ float3 normal = normalize(float3(0, 1, 0));
+ float dotprod = max(dot(tocam, normal), 0.0);
+ float radians = acos(dotprod);
+ float degrees = radians * 180.0 / 3.14159;
+ float a = input.world.y * 2.0;
+ // float bdeg = (1.0 - dotprod) * 90.0;
+ float bdeg = degrees;
+ float angle = 180.0 - (bdeg * 2.0);
+
+ // float depth = max(1.0 - (input.world.y / -3.0), 0.0);
+ float x = angle / 180.0;
+ x = 1 - x;
+ x = x * 0.1;
+ x = x + 0.9;
+
+ // dist magnitude from center X0Z
+ float dist = max(1 - (length(input.world.xz) / 10.0), 0.0);
+ float t = (x * x) * (dist * dist);
+ // bluer
+ col.r *= 1 - (t / 10);
+ col.g *= 1 - (t / 10);
+
+ col.rgb = lerp(col.rgb, float3(0.3, 1, 0.2), (-input.world.y / 20));
+
+ return lerp(clearcolor, col, t);
+
+
+ // float r = (a / sin(angle)) * sin(bdeg);
+
+ // float3 topWorld = float3(input.world.x, 0, input.world.z);
+ // float3 camWorld = float3(input.campos.x, 0, input.campos.z);
+ // float3 proj = normalize(camWorld - topWorld);
+
+ // float3 reflectionPoint = topWorld + (proj * r);
+
+ // float val = max(dot(normalize(input.campos - reflectionPoint), normal), 0.0);
+
+ // return col * val;
+
+
+
+}
\ No newline at end of file
diff --git a/app/Mono.cs b/app/Mono.cs
index 9427c04..582db1e 100644
--- a/app/Mono.cs
+++ b/app/Mono.cs
@@ -7,7 +7,10 @@ public class Mono {
public PullRequest.Noise noise = new PullRequest.Noise(939949595);
public Material matDev;
- public Material matHolo;
+ public Material matHoloframe = new Material(Shader.FromFile("shaders/above.hlsl"));
+ Material matHoloframeUnder = 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 Rig rig = new Rig();
public Space space = new Space();
@@ -65,13 +68,24 @@ public class Mono {
matDev = Material.Default.Copy();
matDev.SetTexture("diffuse", Tex.DevTex);
- matHolo = Material.Default.Copy();
- matHolo.Transparency = Transparency.Add;
- matHolo.DepthWrite = false;
- // matHolo.DepthTest = DepthTest.Always;
- matHolo.FaceCull = Cull.None;
- // matHolo.SetTexture("diffuse", Tex.DevTex);
- matHolo.Wireframe = true;
+
+ matHolo.SetColor("clearcolor", Renderer.ClearColor);
+ matHoloUnder.SetColor("clearcolor", Renderer.ClearColor);
+ matHoloUnder.FaceCull = Cull.None;
+ matHolo.Chain = matHoloUnder;
+
+
+ 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;
}
public void Frame() {
@@ -120,6 +134,7 @@ public class Mono {
if (rtb.Active) {
rtb.Demo();
}
+
//
// rBlock.Step(); lBlock.Step();
@@ -322,6 +337,11 @@ public class Design {
demo
virtual shapes -> 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
diff --git a/app/Space.cs b/app/Space.cs
index 6dea091..859fe22 100644
--- a/app/Space.cs
+++ b/app/Space.cs
@@ -13,8 +13,8 @@ public class Space {
BufferData data = new BufferData();
Material matFloor = new Material(Shader.Default);
- Model shed = Model.FromFile("shed/shed.glb", Shader.FromFile("/shaders/room.hlsl"));
- Model leek = Model.FromFile("houseleek_plant.glb", Shader.FromFile("/shaders/room.hlsl"));
+ Model shed = Model.FromFile("shed/shed.glb", Shader.FromFile("shaders/room.hlsl"));
+ Model leek = Model.FromFile("houseleek_plant.glb", Shader.FromFile("shaders/room.hlsl"));
Mesh cube = Mesh.Cube;
Solid floor;
@@ -104,6 +104,34 @@ public class Space {
shed.Draw(Matrix.Identity);
- leek.Draw(Matrix.TRS(new Vec3(2.5f, 0, -2.5f) * 1.2f, Quat.FromAngles(180f, 30f, 0f), 1.2f));
+ // leek.Draw(Matrix.TRS(new Vec3(2.5f, 0, -2.5f) * 1.2f, Quat.FromAngles(180f, 30f, 0f), 1.2f));
+
+ // draw grid of pillars
+ float radius = 9;
+ Vec3 pillarsOffset = new Vec3(0, 0, -10);
+ for (float x = -radius; x < radius; x++) {
+ for (float z = -radius; z < radius; z++) {
+ float height = 3f;
+ Mesh.Cube.Draw(
+ Mono.inst.matHolo,
+ Matrix.TRS(
+ new Vec3(pillarsOffset.x + x, (height * 0.5f), pillarsOffset.z - z),
+ Quat.FromAngles(0, 0, 0),
+ new Vec3(0.1f, height, 0.1f)
+ ),
+ new Color(1f, 1f, 1f, 1f)
+ );
+
+ Mesh.Cube.Draw(
+ Mono.inst.matHolo,
+ Matrix.TRS(
+ new Vec3(pillarsOffset.x + x, height, pillarsOffset.z - z),
+ Quat.FromAngles(0, 0, 0),
+ new Vec3(0.95f, 1f, 0.95f)
+ ),
+ new Color(0.3f, 1f, 0.2f, 1f)
+ );
+ }
+ }
}
}
\ No newline at end of file
diff --git a/app/_Init.cs b/app/_Init.cs
index 4b80087..53bf073 100644
--- a/app/_Init.cs
+++ b/app/_Init.cs
@@ -16,11 +16,10 @@ if (!SK.Initialize(settings))
Input.HandSolid(Handed.Max, false);
Input.HandVisible(Handed.Max, true);
Renderer.EnableSky = false;
-Renderer.ClearColor = new Color(0f, 0f, 0f);
+Renderer.ClearColor = new Color(0f / 256f, 162f / 256f, 206f / 256f);
Oriels.Mono mono = Oriels.Mono.inst;
mono.Init();
SK.Run(() => {
mono.Frame();
-});
-// SK.Shutdown();
\ No newline at end of file
+});
\ No newline at end of file
diff --git a/app/dofs/oriel/Oriel.cs b/app/dofs/oriel/Oriel.cs
index 3357dc7..64a8ae3 100644
--- a/app/dofs/oriel/Oriel.cs
+++ b/app/dofs/oriel/Oriel.cs
@@ -304,12 +304,12 @@ public class Oriel {
}
}
- Mesh.Sphere.Draw(Mono.inst.matHolo,
+ Mesh.Sphere.Draw(Mono.inst.matHoloframe,
Matrix.TRS(cursor, cursorOri, new Vec3(0.02f, 0.02f, 0.02f)),
cursorColor
);
- Mesh.Sphere.Draw(Mono.inst.matHolo,
+ Mesh.Sphere.Draw(Mono.inst.matHoloframe,
Matrix.TS(cursor, new Vec3(1f, 1f, 1f) * cursorRadius * 2),
new Color(0.1f, 0.1f, 0.1f)
);
diff --git a/app/dofs/stretch-cursor/wave/WaveCursor.cs b/app/dofs/stretch-cursor/wave/WaveCursor.cs
index ab54cb2..ba92179 100644
--- a/app/dofs/stretch-cursor/wave/WaveCursor.cs
+++ b/app/dofs/stretch-cursor/wave/WaveCursor.cs
@@ -43,9 +43,9 @@ class WaveCursor : dof {
cursor.pos.z = (float)zF.Filter(cursor.raw.z, (double)Time.Elapsedf);
cursor.smooth = Vec3.Lerp(cursor.smooth, cursor.pos, Time.Elapsedf * 6f);
- Mesh.Sphere.Draw(Mono.inst.matHolo, Matrix.TRS(cursor.raw, Quat.Identity, 0.01f), new Color(1, 0, 0));
- Mesh.Sphere.Draw(Mono.inst.matHolo, Matrix.TRS(cursor.pos, Quat.Identity, 0.01f), new Color(0, 1, 0));
- Mesh.Sphere.Draw(Mono.inst.matHolo, Matrix.TRS(cursor.smooth, Quat.Identity, 0.01f), new Color(0, 0, 1));
+ 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));
// pinch is more than just the thumb and index finger
@@ -141,7 +141,7 @@ class WaveCursor : dof {
Vec3 from = i > 0 ? points[i - 1] : nextPos;
Quat ori = Quat.LookDir(Vec3.Direction(points[i], from));
Mesh.Cube.Draw(
- Mono.inst.matHolo,
+ Mono.inst.matHoloframe,
Matrix.TRS(
points[i] + ori * new Vec3(0, 0, 0.01f) * scale,
ori,
diff --git a/app/dofs/trackballer/Trackballer.cs b/app/dofs/trackballer/Trackballer.cs
index 53b00d1..e7c7bd3 100644
--- a/app/dofs/trackballer/Trackballer.cs
+++ b/app/dofs/trackballer/Trackballer.cs
@@ -48,7 +48,7 @@ class Trackballer : dof {
thumbJoint.orientation,
new Vec3(handed == Handed.Left ? -1f : 1f, 1f, 1f) * 0.1666f
);
- mesh.Draw(Mono.inst.matHolo, pad, new Color(0, 1, 1));
+ mesh.Draw(Mono.inst.matHoloframe, pad, new Color(0, 1, 1));
// Ball anchor
HandJoint ballJoint = hand.Get(FingerId.Index, JointId.KnuckleMajor);
@@ -97,7 +97,7 @@ class Trackballer : dof {
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.matHolo,
+ Mesh.Sphere.Draw(Mono.inst.matHoloframe,
Matrix.TRS(anchorPos, thumbJoint.orientation, pullScalar * radius.value),
new Color(0, 1, 1) * (btnPull.held ? 1f : 0.0666f)
);
@@ -105,7 +105,7 @@ class Trackballer : dof {
anchor.Transform(point), anchorPos,
new Color(0, 1, 1), 1f * U.mm
);
- Mesh.Sphere.Draw(Mono.inst.matHolo,
+ Mesh.Sphere.Draw(Mono.inst.matHoloframe,
Matrix.TRS(anchor.Transform(point), thumbJoint.orientation, 2f * U.mm),
new Color(0, 1, 1)
);
@@ -116,7 +116,7 @@ class Trackballer : dof {
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.matHolo,
+ Mesh.Sphere.Draw(Mono.inst.matHoloframe,
Matrix.TRS(anchorPos, ori, (radius.value * 2) * pushScalar),
new Color(1, 0, 0) * (btnPush.held ? 1f : 0.2f)
);
@@ -148,7 +148,7 @@ class Trackballer : dof {
// Draw ball result
Mesh.Sphere.Draw(
- Mono.inst.matHolo,
+ Mono.inst.matHoloframe,
Matrix.TRS(anchorPos, ori, radius.value * 2),
new Color(0.8f, 0, 0)
);
@@ -178,7 +178,7 @@ class Trackballer : dof {
float width = 52 * U.cm;
float height = 29f * U.cm;
Mesh.Quad.Draw(
- Mono.inst.matHolo,
+ Mono.inst.matHoloframe,
Matrix.S(new Vec3(width, height, 1)) * panel,
new Color(1, 1, 1)
);
diff --git a/oriels.csproj b/oriels.csproj
index 653b467..03709e3 100644
--- a/oriels.csproj
+++ b/oriels.csproj
@@ -22,6 +22,8 @@
+
+
@@ -30,6 +32,8 @@
+
+