public void Append(List<VertexVoxel> lVerts, List<int> lInds, ref MeshedFace mf)
 {
     VertexVoxel vv;
     foreach(var mfd in Decomposed(mf)) {
         Vector3 v1 = new Vector3(mfd.RXNYN.X, mfd.RXNYN.Y, mfd.RXNYN.Z);
         int vc = lVerts.Count;
         foreach(var vert in CustomVerts[mf.Face]) {
             vv = vert;
             vv.Position += v1;
             lVerts.Add(vv);
         }
         foreach(var ind in CustomInds[mf.Face]) {
             lInds.Add(ind + vc);
         }
     }
 }
 public static IEnumerable<MeshedFace> Decomposed(MeshedFace mf)
 {
     for(int v = 0; v < mf.Size.Y; v++) {
         for(int u = 0; u < mf.Size.X; u++) {
             Vector3I aU = MeshedFace.FACE_AXES[mf.Face, 0];
             Vector3I aV = MeshedFace.FACE_AXES[mf.Face, 1];
             yield return new MeshedFace(
                 new Vector3I(
                     mf.RXNYN.X + aU.X * u + aV.X * v,
                     mf.RXNYN.Y + aU.Y * u + aV.Y * v,
                     mf.RXNYN.Z + aU.Z * u + aV.Z * v
                     ),
                 aU, aV,
                 new Point(1, 1),
                 mf.ID, mf.Face
                 );
         }
     }
 }
Exemple #3
0
        public void Append(List <VertexVoxel> lVerts, List <int> lInds, ref MeshedFace mf)
        {
            VertexVoxel vv;

            foreach (var mfd in Decomposed(mf))
            {
                Vector3 v1 = new Vector3(mfd.RXNYN.X, mfd.RXNYN.Y, mfd.RXNYN.Z);
                int     vc = lVerts.Count;
                foreach (var vert in CustomVerts[mf.Face])
                {
                    vv           = vert;
                    vv.Position += v1;
                    lVerts.Add(vv);
                }
                foreach (var ind in CustomInds[mf.Face])
                {
                    lInds.Add(ind + vc);
                }
            }
        }
Exemple #4
0
 public static IEnumerable <MeshedFace> Decomposed(MeshedFace mf)
 {
     for (int v = 0; v < mf.Size.Y; v++)
     {
         for (int u = 0; u < mf.Size.X; u++)
         {
             Vector3I aU = MeshedFace.FACE_AXES[mf.Face, 0];
             Vector3I aV = MeshedFace.FACE_AXES[mf.Face, 1];
             yield return(new MeshedFace(
                              new Vector3I(
                                  mf.RXNYN.X + aU.X * u + aV.X * v,
                                  mf.RXNYN.Y + aU.Y * u + aV.Y * v,
                                  mf.RXNYN.Z + aU.Z * u + aV.Z * v
                                  ),
                              aU, aV,
                              new Point(1, 1),
                              mf.ID, mf.Face
                              ));
         }
     }
 }
Exemple #5
0
 public void Append(List<VertexVoxel> lVerts, List<int> lInds, ref MeshedFace mf)
 {
     Vector3 v1 = new Vector3(mf.RXNYN.X, mf.RXNYN.Y, mf.RXNYN.Z);
     Vector3 v2 = new Vector3(mf.RXPYN.X, mf.RXPYN.Y, mf.RXPYN.Z);
     Vector3 v3 = new Vector3(mf.RXNYP.X, mf.RXNYP.Y, mf.RXNYP.Z);
     Vector3 v4 = new Vector3(mf.RXPYP.X, mf.RXPYP.Y, mf.RXPYP.Z);
     int vi = lVerts.Count;
     switch(mf.Face) {
         default:
             lVerts.Add(new VertexVoxel(v1, new Vector2(0, 0), UVRect, Color));
             lVerts.Add(new VertexVoxel(v2, new Vector2(mf.Size.X, 0), UVRect, Color));
             lVerts.Add(new VertexVoxel(v3, new Vector2(0, mf.Size.Y), UVRect, Color));
             lVerts.Add(new VertexVoxel(v4, new Vector2(mf.Size.X, mf.Size.Y), UVRect, Color));
             lInds.Add(vi + 0);
             lInds.Add(vi + 1);
             lInds.Add(vi + 2);
             lInds.Add(vi + 2);
             lInds.Add(vi + 1);
             lInds.Add(vi + 3);
             break;
     }
 }
