Commit 4b594a40601be8cacbce578ad000d549e4403b43

Authored by Pavel Govyadinov
2 parents c230039b c0f3e9f6

Merge remote-tracking branch 'origin/Branch_Detection'

@@ -3,17 +3,16 @@ @@ -3,17 +3,16 @@
3 #include <cuda_runtime.h> 3 #include <cuda_runtime.h>
4 #include <cublas_v2.h> 4 #include <cublas_v2.h>
5 #include <stdio.h> 5 #include <stdio.h>
6 -#include <stim/visualization/colormap.h> 6 +#include "../visualization/colormap.h"
7 #include <sstream> 7 #include <sstream>
8 -#include <stim/math/vector.h>  
9 -#include <stim/cuda/devices.h>  
10 -#include <stim/cuda/threads.h> 8 +#include "../math/vector.h"
  9 +#include "../cuda/devices.h"
  10 +#include "../cuda/threads.h"
11 11
12 ///Cost function that works with the gl-spider class to find index of the item with min-cost. 12 ///Cost function that works with the gl-spider class to find index of the item with min-cost.
13 typedef unsigned char uchar; 13 typedef unsigned char uchar;
14 texture<uchar, cudaTextureType2D, cudaReadModeElementType> texIn; 14 texture<uchar, cudaTextureType2D, cudaReadModeElementType> texIn;
15 float *result; 15 float *result;
16 -float* v_dif;  
17 cudaArray* srcArray; 16 cudaArray* srcArray;
18 bool testing = false; 17 bool testing = false;
19 18
@@ -26,30 +25,12 @@ inline void checkCUDAerrors(const char *msg) @@ -26,30 +25,12 @@ inline void checkCUDAerrors(const char *msg)
26 } 25 }
27 } 26 }
28 27
29 -///Finds the sum of all the pixes in a gives template element.  
30 -///Returns the abosolute value.  
31 -///@param *diff, a pointer to the memory block that holds the pixel-differences.  
32 -float get_sum(float *diff)  
33 -{  
34 -  
35 - cublasStatus_t ret;  
36 - cublasHandle_t handle;  
37 - ret = cublasCreate(&handle);  
38 -  
39 - ret = cublasSetVector(20*10, sizeof(*diff), diff, 1, v_dif, 1);  
40 - float out;  
41 - ret = cublasSasum(handle, 20*10, v_dif, 1, &out);  
42 -// cublasDestroy(ret);  
43 - cublasDestroy(handle);  
44 - return out;  
45 -}  
46 -  
47 ///A virtual representation of a uniform template. 28 ///A virtual representation of a uniform template.
48 ///Returns the value of the template pixel. 29 ///Returns the value of the template pixel.
49 ///@param x, location of a pixel. 30 ///@param x, location of a pixel.
50 __device__ float Template(int x) 31 __device__ float Template(int x)
51 { 32 {
52 - if(x < 20/6 || x > 20*5/6 || (x > 20*2/6 && x < 20*4/6)){ 33 + if(x < 16/6 || x > 16*5/6 || (x > 16*2/6 && x < 16*4/6)){
53 return 1.0; 34 return 1.0;
54 }else{ 35 }else{
55 return 0.0; 36 return 0.0;
@@ -63,15 +44,47 @@ __device__ float Template(int x) @@ -63,15 +44,47 @@ __device__ float Template(int x)
63 __global__ 44 __global__
64 void get_diff (float *result) 45 void get_diff (float *result)
65 { 46 {
66 - //cuPrintf("Hello"); 47 + //float* shared = SharedMemory();
  48 + __shared__ float shared[16][8];
67 int x = threadIdx.x + blockIdx.x * blockDim.x; 49 int x = threadIdx.x + blockIdx.x * blockDim.x;
68 int y = threadIdx.y + blockIdx.y * blockDim.y; 50 int y = threadIdx.y + blockIdx.y * blockDim.y;
69 - int idx = y*20+x; 51 + int x_t = threadIdx.x;
  52 + int y_t = threadIdx.y;
  53 + //int idx = y*16+x;
  54 + int g_idx = blockIdx.y;
70 55
71 float valIn = tex2D(texIn, x, y)/255.0; 56 float valIn = tex2D(texIn, x, y)/255.0;
72 float valTemp = Template(x); 57 float valTemp = Template(x);
73 - result[idx] = abs(valIn-valTemp);  
74 - //result[idx] = abs(valIn); 58 + shared[x_t][y_t] = abs(valIn-valTemp);
  59 +
  60 + __syncthreads();
  61 +
  62 + for(unsigned int step = blockDim.x/2; step >= 1; step >>= 1)
  63 + {
  64 + __syncthreads();
  65 + if (x_t < step)
  66 + {
  67 + shared[x_t][y_t] += shared[x_t + step][y_t];
  68 + }
  69 + __syncthreads();
  70 + }
  71 + __syncthreads();
  72 +
  73 + for(unsigned int step = blockDim.y/2; step >= 1; step >>= 1)
  74 + {
  75 + __syncthreads();
  76 + if(y_t < step)
  77 + {
  78 + shared[x_t][y_t] += shared[x_t][y_t + step];
  79 + }
  80 + __syncthreads();
  81 + }
  82 + __syncthreads();
  83 + if(x_t == 0 && y_t == 0)
  84 + result[g_idx] = shared[0][0];
  85 +
  86 +
  87 +// //result[idx] = abs(valIn);
75 } 88 }
76 89
77 90
@@ -82,12 +95,6 @@ void get_diff (float *result) @@ -82,12 +95,6 @@ void get_diff (float *result)
82 ///@param DIM_Y, integer controlling how much memory to allocate. 95 ///@param DIM_Y, integer controlling how much memory to allocate.
83 void initArray(cudaGraphicsResource_t src, int DIM_Y) 96 void initArray(cudaGraphicsResource_t src, int DIM_Y)
84 { 97 {
85 - //cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc<uchar> ();  
86 - //cudaMallocArray(&result, &channelDesc, DIM_X, DIM_Y, 0);  
87 - //HANDLE_ERROR(  
88 - // cudaGraphicsGLRegisterImage(&src,  
89 - // fboID,  
90 - // GL_TEXTURE_2D,  
91 HANDLE_ERROR( 98 HANDLE_ERROR(
92 cudaGraphicsMapResources(1, &src) 99 cudaGraphicsMapResources(1, &src)
93 ); 100 );
@@ -97,10 +104,8 @@ void initArray(cudaGraphicsResource_t src, int DIM_Y) @@ -97,10 +104,8 @@ void initArray(cudaGraphicsResource_t src, int DIM_Y)
97 HANDLE_ERROR( 104 HANDLE_ERROR(
98 cudaBindTextureToArray(texIn, srcArray) 105 cudaBindTextureToArray(texIn, srcArray)
99 ); 106 );
100 - cudaMalloc( (void**) &result, 20*DIM_Y*sizeof(float)); 107 + cudaMalloc( (void**) &result, DIM_Y*sizeof(float));
101 checkCUDAerrors("Memory Allocation Issue 1"); 108 checkCUDAerrors("Memory Allocation Issue 1");
102 - cudaMalloc((void **) &v_dif, 20*10*sizeof(float));  
103 - checkCUDAerrors("Memory Allocation Issue 2");  
104 //HANDLE_ERROR( 109 //HANDLE_ERROR(
105 // cudaBindTextureToArray(texIn, ptr, &channelDesc) 110 // cudaBindTextureToArray(texIn, ptr, &channelDesc)
106 // ); 111 // );
@@ -117,9 +122,6 @@ void cleanUP(cudaGraphicsResource_t src) @@ -117,9 +122,6 @@ void cleanUP(cudaGraphicsResource_t src)
117 cudaGraphicsUnmapResources(1,&src) 122 cudaGraphicsUnmapResources(1,&src)
118 ); 123 );
119 HANDLE_ERROR( 124 HANDLE_ERROR(
120 - cudaFree(v_dif)  
121 - );  
122 - HANDLE_ERROR(  
123 cudaUnbindTexture(texIn) 125 cudaUnbindTexture(texIn)
124 ); 126 );
125 } 127 }
@@ -151,25 +153,33 @@ stim::vec&lt;int&gt; get_cost(cudaGraphicsResource_t src, int DIM_Y) @@ -151,25 +153,33 @@ stim::vec&lt;int&gt; get_cost(cudaGraphicsResource_t src, int DIM_Y)
151 // name << "sample_" << inter << "_" << idx << ".bmp"; 153 // name << "sample_" << inter << "_" << idx << ".bmp";
152 // stim::gpu2image<float>(v_dif, name.str(), 20,10,0,1); 154 // stim::gpu2image<float>(v_dif, name.str(), 20,10,0,1);
153 155
154 - float output[DIM_Y]; 156 + //float output[DIM_Y];
  157 + float *output;
  158 + output = (float* ) malloc(DIM_Y*sizeof(float));
155 stim::vec<int> ret(0, 0); 159 stim::vec<int> ret(0, 0);
156 float mini = 10000000000000000.0; 160 float mini = 10000000000000000.0;
157 - int idx;  
158 - initArray(src, DIM_Y*10);  
159 - dim3 grid(20/2, DIM_Y*10/2);  
160 - dim3 block(2, 2);  
161 -  
162 - get_diff <<< grid, block >>> (result);  
163 - for (int i = 0; i < DIM_Y; i++){  
164 - output[i] = get_sum(result+(20*10*i));  
165 - if(output[i] <= mini){ 161 + int idx = 0;
  162 + initArray(src, DIM_Y*8);
  163 + dim3 numBlocks(1, DIM_Y);
  164 + dim3 threadsPerBlock(16, 8);
  165 +
  166 +
  167 + get_diff <<< numBlocks, threadsPerBlock >>> (result);
  168 + cudaMemcpy(output, result, DIM_Y*sizeof(float), cudaMemcpyDeviceToHost);
  169 +
  170 + for( int i = 0; i<DIM_Y; i++){
  171 +// std::cout << output[i] << std::endl;
  172 + if(output[i] < mini){
166 mini = output[i]; 173 mini = output[i];
167 idx = i; 174 idx = i;
168 } 175 }
169 - }  
170 -  
171 - output[idx] = get_sum(result+(20*10*idx)); 176 + }
  177 +
  178 +// std::cout << "hello" << std::endl;
  179 + //output[idx] = get_sum(result+(16*8*idx));
172 cleanUP(src); 180 cleanUP(src);
173 ret[0] = idx; ret[1] = (int) output[idx]; 181 ret[0] = idx; ret[1] = (int) output[idx];
  182 + std::cout << output[idx] << std::endl;
  183 + free(output);
174 return ret; 184 return ret;
175 } 185 }
stim/gl/gl_spider.h
@@ -121,7 +121,7 @@ class gl_spider @@ -121,7 +121,7 @@ class gl_spider
121 setMatrix(); 121 setMatrix();
122 glCallList(dList+3); 122 glCallList(dList+3);
123 123
124 -// int best = getCost(); 124 + // int best = getCost();
125 125
126 } 126 }
127 127
@@ -185,7 +185,7 @@ class gl_spider @@ -185,7 +185,7 @@ class gl_spider
185 ver = stim::rect<float>(mag, 185 ver = stim::rect<float>(mag,
186 pos, temp, 186 pos, temp,
187 hor.n()); 187 hor.n());
188 - UpdateBuffer(0.0, 0.0+idx*10.0); 188 + UpdateBuffer(0.0, 0.0+idx*8.0);
189 CHECK_OPENGL_ERROR 189 CHECK_OPENGL_ERROR
190 } 190 }
191 } 191 }
@@ -233,7 +233,7 @@ class gl_spider @@ -233,7 +233,7 @@ class gl_spider
233 ver = stim::rect<float>(mag, 233 ver = stim::rect<float>(mag,
234 temp, dir, 234 temp, dir,
235 hor.n()); 235 hor.n());
236 - UpdateBuffer(0.0, 0.0+idx*10.0); 236 + UpdateBuffer(0.0, 0.0+idx*8.0);
237 CHECK_OPENGL_ERROR 237 CHECK_OPENGL_ERROR
238 } 238 }
239 } 239 }
@@ -244,7 +244,8 @@ class gl_spider @@ -244,7 +244,8 @@ class gl_spider
244 ///Method for populating the buffer with the sampled texture. 244 ///Method for populating the buffer with the sampled texture.
245 ///uses the default m <1,1,0> 245 ///uses the default m <1,1,0>
246 void 246 void
247 - genMagnitudeVectors(float delta = 0.5) 247 + genMagnitudeVectors(float delta = 0.70)
  248 +// genMagnitudeVectors(float delta = 0.50)
