Пример #1
0
        public void CreateVoxGeos(VoxAtlas atlas)
        {
            float DUV = 0.125f;
            int   vi;

            for (int i = 1; i < 6; i++)
            {
                var vgpTop   = new VGPCube6();
                var vgpTrans = new VGPCube6();
                var vgpCliff = new VGPCube6();
                for (int fi = 0; fi < 6; fi++)
                {
                    vgpTop.Colors[fi] = Color.White;
                    switch (fi)
                    {
                    case Voxel.FACE_NY:
                        vgpTop.UVRects[fi]   = new Vector4(DUV * i, DUV * 4, DUV, DUV);
                        vgpTrans.UVRects[fi] = new Vector4(DUV * i, DUV * 4, DUV, DUV);
                        vgpCliff.UVRects[fi] = new Vector4(DUV * i, DUV * 4, DUV, DUV);
                        break;

                    case Voxel.FACE_PY:
                        vgpTop.UVRects[fi]   = new Vector4(DUV * i, DUV * 0, DUV, DUV);
                        vgpTrans.UVRects[fi] = new Vector4(DUV * i, DUV * 4, DUV, DUV);
                        vgpCliff.UVRects[fi] = new Vector4(DUV * i, DUV * 4, DUV, DUV);
                        break;

                    default:
                        vgpTop.UVRects[fi]   = new Vector4(DUV * i, DUV * 1, DUV, DUV);
                        vgpTrans.UVRects[fi] = new Vector4(DUV * i, DUV * 2, DUV, DUV);
                        vgpCliff.UVRects[fi] = new Vector4(DUV * i, DUV * 3, DUV, DUV);
                        break;
                    }
                }
                atlas[(ushort)(i)].GeoProvider      = vgpTop;
                atlas[(ushort)(i + 5)].GeoProvider  = vgpTrans;
                atlas[(ushort)(i + 10)].GeoProvider = vgpCliff;
            }
            for (vi = 0; vi < 4; vi++)
            {
                var     vd  = atlas[(ushort)(vi + 16)];
                var     vgp = new VGPCustom();
                Vector4 uvr = new Vector4(DUV * 5, DUV * 0, DUV, DUV);
                switch (vi)
                {
                case 0:
                case 1:
                    vgp.CustomVerts[Voxel.FACE_PY] = new VertexVoxel[] {
                        new VertexVoxel(new Vector3(0, 0, 0), Vector2.UnitX, uvr, Color.White),
                        new VertexVoxel(new Vector3(1, -1, 0), Vector2.One, uvr, Color.White),
                        new VertexVoxel(new Vector3(1, -1, 1), Vector2.UnitY, uvr, Color.White),
                        new VertexVoxel(new Vector3(0, 0, 1), Vector2.Zero, uvr, Color.White),
                        new VertexVoxel(new Vector3(0, -1, 0), Vector2.UnitX, uvr, Color.White),
                        new VertexVoxel(new Vector3(0, -1, 1), Vector2.Zero, uvr, Color.White)
                    };
                    vgp.CustomInds[Voxel.FACE_PY] = new int[] {
                        0, 1, 3, 3, 1, 2,
                        3, 2, 5, 1, 0, 4,
                        0, 3, 4, 4, 3, 5
                    };
                    break;

                default:
                    vgp.CustomVerts[Voxel.FACE_PY] = new VertexVoxel[] {
                        new VertexVoxel(new Vector3(1, 0, 0), Vector2.UnitX, uvr, Color.White),
                        new VertexVoxel(new Vector3(1, -1, 1), Vector2.One, uvr, Color.White),
                        new VertexVoxel(new Vector3(0, -1, 1), Vector2.UnitY, uvr, Color.White),
                        new VertexVoxel(new Vector3(0, 0, 0), Vector2.Zero, uvr, Color.White),
                        new VertexVoxel(new Vector3(1, -1, 0), Vector2.UnitX, uvr, Color.White),
                        new VertexVoxel(new Vector3(0, -1, 0), Vector2.Zero, uvr, Color.White)
                    };
                    vgp.CustomInds[Voxel.FACE_PY] = new int[] {
                        0, 1, 3, 3, 1, 2,
                        3, 2, 5, 1, 0, 4,
                        0, 3, 4, 4, 3, 5
                    };
                    break;
                }
                if ((vi % 2) == 1)
                {
                    if (vi == 1)
                    {
                        for (int fi = 0; fi < 6; fi++)
                        {
                            vgp.CustomVerts[Voxel.FACE_PY][fi].Position.X = 1 - vgp.CustomVerts[Voxel.FACE_PY][fi].Position.X;
                        }
                    }
                    else
                    {
                        for (int fi = 0; fi < 6; fi++)
                        {
                            vgp.CustomVerts[Voxel.FACE_PY][fi].Position.Z = 1 - vgp.CustomVerts[Voxel.FACE_PY][fi].Position.Z;
                        }
                    }
                    for (int ti = 0; ti < vgp.CustomInds[Voxel.FACE_PY].Length;)
                    {
                        int buf = vgp.CustomInds[Voxel.FACE_PY][ti + 2];
                        vgp.CustomInds[Voxel.FACE_PY][ti + 2] = vgp.CustomInds[Voxel.FACE_PY][ti];
                        vgp.CustomInds[Voxel.FACE_PY][ti]     = buf;
                        ti += 3;
                    }
                }
                vd.GeoProvider = vgp;
            }
            vi = 20;
            for (int i = 0; i < 5; i++)
            {
                var vgp = new VGPCube6();
                for (int fi = 0; fi < 6; fi++)
                {
                    vgp.Colors[fi] = Color.White;
                    switch (fi)
                    {
                    case Voxel.FACE_NY:
                        vgp.UVRects[fi] = new Vector4(DUV * i, DUV * 7, DUV, DUV);
                        break;

                    case Voxel.FACE_PY:
                        vgp.UVRects[fi] = new Vector4(DUV * i, DUV * 5, DUV, DUV);
                        break;

                    default:
                        vgp.UVRects[fi] = new Vector4(DUV * i, DUV * 6, DUV, DUV);
                        break;
                    }
                }
                atlas[(ushort)(vi + i)].GeoProvider = vgp;
            }
            vi += 5;
            for (int i = 0; i < 5; i++)
            {
                var     vgp = new VGPCustom();
                Vector4 uvr = new Vector4(DUV * 7, DUV * i, DUV, DUV);
                vgp.CustomVerts[Voxel.FACE_PY] = new VertexVoxel[] {
                    new VertexVoxel(new Vector3(0, 0, 0), Vector2.Zero, uvr, Color.White),
                    new VertexVoxel(new Vector3(1, 0, 1), Vector2.UnitX, uvr, Color.White),
                    new VertexVoxel(new Vector3(0, -1, 0), Vector2.UnitY, uvr, Color.White),
                    new VertexVoxel(new Vector3(1, -1, 1), Vector2.One, uvr, Color.White),
                    new VertexVoxel(new Vector3(0, 0, 1), Vector2.Zero, uvr, Color.White),
                    new VertexVoxel(new Vector3(1, 0, 0), Vector2.UnitX, uvr, Color.White),
                    new VertexVoxel(new Vector3(0, -1, 1), Vector2.UnitY, uvr, Color.White),
                    new VertexVoxel(new Vector3(1, -1, 0), Vector2.One, uvr, Color.White)
                };
                vgp.CustomInds[Voxel.FACE_PY] = new int[] {
                    0, 1, 2, 2, 1, 3,
                    4, 5, 6, 6, 5, 7
                };
                atlas[(ushort)(vi + i)].GeoProvider = vgp;
            }
        }
