/**********************************************************************
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 "software/r1_software.hh"
#include "software/r1_software_globals.hh"

r1_software_class r1_software_class_instance;

//global information about the current rendering buffer

i4_bool r1_software_render_buffer_is_locked = i4_F;
w16    *r1_software_render_buffer_ptr       = 0; //pointer to buffer memory
sw32    r1_software_render_buffer_bpl       = 0; //bytes per line
sw32    r1_software_render_buffer_wpl       = 0; //words per line
sw32    r1_software_render_buffer_height    = 0;
w8      r1_software_render_expand_type      = 0; //expanding type

//the directdraw surface which "owns" the buffer
IDirectDrawSurface3 *r1_software_render_surface = 0;

//global texturemap information (describes the current
//texturemap being used to draw polygons)

w16 *r1_software_texture_ptr    = 0;
w8   r1_software_twidth_log2    = 0;
sw32 r1_software_texture_width  = 0;  
sw32 r1_software_texture_height = 0;

//------------------------
//rest of global variables
//------------------------

sw32  left_l;

sw32  left_s;
sw32  left_t;
float left_z;

sw32  right_s;
sw32  right_t;
float right_z;

sw32 dsdx_frac,dtdx_frac;
sw32 temp_dsdx,temp_dtdx;

sw32  s_t_carry[2];
sw32  dldx_fixed;
sw32  num_subdivisions;

sw32 s_mask;// = ((r1_software_texture_width -1)<<16) | 0xFFFF;
sw32 t_mask;// = ((r1_software_texture_height-1)<<16) | 0xFFFF;

float ooz_right;
float soz_right;
float toz_right;

w32 pre_blend_and;
w32 post_blend_and;

sw32  width_global;  
sw32  num_leftover;

//cur_grads is a global set of gradients used by the scanline texturemappers
//(it needs to be global so that no extra pointer referencing occurs in the asm code)
tri_gradients cur_grads;

//the 4444 alpha lookup table (2^4 * 2^4 * 2^4 = 2^12 = 4096)
w16 alpha_table[4096];

w8 small_poly_type;
w8 big_poly_type;

//we probably only need 16 of these lookups
float inverse_leftover_lookup[64];

void inverse_leftover_lookup_init()
{
  sw32 i;
  
  inverse_leftover_lookup[0] = 0.f;

  for (i=1; i<64; i++)
  {
    inverse_leftover_lookup[i] = 1.f / (float)i;
  }
}

//unfortunately there is no decent sorted line primitive. all lines get
//drawn at the end of the frame, if there are any.

software_line software_lines[max_soft_lines];
sw32          num_buffered_lines=0;

tri_area_struct triangle_info[32];
float           total_poly_area;

//fpu control word storage (used in inline_fpu.hh)
w16 old_ceil_word;
w16 new_ceil_word;

w16 old_trunc_word;
w16 new_trunc_word;

w16 old_single_word;
w16 new_single_word;

i4_bool do_amd3d = i4_F;