Commit e843658b6c27157541f01e8c1bcb2d52a760758c
1 parent
08ec34fa
Previous push did not work correctly. Added function 'sift-mask' which saves onl…
…y those spectral values corresponding to mask != 0. Syntax is 'hsiproc InputFile OutputFile --sift-mask MaskName'
Showing
6 changed files
with
383 additions
and
215 deletions
Show diff stats
stim/envi/bil.h
@@ -228,6 +228,7 @@ public: | @@ -228,6 +228,7 @@ public: | ||
228 | return true; | 228 | return true; |
229 | 229 | ||
230 | } | 230 | } |
231 | + | ||
231 | 232 | ||
232 | /// Perform baseline correction given a list of baseline points and stores the result in a new BSQ file. | 233 | /// Perform baseline correction given a list of baseline points and stores the result in a new BSQ file. |
233 | 234 | ||
@@ -823,9 +824,9 @@ public: | @@ -823,9 +824,9 @@ public: | ||
823 | for (unsigned i = 0; i < R[1]; i++) //for each value in R[1] (BIP should be X) | 824 | for (unsigned i = 0; i < R[1]; i++) //for each value in R[1] (BIP should be X) |
824 | { | 825 | { |
825 | getY(temp, i); //retrieve an ZX slice, stored in temp | 826 | getY(temp, i); //retrieve an ZX slice, stored in temp |
826 | - for ( unsigned j = 0; j < R[2]; j++) //for each R[2] (BIP should be Y) | 827 | + for ( unsigned j = 0; j < R[2]; j++) //for each R[2] (Y) |
827 | { | 828 | { |
828 | - for (unsigned k = 0; k < R[0]; k++) | 829 | + for (unsigned k = 0; k < R[0]; k++) //for each band |
829 | { | 830 | { |
830 | if(p[i * R[0] + k] == 0) | 831 | if(p[i * R[0] + k] == 0) |
831 | temp[j * R[0] + k] = 0; | 832 | temp[j * R[0] + k] = 0; |
@@ -840,6 +841,44 @@ public: | @@ -840,6 +841,44 @@ public: | ||
840 | return true; | 841 | return true; |
841 | } | 842 | } |
842 | 843 | ||
844 | + ///Saves to disk only those spectra corresponding to mask values != 0 | ||
845 | + bool sift_mask(std::string outfile, unsigned char* p){ | ||
846 | + // Assume R[0] = X, R[1] = Y, R[2] = Z. | ||
847 | + std::ofstream target(outfile.c_str(), std::ios::binary); | ||
848 | + | ||
849 | + //for loading pages: | ||
850 | + unsigned XZ = R[0] * R[2]; //calculate the number of values in an XZ page on disk | ||
851 | + unsigned L = XZ * sizeof(T); //calculate the size of the page (in bytes) | ||
852 | + T * temp = (T*)malloc(L); //allocate memory for a temporary page | ||
853 | + | ||
854 | + //for saving spectra: | ||
855 | + unsigned Z = R[2]; //calculate the number of values in a spectrum | ||
856 | + unsigned LZ = Z * sizeof(T); //calculate the size of the spectrum (in bytes) | ||
857 | + T * tempZ = (T*)malloc(LZ); //allocate memory for a temporary spectrum | ||
858 | + spectrum(tempZ, R[0] - 1, R[1] - 1); //creates a dummy spectrum by taking the last spectrum in the image | ||
859 | + | ||
860 | + for (unsigned i = 0; i < R[1]; i++) //Select a page by choosing Y coordinate, R[1] | ||
861 | + { | ||
862 | + getY(temp, i); //retrieve an ZX page, store in "temp" | ||
863 | + for (unsigned j = 0; j < R[0]; j++) //Select a pixel by choosing X coordinate in the page, R[0] | ||
864 | + { | ||
865 | + if (p[j * R[0] + i] != 0) //if the mask != 0 at that XY pixel | ||
866 | + { | ||
867 | + for (unsigned k = 0; k < R[2]; k++) //Select a voxel by choosing Z coordinate at the pixel | ||
868 | + { | ||
869 | + tempZ[k] = temp[k*R[0] + i]; //Pass the correct spectral value from XZ page into the spectrum to be saved. | ||
870 | + } | ||
871 | + target.write(reinterpret_cast<const char*>(tempZ), LZ); //write that spectrum to disk. Size is L2. | ||
872 | + } | ||
873 | + else | ||
874 | + continue; | ||
875 | + } | ||
876 | + } | ||
877 | + target.close(); | ||
878 | + free(temp); | ||
879 | + return true; | ||
880 | + } | ||
881 | + | ||
843 | /// Calculate the mean band value (average along B) at each pixel location. | 882 | /// Calculate the mean band value (average along B) at each pixel location. |
844 | 883 | ||
845 | /// @param p is a pointer to memory of size X * Y * sizeof(T) that will store the band averages. | 884 | /// @param p is a pointer to memory of size X * Y * sizeof(T) that will store the band averages. |
stim/envi/bip.h
@@ -917,7 +917,7 @@ public: | @@ -917,7 +917,7 @@ public: | ||
917 | { | 917 | { |
918 | for (unsigned k = 0; k < R[2]; k++) //for each B value (band) | 918 | for (unsigned k = 0; k < R[2]; k++) //for each B value (band) |
919 | { | 919 | { |
920 | - if(p[i * R[0] + k] == 0) //if the mask value is zero | 920 | + if (p[i * R[0] + j] == 0) //if the mask value is zero |
921 | temp[j * R[2] + k] = 0; //set the pixel value to zero | 921 | temp[j * R[2] + k] = 0; //set the pixel value to zero |
922 | else //otherwise just continue | 922 | else //otherwise just continue |
923 | continue; | 923 | continue; |
@@ -930,7 +930,46 @@ public: | @@ -930,7 +930,46 @@ public: | ||
930 | return true; //return true | 930 | return true; //return true |
931 | } | 931 | } |
932 | 932 | ||
933 | - /// Calculate the mean band value (average along B) at each pixel location. | 933 | + |
934 | + ///Saves to disk only those spectra corresponding to mask values != 0 | ||
935 | + bool sift_mask(std::string outfile, unsigned char* p){ | ||
936 | + // Assume R[0] = X, R[1] = Y, R[2] = Z. | ||
937 | + std::ofstream target(outfile.c_str(), std::ios::binary); | ||
938 | + | ||
939 | + //for loading pages: | ||
940 | + unsigned ZX = R[0] * R[2]; //calculate the number of values in an XZ page on disk | ||
941 | + unsigned L = ZX * sizeof(T); //calculate the size of the page (in bytes) | ||
942 | + T * temp = (T*)malloc(L); //allocate memory for a temporary page | ||
943 | + | ||
944 | + //for saving spectra: | ||
945 | + unsigned Z = R[2]; //calculate the number of values in a spectrum | ||
946 | + unsigned LZ = Z * sizeof(T); //calculate the size of the spectrum (in bytes) | ||
947 | + T * tempZ = (T*)malloc(LZ); //allocate memory for a temporary spectrum | ||
948 | + spectrum(tempZ, R[0] - 1, R[1] - 1); //creates a dummy spectrum by taking the last spectrum in the image | ||
949 | + | ||
950 | + for (unsigned i = 0; i < R[1]; i++) //Select a page by choosing Y coordinate, R[1] | ||
951 | + { | ||
952 | + getY(temp, i); //retrieve an ZX page, store in "temp" | ||
953 | + for (unsigned j = 0; j < R[0]; j++) //Select a pixel by choosing X coordinate in the page, R[0] | ||
954 | + { | ||
955 | + if (p[j * R[0] + i] != 0) //if the mask != 0 at that XY pixel | ||
956 | + { | ||
957 | + for (unsigned k = 0; k < R[2]; k++) //Select a voxel by choosing Z coordinate at the pixel | ||
958 | + { | ||
959 | + tempZ[k] = temp[i*R[2] + k]; //Pass the correct spectral value from XZ page into the spectrum to be saved. | ||
960 | + } | ||
961 | + target.write(reinterpret_cast<const char*>(tempZ), LZ); //write that spectrum to disk. Size is L2. | ||
962 | + } | ||
963 | + else | ||
964 | + continue; | ||
965 | + } | ||
966 | + } | ||
967 | + target.close(); | ||
968 | + free(temp); | ||
969 | + return true; | ||
970 | + } | ||
971 | + | ||
972 | + | ||
934 | 973 | ||
935 | /// @param p is a pointer to memory of size X * Y * sizeof(T) that will store the band averages. | 974 | /// @param p is a pointer to memory of size X * Y * sizeof(T) that will store the band averages. |
936 | bool band_avg(T* p){ | 975 | bool band_avg(T* p){ |
stim/envi/bsq.h
@@ -751,25 +751,55 @@ public: | @@ -751,25 +751,55 @@ public: | ||
751 | 751 | ||
752 | T * temp = (T*)malloc(L); | 752 | T * temp = (T*)malloc(L); |
753 | 753 | ||
754 | - for (unsigned i = 0; i < R[2]; i++) | 754 | + for (unsigned i = 0; i < R[2]; i++) //for each spectral bin |
755 | { | 755 | { |
756 | - band_index(temp, i); | ||
757 | - for ( unsigned j = 0; j < XY; j++) | 756 | + band_index(temp, i); //get the specified band (by index) |
757 | + for ( unsigned j = 0; j < XY; j++) // for each pixel | ||
758 | { | 758 | { |
759 | - if(p[j] == 0){ | ||
760 | - temp[j] = 0; | 759 | + if(p[j] == 0){ //if the mask is 0 at that pixel |
760 | + temp[j] = 0; //set temp to zero | ||
761 | } | 761 | } |
762 | else{ | 762 | else{ |
763 | continue; | 763 | continue; |
764 | } | 764 | } |
765 | } | 765 | } |
766 | - target.write(reinterpret_cast<const char*>(temp), L); //write a band data into target file | 766 | + target.write(reinterpret_cast<const char*>(temp), L); //write the XY slice at that band to disk |
767 | } | 767 | } |
768 | target.close(); | 768 | target.close(); |
769 | free(temp); | 769 | free(temp); |
770 | return true; | 770 | return true; |
771 | } | 771 | } |
772 | 772 | ||
773 | + ///Saves to disk only those spectra corresponding to mask values != 0 | ||
774 | + bool sift_mask(std::string outfile, unsigned char* p){ | ||
775 | + std::ofstream target(outfile.c_str(), std::ios::binary); | ||
776 | + // open a band (XY plane) | ||
777 | + unsigned XY = R[0] * R[1]; //Number of XY pixels | ||
778 | + unsigned L = XY * sizeof(T); //size of XY pixels | ||
779 | + | ||
780 | + T * temp = (T*)malloc(L); //allocate memory for a band | ||
781 | + T * temp_vox = (T*)malloc(sizeof(T)); //allocate memory for one voxel | ||
782 | + | ||
783 | + for (unsigned i = 0; i < R[2]; i++) //for each spectral bin | ||
784 | + { | ||
785 | + band_index(temp, i); //get the specified band (XY sheet by index) | ||
786 | + for (unsigned j = 0; j < XY; j++) // for each pixel | ||
787 | + { | ||
788 | + if (p[j] != 0){ //if the mask is != 0 at that pixel | ||
789 | + temp_vox[0] = temp[j]; | ||
790 | + target.write(reinterpret_cast<const char*>(temp_vox), sizeof(T)); //write the XY slice at that band to disk | ||
791 | + } | ||
792 | + else{ | ||
793 | + continue; | ||
794 | + } | ||
795 | + } | ||
796 | + } | ||
797 | + target.close(); | ||
798 | + free(temp); | ||
799 | + return true; | ||
800 | + } | ||
801 | + | ||
802 | + | ||
773 | /// Calculate the mean band value (average along B) at each pixel location. | 803 | /// Calculate the mean band value (average along B) at each pixel location. |
774 | 804 | ||
775 | /// @param p is a pointer to memory of size X * Y * sizeof(T) that will store the band averages. | 805 | /// @param p is a pointer to memory of size X * Y * sizeof(T) that will store the band averages. |
stim/envi/envi.h
@@ -335,38 +335,76 @@ public: | @@ -335,38 +335,76 @@ public: | ||
335 | 335 | ||
336 | /// @param outfile is the name of the resulting masked output file | 336 | /// @param outfile is the name of the resulting masked output file |
337 | /// @param p is memory of size X*Y containing the mask (0 = false, all other values are true) | 337 | /// @param p is memory of size X*Y containing the mask (0 = false, all other values are true) |
338 | - bool apply_mask(std::string outfile, unsigned char* p) | 338 | + bool apply_mask(std::string outfile, unsigned char* p) |
339 | { | 339 | { |
340 | 340 | ||
341 | - if(header.interleave == envi_header::BSQ){ //if the infile is bsq file | ||
342 | - if(header.data_type ==envi_header::float32) | 341 | + if (header.interleave == envi_header::BSQ){ //if the infile is bsq file |
342 | + if (header.data_type == envi_header::float32) | ||
343 | return ((bsq<float>*)file)->apply_mask(outfile, p); | 343 | return ((bsq<float>*)file)->apply_mask(outfile, p); |
344 | - else if(header.data_type == envi_header::float64) | 344 | + else if (header.data_type == envi_header::float64) |
345 | return ((bsq<double>*)file)->apply_mask(outfile, p); | 345 | return ((bsq<double>*)file)->apply_mask(outfile, p); |
346 | else | 346 | else |
347 | - std::cout<<"ERROR: unidentified data type"<<std::endl; | 347 | + std::cout << "ERROR: unidentified data type" << std::endl; |
348 | } | 348 | } |
349 | 349 | ||
350 | - else if(header.interleave == envi_header::BIL){ //if the infile is bil file | ||
351 | - if(header.data_type ==envi_header::float32) | 350 | + else if (header.interleave == envi_header::BIL){ //if the infile is bil file |
351 | + if (header.data_type == envi_header::float32) | ||
352 | return ((bil<float>*)file)->apply_mask(outfile, p); | 352 | return ((bil<float>*)file)->apply_mask(outfile, p); |
353 | - else if(header.data_type == envi_header::float64) | 353 | + else if (header.data_type == envi_header::float64) |
354 | return ((bil<double>*)file)->apply_mask(outfile, p); | 354 | return ((bil<double>*)file)->apply_mask(outfile, p); |
355 | else | 355 | else |
356 | - std::cout<<"ERROR: unidentified data type"<<std::endl; | 356 | + std::cout << "ERROR: unidentified data type" << std::endl; |
357 | } | 357 | } |
358 | 358 | ||
359 | - else if(header.interleave == envi_header::BIP){ //if the infile is bip file | ||
360 | - if(header.data_type ==envi_header::float32) | 359 | + else if (header.interleave == envi_header::BIP){ //if the infile is bip file |
360 | + if (header.data_type == envi_header::float32) | ||
361 | return ((bip<float>*)file)->apply_mask(outfile, p); | 361 | return ((bip<float>*)file)->apply_mask(outfile, p); |
362 | - else if(header.data_type == envi_header::float64) | 362 | + else if (header.data_type == envi_header::float64) |
363 | return ((bip<double>*)file)->apply_mask(outfile, p); | 363 | return ((bip<double>*)file)->apply_mask(outfile, p); |
364 | else | 364 | else |
365 | - std::cout<<"ERROR: unidentified data type"<<std::endl; | 365 | + std::cout << "ERROR: unidentified data type" << std::endl; |
366 | } | 366 | } |
367 | 367 | ||
368 | else{ | 368 | else{ |
369 | - std::cout<<"ERROR: unidentified file type"<<std::endl; | 369 | + std::cout << "ERROR: unidentified file type" << std::endl; |
370 | + exit(1); | ||
371 | + } | ||
372 | + return false; | ||
373 | + } | ||
374 | + | ||
375 | + /// sift-mask saves in an array only those spectra corresponding to nonzero values of the mask. | ||
376 | + bool sift_mask(std::string outfile, unsigned char* p) | ||
377 | + { | ||
378 | + | ||
379 | + if (header.interleave == envi_header::BSQ){ //if the infile is bsq file | ||
380 | + if (header.data_type == envi_header::float32) | ||
381 | + return ((bsq<float>*)file)->sift_mask(outfile, p); | ||
382 | + else if (header.data_type == envi_header::float64) | ||
383 | + return ((bsq<double>*)file)->sift_mask(outfile, p); | ||
384 | + else | ||
385 | + std::cout << "ERROR: unidentified data type" << std::endl; | ||
386 | + } | ||
387 | + | ||
388 | + else if (header.interleave == envi_header::BIL){ //if the infile is bil file | ||
389 | + if (header.data_type == envi_header::float32) | ||
390 | + return ((bil<float>*)file)->sift_mask(outfile, p); | ||
391 | + else if (header.data_type == envi_header::float64) | ||
392 | + return ((bil<double>*)file)->sift_mask(outfile, p); | ||
393 | + else | ||
394 | + std::cout << "ERROR: unidentified data type" << std::endl; | ||
395 | + } | ||
396 | + | ||
397 | + else if (header.interleave == envi_header::BIP){ //if the infile is bip file | ||
398 | + if (header.data_type == envi_header::float32) | ||
399 | + return ((bip<float>*)file)->sift_mask(outfile, p); | ||
400 | + else if (header.data_type == envi_header::float64) | ||
401 | + return ((bip<double>*)file)->sift_mask(outfile, p); | ||
402 | + else | ||
403 | + std::cout << "ERROR: unidentified data type" << std::endl; | ||
404 | + } | ||
405 | + | ||
406 | + else{ | ||
407 | + std::cout << "ERROR: unidentified file type" << std::endl; | ||
370 | exit(1); | 408 | exit(1); |
371 | } | 409 | } |
372 | return false; | 410 | return false; |
stim/gl/gl_spider.h
@@ -41,7 +41,7 @@ class gl_spider : public virtual gl_texture<T> | @@ -41,7 +41,7 @@ class gl_spider : public virtual gl_texture<T> | ||
41 | cudaGraphicsResource_t resource; | 41 | cudaGraphicsResource_t resource; |
42 | GLuint fboID; | 42 | GLuint fboID; |
43 | GLuint texbufferID; | 43 | GLuint texbufferID; |
44 | - int iter = 0; //temporary for testing | 44 | + int iter = 0; |
45 | 45 | ||
46 | void | 46 | void |
47 | findOptimalPosition() | 47 | findOptimalPosition() |
@@ -185,45 +185,39 @@ class gl_spider : public virtual gl_texture<T> | @@ -185,45 +185,39 @@ class gl_spider : public virtual gl_texture<T> | ||
185 | } | 185 | } |
186 | 186 | ||
187 | void | 187 | void |
188 | - UpdatePlanes(float v_x, float v_y, vec<float> vctr, int type = 0) | 188 | + Update(float v_x, float v_y, vec<float> dir) |
189 | { | 189 | { |
190 | vec<float> Y(1.0,0.0,0.0); | 190 | vec<float> Y(1.0,0.0,0.0); |
191 | - if(cos(Y.dot(vctr))< 0.087){ Y[0] = 0.0; Y[1] = 1.0;} | ||
192 | - switch(type) { | ||
193 | - case 0: | ||
194 | - hor = stim::rect<float>(magnitude, position, vctr.norm(), | ||
195 | - ((Y.cross(vctr)).cross(vctr)).norm()); | ||
196 | - ver = stim::rect<float>(magnitude, position, vctr.norm(), | ||
197 | - hor.n()); | ||
198 | - break; | ||
199 | - case 1: | ||
200 | - hor = stim::rect<float>(magnitude, vctr, direction, | ||
201 | - ((Y.cross(direction)).cross(direction)).norm()); | ||
202 | - ver = stim::rect<float>(magnitude, vctr, direction, | ||
203 | - hor.n()); | ||
204 | - break; | ||
205 | - case 2: | ||
206 | - hor = stim::rect<float>(vctr, position, direction, | ||
207 | - ((Y.cross(direction)).cross(direction)).norm()); | ||
208 | - ver = stim::rect<float>(vctr, position, direction, | ||
209 | - hor.n()); | ||
210 | - break; | ||
211 | - default: | ||
212 | - std::cout << "unknown case have been passed" | ||
213 | - << std::endl; | ||
214 | - break; | ||
215 | - } | 191 | + if(cos(Y.dot(dir))< 0.087){ |
192 | + Y[0] = 0.0; Y[1] = 1.0;} | ||
193 | + hor = stim::rect<float>(magnitude, position, dir.norm(), | ||
194 | + ((Y.cross(dir)).cross(dir)).norm()); | ||
195 | + ver = stim::rect<float>(magnitude, position, dir.norm(), | ||
196 | + hor.n()); | ||
216 | UpdateBuffer(v_x, v_y); | 197 | UpdateBuffer(v_x, v_y); |
217 | } | 198 | } |
218 | - | ||
219 | - /* | ||
220 | - Method for controling the buffer and texture binding in order to properly | ||
221 | - do the render to texture. | ||
222 | - */ | 199 | + |
200 | + | ||
223 | void | 201 | void |
224 | - Bind(int numSamples = 1089) | 202 | + Sample(vec<float> in = (0,0,1), int numSamples = 1089, int solidAngle = M_PI/2) |
225 | { | 203 | { |
226 | - float len = 10.0; | 204 | + GenerateFBO(20, numSamples*10); |
205 | + | ||
206 | + ofstream file; | ||
207 | + file.open("samples.txt", std::ios_base::app); | ||
208 | + float samples[numSamples][3]; //Set up the variables | ||
209 | + //necessary for sample generation | ||
210 | + vec<float> d_s = in.cart2sph(); | ||
211 | + vec<float> temp; | ||
212 | + int dim = (sqrt(numSamples)-1)/2; | ||
213 | + //std::cout << dim << std::endl; | ||
214 | + float y_0 = 0.0; | ||
215 | + float len = 10.0; | ||
216 | + float p0 = M_PI/3; | ||
217 | + float dt = solidAngle/(1.0 * dim); | ||
218 | + float dp = p0/(1.0*dim); | ||
219 | + | ||
220 | + | ||
227 | glBindFramebuffer(GL_FRAMEBUFFER, fboID);//set up GL buffer | 221 | glBindFramebuffer(GL_FRAMEBUFFER, fboID);//set up GL buffer |
228 | glFramebufferTexture2D( | 222 | glFramebufferTexture2D( |
229 | GL_FRAMEBUFFER, | 223 | GL_FRAMEBUFFER, |
@@ -245,45 +239,11 @@ class gl_spider : public virtual gl_texture<T> | @@ -245,45 +239,11 @@ class gl_spider : public virtual gl_texture<T> | ||
245 | gluOrtho2D(0.0,2.0*len,0.0,numSamples*len); | 239 | gluOrtho2D(0.0,2.0*len,0.0,numSamples*len); |
246 | glEnable(GL_TEXTURE_3D); | 240 | glEnable(GL_TEXTURE_3D); |
247 | glBindTexture(GL_TEXTURE_3D, texID); | 241 | glBindTexture(GL_TEXTURE_3D, texID); |
248 | - } | ||
249 | - | ||
250 | - void | ||
251 | - Unbind() | ||
252 | - { | ||
253 | - //Finalize GL_buffer | ||
254 | - glBindTexture(GL_TEXTURE_3D, 0); | ||
255 | - glDisable(GL_TEXTURE_3D); | ||
256 | - glBindFramebuffer(GL_FRAMEBUFFER,0); | ||
257 | - glBindTexture(GL_TEXTURE_2D, 0); | ||
258 | - } | ||
259 | - /* | ||
260 | - Method for populating the buffer with the sampled texture. | ||
261 | - usually uses the default direction vector and then | ||
262 | - */ | ||
263 | - void | ||
264 | - sampleDirection(int numSamples = 1089, float solidAngle = M_PI) | ||
265 | - { | ||
266 | 242 | ||
267 | - //ofstream file; | ||
268 | - //file.open("samples.txt", std::ios_base::app); | ||
269 | - float samples[numSamples][3]; //Set up the variables | ||
270 | - //necessary for sample generation | ||
271 | - vec<float> d_s = direction.cart2sph(); | ||
272 | - vec<float> temp; | ||
273 | - int dim = (sqrt(numSamples)-1)/2; | ||
274 | - //std::cout << dim << std::endl; | ||
275 | - float y_0 = 0.0; | ||
276 | - float p0 = M_PI/3; | ||
277 | - float dt = solidAngle/(1.0 * dim); | ||
278 | - float dp = p0/(1.0*dim); | ||
279 | - | ||
280 | - Bind(); | ||
281 | - //file << "Step: Direction" << "\n"; | ||
282 | //file << "iteration: " << iter << "\n"; | 243 | //file << "iteration: " << iter << "\n"; |
283 | //file << "starting pos and dir:" << "[" << position[0] << "," <<position[1] << "," << position[2] << "]" << ":" << "[" << direction[0] << "," << direction[1] << "," << direction[2] << "]\n"; | 244 | //file << "starting pos and dir:" << "[" << position[0] << "," <<position[1] << "," << position[2] << "]" << ":" << "[" << direction[0] << "," << direction[1] << "," << direction[2] << "]\n"; |
284 | - //Loop over the samples such that the original orientation is in the | ||
285 | - //center of the resulting texture index (544) | ||
286 | - //file << position[0] << "," <<position[1] << "," << position[2] << "\n"; | 245 | + //Loop over the samples |
246 | + file << position[0] << "," <<position[1] << "," << position[2] << "\n"; | ||
287 | int idx; | 247 | int idx; |
288 | for(int i = -dim; i <= dim; i++){ | 248 | for(int i = -dim; i <= dim; i++){ |
289 | for(int j = -dim; j <= dim; j++){ | 249 | for(int j = -dim; j <= dim; j++){ |
@@ -299,93 +259,28 @@ class gl_spider : public virtual gl_texture<T> | @@ -299,93 +259,28 @@ class gl_spider : public virtual gl_texture<T> | ||
299 | samples[idx][1] = temp[1]; | 259 | samples[idx][1] = temp[1]; |
300 | samples[idx][2] = temp[2]; | 260 | samples[idx][2] = temp[2]; |
301 | 261 | ||
302 | - // file << idx << ":" <<"[" << samples[idx][0] << "," << samples[idx][1] << "," << samples[idx][2] << "]" << "\n"; | 262 | + //file << idx << ":" <<"[" << samples[idx][0] << "," << samples[idx][1] << "," << samples[idx][2] << "]" << "\n"; |
303 | 263 | ||
304 | - UpdatePlanes(0.0, y_0+(idx)*10, temp); | 264 | + Update(0.0, y_0+(idx)*10, temp); |
305 | } | 265 | } |
306 | } | 266 | } |
307 | - Unbind(); | 267 | + //Finalize GL_buffer |
268 | + glBindTexture(GL_TEXTURE_3D, 0); | ||
269 | + glDisable(GL_TEXTURE_3D); | ||
270 | + glBindFramebuffer(GL_FRAMEBUFFER,0); | ||
271 | + glBindTexture(GL_TEXTURE_2D, 0); | ||
308 | int nxt = getCost(); | 272 | int nxt = getCost(); |
309 | - stim::vec<float> next(samples[nxt][0], samples[nxt][1], samples[nxt][2]); | ||
310 | - //next[0] = samples[nxt][0]; | ||
311 | - //next[1] = samples[nxt][1]; | ||
312 | - //next[2] = samples[nxt][2]; | 273 | + stim::vec<float> next; |
274 | + next[0] = samples[nxt][0]; | ||
275 | + next[1] = samples[nxt][1]; | ||
276 | + next[2] = samples[nxt][2]; | ||
313 | next.norm(); | 277 | next.norm(); |
314 | //file << "next direction" << "[" << next[0] << "," << next[1] << "," << next[2] << "]\n\n"; | 278 | //file << "next direction" << "[" << next[0] << "," << next[1] << "," << next[2] << "]\n\n"; |
315 | - setPosition(position[0] + next[0]*magnitude[0]/2, | ||
316 | - position[1]+next[1]*magnitude[0]/2, | ||
317 | - position[2]+next[2]*magnitude[0]/2); | 279 | + setPosition(position[0] + next[0]/500, |
280 | + position[1]+next[1]/500, | ||
281 | + position[2]+next[2]/500); | ||
318 | setDirection(next[0], next[1], next[2]); | 282 | setDirection(next[0], next[1], next[2]); |
319 | //file.close(); | 283 | //file.close(); |
320 | - setDirection(next); | ||
321 | - //file << "ending pos and dir:" << "[" << position[0] << "," <<position[1] << "," << position[2] << "]" << ":" << "[" << direction[0] << "," << direction[1] << "," << direction[2] << "]\n"; | ||
322 | - } | ||
323 | - | ||
324 | - void | ||
325 | - samplePosition(int numSamples = 1089, float delta = 0.2) | ||
326 | - { | ||
327 | - | ||
328 | - float samples[numSamples][3]; //Set up the variables | ||
329 | - vec<float> temp; | ||
330 | - int dim = (sqrt(numSamples)-1)/2; | ||
331 | - float y_0 = 0.0; //location of the first sample in the buffer | ||
332 | - stim::rect<float> samplingPlane = | ||
333 | - stim::rect<float>(magnitude[0]*delta, position, direction); | ||
334 | - float step = 1.0/(dim); | ||
335 | - Bind(); | ||
336 | - //Loop over the samples, keeping the original position sample | ||
337 | - //in the center of the resulting texture. | ||
338 | - | ||
339 | - int idx; | ||
340 | - for(int i = -dim; i <= dim; i++){ | ||
341 | - for(int j = -dim; j <= dim; j++){ | ||
342 | - //Create linear index | ||
343 | - idx = (i+dim)*(dim*2+1) + (j+dim); | ||
344 | - | ||
345 | - temp = samplingPlane.p( | ||
346 | - 0.5+step*i, | ||
347 | - 0.5+step*j | ||
348 | - ); | ||
349 | - | ||
350 | - samples[idx][0] = temp[0]; //save sample vector | ||
351 | - samples[idx][1] = temp[1]; | ||
352 | - samples[idx][2] = temp[2]; | ||
353 | - | ||
354 | - UpdatePlanes(0.0, y_0+(idx)*10, temp, 1); | ||
355 | - } | ||
356 | - } | ||
357 | - Unbind(); | ||
358 | - int nxt = getCost(); | ||
359 | - setPosition(samples[nxt][0], samples[nxt][1], samples[nxt][2]); | ||
360 | - } | ||
361 | - | ||
362 | - void | ||
363 | - sampleMagnitude(int numSamples = 1089, float delta = 0.5) | ||
364 | - { | ||
365 | - | ||
366 | - ofstream file; | ||
367 | - file.open("samples.txt", std::ios_base::app); | ||
368 | - float samples[numSamples]; //Set up the variables | ||
369 | - int dim = (sqrt(numSamples)-1)/2; | ||
370 | - float y_0 = 0.0; //location of the first sample in the buffer | ||
371 | - float min = 1.0-delta; | ||
372 | - float max = 1.0+delta; | ||
373 | - float step = (max-min)/(numSamples-1); | ||
374 | - float factor; | ||
375 | - vec<float> temp; | ||
376 | - Bind(); | ||
377 | - | ||
378 | - for(int i = 0; i < numSamples; i++){ | ||
379 | - //Create linear index | ||
380 | - factor = (min+step*i)*magnitude[0]; | ||
381 | - samples[i] = factor; //save sample vector | ||
382 | - stim::vec<float> temp(factor); | ||
383 | - UpdatePlanes(0.0, y_0+(i)*10, temp, 2); | ||
384 | - } | ||
385 | - Unbind(); | ||
386 | - int nxt = getCost(); | ||
387 | - setMagnitude(samples[nxt]); | ||
388 | - file << position[0] << "," <<position[1] << "," << position[2] << "\n"; | ||
389 | } | 284 | } |
390 | 285 | ||
391 | //--------------------------------------------------------------------------// | 286 | //--------------------------------------------------------------------------// |
@@ -433,36 +328,48 @@ class gl_spider : public virtual gl_texture<T> | @@ -433,36 +328,48 @@ class gl_spider : public virtual gl_texture<T> | ||
433 | stim::rect<float> hor; | 328 | stim::rect<float> hor; |
434 | stim::rect<float> ver; | 329 | stim::rect<float> ver; |
435 | 330 | ||
436 | - //Default Constructor | 331 | + |
437 | gl_spider | 332 | gl_spider |
438 | () | 333 | () |
439 | { | 334 | { |
440 | setPosition(0.0,0.0,0.0); | 335 | setPosition(0.0,0.0,0.0); |
441 | - setDirection(0.0,0.0,1.0); | ||
442 | - setMagnitude(0.03); | 336 | + setDirection(1.0,1.0,1.0); |
337 | + setMagnitude(0.1,0.1); | ||
338 | + //GenerateFBO(400,200); | ||
339 | + //Update(); | ||
443 | } | 340 | } |
444 | 341 | ||
445 | - //temporary constructor for convenience, will be removed in further updates. | 342 | + gl_spider |
343 | + (vec<float> pos, vec<float> dir, vec<float> mag) | ||
344 | + { | ||
345 | + position = pos; | ||
346 | + direction = dir; | ||
347 | + magnitude = mag; | ||
348 | + //GenerateFBO(400,200); | ||
349 | + //Update(); | ||
350 | + } | ||
351 | + //temporary cost for convenience. | ||
446 | gl_spider | 352 | gl_spider |
447 | (float pos_x, float pos_y, float pos_z, float dir_x, float dir_y, float dir_z, | 353 | (float pos_x, float pos_y, float pos_z, float dir_x, float dir_y, float dir_z, |
448 | - float mag_x) | 354 | + float mag_x, float mag_y) |
449 | { | 355 | { |
450 | setPosition(pos_x, pos_y, pos_z); | 356 | setPosition(pos_x, pos_y, pos_z); |
451 | setDirection(dir_x, dir_y, dir_z); | 357 | setDirection(dir_x, dir_y, dir_z); |
452 | - setMagnitude(mag_x); | 358 | + setMagnitude(mag_x, mag_y); |
359 | + //GenerateFBO(400,200); | ||
360 | + //Update(); | ||
453 | } | 361 | } |
454 | 362 | ||
455 | - //Attached the spider to the texture with the given GLuint ID. | ||
456 | - //Samples in the default direction acting as the init method. | ||
457 | void | 363 | void |
458 | - attachSpider(GLuint id, int numSamples = 1089) | 364 | + attachSpider(GLuint id) |
459 | { | 365 | { |
460 | texID = id; | 366 | texID = id; |
461 | - GenerateFBO(20, numSamples*10); | ||
462 | - sampleDirection(); | 367 | + Sample(direction); |
368 | + //GenerateFBO(20,10000); | ||
369 | + // Update(); | ||
370 | + // generateVectorField(direction, 4.0); | ||
463 | } | 371 | } |
464 | - | ||
465 | - //temporary Method necessary for visualization and testing. | 372 | + |
466 | void | 373 | void |
467 | Update() | 374 | Update() |
468 | { | 375 | { |
@@ -473,37 +380,35 @@ class gl_spider : public virtual gl_texture<T> | @@ -473,37 +380,35 @@ class gl_spider : public virtual gl_texture<T> | ||
473 | ((Y.cross(direction)).cross(direction)).norm()); | 380 | ((Y.cross(direction)).cross(direction)).norm()); |
474 | ver = stim::rect<float>(magnitude, position, direction.norm(), | 381 | ver = stim::rect<float>(magnitude, position, direction.norm(), |
475 | hor.n()); | 382 | hor.n()); |
383 | + //UpdateBuffer(); | ||
384 | + generateVectorField(direction, 4.0); | ||
476 | } | 385 | } |
477 | 386 | ||
478 | - //Returns the position vector. | 387 | + |
479 | vec<float> | 388 | vec<float> |
480 | getPosition() | 389 | getPosition() |
481 | { | 390 | { |
482 | return position; | 391 | return position; |
483 | } | 392 | } |
484 | 393 | ||
485 | - //Returns the direction vector. | ||
486 | vec<float> | 394 | vec<float> |
487 | getDirection() | 395 | getDirection() |
488 | { | 396 | { |
489 | return direction; | 397 | return direction; |
490 | } | 398 | } |
491 | 399 | ||
492 | - //Returns the magnitude vector. | ||
493 | vec<float> | 400 | vec<float> |
494 | getMagnitude() | 401 | getMagnitude() |
495 | { | 402 | { |
496 | return magnitude; | 403 | return magnitude; |
497 | } | 404 | } |
498 | 405 | ||
499 | - //Sets the position vector to input vector pos | ||
500 | void | 406 | void |
501 | setPosition(vec<float> pos) | 407 | setPosition(vec<float> pos) |
502 | { | 408 | { |
503 | position = pos; | 409 | position = pos; |
504 | } | 410 | } |
505 | 411 | ||
506 | - //Sets the position vector to the input float coordinates x,y,z | ||
507 | void | 412 | void |
508 | setPosition(float x, float y, float z) | 413 | setPosition(float x, float y, float z) |
509 | { | 414 | { |
@@ -512,15 +417,12 @@ class gl_spider : public virtual gl_texture<T> | @@ -512,15 +417,12 @@ class gl_spider : public virtual gl_texture<T> | ||
512 | position[2] = z; | 417 | position[2] = z; |
513 | } | 418 | } |
514 | 419 | ||
515 | - | ||
516 | - //Sets the direction vector to input vector dir | ||
517 | void | 420 | void |
518 | setDirection(vec<float> dir) | 421 | setDirection(vec<float> dir) |
519 | { | 422 | { |
520 | direction = dir; | 423 | direction = dir; |
521 | } | 424 | } |
522 | 425 | ||
523 | - //Sets the direction vector to the input float coordinates x,y,z | ||
524 | void | 426 | void |
525 | setDirection(float x, float y, float z) | 427 | setDirection(float x, float y, float z) |
526 | { | 428 | { |
@@ -529,22 +431,19 @@ class gl_spider : public virtual gl_texture<T> | @@ -529,22 +431,19 @@ class gl_spider : public virtual gl_texture<T> | ||
529 | direction[2] = z; | 431 | direction[2] = z; |
530 | } | 432 | } |
531 | 433 | ||
532 | - //Sets the magnitude vector to the input vector mag. | ||
533 | void | 434 | void |
534 | setMagnitude(vec<float> mag) | 435 | setMagnitude(vec<float> mag) |
535 | { | 436 | { |
536 | - magnitude[0] = mag[0]; | ||
537 | - magnitude[1] = mag[0]; | 437 | + magnitude = mag; |
538 | } | 438 | } |
539 | 439 | ||
540 | void | 440 | void |
541 | - setMagnitude(float mag) | 441 | + setMagnitude(float x, float y) |
542 | { | 442 | { |
543 | - magnitude[0] = mag; | ||
544 | - magnitude[1] = mag; | 443 | + magnitude[0] = x; |
444 | + magnitude[1] = y; | ||
545 | } | 445 | } |
546 | - | ||
547 | - //temporary method for visualization. | 446 | + |
548 | GLuint | 447 | GLuint |
549 | getFB() | 448 | getFB() |
550 | { | 449 | { |
@@ -554,9 +453,142 @@ class gl_spider : public virtual gl_texture<T> | @@ -554,9 +453,142 @@ class gl_spider : public virtual gl_texture<T> | ||
554 | void | 453 | void |
555 | Step() | 454 | Step() |
556 | { | 455 | { |
456 | + std::cout << position[0] << "," << position[1] << "," << position[1] | ||
457 | + << std::endl; | ||
458 | + //setPosition(direction*magnitude[1]/2+position); | ||
557 | findOptimalDirection(); | 459 | findOptimalDirection(); |
460 | + //Update(); | ||
461 | + std::cout << position[0] << "," << position[1] << "," << position[1] | ||
462 | + << std::endl; | ||
463 | + | ||
464 | + } | ||
465 | + | ||
466 | + void | ||
467 | + UpdateBuffer() | ||
468 | + { | ||
469 | + stim::vec<float>p1; | ||
470 | + stim::vec<float>p2; | ||
471 | + stim::vec<float>p3; | ||
472 | + stim::vec<float>p4; | ||
473 | + glBindFramebuffer(GL_FRAMEBUFFER, fboID); | ||
474 | + glFramebufferTexture2D( | ||
475 | + GL_FRAMEBUFFER, | ||
476 | + GL_COLOR_ATTACHMENT0, | ||
477 | + GL_TEXTURE_2D, | ||
478 | + texbufferID, | ||
479 | + 0); | ||
480 | + glBindFramebuffer(GL_FRAMEBUFFER, fboID); | ||
481 | + GLenum DrawBuffers[1] = {GL_COLOR_ATTACHMENT0}; | ||
482 | + glDrawBuffers(1, DrawBuffers); | ||
483 | + glBindTexture(GL_TEXTURE_2D, texbufferID); | ||
484 | + glClearColor(0,0,0,0); | ||
485 | + glClear(GL_COLOR_BUFFER_BIT); | ||
486 | + glMatrixMode(GL_PROJECTION); | ||
487 | + glLoadIdentity(); | ||
488 | + glMatrixMode(GL_MODELVIEW); | ||
489 | + glLoadIdentity(); | ||
490 | + glViewport(0,0,400,200); | ||
491 | + gluOrtho2D(0.0,2.0,0.0,2.0); | ||
492 | + glEnable(GL_TEXTURE_3D); | ||
493 | + glBindTexture(GL_TEXTURE_3D, texID); | ||
494 | + p1 = hor.p(1,1); | ||
495 | + p2 = hor.p(1,0); | ||
496 | + p3 = hor.p(0,0); | ||
497 | + p4 = hor.p(0,1); | ||
498 | + glBegin(GL_QUADS); | ||
499 | + glTexCoord3f( | ||
500 | + p1[0], | ||
501 | + p1[1], | ||
502 | + p1[2] | ||
503 | + ); | ||
504 | + glVertex2f(0.0,0.0); | ||
505 | + glTexCoord3f( | ||
506 | + p2[0], | ||
507 | + p2[1], | ||
508 | + p2[2] | ||
509 | + ); | ||
510 | + glVertex2f(1.0, 0.0); | ||
511 | + glTexCoord3f( | ||
512 | + p3[0], | ||
513 | + p3[1], | ||
514 | + p3[2] | ||
515 | + ); | ||
516 | + glVertex2f(1.0, 2.0); | ||
517 | + glTexCoord3f( | ||
518 | + p4[0], | ||
519 | + p4[1], | ||
520 | + p4[2] | ||
521 | + ); | ||
522 | + glVertex2f(0.0, 2.0); | ||
523 | + glEnd(); | ||
524 | + p1 = ver.p(1,1); | ||
525 | + p2 = ver.p(1,0); | ||
526 | + p3 = ver.p(0,0); | ||
527 | + p4 = ver.p(0,1); | ||
528 | + glBegin(GL_QUADS); | ||
529 | + glTexCoord3f( | ||
530 | + p1[0], | ||
531 | + p1[1], | ||
532 | + p1[2] | ||
533 | + ); | ||
534 | + glVertex2f(1.0, 0.0); | ||
535 | + glTexCoord3f( | ||
536 | + p2[0], | ||
537 | + p2[1], | ||
538 | + p2[2] | ||
539 | + ); | ||
540 | + glVertex2f(2.0, 0.0); | ||
541 | + glTexCoord3f( | ||
542 | + p3[0], | ||
543 | + p3[1], | ||
544 | + p3[2] | ||
545 | + ); | ||
546 | + glVertex2f(2.0, 2.0); | ||
547 | + glTexCoord3f( | ||
548 | + p4[0], | ||
549 | + p4[1], | ||
550 | + p4[2] | ||
551 | + ); | ||
552 | + glVertex2f(1.0, 2.0); | ||
553 | + glEnd(); | ||
554 | + glBindTexture(GL_TEXTURE_3D, 0); | ||
555 | + glDisable(GL_TEXTURE_3D); | ||
556 | + glBindFramebuffer(GL_FRAMEBUFFER,0); | ||
557 | + glBindTexture(GL_TEXTURE_2D, 0); | ||
558 | } | 558 | } |
559 | 559 | ||
560 | + | ||
561 | + void | ||
562 | + generateVectorField(stim::vec<float> d, float dim) | ||
563 | + { | ||
564 | + vec<float> d_s = d.cart2sph(); | ||
565 | + vec<float> temp; | ||
566 | + float Dim = (float) dim; | ||
567 | + float y_0 = 0.0; | ||
568 | + float x_0 = 0.0; | ||
569 | + float len = 4.0/(2.0*Dim+1.0); | ||
570 | + float t0 = M_PI/2; | ||
571 | + float p0 = M_PI/3; | ||
572 | + float dt = t0/Dim; | ||
573 | + float dp = p0/Dim; | ||
574 | + for(int i = -dim; i <= dim; i++){ | ||
575 | + for(int j = -dim; j <= dim; j++){ | ||
576 | + //field[i+dim][j+dim][0] = d[0]; | ||
577 | + //field[i+dim][j+dim][1] = d[1]+dt*i; | ||
578 | + //field[i+dim][j+dim][2] = d[2]+dp*j; | ||
579 | + temp[0] = 1; | ||
580 | + temp[1] = d_s[1]+dt*i; | ||
581 | + temp[2] = d_s[2]+dp*j; | ||
582 | + temp = temp.sph2cart(); | ||
583 | + Update(x_0+2.0*(i+dim)*len, y_0+(j+dim)*len, temp); | ||
584 | + } | ||
585 | + } | ||
586 | + | ||
587 | + } | ||
588 | + | ||
589 | + | ||
590 | + | ||
591 | + | ||
560 | 592 | ||
561 | void | 593 | void |
562 | findOptimalDirection() | 594 | findOptimalDirection() |
@@ -564,9 +596,7 @@ class gl_spider : public virtual gl_texture<T> | @@ -564,9 +596,7 @@ class gl_spider : public virtual gl_texture<T> | ||
564 | /* Method for finding the best direction for the spider. | 596 | /* Method for finding the best direction for the spider. |
565 | Uses the camera to rotate. Then Calls Evaluate to find new cost. | 597 | Uses the camera to rotate. Then Calls Evaluate to find new cost. |
566 | */ | 598 | */ |
567 | - sampleDirection(); | ||
568 | - samplePosition(); | ||
569 | - sampleMagnitude(); | 599 | + Sample(direction); |
570 | } | 600 | } |
571 | 601 | ||
572 | /* Method for initializing the cuda devices, necessary only | 602 | /* Method for initializing the cuda devices, necessary only |
stim/math/rect.h
@@ -92,20 +92,12 @@ public: | @@ -92,20 +92,12 @@ public: | ||
92 | Y = directionY; | 92 | Y = directionY; |
93 | } | 93 | } |
94 | 94 | ||
95 | - CUDA_CALLABLE rect(T size, vec<T, N> center, vec<T, N> directionX, vec<T, N> directionY ) | 95 | + CUDA_CALLABLE rect(vec<T,N> mag, vec<T, N> center, vec<T, N> directionX, vec<T, N> directionY ) |
96 | { | 96 | { |
97 | C = center; | 97 | C = center; |
98 | X = directionX; | 98 | X = directionX; |
99 | Y = directionY; | 99 | Y = directionY; |
100 | - scale(size); | ||
101 | - } | ||
102 | - | ||
103 | - CUDA_CALLABLE rect(vec<T,N> size, vec<T, N> center, vec<T, N> directionX, vec<T, N> directionY ) | ||
104 | - { | ||
105 | - C = center; | ||
106 | - X = directionX; | ||
107 | - Y = directionY; | ||
108 | - scale(size[0], size[1]); | 100 | + scale(mag[0], mag[1]); |
109 | } | 101 | } |
110 | 102 | ||
111 | CUDA_CALLABLE void scale(T factor1, T factor2){ | 103 | CUDA_CALLABLE void scale(T factor1, T factor2){ |