Blame view

stim/gl/gl_spider.h 44.3 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.
ae05c3e4   Pavel Govyadinov   Found an error wi...
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
  			setDims(0.6, 0.6, 1.0);
11c1b46b   Pavel Govyadinov   minor bug fixes a...
873
  			setSize(1024.0, 1024.0, 1024.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
  		{
11c1b46b   Pavel Govyadinov   minor bug fixes a...
1061
  			std::cout << "sMag: " << mag << std::endl;
59781ee3   Pavel Govyadinov   fixed a stask bug...
1062
  			seedsmags.push(mag);
84eff8b1   Pavel Govyadinov   Merged only the n...
1063
  		}
79a9bf3f   Pavel Govyadinov   new implementatio...
1064
  
59781ee3   Pavel Govyadinov   fixed a stask bug...
1065
  
ac430567   Pavel Govyadinov   comments comments...
1066
1067
1068
  		///@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...
1069
1070
1071
1072
1073
  		///Adds a seed to the seed list.
  		///Assumes that the coordinates passes are in tissue space.
  		void
  		setSeed(float x, float y, float z)
  		{
11c1b46b   Pavel Govyadinov   minor bug fixes a...
1074
  			std::cout << "sPos: " << x << " " << y << " " << z << std::endl;
84eff8b1   Pavel Govyadinov   Merged only the n...
1075
1076
1077
  			seeds.push(stim::vec<float>(x, y, z));
  		}
  
ac430567   Pavel Govyadinov   comments comments...
1078
1079
1080
1081
  		///@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...
1082
1083
1084
  		void
  		setSeedVec(float x, float y, float z)
  		{
11c1b46b   Pavel Govyadinov   minor bug fixes a...
1085
  			std::cout << "sDir: " << x << " " << y << " " << z << std::endl;
84eff8b1   Pavel Govyadinov   Merged only the n...
1086
1087
  			seedsvecs.push(stim::vec<float>(x, y, z));
  		}
ac430567   Pavel Govyadinov   comments comments...
1088
1089
  		
  		///Method to get the top of the seed positions stack.
84eff8b1   Pavel Govyadinov   Merged only the n...
1090
1091
1092
1093
1094
1095
1096
  		stim::vec<float> 
  		getLastSeed()
  		{
  			stim::vec<float> tp = seeds.top();
  			return tp;
  		}
  
ac430567   Pavel Govyadinov   comments comments...
1097
  		///Method to get the top of the seed direction stack.
59781ee3   Pavel Govyadinov   fixed a stask bug...
1098
1099
1100
1101
1102
1103
1104
  		stim::vec<float> 
  		getLastSeedVec()
  		{
  			stim::vec<float> tp = seedsvecs.top();
  			return tp;
  		}
  
ac430567   Pavel Govyadinov   comments comments...
1105
  		///Method to get the top of the seed magnitude stack.
59781ee3   Pavel Govyadinov   fixed a stask bug...
1106
1107
1108
1109
1110
1111
1112
  		float
  		getLastSeedMag()
  		{
  			float tp = seedsmags.top();
  			return tp;
  		}
  
ac430567   Pavel Govyadinov   comments comments...
1113
  		///deletes all data associated with the last seed.
59781ee3   Pavel Govyadinov   fixed a stask bug...
1114
1115
1116
1117
1118
  		void
  		popSeed()
  		{
  			seeds.pop();
  			seedsvecs.pop();
6707e8f5   Pavel Govyadinov   handled the case ...
1119
  			seedsmags.pop();
59781ee3   Pavel Govyadinov   fixed a stask bug...
1120
  		}
ac430567   Pavel Govyadinov   comments comments...
1121
1122
  		
  		///returns the seeds position stack.
84eff8b1   Pavel Govyadinov   Merged only the n...
1123
1124
1125
1126
1127
1128
  		std::stack<stim::vec<float> >
  		getSeeds()
  		{
  			return seeds;
  		}
  
ac430567   Pavel Govyadinov   comments comments...
1129
  		///returns true if all seed stacks are empty, else false.
84eff8b1   Pavel Govyadinov   Merged only the n...
1130
1131
1132
  		bool
  		Empty()
  		{
ac430567   Pavel Govyadinov   comments comments...
1133
  			//return (seeds.empty() && seedsvecs.empty() && seedsmags.empty());
1306fd96   Pavel Govyadinov   minor bug fixes i...
1134
  			return (seeds.empty() && seedsvecs.empty());
84eff8b1   Pavel Govyadinov   Merged only the n...
1135
  		}
ac430567   Pavel Govyadinov   comments comments...
1136
1137
1138
  
  		///@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...
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
  		///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...
1149
1150
                             		float x, y, z, u, v, w, m;
                             		myfile >> x >> y >> z >> u >> v >> w >> m;
8761b649   Pavel Govyadinov   moved a lot of th...
1151
  					setSeed(x, y, z);
ac430567   Pavel Govyadinov   comments comments...
1152
1153
  					setSeedVec(u, v, w);
  					setSeedMag(m);
84eff8b1   Pavel Govyadinov   Merged only the n...
1154
1155
1156
1157
1158
                     		}
                     	myfile.close();
  	          	} else {
          	                  std::cerr<<"failed" << std::endl;
  			}
