Blame view

stim/gl/gl_spider.h 46.7 KB
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
1
2
3
  #ifndef STIM_GL_SPIDER_H
  #define STIM_GL_SPIDER_H
  
a9b45efe   Pavel Govyadinov   changes to spider
4
  #include <GL/glew.h>
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
5
  #include <GL/glut.h>
a9b45efe   Pavel Govyadinov   changes to spider
6
7
8
  #include <cuda.h>
  #include <cuda_gl_interop.h>
  #include <cudaGL.h>
1a456186   Pavel Govyadinov   Added directional...
9
  #include <math.h>
7d3162a2   Pavel Govyadinov   fixed majority of...
10
11
12
13
14
15
16
17
  #include <stim/gl/gl_texture.h>
  #include <stim/visualization/camera.h>
  #include <stim/gl/error.h>
  #include <stim/math/vector.h>
  #include <stim/math/vec3.h>
  #include <stim/math/rect.h>
  #include <stim/math/matrix.h>
  #include <stim/cuda/spider_cost.cuh>
7d1d153a   Pavel Govyadinov   fixed the include...
18
  #include <stim/cuda/cudatools/glbind.h>
84eff8b1   Pavel Govyadinov   Merged only the n...
19
20
21
22
  #include <stim/cuda/arraymath.cuh>
  #include <stim/cuda/cudatools.h>
  #include <stim/cuda/ivote.cuh>
  #include <stim/visualization/glObj.h>
385d2447   Pavel Govyadinov   Checkpoint: Conve...
23
  #include <vector>
84eff8b1   Pavel Govyadinov   Merged only the n...
24
  #include <stim/cuda/branch_detection.cuh>
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
25
  #include "../../../volume-spider/fiber.h"
23af8e36   Pavel Govyadinov   modified spider t...
26
  #include "../../../volume-spider/glnetwork.h"
e45b97ce   Pavel Govyadinov   safety commit, I ...
27
  #include <stim/visualization/cylinder.h>
c0e09133   Pavel Govyadinov   STABLE: made temp...
28
  #include <stim/cuda/testKernel.cuh>
84eff8b1   Pavel Govyadinov   Merged only the n...
29
30
  
  //#include <stim/cuda/testKernel.cuh>
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
31
  
42145f38   Pavel Govyadinov   Fixed the issues ...
32
33
  #include <iostream>
  #include <fstream>
efe7b7cc   Pavel Govyadinov   Added a detailed ...
34
35
36
37
38
  #ifdef TIMING
  	#include <ctime>
  	#include <cstdio>	
  #endif
  
84eff8b1   Pavel Govyadinov   Merged only the n...
39
40
41
42
43
  #ifdef TESTING
  	#include <iostream>
  	#include <cstdio>
  	#include <ctime>
  #endif
