image_impl::image_impl(unsigned pWidth, unsigned pHeight, fg::ChannelFormat pFormat, fg::dtype pDataType) : mWidth(pWidth), mHeight(pHeight), mFormat(pFormat), mGLformat(gl_ctype(mFormat)), mGLiformat(gl_ictype(mFormat)), mDataType(pDataType), mGLType(gl_dtype(mDataType)) { CheckGL("Begin image_impl::image_impl"); // Initialize OpenGL Items glGenTextures(1, &(mTex)); glBindTexture(GL_TEXTURE_2D, mTex); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexImage2D(GL_TEXTURE_2D, 0, mGLiformat, mWidth, mHeight, 0, mGLformat, mGLType, NULL); CheckGL("Before PBO Initialization"); glGenBuffers(1, &mPBO); glBindBuffer(GL_PIXEL_UNPACK_BUFFER, mPBO); size_t typeSize = 0; switch(mGLType) { case GL_INT: typeSize = sizeof(int ); break; case GL_UNSIGNED_INT: typeSize = sizeof(unsigned int); break; case GL_SHORT: typeSize = sizeof(short ); break; case GL_UNSIGNED_SHORT: typeSize = sizeof(unsigned short); break; case GL_BYTE: typeSize = sizeof(char ); break; case GL_UNSIGNED_BYTE: typeSize = sizeof(unsigned char); break; default: typeSize = sizeof(float); break; } size_t formatSize = 0; switch(mFormat) { case fg::FG_GRAYSCALE: formatSize = 1; break; case fg::FG_RG: formatSize = 2; break; case fg::FG_RGB: formatSize = 3; break; case fg::FG_BGR: formatSize = 3; break; case fg::FG_RGBA: formatSize = 4; break; case fg::FG_BGRA: formatSize = 4; break; default: formatSize = 1; break; } mPBOsize = mWidth * mHeight * formatSize * typeSize; glBufferData(GL_PIXEL_UNPACK_BUFFER, mPBOsize, NULL, GL_STREAM_COPY); glBindTexture(GL_TEXTURE_2D, 0); glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); CheckGL("After PBO Initialization"); mProgram = initShaders(vertex_shader_code, fragment_shader_code); CheckGL("End image_impl::image_impl"); }
hist_impl::hist_impl(unsigned pNBins, fg::dtype pDataType) : Chart2D(), mDataType(pDataType), mGLType(gl_dtype(mDataType)), mNBins(pNBins), mHistogramVBO(0), mHistogramVBOSize(0), mHistBarProgram(0), mHistBarMatIndex(0), mHistBarColorIndex(0), mHistBarYMaxIndex(0), mPointIndex(0), mFreqIndex(0) { CheckGL("Begin hist_impl::hist_impl"); mHistBarProgram = initShaders(gHistBarVertexShaderSrc, gHistBarFragmentShaderSrc); mPointIndex = glGetAttribLocation (mHistBarProgram, "point"); mFreqIndex = glGetAttribLocation (mHistBarProgram, "freq"); mHistBarColorIndex = glGetUniformLocation(mHistBarProgram, "barColor"); mHistBarMatIndex = glGetUniformLocation(mHistBarProgram, "transform"); mHistBarNBinsIndex = glGetUniformLocation(mHistBarProgram, "nbins"); mHistBarYMaxIndex = glGetUniformLocation(mHistBarProgram, "ymax"); switch(mGLType) { case GL_FLOAT: mHistogramVBO = createBuffer<float>(GL_ARRAY_BUFFER, mNBins, NULL, GL_DYNAMIC_DRAW); mHistogramVBOSize = mNBins*sizeof(float); break; case GL_INT: mHistogramVBO = createBuffer<int>(GL_ARRAY_BUFFER, mNBins, NULL, GL_DYNAMIC_DRAW); mHistogramVBOSize = mNBins*sizeof(int); break; case GL_UNSIGNED_INT: mHistogramVBO = createBuffer<unsigned>(GL_ARRAY_BUFFER, mNBins, NULL, GL_DYNAMIC_DRAW); mHistogramVBOSize = mNBins*sizeof(unsigned); break; case GL_SHORT: mHistogramVBO = createBuffer<short>(GL_ARRAY_BUFFER, mNBins, NULL, GL_DYNAMIC_DRAW); mHistogramVBOSize = mNBins*sizeof(short); break; case GL_UNSIGNED_SHORT: mHistogramVBO = createBuffer<unsigned short>(GL_ARRAY_BUFFER, mNBins, NULL, GL_DYNAMIC_DRAW); mHistogramVBOSize = mNBins*sizeof(unsigned short); break; case GL_UNSIGNED_BYTE: mHistogramVBO = createBuffer<unsigned char>(GL_ARRAY_BUFFER, mNBins, NULL, GL_DYNAMIC_DRAW); mHistogramVBOSize = mNBins*sizeof(unsigned char); break; default: fg::TypeError("Plot::Plot", __LINE__, 1, mDataType); } CheckGL("End hist_impl::hist_impl"); }