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

#include "memory/lalloc.hh"
#include "tmanage.hh"
#include "software/r1_software.hh"
#include "tex_heap.hh"

class r1_mip_load_info;

class r1_software_texture_class : public r1_texture_manager_class
{
  friend class r1_software_class;
  friend void software_async_callback(w32 count, void *context);

  w8 *texture_heap;
  r1_texture_heap_class *tex_heap_man;

  class free_node
  {
  public:
    R1_TEX_HEAP_FREE_NODE_DATA
        
    i4_file_class *async_fp;
  };

  class used_node
  {
  public:
    R1_TEX_HEAP_USED_NODE_DATA
    //dont need any new members    
  };
  
public:

  void next_frame();

  void select_texture(r1_local_texture_handle_type handle, float &smul, float &tmul);

  r1_software_texture_class(const i4_pal *pal);

  ~r1_software_texture_class();

  void init();

  void uninit();

  i4_bool immediate_mip_load(r1_mip_load_info *load_info);
  i4_bool async_mip_load(r1_mip_load_info *load_info);
  
  void free_mip(r1_vram_handle_type vram_handle);
  
  r1_miplevel_t *get_texture(r1_texture_handle handle,
                             w32 frame_counter,
                             sw32 desired_width,
                             sw32 &w, sw32 &h);

  
  i4_critical_section_class array_lock;  
  i4_array finished_array;  

  void async_load_finished(used_node *u);

  sw32 bytes_loaded;
  sw32 textures_loaded;
};


#endif