Exemple #6
0
        public void Append(List <VertexVoxel> lVerts, List <int> lInds, ref MeshedFace mf)
        {
            Vector3 v1 = new Vector3(mf.RXNYN.X, mf.RXNYN.Y, mf.RXNYN.Z);
            Vector3 v2 = new Vector3(mf.RXPYN.X, mf.RXPYN.Y, mf.RXPYN.Z);
            Vector3 v3 = new Vector3(mf.RXNYP.X, mf.RXNYP.Y, mf.RXNYP.Z);
            Vector3 v4 = new Vector3(mf.RXPYP.X, mf.RXPYP.Y, mf.RXPYP.Z);
            int     vi = lVerts.Count;

            switch (mf.Face)
            {
            default:
                lVerts.Add(new VertexVoxel(v1, new Vector2(0, 0), UVRect, Color));
                lVerts.Add(new VertexVoxel(v2, new Vector2(mf.Size.X, 0), UVRect, Color));
                lVerts.Add(new VertexVoxel(v3, new Vector2(0, mf.Size.Y), UVRect, Color));
                lVerts.Add(new VertexVoxel(v4, new Vector2(mf.Size.X, mf.Size.Y), UVRect, Color));
                lInds.Add(vi + 0);
                lInds.Add(vi + 1);
                lInds.Add(vi + 2);
                lInds.Add(vi + 2);
                lInds.Add(vi + 1);
                lInds.Add(vi + 3);
                break;
            }
        }
Exemple #7
0
        public void Append(List<VertexVoxel> lVerts, List<int> lInds, ref MeshedFace mf)
        {
            Vector3 v1 = new Vector3(mf.RXNYN.X, mf.RXNYN.Y, mf.RXNYN.Z);
            Vector3 v2 = new Vector3(mf.RXPYN.X, mf.RXPYN.Y, mf.RXPYN.Z);
            Vector3 v3 = new Vector3(mf.RXNYP.X, mf.RXNYP.Y, mf.RXNYP.Z);
            Vector3 v4 = new Vector3(mf.RXPYP.X, mf.RXPYP.Y, mf.RXPYP.Z);
            Vector3[] verts = new Vector3[] { v1, v2, v3, v4 };
            int vi = lVerts.Count;
            if(mf.Face == faceBack) {
                lVerts.Add(new VertexVoxel(v1, new Vector2(0, 0), UVRect, Color));
                lVerts.Add(new VertexVoxel(v2, new Vector2(mf.Size.X, 0), UVRect, Color));
                lVerts.Add(new VertexVoxel(v3, new Vector2(0, mf.Size.Y), UVRect, Color));
                lVerts.Add(new VertexVoxel(v4, new Vector2(mf.Size.X, mf.Size.Y), UVRect, Color));
                lInds.Add(vi + 0);
                lInds.Add(vi + 1);
                lInds.Add(vi + 2);
                lInds.Add(vi + 2);
                lInds.Add(vi + 1);
                lInds.Add(vi + 3);
                return;
            }
            else if(mf.Face == (faceBack ^ 0x01)) {
                return;
            }
            else if(mf.Face == faceSide) {
                lVerts.Add(new VertexVoxel(verts[sideVerts[0]], new Vector2(0, 0), UVRect, Color));
                lVerts.Add(new VertexVoxel(verts[sideVerts[1]], new Vector2(mf.Size.X, 0), UVRect, Color));
                lVerts.Add(new VertexVoxel(verts[sideVerts[2]], new Vector2(0, mf.Size.Y), UVRect, Color));
                lInds.Add(vi + 0);
                lInds.Add(vi + 1);
                lInds.Add(vi + 2);
                return;
            }
            else if(mf.Face == (faceSide ^ 0x01)) {
                lVerts.Add(new VertexVoxel(verts[sideVerts[3]], new Vector2(0, 0), UVRect, Color));
                lVerts.Add(new VertexVoxel(verts[sideVerts[4]], new Vector2(mf.Size.X, 0), UVRect, Color));
                lVerts.Add(new VertexVoxel(verts[sideVerts[5]], new Vector2(0, mf.Size.Y), UVRect, Color));
                lInds.Add(vi + 0);
                lInds.Add(vi + 1);
                lInds.Add(vi + 2);
                return;
            }
            else if(mf.Face == Voxel.FACE_PY) {
                lVerts.Add(new VertexVoxel(v1 - subs[0], new Vector2(0, 0), UVRectTop, Color));
                lVerts.Add(new VertexVoxel(v2 - subs[1], new Vector2(mf.Size.X, 0), UVRectTop, Color));
                lVerts.Add(new VertexVoxel(v3 - subs[2], new Vector2(0, mf.Size.Y), UVRectTop, Color));
                lVerts.Add(new VertexVoxel(v4 - subs[3], new Vector2(mf.Size.X, mf.Size.Y), UVRectTop, Color));
                lInds.Add(vi + 0);
                lInds.Add(vi + 1);
                lInds.Add(vi + 2);
                lInds.Add(vi + 2);
                lInds.Add(vi + 1);
                lInds.Add(vi + 3);
                return;
            }
            //switch(mf.Face) {
            //    case Voxel.FACE_PY:

            //        break;
            //    default:
            //        lVerts.Add(new VertexVoxel(v1, new Vector2(0, 0), UVRect, Color));
            //        lVerts.Add(new VertexVoxel(v2, new Vector2(mf.Size.X, 0), UVRect, Color));
            //        lVerts.Add(new VertexVoxel(v3, new Vector2(0, mf.Size.Y), UVRect, Color));
            //        lVerts.Add(new VertexVoxel(v4, new Vector2(mf.Size.X, mf.Size.Y), UVRect, Color));
            //        lInds.Add(vi + 0);
            //        lInds.Add(vi + 1);
            //        lInds.Add(vi + 2);
            //        lInds.Add(vi + 2);
            //        lInds.Add(vi + 1);
            //        lInds.Add(vi + 3);
            //        break;
            //}
        }
