00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifdef _MSC_VER
00022 # include <windows.h>
00023 #endif
00024 #include <GL/glew.h>
00025 #include <GL/gl.h>
00026 #include <GL/glu.h>
00027 #include "rtc/rtcTexture.h"
00028 #include <rtc/rtcBase.h>
00029
00030
00031 namespace rtc {
00032
00033
00034
00035 Texture::Texture(bool _multi_use, int _max_texture_size)
00036 : multi_use(_multi_use),max_texture_size(_max_texture_size),texture_id(0),
00037 texture_width(0),texture_height(0),image_width(0),image_height(0),max_u(0),
00038 max_v(0),texture_data(NULL)
00039 {
00040 }
00041
00042 Texture::~Texture()
00043 {
00044 unloadTexture();
00045 }
00046
00047 void Texture::create(int width, int height)
00048 {
00049 texture_width = 1;
00050 texture_height = 1;
00051 while(texture_width < width)
00052 texture_width *= 2;
00053 while(texture_height < height)
00054 texture_height *= 2;
00055 image_width = width;
00056 image_height = height;
00057 texture_data = (unsigned char *)calloc(1, 4 * texture_width * texture_height);
00058 rtc_test_alloc(texture_data);
00059
00060 max_u = width / (float)texture_width;
00061 max_v = height / (float)texture_height;
00062
00063 if (texture_id==0)
00064 glGenTextures(1, &texture_id);
00065 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
00066 glBindTexture(GL_TEXTURE_2D, texture_id);
00067
00068 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);
00069 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);
00070 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
00071 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
00072 }
00073
00074 void Texture::update()
00075 {
00076 if(texture_data == NULL)
00077 rtc_die("Error: cannont update a single use texture.\n");
00078 glBindTexture(GL_TEXTURE_2D, texture_id);
00079 glTexImage2D(GL_TEXTURE_2D, 0, 4, texture_width,
00080 texture_height, 0, GL_RGBA, GL_UNSIGNED_BYTE,
00081 texture_data);
00082 }
00083
00084 void Texture::updateRGBA()
00085 {
00086 if(texture_data == NULL)
00087 rtc_die("Error: cannont update a single use texture.\n");
00088 glBindTexture(GL_TEXTURE_2D, texture_id);
00089 glTexImage2D(GL_TEXTURE_2D, 0, 4, texture_width,
00090 texture_height, 0, GL_RGBA, GL_UNSIGNED_BYTE,
00091 texture_data);
00092 }
00093
00094 void Texture::createRGBA(int width, int height)
00095 {
00096 texture_width = 1;
00097 texture_height = 1;
00098 while(texture_width < width)
00099 texture_width *= 2;
00100 while(texture_height < height)
00101 texture_height *= 2;
00102 image_width = width;
00103 image_height = height;
00104 texture_data = (unsigned char *)calloc(1, 4 * texture_width * texture_height);
00105 rtc_test_alloc(texture_data);
00106
00107 max_u = width / (float)texture_width;
00108 max_v = height / (float)texture_height;
00109
00110 glGenTextures(1, &texture_id);
00111 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
00112 glBindTexture(GL_TEXTURE_2D, texture_id);
00113
00114 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);
00115 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);
00116 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
00117 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
00118 }
00119
00120 void Texture::draw()
00121 {
00122 glEnable(GL_TEXTURE_2D);
00123 glBindTexture(GL_TEXTURE_2D, texture_id);
00124 glColor3f(1, 1, 1);
00125 glBegin(GL_POLYGON);
00126 glTexCoord2f(0, 0);
00127 glVertex2f(-1, 1);
00128 glTexCoord2f(0, 1);
00129 glVertex2f(-1, -1);
00130 glTexCoord2f(1, 1);
00131 glVertex2f(1, -1);
00132 glTexCoord2f(1, 0);
00133 glVertex2f(1, 1);
00134 glEnd();
00135 glDisable(GL_TEXTURE_2D);
00136 }
00137
00138 void Texture::draw2(double x1, double y1,
00139 double x2, double y2,
00140 double x3, double y3,
00141 double x4, double y4)
00142 {
00143 glEnable(GL_TEXTURE_2D);
00144 glBindTexture(GL_TEXTURE_2D, texture_id);
00145 glColor3f(1, 1, 1);
00146 glBegin(GL_POLYGON);
00147 glTexCoord2f(0, max_v);
00148 glVertex2f(x1, y1);
00149 glTexCoord2f(max_u, max_v);
00150 glVertex2f(x2, y2);
00151 glTexCoord2f(max_u, 0);
00152 glVertex2f(x3, y3);
00153 glTexCoord2f(0, 0);
00154 glVertex2f(x4, y4);
00155 glEnd();
00156 glDisable(GL_TEXTURE_2D);
00157 }
00158
00159 void Texture::fromImage(const Image3uc& image)
00160 {
00161 texture_width = 1;
00162 texture_height = 1;
00163 while(texture_width < image.columns())
00164 texture_width *= 2;
00165 while(texture_height < image.rows())
00166 texture_height *= 2;
00167 if(texture_height > max_texture_size)
00168 texture_height = max_texture_size;
00169 if(texture_width > max_texture_size)
00170 texture_width = max_texture_size;
00171
00172 Image3uc newimage(texture_height,texture_width);
00173 image.resized(newimage);
00174 unsigned char *data=new unsigned char[texture_height*texture_width*3];
00175 for (int i=0;i<texture_height*texture_width;i++)
00176 {
00177 data[i*3]=newimage.x[i][0];
00178 data[i*3+1]=newimage.x[i][1];
00179 data[i*3+2]=newimage.x[i][2];
00180 }
00181
00182 if (texture_id==0) glGenTextures(1, &texture_id);
00183 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
00184 glBindTexture(GL_TEXTURE_2D, texture_id);
00185 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);
00186 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);
00187 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
00188 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
00189 glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,newimage.columns(),newimage.rows(),0,GL_RGB,GL_UNSIGNED_BYTE,data);
00190
00191 delete data;
00192
00193
00194 if(!multi_use) {
00195
00196
00197 }
00198 }
00199
00200 void Texture::fromImage(const Image4uc& image)
00201 {
00202 texture_width = 1;
00203 texture_height = 1;
00204 while(texture_width < image.columns())
00205 texture_width *= 2;
00206 while(texture_height < image.rows())
00207 texture_height *= 2;
00208 if(texture_height > max_texture_size)
00209 texture_height = max_texture_size;
00210 if(texture_width > max_texture_size)
00211 texture_width = max_texture_size;
00212
00213 Image4uc newimage(texture_height,texture_width);
00214 image.resized(newimage);
00215 texture_data=new unsigned char[texture_height*texture_width*4];
00216 for (int i=0;i<texture_height*texture_width;i++)
00217 {
00218 texture_data[i*4]=newimage.x[i][0];
00219 texture_data[i*4+1]=newimage.x[i][1];
00220 texture_data[i*4+2]=newimage.x[i][2];
00221 texture_data[i*4+3]=newimage.x[i][3];
00222 }
00223
00224 if (texture_id==0) glGenTextures(1, &texture_id);
00225 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
00226 glBindTexture(GL_TEXTURE_2D, texture_id);
00227 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);
00228 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);
00229 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
00230 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
00231 glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,newimage.columns(),newimage.rows(),0,GL_RGBA,GL_UNSIGNED_BYTE,texture_data);
00232 glDisable(GL_TEXTURE_2D);
00233
00234 if(!multi_use) {
00235
00236
00237 }
00238 }
00239
00240 void Texture::toImage(Image4uc& image)
00241 {
00242 image.setSize(texture_height, texture_width);
00243 int size = texture_height*texture_width;
00244 for (int i=0;i<size;i++)
00245 {
00246 image.x[i][0] = texture_data[i*4];
00247 image.x[i][1] = texture_data[i*4+1];
00248 image.x[i][2] = texture_data[i*4+2];
00249 image.x[i][3] = texture_data[i*4+3];
00250 }
00251 }
00252
00253 bool Texture::loadFromImage(const char *filename)
00254 {
00255
00256 Image4uc image;
00257 bool res = image.readFromFile(filename);
00258 if(!res) return false;
00259
00260 fromImage(image);
00261 return true;
00262 }
00263
00264 bool Texture::saveToImage(const char* filename)
00265 {
00266
00267 Image4uc image;
00268 toImage(image);
00269 return image.writeToFile(filename);
00270 }
00271
00272 bool Texture::write(std::ostream& os, bool ascii) const
00273 {
00274 return true;
00275 }
00276
00277 bool Texture::read(std::istream& is, bool ascii)
00278 {
00279 return true;
00280 }
00281
00282 void Texture::bind( GLenum target )
00283 {
00284 glEnable(GL_TEXTURE_2D);
00285 glActiveTexture(target);
00286 glBindTexture(GL_TEXTURE_2D, texture_id);
00287 bind_target=target;
00288 }
00289
00290 void Texture::unbind()
00291 {
00292 glActiveTexture(bind_target);
00293 glBindTexture(GL_TEXTURE_2D,0);
00294 glDisable(GL_TEXTURE_2D);
00295 }
00296
00297 void Texture::unloadTexture()
00298 {
00299 if (texture_id!=0) glDeleteTextures(1, &texture_id);
00300 texture_id=0;
00301 if(texture_data != NULL)
00302 free(texture_data);
00303 }
00304
00305 }
00306