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.
221 lines
5.6 KiB
HLSL
221 lines
5.6 KiB
HLSL
/*****************************************************************************/
|
|
/*
|
|
Project - MudBun
|
|
Publisher - Long Bunny Labs
|
|
http://LongBunnyLabs.com
|
|
Author - Ming-Lun "Allen" Chou
|
|
http://AllenChou.net
|
|
*/
|
|
/******************************************************************************/
|
|
|
|
#ifndef MUDBUN_BRUSH_DEFS
|
|
#define MUDBUN_BRUSH_DEFS
|
|
|
|
#include "Math/Codec.cginc"
|
|
|
|
#define kSdfNoOp (-1)
|
|
|
|
#define kSdfBeginGroup (-2)
|
|
#define kSdfEndGroup (-3)
|
|
|
|
// primitives
|
|
#define kSdfBox (0)
|
|
#define kSdfSphere (1)
|
|
#define kSdfCylinder (2)
|
|
#define kSdfTorus (3)
|
|
#define kSdfSolidAngle (4)
|
|
|
|
// effects
|
|
#define kSdfParticle (100)
|
|
#define kSdfParticleSystem (101)
|
|
#define kSdfNoiseVolume (102)
|
|
#define kSdfCurveSimple (103)
|
|
#define kSdfCurveFull (104)
|
|
|
|
// distortion
|
|
#define kSdfFishEye (200)
|
|
#define kSdfPinch (201)
|
|
#define kSdfTwist (202)
|
|
#define kSdfQuantize (203)
|
|
|
|
// modifiers
|
|
#define kSdfOnion (300)
|
|
#define kSdfNoiseModifier (301)
|
|
|
|
// operators
|
|
// OG
|
|
#define kSdfUnionCubic (0)
|
|
#define kSdfSubtractCubic (1)
|
|
#define kSdfIntersectCubic (2)
|
|
#define kSdfDye (3)
|
|
#define kSdfCullInside (4)
|
|
#define kSdfCullOutside (5)
|
|
// 1.4.44
|
|
#define kSdfPipe (6)
|
|
#define kSdfEngrave (7)
|
|
#define kSdfUnionQuad (8)
|
|
#define kSdfSubtractQuad (9)
|
|
#define kSdfIntersectQuad (10)
|
|
#define kSdfUnionRound (11)
|
|
#define kSdfSubtractRound (12)
|
|
#define kSdfIntersectRound (13)
|
|
#define kSdfUnionChamfer (14)
|
|
#define kSdfSubtractChamfer (15)
|
|
#define kSdfIntersectChamfer (16)
|
|
// 1.6.52 dye blends
|
|
#define kSdfDyeBlendModeBegin (17)
|
|
#define kSdfDyeBlendBurn kSdfDyeBlendModeBegin
|
|
#define kSdfDyeBlendDarken (18)
|
|
#define kSdfDyeBlendDifference (19)
|
|
#define kSdfDyeBlendDodge (20)
|
|
#define kSdfDyeBlendDivide (21)
|
|
#define kSdfDyeBlendExclusion (22)
|
|
#define kSdfDyeBlendHardLight (23)
|
|
#define kSdfDyeBlendHardMix (24)
|
|
#define kSdfDyeBlendLighten (25)
|
|
#define kSdfDyeBlendLightBurn (26)
|
|
#define kSdfDyeBlendLinearDodge (27)
|
|
#define kSdfDyeBlendLinearLight (28)
|
|
#define kSdfDyeBlendLinearLightAddSub (29)
|
|
#define kSdfDyeBlendMultiply (30)
|
|
#define kSdfDyeBlendNegation (31)
|
|
#define kSdfDyeBlendOverlay (32)
|
|
#define kSdfDyeBlendPinLight (33)
|
|
#define kSdfDyeBlendScreen (34)
|
|
#define kSdfDyeBlendSoftLight (35)
|
|
#define kSdfDyeBlendSubtract (36)
|
|
#define kSdfDyeBlendVividLight (37)
|
|
#define kSdfDyeBlendModePaint (38)
|
|
#define kSdfDyeBlendmodeEnd (kSdfDyeBlendModePaint + 1)
|
|
|
|
// OG
|
|
#define kSdfDistort (-100)
|
|
#define kSdfModify ( 100)
|
|
|
|
// flags
|
|
#define kSdfBrushFlagsHidden (1 << 0)
|
|
#define kSdfBrushFlagsFlipX (1 << 1)
|
|
#define kSdfBrushFlagsMirrorX (1 << 2)
|
|
#define kSdfBrushFlagsCountAsBone (1 << 3)
|
|
#define kSdfBrushFlagsCreateMirroredBone (1 << 4)
|
|
#define kSdfBrushFlagsContributeMaterial (1 << 5)
|
|
#define kSdfBrushFlagsLockNoisePosition (1 << 6)
|
|
#define kSdfBrushFlagsSphericalNoiseCoordinates (1 << 7)
|
|
|
|
// boundaries
|
|
#define kSdfNoiseBoundaryBox (0)
|
|
#define kSdfNoiseBoundarySphere (1)
|
|
#define kSdfNoiseBoundaryCylinder (2)
|
|
#define kSdfNoiseBoundaryTorus (3)
|
|
#define kSdfNoiseBoundarySolidAngle (4)
|
|
|
|
// noise types
|
|
#define kSdfNoiseTypePerlin (-1)
|
|
#define kSdfNoiseTypeCachedPerlin (0)
|
|
#define kSdfNoiseTypeTriangle (1)
|
|
|
|
#define kMaxBrushGroupDepth (6)
|
|
|
|
int is_sdf_dye(int op)
|
|
{
|
|
return op == kSdfDye || (op >= kSdfDyeBlendModeBegin && op <= kSdfDyeBlendmodeEnd);
|
|
}
|
|
|
|
struct SdfBrushMaterial
|
|
{
|
|
float4 color;
|
|
float4 emissionHash;
|
|
float4 metallicSmoothnessSizeTightness;
|
|
float4 textureWeight;
|
|
|
|
int iBrush;
|
|
int padding0;
|
|
int padding1;
|
|
int padding2;
|
|
};
|
|
|
|
struct SdfBrushMaterialCompressed
|
|
{
|
|
uint color;
|
|
uint emissionTightness;
|
|
uint textureWeight;
|
|
int iBrush;
|
|
|
|
float metallicSmoothness;
|
|
float size;
|
|
float hash;
|
|
float padding0;
|
|
};
|
|
|
|
SdfBrushMaterialCompressed pack_material(SdfBrushMaterial mat)
|
|
{
|
|
SdfBrushMaterialCompressed m;
|
|
|
|
m.color = pack_rgba(mat.color);
|
|
m.emissionTightness = pack_rgba(float4(mat.emissionHash.rgb, mat.metallicSmoothnessSizeTightness.w));
|
|
m.textureWeight = pack_rgba(mat.textureWeight);
|
|
m.iBrush = mat.iBrush;
|
|
|
|
m.metallicSmoothness = pack_saturated(mat.metallicSmoothnessSizeTightness.xy);
|
|
m.size = mat.metallicSmoothnessSizeTightness.z;
|
|
m.hash = mat.emissionHash.a;
|
|
m.padding0 = 0.0f;
|
|
|
|
return m;
|
|
}
|
|
|
|
SdfBrushMaterial unpack_material(SdfBrushMaterialCompressed mat)
|
|
{
|
|
float4 emissionTightness = unpack_rgba(mat.emissionTightness);
|
|
|
|
SdfBrushMaterial m;
|
|
m.color = unpack_rgba(mat.color);
|
|
m.emissionHash.rgb = emissionTightness.rgb;
|
|
m.emissionHash.a = mat.hash;
|
|
m.metallicSmoothnessSizeTightness = float4(unpack_saturated(mat.metallicSmoothness), mat.size, emissionTightness.w);
|
|
m.textureWeight = unpack_rgba(mat.textureWeight);
|
|
m.iBrush = mat.iBrush;
|
|
|
|
return m;
|
|
}
|
|
|
|
struct SdfBrush
|
|
{
|
|
int type;
|
|
int op;
|
|
int iProxy;
|
|
int index;
|
|
|
|
float3 position;
|
|
float blend;
|
|
|
|
float4 rotation;
|
|
|
|
float3 size;
|
|
float radius;
|
|
|
|
float4 data0;
|
|
float4 data1;
|
|
float4 data2;
|
|
float4 data3;
|
|
|
|
uint flags;
|
|
int materialIndex;
|
|
int boneIndex;
|
|
int padding0;
|
|
|
|
float hash;
|
|
float padding1;
|
|
float padding2;
|
|
float padding3;
|
|
};
|
|
|
|
StructuredBuffer<SdfBrush> aBrush;
|
|
StructuredBuffer<SdfBrushMaterial> aBrushMaterial;
|
|
int numBrushes;
|
|
|
|
float surfaceShift;
|
|
|
|
#endif
|
|
|