Blame view

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