248 { 249 {
249 250
250 //Set up the vectors necessary for Rectangle creation. 251 //Set up the vectors necessary for Rectangle creation.
@@ -274,7 +275,7 @@ class gl_spider @@ -274,7 +275,7 @@ class gl_spider
274 ver = stim::rect<float>(temp, 275 ver = stim::rect<float>(temp,
275 pos, dir, 276 pos, dir,
276 hor.n()); 277 hor.n());
277 - UpdateBuffer(0.0, 0.0+i*10.0); 278 + UpdateBuffer(0.0, 0.0+i*8.0);
278 CHECK_OPENGL_ERROR 279 CHECK_OPENGL_ERROR
279 } 280 }
280 glEndList(); 281 glEndList();
@@ -286,7 +287,7 @@ class gl_spider @@ -286,7 +287,7 @@ class gl_spider
286 void 287 void
287 UpdateBuffer(float v_x, float v_y) 288 UpdateBuffer(float v_x, float v_y)
288 { 289 {
289 - float len = 10.0; 290 + float len = 8.0;
290 stim::vec<float>p1; 291 stim::vec<float>p1;
291 stim::vec<float>p2; 292 stim::vec<float>p2;
292 stim::vec<float>p3; 293 stim::vec<float>p3;
@@ -338,13 +339,13 @@ class gl_spider @@ -338,13 +339,13 @@ class gl_spider
338 p2[1], 339 p2[1],
339 p2[2] 340 p2[2]
340 ); 341 );
341 - glVertex2f(v_x+2*len, v_y); 342 + glVertex2f(v_x+2.0*len, v_y);
342 glTexCoord3f( 343 glTexCoord3f(
343 p3[0], 344 p3[0],
344 p3[1], 345 p3[1],
345 p3[2] 346 p3[2]
346 ); 347 );
347 - glVertex2f(v_x+2*len, v_y+len); 348 + glVertex2f(v_x+2.0*len, v_y+len);
348 glTexCoord3f( 349 glTexCoord3f(
349 p4[0], 350 p4[0],
350 p4[1], 351 p4[1],
@@ -383,47 +384,6 @@ class gl_spider @@ -383,47 +384,6 @@ class gl_spider
383 glBindTexture(GL_TEXTURE_2D, 0); 384 glBindTexture(GL_TEXTURE_2D, 0);
384 } 385 }
385 386
386 - ///Method for controling the buffer and texture binding in order to properly  
387 - ///do the render to texture.  
388 - void  
389 - Bind()  
390 - {  
391 - float len = 10.0;  
392 - glBindFramebuffer(GL_FRAMEBUFFER, fboID);//set up GL buffer  
393 - glFramebufferTexture2D(  
394 - GL_FRAMEBUFFER,  
395 - GL_COLOR_ATTACHMENT0,  
396 - GL_TEXTURE_2D,  
397 - texbufferID,  
398 - 0);  
399 - glBindFramebuffer(GL_FRAMEBUFFER, fboID);  
400 - GLenum DrawBuffers[1] = {GL_COLOR_ATTACHMENT0};  
401 - glDrawBuffers(1, DrawBuffers);  
402 - glBindTexture(GL_TEXTURE_2D, texbufferID);  
403 - glClearColor(1,1,1,1);  
404 - glClear(GL_COLOR_BUFFER_BIT);  
405 - glMatrixMode(GL_PROJECTION);  
406 - glLoadIdentity();  
407 - glMatrixMode(GL_MODELVIEW);  
408 - glLoadIdentity();  
409 - glViewport(0,0,2.0*len, numSamples*len);  
410 - gluOrtho2D(0.0,2.0*len,0.0,numSamples*len);  
411 - glEnable(GL_TEXTURE_3D);  
412 - glBindTexture(GL_TEXTURE_3D, texID);  
413 -  
414 - CHECK_OPENGL_ERROR  
415 - }  
416 -  
417 - ///Method for Unbinding all of the texture resources  
418 - void  
419 - Unbind()  
420 - {  
421 - //Finalize GL_buffer  
422 - glBindTexture(GL_TEXTURE_3D, 0);  
423 - glDisable(GL_TEXTURE_3D);  
424 - glBindFramebuffer(GL_FRAMEBUFFER,0);  
425 - glBindTexture(GL_TEXTURE_2D, 0);  
426 - }  
427 387
428 ///Method for using the gl manipulation to alighn templates from 388 ///Method for using the gl manipulation to alighn templates from
429 ///Template space (-0.5 0.5) to Texture space (0.0, 1.0), 389 ///Template space (-0.5 0.5) to Texture space (0.0, 1.0),
@@ -558,7 +518,7 @@ class gl_spider @@ -558,7 +518,7 @@ class gl_spider
558 attachSpider(GLuint id) 518 attachSpider(GLuint id)
559 { 519 {
560 texID = id; 520 texID = id;
561 - GenerateFBO(20, numSamples*10); 521 + GenerateFBO(16, numSamples*8);
562 setDims(0.6, 0.6, 1.0); 522 setDims(0.6, 0.6, 1.0);
563 setSize(512.0, 512.0, 426.0); 523 setSize(512.0, 512.0, 426.0);
564 setMatrix(); 524 setMatrix();
@@ -704,6 +664,47 @@ class gl_spider @@ -704,6 +664,47 @@ class gl_spider
704 return fboID; 664 return fboID;
705 } 665 }
706 666
  667 + ///Method for controling the buffer and texture binding in order to properly
  668 + ///do the render to texture.
  669 + void
  670 + Bind()
  671 + {
  672 + float len = 8.0;
  673 + glBindFramebuffer(GL_FRAMEBUFFER, fboID);//set up GL buffer
  674 + glFramebufferTexture2D(
  675 + GL_FRAMEBUFFER,
  676 + GL_COLOR_ATTACHMENT0,
  677 + GL_TEXTURE_2D,
  678 + texbufferID,
  679 + 0);
  680 + glBindFramebuffer(GL_FRAMEBUFFER, fboID);
  681 + GLenum DrawBuffers[1] = {GL_COLOR_ATTACHMENT0};
  682 + glDrawBuffers(1, DrawBuffers);
  683 + glBindTexture(GL_TEXTURE_2D, texbufferID);
  684 + glClearColor(1,1,1,1);
  685 + glClear(GL_COLOR_BUFFER_BIT);
  686 + glMatrixMode(GL_PROJECTION);
  687 + glLoadIdentity();
  688 + glMatrixMode(GL_MODELVIEW);
  689 + glLoadIdentity();
  690 + glViewport(0,0,2.0*len, numSamples*len);
  691 + gluOrtho2D(0.0,2.0*len,0.0,numSamples*len);
  692 + glEnable(GL_TEXTURE_3D);
  693 + glBindTexture(GL_TEXTURE_3D, texID);
  694 +
  695 + CHECK_OPENGL_ERROR
  696 + }
  697 +
  698 + ///Method for Unbinding all of the texture resources
  699 + void
  700 + Unbind()
  701 + {
  702 + //Finalize GL_buffer
  703 + glBindTexture(GL_TEXTURE_3D, 0);
  704 + glDisable(GL_TEXTURE_3D);
  705 + glBindFramebuffer(GL_FRAMEBUFFER,0);
  706 + glBindTexture(GL_TEXTURE_2D, 0);
  707 + }
