Blame view

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