Blame view

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