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(); }
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; }