From 2cc21d710ae651594d8d9c71a011137742ebd18c Mon Sep 17 00:00:00 2001 From: Bradley Bell Date: Thu, 8 Aug 2002 09:09:43 +0000 Subject: [PATCH] enable loading of exit models for other than d2demo --- main/bm.c | 85 +++++++++++++++++++++++++++++++++++++------------ main/bm.h | 8 ++--- main/endlevel.c | 10 +++--- main/polyobj.c | 35 +++++++++++--------- 4 files changed, 94 insertions(+), 44 deletions(-) diff --git a/main/bm.c b/main/bm.c index 87690caa..a45cf095 100644 --- a/main/bm.c +++ b/main/bm.c @@ -1,4 +1,4 @@ -/* $Id: bm.c,v 1.14 2002-08-06 04:53:48 btb Exp $ */ +/* $Id: bm.c,v 1.15 2002-08-08 09:09:43 btb Exp $ */ /* THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO @@ -80,19 +80,20 @@ int Marker_model_num = -1; player_ship only_player_ship,*Player_ship=&only_player_ship; //----------------- Miscellaneous bitmap pointers --------------- -int Num_cockpits = 0; -bitmap_index cockpit_bitmap[N_COCKPIT_BITMAPS]; +int Num_cockpits = 0; +bitmap_index cockpit_bitmap[N_COCKPIT_BITMAPS]; //---------------- Variables for wall textures ------------------ -int Num_tmaps; -tmap_info TmapInfo[MAX_TEXTURES]; +int Num_tmaps; +tmap_info TmapInfo[MAX_TEXTURES]; //---------------- Variables for object textures ---------------- -int First_multi_bitmap_num=-1; +int First_multi_bitmap_num=-1; -bitmap_index ObjBitmaps[MAX_OBJ_BITMAPS]; -ushort ObjBitmapPtrs[MAX_OBJ_BITMAPS]; // These point back into ObjBitmaps, since some are used twice. +int N_ObjBitmaps; +bitmap_index ObjBitmaps[MAX_OBJ_BITMAPS]; +ushort ObjBitmapPtrs[MAX_OBJ_BITMAPS]; // These point back into ObjBitmaps, since some are used twice. #ifdef FAST_FILE_IO #define tmap_info_read_n(ti, n, fp) cfread(ti, sizeof(tmap_info), n, fp) @@ -120,21 +121,19 @@ int tmap_info_read_n(tmap_info *ti, int n, CFILE *fp) } #endif -//#ifdef MACINTOSH - -extern int exit_modelnum,destroyed_exit_modelnum, Num_bitmap_files; -int N_ObjBitmaps, extra_bitmap_num; +extern int Num_bitmap_files; +int extra_bitmap_num; bitmap_index exitmodel_bm_load_sub( char * filename ) { bitmap_index bitmap_num; - grs_bitmap * new; + grs_bitmap * new = &GameBitmaps[extra_bitmap_num]; ubyte newpal[256*3]; int iff_error; //reference parm to avoid warning message bitmap_num.index = 0; - MALLOC( new, grs_bitmap, 1 ); + //MALLOC( new, grs_bitmap, 1 ); iff_error = iff_read_bitmap(filename,new,BM_LINEAR,newpal); new->bm_handle=0; if (iff_error != IFF_NO_ERROR) { @@ -152,7 +151,7 @@ bitmap_index exitmodel_bm_load_sub( char * filename ) GameBitmaps[extra_bitmap_num++] = *new; - d_free( new ); + //d_free( new ); return bitmap_num; } @@ -171,11 +170,43 @@ grs_bitmap *load_exit_model_bitmap(char *name) } } +void +free_exit_model_data() +{ + int i; + + for (i = Num_bitmap_files; i < extra_bitmap_num; i++) + d_free(GameBitmaps[i].bm_data); + extra_bitmap_num = Num_bitmap_files; +} + +#define EXIT_POF + +#ifdef OGL +void ogl_cache_polymodel_textures(int model_num); +#endif + void load_exit_models() { +#ifndef EXIT_POF CFILE *exit_hamfile; +#endif int start_num; + if (!cfexist("steel1.bbm") || + !cfexist("rbot061.bbm") || + !cfexist("rbot062.bbm") || + !cfexist("rbot063.bbm") || +#ifdef EXIT_POF + !cfexist("exit01.pof") || + !cfexist("exit01d.pof")) { +#else + !cfexist("exit.ham")) { +#endif + Warning("Can't load exit models!\n"); + return; + } + start_num = N_ObjBitmaps; extra_bitmap_num = Num_bitmap_files; load_exit_model_bitmap("steel1.bbm"); @@ -186,14 +217,19 @@ void load_exit_models() load_exit_model_bitmap("rbot061.bbm"); load_exit_model_bitmap("rbot063.bbm"); +#ifndef EXIT_POF + +#ifndef MACINTOSH + exit_hamfile = cfopen("exit.ham","rb"); +#else exit_hamfile = cfopen(":Data:exit.ham","rb"); +#endif exit_modelnum = N_polygon_models++; destroyed_exit_modelnum = N_polygon_models++; - polymodel_read(&Polygon_models[exit_modelnum], exit_hamfile); polymodel_read(&Polygon_models[destroyed_exit_modelnum], exit_hamfile); -#ifdef MACINTOSH //not sure what these are for +#ifdef MACINTOSH //not sure why this is #ifdef'd Polygon_models[exit_modelnum].first_texture = start_num; Polygon_models[destroyed_exit_modelnum].first_texture = start_num+3; #endif @@ -213,12 +249,21 @@ void load_exit_models() swap_polygon_model_data(Polygon_models[destroyed_exit_modelnum].model_data); #endif g3_init_polygon_model(Polygon_models[destroyed_exit_modelnum].model_data); - cfclose(exit_hamfile); +#else // EXIT_POF + + exit_modelnum = load_polygon_model("exit01.pof", 3, start_num, NULL); + destroyed_exit_modelnum = load_polygon_model("exit01d.pof", 3, start_num + 3, NULL); + +#ifdef OGL + ogl_cache_polymodel_textures(exit_modelnum); + ogl_cache_polymodel_textures(destroyed_exit_modelnum); +#endif + +#endif } -//#endif // MACINTOSH //----------------------------------------------------------------- // Read data from piggy. @@ -335,7 +380,7 @@ void bm_read_all(CFILE * fp) #define N_D2_OBJBITMAPPTRS 502 #define N_D2_WEAPON_TYPES 62 -//type==1 means 1.1, type==2 means 1.2 (with weaons) +//type==1 means 1.1, type==2 means 1.2 (with weapons) void bm_read_extra_robots(char *fname,int type) { CFILE *fp; diff --git a/main/bm.h b/main/bm.h index a88891e0..095e0b96 100644 --- a/main/bm.h +++ b/main/bm.h @@ -84,11 +84,8 @@ extern byte ObjType[MAX_OBJTYPE]; // Type of an object, such as Robot, eg if Ob extern byte ObjId[MAX_OBJTYPE]; // ID of a robot, within its class, eg if ObjType[11] == 3, then object #11 is the third robot extern fix ObjStrength[MAX_OBJTYPE]; // initial strength of each object -#if defined(MACINTOSH) && defined(SHAREWARE) #define MAX_OBJ_BITMAPS 610 -#else -#define MAX_OBJ_BITMAPS 600 -#endif + extern bitmap_index ObjBitmaps[MAX_OBJ_BITMAPS]; extern ushort ObjBitmapPtrs[MAX_OBJ_BITMAPS]; extern int First_multi_bitmap_num; @@ -98,5 +95,8 @@ int bm_init_use_tbl(void); extern void bm_read_all(CFILE * fp); +void load_exit_models(); +void free_exit_model_data(); + #endif diff --git a/main/endlevel.c b/main/endlevel.c index 80f5b677..945473d9 100644 --- a/main/endlevel.c +++ b/main/endlevel.c @@ -8,7 +8,7 @@ IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS -AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE. +AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE. COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED. */ @@ -17,7 +17,7 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED. #endif #ifdef RCS -static char rcsid[] = "$Id: endlevel.c,v 1.8 2002-08-06 05:06:38 btb Exp $"; +static char rcsid[] = "$Id: endlevel.c,v 1.9 2002-08-08 09:09:43 btb Exp $"; #endif //#define SLEW_ON 1 @@ -257,6 +257,8 @@ free_endlevel_data() if (satellite_bm_instance.bm_data) d_free(satellite_bm_instance.bm_data); + + free_exit_model_data(); } void init_endlevel() @@ -303,14 +305,12 @@ void start_endlevel_sequence() { int i; int movie_played = MOVIE_NOT_PLAYED; - #if defined(MACINTOSH) && defined(SHAREWARE) static int inited = 0; - if (!inited) { + if (!inited && Piggy_hamfile_version >= 3) { load_exit_models(); inited = 1; } - #endif if (Newdemo_state == ND_STATE_RECORDING) // stop demo recording Newdemo_state = ND_STATE_PAUSED; diff --git a/main/polyobj.c b/main/polyobj.c index 98f7bc89..8f2ba2e9 100644 --- a/main/polyobj.c +++ b/main/polyobj.c @@ -1,4 +1,4 @@ -/* $Id: polyobj.c,v 1.7 2002-08-06 05:13:58 btb Exp $ */ +/* $Id: polyobj.c,v 1.8 2002-08-08 09:09:43 btb Exp $ */ /* THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO @@ -17,7 +17,7 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED. #endif #ifdef RCS -static char rcsid[] = "$Id: polyobj.c,v 1.7 2002-08-06 05:13:58 btb Exp $"; +static char rcsid[] = "$Id: polyobj.c,v 1.8 2002-08-08 09:09:43 btb Exp $"; #endif #include @@ -173,6 +173,8 @@ vms_angvec anim_angs[N_ANIM_STATES][MAX_SUBMODELS]; void robot_set_angles(robot_info *r,polymodel *pm,vms_angvec angs[N_ANIM_STATES][MAX_SUBMODELS]); #endif +#define DEBUG_LEVEL CON_NORMAL + //reads a binary file containing a 3d model polymodel *read_model_file(polymodel *pm,char *filename,robot_info *r) { @@ -181,7 +183,10 @@ polymodel *read_model_file(polymodel *pm,char *filename,robot_info *r) int id,len, next_chunk; int anim_flag = 0; ubyte *model_buf; - + +#ifdef WORDS_BIGENDIAN + Error("read_model_file(): This function is not bigendian-friendly!\n"); +#endif model_buf = (ubyte *)d_malloc( MODEL_BUF_SIZE * sizeof(ubyte) ); if (!model_buf) Error("Can't allocate space to read model %s\n", filename); @@ -219,7 +224,7 @@ polymodel *read_model_file(polymodel *pm,char *filename,robot_info *r) case ID_OHDR: { //Object header vms_vector pmmin,pmmax; - //mprintf(0,"Got chunk OHDR, len=%d\n",len); + //con_printf(DEBUG_LEVEL, "Got chunk OHDR, len=%d\n",len); pm->n_models = pof_read_int(model_buf); pm->rad = pof_read_int(model_buf); @@ -249,7 +254,7 @@ polymodel *read_model_file(polymodel *pm,char *filename,robot_info *r) anim_flag++; - //mprintf(0,"Got chunk SOBJ, len=%d\n",len); + //con_printf(DEBUG_LEVEL, "Got chunk SOBJ, len=%d\n",len); n = pof_read_short(model_buf); @@ -272,7 +277,7 @@ polymodel *read_model_file(polymodel *pm,char *filename,robot_info *r) #ifndef DRIVE case ID_GUNS: { //List of guns on this object - //mprintf(0,"Got chunk GUNS, len=%d\n",len); + //con_printf(DEBUG_LEVEL, "Got chunk GUNS, len=%d\n",len); if (r) { int i; @@ -311,7 +316,7 @@ polymodel *read_model_file(polymodel *pm,char *filename,robot_info *r) } case ID_ANIM: //Animation data - //mprintf(0,"Got chunk ANIM, len=%d\n",len); + //con_printf(DEBUG_LEVEL, "Got chunk ANIM, len=%d\n",len); anim_flag++; @@ -339,30 +344,30 @@ polymodel *read_model_file(polymodel *pm,char *filename,robot_info *r) int n; char name_buf[128]; - //mprintf(0,"Got chunk TXTR, len=%d\n",len); + //con_printf(DEBUG_LEVEL, "Got chunk TXTR, len=%d\n",len); n = pof_read_short(model_buf); - //mprintf(0," num textures = %d\n",n); + //con_printf(DEBUG_LEVEL, " num textures = %d\n",n); while (n--) { pof_read_string(name_buf,128,model_buf); - //mprintf(0,"<%s>\n",name_buf); + //con_printf(DEBUG_LEVEL, "<%s>\n",name_buf); } break; } case ID_IDTA: //Interpreter data - //mprintf(0,"Got chunk IDTA, len=%d\n",len); + //con_printf(DEBUG_LEVEL, "Got chunk IDTA, len=%d\n",len); pm->model_data = d_malloc(len); pm->model_data_size = len; - + pof_cfread(pm->model_data,1,len,model_buf); - + break; default: - //mprintf(0,"Unknown chunk <%c%c%c%c>, len = %d\n",id,id>>8,id>>16,id>>24,len); + //con_printf(DEBUG_LEVEL, "Unknown chunk <%c%c%c%c>, len = %d\n",id,id>>8,id>>16,id>>24,len); pof_cfseek(model_buf,len,SEEK_CUR); break; @@ -432,7 +437,7 @@ int read_model_guns(char *filename,vms_vector *gun_points, vms_vector *gun_dirs, if (id == ID_GUNS) { //List of guns on this object - //mprintf(0,"Got chunk GUNS, len=%d\n",len); + //con_printf(DEBUG_LEVEL, "Got chunk GUNS, len=%d\n",len); int i; -- 2.39.2