89 lines
2.2 KiB
GLSL
89 lines
2.2 KiB
GLSL
Shader "CrispyPin/Bocs"
|
|
{
|
|
Properties
|
|
{
|
|
[Header(Raymarcher Properties)]
|
|
_MaxSteps ("Max steps", Integer) = 128
|
|
_MaxDist ("Max distance", Float) = 128
|
|
_SurfDist ("Surface distance threshold", Range(.0001, .05)) = .001
|
|
}
|
|
SubShader
|
|
{
|
|
Tags { "RenderType"="Opaque" }
|
|
Cull Front
|
|
LOD 100
|
|
|
|
Pass
|
|
{
|
|
CGPROGRAM
|
|
#pragma vertex vert
|
|
#pragma fragment frag
|
|
|
|
int _MaxSteps;
|
|
float _MaxDist;
|
|
float _SurfDist;
|
|
#define MAX_STEPS _MaxSteps
|
|
#define MAX_DIST _MaxDist
|
|
#define SURF_DIST _SurfDist
|
|
|
|
|
|
#define SCENE_FN main
|
|
//#define LIGHT_FN lighting
|
|
|
|
// #define SCENE_SCALE 1
|
|
|
|
#define DISCARD_ON_MISS
|
|
|
|
#include "lib/libgarbage.cginc"
|
|
|
|
#define SPEED 1.5
|
|
#define BOX_SIZE .15
|
|
#define RADIUS BOX_SIZE*2
|
|
|
|
float3 checkers(float3 p, float3 a, float3 b, float2 size) {
|
|
float2 q = p.xz / size;
|
|
q = int2(abs(q) + .5);
|
|
int s = ((q.x + q.y) % 2);
|
|
return s * a + (1 - s) * b;
|
|
}
|
|
|
|
SurfacePoint Boc(float3 p, float t) {
|
|
float x = smoothstep(0, .5, fmod(t, 4) - .5) * RADIUS;
|
|
float z = smoothstep(1, .5, fmod(t, 4) - 2) * RADIUS;
|
|
float y = smoothstep(.25, .75, abs(fmod(t - .75, 2) - 1)) * BOX_SIZE * 2 - BOX_SIZE / 2;
|
|
return mBox(p - float3(x,y,z), BOX_SIZE, mat(.05, .8, .8));
|
|
}
|
|
|
|
SurfacePoint main(float3 p) {
|
|
SurfacePoint d;
|
|
|
|
// base
|
|
const float base_width = BOX_SIZE * 6 - 0.01;
|
|
d = mBox(p - float3(0,-.15,0), float3(base_width, .3, base_width), mat(checkers(p + BOX_SIZE/2 , 0.35, 0.45, BOX_SIZE )));
|
|
float t = _Time.y * SPEED;
|
|
|
|
// holes
|
|
float3 ph = float3(abs(p.x), p.y, abs(p.z));
|
|
d = qSub(d, mBox(ph - float3(RADIUS, 0, RADIUS), float3(BOX_SIZE, RADIUS, BOX_SIZE)));
|
|
d = qSub(d, mBox(ph - float3(0, 0, RADIUS), float3(BOX_SIZE, RADIUS, BOX_SIZE)));
|
|
d = qSub(d, mBox(ph - float3(RADIUS, 0, 0), float3(BOX_SIZE, RADIUS, BOX_SIZE)));
|
|
|
|
// boxes
|
|
d = qUnion(d, Boc(p, t));
|
|
d = qUnion(d, Boc(p, t + 2));
|
|
float3 p2 = p * float3(-1,1,-1);
|
|
d = qUnion(d, Boc(p2, t));
|
|
d = qUnion(d, Boc(p2, t + 2));
|
|
float3 p3 = p.zyx * float3(-1,1,1);
|
|
d = qUnion(d, Boc(p3, t));
|
|
d = qUnion(d, Boc(p3, t + 2));
|
|
float3 p4 = p.zyx * float3(1,1,-1);
|
|
d = qUnion(d, Boc(p4, t));
|
|
d = qUnion(d, Boc(p4, t + 2));
|
|
|
|
return d;
|
|
}
|
|
ENDCG
|
|
}
|
|
}
|
|
}
|