Morph-SynRJ

view cmn_texture.cxx @ 0:22de913c2d84

morph-synrj intro
author "Cedric Pinson <cedric.pinson@alcove.fr> <mornifle@plopbyte.net>"
date Tue Nov 27 15:23:52 2007 +0100 (2007-11-27)
parents
children
line source
1 #include "cmn_texture.h"
2 #include "cmn_intro.h"
3 #include "sys_assert.h"
4 #include "mth_perlin.h"
5 #include "gl_header.h"
7 void txtBindTexture2d(GLuint _texture,int _unit)
8 {
9 // glActiveTextureEXT(GL_TEXTURE0+_unit);
10 glEnable(GL_TEXTURE_2D);
11 glBindTexture(GL_TEXTURE_2D,_texture);
12 }
14 void txtUnBindTexture2d(int _unit)
15 {
16 // glActiveTextureEXT(GL_TEXTURE0+_unit);
17 glDisable(GL_TEXTURE_2D);
18 }
21 GLuint txtInitTexture(GLenum _internalFormat,int _width,int _height,void* _data,bool _clamp,GLenum _type)
22 {
23 GLuint id;
24 glGenTextures(1, &id);
25 glBindTexture(GL_TEXTURE_2D, id);
26 glPixelStorei(GL_UNPACK_ALIGNMENT,1);
27 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); //_MIPMAP_LINEAR);
28 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);//_MIPMAP_LINEAR); // _MIPMAP_LINEAR
29 if (_clamp) {
30 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP); //_MIPMAP_LINEAR);
31 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP); //_MIPMAP_LINEAR);
32 }
33 glTexImage2D(GL_TEXTURE_2D, 0, 4, _width, _height, 0, _internalFormat, _type, _data);
34 SYS_ASSERT(id && "No Id ???");
35 return id;
36 }
39 GLuint txtLoadTextureFromMemory(int _name)
40 {
41 HBITMAP bkg;
42 BITMAP bmp;
43 GLuint id;
45 bkg = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(_name), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
46 SYS_ASSERT( bkg && "Texture not found\n");
48 GetObject(bkg, sizeof(bmp), &bmp);
49 id=txtInitTexture(GL_BGR_EXT,bmp.bmWidth,bmp.bmHeight,bmp.bmBits);
50 DeleteObject(bkg);
51 return id;
52 }
56 // Create an empty texture
57 GLuint txtCreateEmptyTexture(int _width,int _height)
58 {
59 GLuint id;
60 unsigned char *data;
62 data = (unsigned char *)new GLuint[ ((_width * _height)* 4 * sizeof(unsigned int)) ];
63 id=txtInitTexture(GL_RGBA,_width,_height,data);
64 delete [] data;
65 return id;
66 }
71 static float F1(float _x,float _y,float _amp,int _freq)
72 {
73 float amplitude = 1.0;
74 float result = 0.0;
75 float freq=1.0;
76 float x=_x;
77 float y=_y;
78 float persistance;
79 for (int i=0; i<_freq; i++) {
80 freq=(1<<i);
81 persistance=mth::Pow(_amp,i);
82 result += _y+mth::noise2d(_x*freq,_y*freq) * persistance;
83 /* amplitude *= persistance;
84 x *= 2.0;
85 y *= 2.0;*/
86 }
87 return result;
88 }
91 float Tileable(/*mth::Perlin_t& _p,*/float _x,float _y,float _w,float _h,float _amp,int _freq)
92 {
93 //return F1(_x, _y, _amp,_freq);
94 return (F1(_x, _y, _amp,_freq)*(_w-_x)*(_h-_y)+
95 F1(_x-_w, _y, _amp,_freq)*(_x)*(_h-_y)+
96 F1(_x-_w, _y-_h,_amp,_freq)*(_x)*(_y)+
97 F1(_x, _y-_h,_amp,_freq)*(_w-_x)*(_y))*1.0/(_w*_h);
98 }
102 GLuint txtCreatePerlin2d(int _width,int _height,float _scaleOnX,float _scaleOnY,float _amp,int _freq,uchar* _keepMap)
103 {
104 typedef unsigned char uchar;
105 uchar* map=0;
106 if (!_keepMap)
107 map= new uchar[_width*_height*4];
108 else
109 map=_keepMap;
111 float* data= new float[_width*_height];
113 //mth::Perlin_t perlin;
114 float maxval=0;
115 int x,y;
116 float value;
118 for (x=0; x<_width; x++)
119 for (y=0; y<_height; y++) {
120 //value = perlin.Perturb(x*_scaleOnX, y*_scaleOnY, 5.2f, 3.5f);
121 value=Tileable(x*_scaleOnX,y*_scaleOnY,_width*_scaleOnX,_height*_scaleOnY,_amp,_freq);
122 data[x+y*_width]=value;//mth::Clamp(value,0,255);
123 maxval=mth::Max(mth::Abs(value),maxval);
124 }
127 for (x=0; x<_width; x++)
128 for (y=0; y<_height; y++) {
130 // value=data[x+y*_width]/maxval*255;///maxval;
131 value=(data[x+y*_width]+maxval)/(2.0*maxval)*255;///maxval;
132 map[(x+y*_width)*4+0] = (uchar)value;
133 map[(x+y*_width)*4+1] = (uchar)value;
134 map[(x+y*_width)*4+2] = (uchar)value;
135 map[(x+y*_width)*4+3] = 255;
136 // map[x+y*_width+3] = 255;
137 }
139 int id=txtInitTexture(GL_RGBA,_width,_height,map);//,GL_UNSIGNED_INT);
140 if (!_keepMap)
141 delete [] map;
142 delete [] data;
143 return id;
144 }
148 void txtGetTextureFromBackBuffer(void* _result,int _cornerX,int _cornerY,int _width,int _height)
149 {
150 glFlush();
151 glReadPixels(_cornerX,_cornerY,_width,_height,GL_RGBA,/*GL_UNSIGNED_INT_8_8_8_8*/GL_UNSIGNED_BYTE,_result);
152 }
155 GLuint txtCreateGrid(int _width,int _height,int _sizeofSquare,float _minValue)
156 {
157 uchar* map= new uchar[_width*_height*4];
159 int x,y;
160 int xend=_width/_sizeofSquare;
161 int yend=_height/_sizeofSquare;
162 uchar pixel;
164 int base=_minValue*=255;
165 float p;
166 for (x=0; x<xend; x++)
167 for (y=0; y<yend; y++) {
168 p=_minValue+1.0*mth::Rand()/(mth::RANDOM_MAX+1);
169 pixel=(int)(mth::Max(p,1.f)*255);
170 int index=x*_sizeofSquare+(y*_sizeofSquare)*_width;
171 for (int i=0;i<_sizeofSquare;i++)
172 for (int j=0;j<_sizeofSquare;j++) {
173 int idx=(index+i+j*_width)*4;
174 map[idx]=pixel;
175 map[idx+1]=pixel;
176 map[idx+2]=pixel;
177 map[idx+3]=pixel;
178 }
179 }
181 int id=txtInitTexture(GL_RGBA,_width,_height,map);//,GL_UNSIGNED_INT);
182 delete [] map;
183 return id;
184 }
187 GLuint txtCreateObliqueTexture(int _width,int _height,float _angle,const char* _text,char _letter)
188 {
189 uchar* map= new uchar[_width*_height*4];
191 cmnClearScreen(0,0,0,1);
193 cmnPushMatrix();
194 cmnSetPlanarView();
195 glDisable(GL_CULL_FACE);
196 glDisable(GL_DEPTH_TEST);
197 glDisable(GL_BLEND);
199 float sizex=_height*mth::Tan( (180.0-90.0-_angle)*mth::PI/180.0);
200 float hyp=mth::Sqrt(sizex*sizex+_height*_height);
202 cmnPushMatrix();
203 if (_text) {
204 glColor4f(1,1,1,1);
205 glTranslatef(font->SizeOfCharX()*1.5,0,0);
206 glRotatef(_angle,0,0,1);
207 int b=strlen(_text);
208 int startx=(hyp-b*font->SizeOfCharX())*.5-font->SizeOfCharX()*0.5;
209 SYS_ASSERT(startx>=0);
210 font->Print(startx,0,_text);
211 }
212 cmnPopMatrix();
214 #if 1
215 cmnPushMatrix();
216 if (_letter) {
217 glColor4f(1,1,1,1);
218 //glEnable(GL_BLEND);
219 //glBlendFunc(GL_ONE,GL_ONE);
220 const float OffsetPerCent = 0.10;
221 float startx=_width*OffsetPerCent;
222 float starty=_height*OffsetPerCent;
223 //float sizex=_width-(_width*2*OffsetPerCent);
224 //float sizey=_height-(_height*2*OffsetPerCent);
226 float u,v;
227 font->GetUVsOfChar(_letter,u,v);
228 txtBindTexture2d(font->TextureId(),0);
230 glBegin(GL_QUADS);
231 glTexCoord2f(u,0);
232 glVertex2f(startx,starty);
234 glTexCoord2f(u,1);
235 glVertex2f(sizex+startx,_height-starty);
237 float div=font->SizeOfCharX()*1.0/font->TextureWidth();
238 glTexCoord2f(u+div,1);
239 glVertex2f(_width-startx,_height-starty);
241 glTexCoord2f(u+div,0);
242 glVertex2f(_width-sizex-startx,starty);
243 glEnd();
244 txtUnBindTexture2d(0);
245 }
246 cmnPopMatrix();
247 #endif
249 glEnable(GL_BLEND);
250 glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ONE_MINUS_DST_COLOR);
252 glBegin(GL_QUADS);
253 glVertex2f(0,0);
254 glVertex2f(sizex,_height);
255 glVertex2f(_width,_height);
256 glVertex2f(_width-sizex,0);
257 glEnd();
258 glFlush();
260 txtGetTextureFromBackBuffer(map,0,0,_width,_height);
261 int id=txtInitTexture(GL_RGBA,_width,_height,map,true);//,GL_UNSIGNED_INT);
262 delete [] map;
263 return id;
264 }
268 // use it to have letter as texture filtered twice
269 GLuint txtCreateTextureFromLetter(int _width,int _height,char _letter)
270 {
271 SYS_ASSERT(_letter);
272 uchar* map= new uchar[_width*_height*4];
274 cmnClearScreen(0,0,0,1);
276 cmnPushMatrix();
277 cmnSetPlanarView();
278 glDisable(GL_CULL_FACE);
279 glDisable(GL_DEPTH_TEST);
280 glDisable(GL_BLEND);
282 glColor4f(1,1,1,1);
284 float u,v;
285 font->GetUVsOfChar(_letter,u,v);
286 txtBindTexture2d(font->TextureId(),0);
288 glBegin(GL_QUADS);
289 glTexCoord2f(u,0);
290 glVertex2f(0,0);
292 glTexCoord2f(u,1);
293 glVertex2f(0,_height);
295 float div=font->SizeOfCharX()*1.0/font->TextureWidth();
296 glTexCoord2f(u+div,1);
297 glVertex2f(_width,_height);
299 glTexCoord2f(u+div,0);
300 glVertex2f(_width,0);
301 glEnd();
302 txtUnBindTexture2d(0);
304 cmnPopMatrix();
306 glFlush();
308 txtGetTextureFromBackBuffer(map,0,0,_width,_height);
309 int id=txtInitTexture(GL_RGBA,_width,_height,map,true);//,GL_UNSIGNED_INT);
310 delete [] map;
311 return id;
312 }
316 #if 1
317 GLuint txtCreateTextureCircular(int _width,int _height,float _radius,int _fade)
318 {
319 uchar* map= new uchar[_width*_height*4];
321 cmnClearScreen(0,0,0,1);
322 cmnPushMatrix();
323 cmnSetPlanarView();
324 glDisable(GL_CULL_FACE);
325 glDisable(GL_DEPTH_TEST);
326 glDisable(GL_BLEND);
327 glColor4f(1,1,1,1);
329 const int Section=360;
330 const float Radius=mth::Min(_width,_height)*0.5;
331 const float Div=mth::TWOPI/Section;
332 glBegin(GL_TRIANGLE_FAN);
333 if (_fade)
334 glColor3f(1,1,1);
335 glVertex2f(_width*0.5,_height*0.5);
336 for (int i=0;i<Section+1;i++) {
337 float x,y;
338 x=Radius * mth::Sin(-i *Div);
339 y=Radius * mth::Cos(-i *Div);
340 x+=_width*0.5;
341 y+=_height*0.5;
342 if (_fade)
343 glColor3f(0,0,0);
344 glVertex2f(x,y);
345 }
346 glEnd();
348 cmnPopMatrix();
350 glFlush();
352 txtGetTextureFromBackBuffer(map,0,0,_width,_height);
353 int id=txtInitTexture(GL_RGBA,_width,_height,map,true);//,GL_UNSIGNED_INT);
354 delete [] map;
355 return id;
356 }
357 #endif
361 void CopyBackBufferToTexture(GLuint _destination,int _sizex,int _sizey,int _bgOffsetX,int _bgOffsetY,int _txtOffsetX,int _txtOffsetY)
362 {
363 txtBindTexture2d(_destination,0);
364 glCopyTexSubImage2D(GL_TEXTURE_2D,0,_txtOffsetX,_txtOffsetY,_bgOffsetX,_bgOffsetY,_sizex,_sizey);
365 txtUnBindTexture2d(0);
366 }