Blame view

stim/gl/gl_spider.h 35.6 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"
1306fd96   Pavel Govyadinov   minor bug fixes i...
26
  //#include <stim/cuda/testKernel.cuh>
84eff8b1   Pavel Govyadinov   Merged only the n...
27
28
  
  //#include <stim/cuda/testKernel.cuh>
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
29
  
42145f38   Pavel Govyadinov   Fixed the issues ...
30
31
  #include <iostream>
  #include <fstream>
84eff8b1   Pavel Govyadinov   Merged only the n...
32
33
34
35
36
  #ifdef TESTING
  	#include <iostream>
  	#include <cstdio>
  	#include <ctime>
  #endif
42145f38   Pavel Govyadinov   Fixed the issues ...
37
  
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
38
  
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
39
40
41
42
  namespace stim
  {
  
  template<typename T>
84eff8b1   Pavel Govyadinov   Merged only the n...
43
  class gl_spider : public virtual gl_texture<T>
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
44
45
  {
  	//doen't use gl_texture really, just needs the GLuint id.
4cefeb6d   Pavel Govyadinov   Changes to the re...
46
  	//doesn't even need the texture iD really.
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
47
  	private:
84eff8b1   Pavel Govyadinov   Merged only the n...
48
49
  
  		//
8e56a0a7   Pavel Govyadinov   Added the propose...
50
51
  		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...
52
  						//always a unit vector.
8e56a0a7   Pavel Govyadinov   Added the propose...
53
  		stim::vec<float> m;	//magnitude of the spider vector.
4cefeb6d   Pavel Govyadinov   Changes to the re...
54
55
  						//mag[0] = length.
  						//mag[1] = width.
84eff8b1   Pavel Govyadinov   Merged only the n...
56
57
58
59
60
61
  		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...
62
  		GLuint texID;
84eff8b1   Pavel Govyadinov   Merged only the n...
63
64
65
66
67
68
69
70
71
  		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.
1306fd96   Pavel Govyadinov   minor bug fixes i...
72
73
74
75
76
77
  		GLuint pfboID;
  		GLuint ptexbufferID;
  
  		GLuint mfboID;
  		GLuint mtexbufferID;
  
84eff8b1   Pavel Govyadinov   Merged only the n...
78
79
80
  		GLuint bfboId;
  		GLuint btexbufferID;
  
1306fd96   Pavel Govyadinov   minor bug fixes i...
81
  
84eff8b1   Pavel Govyadinov   Merged only the n...
82
  		int numSamples;				//The number of templates in the buffer.
59781ee3   Pavel Govyadinov   fixed a stask bug...
83
  		float stepsize = 4.0;			//Step size.
c4887649   Pavel Govyadinov   fixed a significa...
84
  		int current_cost;
84eff8b1   Pavel Govyadinov   Merged only the n...
85
86
87
88
89
  		
  		
  		//Tracing variables.
  		std::stack< stim::vec<float> > seeds;	//Variables for tracing
  		std::stack< stim::vec<float> > seedsvecs;
59781ee3   Pavel Govyadinov   fixed a stask bug...
90
  		std::stack< float > seedsmags;
84eff8b1   Pavel Govyadinov   Merged only the n...
91
  		std::vector< stim::vec<float> > cL;	//Line currently being traced.
23af8e36   Pavel Govyadinov   modified spider t...
92
  
84eff8b1   Pavel Govyadinov   Merged only the n...
93
  		stim::glObj<float> sk;
23af8e36   Pavel Govyadinov   modified spider t...
94
95
  		stim::glnetwork<float> nt;
  
84eff8b1   Pavel Govyadinov   Merged only the n...
96
97
98
99
100
  		stim::vec<float> rev;			//reverse vector;
  		stim::camera camSel;
  		stim::vec<float> ps;
  		stim::vec<float> ups;
  		stim::vec<float> ds;
59781ee3   Pavel Govyadinov   fixed a stask bug...
101
  		std::vector<stim::vec<float> > last3;
84eff8b1   Pavel Govyadinov   Merged only the n...
102
103
  		
  
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
104
105
106
107
108
109
110
  
  		/// 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()
  		{
8e56a0a7   Pavel Govyadinov   Added the propose...
111
  			setMatrix();
db3c28c9   Pavel Govyadinov   Implemented glDis...
112
  			glCallList(dList);
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
113
  			int best = getCost();
5eeaf941   Pavel Govyadinov   changer to the ba...
114
115
116
117
  			stim::vec<float> next(
   			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...
118
  			0);
8e56a0a7   Pavel Govyadinov   Added the propose...
119
  			next = (cT*next).norm();
8e56a0a7   Pavel Govyadinov   Added the propose...
120
121
122
  			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...
123
  			setDirection(next[0], next[1], next[2]);
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
124
125
  		}
  
8e56a0a7   Pavel Govyadinov   Added the propose...
126
127
128
  		/// Method for finding the best d for the spider.
  		/// Not sure if necessary since the next p for the spider
  		/// will be at d * m.
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
129
130
131
  		void
  		findOptimalPosition()
  		{
8e56a0a7   Pavel Govyadinov   Added the propose...
132
  			setMatrix();
db3c28c9   Pavel Govyadinov   Implemented glDis...
133
  			glCallList(dList+1);
385d2447   Pavel Govyadinov   Checkpoint: Conve...
134
  			int best = getCost();
5eeaf941   Pavel Govyadinov   changer to the ba...
135
136
137
138
139
  			stim::vec<float> next(
   			pV[best][0],
  			pV[best][1],
  			pV[best][2],
  			1);
ef64ebad   Pavel Govyadinov   fixed a small mis...
140
  			next = cT*next;	
d4721000   Pavel Govyadinov   changes with debu...
141
142
  			setPosition(
  					next[0]*S[0]*R[0],
8e56a0a7   Pavel Govyadinov   Added the propose...
143
  					next[1]*S[1]*R[1],
d4721000   Pavel Govyadinov   changes with debu...
144
145
  					next[2]*S[2]*R[2]
  				   );
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
146
147
  		}
  	
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
148
149
150
  		/// 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...
151
152
153
  		void
  		findOptimalScale()
  		{
8e56a0a7   Pavel Govyadinov   Added the propose...
154
  			setMatrix();
db3c28c9   Pavel Govyadinov   Implemented glDis...
155
  			glCallList(dList+2);
385d2447   Pavel Govyadinov   Checkpoint: Conve...
156
  			int best = getCost();
d4721000   Pavel Govyadinov   changes with debu...
157
  			setMagnitude(m[0]*mV[best][0]);
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
158
159
  		}
  
f31bf86d   Pavel Govyadinov   Added skeleton fu...
160
161
162
  		void
  		branchDetection()
  		{
5eeaf941   Pavel Govyadinov   changer to the ba...
163
  			setMatrix();
f31bf86d   Pavel Govyadinov   Added skeleton fu...
164
  			glCallList(dList+3);
84eff8b1   Pavel Govyadinov   Merged only the n...
165
166
  			std::vector< stim::vec<float> > result = find_branch(
  					btexbufferID, GL_TEXTURE_2D, 16, 216);
59781ee3   Pavel Govyadinov   fixed a stask bug...
167
  			stim::vec<float> size(S[0]*R[0], S[1]*R[1], S[2]*R[2]);
84eff8b1   Pavel Govyadinov   Merged only the n...
168
169
170
171
  			if(!result.empty())
  			{
  				for(int i = 1; i < result.size(); i++)
  				{
84eff8b1   Pavel Govyadinov   Merged only the n...
172
173
174
175
176
  					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...
177
  					cylp = cT*cylp;
84eff8b1   Pavel Govyadinov   Merged only the n...
178
  					
59781ee3   Pavel Govyadinov   fixed a stask bug...
179
180
  					stim::vec<float> vec(
  						cylp[0]*S[0]*R[0],
84eff8b1   Pavel Govyadinov   Merged only the n...
181
182
  						cylp[1]*S[1]*R[1],
  						cylp[2]*S[2]*R[2]);
59781ee3   Pavel Govyadinov   fixed a stask bug...
183
184
185
186
187
  					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();
  					float seedm = m[0]/2.0;
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
188
189
  // Uncomment for global run 
  /*					stim::vec<float> lSeed = getLastSeed();
59781ee3   Pavel Govyadinov   fixed a stask bug...
190
191
192
  					if(sqrt(pow((lSeed[0] - vec[0]),2)
  					 + pow((lSeed[1] - vec[1]),2) + 
  					 pow((lSeed[2] - vec[2]),2)) > m[0]/4.0
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
193
  					 &&  */
1306fd96   Pavel Govyadinov   minor bug fixes i...
194
  					if(
59781ee3   Pavel Govyadinov   fixed a stask bug...
195
196
197
198
199
200
  					 !(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...
201
  						setSeedMag(seedm);
59781ee3   Pavel Govyadinov   fixed a stask bug...
202
  					}
84eff8b1   Pavel Govyadinov   Merged only the n...
203
204
  				}
  			}    
f31bf86d   Pavel Govyadinov   Added skeleton fu...
205
206
207
  			
  		}
  
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
208
209
  
  		
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
210
  		void
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
211
  		Optimize()
385d2447   Pavel Govyadinov   Checkpoint: Conve...
212
  		{
8e56a0a7   Pavel Govyadinov   Added the propose...
213
  			/*find the optimum d and scale */ 
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
214
  		}
385d2447   Pavel Govyadinov   Checkpoint: Conve...
215
  
a9b45efe   Pavel Govyadinov   changes to spider
216
  		
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
217
218
219
220
221
222
223
224
  		
  		
  //--------------------------------------------------------------------------//
  //---------------------TEMPLATE CREATION METHODS----------------------------//
  //--------------------------------------------------------------------------//
  
  		///@param solidAngle, the size of the arc to sample.
  		///Method for populating the vector arrays with sampled vectors.
8e56a0a7   Pavel Govyadinov   Added the propose...
225
  		///uses the default d vector <0,0,1>
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
226
  		void
59781ee3   Pavel Govyadinov   fixed a stask bug...
227
  		genDirectionVectors(float solidAngle = 5/M_PI*4)
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
228
  		{
5eeaf941   Pavel Govyadinov   changer to the ba...
229
230
  			//ofstream file;
  			//file.open("dvectors.txt");
8e56a0a7   Pavel Govyadinov   Added the propose...
231
  			//Set up the vectors necessary for Rectangle creation.
22e7d0c5   Pavel Govyadinov   Minor changes in ...
232
233
234
235
236
  			vec<float> Y(1.0,0.0,0.0);
  			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...
237
238
  			//Set up the variable necessary for vector creation.
  			vec<float> d_s = d.cart2sph().norm();
5eeaf941   Pavel Govyadinov   changer to the ba...
239
  			vec<float> temp(0,0,0);
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
240
  			int dim = (sqrt(numSamples)-1)/2;
25580fe7   Pavel Govyadinov   minor bug fix in ...
241
242
243
  			float p0  	= -M_PI;
  			float dt  	= solidAngle/(2.0 * ((float)dim + 1.0));
  			float dp  	= p0/(2.0*((float)dim + 1.0));
8e56a0a7   Pavel Govyadinov   Added the propose...
244
245
246
247
  			
  			glNewList(dList, GL_COMPILE);
  			//Loop over the space
  			int idx = 0;
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
248
249
  			for(int i = -dim; i <= dim; i++){
  				for(int j = -dim; j <= dim; j++){
5eeaf941   Pavel Govyadinov   changer to the ba...
250
  					
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
251
  					//Create linear index
8e56a0a7   Pavel Govyadinov   Added the propose...
252
  					idx = (j+dim)+(i+dim)*((dim*2)+1);	
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
253
  					temp[0] = d_s[0]; 			//rotate vector
25580fe7   Pavel Govyadinov   minor bug fix in ...
254
255
  					temp[1] = d_s[1]+dp*(float) i;
  					temp[2] = d_s[2]+dt*(float) j;
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
256
257
  					
  					temp = (temp.sph2cart()).norm();	//back to cart
8e56a0a7   Pavel Govyadinov   Added the propose...
258
259
260
261
262
263
264
265
266
267
  					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...
268
  					UpdateBuffer(0.0, 0.0+idx*8.0);
8e56a0a7   Pavel Govyadinov   Added the propose...
269
  					CHECK_OPENGL_ERROR
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
270
271
  				}
  			}
8e56a0a7   Pavel Govyadinov   Added the propose...
272
  			glEndList();
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
273
  		}
2a18be6d   Pavel Govyadinov   New comments and ...
274
  
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
275
276
277
  		///@param solidAngle, the size of the arc to sample.
  		///Method for populating the buffer with the sampled texture.
  		///uses the default vector <0,0,0>
a9f956be   Pavel Govyadinov   Fixed the cost fu...
278
  		void
4191c034   Pavel Govyadinov   minor:bug fixes. ...
279
  		genPositionVectors(float delta = 0.4)
a9f956be   Pavel Govyadinov   Fixed the cost fu...
280
  		{
8e56a0a7   Pavel Govyadinov   Added the propose...
281
282
283
284
285
286
287
  			//Set up the vectors necessary for Rectangle creation.
  			vec<float> Y(1.0,0.0,0.0);
  			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...
288
  			vec<float> temp(0,0,0);
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
289
290
  			int dim = (sqrt(numSamples)-1)/2;
  			stim::rect<float> samplingPlane =
5eeaf941   Pavel Govyadinov   changer to the ba...
291
  				 stim::rect<float>(p, d);
d4721000   Pavel Govyadinov   changes with debu...
292
  			samplingPlane.scale(mag[0]*delta, mag[0]*delta);
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
293
  			float step = 1.0/(dim);
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
294
  
8e56a0a7   Pavel Govyadinov   Added the propose...
295
296
297
298
  			//Loop over the samples, keeping the original p sample
  			//in the center of the resulting texture.
  			int idx;
  			glNewList(dList+1, GL_COMPILE);
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
299
300
301
  			for(int i = -dim; i <= dim; i++){
  				for(int j = -dim; j <= dim; j++){
  					//Create linear index
8e56a0a7   Pavel Govyadinov   Added the propose...
302
  					idx = (j+dim)+(i+dim)*((dim*2)+1);	
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
303
304
305
306
307
  
  					temp = samplingPlane.p(
  							0.5+step*i,
  								 0.5+step*j
  										);
8e56a0a7   Pavel Govyadinov   Added the propose...
308
309
310
311
312
313
314
315
  					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...
316
  					UpdateBuffer(0.0, 0.0+idx*8.0);
8e56a0a7   Pavel Govyadinov   Added the propose...
317
  				CHECK_OPENGL_ERROR
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
318
319
  				}
  			}
8e56a0a7   Pavel Govyadinov   Added the propose...
320
  			glEndList();
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
321
322
323
324
  		}
  
  		///@param solidAngle, the size of the arc to sample.
  		///Method for populating the buffer with the sampled texture.
8e56a0a7   Pavel Govyadinov   Added the propose...
325
  		///uses the default m <1,1,0>
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
326
  		void
79a9bf3f   Pavel Govyadinov   new implementatio...
327
  		genMagnitudeVectors(float delta = 0.70)
14b500f9   Pavel Govyadinov   minor bug fixes
328
  //		genMagnitudeVectors(float delta = 0.50)
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
329
330
  		{
  			
8e56a0a7   Pavel Govyadinov   Added the propose...
331
332
333
334
335
336
337
  			//Set up the vectors necessary for Rectangle creation.
  			vec<float> Y(1.0,0.0,0.0);
  			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.
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
338
339
340
341
342
  			int dim = (sqrt(numSamples)-1)/2;
  			float min 	= 1.0-delta;
  			float max 	= 1.0+delta;
  			float step	= (max-min)/(numSamples-1);
  			float factor;
5eeaf941   Pavel Govyadinov   changer to the ba...
343
  			vec<float> temp(0.0,0.0,0.0);
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
344
  
8e56a0a7   Pavel Govyadinov   Added the propose...
345
  			glNewList(dList+2, GL_COMPILE);
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
346
347
  			for(int i = 0; i < numSamples; i++){
  				//Create linear index
d4721000   Pavel Govyadinov   changes with debu...
348
  				factor = (min+step*i)*mag[0];
db3c28c9   Pavel Govyadinov   Implemented glDis...
349
  				temp = factor;
8e56a0a7   Pavel Govyadinov   Added the propose...
350
351
352
353
354
355
356
357
  				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...
358
  				UpdateBuffer(0.0, 0.0+i*8.0);
8e56a0a7   Pavel Govyadinov   Added the propose...
359
  			CHECK_OPENGL_ERROR
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
360
  			}
8e56a0a7   Pavel Govyadinov   Added the propose...
361
  			glEndList();
a9f956be   Pavel Govyadinov   Fixed the cost fu...
362
  		}
2a18be6d   Pavel Govyadinov   New comments and ...
363
364
  		///@param v_x x-coordinate in buffer-space,
  		///@param v_y y-coordinate in buffer-space.
2a18be6d   Pavel Govyadinov   New comments and ...
365
366
  		///Samples the texturespace and places a sample in the provided coordinates
  		///of bufferspace.
a9f956be   Pavel Govyadinov   Fixed the cost fu...
367
368
369
  		void
  		UpdateBuffer(float v_x, float v_y)
  		{	
79a9bf3f   Pavel Govyadinov   new implementatio...
370
  			float len = 8.0;
a9f956be   Pavel Govyadinov   Fixed the cost fu...
371
372
373
374
  			stim::vec<float>p1; 
          	        stim::vec<float>p2; 
  	                stim::vec<float>p3; 
                  	stim::vec<float>p4;	
a9f956be   Pavel Govyadinov   Fixed the cost fu...
375
  			p1 = hor.p(1,1);
a9f956be   Pavel Govyadinov   Fixed the cost fu...
376
  			p2 = hor.p(1,0);
a9f956be   Pavel Govyadinov   Fixed the cost fu...
377
  			p3 = hor.p(0,0);
a9f956be   Pavel Govyadinov   Fixed the cost fu...
378
  			p4 = hor.p(0,1);
5e7c7581   Pavel Govyadinov   Debugging build f...
379
  			glBegin(GL_QUADS);
a9f956be   Pavel Govyadinov   Fixed the cost fu...
380
  				glTexCoord3f(
a9f956be   Pavel Govyadinov   Fixed the cost fu...
381
382
383
384
  					p1[0],
  					p1[1],
  					p1[2]
  					);
a9f956be   Pavel Govyadinov   Fixed the cost fu...
385
386
  				glVertex2f(v_x,v_y);
  				glTexCoord3f(
a9f956be   Pavel Govyadinov   Fixed the cost fu...
387
388
389
390
  					p2[0],
  					p2[1],
  					p2[2]
  					);
a9f956be   Pavel Govyadinov   Fixed the cost fu...
391
392
  				glVertex2f(v_x+len, v_y);
  				glTexCoord3f(
a9f956be   Pavel Govyadinov   Fixed the cost fu...
393
394
395
396
  					p3[0],
  					p3[1],
  					p3[2]
  					);
a9f956be   Pavel Govyadinov   Fixed the cost fu...
397
398
  				glVertex2f(v_x+len, v_y+len);
  				glTexCoord3f(
a9f956be   Pavel Govyadinov   Fixed the cost fu...
399
400
401
  					p4[0],
  					p4[1],
  					p4[2]
a9f956be   Pavel Govyadinov   Fixed the cost fu...
402
  					);
a9f956be   Pavel Govyadinov   Fixed the cost fu...
403
404
  				glVertex2f(v_x, v_y+len);
  			 glEnd();
5e7c7581   Pavel Govyadinov   Debugging build f...
405
  
a9f956be   Pavel Govyadinov   Fixed the cost fu...
406
  			 p1 = ver.p(1,1);
a9f956be   Pavel Govyadinov   Fixed the cost fu...
407
  			 p2 = ver.p(1,0);
a9f956be   Pavel Govyadinov   Fixed the cost fu...
408
  			 p3 = ver.p(0,0);
a9f956be   Pavel Govyadinov   Fixed the cost fu...
409
  			 p4 = ver.p(0,1);
5e7c7581   Pavel Govyadinov   Debugging build f...
410
  		 	 glBegin(GL_QUADS);
a9f956be   Pavel Govyadinov   Fixed the cost fu...
411
  				glTexCoord3f(
a9f956be   Pavel Govyadinov   Fixed the cost fu...
412
413
414
415
  					p1[0],
  					p1[1],
  					p1[2]
  					);
a9f956be   Pavel Govyadinov   Fixed the cost fu...
416
417
  				glVertex2f(v_x+len, v_y);
  				glTexCoord3f(
a9f956be   Pavel Govyadinov   Fixed the cost fu...
418
419
420
421
  					p2[0],
  					p2[1],
  					p2[2]
  					);
79a9bf3f   Pavel Govyadinov   new implementatio...
422
  				glVertex2f(v_x+2.0*len, v_y);
a9f956be   Pavel Govyadinov   Fixed the cost fu...
423
  				glTexCoord3f(
a9f956be   Pavel Govyadinov   Fixed the cost fu...
424
425
426
427
  					p3[0],
  					p3[1],
  					p3[2]
  					);
79a9bf3f   Pavel Govyadinov   new implementatio...
428
  				glVertex2f(v_x+2.0*len, v_y+len);
a9f956be   Pavel Govyadinov   Fixed the cost fu...
429
  				glTexCoord3f(
a9f956be   Pavel Govyadinov   Fixed the cost fu...
430
431
432
433
  					p4[0],
  					p4[1],
  					p4[2]
  					);
a9f956be   Pavel Govyadinov   Fixed the cost fu...
434
  				glVertex2f(v_x+len, v_y+len);
5e7c7581   Pavel Govyadinov   Debugging build f...
435
  			glEnd(); 
a9f956be   Pavel Govyadinov   Fixed the cost fu...
436
  		}
2a18be6d   Pavel Govyadinov   New comments and ...
437
  		
385d2447   Pavel Govyadinov   Checkpoint: Conve...
438
  
385d2447   Pavel Govyadinov   Checkpoint: Conve...
439
  
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
440
441
442
  //--------------------------------------------------------------------------//
  //--------------------------------GL METHODS--------------------------------//
  //--------------------------------------------------------------------------//
385d2447   Pavel Govyadinov   Checkpoint: Conve...
443
  
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
444
445
446
447
  		///@param width sets the width of the buffer.
  		///@param height sets the height of the buffer.
  		///Function for setting up the 2D buffer that stores the samples.
  		void
84eff8b1   Pavel Govyadinov   Merged only the n...
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
  		GenerateFBO(unsigned int width, unsigned int height, GLuint &textureID, GLuint &framebufferID)
  		{
  			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);
  			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);
  				CHECK_OPENGL_ERROR
  		}
  
  		///@param width sets the width of the buffer.
  		///@param height sets the height of the buffer.
  		///Function for setting up the 2D buffer that stores the samples.
  		void
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
  		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);
  			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  			glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE,
  				 width, height, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, texels);   
  			delete[] texels;
  			glBindFramebuffer(GL_FRAMEBUFFER, 0); 
  			glBindTexture(GL_TEXTURE_2D, 0);
