private SgtTerrainFace Create(string childName, SgtVector3D cornerBL, SgtVector3D cornerBR, SgtVector3D cornerTL, SgtVector3D cornerTR, SgtVector2D coordBL, SgtVector2D coordBR, SgtVector2D coordTL, SgtVector2D coordTR) { var face = Create(childName, gameObject.layer, transform); face.State = StateType.Invalid; face.Terrain = Terrain; face.Side = Side; face.Depth = Depth + 1; face.CornerBL = cornerBL; face.CornerBR = cornerBR; face.CornerTL = cornerTL; face.CornerTR = cornerTR; face.CoordBL = coordBL; face.CoordBR = coordBR; face.CoordTL = coordTL; face.CoordTR = coordTR; return(face); }
public void BuildData() { var verts = (2 << Terrain.Subdivisions) + 1; var step = 1.0 / (verts - 1); var cornerU = (CornerBR - CornerBL) * step; var cornerV = (CornerTL - CornerBL) * step; var cornerS = SgtVector3D.Cross(cornerU, cornerV).normalized *cornerU.magnitude; var coordU = (CoordBR - CoordBL) * step; var coordV = (CoordTL - CoordBL) * step; ValidateVertices(); Bounds.Clear(); for (var y = 0; y < verts; y++) { var cubeY = CornerBL + cornerV * y; for (var x = 0; x < verts; x++) { var cube = cubeY + cornerU * x; var normal = cube.normalized; var height = Terrain.GetLocalHeight(normal); var position = normal * height; Bounds.Add(position); //if (WriteVertex(x, y) == true) { var index = x + y * verts; var coord1 = CoordBL + coordU * x + coordV * y; var coord2 = new SgtVector2D(x * step, y * step); var tangent = default(SgtVector3D); var color = Color.white; tangent = SgtVector3D.Cross(normal, cornerU).normalized; if (Terrain.OnCalculateColor != null) { Terrain.OnCalculateColor(position, height, ref color); } positions[index] = position; vertices[index] = (Vector3)position; coords1[index] = (Vector2)coord1; coords2[index] = (Vector2)coord2; colors[index] = color; } } } if (Terrain.Normals == SgtTerrain.NormalsType.Normalized) { for (var y = 0; y < verts; y++) { var cubeY = CornerBL + cornerV * y; for (var x = 0; x < verts; x++) { var index = x + y * verts; var cubeA = cubeY + cornerU * x; var cubeB = GetPosition(cubeA, cornerU, cornerS); var normal = cubeA.normalized; var tangent = (Vector3)(cubeB.normalized - normal).normalized; normals1[index] = (Vector3)normal; tangents1[index] = new Vector4(tangent.x, tangent.y, tangent.z, -1.0f); } } } if (Terrain.Normals == SgtTerrain.NormalsType.Hierarchical) { for (var y = 0; y < verts; y++) { var cubeY = CornerBL + cornerV * y; for (var x = 0; x < verts; x++) { var index = x + y * verts; var cube = cubeY + cornerU * x; // Get position from vertex or recalc off edge var positionL = x == 0 ? GetPosition(cube, -cornerU, cornerS) : positions[index - 1]; var positionR = x == verts - 1 ? GetPosition(cube, cornerU, cornerS) : positions[index + 1]; var positionB = y == 0 ? GetPosition(cube, -cornerV, cornerS) : positions[index - verts]; var positionT = y == verts - 1 ? GetPosition(cube, cornerV, cornerS) : positions[index + verts]; // Calc normal and tangent var positionH = positionR - positionL; var positionV = positionT - positionB; var normal = SgtVector3D.Cross(positionV, positionH).normalized; var tangent = (Vector3)positionH.normalized; normals1[index] = normals2[index] = (Vector3)normal; tangents1[index] = tangents2[index] = new Vector4(tangent.x, tangent.y, tangent.z, -1.0f); } } } if (Terrain.OnPostProcessVertices != null) { Terrain.OnPostProcessVertices(this); } if (Split == true) { CopyVertiesToChildren(); } }