示例#1
0
        public static void CopyVoxelsInBox(ref Voxel[] source, ref Voxel[] dest,
                                           PicaVoxelBox sourceBox, PicaVoxelBox destBox, PicaVoxelPoint srcSize, PicaVoxelPoint destSize, bool activeOnly)
        {
            int dx = destBox.BottomLeftFront.X;
            int dy = destBox.BottomLeftFront.Y;
            int dz = destBox.BottomLeftFront.Z;

            for (int x = sourceBox.BottomLeftFront.X; x <= sourceBox.TopRightBack.X; x++)
            {
                dy = destBox.BottomLeftFront.Y;
                for (int y = sourceBox.BottomLeftFront.Y; y <= sourceBox.TopRightBack.Y; y++)
                {
                    dz = destBox.BottomLeftFront.Z;
                    for (int z = sourceBox.BottomLeftFront.Z; z <= sourceBox.TopRightBack.Z; z++)
                    {
                        if (x >= 0 && y >= 0 && z >= 0 && x < srcSize.X && y < srcSize.Y && z < srcSize.Z)
                        {
                            if (source[x + srcSize.X * (y + srcSize.Y * z)].Active || !activeOnly)
                            {
                                if (dx >= 0 && dy >= 0 && dz >= 0 && dx < destSize.X && dy < destSize.Y && dz < destSize.Z)
                                {
                                    dest[dx + destSize.X * (dy + destSize.Y * dz)] = source[x + srcSize.X * (y + srcSize.Y * z)];
                                }
                            }
                        }
                        dz++;
                    }
                    dy++;
                }
                dx++;
            }
        }
        private void OnEnable()
        {
            voxelDeformer = (RandomDeformer)target;

            if (voxelDeformer.ConstrainBox == null)
            {
                voxelDeformer.ConstrainBox = new PicaVoxelBox(0, 0, 0, voxelDeformer.GetComponent <Volume>().XSize,
                                                              voxelDeformer.GetComponent <Volume>().YSize, voxelDeformer.GetComponent <Volume>().ZSize);
            }

            constrainBox   = voxelDeformer.ConstrainBox;
            constrainToBox = voxelDeformer.ConstrainToBox;
            add            = voxelDeformer.AddVoxels;
            num            = voxelDeformer.NumVoxels;
            interval       = voxelDeformer.Interval;
        }
        public void OnGUI()
        {
            EditorGUILayout.Space();
            EditorUtility.SkinnedLabel("Volume Size: " + voxelObject.name + " (" + voxelObject.XSize + "," + voxelObject.YSize + "," + voxelObject.ZSize + ")");
            EditorGUILayout.Space();
            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.LabelField("X:", new[] { GUILayout.Width(30) });
            xSize = EditorGUILayout.IntField(xSize);
            EditorGUILayout.LabelField("Y:", new[] { GUILayout.Width(30) });
            ySize = EditorGUILayout.IntField(ySize);
            EditorGUILayout.LabelField("Z:", new[] { GUILayout.Width(30) });
            zSize = EditorGUILayout.IntField(zSize);
            EditorGUILayout.EndHorizontal();
            EditorGUILayout.Space();

            anchorX = (AnchorX)EditorGUILayout.EnumPopup("X Anchor: ", anchorX);
            anchorY = (AnchorY)EditorGUILayout.EnumPopup("Y Anchor: ", anchorY);
            anchorZ = (AnchorZ)EditorGUILayout.EnumPopup("Z Anchor: ", anchorZ);

            EditorGUILayout.Space();
            fillVoxels = EditorGUILayout.ToggleLeft(" Fill any added space", fillVoxels);

            EditorGUILayout.Space();
            EditorUtility.SkinnedLabel(
                "Chunk Size: " + voxelObject.name + " (" + voxelObject.XChunkSize + "," + voxelObject.YChunkSize + "," +
                voxelObject.ZChunkSize + ")");
            EditorGUILayout.Space();
            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.LabelField("X:", new[] { GUILayout.Width(30) });
            xChunkSize = EditorGUILayout.IntField(xChunkSize);
            EditorGUILayout.LabelField("Y:", new[] { GUILayout.Width(30) });
            yChunkSize = EditorGUILayout.IntField(yChunkSize);
            EditorGUILayout.LabelField("Z:", new[] { GUILayout.Width(30) });
            zChunkSize = EditorGUILayout.IntField(zChunkSize);
            EditorGUILayout.EndHorizontal();

            EditorGUILayout.Space();
            EditorGUILayout.BeginHorizontal();
            if (GUILayout.Button("Resize") &&
                (xSize != voxelObject.XSize || ySize != voxelObject.YSize || zSize != voxelObject.ZSize ||
                 xChunkSize != voxelObject.XChunkSize || yChunkSize != voxelObject.YChunkSize ||
                 zChunkSize != voxelObject.ZChunkSize))
            {
                if (xSize < 1)
                {
                    xSize = 1;
                }
                if (ySize < 1)
                {
                    ySize = 1;
                }
                if (zSize < 1)
                {
                    zSize = 1;
                }
                if (xChunkSize < 1)
                {
                    xChunkSize = 1;
                }
                if (yChunkSize < 1)
                {
                    yChunkSize = 1;
                }
                if (zChunkSize < 1)
                {
                    zChunkSize = 1;
                }

                int totalChunkSize = xChunkSize * yChunkSize * zChunkSize;

                if (totalChunkSize > 16 * 16 * 16)
                {
                    UnityEditor.EditorUtility.DisplayDialog("PicaVoxel",
                                                            "The largest chunk size is 16*16*16 voxels TOTAL. Decrease size in one axis to increase the other two.",
                                                            "OK");
                }
                else
                {
                    voxelObject.XChunkSize = xChunkSize;
                    voxelObject.YChunkSize = yChunkSize;
                    voxelObject.ZChunkSize = zChunkSize;


                    if (xSize != voxelObject.XSize || ySize != voxelObject.YSize || zSize != voxelObject.ZSize)
                    {
                        List <Object> undoObjects = new List <Object>();

                        foreach (Frame frame in voxelObject.Frames)
                        {
                            undoObjects.Add(frame);
                        }
                        undoObjects.Add(voxelObject);

                        Undo.RecordObjects(undoObjects.ToArray(), "Resize Voxel Object");
                        foreach (Frame frame in voxelObject.Frames)
                        {
                            UnityEditor.EditorUtility.SetDirty(frame);
                        }
                        UnityEditor.EditorUtility.SetDirty(voxelObject);

                        PicaVoxelBox copyDestBox =
                            new PicaVoxelBox(
                                anchorX == AnchorX.Left
                                    ? 0
                                    : anchorX == AnchorX.Center
                                        ? (xSize / 2) - (voxelObject.XSize / 2)
                                        : xSize - voxelObject.XSize,
                                anchorY == AnchorY.Bottom
                                    ? 0
                                    : anchorY == AnchorY.Center
                                        ? (ySize / 2) - (voxelObject.YSize / 2)
                                        : ySize - voxelObject.YSize,
                                anchorZ == AnchorZ.Front
                                    ? 0
                                    : anchorZ == AnchorZ.Center
                                        ? (zSize / 2) - (voxelObject.ZSize / 2)
                                        : zSize - voxelObject.ZSize,
                                (anchorX == AnchorX.Left
                                    ? 0
                                    : anchorX == AnchorX.Center
                                        ? (xSize / 2) - (voxelObject.XSize / 2)
                                        : xSize - voxelObject.XSize) +
                                (voxelObject.XSize - 1),
                                (anchorY == AnchorY.Bottom
                                    ? 0
                                    : anchorY == AnchorY.Center
                                        ? (ySize / 2) - (voxelObject.YSize / 2)
                                        : ySize - voxelObject.YSize) +
                                (voxelObject.YSize - 1),
                                (anchorZ == AnchorZ.Front
                                    ? 0
                                    : anchorZ == AnchorZ.Center
                                        ? (zSize / 2) - (voxelObject.ZSize / 2)
                                        : zSize - voxelObject.ZSize) +
                                (voxelObject.ZSize - 1));


                        foreach (Frame frame in voxelObject.Frames)
                        {
                            Voxel[] newVox = new Voxel[xSize * ySize * zSize];

                            if (fillVoxels)
                            {
                                for (int x = 0; x < xSize; x++)
                                {
                                    for (int y = 0; y < ySize; y++)
                                    {
                                        for (int z = 0; z < zSize; z++)
                                        {
                                            newVox[x + xSize * (y + ySize * z)] = new Voxel()
                                            {
                                                State = VoxelState.Active,
                                                Color = voxelObject.PaletteColors[0],
                                                Value = 128
                                            }
                                        }
                                    }
                                }
                                ;
                            }

                            int destX = copyDestBox.BottomLeftFront.X;
                            int destY = copyDestBox.BottomLeftFront.Y;
                            int destZ = copyDestBox.BottomLeftFront.Z;
                            for (int x = 0; x < voxelObject.XSize; x++)
                            {
                                for (int y = 0; y < voxelObject.YSize; y++)
                                {
                                    for (int z = 0; z < voxelObject.ZSize; z++)
                                    {
                                        if (destX < 0 || destY < 0 || destZ < 0 || destX >= xSize ||
                                            destY >= ySize || destZ >= zSize)
                                        {
                                            destZ++;
                                            continue;
                                        }

                                        newVox[destX + xSize * (destY + ySize * destZ)] =
                                            frame.Voxels[x + frame.XSize * (y + frame.YSize * z)];
                                        destZ++;
                                    }
                                    destZ = copyDestBox.BottomLeftFront.Z;
                                    destY++;
                                }
                                destY = copyDestBox.BottomLeftFront.Y;
                                destX++;
                            }

                            frame.XSize         = xSize;
                            frame.YSize         = ySize;
                            frame.ZSize         = zSize;
                            frame.EditingVoxels = null;
                            frame.Voxels        = newVox;
                        }


                        voxelObject.XSize = xSize;
                        voxelObject.YSize = ySize;
                        voxelObject.ZSize = zSize;
                    }


                    voxelObject.CreateChunks();

                    voxelObject.SaveForSerialize();

                    //EditorUtility.SetDirty(voxelObject);


                    Close();
                }
            }
            // }
            if (GUILayout.Button("Cancel"))
            {
                Close();
            }
            EditorGUILayout.EndHorizontal();
        }