UnityMol  0.9.6-875
UnityMol viewer / In developement
PostProcessing.cs
Go to the documentation of this file.
1 using UnityEngine;
2 using System.Collections;
3 using System.Collections.Generic;
4 using System;
5 
6 public class PostProcessing {
7  private static Vector3 CENTER = new Vector3(0f,0f,0f);
8 
24  private static void DuplicateVertices(List<Vector3> vertices, List<Vector3> normals,
25  List<int> triangles, List<Color32> colors) {
26  int nbVertices = vertices.Count; // we need a constant value, can't iterate with <vertices.Count in the loop
27  float displacement = 0.6f;
28  //float displacement = 0.0f;
29 
30 
31  for(int i =0; i<nbVertices; i+=16) {
32  vertices.Add(vertices[i] - displacement * normals[i] );
33  vertices.Add(vertices[i+1] - displacement * normals[i+1] );
34  vertices.Add(vertices[i+2] - displacement * normals[i+2] );
35 
36  vertices.Add(vertices[i+3] - displacement * normals[i+3] );
37  vertices.Add(vertices[i+4] - displacement * normals[i+4] );
38  vertices.Add(vertices[i+5] - displacement * normals[i+5] );
39 
40  vertices.Add(vertices[i+6] - displacement * normals[i+6] );
41  vertices.Add(vertices[i+7] - displacement * normals[i+7] );
42  vertices.Add(vertices[i+8] - displacement * normals[i+8] );
43 
44  vertices.Add(vertices[i+9] - displacement * normals[i+9] );
45  vertices.Add(vertices[i+10] - displacement * normals[i+10] );
46  vertices.Add(vertices[i+11] - displacement * normals[i+11] );
47 
48  vertices.Add(vertices[i+12] - displacement * normals[i] );
49  vertices.Add(vertices[i+13] - displacement * normals[i+1] );
50  vertices.Add(vertices[i+14] - displacement * normals[i+6] );
51  vertices.Add(vertices[i+15] - displacement * normals[i+7] );
52 
53  colors.Add(colors[i]);
54  colors.Add(colors[i+1]);
55  colors.Add(colors[i+2]);
56 
57  colors.Add(colors[i+2]);
58  colors.Add(colors[i+4]);
59  colors.Add(colors[i+5]);
60 
61  colors.Add(colors[i+6]);
62  colors.Add(colors[i+7]);
63  colors.Add(colors[i+8]);
64 
65  colors.Add(colors[i+9]);
66  colors.Add(colors[i+10]);
67  colors.Add(colors[i+11]);
68 
69  colors.Add(colors[i+12]);
70  colors.Add(colors[i+13]);
71  colors.Add(colors[i+14]);
72  colors.Add(colors[i+15]);
73 
74 
75  normals.Add(-normals[i]);
76  normals.Add(-normals[i+1]);
77  normals.Add(-normals[i+2]);
78 
79  normals.Add(-normals[i+3]);
80  normals.Add(-normals[i+4]);
81  normals.Add(-normals[i+5]);
82 
83  normals.Add(-normals[i+6]);
84  normals.Add(-normals[i+7]);
85  normals.Add(-normals[i+8]);
86 
87  normals.Add(-normals[i+9]);
88  normals.Add(-normals[i+10]);
89  normals.Add(-normals[i+11]);
90 
91  // No need to flip those normals
92  normals.Add(normals[i+12]);
93  normals.Add(normals[i+13]);
94  normals.Add(normals[i+14]);
95  normals.Add(normals[i+15]);
96 
97 
98  triangles.Add(nbVertices+i);
99  triangles.Add(nbVertices+i+1);
100  triangles.Add(nbVertices+i+2);
101 
102  triangles.Add(nbVertices+i+3);
103  triangles.Add(nbVertices+i+4);
104  triangles.Add(nbVertices+i+5);
105 
106  triangles.Add(nbVertices+i+6);
107  triangles.Add(nbVertices+i+7);
108  triangles.Add(nbVertices+i+8);
109 
110  triangles.Add(nbVertices+i+9);
111  triangles.Add(nbVertices+i+10);
112  triangles.Add(nbVertices+i+11);
113 
114 
115  triangles.Add(i+12);
116  triangles.Add(i+13);
117  triangles.Add(i+nbVertices+12);
118 
119  triangles.Add(i+nbVertices+12);
120  triangles.Add(i+nbVertices+13);
121  triangles.Add(i+13);
122 
123  triangles.Add(i+nbVertices+14);
124  triangles.Add(i+15);
125  triangles.Add(i+14);
126 
127  triangles.Add(i+nbVertices+14);
128  triangles.Add(i+nbVertices+15);
129  triangles.Add(i+15);
130  }
131  /*
132  for(int i=0; i<nbVertices; i+=12) {
133  triangles.Add(i);
134  triangles.Add(i+1);
135  triangles.Add(i+nbVertices);
136 
137  triangles.Add(i+1);
138  triangles.Add(i+nbVertices+1);
139  triangles.Add(i+nbVertices);
140 
141  triangles.Add(i+nbVertices+6);
142  triangles.Add(i+7);
143  triangles.Add(i+6);
144 
145  triangles.Add(i+nbVertices+6);
146  triangles.Add(i+nbVertices+7);
147  triangles.Add(i+7);
148  }
149  */
150  }
151 
152  private static void SubGenerateMeshes(List<Mesh> meshes, string tag, string gameobj) {
153 
154  foreach(Mesh mesh in meshes) {
155 
156  /*
157  int nbVertices = mesh.vertices.Length;
158  Color32[] colors = new Color32[nbVertices];
159  for(int i=0; i<nbVertices; i++) {
160  colors[i] = new Color32(0,255,0,255);
161  }
162  mesh.colors32 = colors;
163  */
164 
165  GameObject ribbObj = new GameObject(gameobj);
166  ribbObj.tag = tag;
167  ribbObj.AddComponent<MeshFilter>();
168  ribbObj.AddComponent<MeshRenderer>();
169  ribbObj.GetComponent<MeshFilter>().mesh = mesh;
170  ribbObj.GetComponent<Renderer>().material = new Material(Shader.Find("Custom/Ribbons"));
171  ribbObj.transform.position = CENTER;
172  ribbObj.transform.localPosition = CENTER;
174 
175  }
176  }
177 
178  private static void AddFirstFrontalFace(List<Vector3> vertices, List<Vector3> normals,
179  List<int> triangles, List<Color32> colors, int[] ss) {
180  int nbVert = vertices.Count;
181 
182  Vector3 back = (vertices[8] - vertices[7]).normalized;
183 
184  // Duplicating the correct vertices
185 
186  // S1P0_b => + 0
187  vertices.Add(vertices[0]);
188 
189  // CP0_b => + 1
190  vertices.Add(vertices[8]);
191 
192  // S1P0_t => + 2
193  vertices.Add(vertices[3]);
194 
195  // CP0_t => + 3
196  vertices.Add(vertices[11]);
197 
198  // S2P0_b => + 4
199  vertices.Add(vertices[12]);
200 
201  // S2P0_t => + 5
202  vertices.Add(vertices[15]);
203 
204  // Same backwards normal vector for all
205  for(int i=0; i<6; i++) {
206  normals.Add(back);
207  colors.Add(colors[0]);
208  }
209  // Now the triangles
210  // _b == bottom, _t == top
211 
212  // S1P0_b, CP0_b, S1P0_t
213  triangles.Add(nbVert + 0);
214  triangles.Add(nbVert + 1);
215  triangles.Add(nbVert + 2);
216 
217  // CP0_b, S1P0_t, CP0_t
218  triangles.Add(nbVert + 1);
219  triangles.Add(nbVert + 2);
220  triangles.Add(nbVert + 3);
221 
222  // CP0_b, CP0_t, S2P0_t
223  triangles.Add(nbVert + 1);
224  triangles.Add(nbVert + 3);
225  triangles.Add(nbVert + 5);
226 
227  // CP0_b, S2P0_b, S2P0_t
228  triangles.Add(nbVert + 1);
229  triangles.Add(nbVert + 4);
230  triangles.Add(nbVert + 5);
231 
232 
233  }
234 
235  private static void AddLastFrontalFace(List<Vector3> vertices, List<Vector3> normals,
236  List<int> triangles, List<Color32> colors, int[] ss) {
237  int nbVert = vertices.Count;
238 
239  // beginning of last section of last residue
240  // -6 to account for vertices added by previous function
241  int start = nbVert - 32 - 6;
242 
243  Vector3 front = (vertices[7] - vertices[8]).normalized;
244 
245  // Duplicating the correct vertices
246 
247  // S1P1_b => + 0
248  vertices.Add(vertices[start+1]);
249 
250  // CP1_b => + 1
251  vertices.Add(vertices[start+2]);
252 
253  // S1P1_t => + 2
254  vertices.Add(vertices[start+4]);
255 
256  // CP1_t => + 3
257  vertices.Add(vertices[start+5]);
258 
259  // S2P1_b => + 4
260  vertices.Add(vertices[start+13]);
261 
262  // S2P1_t => + 5
263  vertices.Add(vertices[start+16]);
264 
265  // Same backwards normal vector for all
266  for(int i=0; i<6; i++) {
267  normals.Add(front);
268  colors.Add(colors[nbVert - 1 - 6]); // -6 to account for vertices added just before
269  }
270  // Now the triangles
271  // _b == bottom, _t == top
272 
273  // S1P1_b, CP1_b, S1P1_t
274  triangles.Add(nbVert + 0);
275  triangles.Add(nbVert + 1);
276  triangles.Add(nbVert + 2);
277 
278  // CP1_b, S1P1_t, CP1_t
279  triangles.Add(nbVert + 1);
280  triangles.Add(nbVert + 2);
281  triangles.Add(nbVert + 3);
282 
283  // CP1_b, CP1_t, S2P1_t
284  triangles.Add(nbVert + 1);
285  triangles.Add(nbVert + 3);
286  triangles.Add(nbVert + 5);
287 
288  // CP1_b, S2P1_b, S2P1_t
289  triangles.Add(nbVert + 1);
290  triangles.Add(nbVert + 4);
291  triangles.Add(nbVert + 5);
292 
293  }
294 
295 
296  public static void GenerateMeshes(List<Vector3> vertices, List<Vector3> normals,
297  List<int> triangles, List<Color32> colors, int[] ss,
298  string tag="RibbonObj", string gameobj="Ribbons") {
299  // DuplicateVertices(vertices, normals, triangles, colors);
300  tag = Ribbons.ribbontag;
301  AddFirstFrontalFace(vertices, normals, triangles, colors, ss);
302  AddLastFrontalFace(vertices, normals, triangles, colors, ss);
303  MeshData mData = new MeshData();
304 
305 
306  mData.vertices = vertices.ToArray();
307  mData.normals = normals.ToArray();
308  mData.triangles = triangles.ToArray();
309  mData.colors = colors.ToArray();
310 
311  /*
312  for(int i=0; i<mData.vertices.Length; i++) {
313  mData.vertices[i] += Molecule.Model.MoleculeModel.Offset;
314  }
315  */
316 
317  Splitting split = new Splitting();
318  List<Mesh> meshes = split.Split(mData);
319 
320  SubGenerateMeshes(meshes, tag, gameobj);
321  }
322 }
Vector3[] normals
Definition: MeshData.cs:7
static string ribbontag
Definition: Ribbons.cs:18
static void SubGenerateMeshes(List< Mesh > meshes, string tag, string gameobj)
Color32[] colors
Definition: MeshData.cs:8
List< Mesh > Split(MeshData mData)
Definition: Splitting.cs:15
static void AddLastFrontalFace(List< Vector3 > vertices, List< Vector3 > normals, List< int > triangles, List< Color32 > colors, int[] ss)
static void DuplicateVertices(List< Vector3 > vertices, List< Vector3 > normals, List< int > triangles, List< Color32 > colors)
First attempt at making ribbons thick.
int[] triangles
Definition: MeshData.cs:5
Vector3[] vertices
Definition: MeshData.cs:6
static void GenerateMeshes(List< Vector3 > vertices, List< Vector3 > normals, List< int > triangles, List< Color32 > colors, int[] ss, string tag="RibbonObj", string gameobj="Ribbons")
static void AddFirstFrontalFace(List< Vector3 > vertices, List< Vector3 > normals, List< int > triangles, List< Color32 > colors, int[] ss)
static SecondaryStructureManager getSecondaryStructureManager()
Definition: UnityMolMain.cs:34
static Vector3 CENTER