private static void emitSplat(v2g[] IN, List <g2f> tristream) { v2g v = IN[0]; float xScale = length(v.bitangent); float yScale = length(v.normal); Vector2 vxy = new Vector2(v.vertex.x, v.vertex.y); Vector2 vxz = new Vector2(v.vertex.x, v.vertex.z); Vector2 vzy = new Vector2(v.vertex.z, v.vertex.y); float scale = (0.75f + rand(vxy + Vector2.one * 0.75f) * 0.5f) * (xScale + yScale) * 2; Vector3 right = normalize(new Vector3(rand(vxy + Vector2.one * 0.4f), rand(vxy + Vector2.one * 0.13f), rand(vxy + Vector2.one * 0.8f)) - Vector3.one * 0.5f); Vector3 up = normalize(new Vector3(rand(vxy + Vector2.one * 0.12f), rand(vxy + Vector2.one * 0.124f), rand(vxy + Vector2.one * 0.5807f)) - Vector3.one * 0.5f); Vector3 forward = cross(right, up); right = cross(up, forward); right *= scale; up *= scale; float uvx = 0; //rand(vxy+0.124124) < 0.5 ? 0.0 : 0.5; float uvy = 0; //rand(vxy+0.456345) < 0.5 ? 0.0 : 0.5; float uvsize = 1; v.vertex += (new Vector3(rand(vxy + Vector2.one * 0.1f), rand(vxz + Vector2.one * 4), rand(vzy + Vector2.one * 1)) * 2 - Vector3.one * 1) * (xScale + yScale) * 0.5f; g2f o; o.color = v.color; o.uv = v.uv; o.objNorm = forward; v.vertex += -right * 0.5f + up * 0.5f; o.splatUv = new Vector2(uvx, uvy); o.objPos = v.vertex; tristream.Add(o); v.vertex += right; o.objPos = v.vertex; o.splatUv = new Vector2(uvx + uvsize, uvy); tristream.Add(o); v.vertex += -right - up; o.objPos = v.vertex; o.splatUv = new Vector2(uvx, uvy + uvsize); tristream.Add(o); v.vertex += right; o.objPos = v.vertex; o.splatUv = new Vector2(uvx + uvsize, uvy + uvsize); tristream.Add(o); }
private static void emitCube(v2g[] IN, List <g2f> tristream) { Vector3 startPos = IN[0].vertex; Vector3 rightStart = IN[0].bitangent; Vector3 upStart = IN[0].normal; Vector3 endPos = IN[1].vertex; Vector3 rightEnd = IN[1].bitangent; Vector3 upEnd = IN[1].normal; Vector3[] startVerts = new Vector3[] { startPos - rightStart + upStart, startPos + rightStart + upStart, startPos + rightStart - upStart, startPos - rightStart - upStart, }; Vector3[] endVerts = new Vector3[] { endPos - rightEnd + upEnd, endPos + rightEnd + upEnd, endPos + rightEnd - upEnd, endPos - rightEnd - upEnd, }; v2g v = IN[0]; for (int i = 0; i <= 4; i++) { int index = i == 4 ? 0 : i; { g2f o; o.splatUv = Vector2.zero; o.color = IN[1].color; o.uv = IN[1].uv; o.uv.y = index * 0.25f; v.vertex = endVerts[index]; o.objNorm = v.vertex - endPos; o.objPos = v.vertex; tristream.Add(o); } { g2f o; o.splatUv = Vector2.zero; o.color = IN[0].color; o.uv = IN[0].uv; o.uv.y = index * 0.25f; v.vertex = startVerts[index]; o.objNorm = v.vertex - startPos; o.objPos = v.vertex; tristream.Add(o); } } }
private static v2g vert(Vertex v) { v2g o = new v2g(); o.vertex = v.vertex; o.color = v.color; o.uv = v.uv; float lineWidthScale = 1; // lerp(1, 1.0 / mul(float4(1, 0, 0, 0), unity_ObjectToWorld).x, _ConstantSize); o.normal = v.normal * lineWidthScale; o.tangent = new Vector3(v.tangent.x, v.tangent.y, v.tangent.z); o.bitangent = Vector3.Cross(normalizeOrZero(v.normal), normalizeOrZero(o.tangent)) * v.tangent.w * lineWidthScale; return(o); }
private static void emitSphere(v2g[] IN, List <g2f> tristream) { Vector3 startPos = IN[0].vertex; Vector3 rightStart = IN[0].bitangent; Vector3 upStart = IN[0].normal; Vector3 endPos = IN[1].vertex; Vector3 rightEnd = IN[1].bitangent; Vector3 upEnd = IN[1].normal; Vector3[] startVerts = new Vector3[] { startPos + rightStart * 1 + upStart * 0, startPos + rightStart * 0.707106781f + upStart * 0.707106781f, startPos + rightStart * 0 + upStart * 1, startPos + rightStart * -0.707106781f + upStart * 0.707106781f, startPos + rightStart * -1 + upStart * 0, startPos + rightStart * -0.707106781f + upStart * -0.707106781f, startPos + rightStart * -0 + upStart * -1, startPos + rightStart * 0.707106781f + upStart * -0.707106781f, }; Vector3[] endVerts = { endPos + rightEnd * 1 + upEnd * 0, endPos + rightEnd * 0.707106781f + upEnd * 0.707106781f, endPos + rightEnd * 0 + upEnd * 1, endPos + rightEnd * -0.707106781f + upEnd * 0.707106781f, endPos + rightEnd * -1 + upEnd * 0, endPos + rightEnd * -0.707106781f + upEnd * -0.707106781f, endPos + rightEnd * -0 + upEnd * -1, endPos + rightEnd * 0.707106781f + upEnd * -0.707106781f, }; v2g v = IN[0]; for (int i = 0; i <= 8; i++) { int index = i == 8 ? 0 : i; { g2f o; o.splatUv = Vector2.zero; o.color = IN[1].color; o.uv = IN[1].uv; o.uv.y = index * 0.2f; v.vertex = endVerts[index]; o.objNorm = v.vertex - endPos; o.objPos = v.vertex; tristream.Add(o); } { g2f o; o.splatUv = Vector2.zero; o.color = IN[0].color; o.uv = IN[0].uv; o.uv.y = index * 0.2f; v.vertex = startVerts[index]; o.objNorm = v.vertex - startPos; o.objPos = v.vertex; tristream.Add(o); } } }
//static float _ConstantSize; public static void GeneratePositionData(LineData data, List <Vector3> positions, List <int> indices, List <Vector4> colors) { if (data.Points.Count < 2) { return; } List <TubeRenderer.TubeVertex> tubeVertices = new List <TubeRenderer.TubeVertex>(data.Points.Count); for (int i = 0; i < data.Points.Count; i++) { TubeRenderer.AddPoint(data.Points[i].V3, data.rotations[i].Q, data.widths[i], data.colors[i].C, data.light[i], tubeVertices); } int additionalVertices = data.brushType == BrushType.Sphere ? 8 : 2; int actualVertexCount = data.Points.Count + additionalVertices; List <Vector3> meshVertices = new List <Vector3>(Enumerable.Repeat(default(Vector3), actualVertexCount)); List <Vector4> meshTangents = new List <Vector4>(Enumerable.Repeat(default(Vector4), actualVertexCount)); List <Vector3> meshNormals = new List <Vector3>(Enumerable.Repeat(default(Vector3), actualVertexCount)); List <Vector2> meshUvs = new List <Vector2>(Enumerable.Repeat(default(Vector2), actualVertexCount)); List <Color> meshColors = new List <Color>(Enumerable.Repeat(default(Color), actualVertexCount)); int[] meshIndices = null; TubeRenderer.GenerateMesh(tubeVertices, 0, data.isFlat, data.isWeb, data.brushType, new Vector2(1, data.isFlat ? 0.3f : 1) * 0.5f, meshVertices, meshTangents, meshNormals, meshUvs, meshColors, ref meshIndices, ref _LineLength); _BrushType = (int)data.brushType; _TaperAmountShape = data.taperShape ? 1 : 0; _TaperAmountOpacity = data.taperOpacity ? 1 : 0; _LineCount = data.multiLine ? 12f : 1.0f; List <g2f> tristream = new List <g2f>(meshIndices.Length * 3); for (int l = 0; l < 1; l++) { for (int i = 0; i < meshIndices.Length / 2; i++) { int i1 = meshIndices[i * 2 + 0]; int i2 = meshIndices[i * 2 + 1]; v2g v1 = vert(new Vertex() { vertex = meshVertices[i1], color = meshColors[i1], normal = meshNormals[i1], tangent = meshTangents[i1], uv = meshUvs[i1] }); v2g v2 = vert(new Vertex() { vertex = meshVertices[i2], color = meshColors[i2], normal = meshNormals[i2], tangent = meshTangents[i2], uv = meshUvs[i2] }); v2g[] op = new v2g[2] { v1, v2 }; v2g[] IN = new v2g[2] { v1, domain(op, new Vector2(0, l / _LineCount), _LineCount) }; for (int u = 1; u <= 2; u++) { IN[0] = IN[1]; IN[1] = domain(op, new Vector2(((float)u) / 2, l / _LineCount), _LineCount); geom(IN, tristream); } } if (tristream.Count < 3) { continue; } int strip0 = positions.Count; int strip1 = positions.Count + 1; int strip2 = positions.Count + 2; var pos = tristream[0].objPos; data.transform.ApplyTo(ref pos); positions.Add(pos); colors.Add(tristream[0].color); pos = tristream[1].objPos; data.transform.ApplyTo(ref pos); positions.Add(pos); colors.Add(tristream[1].color); bool flip = _BrushType != 0; for (int i = 2; i < tristream.Count; i++) { if (flip) { indices.Add(strip2); indices.Add(strip1); indices.Add(strip0); } else { indices.Add(strip0); indices.Add(strip1); indices.Add(strip2); } flip = !flip; strip0 = strip1; strip1 = strip2; strip2++; pos = tristream[i].objPos; data.transform.ApplyTo(ref pos); positions.Add(pos); colors.Add(tristream[i].color); } } }