84eff8b1   Pavel Govyadinov   Merged only the n...
489
  				CHECK_OPENGL_ERROR
a9f956be   Pavel Govyadinov   Fixed the cost fu...
490
  		}
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
491
  
385d2447   Pavel Govyadinov   Checkpoint: Conve...
492
  
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
493
494
  		///Method for using the gl manipulation to alighn templates from
  		///Template space (-0.5 0.5) to Texture space (0.0, 1.0),
8e56a0a7   Pavel Govyadinov   Added the propose...
495
496
  		///Based on the p of the spider in real space (arbitrary).
  		void setMatrix()
5f81932b   David Mayerich   restored Pavel's ...
497
  		{
d4721000   Pavel Govyadinov   changes with debu...
498
  			float curTrans[16];
5eeaf941   Pavel Govyadinov   changer to the ba...
499
  			stim::vec<float> rot = getRotation(d);
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
500
501
  			glMatrixMode(GL_TEXTURE);
  			glLoadIdentity();
8e56a0a7   Pavel Govyadinov   Added the propose...
502
  			glScalef(1.0/S[0]/R[0], 1.0/S[1]/R[1], 1.0/S[2]/R[2]);
d4721000   Pavel Govyadinov   changes with debu...
503
504
  
  
8e56a0a7   Pavel Govyadinov   Added the propose...
505
506
507
  			glTranslatef(p[0],
  				     p[1],
  				     p[2]);
a506d41f   Pavel Govyadinov   fixed the methods...
508
  
d4721000   Pavel Govyadinov   changes with debu...
509
  			glRotatef(rot[0], rot[1], rot[2], rot[3]);
a506d41f   Pavel Govyadinov   fixed the methods...
510
  
8e56a0a7   Pavel Govyadinov   Added the propose...
511
  			glScalef(m[0],
d4721000   Pavel Govyadinov   changes with debu...
512
  				 m[0],
8e56a0a7   Pavel Govyadinov   Added the propose...
513
  				 m[0]);
a506d41f   Pavel Govyadinov   fixed the methods...
514
  
ef64ebad   Pavel Govyadinov   fixed a small mis...
515
516
  			glGetFloatv(GL_TEXTURE_MATRIX, curTrans);
  			cT.set(curTrans);
84eff8b1   Pavel Govyadinov   Merged only the n...
517
  		//	printTransform();
556c4e15   Pavel Govyadinov   Changed the handl...
518
  			
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
519
520
  			CHECK_OPENGL_ERROR
  			glMatrixMode(GL_MODELVIEW);
5f81932b   David Mayerich   restored Pavel's ...
521
  		}
