233 lines
8.0 KiB
C#
Raw Normal View History

2025-09-08 14:51:28 +08:00
#define Graph_And_Chart_PRO
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
namespace ChartAndGraph
{
/// <summary>
/// This class contains functionallity for generating 3d and 2d bar meshes
/// </summary
class BarMesh
{
private static Mesh m2DStrechMesh;
/// <summary>
/// A lazy loaded 2d stretch mesh. This mesh is always the same
/// </summary>
public static Mesh StrechMesh2D
{
get
{
if (m2DStrechMesh == null)
m2DStrechMesh = Generate2DMesh(1.0f);
return m2DStrechMesh;
}
}
/// <summary>
/// updates the uv of a mesh generated with Generate2DMesh
/// </summary>
/// <param name="m"></param>
/// <param name="maxV"></param>
public static void Update2DMeshUv(Mesh m,float maxV)
{
Vector2[] uv = m.uv;
uv[4] = uv[0] = new Vector2(0f, 0f);
uv[5] = uv[1] = new Vector2(1f, 0f);
uv[6] = uv[2] = new Vector2(1f, maxV);
uv[7] = uv[3] = new Vector2(0f, maxV);
m.uv = uv;
}
/// <summary>
/// generates a 2d bar mesh with the specified maximum V coord. (used with trim material fit)
/// </summary>
/// <param name="maxV"></param>
/// <returns></returns>
public static Mesh Generate2DMesh(float maxV)
{
Vector3[] vertices = new Vector3[8];
Vector2[] uv = new Vector2[8];
int[] tringles = new int[12];
vertices[4] = vertices[0] = new Vector3(-0.5f, 0f, 0f);
vertices[5] = vertices[1] = new Vector3(0.5f, 0f, 0f);
vertices[6] = vertices[2] = new Vector3(0.5f, 1f, 0f);
vertices[7] = vertices[3] = new Vector3(-0.5f, 1f, 0f);
uv[4] = uv[0] = new Vector2(0f, 0f);
uv[5] = uv[1] = new Vector2(1f, 0f);
uv[6] = uv[2] = new Vector2(1f, maxV);
uv[7] = uv[3] = new Vector2(0f, maxV);
WriteRect(tringles, 0, 1, 2, 0, 3, false);
WriteRect(tringles, 2, 5, 6, 4, 7, true);
Mesh mesh = new Mesh();
mesh.hideFlags = HideFlags.DontSave;
mesh.vertices = vertices;
mesh.uv = uv;
mesh.triangles = tringles;
mesh.RecalculateNormals();
return mesh;
}
/// <summary>
/// writes a single rectangle to the tringles array
/// </summary>
/// <param name="tringles"></param>
/// <param name="tringleIndex">this value is multiplied by 3 in order to find the real array index</param>
/// <param name="a"> index of the first vertex</param>
/// <param name="b"> index of the second vertex</param>
/// <param name="c"> index of the third vertex</param>
/// <param name="d"> index of the forth vertex</param>
static void WriteRect(int[] tringles,int tringleIndex,int a,int b,int c,int d,bool flip)
{
if (flip)
{
WriteTringle(tringles, tringleIndex++, a, b, c);
WriteTringle(tringles, tringleIndex, d, c, b);
}
else
{
WriteTringle(tringles, tringleIndex++, c, b, a);
WriteTringle(tringles, tringleIndex, b, c, d);
}
}
/// <summary>
/// writes a single tringle to the tringle array
/// </summary>
/// <param name="tringles"></param>
/// <param name="tringleIndex">this value is multiplied by 3 in order to find the real array index</param>
/// <param name="a">index of the first vertex</param>
/// <param name="b">index of the second vertex</param>
/// <param name="c">index of the third vertex</param>
static void WriteTringle(int[] tringles,int tringleIndex,int a,int b,int c)
{
int index = tringleIndex*3;
tringles[index++] = a;
tringles[index++] = b;
tringles[index++] = c;
}
private static Mesh m3DStretchMesh;
/// <summary>
/// A lazy loaded 3d stretch mesh. This mesh is always the same
/// </summary>
public static Mesh StrechMesh3D
{
get
{
if (m3DStretchMesh == null)
m3DStretchMesh = Generate3DMesh(1.0f);
return m3DStretchMesh;
}
}
/// <summary>
/// updates the uv of a mesh created with Generate3DMesh
/// </summary>
/// <param name="m"></param>
/// <param name="maxV"></param>
public static void Update3DMeshUv(Mesh m, float maxV)
{
Vector2[] uv = m.uv;
uv[0] = new Vector2(0f, 0f);
uv[1] = new Vector2(1f, 0f);
uv[2] = new Vector2(1f, maxV);
uv[3] = new Vector2(0f, maxV);
uv[4] = new Vector2(1f, 0f);
uv[5] = new Vector2(0f, 0f);
uv[6] = new Vector2(0f, maxV);
uv[7] = new Vector2(1f, maxV);
uv[8] = new Vector2(0f, 0f);
uv[9] = new Vector2(1f, 0f);
uv[10] = new Vector2(1f, 1f);
uv[11] = new Vector2(0f, 1f);
uv[12] = new Vector2(1f, 0f);
uv[13] = new Vector2(0f, 0f);
uv[14] = new Vector2(0f, 1f);
uv[15] = new Vector2(1f, 1f); m.uv = uv;
}
/// <summary>
/// generates a 3d bar mesh with the specified maximum V coord. (used with trim material fit)
/// </summary>
/// <param name="maxV"></param>
/// <returns></returns>
public static Mesh Generate3DMesh(float maxV)
{
Vector3[] vertices = new Vector3[16];
Vector2[] uv = new Vector2[16];
int[] tringles = new int[36];
vertices[0] = new Vector3(-0.5f, 0f, -0.5f);
vertices[1] = new Vector3(0.5f, 0f, -0.5f);
vertices[2] = new Vector3(0.5f, 1f, -0.5f);
vertices[3] = new Vector3(-0.5f, 1f, -0.5f);
vertices[4] = new Vector3(-0.5f, 0f, 0.5f);
vertices[5] = new Vector3(0.5f, 0f, 0.5f);
vertices[6] = new Vector3(0.5f, 1f, 0.5f);
vertices[7] = new Vector3(-0.5f, 1f, 0.5f);
vertices[8] = new Vector3(-0.5f, 0f, -0.5f);
vertices[9] = new Vector3(0.5f, 0f, -0.5f);
vertices[10] = new Vector3(0.5f, 1f, -0.5f);
vertices[11] = new Vector3(-0.5f, 1f, -0.5f);
vertices[12] = new Vector3(-0.5f, 0f, 0.5f);
vertices[13] = new Vector3(0.5f, 0f, 0.5f);
vertices[14] = new Vector3(0.5f, 1f, 0.5f);
vertices[15] = new Vector3(-0.5f, 1f, 0.5f);
uv[0] = new Vector2(0f, 0f);
uv[1] = new Vector2(1f, 0f);
uv[2] = new Vector2(1f, maxV);
uv[3] = new Vector2(0f, maxV);
uv[4] = new Vector2(1f, 0f);
uv[5] = new Vector2(0f, 0f);
uv[6] = new Vector2(0f, maxV);
uv[7] = new Vector2(1f, maxV);
uv[8] = new Vector2(0f, 0f);
uv[9] = new Vector2(1f, 0f);
uv[10] = new Vector2(1f, 1f);
uv[11] = new Vector2(0f, 1f);
uv[12] = new Vector2(1f, 0f);
uv[13] = new Vector2(0f, 0f);
uv[14] = new Vector2(0f, 1f);
uv[15] = new Vector2(1f, 1f);
WriteRect(tringles, 0, 1, 2, 0, 3, false);
WriteRect(tringles, 2, 5, 6, 4, 7, true);
WriteRect(tringles, 4, 8, 9, 12, 13, true);
WriteRect(tringles, 6, 10, 11, 14, 15, true);
WriteRect(tringles, 8, 6, 5, 2, 1, true);
WriteRect(tringles, 10, 7, 4, 3, 0, false);
Mesh mesh = new Mesh();
mesh.hideFlags = HideFlags.DontSave;
mesh.vertices = vertices;
mesh.uv = uv;
mesh.triangles = tringles;
mesh.RecalculateNormals();
return mesh;
}
}
}