コード例 #1
0
 public void OnAfterDeserialize()
 {
     #region repair
     if (weightKeys.Count < weightValues.Count)
     {
         weightValues.RemoveRange(weightKeys.Count, weightValues.Count - weightKeys.Count);
     }
     else if (weightKeys.Count > weightValues.Count)
     {
         weightKeys.RemoveRange(weightValues.Count, weightKeys.Count - weightValues.Count);
     }
     #endregion
     {
         IntVector3 max = IntVector3.zero;
         for (int i = 0; i < weightKeys.Count; i++)
         {
             max = IntVector3.Max(max, weightKeys[i]);
         }
         indexTable = new DataTable3 <int>(max.x, max.y, max.z);
     }
     for (int i = 0; i < weightKeys.Count; i++)
     {
         if (indexTable.Contains(weightKeys[i]))
         {
             weightKeys.RemoveAt(i);
             weightValues.RemoveAt(i);
             i--;
             continue;
         }
         indexTable.Set(weightKeys[i], i);
     }
 }
コード例 #2
0
 private void CheckFillVoxelTableCheck()
 {
     if (fillVoxelDataLastTimeTicks != objectTarget.voxelData.updateVoxelTableLastTimeTicks)
     {
         fillVoxelTable             = null;
         fillVoxelFaceAreaTable     = null;
         fillVoxelDataLastTimeTicks = objectTarget.voxelData.updateVoxelTableLastTimeTicks;
     }
 }
コード例 #3
0
        public void ClearCache()
        {
            ClearSilhouetteMeshMesh();
            ClearPreviewMesh();
            ClearCursorMesh();

            fillVoxelTable             = null;
            fillVoxelFaceAreaTable     = null;
            fillVoxelFaceTable         = null;
            fillVoxelFaceFaceAreaTable = null;
        }
コード例 #4
0
ファイル: VoxelBase.cs プロジェクト: Slympp/GetOut
 public void CreateMaterialIndexTable()
 {
     materialIndexTable = null;
     if (voxelData == null || materialData == null) return;
     materialIndexTable = new DataTable3<int>(voxelData.voxelSize.x, voxelData.voxelSize.y, voxelData.voxelSize.z);
     for (int i = 1; i < materialData.Count; i++)
     {
         materialData[i].AllAction((pos) =>
         {
             materialIndexTable.Set(pos, i);
         });
     }
 }
コード例 #5
0
ファイル: DisableData.cs プロジェクト: Slympp/GetOut
        public void OnAfterDeserialize()
        {
            IntVector3 max = IntVector3.zero;

            for (int i = 0; i < disableList.Count; i++)
            {
                max = IntVector3.Max(max, disableList[i]);
            }
            indexTable = new DataTable3 <VoxelBase.Face>(max.x + 1, max.y + 1, max.z + 1);

            for (int i = 0; i < disableList.Count; i++)
            {
                indexTable.Set(disableList[i], faceList[i]);
            }
        }
コード例 #6
0
        public void OnAfterDeserialize()
        {
            IntVector3 max = IntVector3.zero;

            for (int i = 0; i < materialList.Count; i++)
            {
                max = IntVector3.Max(max, materialList[i]);
            }
            indexTable = new DataTable3 <int>(max.x + 1, max.y + 1, max.z + 1);

            for (int i = 0; i < materialList.Count; i++)
            {
                indexTable.Set(materialList[i], i);
            }
        }