84eff8b1   Pavel Govyadinov   Merged only the n...
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
  
  		///Method for controling the buffer and texture binding in order to properly
  		///do the render to texture.
  		void
  		Bind()
  		{
  			float len = 8.0;
  			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
  		}
  		
  		///Method for controling the buffer and texture binding in order to properly
  		///do the render to texture.
  		///@param GLuint tbID
  		void
  		Bind(GLuint &textureID, GLuint &framebufferID, int nSamples)
  		{
  			float len = 8.0;
  			glBindFramebuffer(GL_FRAMEBUFFER, framebufferID);//set up GL buffer
  			CHECK_OPENGL_ERROR
  
  			glFramebufferTexture2D(
  				GL_FRAMEBUFFER,
  				GL_COLOR_ATTACHMENT0,
  				GL_TEXTURE_2D,
  				textureID,
  				0);
  			CHECK_OPENGL_ERROR
  
  			glBindFramebuffer(GL_FRAMEBUFFER, framebufferID);
  			CHECK_OPENGL_ERROR
  
  			GLenum DrawBuffers[1] = {GL_COLOR_ATTACHMENT0};
  			glDrawBuffers(1, DrawBuffers);
  			CHECK_OPENGL_ERROR
  
  			glBindTexture(GL_TEXTURE_2D, textureID);
  			CHECK_OPENGL_ERROR
  
  			glClearColor(1,1,1,1);
  			glClear(GL_COLOR_BUFFER_BIT);
  			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...
595
  		
84eff8b1   Pavel Govyadinov   Merged only the n...
596
597
598
599
600
601
602
603
604
605
606
607
608
609
  		///Method for Unbinding all of the texture resources
  		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
  		}
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
610
  		
