2using System.Collections.Generic;
9 public static class pb_HandleMesh
11 static readonly
Color red =
new Color(.85f, .256f, .16f, 0f);
12 static readonly
Color green =
new Color(.2f, .9f, .2f, 0f);
13 static readonly
Color blue =
new Color(.26f, .56f, .85f, 0f);
18 public static Mesh CreatePositionLineMesh(ref Mesh mesh, Transform transform, Vector3 scale, Camera cam,
float handleSize)
20 Vector3 viewDir = pb_HandleUtility.DirectionMask(transform, cam.transform.forward);
22 List<Vector3> v =
new List<Vector3>();
23 List<Vector3> n =
new List<Vector3>();
24 List<Vector2> u =
new List<Vector2>();
25 List<Color> c =
new List<Color>();
26 List<int> t =
new List<int>();
29 v.AddRange(
new Vector3[] {
35 new Vector3( viewDir.x * 0f, viewDir.y * handleSize, 0f),
36 new Vector3( viewDir.x * handleSize, viewDir.y * handleSize, 0f),
37 new Vector3( viewDir.x * handleSize, viewDir.y * handleSize, 0f),
38 new Vector3( viewDir.x * handleSize, viewDir.y * 0f, 0f),
39 new Vector3( viewDir.x * handleSize, viewDir.y * 0f, 0f),
46 new Vector3( viewDir.x * handleSize, 0f, viewDir.z * 0f),
47 new Vector3( viewDir.x * handleSize, 0f, viewDir.z * handleSize),
48 new Vector3( viewDir.x * handleSize, 0f, viewDir.z * handleSize),
49 new Vector3( viewDir.x * 0f, 0f, viewDir.z * handleSize),
57 new Vector3(0f, viewDir.y * 0f, viewDir.z * handleSize),
58 new Vector3(0f, viewDir.y * 0f, viewDir.z * handleSize),
59 new Vector3(0f, viewDir.y * handleSize, viewDir.z * handleSize),
60 new Vector3(0f, viewDir.y * handleSize, viewDir.z * handleSize),
61 new Vector3(0f, viewDir.y * handleSize, viewDir.z * 0f),
62 new Vector3(0f, viewDir.y * handleSize, viewDir.z * 0f),
66 c.AddRange(
new Color[] {
93 for(
int i = 0; i < v.Count; i++)
101 mesh.name =
"pb_Handle_TRANSLATE";
102 mesh.vertices = v.ToArray();
103 mesh.uv = u.ToArray();
104 mesh.subMeshCount = 1;
105 mesh.SetIndices(t.ToArray(), MeshTopology.Lines, 0);
106 mesh.colors = c.ToArray();
107 mesh.normals = n.ToArray();
115 public static Vector3[][] GetRotationVertices(
int segments,
float radius)
121 for(
int i = 0; i < segments; i++)
123 float rad = (i/(float)(segments-1)) * 360f * Mathf.Deg2Rad;
125 v_x[i].x = Mathf.Cos( rad ) * radius;
126 v_x[i].z = Mathf.Sin( rad ) * radius;
127 v_y[i].x = Mathf.Cos( rad ) * radius;
128 v_y[i].y = Mathf.Sin( rad ) * radius;
129 v_z[i].z = Mathf.Cos( rad ) * radius;
130 v_z[i].y = Mathf.Sin( rad ) * radius;
133 return new Vector3[3][] { v_x, v_y, v_z };
139 public static Mesh CreateRotateMesh(ref Mesh mesh,
int segments,
float radius)
141 Vector3[][] verts = GetRotationVertices(segments, radius);
146 int[] triA =
new int[segments];
147 int[] triB =
new int[segments];
148 int[] triC =
new int[segments];
150 int a = 0, b = segments, c = segments + segments;
152 for(
int i = 0; i < segments; i++)
156 c = i + segments + segments;
158 ver[a] = verts[0][i];
163 ver[b] = verts[1][i];
168 ver[c] = verts[2][i];
179 mesh.name =
"pb_Handle_ROTATE";
181 mesh.uv =
new Vector2[segments * 3];
182 mesh.subMeshCount = 3;
183 mesh.SetIndices(triA, MeshTopology.LineStrip, 0);
184 mesh.SetIndices(triB, MeshTopology.LineStrip, 1);
185 mesh.SetIndices(triC, MeshTopology.LineStrip, 2);
195 public static Mesh CreateDiscMesh(ref Mesh mesh,
int segments,
float radius)
200 int[] t =
new int[segments];
202 for(
int i = 0; i < segments; i++)
204 float rad = (i / (float) (segments - 1)) * 360f * Mathf.Deg2Rad;
205 v[i] =
new Vector3(Mathf.Cos(rad) * radius, Mathf.Sin(rad) * radius, 0f);
208 t[i] = i < segments - 1 ? i : 0;
216 mesh.subMeshCount = 1;
217 mesh.SetIndices(t, MeshTopology.LineStrip, 0);
225 public static Mesh CreateTriangleMesh(ref Mesh mesh, Transform transform, Vector3 scale, Camera cam, Mesh cap,
float handleSize,
float capSize)
227 Vector3 viewDir = pb_HandleUtility.DirectionMask(transform, cam.transform.forward);
229 List<Vector3> v =
new List<Vector3>()
232 new Vector3(0f, viewDir.y * 0f, viewDir.z * 0f),
233 new Vector3(0f, viewDir.y * 0f, viewDir.z * handleSize),
234 new Vector3(0f, viewDir.y * handleSize, viewDir.z * handleSize),
235 new Vector3(0f, viewDir.y * handleSize, viewDir.z * 0f),
238 new Vector3(viewDir.x * handleSize, 0f, 0f),
239 new Vector3(viewDir.x * handleSize, viewDir.y * handleSize, 0f),
240 new Vector3(0f, viewDir.y * handleSize, 0f),
243 new Vector3(0f, 0f, handleSize * viewDir.z),
244 new Vector3(handleSize * viewDir.x, 0f, handleSize * viewDir.z),
245 new Vector3(handleSize * viewDir.x, 0f, 0f),
248 List<Vector3> nrm =
new List<Vector3>()
266 Color plane_red = red, plane_blue = blue, plane_green = green;
268 plane_green.a = .25f;
271 List<Color> c =
new List<Color>()
289 List<Vector2> u =
new List<Vector2>();
290 List<int> t =
new List<int>();
292 for(
int n = 0; n < v.Count; n+=4)
313 Matrix4x4 _coneRightMatrix = Matrix4x4.TRS(
Vector3.right * scale.x,
Quaternion.Euler(90f, 90f, 0f),
Vector3.one * capSize);
315 Matrix4x4 _coneForwardMatrix = Matrix4x4.TRS(
Vector3.forward * scale.z,
Quaternion.Euler(90f, 0f, 0f),
Vector3.one * capSize);
317 List<int> t2 =
new List<int>();
319 TransformMesh(cap, _coneRightMatrix, out cv, out cn, out cu, out cc, out ct, v.Count, red);
326 TransformMesh(cap, _coneUpMatrix, out cv, out cn, out cu, out cc, out ct, v.Count,green);
333 TransformMesh(cap, _coneForwardMatrix, out cv, out cn, out cu, out cc, out ct, v.Count,blue);
341 mesh.subMeshCount = 2;
342 mesh.vertices = v.ToArray();
343 mesh.normals = nrm.ToArray();
344 mesh.uv = u.ToArray();
345 mesh.SetTriangles(t.ToArray(), 0);
346 mesh.SetTriangles(t2.ToArray(), 1);
347 mesh.colors = c.ToArray();
351 public static void TransformMesh(Mesh mesh, Matrix4x4 matrix, out Vector3[] v, out Vector3[] n, out Vector2[] u, out
Color[] c, out
int[] t,
int indexOffset,
Color color)
361 for(
int i = 0; i < v.Length; i++)
363 v[i] = (matrix * v[i]) + matrix.GetColumn(3);
364 n[i] = matrix * n[i];
368 for(
int i = 0; i < t.Length; i++)