public bool GenerateMesh(Globals.MeshData Mesh) { bool refreshRequired = false; State = StateEnum.Meshed; for (byte Dir = 0; Dir < 6; Dir++) { var B0 = (byte)(SubBlock.Occlude & (1 << Dir)); if (B0 <= 0) { continue; } if (!(Neighbor[Globals.DirectionVector[Dir].x + 1, Globals.DirectionVector[Dir].y + 1, Globals.DirectionVector[Dir].z + 1] == null)) { var B1 = (byte)(Neighbor[Globals.DirectionVector[Dir].x + 1, Globals.DirectionVector[Dir].y + 1, Globals.DirectionVector[Dir].z + 1].SubBlock.Occlude & (1 << (5 - Dir))); if (B1 == 0) { if (addFace(Mesh, Dir)) { refreshRequired = true; } else { State = StateEnum.ValidCP; return(false); } } } } return(refreshRequired); }
public static bool GenerateMesh(Globals.MeshData Mesh, BlockClass Block) { bool refreshRequired = false; // if (State < StateEnum.ValidCP) { // CalculateControlPoint(this); // } Block.State = StateEnum.Meshed; for (byte Dir = 0; Dir < 6; Dir++) { var B0 = (byte)(Block.SubBlock.Occlude & (1 << Dir)); if (B0 <= 0) { continue; } if (!(Block.Neighbor[Globals.DirectionVector[Dir].x + 1, Globals.DirectionVector[Dir].y + 1, Globals.DirectionVector[Dir].z + 1] == null)) { var B1 = (byte)(Block.Neighbor[Globals.DirectionVector[Dir].x + 1, Globals.DirectionVector[Dir].y + 1, Globals.DirectionVector[Dir].z + 1].SubBlock.Occlude & (1 << (5 - Dir))); if (B1 == 0) { if (Block.addFace(Mesh, Dir)) { refreshRequired = true; } else { Block.State = StateEnum.ValidCP; return(false); } } } } return(refreshRequired); }
private bool addFace(Globals.MeshData Mesh, byte dir) { for (var i = 0; i < 4; i++) { var blk = FacePoints[BlockFaces[dir, i]]; if (Neighbor[blk.x + 1, blk.y + 1, blk.z + 1] == null) { Mesh.Vertices.RemoveRange(Mesh.Vertices.Count - i, i); Mesh.Normals.RemoveRange(Mesh.Normals.Count - i, i); return(false); } if (Neighbor[blk.x + 1, blk.y + 1, blk.z + 1].State < StateEnum.ValidCP) { Mesh.Vertices.RemoveRange(Mesh.Vertices.Count - i, i); Mesh.Normals.RemoveRange(Mesh.Normals.Count - i, i); return(false); } Mesh.Vertices.Add(Position + blk + Neighbor[blk.x + 1, blk.y + 1, blk.z + 1].SubBlock.ControlPoint - Chunk.Position); Mesh.Normals.Add(Globals.DirectionVector[dir]); } var v1 = Mesh.Vertices[Mesh.Vertices.Count - 1] - Mesh.Vertices[Mesh.Vertices.Count - 2]; var v2 = Mesh.Vertices[Mesh.Vertices.Count - 3] - Mesh.Vertices[Mesh.Vertices.Count - 2]; var N = Vector3.Cross(v1, v2).normalized; if (N.y > .3) { dir = (byte)Globals.Direction.Up; //Up } var sc = Mesh.Vertices.Count - 4; // squareCount << 2;//Multiply by 4 if ((Mesh.Vertices[Mesh.Vertices.Count - 3] - Mesh.Vertices[Mesh.Vertices.Count - 1]).sqrMagnitude < (Mesh.Vertices[Mesh.Vertices.Count - 4] - Mesh.Vertices[Mesh.Vertices.Count - 2]).sqrMagnitude) { Mesh.Triangles.Add(sc); Mesh.Triangles.Add(sc + 1); Mesh.Triangles.Add(sc + 3); Mesh.Triangles.Add(sc + 1); Mesh.Triangles.Add(sc + 2); Mesh.Triangles.Add(sc + 3); } else { Mesh.Triangles.Add(sc); Mesh.Triangles.Add(sc + 1); Mesh.Triangles.Add(sc + 2); Mesh.Triangles.Add(sc); Mesh.Triangles.Add(sc + 2); Mesh.Triangles.Add(sc + 3); } //var v = blocks[center.x + 1][center.y + 1][center.z + 1].GetTex(); var v = SubBlock.Texture; var uv = new Vector2(v[dir].x / 16f + pixelOffset, (15 - v[dir].y) / 16f + pixelOffset); Mesh.UVs.Add(uv); Mesh.UVs.Add(new Vector2(uv.x + SubBlock.TexUnit - pixelOffset2, uv.y)); Mesh.UVs.Add(new Vector2(uv.x + SubBlock.TexUnit - pixelOffset2, uv.y + SubBlock.TexUnit - pixelOffset2)); Mesh.UVs.Add(new Vector2(uv.x, uv.y + SubBlock.TexUnit - pixelOffset2)); return(true); //squareCount++; }