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 ); } } }
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 )); } } }
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; } }
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; } }
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; //} }
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); } } } } }