Blame view

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