5f81932b   David Mayerich   restored Pavel's ...
611
  
42145f38   Pavel Govyadinov   Fixed the issues ...
612
613
614
615
616
  
  //--------------------------------------------------------------------------//
  //--------------------------------CUDA METHODS------------------------------//
  //--------------------------------------------------------------------------//
  		
42145f38   Pavel Govyadinov   Fixed the issues ...
617
  
2a18be6d   Pavel Govyadinov   New comments and ...
618
619
  		///Entry-point into the cuda code for calculating the cost
  		///	of a given samples array (in texture form) 
42145f38   Pavel Govyadinov   Fixed the issues ...
620
621
622
  		int
  		getCost()
  		{
84eff8b1   Pavel Govyadinov   Merged only the n...
623
624
625
626
627
  			#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...
628
  			cudaDeviceSynchronize();
84eff8b1   Pavel Govyadinov   Merged only the n...
629
630
631
632
633
  			#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...
634
  			current_cost = cost[1];
edd4ab2d   Pavel Govyadinov   Cleaned up more a...
635
  			return cost[0];
a9f956be   Pavel Govyadinov   Fixed the cost fu...
636
637
  		}
  
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
638
  	public:
13c2a7d4   Pavel Govyadinov   some changes to t...
639
640
641
  		stim::rect<float> hor;
  		stim::rect<float> ver;	
  
84eff8b1   Pavel Govyadinov   Merged only the n...
642
643
644
645
646
647
648
649
650
  		//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...
651
652
653
654
655
  //--------------------------------------------------------------------------//
  //-----------------------------CONSTRUCTORS---------------------------------//
  //--------------------------------------------------------------------------//
  
  
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
656
657
658
  		///@param samples, the number of samples this spider is going to use.
  		///best results if samples is can create a perfect root.
  		///Default Constructor
2a18be6d   Pavel Govyadinov   New comments and ...
659
  		gl_spider
8e56a0a7   Pavel Govyadinov   Added the propose...
660
  		(int samples = 1089)
2a18be6d   Pavel Govyadinov   New comments and ...
661
  		{
80d3850d   Pavel Govyadinov   test
662
663
664
665
666
  			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);
5eeaf941   Pavel Govyadinov   changer to the ba...
667
668
669
  			//setPosition(0.0,0.0,0.0);
  			//setDirection(0.0,0.0,1.0);
  			//setMagnitude(1.0);
2a18be6d   Pavel Govyadinov   New comments and ...
670
  			numSamples = samples;
4cefeb6d   Pavel Govyadinov   Changes to the re...
671
672
  		}
  
385d2447   Pavel Govyadinov   Checkpoint: Conve...
673
  		///temporary constructor for convenience, will be removed in further updates.	
13c2a7d4   Pavel Govyadinov   some changes to t...
674
675
  		gl_spider
  		(float pos_x, float pos_y, float pos_z, float dir_x, float dir_y, float dir_z,
5eeaf941   Pavel Govyadinov   changer to the ba...
676
  			float mag_x, int numSamples = 1089)
13c2a7d4   Pavel Govyadinov   some changes to t...
677
  		{
80d3850d   Pavel Govyadinov   test
678
679
  			p = vec<float>(pos_x, pos_y, pos_z);
  			d = vec<float>(dir_x, dir_y, dir_z);
d4721000   Pavel Govyadinov   changes with debu...
680
  			m = vec<float>(mag_x, mag_x, mag_x);
80d3850d   Pavel Govyadinov   test
681
682
  			S = vec<float>(1.0,1.0,1.0);
  			R = vec<float>(1.0,1.0,1.0);
385d2447   Pavel Govyadinov   Checkpoint: Conve...
683
684
685
  			//setPosition(pos_x, pos_y, pos_z);
  			//setDirection(dir_x, dir_y, dir_z);
  			//setMagnitude(mag_x);
2a18be6d   Pavel Govyadinov   New comments and ...
686
  		
385d2447   Pavel Govyadinov   Checkpoint: Conve...
687
  		}
8e56a0a7   Pavel Govyadinov   Added the propose...
688
689
690
691
692
693
694
  	
  		~gl_spider
  		(void)
  		{
  			Unbind();
  			glDeleteTextures(1, &texbufferID);
  			glDeleteBuffers(1, &fboID);
1306fd96   Pavel Govyadinov   minor bug fixes i...
695
696
697
698
  		/*	glDeleteTextures(1, &ptexbufferID);
  			glDeleteBuffers(1, &pfboId);
  			glDeleteTextures(1, &mtexbufferID);
  			glDeleteBuffers(1, &mfboId);     */
84eff8b1   Pavel Govyadinov   Merged only the n...
699
700
  			glDeleteTextures(1, &btexbufferID);
  			glDeleteBuffers(1, &bfboId);
8e56a0a7   Pavel Govyadinov   Added the propose...
701
702
  		}
  
385d2447   Pavel Govyadinov   Checkpoint: Conve...
703
  		///@param GLuint id texture that is going to be sampled.
385d2447   Pavel Govyadinov   Checkpoint: Conve...
704
  		///Attached the spider to the texture with the given GLuint ID.
8e56a0a7   Pavel Govyadinov   Added the propose...
705
  		///Samples in the default d acting as the init method.
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
706
  		///Also acts an init.	
a9b45efe   Pavel Govyadinov   changes to spider
707
  		void
2a18be6d   Pavel Govyadinov   New comments and ...
708
  		attachSpider(GLuint id)
