kamilosxd678

Grafika DX3d

Nov 28th, 2012
177
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 18.95 KB | None | 0 0
  1. //-----------------------------------------------------------------------------
  2. ///
  3. //      Kształt obiektu definiowany jest w przestrzeni modelu. Obiekty możemy
  4. //      przemieszczać (translacja), obracać (rotacja), a także zmieniać ich wielkość
  5. //      (skalowanie), używając "transformacji świata" (ang. world transform).
  6. //      Umieszczamy w ten sposób obiekt w układzie współrzędnych sceny. Następnie
  7. //      musimy w tym układzie ustawić kamerę (oko obserwatora), przez którą będziemy
  8. //      widzieć to, co znajduje się na scenie. Robimy to za pośrednictwem tzw. macierzy
  9. //      widoku. Ostatnim przekształceniem jest tzw. transformacja rzutowania
  10. //      (ang. projection transform), która umożliwia wykonanie dwuwymiarowego "zdjęcia"
  11. //      naszej trójwymiarowej sceny.
  12. //
  13. //      W niniejszym programie korzystamy z D3DX, zestawu narzędzi pomocniczych dla D3D.
  14. //      Używamy np. funkcji inicjujących macierze transformacji. Aby skorzystać z D3DX
  15. //      należy dołączyć plik nagłówkowy <d3dx9.h> i linkować program z biblioteką d3dx9.lib.
  16. //
  17. // Copyright (c) Microsoft Corporation. All rights reserved.
  18. //-----------------------------------------------------------------------------
  19. #include <Windows.h>
  20. #include <mmsystem.h>
  21. #include <d3dx9.h>
  22. #include <iostream>
  23.  
  24. //-----------------------------------------------------------------------------
  25. // zmienne globalne
  26. //-----------------------------------------------------------------------------
  27. LPDIRECT3D9             g_pD3D       = NULL; // obiekt Direct3D (obiekt COM)
  28. LPDIRECT3DDEVICE9       g_pd3dDevice = NULL; // urządzenie wyjściowe (odpowiednik kontekstu graficznego GDI)
  29. LPDIRECT3DVERTEXBUFFER9 g_pVB        = NULL; // bufor wierzchołków
  30. FLOAT mousemoveAngle = 0;
  31. FLOAT oldMousemoveAngle = 0;
  32. bool startRotation = false;
  33. bool startMovement = false;
  34. int dx=0, dy=0;
  35.  
  36. int g_nTriangles;
  37.  
  38. float obser1 = 0.0f;
  39. float obser2 = 3.0f;
  40. float obser3 = 4.0f;
  41. float oobser1 = 0.0f;
  42. float oobser2 = 3.0f;
  43. float oobser3 = 4.0f;
  44.  
  45. // definicja typu wierzchołka
  46. struct CUSTOMVERTEX
  47. {
  48.     FLOAT x, y, z;                  // współrzędne wierzchołka
  49.     FLOAT norm_x, norm_y, norm_z;   // normalna do powierzchni obiektu wyprowadzona z wierzchołka
  50. };
  51.  
  52. // definiujemy "flexible vertex format" (FVF)
  53. #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL)
  54.  
  55.  
  56. //-----------------------------------------------------------------------------
  57. // Nazwa: InitD3D()
  58. // Opis: inicjacja Direct3D
  59. //-----------------------------------------------------------------------------
  60. HRESULT InitD3D( HWND hWnd )
  61. {
  62.     // tworzymy obiekt D3D (obiekt COM)
  63.     if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
  64.         return E_FAIL;
  65.  
  66.     // Ustawiamy strukturę, służącą do utworzenia urządzenia wyjściowego (D3DDevice)
  67.     // Ponieważ tworzymy grafikę 3D, urządzenie musi mieć bufor z.
  68.     D3DPRESENT_PARAMETERS d3dpp;
  69.     ZeroMemory( &d3dpp, sizeof(d3dpp) );
  70.     d3dpp.Windowed = TRUE;
  71.     d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
  72.     d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
  73.     d3dpp.EnableAutoDepthStencil = TRUE;        // włączamy bufor z
  74.     d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
  75.  
  76.     // tworzymy urządzenie wyjściowe (D3DDevice)
  77.     if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
  78.                                       D3DCREATE_SOFTWARE_VERTEXPROCESSING,
  79.                                       &d3dpp, &g_pd3dDevice ) ) )
  80.     {
  81.         return E_FAIL;
  82.     }
  83.  
  84.     // wyłączamy usuwanie niewidocznych powierzchni
  85.     g_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
  86.  
  87.     // włączamy bufor z
  88.     g_pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE );
  89.  
  90.     return S_OK;
  91. }
  92.  
  93.  
  94.  
  95.  
  96. //-----------------------------------------------------------------------------
  97. // Nazwa: InitGeometry()
  98. // Opis: tworzenie obiektów (zawartości sceny)
  99. //-----------------------------------------------------------------------------
  100. HRESULT InitGeometry()
  101. {
  102.     // Tworzymy dwa trójkąty - każdy ma 3 wierzchołki opisane przez 6 liczb.
  103.     /*
  104.         AEF { -1.0f, 1.0f, 0.25f, 0.0f, 0.0f, 1.0f },
  105.             { -0.75f, 0.75f, 0.25f, 0.0f, 0.0f, 1.0f },
  106.             { 0.75f, 0.75f, 0.25f, 0.0f, 0.0f, 1.0f },
  107.         ABF { -1.0f, 1.0f, 0.25f, 0.0f, 0.0f, 1.0f },
  108.             { 1.0f, 1.0f, 0.25f, 0.0f, 0.0f, 1.0f },
  109.             { 0.75f, 0.75f, 0.25f, 0.0f, 0.0f, 1.0f },
  110.         BFH { 1.0f, 1.0f, 0.25f, 0.0f, 0.0f, 1.0f },
  111.             { 0.75f, 0.75f, 0.25f, 0.0f, 0.0f, 1.0f },
  112.             { 0.75f, -0.75f, 0.25f, 0.0f, 0.0f, 1.0f },
  113.         HCB { 1.0f, 1.0f, 0.25f, 0.0f, 0.0f, 1.0f },
  114.             { 0.75f, -0.75f, 0.25f, 0.0f, 0.0f, 1.0f },
  115.             { 1.0f, -1.0f, 0.25f, 0.0f, 0.0f, 1.0f },
  116.         GHC { 1.0f, -1.0f, 0.25f, 0.0f, 0.0f, 1.0f },
  117.             { 0.75f, -0.75f, 0.25f, 0.0f, 0.0f, 1.0f },
  118.             { -0.75f, -0.75f, 0.25f, 0.0f, 0.0f, 1.0f },
  119.         DGC { 1.0f, -1.0f, 0.25f, 0.0f, 0.0f, 1.0f },
  120.             { -1.0f, -1.0f, 0.25f, 0.0f, 0.0f, 1.0f },
  121.             { -0.75f, -0.75f, 0.25f, 0.0f, 0.0f, 1.0f },
  122.         ADG { -1.0f, 1.0f, 0.25f, 0.0f, 0.0f, 1.0f },
  123.             { -1.0f, -1.0f, 0.25f, 0.0f, 0.0f, 1.0f },
  124.             { -0.75f, -0.75f, 0.25f, 0.0f, 0.0f, 1.0f },
  125.         AEG { -1.0f, 1.0f, 0.25f, 0.0f, 0.0f, 1.0f },
  126.             { -0.75f, 0.75f, 0.25f, 0.0f, 0.0f, 1.0f },
  127.             { -0.75f, -0.75f, 0.25f, 0.0f, 0.0f, 1.0f },
  128.         BOCZKI
  129.         AA'B
  130.         A { -1.0f, 1.0f, 0.25f, 0.0f, 0.0f, 1.0f },
  131.         A' { -1.0f, 1.0f, -0.25f, 0.0f, 0.0f, -1.0f },
  132.         B { 1.0f, 1.0f, 0.25f, 0.0f, 0.0f, 1.0f },
  133.         A'B'B
  134.         A' { -1.0f, 1.0f, -0.25f, 0.0f, 0.0f, -1.0f },
  135.         B { 1.0f, 1.0f, 0.25f, 0.0f, 0.0f, 1.0f },
  136.         B' { 1.0f, 1.0f, -0.25f, 0.0f, 0.0f, -1.0f },
  137.         BB'C
  138.         B' { 1.0f, 1.0f, -0.25f, 0.0f, 0.0f, -1.0f },
  139.         B { 1.0f, 1.0f, 0.25f, 0.0f, 0.0f, 1.0f },
  140.         C { 1.0f, -1.0f, 0.25f, 0.0f, 0.0f, 1.0f },
  141.         B'C'C
  142.         B' { 1.0f, 1.0f, -0.25f, 0.0f, 0.0f, -1.0f },
  143.         C' { 1.0f, -1.0f, -0.25f, 0.0f, 0.0f, -1.0f },
  144.         C { 1.0f, -1.0f, 0.25f, 0.0f, 0.0f, 1.0f },
  145.  
  146.  
  147.         A { -1.0f, 1.0f, 0.25f, 0.0f, 0.0f, 1.0f }
  148.         B { 1.0f, 1.0f, 0.25f, 0.0f, 0.0f, 1.0f }
  149.         C { 1.0f, -1.0f, 0.25f, 0.0f, 0.0f, 1.0f }
  150.         D { -1.0f, -1.0f, 0.25f, 0.0f, 0.0f, 1.0f }
  151.         E { -0.75f, 0.75f, 0.25f, 0.0f, 0.0f, 1.0f }
  152.         F { 0.75f, 0.75f, 0.25f, 0.0f, 0.0f, 1.0f }
  153.         G { -0.75f, -0.75f, 0.25f, 0.0f, 0.0f, 1.0f }
  154.         H { 0.75f, -0.75f, 0.25f, 0.0f, 0.0f, 1.0f }
  155.         A' { -1.0f, 1.0f, -0.25f, 0.0f, 0.0f, -1.0f }
  156.         B' { 1.0f, 1.0f, -0.25f, 0.0f, 0.0f, -1.0f }
  157.         C' { 1.0f, -1.0f, -0.25f, 0.0f, 0.0f, -1.0f }
  158.         D' { -1.0f, -1.0f, -0.25f, 0.0f, 0.0f, -1.0f }
  159.         E' { -0.75f, 0.75f, -0.25f, 0.0f, 0.0f, -1.0f }
  160.         F' { 0.75f, 0.75f, -0.25f, 0.0f, 0.0f, -1.0f }
  161.         G' { -0.75f, -0.75f, -0.25f, 0.0f, 0.0f, -1.0f }
  162.         H' { 0.75f, -0.75f, -0.25f, 0.0f, 0.0f, -1.0f }
  163.     */
  164.     CUSTOMVERTEX g_Vertices[] =
  165.     {
  166.         //// Przód
  167.         //AEF
  168.             { -1.0f, 1.0f, 0.25f, 0.0f, 0.0f, 1.0f },
  169.             { -0.75f, 0.75f, 0.25f, 0.0f, 0.0f, 1.0f },
  170.             { 0.75f, 0.75f, 0.25f, 0.0f, 0.0f, 1.0f },
  171.         //ABF
  172.             { -1.0f, 1.0f, 0.25f, 0.0f, 0.0f, 1.0f },
  173.             { 1.0f, 1.0f, 0.25f, 0.0f, 0.0f, 1.0f },
  174.             { 0.75f, 0.75f, 0.25f, 0.0f, 0.0f, 1.0f },
  175.         //BFH
  176.             { 1.0f, 1.0f, 0.25f, 0.0f, 0.0f, 1.0f },
  177.             { 0.75f, 0.75f, 0.25f, 0.0f, 0.0f, 1.0f },
  178.             { 0.75f, -0.75f, 0.25f, 0.0f, 0.0f, 1.0f },
  179.         //HCB
  180.             { 1.0f, 1.0f, 0.25f, 0.0f, 0.0f, 1.0f },
  181.             { 0.75f, -0.75f, 0.25f, 0.0f, 0.0f, 1.0f },
  182.             { 1.0f, -1.0f, 0.25f, 0.0f, 0.0f, 1.0f },
  183.         //GHC
  184.             { 1.0f, -1.0f, 0.25f, 0.0f, 0.0f, 1.0f },
  185.             { 0.75f, -0.75f, 0.25f, 0.0f, 0.0f, 1.0f },
  186.             { -0.75f, -0.75f, 0.25f, 0.0f, 0.0f, 1.0f },
  187.         //DGC
  188.             { 1.0f, -1.0f, 0.25f, 0.0f, 0.0f, 1.0f },
  189.             { -1.0f, -1.0f, 0.25f, 0.0f, 0.0f, 1.0f },
  190.             { -0.75f, -0.75f, 0.25f, 0.0f, 0.0f, 1.0f },
  191.         //ADG
  192.             { -1.0f, 1.0f, 0.25f, 0.0f, 0.0f, 1.0f },
  193.             { -1.0f, -1.0f, 0.25f, 0.0f, 0.0f, 1.0f },
  194.             { -0.75f, -0.75f, 0.25f, 0.0f, 0.0f, 1.0f },
  195.         //AEG
  196.             { -1.0f, 1.0f, 0.25f, 0.0f, 0.0f, 1.0f },
  197.             { -0.75f, 0.75f, 0.25f, 0.0f, 0.0f, 1.0f },
  198.             { -0.75f, -0.75f, 0.25f, 0.0f, 0.0f, 1.0f },
  199.         //// Tył
  200.         //AEF
  201.             { -1.0f, 1.0f, -0.25f, 0.0f, 0.0f, -1.0f },
  202.             { -0.75f, 0.75f, -0.25f, 0.0f, 0.0f, -1.0f },
  203.             { 0.75f, 0.75f, -0.25f, 0.0f, 0.0f, -1.0f },
  204.         //ABF
  205.             { -1.0f, 1.0f, -0.25f, 0.0f, 0.0f, -1.0f },
  206.             { 1.0f, 1.0f, -0.25f, 0.0f, 0.0f, -1.0f },
  207.             { 0.75f, 0.75f, -0.25f, 0.0f, 0.0f, -1.0f },
  208.         //BFH
  209.             { 1.0f, 1.0f, -0.25f, 0.0f, 0.0f, -1.0f },
  210.             { 0.75f, 0.75f, -0.25f, 0.0f, 0.0f, -1.0f },
  211.             { 0.75f, -0.75f, -0.25f, 0.0f, 0.0f, -1.0f },
  212.         //HCB
  213.             { 1.0f, 1.0f, -0.25f, 0.0f, 0.0f, -1.0f },
  214.             { 0.75f, -0.75f, -0.25f, 0.0f, 0.0f, -1.0f },
  215.             { 1.0f, -1.0f, -0.25f, 0.0f, 0.0f, -1.0f },
  216.         //GHC
  217.             { 1.0f, -1.0f, -0.25f, 0.0f, 0.0f, -1.0f },
  218.             { 0.75f, -0.75f, -0.25f, 0.0f, 0.0f, -1.0f },
  219.             { -0.75f, -0.75f, -0.25f, 0.0f, 0.0f, -1.0f },
  220.         //DGC
  221.             { 1.0f, -1.0f, -0.25f, 0.0f, 0.0f, -1.0f },
  222.             { -1.0f, -1.0f, -0.25f, 0.0f, 0.0f, -1.0f },
  223.             { -0.75f, -0.75f, -0.25f, 0.0f, 0.0f, -1.0f },
  224.         //ADG
  225.             { -1.0f, 1.0f, -0.25f, 0.0f, 0.0f, -1.0f },
  226.             { -1.0f, -1.0f, -0.25f, 0.0f, 0.0f, -1.0f },
  227.             { -0.75f, -0.75f, -0.25f, 0.0f, 0.0f, -1.0f },
  228.         //AEG
  229.             { -1.0f, 1.0f, -0.25f, 0.0f, 0.0f, -1.0f },
  230.             { -0.75f, 0.75f, -0.25f, 0.0f, 0.0f, -1.0f },
  231.             { -0.75f, -0.75f, -0.25f, 0.0f, 0.0f, -1.0f },
  232.         ////Boczki
  233.         //AA'B
  234.             { -1.0f, 1.0f, 0.25f, 0.0f, 1.0f, 0.0f },
  235.             { -1.0f, 1.0f, -0.25f, 0.0f, 1.0f, 0.0f },
  236.             { 1.0f, 1.0f, 0.25f, 0.0f, 1.0f, 0.0f },
  237.         //A'B'B
  238.             { -1.0f, 1.0f, -0.25f, 0.0f, 1.0f, 0.0f },
  239.             { 1.0f, 1.0f, 0.25f, 0.0f, 1.0f, 0.0f },
  240.             { 1.0f, 1.0f, -0.25f, 0.0f, 1.0f, 0.0f },
  241.         //BB'C
  242.             { 1.0f, 1.0f, -0.25f, 1.0f, 0.0f, 0.0f },
  243.             { 1.0f, 1.0f, 0.25f, 1.0f, 0.0f, 0.0f },
  244.             { 1.0f, -1.0f, 0.25f, 1.0f, 0.0f, 0.0f },
  245.         //B'C'C
  246.             { 1.0f, 1.0f, -0.25f, 1.0f, 0.0f, 0.0f },
  247.             { 1.0f, -1.0f, -0.25f, 1.0f, 0.0f, 0.0f },
  248.             { 1.0f, -1.0f, 0.25f, 1.0f, 0.0f, 0.0f },
  249.  
  250.    
  251.        
  252.     };
  253.  
  254.     // WAŻNE - LICZBA TRÓJKĄTÓW
  255.     g_nTriangles = 20;
  256.  
  257.     // tworzenie bufora wierchołków
  258.     if( FAILED( g_pd3dDevice->CreateVertexBuffer( 3*g_nTriangles*sizeof(CUSTOMVERTEX),
  259.                                                   0, D3DFVF_CUSTOMVERTEX,
  260.                                                   D3DPOOL_DEFAULT, &g_pVB, NULL ) ) )
  261.     {
  262.         return E_FAIL;
  263.     }
  264.  
  265.     // kopiujemy dane wierzchołków z tablicy g_Vertices[] do bufora DX
  266.     VOID* pVertices;
  267.     if( FAILED( g_pVB->Lock( 0, sizeof(g_Vertices), (void**)&pVertices, 0 ) ) )
  268.         return E_FAIL;
  269.     memcpy( pVertices, g_Vertices, sizeof(g_Vertices) );
  270.     g_pVB->Unlock();
  271.  
  272.     return S_OK;
  273. }
  274.  
  275.  
  276.  
  277.  
  278. //-----------------------------------------------------------------------------
  279. // Nazwa: Cleanup()
  280. // Opis: zwalnianie zainicjowanych wcześniej obiektów
  281. //-----------------------------------------------------------------------------
  282. VOID Cleanup()
  283. {
  284.     if( g_pVB != NULL )
  285.         g_pVB->Release();
  286.  
  287.     if( g_pd3dDevice != NULL )
  288.         g_pd3dDevice->Release();
  289.  
  290.     if( g_pD3D != NULL )
  291.         g_pD3D->Release();
  292. }
  293.  
  294.  
  295.  
  296. //-----------------------------------------------------------------------------
  297. // Nazwa: SetupMatrices()
  298. // Opis: ustawienie macierzy świata, widoku i rzutowania
  299. //-----------------------------------------------------------------------------
  300. VOID SetupMatrices()
  301. {
  302.     // macierz świata będzie definiować jedynie obrót obiektów w okół osi Y
  303.     D3DXMATRIXA16 matWorld;
  304.     D3DXMatrixIdentity(&matWorld);
  305.  
  306.     // Ustawiamy macierz obrotu tak, aby uzyskać 1 pełny obrót (2*PI radianów)
  307.     // co 10 sekund (czyli 10000ms). Aby uniknąć kłopotów związanych z wykonywaniem
  308.     // obliczeń na bardzo dużych liczbach zmiennoprzecinkowych, wyznaczamy resztę
  309.     // z dzielenia czasu systemowego przez okres obrotu przed dokonaniem konwersji
  310.     // na kąt w radianach.
  311.     D3DXMATRIXA16 matRotation;
  312.     UINT  iTime  = timeGetTime() % 10000;
  313.     FLOAT fAngle = iTime * (2.0f * D3DX_PI) / 10000.0f;
  314.     D3DXMatrixRotationY(&matRotation, fAngle );
  315.    
  316.  
  317.     D3DXMatrixMultiply(&matWorld, &matRotation, &matWorld);
  318.  
  319.     g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );
  320.  
  321.     D3DXMATRIXA16 matRotation2;
  322.     D3DXMatrixRotationX(&matRotation2, mousemoveAngle);
  323.  
  324.     D3DXMatrixMultiply(&matWorld, &matRotation2, &matWorld);
  325.  
  326.     g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );
  327.  
  328.     // Tworzymy macierz widoku. Można ją zdefiniować podając położenie oka,
  329.     // punkt, na który patrzymy, oraz kierunek pionu. Poniżej ustawiamy oko
  330.     // 4 jednostki od początku układu wzdłuż osi Z i 3 jednostki ponad powierzchnią
  331.     // XZ, patrzymy w początek układu współrzędnych, a pion wskazuje oś Y.
  332.     D3DXVECTOR3 vEyePt( obser1, obser2, obser3 );
  333.     //D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );
  334.     D3DXVECTOR3 vLookatPt( obser1, 0.0f, obser3-4.0f );
  335.     D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f );
  336.     D3DXMATRIXA16 matView;
  337.     D3DXMatrixLookAtRH( &matView, &vEyePt, &vLookatPt, &vUpVec );
  338.     g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );
  339.  
  340.  
  341.     // Dla macierzy rzutowania ustawiamy przekształcenie perspektywiczne
  342.     // (dzięki któremu transformacja sceny trójwymiarowej na obraz
  343.     // dwuwymiarowy przebiega z uwzględnieniem perspektywy, a więc obiekty
  344.     // znajdujące się dalej są odwzorowywane jako mniejsze). Aby stworzyć
  345.     // przekształcenie perspektywiczne, musimy podać pole widzenia (1/4 PI
  346.     // to typowa wartość), proporcje osi oraz bliską i daleką płaszczyznę
  347.     // odcinającą (które określają odległości od oka, przy jakich obiekty nie są
  348.     // już renderowane).
  349.     D3DXMATRIXA16 matProj;
  350.     D3DXMatrixPerspectiveFovRH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );
  351.     g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
  352. }
  353.  
  354.  
  355. //-----------------------------------------------------------------------------
  356. // Nazwa: SetupLights()
  357. // Opis: ustawienie oświetlenia sceny
  358. //-----------------------------------------------------------------------------
  359. VOID SetupLights()
  360. {
  361.     // Tworzymy materiał, z którego zbudowany jest obiekt. W danej chwili możemy
  362.     // używać tylko jednego materiału.
  363.     D3DMATERIAL9 mtrl;
  364.     ZeroMemory( &mtrl, sizeof(D3DMATERIAL9) );
  365.     mtrl.Diffuse.r = mtrl.Ambient.r = 0.2f;
  366.     mtrl.Diffuse.g = mtrl.Ambient.g = 0.8f;
  367.     mtrl.Diffuse.b = mtrl.Ambient.b = 0.2f;
  368.     mtrl.Diffuse.a = mtrl.Ambient.a = 1.0f;
  369.     g_pd3dDevice->SetMaterial( &mtrl );
  370.  
  371.     // Tworzymy jedno, kierunkowe białe światło
  372.     // Musimy też uruchomić oświetlenie używając stałej D3DRS_LIGHTING w funkcji SetRenderState
  373.     D3DXVECTOR3 vecDir;
  374.     D3DLIGHT9 light;
  375.     ZeroMemory( &light, sizeof(D3DLIGHT9) );
  376.     light.Type       = D3DLIGHT_DIRECTIONAL;
  377.     light.Diffuse.r  = 1.0f;
  378.     light.Diffuse.g  = 1.0f;
  379.     light.Diffuse.b  = 1.0f;
  380.    
  381.     vecDir = D3DXVECTOR3(0.0f,
  382.                          -0.2f,
  383.                          -1.0f);
  384.  
  385.     D3DXVec3Normalize( (D3DXVECTOR3*)&light.Direction, &vecDir );
  386.     light.Range       = 1000.0f;
  387.  
  388.     g_pd3dDevice->SetLight( 0, &light );
  389.     g_pd3dDevice->LightEnable( 0, TRUE );
  390.     g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE );
  391.    
  392. }
  393.  
  394.  
  395.  
  396.  
  397. //-----------------------------------------------------------------------------
  398. // Nazwa: Render()
  399. // Opis: rysowanie sceny
  400. //-----------------------------------------------------------------------------
  401. VOID Render()
  402. {
  403.     // ustawiamy kolor tła
  404.     g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,
  405.                          D3DCOLOR_XRGB(0,70,70), 1.0f, 0 );
  406.  
  407.     // rozpoczęcie rysowania sceny
  408.     if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
  409.     {
  410.         // ustawienie świateł i materiałów
  411.         SetupLights();
  412.  
  413.         // ustawienie macierzy świata, widoku i rzutowania
  414.         SetupMatrices();
  415.  
  416.         g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE );
  417.  
  418.         // renderowanie zawartości bufora wierzchołków
  419.         g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );
  420.         g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
  421.         g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, g_nTriangles );
  422.  
  423.         g_pd3dDevice->SetRenderState( D3DRS_AMBIENT, 0x00202020 );
  424.  
  425.         // zakończenie rysowania sceny
  426.         g_pd3dDevice->EndScene();
  427.     }
  428.  
  429.     // wyświetlenie sceny na ekranie
  430.     g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
  431. }
  432.  
  433.  
  434.  
  435.  
  436. //-----------------------------------------------------------------------------
  437. // Nazwa: MsgProc()
  438. // Opis: obsługa komunikatów wysyłanych do naszego okna
  439. //-----------------------------------------------------------------------------
  440. LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
  441. {
  442.     static int x, y;
  443.    
  444.     switch( msg )
  445.     {
  446.         case WM_DESTROY:
  447.             Cleanup();
  448.             PostQuitMessage( 0 );
  449.             return 0;
  450.  
  451.         case WM_LBUTTONDOWN: //reakcja na lewy przycisk myszki
  452.         {
  453.             startRotation = true;
  454.             x = LOWORD(lParam);
  455.             y = HIWORD(lParam);
  456.             dx = x;
  457.             dy = y;
  458.             return 0;
  459.         }
  460.         case WM_RBUTTONDOWN: //reakcja na lewy przycisk myszki
  461.         {
  462.             startMovement = true;
  463.             x = LOWORD(lParam);
  464.             y = HIWORD(lParam);
  465.             dx = x;
  466.             dy = y;
  467.             return 0;
  468.         }
  469.         case WM_MOUSEMOVE:
  470.             {
  471.                 if(startRotation){
  472.                     mousemoveAngle = oldMousemoveAngle + (HIWORD(lParam)-dy) * 0.005 *D3DX_PI;
  473.                 }
  474.                 if(startMovement){
  475.                     obser3 = oobser3 + (HIWORD(lParam)-dy)*0.05;
  476.                     obser1 = oobser1 + (LOWORD(lParam)-dx)*0.05;
  477.                 }
  478.                 return 0;
  479.             }
  480.         case WM_LBUTTONUP:
  481.             {
  482.                 startRotation = false;
  483.                 oldMousemoveAngle = mousemoveAngle;
  484.                 return 0;
  485.             }
  486.         case WM_RBUTTONUP:
  487.             {
  488.                 startMovement = false;
  489.                 oobser1 = obser1;
  490.                 oobser2 = obser2;
  491.                 oobser3 = obser3;
  492.                 return 0;
  493.             }
  494.  
  495.     }
  496.  
  497.     return DefWindowProc( hWnd, msg, wParam, lParam );
  498. }
  499.  
  500.  
  501.  
  502.  
  503. //-----------------------------------------------------------------------------
  504. // Nazwa: WinMain()
  505. // Opis: program główny
  506. //-----------------------------------------------------------------------------
  507. INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
  508. {
  509.     // rejestracja klasy okna
  510.     WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
  511.                       GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
  512.                       "GK D3D", NULL };
  513.     RegisterClassEx( &wc );
  514.  
  515.     // utworzenie okna naszej aplikacji
  516.     HWND hWnd = CreateWindow( "GK D3D", "Grafika Komputerowa: DirectX",
  517.                               WS_OVERLAPPEDWINDOW, 100, 100, 512, 512,
  518.                               GetDesktopWindow(), NULL, wc.hInstance, NULL );
  519.  
  520.     // inicjacja Direct3D
  521.     if( SUCCEEDED( InitD3D( hWnd ) ) )
  522.     {
  523.         // utworzenie obiektów sceny
  524.         if( SUCCEEDED( InitGeometry() ) )
  525.         {
  526.             // wyświetlenie okna
  527.             ShowWindow( hWnd, SW_SHOWDEFAULT );
  528.             UpdateWindow( hWnd );
  529.  
  530.             // uruchomienie pętli obsługi komunikatów
  531.             MSG msg;
  532.             ZeroMemory( &msg, sizeof(msg) );
  533.             while( msg.message!=WM_QUIT )
  534.             {
  535.                 if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
  536.                 {
  537.                     TranslateMessage( &msg );
  538.                     DispatchMessage( &msg );
  539.                 }
  540.                 else
  541.                     Render();   // <-- RYSOWANIE SCENY
  542.             }
  543.         }
  544.     }
  545.  
  546.     UnregisterClass( "GK D3D", wc.hInstance );
  547.     return 0;
  548. }
Advertisement
Add Comment
Please, Sign In to add comment