/**********************************************************************
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) 
***********************************************************************/

#ifndef R1_CLIP_HH
#define R1_CLIP_HH

#include "r1_vert.hh"
#include "error/error.hh"
#include "tex_id.hh"

class r1_render_api_class;
class i4_draw_context_class;

struct r1_clip_vert_array
{
  int buf_size;
  int total;
  r1_vert *buf;

  r1_vert *add()
  {
    I4_ASSERT(total(v.z))    clip_code |= 1;
  else
  if (v.x<-(v.z))   clip_code |= 2;  
  
  if (v.y>(v.z))    clip_code |= 4;
  else
  if (v.y<-(v.z))   clip_code |= 8; 
  
  if (v.zr1_far_clip_z) clip_code |=32;

  return clip_code;
}

inline w8 r1_calc_ortho_outcode(i4_3d_vector &v)
{
  w8 clip_code = 0;

  if (v.x>1.0)    clip_code |= 1;
  else
  if (v.x<-1.0)   clip_code |= 2;  
  
  if (v.y>1.0)    clip_code |= 4;
  else
  if (v.y<-1.0)   clip_code |= 8; 
  
  if (v.zr1_far_clip_z) clip_code |=32;  
  
  return clip_code;
}

enum {R1_CLIP_NO_CALC_OUTCODE=1, R1_CLIP_ORTHO=128, R1_CLIP_PROJECT_CLIPPED_POINTS=2};

inline w8 r1_calc_outcode(r1_vert *v)
{
  w8 clip_code=0;

  if (v->v.x>(v->v.z))    clip_code |= 1;
  else
  if (v->v.x<-(v->v.z))   clip_code |= 2;  
  
  if (v->v.y>(v->v.z))    clip_code |= 4;
  else
  if (v->v.y<-(v->v.z))   clip_code |= 8; 
  
  if (v->v.zv.z>r1_far_clip_z) clip_code |=32;  
  
  v->outcode = clip_code;

  return clip_code;
}

inline w8 r1_calc_ortho_outcode(r1_vert *v)
{
  w8 clip_code=0;

  if (v->v.x>1.0)    clip_code |= 1;
  else
  if (v->v.x<-1.0)   clip_code |= 2;
  
  if (v->v.y>1.0)    clip_code |= 4;
  else
  if (v->v.y<-1.0)   clip_code |= 8;
  
  if (v->v.zv.z>r1_far_clip_z) clip_code |=32;  
  
  v->outcode = clip_code;

  return clip_code;
}

#endif