Exemple #8
0
        public void Append(List <VertexVoxel> lVerts, List <int> lInds, ref MeshedFace mf)
        {
            Vector3 v1 = new Vector3(mf.RXNYN.X, mf.RXNYN.Y, mf.RXNYN.Z);
            Vector3 v2 = new Vector3(mf.RXPYN.X, mf.RXPYN.Y, mf.RXPYN.Z);
            Vector3 v3 = new Vector3(mf.RXNYP.X, mf.RXNYP.Y, mf.RXNYP.Z);
            Vector3 v4 = new Vector3(mf.RXPYP.X, mf.RXPYP.Y, mf.RXPYP.Z);

            Vector3[] verts = new Vector3[] { v1, v2, v3, v4 };
            int       vi    = lVerts.Count;

            if (mf.Face == faceBack)
            {
                lVerts.Add(new VertexVoxel(v1, new Vector2(0, 0), UVRect, Color));
                lVerts.Add(new VertexVoxel(v2, new Vector2(mf.Size.X, 0), UVRect, Color));
                lVerts.Add(new VertexVoxel(v3, new Vector2(0, mf.Size.Y), UVRect, Color));
                lVerts.Add(new VertexVoxel(v4, new Vector2(mf.Size.X, mf.Size.Y), UVRect, Color));
                lInds.Add(vi + 0);
                lInds.Add(vi + 1);
                lInds.Add(vi + 2);
                lInds.Add(vi + 2);
                lInds.Add(vi + 1);
                lInds.Add(vi + 3);
                return;
            }
            else if (mf.Face == (faceBack ^ 0x01))
            {
                return;
            }
            else if (mf.Face == faceSide)
            {
                lVerts.Add(new VertexVoxel(verts[sideVerts[0]], new Vector2(0, 0), UVRect, Color));
                lVerts.Add(new VertexVoxel(verts[sideVerts[1]], new Vector2(mf.Size.X, 0), UVRect, Color));
                lVerts.Add(new VertexVoxel(verts[sideVerts[2]], new Vector2(0, mf.Size.Y), UVRect, Color));
                lInds.Add(vi + 0);
                lInds.Add(vi + 1);
                lInds.Add(vi + 2);
                return;
            }
            else if (mf.Face == (faceSide ^ 0x01))
            {
                lVerts.Add(new VertexVoxel(verts[sideVerts[3]], new Vector2(0, 0), UVRect, Color));
                lVerts.Add(new VertexVoxel(verts[sideVerts[4]], new Vector2(mf.Size.X, 0), UVRect, Color));
                lVerts.Add(new VertexVoxel(verts[sideVerts[5]], new Vector2(0, mf.Size.Y), UVRect, Color));
                lInds.Add(vi + 0);
                lInds.Add(vi + 1);
                lInds.Add(vi + 2);
                return;
            }
            else if (mf.Face == Voxel.FACE_PY)
            {
                lVerts.Add(new VertexVoxel(v1 - subs[0], new Vector2(0, 0), UVRectTop, Color));
                lVerts.Add(new VertexVoxel(v2 - subs[1], new Vector2(mf.Size.X, 0), UVRectTop, Color));
                lVerts.Add(new VertexVoxel(v3 - subs[2], new Vector2(0, mf.Size.Y), UVRectTop, Color));
                lVerts.Add(new VertexVoxel(v4 - subs[3], new Vector2(mf.Size.X, mf.Size.Y), UVRectTop, Color));
                lInds.Add(vi + 0);
                lInds.Add(vi + 1);
                lInds.Add(vi + 2);
                lInds.Add(vi + 2);
                lInds.Add(vi + 1);
                lInds.Add(vi + 3);
                return;
            }
            //switch(mf.Face) {
            //    case Voxel.FACE_PY:

            //        break;
            //    default:
            //        lVerts.Add(new VertexVoxel(v1, new Vector2(0, 0), UVRect, Color));
            //        lVerts.Add(new VertexVoxel(v2, new Vector2(mf.Size.X, 0), UVRect, Color));
            //        lVerts.Add(new VertexVoxel(v3, new Vector2(0, mf.Size.Y), UVRect, Color));
            //        lVerts.Add(new VertexVoxel(v4, new Vector2(mf.Size.X, mf.Size.Y), UVRect, Color));
            //        lInds.Add(vi + 0);
            //        lInds.Add(vi + 1);
            //        lInds.Add(vi + 2);
            //        lInds.Add(vi + 2);
            //        lInds.Add(vi + 1);
            //        lInds.Add(vi + 3);
            //        break;
            //}
        }
        private static void MeshX(Region region, List<MeshedFace> res)
        {
            // Find Neighbor Regions
            Region rNeg = region.rNX;
            Region rPos = region.rPX;

            // Loop Through All Planes
            Vector3I pos = Vector3I.Zero;
            for(pos.X = 0; pos.X <= Region.WIDTH; pos.X++) {
                int[] mask = new int[Region.HEIGHT * Region.DEPTH];
                int mi = 0;

                // Create Mask
                int nID, pID;
                for(pos.Y = 0; pos.Y < Region.HEIGHT; pos.Y++) {
                    for(pos.Z = 0; pos.Z < Region.DEPTH; pos.Z++) {
                        // Get Negative Voxel
                        if(pos.X > 0)
                            nID = VoxelID(region, pos.X - 1, pos.Y, pos.Z);
                        else if(rNeg != null)
                            nID = VoxelID(rNeg, Region.WIDTH - 1, pos.Y, pos.Z);
                        else
                            nID = 0; // VoxelID(region, pos.X, pos.Y, pos.Z);

                        // Get Positive Voxel
                        if(pos.X < Region.WIDTH)
                            pID = VoxelID(region, pos.X, pos.Y, pos.Z);
                        else if(rPos != null)
                            pID = VoxelID(rPos, 0, pos.Y, pos.Z);
                        else
                            pID = 0; // VoxelID(region, pos.X - 1, pos.Y, pos.Z); ;

                        // Create Mask
                        VoxData nVD = region.World.Atlas[(ushort)nID];
                        VoxData pVD = region.World.Atlas[(ushort)pID];
                        if(nID == pID || (!nVD.FaceType.CanShowFace(pVD.FaceType, Voxel.FACE_PX) && !pVD.FaceType.CanShowFace(nVD.FaceType, Voxel.FACE_NX)))
                            mask[mi] = 0;
                        else if(nID != 0)
                            mask[mi] = nID;
                        else
                            mask[mi] = -pID;
                        mi++;
                    }
                }

                // Generate Rectangles
                mi = 0;
                for(pos.Y = 0; pos.Y < Region.HEIGHT; pos.Y++) {
                    for(pos.Z = 0; pos.Z < Region.DEPTH; pos.Z++, mi++) {
                        int id = mask[mi];
                        if(id != 0) {
                            int su = pos.Z;
                            int w = 1;
                            pos.Z++;
                            mi++;
                            while(pos.Z < Region.DEPTH && mask[mi] == id) {
                                w++;
                                pos.Z++;
                                mi++;
                            }
                            pos.Z--;
                            mi--;

                            MeshedFace mf;
                            if(id < 0) {
                                mf = new MeshedFace(
                                    new Vector3I(pos.X, pos.Y + 1, su),
                                    new Vector3I(0, 0, 1),
                                    new Vector3I(0, -1, 0),
                                    new Point(w, 1),
                                    -id,
                                    Voxel.FACE_NX
                                    );
                            }
                            else {
                                mf = new MeshedFace(
                                    new Vector3I(pos.X, pos.Y + 1, pos.Z + 1),
                                    new Vector3I(0, 0, -1),
                                    new Vector3I(0, -1, 0),
                                    new Point(w, 1),
                                    id,
                                    Voxel.FACE_PX
                                    );
                            }
                            res.Add(mf);
                        }
                    }
                }
            }
        }
        private static void MeshY(Region region, List<MeshedFace> res)
        {
            // Loop Through All Planes
            Vector3I pos = Vector3I.Zero;
            for(pos.Y = 0; pos.Y <= Region.HEIGHT; pos.Y++) {
                int[] mask = new int[Region.WIDTH * Region.DEPTH];
                int mi = 0;

                // Create Mask
                int nID, pID;
                for(pos.Z = 0; pos.Z < Region.DEPTH; pos.Z++) {
                    for(pos.X = 0; pos.X < Region.WIDTH; pos.X++) {
                        // Get Negative Voxel
                        if(pos.Y > 0)
                            nID = VoxelID(region, pos.X, pos.Y - 1, pos.Z);
                        else
                            nID = VoxelID(region, pos.X, pos.Y, pos.Z);

                        // Get Positive Voxel
                        if(pos.Y < Region.HEIGHT)
                            pID = VoxelID(region, pos.X, pos.Y, pos.Z);
                        else
                            pID = VoxelID(region, pos.X, pos.Y - 1, pos.Z);

                        // Create Mask
                        VoxData nVD = region.World.Atlas[(ushort)nID];
                        VoxData pVD = region.World.Atlas[(ushort)pID];
                        if(nID == pID || (!nVD.FaceType.CanShowFace(pVD.FaceType, Voxel.FACE_PY) && !pVD.FaceType.CanShowFace(nVD.FaceType, Voxel.FACE_NY)))
                            mask[mi] = 0;
                        else if(nID != 0)
                            mask[mi] = nID;
                        else
                            mask[mi] = -pID;
                        mi++;
                    }
                }

                // Generate Rectangles
                mi = 0;
                for(int v = 0; v < Region.DEPTH; v++) {
                    for(int u = 0; u < Region.WIDTH; u++, mi++) {
                        int id = mask[mi];
                        if(id != 0) {
                            int su = u;
                            int w = 1;
                            u++;
                            mi++;
                            while(u < Region.WIDTH && mask[mi] == id) {
                                w++;
                                u++;
                                mi++;
                            }
                            u--;
                            mi--;

                            MeshedFace mf;
                            if(id < 0) {
                                mf = new MeshedFace(
                                    new Vector3I(su, pos.Y, v + 1),
                                    new Vector3I(1, 0, 0),
                                    new Vector3I(0, 0, -1),
                                    new Point(w, 1),
                                    -id,
                                    Voxel.FACE_NY
                                    );
                            }
                            else {
                                mf = new MeshedFace(
                                    new Vector3I(su, pos.Y, v),
                                    new Vector3I(1, 0, 0),
                                    new Vector3I(0, 0, 1),
                                    new Point(w, 1),
                                    id,
                                    Voxel.FACE_PY
                                    );
                            }
                            res.Add(mf);
                        }
                    }
                }
            }
        }