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 >
C/C++ Source or Header  |  1996-06-17  |  5KB  |  183 lines

  1. #include <iostream.h>
  2. #include <math.h>
  3. #include <string.h>
  4. #include "matrix.h"
  5. #include "suflib.h"
  6. #include "seltype.h"
  7. #include "parts.h"
  8. #include "files.h"
  9.  
  10.  
  11. static int readheader(TokenReader& reader)
  12. {
  13.     char str[120];
  14.     reader.GetLine(str);
  15.     reader.GetLine(str);
  16. #if 0
  17.     if (reader.GetToken(str) == 0 || strcmpi(str, "Frame_number") != 0) {
  18.         return FALSE;
  19.     }
  20.     if (reader.GetToken(str) == 0 || str[0] != '1' || str[1] != '\0') {
  21.         return FALSE;
  22.     }
  23.     if (reader.GetToken(str) == 0 || str[0] != '1' || str[1] != '\0') {
  24.         return FALSE;
  25.     }
  26. #endif
  27.     while (reader.GetToken(str)) {
  28.         if (strcmpi(str, "fram") == 0 || strcmpi(str, "frame") == 0) {
  29.             break;
  30.         }
  31.     }
  32.     if (reader.GetToken(str) == 0 || str[0] != '{') {
  33.         return FALSE;
  34.     }
  35.     if (reader.GetToken(str) == 0 || strcmpi(str, "light") != 0) {
  36.         return FALSE;
  37.     }
  38.     reader.GetLine(str);
  39.     return TRUE;
  40. }
  41.  
  42. static void vectorinit(Vector& pos, Vector& rot, Vector& scal)
  43. {
  44.     pos = rot = Vector(0, 0, 0);
  45.     scal = Vector(1, 1, 1);
  46. }
  47.  
  48. static Vector readvector(TokenReader& reader)
  49. {
  50.     Vector vec(0,0,0);
  51.     char str[64];
  52.     if (reader.GetToken(str) == 0 || str[0] != '(') return vec;
  53.     if (reader.GetToken(str) == 0 || str[0] == ')') return vec;
  54.     if (sscanf(str, "%lf", &(vec.x)) == 0)          return vec;
  55.     if (reader.GetToken(str) == 0 || str[0] == ')') return vec;
  56.     if (sscanf(str, "%lf", &(vec.y)) == 0)          return vec;
  57.     if (reader.GetToken(str) == 0 || str[0] == ')') return vec;
  58.     if (sscanf(str, "%lf", &(vec.z)) == 0)          return vec;
  59.     if (reader.GetToken(str) == 0 || str[0] != ')') return vec;
  60. //    cout << "vec(" << vec.x << "," << vec.y << "," << vec.z << ")\n";
  61.     return vec;
  62. }
  63.  
  64. static double readvalue(TokenReader& reader)
  65. {
  66.     char str[64];
  67.     double val;
  68.     if (reader.GetToken(str) == 0 || str[0] != '(') return 0.0;
  69.     if (reader.GetToken(str) == 0 || str[0] == ')') return 0.0;
  70.     if (sscanf(str, "%lf", &val) == 0)              return 0.0;
  71.     if (reader.GetToken(str) == 0 || str[0] != ')') return 0.0;
  72. //    cout << "value(" << val << ")\n";
  73.     return val;
  74. }
  75.  
  76. static int readobj(TokenReader& reader, char *oname, char *fname)
  77. {
  78.     char str[64];
  79.     if (reader.GetToken(str) == 0) return FALSE;
  80.     strcpy(oname, str);
  81.     fname[0] = '\0';
  82.     if (reader.GetToken(str) == 0) return FALSE;
  83.     if (str[0] == '(') {
  84.         if (reader.GetToken(str) != 0 && str[0] == ':') {
  85.             reader.GetToken(str);
  86.             strcpy(fname, str);
  87.             while (reader.GetToken(str) != 0 && str[0] != ':')
  88.                 ;
  89.             while (reader.GetToken(str) != 0 && str[0] != ')')
  90.                 ;
  91.         }
  92.     } else if (str[0] == '/') {
  93.         if (reader.GetToken(str) != 0 && str[0] == '*') {
  94.             reader.GetToken(str);
  95.             strcpy(fname, str);
  96.             while (reader.GetToken(str) != 0 && str[0] != '*')
  97.                 ;
  98.             while (reader.GetToken(str) != 0 && str[0] != '/')
  99.                 ;
  100.         }
  101.     }
  102.     if (fname[0] == '\0') {
  103.         strcpy(fname, oname);
  104.         strcat(fname, ".suf");
  105.     }
  106. //    cout << "obj= " << oname << " ( " << fname << " )\n";
  107.     return TRUE;
  108. }
  109.  
  110. int Parts::FileRead(Parts* &parts, CameraParts* &camera, char *filename, char *initialdir)
  111. {
  112.     Vector pos, rot, scal;
  113.     Vector camerapos(1000,0,500), cameratarget(0,0,0);
  114.     double angle = deg(60);
  115.  
  116.     parts = NULL;
  117.  
  118.     char str[256];
  119.     char name[32], fname[256];
  120.     TokenReader reader(filename);
  121.     if (!reader.Suceed()) {
  122.         return FALSE;
  123.     }
  124.     if (readheader(reader) == FALSE) {
  125.         return FALSE;
  126.     }
  127.     while (reader.GetToken(str)) {
  128.         if (str[0] == '{') {
  129.             vectorinit(pos,rot,scal);
  130.         } else if (str[0] == '}') {
  131.             ;
  132.         } else if (strcmpi(str, "mov") == 0) {
  133.             pos = readvector(reader);
  134.         } else if (strcmpi(str, "rotx") == 0) {
  135.             rot.x = deg(readvalue(reader));
  136.         } else if (strcmpi(str, "roty") == 0) {
  137.             rot.y = deg(readvalue(reader));
  138.         } else if (strcmpi(str, "rotz") == 0) {
  139.             rot.z = deg(readvalue(reader));
  140.         } else if (strcmpi(str, "scal") == 0) {
  141.             scal = readvector(reader);
  142.         } else if (strcmpi(str, "eye") == 0) {
  143.             if (reader.GetToken(str) != 0 && strcmpi(str, "deg") == 0) {
  144.                 angle = deg(readvalue(reader));
  145.             }
  146.             camerapos = pos;
  147.         } else if (strcmpi(str, "target") == 0) {
  148.             cameratarget = pos;
  149.         } else if (strcmpi(str, "obj") == 0) {
  150.             readobj(reader, name, fname);
  151.             Object *obj;
  152.             obj = SufFile::OpenObject(fname, name);
  153.             if (obj == NULL && initialdir != NULL) {
  154.                 strcpy(str, initialdir);
  155.                 strcat(str, "\\");
  156.                 strcat(str, fname);
  157.                 obj = SufFile::OpenObject(str, name);
  158.             }
  159.             if (obj == NULL) {
  160.                 strcpy(str, simplepartsdir.c_str());
  161.                 strcat(str, fname);
  162.                 obj = SufFile::OpenObject(str, name);
  163.             }
  164.             if (obj == NULL) {
  165.                 strcpy(str, partsdir.c_str());
  166.                 strcat(str, fname);
  167.                 obj = SufFile::OpenObject(str, name);
  168.             }
  169.             if (obj != NULL) {
  170.                 Parts *p = new Parts(obj, pos, rot, scal);
  171.                 p->next = parts;
  172.                 parts = p;
  173.             }
  174.         }
  175.     }
  176.     camera = new CameraParts(camerapos, cameratarget);
  177.     camera->SetAngle(angle);
  178. //    camera->next = parts;
  179. //    parts = camera;
  180.     return TRUE;
  181. }
  182.  
  183.