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); }
public PositionAndUv2(PositionAndUv a, PositionAndUv b) { this.a = a; this.b = b; }
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); }