42145f38   Pavel Govyadinov   Fixed the issues ...
44
  
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
45
  
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
46
47
48
49
  namespace stim
  {
  
  template<typename T>
84eff8b1   Pavel Govyadinov   Merged only the n...
50
  class gl_spider : public virtual gl_texture<T>
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
51
52
  {
  	//doen't use gl_texture really, just needs the GLuint id.
4cefeb6d   Pavel Govyadinov   Changes to the re...
53
  	//doesn't even need the texture iD really.
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
54
  	private:
84eff8b1   Pavel Govyadinov   Merged only the n...
55
  
efe7b7cc   Pavel Govyadinov   Added a detailed ...
56
57
58
59
60
61
62
63
64
65
  		#ifdef TIMING
  			double branch_time = 0;
  			double direction_time = 0;
  			double position_time = 0;
  			double size_time = 0;
  			double cost_time = 0;
  			double network_time = 0;
  			double hit_time = 0;
  		#endif
  
84eff8b1   Pavel Govyadinov   Merged only the n...
66
  		//
7d3162a2   Pavel Govyadinov   fixed majority of...
67
68
  		stim::vec3<float> p;  	//vector designating the position of the spider.
  		stim::vec3<float> d;	//vector designating the orientation of the spider
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
69
  						//always a unit vector.
4fa3f483   Pavel Govyadinov   Fixed the memory ...
70
  		stim::vec<float> m;	//magnitude of the spider vector.
4cefeb6d   Pavel Govyadinov   Changes to the re...
71
72
  						//mag[0] = length.
  						//mag[1] = width.
7d3162a2   Pavel Govyadinov   fixed majority of...
73
74
75
  		std::vector<stim::vec3<float> > dV;	//A list of all the direction vectors.
  		std::vector<stim::vec3<float> > pV;	//A list of all the position vectors.
  		std::vector<stim::vec3<float> > mV;	//A list of all the size vectors.
84eff8b1   Pavel Govyadinov   Merged only the n...
76
77
78
  
  		stim::matrix<float, 4> cT;		//current Transformation matrix
  							//From tissue space to texture space.
8e56a0a7   Pavel Govyadinov   Added the propose...
79
  		GLuint texID;
84eff8b1   Pavel Govyadinov   Merged only the n...
80
81
82
83
84
85
86
87
88
  		stim::vec<float> S;			//Size of a voxel in the volume.
  		stim::vec<float> R;			//Dimensions of the volume.
  
  
  		//GL and Cuda variables
  		GLuint dList;				//displaylist ID
  		GLuint fboID;				//framebuffer ID
  		GLuint texbufferID;			//texbuffer ID, only necessary for 
  							//cuda aspect of the calculation.
6b8621f8   Pavel Govyadinov   stable version
89
90
  		GLuint pfboID;				//buffer object for position tracking.
  		GLuint ptexbufferID;			//texture object for position tracking.
1306fd96   Pavel Govyadinov   minor bug fixes i...
91
  
6b8621f8   Pavel Govyadinov   stable version
92
93
  		GLuint mfboID;				//buffer object for magnitude adjustment.
  		GLuint mtexbufferID;			//texture object for magnitude adjustment.
035d798f   Pavel Govyadinov   modified the spid...
94
  		GLuint bfboID;				//buffer object for position adjustment.
6b8621f8   Pavel Govyadinov   stable version
95
  		GLuint btexbufferID;			//buffer object for position adjustment.
1306fd96   Pavel Govyadinov   minor bug fixes i...
96
  
84eff8b1   Pavel Govyadinov   Merged only the n...
97
  		int numSamples;				//The number of templates in the buffer.
035d798f   Pavel Govyadinov   modified the spid...
98
99
100
  		int numSamplesPos;
  		int numSamplesMag;
  
d06d3dbd   Pavel Govyadinov   stable, pre-major...
101
102
  		float stepsize = 5.0;			//Step size.
  //		float stepsize = 3.0;			//Step size.
6b8621f8   Pavel Govyadinov   stable version
103
  		int current_cost;			//variable to store the cost of the current step.
84eff8b1   Pavel Govyadinov   Merged only the n...
104
105
106
  		
  		
  		//Tracing variables.
7d3162a2   Pavel Govyadinov   fixed majority of...
107
108
  		std::stack< stim::vec3<float> > seeds;		//seed positions.
  		std::stack< stim::vec3<float> > seedsvecs;	//seed directions.
6b8621f8   Pavel Govyadinov   stable version
109
110
  		std::stack< float > 		seedsmags;	//seed magnitudes.
  
7d3162a2   Pavel Govyadinov   fixed majority of...
111
112
  		std::vector< stim::vec3<float> > cL;	//Positions of line currently being traced.
  		std::vector< stim::vec3<float> > cD;	//Direction of line currently being traced.
6b8621f8   Pavel Govyadinov   stable version
113
  		std::vector< stim::vec<float> > cM;	//Magnitude of line currently being traced.
23af8e36   Pavel Govyadinov   modified spider t...
114
  
6b8621f8   Pavel Govyadinov   stable version
115
  		stim::glnetwork<float> nt;		//object for storing the network.
23af8e36   Pavel Govyadinov   modified spider t...
116
  
84eff8b1   Pavel Govyadinov   Merged only the n...
117
118
  		stim::vec<float> rev;			//reverse vector;
  		stim::camera camSel;
7d3162a2   Pavel Govyadinov   fixed majority of...
119
120
121
  		stim::vec3<float> ps;
  		stim::vec3<float> ups;
  		stim::vec3<float> ds;
c0e09133   Pavel Govyadinov   STABLE: made temp...
122
123
  
  		static const float t_length = 16.0;
84eff8b1   Pavel Govyadinov   Merged only the n...
124
125
  		
  
6b8621f8   Pavel Govyadinov   stable version
126
127
128
129
  //--------------------------------------------------------------------------//
  //-------------------------------PRIVATE METHODS----------------------------//
  //--------------------------------------------------------------------------//
  
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
130
131
132
133
134
135
  		/// Method for finding the best scale for the spider.
  		/// changes the x, y, z size of the spider to minimize the cost
  		/// function. 
  		void
  		findOptimalDirection()
  		{
efe7b7cc   Pavel Govyadinov   Added a detailed ...
136
137
138
  			#ifdef TIMING
  				gpuStartTimer();
  			#endif
ac430567   Pavel Govyadinov   comments comments...
139
140
  			setMatrix();			//create the transformation matrix.
  			glCallList(dList);		//move the templates to p, d, m.
efe7b7cc   Pavel Govyadinov   Added a detailed ...
141
142
143
144
  			glFlush();
  			#ifdef TIMING
  				direction_time += gpuStopTimer();
  			#endif
c0e09133   Pavel Govyadinov   STABLE: made temp...
145
  			#ifdef TESTING
efe7b7cc   Pavel Govyadinov   Added a detailed ...
146
  //				test(texbufferID, GL_TEXTURE_2D,2*t_length,numSamples*t_length, "Final_Cost_Direction.bmp");
c0e09133   Pavel Govyadinov   STABLE: made temp...
147
  			#endif
efe7b7cc   Pavel Govyadinov   Added a detailed ...
148
  
035d798f   Pavel Govyadinov   modified the spid...
149
  			int best = getCost(texbufferID,numSamples);		//find min cost.
ac430567   Pavel Govyadinov   comments comments...
150
  			stim::vec<float> next(		//find next vector.
c0e09133   Pavel Govyadinov   STABLE: made temp...
151
  			dV[best][0]*S[0]*R[0],
5eeaf941   Pavel Govyadinov   changer to the ba...
152
153
  			dV[best][1]*S[1]*R[1],
  			dV[best][2]*S[2]*R[2],
d4721000   Pavel Govyadinov   changes with debu...
154
  			0);
ac430567   Pavel Govyadinov   comments comments...
155
  			next = (cT*next).norm();	//find next vector.
8e56a0a7   Pavel Govyadinov   Added the propose...
156
157
158
  			setPosition(	p[0]+next[0]*m[0]/stepsize,
  					p[1]+next[1]*m[0]/stepsize,
  					p[2]+next[2]*m[0]/stepsize);
556c4e15   Pavel Govyadinov   Changed the handl...
159
  			setDirection(next[0], next[1], next[2]);
ac430567   Pavel Govyadinov   comments comments...
160
  							//move forward and change direction.
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
161
162
  		}
  
6b8621f8   Pavel Govyadinov   stable version
163
164
  		/// Method for finding the best d (direction) for the spider.
  		/// Not sure if necessary since the next p (position) for the spider
8e56a0a7   Pavel Govyadinov   Added the propose...
165
  		/// will be at d * m.
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
166
167
168
  		void
  		findOptimalPosition()
  		{
efe7b7cc   Pavel Govyadinov   Added a detailed ...
169
170
171
  			#ifdef TIMING
  				gpuStartTimer();
  			#endif
ac430567   Pavel Govyadinov   comments comments...
172
173
  			setMatrix();			//create the transformation matrix.
  			glCallList(dList+1);		//move the templates to p, d, m.
efe7b7cc   Pavel Govyadinov   Added a detailed ...
174
175
176
177
178
  			glFlush();
  			#ifdef TIMING
  				position_time += gpuStopTimer();
  			#endif
  
c0e09133   Pavel Govyadinov   STABLE: made temp...
179
  			#ifdef TESTING
efe7b7cc   Pavel Govyadinov   Added a detailed ...
180
  //				test(ptexbufferID, GL_TEXTURE_2D,2*t_length, numSamplesPos*t_length, "Final_Cost_Position.bmp");
c0e09133   Pavel Govyadinov   STABLE: made temp...
181
  			#endif
035d798f   Pavel Govyadinov   modified the spid...
182
  			int best = getCost(ptexbufferID, numSamplesPos);		//find min cost.
ae05c3e4   Pavel Govyadinov   Found an error wi...
183
  //			std::cerr << best << std::endl;
ac430567   Pavel Govyadinov   comments comments...
184
  			stim::vec<float> next(		//find next position.
3f15dade   Pavel Govyadinov   changed the plane...
185
186
187
188
   				pV[best][0],
  				pV[best][1],
  				pV[best][2],
  				1);
ac430567   Pavel Govyadinov   comments comments...
189
  			next = cT*next;			//find next position.
d4721000   Pavel Govyadinov   changes with debu...
190
191
  			setPosition(
  					next[0]*S[0]*R[0],
8e56a0a7   Pavel Govyadinov   Added the propose...
192
  					next[1]*S[1]*R[1],
d4721000   Pavel Govyadinov   changes with debu...
193
  					next[2]*S[2]*R[2]
ac430567   Pavel Govyadinov   comments comments...
194
  				   );			//adjust position.
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
195
196
  		}
  	
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
197
198
199
  		/// Method for finding the best scale for the spider.
  		/// changes the x, y, z size of the spider to minimize the cost
  		/// function. */
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
200
201
202
  		void
  		findOptimalScale()
  		{
efe7b7cc   Pavel Govyadinov   Added a detailed ...
203
204
205
  			#ifdef TIMING
  				gpuStartTimer();
  			#endif
ac430567   Pavel Govyadinov   comments comments...
206
207
  			setMatrix();			//create the transformation.
  			glCallList(dList+2);		//move the templates to p, d, m.
efe7b7cc   Pavel Govyadinov   Added a detailed ...
208
209
210
211
  			glFlush();
  			#ifdef TIMING
  				size_time += gpuStopTimer();
  			#endif
c0e09133   Pavel Govyadinov   STABLE: made temp...
212
  			#ifdef TESTING
efe7b7cc   Pavel Govyadinov   Added a detailed ...
213
  //				test(mtexbufferID, GL_TEXTURE_2D, 2*t_length, numSamplesMag*t_length, "Final_Cost_Position.bmp");
c0e09133   Pavel Govyadinov   STABLE: made temp...
214
  			#endif
035d798f   Pavel Govyadinov   modified the spid...
215
  			int best = getCost(mtexbufferID, numSamplesMag);		//get best cost.
ac430567   Pavel Govyadinov   comments comments...
216
  			setMagnitude(m[0]*mV[best][0]);	//adjust the magnitude.
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
217
218
  		}
  
6b8621f8   Pavel Govyadinov   stable version
219
  
ac430567   Pavel Govyadinov   comments comments...
220
221
  		///subject to change.
  		///finds branches.
27194b56   Pavel Govyadinov   major bug fixes, ...
222
  		///depreciated
f31bf86d   Pavel Govyadinov   Added skeleton fu...
223
224
225
  		void
  		branchDetection()
  		{
5eeaf941   Pavel Govyadinov   changer to the ba...
226
  			setMatrix();
f31bf86d   Pavel Govyadinov   Added skeleton fu...
227
  			glCallList(dList+3);
84eff8b1   Pavel Govyadinov   Merged only the n...
228
229
  			std::vector< stim::vec<float> > result = find_branch(
  					btexbufferID, GL_TEXTURE_2D, 16, 216);
7d3162a2   Pavel Govyadinov   fixed majority of...
230
  			stim::vec3<float> size(S[0]*R[0], S[1]*R[1], S[2]*R[2]);
84eff8b1   Pavel Govyadinov   Merged only the n...
231
232
233
234
  			if(!result.empty())
  			{
  				for(int i = 1; i < result.size(); i++)
  				{
84eff8b1   Pavel Govyadinov   Merged only the n...
235
236
237
238
239
  					stim::vec<float> cylp(
  						0.5 * cos(2*M_PI*(result[i][1])),
  						0.5 * sin(2*M_PI*(result[i][1])),
  						result[i][0]-0.5,
  						1.0);
84eff8b1   Pavel Govyadinov   Merged only the n...
240
  					cylp = cT*cylp;
84eff8b1   Pavel Govyadinov   Merged only the n...
241
  					
7d3162a2   Pavel Govyadinov   fixed majority of...
242
  					stim::vec3<float> vec(
59781ee3   Pavel Govyadinov   fixed a stask bug...
243
  						cylp[0]*S[0]*R[0],
84eff8b1   Pavel Govyadinov   Merged only the n...
244
245
  						cylp[1]*S[1]*R[1],
  						cylp[2]*S[2]*R[2]);
7d3162a2   Pavel Govyadinov   fixed majority of...
246
  					stim::vec3<float> seeddir(-p[0] + cylp[0]*S[0]*R[0],
59781ee3   Pavel Govyadinov   fixed a stask bug...
247
248
249
  						   -p[1] + cylp[1]*S[1]*R[1],
  						   -p[2] + cylp[2]*S[2]*R[2]);
  						seeddir = seeddir.norm();
6707e8f5   Pavel Govyadinov   handled the case ...
250
  					float seedm = m[0];
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
251
  // Uncomment for global run 
1306fd96   Pavel Govyadinov   minor bug fixes i...
252
  					if(
59781ee3   Pavel Govyadinov   fixed a stask bug...
253
254
255
256
257
258
  					 !(vec[0] > size[0] || vec[1] > size[1]
  					 || vec[2] > size[2] || vec[0] < 0
  					 || vec[1] < 0 || vec[2] < 0))
  					{
  						setSeed(vec);
  						setSeedVec(seeddir);
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
259
  						setSeedMag(seedm);
59781ee3   Pavel Govyadinov   fixed a stask bug...
260
  					}
84eff8b1   Pavel Govyadinov   Merged only the n...
261
262
  				}
  			}    
f31bf86d   Pavel Govyadinov   Added skeleton fu...
263
264
265
  			
  		}
  
e45b97ce   Pavel Govyadinov   safety commit, I ...
266
  
27194b56   Pavel Govyadinov   major bug fixes, ...
267
268
  		///finds all the branches in the a given fiber.
  		///using LoG method.
e45b97ce   Pavel Govyadinov   safety commit, I ...
269
270
271
  		void
  		branchDetection2(int n = 8, int l_template = 8, int l_square = 8)
  		{
efe7b7cc   Pavel Govyadinov   Added a detailed ...
272
273
274
275
  			#ifdef TIMING
  				gpuStartTimer();
  			#endif
  
e45b97ce   Pavel Govyadinov   safety commit, I ...
276
277
278
279
280
281
  			if(cL.size() < 4){}
  			else{
  			setMatrix(1);
  			DrawLongCylinder(n, l_template, l_square);
  			stim::cylinder<float> cyl(cL, cM);
  			std::vector< stim::vec<float> > result = find_branch(btexbufferID, GL_TEXTURE_2D, n*l_square, (cL.size()-1)*l_template);
7d3162a2   Pavel Govyadinov   fixed majority of...
282
  			stim::vec3<float> size(S[0]*R[0], S[1]*R[1], S[2]*R[2]);
8c4f5d84   Pavel Govyadinov   fixed the issue w...
283
  			float pval;
e45b97ce   Pavel Govyadinov   safety commit, I ...
284
285
286
287
  			if(!result.empty())
  			{
  				for(int i = 0; i < result.size(); i++)
  				{
8c4f5d84   Pavel Govyadinov   fixed the issue w...
288
289
290
291
292
293
  					int id = result[i][2];
  					if(fmod(result[i][2], id) != 0 && id != 0)
  					{
  						
  						pval = ((cyl.getl(id+1)-cyl.getl(id))*
  							(fmod(result[i][2], id))+cyl.getl(id))/cyl.getl(cL.size()-1);
8c4f5d84   Pavel Govyadinov   fixed the issue w...
294
295
296
297
298
299
300
301
302
  					}
  					else if(id == 0)
  					{
  						pval = (cyl.getl(id+1)*result[i][2])/cyl.getl(cL.size()-1);
  					}
  					else
  					{
  						pval = (cyl.getl(id)/cyl.getl(cL.size()-1));
  					}
7d3162a2   Pavel Govyadinov   fixed majority of...
303
304
  					stim::vec3<float> v = cyl.surf(pval, result[i][0]);
  					stim::vec3<float> di = cyl.p(pval);
8c4f5d84   Pavel Govyadinov   fixed the issue w...
305
  					float rad = cyl.r(pval);
8c4f5d84   Pavel Govyadinov   fixed the issue w...
306
307
308
309
310
311
312
313
314
  					if(
  					 !(v[0] > size[0] || v[1] > size[1]
  					 || v[2] > size[2] || v[0] < 0
  					 || v[1] < 0 || v[2] < 0))
  					{
  						setSeed(v);
  						setSeedVec((v-di).norm());
  						setSeedMag(rad);
  					}
e45b97ce   Pavel Govyadinov   safety commit, I ...
315
316
  				}
  			}
e45b97ce   Pavel Govyadinov   safety commit, I ...
317
  			}
efe7b7cc   Pavel Govyadinov   Added a detailed ...
318
319
320
  			#ifdef TIMING
  				branch_time += gpuStopTimer();
  			#endif
e45b97ce   Pavel Govyadinov   safety commit, I ...
321
322
  		}
  
c0e09133   Pavel Govyadinov   STABLE: made temp...
323
324
325
326
327
328
329
330
331
332
333
334
335
  
  		float uniformRandom()
  		{
  			return (  (float)(rand()))/(  (float)(RAND_MAX));
  		}
  
  		float normalRandom()
  		{
  			float u1 = uniformRandom();
  			float u2 = uniformRandom();
  			return cos(2.0*atan(1.0)*u2)*sqrt(-1.0*log(u1));
  		}
  
7d3162a2   Pavel Govyadinov   fixed majority of...
336
  		stim::vec3<float> uniformRandVector()
c0e09133   Pavel Govyadinov   STABLE: made temp...
337
  		{
7d3162a2   Pavel Govyadinov   fixed majority of...
338
  			stim::vec3<float> r(uniformRandom(), uniformRandom(), 1.0);
c0e09133   Pavel Govyadinov   STABLE: made temp...
339
340
341
  			return r;
  		}
  
7d3162a2   Pavel Govyadinov   fixed majority of...
342
  		stim::vec3<float> normalRandVector()
c0e09133   Pavel Govyadinov   STABLE: made temp...
343
  		{
7d3162a2   Pavel Govyadinov   fixed majority of...
344
  			stim::vec3<float> r(normalRandom(), normalRandom(), 1.0);
c0e09133   Pavel Govyadinov   STABLE: made temp...
345
346
347
  			return r;
  		}
  
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
348
349
350
351
352
  		
  //--------------------------------------------------------------------------//
  //---------------------TEMPLATE CREATION METHODS----------------------------//
  //--------------------------------------------------------------------------//
  
c0e09133   Pavel Govyadinov   STABLE: made temp...
353
354
  
  
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
355
356
  		///@param solidAngle, the size of the arc to sample.
  		///Method for populating the vector arrays with sampled vectors.
6b8621f8   Pavel Govyadinov   stable version
357
358
359
  		///Objects created are rectangles the with the created directions.
  		///All points are sampled from a texture.
  		///Stored in a display list.
8e56a0a7   Pavel Govyadinov   Added the propose...
360
  		///uses the default d vector <0,0,1>
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
361
  		void
59781ee3   Pavel Govyadinov   fixed a stask bug...
362
  		genDirectionVectors(float solidAngle = 5/M_PI*4)
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
363
  		{
c0e09133   Pavel Govyadinov   STABLE: made temp...
364
  
8e56a0a7   Pavel Govyadinov   Added the propose...
365
  			//Set up the vectors necessary for Rectangle creation.
7d3162a2   Pavel Govyadinov   fixed majority of...
366
367
368
369
  			stim::vec3<float> Y(1.0,0.0,0.0);		//orthogonal vec.
  			stim::vec3<float> pos(0.0,0.0,0.0);
  			stim::vec3<float> mag(1.0, 1.0, 1.0);
  			stim::vec3<float> dir(0.0, 0.0, 1.0);
22e7d0c5   Pavel Govyadinov   Minor changes in ...
370
  
c0e09133   Pavel Govyadinov   STABLE: made temp...
371
372
373
  			float PHI[2], Z[2], range;
  			PHI[0] = solidAngle/2;
  			PHI[1] = asin(0);
8e56a0a7   Pavel Govyadinov   Added the propose...
374
  			
c0e09133   Pavel Govyadinov   STABLE: made temp...
375
376
377
378
379
380
  			Z[0] = cos(PHI[0]);
  			Z[1] = cos(PHI[1]);
  			
  			range = Z[0] - Z[1];
  
  			float z, theta, phi;
ac430567   Pavel Govyadinov   comments comments...
381
  			glNewList(dList, GL_COMPILE); 		
c0e09133   Pavel Govyadinov   STABLE: made temp...
382
383
384
385
386
  			for(int i = 0; i < numSamples; i++)
  			{
  				z = uniformRandom()*range + Z[1];
  				theta = uniformRandom()*2*M_PI;
  				phi = acos(z);
7d3162a2   Pavel Govyadinov   fixed majority of...
387
388
  				stim::vec3<float> sph(1, theta, phi);
  				stim::vec3<float> cart = sph.sph2cart();
c0e09133   Pavel Govyadinov   STABLE: made temp...
389
390
391
392
393
394
  				dV.push_back(cart);
  				if(cos(Y.dot(cart)) < 0.087)
  				{
  						Y[0] = 0.0; Y[1] = 1.0;
  				}else{
  					Y[0] = 1.0; Y[1] = 0.0;
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
395
  				}
c0e09133   Pavel Govyadinov   STABLE: made temp...
396
397
398
399
400
401
402
                                  hor = stim::rect<float>(mag,
  					 pos, cart,
                         			((Y.cross(cart)).cross(cart)).norm());
         				ver = stim::rect<float>(mag,
  					 pos, cart,
                         			hor.n());
  				UpdateBuffer(0.0, 0.0+i*t_length);
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
403
  			}
8e56a0a7   Pavel Govyadinov   Added the propose...
404
  			glEndList();
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
405
  		}
2a18be6d   Pavel Govyadinov   New comments and ...
406
  
ac430567   Pavel Govyadinov   comments comments...
407
  		///@param float delta, How much the rectangles vary in position.
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
408
  		///Method for populating the buffer with the sampled texture.
ac430567   Pavel Govyadinov   comments comments...
409
410
411
  		///Objects created are rectangles the with the created positions.
  		///All points are sampled from a texture.
  		///Stored in a display list.
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
412
  		///uses the default vector <0,0,0>
a9f956be   Pavel Govyadinov   Fixed the cost fu...
413
  		void
4191c034   Pavel Govyadinov   minor:bug fixes. ...
414
  		genPositionVectors(float delta = 0.4)
a9f956be   Pavel Govyadinov   Fixed the cost fu...
415
  		{
8e56a0a7   Pavel Govyadinov   Added the propose...
416
  			//Set up the vectors necessary for Rectangle creation.
7d3162a2   Pavel Govyadinov   fixed majority of...
417
418
419
420
  			stim::vec3<float> Y(1.0,0.0,0.0);		//orthogonal vec.
  			stim::vec3<float> pos(0.0,0.0,0.0);
  			stim::vec3<float> mag(1.0, 1.0, 1.0);
  			stim::vec3<float> dir(0.0, 0.0, 1.0);
8e56a0a7   Pavel Govyadinov   Added the propose...
421
422
  
  			//Set up the variable necessary for vector creation.
8e56a0a7   Pavel Govyadinov   Added the propose...
423
  			glNewList(dList+1, GL_COMPILE);
c0e09133   Pavel Govyadinov   STABLE: made temp...
424
425
  			for(int i = 0; i < numSamplesPos; i++)
  			{
7d3162a2   Pavel Govyadinov   fixed majority of...
426
  				stim::vec3<float> temp = uniformRandVector();
c0e09133   Pavel Govyadinov   STABLE: made temp...
427
428
429
430
431
432
433
434
435
436
437
  				temp = temp*delta*2.0 - delta/2.0;
  				temp[2] = 0.0;
  				pV.push_back(temp);
                  		hor = stim::rect<float>(mag,
  					 temp, dir,
                        			((Y.cross(d)).cross(d))
  					.norm());
                  		ver = stim::rect<float>(mag,
  					 temp, dir,
                          		hor.n());
  				UpdateBuffer(0.0, 0.0+i*t_length);
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
438
  			}
8e56a0a7   Pavel Govyadinov   Added the propose...
439
  			glEndList();
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
440
441
  		}
  
ac430567   Pavel Govyadinov   comments comments...
442
  		///@param float delta, How much the rectangles are allowed to expand.
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
443
  		///Method for populating the buffer with the sampled texture.
ac430567   Pavel Govyadinov   comments comments...
444
445
446
  		///Objects created are rectangles the with the created sizes.
  		///All points are sampled from a texture.
  		///Stored in a display list.
8e56a0a7   Pavel Govyadinov   Added the propose...
447
  		///uses the default m <1,1,0>
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
448
  		void
79a9bf3f   Pavel Govyadinov   new implementatio...
449
  		genMagnitudeVectors(float delta = 0.70)
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
450
451
  		{
  			
8e56a0a7   Pavel Govyadinov   Added the propose...
452
  			//Set up the vectors necessary for Rectangle creation.
7d3162a2   Pavel Govyadinov   fixed majority of...
453
454
455
456
  			stim::vec3<float> Y(1.0, 0.0, 0.0);		//orthogonal vec.
  			stim::vec3<float> pos(0.0, 0.0, 0.0);
  			stim::vec3<float> mag(1.0, 1.0, 1.0);
  			stim::vec3<float> dir(0.0, 0.0, 1.0);
8e56a0a7   Pavel Govyadinov   Added the propose...
457
458
  
  			//Set up the variable necessary for vector creation.
035d798f   Pavel Govyadinov   modified the spid...
459
  			int dim = (sqrt(numSamplesMag)-1)/2;
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
460
461
  			float min 	= 1.0-delta;
  			float max 	= 1.0+delta;
035d798f   Pavel Govyadinov   modified the spid...
462
  			float step	= (max-min)/(numSamplesMag-1);
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
463
  			float factor;
7d3162a2   Pavel Govyadinov   fixed majority of...
464
  			stim::vec3<float> temp(0.0,0.0,0.0);
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
465
  
8e56a0a7   Pavel Govyadinov   Added the propose...
466
  			glNewList(dList+2, GL_COMPILE);
035d798f   Pavel Govyadinov   modified the spid...
467
  			for(int i = 0; i < numSamplesMag; i++){
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
468
  				//Create linear index
d4721000   Pavel Govyadinov   changes with debu...
469
  				factor = (min+step*i)*mag[0];
db3c28c9   Pavel Govyadinov   Implemented glDis...
470
  				temp = factor;
8e56a0a7   Pavel Govyadinov   Added the propose...
471
472
473
474
475
476
477
478
  				mV.push_back(temp);	
  				hor = stim::rect<float>(temp,
  					 pos, dir, 
         	       				((Y.cross(d)).cross(d))
  					.norm());
                 			ver = stim::rect<float>(temp,
  					 pos, dir,
                         			hor.n());
c0e09133   Pavel Govyadinov   STABLE: made temp...
479
  				UpdateBuffer(0.0, 0.0+i*t_length);
8e56a0a7   Pavel Govyadinov   Added the propose...
480
  			CHECK_OPENGL_ERROR
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
481
  			}
8e56a0a7   Pavel Govyadinov   Added the propose...
482
  			glEndList();
a9f956be   Pavel Govyadinov   Fixed the cost fu...
483
  		}
ac430567   Pavel Govyadinov   comments comments...
484
485
486
487
488
  
  		///@param float v_x x-coordinate in buffer-space,
  		///@param float v_y y-coordinate in buffer-space.
  		///Samples the texture space.
   		///places a sample in the provided coordinates of bufferspace.
a9f956be   Pavel Govyadinov   Fixed the cost fu...
489
490
491
  		void
  		UpdateBuffer(float v_x, float v_y)
  		{	
7d3162a2   Pavel Govyadinov   fixed majority of...
492
493
494
495
  			stim::vec3<float>p1; 
          	        stim::vec3<float>p2; 
  	                stim::vec3<float>p3; 
                  	stim::vec3<float>p4;	
a9f956be   Pavel Govyadinov   Fixed the cost fu...
496
  			p1 = hor.p(1,1);
a9f956be   Pavel Govyadinov   Fixed the cost fu...
497
  			p2 = hor.p(1,0);
a9f956be   Pavel Govyadinov   Fixed the cost fu...
498
  			p3 = hor.p(0,0);
a9f956be   Pavel Govyadinov   Fixed the cost fu...
499
  			p4 = hor.p(0,1);
5e7c7581   Pavel Govyadinov   Debugging build f...
500
  			glBegin(GL_QUADS);
a9f956be   Pavel Govyadinov   Fixed the cost fu...
501
  				glTexCoord3f(
a9f956be   Pavel Govyadinov   Fixed the cost fu...
502
503
504
505
  					p1[0],
  					p1[1],
  					p1[2]
  					);
a9f956be   Pavel Govyadinov   Fixed the cost fu...
506
507
  				glVertex2f(v_x,v_y);
  				glTexCoord3f(
a9f956be   Pavel Govyadinov   Fixed the cost fu...
508
509
510
511
  					p2[0],
  					p2[1],
  					p2[2]
  					);
c0e09133   Pavel Govyadinov   STABLE: made temp...
512
  				glVertex2f(v_x+t_length, v_y);
a9f956be   Pavel Govyadinov   Fixed the cost fu...
513
  				glTexCoord3f(
a9f956be   Pavel Govyadinov   Fixed the cost fu...
514
515
516
517
  					p3[0],
  					p3[1],
  					p3[2]
  					);
c0e09133   Pavel Govyadinov   STABLE: made temp...
518
  				glVertex2f(v_x+t_length, v_y+t_length);
a9f956be   Pavel Govyadinov   Fixed the cost fu...
519
  				glTexCoord3f(
a9f956be   Pavel Govyadinov   Fixed the cost fu...
520
521
522
  					p4[0],
  					p4[1],
  					p4[2]
a9f956be   Pavel Govyadinov   Fixed the cost fu...
523
  					);
c0e09133   Pavel Govyadinov   STABLE: made temp...
524
  				glVertex2f(v_x, v_y+t_length);
a9f956be   Pavel Govyadinov   Fixed the cost fu...
525
  			 glEnd();
5e7c7581   Pavel Govyadinov   Debugging build f...
526
  
a9f956be   Pavel Govyadinov   Fixed the cost fu...
527
  			 p1 = ver.p(1,1);
a9f956be   Pavel Govyadinov   Fixed the cost fu...
528
  			 p2 = ver.p(1,0);
a9f956be   Pavel Govyadinov   Fixed the cost fu...
529
  			 p3 = ver.p(0,0);
a9f956be   Pavel Govyadinov   Fixed the cost fu...
530
  			 p4 = ver.p(0,1);
5e7c7581   Pavel Govyadinov   Debugging build f...
531
  		 	 glBegin(GL_QUADS);
a9f956be   Pavel Govyadinov   Fixed the cost fu...
532
  				glTexCoord3f(
a9f956be   Pavel Govyadinov   Fixed the cost fu...
533
534
535
536
  					p1[0],
  					p1[1],
  					p1[2]
  					);
c0e09133   Pavel Govyadinov   STABLE: made temp...
537
  				glVertex2f(v_x+t_length, v_y);
a9f956be   Pavel Govyadinov   Fixed the cost fu...
538
  				glTexCoord3f(
a9f956be   Pavel Govyadinov   Fixed the cost fu...
539
540
541
542
  					p2[0],
  					p2[1],
  					p2[2]
  					);
c0e09133   Pavel Govyadinov   STABLE: made temp...
543
  				glVertex2f(v_x+2.0*t_length, v_y);
a9f956be   Pavel Govyadinov   Fixed the cost fu...
544
  				glTexCoord3f(
a9f956be   Pavel Govyadinov   Fixed the cost fu...
545
546
547
548
  					p3[0],
  					p3[1],
  					p3[2]
  					);
c0e09133   Pavel Govyadinov   STABLE: made temp...
549
  				glVertex2f(v_x+2.0*t_length, v_y+t_length);
a9f956be   Pavel Govyadinov   Fixed the cost fu...
550
  				glTexCoord3f(
a9f956be   Pavel Govyadinov   Fixed the cost fu...
551
552
553
554
  					p4[0],
  					p4[1],
  					p4[2]
  					);
c0e09133   Pavel Govyadinov   STABLE: made temp...
555
  				glVertex2f(v_x+t_length, v_y+t_length);
5e7c7581   Pavel Govyadinov   Debugging build f...
556
  			glEnd(); 
a9f956be   Pavel Govyadinov   Fixed the cost fu...
557
  		}
2a18be6d   Pavel Govyadinov   New comments and ...
558
  		
385d2447   Pavel Govyadinov   Checkpoint: Conve...
559
  
385d2447   Pavel Govyadinov   Checkpoint: Conve...
560
  
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
561
562
563
  //--------------------------------------------------------------------------//
  //--------------------------------GL METHODS--------------------------------//
  //--------------------------------------------------------------------------//
385d2447   Pavel Govyadinov   Checkpoint: Conve...
564
  
ac430567   Pavel Govyadinov   comments comments...
565
566
567
568
  		///@param uint width sets the width of the buffer.
  		///@param uint height sets the height of the buffer.
  		///@param GLuint &textureID gives the texture ID of the texture to be initialized.
  		///@param GLuint &framebufferID gives the buffer ID of the texture to be initialized.
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
569
  		///Function for setting up the 2D buffer that stores the samples.
ac430567   Pavel Govyadinov   comments comments...
570
  		///Initiates and sets parameters.
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
571
  		void
84eff8b1   Pavel Govyadinov   Merged only the n...
572
573
  		GenerateFBO(unsigned int width, unsigned int height, GLuint &textureID, GLuint &framebufferID)
  		{
e45b97ce   Pavel Govyadinov   safety commit, I ...
574
  			glDeleteFramebuffers(1, &framebufferID);
84eff8b1   Pavel Govyadinov   Merged only the n...
575
576
577
578
579
580
  			glGenFramebuffers(1, &framebufferID);
  			glBindFramebuffer(GL_FRAMEBUFFER, framebufferID);
  			int numChannels = 1;
  			unsigned char* texels = new unsigned char[width * height * numChannels];
  			glGenTextures(1, &textureID);
  			glBindTexture(GL_TEXTURE_2D, textureID);
ac430567   Pavel Govyadinov   comments comments...
581
582
  
  			//Textures repeat and use linear interpolation, luminance format.
84eff8b1   Pavel Govyadinov   Merged only the n...
583
584
585
586
587
588
589
590
591
  			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  			glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE,
  				 width, height, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, texels);   
  			delete[] texels;
  			glBindFramebuffer(GL_FRAMEBUFFER, 0); 
  			glBindTexture(GL_TEXTURE_2D, 0);
84eff8b1   Pavel Govyadinov   Merged only the n...
592
593
  		}
  
ac430567   Pavel Govyadinov   comments comments...
594
595
  		///@param uint width sets the width of the buffer.
  		///@param uint height sets the height of the buffer.
84eff8b1   Pavel Govyadinov   Merged only the n...
596
597
  		///Function for setting up the 2D buffer that stores the samples.
  		void
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
598
599
600
601
602
603
604
605
  		GenerateFBO(unsigned int width, unsigned int height)
  		{
  			glGenFramebuffers(1, &fboID);
  			glBindFramebuffer(GL_FRAMEBUFFER, fboID);
  			int numChannels = 1;
  			unsigned char* texels = new unsigned char[width * height * numChannels];
  			glGenTextures(1, &texbufferID);
  			glBindTexture(GL_TEXTURE_2D, texbufferID);
ac430567   Pavel Govyadinov   comments comments...
606
607
  
  			//Textures repeat and use linear interpolation, luminance format.
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
608
609
610
611
612
613
614
615
616
  			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  			glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE,
  				 width, height, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, texels);   
  			delete[] texels;
  			glBindFramebuffer(GL_FRAMEBUFFER, 0); 
  			glBindTexture(GL_TEXTURE_2D, 0);
ac430567   Pavel Govyadinov   comments comments...
617
  			CHECK_OPENGL_ERROR
a9f956be   Pavel Govyadinov   Fixed the cost fu...
618
  		}
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
619
  
