private void GenerateUVMap(GeneratedCuboid targetCuboid)
        {
            UVBitmapGenerator generator = new UVBitmapGenerator();

            output = generator.StoreUVMap(targetCuboid.Uvs, targetCuboid.UvSize);
            AssetDatabase.Refresh();
        }
        private void RecreateCuboid(GeneratedCuboid targetCuboid)
        {
            float x, y, z;
            bool  forceVertical;

            AssignSizeValues(targetCuboid, out x, out y, out z, out forceVertical);

            AbstractCuboidMeshGenerator meshGenerator;

            if (forceVertical)
            {
                meshGenerator = new VerticalCuboidMeshGenerator(x, y, z);
            }
            else
            {
                meshGenerator = AbstractCuboidMeshGenerator.ConstructOptimalGenerator(x, y, z);
            }
            meshGenerator.CreateCuboid();
            Mesh newMesh = meshGenerator.GetMesh();

            SetNewMesh(targetCuboid, newMesh);
            AdaptCollider(targetCuboid, meshGenerator);

            targetCuboid.Uvs = meshGenerator.GetUVs();
        }
        private void SetNewMesh(GeneratedCuboid targetCuboid, Mesh newMesh)
        {
            MeshFilter meshFilter = targetCuboid.GetComponent <MeshFilter>();

            if (meshFilter != null)
            {
                Undo.RecordObject(meshFilter, "MeshFilter mesh change");
                meshFilter.mesh = newMesh;
            }
        }
        public void AssignCuboidVariables(BoxCollider col)
        {
            GeneratedCuboid generatedCuboid = col.GetComponent <GeneratedCuboid>();

            generatedCuboid.X = x;
            generatedCuboid.Y = y;
            generatedCuboid.Z = z;
            generatedCuboid.ColliderCenter = col.transform.TransformPoint(col.center);
            generatedCuboid.Uvs            = uvs;
            lastCreatedCuboid = generatedCuboid;
        }
        private void AdaptCollider(GeneratedCuboid targetCuboid, AbstractCuboidMeshGenerator meshGenerator)
        {
            BoxCollider col = targetCuboid.GetComponent <BoxCollider>();

            if (col != null)
            {
                Undo.RecordObject(col, "Collider bounds change");
                meshGenerator.AssignCuboidVariables(col);
                meshGenerator.AdjustCollider(col);
            }
        }
        private void RecreateCuboidAndSetColliderCenter(GeneratedCuboid targetCuboid)
        {
            RecreateCuboid(targetCuboid);

            BoxCollider col = targetCuboid.GetComponent <BoxCollider>();

            if (col != null)
            {
                targetCuboid.ColliderCenter = col.transform.TransformPoint(col.center);
            }
        }
        private void ResizeToColliderBounds(GeneratedCuboid targetCuboid)
        {
            BoxCollider col = targetCuboid.GetComponent <BoxCollider>();

            if (col != null)
            {
                Vector3 newCenter = col.transform.TransformPoint(col.center);
                xProperty.floatValue = col.size.x;
                yProperty.floatValue = col.size.y;
                zProperty.floatValue = col.size.z;
                RecreateCuboid(targetCuboid);
                targetCuboid.MoveToColliderCenter(newCenter);
            }
        }
        void OnEnable()
        {
            xProperty = serializedObject.FindProperty("x");
            yProperty = serializedObject.FindProperty("y");
            zProperty = serializedObject.FindProperty("z");
            forceVerticalMapProperty = serializedObject.FindProperty("forceVerticalMap");

            targetCuboids     = System.Array.ConvertAll(targets, item => (GeneratedCuboid)item);
            firstTargetCuboid = targetCuboids[0];

            if (!firstTargetCuboid.Output.Equals(string.Empty))
            {
                output = firstTargetCuboid.Output;
            }
        }
        private void AssignSizeValues(GeneratedCuboid targetCuboid, out float x, out float y, out float z, out bool forceVertical)
        {
            if (xProperty.hasMultipleDifferentValues)
            {
                x = targetCuboid.X;
            }
            else
            {
                x = xProperty.floatValue;
            }

            if (yProperty.hasMultipleDifferentValues)
            {
                y = targetCuboid.Y;
            }
            else
            {
                y = yProperty.floatValue;
            }

            if (zProperty.hasMultipleDifferentValues)
            {
                z = targetCuboid.Z;
            }
            else
            {
                z = zProperty.floatValue;
            }

            if (forceVerticalMapProperty.hasMultipleDifferentValues)
            {
                forceVertical = targetCuboid.ForceVerticalMap;
            }
            else
            {
                forceVertical = forceVerticalMapProperty.boolValue;
            }
        }