コード例 #7
0
ファイル: VoxelData.cs プロジェクト: heiseshuixian/swimcube
 public void CreateVoxelTable()
 {
     #region voxelTable
     {
         voxelTable = new DataTable3 <int>(voxelSize.x, voxelSize.y, voxelSize.z);
         if (voxels != null)
         {
             for (int i = 0; i < voxels.Length; i++)
             {
                 voxelTable.Set(voxels[i].position, i);
             }
         }
     }
     #endregion
     #region vertexList
     {
         vertexList         = new List <IntVector3>();
         bool[,,] doneTable = new bool[voxelSize.x + 1, voxelSize.y + 1, voxelSize.z + 1];
         Action <IntVector3> AddPoint = (pos) =>
         {
             if (pos.x < 0 || pos.y < 0 || pos.z < 0)
             {
                 return;
             }
             if (!doneTable[pos.x, pos.y, pos.z])
             {
                 doneTable[pos.x, pos.y, pos.z] = true;
                 vertexList.Add(pos);
             }
         };
         if (voxels != null)
         {
             for (int i = 0; i < voxels.Length; i++)
             {
                 AddPoint(new IntVector3(voxels[i].x, voxels[i].y, voxels[i].z));
                 AddPoint(new IntVector3(voxels[i].x + 1, voxels[i].y, voxels[i].z));
                 AddPoint(new IntVector3(voxels[i].x, voxels[i].y + 1, voxels[i].z));
                 AddPoint(new IntVector3(voxels[i].x, voxels[i].y, voxels[i].z + 1));
                 AddPoint(new IntVector3(voxels[i].x + 1, voxels[i].y + 1, voxels[i].z));
                 AddPoint(new IntVector3(voxels[i].x + 1, voxels[i].y, voxels[i].z + 1));
                 AddPoint(new IntVector3(voxels[i].x, voxels[i].y + 1, voxels[i].z + 1));
                 AddPoint(new IntVector3(voxels[i].x + 1, voxels[i].y + 1, voxels[i].z + 1));
             }
         }
     }
     #endregion
 }
コード例 #8
0
        public VoxelData.FaceAreaTable GetFillVoxelFaceAreaTable(IntVector3 pos)
        {
            if (objectTarget.voxelData == null)
            {
                return(null);
            }
            if (objectTarget.voxelData.VoxelTableContains(pos) < 0)
            {
                return(null);
            }

            CheckFillVoxelTableCheck();
            if (fillVoxelFaceAreaTable == null)
            {
                fillVoxelFaceAreaTable = new DataTable3 <VoxelData.FaceAreaTable>(objectTarget.voxelData.voxelSize.x, objectTarget.voxelData.voxelSize.y, objectTarget.voxelData.voxelSize.z);
            }
            if (!fillVoxelFaceAreaTable.Contains(pos))
            {
                var list = GetFillVoxel(pos);
                if (list == null)
                {
                    return(null);
                }
                var voxels = new List <VoxelData.Voxel>();
                for (int i = 0; i < list.Count; i++)
                {
                    var index = objectTarget.voxelData.VoxelTableContains(list[i]);
                    var voxel = objectTarget.voxelData.voxels[index];
                    voxel.palette = -1;
                    voxels.Add(voxel);
                }
                var faceAreaTable = objectCore.Edit_CreateMeshOnly_FaceArea(voxels, true);
                for (int i = 0; i < list.Count; i++)
                {
                    fillVoxelFaceAreaTable.Set(list[i], faceAreaTable);
                }
            }
            var fillVoxelFaceArea = fillVoxelFaceAreaTable.Get(pos);

            return(fillVoxelFaceArea);
        }
