home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 1997 March
/
VPR9703A.ISO
/
VPR_DATA
/
DOGA
/
SOURCES
/
MEC2SUF.LZH
/
MEC2SUF.CPP
< prev
next >
Wrap
C/C++ Source or Header
|
1996-06-18
|
7KB
|
278 lines
#include <owl\owlpch.h>
#pragma hdrstop
#include "files.h"
#include "matrix.h"
#include "suflib.h"
#include "token.h"
#include "parts.h"
#include "mec2suf.h"
extern TApplication *app;
static char str[512];
static char *convatr[256];
static Vector pos[256];
static Vector vec[256];
static int u[256];
static int v[256];
extern "C" extendargs(int *argcp, char **argvp[], int extn, char *ext[]);
static void PolyConv(FILE *fp, Matrix& m, Matrix& mt, TokenReader *tokenread, int wflag)
{
char token[32];
Vector p;
int vflag, uflag;
int i, points;
tokenread->GetToken( token ) ;
points = 0;
vflag = uflag = FALSE;
if ( !strcmpi( token, "poly" ) ) {
} else if ( !strcmpi( token, "shade" ) ) {
vflag = TRUE;
} else if ( !strcmpi( token, "uvpoly" ) ) {
uflag = TRUE;
} else if ( !strcmpi( token, "uvshade" ) ) {
uflag = vflag = TRUE;
} else {
return ;
}
if (wflag) {
fprintf(fp, "prim %s (", token);
}
if ( tokenread->GetToken( token ), token[0] != '(' ) {
return;
}
while ( tokenread->GetToken( token ), token[0] != ')' )
{
app->PumpWaitingMessages();
pos[points].x = atof( token ) ;
if (tokenread->GetToken( token ), token[0] == ')') return;
pos[points].y = atof( token ) ;
if (tokenread->GetToken( token ), token[0] == ')') return;
pos[points].z = atof( token ) ;
if (vflag) {
if (tokenread->GetToken( token ), token[0] == ')') return;
vec[points].x = atof(token);
if (tokenread->GetToken( token ), token[0] == ')') return;
vec[points].y = atof(token);
if (tokenread->GetToken( token ), token[0] == ')') return;
vec[points].z = atof(token);
}
if (uflag) {
if (tokenread->GetToken( token ), token[0] == ')') return;
u[points] = atoi(token);
if (tokenread->GetToken( token ), token[0] == ')') return;
v[points] = atoi(token);
}
points++;
}
if (!wflag) {
return;
}
if (m.value() > 0) {
for (i = 0; i < points; i++) {
p = m * pos[i];
fprintf(fp, "\n\t%5.0lf %5.0lf %5.0lf", p.x, p.y, p.z);
if (vflag) {
p = mt * vec[i];
fprintf(fp, " %5.0lf %5.0lf %5.0lf", p.x, p.y, p.z);
}
if (uflag) {
fprintf(fp, " %4d %4d", u[i], v[i]);
}
}
} else {
for (i = points-1; i >= 0; --i) {
p = m * pos[i];
fprintf(fp, "\n\t%5.0lf %5.0lf %5.0lf", p.x, p.y, p.z);
if (vflag) {
p = mt * vec[i];
fprintf(fp, " %5.0lf %5.0lf %5.0lf", p.x, p.y, p.z);
}
if (uflag) {
fprintf(fp, " %4d %4d", u[i], v[i]);
}
}
}
fprintf(fp, ")\n");
}
static void PartsConv(FILE *fp, char *objname, char *filename, Matrix& m, char *col)
{
char token[32];
int wflag;
Matrix mt= m.inv().tra();
TokenReader t(filename);
TokenReader *tokenread = &t;
if (!tokenread->Suceed()) {
return;
}
while (tokenread->GetToken( token ), strcmpi( token, "obj" ) == 0) {
if ( tokenread->GetToken( token ) ,strcmpi( token, "suf" ) ) {
break;
}
tokenread->GetToken(token);
if (objname == NULL || objname[0] == '\0' || strcmpi(token, objname) == 0) {
wflag = TRUE;
} else {
wflag = FALSE;
}
if ( tokenread->GetToken( token ), token[0] != '{' ) {
break;
}
while ( tokenread->GetToken( token ), token[0] != '}' )
{
if ( !strcmpi( token, "atr" ) ) {
tokenread->GetToken( token ) ;
if (col == NULL || col[0] == '\0') {
fprintf(fp, "atr %s\n", token);
} else {
int i;
for (i = 0; convatr[i] != NULL; i++) {
if (strcmpi(convatr[i], token) == 0) {
break;
}
}
if (convatr[i] == NULL) {
fprintf(fp, "atr %s\n", token);
} else {
fprintf(fp, "atr %s_%s\n", token, col);
}
}
} else if ( !strcmpi( token, "prim" ) ) {
PolyConv(fp, m, mt, tokenread, wflag) ;
}
}
}
}
#define MAXOBJS 256
#define MAXSTRING 4096
#define STRING 256
void Mec2Suf(TDC& dc, int argc, char *argv[])
{
char oname[STRING];
char mess[STRING];
char argbuf[MAXSTRING];
char *filename[MAXOBJS];
char *colorname[MAXOBJS];
char *objname[STRING];
char *p, *parg;
char *output = NULL;
char *ext[] = {"FSC"};
int filenames, i, j;
filenames = 0;
FILE *fp;
p = str;
i = 0;
strcpy(p, colorchangeatr.c_str());
convatr[i++] = p;
while ((p = strchr(p, ',')) != NULL) {
*p = '\0';
convatr[i++] = p+1;
p = p+1;
}
convatr[i] = NULL;
extendargs(&argc, &argv, 1, ext);
parg = argbuf;
for (i = 1; i < argc; i++) {
if (argv[i][0] == '-') {
if (tolower(argv[i][1]) == 'o') {
output = argv[i]+2;
}
} else {
filename[filenames] = parg;
strcpy(filename[filenames], argv[i]);
parg += strlen(parg) + 1;
if ((p = strchr(filename[filenames], ',')) == NULL) {
colorname[filenames] = NULL;
} else {
*p = '\0';
colorname[filenames] = p+1;
if ((p = strchr(colorname[filenames], ',')) == NULL) {
objname[filenames] = NULL;
} else {
*p = '\0';
objname[filenames] = p+1;
}
}
filenames++;
}
}
if (output == NULL) {
return;
}
fp = fopen(output, "w");
if (fp == NULL) {
return;
}
for (i = 0; i < filenames; i++) {
Parts *parts, *next;
CameraParts *camera;
if (objname[i] == NULL || objname[i][0] == '\0') {
char *cp;
if ((cp = strrchr(filename[i], '\\')) == NULL) {
cp = filename[i];
} else {
cp = cp+1;
}
strcpy(oname, cp);
if ((cp = strrchr(oname, '.')) != NULL) {
*cp = '\0';
}
} else {
strcpy(oname, objname[i]);
}
for (j = 0; oname[j]; j++) {
oname[j] = toupper(oname[j]);
}
fprintf(fp, "obj suf %s {\n", oname);
sprintf(mess, "Read Mecha: %s", oname);
dc.TextOut(0, 0, mess);
//fclose(fp);return;
if (Parts::FileRead(parts, camera, filename[i], NULL) != FALSE) {
for (Parts *p = parts; p != NULL; p = next) {
if (p->object != NULL) {
sprintf(mess, "Read Parts: %s", p->object->name);
dc.TextOut(0, 16, mess);
fprintf(fp, "/* %s */\n", p->object->name);
char fname[256];
char *f = p->object->filename;
if (strncmpi(f, simplepartsdir.c_str(), simplepartsdir.length()) == 0) {
sprintf(fname, "%s%s", partsdir.c_str(), f+simplepartsdir.length());
} else {
strcpy(fname, f);
}
PartsConv(fp, p->object->name, fname, p->GetMatrix(), colorname[i]);
}
next = p->next;
delete p;
}
delete camera;
}
fprintf(fp, "}\n");
}
fclose(fp);
}