Esempio n. 1
0
        private void UpdatePreviewMesh()
        {
            editorCommon.ClearPreviewMesh();

            if (baseTarget.edit_configureMode == VoxelBase.Edit_configureMode.Material &&
                baseTarget.edit_configureMaterialIndex > 0 && baseTarget.edit_configureMaterialIndex < baseTarget.materialData.Count)
            {
                List <VoxelData.Voxel> voxels = new List <VoxelData.Voxel>();
                editVoxelList.AllAction((x, y, z) =>
                {
                    var index = baseTarget.voxelData.VoxelTableContains(x, y, z);
                    if (index < 0)
                    {
                        return;
                    }
                    var voxel     = baseTarget.voxelData.voxels[index];
                    voxel.palette = -1;
                    voxels.Add(voxel);
                });
                if (voxels.Count > 0)
                {
                    editorCommon.previewMesh = baseCore.Edit_CreateMesh(voxels, null, false);
                }
            }
        }
        public Dictionary <IntVector3, VoxelBase.Face> GetSelectionRectVoxelFace()
        {
            Dictionary <IntVector3, VoxelBase.Face> result = new Dictionary <IntVector3, VoxelBase.Face>();

            if (selectionRect.Enable &&
                objectTarget.voxelData != null && objectTarget.voxelData.vertexList != null)
            {
                var        localToWorldMatrix = objectTarget.transform.localToWorldMatrix;
                FlagTable3 containsTable      = new FlagTable3(objectTarget.voxelData.voxelSize.x + 1, objectTarget.voxelData.voxelSize.y + 1, objectTarget.voxelData.voxelSize.z + 1);
                for (int i = 0; i < objectTarget.voxelData.vertexList.Count; i++)
                {
                    var local  = objectCore.GetVoxelRatePosition(objectTarget.voxelData.vertexList[i], Vector3.zero);
                    var world  = localToWorldMatrix.MultiplyPoint3x4(local);
                    var screen = HandleUtility.WorldToGUIPoint(world);
                    if (selectionRect.rect.Contains(screen))
                    {
                        containsTable.Set(objectTarget.voxelData.vertexList[i], true);
                    }
                }
                containsTable.AllAction((x, y, z) =>
                {
                    Action <int, int, int, VoxelBase.Face> AddFace = (xx, yy, zz, face) =>
                    {
                        var pos   = new IntVector3(xx, yy, zz);
                        var index = objectTarget.voxelData.VoxelTableContains(pos);
                        if (index < 0)
                        {
                            return;
                        }
                        if ((objectTarget.voxelData.voxels[index].visible & face) == 0)
                        {
                            return;
                        }

                        VoxelBase.Face combineFace;
                        if (!result.TryGetValue(pos, out combineFace))
                        {
                            result.Add(pos, face);
                        }
                        else
                        {
                            combineFace |= face;
                            result[pos]  = combineFace;
                        }
                    };
                    #region Left
                    if (containsTable.Get(x, y + 1, z) &&
                        containsTable.Get(x, y, z + 1) &&
                        containsTable.Get(x, y + 1, z + 1))
                    {
                        AddFace(x, y, z, VoxelBase.Face.left);
                        AddFace(x - 1, y, z, VoxelBase.Face.right);
                    }
                    #endregion
                    #region Down
                    if (containsTable.Get(x + 1, y, z) &&
                        containsTable.Get(x, y, z + 1) &&
                        containsTable.Get(x + 1, y, z + 1))
                    {
                        AddFace(x, y, z, VoxelBase.Face.down);
                        AddFace(x, y - 1, z, VoxelBase.Face.up);
                    }
                    #endregion
                    #region Back
                    if (containsTable.Get(x + 1, y, z) &&
                        containsTable.Get(x, y + 1, z) &&
                        containsTable.Get(x + 1, y + 1, z))
                    {
                        AddFace(x, y, z, VoxelBase.Face.back);
                        AddFace(x, y, z - 1, VoxelBase.Face.forward);
                    }
                    #endregion
                });
            }
            return(result);
        }