385d2447   Pavel Govyadinov   Checkpoint: Conve...
620
  
e45b97ce   Pavel Govyadinov   safety commit, I ...
621
  		///IF type == 0
ac430567   Pavel Govyadinov   comments comments...
622
  		///Method for using the gl manipulation to align templates from
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
623
  		///Template space (-0.5 0.5) to Texture space (0.0, 1.0),
8e56a0a7   Pavel Govyadinov   Added the propose...
624
  		///Based on the p of the spider in real space (arbitrary).
e45b97ce   Pavel Govyadinov   safety commit, I ...
625
626
627
628
  
  		///IF type == 1
  		///Method for using the gl manipulation to set up a matrix 
  		///To transform from tissue space into texture space.
ac430567   Pavel Govyadinov   comments comments...
629
  		///All transformation happen in glMatrixMode(GL_TEXTURE).
ac430567   Pavel Govyadinov   comments comments...
630
  		///All transformation happen in glMatrixMode(GL_TEXTURE).
e45b97ce   Pavel Govyadinov   safety commit, I ...
631
  		void setMatrix(int type = 0)
5f81932b   David Mayerich   restored Pavel's ...
632
  		{
e45b97ce   Pavel Govyadinov   safety commit, I ...
633
634
635
636
637
638
  			if(type == 0)
  			{
  				float curTrans[16];			//array to store the matrix values.
  				stim::vec<float> rot = getRotation(d);	//get the rotation parameters for the current direction vector.
  				glMatrixMode(GL_TEXTURE);
  				glLoadIdentity();
d4721000   Pavel Govyadinov   changes with debu...
639
  
e45b97ce   Pavel Govyadinov   safety commit, I ...
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
  				//Scale by the voxel size and number of slices.
  				glScalef(1.0/S[0]/R[0], 1.0/S[1]/R[1], 1.0/S[2]/R[2]);
  				//translate to the current position of the spider in the texture.
  				glTranslatef(p[0],
  					     p[1],
  					     p[2]);
  				//rotate to the current direction of the spider.
  				glRotatef(rot[0], rot[1], rot[2], rot[3]);
  				//scale to the magnitude of the spider.
  				glScalef(m[0],
  					 m[0],
  					 m[0]);
  				//get and store the current transformation matrix for later use.
  				glGetFloatv(GL_TEXTURE_MATRIX, curTrans);
  				cT.set(curTrans);
  			//	printTransform();
  				
  				CHECK_OPENGL_ERROR
  				//revert back to default gl mode.
  				glMatrixMode(GL_MODELVIEW);
  			}
  			else if(type == 1)
  			{
  				glMatrixMode(GL_TEXTURE);
  				glLoadIdentity();
  				glScalef(1.0/S[0]/R[0], 1.0/S[1]/R[1], 1.0/S[2]/R[2]);
  				glMatrixMode(GL_MODELVIEW);
  			}
5f81932b   David Mayerich   restored Pavel's ...
668
  		}
