public bool EnsureSize(int expectedSize)
        {
            if ((surfaces != null && expectedSize == surfaces.Length) ||
                (surfaces == null && expectedSize == 0))
            {
                return(false);
            }

            if (expectedSize == 0)
            {
                surfaces = null;
                return(true);
            }

            var defaultRenderMaterial  = CSGMaterialManager.DefaultWallMaterial;
            var defaultPhysicsMaterial = CSGMaterialManager.DefaultPhysicsMaterial;
            var newSurfaces            = new ChiselSurface[expectedSize];
            var prevLength             = (surfaces == null) ? 0 : surfaces.Length;

            if (prevLength > 0)
            {
                Array.Copy(surfaces, newSurfaces, Mathf.Min(newSurfaces.Length, prevLength));
            }
            for (int i = prevLength; i < newSurfaces.Length; i++)
            {
                newSurfaces[i] = new ChiselSurface
                {
                    surfaceDescription = SurfaceDescription.Default,
                    brushMaterial      = ChiselBrushMaterial.CreateInstance(defaultRenderMaterial, defaultPhysicsMaterial)
                };
            }
            surfaces = newSurfaces;
            return(true);
        }
Example #2
0
 public static bool IsRegistered(ChiselBrushMaterial brushMaterial)
 {
     if (brushMaterial == null)
     {
         return(false);
     }
     return(registeredLookup.Contains(brushMaterial));
 }
Example #3
0
 public static ChiselBrushMaterial CreateInstance(ChiselBrushMaterial other)
 {
     return(new ChiselBrushMaterial
     {
         LayerUsage = other.layerUsage,
         RenderMaterial = other.renderMaterial,
         PhysicsMaterial = other.physicsMaterial
     });
 }
Example #4
0
        public static void OnLayerUsageFlagsChanged(ChiselBrushMaterial brushMaterial, LayerUsageFlags prevValue, LayerUsageFlags value)
        {
            if (!registeredLookup.Contains(brushMaterial) || (prevValue == value))
            {
                return;
            }

            OnBrushMaterialChanged?.Invoke(brushMaterial);
        }
Example #5
0
 public SurfaceLayers GetLayerDefinition(ChiselBrushMaterial brushMaterial)
 {
     return(new SurfaceLayers
     {
         layerUsage = brushMaterial.layerUsage,
         layerParameter1 = brushMaterial.renderMaterial == null ? 0 : GetID(brushMaterial.renderMaterial),
         layerParameter2 = brushMaterial.physicsMaterial == null ? 0 : GetID(brushMaterial.physicsMaterial)
     });
 }
        public static void OnSetDirty(ChiselBrushMaterial brushMaterial)
        {
            if (!registeredLookup.Contains(brushMaterial))
            {
                return;
            }

            OnBrushMaterialChanged?.Invoke(brushMaterial);
        }
