SecondReality/VISU/C/SAVE.C
2017-09-24 01:45:36 +02:00

90 lines
1.5 KiB
C

long blockstack[16];
int blockstackp=0;
void beginblock(char *label)
{
blockstack[blockstackp]=ftell(outb);
blockstackp++;
putc(label[0],outb);
putc(label[1],outb);
putc(label[2],outb);
putc(label[3],outb);
putc(0xff,outb);
putc(0xff,outb);
putc(0xff,outb);
putc(0xff,outb);
}
void endblock(void)
{
long op,l;
op=ftell(outb);
while(op&3)
{
op++;
putc(0,outb);
}
blockstackp--;
l=blockstack[blockstackp];
fseek(outb,l+4,SEEK_SET);
l=op-l-8;
putc((int)l&255,outb); l>>=8;
putc((int)l&255,outb); l>>=8;
putc((int)l&255,outb); l>>=8;
putc((int)l&255,outb);
fseek(outb,op,SEEK_SET);
}
void saveobject(struct s_cobject *co)
{
object *o;
char fname[32];
long l;
int a,b;
o=co->o;
sprintf(fname,"%s.%03i",scenename,co->index);
outb=fopen(fname,"wb");
strcpy(co->fname,fname);
beginblock("VERS");
putw(0x0100,outb);
endblock();
beginblock("NAME");
fprintf(outb,co->name);
putc(0,outb);
endblock();
beginblock("VERT");
putw(o->vnum,outb);
putw(0,outb);
fwrite(o->v0,sizeof(vlist),o->vnum,outb);
endblock();
beginblock("NORM");
putw(o->nnum,outb);
putw(o->nnum1,outb);
fwrite(o->n0,sizeof(nlist),o->nnum,outb);
endblock();
beginblock("POLY");
fwrite(o->pd,1,o->pdlen,outb);
endblock();
for(b=0;b<o->plnum;b++)
{
if(!b) beginblock("ORD0");
else beginblock("ORDE");
fwrite(o->pl[b],2,o->pl[b][0],outb);
endblock();
}
beginblock("END ");
endblock();
co->size=ftell(outb);
fclose(outb);
}