コード例 #9
0
        public void CreateVoxelTable()
        {
            #region voxelTable
            {
                voxelTable = new DataTable3 <int>(voxelSize.x, voxelSize.y, voxelSize.z);
                if (voxels != null)
                {
                    for (int i = 0; i < voxels.Length; i++)
                    {
                        voxelTable.Set(voxels[i].position, i);
                    }
                }
            }
            #endregion

            #region vertexList
            {
                vertexList         = new List <IntVector3>(2 * voxels.Length);
                bool[,,] doneTable = new bool[voxelSize.x + 1, voxelSize.y + 1, voxelSize.z + 1];
                Action <IntVector3> AddPoint = (pos) =>
                {
                    if (pos.x < 0 || pos.y < 0 || pos.z < 0)
                    {
                        return;
                    }
                    if (!doneTable[pos.x, pos.y, pos.z])
                    {
                        doneTable[pos.x, pos.y, pos.z] = true;
                        vertexList.Add(pos);
                    }
                };
                if (voxels != null)
                {
                    for (int i = 0; i < voxels.Length; i++)
                    {
                        AddPoint(new IntVector3(voxels[i].x, voxels[i].y, voxels[i].z));
                        AddPoint(new IntVector3(voxels[i].x + 1, voxels[i].y, voxels[i].z));
                        AddPoint(new IntVector3(voxels[i].x, voxels[i].y + 1, voxels[i].z));
                        AddPoint(new IntVector3(voxels[i].x, voxels[i].y, voxels[i].z + 1));
                        AddPoint(new IntVector3(voxels[i].x + 1, voxels[i].y + 1, voxels[i].z));
                        AddPoint(new IntVector3(voxels[i].x + 1, voxels[i].y, voxels[i].z + 1));
                        AddPoint(new IntVector3(voxels[i].x, voxels[i].y + 1, voxels[i].z + 1));
                        AddPoint(new IntVector3(voxels[i].x + 1, voxels[i].y + 1, voxels[i].z + 1));
                    }
                }
            }
            #endregion

            #region outsideTable
            {
                bool[,,] doneTable = new bool[voxelSize.x, voxelSize.y, voxelSize.z];
                outsideTable       = new FlagTable3(voxelSize.x, voxelSize.y, voxelSize.z);
                List <IntVector3>      findList    = new List <IntVector3>(voxelSize.x * voxelSize.y * voxelSize.z);
                Action <int, int, int> AddFindList = (x, y, z) =>
                {
                    if (x < 0 || x >= voxelSize.x || y < 0 || y >= voxelSize.y || z < 0 || z >= voxelSize.z)
                    {
                        return;
                    }
                    if (doneTable[x, y, z])
                    {
                        return;
                    }
                    doneTable[x, y, z] = true;
                    if (VoxelTableContains(x, y, z) >= 0)
                    {
                        return;
                    }
                    if (outsideTable.Get(x, y, z))
                    {
                        return;
                    }
                    findList.Add(new IntVector3(x, y, z));
                    outsideTable.Set(x, y, z, true);
                };
                for (int x = 0; x < voxelSize.x; x++)
                {
                    for (int y = 0; y < voxelSize.y; y++)
                    {
                        AddFindList(x, y, 0);
                        AddFindList(x, y, voxelSize.z - 1);
                    }
                    for (int z = 0; z < voxelSize.z; z++)
                    {
                        AddFindList(x, 0, z);
                        AddFindList(x, voxelSize.y - 1, z);
                    }
                }
                for (int z = 0; z < voxelSize.z; z++)
                {
                    for (int y = 0; y < voxelSize.y; y++)
                    {
                        AddFindList(0, y, z);
                        AddFindList(voxelSize.x - 1, y, z);
                    }
                }
                for (int i = 0; i < findList.Count; i++)
                {
                    var pos = findList[i];
                    AddFindList(pos.x + 1, pos.y, pos.z);
                    AddFindList(pos.x - 1, pos.y, pos.z);
                    AddFindList(pos.x, pos.y + 1, pos.z);
                    AddFindList(pos.x, pos.y - 1, pos.z);
                    AddFindList(pos.x, pos.y, pos.z + 1);
                    AddFindList(pos.x, pos.y, pos.z - 1);
                }
            }
            #endregion

            updateVoxelTableLastTimeTicks = DateTime.Now.Ticks;
        }