a9b45efe   Pavel Govyadinov   changes to spider
709
710
  		{
  			texID = id;
79a9bf3f   Pavel Govyadinov   new implementatio...
711
  			GenerateFBO(16, numSamples*8);
84eff8b1   Pavel Govyadinov   Merged only the n...
712
  			GenerateFBO(16, 216, btexbufferID, bfboId); 
8e56a0a7   Pavel Govyadinov   Added the propose...
713
714
  			setDims(0.6, 0.6, 1.0);
  			setSize(512.0, 512.0, 426.0);
5eeaf941   Pavel Govyadinov   changer to the ba...
715
  			setMatrix();
db3c28c9   Pavel Govyadinov   Implemented glDis...
716
  			dList = glGenLists(3);
db3c28c9   Pavel Govyadinov   Implemented glDis...
717
  			glListBase(dList);
8e56a0a7   Pavel Govyadinov   Added the propose...
718
  			Bind();
c4887649   Pavel Govyadinov   fixed a significa...
719
  			genDirectionVectors(5*M_PI/4);
8e56a0a7   Pavel Govyadinov   Added the propose...
720
721
  			genPositionVectors();
  			genMagnitudeVectors();
84eff8b1   Pavel Govyadinov   Merged only the n...
722
723
724
  			Unbind();
  			///temporarily changed to 216
  			Bind(btexbufferID, bfboId, 27);
f31bf86d   Pavel Govyadinov   Added skeleton fu...
725
  			DrawCylinder();
8e56a0a7   Pavel Govyadinov   Added the propose...
726
  			Unbind();
a39577bf   Pavel Govyadinov   Changes to the sp...
727
  		}
5f81932b   David Mayerich   restored Pavel's ...
728
  		
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
729
730
731
  //--------------------------------------------------------------------------//
  //-----------------------------ACCESS METHODS-------------------------------//
  //--------------------------------------------------------------------------//
8e56a0a7   Pavel Govyadinov   Added the propose...
732
  		///Returns the p vector.
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
733
  		vec<float>
a39577bf   Pavel Govyadinov   Changes to the sp...
734
  		getPosition()
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
735
  		{
8e56a0a7   Pavel Govyadinov   Added the propose...
736
  			return p;
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
737
738
  		}
  	
8e56a0a7   Pavel Govyadinov   Added the propose...
739
  		///Returns the d vector.
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
740
  		vec<float>
a39577bf   Pavel Govyadinov   Changes to the sp...
741
  		getDirection()
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
742
  		{
8e56a0a7   Pavel Govyadinov   Added the propose...
743
  			return d;
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
744
745
  		}
  
8e56a0a7   Pavel Govyadinov   Added the propose...
746
  		///Returns the m vector.
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
747
  		vec<float>
a39577bf   Pavel Govyadinov   Changes to the sp...
748
  		getMagnitude()
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
749
  		{
8e56a0a7   Pavel Govyadinov   Added the propose...
750
  			return m;
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
751
752
  		}
  	
8e56a0a7   Pavel Govyadinov   Added the propose...
753
754
  		///@param vector pos, the new p.
  		///Sets the p vector to input vector pos.
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
755
756
757
  		void
  		setPosition(vec<float> pos)
  		{
8e56a0a7   Pavel Govyadinov   Added the propose...
758
  			p = pos;
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
759
  		}
385d2447   Pavel Govyadinov   Checkpoint: Conve...
760
761
762
763
  
  		///@param x x-coordinate.
  		///@param y y-coordinate.
  		///@param z z-coordinate.
8e56a0a7   Pavel Govyadinov   Added the propose...
764
  		///Sets the p vector to the input float coordinates x,y,z.
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
765
766
767
  		void
  		setPosition(float x, float y, float z)
  		{
8e56a0a7   Pavel Govyadinov   Added the propose...
768
769
770
  			p[0] = x;
  			p[1] = y;
  			p[2] = z;
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
771
  		}
887a3e49   Pavel Govyadinov   fixed some order ...
772
  		
8e56a0a7   Pavel Govyadinov   Added the propose...
773
774
  		///@param vector dir, the new d.
  		///Sets the d vector to input vector dir.
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
775
776
777
  		void
  		setDirection(vec<float> dir)
  		{
8e56a0a7   Pavel Govyadinov   Added the propose...
778
  			d = dir;
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
779
780
  		}
  		
385d2447   Pavel Govyadinov   Checkpoint: Conve...
781
782
783
  		///@param x x-coordinate.
  		///@param y y-coordinate.
  		///@param z z-coordinate.
8e56a0a7   Pavel Govyadinov   Added the propose...
784
  		///Sets the d vector to the input float coordinates x,y,z.
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
785
786
787
  		void
  		setDirection(float x, float y, float z)
  		{
8e56a0a7   Pavel Govyadinov   Added the propose...
788
789
790
  			d[0] = x;
  			d[1] = y;
  			d[2] = z;
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
791
  		}
385d2447   Pavel Govyadinov   Checkpoint: Conve...
792
  			
8e56a0a7   Pavel Govyadinov   Added the propose...
793
794
  		///@param vector dir, the new d.
  		///Sets the m vector to the input vector mag.	
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
795
796
797
  		void
  		setMagnitude(vec<float> mag)
  		{
8e56a0a7   Pavel Govyadinov   Added the propose...
798
799
  			m[0] = mag[0];
  			m[1] = mag[0];
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
800
801
  		}
  		
385d2447   Pavel Govyadinov   Checkpoint: Conve...
802
  		///@param mag size of the sampled region.
8e56a0a7   Pavel Govyadinov   Added the propose...
803
  		///Sets the m vector to the input mag for both templates.
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
804
  		void
5f81932b   David Mayerich   restored Pavel's ...
805
  		setMagnitude(float mag)
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
806
  		{
8e56a0a7   Pavel Govyadinov   Added the propose...
807
808
  			m[0] = mag;
  			m[1] = mag;
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
809
  		}
5f81932b   David Mayerich   restored Pavel's ...
810
  		
8e56a0a7   Pavel Govyadinov   Added the propose...
811
812
813
814
815
816
817
818
819
  
  		void
  		setDims(float x, float y, float z)
  		{
  			S[0] = x;
  			S[1] = y;
  			S[2] = z;
  		}
  
b710b044   Pavel Govyadinov   Added more tempor...
820
  		void
8e56a0a7   Pavel Govyadinov   Added the propose...
821
  		setSize(float x, float y, float z)
b710b044   Pavel Govyadinov   Added more tempor...
822
  		{
8e56a0a7   Pavel Govyadinov   Added the propose...
823
824
825
  			R[0] = x;
  			R[1] = y;
  			R[2] = z;
b710b044   Pavel Govyadinov   Added more tempor...
826
827
  		}
  		
f304d6de   Pavel Govyadinov   added rotation to...
828
829
830
  		///@param dir, the vector to which we are rotating
  		///given a vector to align to, finds the required
  		///axis and angle for glRotatef
5eeaf941   Pavel Govyadinov   changer to the ba...
831
  		stim::vec<float>
f304d6de   Pavel Govyadinov   added rotation to...
832
833
  		getRotation(stim::vec<float> dir)
  		{
d4721000   Pavel Govyadinov   changes with debu...
834
835
836
837
  			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...
838
839
840
841
842
  				out[0] = 0.0;
  				out[1] = 0.0;
  				out[2] = 0.0;
  				out[3] = 1.0;
  			} else {
d4721000   Pavel Govyadinov   changes with debu...
843
  				stim::vec<float> temp(0.0, 0.0, 0.0);;
f304d6de   Pavel Govyadinov   added rotation to...
844
845
846
847
848
  				temp = (from.cross(dir)).norm();
  				out[1] = temp[0];
  				out[2] = temp[1];
  				out[3] = temp[2];
  			}
f304d6de   Pavel Govyadinov   added rotation to...
849
850
  			return out;
  		}
84eff8b1   Pavel Govyadinov   Merged only the n...
851
852
853
854
855
856
  
  		///@param pos, the position of the seed to be added.
  		///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
857
  		{
84eff8b1   Pavel Govyadinov   Merged only the n...
858
  			seeds.push(pos);
a9b45efe   Pavel Govyadinov   changes to spider
859
  		}
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
860
  
79a9bf3f   Pavel Govyadinov   new implementatio...
861
  		void
59781ee3   Pavel Govyadinov   fixed a stask bug...
862
863
864
865
866
867
868
  		setSeedVec(stim::vec<float> dir)
  		{
  			seedsvecs.push(dir);
  		}
  
  		void
  		setSeedMag(float mag)