84eff8b1   Pavel Govyadinov   Merged only the n...
669
  
ac430567   Pavel Govyadinov   comments comments...
670
671
  		///Method for controling the buffer and texture binding.
  		///Clears the buffer upon binding.
84eff8b1   Pavel Govyadinov   Merged only the n...
672
  		void
c0e09133   Pavel Govyadinov   STABLE: made temp...
673
  		Bind()
84eff8b1   Pavel Govyadinov   Merged only the n...
674
  		{
84eff8b1   Pavel Govyadinov   Merged only the n...
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
  			glBindFramebuffer(GL_FRAMEBUFFER, fboID);//set up GL buffer		
  			glFramebufferTexture2D(
  				GL_FRAMEBUFFER,
  				GL_COLOR_ATTACHMENT0,
  				GL_TEXTURE_2D,
  				texbufferID,
  				0);
  			glBindFramebuffer(GL_FRAMEBUFFER, fboID);
  			GLenum DrawBuffers[1] = {GL_COLOR_ATTACHMENT0};
  			glDrawBuffers(1, DrawBuffers);
  			glBindTexture(GL_TEXTURE_2D, texbufferID);
  			glClearColor(1,1,1,1);
  			glClear(GL_COLOR_BUFFER_BIT);
  			glMatrixMode(GL_PROJECTION);
  			glLoadIdentity();
  			glMatrixMode(GL_MODELVIEW);
  			glLoadIdentity();
c0e09133   Pavel Govyadinov   STABLE: made temp...
692
693
  			glViewport(0,0,2.0*t_length, numSamples*t_length);
  			gluOrtho2D(0.0,2.0*t_length,0.0,numSamples*t_length);
84eff8b1   Pavel Govyadinov   Merged only the n...
694
695
696
697
698
699
  			glEnable(GL_TEXTURE_3D);
  			glBindTexture(GL_TEXTURE_3D, texID);
  
  			CHECK_OPENGL_ERROR
  		}
  		
ac430567   Pavel Govyadinov   comments comments...
700
701
702
703
704
  		///Method for controling the buffer and texture binding.
  		///Clears the buffer upon binding.
  		///@param GLuint &textureID, texture to be bound.
  		///@param GLuint &framebufferID, framebuffer used for storage.
  		///@param int nSamples, number of rectanges to create. 
84eff8b1   Pavel Govyadinov   Merged only the n...
705
  		void
e45b97ce   Pavel Govyadinov   safety commit, I ...
706
  		Bind(GLuint &textureID, GLuint &framebufferID, int nSamples, float len = 8.0)
84eff8b1   Pavel Govyadinov   Merged only the n...
707
  		{
c0e09133   Pavel Govyadinov   STABLE: made temp...
708
  			
84eff8b1   Pavel Govyadinov   Merged only the n...
709
  			glBindFramebuffer(GL_FRAMEBUFFER, framebufferID);//set up GL buffer
84eff8b1   Pavel Govyadinov   Merged only the n...
710
711
712
713
714
715
  			glFramebufferTexture2D(
  				GL_FRAMEBUFFER,
  				GL_COLOR_ATTACHMENT0,
  				GL_TEXTURE_2D,
  				textureID,
  				0);
84eff8b1   Pavel Govyadinov   Merged only the n...
716
  			glBindFramebuffer(GL_FRAMEBUFFER, framebufferID);
84eff8b1   Pavel Govyadinov   Merged only the n...
717
718
  			GLenum DrawBuffers[1] = {GL_COLOR_ATTACHMENT0};
  			glDrawBuffers(1, DrawBuffers);
84eff8b1   Pavel Govyadinov   Merged only the n...
719
  			glBindTexture(GL_TEXTURE_2D, textureID);
84eff8b1   Pavel Govyadinov   Merged only the n...
720
721
722
723
724
725
726
727
728
729
730
  			glMatrixMode(GL_PROJECTION);
  			glLoadIdentity();
  			glMatrixMode(GL_MODELVIEW);
  			glLoadIdentity();
  			glViewport(0,0,2.0*len, nSamples*len);
  			gluOrtho2D(0.0,2.0*len,0.0,nSamples*len);
  			glEnable(GL_TEXTURE_3D);
  			glBindTexture(GL_TEXTURE_3D, texID);
  
  			CHECK_OPENGL_ERROR
  		}
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
731
  		
ac430567   Pavel Govyadinov   comments comments...
732
  		///Unbinds all texture resources.
84eff8b1   Pavel Govyadinov   Merged only the n...
733
734
735
736
737
738
739
740
741
742
743
744
745
  		void
  		Unbind()
  		{
  			//Finalize GL_buffer
  			glBindTexture(GL_TEXTURE_3D, 0);                      
  			CHECK_OPENGL_ERROR
  			glBindTexture(GL_TEXTURE_2D, 0);                      
  			CHECK_OPENGL_ERROR
  			glBindFramebuffer(GL_FRAMEBUFFER, 0);
  			CHECK_OPENGL_ERROR
  			glDisable(GL_TEXTURE_3D);
  			CHECK_OPENGL_ERROR
  		}
ac430567   Pavel Govyadinov   comments comments...
746
747
748
749
750
751
752
753
754
  
  		///Makes the spider take a step.
  		///starting with the current p, d, m, find the next optimal p, d, m.
  		///Performs the branch detection on each step.
  		int
  		StepP()
  		{
  			Bind();
  			CHECK_OPENGL_ERROR
ac430567   Pavel Govyadinov   comments comments...
755
756
757
758
  			findOptimalDirection();
  			findOptimalPosition();
  			findOptimalScale();
  			Unbind();
035d798f   Pavel Govyadinov   modified the spid...
759
  			Bind(btexbufferID, bfboID, 27);
ac430567   Pavel Govyadinov   comments comments...
760
761
  			branchDetection();
  			Unbind();
ac430567   Pavel Govyadinov   comments comments...
762
763
764
  			return current_cost;
  		}
  
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
765
  		
5f81932b   David Mayerich   restored Pavel's ...
766
  
42145f38   Pavel Govyadinov   Fixed the issues ...
767
768
769
770
771
  
  //--------------------------------------------------------------------------//
  //--------------------------------CUDA METHODS------------------------------//
  //--------------------------------------------------------------------------//
  		
42145f38   Pavel Govyadinov   Fixed the issues ...
772
  
ac430567   Pavel Govyadinov   comments comments...
773
774
775
  		///Entry-point into the cuda code for calculating the cost of a given samples array (in texture form)
  		///finds the minimum cost and sets the current_cost to that value.
  		/// and returns the index of the template with the minimal cost. 
42145f38   Pavel Govyadinov   Fixed the issues ...
776
777
778
  		int
  		getCost()
  		{
84eff8b1   Pavel Govyadinov   Merged only the n...
779
780
  			stim::vec<int> cost = 
  				stim::cuda::get_cost(texbufferID, GL_TEXTURE_2D, numSamples);
59781ee3   Pavel Govyadinov   fixed a stask bug...
781
  			cudaDeviceSynchronize();
c4887649   Pavel Govyadinov   fixed a significa...
782
  			current_cost = cost[1];
edd4ab2d   Pavel Govyadinov   Cleaned up more a...
783
  			return cost[0];
a9f956be   Pavel Govyadinov   Fixed the cost fu...
784
785
  		}
  
035d798f   Pavel Govyadinov   modified the spid...
786
787
788
  		int
  		getCost(GLuint tID, int n)
  		{
efe7b7cc   Pavel Govyadinov   Added a detailed ...
789
790
  			#ifdef TIMING
  				gpuStartTimer();
035d798f   Pavel Govyadinov   modified the spid...
791
792
  			#endif
  			stim::vec<int> cost = 
c0e09133   Pavel Govyadinov   STABLE: made temp...
793
  				stim::cuda::get_cost(tID, GL_TEXTURE_2D, n, 2*t_length, t_length);
efe7b7cc   Pavel Govyadinov   Added a detailed ...
794
795
  			#ifdef TIMING
  				cost_time += gpuStopTimer();
035d798f   Pavel Govyadinov   modified the spid...
796
797
798
799
  			#endif
  			current_cost = cost[1];
  			return cost[0];
  		}
ac430567   Pavel Govyadinov   comments comments...
800
  
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
801
  	public:
ac430567   Pavel Govyadinov   comments comments...
802
803
804
805
806
807
  
  		///ininializes the cuda device and environment.
  		void
  		initCuda()
  		{	
  			stim::cudaSetDevice();
ac430567   Pavel Govyadinov   comments comments...
808
809
810
  		}
  
  		//horizonal rectangle forming the spider.
13c2a7d4   Pavel Govyadinov   some changes to t...
811
  		stim::rect<float> hor;
ac430567   Pavel Govyadinov   comments comments...
812
  		//vectical rectangle forming the spider.
13c2a7d4   Pavel Govyadinov   some changes to t...
813
814
  		stim::rect<float> ver;	
  
efe7b7cc   Pavel Govyadinov   Added a detailed ...
815
  		//Timing variables.
84eff8b1   Pavel Govyadinov   Merged only the n...
816
817
  		#ifdef TESTING
  			std::clock_t start;
84eff8b1   Pavel Govyadinov   Merged only the n...
818
819
  		#endif
  
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
820
821
822
823
824
  //--------------------------------------------------------------------------//
  //-----------------------------CONSTRUCTORS---------------------------------//
  //--------------------------------------------------------------------------//
  
  
ac430567   Pavel Govyadinov   comments comments...
825
826
  		///@param int samples, the number of samples this spider is going to use.
  		///Best results if samples is can create a perfect root.
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
827
  		///Default Constructor
2a18be6d   Pavel Govyadinov   New comments and ...
828
  		gl_spider
3f15dade   Pavel Govyadinov   changed the plane...
829
  		(int samples = 1089, int samplespos = 441,int samplesmag = 144)
2a18be6d   Pavel Govyadinov   New comments and ...
830
  		{
c0e09133   Pavel Govyadinov   STABLE: made temp...
831
  //			std::cout << "I ran this constructor" << std::endl;
7d3162a2   Pavel Govyadinov   fixed majority of...
832
833
834
835
836
  			p = stim::vec3<float>(0.0, 0.0, 0.0);
  			d = stim::vec3<float>(0.0, 0.0, 1.0);
  			m = stim::vec<float>(1.0, 1.0);
  			S = stim::vec3<float>(1.0, 1.0, 1.0);
  			R = stim::vec3<float>(1.0, 1.0, 1.0);
c0e09133   Pavel Govyadinov   STABLE: made temp...
837
  //			std::cout << samples << std::endl;
2a18be6d   Pavel Govyadinov   New comments and ...
838
  			numSamples = samples;
c0e09133   Pavel Govyadinov   STABLE: made temp...
839
  //			std::cout << numSamples << std::endl;
035d798f   Pavel Govyadinov   modified the spid...
840
841
  			numSamplesPos = samplespos;
  			numSamplesMag = samplesmag;
4cefeb6d   Pavel Govyadinov   Changes to the re...
842
843
  		}
  
ac430567   Pavel Govyadinov   comments comments...
844
845
846
847
848
849
850
851
852
  		///Position constructor: floats.
  		///@param float pos_x, position x.
  		///@param float pos_y, position y.
  		///@param float pos_z, position z.
  		///@param float dir_x, direction x.
  		///@param float dir_y, direction y.
  		///@param float dir_z, direction z.
  		///@param float mag_x, size of the vector.
  		///@param int 	samples, number of templates this spider is going to use.
13c2a7d4   Pavel Govyadinov   some changes to t...
853
854
  		gl_spider
  		(float pos_x, float pos_y, float pos_z, float dir_x, float dir_y, float dir_z,
3f15dade   Pavel Govyadinov   changed the plane...
855
  			float mag_x, int numsamples = 1089, int numsamplespos = 441, int numsamplesmag =144)
