/**********************************************************************
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 M1_MAX_OBJECT_HH
#define M1_MAX_OBJECT_HH

#include "obj3d.hh"
#include "memory/array.hh"
#include "string/string.hh"

class i4_saver_class;

class m1_poly_object_class : public g1_quad_object_class
{
  void save_quads(i4_saver_class *fp);
  void save_texture_names(i4_saver_class *fp);
  void save_vert_animations(i4_saver_class *fp);
  void save_mount_points(i4_saver_class *fp);
  void save_specials(i4_saver_class *fp);
  void calc_quad_normal(g1_vert_class *v, g1_quad_class &q);

public:
  void calc_texture_scales();
  void calc_vert_normals();

  enum { INVALID_QUAD = (1<<7) };  // g1_quad_class flag (*NOTE: bit 7 must be available)
  enum { MAX_ANIMATIONS=20 };
  enum { MAX_TEXTURE_NAMES=MAX_ANIMATIONS * 200 };

  enum { POLY_SELCTED=1 };

  i4_array texture_names;
  i4_array animation_names;
  i4_array mount_names;
  i4_array      vert_flags;

  i4_array      anim_store;
  i4_array        vert_store;
  i4_array        quad_store;
  i4_array         mount_store;
  i4_array                  mount_id_store;
  i4_array special_store;
  
  ~m1_poly_object_class()
  //{{{
  {
    w32 i;
    for (i=0; i=vert_flags.size()) 
      return 0; 
    else return vert_flags[poly_num]&flag ? 1 : 0;
  }
  //}}}

  void set_poly_vert_flag(int poly_num, int flag, int value)
  //{{{
  {
    while (vert_flags.size()<=poly_num) vert_flags.add();
    if (value)
      vert_flags[poly_num] |= flag;
    else
      vert_flags[poly_num] &= ~flag;
  }
  //}}}

  void add_animation(m1_poly_object_class *other, w32 animation_number);
  void delete_animation(w32 animation_number);

  void add_frame(w32 anim, w32 frame);
  void remove_frame(w32 anim, w32 frame);
  
  w32 add_vertex();
  void remove_vertex(w32 num);

  w32 add_quad();
  void remove_quad(w32 num);

  w32 add_mount();
  void remove_mount(w32 num);

  w32 add_special(w32 quad_number);
  void remove_special(w32 num);

  void save(i4_saver_class *fp);
  void change_animation_name(w32 animation_number, const i4_const_str &st);

  m1_poly_object_class() 
    : anim_store(0,1), vert_store(0,100), quad_store(0,100), 
      mount_store(0,10), mount_id_store(0,10), special_store(0,10),
      texture_names(0, 32), animation_names(0,32), vert_flags(0,32), mount_names(0,32) {}
};
                                    
#endif

//{{{ Emacs Locals
// Local Variables:
// folded-file: t
// End:
//}}}