79a9bf3f   Pavel Govyadinov   new implementatio...
869
  		{
59781ee3   Pavel Govyadinov   fixed a stask bug...
870
  			seedsmags.push(mag);
84eff8b1   Pavel Govyadinov   Merged only the n...
871
  		}
79a9bf3f   Pavel Govyadinov   new implementatio...
872
  
59781ee3   Pavel Govyadinov   fixed a stask bug...
873
  
84eff8b1   Pavel Govyadinov   Merged only the n...
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
  		///@param x, y, z: variables for the x, y and z coordinate of the seed
  		///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));
  		}
  
  		void
  		setSeedVec(float x, float y, float z)
  		{
  			seedsvecs.push(stim::vec<float>(x, y, z));
  		}
  
  		stim::vec<float> 
  		getLastSeed()
  		{
  			stim::vec<float> tp = seeds.top();
  			return tp;
  		}
  
59781ee3   Pavel Govyadinov   fixed a stask bug...
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
  		stim::vec<float> 
  		getLastSeedVec()
  		{
  			stim::vec<float> tp = seedsvecs.top();
  			return tp;
  		}
  
  		float
  		getLastSeedMag()
  		{
  			float tp = seedsmags.top();
  			return tp;
  		}
  
  		void
  		popSeed()
  		{
  			seeds.pop();
  			seedsvecs.pop();
  		//	seedsmags.pop();
  		}
  
84eff8b1   Pavel Govyadinov   Merged only the n...
918
919
920
921
922
923
924
925
926
  		std::stack<stim::vec<float> >
  		getSeeds()
  		{
  			return seeds;
  		}
  
  		bool
  		Empty()
  		{
1306fd96   Pavel Govyadinov   minor bug fixes i...
927
  			return (seeds.empty() && seedsvecs.empty());
84eff8b1   Pavel Govyadinov   Merged only the n...
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
  		}
  		///@param string file: variables for the x, y and z coordinate of the seed
  		///Adds a seed to the seed list.
  		///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))
                     		{
                             		float x, y, z, u, v, w;
                             		myfile >> x >> y >> z >> u >> v >> w;
                             		seeds.push(stim::vec<float>(
                                    		((float) x), 
                                    		((float) y), 
                                    		((float) z)));
  					seedsvecs.push(stim::vec<float>(
59781ee3   Pavel Govyadinov   fixed a stask bug...
948
949
950
  						((float) u),
  						((float) v),
  						((float) w)));
84eff8b1   Pavel Govyadinov   Merged only the n...
951
952
953
954
955
                     		}
                     	myfile.close();
  	          	} else {
          	                  std::cerr<<"failed" << std::endl;
  			}
79a9bf3f   Pavel Govyadinov   new implementatio...
956
957
  		}
  		
79a9bf3f   Pavel Govyadinov   new implementatio...
958
  		void
84eff8b1   Pavel Govyadinov   Merged only the n...
959
  		saveNetwork(std::string name)
79a9bf3f   Pavel Govyadinov   new implementatio...
960
  		{
84eff8b1   Pavel Govyadinov   Merged only the n...
961
  			sk.save(name);
79a9bf3f   Pavel Govyadinov   new implementatio...
962
  		}
84eff8b1   Pavel Govyadinov   Merged only the n...
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
  
  		stim::glObj<float>
  		getNetwork()
  		{
  			return sk;
  		}
  		
  		///Function to get back the framebuffer Object attached to the spider.
  		///For external access.
  		GLuint
  		getFB()
  		{
  			return bfboId;
  		}
  
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
978
979
980
981
982
983
984
985
986
  //--------------------------------------------------------------------------//
  //-----------------------------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...
987
  			if(cos(Y.dot(d))< 0.087){
266aa74a   Pavel Govyadinov   CHECKPOINT: Minor...
988
  				Y[0] = 0.0; Y[1] = 1.0;}
8e56a0a7   Pavel Govyadinov   Added the propose...
989
990
991
  			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...
992
993
994
995
  				 hor.n());
  		}
  
  
c4887649   Pavel Govyadinov   fixed a significa...
996
  		int
13c2a7d4   Pavel Govyadinov   some changes to t...
997
998
  		Step()
  		{
84eff8b1   Pavel Govyadinov   Merged only the n...
999
1000
1001
1002
1003
  			Bind();
  			CHECK_OPENGL_ERROR
  			#ifdef TESTING
  				start = std::clock();
  			#endif
42145f38   Pavel Govyadinov   Fixed the issues ...
1004
  			findOptimalDirection();
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1005
  			//test(texbufferID, GL_TEXTURE_2D); 
d4721000   Pavel Govyadinov   changes with debu...
1006
1007
  			findOptimalPosition();
  			findOptimalScale();
84eff8b1   Pavel Govyadinov   Merged only the n...
1008
1009
1010
  			Unbind();
  			CHECK_OPENGL_ERROR
  
59781ee3   Pavel Govyadinov   fixed a stask bug...
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
  			#ifdef TESTING
  				duration_sampling = duration_sampling +
  					 (std::clock() - start) / (double) CLOCKS_PER_SEC;
  				num_sampling = num_sampling + 1.0; 
  			#endif
  			return current_cost;
  		}
  
  		int
  		StepP()
  		{
  			Bind();
  			CHECK_OPENGL_ERROR
  			#ifdef TESTING
  				start = std::clock();
  			#endif
  			findOptimalDirection();
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1028
  			//test(texbufferID, GL_TEXTURE_2D); 
59781ee3   Pavel Govyadinov   fixed a stask bug...
1029
1030
1031
1032
  			findOptimalPosition();
  			findOptimalScale();
  			Unbind();
  			CHECK_OPENGL_ERROR
84eff8b1   Pavel Govyadinov   Merged only the n...
1033
1034
  			Bind(btexbufferID, bfboId, 27);
  			CHECK_OPENGL_ERROR
c0f3e9f6   Pavel Govyadinov   UPDATE TO CIMG: v...
1035
  			branchDetection();
84eff8b1   Pavel Govyadinov   Merged only the n...
1036
1037
1038
  			CHECK_OPENGL_ERROR
  			Unbind();
  			CHECK_OPENGL_ERROR
59781ee3   Pavel Govyadinov   fixed a stask bug...
1039
  
84eff8b1   Pavel Govyadinov   Merged only the n...
1040
1041
1042
1043
1044
  			#ifdef TESTING
  				duration_sampling = duration_sampling +
  					 (std::clock() - start) / (double) CLOCKS_PER_SEC;
  				num_sampling = num_sampling + 1.0; 
  			#endif
c4887649   Pavel Govyadinov   fixed a significa...
1045
  			return current_cost;
13c2a7d4   Pavel Govyadinov   some changes to t...
1046
  		}
a9b45efe   Pavel Govyadinov   changes to spider
1047
  
556c4e15   Pavel Govyadinov   Changed the handl...
1048
1049
1050
1051
  
  		void
  		printTransform()
  		{
8e56a0a7   Pavel Govyadinov   Added the propose...
1052
  			std::cout << cT << std::endl;
b710b044   Pavel Govyadinov   Added more tempor...
1053
  		}
a9b45efe   Pavel Govyadinov   changes to spider
1054
  
42145f38   Pavel Govyadinov   Fixed the issues ...
1055
1056
1057
1058
1059
  		/* Method for initializing the cuda devices, necessary only
  			there are multiple cuda devices */
  		void
  		initCuda()
  		{	
2a18be6d   Pavel Govyadinov   New comments and ...
1060
  			stim::cudaSetDevice();
42145f38   Pavel Govyadinov   Fixed the issues ...
1061
1062
1063
  			//GLint max;
  			//glGetIntegerv(GL_MAX_TEXTURE_SIZE, &max);
  			//std::cout << max << std::endl;
a9b45efe   Pavel Govyadinov   changes to spider
1064
  		}
