fuckingtech/public/assets/glsl/lygia/sdf/coneSDF.msl
Elias Rhouzlane bf76c6b086 fix: code
2025-04-06 17:23:52 +02:00

44 lines
No EOL
1.1 KiB
Text

/*
contributors: Inigo Quiles
description: generate the SDF of a cone
use: <float> coneSDF( <float3> pos, <float3> c )
*/
#ifndef FNC_CONESDF
#define FNC_CONESDF
float coneSDF( float3 p, float3 c ) {
float2 q = float2( length(p.xz), p.y );
float d1 = -q.y-c.z;
float d2 = max( dot(q,c.xy), q.y);
return length(max(float2(d1,d2),0.0)) + min(max(d1,d2), 0.);
}
// vertical
float coneSDF( float3 p, float2 c, float h ) {
float2 q = h*float2(c.x,-c.y)/c.y;
float2 w = float2( length(p.xz), p.y );
float2 a = w - q*clamp( dot(w,q)/dot(q,q), 0.0, 1.0 );
float2 b = w - q*float2( clamp( w.x/q.x, 0.0, 1.0 ), 1.0 );
float k = sign( q.y );
float d = min(dot( a, a ),dot(b, b));
float s = max( k*(w.x*q.y-w.y*q.x),k*(w.y-q.y) );
return sqrt(d)*sign(s);
}
// Round
float coneSDF( float3 p, float r1, float r2, float h ) {
float2 q = float2( length(p.xz), p.y );
float b = (r1-r2)/h;
float a = sqrt(1.0-b*b);
float k = dot(q,float2(-b,a));
if( k < 0.0 ) return length(q) - r1;
if( k > a*h ) return length(q-float2(0.0,h)) - r2;
return dot(q, float2(a,b) ) - r1;
}
#endif