2013-02-22 09:07:31 +04:00
|
|
|
//
|
|
|
|
// References:
|
|
|
|
// Modeling with distance functions
|
|
|
|
// http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm
|
|
|
|
//
|
|
|
|
|
|
|
|
// primitives
|
|
|
|
|
|
|
|
float sdSphere(vec3 _pos, float _radius)
|
|
|
|
{
|
|
|
|
return length(_pos) - _radius;
|
|
|
|
}
|
|
|
|
|
|
|
|
float udBox(vec3 _pos, vec3 _extents)
|
|
|
|
{
|
|
|
|
return length(max(abs(_pos) - _extents, 0.0) );
|
|
|
|
}
|
|
|
|
|
|
|
|
float udRoundBox(vec3 _pos, vec3 _extents, float r)
|
|
|
|
{
|
|
|
|
return length(max(abs(_pos) - _extents, 0.0) ) - r;
|
|
|
|
}
|
|
|
|
|
|
|
|
float sdBox(vec3 _pos, vec3 _extents)
|
|
|
|
{
|
|
|
|
vec3 d = abs(_pos) - _extents;
|
|
|
|
return min(max(d.x, max(d.y, d.z) ), 0.0) +
|
|
|
|
length(max(d, 0.0) );
|
|
|
|
}
|
|
|
|
|
|
|
|
float sdTorus(vec3 _pos, vec2 t)
|
|
|
|
{
|
|
|
|
vec2 q = vec2(length(_pos.xz) - t.x, _pos.y);
|
|
|
|
return length(q) - t.y;
|
|
|
|
}
|
|
|
|
|
|
|
|
float sdCylinder(vec3 _pos, vec3 c)
|
|
|
|
{
|
|
|
|
return length(_pos.xz - c.xy) - c.z;
|
|
|
|
}
|
|
|
|
|
|
|
|
float sdCone(vec3 _pos, vec2 c)
|
|
|
|
{
|
|
|
|
// c must be normalized
|
|
|
|
float q = length(_pos.xy);
|
|
|
|
return dot(c, vec2(q, _pos.z) );
|
|
|
|
}
|
|
|
|
|
|
|
|
float sdPlane(vec3 _pos, vec4 n)
|
|
|
|
{
|
|
|
|
// n must be normalized
|
|
|
|
return dot(_pos, n.xyz) + n.w;
|
|
|
|
}
|
|
|
|
|
|
|
|
float sdHexPrism(vec3 _pos, vec2 h)
|
|
|
|
{
|
|
|
|
vec3 q = abs(_pos);
|
|
|
|
return max(q.z - h.y, max(q.x + q.y * 0.57735, q.y * 1.1547) - h.x);
|
|
|
|
}
|
|
|
|
|
|
|
|
float sdTriPrism(vec3 _pos, vec2 h)
|
|
|
|
{
|
|
|
|
vec3 q = abs(_pos);
|
|
|
|
return max(q.z - h.y, max(q.x * 0.866025 + _pos.y * 0.5, -_pos.y) - h.x * 0.5);
|
|
|
|
}
|
|
|
|
|
|
|
|
// domain operations
|
|
|
|
|
|
|
|
float opUnion(float d1, float d2)
|
|
|
|
{
|
|
|
|
return min(d1, d2);
|
|
|
|
}
|
|
|
|
|
|
|
|
float opSubtract(float d1, float d2)
|
|
|
|
{
|
|
|
|
return max(-d1, d2);
|
|
|
|
}
|
|
|
|
|
|
|
|
float opIntersect(float d1, float d2)
|
|
|
|
{
|
|
|
|
return max(d1, d2);
|
|
|
|
}
|