Blame view

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