예제 #1
0
            public static void CreateCubeMesh16x16(VOXCruncher it, ref Vector3[] vertices, ref Vector3[] normals, ref Vector2[] uv, ref int[] triangles, ref int index, float scaling)
            {
                Vector3 pos;

                pos.x = (it.begin.x + it.end.x + 1) * 0.5f * scaling;
                pos.y = (it.begin.y + it.end.y + 1) * 0.5f * scaling;
                pos.z = (it.begin.z + it.end.z + 1) * 0.5f * scaling;

                Vector3 scale;

                scale.x = (it.end.x + 1 - it.begin.x) * scaling;
                scale.y = (it.end.y + 1 - it.begin.y) * scaling;
                scale.z = (it.end.z + 1 - it.begin.z) * scaling;

                VOXModel.CreateCubeMesh16x16(ref vertices, ref normals, ref uv, ref triangles, ref index, it.faces, pos, scale, (uint)it.material);
            }
예제 #2
0
            public VOXModel CalcVoxelCruncher(VoxData chunk, Color32[] palette)
            {
                var crunchers = new List <VOXCruncher>();
                var bound     = new Vector3Int(chunk.x, chunk.y, chunk.z);

                for (int i = 0; i < chunk.x; ++i)
                {
                    for (int j = 0; j < chunk.y; ++j)
                    {
                        for (int k = 0; k < chunk.z; ++k)
                        {
                            var c = chunk.voxels[i, j, k];
                            if (c != int.MaxValue)
                            {
                                VOXVisiableFaces faces;
                                if (!GetVisiableFaces(chunk.voxels, bound, i, j, k, c, palette, out faces))
                                {
                                    continue;
                                }

                                crunchers.Add(new VOXCruncher((byte)i, (byte)i, (byte)j, (byte)j, (byte)k, (byte)k, faces, c));
                            }
                        }
                    }
                }

                var array = new VOXCruncher[crunchers.Count];

                int numbers = 0;

                foreach (var it in crunchers)
                {
                    array[numbers++] = it;
                }

                return(new VOXModel(array));
            }
예제 #3
0
            public VOXModel CalcVoxelCruncher(VoxData chunk, Color32[] palette)
            {
                var crunchers = new VOXCruncher[chunk.count];
                var faces     = new VOXVisiableFaces(true, true, true, true, true, true);

                int n = 0;

                for (int i = 0; i < chunk.x; ++i)
                {
                    for (int j = 0; j < chunk.y; ++j)
                    {
                        for (int k = 0; k < chunk.z; ++k)
                        {
                            var m = chunk.voxels[i, j, k];
                            if (m != int.MaxValue)
                            {
                                crunchers[n++] = new VOXCruncher(i, i, j, j, k, k, faces, m);
                            }
                        }
                    }
                }

                return(new VOXModel(crunchers));
            }
예제 #4
0
            public VOXModel CalcVoxelCruncher(VoxData chunk, Color32[] palette)
            {
                var crunchers = new List <VOXCruncher>();
                var dims      = new int[] { chunk.x, chunk.y, chunk.z };

                var alloc = System.Math.Max(dims[0], System.Math.Max(dims[1], dims[2]));
                var mask  = new int[alloc * alloc];
                var map   = chunk.voxels;

                for (var d = 0; d < 3; ++d)
                {
                    var u = (d + 1) % 3;
                    var v = (d + 2) % 3;

                    var x = new int[3] {
                        0, 0, 0
                    };
                    var q = new int[3] {
                        0, 0, 0
                    };

                    q[d] = 1;

                    var faces = new VOXVisiableFaces(false, false, false, false, false, false);

                    for (x[d] = -1; x[d] < dims[d];)
                    {
                        var n = 0;

                        for (x[v] = 0; x[v] < dims[v]; ++x[v])
                        {
                            for (x[u] = 0; x[u] < dims[u]; ++x[u])
                            {
                                var a = x[d] >= 0 ? map[x[0], x[1], x[2]] : VOXMaterial.MaxValue;
                                var b = x[d] < dims[d] - 1 ? map[x[0] + q[0], x[1] + q[1], x[2] + q[2]] : VOXMaterial.MaxValue;
                                if (a != b)
                                {
                                    if (a == VOXMaterial.MaxValue)
                                    {
                                        mask[n++] = b;
                                    }
                                    else if (b == VOXMaterial.MaxValue)
                                    {
                                        mask[n++] = -a;
                                    }
                                    else
                                    {
                                        mask[n++] = -b;
                                    }
                                }
                                else
                                {
                                    mask[n++] = VOXMaterial.MaxValue;
                                }
                            }
                        }

                        ++x[d];

                        n = 0;

                        for (var j = 0; j < dims[v]; ++j)
                        {
                            for (var i = 0; i < dims[u];)
                            {
                                var c = mask[n];
                                if (c == VOXMaterial.MaxValue)
                                {
                                    ++i; ++n;
                                    continue;
                                }

                                var w = 1;
                                var h = 1;
                                var k = 0;

                                for (; (i + w) < dims[u] && c == mask[n + w]; ++w)
                                {
                                }

                                var done = false;
                                for (; (j + h) < dims[v]; ++h)
                                {
                                    for (k = 0; k < w; ++k)
                                    {
                                        if (c != mask[n + k + h * dims[u]])
                                        {
                                            done = true;
                                            break;
                                        }
                                    }

                                    if (done)
                                    {
                                        break;
                                    }
                                }

                                x[u] = i; x[v] = j;

                                var du = new int[3] {
                                    0, 0, 0
                                };
                                var dv = new int[3] {
                                    0, 0, 0
                                };

                                du[u] = w;
                                dv[v] = h;

                                var v1 = new Vector3(x[0], x[1], x[2]);
                                var v2 = new Vector3(x[0] + du[0] + dv[0], x[1] + du[1] + dv[1], x[2] + du[2] + dv[2]);

                                v2.x = System.Math.Max(v2.x - 1, 0);
                                v2.y = System.Math.Max(v2.y - 1, 0);
                                v2.z = System.Math.Max(v2.z - 1, 0);

                                if (c > 0)
                                {
                                    faces.front  = d == 2;
                                    faces.back   = false;
                                    faces.left   = d == 0;
                                    faces.right  = false;
                                    faces.top    = false;
                                    faces.bottom = d == 1;
                                }
                                else
                                {
                                    c            = -c;
                                    faces.front  = false;
                                    faces.back   = d == 2;
                                    faces.left   = false;
                                    faces.right  = d == 0;
                                    faces.top    = d == 1;
                                    faces.bottom = false;
                                }

                                crunchers.Add(new VOXCruncher((byte)v1.x, (byte)(v2.x), (byte)(v1.y), (byte)(v2.y), (byte)(v1.z), (byte)(v2.z), faces, c));

                                for (var l = 0; l < h; ++l)
                                {
                                    for (k = 0; k < w; ++k)
                                    {
                                        mask[n + k + l * dims[u]] = VOXMaterial.MaxValue;
                                    }
                                }

                                i += w; n += w;
                            }
                        }
                    }
                }

                var array = new VOXCruncher[crunchers.Count];

                int numbers = 0;

                foreach (var it in crunchers)
                {
                    array[numbers++] = it;
                }

                return(new VOXModel(array));
            }