79a9bf3f   Pavel Govyadinov   new implementatio...
1159
1160
  		}
  		
ac430567   Pavel Govyadinov   comments comments...
1161
  		///Saves the network to a file.
79a9bf3f   Pavel Govyadinov   new implementatio...
1162
  		void
84eff8b1   Pavel Govyadinov   Merged only the n...
1163
  		saveNetwork(std::string name)
79a9bf3f   Pavel Govyadinov   new implementatio...
1164
  		{
8761b649   Pavel Govyadinov   moved a lot of th...
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
  			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...
1178
  			sk.save(name);
79a9bf3f   Pavel Govyadinov   new implementatio...
1179
  		}
84eff8b1   Pavel Govyadinov   Merged only the n...
1180
  
8761b649   Pavel Govyadinov   moved a lot of th...
1181
  		///Depreciated, but might be reused later()
ac430567   Pavel Govyadinov   comments comments...
1182
  		///returns a COPY of the entire stim::glObj object.
84eff8b1   Pavel Govyadinov   Merged only the n...
1183
1184
1185
  		stim::glObj<float>
  		getNetwork()
  		{
8761b649   Pavel Govyadinov   moved a lot of th...
1186
  //			return sk;
84eff8b1   Pavel Govyadinov   Merged only the n...
1187
  		}
ac430567   Pavel Govyadinov   comments comments...
1188
1189
1190
1191
1192
1193
1194
  
  		///returns a COPY of the entire stim::glnetwork object.
  		stim::glnetwork<T>
  		getGLNetwork()
  		{
  			return nt;
  		}
84eff8b1   Pavel Govyadinov   Merged only the n...
1195
1196
1197
1198
1199
1200
  		
  		///Function to get back the framebuffer Object attached to the spider.
  		///For external access.
  		GLuint
  		getFB()
  		{
035d798f   Pavel Govyadinov   modified the spid...
1201
  			return bfboID;
84eff8b1   Pavel Govyadinov   Merged only the n...
1202
1203
  		}
  
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
1204
1205
1206
1207
1208
1209
1210
1211
1212
  //--------------------------------------------------------------------------//
  //-----------------------------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...
1213
  			if(cos(Y.dot(d))< 0.087){
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
1214
  				Y[0] = 0.0; Y[1] = 1.0;}
8e56a0a7   Pavel Govyadinov   Added the propose...
1215
1216
1217
  			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...
1218
1219
1220
1221
  				 hor.n());
  		}
  
  
c4887649   Pavel Govyadinov   fixed a significa...
1222
  		int
