Just whipped this up in 15 minutes or so. It takes a zone s3d file and outputs a .TER for it
This requires the files s3d.c/.h, wld.c/.h, and ter.h from the OpenEQ source to build, which are available at
http://home.archshadow.com/~daeken/openeq/.
Code:
#include <stdio.h>
#include "s3d.h"
#include "wld.h"
#include "ter.h"
int main(int argc, char **argv) {
wld_object wld;
ZoneMesh zm;
s3d_object s3d;
FILE *in, *out;
int i;
char tex_name[16];
char *s3d_name;
uchar *wld_buf;
ter_header thdr;
ter_vertex vert;
ter_triangle tri;
if(argc < 3) {
printf("Usage: ./%s [input.s3d] [output.ter]\n", argv[0]);
return;
}
s3d_name = (char *) malloc(strlen(argv[1]) + 5);
sprintf(s3d_name, "%s.s3d", argv[1]);
S3D_Init(&s3d, fopen(s3d_name, "r"));
sprintf(s3d_name, "%s.wld", argv[1]);
S3D_GetFile(&s3d, s3d_name, &wld_buf);
free(s3d_name);
out = fopen(argv[2], "w");
WLD_Init(&wld, wld_buf, &s3d, 0);
WLD_GetZoneMesh(&wld, &zm);
memcpy(thdr.magic, "EQGT", 4);
thdr.version = 2;
thdr.mat_count = zm.tex->count;
thdr.vert_count = zm.vertexCount;
thdr.tri_count = zm.polygonCount;
thdr.list_len = 0;
for(i = 0; i < thdr.mat_count; ++i) {
sprintf(tex_name, "tex_%i", i);
thdr.list_len += strlen(tex_name) + 1;
thdr.list_len += strlen(zm.tex->filenames[i]) + 1;
}
fwrite(&thdr, 1, sizeof(ter_header), out);
for(i = 0; i < thdr.mat_count; ++i) {
sprintf(tex_name, "tex_%i", i);
fwrite(tex_name, 1, strlen(tex_name) + 1, out);
fwrite(zm.tex->filenames[i], 1, strlen(zm.tex->filenames[i]) + 1, out);
}
for(i = 0; i < thdr.vert_count; ++i) {
vert.x = zm.verti[i]->x;
vert.y = zm.verti[i]->y;
vert.z = zm.verti[i]->z;
vert.u = zm.verti[i]->u;
vert.v = zm.verti[i]->v;
fwrite(&vert, 1, sizeof(ter_vertex), out);
}
for(i = 0; i < thdr.tri_count; ++i) {
tri.v1 = zm.poly[i]->v1;
tri.v2 = zm.poly[i]->v2;
tri.v3 = zm.poly[i]->v3;
tri.group = zm.poly[i]->tex;
tri.unk = 1;
fwrite(&tri, 1, sizeof(ter_triangle), out);
}
}
Happy Hacking,
Lord Daeken M. BlackBlade
(Cody Brocious)