Commit 4b594a40601be8cacbce578ad000d549e4403b43
Merge remote-tracking branch 'origin/Branch_Detection'
Showing
4 changed files
with
214 additions
and
138 deletions
Show diff stats
stim/cuda/cost.h
@@ -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<int> get_cost(cudaGraphicsResource_t src, int DIM_Y) | @@ -151,25 +153,33 @@ stim::vec<int> 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 |