Blame view

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