13c2a7d4   Pavel Govyadinov   some changes to t...
1223
1224
  		Step()
  		{
035d798f   Pavel Govyadinov   modified the spid...
1225
  			Bind(texbufferID, fboID, numSamples);
84eff8b1   Pavel Govyadinov   Merged only the n...
1226
1227
1228
1229
  			CHECK_OPENGL_ERROR
  			#ifdef TESTING
  				start = std::clock();
  			#endif
035d798f   Pavel Govyadinov   modified the spid...
1230
  				findOptimalDirection();
3f15dade   Pavel Govyadinov   changed the plane...
1231
  			Unbind();
035d798f   Pavel Govyadinov   modified the spid...
1232
1233
  			Bind(ptexbufferID, pfboID, numSamplesPos);
  				findOptimalPosition();
3f15dade   Pavel Govyadinov   changed the plane...
1234
  			Unbind();
035d798f   Pavel Govyadinov   modified the spid...
1235
1236
  			Bind(mtexbufferID, mfboID, numSamplesMag);
  				findOptimalScale();
3f15dade   Pavel Govyadinov   changed the plane...
1237
  			Unbind();
84eff8b1   Pavel Govyadinov   Merged only the n...
1238
1239
  			CHECK_OPENGL_ERROR
  
59781ee3   Pavel Govyadinov   fixed a stask bug...
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
11c1b46b   Pavel Govyadinov   minor bug fixes a...
1245
  			std::cout << current_cost << std::endl;
59781ee3   Pavel Govyadinov   fixed a stask bug...
1246
1247
1248
  			return current_cost;
  		}
  
556c4e15   Pavel Govyadinov   Changed the handl...
1249
1250
1251
1252
  
  		void
  		printTransform()
  		{
8e56a0a7   Pavel Govyadinov   Added the propose...
1253
  			std::cout << cT << std::endl;
b710b044   Pavel Govyadinov   Added more tempor...
1254
  		}
a9b45efe   Pavel Govyadinov   changes to spider
1255
  
f31bf86d   Pavel Govyadinov   Added skeleton fu...
1256
1257
1258
1259
1260
1261
1262
1263
  
  //--------------------------------------------------------------------------//
  //-----------------------------EXPERIMENTAL METHODS-------------------------//
  //--------------------------------------------------------------------------//
  
  		void
  		DrawCylinder()
  		{	 
f31bf86d   Pavel Govyadinov   Added skeleton fu...
1264
1265
1266
  			 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...
1267
  			 float xold = 0.5; float yold = 0.0;
ac430567   Pavel Govyadinov   comments comments...
1268
1269
  			 float step = 360.0/numSamples*32;
  			 //float step = 360.0/8.0;
f31bf86d   Pavel Govyadinov   Added skeleton fu...
1270
1271
  			 glEnable(GL_TEXTURE_3D);
  			 glBindTexture(GL_TEXTURE_3D, texID);
ac430567   Pavel Govyadinov   comments comments...
1272
  			 glBegin(GL_QUAD_STRIP);
84eff8b1   Pavel Govyadinov   Merged only the n...
1273
  			 int j = 0;
f31bf86d   Pavel Govyadinov   Added skeleton fu...
1274
1275
1276
1277
1278
  			 	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...
1279
1280
  					 glVertex2f(0.0, j*6.4+6.4);
  //					 glVertex2f(0.0, j*27.0+27.0);
f31bf86d   Pavel Govyadinov   Added skeleton fu...
1281
  					 glTexCoord3f(x,y,z1); 
ac430567   Pavel Govyadinov   comments comments...
1282
1283
  					 glVertex2f(16.0, j*6.4+6.4);
  //					 glVertex2f(16.0, j*27.0+27.0);
f31bf86d   Pavel Govyadinov   Added skeleton fu...
1284
  					 glTexCoord3f(xold,yold,z1); 
ac430567   Pavel Govyadinov   comments comments...
1285
1286
  					 glVertex2f(16.0, j*6.4); 
  //					 glVertex2f(16.0, j*27.0); 
f31bf86d   Pavel Govyadinov   Added skeleton fu...
1287
  					 glTexCoord3f(xold,yold,z0); 
ac430567   Pavel Govyadinov   comments comments...
1288
1289
  					 glVertex2f(0.0, j*6.4);
  //					 glVertex2f(0.0, j*27.0);
f31bf86d   Pavel Govyadinov   Added skeleton fu...
1290
1291
1292
1293
1294
1295
  					 xold=x;
  					 yold=y;
  					 j++;
  				}
  		      	 glEnd();  
  			 glEndList();
