public void Generate(VertexParametrization surfaceVertexParam) { float oneOverResXMinusOne = 1f / (resolutionX - 1f); float oneOverResYMinusOne = 1f / (resolutionY - 1f); for (int y = 0; y < resolutionY; ++y) { float normY = y * oneOverResYMinusOne; for (int x = 0; x < resolutionX; ++x) { float normX = x * oneOverResXMinusOne; Vertex vert = surfaceVertexParam(normX, normY); if (vertices != null) { vertices[vertexOffset] = vert.position; } if (normals != null) { if (autoGenerateNormalsArray) { normals[vertexOffset] = Vector3.Cross( computeSurfaceYDerivative(surfaceVertexParam, normX, normY, vert.position, derivativeResolution), computeSurfaceXDerivative(surfaceVertexParam, normX, normY, vert.position, derivativeResolution) ).normalized; } else { normals[vertexOffset] = vert.normal; } } if (uvs != null) { uvs[vertexOffset] = vert.uv; } if (colors != null) { colors[colorOffset++] = vert.color; } if (indices != null && x < resolutionX - 1 && y < resolutionY - 1) { if (makeClockwiseTriangles) { makeTriangle(vertexOffset, vertexOffset + 1, vertexOffset + resolutionX); makeTriangle(vertexOffset + 1, vertexOffset + resolutionX + 1, vertexOffset + resolutionX); } else { makeTriangle(vertexOffset + resolutionX, vertexOffset + 1, vertexOffset); makeTriangle(vertexOffset + resolutionX, vertexOffset + resolutionX + 1, vertexOffset + 1); } } ++vertexOffset; } } }
private static Vector3 computeSurfaceYDerivative(VertexParametrization surfaceParam, float x, float y, Vector3 surfaceParamOfxy, float h) { return (surfaceParam(x, y + h).position - surfaceParamOfxy) / h; }