private void RenderMesh() { if (advancedParameters.nbSegmentToParametrize == 0) { spline.Parametrize(); } else { spline.Parametrize(spline.NbSegments - advancedParameters.nbSegmentToParametrize, spline.NbSegments); } float length = Mathf.Max(spline.Length() - 0.1f, 0); int nbQuad = ((int)(1f / width * length)) + 1 - quadOffset; if (allocatedNbQuad < nbQuad) //allocate more memory for the mesh { Reallocate(nbQuad); length = Mathf.Max(spline.Length() - 0.1f, 0); nbQuad = ((int)(1f / width * length)) + 1 - quadOffset; } int startingQuad = lastStartingQuad; float lastDistance = startingQuad * width + quadOffset * width; maxInstanciedTriCount = System.Math.Max(maxInstanciedTriCount, (nbQuad - 1) * NbTriIndexPerQuad); Spline.Marker marker = new Spline.Marker(); spline.PlaceMarker(marker, lastDistance); Vector3 lastPosition = spline.GetPosition(marker); Vector3 lastTangent = spline.GetTangent(marker); Vector3 lastBinormal = Spline.CalcBinormal(lastTangent, normal); int drawingEnd = nbQuad - 1; for (int i = startingQuad; i < drawingEnd; i++) { float distance = lastDistance + width; int firstVertexIndex = i * NbVertexPerQuad; int firstTriIndex = i * NbTriIndexPerQuad; spline.MoveMarker(marker, distance); Vector3 position = spline.GetPosition(marker); Vector3 tangent = spline.GetTangent(marker); Vector3 binormal = Spline.CalcBinormal(tangent, normal); float h = FadeMultiplier(lastDistance, length); float rh = h * height; rh = h > 0 ? height : 0; Vector3 pos = lastPosition + (lastTangent * width * -0.5f) - origin; vertices[firstVertexIndex] = transform.InverseTransformPoint(pos + (lastBinormal * (rh * 0.5f))); vertices[firstVertexIndex + 1] = transform.InverseTransformPoint(pos + (-lastBinormal * (rh * 0.5f))); vertices[firstVertexIndex + 2] = transform.InverseTransformPoint(pos + (lastTangent * width) + (lastBinormal * (rh * 0.5f))); vertices[firstVertexIndex + 3] = transform.InverseTransformPoint(pos + (lastTangent * width) + (-lastBinormal * (rh * 0.5f))); uv[firstVertexIndex] = new Vector2(0, 1); uv[firstVertexIndex + 1] = new Vector2(0, 0); uv[firstVertexIndex + 2] = new Vector2(1, 1); uv[firstVertexIndex + 3] = new Vector2(1, 0); triangles[firstTriIndex] = firstVertexIndex; triangles[firstTriIndex + 1] = firstVertexIndex + 1; triangles[firstTriIndex + 2] = firstVertexIndex + 2; triangles[firstTriIndex + 3] = firstVertexIndex + 2; triangles[firstTriIndex + 4] = firstVertexIndex + 1; triangles[firstTriIndex + 5] = firstVertexIndex + 3; lastPosition = position; lastTangent = tangent; lastBinormal = binormal; lastDistance = distance; } for (int i = (nbQuad - 1) * NbTriIndexPerQuad; i < maxInstanciedTriCount; i++) //clear a few tri ahead { triangles[i] = 0; } lastStartingQuad = advancedParameters.lengthToRedraw == 0 ? System.Math.Max(0, nbQuad - ((int)(100 / width) + 5)) : System.Math.Max(0, nbQuad - ((int)(advancedParameters.lengthToRedraw / width) + 5)); mesh.Clear(); mesh.vertices = vertices; mesh.uv = uv; mesh.triangles = triangles; }
private void Awake() { spline = new Spline(); }