diff --git a/gl/gl_spider.h b/gl/gl_spider.h deleted file mode 100644 index a22aac5..0000000 --- a/gl/gl_spider.h +++ /dev/null @@ -1,411 +0,0 @@ -#ifndef STIM_GL_SPIDER_H -#define STIM_GL_SPIDER_H - -#include -#include -#include -#include -#include -#include "gl_texture.h" -#include "../visualization/camera.h" -#include "./error.h" -#include "../math/vector.h" -#include "../math/rect.h" -#include "../cuda/cost.h" -#include "../cuda/glbind.h" - -namespace stim -{ - -template -class gl_spider : public virtual gl_texture -{ - //doen't use gl_texture really, just needs the GLuint id. - //doesn't even need the texture iD really. - private: - stim::camera rotator; - stim::vec position; //vector designating the position of the spider. - stim::vec direction; //vector designating the orientation of the spider - //always a unit vector. - stim::vec magnitude; //magnitude of the direction vector. - //mag[0] = length. - //mag[1] = width. - using gl_texture::texID; - //using image_stack::S; - cudaArray* c_Array; - //void** devPtr; - //size_t size; - cudaGraphicsResource_t resource; - GLuint fboID; - GLuint texbufferID; - - void - findOptimalDirection() - { - /* Method for finding the best direction for the spider. - Uses the camera to rotate. Then Calls Evaluate to find new cost. - */ - } - - void - findOptimalPosition() - { - /* Method for finding the best direction for the spider. - Not sure if necessary since the next position for the spider - will be at direction * magnitude. */ - } - - void - findOptimalScale() - { - /* Method for finding the best scale for the spider. - changes the x, y, z size of the spider to minimize the cost - function. */ - } - - void - Evaluate() - { - /* Uses uniform sampler2D in order to take a difference between - the colors of two textures. 1st texture is the spider template, - the 2nd is the location of the spider's overlap with the - gl_template - - does the spider need to track it's location? Prob not since - position can be set with gl_texture coordinates */ - - } - - void - Optimize() - { - /*find the optimum direction and scale */ - } - /* - void - Step() - { - // move to the new position - } - */ - public: - - stim::rect hor; - stim::rect ver; - - - - gl_spider - () - { - setPosition(0.0,0.0,0.0); - setDirection(1.0,1.0,1.0); - setMagnitude(0.1,0.1); - //GenerateFBO(400,200); - //Update(); - } - - gl_spider - (vec pos, vec dir, vec mag) - { - position = pos; - direction = dir; - magnitude = mag; - //GenerateFBO(400,200); - //Update(); - } - //temporary cost for convenience. - gl_spider - (float pos_x, float pos_y, float pos_z, float dir_x, float dir_y, float dir_z, - float mag_x, float mag_y) - { - setPosition(pos_x, pos_y, pos_z); - setDirection(dir_x, dir_y, dir_z); - setMagnitude(mag_x, mag_y); - //GenerateFBO(400,200); - //Update(); - } - - void - attachSpider(GLuint id) - { - texID = id; - GenerateFBO(400,200); - Update(); - } - - void - Update() - { - vec Y(1.0,0.0,0.0); - if(cos(Y.dot(direction))< 0.087){ - Y[0] = 0.0; Y[1] = 1.0;} - hor = stim::rect(magnitude, position, direction.norm(), - ((Y.cross(direction)).cross(direction)).norm()); - ver = stim::rect(magnitude, position, direction.norm(), - hor.n()); - UpdateBuffer(); - } - - vec - getPosition() - { - return position; - } - - vec - getDirection() - { - return direction; - } - - vec - getMagnitude() - { - return magnitude; - } - - void - setPosition(vec pos) - { - position = pos; - } - - void - setPosition(float x, float y, float z) - { - position[0] = x; - position[1] = y; - position[2] = z; - } - - void - setDirection(vec dir) - { - direction = dir; - } - - void - setDirection(float x, float y, float z) - { - direction[0] = x; - direction[1] = y; - direction[2] = z; - } - - void - setMagnitude(vec mag) - { - magnitude = mag; - } - - void - setMagnitude(float x, float y) - { - magnitude[0] = x; - magnitude[1] = y; - } - - GLuint - getFB() - { - return fboID; - } - - void - Step() - { - std::cout << position[0] << "," << position[1] << "," << position[1] - << std::endl; - setPosition(direction*magnitude[1]/2+position); - Update(); - std::cout << position[0] << "," << position[1] << "," << position[1] - << std::endl; - - } - - void - UpdateBuffer() - { - stim::vecp1; - stim::vecp2; - stim::vecp3; - stim::vecp4; - glBindFramebuffer(GL_FRAMEBUFFER, fboID); - glFramebufferTexture2D( - GL_FRAMEBUFFER, - GL_COLOR_ATTACHMENT0, - GL_TEXTURE_2D, - texbufferID, - 0); - glBindFramebuffer(GL_FRAMEBUFFER, fboID); - GLenum DrawBuffers[1] = {GL_COLOR_ATTACHMENT0}; - glDrawBuffers(1, DrawBuffers); - glBindTexture(GL_TEXTURE_2D, texbufferID); - glClearColor(0,0,0,0); - glClear(GL_COLOR_BUFFER_BIT); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glViewport(0,0,400,200); - gluOrtho2D(0.0,2.0,0.0,2.0); - glEnable(GL_TEXTURE_3D); - glBindTexture(GL_TEXTURE_3D, texID); - p1 = hor.p(1,1); - p2 = hor.p(1,0); - p3 = hor.p(0,0); - p4 = hor.p(0,1); - glBegin(GL_QUADS); - glTexCoord3f( - p1[0], - p1[1], - p1[2] - ); - glVertex2f(0.0,0.0); - glTexCoord3f( - p2[0], - p2[1], - p2[2] - ); - glVertex2f(1.0, 0.0); - glTexCoord3f( - p3[0], - p3[1], - p3[2] - ); - glVertex2f(1.0, 2.0); - glTexCoord3f( - p4[0], - p4[1], - p4[2] - ); - glVertex2f(0.0, 2.0); - glEnd(); - p1 = ver.p(1,1); - p2 = ver.p(1,0); - p3 = ver.p(0,0); - p4 = ver.p(0,1); - glBegin(GL_QUADS); - glTexCoord3f( - p1[0], - p1[1], - p1[2] - ); - glVertex2f(1.0, 0.0); - glTexCoord3f( - p2[0], - p2[1], - p2[2] - ); - glVertex2f(2.0, 0.0); - glTexCoord3f( - p3[0], - p3[1], - p3[2] - ); - glVertex2f(2.0, 2.0); - glTexCoord3f( - p4[0], - p4[1], - p4[2] - ); - glVertex2f(1.0, 2.0); - glEnd(); - glBindTexture(GL_TEXTURE_3D, 0); - glDisable(GL_TEXTURE_3D); - glBindFramebuffer(GL_FRAMEBUFFER,0); - glBindTexture(GL_TEXTURE_2D, 0); - } - - - void - GenerateFBO(unsigned int width, unsigned int height) - { - glGenFramebuffers(1, &fboID); - glBindFramebuffer(GL_FRAMEBUFFER, fboID); - int numChannels = 1; - unsigned char* texels = new unsigned char[width * height * numChannels]; - glGenTextures(1, &texbufferID); - glBindTexture(GL_TEXTURE_2D, texbufferID); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, - width, height, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, texels); - delete[] texels; - glBindFramebuffer(GL_FRAMEBUFFER, 0); - } - - - void - initCuda() - { - /* cudaDeviceProp prop; - int device; - memset( &prop, 0, sizeof(cudaDeviceProp) ); - prop.major = 1; - prop.minor = 0; - HANDLE_ERROR( cudaChooseDevice (&device, &prop ) ); - HANDLE_ERROR( cudaGetDeviceProperties(&prop, device)); - printf(" device number: %d\n", device); - printf(" device name: %s\n", prop.name); - printf(" device maxTexture3D: %d %d %d\n", prop.maxTexture3D[0] ,prop.maxTexture3D[0], prop.maxTexture3D[2]) ; - HANDLE_ERROR( cudaGLSetGLDevice (device)); */ - stim::cudaSetDevice(); -/* HANDLE_ERROR( - cudaGraphicsMapResources(1, &resource, 0) - ); - HANDLE_ERROR( - cudaGraphicsResourceGetMappedPointer( - &devPtr, - size, - resource)); - HANDLE_ERROR( - cudaGraphicsSubResourceGetMappedArray( - &c_Array, - resource, - 0,0) - ); - HANDLE_ERROR( - cudaBindTextureToArray(fboID, c_Array) - ); - HANDLE_ERROR( - cudaGraphicsUnmapResources(1, &resource, 0) - ); - //need to move the constants to video memory. -*/ - } - - void - createResource() - { - HANDLE_ERROR( - cudaGraphicsGLRegisterImage( - &resource, - fboID, - GL_TEXTURE_2D, - CU_GRAPHICS_REGISTER_FLAGS_NONE) - ); - } - - void - destroyResource() - { - HANDLE_ERROR( - cudaGraphicsUnregisterResource(resource) - ); - } - - float - getCost() - { - createResource(); - float cost = get_cost(resource); - destroyResource(); - return cost; - } -}; -} -#endif diff --git a/stim/cuda/cost.h b/stim/cuda/cost.h index 4da0c80..5724614 100644 --- a/stim/cuda/cost.h +++ b/stim/cuda/cost.h @@ -134,7 +134,8 @@ int get_cost(cudaGraphicsResource_t src, int inter, int DIM_Y) dim3 grid(20, DIM_Y*10); dim3 block(1, 1); get_diff <<< grid, block >>> (result); - stim::gpu2image(result, "test.bmp", 20,DIM_Y*10,0,1); + name << "temp_diff_" << inter << ".bmp"; + stim::gpu2image(result, name.str(), 20,DIM_Y*10,0,1); for (int i = 0; i < DIM_Y; i++){ output[i] = get_sum(result+(20*10*i)); if(output[i] <= mini){ @@ -142,6 +143,7 @@ int get_cost(cudaGraphicsResource_t src, int inter, int DIM_Y) idx = i; } } + name.clear(); name << "sample_" << inter << "_" << idx << ".bmp"; output[idx] = get_sum(result+(20*10*idx)); stim::gpu2image(v_dif, name.str(), 20,10,0,1); diff --git a/stim/gl/gl_spider.h b/stim/gl/gl_spider.h index f995987..b7f9f9a 100644 --- a/stim/gl/gl_spider.h +++ b/stim/gl/gl_spider.h @@ -50,7 +50,7 @@ class gl_spider : public virtual gl_texture cudaGraphicsResource_t resource; GLuint dList; - GLubyte list[3]; + GLubyte list[4]; GLuint fboID; GLuint texbufferID; int iter; //temporary for testing @@ -124,6 +124,17 @@ class gl_spider : public virtual gl_texture Unbind(); } + void + branchDetection() + { + Bind(); + positionTemplate(); + glCallList(dList+3); + + int best = getCost(); + + } + void @@ -576,12 +587,13 @@ class gl_spider : public virtual gl_texture gl_texture::setDims(0.6, 0.6, 1.0); setSize(512, 512, 426); - dList = glGenLists(3); - list[0] = 0; list[1] = 1; list[2] = 2; + dList = glGenLists(4); + list[0] = 0; list[1] = 1; list[2] = 2; list[3] = 3; glListBase(dList); genTemplate(dirVectors, 0); genTemplate(posVectors, 1); genTemplate(magVectors, 2); + DrawCylinder(); } //--------------------------------------------------------------------------// @@ -742,6 +754,7 @@ class gl_spider : public virtual gl_texture findOptimalDirection(); findOptimalPosition(); findOptimalScale(); + branchDetection(); } @@ -761,6 +774,44 @@ class gl_spider : public virtual gl_texture //glGetIntegerv(GL_MAX_TEXTURE_SIZE, &max); //std::cout << max << std::endl; } + +//--------------------------------------------------------------------------// +//-----------------------------EXPERIMENTAL METHODS-------------------------// +//--------------------------------------------------------------------------// + + void + DrawCylinder() + { + Bind(); + glNewList(dList+3, GL_COMPILE); + float z0 = -0.5; float z1 = 0.5; float r0 = 0.5; + float x,y; + float xold = 0.5; float yold = 0.5; + float step = 360.0/numSamples; + int j = 0; + glEnable(GL_TEXTURE_3D); + glBindTexture(GL_TEXTURE_3D, texID); + glBegin(GL_QUAD_STRIP); + for(float i = step; i <= 360.0; i += step) + { + x=r0*cos(i*2.0*M_PI/360.0); + y=r0*sin(i*2.0*M_PI/360.0); + glTexCoord3f(x,y,z0); + glVertex2f(0.0, j*10.0+10.0); + glTexCoord3f(x,y,z1); + glVertex2f(20.0, j*10.0+10.0); + glTexCoord3f(xold,yold,z1); + glVertex2f(20.0, j*10.0); + glTexCoord3f(xold,yold,z0); + glVertex2f(0.0, j*10.0); + xold=x; + yold=y; + j++; + } + glEnd(); + glEndList(); + Unbind(); + } }; } #endif -- libgit2 0.21.4