Commit 97508a2e1c47dc33e10fe009f5f8adc7e6da706f
1 parent
fac43319
Added mehtods for creating and calling length templates, there is an error somew…
…here that causes a buffer overwrite
Showing
1 changed file
with
105 additions
and
14 deletions
Show diff stats
stim/gl/gl_spider.h
... | ... | @@ -68,6 +68,7 @@ class gl_spider // : public virtual gl_texture<T> |
68 | 68 | std::vector<stim::vec3<float> > dV; //A list of all the direction vectors. |
69 | 69 | std::vector<stim::vec3<float> > pV; //A list of all test positions (relative to p) |
70 | 70 | std::vector<float> mV; //A list of all the size vectors. |
71 | + std::vector<float> lV; //A list of all the size vectors. | |
71 | 72 | |
72 | 73 | stim::matrix<float, 4> cT; //current Transformation matrix (tissue)->(texture) |
73 | 74 | GLuint texID; //OpenGL ID for the texture to be traced |
... | ... | @@ -93,6 +94,9 @@ class gl_spider // : public virtual gl_texture<T> |
93 | 94 | GLuint radius_buffID; //framebuffer ID, radius templates |
94 | 95 | GLuint radius_texID; //texture ID, radius templates |
95 | 96 | |
97 | + GLuint length_buffID; //framebuffer ID, radius templates | |
98 | + GLuint length_texID; //texture ID, radius templates | |
99 | + | |
96 | 100 | GLuint cylinder_buffID; //framebuffer ID, cylinder (surrounding fiber) |
97 | 101 | GLuint cylinder_texID; //texture ID, cylinder |
98 | 102 | |
... | ... | @@ -132,6 +136,7 @@ class gl_spider // : public virtual gl_texture<T> |
132 | 136 | stim::cuda::cuda_texture t_dir; //cuda_texture object used as an interface between OpenGL and cuda for direction vectors. |
133 | 137 | stim::cuda::cuda_texture t_pos; //cuda_texture object used as an interface between OpenGL and cuda for position vectors. |
134 | 138 | stim::cuda::cuda_texture t_mag; //cuda_texture object used as an interface between OpenGL and cuda for size vectors. |
139 | + stim::cuda::cuda_texture t_len; //cuda_texture object used as an interface between OpenGL and cuda for size vectors. | |
135 | 140 | |
136 | 141 | |
137 | 142 | #ifdef DEBUG |
... | ... | @@ -222,7 +227,7 @@ class gl_spider // : public virtual gl_texture<T> |
222 | 227 | /// changes the x, y, z size of the spider to minimize the cost |
223 | 228 | /// function. |
224 | 229 | void |
225 | - findOptimalScale() | |
230 | + findOptimalRadius() | |
226 | 231 | { |
227 | 232 | #ifdef TIMING |
228 | 233 | gpuStartTimer(); |
... | ... | @@ -243,6 +248,31 @@ class gl_spider // : public virtual gl_texture<T> |
243 | 248 | setMagnitude(m*mV[best]); //adjust the magnitude. |
244 | 249 | } |
245 | 250 | |
251 | + /// Method for finding the best length for the spider. | |
252 | + /// changes the x, y, z size of the spider to minimize the cost | |
253 | + /// function. | |
254 | + void | |
255 | + findOptimalLength() | |
256 | + { | |
257 | + #ifdef TIMING | |
258 | + gpuStartTimer(); | |
259 | + #endif | |
260 | + setMatrix(); //create the transformation. | |
261 | + glCallList(dList+3); //move the templates to p, d, m. | |
262 | + glFinish(); //flush the drawing pipeline. | |
263 | + #ifdef TIMING | |
264 | + size_time += gpuStopTimer(); | |
265 | + #endif | |
266 | + int best = getCost(t_len.getTexture(), t_len.getAuxArray(), numSamplesMag); //get best cost. | |
267 | + #ifdef DEBUG | |
268 | +// name.str(""); | |
269 | +// name << "Final_Cost_Size_" << iter << "_" << iter_siz << ".bmp"; | |
270 | +// test(t_mag.getTexture(), n_pixels*2.0, numSamplesMag*n_pixels, name.str()); | |
271 | +// iter_siz++; | |
272 | + #endif | |
273 | + setLength(mV[best]); //adjust the magnitude. | |
274 | + } | |
275 | + | |
246 | 276 | |
247 | 277 | |
248 | 278 | |
... | ... | @@ -485,6 +515,48 @@ class gl_spider // : public virtual gl_texture<T> |
485 | 515 | glEndList(); ///finilize the displaylist. |
486 | 516 | } |
487 | 517 | |
518 | + ///@param float delta, How much the rectangles are allowed to expand. | |
519 | + ///Method for populating the buffer with the sampled texture. | |
520 | + ///Objects created are rectangles the with the created sizes. | |
521 | + ///All points are sampled from a texture. | |
522 | + ///Stored in a display list. | |
523 | + ///uses the default m <1,1,0> | |
524 | + void | |
525 | + genLengthVectors(float delta = 0.70) | |
526 | + { | |
527 | + | |
528 | + //Set up the vectors necessary for Rectangle creation. | |
529 | + stim::vec3<float> Y(1.0, 0.0, 0.0); //orthogonal vec. | |
530 | + stim::vec3<float> pos(0.0, 0.0, 0.0); //center of the future rect. | |
531 | + float mag = 1.0; ///size of the rectangle | |
532 | + stim::vec3<float> dir(0.0, 0.0, 1.0); ///normal of the rectangle plane. | |
533 | + stim::vec<float> temp(0.0,0.0,0.0); | |
534 | + | |
535 | + //Set up the variable necessary for vector creation. | |
536 | + float min = 1.0-delta; ///smallest size | |
537 | + float max = 1.0+delta; ///largers size. | |
538 | + float step = (max-min)/(numSamplesMag-1); ///the size variation from one rect to the next. | |
539 | + float factor; | |
540 | + glNewList(dList+3, GL_COMPILE); | |
541 | + for(int i = 0; i < numSamplesMag; i++){ ///for the number of position samples | |
542 | + //Create linear index | |
543 | + factor = (min+step*i)*mag; ///scaling factor | |
544 | + lV.push_back(factor); ///save the size factor for further use. | |
545 | + temp[0] = factor; | |
546 | + temp[1] = mag; | |
547 | + hor = stim::rect<float>(temp, ///generate a rectangle with the new vector as a normal. | |
548 | + pos, dir, | |
549 | + ((Y.cross(d)).cross(d)) | |
550 | + .norm()); | |
551 | + ver = stim::rect<float>(temp, ///generate another rectangle that's perpendicular the first but parallel to the cart vector. | |
552 | + pos, dir, | |
553 | + hor.n()); | |
554 | + UpdateBuffer(0.0, 0.0+i*n_pixels); ///sample the necessary points and put them into a display list. | |
555 | + CHECK_OPENGL_ERROR | |
556 | + } | |
557 | + glEndList(); ///finilize the displaylist. | |
558 | + } | |
559 | + | |
488 | 560 | ///@param float v_x x-coordinate in buffer-space, |
489 | 561 | ///@param float v_y y-coordinate in buffer-space. |
490 | 562 | ///Samples the texture space. |
... | ... | @@ -856,6 +928,8 @@ class gl_spider // : public virtual gl_texture<T> |
856 | 928 | glDeleteBuffers(1, &position_buffID); |
857 | 929 | glDeleteTextures(1, &radius_texID); |
858 | 930 | glDeleteBuffers(1, &radius_buffID); |
931 | + glDeleteTextures(1, &length_texID); | |
932 | + glDeleteBuffers(1, &length_buffID); | |
859 | 933 | glDeleteTextures(1, &cylinder_texID); |
860 | 934 | glDeleteBuffers(1, &cylinder_buffID); |
861 | 935 | } |
... | ... | @@ -882,7 +956,7 @@ class gl_spider // : public virtual gl_texture<T> |
882 | 956 | iter_dir = 0; |
883 | 957 | iter_siz = 0; |
884 | 958 | #endif |
885 | - stepsize = 10.0; | |
959 | + stepsize = 3.0; | |
886 | 960 | n_pixels = 16.0; |
887 | 961 | |
888 | 962 | srand(100); |
... | ... | @@ -892,6 +966,9 @@ class gl_spider // : public virtual gl_texture<T> |
892 | 966 | GenerateFBO(n_pixels*2, numSamplesPos*n_pixels, position_texID, position_buffID); |
893 | 967 | CHECK_OPENGL_ERROR |
894 | 968 | GenerateFBO(n_pixels*2, numSamplesMag*n_pixels, radius_texID, radius_buffID); |
969 | + | |
970 | + CHECK_OPENGL_ERROR | |
971 | + GenerateFBO(n_pixels*2, numSamplesMag*n_pixels, length_texID, length_buffID); | |
895 | 972 | CHECK_OPENGL_ERROR |
896 | 973 | GenerateFBO(16, 216, cylinder_texID, cylinder_buffID); |
897 | 974 | CHECK_OPENGL_ERROR |
... | ... | @@ -901,8 +978,10 @@ class gl_spider // : public virtual gl_texture<T> |
901 | 978 | t_pos.Alloc(numSamplesPos); |
902 | 979 | t_mag.MapCudaTexture(radius_texID, GL_TEXTURE_2D); |
903 | 980 | t_mag.Alloc(numSamplesMag); |
981 | + t_mag.MapCudaTexture(length_texID, GL_TEXTURE_2D); | |
982 | + t_mag.Alloc(numSamplesMag); | |
904 | 983 | setMatrix(); |
905 | - dList = glGenLists(3); | |
984 | + dList = glGenLists(4);//???????????????????????????? | |
906 | 985 | glListBase(dList); |
907 | 986 | Bind(direction_texID, direction_buffID, numSamples, n_pixels); |
908 | 987 | genDirectionVectors(5*stim::PI/4); |
... | ... | @@ -913,6 +992,9 @@ class gl_spider // : public virtual gl_texture<T> |
913 | 992 | Bind(radius_texID, radius_buffID, numSamplesMag, n_pixels); |
914 | 993 | genMagnitudeVectors(); |
915 | 994 | Unbind(); |
995 | + Bind(length_texID, length_buffID, numSamplesMag, n_pixels); | |
996 | + genLengthVectors(); | |
997 | + Unbind(); | |
916 | 998 | Bind(cylinder_texID, cylinder_buffID, 27); |
917 | 999 | // DrawCylinder(); |
918 | 1000 | Unbind(); |
... | ... | @@ -984,12 +1066,20 @@ class gl_spider // : public virtual gl_texture<T> |
984 | 1066 | |
985 | 1067 | |
986 | 1068 | ///@param float mag, size of the sampled region. |
987 | - ///Sets the m vector to the input mag for both templates. | |
1069 | + ///Sets the m value to the input mag for both templates. | |
988 | 1070 | void |
989 | 1071 | setMagnitude(float mag) |
990 | 1072 | { |
991 | 1073 | m = mag; |
992 | 1074 | } |
1075 | + | |
1076 | + ///@param float len, length of the sampled region. | |
1077 | + ///Sets the length value to the input len for both templates. | |
1078 | + void | |
1079 | + setLength(float len) | |
1080 | + { | |
1081 | + length = len; | |
1082 | + } | |
993 | 1083 | |
994 | 1084 | ///@param float x, voxel size in the x direction. |
995 | 1085 | ///@param float y, voxel size in the y direction. |
... | ... | @@ -1041,17 +1131,13 @@ class gl_spider // : public virtual gl_texture<T> |
1041 | 1131 | stim::vec<float> out(0.0,0.0,0.0,0.0); |
1042 | 1132 | stim::vec3<float> from(0.0,0.0,1.0); |
1043 | 1133 | out[0] = acos(dir.dot(from))*180/stim::PI; |
1044 | - #ifdef DEBUG | |
1045 | - std::cout << "out is " << out << std::endl; | |
1046 | - std::cout << "when rotating from " << from << " to " << dir << std::endl; | |
1047 | - #endif | |
1048 | - if(out[0] < 0.01){ | |
1134 | + if(out[0] < 1.1){ | |
1049 | 1135 | out[0] = 0.0; |
1050 | 1136 | out[1] = 0.0; |
1051 | 1137 | out[2] = 0.0; |
1052 | 1138 | out[3] = 1.0; |
1053 | 1139 | } |
1054 | - else if(out[0] < -180.0+0.01) | |
1140 | + else if(out[0] < -179.0) | |
1055 | 1141 | { |
1056 | 1142 | out[0] = 180.0; |
1057 | 1143 | out[1] = 1.0; |
... | ... | @@ -1064,6 +1150,10 @@ class gl_spider // : public virtual gl_texture<T> |
1064 | 1150 | out[2] = temp[1]; |
1065 | 1151 | out[3] = temp[2]; |
1066 | 1152 | } |
1153 | + #ifdef DEBUG | |
1154 | + std::cout << "out is " << out << std::endl; | |
1155 | + std::cout << "when rotating from " << from << " to " << dir << std::endl; | |
1156 | + #endif | |
1067 | 1157 | return out; |
1068 | 1158 | } |
1069 | 1159 | |
... | ... | @@ -1303,7 +1393,7 @@ class gl_spider // : public virtual gl_texture<T> |
1303 | 1393 | findOptimalPosition(); |
1304 | 1394 | Unbind(); |
1305 | 1395 | Bind(radius_texID, radius_buffID, numSamplesMag, n_pixels); |
1306 | - findOptimalScale(); | |
1396 | + findOptimalRadius(); | |
1307 | 1397 | Unbind(); |
1308 | 1398 | CHECK_OPENGL_ERROR |
1309 | 1399 | |
... | ... | @@ -1351,12 +1441,13 @@ class gl_spider // : public virtual gl_texture<T> |
1351 | 1441 | outFile.open("New_Pos_Vectors.txt"); |
1352 | 1442 | outFile << name.str().c_str(); |
1353 | 1443 | } |
1444 | +/* | |
1354 | 1445 | void |
1355 | 1446 | DrawCylinder() |
1356 | 1447 | { |
1357 | 1448 | glNewList(dList+3, GL_COMPILE); |
1358 | 1449 | float z0 = -0.5; float z1 = 0.5; float r0 = 0.5; |
1359 | - float x,y; | |
1450 | + float x,y; | |
1360 | 1451 | float xold = 0.5; float yold = 0.0; |
1361 | 1452 | float step = 360.0/numSamples*32; |
1362 | 1453 | //float step = 360.0/8.0; |
... | ... | @@ -1387,7 +1478,7 @@ class gl_spider // : public virtual gl_texture<T> |
1387 | 1478 | glEnd(); |
1388 | 1479 | glEndList(); |
1389 | 1480 | } |
1390 | - | |
1481 | +*/ | |
1391 | 1482 | ///need to return the cylinder. |
1392 | 1483 | ///SOMETHING MIGHT BE GOING ON HERE IN GENERATE BUFFER. |
1393 | 1484 | void |
... | ... | @@ -1455,7 +1546,7 @@ class gl_spider // : public virtual gl_texture<T> |
1455 | 1546 | // Unbind(); |
1456 | 1547 | //THIS IS EXPERIMENTAL |
1457 | 1548 | Bind(radius_texID, radius_buffID, numSamplesMag, n_pixels); |
1458 | - findOptimalScale(); | |
1549 | + findOptimalRadius(); | |
1459 | 1550 | Unbind(); |
1460 | 1551 | //THIS IS EXPERIMENTAL |
1461 | 1552 | ... | ... |