Example #7
0
        public void Validate()
        {
            if (surfaceDefinition == null)
            {
                surfaceDefinition = new ChiselSurfaceDefinition();
            }

            if (surfaceDefinition.EnsureSize((int)SurfaceSides.TotalSides))
            {
                var defaultRenderMaterial  = ChiselMaterialManager.DefaultWallMaterial;
                var defaultPhysicsMaterial = ChiselMaterialManager.DefaultPhysicsMaterial;

                surfaceDefinition.surfaces[(int)SurfaceSides.Top].brushMaterial    = ChiselBrushMaterial.CreateInstance(ChiselMaterialManager.DefaultFloorMaterial, defaultPhysicsMaterial);
                surfaceDefinition.surfaces[(int)SurfaceSides.Bottom].brushMaterial = ChiselBrushMaterial.CreateInstance(ChiselMaterialManager.DefaultFloorMaterial, defaultPhysicsMaterial);
                surfaceDefinition.surfaces[(int)SurfaceSides.Left].brushMaterial   = ChiselBrushMaterial.CreateInstance(ChiselMaterialManager.DefaultWallMaterial, defaultPhysicsMaterial);
                surfaceDefinition.surfaces[(int)SurfaceSides.Right].brushMaterial  = ChiselBrushMaterial.CreateInstance(ChiselMaterialManager.DefaultWallMaterial, defaultPhysicsMaterial);
                surfaceDefinition.surfaces[(int)SurfaceSides.Front].brushMaterial  = ChiselBrushMaterial.CreateInstance(ChiselMaterialManager.DefaultWallMaterial, defaultPhysicsMaterial);
                surfaceDefinition.surfaces[(int)SurfaceSides.Back].brushMaterial   = ChiselBrushMaterial.CreateInstance(ChiselMaterialManager.DefaultWallMaterial, defaultPhysicsMaterial);
                surfaceDefinition.surfaces[(int)SurfaceSides.Tread].brushMaterial  = ChiselBrushMaterial.CreateInstance(ChiselMaterialManager.DefaultTreadMaterial, defaultPhysicsMaterial);
                surfaceDefinition.surfaces[(int)SurfaceSides.Step].brushMaterial   = ChiselBrushMaterial.CreateInstance(ChiselMaterialManager.DefaultStepMaterial, defaultPhysicsMaterial);

                for (int i = 0; i < surfaceDefinition.surfaces.Length; i++)
                {
                    if (surfaceDefinition.surfaces[i].brushMaterial == null)
                    {
                        surfaceDefinition.surfaces[i].brushMaterial = ChiselBrushMaterial.CreateInstance(defaultRenderMaterial, defaultPhysicsMaterial);
                    }
                }
            }


            stepHeight  = Mathf.Max(kMinStepHeight, stepHeight);
            stepDepth   = Mathf.Clamp(stepDepth, kMinStepDepth, absDepth);
            treadHeight = Mathf.Max(0, treadHeight);
            nosingDepth = Mathf.Max(0, nosingDepth);
            nosingWidth = Mathf.Max(0, nosingWidth);

            width = Mathf.Max(kMinWidth, absWidth) * (width < 0 ? -1 : 1);
            depth = Mathf.Max(stepDepth, absDepth) * (depth < 0 ? -1 : 1);

            riserDepth = Mathf.Max(kMinRiserDepth, riserDepth);
            sideDepth  = Mathf.Max(0, sideDepth);
            sideWidth  = Mathf.Max(kMinSideWidth, sideWidth);
            sideHeight = Mathf.Max(0, sideHeight);

            var realHeight       = Mathf.Max(stepHeight, absHeight);
            var maxPlateauHeight = realHeight - stepHeight;

            plateauHeight = Mathf.Clamp(plateauHeight, 0, maxPlateauHeight);

            var totalSteps      = Mathf.Max(1, Mathf.FloorToInt((realHeight - plateauHeight + kStepSmudgeValue) / stepHeight));
            var totalStepHeight = totalSteps * stepHeight;

            plateauHeight = Mathf.Max(0, realHeight - totalStepHeight);
            stepDepth     = Mathf.Clamp(stepDepth, kMinStepDepth, absDepth / totalSteps);
        }
Example #8
0
        public static void OnPhysicsMaterialChanged(ChiselBrushMaterial brushMaterial, PhysicMaterial prevValue, PhysicMaterial value)
        {
            if (!registeredLookup.Contains(brushMaterial) || (prevValue == value))
            {
                return;
            }

            DecRefCount(prevValue);
            IncRefCount(value);

            OnBrushMaterialChanged?.Invoke(brushMaterial);
        }
Example #9
0
        public static void Register(ChiselBrushMaterial brushMaterial)
        {
            if (brushMaterial == null || !registeredLookup.Add(brushMaterial))
            {
                return;
            }

            brushMaterialToRenderMaterialLookup [brushMaterial] = IncRefCount(brushMaterial.RenderMaterial);
            brushMaterialToPhysicsMaterialLookup[brushMaterial] = IncRefCount(brushMaterial.PhysicsMaterial);

            OnBrushMaterialAdded?.Invoke(brushMaterial);
        }
