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.
301 lines
6.7 KiB
C#
301 lines
6.7 KiB
C#
/******************************************************************************/
|
|
/*
|
|
Project - MudBun
|
|
Publisher - Long Bunny Labs
|
|
http://LongBunnyLabs.com
|
|
Author - Ming-Lun "Allen" Chou
|
|
http://AllenChou.net
|
|
*/
|
|
/******************************************************************************/
|
|
|
|
using System;
|
|
using System.Runtime.InteropServices;
|
|
|
|
using UnityEngine;
|
|
|
|
#if MUDBUN_BURST
|
|
using Unity.Burst;
|
|
#endif
|
|
|
|
namespace MudBun
|
|
{
|
|
[StructLayout(LayoutKind.Sequential, Pack = 0)]
|
|
[Serializable]
|
|
#if MUDBUN_BURST
|
|
[BurstCompile]
|
|
#endif
|
|
public struct SdfBrushMaterial
|
|
{
|
|
public static readonly int Stride = 4 * sizeof(int) + 16 * sizeof(float);
|
|
|
|
public Color Color;
|
|
public Color EmissionHash;
|
|
public Vector4 MetallicSmoothnessSizeTightness;
|
|
public Vector4 TextureWeight;
|
|
|
|
public int BrushIndex;
|
|
public int Padding0;
|
|
public int Padding1;
|
|
public int Padding2;
|
|
|
|
public static SdfBrushMaterial New =>
|
|
new SdfBrushMaterial()
|
|
{
|
|
Color = Color.white,
|
|
EmissionHash = Color.black,
|
|
MetallicSmoothnessSizeTightness = Vector4.zero,
|
|
TextureWeight = Vector4.zero,
|
|
BrushIndex = -1,
|
|
Padding0 = 0,
|
|
Padding1 = 0,
|
|
Padding2 = 0,
|
|
};
|
|
|
|
#if MUDBUN_BURST
|
|
[BurstCompile]
|
|
#endif
|
|
public static void Lerp(in SdfBrushMaterial a, in SdfBrushMaterial b, float t, out SdfBrushMaterial ret)
|
|
{
|
|
ret =
|
|
new SdfBrushMaterial()
|
|
{
|
|
Color = Color.Lerp(a.Color, b.Color, t),
|
|
EmissionHash = Color.Lerp(a.EmissionHash, b.EmissionHash, t),
|
|
MetallicSmoothnessSizeTightness = Vector4.Lerp(a.MetallicSmoothnessSizeTightness, b.MetallicSmoothnessSizeTightness, t),
|
|
TextureWeight = Vector4.Lerp(a.TextureWeight, b.TextureWeight, t),
|
|
};
|
|
ret.EmissionHash.a = t < 0.5f ? a.EmissionHash.a : b.EmissionHash.a;
|
|
ret.BrushIndex = t < 0.5f ? a.BrushIndex : b.BrushIndex;
|
|
}
|
|
}
|
|
|
|
[StructLayout(LayoutKind.Sequential, Pack = 0)]
|
|
[Serializable]
|
|
public struct SdfBrushMaterialCompressed
|
|
{
|
|
public static readonly int Stride = 4 * sizeof(uint) + 4 * sizeof(float);
|
|
|
|
public uint Color;
|
|
public uint EmissionTightness;
|
|
public uint TextureWeight;
|
|
public int BrushIndex;
|
|
|
|
public float MetallicSmoothness;
|
|
public float Size;
|
|
public float Hash;
|
|
public float Padding0;
|
|
}
|
|
|
|
[StructLayout(LayoutKind.Sequential, Pack = 0)]
|
|
[Serializable]
|
|
public struct SdfBrush
|
|
{
|
|
public static readonly int Stride = 8 * sizeof(int) + 32 * sizeof(float);
|
|
|
|
public enum TypeEnum
|
|
{
|
|
Nop = -1,
|
|
|
|
// groups
|
|
GroupStart = -2,
|
|
GroupEnd = -3,
|
|
|
|
// primitives
|
|
Box = 0,
|
|
Sphere,
|
|
Cylinder,
|
|
Torus,
|
|
SolidAngle,
|
|
|
|
// effects
|
|
Particle = 100,
|
|
ParticleSystem,
|
|
UniformNoise,
|
|
CurveSimple,
|
|
CurveFull,
|
|
|
|
// distortion
|
|
FishEye = 200,
|
|
Pinch,
|
|
Twist,
|
|
Quantize,
|
|
|
|
// modifiers
|
|
Onion = 300,
|
|
NoiseModifier,
|
|
}
|
|
|
|
public enum OperatorEnum
|
|
{
|
|
// OG
|
|
Union = 0,
|
|
Subtract = 1,
|
|
Intersect = 2,
|
|
Dye = 3,
|
|
CullInside = 4,
|
|
CullOutside = 5,
|
|
|
|
// 1.4.44
|
|
Pipe = 6,
|
|
Engrave = 7,
|
|
|
|
NoOp = -1,
|
|
}
|
|
|
|
// values are base index for union
|
|
public enum BooleanOperatorTypeEnum
|
|
{
|
|
//Quadratic = 8,
|
|
Cubic = 0,
|
|
//Round = 11,
|
|
Chamfer = 14,
|
|
}
|
|
|
|
// only expose the 4 most common ones to save compile time
|
|
public enum DyeBlendModeEnum
|
|
{
|
|
Overwrite = OperatorEnum.Dye,
|
|
//Burn = 17,
|
|
//Darken = 18,
|
|
//Difference = 19,
|
|
//Dodge = 20,
|
|
//Divide = 21,
|
|
//Exclusion = 22,
|
|
//HardLight = 23,
|
|
//HardMix = 24,
|
|
//Lighten = 25,
|
|
//LightBurn = 26,
|
|
//LinearDodge = 27,
|
|
//LinearLight = 28,
|
|
//LinearLightAddSub = 29,
|
|
Multiply = 30,
|
|
[InspectorName("Paint (2x Multiply)")] Paint = 38,
|
|
//Negation = 31,
|
|
Overlay = 32,
|
|
//PinLight = 33,
|
|
Screen = 34,
|
|
//SoftLight = 35,
|
|
//Subtract = 36,
|
|
//VividLight = 37,
|
|
}
|
|
|
|
public static bool IsDyeOperator(OperatorEnum op)
|
|
{
|
|
if (op == OperatorEnum.Dye)
|
|
return true;
|
|
|
|
if ((int) op >= 17 && (int)op <= 38)
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
public static int GetShaderOperatorIntValue(OperatorEnum op, BooleanOperatorTypeEnum type, DyeBlendModeEnum dyeBlendMode)
|
|
{
|
|
int res = (int) op;
|
|
switch (op)
|
|
{
|
|
case OperatorEnum.Union:
|
|
case OperatorEnum.Subtract:
|
|
case OperatorEnum.Intersect:
|
|
res += (int) type;
|
|
break;
|
|
|
|
case OperatorEnum.Dye:
|
|
res = (int) dyeBlendMode;
|
|
break;
|
|
}
|
|
return res;
|
|
}
|
|
|
|
public enum BoundaryShapeEnum
|
|
{
|
|
Box,
|
|
Sphere,
|
|
Cylinder,
|
|
Torus,
|
|
SolidAngle,
|
|
}
|
|
|
|
public enum NoiseTypeEnum
|
|
{
|
|
Perlin = -1,
|
|
BakedPerlin,
|
|
Triangle,
|
|
}
|
|
|
|
public enum FlagBit
|
|
{
|
|
Hidden,
|
|
FlipX,
|
|
MirrorX,
|
|
CountAsBone,
|
|
CreateMirroredBone,
|
|
ContributeMaterial,
|
|
LockNoisePosition,
|
|
SphericalNoiseCoordinates,
|
|
}
|
|
|
|
public int Type;
|
|
public int Operator;
|
|
public int Proxy;
|
|
public int Index;
|
|
|
|
public Vector3 Position;
|
|
public float Blend;
|
|
|
|
public Quaternion Rotation;
|
|
|
|
public Vector3 Size;
|
|
public float Radius;
|
|
|
|
public Vector4 Data0;
|
|
public Vector4 Data1;
|
|
public Vector4 Data2;
|
|
public Vector4 Data3;
|
|
|
|
public Bits32 Flags;
|
|
public int MaterialIndex;
|
|
public int BoneIndex;
|
|
public int Padding0;
|
|
|
|
public float Hash;
|
|
public float Padding1;
|
|
public float Padding2;
|
|
public float Padding3;
|
|
|
|
public static SdfBrush New()
|
|
{
|
|
SdfBrush brush;
|
|
brush.Type = -1;
|
|
brush.Operator = 0;
|
|
brush.Proxy = -1;
|
|
brush.Index = -1;
|
|
|
|
brush.Position = Vector3.zero;
|
|
brush.Blend = 0.0f;
|
|
|
|
brush.Rotation = Quaternion.identity;
|
|
|
|
brush.Size = Vector3.one;
|
|
brush.Radius = 0.0f;
|
|
|
|
brush.Data0 = Vector4.zero;
|
|
brush.Data1 = Vector4.zero;
|
|
brush.Data2 = Vector4.zero;
|
|
brush.Data3 = Vector4.zero;
|
|
|
|
brush.Flags = new Bits32(0);
|
|
brush.MaterialIndex = -1;
|
|
brush.BoneIndex = -1;
|
|
brush.Padding0 = 0;
|
|
|
|
brush.Hash = 0.0f;
|
|
brush.Padding1 = 0.0f;
|
|
brush.Padding2 = 0.0f;
|
|
brush.Padding3 = 0.0f;
|
|
|
|
return brush;
|
|
}
|
|
}
|
|
} |