예제 #1
0
        public PositionAndUv LerpTo(PositionAndUv Next, float Time)
        {
            var Prev = this;
            var p    = Vector3.Lerp(Prev.Position, Next.Position, Time);
            var u    = Vector2.Lerp(Prev.Uv, Next.Uv, Time);
            //	bad vector lerp. slerp this if it's ever used!
            var d   = Vector3.Lerp(Prev.Direction, Next.Direction, Time);
            var New = new PositionAndUv(p, u, d);

            return(New);
        }
예제 #2
0
 public PositionAndUv2(PositionAndUv a, PositionAndUv b)
 {
     this.a = a;
     this.b = b;
 }
예제 #3
0
    public Mesh GenerateMesh(out Vector3 EyePosition)
    {
        EyePosition = RayOrigin;

        var WorldPoints = GetWorldPoints();

        if (WorldPoints.Count < 2)
        {
            throw new System.Exception("Not enough points to generate mesh");
        }

        //	generate a triangle fan
        var Positions       = new List <Vector3>();
        var Uv0s            = new List <Vector2>();
        var Directions      = new List <Vector3>();
        var TriangleIndexes = new List <int>();

        System.Func <PositionAndUv, int> AddVertex = (Vert) =>
        {
            var Index = Positions.Count;
            Positions.Add(Vert.Position);
            Uv0s.Add(Vert.Uv);
            Directions.Add(Vert.Direction);
            return(Index);
        };
        System.Action <PositionAndUv, PositionAndUv, PositionAndUv> AddTriangle = (a, b, c) =>
        {
            var v0 = AddVertex(a);
            var v1 = AddVertex(b);
            var v2 = AddVertex(c);
            TriangleIndexes.Add(v0);
            TriangleIndexes.Add(v1);
            TriangleIndexes.Add(v2);
        };

        var FloorEdgeVertexes = new List <PositionAndUv2>();

        //	gr: should this be floorY?
        var CenterVertex = new PositionAndUv(Vector3.zero, GetEquirectUvFromView(Vector3.down), Vector3.down);

        for (int i = 0; i < WorldPoints.Count; i++)
        {
            try
            {
                var Prev = WorldPoints[i].Value;
                var Next = WorldPoints[(i + 1) % WorldPoints.Count].Value;

                float Step = 1.0f / (GeneratedMeshSubDivisions + 1);
                for (int subdiv = 0; subdiv <= GeneratedMeshSubDivisions; subdiv++)
                {
                    float ta = (subdiv + 0) * Step;
                    float tb = (subdiv + 1) * Step;
                    var   a  = Prev.LerpTo(Next, ta);
                    var   b  = Prev.LerpTo(Next, tb);

                    FloorEdgeVertexes.Add(new PositionAndUv2(a, b));

                    //	gr: note counter clockwise triangle order
                    AddTriangle(CenterVertex, b, a);
                }
            }
            catch
            {}
        }

        System.Action <PositionAndUv, PositionAndUv> ExtrudeAndAddWallQuad = (Floora, Floorb) =>
        {
            //	make quad
            var Ceilinga = Floora;
            var Ceilingb = Floorb;

            //	do I need to recalculate direction to get proper view vector?
            //	probably, but for reprojection shader, no?
            Ceilinga.Position.y += WallHeight;
            Ceilingb.Position.y += WallHeight;

            AddTriangle(Floorb, Floora, Ceilinga);
            AddTriangle(Floorb, Ceilinga, Ceilingb);
        };

        if (GenerateWalls)
        {
            foreach (var FloorEdge in FloorEdgeVertexes)
            {
                ExtrudeAndAddWallQuad(FloorEdge.a, FloorEdge.b);
            }
        }


        var Mesh = new Mesh();

        Mesh.name = this.name;
        Mesh.SetVertices(Positions);
        Mesh.SetUVs(0, Uv0s);
        Mesh.SetUVs(1, Directions);
        Mesh.SetTriangles(TriangleIndexes.ToArray(), 0);
        return(Mesh);
    }