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#

/******************************************************************************/
/*
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;
}
}
}