Example #1
0
    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);
    }
Example #2
0
    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);
            }
        }
    }
Example #3
0
    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);
    }
Example #4
0
    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);
            }
        }
    }
Example #5
0
    //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);
            }
        }
    }