707 //--------------------------------------------------------------------------// 708 //--------------------------------------------------------------------------//
708 //-----------------------------TEMPORARY METHODS----------------------------// 709 //-----------------------------TEMPORARY METHODS----------------------------//
709 //--------------------------------------------------------------------------// 710 //--------------------------------------------------------------------------//
@@ -729,7 +730,7 @@ class gl_spider @@ -729,7 +730,7 @@ class gl_spider
729 findOptimalDirection(); 730 findOptimalDirection();
730 findOptimalPosition(); 731 findOptimalPosition();
731 findOptimalScale(); 732 findOptimalScale();
732 - // branchDetection(); 733 + branchDetection();
733 Unbind(); 734 Unbind();
734 return current_cost; 735 return current_cost;
735 } 736 }
@@ -776,9 +777,9 @@ class gl_spider @@ -776,9 +777,9 @@ class gl_spider
776 glTexCoord3f(x,y,z0); 777 glTexCoord3f(x,y,z0);
777 glVertex2f(0.0, j*0.1+0.1); 778 glVertex2f(0.0, j*0.1+0.1);
778 glTexCoord3f(x,y,z1); 779 glTexCoord3f(x,y,z1);
779 - glVertex2f(20.0, j*0.1+0.1); 780 + glVertex2f(16.0, j*0.1+0.1);
780 glTexCoord3f(xold,yold,z1); 781 glTexCoord3f(xold,yold,z1);
781 - glVertex2f(20.0, j*0.1); 782 + glVertex2f(16.0, j*0.1);
782 glTexCoord3f(xold,yold,z0); 783 glTexCoord3f(xold,yold,z0);
783 glVertex2f(0.0, j*0.1); 784 glVertex2f(0.0, j*0.1);
784 xold=x; 785 xold=x;
stim/visualization/glObj.h
1 #ifndef STIM_GLOBJ_H 1 #ifndef STIM_GLOBJ_H
2 #define STIM_GLOBJ_H 2 #define STIM_GLOBJ_H
3 3
4 -#include <stim/visualization/obj.h>  
5 #include <GL/glew.h> 4 #include <GL/glew.h>
6 #include <GL/glut.h> 5 #include <GL/glut.h>
7 #include <stim/math/vector.h> 6 #include <stim/math/vector.h>
  7 +#include <stim/visualization/obj.h>