13c2a7d4   Pavel Govyadinov   some changes to t...
856
  		{
7d3162a2   Pavel Govyadinov   fixed majority of...
857
858
859
860
861
  			p = stim::vec3<float>(pos_x, pos_y, pos_z);
  			d = stim::vec3<float>(dir_x, dir_y, dir_z);
  			m = stim::vec<float>(mag_x, mag_x, mag_x);
  			S = stim::vec3<float>(1.0,1.0,1.0);
  			R = stim::vec3<float>(1.0,1.0,1.0);
035d798f   Pavel Govyadinov   modified the spid...
862
863
864
  			numSamples = numsamples;
  			numSamplesPos = numsamplespos;
  			numSamplesMag = numsamplesmag;
385d2447   Pavel Govyadinov   Checkpoint: Conve...
865
  		}
ac430567   Pavel Govyadinov   comments comments...
866
867
868
869
870
871
872
  
  		///Position constructor: vecs of floats.
  		///@param stim::vec<float> pos, position.
  		///@param stim::vec<float> dir, direction.
  		///@param float mag, size of the vector.
  		///@param int 	samples, number of templates this spider is going to use.
  		gl_spider
7d3162a2   Pavel Govyadinov   fixed majority of...
873
  		(stim::vec3<float> pos, stim::vec3<float> dir, float mag, int samples = 1089, int samplesPos = 441, int samplesMag = 144)
ac430567   Pavel Govyadinov   comments comments...
874
875
876
877
  		{
  			p = pos;
  			d = dir;
  			m = vec<float>(mag, mag, mag);
7d3162a2   Pavel Govyadinov   fixed majority of...
878
879
  			S = vec3<float>(1.0,1.0,1.0);
  			R = vec3<float>(1.0,1.0,1.0);
ac430567   Pavel Govyadinov   comments comments...
880
  			numSamples = samples;
035d798f   Pavel Govyadinov   modified the spid...
881
882
  			numSamplesPos = samplesPos;
  			numSamplesMag = samplesMag;
ac430567   Pavel Govyadinov   comments comments...
883
884
885
  		}
  
  		///destructor	
8e56a0a7   Pavel Govyadinov   Added the propose...
886
887
888
889
890
891
  		~gl_spider
  		(void)
  		{
  			Unbind();
  			glDeleteTextures(1, &texbufferID);
  			glDeleteBuffers(1, &fboID);
035d798f   Pavel Govyadinov   modified the spid...
892
893
  			glDeleteTextures(1, &ptexbufferID);
  			glDeleteBuffers(1, &pfboID);
1306fd96   Pavel Govyadinov   minor bug fixes i...
894
  			glDeleteTextures(1, &mtexbufferID);
035d798f   Pavel Govyadinov   modified the spid...
895
  			glDeleteBuffers(1, &mfboID);     
84eff8b1   Pavel Govyadinov   Merged only the n...
896
  			glDeleteTextures(1, &btexbufferID);
035d798f   Pavel Govyadinov   modified the spid...
897
  			glDeleteBuffers(1, &bfboID);
8e56a0a7   Pavel Govyadinov   Added the propose...
898
899
  		}
  
ac430567   Pavel Govyadinov   comments comments...
900
  		///@param GLuint id, texture that is going to be sampled.
385d2447   Pavel Govyadinov   Checkpoint: Conve...
901
  		///Attached the spider to the texture with the given GLuint ID.
8e56a0a7   Pavel Govyadinov   Added the propose...
902
  		///Samples in the default d acting as the init method.
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
903
  		///Also acts an init.	
a9b45efe   Pavel Govyadinov   changes to spider
904
  		void
2a18be6d   Pavel Govyadinov   New comments and ...
905
  		attachSpider(GLuint id)
a9b45efe   Pavel Govyadinov   changes to spider
906
  		{
c0e09133   Pavel Govyadinov   STABLE: made temp...
907
  			srand(100);	
a9b45efe   Pavel Govyadinov   changes to spider
908
  			texID = id;
035d798f   Pavel Govyadinov   modified the spid...
909
  			//GenerateFBO(16, numSamples*8);
c0e09133   Pavel Govyadinov   STABLE: made temp...
910
  			GenerateFBO(t_length*2, numSamples*t_length, texbufferID, fboID); 
efe7b7cc   Pavel Govyadinov   Added a detailed ...
911
  			std::cout << numSamples << std::endl;
c0e09133   Pavel Govyadinov   STABLE: made temp...
912
913
  			CHECK_OPENGL_ERROR
  			GenerateFBO(t_length*2, numSamplesPos*t_length, ptexbufferID, pfboID); 
efe7b7cc   Pavel Govyadinov   Added a detailed ...
914
  			std::cout << numSamplesPos << std::endl;
c0e09133   Pavel Govyadinov   STABLE: made temp...
915
916
  			CHECK_OPENGL_ERROR
  			GenerateFBO(t_length*2, numSamplesMag*t_length, mtexbufferID, mfboID); 
efe7b7cc   Pavel Govyadinov   Added a detailed ...
917
  			std::cout << numSamplesMag << std::endl;
c0e09133   Pavel Govyadinov   STABLE: made temp...
918
  			CHECK_OPENGL_ERROR
035d798f   Pavel Govyadinov   modified the spid...
919
  			GenerateFBO(16, 216, btexbufferID, bfboID); 
c0e09133   Pavel Govyadinov   STABLE: made temp...
920
  			CHECK_OPENGL_ERROR
6422f96a   Pavel Govyadinov   minor bug fixes a...
921
922
  //			setDims(0.6, 0.6, 1.0);
  //			setSize(1024.0, 1024.0, 1024.0);
5eeaf941   Pavel Govyadinov   changer to the ba...
923
  			setMatrix();
db3c28c9   Pavel Govyadinov   Implemented glDis...
924
  			dList = glGenLists(3);
db3c28c9   Pavel Govyadinov   Implemented glDis...
925
  			glListBase(dList);
c0e09133   Pavel Govyadinov   STABLE: made temp...
926
  			Bind(texbufferID, fboID, numSamples, t_length);
035d798f   Pavel Govyadinov   modified the spid...
927
  				genDirectionVectors(5*M_PI/4);
3f15dade   Pavel Govyadinov   changed the plane...
928
  			Unbind();
c0e09133   Pavel Govyadinov   STABLE: made temp...
929
  			Bind(ptexbufferID, pfboID, numSamplesPos, t_length);
035d798f   Pavel Govyadinov   modified the spid...
930
  				genPositionVectors();
3f15dade   Pavel Govyadinov   changed the plane...
931
  			Unbind();
c0e09133   Pavel Govyadinov   STABLE: made temp...
932
  			Bind(mtexbufferID, mfboID, numSamplesMag, t_length);
035d798f   Pavel Govyadinov   modified the spid...
933
  				genMagnitudeVectors();
3f15dade   Pavel Govyadinov   changed the plane...
934
  			Unbind();
035d798f   Pavel Govyadinov   modified the spid...
935
  			Bind(btexbufferID, bfboID, 27);
f31bf86d   Pavel Govyadinov   Added skeleton fu...
936
  			DrawCylinder();
8e56a0a7   Pavel Govyadinov   Added the propose...
937
  			Unbind();
a39577bf   Pavel Govyadinov   Changes to the sp...
938
  		}
5f81932b   David Mayerich   restored Pavel's ...
939
  		
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
940
941
942
  //--------------------------------------------------------------------------//
  //-----------------------------ACCESS METHODS-------------------------------//
  //--------------------------------------------------------------------------//
8e56a0a7   Pavel Govyadinov   Added the propose...
943
  		///Returns the p vector.
7d3162a2   Pavel Govyadinov   fixed majority of...
944
  		vec3<float>
a39577bf   Pavel Govyadinov   Changes to the sp...
945
  		getPosition()
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
946
  		{
8e56a0a7   Pavel Govyadinov   Added the propose...
947
  			return p;
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
948
949
  		}
  	
8e56a0a7   Pavel Govyadinov   Added the propose...
950
  		///Returns the d vector.
7d3162a2   Pavel Govyadinov   fixed majority of...
951
  		vec3<float>
a39577bf   Pavel Govyadinov   Changes to the sp...
952
  		getDirection()
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
953
  		{
8e56a0a7   Pavel Govyadinov   Added the propose...
954
  			return d;
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
955
956
  		}
  
8e56a0a7   Pavel Govyadinov   Added the propose...
957
  		///Returns the m vector.
4fa3f483   Pavel Govyadinov   Fixed the memory ...
958
  		stim::vec<float>
a39577bf   Pavel Govyadinov   Changes to the sp...
959
  		getMagnitude()
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
960
  		{
8e56a0a7   Pavel Govyadinov   Added the propose...
961
  			return m;
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
962
963
  		}
  	
ac430567   Pavel Govyadinov   comments comments...
964
  		///@param stim::vec<float> pos, the new p.
8e56a0a7   Pavel Govyadinov   Added the propose...
965
  		///Sets the p vector to input vector pos.
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
966
  		void
7d3162a2   Pavel Govyadinov   fixed majority of...
967
  		setPosition(stim::vec3<float> pos)
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
968
  		{
8e56a0a7   Pavel Govyadinov   Added the propose...
969
  			p = pos;
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
970
  		}
385d2447   Pavel Govyadinov   Checkpoint: Conve...
971
  
ac430567   Pavel Govyadinov   comments comments...
972
973
974
  		///@param float x x-coordinate.
  		///@param float y y-coordinate.
  		///@param float z z-coordinate.
8e56a0a7   Pavel Govyadinov   Added the propose...
975
  		///Sets the p vector to the input float coordinates x,y,z.
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
976
977
978
  		void
  		setPosition(float x, float y, float z)
  		{
8e56a0a7   Pavel Govyadinov   Added the propose...
979
980
981
  			p[0] = x;
  			p[1] = y;
  			p[2] = z;
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
982
  		}
887a3e49   Pavel Govyadinov   fixed some order ...
983
  		
ac430567   Pavel Govyadinov   comments comments...
984
  		///@param stim::vec<float> dir, the new d.
8e56a0a7   Pavel Govyadinov   Added the propose...
985
  		///Sets the d vector to input vector dir.
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
986
  		void
7d3162a2   Pavel Govyadinov   fixed majority of...
987
  		setDirection(stim::vec3<float> dir)
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
988
  		{
8e56a0a7   Pavel Govyadinov   Added the propose...
989
  			d = dir;
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
990
991
  		}
  		
ac430567   Pavel Govyadinov   comments comments...
992
993
994
  		///@param stim::vec<float> x x-coordinate.
  		///@param stim::vec<float> y y-coordinate.
  		///@param stim::vec<float> z z-coordinate.
8e56a0a7   Pavel Govyadinov   Added the propose...
995
  		///Sets the d vector to the input float coordinates x,y,z.
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
996
997
998
  		void
  		setDirection(float x, float y, float z)
  		{
8e56a0a7   Pavel Govyadinov   Added the propose...
999
1000
1001
  			d[0] = x;
  			d[1] = y;
  			d[2] = z;
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
1002
  		}
385d2447   Pavel Govyadinov   Checkpoint: Conve...
1003
  			
ac430567   Pavel Govyadinov   comments comments...
1004
  		///@param stim::vec<float> dir, the new d.
8e56a0a7   Pavel Govyadinov   Added the propose...
1005
  		///Sets the m vector to the input vector mag.	
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
1006
  		void
7d3162a2   Pavel Govyadinov   fixed majority of...
1007
  		setMagnitude(stim::vec<float> mag)
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
1008
  		{
8e56a0a7   Pavel Govyadinov   Added the propose...
1009
1010
  			m[0] = mag[0];
  			m[1] = mag[0];
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
1011
1012
  		}
  		
ac430567   Pavel Govyadinov   comments comments...
1013
  		///@param float mag, size of the sampled region.
8e56a0a7   Pavel Govyadinov   Added the propose...
1014
  		///Sets the m vector to the input mag for both templates.
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
1015
  		void
5f81932b   David Mayerich   restored Pavel's ...
1016
  		setMagnitude(float mag)
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
1017
  		{
8e56a0a7   Pavel Govyadinov   Added the propose...
1018
1019
  			m[0] = mag;
  			m[1] = mag;
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
1020
  		}
5f81932b   David Mayerich   restored Pavel's ...
1021
  		
ac430567   Pavel Govyadinov   comments comments...
1022
1023
1024
1025
  		///@param float x, voxel size in the x direction.
  		///@param float y, voxel size in the y direction.
  		///@param float z, voxel size in the z direction.
  		///Sets the voxel sizes in each direction. necessary for non-standard data.
8e56a0a7   Pavel Govyadinov   Added the propose...
1026
1027
1028
1029
1030
1031
1032
1033
  		void
  		setDims(float x, float y, float z)
  		{
  			S[0] = x;
  			S[1] = y;
  			S[2] = z;
  		}
  
ac430567   Pavel Govyadinov   comments comments...
1034
1035
1036
  		///@param stim::vec<float> Dims, voxel size.
  		///Sets the voxel sizes in each direction. necessary for non-standard data.
  		void
7d3162a2   Pavel Govyadinov   fixed majority of...
1037
  		setDims(stim::vec3<float> Dims)
ac430567   Pavel Govyadinov   comments comments...
1038
1039
1040
1041
1042
1043
1044
1045
  		{
  			S = Dims;
  		}
  
  		///@param float x, size of the data in the x direction.
  		///@param float y, size of the data in the y direction.
  		///@param float z, size of the data in the z direction.
  		///Sets the data volume sizes in each direction.
b710b044   Pavel Govyadinov   Added more tempor...
1046
  		void
8e56a0a7   Pavel Govyadinov   Added the propose...
1047
  		setSize(float x, float y, float z)
b710b044   Pavel Govyadinov   Added more tempor...
1048
  		{
8e56a0a7   Pavel Govyadinov   Added the propose...
1049
1050
1051
  			R[0] = x;
  			R[1] = y;
  			R[2] = z;
b710b044   Pavel Govyadinov   Added more tempor...
1052
  		}