f31bf86d   Pavel Govyadinov   Added skeleton fu...
1065
1066
1067
1068
1069
1070
1071
1072
  
  //--------------------------------------------------------------------------//
  //-----------------------------EXPERIMENTAL METHODS-------------------------//
  //--------------------------------------------------------------------------//
  
  		void
  		DrawCylinder()
  		{	 
f31bf86d   Pavel Govyadinov   Added skeleton fu...
1073
1074
1075
  			 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...
1076
  			 float xold = 0.5; float yold = 0.0;
1306fd96   Pavel Govyadinov   minor bug fixes i...
1077
  			 float step = 360.0/numSamples*32;
f31bf86d   Pavel Govyadinov   Added skeleton fu...
1078
1079
1080
  			 glEnable(GL_TEXTURE_3D);
  			 glBindTexture(GL_TEXTURE_3D, texID);
  			 glBegin(GL_QUAD_STRIP);
84eff8b1   Pavel Govyadinov   Merged only the n...
1081
  			 int j = 0;
f31bf86d   Pavel Govyadinov   Added skeleton fu...
1082
1083
1084
1085
1086
  			 	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); 
1306fd96   Pavel Govyadinov   minor bug fixes i...
1087
  					 glVertex2f(0.0, j*6.4+6.4);
f31bf86d   Pavel Govyadinov   Added skeleton fu...
1088
  					 glTexCoord3f(x,y,z1); 
1306fd96   Pavel Govyadinov   minor bug fixes i...
1089
  					 glVertex2f(16.0, j*6.4+6.4);
f31bf86d   Pavel Govyadinov   Added skeleton fu...
1090
  					 glTexCoord3f(xold,yold,z1); 
1306fd96   Pavel Govyadinov   minor bug fixes i...
1091
  					 glVertex2f(16.0, j*6.4); 
f31bf86d   Pavel Govyadinov   Added skeleton fu...
1092
  					 glTexCoord3f(xold,yold,z0); 
1306fd96   Pavel Govyadinov   minor bug fixes i...
1093
  					 glVertex2f(0.0, j*6.4);
f31bf86d   Pavel Govyadinov   Added skeleton fu...
1094
1095
1096
1097
1098
1099
  					 xold=x;
  					 yold=y;
  					 j++;
  				}
  		      	 glEnd();  
  			 glEndList();
f31bf86d   Pavel Govyadinov   Added skeleton fu...
1100
  		}
84eff8b1   Pavel Govyadinov   Merged only the n...
1101
1102
1103
1104
1105
1106
1107
1108
1109
  		
  
  		///@param min_cost the cost value used for tracing
  		///traces out each seedpoint in the seeds queue to completion in both directions.
  		void
  		trace(int min_cost)
  		{	
  			Bind();
  			rev = stim::vec<float>(0.0,0.0,1.0);
59781ee3   Pavel Govyadinov   fixed a stask bug...
1110
1111
  			bool sEmpty = true;
  			float lastmag = 16.0;;
84eff8b1   Pavel Govyadinov   Merged only the n...
1112
1113
1114
1115
1116
1117
  			while(!seeds.empty())
  			{
  				//clear the currently traced line and start a new one.
  				cL.clear();
  				sk.Begin(stim::OBJ_LINE);
  				stim::vec<float> curSeed = seeds.top();
59781ee3   Pavel Govyadinov   fixed a stask bug...
1118
  //				std::cout << "The current seeds is " << curSeed << std::endl;
84eff8b1   Pavel Govyadinov   Merged only the n...
1119
  				stim::vec<float> curSeedVec = seedsvecs.top();
59781ee3   Pavel Govyadinov   fixed a stask bug...
1120
1121
1122
  				seeds.pop();
  				seedsvecs.pop();
  //				std::cout << "The current seed Vector is " << curSeedVec << std::endl;
84eff8b1   Pavel Govyadinov   Merged only the n...
1123
1124
  				setPosition(curSeed);
  				setDirection(curSeedVec);
84eff8b1   Pavel Govyadinov   Merged only the n...
1125
1126
1127
1128
1129
  				cL.push_back(curSeed);
  				sk.createFromSelf(GL_SELECT);
  				traceLine(min_cost);
  
  				sk.rev();
59781ee3   Pavel Govyadinov   fixed a stask bug...
1130
  		//		std::cout << "reversed" << std::endl;
84eff8b1   Pavel Govyadinov   Merged only the n...
1131
1132
  				std::reverse(cL.begin(), cL.end());
  				setPosition(curSeed);
59781ee3   Pavel Govyadinov   fixed a stask bug...
1133
  				setDirection(-rev);
84eff8b1   Pavel Govyadinov   Merged only the n...
1134
1135
1136
  				setMagnitude(16.0);
  				sk.createFromSelf(GL_SELECT);
  				traceLine(min_cost);
84eff8b1   Pavel Govyadinov   Merged only the n...
1137
  				sk.End();
84eff8b1   Pavel Govyadinov   Merged only the n...
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
  			}
  			Unbind();
  		}
  
  		///@param min_cost the cost value used for tracing
  		///traces the seedpoint passed to completion in one directions.
  		void
  		traceLine(int min_cost)
  		{
  			stim::vec<float> pos;
  			stim::vec<float> mag;
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1149
  			int h;
84eff8b1   Pavel Govyadinov   Merged only the n...
1150
  			bool started = false;
59781ee3   Pavel Govyadinov   fixed a stask bug...
1151
  			bool running = true;
84eff8b1   Pavel Govyadinov   Merged only the n...
1152
  			stim::vec<float> size(S[0]*R[0], S[1]*R[1], S[2]*R[2]);
59781ee3   Pavel Govyadinov   fixed a stask bug...
1153
  			while(running)
84eff8b1   Pavel Govyadinov   Merged only the n...
1154
1155
1156
  			{
  				int cost = Step();
  				if (cost > min_cost){
59781ee3   Pavel Govyadinov   fixed a stask bug...
1157
  					running = false;
84eff8b1   Pavel Govyadinov   Merged only the n...
1158
1159
1160
1161
1162
1163
  					break;
  				} else {
  					//Have we found an edge?
  					pos = getPosition();
  					if(pos[0] > size[0] || pos[1] > size[1]
  					 || pos[2] > size[2] || pos[0] < 0
59781ee3   Pavel Govyadinov   fixed a stask bug...
1164
  					 || pos[1] < 0 || pos[2] < 0)
84eff8b1   Pavel Govyadinov   Merged only the n...
1165
1166
  					{
  //					       std::cout << "Found Edge" << std::endl;
59781ee3   Pavel Govyadinov   fixed a stask bug...
1167
  						running = false;
84eff8b1   Pavel Govyadinov   Merged only the n...
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
  						break;
  					}
  					//If this is the first step in the trace,
  					// save the direction
  					//(to be used later to trace the fiber in the opposite direction)
  					if(started == false){
  						rev = -getDirection();
  						started = true;
  					}
  //					std::cout << i << p << std::endl;
  					m = getMagnitude();
  					//Has the template size gotten unreasonable?
  					if(m[0] > 75 || m[0] < 1){
  //						std::cout << "Magnitude Limit" << std::endl;
59781ee3   Pavel Govyadinov   fixed a stask bug...
1182
  						running = false;
84eff8b1   Pavel Govyadinov   Merged only the n...
1183
1184
1185
1186
1187
1188
  						break;
  					}
  					else
  					{
  						h = selectObject(pos, getDirection(), m[0]);
  						//Have we hit something previously traced?
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1189
1190
1191
1192
  						if(h != -1){
  							std::cout << "I hit a line" << h << std::endl;
  							running = false;
  							break;
84eff8b1   Pavel Govyadinov   Merged only the n...
1193
1194
  						}
  						else {          
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1195
  							cL.push_back(stim::vec<float>(p[0], p[1],p[2]));
84eff8b1   Pavel Govyadinov   Merged only the n...
1196
1197
  							sk.TexCoord(m[0]);
  							sk.Vertex(p[0], p[1], p[2]);
59781ee3   Pavel Govyadinov   fixed a stask bug...
1198
1199
1200
1201
1202
1203
  							Bind(btexbufferID, bfboId, 27);
  							CHECK_OPENGL_ERROR
  							branchDetection();
  							CHECK_OPENGL_ERROR
  							Unbind();
  							CHECK_OPENGL_ERROR
84eff8b1   Pavel Govyadinov   Merged only the n...
1204
1205
1206
1207
1208
1209
1210
  						}
  				 	}
                   		}
           		}
  		}	
  
  
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1211
  		int
84eff8b1   Pavel Govyadinov   Merged only the n...
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
  		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...
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
  		//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...
1240
  				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...
1241
1242
1243
1244
1245
1246
1247
1248
  				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...
