| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| |
|
| | #include "GL/glew.h" |
| | #include <stdio.h> |
| | #include <iostream> |
| | #include <fstream> |
| | #include <vector> |
| | #include <algorithm> |
| | #include <stdlib.h> |
| | #include <math.h> |
| | using namespace std; |
| |
|
| |
|
| |
|
| | #include "GlobalUtil.h" |
| |
|
| | #include "GLTexImage.h" |
| | #include "FrameBufferObject.h" |
| | #include "ShaderMan.h" |
| |
|
| |
|
| | |
| |
|
| | #ifndef SIFTGPU_NO_DEVIL |
| | #include "IL/il.h" |
| | #else |
| | #include <string.h> |
| | #endif |
| | |
| | |
| | |
| |
|
| |
|
| | GLTexImage::GLTexImage() |
| | { |
| | _imgWidth = _imgHeight = 0; |
| | _texWidth = _texHeight = 0; |
| | _drawWidth = _drawHeight = 0; |
| | _texID = 0; |
| |
|
| | } |
| |
|
| | GLTexImage::~GLTexImage() |
| | { |
| | if(_texID) glDeleteTextures(1, &_texID); |
| | } |
| |
|
| | int GLTexImage::CheckTexture() |
| | { |
| | if(_texID) |
| | { |
| | GLint tw, th; |
| | BindTex(); |
| | glGetTexLevelParameteriv(_texTarget, 0, GL_TEXTURE_WIDTH , &tw); |
| | glGetTexLevelParameteriv(_texTarget, 0, GL_TEXTURE_HEIGHT , &th); |
| | UnbindTex(); |
| | return tw == _texWidth && th == _texHeight; |
| | }else |
| | { |
| | return _texWidth == 0 && _texHeight ==0; |
| |
|
| | } |
| | } |
| | |
| | |
| | void GLTexImage::SetImageSize( int width, int height) |
| | { |
| | _drawWidth = _imgWidth = width; |
| | _drawHeight = _imgHeight = height; |
| | } |
| |
|
| | void GLTexImage::InitTexture( int width, int height, int clamp_to_edge) |
| | { |
| |
|
| | if(_texID && width == _texWidth && height == _texHeight ) return; |
| | if(_texID==0) glGenTextures(1, &_texID); |
| |
|
| | _texWidth = _imgWidth = _drawWidth = width; |
| | _texHeight = _imgHeight = _drawHeight = height; |
| |
|
| | BindTex(); |
| |
|
| | if(clamp_to_edge) |
| | { |
| | glTexParameteri (_texTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
| | glTexParameteri (_texTarget, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
| | }else |
| | { |
| | |
| | glTexParameteri (_texTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); |
| | glTexParameteri (_texTarget, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); |
| | } |
| | glTexParameteri(_texTarget, GL_TEXTURE_MAG_FILTER, GL_NEAREST); |
| | glTexParameteri(_texTarget, GL_TEXTURE_MIN_FILTER, GL_NEAREST); |
| | glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); |
| |
|
| | glTexImage2D(_texTarget, 0, _iTexFormat, |
| | _texWidth, _texHeight, 0, GL_RGBA, GL_FLOAT, NULL); |
| | CheckErrorsGL("glTexImage2D"); |
| |
|
| |
|
| | UnbindTex(); |
| |
|
| | } |
| |
|
| |
|
| | void GLTexImage::InitTexture( int width, int height, int clamp_to_edge, GLuint format) |
| | { |
| |
|
| | if(_texID && width == _texWidth && height == _texHeight ) return; |
| | if(_texID==0) glGenTextures(1, &_texID); |
| |
|
| | _texWidth = _imgWidth = _drawWidth = width; |
| | _texHeight = _imgHeight = _drawHeight = height; |
| |
|
| | BindTex(); |
| |
|
| | if(clamp_to_edge) |
| | { |
| | glTexParameteri (_texTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
| | glTexParameteri (_texTarget, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
| | }else |
| | { |
| | |
| | glTexParameteri (_texTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); |
| | glTexParameteri (_texTarget, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); |
| | } |
| | glTexParameteri(_texTarget, GL_TEXTURE_MAG_FILTER, GL_NEAREST); |
| | glTexParameteri(_texTarget, GL_TEXTURE_MIN_FILTER, GL_NEAREST); |
| | glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); |
| |
|
| | glTexImage2D(_texTarget, 0, format, _texWidth, _texHeight, 0, GL_RGBA, GL_FLOAT, NULL); |
| |
|
| | UnbindTex(); |
| |
|
| | } |
| | void GLTexImage::BindTex() |
| | { |
| | glBindTexture(_texTarget, _texID); |
| | } |
| |
|
| | void GLTexImage::UnbindTex() |
| | { |
| | glBindTexture(_texTarget, 0); |
| | } |
| |
|
| |
|
| | void GLTexImage::DrawQuad() |
| | { |
| | glBegin (GL_QUADS); |
| | glTexCoord2i ( 0 , 0 ); glVertex2i ( 0 , 0 ); |
| | glTexCoord2i ( 0 , _drawHeight ); glVertex2i ( 0 , _drawHeight ); |
| | glTexCoord2i ( _drawWidth , _drawHeight ); glVertex2i ( _drawWidth , _drawHeight ); |
| | glTexCoord2i ( _drawWidth , 0 ); glVertex2i ( _drawWidth , 0 ); |
| | glEnd (); |
| | glFlush(); |
| | } |
| |
|
| | void GLTexImage::FillMargin(int marginx, int marginy) |
| | { |
| | |
| | marginx = min(marginx, _texWidth - _imgWidth); |
| | marginy = min(marginy, _texHeight - _imgHeight); |
| | if(marginx >0 || marginy > 0) |
| | { |
| | GlobalUtil::FitViewPort(_imgWidth + marginx, _imgHeight + marginy); |
| | AttachToFBO(0); |
| | BindTex(); |
| | ShaderMan::UseShaderMarginCopy(_imgWidth, _imgHeight); |
| | DrawMargin(_imgWidth + marginx, _imgHeight + marginy); |
| | } |
| | } |
| |
|
| | void GLTexImage::ZeroHistoMargin() |
| | { |
| | ZeroHistoMargin(_imgWidth, _imgHeight); |
| | } |
| |
|
| | void GLTexImage::ZeroHistoMargin(int width, int height) |
| | { |
| | int marginx = width & 0x01; |
| | int marginy = height & 0x01; |
| | if(marginx >0 || marginy > 0) |
| | { |
| | int right = width + marginx; |
| | int bottom = height + marginy; |
| | GlobalUtil::FitViewPort(right, bottom); |
| | AttachToFBO(0); |
| | ShaderMan::UseShaderZeroPass(); |
| | glBegin(GL_QUADS); |
| | if(right > width && _texWidth > width) |
| | { |
| | glTexCoord2i ( width , 0 ); glVertex2i ( width , 0 ); |
| | glTexCoord2i ( width , bottom ); glVertex2i ( width , bottom ); |
| | glTexCoord2i ( right , bottom ); glVertex2i ( right , bottom ); |
| | glTexCoord2i ( right , 0 ); glVertex2i ( right , 0 ); |
| | } |
| | if(bottom>height && _texHeight > height) |
| | { |
| | glTexCoord2i ( 0 , height ); glVertex2i ( 0 , height ); |
| | glTexCoord2i ( 0 , bottom ); glVertex2i ( 0 , bottom ); |
| | glTexCoord2i ( width , bottom ); glVertex2i ( width , bottom ); |
| | glTexCoord2i ( width , height ); glVertex2i ( width , height ); |
| | } |
| | glEnd(); |
| | glFlush(); |
| | } |
| |
|
| | } |
| |
|
| | void GLTexImage::DrawMargin(int right, int bottom) |
| | { |
| | glBegin(GL_QUADS); |
| | if(right > _drawWidth) |
| | { |
| | glTexCoord2i ( _drawWidth , 0 ); glVertex2i ( _drawWidth , 0 ); |
| | glTexCoord2i ( _drawWidth , bottom ); glVertex2i ( _drawWidth , bottom ); |
| | glTexCoord2i ( right , bottom ); glVertex2i ( right , bottom ); |
| | glTexCoord2i ( right , 0 ); glVertex2i ( right , 0 ); |
| | } |
| | if(bottom>_drawHeight) |
| | { |
| | glTexCoord2i ( 0 , _drawHeight ); glVertex2i ( 0 , _drawHeight ); |
| | glTexCoord2i ( 0 , bottom ); glVertex2i ( 0 , bottom ); |
| | glTexCoord2i ( _drawWidth , bottom ); glVertex2i ( _drawWidth , bottom ); |
| | glTexCoord2i ( _drawWidth , _drawHeight ); glVertex2i ( _drawWidth , _drawHeight ); |
| | } |
| | glEnd(); |
| | glFlush(); |
| |
|
| |
|
| | } |
| |
|
| |
|
| | void GLTexImage::DrawQuadMT4() |
| | { |
| | int w = _drawWidth, h = _drawHeight; |
| | glBegin (GL_QUADS); |
| | glMultiTexCoord2i( GL_TEXTURE0, 0 , 0 ); |
| | glMultiTexCoord2i( GL_TEXTURE1, -1 , 0 ); |
| | glMultiTexCoord2i( GL_TEXTURE2, 1 , 0 ); |
| | glMultiTexCoord2i( GL_TEXTURE3, 0 , -1 ); |
| | glMultiTexCoord2i( GL_TEXTURE4, 0 , 1 ); |
| | glVertex2i ( 0 , 0 ); |
| |
|
| | glMultiTexCoord2i( GL_TEXTURE0, 0 , h ); |
| | glMultiTexCoord2i( GL_TEXTURE1, -1 , h ); |
| | glMultiTexCoord2i( GL_TEXTURE2, 1 , h ); |
| | glMultiTexCoord2i( GL_TEXTURE3, 0 , h -1 ); |
| | glMultiTexCoord2i( GL_TEXTURE4, 0 , h +1 ); |
| | glVertex2i ( 0 , h ); |
| |
|
| |
|
| | glMultiTexCoord2i( GL_TEXTURE0, w , h ); |
| | glMultiTexCoord2i( GL_TEXTURE1, w-1 , h ); |
| | glMultiTexCoord2i( GL_TEXTURE2, w+1 , h ); |
| | glMultiTexCoord2i( GL_TEXTURE3, w , h-1 ); |
| | glMultiTexCoord2i( GL_TEXTURE4, w , h+1 ); |
| | glVertex2i ( w , h ); |
| |
|
| | glMultiTexCoord2i( GL_TEXTURE0, w , 0 ); |
| | glMultiTexCoord2i( GL_TEXTURE1, w-1 , 0 ); |
| | glMultiTexCoord2i( GL_TEXTURE2, w+1 , 0 ); |
| | glMultiTexCoord2i( GL_TEXTURE3, w , -1 ); |
| | glMultiTexCoord2i( GL_TEXTURE4, w , 1 ); |
| | glVertex2i ( w , 0 ); |
| | glEnd (); |
| | glFlush(); |
| | } |
| |
|
| |
|
| | void GLTexImage::DrawQuadMT8() |
| | { |
| | int w = _drawWidth; |
| | int h = _drawHeight; |
| | glBegin (GL_QUADS); |
| | glMultiTexCoord2i( GL_TEXTURE0, 0 , 0 ); |
| | glMultiTexCoord2i( GL_TEXTURE1, -1 , 0 ); |
| | glMultiTexCoord2i( GL_TEXTURE2, 1 , 0 ); |
| | glMultiTexCoord2i( GL_TEXTURE3, 0 , -1 ); |
| | glMultiTexCoord2i( GL_TEXTURE4, 0 , 1 ); |
| | glMultiTexCoord2i( GL_TEXTURE5, -1 , -1 ); |
| | glMultiTexCoord2i( GL_TEXTURE6, -1 , 1 ); |
| | glMultiTexCoord2i( GL_TEXTURE7, 1 , -1 ); |
| | glVertex2i ( 0 , 0 ); |
| |
|
| | glMultiTexCoord2i( GL_TEXTURE0, 0 , h ); |
| | glMultiTexCoord2i( GL_TEXTURE1, -1 , h ); |
| | glMultiTexCoord2i( GL_TEXTURE2, 1 , h ); |
| | glMultiTexCoord2i( GL_TEXTURE3, 0 , h -1 ); |
| | glMultiTexCoord2i( GL_TEXTURE4, 0 , h +1 ); |
| | glMultiTexCoord2i( GL_TEXTURE5, -1 , h -1 ); |
| | glMultiTexCoord2i( GL_TEXTURE6, -1 , h +1 ); |
| | glMultiTexCoord2i( GL_TEXTURE7, 1 , h -1 ); |
| | glVertex2i ( 0 , h ); |
| |
|
| |
|
| | glMultiTexCoord2i( GL_TEXTURE0, w , h ); |
| | glMultiTexCoord2i( GL_TEXTURE1, w-1 , h ); |
| | glMultiTexCoord2i( GL_TEXTURE2, w+1 , h ); |
| | glMultiTexCoord2i( GL_TEXTURE3, w , h -1 ); |
| | glMultiTexCoord2i( GL_TEXTURE4, w , h +1 ); |
| | glMultiTexCoord2i( GL_TEXTURE5, w-1 , h -1 ); |
| | glMultiTexCoord2i( GL_TEXTURE6, w-1 , h +1 ); |
| | glMultiTexCoord2i( GL_TEXTURE7, w+1 , h -1 ); |
| | glVertex2i ( w , h ); |
| |
|
| | glMultiTexCoord2i( GL_TEXTURE0, w , 0 ); |
| | glMultiTexCoord2i( GL_TEXTURE1, w-1 , 0 ); |
| | glMultiTexCoord2i( GL_TEXTURE2, w+1 , 0 ); |
| | glMultiTexCoord2i( GL_TEXTURE3, w , -1 ); |
| | glMultiTexCoord2i( GL_TEXTURE4, w , 1 ); |
| | glMultiTexCoord2i( GL_TEXTURE5, w-1 , -1 ); |
| | glMultiTexCoord2i( GL_TEXTURE6, w-1 , 1 ); |
| | glMultiTexCoord2i( GL_TEXTURE7, w+1 , -1 ); |
| | glVertex2i ( w , 0 ); |
| | glEnd (); |
| | glFlush(); |
| | } |
| |
|
| |
|
| |
|
| |
|
| | void GLTexImage::DrawImage() |
| | { |
| | DrawQuad(); |
| | } |
| |
|
| |
|
| |
|
| | void GLTexImage::FitTexViewPort() |
| | { |
| | GlobalUtil::FitViewPort(_drawWidth, _drawHeight); |
| | } |
| |
|
| | void GLTexImage::FitRealTexViewPort() |
| | { |
| | GlobalUtil::FitViewPort(_texWidth, _texHeight); |
| | } |
| |
|
| | void GLTexImage::AttachToFBO(int i) |
| | { |
| | glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, i+GL_COLOR_ATTACHMENT0_EXT, _texTarget, _texID, 0 ); |
| | } |
| |
|
| | void GLTexImage::DetachFBO(int i) |
| | { |
| | glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, i+GL_COLOR_ATTACHMENT0_EXT, _texTarget, 0, 0 ); |
| | } |
| |
|
| |
|
| | void GLTexImage::DrawQuad(float x1, float x2, float y1, float y2) |
| | { |
| |
|
| | glBegin (GL_QUADS); |
| | glTexCoord2f ( x1 , y1 ); glVertex2f ( x1 , y1 ); |
| | glTexCoord2f ( x1 , y2 ); glVertex2f ( x1 , y2 ); |
| | glTexCoord2f ( x2 , y2 ); glVertex2f ( x2 , y2 ); |
| | glTexCoord2f ( x2 , y1 ); glVertex2f ( x2 , y1 ); |
| | glEnd (); |
| | glFlush(); |
| | } |
| |
|
| | void GLTexImage::TexConvertRGB() |
| | { |
| | |
| | FrameBufferObject fbo; |
| | |
| | FitTexViewPort(); |
| |
|
| | AttachToFBO(0); |
| | ShaderMan::UseShaderRGB2Gray(); |
| | glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT); |
| | DrawQuad(); |
| | ShaderMan::UnloadProgram(); |
| | DetachFBO(0); |
| | } |
| |
|
| | void GLTexImage::DrawQuadDS(int scale) |
| | { |
| | DrawScaledQuad(float(scale)); |
| | } |
| |
|
| | void GLTexImage::DrawQuadUS(int scale) |
| | { |
| | DrawScaledQuad(1.0f/scale); |
| | } |
| |
|
| | void GLTexImage::DrawScaledQuad(float texscale) |
| | { |
| |
|
| | |
| | float to = 0.5f -0.5f * texscale; |
| | float tx = _imgWidth*texscale +to; |
| | float ty = _imgHeight*texscale +to; |
| | glBegin (GL_QUADS); |
| | glTexCoord2f ( to , to ); glVertex2i ( 0 , 0 ); |
| | glTexCoord2f ( to , ty ); glVertex2i ( 0 , _imgHeight ); |
| | glTexCoord2f ( tx , ty ); glVertex2i ( _imgWidth , _imgHeight ); |
| | glTexCoord2f ( tx , to ); glVertex2i ( _imgWidth , 0 ); |
| | glEnd (); |
| | glFlush(); |
| | } |
| |
|
| |
|
| | void GLTexImage::DrawQuadReduction(int w , int h) |
| | { |
| | float to = -0.5f; |
| | float tx = w*2 +to; |
| | float ty = h*2 +to; |
| | glBegin (GL_QUADS); |
| | glMultiTexCoord2f ( GL_TEXTURE0, to , to ); |
| | glMultiTexCoord2f ( GL_TEXTURE1, to +1, to ); |
| | glMultiTexCoord2f ( GL_TEXTURE2, to , to+1 ); |
| | glMultiTexCoord2f ( GL_TEXTURE3, to +1, to+1 ); |
| | glVertex2i ( 0 , 0 ); |
| |
|
| | glMultiTexCoord2f ( GL_TEXTURE0, to , ty ); |
| | glMultiTexCoord2f ( GL_TEXTURE1, to +1, ty ); |
| | glMultiTexCoord2f ( GL_TEXTURE2, to , ty +1 ); |
| | glMultiTexCoord2f ( GL_TEXTURE3, to +1, ty +1 ); |
| | glVertex2i ( 0 , h ); |
| |
|
| | glMultiTexCoord2f ( GL_TEXTURE0, tx , ty ); |
| | glMultiTexCoord2f ( GL_TEXTURE1, tx +1, ty ); |
| | glMultiTexCoord2f ( GL_TEXTURE2, tx , ty +1); |
| | glMultiTexCoord2f ( GL_TEXTURE3, tx +1, ty +1); |
| |
|
| | glVertex2i ( w , h ); |
| |
|
| | glMultiTexCoord2f ( GL_TEXTURE0, tx , to ); |
| | glMultiTexCoord2f ( GL_TEXTURE1, tx +1, to ); |
| | glMultiTexCoord2f ( GL_TEXTURE2, tx , to +1 ); |
| | glMultiTexCoord2f ( GL_TEXTURE3, tx +1, to +1 ); |
| | glVertex2i ( w , 0 ); |
| | glEnd (); |
| |
|
| | glFlush(); |
| | } |
| |
|
| |
|
| | void GLTexImage::DrawQuadReduction() |
| | { |
| | float to = -0.5f; |
| | float tx = _drawWidth*2 +to; |
| | float ty = _drawHeight*2 +to; |
| | glBegin (GL_QUADS); |
| | glMultiTexCoord2f ( GL_TEXTURE0, to , to ); |
| | glMultiTexCoord2f ( GL_TEXTURE1, to +1, to ); |
| | glMultiTexCoord2f ( GL_TEXTURE2, to , to+1 ); |
| | glMultiTexCoord2f ( GL_TEXTURE3, to +1, to+1 ); |
| | glVertex2i ( 0 , 0 ); |
| |
|
| | glMultiTexCoord2f ( GL_TEXTURE0, to , ty ); |
| | glMultiTexCoord2f ( GL_TEXTURE1, to +1, ty ); |
| | glMultiTexCoord2f ( GL_TEXTURE2, to , ty +1 ); |
| | glMultiTexCoord2f ( GL_TEXTURE3, to +1, ty +1 ); |
| | glVertex2i ( 0 , _drawHeight ); |
| |
|
| | glMultiTexCoord2f ( GL_TEXTURE0, tx , ty ); |
| | glMultiTexCoord2f ( GL_TEXTURE1, tx +1, ty ); |
| | glMultiTexCoord2f ( GL_TEXTURE2, tx , ty +1); |
| | glMultiTexCoord2f ( GL_TEXTURE3, tx +1, ty +1); |
| |
|
| | glVertex2i ( _drawWidth , _drawHeight ); |
| |
|
| | glMultiTexCoord2f ( GL_TEXTURE0, tx , to ); |
| | glMultiTexCoord2f ( GL_TEXTURE1, tx +1, to ); |
| | glMultiTexCoord2f ( GL_TEXTURE2, tx , to +1 ); |
| | glMultiTexCoord2f ( GL_TEXTURE3, tx +1, to +1 ); |
| | glVertex2i ( _drawWidth , 0 ); |
| | glEnd (); |
| |
|
| | glFlush(); |
| | } |
| |
|
| | void GLTexPacked::TexConvertRGB() |
| | { |
| | |
| | _drawWidth = (1 + _imgWidth) >> 1; |
| | _drawHeight = (1 + _imgHeight) >> 1; |
| | |
| | FrameBufferObject fbo; |
| | GLuint oldTexID = _texID; |
| | glGenTextures(1, &_texID); |
| | glBindTexture(_texTarget, _texID); |
| | glTexImage2D(_texTarget, 0, _iTexFormat, _texWidth, _texHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); |
| |
|
| | |
| | glBindTexture(_texTarget, oldTexID); |
| | |
| | AttachToFBO(0); |
| | |
| | ShaderMan::UseShaderRGB2Gray(); |
| | |
| | glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT); |
| | |
| | DrawQuadDS(2); |
| | ShaderMan::UnloadProgram(); |
| |
|
| | glDeleteTextures(1, &oldTexID); |
| | DetachFBO(0); |
| | } |
| |
|
| |
|
| | void GLTexPacked::SetImageSize( int width, int height) |
| | { |
| | _imgWidth = width; _drawWidth = (width + 1) >> 1; |
| | _imgHeight = height; _drawHeight = (height + 1) >> 1; |
| | } |
| |
|
| | void GLTexPacked::InitTexture( int width, int height, int clamp_to_edge) |
| | { |
| |
|
| | if(_texID && width == _imgWidth && height == _imgHeight ) return; |
| | if(_texID==0) glGenTextures(1, &_texID); |
| |
|
| | _imgWidth = width; |
| | _imgHeight = height; |
| | if(GlobalUtil::_PreciseBorder) |
| | { |
| | _texWidth = (width + 2) >> 1; |
| | _texHeight = (height + 2) >> 1; |
| | }else |
| | { |
| | _texWidth = (width + 1) >> 1; |
| | _texHeight = (height + 1) >> 1; |
| | } |
| | _drawWidth = (width + 1) >> 1; |
| | _drawHeight = (height + 1) >> 1; |
| |
|
| | BindTex(); |
| |
|
| | if(clamp_to_edge) |
| | { |
| | glTexParameteri (_texTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
| | glTexParameteri (_texTarget, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
| | }else |
| | { |
| | |
| | glTexParameteri (_texTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); |
| | glTexParameteri (_texTarget, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); |
| | } |
| | glTexParameteri(_texTarget, GL_TEXTURE_MAG_FILTER, GL_NEAREST); |
| | glTexParameteri(_texTarget, GL_TEXTURE_MIN_FILTER, GL_NEAREST); |
| | glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); |
| |
|
| | glTexImage2D(_texTarget, 0, _iTexFormat, |
| | _texWidth, _texHeight, 0, GL_RGBA, GL_FLOAT, NULL); |
| |
|
| | UnbindTex(); |
| |
|
| | } |
| |
|
| |
|
| | void GLTexPacked::DrawImage() |
| | { |
| | float x1 =0, y1 = 0; |
| | float x2 = _imgWidth*0.5f +x1; |
| | float y2 = _imgHeight*0.5f + y1; |
| | glBegin (GL_QUADS); |
| | glTexCoord2f ( x1 , y1 ); glVertex2i ( 0 , 0 ); |
| | glTexCoord2f ( x1 , y2 ); glVertex2i ( 0 , _imgHeight ); |
| | glTexCoord2f ( x2 , y2 ); glVertex2i ( _imgWidth , _imgHeight ); |
| | glTexCoord2f ( x2 , y1 ); glVertex2i ( _imgWidth , 0 ); |
| | glEnd (); |
| | glFlush(); |
| | } |
| |
|
| | void GLTexPacked::DrawQuadUS(int scale) |
| | { |
| | int tw =_drawWidth, th = _drawHeight; |
| | float texscale = 1.0f / scale; |
| | float x1 = 0.5f - 0.5f*scale, y1 = x1; |
| | float x2 = tw * texscale + x1; |
| | float y2 = th * texscale + y1; |
| | float step = texscale *0.5f; |
| | glBegin (GL_QUADS); |
| | glMultiTexCoord2f( GL_TEXTURE0, x1 , y1 ); |
| | glMultiTexCoord2f( GL_TEXTURE1, x1+step , y1 ); |
| | glMultiTexCoord2f( GL_TEXTURE2, x1 , y1 +step); |
| | glMultiTexCoord2f( GL_TEXTURE3, x1+step , y1 +step); |
| | glVertex2i ( 0 , 0 ); |
| |
|
| | glMultiTexCoord2f( GL_TEXTURE0, x1 , y2 ); |
| | glMultiTexCoord2f( GL_TEXTURE1, x1+step , y2 ); |
| | glMultiTexCoord2f( GL_TEXTURE2, x1 , y2 +step); |
| | glMultiTexCoord2f( GL_TEXTURE3, x1+step , y2 +step); |
| | glVertex2i ( 0 , th ); |
| |
|
| | glMultiTexCoord2f( GL_TEXTURE0, x2 , y2 ); |
| | glMultiTexCoord2f( GL_TEXTURE1, x2+step , y2 ); |
| | glMultiTexCoord2f( GL_TEXTURE2, x2 , y2 +step); |
| | glMultiTexCoord2f( GL_TEXTURE3, x2+step , y2 +step); |
| | glVertex2i ( tw , th ); |
| |
|
| | glMultiTexCoord2f( GL_TEXTURE0, x2 , y1 ); |
| | glMultiTexCoord2f( GL_TEXTURE1, x2+step , y1 ); |
| | glMultiTexCoord2f( GL_TEXTURE2, x2 , y1 +step); |
| | glMultiTexCoord2f( GL_TEXTURE3, x2+step , y1 +step); |
| | glVertex2i ( tw , 0 ); |
| | glEnd (); |
| | } |
| |
|
| | void GLTexPacked::DrawQuadDS(int scale) |
| | { |
| | int tw = _drawWidth; |
| | int th = _drawHeight; |
| | float x1 = 0.5f - 0.5f*scale; |
| | float x2 = tw * scale + x1; |
| | float y1 = 0.5f - 0.5f * scale; |
| | float y2 = th * scale + y1; |
| | int step = scale / 2; |
| |
|
| | glBegin (GL_QUADS); |
| | glMultiTexCoord2f( GL_TEXTURE0, x1 , y1 ); |
| | glMultiTexCoord2f( GL_TEXTURE1, x1+step , y1 ); |
| | glMultiTexCoord2f( GL_TEXTURE2, x1 , y1 +step); |
| | glMultiTexCoord2f( GL_TEXTURE3, x1+step , y1 +step); |
| | glVertex2i ( 0 , 0 ); |
| |
|
| | glMultiTexCoord2f( GL_TEXTURE0, x1 , y2 ); |
| | glMultiTexCoord2f( GL_TEXTURE1, x1+step , y2 ); |
| | glMultiTexCoord2f( GL_TEXTURE2, x1 , y2 +step); |
| | glMultiTexCoord2f( GL_TEXTURE3, x1+step , y2 +step); |
| | glVertex2i ( 0 , th ); |
| |
|
| | glMultiTexCoord2f( GL_TEXTURE0, x2 , y2 ); |
| | glMultiTexCoord2f( GL_TEXTURE1, x2+step , y2 ); |
| | glMultiTexCoord2f( GL_TEXTURE2, x2 , y2 +step); |
| | glMultiTexCoord2f( GL_TEXTURE3, x2+step , y2 +step); |
| | glVertex2i ( tw , th ); |
| |
|
| | glMultiTexCoord2f( GL_TEXTURE0, x2 , y1 ); |
| | glMultiTexCoord2f( GL_TEXTURE1, x2+step , y1 ); |
| | glMultiTexCoord2f( GL_TEXTURE2, x2 , y1 +step); |
| | glMultiTexCoord2f( GL_TEXTURE3, x2+step , y1 +step); |
| | glVertex2i ( tw , 0 ); |
| | glEnd (); |
| | } |
| |
|
| | void GLTexPacked::ZeroHistoMargin() |
| | { |
| | int marginx = (((_imgWidth + 3) /4)*4) - _imgWidth; |
| | int marginy = (((-_imgHeight + 3)/4)*4) - _imgHeight; |
| | if(marginx >0 || marginy > 0) |
| | { |
| | int tw = (_imgWidth + marginx ) >> 1; |
| | int th = (_imgHeight + marginy ) >> 1; |
| | tw = min(_texWidth, tw ); |
| | th = min(_texHeight, th); |
| | GlobalUtil::FitViewPort(tw, th); |
| | AttachToFBO(0); |
| | BindTex(); |
| | ShaderMan::UseShaderZeroPass(); |
| | DrawMargin(tw, th, 1, 1); |
| | } |
| | } |
| |
|
| |
|
| | void GLTexPacked::FillMargin(int marginx, int marginy) |
| | { |
| | |
| | marginx = min(marginx, _texWidth * 2 - _imgWidth); |
| | marginy = min(marginy, _texHeight * 2 - _imgHeight); |
| | if(marginx >0 || marginy > 0) |
| | { |
| | int tw = (_imgWidth + marginx + 1) >> 1; |
| | int th = (_imgHeight + marginy + 1) >> 1; |
| | GlobalUtil::FitViewPort(tw, th); |
| | BindTex(); |
| | AttachToFBO(0); |
| | ShaderMan::UseShaderMarginCopy(_imgWidth , _imgHeight); |
| | DrawMargin(tw, th, marginx, marginy); |
| | } |
| | } |
| | void GLTexPacked::DrawMargin(int right, int bottom, int mx, int my) |
| | { |
| | int tw = (_imgWidth >>1); |
| | int th = (_imgHeight >>1); |
| | glBegin(GL_QUADS); |
| | if(right>tw && mx) |
| | { |
| | glTexCoord2i ( tw , 0 ); glVertex2i ( tw , 0 ); |
| | glTexCoord2i ( tw , bottom ); glVertex2i ( tw , bottom ); |
| | glTexCoord2i ( right, bottom ); glVertex2i ( right, bottom ); |
| | glTexCoord2i ( right, 0 ); glVertex2i ( right, 0 ); |
| | } |
| | if(bottom>th && my) |
| | { |
| | glTexCoord2i ( 0 , th ); glVertex2i ( 0 , th ); |
| | glTexCoord2i ( 0 , bottom ); glVertex2i ( 0 , bottom ); |
| | glTexCoord2i ( tw , bottom ); glVertex2i ( tw , bottom ); |
| | glTexCoord2i ( tw , th ); glVertex2i ( tw , th ); |
| | } |
| | glEnd(); |
| | glFlush(); |
| |
|
| | } |
| |
|
| |
|
| | void GLTexImage::UnbindMultiTex(int n) |
| | { |
| | for(int i = n-1; i>=0; i--) |
| | { |
| | glActiveTexture(GL_TEXTURE0+i); |
| | glBindTexture(_texTarget, 0); |
| | } |
| | } |
| |
|
| | template <class Uint> int |
| |
|
| | #if !defined(_MSC_VER) || _MSC_VER > 1200 |
| | GLTexInput:: |
| | #endif |
| |
|
| | DownSamplePixelDataI(unsigned int gl_format, int width, int height, int ds, |
| | const Uint * pin, Uint * pout) |
| | { |
| | int step, linestep; |
| | int i, j; |
| | int ws = width/ds; |
| | int hs = height/ds; |
| | const Uint * line = pin, * p; |
| | Uint *po = pout; |
| | switch(gl_format) |
| | { |
| | case GL_LUMINANCE: |
| | case GL_LUMINANCE_ALPHA: |
| | step = ds * (gl_format == GL_LUMINANCE? 1: 2); |
| | linestep = width * step; |
| | for(i = 0 ; i < hs; i++, line+=linestep) |
| | { |
| | for(j = 0, p = line; j < ws; j++, p+=step) |
| | { |
| | *po++ = *p; |
| | } |
| | } |
| | break; |
| | case GL_RGB: |
| | case GL_RGBA: |
| | step = ds * (gl_format == GL_RGB? 3: 4); |
| | linestep = width * step; |
| |
|
| | for(i = 0 ; i < hs; i++, line+=linestep) |
| | { |
| | for(j = 0, p = line; j < ws; j++, p+=step) |
| | { |
| | |
| | *po++ = ((19595*p[0] + 38470*p[1] + 7471*p[2]+ 32768)>>16); |
| | } |
| | } |
| | break; |
| | case GL_BGR: |
| | case GL_BGRA: |
| | step = ds * (gl_format == GL_BGR? 3: 4); |
| | linestep = width * step; |
| | for(i = 0 ; i < hs; i++, line+=linestep) |
| | { |
| | for(j = 0, p = line; j < ws; j++, p+=step) |
| | { |
| | *po++ = ((7471*p[0] + 38470*p[1] + 19595*p[2]+ 32768)>>16); |
| | } |
| | } |
| | break; |
| | default: |
| | return 0; |
| | } |
| |
|
| | return 1; |
| |
|
| | } |
| |
|
| |
|
| | template <class Uint> int |
| |
|
| | #if !defined(_MSC_VER) || _MSC_VER > 1200 |
| | GLTexInput:: |
| | #endif |
| |
|
| | DownSamplePixelDataI2F(unsigned int gl_format, int width, int height, int ds, |
| | const Uint * pin, float * pout, int skip) |
| | { |
| | int step, linestep; |
| | int i, j; |
| | int ws = width/ds - skip; |
| | int hs = height/ds; |
| | const Uint * line = pin, * p; |
| | float *po = pout; |
| | const float factor = (sizeof(Uint) == 1? 255.0f : 65535.0f); |
| | switch(gl_format) |
| | { |
| | case GL_LUMINANCE: |
| | case GL_LUMINANCE_ALPHA: |
| | step = ds * (gl_format == GL_LUMINANCE? 1: 2); |
| | linestep = width * step; |
| | for(i = 0 ; i < hs; i++, line+=linestep) |
| | { |
| | for(j = 0, p = line; j < ws; j++, p+=step) |
| | { |
| | *po++ = (*p) / factor; |
| | } |
| | } |
| | break; |
| | case GL_RGB: |
| | case GL_RGBA: |
| | step = ds * (gl_format == GL_RGB? 3: 4); |
| | linestep = width * step; |
| |
|
| | for(i = 0 ; i < hs; i++, line+=linestep) |
| | { |
| | for(j = 0, p = line; j < ws; j++, p+=step) |
| | { |
| | |
| | *po++ = ((19595*p[0] + 38470*p[1] + 7471*p[2]) / (65535.0f * factor)); |
| | } |
| | } |
| | break; |
| | case GL_BGR: |
| | case GL_BGRA: |
| | step = ds * (gl_format == GL_BGR? 3: 4); |
| | linestep = width * step; |
| | for(i = 0 ; i < hs; i++, line+=linestep) |
| | { |
| | for(j = 0, p = line; j < ws; j++, p+=step) |
| | { |
| | *po++ = ((7471*p[0] + 38470*p[1] + 19595*p[2]) / (65535.0f * factor)); |
| | } |
| | } |
| | break; |
| | default: |
| | return 0; |
| | } |
| | return 1; |
| | } |
| |
|
| | int GLTexInput::DownSamplePixelDataF(unsigned int gl_format, int width, int height, int ds, const float * pin, float * pout, int skip) |
| | { |
| | int step, linestep; |
| | int i, j; |
| | int ws = width/ds - skip; |
| | int hs = height/ds; |
| | const float * line = pin, * p; |
| | float *po = pout; |
| | switch(gl_format) |
| | { |
| | case GL_LUMINANCE: |
| | case GL_LUMINANCE_ALPHA: |
| | step = ds * (gl_format == GL_LUMINANCE? 1: 2); |
| | linestep = width * step; |
| | for(i = 0 ; i < hs; i++, line+=linestep) |
| | { |
| | for(j = 0, p = line; j < ws; j++, p+=step) |
| | { |
| | *po++ = *p; |
| | } |
| | } |
| | break; |
| | case GL_RGB: |
| | case GL_RGBA: |
| | step = ds * (gl_format == GL_RGB? 3: 4); |
| | linestep = width * step; |
| | for(i = 0 ; i < hs; i++, line+=linestep) |
| | { |
| | for(j = 0, p = line; j < ws; j++, p+=step) |
| | { |
| | *po++ = (0.299f*p[0] + 0.587f*p[1] + 0.114f*p[2]); |
| | } |
| | } |
| | break; |
| | case GL_BGR: |
| | case GL_BGRA: |
| | step = ds * (gl_format == GL_BGR? 3: 4); |
| | linestep = width * step; |
| | for(i = 0 ; i < hs; i++, line+=linestep) |
| | { |
| | for(j = 0, p = line; j < ws; j++, p+=step) |
| | { |
| | *po++ = (0.114f*p[0] + 0.587f*p[1] + 0.299f * p[2]); |
| | } |
| | } |
| | break; |
| | default: |
| | return 0; |
| | } |
| |
|
| | return 1; |
| |
|
| | } |
| |
|
| | int GLTexInput::SetImageData( int width, int height, const void * data, |
| | unsigned int gl_format, unsigned int gl_type ) |
| | { |
| | int simple_format = IsSimpleGlFormat(gl_format, gl_type); |
| | int ws, hs, done = 1; |
| |
|
| | if(_converted_data) {delete [] _converted_data; _converted_data = NULL; } |
| |
|
| | _rgb_converted = 1; |
| | _data_modified = 0; |
| |
|
| | if( simple_format |
| | && ( width > _texMaxDim || height > _texMaxDim || GlobalUtil::_PreProcessOnCPU) |
| | && GlobalUtil::_octave_min_default >0 ) |
| | { |
| | _down_sampled = GlobalUtil::_octave_min_default; |
| | ws = width >> GlobalUtil::_octave_min_default; |
| | hs = height >> GlobalUtil::_octave_min_default; |
| | }else |
| | { |
| | _down_sampled = 0; |
| | ws = width; |
| | hs = height; |
| | } |
| |
|
| | if ( ws > _texMaxDim || hs > _texMaxDim) |
| | { |
| | if(simple_format) |
| | { |
| | if(GlobalUtil::_verbose) std::cout<<"Automatic down-sampling is used\n"; |
| | do |
| | { |
| | _down_sampled ++; |
| | ws >>= 1; |
| | hs >>= 1; |
| | }while(ws > _texMaxDim || hs > _texMaxDim); |
| | }else |
| | { |
| | std::cerr<<"Input images is too big to fit into a texture\n"; |
| | return 0; |
| | } |
| | } |
| |
|
| | _texWidth = _imgWidth = _drawWidth = ws; |
| | _texHeight = _imgHeight = _drawHeight = hs; |
| |
|
| | if(GlobalUtil::_verbose) |
| | { |
| | std::cout<<"Image size :\t"<<width<<"x"<<height<<"\n"; |
| | if(_down_sampled >0) std::cout<<"Down sample to \t"<<ws<<"x"<<hs<<"\n"; |
| | } |
| |
|
| |
|
| | if(GlobalUtil::_UseCUDA || GlobalUtil::_UseOpenCL) |
| | { |
| | |
| | int tWidth = TruncateWidthCU(_imgWidth); |
| | int skip = _imgWidth - tWidth; |
| | |
| | if(!simple_format) |
| | { |
| | std::cerr << "Input format not supported under current settings.\n"; |
| | return 0; |
| | }else if(_down_sampled > 0 || gl_format != GL_LUMINANCE || gl_type != GL_FLOAT) |
| | { |
| | _converted_data = new float [_imgWidth * _imgHeight]; |
| | if(gl_type == GL_UNSIGNED_BYTE) |
| | DownSamplePixelDataI2F(gl_format, width, height, 1<<_down_sampled, |
| | ((const unsigned char*) data), _converted_data, skip); |
| | else if(gl_type == GL_UNSIGNED_SHORT) |
| | DownSamplePixelDataI2F(gl_format, width, height, 1<<_down_sampled, |
| | ((const unsigned short*) data), _converted_data, skip); |
| | else |
| | DownSamplePixelDataF(gl_format, width, height, 1<<_down_sampled, (float*)data, _converted_data, skip); |
| | _rgb_converted = 2; |
| | _pixel_data = _converted_data; |
| | }else |
| | { |
| | |
| | _rgb_converted = 1; |
| | _pixel_data = data; |
| | if(skip > 0) |
| | { |
| | for(int i = 1; i < _imgHeight; ++i) |
| | { |
| | float * dst = ((float*)data) + i * tWidth, * src = ((float*)data) + i * _imgWidth; |
| | for(int j = 0; j < tWidth; ++j) *dst++ = * src++; |
| | } |
| | } |
| | } |
| | _texWidth = _imgWidth = _drawWidth = tWidth; |
| | _data_modified = 1; |
| | }else |
| | { |
| | if(_texID ==0) glGenTextures(1, &_texID); |
| | glBindTexture(_texTarget, _texID); |
| | CheckErrorsGL("glBindTexture"); |
| | glTexParameteri (_texTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
| | glTexParameteri (_texTarget, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
| | glPixelStorei(GL_UNPACK_ALIGNMENT , 1); |
| |
|
| | if(simple_format && ( _down_sampled> 0 || (gl_format != GL_LUMINANCE && GlobalUtil::_PreProcessOnCPU) )) |
| | { |
| |
|
| | if(gl_type == GL_UNSIGNED_BYTE) |
| | { |
| | unsigned char * newdata = new unsigned char [_imgWidth * _imgHeight]; |
| | DownSamplePixelDataI(gl_format, width, height, 1<<_down_sampled, ((const unsigned char*) data), newdata); |
| | glTexImage2D(_texTarget, 0, GL_LUMINANCE32F_ARB, |
| | _imgWidth, _imgHeight, 0, |
| | GL_LUMINANCE, GL_UNSIGNED_BYTE, newdata); |
| | delete[] newdata; |
| | }else if(gl_type == GL_UNSIGNED_SHORT) |
| | { |
| | unsigned short * newdata = new unsigned short [_imgWidth * _imgHeight]; |
| | DownSamplePixelDataI(gl_format, width, height, 1<<_down_sampled, ((const unsigned short*) data), newdata); |
| |
|
| | glTexImage2D(_texTarget, 0, GL_LUMINANCE32F_ARB, |
| | _imgWidth, _imgHeight, 0, |
| | GL_LUMINANCE, GL_UNSIGNED_SHORT, newdata); |
| | delete[] newdata; |
| | }else if(gl_type == GL_FLOAT) |
| | { |
| | float * newdata = new float [_imgWidth * _imgHeight]; |
| | DownSamplePixelDataF(gl_format, width, height, 1<<_down_sampled, (float*)data, newdata); |
| | glTexImage2D(_texTarget, 0, GL_LUMINANCE32F_ARB, |
| | _imgWidth, _imgHeight, 0, |
| | GL_LUMINANCE, GL_FLOAT, newdata); |
| | delete[] newdata; |
| | }else |
| | { |
| | |
| | done = 0; |
| | _rgb_converted = 0; |
| | } |
| | GlobalUtil::FitViewPort(1, 1); |
| | }else |
| | { |
| | |
| | if(gl_format == GL_LUMINANCE || gl_format == GL_LUMINANCE_ALPHA) |
| | { |
| | |
| | glTexImage2D(_texTarget, 0, GL_LUMINANCE32F_ARB, |
| | _imgWidth, _imgHeight, 0, gl_format, gl_type, data); |
| | GlobalUtil::FitViewPort(1, 1); |
| | } |
| | else |
| | { |
| | |
| | glTexImage2D(_texTarget, 0, _iTexFormat, _imgWidth, _imgHeight, 0, gl_format, gl_type, data); |
| | if(ShaderMan::HaveShaderMan()) |
| | TexConvertRGB(); |
| | else |
| | _rgb_converted = 0; |
| | } |
| | } |
| | UnbindTex(); |
| | } |
| | return done; |
| | } |
| |
|
| |
|
| | GLTexInput::~GLTexInput() |
| | { |
| | if(_converted_data) delete [] _converted_data; |
| | } |
| |
|
| |
|
| | int GLTexInput::LoadImageFile(char *imagepath, int &w, int &h ) |
| | { |
| | #ifndef SIFTGPU_NO_DEVIL |
| | static int devil_loaded = 0; |
| | unsigned int imID; |
| | int done = 1; |
| |
|
| | if(devil_loaded == 0) |
| | { |
| | ilInit(); |
| | ilOriginFunc(IL_ORIGIN_UPPER_LEFT); |
| | ilEnable(IL_ORIGIN_SET); |
| | devil_loaded = 1; |
| | } |
| |
|
| | |
| | ilGenImages(1, &imID); |
| | ilBindImage(imID); |
| |
|
| | if(ilLoadImage(imagepath)) |
| | { |
| | w = ilGetInteger(IL_IMAGE_WIDTH); |
| | h = ilGetInteger(IL_IMAGE_HEIGHT); |
| | int ilformat = ilGetInteger(IL_IMAGE_FORMAT); |
| |
|
| | if(SetImageData(w, h, ilGetData(), ilformat, GL_UNSIGNED_BYTE)==0) |
| | { |
| | done =0; |
| | }else if(GlobalUtil::_verbose) |
| | { |
| | std::cout<<"Image loaded :\t"<<imagepath<<"\n"; |
| | } |
| |
|
| | }else |
| | { |
| | std::cerr<<"Unable to open image [code = "<<ilGetError()<<"]\n"; |
| | done = 0; |
| | } |
| |
|
| | ilDeleteImages(1, &imID); |
| |
|
| | return done; |
| | #else |
| | FILE * file = fopen(imagepath, "rb"); if (file ==NULL) return 0; |
| |
|
| | char buf[8]; int width, height, cn, g, done = 1; |
| |
|
| | if(fscanf(file, "%s %d %d %d", buf, &width, &height, &cn )<4 || cn > 255 || width < 0 || height < 0) |
| | { |
| | fclose(file); |
| | std::cerr << "ERROR: fileformat not supported\n"; |
| | return 0; |
| | }else |
| | { |
| | w = width; |
| | h = height; |
| | } |
| | unsigned char * data = new unsigned char[width * height]; |
| | unsigned char * pixels = data; |
| | if (strcmp(buf, "P5")==0 ) |
| | { |
| | fscanf(file, "%c",buf); |
| | fread(pixels, 1, width*height, file); |
| | }else if (strcmp(buf, "P2")==0 ) |
| | { |
| | for (int i = 0 ; i< height; i++) |
| | { |
| | for ( int j = 0; j < width; j++) |
| | { |
| | fscanf(file, "%d", &g); |
| | *pixels++ = (unsigned char) g; |
| | } |
| | } |
| | }else if (strcmp(buf, "P6")==0 ) |
| | { |
| | fscanf(file, "%c", buf); |
| | int j, num = height*width; |
| | unsigned char buf[3]; |
| | for ( j =0 ; j< num; j++) |
| | { |
| | fread(buf,1,3, file); |
| | *pixels++=int(0.10454f* buf[2]+0.60581f* buf[1]+0.28965f* buf[0]); |
| | } |
| | }else if (strcmp(buf, "P3")==0 ) |
| | { |
| | int r, g, b; |
| | int i , num =height*width; |
| | for ( i = 0 ; i< num; i++) |
| | { |
| | fscanf(file, "%d %d %d", &r, &g, &b); |
| | *pixels++ = int(0.10454f* b+0.60581f* g+0.28965f* r); |
| | } |
| |
|
| | }else |
| | { |
| | std::cerr << "ERROR: fileformat not supported\n"; |
| | done = 0; |
| | } |
| | if(done) SetImageData(width, height, data, GL_LUMINANCE, GL_UNSIGNED_BYTE); |
| | fclose(file); |
| | delete data; |
| | if(GlobalUtil::_verbose && done) std::cout<< "Image loaded :\t" << imagepath << "\n"; |
| | return 1; |
| | #endif |
| | } |
| |
|
| | int GLTexImage::CopyToPBO(GLuint pbo, int width, int height, GLenum format) |
| | { |
| | |
| | if(format != GL_RGBA && format != GL_LUMINANCE) return 0; |
| |
|
| | FrameBufferObject fbo; |
| | GLint bsize, esize = width * height * sizeof(float) * (format == GL_RGBA ? 4 : 1); |
| | AttachToFBO(0); |
| | glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, pbo); |
| | glGetBufferParameteriv(GL_PIXEL_PACK_BUFFER_ARB, GL_BUFFER_SIZE, &bsize); |
| | if(bsize < esize) |
| | { |
| | glBufferData(GL_PIXEL_PACK_BUFFER_ARB, esize, NULL, GL_STATIC_DRAW_ARB); |
| | glGetBufferParameteriv(GL_PIXEL_PACK_BUFFER_ARB, GL_BUFFER_SIZE, &bsize); |
| | } |
| | if(bsize >= esize) |
| | { |
| | glReadPixels(0, 0, width, height, format, GL_FLOAT, 0); |
| | } |
| | glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, 0); |
| | DetachFBO(0); |
| |
|
| | return bsize >= esize; |
| | } |
| |
|
| | void GLTexImage::SaveToASCII(const char* path) |
| | { |
| | vector<float> buf(GetImgWidth() * GetImgHeight() * 4); |
| | FrameBufferObject fbo; |
| | AttachToFBO(0); |
| | glReadPixels(0, 0, GetImgWidth(), GetImgHeight(), GL_RGBA, GL_FLOAT, &buf[0]); |
| | ofstream out(path); |
| |
|
| | for(int i = 0, idx = 0; i < GetImgHeight(); ++i) |
| | { |
| | for(int j = 0; j < GetImgWidth(); ++j, idx += 4) |
| | { |
| | out << i << " " << j << " " << buf[idx] << " " << buf[idx + 1] << " " |
| | << buf[idx + 2] << " " << buf[idx + 3] << "\n"; |
| | } |
| | } |
| | } |
| |
|
| |
|
| | void GLTexInput::VerifyTexture() |
| | { |
| | |
| | if(!_data_modified) return; |
| | if(_pixel_data== NULL) return; |
| | InitTexture(_imgWidth, _imgHeight); |
| | BindTex(); |
| | glTexImage2D( _texTarget, 0, GL_LUMINANCE32F_ARB, |
| | _imgWidth, _imgHeight, 0, |
| | GL_LUMINANCE, GL_FLOAT, _pixel_data); |
| | UnbindTex(); |
| | _data_modified = 0; |
| | } |
| |
|
| | void GLTexImage::CopyFromPBO(GLuint pbo, int width, int height, GLenum format) |
| | { |
| | InitTexture(max(width, _texWidth), max(height, _texHeight)); |
| | SetImageSize(width, height); |
| | if(width > 0 && height > 0) |
| | { |
| | BindTex(); |
| | glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, pbo); |
| | glTexSubImage2D(GlobalUtil::_texTarget, 0, 0, 0, width, height, format, GL_FLOAT, 0); |
| | GlobalUtil::CheckErrorsGL("GLTexImage::CopyFromPBO->glTexSubImage2D"); |
| | glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, 0); |
| | UnbindTex(); |
| | } |
| | } |
| |
|
| |
|