/**********************************************************************
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_object.hh"
#include "saver_id.hh"
#include "loaders/dir_save.hh"
// Save section
void m1_poly_object_class::save_quads(i4_saver_class *fp)
//{{{
{
int i,j;
fp->mark_section(G1_SECTION_MODEL_QUADS);
int tq=num_quad;
fp->write_16(tq);
for (i=0; iwrite_16(quad[i].vertex_ref[j]);
fp->write_float(quad[i].u[j]);
fp->write_float(quad[i].v[j]);
}
fp->write_float(quad[i].texture_scale);
fp->write_16(quad[i].flags);
fp->write_float(quad[i].normal.x);
fp->write_float(quad[i].normal.y);
fp->write_float(quad[i].normal.z);
}
}
//}}}
void m1_poly_object_class::save_texture_names(i4_saver_class *fp)
//{{{
{
fp->mark_section(G1_SECTION_MODEL_TEXTURE_NAMES);
int tq=num_quad;
fp->write_16(tq);
for (int i=0; iwrite_counted_str(*texture_names[i]);
}
//}}}
void m1_poly_object_class::save_vert_animations(i4_saver_class *fp)
//{{{
{
int i,j,k;
fp->mark_section(G1_SECTION_MODEL_VERT_ANIMATION);
fp->write_16(num_vertex);
int ta=num_animations;
fp->write_16(ta);
for (i=0; iwrite_counted_str(*animation_names[i]);
int nf=animation[i].num_frames;
fp->write_16(nf);
for (j=0; jwrite_float(v[k].v.x);
fp->write_float(v[k].v.y);
fp->write_float(v[k].v.z);
fp->write_float(v[k].normal.x);
fp->write_float(v[k].normal.y);
fp->write_float(v[k].normal.z);
}
}
}
}
//}}}
void m1_poly_object_class::save_mount_points(i4_saver_class *fp)
//{{{
{
int i,j;
if (num_mounts==0)
return;
fp->mark_section("GMOD Mounts");
fp->write_16(num_mounts);
for (i=0; iwrite_counted_str(*mount_names[i]);
fp->write_float(mount[i].x);
fp->write_float(mount[i].y);
fp->write_float(mount[i].z);
}
}
//}}}
void m1_poly_object_class::save_specials(i4_saver_class *fp)
//{{{
{
int i,j;
if (num_special==0)
return;
fp->mark_section("GMOD Texture Animations");
fp->write_16(num_special);
for (i=0; iwrite_format("211fff",
&special[i].quad_number,
&special[i].max_frames,
&special[i].frames_x,
&special[i].speed,
&special[i].du,
&special[i].dv);
}
}
//}}}
void m1_poly_object_class::calc_quad_normal(g1_vert_class *v,
g1_quad_class &q)
//{{{
{
// find the surface normal used in lighting
i4_3d_point_class p[4];
for (int i=0; ilen2)
q.normal = normal1;
else
q.normal = normal2;
if (len1==0.0 || len2==0.0)
// bad normal lengths
q.set_flags(INVALID_QUAD);
else
{
normal1 /= len1;
normal2 /= len2;
if (normal1.dot(normal2)<0.5)
q.set_flags(INVALID_QUAD);
}
}
if (q.normal.x==0 && q.normal.y==0 && q.normal.z==0)
{
// 0 check - invalid polygon!
q.normal=i4_3d_vector(0,0,1);
q.set_flags(INVALID_QUAD);
// i4_warning("very invalid polygon detected!");
}
else
q.normal.normalize();
}
//}}}
void m1_poly_object_class::calc_vert_normals()
//{{{
{
for (int a=0; anormal=sum;
}
}
}
//}}}
void m1_poly_object_class::save(i4_saver_class *fp)
//{{{
{
int i,j;
calc_vert_normals();
save_texture_names(fp);
save_quads(fp);
save_vert_animations(fp);
save_mount_points(fp);
save_specials(fp);
}
//}}}
void m1_poly_object_class::add_frame(w32 anim, w32 frame)
//{{{
{
i4_error("write me!");
}
//}}}
void m1_poly_object_class::remove_frame(w32 anim, w32 frame)
//{{{
{
i4_error("write me!");
}
//}}}
w32 m1_poly_object_class::add_vertex()
//{{{
{
i4_error("write me!");
return 0;
}
//}}}
void m1_poly_object_class::remove_vertex(w32 num)
//{{{
{
i4_error("write me!");
}
//}}}
w32 m1_poly_object_class::add_quad()
//{{{
{
g1_quad_class tmp;
w32 ret=quad_store.add(tmp);
texture_names.add(new i4_str(""));
quad = &quad_store[0];
num_quad = quad_store.size();
return ret;
}
//}}}
void m1_poly_object_class::remove_quad(w32 num)
//{{{
{
int i=0;
for (i=num_special-1; i>=0; i--)
{
if (special[i].quad_number == num)
remove_special(i);
else if (special[i].quad_number > num)
special[i].quad_number--;
}
quad_store.remove(num);
texture_names.remove(num);
num_quad = quad_store.size();
}
//}}}
w32 m1_poly_object_class::add_mount()
//{{{
{
w32 ret=mount_store.add(i4_3d_vector(0,0,0));
mount_id_store.add(0);
mount_names.add(new i4_str(""));
mount = &mount_store[0];
num_mounts = mount_store.size();
return ret;
}
//}}}
void m1_poly_object_class::remove_mount(w32 num)
//{{{
{
int i=0;
mount_store.remove(num);
mount_id_store.remove(num);
mount_names.remove(num);
num_mounts = mount_store.size();
}
//}}}
w32 m1_poly_object_class::add_special(w32 quad_number)
//{{{
{
for (int i=0; iz-p2->z)*(p1->z-p2->z)+
(p1->y-p2->y)*(p1->y-p2->y)+
(p1->x-p2->x)*(p1->x-p2->x));
float uv_length = sqrt ((quad[i].u[1]-quad[i].u[0]) * (quad[i].u[1]-quad[i].u[0]) +
(quad[i].v[1]-quad[i].v[0]) * (quad[i].v[1]-quad[i].v[0]));
quad[i].texture_scale=edge_len / uv_length;
}
}
//{{{ Emacs Locals
// Local Variables:
// folded-file: t
// End:
//}}}