1249
1250
1251
1252
  
  //				sk.Render();
  				nt.Render();								
  
84eff8b1   Pavel Govyadinov   Merged only the n...
1253
  				CHECK_OPENGL_ERROR
23af8e36   Pavel Govyadinov   modified spider t...
1254
1255
1256
1257
1258
1259
1260
1261
  
  
  //				glLoadName((int) sk.numL());
  				glLoadName(nt.sizeE());
  
  //				sk.RenderLine(cL);
  				nt.RenderLine(cL);	
  
84eff8b1   Pavel Govyadinov   Merged only the n...
1262
1263
1264
1265
1266
1267
1268
1269
1270
  //				glPopName();
  				glFlush();
  
  				glMatrixMode(GL_PROJECTION);
  				glPopMatrix();
  				glMatrixMode(GL_MODELVIEW);
  				CHECK_OPENGL_ERROR
  				glPopMatrix();
  
59781ee3   Pavel Govyadinov   fixed a stask bug...
1271
  		//	glEnable(GL_CULL_FACE);
84eff8b1   Pavel Govyadinov   Merged only the n...
1272
  			hits = glRenderMode(GL_RENDER);
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1273
  			int found_hits = processHits(hits, selectBuf);
84eff8b1   Pavel Govyadinov   Merged only the n...
1274
1275
1276
1277
1278
  			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...
1279
  		int
84eff8b1   Pavel Govyadinov   Merged only the n...
1280
1281
1282
  		processHits(GLint hits, GLuint buffer[])
  		{
  			GLuint names, *ptr;
59781ee3   Pavel Govyadinov   fixed a stask bug...
1283
  			//printf("hits = %u\n", hits);
84eff8b1   Pavel Govyadinov   Merged only the n...
1284
  			ptr = (GLuint *) buffer;
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
  		//	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...
1299
  			if(hits == 0)
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1300
1301
1302
  			{
  				return -1;
  			}
84eff8b1   Pavel Govyadinov   Merged only the n...
1303
  			else
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
  			{
  				printf ("%u ", *ptr);
  				return *ptr;
  			}
  		}
  
  		void
  		clearCurrent()
  		{
  			cL.clear();
  		}	
  	
23af8e36   Pavel Govyadinov   modified spider t...
1316
  		void
821409d5   Pavel Govyadinov   added a way to ad...
1317
1318
  		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...
1319
1320
1321
  		{
                          std::vector<stim::vec<float> > ce = in.first.centerline();                
                          std::vector<stim::vec<float> > cm = in.first.centerlinemag();
821409d5   Pavel Govyadinov   added a way to ad...
1322
  			if(ce.size() > 2)
23af8e36   Pavel Govyadinov   modified spider t...
1323
1324
1325
  			{
  				if(in.second == -1)
  				{
821409d5   Pavel Govyadinov   added a way to ad...
1326
1327
1328
1329
1330
1331
1332
1333
  					spos[0] = spos[0]-0.15*sdir[0]*smag[0];
  					spos[1] = spos[1]-0.15*sdir[1]*smag[0];
  					spos[2] = spos[2]-0.15*sdir[2]*smag[0];
  					int h = selectObject(spos, -sdir, smag[0]);
  					if(h != -1)
  						nt.addEdge(ce, cm, h, -1);
  					else
  						nt.addEdge(ce, cm, -1, -1);
23af8e36   Pavel Govyadinov   modified spider t...
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
  				}
  				else if(in.second != -1)
  				{
  					nt.addEdge(ce, cm, -1, in.second);
  				}
  			}		
  		}
  
  		stim::glnetwork<T>
  		getGLNetwork()
  		{
  			return nt;
  		}
  
821409d5   Pavel Govyadinov   added a way to ad...
1348
1349
1350
1351
1352
1353
1354
1355
  		void
  		printSizes()
  		{
  			std::cout << nt.sizeE() << "edges" << std::endl;
  			std::cout << nt.sizeV() << "nodes" << std::endl;
  			
  		}
  
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1356
1357
1358
  		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...
1359
1360
1361
1362
1363
  			//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...
1364
1365
  			Bind();
  			sk.Begin(stim::OBJ_LINE);
23af8e36   Pavel Govyadinov   modified spider t...
1366
1367
1368
1369
1370
  
  
  //			sk.createFromSelf(GL_SELECT);
  			nt.createFromSelf(GL_SELECT);
  
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
  			std::vector<stim::vec<float> > cM;
  			cL.push_back(pos);
  			cM.push_back(mag);
  
  //			setPosition(pos);
  //			setMagnitude(mag);
  			int h;
  			bool started = false;
  			bool running = true;
  			stim::vec<float> size(S[0]*R[0], S[1]*R[1], S[2]*R[2]);
  			while(running)
  			{
  				int cost = Step();
  				if (cost > min_cost){
  					running = false;
  					sk.End();
23af8e36   Pavel Govyadinov   modified spider t...
1387
  					pair<stim::fiber<float>, int> a(stim::fiber<float> (cL, cM), -1);
821409d5   Pavel Govyadinov   added a way to ad...
1388
  					addToNetwork(a, spos, smag, sdir);
23af8e36   Pavel Govyadinov   modified spider t...
1389
  					return a;
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
  					break;
  				} else {
  					//Have we found the edge of the map?
  					pos = getPosition();
  					if(pos[0] > size[0] || pos[1] > size[1]
  					 || pos[2] > size[2] || pos[0] < 0
  					 || pos[1] < 0 || pos[2] < 0)
  					{
  //					       std::cout << "Found Edge" << std::endl;
  						running = false;
  						sk.End();
23af8e36   Pavel Govyadinov   modified spider t...
1401
  						pair<stim::fiber<float>, int> a(stim::fiber<float> (cL, cM), -1);
821409d5   Pavel Govyadinov   added a way to ad...
1402
  						addToNetwork(a, spos, smag, sdir);
23af8e36   Pavel Govyadinov   modified spider t...
1403
  						return a;
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
  						break;
  					}
  					//If this is the first step in the trace,
  					// save the direction
  					//(to be used later to trace the fiber in the opposite direction)
  					if(started == false){
  						rev = -getDirection();
  						started = true;
  					}
  //					std::cout << i << p << std::endl;
  					//Has the template size gotten unreasonable?
  					mag = getMagnitude();
  					if(mag[0] > 75 || mag[0] < 1){
  //						std::cout << "Magnitude Limit" << std::endl;
  						running = false;
  						sk.End();
23af8e36   Pavel Govyadinov   modified spider t...
1420
  						pair<stim::fiber<float>, int> a(stim::fiber<float> (cL, cM), -1);
821409d5   Pavel Govyadinov   added a way to ad...
1421
  						addToNetwork(a, spos, smag, sdir);
23af8e36   Pavel Govyadinov   modified spider t...
1422
  						return a;
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1423
1424
1425
1426
1427
1428
1429
  						break;
  					}
  					else
  					{
  						h = selectObject(p, getDirection(), m[0]);
  						//Have we hit something previously traced?
  						if(h != -1){
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1430
1431
  							running = false;
  							sk.End();
23af8e36   Pavel Govyadinov   modified spider t...
1432
  							pair<stim::fiber<float>, int> a(stim::fiber<float> (cL, cM), -1);
821409d5   Pavel Govyadinov   added a way to ad...
1433
  							addToNetwork(a, spos, smag, sdir);
23af8e36   Pavel Govyadinov   modified spider t...
1434
  							return a;
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
  							break;
  						}
  						else {  
  							cL.push_back(stim::vec<float>(p[0], p[1],p[2]));
  							cM.push_back(m[0]);
  							sk.TexCoord(m[0]);
  							sk.Vertex(p[0], p[1], p[2]);
  							Bind(btexbufferID, bfboId, 27);
  							CHECK_OPENGL_ERROR
  							branchDetection();
  							CHECK_OPENGL_ERROR
  							Unbind();
  							CHECK_OPENGL_ERROR
  							
  						}
  				 	}
                   		}
           		}
84eff8b1   Pavel Govyadinov   Merged only the n...
1453
1454
  		}
  
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
1455
  			
84eff8b1   Pavel Govyadinov   Merged only the n...
1456
  
4cefeb6d   Pavel Govyadinov   Changes to the re...
1457
  };
fb0bc2f1   Pavel Govyadinov   added the gl_spid...
1458
1459
  }
  #endif