ac430567   Pavel Govyadinov   comments comments...
1053
1054
1055
1056
  
  		///@param stim::vec<float> Dims, size of the volume.
  		///Sets the data volume sizes in each direction.
  		void
7d3162a2   Pavel Govyadinov   fixed majority of...
1057
  		setSize(stim::vec3<float> Siz)
ac430567   Pavel Govyadinov   comments comments...
1058
1059
1060
  		{
  			S = Siz;
  		}
b710b044   Pavel Govyadinov   Added more tempor...
1061
  		
ac430567   Pavel Govyadinov   comments comments...
1062
1063
1064
1065
  		///@param stim::vec<float> dir, the vector to which we are rotating.
  		///given a vector to align to, finds the required axis and angle for glRotatef.
  		///rotates from 0.0, 0.0, 1.0 to dir.
  		///return is in degrees for use with glRotatef.
5eeaf941   Pavel Govyadinov   changer to the ba...
1066
  		stim::vec<float>
4fa3f483   Pavel Govyadinov   Fixed the memory ...
1067
  		getRotation(stim::vec3<float> dir)
f304d6de   Pavel Govyadinov   added rotation to...
1068
  		{
d4721000   Pavel Govyadinov   changes with debu...
1069
1070
1071
1072
  			stim::vec<float> out(0.0,0.0,0.0,0.0);
  			stim::vec<float> from(0.0,0.0,1.0);
  			out[0] = acos(dir.dot(from))*180/M_PI;
  			if(out[0] < 1.0){
f304d6de   Pavel Govyadinov   added rotation to...
1073
1074
1075
1076
1077
  				out[0] = 0.0;
  				out[1] = 0.0;
  				out[2] = 0.0;
  				out[3] = 1.0;
  			} else {
d4721000   Pavel Govyadinov   changes with debu...
1078
  				stim::vec<float> temp(0.0, 0.0, 0.0);;
4fa3f483   Pavel Govyadinov   Fixed the memory ...
1079
1080
  				stim::vec<float> dir1(dir[0], dir[1], dir[2]);
  				temp = (from.cross(dir1)).norm();
f304d6de   Pavel Govyadinov   added rotation to...
1081
1082
1083
1084
  				out[1] = temp[0];
  				out[2] = temp[1];
  				out[3] = temp[2];
  			}
f304d6de   Pavel Govyadinov   added rotation to...
1085
1086
  			return out;
  		}
84eff8b1   Pavel Govyadinov   Merged only the n...
1087
  
ac430567   Pavel Govyadinov   comments comments...
1088
  		///@param stim::vec<float> pos, the position of the seed to be added.
84eff8b1   Pavel Govyadinov   Merged only the n...
1089
1090
1091
  		///Adds a seed to the seed list.
  		///Assumes that the coordinates passes are in tissue space.
  		void
7d3162a2   Pavel Govyadinov   fixed majority of...
1092
  		setSeed(stim::vec3<float> pos)
a9b45efe   Pavel Govyadinov   changes to spider
1093
  		{
84eff8b1   Pavel Govyadinov   Merged only the n...
1094
  			seeds.push(pos);
a9b45efe   Pavel Govyadinov   changes to spider
1095
  		}
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
1096
  
ac430567   Pavel Govyadinov   comments comments...
1097
1098
  		///@param stim::vec<float> dir, the direction of the seed to be added.
  		///Adds a seed to the seed directions list.
79a9bf3f   Pavel Govyadinov   new implementatio...
1099
  		void
7d3162a2   Pavel Govyadinov   fixed majority of...
1100
  		setSeedVec(stim::vec3<float> dir)
59781ee3   Pavel Govyadinov   fixed a stask bug...
1101
1102
1103
1104
  		{
  			seedsvecs.push(dir);
  		}
  
ac430567   Pavel Govyadinov   comments comments...
1105
1106
1107
  		///@param float mag, the size of the seed to be added.
  		///Adds a seed to the seed list.
  		///Assumes that the coordinates passes are in tissue space.
59781ee3   Pavel Govyadinov   fixed a stask bug...
1108
1109
  		void
  		setSeedMag(float mag)
79a9bf3f   Pavel Govyadinov   new implementatio...
1110
  		{
c0e09133   Pavel Govyadinov   STABLE: made temp...
1111
  //			std::cout << "sMag: " << mag << std::endl;
59781ee3   Pavel Govyadinov   fixed a stask bug...
1112
  			seedsmags.push(mag);
84eff8b1   Pavel Govyadinov   Merged only the n...
1113
  		}
79a9bf3f   Pavel Govyadinov   new implementatio...
1114
  
59781ee3   Pavel Govyadinov   fixed a stask bug...
1115
  
ac430567   Pavel Govyadinov   comments comments...
1116
1117
1118
  		///@param float x, x-position of the seed to be added.
  		///@param float y, y-position of the seed to be added.
  		///@param float z, z-position of the seed to be added.
84eff8b1   Pavel Govyadinov   Merged only the n...
1119
1120
1121
1122
1123
  		///Adds a seed to the seed list.
  		///Assumes that the coordinates passes are in tissue space.
  		void
  		setSeed(float x, float y, float z)
  		{
c0e09133   Pavel Govyadinov   STABLE: made temp...
1124
  //			std::cout << "sPos: " << x << " " << y << " " << z << std::endl;
84eff8b1   Pavel Govyadinov   Merged only the n...
1125
1126
1127
  			seeds.push(stim::vec<float>(x, y, z));
  		}
  
ac430567   Pavel Govyadinov   comments comments...
1128
1129
1130
1131
  		///@param float x, x-direction of the seed to be added.
  		///@param float y, y-direction of the seed to be added.
  		///@param float z, z-direction of the seed to be added.
  		///Adds a seed to the seed directions list.
84eff8b1   Pavel Govyadinov   Merged only the n...
1132
1133
1134
  		void
  		setSeedVec(float x, float y, float z)
  		{
c0e09133   Pavel Govyadinov   STABLE: made temp...
1135
  //			std::cout << "sDir: " << x << " " << y << " " << z << std::endl;
84eff8b1   Pavel Govyadinov   Merged only the n...
1136
1137
  			seedsvecs.push(stim::vec<float>(x, y, z));
  		}
ac430567   Pavel Govyadinov   comments comments...
1138
1139
  		
  		///Method to get the top of the seed positions stack.
7d3162a2   Pavel Govyadinov   fixed majority of...
1140
  		stim::vec3<float> 
84eff8b1   Pavel Govyadinov   Merged only the n...
1141
1142
  		getLastSeed()
  		{
7d3162a2   Pavel Govyadinov   fixed majority of...
1143
  			stim::vec3<float> tp = seeds.top();
84eff8b1   Pavel Govyadinov   Merged only the n...
1144
1145
1146
  			return tp;
  		}
  
ac430567   Pavel Govyadinov   comments comments...
1147
  		///Method to get the top of the seed direction stack.
7d3162a2   Pavel Govyadinov   fixed majority of...
1148
  		stim::vec3<float> 
59781ee3   Pavel Govyadinov   fixed a stask bug...
1149
1150
  		getLastSeedVec()
  		{
7d3162a2   Pavel Govyadinov   fixed majority of...
1151
  			stim::vec3<float> tp = seedsvecs.top();
59781ee3   Pavel Govyadinov   fixed a stask bug...
1152
1153
1154
  			return tp;
  		}
  
ac430567   Pavel Govyadinov   comments comments...
1155
  		///Method to get the top of the seed magnitude stack.
59781ee3   Pavel Govyadinov   fixed a stask bug...
1156
1157
1158
1159
1160
1161
1162
  		float
  		getLastSeedMag()
  		{
  			float tp = seedsmags.top();
  			return tp;
  		}
  
ac430567   Pavel Govyadinov   comments comments...
1163
  		///deletes all data associated with the last seed.
59781ee3   Pavel Govyadinov   fixed a stask bug...
1164
1165
1166
1167
1168
  		void
  		popSeed()
  		{
  			seeds.pop();
  			seedsvecs.pop();
6707e8f5   Pavel Govyadinov   handled the case ...
1169
  			seedsmags.pop();
59781ee3   Pavel Govyadinov   fixed a stask bug...
1170
  		}
ac430567   Pavel Govyadinov   comments comments...
1171
1172
  		
  		///returns the seeds position stack.
7d3162a2   Pavel Govyadinov   fixed majority of...
1173
  		std::stack<stim::vec3<float> >
84eff8b1   Pavel Govyadinov   Merged only the n...
1174
1175
1176
1177
1178
  		getSeeds()
  		{
  			return seeds;
  		}
  
efe7b7cc   Pavel Govyadinov   Added a detailed ...
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
  		///sets the number of direction templates.
  		void
  		setNumberDirectionTemplates(int n)
  		{
  			numSamples = n;
  		}
  
  		///sets the number of position templates.
  		void
  		setNumberPositionTemplates(int n)
  		{
  			numSamplesPos = n;
  		}
  
  		///sets the number of position templates.
  		void
  		setNumberSizeTemplates(int n)
  		{
  			numSamplesMag = n;
  		}
  
  		#ifdef TIMING
  		///Returns the timings at the moment the method is called.
  		///In the following order: Branch, Direction, Position, Size, Cost, Network, Hit_detetion.
  		std::vector<double> 
  		getTimings()
  		{
  			std::vector <double> ret;
  			ret.resize(7);
  			ret[0] = branch_time;
  			ret[1] = direction_time;
  			ret[2] = position_time;
  			ret[3] = size_time;
  			ret[4] = cost_time;
  			ret[5] = network_time;
  			ret[6] = hit_time;
  
  			return ret;
  		}
  		#endif
  
ac430567   Pavel Govyadinov   comments comments...
1220
  		///returns true if all seed stacks are empty, else false.
84eff8b1   Pavel Govyadinov   Merged only the n...
1221
1222
1223
  		bool
  		Empty()
  		{
ac430567   Pavel Govyadinov   comments comments...
1224
  			//return (seeds.empty() && seedsvecs.empty() && seedsmags.empty());
1306fd96   Pavel Govyadinov   minor bug fixes i...
1225
  			return (seeds.empty() && seedsvecs.empty());
84eff8b1   Pavel Govyadinov   Merged only the n...
1226
  		}
ac430567   Pavel Govyadinov   comments comments...
1227
1228
1229
  
  		///@param std::string file:file with variables to populate the seed stacks.
  		///Adds a seed to the seed list, including the position, direction and magnitude.
84eff8b1   Pavel Govyadinov   Merged only the n...
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
  		///Assumes that the coordinates passes are in tissue space.
  		void
  		setSeeds(std::string file)
  		{
  			std::ifstream myfile(file.c_str());
  			string line;
  			if(myfile.is_open())
             		{
                     		while (getline(myfile, line))
                     		{
ac430567   Pavel Govyadinov   comments comments...
1240
1241
                             		float x, y, z, u, v, w, m;
                             		myfile >> x >> y >> z >> u >> v >> w >> m;
8761b649   Pavel Govyadinov   moved a lot of th...
1242
  					setSeed(x, y, z);
ac430567   Pavel Govyadinov   comments comments...
1243
1244
  					setSeedVec(u, v, w);
  					setSeedMag(m);
84eff8b1   Pavel Govyadinov   Merged only the n...
1245
1246
1247
1248
1249
                     		}
                     	myfile.close();
  	          	} else {
          	                  std::cerr<<"failed" << std::endl;
  			}
79a9bf3f   Pavel Govyadinov   new implementatio...
1250
1251
  		}
  		
ac430567   Pavel Govyadinov   comments comments...
1252
  		///Saves the network to a file.
79a9bf3f   Pavel Govyadinov   new implementatio...
1253
  		void
84eff8b1   Pavel Govyadinov   Merged only the n...
1254
  		saveNetwork(std::string name)
79a9bf3f   Pavel Govyadinov   new implementatio...
1255
  		{
8761b649   Pavel Govyadinov   moved a lot of th...
1256
1257
1258
1259
  			stim::glObj<float> sk;
  			for(int i = 0; i < nt.sizeE(); i++)
  			{
  				std::vector<stim::vec< float > > cm = nt.getEdgeCenterLineMag(i);
7d3162a2   Pavel Govyadinov   fixed majority of...
1260
                   		std::vector<stim::vec3< float > > ce = nt.getEdgeCenterLine(i);
8761b649   Pavel Govyadinov   moved a lot of th...
1261
1262
1263
1264
1265
1266
1267
1268
  				sk.Begin(stim::OBJ_LINE);
  				for(int j = 0; j < ce.size(); j++)
  				{
  					sk.TexCoord(cm[j][0]);
  					sk.Vertex(ce[j][0], ce[j][1], ce[j][2]);
  				}
  				sk.End();
  			}	
84eff8b1   Pavel Govyadinov   Merged only the n...
1269
  			sk.save(name);
79a9bf3f   Pavel Govyadinov   new implementatio...
1270
  		}
84eff8b1   Pavel Govyadinov   Merged only the n...
1271
  
8761b649   Pavel Govyadinov   moved a lot of th...
1272
  		///Depreciated, but might be reused later()
ac430567   Pavel Govyadinov   comments comments...
1273
  		///returns a COPY of the entire stim::glObj object.
84eff8b1   Pavel Govyadinov   Merged only the n...
1274
1275
1276
  		stim::glObj<float>
  		getNetwork()
  		{
7d3162a2   Pavel Govyadinov   fixed majority of...
1277
  
84eff8b1   Pavel Govyadinov   Merged only the n...
1278
  		}
ac430567   Pavel Govyadinov   comments comments...
1279
1280
1281
1282
1283
1284
1285
  
  		///returns a COPY of the entire stim::glnetwork object.
  		stim::glnetwork<T>
  		getGLNetwork()
  		{
  			return nt;
  		}