コード例 #10
0
        protected override void CreateChunkData()
        {
            if (voxelObject.splitMode != VoxelChunksObject.SplitMode.ChunkSize)
            {
                if (voxelData.chunkDataList == null)
                {
                    voxelObject.splitMode = VoxelChunksObject.SplitMode.ChunkSize;
                }
            }
            if (voxelObject.splitMode == VoxelChunksObject.SplitMode.QubicleMatrix || voxelObject.splitMode == VoxelChunksObject.SplitMode.WorldEditor)
            {
                voxelData.chunkTable = new DataTable3 <IntVector3>(voxelData.voxelSize.x, voxelData.voxelSize.y, voxelData.voxelSize.z);

                var chunkVoxels   = new List <int> [voxelData.chunkDataList.Count];
                var chunkPalettes = new HashSet <Color> [voxelData.chunkDataList.Count];
                for (int i = 0; i < voxelData.chunkDataList.Count; i++)
                {
                    chunkVoxels[i]   = new List <int>();
                    chunkPalettes[i] = new HashSet <Color>();
                }
                for (int i = 0; i < voxelData.voxels.Length; i++)
                {
                    var chunkIndex = voxelData.chunkIndexTable.Get(voxelData.voxels[i].position);
                    //voxel
                    chunkVoxels[chunkIndex].Add(i);
                    //palette
                    chunkPalettes[chunkIndex].Add(voxelData.palettes[voxelData.voxels[i].palette]);
                    //
                    voxelData.chunkTable.Set(voxelData.voxels[i].position, new IntVector3(chunkIndex, int.MinValue, int.MinValue));
                }
                {
                    chunkDataList = new List <ChunkData>(chunkVoxels.Length);
                    for (int i = 0; i < chunkVoxels.Length; i++)
                    {
                        chunkDataList.Add(new ChunkData()
                        {
                            position = new IntVector3(i, int.MinValue, int.MinValue),
                            name     = string.Format("Chunk({0})", voxelData.chunkDataList[i].name),
                            area     = voxelData.chunkDataList[i].area,
                            voxels   = chunkVoxels[i],
                            palettes = chunkPalettes[i].ToArray()
                        });
                    }
                    chunkDataList.Sort((a, b) => string.Compare(voxelData.chunkDataList[a.position.x].name, voxelData.chunkDataList[b.position.x].name));
                }
            }
            else
            {
                voxelData.chunkTable = new DataTable3 <IntVector3>(voxelData.voxelSize.x, voxelData.voxelSize.y, voxelData.voxelSize.z);

                var chunkVoxels   = new DataTable3 <List <int> >(voxelData.voxelSize.x, voxelData.voxelSize.y, voxelData.voxelSize.z);
                var chunkPalettes = new DataTable3 <HashSet <Color> >(voxelData.voxelSize.x, voxelData.voxelSize.y, voxelData.voxelSize.z);
                for (int i = 0; i < voxelData.voxels.Length; i++)
                {
                    var chunkPosition = GetChunkPosition(voxelData.voxels[i].position);
                    //voxel
                    if (!chunkVoxels.Contains(chunkPosition))
                    {
                        chunkVoxels.Set(chunkPosition, new List <int>());
                    }
                    chunkVoxels.Get(chunkPosition).Add(i);
                    //palette
                    if (!chunkPalettes.Contains(chunkPosition))
                    {
                        chunkPalettes.Set(chunkPosition, new HashSet <Color>());
                    }
                    chunkPalettes.Get(chunkPosition).Add(voxelData.palettes[voxelData.voxels[i].palette]);
                    //
                    voxelData.chunkTable.Set(voxelData.voxels[i].position, chunkPosition);
                }
                {
                    chunkDataList = new List <ChunkData>();
                    chunkVoxels.AllAction((x, y, z, list) =>
                    {
                        var pos = new IntVector3(x, y, z);
                        chunkDataList.Add(new ChunkData()
                        {
                            position = pos,
                            name     = string.Format("Chunk({0}, {1}, {2})", x, y, z),
                            area     = new VoxelData.ChunkArea()
                            {
                                min = pos * voxelObject.chunkSize, max = (pos + IntVector3.one) * voxelObject.chunkSize - IntVector3.one
                            },
                            voxels   = list,
                            palettes = chunkPalettes.Get(pos).ToArray()
                        });
                    });
                    chunkDataList.Sort((a, b) => a.position.x != b.position.x ? a.position.x - b.position.x : a.position.y != b.position.y ? a.position.y - b.position.y : a.position.z - b.position.z);
                }
            }
        }