Example #10
0
        public void UpdateSurfaces(ref ChiselSurfaceDefinition surfaceDefinition)
        {
            UnityEngine.Material       defaultFloorMaterial   = null;
            UnityEngine.Material       defaultWallMaterial    = null;
            UnityEngine.PhysicMaterial defaultPhysicsMaterial = null;

            var surfaces = surfaceDefinition.surfaces;

            if (surfaces[(int)SurfaceSides.Top].brushMaterial == null)
            {
                surfaces[(int)SurfaceSides.Top].brushMaterial = ChiselBrushMaterial.CreateInstance(defaultFloorMaterial ??= ChiselMaterialManager.DefaultFloorMaterial, defaultPhysicsMaterial ??= ChiselMaterialManager.DefaultPhysicsMaterial);
            }
            if (surfaces[(int)SurfaceSides.Bottom].brushMaterial == null)
            {
                surfaces[(int)SurfaceSides.Bottom].brushMaterial = ChiselBrushMaterial.CreateInstance(defaultFloorMaterial ??= ChiselMaterialManager.DefaultFloorMaterial, defaultPhysicsMaterial ??= ChiselMaterialManager.DefaultPhysicsMaterial);
            }
            if (surfaces[(int)SurfaceSides.Left].brushMaterial == null)
            {
                surfaces[(int)SurfaceSides.Left].brushMaterial = ChiselBrushMaterial.CreateInstance(defaultWallMaterial ??= ChiselMaterialManager.DefaultWallMaterial, defaultPhysicsMaterial ??= ChiselMaterialManager.DefaultPhysicsMaterial);
            }
            if (surfaces[(int)SurfaceSides.Right].brushMaterial == null)
            {
                surfaces[(int)SurfaceSides.Right].brushMaterial = ChiselBrushMaterial.CreateInstance(defaultWallMaterial ??= ChiselMaterialManager.DefaultWallMaterial, defaultPhysicsMaterial ??= ChiselMaterialManager.DefaultPhysicsMaterial);
            }
            if (surfaces[(int)SurfaceSides.Front].brushMaterial == null)
            {
                surfaces[(int)SurfaceSides.Front].brushMaterial = ChiselBrushMaterial.CreateInstance(defaultWallMaterial ??= ChiselMaterialManager.DefaultWallMaterial, defaultPhysicsMaterial ??= ChiselMaterialManager.DefaultPhysicsMaterial);
            }
            if (surfaces[(int)SurfaceSides.Back].brushMaterial == null)
            {
                surfaces[(int)SurfaceSides.Back].brushMaterial = ChiselBrushMaterial.CreateInstance(defaultWallMaterial ??= ChiselMaterialManager.DefaultWallMaterial, defaultPhysicsMaterial ??= ChiselMaterialManager.DefaultPhysicsMaterial);
            }
            if (surfaces[(int)SurfaceSides.Tread].brushMaterial == null)
            {
                surfaces[(int)SurfaceSides.Tread].brushMaterial = ChiselBrushMaterial.CreateInstance(ChiselMaterialManager.DefaultTreadMaterial, defaultPhysicsMaterial);
            }
            if (surfaces[(int)SurfaceSides.Step].brushMaterial == null)
            {
                surfaces[(int)SurfaceSides.Step].brushMaterial = ChiselBrushMaterial.CreateInstance(ChiselMaterialManager.DefaultStepMaterial, defaultPhysicsMaterial);
            }

            for (int i = 0; i < surfaceDefinition.surfaces.Length; i++)
            {
                if (surfaceDefinition.surfaces[i].brushMaterial == null)
                {
                    surfaceDefinition.surfaces[i].brushMaterial = ChiselBrushMaterial.CreateInstance(defaultWallMaterial ??= ChiselMaterialManager.DefaultWallMaterial, defaultPhysicsMaterial ??= ChiselMaterialManager.DefaultPhysicsMaterial);
                }
            }
        }
Example #11
0
        public static void Unregister(ChiselBrushMaterial brushMaterial)
        {
            if (!registeredLookup.Remove(brushMaterial))
            {
                return;
            }

            brushMaterialToRenderMaterialLookup.Remove(brushMaterial);
            brushMaterialToPhysicsMaterialLookup.Remove(brushMaterial);

            DecRefCount(brushMaterial.RenderMaterial);
            DecRefCount(brushMaterial.PhysicsMaterial);

            OnBrushMaterialRemoved?.Invoke(brushMaterial);
        }
Example #12
0
        public static void NotifyContentsModified(ChiselBrushMaterial brushMaterial)
        {
            if (brushMaterial == null || !registeredLookup.Contains(brushMaterial))
            {
                return;
            }

            RenderMaterialInstance renderMaterialInstance;

            if (brushMaterialToRenderMaterialLookup.TryGetValue(brushMaterial, out renderMaterialInstance))
            {
                if ((renderMaterialInstance == null && brushMaterial.RenderMaterial) ||
                    (renderMaterialInstance != null && renderMaterialInstance.renderMaterial != brushMaterial.RenderMaterial))
                {
                    if (renderMaterialInstance != null)
                    {
                        DecRefCount(renderMaterialInstance.renderMaterial);
                    }
                    brushMaterialToRenderMaterialLookup[brushMaterial] = IncRefCount(brushMaterial.RenderMaterial);
                }
            }
            PhysicsMaterialInstance physicsMaterialInstance;

            if (brushMaterialToPhysicsMaterialLookup.TryGetValue(brushMaterial, out physicsMaterialInstance))
            {
                if ((physicsMaterialInstance == null && brushMaterial.PhysicsMaterial) ||
                    (physicsMaterialInstance != null && physicsMaterialInstance.physicsMaterial != brushMaterial.PhysicsMaterial))
                {
                    if (physicsMaterialInstance != null)
                    {
                        DecRefCount(physicsMaterialInstance.physicsMaterial);
                    }
                    brushMaterialToPhysicsMaterialLookup[brushMaterial] = IncRefCount(brushMaterial.PhysicsMaterial);
                }
            }

            OnBrushMaterialChanged?.Invoke(brushMaterial);
        }
 public static ChiselBrushMaterial CreateInstance(ChiselBrushMaterial other)
 {
     return(CreateInstance(other.renderMaterial, other.physicsMaterial, other.layerUsage));
 }