84eff8b1   Pavel Govyadinov   Merged only the n...
1286
1287
1288
1289
1290
1291
  		
  		///Function to get back the framebuffer Object attached to the spider.
  		///For external access.
  		GLuint
  		getFB()
  		{
035d798f   Pavel Govyadinov   modified the spid...
1292
  			return bfboID;
84eff8b1   Pavel Govyadinov   Merged only the n...
1293
1294
  		}
  
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
1295
1296
1297
1298
1299
1300
1301
1302
  //--------------------------------------------------------------------------//
  //-----------------------------TEMPORARY METHODS----------------------------//
  //--------------------------------------------------------------------------//
  
  		///temporary Method necessary for visualization and testing.
  		void
  		Update()
  		{
7d3162a2   Pavel Govyadinov   fixed majority of...
1303
  			vec3<float> Y(1.0,0.0,0.0);
8e56a0a7   Pavel Govyadinov   Added the propose...
1304
  			if(cos(Y.dot(d))< 0.087){
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
1305
  				Y[0] = 0.0; Y[1] = 1.0;}
8e56a0a7   Pavel Govyadinov   Added the propose...
1306
1307
1308
  			hor = stim::rect<float>(m, p, d.norm(),
  				((Y.cross(d)).cross(d)).norm());
  			ver = stim::rect<float>(m, p, d.norm(),
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
1309
1310
1311
1312
  				 hor.n());
  		}
  
  
c4887649   Pavel Govyadinov   fixed a significa...
1313
  		int
13c2a7d4   Pavel Govyadinov   some changes to t...
1314
1315
  		Step()
  		{
c0e09133   Pavel Govyadinov   STABLE: made temp...
1316
  			Bind(texbufferID, fboID, numSamples, t_length);
84eff8b1   Pavel Govyadinov   Merged only the n...
1317
  			CHECK_OPENGL_ERROR
035d798f   Pavel Govyadinov   modified the spid...
1318
  				findOptimalDirection();
3f15dade   Pavel Govyadinov   changed the plane...
1319
  			Unbind();
c0e09133   Pavel Govyadinov   STABLE: made temp...
1320
  			Bind(ptexbufferID, pfboID, numSamplesPos, t_length);
035d798f   Pavel Govyadinov   modified the spid...
1321
  				findOptimalPosition();
3f15dade   Pavel Govyadinov   changed the plane...
1322
  			Unbind();
c0e09133   Pavel Govyadinov   STABLE: made temp...
1323
  			Bind(mtexbufferID, mfboID, numSamplesMag, t_length);
035d798f   Pavel Govyadinov   modified the spid...
1324
  				findOptimalScale();
3f15dade   Pavel Govyadinov   changed the plane...
1325
  			Unbind();
84eff8b1   Pavel Govyadinov   Merged only the n...
1326
1327
  			CHECK_OPENGL_ERROR
  
59781ee3   Pavel Govyadinov   fixed a stask bug...
1328
1329
1330
  			return current_cost;
  		}
  
556c4e15   Pavel Govyadinov   Changed the handl...
1331
1332
1333
1334
  
  		void
  		printTransform()
  		{
8e56a0a7   Pavel Govyadinov   Added the propose...
1335
  			std::cout << cT << std::endl;
b710b044   Pavel Govyadinov   Added more tempor...
1336
  		}
a9b45efe   Pavel Govyadinov   changes to spider
1337
  
f31bf86d   Pavel Govyadinov   Added skeleton fu...
1338
1339
1340
1341
1342
1343
  
  //--------------------------------------------------------------------------//
  //-----------------------------EXPERIMENTAL METHODS-------------------------//
  //--------------------------------------------------------------------------//
  
  		void
efe7b7cc   Pavel Govyadinov   Added a detailed ...
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
  		MonteCarloDirectionVectors(int nSamples, float solidAngle = 2*M_PI)
  		{
  			float PHI[2], Z[2], range;
  			PHI[0] = asin(solidAngle/2);
  			PHI[1] = asin(0);
  			
  			Z[0] = cos(PHI[0]);
  			Z[1] = cos(PHI[1]);
  
  			
  			range = Z[0] - Z[1];
  
  
  			float z, theta, phi;
  			
  			std::vector<stim::vec3<float> > vecsUni;
  			for(int i = 0; i < numSamplesPos; i++)
  			{
  				stim::vec3<float> a(uniformRandom()*0.8, uniformRandom()*0.8, 0.0);
  				a[0] = a[0]-0.4;
  				a[1] = a[1]-0.4;
  				vecsUni.push_back(a);
  			}
  
  			stringstream name;
  			for(int i = 0; i < numSamplesPos; i++)
  				name << vecsUni[i].str() << std::endl;
  			
  			std::ofstream outFile;
  			outFile.open("New_Pos_Vectors.txt");
  			outFile << name.str().c_str();
  		}
  		void
f31bf86d   Pavel Govyadinov   Added skeleton fu...
1377
1378
  		DrawCylinder()
  		{	 
f31bf86d   Pavel Govyadinov   Added skeleton fu...
1379
1380
1381
  			 glNewList(dList+3, GL_COMPILE);
  			 float z0 = -0.5; float z1 = 0.5; float r0 = 0.5;
  			 float x,y;
84eff8b1   Pavel Govyadinov   Merged only the n...
1382
  			 float xold = 0.5; float yold = 0.0;
ac430567   Pavel Govyadinov   comments comments...
1383
1384
  			 float step = 360.0/numSamples*32;
  			 //float step = 360.0/8.0;
f31bf86d   Pavel Govyadinov   Added skeleton fu...
1385
1386
  			 glEnable(GL_TEXTURE_3D);
  			 glBindTexture(GL_TEXTURE_3D, texID);
ac430567   Pavel Govyadinov   comments comments...
1387
  			 glBegin(GL_QUAD_STRIP);
84eff8b1   Pavel Govyadinov   Merged only the n...
1388
  			 int j = 0;
f31bf86d   Pavel Govyadinov   Added skeleton fu...
1389
1390
1391
1392
1393
  			 	for(float i = step; i <= 360.0; i += step)
  			 	{
  					 x=r0*cos(i*2.0*M_PI/360.0);
  					 y=r0*sin(i*2.0*M_PI/360.0);
  					 glTexCoord3f(x,y,z0); 
ac430567   Pavel Govyadinov   comments comments...
1394
1395
  					 glVertex2f(0.0, j*6.4+6.4);
  //					 glVertex2f(0.0, j*27.0+27.0);
f31bf86d   Pavel Govyadinov   Added skeleton fu...
1396
  					 glTexCoord3f(x,y,z1); 
ac430567   Pavel Govyadinov   comments comments...
1397
1398
  					 glVertex2f(16.0, j*6.4+6.4);
  //					 glVertex2f(16.0, j*27.0+27.0);
f31bf86d   Pavel Govyadinov   Added skeleton fu...
1399
  					 glTexCoord3f(xold,yold,z1); 
ac430567   Pavel Govyadinov   comments comments...
1400
1401
  					 glVertex2f(16.0, j*6.4); 
  //					 glVertex2f(16.0, j*27.0); 
f31bf86d   Pavel Govyadinov   Added skeleton fu...
1402
  					 glTexCoord3f(xold,yold,z0); 
ac430567   Pavel Govyadinov   comments comments...
1403
1404
  					 glVertex2f(0.0, j*6.4);
  //					 glVertex2f(0.0, j*27.0);
f31bf86d   Pavel Govyadinov   Added skeleton fu...
1405
1406
1407
1408
1409
1410
  					 xold=x;
  					 yold=y;
  					 j++;
  				}
  		      	 glEnd();  
  			 glEndList();
f31bf86d   Pavel Govyadinov   Added skeleton fu...
1411
  		}
e45b97ce   Pavel Govyadinov   safety commit, I ...
1412
  
8c4f5d84   Pavel Govyadinov   fixed the issue w...
1413
  ///need to return the cylinder.
e45b97ce   Pavel Govyadinov   safety commit, I ...
1414
1415
1416
1417
1418
1419
1420
  		void
  		DrawLongCylinder(int n = 8, int l_template = 8,int l_square = 8)
  		{
  			int cylLen = cL.size()-1;
  			GenerateFBO(n*l_square, cylLen*l_template, btexbufferID, bfboID);
  			Bind(btexbufferID, bfboID, cylLen, l_template*l_square/2.0);
  			stim::cylinder<float> cyl(cL, cM);
7d3162a2   Pavel Govyadinov   fixed majority of...
1421
  			std::vector<std::vector<stim::vec3<float> > > p = cyl.getPoints(n);
e45b97ce   Pavel Govyadinov   safety commit, I ...
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
  			for(int i = 0; i < p.size()-1; i++)	///number of circles
  			{
  				for(int j = 0; j < p[0].size()-1; j++)		///points in the circle
  				{
  					glBegin(GL_QUADS);
  						glTexCoord3f(p[i][j][0], p[i][j][1], p[i][j][2]);
  						glVertex2f(j*l_square,  i*(float)l_template); 
  
  						glTexCoord3f(p[i][j+1][0], p[i][j+1][1], p[i][j+1][2]);
  						glVertex2f(j*l_square+l_square, i*(float)l_template); 
  
  						glTexCoord3f(p[i+1][j+1][0], p[i+1][j+1][1], p[i+1][j+1][2]);
  						glVertex2f(j*l_square+l_square, i*(float)l_template+(float)l_template); 
  
  						glTexCoord3f(p[i+1][j][0], p[i+1][j][1], p[i+1][j][2]);
  						glVertex2f(j*l_square,i*(float)l_template+(float)l_template); 
  					glEnd();
  				}
  			}
  			Unbind();
  		}
84eff8b1   Pavel Govyadinov   Merged only the n...
1443
1444
1445
1446
1447
1448
1449
  		
  
  		///@param min_cost the cost value used for tracing
  		///traces out each seedpoint in the seeds queue to completion in both directions.
  		void
  		trace(int min_cost)
  		{	
59781ee3   Pavel Govyadinov   fixed a stask bug...
1450
1451
  			bool sEmpty = true;
  			float lastmag = 16.0;;
7d3162a2   Pavel Govyadinov   fixed majority of...
1452
1453
  			stim::vec3<float> curSeed; 
  			stim::vec3<float> curSeedVec;			
8761b649   Pavel Govyadinov   moved a lot of th...
1454
1455
  			float curSeedMag;
  			while(!Empty())
84eff8b1   Pavel Govyadinov   Merged only the n...
1456
1457
1458
  			{
  				//clear the currently traced line and start a new one.
  				cL.clear();
ac430567   Pavel Govyadinov   comments comments...
1459
  				cM.clear();
8761b649   Pavel Govyadinov   moved a lot of th...
1460
1461
1462
1463
  				cD.clear();
  				curSeed = seeds.top();
  				curSeedVec = seedsvecs.top();
  				curSeedMag = seedsmags.top();
59781ee3   Pavel Govyadinov   fixed a stask bug...
1464
1465
  				seeds.pop();
  				seedsvecs.pop();
ac430567   Pavel Govyadinov   comments comments...
1466
  				seedsmags.pop();
59781ee3   Pavel Govyadinov   fixed a stask bug...
1467
  //				std::cout << "The current seed Vector is " << curSeedVec << std::endl;
84eff8b1   Pavel Govyadinov   Merged only the n...
1468
1469
  				setPosition(curSeed);
  				setDirection(curSeedVec);
8761b649   Pavel Govyadinov   moved a lot of th...
1470
1471
1472
1473
1474
  				setMagnitude(curSeedMag);
  //				cL.push_back(curSeed);
  //				cM.push_back(curSeedMag);
  //				cD.push_back(curSeedMag);
  				pair<stim::fiber<float>, int> a = traceLine(p, m, min_cost);
84eff8b1   Pavel Govyadinov   Merged only the n...
1475
  			}
84eff8b1   Pavel Govyadinov   Merged only the n...
1476
1477
  		}
  
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1478
  		int
7d3162a2   Pavel Govyadinov   fixed majority of...
1479
  		selectObject(stim::vec3<float> loc, stim::vec3<float> dir, float mag) 
84eff8b1   Pavel Govyadinov   Merged only the n...
1480
1481
  		{
  		//Define the varibles and turn on Selection Mode
efe7b7cc   Pavel Govyadinov   Added a detailed ...
1482
1483
1484
1485
  			
  			#ifdef TIMING
  				gpuStartTimer();
  			#endif
84eff8b1   Pavel Govyadinov   Merged only the n...
1486
1487
1488
1489
1490
1491
1492
  
  			float s = 3.0;
  			GLuint selectBuf[2048];
  			GLint hits;
  			glSelectBuffer(2048, selectBuf);
  			glDisable(GL_CULL_FACE);
  			(void) glRenderMode(GL_SELECT);
84eff8b1   Pavel Govyadinov   Merged only the n...
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
  		//Init Names stack
  
  			glInitNames();
  			glPushName(1);
  
  			CHECK_OPENGL_ERROR
  		//What would that vessel see in front of it.
  				camSel.setPosition(loc);
  				camSel.setFocalDistance(mag/s);
  				camSel.LookAt((loc[0]+dir[0]*mag/s),
  					 (loc[1]+dir[1]*mag/s),
  					 (loc[2]+dir[2]*mag/s));
  				ps  = camSel.getPosition();
  				ups = camSel.getUp();
  				ds  = camSel.getLookAt();
  				glMatrixMode(GL_PROJECTION);
  				glPushMatrix();
  				glLoadIdentity();
1306fd96   Pavel Govyadinov   minor bug fixes i...
1511
  				glOrtho(-mag/s/2.0, mag/s/2.0, -mag/s/2.0, mag/s/2.0, 0.0, mag/s/2.0);
84eff8b1   Pavel Govyadinov   Merged only the n...
1512
1513
1514
1515
1516
1517
1518
1519
  				glMatrixMode(GL_MODELVIEW);
  				glPushMatrix();
  				glLoadIdentity();
  				
  				CHECK_OPENGL_ERROR
  				gluLookAt(ps[0], ps[1], ps[2],
  					 ds[0], ds[1], ds[2],
  					 ups[0], ups[1], ups[2]);
23af8e36   Pavel Govyadinov   modified spider t...
1520
1521
1522
1523
  
  //				sk.Render();
  				nt.Render();								
  
84eff8b1   Pavel Govyadinov   Merged only the n...
1524
  				CHECK_OPENGL_ERROR
23af8e36   Pavel Govyadinov   modified spider t...
1525
1526
1527
1528
1529
1530
1531
1532
  
  
  //				glLoadName((int) sk.numL());
  				glLoadName(nt.sizeE());
  
  //				sk.RenderLine(cL);
  				nt.RenderLine(cL);	
  
84eff8b1   Pavel Govyadinov   Merged only the n...
1533
1534
1535
1536
1537
1538
1539
1540
1541
  //				glPopName();
  				glFlush();
  
  				glMatrixMode(GL_PROJECTION);
  				glPopMatrix();
  				glMatrixMode(GL_MODELVIEW);
  				CHECK_OPENGL_ERROR
  				glPopMatrix();
  
59781ee3   Pavel Govyadinov   fixed a stask bug...
1542
  		//	glEnable(GL_CULL_FACE);
84eff8b1   Pavel Govyadinov   Merged only the n...
1543
  			hits = glRenderMode(GL_RENDER);
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1544
  			int found_hits = processHits(hits, selectBuf);
efe7b7cc   Pavel Govyadinov   Added a detailed ...
1545
1546
1547
1548
  			#ifdef TIMING
  				hit_time += gpuStopTimer();
  			#endif
  
84eff8b1   Pavel Govyadinov   Merged only the n...
1549
1550
1551
1552
1553
  			return found_hits;
  		}
  
  		//Given a size of the array (hits) and the memory holding it (buffer)
  		//returns whether a hit tool place or not.
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1554
  		int
