예제 #1
0
        public Face FindExposedFaces(FindSolidFacesDelegate <T> solidCheck)
        {
            Face res = Face.None;

            foreach (Face face in Face.All)
            {
                if (IsFaceExposed(face, solidCheck))
                {
                    res |= face;
                }
            }

            return(res);
        }
예제 #2
0
        public override bool IsFaceSolid(Face face, FindSolidFacesDelegate <T> solidCheck)
        {
            switch (face.Index)
            {
            case Face.LeftIndex:
                return
                    (myChildren[0].IsFaceSolid(face, solidCheck) &&
                     myChildren[1].IsFaceSolid(face, solidCheck) &&
                     myChildren[2].IsFaceSolid(face, solidCheck) &&
                     myChildren[3].IsFaceSolid(face, solidCheck));

            case Face.RightIndex:
                return
                    (myChildren[4].IsFaceSolid(face, solidCheck) &&
                     myChildren[5].IsFaceSolid(face, solidCheck) &&
                     myChildren[6].IsFaceSolid(face, solidCheck) &&
                     myChildren[7].IsFaceSolid(face, solidCheck));

            case Face.BottomIndex:
                return
                    (myChildren[0].IsFaceSolid(face, solidCheck) &&
                     myChildren[1].IsFaceSolid(face, solidCheck) &&
                     myChildren[4].IsFaceSolid(face, solidCheck) &&
                     myChildren[5].IsFaceSolid(face, solidCheck));

            case Face.TopIndex:
                return
                    (myChildren[2].IsFaceSolid(face, solidCheck) &&
                     myChildren[3].IsFaceSolid(face, solidCheck) &&
                     myChildren[6].IsFaceSolid(face, solidCheck) &&
                     myChildren[7].IsFaceSolid(face, solidCheck));

            case Face.FrontIndex:
                return
                    (myChildren[0].IsFaceSolid(face, solidCheck) &&
                     myChildren[2].IsFaceSolid(face, solidCheck) &&
                     myChildren[4].IsFaceSolid(face, solidCheck) &&
                     myChildren[6].IsFaceSolid(face, solidCheck));

            case Face.BackIndex:
                return
                    (myChildren[1].IsFaceSolid(face, solidCheck) &&
                     myChildren[3].IsFaceSolid(face, solidCheck) &&
                     myChildren[5].IsFaceSolid(face, solidCheck) &&
                     myChildren[7].IsFaceSolid(face, solidCheck));
            }

            return(false);
        }
예제 #3
0
        private float[] FindVertices(GeometryShader shader)
        {
            List <float> verts = new List <float>();
            FindSolidFacesDelegate <UInt16> solidCheck = (x =>
            {
                var comp = BlockManager.Get(x).GetComponant <VisibilityBComponant>();
                if (comp != null)
                {
                    return(comp.SolidFaces);
                }
                return(Face.None);
            });

            foreach (Octree <UInt16> octree in Chunk.Octrees)
            {
                var iter = (OctreeEnumerator <UInt16>)octree.GetEnumerator();
                while (iter.MoveNext())
                {
                    OctreeLeaf <UInt16> leaf = iter.Current;

                    BlockType type = BlockManager.Get(leaf.Value);
                    var       vis  = type.GetComponant <VisibilityBComponant>();

                    if (vis == null || !vis.IsVisible)
                    {
                        continue;
                    }

                    var mdl = type.GetComponant <ModelBComponant>();

                    if (mdl == null)
                    {
                        continue;
                    }

                    int size = iter.Size;

                    Vector3 offset = new Vector3(iter.X, iter.Y, iter.Z);

                    verts.AddRange(mdl.Model.GenerateVertexData(offset, size,
                                                                leaf.FindExposedFaces(solidCheck)));
                }
            }

            return(verts.ToArray());
        }
예제 #4
0
 public virtual bool IsFaceSolid(Face face, FindSolidFacesDelegate <T> solidCheck)
 {
     throw new NotImplementedException();
 }
예제 #5
0
        public bool IsFaceExposed(Face face, FindSolidFacesDelegate <T> solidCheck)
        {
            OctreeNode <T> n = FindNeighbour(face);

            return(n == null || !n.IsFaceSolid(face.Opposite, solidCheck));
        }
예제 #6
0
 public override bool IsFaceSolid(Face face, FindSolidFacesDelegate <T> solidCheck)
 {
     return(solidCheck(Value).HasFace(face));
 }