5 #ifndef GLVERTEX_TEXTURE_H
6 #define GLVERTEX_TEXTURE_H
9 #include "glvertex_texture_gl.h"
20 inline vec4f lglTexmapGet(
int x,
int y,
21 int width,
int height,
26 if (x>=0 && x<width && y>=0 && y<height)
32 case LGL_RGB: components = 3;
break;
33 case LGL_RGBA: components = 4;
break;
34 case LGL_INTENSITY:
case LGL_LUMINANCE: components = 1;
break;
35 case LGL_LUMINANCE_ALPHA: components = 2;
break;
38 int offset = (x+y*width)*components;
40 if (components > 0) value.r = data[offset]*1.0f/255;
41 if (components > 1) value.g = data[offset+1]*1.0f/255;
42 if (components > 2) value.b = data[offset+2]*1.0f/255;
43 if (components > 3) value.a = data[offset+3]*1.0f/255;
49 inline void lglTexmapSet(
int x,
int y,
vec4f value,
50 int width,
int height,
53 if (x>=0 && x<width && y>=0 && y<height)
59 case LGL_RGB: components = 3;
break;
60 case LGL_RGBA: components = 4;
break;
61 case LGL_INTENSITY:
case LGL_LUMINANCE: components = 1;
break;
62 case LGL_LUMINANCE_ALPHA: components = 2;
break;
65 if (value.r < 0) value.r = 0;
66 else if (value.r > 1) value.r = 1;
68 if (value.g < 0) value.g = 0;
69 else if (value.g > 1) value.g = 1;
71 if (value.b < 0) value.b = 0;
72 else if (value.b > 1) value.b = 1;
74 if (value.a < 0) value.a = 0;
75 else if (value.a > 1) value.a = 1;
77 int offset = (x+y*width)*components;
79 if (components > 0) data[offset] = (
unsigned char)(value.r*255+0.5f);
80 if (components > 1) data[offset+1] = (
unsigned char)(value.g*255+0.5f);
81 if (components > 2) data[offset+2] = (
unsigned char)(value.b*255+0.5f);
82 if (components > 3) data[offset+3] = (
unsigned char)(value.a*255+0.5f);
86 inline vec4f lglSampleTexmap(
float s,
float t,
87 int width,
int height,
95 if (width<1 || height<1)
102 else if (s > 1) s = 1;
105 else if (t > 1) t = 1;
116 if (width>1 && height>1)
130 vec4f v1 = lglTexmapGet(x,y, width,height, type,data);
131 vec4f v2 = lglTexmapGet(x+1,y, width,height, type,data);
132 vec4f v3 = lglTexmapGet(x,y+1, width,height, type,data);
133 vec4f v4 = lglTexmapGet(x+1,y+1, width,height, type,data);
135 value = (1-v)*((1-u)*v1+u*v2)+v*((1-u)*v3+u*v4);
145 vec4f v1 = lglTexmapGet(x,y, width,height, type,data);
146 vec4f v2 = lglTexmapGet(x+1,y, width,height, type,data);
148 value = (1-u)*v1+u*v2;
158 vec4f v1 = lglTexmapGet(x,y, width,height, type,data);
159 vec4f v2 = lglTexmapGet(x,y+1, width,height, type,data);
161 value = (1-v)*v1+v*v2;
167 inline unsigned char *lglScaleTexmap(
int inwidth,
int inheight,
168 int outwidth,
int outheight,
171 if (inwidth<1 || inheight<1 || outwidth<1 || outheight<1)
173 lglError(
"invalid 2D texture size");
181 case LGL_RGB: components = 3;
break;
182 case LGL_RGBA: components = 4;
break;
183 case LGL_INTENSITY:
case LGL_LUMINANCE: components = 1;
break;
184 case LGL_LUMINANCE_ALPHA: components = 2;
break;
187 unsigned char *data2 = (
unsigned char *)malloc(outwidth*outheight*components);
195 for (
int x=0; x<outwidth; x++)
196 for (
int y=0; y<outheight; y++)
198 float s = (float)x/(outwidth-1);
199 float t = (float)y/(outheight-1);
201 vec4f value = lglSampleTexmap(s,t, inwidth,inheight, type,data);
202 lglTexmapSet(x,y, value, outwidth,outheight, type,data2);
208 inline unsigned char *lglScaleTexmap2POT(
int *width,
int *height,
211 if (*width<1 || *height<1)
213 lglError(
"invalid 2D texture size");
219 for (width2=2; width2<*width; width2*=2) ;
220 for (height2=2; height2<*height; height2*=2) ;
222 if (width2==*width && height2==*height)
226 unsigned char *data2 = lglScaleTexmap(*width,*height, width2,height2, type,data);
235 inline unsigned char *lglDownsizeTexmap(
int *width,
int *height,
238 if (*width<2 && *height<2)
240 lglError(
"invalid 2D texture size");
248 case LGL_RGB: components = 3;
break;
249 case LGL_RGBA: components = 4;
break;
250 case LGL_INTENSITY:
case LGL_LUMINANCE: components = 1;
break;
251 case LGL_LUMINANCE_ALPHA: components = 2;
break;
255 int height2 = *height;
257 if (width2&1) width2++;
258 if (height2&1) height2++;
260 unsigned char *data2 = data;
262 if (width2!=*width || height2!=*height)
263 data2 = lglScaleTexmap(*width,*height, width2,height2, type,data);
268 unsigned char *down = (
unsigned char *)malloc((*width)*(*height)*components);
276 for (
int x=0; x<*width; x++)
277 for (
int y=0; y<*height; y++)
282 vec4f v1 = lglTexmapGet(x2,y2, width2,height2, type,data2);
283 vec4f v2 = lglTexmapGet(x2+1,y2, width2,height2, type,data2);
284 vec4f v3 = lglTexmapGet(x2,y2+1, width2,height2, type,data2);
285 vec4f v4 = lglTexmapGet(x2+1,y2+1, width2,height2, type,data2);
287 vec4f value = 0.25f*(v1+v2+v3+v4);
289 lglTexmapSet(x,y, value, *width,*height, type,down);
302 if (*width<1 || *height<1)
304 lglError(
"invalid 2D texture size");
310 GLenum gl_type = GL_RGB;
314 case LGL_RGB: gl_type = GL_RGB;
break;
315 case LGL_RGBA: gl_type = GL_RGBA;
break;
316 #ifdef GLVERTEX_TEXTURE_SWIZZLE
317 case LGL_INTENSITY: gl_type = GL_RED;
break;
319 case LGL_INTENSITY: gl_type = GL_INTENSITY;
break;
321 #ifdef GLVERTEX_TEXTURE_SWIZZLE
322 case LGL_LUMINANCE: gl_type = GL_RED;
break;
324 case LGL_LUMINANCE: gl_type = GL_LUMINANCE;
break;
326 #ifdef GLVERTEX_TEXTURE_SWIZZLE
327 case LGL_LUMINANCE_ALPHA: gl_type = GL_RG;
break;
329 case LGL_LUMINANCE_ALPHA: gl_type = GL_LUMINANCE_ALPHA;
break;
333 unsigned char *data2 = lglScaleTexmap2POT(width,height, type,data);
341 glGenTextures(1, &texid);
342 glBindTexture(GL_TEXTURE_2D, texid);
344 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
345 lglTexImage2D(GL_TEXTURE_2D, 0, gl_type, *width, *height, 0, gl_type==GL_INTENSITY?GL_LUMINANCE:gl_type, GL_UNSIGNED_BYTE, data2);
347 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
348 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
350 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
351 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
353 #ifdef GLVERTEX_TEXTURE_SWIZZLE
354 if (gl_type == GL_RED)
356 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_RED);
357 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, GL_RED);
358 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, GL_RED);
359 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, type==LGL_LUMINANCE?GL_ONE:GL_RED);
361 else if (gl_type == GL_RG)
363 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_RED);
364 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, GL_RED);
365 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, GL_RED);
366 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, GL_GREEN);
370 glBindTexture(GL_TEXTURE_2D, 0);
389 if (*width<1 || *height<1)
391 lglError(
"invalid 2D texture size");
397 GLenum gl_type = GL_RGB;
401 case LGL_RGB: gl_type = GL_RGB;
break;
402 case LGL_RGBA: gl_type = GL_RGBA;
break;
403 #ifdef GLVERTEX_TEXTURE_SWIZZLE
404 case LGL_INTENSITY: gl_type = GL_RED;
break;
406 case LGL_INTENSITY: gl_type = GL_INTENSITY;
break;
408 #ifdef GLVERTEX_TEXTURE_SWIZZLE
409 case LGL_LUMINANCE: gl_type = GL_RED;
break;
411 case LGL_LUMINANCE: gl_type = GL_LUMINANCE;
break;
413 #ifdef GLVERTEX_TEXTURE_SWIZZLE
414 case LGL_LUMINANCE_ALPHA: gl_type = GL_RG;
break;
416 case LGL_LUMINANCE_ALPHA: gl_type = GL_LUMINANCE_ALPHA;
break;
420 unsigned char *data2 = lglScaleTexmap2POT(width,height, type,data);
428 glGenTextures(1, &texid);
429 glBindTexture(GL_TEXTURE_2D, texid);
431 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
432 lglTexImage2D(GL_TEXTURE_2D, 0, gl_type, *width, *height, 0, gl_type==GL_INTENSITY?GL_LUMINANCE:gl_type, GL_UNSIGNED_BYTE, data2);
435 int height2 = *height;
437 unsigned char *m1 = data2;
438 unsigned char *m2 = NULL;
440 for (
int level=1; width2>1 || height2>1; level++)
442 m2 = lglDownsizeTexmap(&width2,&height2, type,m1);
453 lglTexImage2D(GL_TEXTURE_2D, level, gl_type, width2, height2, 0, gl_type==GL_INTENSITY?GL_LUMINANCE:gl_type, GL_UNSIGNED_BYTE, m2);
464 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
465 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
467 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
468 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
470 #ifdef GLVERTEX_TEXTURE_SWIZZLE
471 if (gl_type == GL_RED)
473 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_RED);
474 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, GL_RED);
475 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, GL_RED);
476 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, type==LGL_LUMINANCE?GL_ONE:GL_RED);
478 else if (gl_type == GL_RG)
480 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_RED);
481 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, GL_RED);
482 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, GL_RED);
483 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, GL_GREEN);
487 glBindTexture(GL_TEXTURE_2D, 0);
503 #if !defined(LGL_GLES) || defined (LGL_GLES3)
505 if (width<1 || height<1 || depth<1)
507 lglError(
"invalid 3D texture size");
511 if ((width&(width-1))!=0)
lglWarning(
"3D texture map width not a power of two");
512 if ((height&(height-1))!=0)
lglWarning(
"3D texture map height not a power of two");
513 if ((depth&(depth-1))!=0)
lglWarning(
"3D texture map depth not a power of two");
517 GLenum gl_type = GL_RGB;
521 case LGL_RGB: gl_type = GL_RGB;
break;
522 case LGL_RGBA: gl_type = GL_RGBA;
break;
523 #ifdef GLVERTEX_TEXTURE_SWIZZLE
524 case LGL_INTENSITY: gl_type = GL_RED;
break;
526 case LGL_INTENSITY: gl_type = GL_INTENSITY;
break;
528 #ifdef GLVERTEX_TEXTURE_SWIZZLE
529 case LGL_LUMINANCE: gl_type = GL_RED;
break;
531 case LGL_LUMINANCE: gl_type = GL_LUMINANCE;
break;
533 #ifdef GLVERTEX_TEXTURE_SWIZZLE
534 case LGL_LUMINANCE_ALPHA: gl_type = GL_RG;
break;
536 case LGL_LUMINANCE_ALPHA: gl_type = GL_LUMINANCE_ALPHA;
break;
540 glGenTextures(1, &texid);
541 glBindTexture(GL_TEXTURE_3D, texid);
543 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
544 lglTexImage3D(GL_TEXTURE_3D, 0, gl_type, width, height, depth, 0, gl_type==GL_INTENSITY?GL_LUMINANCE:gl_type, GL_UNSIGNED_BYTE, data);
546 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
547 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
549 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_REPEAT);
550 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_REPEAT);
551 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_REPEAT);
553 #ifdef GLVERTEX_TEXTURE_SWIZZLE
554 if (gl_type == GL_RED)
556 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_R, GL_RED);
557 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_G, GL_RED);
558 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_B, GL_RED);
559 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_A, type==LGL_LUMINANCE?GL_ONE:GL_RED);
561 else if (gl_type == GL_RG)
563 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_R, GL_RED);
564 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_G, GL_RED);
565 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_B, GL_RED);
566 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_A, GL_GREEN);
570 glBindTexture(GL_TEXTURE_3D, 0);
584 #if !defined(LGL_GLES) || defined (LGL_GLES3)
586 if (width<1 || height<1 || depth<1)
588 lglError(
"invalid noise texture size");
594 float *data = glslnoise::perlinnoise::noise(width, height, depth);
602 glGenTextures(1, &texid);
603 glBindTexture(GL_TEXTURE_3D, texid);
605 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
606 #ifdef GLVERTEX_TEXTURE_SWIZZLE
607 lglTexImage3D(GL_TEXTURE_3D, 0, GL_RED, width, height, depth, 0, GL_RED, GL_FLOAT, data);
609 lglTexImage3D(GL_TEXTURE_3D, 0, GL_INTENSITY, width, height, depth, 0, GL_LUMINANCE, GL_FLOAT, data);
612 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
613 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
615 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_REPEAT);
616 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_REPEAT);
617 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_REPEAT);
619 #ifdef GLVERTEX_TEXTURE_SWIZZLE
620 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_R, GL_RED);
621 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_G, GL_RED);
622 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_B, GL_RED);
623 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_A, GL_RED);
626 glBindTexture(GL_TEXTURE_3D, 0);
642 GLuint GLtexid = texid;
643 if (texid > 0) glDeleteTextures(1, &GLtexid);
649 glBindTexture(GL_TEXTURE_2D, texid);
650 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, linear?GL_LINEAR:GL_NEAREST);
651 glBindTexture(GL_TEXTURE_2D, 0);
657 #if !defined(LGL_GLES) || defined (LGL_GLES3)
659 glBindTexture(GL_TEXTURE_3D, texid);
660 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, linear?GL_LINEAR:GL_NEAREST);
661 glBindTexture(GL_TEXTURE_3D, 0);
669 glBindTexture(GL_TEXTURE_2D, texid);
670 GLuint texmap_filter = linear?GL_LINEAR:GL_NEAREST;
671 GLuint mipmap_filter = linear?GL_LINEAR_MIPMAP_LINEAR:GL_NEAREST_MIPMAP_NEAREST;
672 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, mipmap?mipmap_filter:texmap_filter);
673 glBindTexture(GL_TEXTURE_2D, 0);
679 #if !defined(LGL_GLES) || defined (LGL_GLES3)
681 glBindTexture(GL_TEXTURE_3D, texid);
682 GLuint texmap_filter = linear?GL_LINEAR:GL_NEAREST;
683 GLuint mipmap_filter = linear?GL_LINEAR_MIPMAP_LINEAR:GL_NEAREST_MIPMAP_NEAREST;
684 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, mipmap?mipmap_filter:texmap_filter);
685 glBindTexture(GL_TEXTURE_3D, 0);
693 glBindTexture(GL_TEXTURE_2D, texid);
695 #ifndef GL_CLAMP_TO_EDGE
696 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, repeat?GL_REPEAT:GL_CLAMP);
697 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, repeat?GL_REPEAT:GL_CLAMP);
699 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, repeat?GL_REPEAT:GL_CLAMP_TO_EDGE);
700 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, repeat?GL_REPEAT:GL_CLAMP_TO_EDGE);
703 glBindTexture(GL_TEXTURE_2D, texid);
709 #if !defined(LGL_GLES) || defined (LGL_GLES3)
711 glBindTexture(GL_TEXTURE_3D, texid);
713 #ifndef GL_CLAMP_TO_EDGE
714 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, repeat?GL_REPEAT:GL_CLAMP);
715 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, repeat?GL_REPEAT:GL_CLAMP);
716 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, repeat?GL_REPEAT:GL_CLAMP);
718 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, repeat?GL_REPEAT:GL_CLAMP_TO_EDGE);
719 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, repeat?GL_REPEAT:GL_CLAMP_TO_EDGE);
720 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, repeat?GL_REPEAT:GL_CLAMP_TO_EDGE);
723 glBindTexture(GL_TEXTURE_3D, texid);
731 #ifdef GL_EXT_texture_filter_anisotropic
733 glBindTexture(GL_TEXTURE_2D, texid);
735 GLfloat maxaniso=1.0f;
736 if (ansiotropic) glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &maxaniso);
737 glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, &maxaniso);
739 glBindTexture(GL_TEXTURE_2D, texid);
747 #if !defined(LGL_GLES) || defined (LGL_GLES3)
749 #ifdef GL_EXT_texture_filter_anisotropic
751 glBindTexture(GL_TEXTURE_3D, texid);
753 GLfloat maxaniso=1.0f;
754 if (ansiotropic) glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &maxaniso);
755 glTexParameterfv(GL_TEXTURE_3D, GL_TEXTURE_MAX_ANISOTROPY_EXT, &maxaniso);
757 glBindTexture(GL_TEXTURE_3D, texid);
768 glGetIntegerv(GL_MAX_TEXTURE_SIZE, ¶m);