From 8d379f4f9c4096a2197cc07818f89315b58d880a Mon Sep 17 00:00:00 2001 From: Kp Date: Sun, 3 Mar 2013 01:03:33 +0000 Subject: [PATCH] Move */3d/interp.c -> similar/3d/interp.c --- SConstruct | 3 +- d1x-rebirth/3d/interp.c | 758 --------------------------- {d2x-rebirth => similar}/3d/interp.c | 40 +- 3 files changed, 33 insertions(+), 768 deletions(-) delete mode 100644 d1x-rebirth/3d/interp.c rename {d2x-rebirth => similar}/3d/interp.c (95%) diff --git a/SConstruct b/SConstruct index f97eb2c3a..11c087c59 100644 --- a/SConstruct +++ b/SConstruct @@ -371,6 +371,7 @@ class DXXProgram(DXXCommon): ] ], _apply_target_name) objects_similar_common = DXXCommon.create_lazy_object_property([os.path.join('similar', f) for f in [ +'3d/interp.c', 'arch/sdl/event.c', 'arch/sdl/init.c', 'arch/sdl/key.c', @@ -594,7 +595,6 @@ class D1XProgram(DXXProgram): '2d/font.c', '2d/palette.c', '2d/pcx.c', -'3d/interp.c', 'arch/sdl/digi.c', 'arch/sdl/digi_audio.c', 'iff/iff.c', @@ -689,7 +689,6 @@ class D2XProgram(DXXProgram): '2d/font.c', '2d/palette.c', '2d/pcx.c', -'3d/interp.c', 'arch/sdl/digi.c', 'arch/sdl/digi_audio.c', 'iff/iff.c', diff --git a/d1x-rebirth/3d/interp.c b/d1x-rebirth/3d/interp.c deleted file mode 100644 index 7a9de97b4..000000000 --- a/d1x-rebirth/3d/interp.c +++ /dev/null @@ -1,758 +0,0 @@ -/* -THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX -SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO -END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A -ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS -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. -COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED. -*/ - -/* - * - * Polygon object interpreter - * - */ - -#include -#include "dxxerror.h" - -#include "3d.h" -#include "common/3d/globvars.h" -#include "gr.h" -#include "byteswap.h" -#include "polyobj.h" - -#define OP_EOF 0 //eof -#define OP_DEFPOINTS 1 //defpoints -#define OP_FLATPOLY 2 //flat-shaded polygon -#define OP_TMAPPOLY 3 //texture-mapped polygon -#define OP_SORTNORM 4 //sort by normal -#define OP_RODBM 5 //rod bitmap -#define OP_SUBCALL 6 //call a subobject -#define OP_DEFP_START 7 //defpoints with start -#define OP_GLOW 8 //glow value for next poly - -#define N_OPCODES (sizeof(opcode_table) / sizeof(*opcode_table)) - -#define MAX_POINTS_PER_POLY 25 - -short highest_texture_num; -int g3d_interp_outline; - -g3s_point *Interp_point_list = NULL; - -#define MAX_INTERP_COLORS 100 - -//this is a table of mappings from RGB15 to palette colors -struct {short pal_entry,rgb15;} interp_color_table[MAX_INTERP_COLORS]; - -int n_interp_colors=0; - -//gives the interpreter an array of points to use -void g3_set_interp_points(g3s_point *pointlist) -{ - Interp_point_list = pointlist; -} - -#define w(p) (*((short *) (p))) -#define wp(p) ((short *) (p)) -#define fp(p) ((fix *) (p)) -#define vp(p) ((vms_vector *) (p)) - -void rotate_point_list(g3s_point *dest,vms_vector *src,int n) -{ - while (n--) - g3_rotate_point(dest++,src++); -} - -vms_angvec zero_angles = {0,0,0}; - -g3s_point *point_list[MAX_POINTS_PER_POLY]; - -int glow_num = -1; - -// check a polymodel for it's color and return it -int g3_poly_get_color(void *model_ptr) -{ - ubyte *p = model_ptr; - int color = 0; - - while (w(p) != OP_EOF) - switch (w(p)) { - case OP_DEFPOINTS: - p += w(p+2)*sizeof(struct vms_vector) + 4; - break; - case OP_DEFP_START: - p += w(p+2)*sizeof(struct vms_vector) + 8; - break; - case OP_FLATPOLY: { - int nv = w(p+2); - if (g3_check_normal_facing(vp(p+4),vp(p+16)) > 0) - color = (w(p+28)); - p += 30 + ((nv&~1)+1)*2; - break; - } - case OP_TMAPPOLY: { - int nv = w(p+2); - p += 30 + ((nv&~1)+1)*2 + nv*12; - break; - } - case OP_SORTNORM: - if (g3_check_normal_facing(vp(p+16),vp(p+4)) > 0) //facing - color = g3_poly_get_color(p+w(p+28)); - else //not facing - color = g3_poly_get_color(p+w(p+30)); - p += 32; - break; - case OP_RODBM: - p+=36; - break; - case OP_SUBCALL: - color = g3_poly_get_color(p+w(p+16)); - p += 20; - break; - case OP_GLOW: - p += 4; - break; - - default: - ; - } - return color; -} - -//calls the object interpreter to render an object. The object renderer -//is really a seperate pipeline. returns true if drew -bool g3_draw_polygon_model(void *model_ptr,grs_bitmap **model_bitmaps,vms_angvec *anim_angles,g3s_lrgb model_light,fix *glow_values) -{ - ubyte *p = model_ptr; - - glow_num = -1; //glow off by default - - while (w(p) != OP_EOF) - - switch (w(p)) { - - case OP_DEFPOINTS: { - int n = w(p+2); - - rotate_point_list(Interp_point_list,vp(p+4),n); - p += n*sizeof(struct vms_vector) + 4; - - break; - } - - case OP_DEFP_START: { - int n = w(p+2); - int s = w(p+4); - - rotate_point_list(&Interp_point_list[s],vp(p+8),n); - p += n*sizeof(struct vms_vector) + 8; - - break; - } - - case OP_FLATPOLY: { - int nv = w(p+2); - - Assert( nv < MAX_POINTS_PER_POLY ); - if (g3_check_normal_facing(vp(p+4),vp(p+16)) > 0) { - int i; - - gr_setcolor(w(p+28)); - - for (i=0;i 0) { - int i; - g3s_lrgb light, *lrgb_list; - - MALLOC(lrgb_list, g3s_lrgb, nv); - //calculate light from surface normal - if (glow_num < 0) //no glow - { - light.r = light.g = light.b = -vm_vec_dot(&View_matrix.fvec,vp(p+16)); - light.r = f1_0/4 + (light.r*3)/4; - light.r = fixmul(light.r,model_light.r); - light.g = f1_0/4 + (light.g*3)/4; - light.g = fixmul(light.g,model_light.g); - light.b = f1_0/4 + (light.b*3)/4; - light.b = fixmul(light.b,model_light.b); - } - else //yes glow - { - light.r = light.g = light.b = glow_values[glow_num]; - glow_num = -1; - } - - //now poke light into l values - uvl_list = (g3s_uvl *) (p+30+((nv&~1)+1)*2); - - for (i=0;i 0) { //facing - - //draw back then front - - g3_draw_polygon_model(p+w(p+30),model_bitmaps,anim_angles,model_light,glow_values); - g3_draw_polygon_model(p+w(p+28),model_bitmaps,anim_angles,model_light,glow_values); - - } - else { //not facing. draw front then back - - g3_draw_polygon_model(p+w(p+28),model_bitmaps,anim_angles,model_light,glow_values); - g3_draw_polygon_model(p+w(p+30),model_bitmaps,anim_angles,model_light,glow_values); - } - - p += 32; - - break; - - - case OP_RODBM: { - g3s_point rod_bot_p,rod_top_p; - g3s_lrgb rodbm_light = { f1_0, f1_0, f1_0 }; - - g3_rotate_point(&rod_bot_p,vp(p+20)); - g3_rotate_point(&rod_top_p,vp(p+4)); - - g3_draw_rod_tmap(model_bitmaps[w(p+2)],&rod_bot_p,w(p+16),&rod_top_p,w(p+32),rodbm_light); - - p+=36; - break; - } - - case OP_SUBCALL: { - vms_angvec *a; - - if (anim_angles) - a = &anim_angles[w(p+2)]; - else - a = &zero_angles; - - g3_start_instance_angles(vp(p+4),a); - - g3_draw_polygon_model(p+w(p+16),model_bitmaps,anim_angles,model_light,glow_values); - - g3_done_instance(); - - p += 20; - - break; - - } - - case OP_GLOW: - - if (glow_values) - glow_num = w(p+2); - p += 4; - break; - - default: - ; - } - return 1; -} - -#ifndef NDEBUG -int nest_count; -#endif - -//alternate interpreter for morphing object -bool g3_draw_morphing_model(void *model_ptr,grs_bitmap **model_bitmaps,vms_angvec *anim_angles,g3s_lrgb model_light,vms_vector *new_points) -{ - ubyte *p = model_ptr; - fix *glow_values = NULL; - - glow_num = -1; //glow off by default - - while (w(p) != OP_EOF) - - switch (w(p)) { - - case OP_DEFPOINTS: { - int n = w(p+2); - - rotate_point_list(Interp_point_list,new_points,n); - p += n*sizeof(struct vms_vector) + 4; - - break; - } - - case OP_DEFP_START: { - int n = w(p+2); - int s = w(p+4); - - rotate_point_list(&Interp_point_list[s],new_points,n); - p += n*sizeof(struct vms_vector) + 8; - - break; - } - - case OP_FLATPOLY: { - int nv = w(p+2); - int i,ntris; - - gr_setcolor(55/*w(p+28)*/); - - for (i=0;i<2;i++) - point_list[i] = Interp_point_list + wp(p+30)[i]; - - for (ntris=nv-2;ntris;ntris--) { - - point_list[2] = Interp_point_list + wp(p+30)[i++]; - - g3_check_and_draw_poly(3,point_list,NULL,NULL); - - point_list[1] = point_list[2]; - - } - - p += 30 + ((nv&~1)+1)*2; - - break; - } - - case OP_TMAPPOLY: { - int nv = w(p+2); - g3s_uvl *uvl_list; - g3s_lrgb light, *lrgb_list; - g3s_uvl morph_uvls[3]; - int i,ntris; - - MALLOC(lrgb_list, g3s_lrgb, nv); - - //calculate light from surface normal - if (glow_num < 0) //no glow - { - light.r = light.g = light.b = -vm_vec_dot(&View_matrix.fvec,vp(p+16)); - light.r = f1_0/4 + (light.r*3)/4; - light.r = fixmul(light.r,model_light.r); - light.g = f1_0/4 + (light.g*3)/4; - light.g = fixmul(light.g,model_light.g); - light.b = f1_0/4 + (light.b*3)/4; - light.b = fixmul(light.b,model_light.b); - } - else //yes glow - { - light.r = light.g = light.b = glow_values[glow_num]; - glow_num = -1; - } - - //now poke light into l values - uvl_list = (g3s_uvl *) (p+30+((nv&~1)+1)*2); - - for (i=0;i 0) { //facing - - //draw back then front - - g3_draw_morphing_model(p+w(p+30),model_bitmaps,anim_angles,model_light,new_points); - g3_draw_morphing_model(p+w(p+28),model_bitmaps,anim_angles,model_light,new_points); - - } - else { //not facing. draw front then back - - g3_draw_morphing_model(p+w(p+28),model_bitmaps,anim_angles,model_light,new_points); - g3_draw_morphing_model(p+w(p+30),model_bitmaps,anim_angles,model_light,new_points); - } - - p += 32; - - break; - - - case OP_RODBM: { - g3s_point rod_bot_p,rod_top_p; - g3s_lrgb rodbm_light = { f1_0, f1_0, f1_0 }; - - g3_rotate_point(&rod_bot_p,vp(p+20)); - g3_rotate_point(&rod_top_p,vp(p+4)); - - g3_draw_rod_tmap(model_bitmaps[w(p+2)],&rod_bot_p,w(p+16),&rod_top_p,w(p+32),rodbm_light); - - p+=36; - break; - } - - case OP_SUBCALL: { - vms_angvec *a; - - if (anim_angles) - a = &anim_angles[w(p+2)]; - else - a = &zero_angles; - - g3_start_instance_angles(vp(p+4),a); - - g3_draw_polygon_model(p+w(p+16),model_bitmaps,anim_angles,model_light,glow_values); - - g3_done_instance(); - - p += 20; - - break; - - } - - case OP_GLOW: - - if (glow_values) - glow_num = w(p+2); - p += 4; - break; - } - - return 1; -} - -void init_model_sub(ubyte *p) -{ - Assert(++nest_count < 1000); - - while (w(p) != OP_EOF) { - - switch (w(p)) { - - case OP_DEFPOINTS: { - int n = w(p+2); - p += n*sizeof(struct vms_vector) + 4; - break; - } - - case OP_DEFP_START: { - int n = w(p+2); - p += n*sizeof(struct vms_vector) + 8; - break; - } - - case OP_FLATPOLY: { - int nv = w(p+2); - - Assert(nv > 2); //must have 3 or more points - - *wp(p+28) = (short)gr_find_closest_color_15bpp(w(p+28)); - - p += 30 + ((nv&~1)+1)*2; - - break; - } - - case OP_TMAPPOLY: { - int nv = w(p+2); - - Assert(nv > 2); //must have 3 or more points - - if (w(p+28) > highest_texture_num) - highest_texture_num = w(p+28); - - p += 30 + ((nv&~1)+1)*2 + nv*12; - - break; - } - - case OP_SORTNORM: - - init_model_sub(p+w(p+28)); - init_model_sub(p+w(p+30)); - p += 32; - - break; - - - case OP_RODBM: - p += 36; - break; - - - case OP_SUBCALL: { - init_model_sub(p+w(p+16)); - p += 20; - break; - - } - - case OP_GLOW: - p += 4; - break; - } - } -} - -//init code for bitmap models -void g3_init_polygon_model(void *model_ptr) -{ - #ifndef NDEBUG - nest_count = 0; - #endif - - highest_texture_num = -1; - - init_model_sub((ubyte *) model_ptr); -} - -#ifdef WORDS_BIGENDIAN -void short_swap(short *s) -{ - *s = SWAPSHORT(*s); -} - -void fix_swap(fix *f) -{ - *f = (fix)SWAPINT((int)*f); -} - -void vms_vector_swap(vms_vector *v) -{ - fix_swap(fp(&v->x)); - fix_swap(fp(&v->y)); - fix_swap(fp(&v->z)); -} - -void fixang_swap(fixang *f) -{ - *f = (fixang)SWAPSHORT((short)*f); -} - -void vms_angvec_swap(vms_angvec *v) -{ - fixang_swap(&v->p); - fixang_swap(&v->b); - fixang_swap(&v->h); -} - -void swap_polygon_model_data(ubyte *data) -{ - int i; - short n; - g3s_uvl *uvl_val; - ubyte *p = data; - - short_swap(wp(p)); - - while (w(p) != OP_EOF) { - switch (w(p)) { - case OP_DEFPOINTS: - short_swap(wp(p + 2)); - n = w(p+2); - for (i = 0; i < n; i++) - vms_vector_swap(vp((p + 4) + (i * sizeof(vms_vector)))); - p += n*sizeof(struct vms_vector) + 4; - break; - - case OP_DEFP_START: - short_swap(wp(p + 2)); - short_swap(wp(p + 4)); - n = w(p+2); - for (i = 0; i < n; i++) - vms_vector_swap(vp((p + 8) + (i * sizeof(vms_vector)))); - p += n*sizeof(struct vms_vector) + 8; - break; - - case OP_FLATPOLY: - short_swap(wp(p+2)); - n = w(p+2); - vms_vector_swap(vp(p + 4)); - vms_vector_swap(vp(p + 16)); - short_swap(wp(p+28)); - for (i=0; i < n; i++) - short_swap(wp(p + 30 + (i * 2))); - p += 30 + ((n&~1)+1)*2; - break; - - case OP_TMAPPOLY: - short_swap(wp(p+2)); - n = w(p+2); - vms_vector_swap(vp(p + 4)); - vms_vector_swap(vp(p + 16)); - for (i=0;iu); - fix_swap(&uvl_val->v); - } - short_swap(wp(p+28)); - for (i=0;i 0) { +#if defined(DXX_BUILD_DESCENT_I) + color = (w(p+28)); +#elif defined(DXX_BUILD_DESCENT_II) #ifdef FADE_FLATPOLY short c; unsigned char cc; @@ -338,6 +341,7 @@ int g3_poly_get_color(void *model_ptr) else if (l>32) l = 32; cc = gr_find_closest_color_15bpp(w(p+28)); color = gr_fade_table[(l<<8)|cc]; +#endif #endif } p += 30 + ((nv&~1)+1)*2; @@ -349,7 +353,6 @@ int g3_poly_get_color(void *model_ptr) break; } case OP_SORTNORM: - if (g3_check_normal_facing(vp(p+16),vp(p+4)) > 0) //facing color = g3_poly_get_color(p+w(p+28)); else //not facing @@ -360,6 +363,9 @@ int g3_poly_get_color(void *model_ptr) p+=36; break; case OP_SUBCALL: +#if defined(DXX_BUILD_DESCENT_I) + color = g3_poly_get_color(p+w(p+16)); +#endif p += 20; break; case OP_GLOW: @@ -367,7 +373,11 @@ int g3_poly_get_color(void *model_ptr) break; default: +#if defined(DXX_BUILD_DESCENT_I) + ; +#elif defined(DXX_BUILD_DESCENT_II) Error("invalid polygon model\n"); +#endif } return color; } @@ -409,15 +419,16 @@ bool g3_draw_polygon_model(void *model_ptr,grs_bitmap **model_bitmaps,vms_angvec Assert( nv < MAX_POINTS_PER_POLY ); if (g3_check_normal_facing(vp(p+4),vp(p+16)) > 0) { int i; + +// DPH: Now we treat this color as 15bpp +#if defined(DXX_BUILD_DESCENT_I) + gr_setcolor(w(p+28)); +#elif defined(DXX_BUILD_DESCENT_II) #ifdef FADE_FLATPOLY short c; unsigned char cc; int l; #endif - -// DPH: Now we treat this color as 15bpp -// gr_setcolor(w(p+28)); - #ifndef FADE_FLATPOLY gr_setcolor(gr_find_closest_color_15bpp(w(p + 28))); #else @@ -428,6 +439,7 @@ bool g3_draw_polygon_model(void *model_ptr,grs_bitmap **model_bitmaps,vms_angvec cc = gr_find_closest_color_15bpp(w(p+28)); c = gr_fade_table[(l<<8)|cc]; gr_setcolor(c); +#endif #endif for (i=0;i 2); //must have 3 or more points -// *wp(p+28) = (short)gr_find_closest_color_15bpp(w(p+28)); +#if defined(DXX_BUILD_DESCENT_I) + *wp(p+28) = (short)gr_find_closest_color_15bpp(w(p+28)); +#endif p += 30 + ((nv&~1)+1)*2; @@ -818,8 +840,10 @@ void init_model_sub(ubyte *p) case OP_GLOW: p += 4; break; +#if defined(DXX_BUILD_DESCENT_II) default: Error("invalid polygon model\n"); +#endif } } }