Tanoda
pb_HandleMesh.cs
Go to the documentation of this file.
1using UnityEngine;
2using System.Collections.Generic;
3
4namespace GILES
5{
9 public static class pb_HandleMesh
10 {
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);
14
18 public static Mesh CreatePositionLineMesh(ref Mesh mesh, Transform transform, Vector3 scale, Camera cam, float handleSize)
19 {
20 Vector3 viewDir = pb_HandleUtility.DirectionMask(transform, cam.transform.forward);
21
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>();
27
28 // Right, up, forward lines
29 v.AddRange( new Vector3[] {
30 // Right Axis
31 Vector3.zero,
32 Vector3.right * scale.x,
33
34 // Z Plane
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),
40 Vector3.zero,
41
42 // Up Axis
43 Vector3.zero,
44 Vector3.up * scale.y,
45
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),
50
51 // Forward Axis
52 Vector3.zero,
53 Vector3.forward * scale.z,
54
55 // X Plane
56 Vector3.zero,
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),
63 Vector3.zero
64 });
65
66 c.AddRange( new Color[] {
67 red,
68 red,
69 blue,
70 blue,
71 blue,
72 blue,
73 blue,
74 blue,
75 green,
76 green,
77 green,
78 green,
79 green,
80 green,
81 blue,
82 blue,
83 red,
84 red,
85 red,
86 red,
87 red,
88 red,
89 red,
90 red
91 });
92
93 for(int i = 0; i < v.Count; i++)
94 {
95 n.Add(Vector3.up);
96 u.Add(Vector2.zero);
97 t.Add(i);
98 }
99
100 mesh.Clear();
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();
108
109 return mesh;
110 }
111
115 public static Vector3[][] GetRotationVertices(int segments, float radius)
116 {
117 Vector3[] v_x = new Vector3[segments];
118 Vector3[] v_y = new Vector3[segments];
119 Vector3[] v_z = new Vector3[segments];
120
121 for(int i = 0; i < segments; i++)
122 {
123 float rad = (i/(float)(segments-1)) * 360f * Mathf.Deg2Rad;
124
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;
131 }
132
133 return new Vector3[3][] { v_x, v_y, v_z };
134 }
135
139 public static Mesh CreateRotateMesh(ref Mesh mesh, int segments, float radius)
140 {
141 Vector3[][] verts = GetRotationVertices(segments, radius);
142
143 Vector3[] ver = new Vector3[segments * 3];
144 Vector3[] nrm = new Vector3[segments * 3];
145 Color[] col = new Color[segments * 3];
146 int[] triA = new int[segments];
147 int[] triB = new int[segments];
148 int[] triC = new int[segments];
149
150 int a = 0, b = segments, c = segments + segments;
151
152 for(int i = 0; i < segments; i++)
153 {
154 a = i;
155 b = i + segments;
156 c = i + segments + segments;
157
158 ver[a] = verts[0][i];
159 col[a] = green;
160 nrm[a].x = ver[a].x;
161 nrm[a].z = ver[a].z;
162
163 ver[b] = verts[1][i];
164 col[b] = blue;
165 nrm[b].x = ver[b].x;
166 nrm[b].y = ver[b].y;
167
168 ver[c] = verts[2][i];
169 col[c] = red;
170 nrm[c].z = ver[c].z;
171 nrm[c].y = ver[c].y;
172
173 triA[i] = a;
174 triB[i] = b;
175 triC[i] = c;
176 }
177
178 mesh.Clear();
179 mesh.name = "pb_Handle_ROTATE";
180 mesh.vertices = ver;
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);
186 mesh.colors = col;
187 mesh.normals = nrm;
188
189 return mesh;
190 }
191
195 public static Mesh CreateDiscMesh(ref Mesh mesh, int segments, float radius)
196 {
197 Vector3[] v = new Vector3[segments];
198 Vector3[] n = new Vector3[segments];
199 Vector2[] u = new Vector2[segments];
200 int[] t = new int[segments];
201
202 for(int i = 0; i < segments; i++)
203 {
204 float rad = (i / (float) (segments - 1)) * 360f * Mathf.Deg2Rad;
205 v[i] = new Vector3(Mathf.Cos(rad) * radius, Mathf.Sin(rad) * radius, 0f);
206 n[i] = v[i];
207 u[i] = Vector2.zero;
208 t[i] = i < segments - 1 ? i : 0;
209 }
210
211 mesh.Clear();
212 mesh.name = "Disc";
213 mesh.vertices = v;
214 mesh.uv = u;
215 mesh.normals = n;
216 mesh.subMeshCount = 1;
217 mesh.SetIndices(t, MeshTopology.LineStrip, 0);
218
219 return mesh;
220 }
221
225 public static Mesh CreateTriangleMesh(ref Mesh mesh, Transform transform, Vector3 scale, Camera cam, Mesh cap, float handleSize, float capSize)
226 {
227 Vector3 viewDir = pb_HandleUtility.DirectionMask(transform, cam.transform.forward);
228
229 List<Vector3> v = new List<Vector3>()
230 {
231 // X Axis
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),
236
237 new Vector3(0f, 0f, 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),
241
242 new Vector3(0f, 0f, 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),
246 };
247
248 List<Vector3> nrm = new List<Vector3>()
249 {
250 Vector3.right,
251 Vector3.right,
252 Vector3.right,
253 Vector3.right,
254
255 Vector3.forward,
256 Vector3.forward,
257 Vector3.forward,
258 Vector3.forward,
259
260 Vector3.up,
261 Vector3.up,
262 Vector3.up,
263 Vector3.up
264 };
265
266 Color plane_red = red, plane_blue = blue, plane_green = green;
267 plane_red.a = .25f;
268 plane_green.a = .25f;
269 plane_blue.a = .25f;
270
271 List<Color> c = new List<Color>()
272 {
273 plane_red,
274 plane_red,
275 plane_red,
276 plane_red,
277
278 plane_blue,
279 plane_blue,
280 plane_blue,
281 plane_blue,
282
283 plane_green,
284 plane_green,
285 plane_green,
286 plane_green
287 };
288
289 List<Vector2> u = new List<Vector2>();
290 List<int> t = new List<int>();
291
292 for(int n = 0; n < v.Count; n+=4)
293 {
294 u.Add(Vector2.zero);
295 u.Add(Vector2.zero);
296 u.Add(Vector2.zero);
297 u.Add(Vector2.zero);
298
299 t.Add(n+0);
300 t.Add(n+1);
301 t.Add(n+3);
302 t.Add(n+1);
303 t.Add(n+2);
304 t.Add(n+3);
305 }
306
307 // Now generate caps
308 Vector3[] cv, cn;
309 Vector2[] cu;
310 Color[] cc;
311 int[] ct;
312
313 Matrix4x4 _coneRightMatrix = Matrix4x4.TRS(Vector3.right * scale.x, Quaternion.Euler(90f, 90f, 0f), Vector3.one * capSize);
314 Matrix4x4 _coneUpMatrix = Matrix4x4.TRS(Vector3.up * scale.y, Quaternion.identity, Vector3.one * capSize);
315 Matrix4x4 _coneForwardMatrix = Matrix4x4.TRS(Vector3.forward * scale.z, Quaternion.Euler(90f, 0f, 0f), Vector3.one * capSize);
316
317 List<int> t2 = new List<int>();
318
319 TransformMesh(cap, _coneRightMatrix, out cv, out cn, out cu, out cc, out ct, v.Count, red);
320 v.AddRange(cv);
321 c.AddRange(cc);
322 nrm.AddRange(cn);
323 u.AddRange(cu);
324 t2.AddRange(ct);
325
326 TransformMesh(cap, _coneUpMatrix, out cv, out cn, out cu, out cc, out ct, v.Count,green);
327 v.AddRange(cv);
328 c.AddRange(cc);
329 nrm.AddRange(cn);
330 u.AddRange(cu);
331 t2.AddRange(ct);
332
333 TransformMesh(cap, _coneForwardMatrix, out cv, out cn, out cu, out cc, out ct, v.Count,blue);
334 v.AddRange(cv);
335 c.AddRange(cc);
336 nrm.AddRange(cn);
337 u.AddRange(cu);
338 t2.AddRange(ct);
339
340 mesh.Clear();
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();
348 return mesh;
349 }
350
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)
352 {
353 v = mesh.vertices;
354 n = mesh.normals;
355 u = mesh.uv;
356 c = mesh.colors;
357 t = mesh.triangles;
358
359 color.a = 1f;
360
361 for(int i = 0; i < v.Length; i++)
362 {
363 v[i] = (matrix * v[i]) + matrix.GetColumn(3); // have to add the translation, since the model is at zer0 origin.
364 n[i] = matrix * n[i];
365 c[i] = color;
366 }
367
368 for(int i = 0; i < t.Length; i++)
369 t[i] += indexOffset;
370 }
371
372 }
373}
UnityEngine.Color Color
Definition: TestScript.cs:32