コード例 #11
0
        public List <IntVector3> GetFillVoxel(IntVector3 pos)
        {
            if (objectTarget.voxelData == null)
            {
                return(null);
            }
            if (objectTarget.voxelData.VoxelTableContains(pos) < 0)
            {
                return(null);
            }

            if (fillVoxelTable == null)
            {
                fillVoxelTable = new DataTable3 <List <IntVector3> >(objectTarget.voxelData.voxelSize.x, objectTarget.voxelData.voxelSize.y, objectTarget.voxelData.voxelSize.z);
            }
            if (!fillVoxelTable.Contains(pos))
            {
                List <IntVector3> searchList = new List <IntVector3>();
                for (int i = 0; i < objectTarget.voxelData.voxels.Length; i++)
                {
                    int posPalette = 0;
                    var doneTable  = new FlagTable3(objectTarget.voxelData.voxelSize.x, objectTarget.voxelData.voxelSize.y, objectTarget.voxelData.voxelSize.z);
                    {
                        var p = objectTarget.voxelData.voxels[i].position;
                        if (fillVoxelTable.Get(p) != null)
                        {
                            continue;
                        }
                        var index = objectTarget.voxelData.VoxelTableContains(p);
                        posPalette = objectTarget.voxelData.voxels[index].palette;
                        searchList.Clear();
                        searchList.Add(p);
                        doneTable.Set(p, true);
                    }
                    var result = new List <IntVector3>();
                    for (int j = 0; j < searchList.Count; j++)
                    {
                        var p     = searchList[j];
                        var index = objectTarget.voxelData.VoxelTableContains(p);
                        if (index < 0)
                        {
                            continue;
                        }
                        if (objectTarget.voxelData.voxels[index].palette == posPalette)
                        {
                            result.Add(p);
                            for (int x = p.x - 1; x <= p.x + 1; x++)
                            {
                                for (int y = p.y - 1; y <= p.y + 1; y++)
                                {
                                    for (int z = p.z - 1; z <= p.z + 1; z++)
                                    {
                                        if (x >= 0 && y >= 0 && z >= 0 &&
                                            x < objectTarget.voxelData.voxelSize.x && y < objectTarget.voxelData.voxelSize.y && z < objectTarget.voxelData.voxelSize.z &&
                                            !doneTable.Get(x, y, z))
                                        {
                                            doneTable.Set(x, y, z, true);
                                            var indexTmp = objectTarget.voxelData.VoxelTableContains(x, y, z);
                                            if (indexTmp >= 0 && objectTarget.voxelData.voxels[indexTmp].palette == posPalette)
                                            {
                                                searchList.Add(new IntVector3(x, y, z));
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }

                    for (int j = 0; j < result.Count; j++)
                    {
                        fillVoxelTable.Set(result[j], result);
                    }
                }
            }
            var fillVoxel = fillVoxelTable.Get(pos);

            return(fillVoxel);
        }
コード例 #12
0
        public VoxelData.FaceAreaTable GetFillVoxelFaceFaceAreaTable(IntVector3 pos, VoxelBase.Face face)
        {
            if (objectTarget.voxelData == null)
            {
                return(null);
            }
            if (objectTarget.voxelData.VoxelTableContains(pos) < 0)
            {
                return(null);
            }

            CheckFillVoxelTableCheck();
            if (fillVoxelFaceFaceAreaTable == null)
            {
                fillVoxelFaceFaceAreaTable = new DataTable3 <Dictionary <int, VoxelData.FaceAreaTable> >(objectTarget.voxelData.voxelSize.x, objectTarget.voxelData.voxelSize.y, objectTarget.voxelData.voxelSize.z);
            }
            if (!fillVoxelFaceFaceAreaTable.Contains(pos) ||
                !fillVoxelFaceFaceAreaTable.Get(pos).ContainsKey((int)face))
            {
                var list = GetFillVoxelFace(pos, face);
                if (list == null)
                {
                    return(null);
                }
                var voxels = new List <VoxelData.Voxel>();
                for (int i = 0; i < list.Count; i++)
                {
                    var index = objectTarget.voxelData.VoxelTableContains(list[i]);
                    var voxel = objectTarget.voxelData.voxels[index];
                    voxel.palette = -1;
                    voxel.visible = face;
                    voxels.Add(voxel);
                }
                var faceAreaTable = objectCore.Edit_CreateMeshOnly_FaceArea(voxels, true);

                Dictionary <int, VoxelData.FaceAreaTable> data;
                if (fillVoxelFaceFaceAreaTable.Contains(pos))
                {
                    data = fillVoxelFaceFaceAreaTable.Get(pos);
                }
                else
                {
                    data = new Dictionary <int, VoxelData.FaceAreaTable>();
                }
                data[(int)face] = faceAreaTable;
                fillVoxelFaceFaceAreaTable.Set(pos, data);
                for (int i = 0; i < list.Count; i++)
                {
                    if (fillVoxelFaceFaceAreaTable.Contains(list[i]))
                    {
                        data = fillVoxelFaceFaceAreaTable.Get(list[i]);
                    }
                    else
                    {
                        data = new Dictionary <int, VoxelData.FaceAreaTable>();
                    }
                    data[(int)face] = faceAreaTable;
                    fillVoxelFaceFaceAreaTable.Set(list[i], data);
                }
            }
            var fillVoxelFaceArea = fillVoxelFaceFaceAreaTable.Get(pos)[(int)face];

            return(fillVoxelFaceArea);
        }
コード例 #13
0
        public List <IntVector3> GetFillVoxelFace(IntVector3 pos, VoxelBase.Face face)
        {
            if (objectTarget.voxelData == null)
            {
                return(null);
            }
            if (objectTarget.voxelData.VoxelTableContains(pos) < 0)
            {
                return(null);
            }

            CheckFillVoxelTableCheck();
            if (fillVoxelFaceTable == null)
            {
                fillVoxelFaceTable = new DataTable3 <Dictionary <int, List <IntVector3> > >(objectTarget.voxelData.voxelSize.x, objectTarget.voxelData.voxelSize.y, objectTarget.voxelData.voxelSize.z);
            }
            if (!fillVoxelFaceTable.Contains(pos) ||
                !fillVoxelFaceTable.Get(pos).ContainsKey((int)face))
            {
                List <IntVector3> searchList = new List <IntVector3>();
                var doneTable = new FlagTable3(objectTarget.voxelData.voxelSize.x, objectTarget.voxelData.voxelSize.y, objectTarget.voxelData.voxelSize.z);
                {
                    searchList.Clear();
                    searchList.Add(pos);
                    doneTable.Set(pos, true);
                }
                var result = new List <IntVector3>();
                for (int j = 0; j < searchList.Count; j++)
                {
                    var p     = searchList[j];
                    var index = objectTarget.voxelData.VoxelTableContains(p);
                    if (index < 0)
                    {
                        continue;
                    }
                    if ((objectTarget.voxelData.voxels[index].visible & face) != 0)
                    {
                        result.Add(p);
                        int xOffset = (face & (VoxelBase.Face.up | VoxelBase.Face.down | VoxelBase.Face.forward | VoxelBase.Face.back)) != 0 ? 1 : 0;
                        int yOffset = (face & (VoxelBase.Face.right | VoxelBase.Face.left | VoxelBase.Face.forward | VoxelBase.Face.back)) != 0 ? 1 : 0;
                        int zOffset = (face & (VoxelBase.Face.right | VoxelBase.Face.left | VoxelBase.Face.up | VoxelBase.Face.down)) != 0 ? 1 : 0;
                        for (int x = p.x - xOffset; x <= p.x + xOffset; x++)
                        {
                            for (int y = p.y - yOffset; y <= p.y + yOffset; y++)
                            {
                                for (int z = p.z - zOffset; z <= p.z + zOffset; z++)
                                {
                                    if (x >= 0 && y >= 0 && z >= 0 &&
                                        x < objectTarget.voxelData.voxelSize.x && y < objectTarget.voxelData.voxelSize.y && z < objectTarget.voxelData.voxelSize.z &&
                                        !doneTable.Get(x, y, z))
                                    {
                                        doneTable.Set(x, y, z, true);
                                        var indexTmp = objectTarget.voxelData.VoxelTableContains(x, y, z);
                                        if (indexTmp >= 0)
                                        {
                                            searchList.Add(new IntVector3(x, y, z));
                                        }
                                    }
                                }
                            }
                        }
                    }
                }

                Dictionary <int, List <IntVector3> > data;
                if (fillVoxelFaceTable.Contains(pos))
                {
                    data = fillVoxelFaceTable.Get(pos);
                }
                else
                {
                    data = new Dictionary <int, List <IntVector3> >();
                }
                data[(int)face] = result;
                fillVoxelFaceTable.Set(pos, data);
                for (int j = 0; j < result.Count; j++)
                {
                    if (fillVoxelFaceTable.Contains(result[j]))
                    {
                        data = fillVoxelFaceTable.Get(result[j]);
                    }
                    else
                    {
                        data = new Dictionary <int, List <IntVector3> >();
                    }
                    data[(int)face] = result;
                    fillVoxelFaceTable.Set(result[j], data);
                }
            }
            var fillVoxel = fillVoxelFaceTable.Get(pos)[(int)face];

            return(fillVoxel);
        }