/**********************************************************************
This file is part of Crack dot Com's free source code release of
Golgotha.
for
information about compiling & licensing issues visit this URL
If that doesn't help, contact Jonathan Clark at
golgotha_source@usa.net (Subject should have "GOLG" in it)
***********************************************************************/
#include "objs/model_draw.hh"
#include "math/transform.hh"
#include "g1_object.hh"
#include "draw_context.hh"
#include "objs/model_id.hh"
#include "math/pi.hh"
#include "math/angle.hh"
#include "g1_render.hh"
#include "g1_texture_id.hh"
#include "r1_api.hh"
#include "r1_clip.hh"
#include "objs/map_piece.hh"
#include "resources.hh"
#include "lisp/lisp.hh"
#include "map_man.hh"
#include "map.hh"
#include "tick_count.hh"
#include "controller.hh"
void g1_model_draw_parameters::setup(g1_quad_object_class *_model,
g1_quad_object_class *_shadow_model,
g1_quad_object_class *_lod_model)
{
model=_model;
shadow_model=_shadow_model;
lod_model=_lod_model;
}
float g1_model_draw_parameters::extent() const // gets extents of model_id from model_draw
{
if (model)
return model->extent;
else
return 0;
}
void g1_model_draw_parameters::setup(w16 _model_id, w16 _shadow_model, w16 _lod_model)
{
model=g1_model_list_man.get_model(_model_id);
if (shadow_model)
shadow_model=g1_model_list_man.get_model(_model_id);
else
shadow_model=0;
if (_lod_model)
lod_model=g1_model_list_man.get_model(_lod_model);
else
lod_model=0;
}
void g1_model_draw_parameters::setup(const char *model_name, char *shadow_model_name,
char *lod_model_name)
{
int id=g1_model_list_man.find_handle(model_name);
model = g1_model_list_man.get_model(id);
if (shadow_model_name)
{
id=g1_model_list_man.find_handle(shadow_model_name);
if (id)
shadow_model = g1_model_list_man.get_model(id);
else
shadow_model = 0;
}
else
shadow_model = 0;
if (lod_model_name)
{
id=g1_model_list_man.find_handle(lod_model_name);
if (id)
lod_model = g1_model_list_man.get_model(id);
else
lod_model = 0;
}
else lod_model=0;
}
static li_symbol_ref team_icons("team_icons");
void g1_model_draw(g1_object_class *_this,
g1_model_draw_parameters ¶ms,
g1_draw_context_class *context)
{
i4_3d_vector cpos;
if (!g1_current_controller.get())
return;
g1_current_controller->get_pos(cpos);
float dist_sqrd=(cpos.x-_this->x)*(cpos.x-_this->x)+
(cpos.y-_this->y)*(cpos.y-_this->y)+
(cpos.z-_this->h)*(cpos.z-_this->h);
if (dist_sqrd>g1_resources.lod_disappear_dist)
return ;
if (dist_sqrd>g1_resources.lod_switch_dist && !params.lod_model)
return ;
g1_screen_box *bbox=0;
i4_transform_class view_transform;
i4_transform_class *old = context->transform;
context->transform = &view_transform;
view_transform.multiply(*old,*(_this->world_transform));
if (_this->get_flag(g1_object_class::SELECTABLE | g1_object_class::TARGETABLE))
{
if (g1_render.current_selectable_list)
bbox=g1_render.current_selectable_list->add();
if (bbox)
{
bbox->x1 = 2048;
bbox->y1 = 2048;
bbox->x2 = -1;
bbox->y2 = -1;
bbox->z1 = 999999;
bbox->z2 = -999999;
bbox->w = 1.0/999999;
bbox->object_id = _this->global_id;
}
}
int max_health=_this->get_type()->defaults->health;
int damage_level;
if (_this->health >= max_health)
damage_level = 7;
else
if (_this->health < 0)
damage_level = 0;
else
damage_level = i4_f_to_i(7.f * _this->health / (float)max_health);
g1_render.set_render_damage_level(damage_level);
if (dist_sqrddisable_texture();
g1_render.r_api->set_shading_mode(R1_CONSTANT_SHADING);
g1_render.r_api->set_alpha_mode(R1_ALPHA_CONSTANT);
g1_render.r_api->set_constant_color(0x7F000000);
g1_render.r_api->set_write_mode(R1_COMPARE_W | R1_WRITE_COLOR);
i4_transform_class t=*(_this->world_transform), shadow_view_transform;
// drop shadow to ground
t.t.z=g1_get_map()->map_height(_this->x, _this->y, _this->h);
shadow_view_transform.multiply(*old,t);
g1_render.render_object_polys(model,
&shadow_view_transform,
params.frame);
g1_render.r_api->set_shading_mode(R1_COLORED_SHADING);
g1_render.r_api->set_alpha_mode(R1_ALPHA_DISABLED);
g1_render.r_api->set_write_mode(R1_WRITE_W | R1_COMPARE_W | R1_WRITE_COLOR);
}
g1_quad_object_class *model = params.model;
if (model)
{
if (!(params.flags & g1_model_draw_parameters::SUPPRESS_SPECIALS) && model->num_special>0)
model->update(i4_float(g1_tick_counter + _this->global_id) + g1_render.frame_ratio);
g1_render.render_object(model,
&view_transform,
params.flags & g1_model_draw_parameters::NO_LIGHTING ?
0 : _this->world_transform,
1,
_this->player_num,
params.frame,
bbox,
0);
for (int i=0;i<_this->num_mini_objects;i++)
{
_this->mini_objects[i].draw(context,
_this->world_transform,
bbox,
_this->player_num);
}
}
}
else
{
g1_render.r_api->set_filter_mode(R1_NO_FILTERING);
g1_render.render_object(params.lod_model,
&view_transform,
params.flags & g1_model_draw_parameters::NO_LIGHTING ?
0 : _this->world_transform,
1,
_this->player_num,
params.frame,
bbox,
0);
for (int i=0;i<_this->num_mini_objects;i++)
{
_this->mini_objects[i].draw(context,
_this->world_transform,
bbox,
_this->player_num,
0, i4_T, i4_T);
}
g1_render.r_api->set_filter_mode(R1_BILINEAR_FILTERING);
}
g1_render.set_render_damage_level(-1);
context->transform = old;
}
void g1_editor_model_draw(g1_object_class *_this,
g1_model_draw_parameters ¶ms,
g1_draw_context_class *context)
{
if (context->draw_editor_stuff)
g1_model_draw(_this, params, context);
}