root / rgbdslam / external / siftgpu / src / SiftGPU / GLTexImage.h @ 9240aaa3
History | View | Annotate | Download (5.52 KB)
1 |
////////////////////////////////////////////////////////////////////////////
|
---|---|
2 |
// File: GLTexImage.h
|
3 |
// Author: Changchang Wu
|
4 |
// Description : interface for the GLTexImage class.
|
5 |
// GLTexImage: naive texture class.
|
6 |
// sevral different quad drawing functions are provied
|
7 |
// GLTexPacked: packed version (four value packed as four channels of a pixel)
|
8 |
// GLTexInput: GLTexImage + some input information
|
9 |
//
|
10 |
// Copyright (c) 2007 University of North Carolina at Chapel Hill
|
11 |
// All Rights Reserved
|
12 |
//
|
13 |
// Permission to use, copy, modify and distribute this software and its
|
14 |
// documentation for educational, research and non-profit purposes, without
|
15 |
// fee, and without a written agreement is hereby granted, provided that the
|
16 |
// above copyright notice and the following paragraph appear in all copies.
|
17 |
//
|
18 |
// The University of North Carolina at Chapel Hill make no representations
|
19 |
// about the suitability of this software for any purpose. It is provided
|
20 |
// 'as is' without express or implied warranty.
|
21 |
//
|
22 |
// Please send BUG REPORTS to ccwu@cs.unc.edu
|
23 |
//
|
24 |
////////////////////////////////////////////////////////////////////////////
|
25 |
|
26 |
|
27 |
#ifndef GL_TEX_IMAGE_H
|
28 |
#define GL_TEX_IMAGE_H
|
29 |
|
30 |
class GlobalUtil; |
31 |
class GLTexImage :public GlobalUtil |
32 |
{ |
33 |
protected:
|
34 |
GLuint _texID; |
35 |
int _imgWidth;
|
36 |
int _imgHeight;
|
37 |
int _texWidth;
|
38 |
int _texHeight;
|
39 |
int _drawWidth;
|
40 |
int _drawHeight;
|
41 |
public:
|
42 |
static void DetachFBO(int i); |
43 |
static void UnbindTex(); |
44 |
static void UnbindMultiTex(int n); |
45 |
static void DrawQuad(float x1, float x2, float y1, float y2); |
46 |
|
47 |
public:
|
48 |
virtual void DrawQuadUS(int scale); |
49 |
virtual void DrawQuadDS(int scale); |
50 |
virtual void DrawImage();
|
51 |
virtual void TexConvertRGB();
|
52 |
virtual void ZeroHistoMargin();
|
53 |
virtual void SetImageSize(int width, int height); |
54 |
virtual void InitTexture(int width, int height, int clamp_to_edge =1 ); |
55 |
void InitTexture(int width, int height, int clamp_to_edge, GLuint format); |
56 |
virtual void FillMargin(int marginx, int marginy); |
57 |
public:
|
58 |
void DrawScaledQuad(float scale); |
59 |
int CopyToPBO(GLuint pbo, int width, int height, GLenum format = GL_RGBA); |
60 |
void CopyFromPBO(GLuint pbo, int width, int height, GLenum format = GL_RGBA); |
61 |
void FitRealTexViewPort();
|
62 |
void DrawQuadMT8();
|
63 |
void DrawQuadMT4();
|
64 |
void DrawQuadReduction();
|
65 |
void DrawQuadReduction(int w, int h); |
66 |
void DrawMargin(int right, int bottom); |
67 |
void DrawQuad();
|
68 |
void FitTexViewPort();
|
69 |
void ZeroHistoMargin(int hw, int hh); |
70 |
int CheckTexture();
|
71 |
public:
|
72 |
void AttachToFBO(int i ); |
73 |
void BindTex();
|
74 |
operator GLuint (){return _texID;}
|
75 |
GLuint GetTexID(){return _texID;}
|
76 |
int GetImgPixelCount(){return _imgWidth*_imgHeight;} |
77 |
int GetTexPixelCount(){return _texWidth*_texHeight;} |
78 |
int GetImgWidth(){return _imgWidth;} |
79 |
int GetImgHeight(){return _imgHeight;} |
80 |
int GetTexWidth(){return _texWidth;} |
81 |
int GetTexHeight(){return _texHeight;} |
82 |
int GetDrawWidth(){return _drawWidth;} |
83 |
int GetDrawHeight(){return _drawHeight;} |
84 |
//int IsTexTight(){return _texWidth == _drawWidth && _texHeight == _drawHeight;}
|
85 |
int IsTexPacked(){return _drawWidth != _imgWidth;} |
86 |
GLTexImage(); |
87 |
virtual ~GLTexImage(); |
88 |
friend class SiftGPU; |
89 |
}; |
90 |
|
91 |
//class for handle data input, to support all openGL-supported data format,
|
92 |
//data are first uploaded to an openGL texture then converted, and optionally
|
93 |
//when the datatype is simple, we downsample/convert on cpu
|
94 |
class GLTexInput:public GLTexImage |
95 |
{ |
96 |
public:
|
97 |
int _down_sampled;
|
98 |
int _rgb_converted;
|
99 |
int _data_modified;
|
100 |
|
101 |
//////////////////////////
|
102 |
float * _converted_data;
|
103 |
const void* _pixel_data; |
104 |
public:
|
105 |
static int IsSimpleGlFormat(unsigned int gl_format, unsigned int gl_type) |
106 |
{ |
107 |
//the formats there is a cpu code to conver rgb and downsample
|
108 |
return (gl_format ==GL_LUMINANCE ||gl_format == GL_LUMINANCE_ALPHA||
|
109 |
gl_format == GL_RGB|| gl_format == GL_RGBA|| |
110 |
gl_format == GL_BGR || gl_format == GL_BGRA) && |
111 |
(gl_type == GL_UNSIGNED_BYTE || gl_type == GL_FLOAT || gl_type == GL_UNSIGNED_SHORT); |
112 |
} |
113 |
//in vc6, template member function doesn't work
|
114 |
#if !defined(_MSC_VER) || _MSC_VER > 1200 |
115 |
template <class Uint> |
116 |
static int DownSamplePixelDataI(unsigned int gl_format, int width, int height, |
117 |
int ds, const Uint * pin, Uint * pout); |
118 |
template <class Uint> |
119 |
static int DownSamplePixelDataI2F(unsigned int gl_format, int width, int height, |
120 |
int ds, const Uint * pin, float * pout, int skip = 0); |
121 |
#endif
|
122 |
static int DownSamplePixelDataF(unsigned int gl_format, int width, int height, |
123 |
int ds, const float * pin, float * pout, int skip = 0); |
124 |
static int TruncateWidthCU(int w) {return w & 0xfffffffc; } |
125 |
public:
|
126 |
GLTexInput() : _down_sampled(0), _rgb_converted(0), _data_modified(0), |
127 |
_converted_data(0), _pixel_data(0){} |
128 |
int SetImageData(int width, int height, const void * data, |
129 |
unsigned int gl_format, unsigned int gl_type); |
130 |
int LoadImageFile(char * imagepath, int & w, int &h); |
131 |
void VerifyTexture();
|
132 |
virtual ~GLTexInput(); |
133 |
}; |
134 |
|
135 |
//GLTexPacked doesn't have any data
|
136 |
//so that we can use the GLTexImage* pointer to index a GLTexPacked Vector
|
137 |
|
138 |
class GLTexPacked:public GLTexImage |
139 |
{ |
140 |
public:
|
141 |
virtual void DrawImage();
|
142 |
virtual void DrawQuadUS(int scale); |
143 |
virtual void DrawQuadDS(int scale); |
144 |
virtual void FillMargin(int marginx, int marginy); |
145 |
virtual void InitTexture(int width, int height, int clamp_to_edge =1); |
146 |
virtual void TexConvertRGB();
|
147 |
virtual void SetImageSize(int width, int height); |
148 |
virtual void ZeroHistoMargin();
|
149 |
//virtual void GetHistWH(int& w, int& h){return w = (3 + sz)>>1;}
|
150 |
public:
|
151 |
void DrawMargin(int right, int bottom, int mx, int my); |
152 |
GLTexPacked():GLTexImage(){} |
153 |
}; |
154 |
|
155 |
|
156 |
#endif // !defined(GL_TEX_IMAGE_H) |
157 |
|