Пример #2
0
        private void CreateVoxTypes()
        {
            Random r = new Random(343);

            for (int i = 0; i < COUNT_TERRAIN; i++)
            {
                var vd = state.World.Atlas.Create();
                vd.FaceType = new VoxFaceType();
                vd.FaceType.SetAllTypes(0x00000001u);
                vd.FaceType.SetAllMasks(0xfffffffeu);
                var vgp = new VGPCube();
                switch (i)
                {
                case 0: vgp.Color = Color.White; break;

                case 1: vgp.Color = Color.Goldenrod; break;

                case 2: vgp.Color = Color.ForestGreen; break;

                case 3: vgp.Color = Color.Brown; break;

                case 4: vgp.Color = Color.Red; break;
                }
                vgp.UVRect     = new Vector4(DUV * 0, DUV * 0, DUV, DUV);
                vd.GeoProvider = vgp;
                dVox.Add("Terrain " + i, vd);
            }
            for (int i = 0; i < COUNT_SCENERY; i++)
            {
                var vd = state.World.Atlas.Create();
                vd.FaceType = new VoxFaceType();
                vd.FaceType.SetAllTypes(0x00000001u);
                vd.FaceType.SetAllMasks(0xfffffffeu);
                var vgp = new VGPCube();
                switch (i)
                {
                case 0: vgp.Color = Color.White; break;

                case 1: vgp.Color = Color.Goldenrod; break;

                case 2: vgp.Color = Color.ForestGreen; break;

                case 3: vgp.Color = Color.Brown; break;

                case 4: vgp.Color = Color.Red; break;

                case 5: vgp.Color = Color.Green; break;

                case 6: vgp.Color = Color.Red; break;

                case 7: vgp.Color = Color.Orange; break;

                case 8: vgp.Color = Color.Purple; break;

                case 9: vgp.Color = Color.DarkGray; break;
                }
                vgp.UVRect     = new Vector4(DUV * 1, DUV * 0, DUV, DUV);
                vd.GeoProvider = vgp;
                dVox.Add("Scenery " + i, vd);
            }
            for (int i = 0; i < COUNT_RAMP; i++)
            {
                var vd = state.World.Atlas.Create();
                vd.FaceType = new VoxFaceType();
                vd.FaceType.SetAllTypes(0x00000000u);
                vd.FaceType.Types[Voxel.FACE_PY] = 0xffffffffu;
                vd.FaceType.SetAllMasks(0xffffffffu);
                var     vgp = new VGPCustom();
                Vector4 uvr = new Vector4(DUV * 3, DUV * 0, DUV, DUV);
                switch (i)
                {
                case 0:
                case 1:
                    vgp.CustomVerts[Voxel.FACE_PY] = new VertexVoxel[] {
                        new VertexVoxel(new Vector3(0, 0, 0), Vector2.UnitX, uvr, Color.White),
                        new VertexVoxel(new Vector3(1, -1, 0), Vector2.One, uvr, Color.White),
                        new VertexVoxel(new Vector3(1, -1, 1), Vector2.UnitY, uvr, Color.White),
                        new VertexVoxel(new Vector3(0, 0, 1), Vector2.Zero, uvr, Color.White),
                        new VertexVoxel(new Vector3(0, -1, 0), Vector2.UnitX, uvr, Color.White),
                        new VertexVoxel(new Vector3(0, -1, 1), Vector2.Zero, uvr, Color.White)
                    };
                    vgp.CustomInds[Voxel.FACE_PY] = new int[] {
                        0, 1, 3, 3, 1, 2,
                        3, 2, 5, 1, 0, 4,
                        0, 3, 4, 4, 3, 5
                    };
                    break;

                default:
                    vgp.CustomVerts[Voxel.FACE_PY] = new VertexVoxel[] {
                        new VertexVoxel(new Vector3(1, 0, 0), Vector2.UnitX, uvr, Color.White),
                        new VertexVoxel(new Vector3(1, -1, 1), Vector2.One, uvr, Color.White),
                        new VertexVoxel(new Vector3(0, -1, 1), Vector2.UnitY, uvr, Color.White),
                        new VertexVoxel(new Vector3(0, 0, 0), Vector2.Zero, uvr, Color.White),
                        new VertexVoxel(new Vector3(1, -1, 0), Vector2.UnitX, uvr, Color.White),
                        new VertexVoxel(new Vector3(0, -1, 0), Vector2.Zero, uvr, Color.White)
                    };
                    vgp.CustomInds[Voxel.FACE_PY] = new int[] {
                        0, 1, 3, 3, 1, 2,
                        3, 2, 5, 1, 0, 4,
                        0, 3, 4, 4, 3, 5
                    };
                    break;
                }
                if ((i % 2) == 1)
                {
                    if (i == 1)
                    {
                        for (int vi = 0; vi < 6; vi++)
                        {
                            vgp.CustomVerts[Voxel.FACE_PY][vi].Position.X = 1 - vgp.CustomVerts[Voxel.FACE_PY][vi].Position.X;
                        }
                    }
                    else
                    {
                        for (int vi = 0; vi < 6; vi++)
                        {
                            vgp.CustomVerts[Voxel.FACE_PY][vi].Position.Z = 1 - vgp.CustomVerts[Voxel.FACE_PY][vi].Position.Z;
                        }
                    }
                    for (int ti = 0; ti < vgp.CustomInds[Voxel.FACE_PY].Length;)
                    {
                        int buf = vgp.CustomInds[Voxel.FACE_PY][ti + 2];
                        vgp.CustomInds[Voxel.FACE_PY][ti + 2] = vgp.CustomInds[Voxel.FACE_PY][ti];
                        vgp.CustomInds[Voxel.FACE_PY][ti]     = buf;
                        ti += 3;
                    }
                }
                vd.GeoProvider = vgp;
                dVox.Add("Ramp " + i, vd);
            }
            for (int i = 0; i < REGION_COLORS.Length; i++)
            {
                var vd = state.World.Atlas.Create();
                vd.FaceType = new VoxFaceType();
                vd.FaceType.SetAllTypes(0x00000001u);
                vd.FaceType.SetAllMasks(0xfffffffeu);
                var vgp = new VGPCube();
                vgp.Color      = REGION_COLORS[i];
                vgp.UVRect     = new Vector4(DUV * 2, DUV * 0, DUV, DUV);
                vd.GeoProvider = vgp;
                dVox.Add("Region " + i, vd);
            }
            // Load Custom Voxels
            foreach (var gtc in gtcList)
            {
                var l = gtc.CreateVoxels(state.World.Atlas);
                if (l == null)
                {
                    continue;
                }
                foreach (var lv in l)
                {
                    dVox.Add(lv.Name, lv.VData);
                }
            }
            foreach (var ic in icList)
            {
                var l = ic.CreateVoxels(state.World.Atlas);
                if (l == null)
                {
                    continue;
                }
                foreach (var lv in l)
                {
                    dVox.Add(lv.Name, lv.VData);
                }
            }
        }