public void NewTestScriptSimplePasses() { Curve c = Arc.TryInit(roadPoints[0], roadPoints[1], Mathf.PI / 2); Curve cr = c.reversed(); Assert.True(Algebra.isclose(c.At(0f), cr.At(1f))); float a1 = c.Angle_2d(1f); float a2 = cr.Angle_2d(0f); //float angleDiff = (a2 - a1) / Mathf.PI; Debug.Log(a1); Debug.Log(a2); Assert.True(Algebra.isclose(a2, Mathf.PI / 2)); }
/*create meash for linear rendered 3D object*/ public void CreateMesh(Curve curve, float offset, Material linearMaterial, Material crossMaterial, Polygon cross) { List <Vector2> fragments = cross.toFragments(); int segmentCount = Mathf.CeilToInt(curve.length * curve.maximumCurvature / maxAngleDiff); int base_vcount = (segmentCount + 1) * fragments.Count; int base_tcount = segmentCount * 2 * 3 * fragments.Count; int[] crossTriangles = cross.createMeshTriangle(); int cross_vcount = fragments.Count; int cross_tcount = crossTriangles.Length; Vector2[] crossUVs = cross.createUV(); Vector3[] all_vertices = new Vector3[base_vcount + 2 * cross_vcount]; int[] linear_triangles = new int[base_tcount]; Vector2[] linearUVs = new Vector2[base_vcount]; for (int i = 0; i != segmentCount + 1; ++i) { Vector3 roadPoint = curve.At(1.0f / segmentCount * i); float direction = curve.Angle_2d(1.0f / segmentCount * i) - Mathf.PI / 2; List <Vector3> localFragments = fragments.ConvertAll((input) => roadPoint + Algebra.toVector3(Algebra.twodRotate(Vector2.right * (offset + input.x), direction)) + Vector3.up * input.y); /*stretch Z*/ List <float> cross_y_offset = cross.getVResizeOffset(roadPoint.y); for (int j = 0; j != localFragments.Count; ++j) { localFragments[j] += Vector3.up * cross_y_offset[j]; } float cross_diameter = fragments.Sum((input) => input.magnitude); float partial_diameter = 0f; for (int j = i * cross_vcount, local_j = 0; j != i * cross_vcount + cross_vcount; ++j, ++local_j) { all_vertices[j] = localFragments[local_j]; linearUVs[j] = new Vector2(partial_diameter / cross_diameter, i * 1.0f / segmentCount * curve.length / cross_diameter); partial_diameter += fragments[local_j].magnitude; } } for (int i = 0; i != cross_vcount; ++i) { all_vertices[base_vcount + i] = all_vertices[i]; all_vertices[base_vcount + cross_vcount + i] = all_vertices[base_vcount - cross_vcount + i]; } for (int i = 0, triangle = 0; i != segmentCount; ++i) { for (int j = 0; j != cross_vcount; ++j, triangle += 6) { linear_triangles[triangle] = i * cross_vcount + j; linear_triangles[triangle + 1] = i * cross_vcount + (j + 1) % cross_vcount; linear_triangles[triangle + 2] = (i + 1) * cross_vcount + j; linear_triangles[triangle + 3] = i * cross_vcount + (j + 1) % cross_vcount; linear_triangles[triangle + 4] = (i + 1) * cross_vcount + (j + 1) % cross_vcount; linear_triangles[triangle + 5] = (i + 1) * cross_vcount + j; } } int[] cross_triangles = new int[2 * cross_tcount]; /*Add tris at start*/ for (int j = 0; j != cross_tcount; ++j) { cross_triangles[j] = crossTriangles[j] + base_vcount; } /*Add tris at end*/ for (int j = 0; j != cross_tcount; ++j) { if (j % 3 == 1) { cross_triangles[cross_tcount + j] = crossTriangles[j + 1]; } else { if (j % 3 == 2) { cross_triangles[cross_tcount + j] = crossTriangles[j - 1]; } else { cross_triangles[cross_tcount + j] = crossTriangles[j]; } } cross_triangles[cross_tcount + j] += (base_vcount + cross_vcount); } Vector2[] modifiedCrossUVs = new Vector2[base_vcount + 2 * cross_vcount]; for (int i = 0; i != base_vcount; ++i) { modifiedCrossUVs[i] = linearUVs[i]; } for (int i = 0; i != cross_vcount; ++i) { modifiedCrossUVs[i + base_vcount] = modifiedCrossUVs[i + base_vcount + cross_vcount] = crossUVs[i]; } GetComponent <MeshRenderer>().sharedMaterials = new Material[2] { crossMaterial, linearMaterial }; MeshFilter meshFilter = GetComponent <MeshFilter>(); if (meshFilter.sharedMesh == null) { meshFilter.sharedMesh = new Mesh(); } meshFilter.sharedMesh.subMeshCount = 2; meshFilter.sharedMesh.SetVertices(all_vertices.ToList()); meshFilter.sharedMesh.SetTriangles(cross_triangles, 0); meshFilter.sharedMesh.SetTriangles(linear_triangles, 1); meshFilter.sharedMesh.SetUVs(0, modifiedCrossUVs.ToList()); }