f31bf86d   Pavel Govyadinov   Added skeleton fu...
1296
  		}
e45b97ce   Pavel Govyadinov   safety commit, I ...
1297
  
8c4f5d84   Pavel Govyadinov   fixed the issue w...
1298
  ///need to return the cylinder.
e45b97ce   Pavel Govyadinov   safety commit, I ...
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
1324
1325
1326
1327
  		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...
1328
1329
1330
1331
1332
1333
1334
  		
  
  		///@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...
1335
  //			rev = stim::vec<float>(0.0,0.0,1.0);
59781ee3   Pavel Govyadinov   fixed a stask bug...
1336
1337
  			bool sEmpty = true;
  			float lastmag = 16.0;;
8761b649   Pavel Govyadinov   moved a lot of th...
1338
1339
1340
1341
  			stim::vec<float> curSeed; 
  			stim::vec<float> curSeedVec;			
  			float curSeedMag;
  			while(!Empty())
84eff8b1   Pavel Govyadinov   Merged only the n...
1342
1343
1344
  			{
  				//clear the currently traced line and start a new one.
  				cL.clear();
ac430567   Pavel Govyadinov   comments comments...
1345
  				cM.clear();
8761b649   Pavel Govyadinov   moved a lot of th...
1346
1347
1348
1349
  				cD.clear();
  				curSeed = seeds.top();
  				curSeedVec = seedsvecs.top();
  				curSeedMag = seedsmags.top();
59781ee3   Pavel Govyadinov   fixed a stask bug...
1350
1351
  				seeds.pop();
  				seedsvecs.pop();
ac430567   Pavel Govyadinov   comments comments...
1352
  				seedsmags.pop();
59781ee3   Pavel Govyadinov   fixed a stask bug...
1353
  //				std::cout << "The current seed Vector is " << curSeedVec << std::endl;
84eff8b1   Pavel Govyadinov   Merged only the n...
1354
1355
  				setPosition(curSeed);
  				setDirection(curSeedVec);
8761b649   Pavel Govyadinov   moved a lot of th...
1356
1357
1358
1359
1360
  				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...
1361
  			}
84eff8b1   Pavel Govyadinov   Merged only the n...
1362
1363
  		}
  
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1364
  		int
84eff8b1   Pavel Govyadinov   Merged only the n...
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
  		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...
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
  		//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...
1393
  				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...
1394
1395
1396
1397
1398
1399
1400
1401
  				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...
1402
1403
1404
1405
  
  //				sk.Render();
  				nt.Render();								
  
84eff8b1   Pavel Govyadinov   Merged only the n...
1406
  				CHECK_OPENGL_ERROR
23af8e36   Pavel Govyadinov   modified spider t...
1407
1408
1409
1410
1411
1412
1413
1414
  
  
  //				glLoadName((int) sk.numL());
  				glLoadName(nt.sizeE());
  
  //				sk.RenderLine(cL);
  				nt.RenderLine(cL);	
  
84eff8b1   Pavel Govyadinov   Merged only the n...
1415
1416
1417
1418
1419
1420
1421
1422
1423
  //				glPopName();
  				glFlush();
  
  				glMatrixMode(GL_PROJECTION);
  				glPopMatrix();
  				glMatrixMode(GL_MODELVIEW);
  				CHECK_OPENGL_ERROR
  				glPopMatrix();
  
59781ee3   Pavel Govyadinov   fixed a stask bug...
1424
  		//	glEnable(GL_CULL_FACE);
84eff8b1   Pavel Govyadinov   Merged only the n...
1425
  			hits = glRenderMode(GL_RENDER);
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1426
  			int found_hits = processHits(hits, selectBuf);
84eff8b1   Pavel Govyadinov   Merged only the n...
1427
1428
1429
1430
1431
  			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...
