Blame view

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