/**********************************************************************
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 "max_load.hh"
#include "load3d.hh"
#include "loaders/dir_load.hh"
#include "tupdate.hh"
#include "m1_info.hh"
#include "saver_id.hh"
#include "error/alert.hh"
class m1_poly_object_loader_class : public g1_quad_object_loader_class
{
public:
m1_poly_object_class *mobj() const { return (m1_poly_object_class*)obj; }
virtual void set_num_animations(w16 anims)
//{{{
{
mobj()->anim_store.add_many(anims);
mobj()->animation_names.add_many(anims);
mobj()->num_animations = mobj()->anim_store.size();
mobj()->animation = &mobj()->anim_store[0];
}
//}}}
virtual void create_animation(w16 anim, const i4_const_str &name, w16 frames)
//{{{
{
mobj()->animation[anim].num_frames=frames;
mobj()->animation[anim].vertex=mobj()->vert_store.add_many(frames*mobj()->num_vertex);
mobj()->animation_names[anim]=new i4_str(name);
}
//}}}
virtual void set_num_quads(w16 num_quads)
//{{{
{
mobj()->quad_store.add_many(num_quads);
mobj()->texture_names.add_many(num_quads);
mobj()->num_quad = mobj()->quad_store.size();
mobj()->quad = &mobj()->quad_store[0];
}
//}}}
virtual void create_quad(w16 quad, int verts, w16 *ref, w32 flags)
//{{{
{
g1_quad_object_loader_class::create_quad(quad,verts,ref,flags);
for (int i=1; ibuf && *p!='.') --p;
if (p>buf && *p!='.') --p;
if (p>buf && *p!='.') --p;
if (*p=='.')
{
++p;
while (*p)
{
if (*p>='A' && *p<='Z')
*p = *p - 'A' + 'a';
p++;
}
}
g1_quad_object_loader_class::store_texture_name(quad, buf);
mobj()->texture_names[quad]=new i4_str(buf);
}
//}}}
virtual void set_num_mount_points(w16 num_mounts)
//{{{
{
mobj()->mount_store.add_many(num_mounts);
mobj()->mount_id_store.add_many(num_mounts);
mobj()->mount_names.add_many(num_mounts);
mobj()->num_mounts = mobj()->mount_store.size();
if (mobj()->num_mounts>0)
{
mobj()->mount_id = &mobj()->mount_id_store[0];
mobj()->mount = &mobj()->mount_store[0];
}
}
//}}}
virtual void create_mount_point(w32 index, const i4_const_str &name, const i4_3d_vector &off)
//{{{
{
g1_quad_object_loader_class::create_mount_point(index, name, off);
mobj()->mount_names[index]=new i4_str(name);
}
//}}}
virtual void set_num_texture_animations(w16 num_textures)
//{{{
{
mobj()->special_store.add_many(num_textures);
mobj()->num_special = mobj()->special_store.size();
if (mobj()->num_special>0)
mobj()->special = &mobj()->special_store[0];
}
//}}}
virtual g1_quad_object_class *allocate_object()
//{{{
{
m1_poly_object_class *o = new m1_poly_object_class;
if (o) o->init();
return o;
}
//}}}
m1_poly_object_class *load(i4_loader_class *fp, const i4_const_str &_error_name,
r1_texture_manager_class *_tman)
//{{{
{
error_name = &_error_name;
tman = _tman;
heap = 0;
return (m1_poly_object_class *)g1_base_object_loader_class::load(fp);
}
//}}}
};
void m1_load_model_dir(const i4_const_str &object_filename,
r1_texture_manager_class *tman)
{
tman->reset();
m1_info.textures_loaded=i4_F;
i4_array tname_a(128,16);
i4_file_class *fp=i4_open(object_filename);
if (fp)
{
i4_loader_class *gfp=i4_open_save_file(fp);
if (gfp)
{
if (gfp->goto_section(G1_SECTION_MODEL_TEXTURE_NAMES))
{
w16 quads=gfp->read_16();
for (int i=0; iread_counted_str();
if (!s->null())
tname_a.add(s);
else
delete s;
}
}
delete gfp;
}
}
else i4_alert(i4gets("obj_missing"),100,&object_filename);
for (int i=0; ireset();
m1_info.textures_loaded=i4_F;
m1_load_model_dir(name, tman);
m1_info.recalcing_textures=i4_F;
i4_file_class *fp=i4_open(name);
if (fp)
{
i4_loader_class *gfp=i4_open_save_file(fp);
if (gfp)
{
m1_poly_object_class *o;
m1_poly_object_loader_class mo_loader;
o = mo_loader.load(gfp, name, tman);
delete gfp;
return o;
}
}
return 0;
}
//}}}
//{{{ Emacs Locals
// Local Variables:
// folded-file: t
// End:
//}}}