84eff8b1   Pavel Govyadinov   Merged only the n...
1555
1556
1557
  		processHits(GLint hits, GLuint buffer[])
  		{
  			GLuint names, *ptr;
59781ee3   Pavel Govyadinov   fixed a stask bug...
1558
  			//printf("hits = %u\n", hits);
84eff8b1   Pavel Govyadinov   Merged only the n...
1559
  			ptr = (GLuint *) buffer;
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
  		//	for (int i = 0; i < hits; i++) { /*  for each hit  */
  			names = *ptr;
  		//		printf (" number of names for hit = %u\n", names);
  			ptr++;
  			ptr++; //Skip the minimum depth value.  
  			ptr++; //Skip the maximum depth value.
  		//		printf ("   the name is ");                                                        
  		//		for (int j = 0; j < names; j++) {     /*  for each name */
  		//			printf ("%u ", *ptr); ptr++;
  		//		}
  		//		printf ("\n");
  	//		}
  
  			
84eff8b1   Pavel Govyadinov   Merged only the n...
1574
  			if(hits == 0)
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1575
1576
1577
  			{
  				return -1;
  			}
84eff8b1   Pavel Govyadinov   Merged only the n...
1578
  			else
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1579
  			{
035d798f   Pavel Govyadinov   modified the spid...
1580
  //				printf ("%u ", *ptr);
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1581
1582
1583
1584
1585
1586
1587
1588
  				return *ptr;
  			}
  		}
  
  		void
  		clearCurrent()
  		{
  			cL.clear();
ac430567   Pavel Govyadinov   comments comments...
1589
  			cM.clear();
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1590
1591
  		}	
  	
23af8e36   Pavel Govyadinov   modified spider t...
1592
  		void
7d3162a2   Pavel Govyadinov   fixed majority of...
1593
1594
  		addToNetwork(pair<stim::fiber<float>, int> in, stim::vec3<float> spos, 
  				stim::vec<float> smag, stim::vec3<float> sdir)
23af8e36   Pavel Govyadinov   modified spider t...
1595
  		{
efe7b7cc   Pavel Govyadinov   Added a detailed ...
1596
1597
1598
1599
  			#ifdef TIMING
  				 double s = std::clock();
  			#endif
  			
7d3162a2   Pavel Govyadinov   fixed majority of...
1600
                          std::vector<stim::vec3<float> > ce = in.first.centerline();                
23af8e36   Pavel Govyadinov   modified spider t...
1601
                          std::vector<stim::vec<float> > cm = in.first.centerlinemag();
6707e8f5   Pavel Govyadinov   handled the case ...
1602
  			//if the fiber is longer than 2 steps (the number it takes to diverge)
6b8621f8   Pavel Govyadinov   stable version
1603
  			if(ce.size() > 3)
6707e8f5   Pavel Govyadinov   handled the case ...
1604
1605
  			{	
  				//if we did not hit a fiber
23af8e36   Pavel Govyadinov   modified spider t...
1606
1607
  				if(in.second == -1)
  				{
6707e8f5   Pavel Govyadinov   handled the case ...
1608
1609
1610
  					spos[0] = spos[0]-sdir[0]*smag[0]/2.;
  					spos[1] = spos[1]-sdir[1]*smag[0]/2.;
  					spos[2] = spos[2]-sdir[2]*smag[0]/2.;
821409d5   Pavel Govyadinov   added a way to ad...
1611
  					int h = selectObject(spos, -sdir, smag[0]);
6707e8f5   Pavel Govyadinov   handled the case ...
1612
  					//did we start with a fiber?
11c1b46b   Pavel Govyadinov   minor bug fixes a...
1613
  					if(h != -1 && h < nt.sizeE())
821409d5   Pavel Govyadinov   added a way to ad...
1614
1615
1616
  						nt.addEdge(ce, cm, h, -1);
  					else
  						nt.addEdge(ce, cm, -1, -1);
23af8e36   Pavel Govyadinov   modified spider t...
1617
  				}
6707e8f5   Pavel Govyadinov   handled the case ...
1618
  				//if we hit a fiber?
23af8e36   Pavel Govyadinov   modified spider t...
1619
1620
  				else if(in.second != -1)
  				{
6707e8f5   Pavel Govyadinov   handled the case ...
1621
1622
1623
1624
  					nt.addEdge(ce,cm,-1, in.second);
  					spos[0] = spos[0]-sdir[0]*smag[0]/2.;
  					spos[1] = spos[1]-sdir[1]*smag[0]/2.;
  					spos[2] = spos[2]-sdir[2]*smag[0]/2.;
6707e8f5   Pavel Govyadinov   handled the case ...
1625
1626
  					int h = selectObject(spos, -sdir, smag[0]);
  					//did start with a fiber?
11c1b46b   Pavel Govyadinov   minor bug fixes a...
1627
  					if(h != -1 && h < nt.sizeE()){	
ac430567   Pavel Govyadinov   comments comments...
1628
1629
  			//			std::cout << "got here double" << smag.str() << std::endl;
  						nt.addEdge(ce,cm, h, in.second);	
27194b56   Pavel Govyadinov   major bug fixes, ...
1630
  					} else { nt.addEdge(ce,cm, -1, -1);}
23af8e36   Pavel Govyadinov   modified spider t...
1631
1632
  				}
  			}		
efe7b7cc   Pavel Govyadinov   Added a detailed ...
1633
1634
1635
1636
1637
  
  			#ifdef TIMING
  				double network_time = (std::clock() - s) / (double) CLOCKS_PER_SEC;
  				network_time += network_time * 1000.0;
  			#endif
23af8e36   Pavel Govyadinov   modified spider t...
1638
1639
  		}
  
23af8e36   Pavel Govyadinov   modified spider t...
1640
  
821409d5   Pavel Govyadinov   added a way to ad...
1641
1642
1643
  		void
  		printSizes()
  		{
035d798f   Pavel Govyadinov   modified the spid...
1644
1645
  			std::cout << nt.sizeE() << " edges " << std::endl;
  			std::cout << nt.sizeV() << " nodes " << std::endl;
821409d5   Pavel Govyadinov   added a way to ad...
1646
1647
1648
  			
  		}
  
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1649
  		std::pair<stim::fiber<float>, int >
7d3162a2   Pavel Govyadinov   fixed majority of...
1650
  		traceLine(stim::vec3<float> pos, stim::vec<float> mag, int min_cost)
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1651
  		{
821409d5   Pavel Govyadinov   added a way to ad...
1652
  			//starting (seed) position and magnitude.
7d3162a2   Pavel Govyadinov   fixed majority of...
1653
  			stim::vec3<float> spos = getPosition();
821409d5   Pavel Govyadinov   added a way to ad...
1654
  			stim::vec<float> smag = getMagnitude();
7d3162a2   Pavel Govyadinov   fixed majority of...
1655
  			stim::vec3<float> sdir = getDirection();	
821409d5   Pavel Govyadinov   added a way to ad...
1656
  
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1657
  			Bind();
8761b649   Pavel Govyadinov   moved a lot of th...
1658
  //			sk.Begin(stim::OBJ_LINE);
23af8e36   Pavel Govyadinov   modified spider t...
1659
1660
1661
1662
1663
  
  
  //			sk.createFromSelf(GL_SELECT);
  			nt.createFromSelf(GL_SELECT);
  
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1664
1665
1666
1667
1668
1669
1670
1671
  			cL.push_back(pos);
  			cM.push_back(mag);
  
  //			setPosition(pos);
  //			setMagnitude(mag);
  			int h;
  			bool started = false;
  			bool running = true;
7d3162a2   Pavel Govyadinov   fixed majority of...
1672
  			stim::vec3<float> size(S[0]*R[0], S[1]*R[1], S[2]*R[2]);
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1673
1674
1675
1676
1677
  			while(running)
  			{
  				int cost = Step();
  				if (cost > min_cost){
  					running = false;
8761b649   Pavel Govyadinov   moved a lot of th...
1678
  //					sk.End();
3e5d3ad3   Pavel Govyadinov   merged the change...
1679
  					branchDetection2();
23af8e36   Pavel Govyadinov   modified spider t...
1680
  					pair<stim::fiber<float>, int> a(stim::fiber<float> (cL, cM), -1);
821409d5   Pavel Govyadinov   added a way to ad...
1681
  					addToNetwork(a, spos, smag, sdir);
c0e09133   Pavel Govyadinov   STABLE: made temp...
1682
  //					std::cout << "the cost of " << cost << " > " << min_cost << std::endl;
23af8e36   Pavel Govyadinov   modified spider t...
1683
  					return a;
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1684
1685
1686
1687
1688
1689
1690
1691
  					break;
  				} else {
  					//Have we found the edge of the map?
  					pos = getPosition();
  					if(pos[0] > size[0] || pos[1] > size[1]
  					 || pos[2] > size[2] || pos[0] < 0
  					 || pos[1] < 0 || pos[2] < 0)
  					{
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1692
  						running = false;
3e5d3ad3   Pavel Govyadinov   merged the change...
1693
  						branchDetection2();
23af8e36   Pavel Govyadinov   modified spider t...
1694
  						pair<stim::fiber<float>, int> a(stim::fiber<float> (cL, cM), -1);
821409d5   Pavel Govyadinov   added a way to ad...
1695
  						addToNetwork(a, spos, smag, sdir);
c0e09133   Pavel Govyadinov   STABLE: made temp...
1696
  //						std::cout << "I hit and edge" << std::endl;
23af8e36   Pavel Govyadinov   modified spider t...
1697
  						return a;
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1698
1699
1700
1701
1702
1703
1704
1705
1706
  						break;
  					}
  					//If this is the first step in the trace,
  					// save the direction
  					//(to be used later to trace the fiber in the opposite direction)
  					if(started == false){
  						rev = -getDirection();
  						started = true;
  					}
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1707
1708
1709
  					//Has the template size gotten unreasonable?
  					mag = getMagnitude();
  					if(mag[0] > 75 || mag[0] < 1){
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1710
  						running = false;
3e5d3ad3   Pavel Govyadinov   merged the change...
1711
  						branchDetection2();
23af8e36   Pavel Govyadinov   modified spider t...
1712
  						pair<stim::fiber<float>, int> a(stim::fiber<float> (cL, cM), -1);
821409d5   Pavel Govyadinov   added a way to ad...
1713
  						addToNetwork(a, spos, smag, sdir);
c0e09133   Pavel Govyadinov   STABLE: made temp...
1714
  //						std::cout << "The templates are too big" << std::endl;
23af8e36   Pavel Govyadinov   modified spider t...
1715
  						return a;
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1716
1717
1718
1719
1720
1721
1722
  						break;
  					}
  					else
  					{
  						h = selectObject(p, getDirection(), m[0]);
  						//Have we hit something previously traced?
  						if(h != -1){
c0e09133   Pavel Govyadinov   STABLE: made temp...
1723
  //							std::cout << "I hit the fiber " << h << std::endl;
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1724
  							running = false;
3e5d3ad3   Pavel Govyadinov   merged the change...
1725
  							branchDetection2();
6707e8f5   Pavel Govyadinov   handled the case ...
1726
  							pair<stim::fiber<float>, int> a(stim::fiber<float> (cL, cM), h);
821409d5   Pavel Govyadinov   added a way to ad...
1727
  							addToNetwork(a, spos, smag, sdir);
23af8e36   Pavel Govyadinov   modified spider t...
1728
  							return a;
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1729
1730
1731
  							break;
  						}
  						else {  
7d3162a2   Pavel Govyadinov   fixed majority of...
1732
  							cL.push_back(stim::vec3<float>(p[0], p[1],p[2]));
3f15dade   Pavel Govyadinov   changed the plane...
1733
  							cM.push_back(stim::vec<float>(m[0], m[0]));
3e5d3ad3   Pavel Govyadinov   merged the change...
1734
  //							Bind(btexbufferID, bfboID, 27);
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1735
1736
1737
1738
1739
1740
1741
  							Unbind();
  							CHECK_OPENGL_ERROR
  							
  						}
  				 	}
                   		}
           		}
84eff8b1   Pavel Govyadinov   Merged only the n...
1742
1743
  		}
  
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1744
  			
84eff8b1   Pavel Govyadinov   Merged only the n...
1745
  
4cefeb6d   Pavel Govyadinov   Changes to the re...
1746
  };
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
1747
1748
  }
  #endif