Exemple #1
0
    void Start()
    {
        var path = Path.Combine(Application.dataPath, fontDataPath);

        if (File.Exists(path))
        {
            var source = File.ReadAllText(path);

            fontData = JsonConvert.DeserializeObject <MSDFFontData>(source);

            MeshInfo info = MSDFTextMesh.GetMeshInfo("hello", fontData, true);
            Debug.Log(info.uvs.Length);
        }

        //numTextGroups = GetTextGroupCount();

        textSettings = new TextSettings[1];

        var text = "";

        for (var i = 0; i < textSettings.Length; ++i)
        {
            text            = quotes[Random.Range(0, quotes.Count)];
            textSettings[i] = new TextSettings(text, MSDFTextMesh.GetMeshInfo(text, fontData, true));
        }

        instanceMesh = CreateMesh();

        instanceMaterial = new Material(Shader.Find("Unlit/InstanceShader"));
        instanceMaterial.SetColor("_Color", Random.ColorHSV());
        instanceMaterial.SetTexture("_MainTex", msdfTexture);

        argsBuffer = new ComputeBuffer(1, args.Length * sizeof(uint), ComputeBufferType.IndirectArguments);
        UpdateBuffers();
    }
Exemple #2
0
    void UpdateBuffers()
    {
        // Ensure submesh index is in range
        if (instanceMesh != null)
        {
            subMeshIndex = Mathf.Clamp(subMeshIndex, 0, instanceMesh.subMeshCount - 1);
        }

        // Transform Matrix
        if (transformDataBuffer != null)
        {
            transformDataBuffer.Release();
        }

        // Colors
        if (colorBuffer != null)
        {
            colorBuffer.Release();
        }

        numTextGroups = GetTextGroupCount();

        var oldLength = textSettings.Length;

        Array.Resize(ref textSettings, numTextGroups);

        var text = "";

        if (oldLength < textSettings.Length)
        {
            for (var i = oldLength; i < textSettings.Length; ++i)
            {
                text            = quotes[Random.Range(0, quotes.Count)];
                textSettings[i] = new TextSettings(text, MSDFTextMesh.GetMeshInfo(text, fontData, true));
            }
        }

        transformDataBuffer = new ComputeBuffer(instanceCount, 56);
        colorBuffer         = new ComputeBuffer(instanceCount, 16);

        TransformData[] transformData = new TransformData[instanceCount];
        Color[]         colors        = new Color[instanceCount];

        Vector3 center = Random.insideUnitSphere * sphereScale;
        Vector3 offset = Vector3.zero;

        for (var i = 0; i < numTextGroups; ++i)
        {
            var uvIndex     = 0;
            var vertexIndex = 0;

            center = Random.insideUnitSphere * sphereScale;
            offset.Set(textSettings[i].meshInfo.width * 0.5f, 0f, 0f);

            for (int j = 0; j < MAX_TEXT_LENGTH; ++j)
            {
                var index = (i * MAX_TEXT_LENGTH) + j;

                var tl = textSettings[i].meshInfo.positions[vertexIndex + 0];
                var br = textSettings[i].meshInfo.positions[vertexIndex + 2];
                var x  = tl.x + (br.x - tl.x) * 0.5f;
                var y  = tl.y + (br.y - tl.y) * 0.5f;
                var w  = Mathf.Abs(br.x - tl.x);
                var h  = Mathf.Abs(br.y - tl.y);
                //Debug.Log($"{textSettings[i].text[vertexIndex / 4]} : tl = {tl.x}, {tl.y}, bl = {bl.x}, {bl.y}, br = {br.x}, {br.y}, tr = {tr.x}, {tr.y}, x = {x}, y = {y}");

                var max      = textSettings[i].meshInfo.uvs[uvIndex + 3];
                var min      = textSettings[i].meshInfo.uvs[uvIndex + 1];
                var uvScale  = max - min;
                var uvOffset = min;

                transformData[index] = new TransformData(
                    center - offset + new Vector3(x, y, j * 0.0001f),
                    new Vector3(w * 0.5f, h * 0.5f, 1f),
                    new Vector3(Random.Range(-Mathf.PI, Mathf.PI), 0f, 0f),
                    uvOffset,
                    uvScale,
                    j < textSettings[i].text.Length ? 1 : 0);

                colors[index] = Random.ColorHSV();

                uvIndex     = Mathf.Min(uvIndex + 4, textSettings[i].meshInfo.uvs.Length - 4);
                vertexIndex = Mathf.Min(vertexIndex + 4, textSettings[i].meshInfo.positions.Length - 4);
            }
        }


        transformDataBuffer.SetData(transformData);
        colorBuffer.SetData(colors);

        instanceMaterial.SetBuffer("transformDataBuffer", transformDataBuffer);
        instanceMaterial.SetBuffer("colorBuffer", colorBuffer);

        // Indirect args
        if (instanceMesh != null)
        {
            args[0] = (uint)instanceMesh.GetIndexCount(subMeshIndex);
            args[1] = (uint)instanceCount;
            args[2] = (uint)instanceMesh.GetIndexStart(subMeshIndex);
            args[3] = (uint)instanceMesh.GetBaseVertex(subMeshIndex);
        }
        else
        {
            args[0] = args[1] = args[2] = args[3] = 0;
        }

        argsBuffer.SetData(args);

        cachedInstanceCount = instanceCount;
        cachedSubMeshIndex  = subMeshIndex;
    }