2 using System.Collections;
3 using System.Collections.Generic;
7 public MeshFilter stackOfSlices;
13 PatientEventSystem.startListening( PatientEventSystem.Event.DICOM_NewLoadedVolume, eventDisplayCurrentDicom );
14 PatientEventSystem.startListening( PatientEventSystem.Event.PATIENT_Closed, eventClear );
15 PatientEventSystem.startListening( PatientEventSystem.Event.DICOM_CloseVolume, eventClear );
24 PatientEventSystem.stopListening( PatientEventSystem.Event.DICOM_NewLoadedVolume, eventDisplayCurrentDicom );
25 PatientEventSystem.stopListening( PatientEventSystem.Event.PATIENT_Closed, eventClear );
26 PatientEventSystem.stopListening( PatientEventSystem.Event.DICOM_CloseVolume, eventClear );
35 List<Vector3> verts =
new List<Vector3> ();
36 List<int> tris =
new List<int>();
37 List<Vector2> uvs =
new List<Vector2>();
38 List<Vector3> normals =
new List<Vector3> ();
40 int vertsAlreadyAdded = 0;
44 float sliceDelta = 1f / (float)numSlices;
45 normal =
new Vector3 (0, 0, 1);
46 vertsAlreadyAdded = verts.Count;
47 for (
int slice = 0; slice < numSlices; slice ++) {
48 Vector3 vert1 =
new Vector3 (-1, -1, -1 + 2f*(
float)(slice+0.5f)*sliceDelta);
49 Vector3 vert2 =
new Vector3 (-1, 1, -1 + 2f*(
float)(slice+0.5f)*sliceDelta);
50 Vector3 vert3 =
new Vector3 (1, -1, -1 + 2f*(
float)(slice+0.5f)*sliceDelta);
51 Vector3 vert4 =
new Vector3 (1, 1, -1 + 2f*(
float)(slice+0.5f)*sliceDelta);
63 tris.Add (vertsAlreadyAdded + slice*4 + 2);
64 tris.Add (vertsAlreadyAdded + slice*4 + 1);
65 tris.Add (vertsAlreadyAdded + slice*4 + 0);
67 tris.Add (vertsAlreadyAdded + slice*4 + 2);
68 tris.Add (vertsAlreadyAdded + slice*4 + 3);
69 tris.Add (vertsAlreadyAdded + slice*4 + 1);
71 vertsAlreadyAdded = verts.Count;
72 for (
int slice = 0; slice < numSlices; slice ++) {
73 Vector3 vert1 =
new Vector3 (-1, -1, 1 - 2f*(
float)(slice+0.5f)*sliceDelta);
74 Vector3 vert2 =
new Vector3 (-1, 1, 1 - 2f*(
float)(slice+0.5f)*sliceDelta);
75 Vector3 vert3 =
new Vector3 (1, -1, 1 - 2f*(
float)(slice+0.5f)*sliceDelta);
76 Vector3 vert4 =
new Vector3 (1, 1, 1 - 2f*(
float)(slice+0.5f)*sliceDelta);
83 normals.Add (-normal);
84 normals.Add (-normal);
85 normals.Add (-normal);
86 normals.Add (-normal);
88 tris.Add (vertsAlreadyAdded + slice*4 + 0);
89 tris.Add (vertsAlreadyAdded + slice*4 + 1);
90 tris.Add (vertsAlreadyAdded + slice*4 + 2);
92 tris.Add (vertsAlreadyAdded + slice*4 + 1);
93 tris.Add (vertsAlreadyAdded + slice*4 + 3);
94 tris.Add (vertsAlreadyAdded + slice*4 + 2);
97 normal =
new Vector3 (0, 1, 0);
98 vertsAlreadyAdded = verts.Count;
99 for (
int slice = 0; slice < numSlices; slice ++) {
100 Vector3 vert1 =
new Vector3 (-1, -1 + 2f*(
float)(slice+0.5f)*sliceDelta, -1);
101 Vector3 vert2 =
new Vector3 (-1, -1 + 2f*(
float)(slice+0.5f)*sliceDelta, 1);
102 Vector3 vert3 =
new Vector3 (1, -1 + 2f*(
float)(slice+0.5f)*sliceDelta, -1);
103 Vector3 vert4 =
new Vector3 (1, -1 + 2f*(
float)(slice+0.5f)*sliceDelta, 1);
110 normals.Add (normal);
111 normals.Add (normal);
112 normals.Add (normal);
113 normals.Add (normal);
116 tris.Add (vertsAlreadyAdded + slice*4 + 0);
117 tris.Add (vertsAlreadyAdded + slice*4 + 1);
118 tris.Add (vertsAlreadyAdded + slice*4 + 2);
120 tris.Add (vertsAlreadyAdded + slice*4 + 1);
121 tris.Add (vertsAlreadyAdded + slice*4 + 3);
122 tris.Add (vertsAlreadyAdded + slice*4 + 2);
125 vertsAlreadyAdded = verts.Count;
126 for (
int slice = 0; slice < numSlices; slice ++) {
127 Vector3 vert1 =
new Vector3 (-1, 1 - 2f*(
float)(slice+0.5f)*sliceDelta, -1);
128 Vector3 vert2 =
new Vector3 (-1, 1 - 2f*(
float)(slice+0.5f)*sliceDelta, 1);
129 Vector3 vert3 =
new Vector3 (1, 1 - 2f*(
float)(slice+0.5f)*sliceDelta, -1);
130 Vector3 vert4 =
new Vector3 (1, 1 - 2f*(
float)(slice+0.5f)*sliceDelta, 1);
137 normals.Add (-normal);
138 normals.Add (-normal);
139 normals.Add (-normal);
140 normals.Add (-normal);
142 tris.Add (vertsAlreadyAdded + slice*4 + 2);
143 tris.Add (vertsAlreadyAdded + slice*4 + 1);
144 tris.Add (vertsAlreadyAdded + slice*4 + 0);
146 tris.Add (vertsAlreadyAdded + slice*4 + 2);
147 tris.Add (vertsAlreadyAdded + slice*4 + 3);
148 tris.Add (vertsAlreadyAdded + slice*4 + 1);
151 normal =
new Vector3 (1, 0, 0);
152 vertsAlreadyAdded = verts.Count;
153 for (
int slice = 0; slice < numSlices; slice ++) {
154 Vector3 vert1 =
new Vector3 (-1 + 2f*(
float)(slice+0.5f)*sliceDelta, -1, -1);
155 Vector3 vert2 =
new Vector3 (-1 + 2f*(
float)(slice+0.5f)*sliceDelta, -1, 1);
156 Vector3 vert3 =
new Vector3 (-1 + 2f*(
float)(slice+0.5f)*sliceDelta, 1, -1);
157 Vector3 vert4 =
new Vector3 (-1 + 2f*(
float)(slice+0.5f)*sliceDelta, 1, 1);
164 normals.Add (normal);
165 normals.Add (normal);
166 normals.Add (normal);
167 normals.Add (normal);
169 tris.Add (vertsAlreadyAdded + slice*4 + 2);
170 tris.Add (vertsAlreadyAdded + slice*4 + 1);
171 tris.Add (vertsAlreadyAdded + slice*4 + 0);
173 tris.Add (vertsAlreadyAdded + slice*4 + 2);
174 tris.Add (vertsAlreadyAdded + slice*4 + 3);
175 tris.Add (vertsAlreadyAdded + slice*4 + 1);
177 vertsAlreadyAdded = verts.Count;
178 for (
int slice = 0; slice < numSlices; slice ++) {
179 Vector3 vert1 =
new Vector3 (1 - 2f*(
float)(slice+0.5f)*sliceDelta, -1, -1);
180 Vector3 vert2 =
new Vector3 (1 - 2f*(
float)(slice+0.5f)*sliceDelta, -1, 1);
181 Vector3 vert3 =
new Vector3 (1 - 2f*(
float)(slice+0.5f)*sliceDelta, 1, -1);
182 Vector3 vert4 =
new Vector3 (1 - 2f*(
float)(slice+0.5f)*sliceDelta, 1, 1);
189 normals.Add (-normal);
190 normals.Add (-normal);
191 normals.Add (-normal);
192 normals.Add (-normal);
194 tris.Add (vertsAlreadyAdded + slice*4 + 0);
195 tris.Add (vertsAlreadyAdded + slice*4 + 1);
196 tris.Add (vertsAlreadyAdded + slice*4 + 2);
198 tris.Add (vertsAlreadyAdded + slice*4 + 1);
199 tris.Add (vertsAlreadyAdded + slice*4 + 3);
200 tris.Add (vertsAlreadyAdded + slice*4 + 2);
204 Mesh ret =
new Mesh();
205 ret.vertices = verts.ToArray();
206 ret.triangles = tris.ToArray();
207 ret.normals = normals.ToArray();
208 ret.uv = uvs.ToArray();
211 ret.RecalculateBounds();
213 stackOfSlices.mesh = ret;
219 Material mat = GetComponent<MeshRenderer> ().sharedMaterial;
223 mat.mainTexture = dicom.getTexture3D();
224 mat.SetVector (
"textureSize",
new Vector3 (dicom.texWidth, dicom.texHeight, dicom.texDepth));
233 Vector3 goalSize = dicom.boundingBox.size;
235 Vector3 goalCenter = dicom.boundingBox.center;
237 Vector3 minMesh =
new Vector3 (-1, -1, -1);
238 Vector3 maxMesh =
new Vector3 (1, 1, 1);
239 Vector3 meshSize = maxMesh - minMesh;
242 Vector3 paddingFactor =
new Vector3 (
248 Vector3 paddedMeshSize = Vector3.Scale (paddingFactor, meshSize);
251 Vector3 meshCenter = minMesh + paddedMeshSize*0.5f;
253 Vector3 meshCenterOffset = Vector3.zero - meshCenter;
256 Vector3 invPaddedMeshSize =
new Vector3 (1f / paddedMeshSize.x, 1f / paddedMeshSize.y, 1f / paddedMeshSize.z);
258 Vector3 scale = Vector3.Scale (goalSize, invPaddedMeshSize);
259 transform.localScale = scale;
261 transform.localPosition = goalCenter + Vector3.Scale (meshCenterOffset, scale);
267 void eventDisplayCurrentDicom(
object obj = null )
269 DICOM3D dicom = DICOMLoader.instance.currentDICOMVolume;
272 GetComponent<MeshRenderer> ().enabled =
true;
276 void eventClear(
object obj = null )
278 GetComponent<MeshRenderer> ().enabled =
false;
void SetDicom(DICOM3D dicom)