[orx-shader-phrases] Add common SDF utility phrases

Introduce several new shader utility phrases for Signed Distance Functions (SDF), including operations (e.g., union, intersection, XOR), primitive shapes (e.g., box, circle, heart, segment), and supporting functions like `dot2`.
This commit is contained in:
Edwin Jakobs
2025-03-10 10:58:48 +01:00
parent 4f63ac2874
commit b74ad477c7

View File

@@ -2,6 +2,80 @@ package org.openrndr.extra.shaderphrases.sdf
import kotlin.math.PI
const val dot2Phrase = """#ifndef SP_DOT2
#define SP_DOT2
float dot2(vec2 v) { return dot(v,v); }
#endif"""
const val opXorPhrase = """#ifndef SP_OPXOR
#define SP_OPXOR
float opXor( float a, float b ) {
return max( min(a,b), -max(a,b) );
}
#endif
"""
const val opUnionPhrase = """#ifndef SP_OPUNION
#define SP_OPUNION
float opUnion( float d1, float d2 ){
return min(d1,d2);
}
#endif"""
const val opIntersectionPhrase = """#ifndef SP_OPINTERSECTION
#define SP_OPINTERSECTION
float opIntersection( float d1, float d2 ){
return max(d1,d2);
}"""
const val opSubtractionPhrase = """#ifndef SP_OPSUBTRACTION
#define SP_OPSUBTRACTION
float opSubtraction( float d1, float d2 ){
return max(-d1,d2);
}
"""
const val sdBoxPhrase = """#ifndef SP_SDBOX
#define SP_SDBOX
float sdBox(in vec2 p, in vec2 b) {
vec2 d = abs(p) - b;
return length(max(d, 0.0)) + min(max(d.x, d.y), 0.0);
}
#endif
"""
const val sdCirclePhrase = """#ifndef SP_SDCIRCLE
#define SP_SDCIRCLE
float sdCircle(in vec2 p, in float r) {
return length(p) - r;
}
#endif
"""
const val sdSegmentPhrase = """#ifndef SP_SDSEGMENT
#define SP_SDSEGMENT
float sdSegment(in vec2 p, in vec2 a, in vec2 b) {
vec2 pa = p - a;
vec2 ba = b - a;
float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );
return length( pa - ba*h );
}
#endif
"""
const val sdHeartPhrase = """#ifndef SP_SDHEART
#define SP_SDHEART
$dot2Phrase
float sdHeart(in vec2 p) {
p.x = abs(p.x);
if (p.y+p.x>1.0) {
return sqrt(dot2(p-vec2(0.25,0.75))) - sqrt(2.0)/4.0;
}
return sqrt(min(dot2(p-vec2(0.00,1.00)), dot2(p-0.5*max(p.x+p.y,0.0)))) * sign(p.x-p.y);
}
#endif
"""
const val sdEllipsePhrase = """#ifndef SP_SDELLIPSE
#define SP_SDELLIPSE
float sdEllipse( in vec2 p, in vec2 ab ) {