diff --git a/gl/gl_spider.h b/gl/gl_spider.h index 96a5c49..b9b32ed 100644 --- a/gl/gl_spider.h +++ b/gl/gl_spider.h @@ -1,13 +1,18 @@ #ifndef STIM_GL_SPIDER_H #define STIM_GL_SPIDER_H +#include #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 { @@ -25,10 +30,14 @@ class gl_spider : public virtual gl_texture stim::vec magnitude; //magnitude of the direction vector. //mag[0] = length. //mag[1] = width. - // Also maybe we some texture representation of - // of the spider i.e [WH_pxl, BL_pxl, WH_pxl]. 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() @@ -66,7 +75,7 @@ class gl_spider : public virtual gl_texture position can be set with gl_texture coordinates */ } - + void Optimize() { @@ -92,7 +101,8 @@ class gl_spider : public virtual gl_texture setPosition(0.0,0.0,0.0); setDirection(1.0,1.0,1.0); setMagnitude(0.1,0.1); - Update(); + //GenerateFBO(400,200); + //Update(); } gl_spider @@ -101,7 +111,8 @@ class gl_spider : public virtual gl_texture position = pos; direction = dir; magnitude = mag; - Update(); + //GenerateFBO(400,200); + //Update(); } //temporary cost for convenience. gl_spider @@ -111,6 +122,15 @@ class gl_spider : public virtual gl_texture 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(); } @@ -124,6 +144,7 @@ class gl_spider : public virtual gl_texture ((Y.cross(direction)).cross(direction)).norm()); ver = stim::rect(magnitude, position, direction.norm(), hor.n()); + UpdateBuffer(); } vec @@ -184,6 +205,12 @@ class gl_spider : public virtual gl_texture magnitude[0] = x; magnitude[1] = y; } + + GLuint + getFB() + { + return fboID; + } void Step() @@ -196,6 +223,189 @@ class gl_spider : public virtual gl_texture << 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 -- libgit2 0.21.4