8 8
9 9
10 namespace stim 10 namespace stim
@@ -13,23 +13,25 @@ namespace stim @@ -13,23 +13,25 @@ namespace stim
13 * Assist with the visualization the segmented vessels. 13 * Assist with the visualization the segmented vessels.
14 * Uses 14 * Uses
15 */ 15 */
16 -  
17 -class objGl : public virtual stim::obj<T> 16 +template <typename T>
  17 +class glObj : public virtual stim::obj<T>
18 { 18 {
19 private: 19 private:
20 using stim::obj<T>::L; 20 using stim::obj<T>::L;
21 using stim::obj<T>::P; 21 using stim::obj<T>::P;
22 using stim::obj<T>::F; 22 using stim::obj<T>::F;
23 - using vec<T>::size;  
24 - using vec<T>::at; 23 +// using stim::obj<T>::numL();
  24 +// using std::vector<T>::size;
  25 +// using std::vector<T>::at;
25 GLuint dList; 26 GLuint dList;
26 27
27 28
28 void 29 void
29 - init 30 + init()
30 { 31 {
31 - dList = glGenList(1); 32 + dList = glGenLists(1);
32 glListBase(dList); 33 glListBase(dList);
  34 +
33 glMatrixMode(GL_PROJECTION); 35 glMatrixMode(GL_PROJECTION);
34 glLoadIdentity; 36 glLoadIdentity;
35 glMatrixMode(GL_MODELVIEW); 37 glMatrixMode(GL_MODELVIEW);
@@ -40,15 +42,17 @@ private: @@ -40,15 +42,17 @@ private:
40 void 42 void
41 Create() 43 Create()
42 { 44 {
43 - int len = (int) numL(); 45 + int len = (int) stim::obj<T>::numL();
44 std::vector< stim::vec<float> > line; 46 std::vector< stim::vec<float> > line;
45 glNewList(dList, GL_COMPILE); 47 glNewList(dList, GL_COMPILE);
46 - glColor3f(0.5, 1.0, 0.5); 48 + // glColor3f(0.0, 1.0, 0.0);
  49 + glLineWidth(2.5);
47 for(int i = 0; i < len; i++){ 50 for(int i = 0; i < len; i++){
48 - line = getL_V(i);  
49 - glBegin(GL_LINES); 51 + line = stim::obj<T>::getL_V(i);
  52 + glColor3ub(rand()%255, rand()%255, rand()%255);
  53 + glBegin(GL_LINE_STRIP);
50 for(int j = 0; j < line.size(); j++){ 54 for(int j = 0; j < line.size(); j++){
51 - glVectex3f( 55 + glVertex3f(
52 line[j][0], 56 line[j][0],
53 line[j][1], 57 line[j][1],
54 line[j][2] 58 line[j][2]
@@ -57,16 +61,33 @@ private: @@ -57,16 +61,33 @@ private:
57 glEnd(); 61 glEnd();
58 } 62 }
59 glEndList(); 63 glEndList();
  64 + CHECK_OPENGL_ERROR
60 } 65 }
61 66
62 public: 67 public:
63 - objGl(std::string filename) 68 + glObj()
64 { 69 {
65 - stim::obj::load(filename);  
66 - glPopMatrix(); //Safety Operation to avoid changing the current matrix. 70 +
  71 + }
  72 +
  73 + void
  74 + createFromSelf()
  75 + {
  76 + // glPopMatrix();
67 init(); 77 init();
68 Create(); 78 Create();
69 - glPushMatrix(); 79 + // glPushMatrix();
  80 + }
  81 +
  82 + void
  83 + createFromFile(std::string filename)
  84 + {
  85 + stim::obj<T>::load(filename);
  86 + glPushMatrix(); //Safety Operation to avoid changing the current matrix.
  87 + init();
  88 + Create();
  89 + glPopMatrix();
  90 + CHECK_OPENGL_ERROR
70 } 91 }
71 92
72 93
@@ -74,7 +95,44 @@ public: @@ -74,7 +95,44 @@ public:
74 Render() 95 Render()
75 { 96 {
76 glCallList(dList); 97 glCallList(dList);
  98 + CHECK_OPENGL_ERROR
77 } 99 }
78 100
  101 + void
  102 + RenderLine(int i)
  103 + {
  104 + std::vector < stim::vec<T> > line;
  105 + int len = (int) stim::obj<T>::numL();
  106 + line = stim::obj<T>::getL_V(i);
  107 + glColor3f(0.5, 1.0, 0.5);
  108 + glLineWidth(3.0);
  109 + glBegin(GL_LINE_STRIP);
  110 + for(int j = 0; j < line.size(); j++){
  111 + glVertex3f(
  112 + line[j][0],
  113 + line[j][1],
  114 + line[j][2]
  115 + );
  116 + }
  117 + glEnd();
  118 + }
  119 +
  120 + void
  121 + RenderLine(std::vector< stim::vec<T> > l)
  122 + {
  123 + glColor3f(0.5, 1.0, 0.5);
  124 + glLineWidth(3.0);
  125 + glBegin(GL_LINE_STRIP);
  126 + for(int j = 0; j < l.size(); j++){
  127 + glVertex3f(
  128 + l[j][0],
  129 + l[j][1],
  130 + l[j][2]
  131 + );
  132 + }
  133 + glEnd();
  134 + }
  135 +
  136 +};
79 } 137 }
80 -} 138 +#endif
stim/visualization/obj.h
@@ -352,26 +352,27 @@ public: @@ -352,26 +352,27 @@ public:
352 352
353 /// This function terminates drawing of a primitive object, such as a line, face, or point set 353 /// This function terminates drawing of a primitive object, such as a line, face, or point set
354 void End(){ 354 void End(){
355 -  
356 //copy the current object to the appropriate list 355 //copy the current object to the appropriate list
357 - switch(current_type){ 356 + if(current_geo.size() != 0)
  357 + {
  358 + switch(current_type){
358 359
359 - case OBJ_NONE:  
360 - std::cout<<"STIM::OBJ error, objEnd() called before objBegin()."<<std::endl;  
361 - break; 360 + case OBJ_NONE:
  361 + std::cout<<"STIM::OBJ error, objEnd() called before objBegin()."<<std::endl;
  362 + break;
362 363
363 - case OBJ_POINTS:  
364 - P.push_back(current_geo);  
365 - break; 364 + case OBJ_POINTS:
  365 + P.push_back(current_geo);
  366 + break;
366 367
367 - case OBJ_LINE:  
368 - L.push_back(current_geo);  
369 - break; 368 + case OBJ_LINE:
  369 + L.push_back(current_geo);
  370 + break;
370 371
371 - case OBJ_FACE:  
372 - F.push_back(current_geo); 372 + case OBJ_FACE:
  373 + F.push_back(current_geo);
  374 + }
373 } 375 }
374 -  
375 //clear everything 376 //clear everything
376 current_type = OBJ_NONE; 377 current_type = OBJ_NONE;
377 current_geo.clear(); 378 current_geo.clear();
@@ -380,6 +381,12 @@ public: @@ -380,6 +381,12 @@ public:
380 geo_flag_vt = false; 381 geo_flag_vt = false;
381 geo_flag_vn = false; 382 geo_flag_vn = false;
382 } 383 }
  384 +//temporary convenience method
  385 + void rev(){
  386 + if(current_geo.size() != 0)
  387 + // current_geo.reverse(current_geo.begin(), current_geo.end());
  388 + std::reverse(current_geo.begin(), current_geo.end());
  389 + }
383 390
384 //output the OBJ structure as a string 391 //output the OBJ structure as a string
385 std::string str(){ 392 std::string str(){
@@ -642,7 +649,6 @@ public: @@ -642,7 +649,6 @@ public:
642 649
643 //get the number of points in the specified line 650 //get the number of points in the specified line
644 unsigned int nP = L[i].size(); 651 unsigned int nP = L[i].size();
645 -  
646 //create a vector of points 652 //create a vector of points
647 std::vector< stim::vec<T> > l; 653 std::vector< stim::vec<T> > l;
648 654
@@ -688,6 +694,7 @@ public: @@ -688,6 +694,7 @@ public:
688 return l; 694 return l;
689 } 695 }
690 696
  697 +
691 /// Returns a vector containing the list of texture coordinates associated with each point of a line. 698 /// Returns a vector containing the list of texture coordinates associated with each point of a line.
692 699
693 /// @param i is the index of the desired line 700 /// @param i is the index of the desired line