/******************************************************************************/ /* Project - MudBun Publisher - Long Bunny Labs http://LongBunnyLabs.com Author - Ming-Lun "Allen" Chou http://AllenChou.net */ /******************************************************************************/ using System.Collections.Generic; using Unity.Collections; using UnityEngine; namespace MudBun { public class MudBrushGroup : MudSolid { public enum TypeEnum { BeginGroup = -2, EndGroup = -3, } public override bool IsBrushGroup => true; public MudBrushGroup() { m_countAsBone = false; m_canCountAsBone = false; } private int m_iBegin; private int m_iEnd; internal int m_iProxyBegin = AabbTree.Null; internal int m_iProxyEnd = AabbTree.Null; public override void UpdateProxies(AabbTree tree, Aabb opBounds) { if (m_iProxyBegin == AabbTree.Null) m_iProxyBegin = tree.CreateProxy(opBounds, this); if (m_iProxyEnd == AabbTree.Null) m_iProxyEnd = tree.CreateProxy(opBounds, this); tree.UpdateProxy(m_iProxyBegin, opBounds, m_iBegin); tree.UpdateProxy(m_iProxyEnd, opBounds, m_iEnd); } public override void DestroyProxies(AabbTree tree) { tree.DestroyProxy(m_iProxyBegin); tree.DestroyProxy(m_iProxyEnd); m_iProxyBegin = AabbTree.Null; m_iProxyEnd = AabbTree.Null; } public override int FillComputeData(NativeArray aBrush, int iStart, List aBone) { SdfBrush brush = SdfBrush.New(); brush.Type = (int) TypeEnum.BeginGroup; aBrush[iStart] = brush; m_iBegin = iStart; return 1; } public override void FillBrushData(ref SdfBrush brush, int iBrush) { base.FillBrushData(ref brush, iBrush); brush.Proxy = m_iProxyBegin; } public override int FillComputeDataPostChildren(NativeArray aBrush, int iStart) { SdfBrush brush = SdfBrush.New(); brush.Type = (int) TypeEnum.EndGroup; aBrush[iStart] = brush; m_iEnd = iStart; return 1; } public override void FillBrushDataPostChildren(ref SdfBrush brush, int iBrush) { brush.Proxy = m_iProxyEnd; brush.Flags.AssignBit((int) SdfBrush.FlagBit.Hidden, Hidden); brush.Operator = SdfBrush.GetShaderOperatorIntValue(Operator, BooleanOperatorType, DyeBlendMode); brush.Blend = Blend; brush.Flags.AssignBit((int) SdfBrush.FlagBit.ContributeMaterial, m_material.ContributeMaterial); brush.Flags.AssignBit((int) SdfBrush.FlagBit.CountAsBone, CountAsBone); } } }