1432
  		int
84eff8b1   Pavel Govyadinov   Merged only the n...
1433
1434
1435
  		processHits(GLint hits, GLuint buffer[])
  		{
  			GLuint names, *ptr;
59781ee3   Pavel Govyadinov   fixed a stask bug...
1436
  			//printf("hits = %u\n", hits);
84eff8b1   Pavel Govyadinov   Merged only the n...
1437
  			ptr = (GLuint *) buffer;
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
  		//	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...
1452
  			if(hits == 0)
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1453
1454
1455
  			{
  				return -1;
  			}
84eff8b1   Pavel Govyadinov   Merged only the n...
1456
  			else
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1457
  			{
035d798f   Pavel Govyadinov   modified the spid...
1458
  //				printf ("%u ", *ptr);
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1459
1460
1461
1462
1463
1464
1465
1466
  				return *ptr;
  			}
  		}
  
  		void
  		clearCurrent()
  		{
  			cL.clear();
ac430567   Pavel Govyadinov   comments comments...
1467
  			cM.clear();
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1468
1469
  		}	
  	
23af8e36   Pavel Govyadinov   modified spider t...
1470
  		void
821409d5   Pavel Govyadinov   added a way to ad...
1471
1472
  		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...
1473
1474
1475
  		{
                          std::vector<stim::vec<float> > ce = in.first.centerline();                
                          std::vector<stim::vec<float> > cm = in.first.centerlinemag();
6707e8f5   Pavel Govyadinov   handled the case ...
1476
  			//if the fiber is longer than 2 steps (the number it takes to diverge)
6b8621f8   Pavel Govyadinov   stable version
1477
  			if(ce.size() > 3)
6707e8f5   Pavel Govyadinov   handled the case ...
1478
1479
  			{	
  				//if we did not hit a fiber
23af8e36   Pavel Govyadinov   modified spider t...
1480
1481
  				if(in.second == -1)
  				{
6707e8f5   Pavel Govyadinov   handled the case ...
1482
1483
1484
  					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...
1485
  					int h = selectObject(spos, -sdir, smag[0]);
6707e8f5   Pavel Govyadinov   handled the case ...
1486
  					//did we start with a fiber?
11c1b46b   Pavel Govyadinov   minor bug fixes a...
1487
  					if(h != -1 && h < nt.sizeE())
821409d5   Pavel Govyadinov   added a way to ad...
1488
1489
1490
  						nt.addEdge(ce, cm, h, -1);
  					else
  						nt.addEdge(ce, cm, -1, -1);
23af8e36   Pavel Govyadinov   modified spider t...
1491
  				}
6707e8f5   Pavel Govyadinov   handled the case ...
1492
  				//if we hit a fiber?
23af8e36   Pavel Govyadinov   modified spider t...
1493
1494
  				else if(in.second != -1)
  				{
6707e8f5   Pavel Govyadinov   handled the case ...
1495
1496
1497
1498
  					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 ...
1499
1500
  					int h = selectObject(spos, -sdir, smag[0]);
  					//did start with a fiber?
11c1b46b   Pavel Govyadinov   minor bug fixes a...
1501
  					if(h != -1 && h < nt.sizeE()){	
ac430567   Pavel Govyadinov   comments comments...
1502
1503
  			//			std::cout << "got here double" << smag.str() << std::endl;
  						nt.addEdge(ce,cm, h, in.second);	
27194b56   Pavel Govyadinov   major bug fixes, ...
1504
  					} else { nt.addEdge(ce,cm, -1, -1);}
23af8e36   Pavel Govyadinov   modified spider t...
1505
1506
1507
1508
  				}
  			}		
  		}
  
23af8e36   Pavel Govyadinov   modified spider t...
1509
  
821409d5   Pavel Govyadinov   added a way to ad...
1510
1511
1512
  		void
  		printSizes()
  		{
035d798f   Pavel Govyadinov   modified the spid...
1513
1514
  			std::cout << nt.sizeE() << " edges " << std::endl;
  			std::cout << nt.sizeV() << " nodes " << std::endl;
821409d5   Pavel Govyadinov   added a way to ad...
1515
1516
1517
  			
  		}
  
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1518
1519
1520
  		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...
