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.

86 lines
5.7 KiB
HLSL

/******************************************************************************/
/*
Project - MudBun
Publisher - Long Bunny Labs
http://LongBunnyLabs.com
Author - Ming-Lun "Allen" Chou
http://AllenChou.net
*/
/******************************************************************************/
#ifndef MUDBUN_SDF_UTIL
#define MUDBUN_SDF_UTIL
#define SDF_SAMPLE_MASKED_BRUSHES(res, p, brushMask, mat) \
{ \
int iStack = -1; \
float3 pStack[kMaxBrushGroupDepth]; \
float resStack[kMaxBrushGroupDepth]; \
SdfBrushMaterial matStack[kMaxBrushGroupDepth]; \
\
res = kInfinity; \
mat = init_brush_material(); \
float3 groupP = p; \
float groupRes = kInfinity; \
SdfBrushMaterial groupMat = init_brush_material(); \
FOR_EACH_BRUSH_EXTERN_MASK(brushMask, \
switch (aBrush[iBrush].type) \
{ \
case kSdfBeginGroup: \
iStack = min(kMaxBrushGroupDepth - 1, iStack + 1); \
pStack[iStack] = p; \
resStack[iStack] = res; \
matStack[iStack] = mat; \
res = kInfinity; \
mat = init_brush_material(); \
break; \
case kSdfEndGroup: \
groupP = p; \
groupRes = res; \
groupMat = mat; \
p = pStack[iStack]; \
res = resStack[iStack]; \
mat = matStack[iStack]; \
break; \
} \
res = sdf_brush_apply(res, groupRes, groupMat, groupP, aBrush[iBrush], mat); \
switch (aBrush[iBrush].type) \
{ \
case kSdfEndGroup: \
iStack = max(-1, iStack - 1); \
break; \
} \
); \
}
// macro that generates less inline code
#define SDF_SAMPLE_NORMAL(normal, p, brushMask, h) \
{ \
float3 aSign[4] = \
{ \
float3( 1.0f, -1.0f, -1.0f), \
float3(-1.0f, -1.0f, 1.0f), \
float3(-1.0f, 1.0f, -1.0f), \
float3( 1.0f, 1.0f, 1.0f), \
}; \
float3 aDelta[4] = \
{ \
float3( (h), -(h), -(h)), \
float3(-(h), -(h), (h)), \
float3(-(h), (h), -(h)), \
float3( (h * 1.0001f), (h * 1.0002f), (h * 1.0003f)), \
}; \
float3 s = 0.0f; \
SdfBrushMaterial nmat; \
[loop] for (int iDelta = 0; iDelta < 4; ++iDelta) \
{ \
float d = kInfinity; \
float3 pWithDelta = p + aDelta[iDelta]; \
SDF_SAMPLE_MASKED_BRUSHES(d, pWithDelta, brushMask, nmat); \
s += aSign[iDelta] * d; \
} \
normal = normalize_safe(s, float3(0.0f, 0.0f, 0.0f)); \
}
#endif