You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
138 lines
3.8 KiB
HLSL
138 lines
3.8 KiB
HLSL
/******************************************************************************/
|
|
/*
|
|
Project - MudBun
|
|
Publisher - Long Bunny Labs
|
|
http://LongBunnyLabs.com
|
|
Author - Ming-Lun "Allen" Chou
|
|
http://AllenChou.net
|
|
*/
|
|
/******************************************************************************/
|
|
|
|
#ifndef MUDBUN_CUSTOM_BRUSH
|
|
#define MUDBUN_CUSTOM_BRUSH
|
|
|
|
#include "../Shader/SDF/Primitives.cginc"
|
|
|
|
// For rapidly iterating custom brushes, try temporarily uncommenting these defines.
|
|
// These will disable specific meshing modes, render modes, and/or SDF brushes.
|
|
// Doing so will cut down the time needed to re-compile compute shaders
|
|
// "Dual meshing" includes dual quads, surface nets, and dual contouring
|
|
//#define MUDBUN_DISABLE_MARCHING_CUBES_FLAT_MESH
|
|
//#define MUDBUN_DISABLE_MARCHING_CUBES_SMOOTH_MESH
|
|
//#define MUDBUN_DISABLE_MARCHING_CUBES_SPLATS
|
|
//#define MUDBUN_DISABLE_DUAL_MESHING_ALL
|
|
//#define MUDBUN_DISABLE_DUAL_MESHING_SMOOTH_MESH
|
|
//#define MUDBUN_DISABLE_DUAL_MESHING_FLAT_MESH
|
|
//#define MUDBUN_DISABLE_DUAL_MESHING_SPLATS
|
|
//#define MUDBUN_DISABLE_SURFACE_NETS
|
|
//#define MUDBUN_DISABLE_DUAL_CONTOURING
|
|
//#define MUDBUN_DISABLE_SDF_NOISE_VOLUME
|
|
//#define MUDBUN_DISABLE_SDF_SIMPLE_CURVE
|
|
//#define MUDBUN_DISABLE_SDF_FULL_CURVE
|
|
//#define MUDBUN_DISABLE_SDF_DISTORTION_BRUSHES
|
|
//#define MUDBUN_DISABLE_SDF_MODIFIER_BRUSHES
|
|
|
|
// Or, just uncomment the define for MUDBUN_FAST_ITERATION,
|
|
// which will disable everything, except 3D flat marching cubes, plus box, sphere, and custom brushes.
|
|
//#define MUDBUN_FAST_ITERATION
|
|
|
|
|
|
// make sure these value do not conflict with those in BrushDefs.cginc
|
|
#define kCustomSolid (900)
|
|
#define kCustomDistortion (901)
|
|
#define kCustomModifier (902)
|
|
|
|
|
|
// returns custom SDF value, the signed distance from solid surface
|
|
float sdf_custom_brush
|
|
(
|
|
float res, // current SDF result before brush is applied
|
|
inout float3 p, // sample position in world space (distortion brushes modify this)
|
|
float3 pRel, // sample position in brush space (relative to brush transform)
|
|
SdfBrush brush // brush data (see BrushDefs.cginc for data layout)
|
|
)
|
|
{
|
|
float3 h = 0.5f * brush.size;
|
|
|
|
// add/modify custom brushes in this switch statement
|
|
switch (brush.type)
|
|
{
|
|
case kCustomSolid:
|
|
{
|
|
// box
|
|
res = sdf_box(pRel, h, brush.radius);
|
|
break;
|
|
}
|
|
|
|
case kCustomDistortion:
|
|
{
|
|
// quantize
|
|
float fade = brush.data0.z;
|
|
float d = sdf_box(pRel, h, fade);
|
|
if (d < 0.0f)
|
|
{
|
|
float cellSize = brush.data0.x;
|
|
float strength = brush.data0.y;
|
|
float3 r = p / cellSize;
|
|
float3 f = floor(r);
|
|
float3 t = r - f;
|
|
float3 q = (f + smoothstep(0.0f, 1.0f, strength * (t - 0.5f) + 0.5f)) * cellSize;
|
|
p = lerp(p, q, saturate(-d / max(kEpsilon, fade)));
|
|
}
|
|
break;
|
|
}
|
|
|
|
case kCustomModifier:
|
|
{
|
|
// onion
|
|
float d = sdf_box(pRel, h, brush.blend);
|
|
if (d < 0.0f)
|
|
{
|
|
float thickness = brush.data0.x;
|
|
res = abs(res) - thickness;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
|
|
// returns SDF value of border of distortion/modifier brush, the signed distance from border
|
|
float sdf_custom_distortion_modifier_bounds_query
|
|
(
|
|
float3 p, // sample position in world space
|
|
float3 pRel, // sample position in brush space (relative to brush transform)
|
|
SdfBrush brush // brush data (see BrushDefs.cginc for data layout)
|
|
)
|
|
{
|
|
float res = kInfinity;
|
|
float3 h = 0.5f * brush.size;
|
|
|
|
switch (brush.type)
|
|
{
|
|
case kCustomDistortion:
|
|
{
|
|
// quantize
|
|
float cellSize = brush.data0.w;
|
|
float fade = brush.data0.z;
|
|
res = sdf_box(pRel, h, fade * cellSize);
|
|
break;
|
|
}
|
|
|
|
case kCustomModifier:
|
|
{
|
|
// onion
|
|
float thickness = brush.data0.x;
|
|
res = sdf_box(pRel, h + thickness, brush.blend);
|
|
break;
|
|
}
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
#endif
|
|
|