3DENGINE.CPP
上传用户:abcdshs
上传日期:2007-01-07
资源大小:1858k
文件大小:9k
源码类别:

游戏

开发平台:

Visual C++

  1. // (C) Copyright 1996 by Anthony J. Carin.  All Rights Reserved.
  2. #include <stdafx.h>
  3. #include "3dengine.h"
  4. #include <stdlib.h>
  5. #include "scrlsurf.h"
  6. #include "3dtools.h"
  7. #include "command.h"
  8. view camera;
  9. const   short BUFSIZE    = 500;
  10. const   uchar COLORDIFF  = 10;
  11. image::image(LPCTSTR filename, direction ydir)
  12. {
  13.    readfile(filename);
  14.    m_size = 1.0f;
  15.    color = RGB(255,255,255);
  16.    m_yoff = ydir;
  17. }
  18. image::~image()
  19. {
  20.    for (int i = 0; i < numsurfs; i++)
  21.    {
  22.        delete m_surfs[i];
  23.        delete m_mysurfs[i];
  24.    }
  25.    delete [] m_points;
  26.    delete [] m_surfs;
  27.    delete [] m_mysurfs;
  28. }
  29. void  image::setbmpsurf(short index, CString& face)
  30. {
  31.     if (index < 0 ||
  32.         index >= numsurfs ||
  33.         Game->Detail() < 7)
  34.         return;
  35.     delete m_mysurfs[index];
  36.     m_mysurfs[index] = new bmpsurf(face);
  37.     ((bmpsurf *)m_mysurfs[index])->ExemptFromIntersect();
  38. }
  39. void  image::readfile(LPCTSTR filename)
  40. {
  41.    char buf[BUFSIZE];
  42.    fptr = fopen(filename, "r");
  43.    if (fptr > 0)
  44.    {
  45.         getsize(buf);
  46.         getpoints(buf);
  47.         getsurfaces(buf);
  48.         buf[0] = 0;
  49.         fgets(buf, BUFSIZE, fptr);
  50.         if (buf[0] != 0)
  51.             findend(buf);
  52.         m_genstring = buf;
  53.         fclose(fptr);
  54.    }
  55. }
  56. void  image::getsize(char *buf)
  57. {
  58.    char *ptr;
  59.    fgets(buf, BUFSIZE, fptr);
  60.    ptr = findend(buf);
  61.    findend(ptr);
  62.    numpoints  = (short)atoi(buf);
  63.    numsurfs   = (short)atoi(ptr);
  64.    m_points   = new point[numpoints];
  65.    m_surfs    = (surfs **) new char[numsurfs*sizeof(surfs *)];
  66.    m_mysurfs  = (surfs **) new char[numsurfs*sizeof(surfs *)];
  67.    for (short i = 0; i < numsurfs; i++)
  68.    {
  69.        m_surfs[i] = new surfs();
  70.        m_mysurfs[i] = new surfs();
  71.    }
  72. }
  73. void  image::getpoints(char *buf)
  74. {
  75.    char *ptr1, *ptr2;
  76.    for (short i = 0; i < numpoints; i++)
  77.    {
  78.       fgets(buf, BUFSIZE, fptr);
  79.       ptr1 = findend(buf);
  80.       ptr2 = findend(ptr1);
  81.       findend(ptr2);
  82.       m_points[i].setto(convertfloat(buf), -convertfloat(ptr1), convertfloat(ptr2));
  83.    }
  84. }
  85. void  image::getsurfaces(char *buf)
  86. {
  87.    char type;
  88.    char *ptr1, *ptr2, *ptr3, *ptr4, *ptr5;
  89.    short p1,p2,p3,p4 = 0;
  90.    CString p5;
  91.    for (short i = 0; i < numsurfs; i++)
  92.    {
  93.       fgets(buf, BUFSIZE, fptr);
  94.       type = (char)atoi(buf);
  95.       ptr1 = findend(buf);
  96.       p1   = (short)(atoi(ptr1) - 1);
  97.       ptr2 = findend(ptr1);
  98.       p2   = (short)(atoi(ptr2) - 1);
  99.       ptr3 = findend(ptr2);
  100.       p3   = (short)(atoi(ptr3) - 1);
  101.       ptr4 = findend(ptr3);
  102.       if (type >= 4 && type <= 6)
  103.       {
  104.           p4 = (short)(atoi(ptr4) - 1);
  105.           ptr5 = findend(ptr4);
  106.           if (type == 5 || type == 6)
  107.           {
  108.               int numbmps = multiplesurfs(ptr5);
  109.               if (numbmps > 1)
  110.               {
  111.                   delete m_mysurfs[i];
  112.                   scrollsurf *sptr = new scrollsurf();
  113.                   while (numbmps--)
  114.                   {
  115.                       ptr4 = findend(ptr5);
  116.                       p5 = (CString) ptr5;
  117.                       sptr->addsurf(p5);
  118.                       ptr5 = ptr4;
  119.                   }
  120.                   m_mysurfs[i] = sptr;
  121.                   if (type == 6)
  122.                      ((bmpsurf *) m_mysurfs[i])->ExemptFromIntersect();
  123.               }
  124.               else
  125.               {
  126.                   findend(ptr5);
  127.                   p5 = (CString) ptr5;
  128.                   delete m_mysurfs[i];
  129.                   m_mysurfs[i] = new bmpsurf(p5);
  130.                   if (type == 6)
  131.                      ((bmpsurf *) m_mysurfs[i])->ExemptFromIntersect();
  132.               }
  133.           }
  134.       }
  135.       if (type == 3)
  136.           m_surfs[i]->setto(m_points[p1], m_points[p2], m_points[p3]);
  137.       else
  138.           m_surfs[i]->setto(m_points[p1], m_points[p2], m_points[p3], m_points[p4]);
  139.       m_surfs[i]->CalcNormals();
  140.    }
  141. }
  142. char * image::findend(char *ptr)
  143. {
  144.    while (*ptr != ' ' && *ptr != 'n')
  145.       ptr++;
  146.    *ptr++ = 0;
  147.    return ptr;
  148. }
  149. int image::multiplesurfs(char *ptr)
  150. {
  151.    int num = 1;
  152.    char spaces = FALSE;
  153.    while (*ptr != '' && *ptr != 'n')
  154.    {
  155.       if (*ptr == ' ' || *ptr == 't')
  156.           spaces = TRUE;
  157.       if (*ptr != ' ' && *ptr != 't' && spaces == TRUE)
  158.       {
  159.           spaces = FALSE;
  160.           num++;
  161.       }
  162.       ptr++;
  163.    }
  164.    return num;
  165. }
  166. void  image::draw()
  167. {
  168.     if (outofrange())
  169.         return;
  170.     copysurfs();
  171.     Game->Tool3d()->material(color);
  172.     if (Game->Detail() < 10)
  173.     {
  174.         for (short i = 0; i < numsurfs; i++)
  175.             if (m_mysurfs[i]->IsABmp() || random((short)((int)Game->Detail()+2)) != 1)
  176.                 m_mysurfs[i]->draw();
  177.     }
  178.     else
  179.     {
  180.         for (short i = 0; i < numsurfs; i++)
  181.             m_mysurfs[i]->draw();
  182.     }
  183. }
  184. char image::outofrange()
  185. {
  186.     xdirfromcamera = camera.xdirectionto(m_view);
  187.     ydirfromcamera = camera.ydirectionto(m_view);
  188.     direction xdir = xdirfromcamera - camera.xdirection();
  189.     direction ydir = ydirfromcamera - camera.ydirection();
  190.     if (camera.distanceto(m_view) > VIEWRANGE)
  191.         return TRUE;
  192.     if (ydir > (direction) TC_PI && ydir < (direction) -TC_PI)
  193.         return TRUE;
  194.     if (xdir > (direction) TC_PI && xdir < (direction) -TC_PI)
  195.         return TRUE;
  196.     return FALSE;
  197. }
  198. void image::OnlySurfExemptFromIntersect()
  199. {
  200.     if (numsurfs > 0)
  201.     {
  202.         if (m_mysurfs[0]->IsABmp())
  203.             ((bmpsurf *)m_mysurfs[0])->ExemptFromIntersect();
  204.     }
  205. }
  206. surfs * image::OnlySurf()
  207. {
  208.     if (numsurfs > 0)
  209.         return m_mysurfs[0];
  210.     return (surfs *) 0;
  211. }
  212. void image::copysurfs()
  213. {
  214.     for (short i = 0; i < numsurfs; i++)
  215.     {
  216.         *m_mysurfs[i] = *m_surfs[i];
  217.         m_mysurfs[i]->xrotate(m_view.xdirection());
  218.         m_mysurfs[i]->zrotate(m_view.zdirection());
  219.         m_mysurfs[i]->yrotate(m_view.ydirection()+m_yoff);
  220.         *m_mysurfs[i] += m_view;
  221.     }
  222. }
  223. void surfs::operator =(surfs& s)
  224. {
  225.    NormalX      = s.NormalX;
  226.    NormalY      = s.NormalY;
  227.    NormalZ      = s.NormalZ;
  228.    polygon::operator =(s);
  229. }
  230. void surfs::xrotate(direction& d)
  231. {
  232.    if (!d.iszero())
  233.    {
  234.        m_a.xrotate(d);
  235.        m_b.xrotate(d);
  236.        m_c.xrotate(d);
  237.        m_d.xrotate(d);
  238.    }
  239. }
  240. void surfs::yrotate(direction& d)
  241. {
  242.    if (!d.iszero())
  243.    {
  244.        m_a.yrotate(d);
  245.        m_b.yrotate(d);
  246.        m_c.yrotate(d);
  247.        m_d.yrotate(d);
  248.    }
  249. }
  250. void surfs::zrotate(direction& d)
  251. {
  252.    if (!d.iszero())
  253.    {
  254.        m_a.zrotate(d);
  255.        m_b.zrotate(d);
  256.        m_c.zrotate(d);
  257.        m_d.zrotate(d);
  258.    }
  259. }
  260. void surfs::operator +=(coordinate& c)
  261. {
  262.    m_a += c;
  263.    m_b += c;
  264.    m_c += c;
  265.    m_d += c;
  266. }
  267. void surfs::draw()
  268. {
  269.     if (m_linenum == 3)
  270.     {
  271.         Game->Tool3d()->begintriangle();
  272.         Game->Tool3d()->normals(NormalX, NormalY, NormalZ);
  273.         Game->Tool3d()->vertex(m_a.x(), m_a.y(), m_a.z());
  274.         Game->Tool3d()->vertex(m_b.x(), m_b.y(), m_b.z());
  275.         Game->Tool3d()->vertex(m_c.x(), m_c.y(), m_c.z());
  276.         Game->Tool3d()->end();
  277.     }
  278.     else
  279.     {
  280.         Game->Tool3d()->beginquad();
  281.         Game->Tool3d()->normals(NormalX, NormalY, NormalZ);
  282.         Game->Tool3d()->vertex(m_a.x(), m_a.y(), m_a.z());
  283.         Game->Tool3d()->vertex(m_b.x(), m_b.y(), m_b.z());
  284.         Game->Tool3d()->vertex(m_c.x(), m_c.y(), m_c.z());
  285.         Game->Tool3d()->vertex(m_d.x(), m_d.y(), m_d.z());
  286.         Game->Tool3d()->end();
  287.     }
  288. }
  289. void surfs::CalcNormals()
  290. {
  291.     coordinate a,b;
  292.     a = m_b - m_a;
  293.     b = m_c - m_a;
  294.     NormalX = a.y() * b.z() - a.z() * b.y();
  295.     NormalY = a.z() * b.x() - a.x() * b.z();
  296.     NormalZ = a.x() * b.y() - a.y() * b.x();
  297.     float length = (float)sqrt(NormalX*NormalX+NormalY*NormalY+NormalZ*NormalZ);
  298.     if (length != 0)
  299.     {
  300.         NormalX /= length;
  301.         NormalY /= length;
  302.         NormalZ /= length;
  303.     }
  304. }
  305. char surfs::iswithin(coordinate& c)
  306. {
  307.     if (m_linenum == 0)
  308.         return FALSE;
  309.     if (m_c.x() == m_b.x())
  310.     {
  311.         if (m_c.z() < m_b.z())
  312.         {
  313.             if (c.z() < m_c.z() ||  c.z() > m_b.z())
  314.                 return FALSE;
  315.         }
  316.         else
  317.         {
  318.             if (c.z() < m_b.z() ||  c.z() > m_c.z())
  319.                 return FALSE;
  320.         }
  321.         if (m_c.x() < m_d.x())
  322.         {
  323.             if (c.x() < m_c.x() ||  c.x() > m_d.x())
  324.                 return FALSE;
  325.         }
  326.         else
  327.         {
  328.             if (c.x() < m_d.x() ||  c.x() > m_c.x())
  329.                 return FALSE;
  330.         }
  331.     }
  332.     else
  333.     {
  334.         if (m_c.z() < m_d.z())
  335.         {
  336.             if (c.z() < m_c.z() ||  c.z() > m_d.z())
  337.                 return FALSE;
  338.         }
  339.         else
  340.         {
  341.             if (c.z() < m_d.z() ||  c.z() > m_c.z())
  342.                 return FALSE;
  343.         }
  344.         if (m_c.x() < m_b.x())
  345.         {
  346.             if (c.x() < m_c.x() ||  c.x() > m_b.x())
  347.                 return FALSE;
  348.         }
  349.         else
  350.         {
  351.             if (c.x() < m_b.x() ||  c.x() > m_c.x())
  352.                 return FALSE;
  353.         }
  354.     }
  355.     return TRUE;
  356. }