UnityMol  0.9.6-875
UnityMol viewer / In developement
Quads.cs
Go to the documentation of this file.
1 using System;
2 using UnityEngine;
3 using Object = UnityEngine.Object;
4 
5 // same as Triangles but creates quads instead which generally
6 // saves fillrate at the expense for more triangles to issue
7 namespace UnityStandardAssets.ImageEffects
8 {
9  class Quads
10  {
11  static Mesh[] meshes;
12  static int currentQuads = 0;
13 
14  static bool HasMeshes ()
15  {
16  if (meshes == null)
17  return false;
18  foreach (Mesh m in meshes)
19  if (null == m)
20  return false;
21  return true;
22  }
23 
24 
25  public static void Cleanup ()
26  {
27  if (meshes == null)
28  return;
29 
30  for (int i = 0; i < meshes.Length; i++)
31  {
32  if (null != meshes[i])
33  {
34  Object.DestroyImmediate (meshes[i]);
35  meshes[i] = null;
36  }
37  }
38  meshes = null;
39  }
40 
41 
42  public static Mesh[] GetMeshes ( int totalWidth, int totalHeight)
43  {
44  if (HasMeshes () && (currentQuads == (totalWidth * totalHeight))) {
45  return meshes;
46  }
47 
48  int maxQuads = 65000 / 6;
49  int totalQuads = totalWidth * totalHeight;
50  currentQuads = totalQuads;
51 
52  int meshCount = Mathf.CeilToInt ((1.0f * totalQuads) / (1.0f * maxQuads));
53 
54  meshes = new Mesh [meshCount];
55 
56  int i = 0;
57  int index = 0;
58  for (i = 0; i < totalQuads; i += maxQuads)
59  {
60  int quads = Mathf.FloorToInt (Mathf.Clamp ((totalQuads-i), 0, maxQuads));
61 
62  meshes[index] = GetMesh (quads, i, totalWidth, totalHeight);
63  index++;
64  }
65 
66  return meshes;
67  }
68 
69  static Mesh GetMesh (int triCount, int triOffset, int totalWidth, int totalHeight)
70  {
71  var mesh = new Mesh ();
72  mesh.hideFlags = HideFlags.DontSave;
73 
74  var verts = new Vector3[triCount * 4];
75  var uvs = new Vector2[triCount * 4];
76  var uvs2 = new Vector2[triCount * 4];
77  var tris = new int[triCount * 6];
78 
79  for (int i = 0; i < triCount; i++)
80  {
81  int i4 = i * 4;
82  int i6 = i * 6;
83 
84  int vertexWithOffset = triOffset + i;
85 
86  float x = Mathf.Floor (vertexWithOffset % totalWidth) / totalWidth;
87  float y = Mathf.Floor (vertexWithOffset / totalWidth) / totalHeight;
88 
89  Vector3 position = new Vector3 (x * 2 - 1, y * 2 - 1, 1.0f);
90 
91  verts[i4 + 0] = position;
92  verts[i4 + 1] = position;
93  verts[i4 + 2] = position;
94  verts[i4 + 3] = position;
95 
96  uvs[i4 + 0] = new Vector2 (0.0f, 0.0f);
97  uvs[i4 + 1] = new Vector2 (1.0f, 0.0f);
98  uvs[i4 + 2] = new Vector2 (0.0f, 1.0f);
99  uvs[i4 + 3] = new Vector2 (1.0f, 1.0f);
100 
101  uvs2[i4 + 0] = new Vector2 (x, y);
102  uvs2[i4 + 1] = new Vector2 (x, y);
103  uvs2[i4 + 2] = new Vector2 (x, y);
104  uvs2[i4 + 3] = new Vector2 (x, y);
105 
106  tris[i6 + 0] = i4 + 0;
107  tris[i6 + 1] = i4 + 1;
108  tris[i6 + 2] = i4 + 2;
109 
110  tris[i6 + 3] = i4 + 1;
111  tris[i6 + 4] = i4 + 2;
112  tris[i6 + 5] = i4 + 3;
113 
114  }
115 
116  mesh.vertices = verts;
117  mesh.triangles = tris;
118  mesh.uv = uvs;
119  mesh.uv2 = uvs2;
120 
121  return mesh;
122  }
123 
124  }
125 }
static Mesh[] GetMeshes(int totalWidth, int totalHeight)
Definition: Quads.cs:42
static Mesh GetMesh(int triCount, int triOffset, int totalWidth, int totalHeight)
Definition: Quads.cs:69