/**********************************************************************
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 "draw_context.hh"
#include "r1_clip.hh"
#include "math/transform.hh"
#include "objs/sprite.hh"
#include "g1_render.hh"
#include "r1_api.hh"


void g1_draw_flare(i4_3d_point_class world_pos,
                   g1_draw_context_class *context,
                   float flare_scale,
                   int type)
{
  i4_3d_vector screen_pos;
  context->transform->transform(world_pos, screen_pos);

 
  if (screen_pos.z > r1_near_clip_z)         
  {
    float center_x=g1_render.center_x, center_y=g1_render.center_y;
    i4_float ooz = r1_ooz(screen_pos.z);                   
    i4_float xs = center_x * ooz * g1_render.scale_x;
    i4_float ys = center_y * ooz * g1_render.scale_y;        


    float theta=atan2(screen_pos.y, screen_pos.x);    
    float dist = sqrt(screen_pos.y*screen_pos.y + screen_pos.x*screen_pos.x);


    g1_render.r_api->set_filter_mode(R1_BILINEAR_FILTERING);
    //g1_render.r_api->set_write_mode(R1_COMPARE_W | R1_WRITE_COLOR);


    float dists[5]={dist, 0.0, -0.3*dist, -0.7*dist, -1*dist };
    int sprite_types[5]={0, 1,1,1,1};
    float sprite_scales[5]={ 1.0, 0.3, 0.8, 0.5, 1.0};

    float cos_theta=cos(theta);
    float sin_theta=sin(theta);

    for (int i=0; i<5; i++)
    {
      float cx=center_x + cos_theta * dists[i] * xs;
      float cy=center_y + sin_theta * dists[i] * ys;

      g1_sprite_class *sprite=g1_sprite_list_man.get_sprite(sprite_types[i]);
      float w=sprite->texture_scale * sprite_scales[i] * center_x * 2 * flare_scale;

      r1_clip_render_textured_rect(i4_f_to_i(cx-w/2), i4_f_to_i(cy-w/2), 
                                   i4_f_to_i(cx+w/2), i4_f_to_i(cy+w/2), r1_near_clip_z, 1,
                                   i4_f_to_i(center_x*2), i4_f_to_i(center_y*2),
                                   sprite->texture,
                                   0,
                                   g1_render.r_api);
    }

    //g1_render.r_api->set_write_mode(R1_COMPARE_W | R1_WRITE_COLOR | R1_WRITE_W);
    g1_render.r_api->set_filter_mode(R1_NO_FILTERING);

  }
}



void g1_draw_exhaust(i4_3d_point_class world_pos,
                     g1_draw_context_class *context,
                     float flare_scale,
                     int type, float alpha)
{
  i4_3d_vector screen_pos;
  context->transform->transform(world_pos, screen_pos);

 
  if (screen_pos.z > r1_near_clip_z)         
  {
    float center_x=g1_render.center_x, center_y=g1_render.center_y;
    i4_float ooz = r1_ooz(screen_pos.z);                   

    g1_render.r_api->set_filter_mode(R1_BILINEAR_FILTERING);
    //g1_render.r_api->set_write_mode(R1_COMPARE_W | R1_WRITE_COLOR);


    float cx=center_x + screen_pos.x * center_x * ooz * g1_render.scale_x;
    float cy=center_y + screen_pos.y * center_x * ooz * g1_render.scale_x;

    g1_sprite_class *sprite=g1_sprite_list_man.get_sprite(0);
    float w=sprite->texture_scale * center_x * 2 * flare_scale;

    r1_clip_render_textured_rect(i4_f_to_i(cx-w/2), i4_f_to_i(cy-w/2), 
                                 i4_f_to_i(cx+w/2), i4_f_to_i(cy+w/2), screen_pos.z, alpha,
                                 i4_f_to_i(center_x*2), i4_f_to_i(center_y*2),
                                 sprite->texture,
                                 0,
                                 g1_render.r_api);

    //g1_render.r_api->set_write_mode(R1_COMPARE_W | R1_WRITE_COLOR | R1_WRITE_W);
    g1_render.r_api->set_filter_mode(R1_NO_FILTERING);
  }
}