Make object.c more like D2X

This commit is contained in:
Kp 2013-06-23 17:41:46 +00:00
parent 77d8b25d9c
commit aebbab3325

View file

@ -240,16 +240,15 @@ extern fix Max_thrust;
#define CLOAK_FADEIN_DURATION_ROBOT F1_0
#define CLOAK_FADEOUT_DURATION_ROBOT F1_0
fix Cloak_fadein_duration;
fix Cloak_fadeout_duration;
//do special cloaked render
void draw_cloaked_object(object *obj,g3s_lrgb light,fix *glow,fix64 cloak_start_time,fix64 cloak_end_time,bitmap_index * alt_textures)
static void draw_cloaked_object(object *obj,g3s_lrgb light,fix *glow,fix64 cloak_start_time,fix64 cloak_end_time)
{
fix cloak_delta_time,total_cloaked_time;
fix light_scale=F1_0;
int cloak_value=0;
int fading=0; //if true, fading, else cloaking
fix Cloak_fadein_duration=0;
fix Cloak_fadeout_duration=0;
total_cloaked_time = cloak_end_time-cloak_start_time;
@ -307,6 +306,10 @@ void draw_cloaked_object(object *obj,g3s_lrgb light,fix *glow,fix64 cloak_start_
fading = 1;
}
bitmap_index * alt_textures = NULL;
if ( obj->rtype.pobj_info.alt_textures > 0 )
alt_textures = multi_player_textures[obj->rtype.pobj_info.alt_textures-1];
if (fading) {
fix new_glow;
@ -316,12 +319,24 @@ void draw_cloaked_object(object *obj,g3s_lrgb light,fix *glow,fix64 cloak_start_
new_light.g = fixmul(light.g,light_scale);
new_light.b = fixmul(light.b,light_scale);
new_glow = fixmul(*glow,light_scale);
draw_polygon_model(&obj->pos,&obj->orient,obj->rtype.pobj_info.anim_angles,obj->rtype.pobj_info.model_num,obj->rtype.pobj_info.subobj_flags,new_light,&new_glow, alt_textures );
draw_polygon_model(&obj->pos,
&obj->orient,
obj->rtype.pobj_info.anim_angles,
obj->rtype.pobj_info.model_num,obj->rtype.pobj_info.subobj_flags,
new_light,
&new_glow,
alt_textures );
}
else {
gr_settransblend(cloak_value, GR_BLEND_NORMAL);
g3_set_special_render(draw_tmap_flat,NULL,NULL); //use special flat drawer
draw_polygon_model(&obj->pos,&obj->orient,obj->rtype.pobj_info.anim_angles,obj->rtype.pobj_info.model_num,obj->rtype.pobj_info.subobj_flags,light,glow, alt_textures );
draw_polygon_model(&obj->pos,
&obj->orient,
obj->rtype.pobj_info.anim_angles,
obj->rtype.pobj_info.model_num,obj->rtype.pobj_info.subobj_flags,
light,
glow,
alt_textures );
g3_set_special_render(NULL,NULL,NULL);
gr_settransblend(GR_FADE_OFF, GR_BLEND_NORMAL);
}
@ -333,7 +348,7 @@ void draw_polygon_object(object *obj)
{
g3s_lrgb light;
int imsave;
fix engine_glow_value;
fix engine_glow_value[1];
light = compute_object_light(obj,NULL);
@ -349,16 +364,16 @@ void draw_polygon_object(object *obj)
Interpolation_method = 1;
//set engine glow value
engine_glow_value = f1_0/5;
engine_glow_value[0] = f1_0/5;
if (obj->movement_type == MT_PHYSICS) {
if (obj->mtype.phys_info.flags & PF_USES_THRUST && obj->type==OBJ_PLAYER && obj->id==Player_num) {
fix thrust_mag = vm_vec_mag_quick(&obj->mtype.phys_info.thrust);
engine_glow_value += (fixdiv(thrust_mag,Player_ship->max_thrust)*4)/5;
engine_glow_value[0] += (fixdiv(thrust_mag,Player_ship->max_thrust)*4)/5;
}
else {
fix speed = vm_vec_mag_quick(&obj->mtype.phys_info.velocity);
engine_glow_value += (fixdiv(speed,MAX_VELOCITY)*4)/5;
engine_glow_value[0] += (fixdiv(speed,MAX_VELOCITY)*4)/5;
}
}
@ -373,39 +388,63 @@ void draw_polygon_object(object *obj)
for (i=0;i<pm->n_textures;i++)
bm_ptrs[i] = Textures[obj->rtype.pobj_info.tmap_override];
draw_polygon_model(&obj->pos,&obj->orient,obj->rtype.pobj_info.anim_angles,obj->rtype.pobj_info.model_num,obj->rtype.pobj_info.subobj_flags,light,&engine_glow_value,bm_ptrs);
draw_polygon_model(&obj->pos,
&obj->orient,
obj->rtype.pobj_info.anim_angles,
obj->rtype.pobj_info.model_num,
obj->rtype.pobj_info.subobj_flags,
light,
engine_glow_value,
bm_ptrs);
}
else {
bitmap_index * alt_textures = NULL;
#ifdef NETWORK
if ( obj->rtype.pobj_info.alt_textures > 0 )
alt_textures = multi_player_textures[obj->rtype.pobj_info.alt_textures-1];
#endif
if (obj->type==OBJ_PLAYER && (Players[obj->id].flags&PLAYER_FLAGS_CLOAKED))
draw_cloaked_object(obj,light,&engine_glow_value,Players[obj->id].cloak_time,Players[obj->id].cloak_time+CLOAK_TIME_MAX,alt_textures);
draw_cloaked_object(obj,light,engine_glow_value,Players[obj->id].cloak_time,Players[obj->id].cloak_time+CLOAK_TIME_MAX);
else if ((obj->type == OBJ_ROBOT) && (obj->ctype.ai_info.CLOAKED)) {
if (Robot_info[obj->id].boss_flag)
draw_cloaked_object(obj,light,&engine_glow_value, Boss_cloak_start_time, Boss_cloak_end_time,alt_textures);
draw_cloaked_object(obj,light,engine_glow_value, Boss_cloak_start_time, Boss_cloak_end_time);
else
draw_cloaked_object(obj,light,&engine_glow_value, GameTime64-F1_0*10, GameTime64+F1_0*10,alt_textures);
draw_cloaked_object(obj,light,engine_glow_value, GameTime64-F1_0*10, GameTime64+F1_0*10);
} else {
bitmap_index * alt_textures = NULL;
if ( obj->rtype.pobj_info.alt_textures > 0 )
alt_textures = multi_player_textures[obj->rtype.pobj_info.alt_textures-1];
if (obj->type == OBJ_WEAPON && (Weapon_info[obj->id].model_num_inner > -1 )) {
fix dist_to_eye = vm_vec_dist_quick(&Viewer->pos, &obj->pos);
gr_settransblend(GR_FADE_OFF, GR_BLEND_ADDITIVE_A);
if (dist_to_eye < Simple_model_threshhold_scale * F1_0*2)
draw_polygon_model(&obj->pos,&obj->orient,obj->rtype.pobj_info.anim_angles,Weapon_info[obj->id].model_num_inner,obj->rtype.pobj_info.subobj_flags,light,&engine_glow_value,alt_textures);
draw_polygon_model(&obj->pos,
&obj->orient,
obj->rtype.pobj_info.anim_angles,
Weapon_info[obj->id].model_num_inner,
obj->rtype.pobj_info.subobj_flags,
light,
engine_glow_value,
alt_textures);
}
draw_polygon_model(&obj->pos,&obj->orient,obj->rtype.pobj_info.anim_angles,obj->rtype.pobj_info.model_num,obj->rtype.pobj_info.subobj_flags,light,&engine_glow_value,alt_textures);
draw_polygon_model(&obj->pos,
&obj->orient,
obj->rtype.pobj_info.anim_angles,obj->rtype.pobj_info.model_num,
obj->rtype.pobj_info.subobj_flags,
light,
engine_glow_value,
alt_textures);
#ifndef OGL // in software rendering must draw inner model last
if (obj->type == OBJ_WEAPON && (Weapon_info[obj->id].model_num_inner > -1 )) {
fix dist_to_eye = vm_vec_dist_quick(&Viewer->pos, &obj->pos);
gr_settransblend(GR_FADE_OFF, GR_BLEND_ADDITIVE_A);
if (dist_to_eye < Simple_model_threshhold_scale * F1_0*2)
draw_polygon_model(&obj->pos,&obj->orient,obj->rtype.pobj_info.anim_angles,Weapon_info[obj->id].model_num_inner,obj->rtype.pobj_info.subobj_flags,light,&engine_glow_value,alt_textures);
draw_polygon_model(&obj->pos,
&obj->orient,
obj->rtype.pobj_info.anim_angles,
Weapon_info[obj->id].model_num_inner,
obj->rtype.pobj_info.subobj_flags,
light,
engine_glow_value,
alt_textures);
}
#endif
@ -1700,7 +1739,7 @@ void object_move_one( object * obj )
if (obj->lifeleft < 0 ) { // We died of old age
obj->flags |= OF_SHOULD_BE_DEAD;
if ( Weapon_info[obj->id].damage_radius )
if ( obj->type==OBJ_WEAPON && Weapon_info[obj->id].damage_radius )
explode_badass_weapon(obj);
}