void ScaleToMatchButtonGUI(Decal primaryItem, Decal[] items, bool isEditingMultipleObjects)
        {
            bool canAnyPerformScale = false;

            foreach (var item in items)
            {
                if (item.CanScaleToMatchDecal)
                {
                    canAnyPerformScale = true;
                    break;
                }
            }
            using (new EditorGUI.DisabledScope(!canAnyPerformScale))
            {
                if (GUILayout.Button("Scale to match decal shape"))
                {
                    foreach (var item in items)
                    {
                        if (item.CanScaleToMatchDecal)
                        {
                            item.ScaleToMatchDecalBoundsRatio();
                        }
                    }
                }
            }
            if (!isEditingMultipleObjects && !canAnyPerformScale)
            {
                if (primaryItem.HasZeroDimensionsOnDecalAsset)
                {
                    EditorGUILayout.HelpBox($"Cannot scale to match decal because selected {nameof(DecalAsset)} has width or height of zero.",
                                            MessageType.Info);
                }
            }
        }
 void ResetMeshButtonGUI(Decal primaryItem, Decal[] items, bool isEditingMultipleObjects)
 {
     if (GUILayout.Button("Reset mesh"))
     {
         foreach (var item in items)
         {
             item.GenerateSimpleQuadMesh();
         }
     }
 }
        void ProjectMeshButtonGUI(Decal primaryItem, Decal[] items, bool isEditingMultipleObjects)
        {
            bool canAnyTargetProject = false;

            foreach (var item in items)
            {
                if (item.HasMeshToProjectAgainst)
                {
                    canAnyTargetProject = true;
                    break;
                }
            }

            using (new EditorGUI.DisabledScope(!canAnyTargetProject))
            {
                if (GUILayout.Button("Project mesh"))
                {
                    foreach (var item in items)
                    {
                        if (item.HasMeshToProjectAgainst)
                        {
                            item.GenerateProjectedMesh();
                        }
                    }
                }
            }
            if (!canAnyTargetProject)
            {
                if (shouldUseAllSceneStaticMeshes.boolValue)
                {
                    EditorGUILayout.HelpBox("Cannot project mesh until the decal is placed close to a static mesh in the scene.",
                                            MessageType.Warning);
                }
                else
                {
                    EditorGUILayout.HelpBox("Cannot project mesh until at least one target mesh has been selected.",
                                            MessageType.Warning);
                }
            }
            if (!isEditingMultipleObjects && primaryItem.IsGeneratedMeshEmpty)
            {
                if (shouldUseAllSceneStaticMeshes.boolValue)
                {
                    EditorGUILayout.HelpBox("Decal mesh is currently empty so the decal is invisible.\nPlace this object so that the bounding box intersects at least one static mesh in the scene then click \"Generate Mesh\"",
                                            MessageType.Warning);
                }
                else
                {
                    EditorGUILayout.HelpBox("Decal mesh is currently empty so the decal is invisible.\nPlace this object so that the bounding box intersects at least one targetted mesh then click \"Generate Mesh\"",
                                            MessageType.Warning);
                }
            }
        }
        void DecalPickerGUI(Decal primaryItem, Decal[] items, bool isEditingMultipleObjects)
        {
            EditorGUILayout.PropertyField(decalAsset,
                                          new GUIContent("Decal Asset",
                                                         $"The decal to display. You can create new {nameof(DecalAsset)}s in your project assets.")
                                          );

            if (!isEditingMultipleObjects && !primaryItem.HasDecalAsset)
            {
                EditorGUILayout.HelpBox($"{nameof(Decal)} requires a {nameof(DecalAsset)}",
                                        MessageType.Error);
            }
        }
        public override void OnInspectorGUI()
        {
            bool isEditingMultipleObjects = (targets != null && targets.Length > 1);

            var items = new Decal[targets.Length];

            for (int i = 0; i < targets.Length; ++i)
            {
                items[i] = (Decal)targets[i];
            }
            var primaryItem = (Decal)target;

            serializedObject.Update();

            ProjectMeshButtonGUI(primaryItem, items, isEditingMultipleObjects);
            ResetMeshButtonGUI(primaryItem, items, isEditingMultipleObjects);
            ScaleToMatchButtonGUI(primaryItem, items, isEditingMultipleObjects);
            DecalPickerGUI(primaryItem, items, isEditingMultipleObjects);
            OpacityOptionsGUI();
            FlipOptionsGUI();
            TargetMeshesGUI();

            serializedObject.ApplyModifiedProperties();
        }