From 751aa6bbf1975f476cd724ba1f5b66c8af778057 Mon Sep 17 00:00:00 2001 From: Bradley Bell Date: Sat, 22 May 2004 22:24:32 +0000 Subject: [PATCH] add opengl replacement texture support (requires libpng and zlib) (d1x r1.42, r1.1, r1.10, r1.4, r1.1) --- ChangeLog | 5 ++++ arch/ogl/ogl.c | 67 ++++++++++++++++++++++++++++++++++++++++-------- main/piggy.c | 15 +++++++++-- main/piggy.h | 4 ++- misc/Makefile.am | 6 ++++- 5 files changed, 82 insertions(+), 15 deletions(-) diff --git a/ChangeLog b/ChangeLog index e83622cc..c2fb1ed0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 2004-05-22 Matthew Mueller + * arch/ogl/ogl.c, include/pngfile.h, main/piggy.c, main/piggy.h, + misc/Makefile.am, misc/pngfile.c: add opengl replacement texture + support (requires libpng and zlib) (d1x r1.42, r1.1, r1.10, r1.4, + r1.1) + * arch/ogl/gr.c, include/loadgl.h: fix win32 GL_NV_register_combiners build stuff (d1x r1.39, r1.7) diff --git a/arch/ogl/ogl.c b/arch/ogl/ogl.c index 5047dae6..e656a0a2 100644 --- a/arch/ogl/ogl.c +++ b/arch/ogl/ogl.c @@ -1,4 +1,4 @@ -/* $Id: ogl.c,v 1.29 2004-05-22 21:48:36 btb Exp $ */ +/* $Id: ogl.c,v 1.30 2004-05-22 22:24:24 btb Exp $ */ /* * * Graphics support functions for OpenGL. @@ -25,6 +25,7 @@ #endif #include #include +#include #include "3d.h" #include "piggy.h" @@ -34,6 +35,7 @@ #include "palette.h" #include "rle.h" #include "mono.h" +#include "pngfile.h" #include "segment.h" #include "textures.h" @@ -121,10 +123,10 @@ int ogl_texture_list_cur; #define OGLTEXBUFSIZE (2048*2048*4) extern GLubyte texbuf[OGLTEXBUFSIZE]; //void ogl_filltexbuf(unsigned char *data,GLubyte *texp,int width,int height,int twidth,int theight); -void ogl_filltexbuf(unsigned char *data, GLubyte *texp, int truewidth, int width, int height, int dxo, int dyo, int twidth, int theight, int type, int bm_flags); +void ogl_filltexbuf(unsigned char *data, GLubyte *texp, int truewidth, int width, int height, int dxo, int dyo, int twidth, int theight, int type, int bm_flags, int data_format); void ogl_loadbmtexture(grs_bitmap *bm); //void ogl_loadtexture(unsigned char * data, int width, int height,int dxo,intdyo , int *texid,float *u,float *v,char domipmap,float prio); -void ogl_loadtexture(unsigned char *data, int dxo, int dyo, ogl_texture *tex, int bm_flags); +void ogl_loadtexture(unsigned char *data, int dxo, int dyo, ogl_texture *tex, int bm_flags, int data_format); void ogl_freetexture(ogl_texture *gltexture); void ogl_do_palfx(void); @@ -1273,7 +1275,7 @@ bool ogl_ubitblt_i(int dw,int dh,int dx,int dy, int sw, int sh, int sx, int sy, // oldpal=ogl_pal; ogl_pal=gr_current_pal; - ogl_loadtexture(src->bm_data, sx, sy, &tex, src->bm_flags); + ogl_loadtexture(src->bm_data, sx, sy, &tex, src->bm_flags, 0); // ogl_pal=oldpal; ogl_pal=gr_palette; OGL_BINDTEXTURE(tex.handle); @@ -1558,7 +1560,8 @@ int pow2ize(int x){ //GLubyte texbuf[512*512*4]; GLubyte texbuf[OGLTEXBUFSIZE]; -void ogl_filltexbuf(unsigned char *data, GLubyte *texp, int truewidth, int width, int height, int dxo, int dyo, int twidth, int theight, int type, int bm_flags) + +void ogl_filltexbuf(unsigned char *data, GLubyte *texp, int truewidth, int width, int height, int dxo, int dyo, int twidth, int theight, int type, int bm_flags, int data_format) { // GLushort *tex=(GLushort *)texp; int x,y,c,i; @@ -1570,7 +1573,17 @@ void ogl_filltexbuf(unsigned char *data, GLubyte *texp, int truewidth, int width i=dxo+truewidth*(y+dyo); for (x=0;xv=(float)tex->h/(float)tex->th; #ifdef GL_EXT_paletted_texture - if (ogl_shared_palette_ok && (tex->format == GL_RGBA || tex->format == GL_RGB) && + if (ogl_shared_palette_ok && data_format == 0 && (tex->format == GL_RGBA || tex->format == GL_RGB) && !(tex->wantmip && GL_needmipmaps) // gluBuild2DMipmaps doesn't support paletted textures.. this could be worked around be generating our own mipmaps, but thats too much trouble at the moment. ) { @@ -1810,7 +1823,7 @@ void ogl_loadtexture(unsigned char *data, int dxo, int dyo, ogl_texture *tex, in // if (width!=twidth || height!=theight) // glmprintf((0,"sizing %ix%i texture up to %ix%i\n",width,height,twidth,theight)); - ogl_filltexbuf(data, texbuf, tex->lw, tex->w, tex->h, dxo, dyo, tex->tw, tex->th, tex->format, bm_flags); + ogl_filltexbuf(data, texbuf, tex->lw, tex->w, tex->h, dxo, dyo, tex->tw, tex->th, tex->format, bm_flags, data_format); // Generate OpenGL texture IDs. glGenTextures(1, &tex->handle); @@ -1858,10 +1871,42 @@ unsigned char decodebuf[512*512]; void ogl_loadbmtexture_f(grs_bitmap *bm, int flags) { unsigned char *buf; + char *bitmapname; + while (bm->bm_parent) bm=bm->bm_parent; + if (bm->gltexture && bm->gltexture->handle > 0) + return; buf=bm->bm_data; - if (bm->gltexture==NULL){ + if ((bitmapname = piggy_game_bitmap_name(bm))) + { + char filename[64]; + png_data pdata; + + sprintf(filename, "textures/%s.png", bitmapname); + if (read_png(filename, &pdata)) + { + printf("%s: %ux%ux%i p=%i(%i) c=%i a=%i chans=%i\n", filename, pdata.width, pdata.height, pdata.depth, pdata.paletted, pdata.num_palette, pdata.color, pdata.alpha, pdata.channels); + if (pdata.depth == 8 && pdata.color) + { + if (bm->gltexture == NULL) + ogl_init_texture(bm->gltexture = ogl_get_free_texture(), pdata.width, pdata.height, flags | ((pdata.alpha) ? OGL_FLAG_ALPHA : 0)); + ogl_loadtexture(pdata.data, 0, 0, bm->gltexture, bm->bm_flags, pdata.paletted ? 0 : pdata.channels); + free(pdata.data); + if (pdata.palette) + free(pdata.palette); + return; + } + else + { + printf("%s: unsupported texture format: must be rgb, rgba, or paletted, and depth 8\n", filename); + free(pdata.data); + if (pdata.palette) + free(pdata.palette); + } + } + } + if (bm->gltexture == NULL){ ogl_init_texture(bm->gltexture = ogl_get_free_texture(), bm->bm_w, bm->bm_h, flags | ((bm->bm_flags & BM_FLAG_TRANSPARENT) ? OGL_FLAG_ALPHA : 0)); } else { @@ -1895,7 +1940,7 @@ void ogl_loadbmtexture_f(grs_bitmap *bm, int flags) } buf=decodebuf; } - ogl_loadtexture(buf, 0, 0, bm->gltexture, bm->bm_flags); + ogl_loadtexture(buf, 0, 0, bm->gltexture, bm->bm_flags, 0); } void ogl_loadbmtexture(grs_bitmap *bm) diff --git a/main/piggy.c b/main/piggy.c index cf38c377..0581d37f 100644 --- a/main/piggy.c +++ b/main/piggy.c @@ -1,4 +1,4 @@ -/* $Id: piggy.c,v 1.51 2004-01-08 19:02:53 schaffner Exp $ */ +/* $Id: piggy.c,v 1.52 2004-05-22 22:24:28 btb Exp $ */ /* THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO @@ -386,7 +386,7 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED. #endif #ifdef RCS -static char rcsid[] = "$Id: piggy.c,v 1.51 2004-01-08 19:02:53 schaffner Exp $"; +static char rcsid[] = "$Id: piggy.c,v 1.52 2004-05-22 22:24:28 btb Exp $"; #endif @@ -610,6 +610,17 @@ void swap_0_255(grs_bitmap *bmp) } } +char* piggy_game_bitmap_name(grs_bitmap *bmp) +{ + if (bmp >= GameBitmaps && bmp < &GameBitmaps[MAX_BITMAP_FILES]) + { + int i = bmp-GameBitmaps; // i = (bmp - GameBitmaps) / sizeof(grs_bitmap); + Assert (bmp == &GameBitmaps[i] && i >= 0 && i < MAX_BITMAP_FILES); + return AllBitmaps[i].name; + } + return NULL; +} + bitmap_index piggy_register_bitmap( grs_bitmap * bmp, char * name, int in_file ) { bitmap_index temp; diff --git a/main/piggy.h b/main/piggy.h index 978232f9..4cee6ed3 100644 --- a/main/piggy.h +++ b/main/piggy.h @@ -1,4 +1,4 @@ -/* $Id: piggy.h,v 1.25 2003-11-04 21:33:30 btb Exp $ */ +/* $Id: piggy.h,v 1.26 2004-05-22 22:24:30 btb Exp $ */ /* THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO @@ -115,6 +115,8 @@ void piggy_read_sound_data(digi_sound *snd); void piggy_load_level_data(); +char* piggy_game_bitmap_name(grs_bitmap *bmp); + #define MAX_BITMAP_FILES 2620 // Upped for CD Enhanced #define MAX_SOUND_FILES MAX_SOUNDS diff --git a/misc/Makefile.am b/misc/Makefile.am index 86b0fcee..d408cae1 100644 --- a/misc/Makefile.am +++ b/misc/Makefile.am @@ -1,7 +1,11 @@ noinst_LIBRARIES = libmisc.a INCLUDES = -I $(top_srcdir)/include -libmisc_a_SOURCES = \ +if USE_OPENGL +PNG_SRCS = pngfile.c +endif + +libmisc_a_SOURCES = ${PNG_SRCS} \ args.c error.c strio.c \ d_io.c hash.c strutil.c -- 2.39.2