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

游戏

开发平台:

Visual C++

  1. // (C) Copyright 1996 by Anthony J. Carin.  All Rights Reserved.
  2. #include "stdafx.h"
  3. #include "3dengine.h"
  4. #include "bmpsurf.h"
  5. #include "3dtools.h"
  6. bmpsurf::bmpsurf(CString& filename) : surfs()
  7. {
  8.     m_red   = new float[256];
  9.     m_green = new float[256];
  10.     m_blue  = new float[256];
  11.     LoadBitmapFile(filename);
  12.     CreateColorTables();
  13.     prev = 0;
  14.     next = Game->Bmpsurfs()->m_First;
  15.     if (Game->Bmpsurfs()->m_First)
  16.         Game->Bmpsurfs()->m_First->prev = this;
  17.     Game->Bmpsurfs()->m_First = this;
  18.     m_exempt = FALSE;
  19.     if (fabs(m_a.y() - m_c.y()) < 1.0)
  20.         m_higharea = new higharea(*this);
  21.     else
  22.         m_higharea = NULL;
  23. }
  24. bmpsurf::~bmpsurf()
  25. {
  26.     char *ptr = (char *) m_pBmInfo;
  27.     delete [] ptr;
  28.     delete [] m_red;
  29.     delete [] m_green;
  30.     delete [] m_blue;
  31.     delete m_higharea;
  32.     if (prev)
  33.     {
  34.         prev->next = next;
  35.         if (next)
  36.             next->prev = prev;
  37.         if (Game->Bmpsurfs()->m_Curr == this)
  38.             Game->Bmpsurfs()->m_Curr = Game->Bmpsurfs()->m_First;
  39.     }
  40.     else
  41.     {
  42.         Game->Bmpsurfs()->m_First = next;
  43.         if (Game->Bmpsurfs()->m_Curr == this)
  44.             Game->Bmpsurfs()->m_Curr = Game->Bmpsurfs()->m_First;
  45.         if (next)
  46.             next->prev = 0;
  47.     }
  48. }
  49. void bmpsurf::LoadBitmapFile(CString& filename)
  50. {
  51.     CFile file(filename, CFile::modeRead);
  52.     BITMAPFILEHEADER bmFileHeader;
  53.     file.Read((void*)&bmFileHeader, sizeof(bmFileHeader));
  54.     if (bmFileHeader.bfType != 0x4d42)
  55.     {
  56.         AfxMessageBox("Not a bitmap file");
  57.         m_pBmFileHeader = 0;
  58.         m_pBmInfo       = 0;
  59.         m_pBmInfoHeader = 0;
  60.         m_pRGBTable     = 0;
  61.         m_pDibBits      = 0;
  62.         m_numColors     = 0;
  63.     }    
  64.     else
  65.     {
  66.         DWORD fileLength = file.GetLength();    
  67.         dibSize = fileLength - sizeof(bmFileHeader);
  68.         char* pDib = new char[dibSize];
  69.         file.Read((void*)pDib, dibSize);
  70.         file.Close();
  71.         m_pBmInfo = (LPBITMAPINFO) pDib;
  72.         m_pBmInfoHeader = (LPBITMAPINFOHEADER) pDib;
  73.         m_pRGBTable = (RGBQUAD*)(pDib + m_pBmInfoHeader->biSize);
  74.         uint m_numColors = GetDibNumColors();
  75.         m_pBmInfoHeader->biSizeImage = GetDibSizeImage();
  76.         if (m_pBmInfoHeader->biClrUsed == 0)
  77.             m_pBmInfoHeader->biClrUsed = m_numColors;
  78.         DWORD clrTableSize = m_numColors * sizeof(RGBQUAD);
  79.         m_pDibBits = pDib + m_pBmInfoHeader->biSize + clrTableSize;
  80.     }
  81. }
  82. DWORD bmpsurf::GetDibSizeImage()
  83. {
  84.     if (m_pBmInfoHeader->biSizeImage == 0)
  85.     {
  86.         DWORD byteWidth = (DWORD) GetDibWidth();
  87.         DWORD height = (DWORD) GetDibHeight();
  88.         DWORD imageSize = byteWidth * height;
  89.         return imageSize;
  90.     }
  91.     else
  92.         return m_pBmInfoHeader->biSizeImage;
  93. }
  94. uint bmpsurf::GetDibNumColors()
  95. {
  96.     if ((m_pBmInfoHeader->biClrUsed == 0) &&
  97.           (m_pBmInfoHeader->biBitCount < 9))
  98.         return (1 << m_pBmInfoHeader->biBitCount);
  99.     else
  100.         return (int) m_pBmInfoHeader->biClrUsed;
  101. }
  102.     
  103. void bmpsurf::CreateColorTables()
  104. {
  105.     LPRGBQUAD pColorTable = GetDibRGBTablePtr();
  106.     
  107.     for (uint i = 0; i < 256; i++)
  108.     {
  109.         m_red[i] = (float) pColorTable[i].rgbRed / 255;
  110.         m_green[i] = (float) pColorTable[i].rgbGreen / 255;
  111.         m_blue[i] = (float) pColorTable[i].rgbBlue / 255;
  112.     }
  113.     wglMakeCurrent(Game->hdc, Game->hrc);
  114.     glPixelMapfv(GL_PIXEL_MAP_I_TO_R, 256, m_red);
  115.     glPixelMapfv(GL_PIXEL_MAP_I_TO_G, 256, m_green);
  116.     glPixelMapfv(GL_PIXEL_MAP_I_TO_B, 256, m_blue);
  117.     glPixelTransferi(GL_MAP_COLOR, TRUE);
  118.     wglMakeCurrent(Game->hdc, NULL);
  119. }
  120. void bmpsurf::draw()
  121. {
  122.     glTexImage2D(GL_TEXTURE_2D, 0, 3, GetDibWidth(), GetDibHeight(),
  123.         0, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, (GLvoid*) GetDibBitsPtr());
  124.     Game->Tool3d()->beginbmp();
  125.     Game->Tool3d()->bmpvertex1(m_a.x(), m_a.y(), m_a.z());
  126.     Game->Tool3d()->bmpvertex2(m_b.x(), m_b.y(), m_b.z());
  127.     Game->Tool3d()->bmpvertex3(m_c.x(), m_c.y(), m_c.z());
  128.     Game->Tool3d()->bmpvertex4(m_d.x(), m_d.y(), m_d.z());
  129.     Game->Tool3d()->endbmp();
  130. }
  131. void bmpsurf::operator =(surfs& s)
  132. {
  133.     if (m_higharea)
  134.         *((surfs *)m_higharea) = s;
  135.     surfs::operator =(s);
  136. }
  137. char bmpsurf::intersects(coordinate &a, coordinate &b)
  138. {
  139.     if (m_exempt)
  140.         return FALSE;
  141.     if (!sameintersectpoints(a,b))
  142.         calcintersect(a,b);
  143.     return m_intersects;
  144. }
  145. void bmpsurf::calcintersect(coordinate& pa,coordinate& pb)
  146. {
  147.     point mid;
  148.     float b, m;
  149.     point tmpcoord;
  150.     coordinate savecenter;
  151.     coordinate center = savecenter = getcenter();
  152.     m_intersectfrom = pa;
  153.     m_intersectto   = pb;
  154.     surfs tmpsurf((coordinate)(m_a - center),
  155.                   (coordinate)(m_b - center),
  156.                   (coordinate)(m_c - center),
  157.                   (coordinate)(m_d - center));
  158.     point npa  = pa - center;
  159.     point npb  = pb - center;
  160.     center.setx(0.0f);
  161.     center.sety(0.0f);
  162.     center.setz(0.0f);
  163.     mid.setto((tmpsurf.a().x() + tmpsurf.b().x()) / 2,
  164.               (tmpsurf.a().y() + tmpsurf.b().y()) / 2,
  165.               (tmpsurf.a().z() + tmpsurf.b().z()) / 2);
  166.     direction ydir = center.ydirectionto(mid);
  167.     ydir = ydir - (direction) TC_PI_2;
  168.     tmpsurf.yrotate(ydir);
  169.     npa.yrotate(ydir);
  170.     npb.yrotate(ydir);
  171.     mid.setto((tmpsurf.a().x() + tmpsurf.b().x()) / 2,
  172.               (tmpsurf.a().y() + tmpsurf.b().y()) / 2,
  173.               (tmpsurf.a().z() + tmpsurf.b().z()) / 2);
  174.     direction zdir = center.zdirectionto(mid);
  175.     zdir = zdir - (direction) TC_PI_2;
  176.     tmpsurf.zrotate(zdir);
  177.     npa.zrotate(zdir);
  178.     npb.zrotate(zdir);
  179.     mid.setto((tmpsurf.a().x() + tmpsurf.b().x()) / 2,
  180.               (tmpsurf.a().y() + tmpsurf.b().y()) / 2,
  181.               (tmpsurf.a().z() + tmpsurf.b().z()) / 2);
  182.     direction xdir = mid.xdirectionto(tmpsurf.a());
  183.     tmpsurf.xrotate(xdir);
  184.     npa.xrotate(xdir);
  185.     npb.xrotate(xdir);
  186.     if ((npa.y() < 0 && npb.y() < 0) ||
  187.         (npa.y() >= 0 && npb.y() >= 0))
  188.     {
  189.         m_intersects = FALSE;
  190.         return;
  191.     }
  192.     m = npa.x() - npb.x();
  193.     tmpcoord.sety(0.0f);
  194.     if (m == 0)
  195.         tmpcoord.setx(npa.x());
  196.     else
  197.     {
  198.         m = (npa.y() - npb.y()) / m;
  199.         if (m == 0)
  200.         {
  201.             m_intersects = FALSE;
  202.             return;
  203.         }
  204.         b = npa.y() - m * npa.x();
  205.         tmpcoord.setx(-b/m);
  206.     }
  207.     m = npa.z() - npb.z();
  208.     if (m == 0)
  209.         tmpcoord.setz(npa.z());
  210.     else
  211.     {
  212.         m = (npa.y() - npb.y()) / m;
  213.         if (m == 0)
  214.         {
  215.             m_intersects = FALSE;
  216.             return;
  217.         }
  218.         b = npa.y() - m * npa.z();
  219.         tmpcoord.setz(-b/m);
  220.     }
  221.     if (!tmpsurf.iswithin(tmpcoord))
  222.     {
  223.         m_intersects = FALSE;
  224.         return;
  225.     }
  226.     m_intersects = TRUE;
  227.     tmpcoord.xrotate(-xdir);
  228.     tmpcoord.zrotate(-zdir);
  229.     tmpcoord.yrotate(-ydir);
  230.     m_intersectpoint = tmpcoord + savecenter;
  231.     return;
  232. }
  233. void bmpsurf::operator +=(coordinate& c)
  234. {
  235.     if (m_higharea)
  236.         m_higharea->operator +=(c);
  237.     surfs::operator +=(c);
  238. }
  239. void bmpsurf::setto(coordinate& a, coordinate& b, coordinate& c, coordinate& d)
  240. {
  241.     if (m_higharea)
  242.         m_higharea->setto(a,b,c,d);
  243.     surfs::setto(a,b,c,d);
  244. }
  245. void bmpsurf::ExemptFromIntersect()
  246. {
  247.     m_exempt = TRUE;
  248.     if (m_higharea)
  249.     {
  250.         delete m_higharea;
  251.         m_higharea = NULL;
  252.     }
  253. }
  254. void bmpsurf::OKToIntersect()
  255. {
  256.     m_exempt = FALSE;
  257.     if (!m_higharea)
  258.     {
  259.         if (fabs(m_a.y() - m_c.y()) < 1.0)
  260.             m_higharea = new higharea(*this);
  261.         else
  262.             m_higharea = NULL;
  263.     }
  264. }
  265. void bmplist::Purge()
  266. {
  267.     bmpsurf *TmpFirst = m_First;
  268.     bmpsurf *TmpCurr;
  269.     while (TmpFirst)
  270.     {
  271.         TmpCurr = TmpFirst;
  272.         TmpFirst = TmpFirst->next;
  273.         delete m_Curr;
  274.     }
  275.     m_First = m_Curr = 0;
  276. }