1521
1522
1523
1524
1525
  			//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...
1526
  			Bind();
8761b649   Pavel Govyadinov   moved a lot of th...
1527
  //			sk.Begin(stim::OBJ_LINE);
23af8e36   Pavel Govyadinov   modified spider t...
1528
1529
1530
1531
1532
  
  
  //			sk.createFromSelf(GL_SELECT);
  			nt.createFromSelf(GL_SELECT);
  
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
  			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...
1547
  //					sk.End();
3e5d3ad3   Pavel Govyadinov   merged the change...
1548
  					branchDetection2();
23af8e36   Pavel Govyadinov   modified spider t...
1549
  					pair<stim::fiber<float>, int> a(stim::fiber<float> (cL, cM), -1);
821409d5   Pavel Govyadinov   added a way to ad...
1550
  					addToNetwork(a, spos, smag, sdir);
23af8e36   Pavel Govyadinov   modified spider t...
1551
  					return a;
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1552
1553
1554
1555
1556
1557
1558
1559
  					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...
1560
  						running = false;
3e5d3ad3   Pavel Govyadinov   merged the change...
1561
  						branchDetection2();
23af8e36   Pavel Govyadinov   modified spider t...
1562
  						pair<stim::fiber<float>, int> a(stim::fiber<float> (cL, cM), -1);
821409d5   Pavel Govyadinov   added a way to ad...
1563
  						addToNetwork(a, spos, smag, sdir);
23af8e36   Pavel Govyadinov   modified spider t...
1564
  						return a;
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1565
1566
1567
1568
1569
1570
1571
1572
1573
  						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...
1574
1575
1576
  					//Has the template size gotten unreasonable?
  					mag = getMagnitude();
  					if(mag[0] > 75 || mag[0] < 1){
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1577
  						running = false;
3e5d3ad3   Pavel Govyadinov   merged the change...
1578
  						branchDetection2();
23af8e36   Pavel Govyadinov   modified spider t...
1579
  						pair<stim::fiber<float>, int> a(stim::fiber<float> (cL, cM), -1);
821409d5   Pavel Govyadinov   added a way to ad...
1580
  						addToNetwork(a, spos, smag, sdir);
23af8e36   Pavel Govyadinov   modified spider t...
1581
  						return a;
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1582
1583
1584
1585
1586
1587
1588
  						break;
  					}
  					else
  					{
  						h = selectObject(p, getDirection(), m[0]);
  						//Have we hit something previously traced?
  						if(h != -1){
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1589
  							running = false;
3e5d3ad3   Pavel Govyadinov   merged the change...
1590
  							branchDetection2();
6707e8f5   Pavel Govyadinov   handled the case ...
1591
  							pair<stim::fiber<float>, int> a(stim::fiber<float> (cL, cM), h);
821409d5   Pavel Govyadinov   added a way to ad...
1592
  							addToNetwork(a, spos, smag, sdir);
23af8e36   Pavel Govyadinov   modified spider t...
1593
  							return a;
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1594
1595
1596
1597
  							break;
  						}
  						else {  
  							cL.push_back(stim::vec<float>(p[0], p[1],p[2]));
3f15dade   Pavel Govyadinov   changed the plane...
1598
  							cM.push_back(stim::vec<float>(m[0], m[0]));
3e5d3ad3   Pavel Govyadinov   merged the change...
1599
  //							Bind(btexbufferID, bfboID, 27);
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1600
1601
1602
1603
1604
1605
1606
  							Unbind();
  							CHECK_OPENGL_ERROR
  							
  						}
  				 	}
                   		}
           		}
84eff8b1   Pavel Govyadinov   Merged only the n...
1607
1608
  		}
  
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1609
  			
84eff8b1   Pavel Govyadinov   Merged only the n...
1610
  
4cefeb6d   Pavel Govyadinov   Changes to the re...
1611
  };
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
1612
1613
  }
  #endif