home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 1997 March
/
VPR9703A.ISO
/
VPR_DATA
/
DOGA
/
SOURCES
/
PASM.LZH
/
PARTSR.CPP
< prev
next >
Wrap
C/C++ Source or Header
|
1996-06-17
|
5KB
|
183 lines
#include <iostream.h>
#include <math.h>
#include <string.h>
#include "matrix.h"
#include "suflib.h"
#include "seltype.h"
#include "parts.h"
#include "files.h"
static int readheader(TokenReader& reader)
{
char str[120];
reader.GetLine(str);
reader.GetLine(str);
#if 0
if (reader.GetToken(str) == 0 || strcmpi(str, "Frame_number") != 0) {
return FALSE;
}
if (reader.GetToken(str) == 0 || str[0] != '1' || str[1] != '\0') {
return FALSE;
}
if (reader.GetToken(str) == 0 || str[0] != '1' || str[1] != '\0') {
return FALSE;
}
#endif
while (reader.GetToken(str)) {
if (strcmpi(str, "fram") == 0 || strcmpi(str, "frame") == 0) {
break;
}
}
if (reader.GetToken(str) == 0 || str[0] != '{') {
return FALSE;
}
if (reader.GetToken(str) == 0 || strcmpi(str, "light") != 0) {
return FALSE;
}
reader.GetLine(str);
return TRUE;
}
static void vectorinit(Vector& pos, Vector& rot, Vector& scal)
{
pos = rot = Vector(0, 0, 0);
scal = Vector(1, 1, 1);
}
static Vector readvector(TokenReader& reader)
{
Vector vec(0,0,0);
char str[64];
if (reader.GetToken(str) == 0 || str[0] != '(') return vec;
if (reader.GetToken(str) == 0 || str[0] == ')') return vec;
if (sscanf(str, "%lf", &(vec.x)) == 0) return vec;
if (reader.GetToken(str) == 0 || str[0] == ')') return vec;
if (sscanf(str, "%lf", &(vec.y)) == 0) return vec;
if (reader.GetToken(str) == 0 || str[0] == ')') return vec;
if (sscanf(str, "%lf", &(vec.z)) == 0) return vec;
if (reader.GetToken(str) == 0 || str[0] != ')') return vec;
// cout << "vec(" << vec.x << "," << vec.y << "," << vec.z << ")\n";
return vec;
}
static double readvalue(TokenReader& reader)
{
char str[64];
double val;
if (reader.GetToken(str) == 0 || str[0] != '(') return 0.0;
if (reader.GetToken(str) == 0 || str[0] == ')') return 0.0;
if (sscanf(str, "%lf", &val) == 0) return 0.0;
if (reader.GetToken(str) == 0 || str[0] != ')') return 0.0;
// cout << "value(" << val << ")\n";
return val;
}
static int readobj(TokenReader& reader, char *oname, char *fname)
{
char str[64];
if (reader.GetToken(str) == 0) return FALSE;
strcpy(oname, str);
fname[0] = '\0';
if (reader.GetToken(str) == 0) return FALSE;
if (str[0] == '(') {
if (reader.GetToken(str) != 0 && str[0] == ':') {
reader.GetToken(str);
strcpy(fname, str);
while (reader.GetToken(str) != 0 && str[0] != ':')
;
while (reader.GetToken(str) != 0 && str[0] != ')')
;
}
} else if (str[0] == '/') {
if (reader.GetToken(str) != 0 && str[0] == '*') {
reader.GetToken(str);
strcpy(fname, str);
while (reader.GetToken(str) != 0 && str[0] != '*')
;
while (reader.GetToken(str) != 0 && str[0] != '/')
;
}
}
if (fname[0] == '\0') {
strcpy(fname, oname);
strcat(fname, ".suf");
}
// cout << "obj= " << oname << " ( " << fname << " )\n";
return TRUE;
}
int Parts::FileRead(Parts* &parts, CameraParts* &camera, char *filename, char *initialdir)
{
Vector pos, rot, scal;
Vector camerapos(1000,0,500), cameratarget(0,0,0);
double angle = deg(60);
parts = NULL;
char str[256];
char name[32], fname[256];
TokenReader reader(filename);
if (!reader.Suceed()) {
return FALSE;
}
if (readheader(reader) == FALSE) {
return FALSE;
}
while (reader.GetToken(str)) {
if (str[0] == '{') {
vectorinit(pos,rot,scal);
} else if (str[0] == '}') {
;
} else if (strcmpi(str, "mov") == 0) {
pos = readvector(reader);
} else if (strcmpi(str, "rotx") == 0) {
rot.x = deg(readvalue(reader));
} else if (strcmpi(str, "roty") == 0) {
rot.y = deg(readvalue(reader));
} else if (strcmpi(str, "rotz") == 0) {
rot.z = deg(readvalue(reader));
} else if (strcmpi(str, "scal") == 0) {
scal = readvector(reader);
} else if (strcmpi(str, "eye") == 0) {
if (reader.GetToken(str) != 0 && strcmpi(str, "deg") == 0) {
angle = deg(readvalue(reader));
}
camerapos = pos;
} else if (strcmpi(str, "target") == 0) {
cameratarget = pos;
} else if (strcmpi(str, "obj") == 0) {
readobj(reader, name, fname);
Object *obj;
obj = SufFile::OpenObject(fname, name);
if (obj == NULL && initialdir != NULL) {
strcpy(str, initialdir);
strcat(str, "\\");
strcat(str, fname);
obj = SufFile::OpenObject(str, name);
}
if (obj == NULL) {
strcpy(str, simplepartsdir.c_str());
strcat(str, fname);
obj = SufFile::OpenObject(str, name);
}
if (obj == NULL) {
strcpy(str, partsdir.c_str());
strcat(str, fname);
obj = SufFile::OpenObject(str, name);
}
if (obj != NULL) {
Parts *p = new Parts(obj, pos, rot, scal);
p->next = parts;
parts = p;
}
}
}
camera = new CameraParts(camerapos, cameratarget);
camera->SetAngle(angle);
// camera->next = parts;
// parts = camera;
return TRUE;
}