Advertisement
Guest User

Untitled

a guest
Nov 25th, 2010
262
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.93 KB | None | 0 0
  1. __declspec( naked ) HRESULT WINAPI hkClear (LPDIRECT3DDEVICE9 pDevice, DWORD Count, CONST D3DRECT* pRects, DWORD Flags, D3DCOLOR Color, float Z, DWORD Stencil)
  2. {
  3.     __asm nop
  4.     __asm pushad
  5.     if (g_pD3DRenderer->shouldStopClear()) Flags &= (~D3DCLEAR_ZBUFFER);
  6.     __asm popad
  7.     __asm jmp oClear
  8. }
  9.  
  10. #include "D3DRenderer.h"
  11.  
  12. D3DRenderer::D3DRenderer()
  13. {
  14.     pDevice = NULL;
  15.     initialized = false;
  16.     BeginSceneCallback();
  17. }
  18.  
  19. void D3DRenderer::Init(LPDIRECT3DDEVICE9 device)
  20. {
  21.     if (initialized) return;
  22.     initialized = true;
  23.     pDevice = device;
  24.     LPD3DXBUFFER adj;
  25.     LPDIRECT3DVERTEXBUFFER9 pTempVertexBuffer;
  26.     LPD3DXMESH pTempSphereMesh   = NULL;
  27.     if (D3DXCreateSphere(pDevice, 0.5, 32, 32, &pTempSphereMesh, &adj) == D3D_OK) {
  28.         pTempSphereMesh->CloneMeshFVF(0, D3DFVF_MY_VERTEX, pDevice, &sphereMesh);
  29.         pTempSphereMesh->Release();
  30.         if (sphereMesh->OptimizeInplace(D3DXMESHOPT_ATTRSORT, (DWORD*)adj->GetBufferPointer(), NULL, NULL, NULL) != D3D_OK)
  31.             sphereMesh = NULL;
  32.     }
  33.  
  34.     D3DXCreateSprite(pDevice, &SptDraw);
  35.     D3DXCreateFont(pDevice, 18, 0, 900, 0, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, ANTIALIASED_QUALITY, DEFAULT_PITCH | FF_DONTCARE, TEXT("Monaco"), &pFont);
  36.    
  37.     ZeroMemory( &m_material, sizeof(D3DMATERIAL9) );
  38.     m_material.Ambient.r = m_material.Ambient.g = m_material.Ambient.b = 0.6;
  39.     m_material.Ambient.a = .4;
  40.     m_material.Diffuse.r = 1.0;
  41.     m_material.Diffuse.g = 1.0;
  42.     m_material.Diffuse.b = 0.0;
  43.     m_material.Diffuse.a = .7;
  44.     pDevice->SetMaterial( &m_material );
  45.  
  46.     ZeroMemory( &light, sizeof(light) );
  47.     light.Type = D3DLIGHT_DIRECTIONAL;
  48.  
  49.     D3DXVECTOR3 vecDir;
  50.     vecDir = D3DXVECTOR3(0, -1, 0.2);
  51.     D3DXVec3Normalize( (D3DXVECTOR3*)&light.Direction, &vecDir );
  52.  
  53.     // set directional light diffuse color
  54.     light.Diffuse.r = 1.0f;
  55.     light.Diffuse.g = 1.0f;
  56.     light.Diffuse.b = 1.0f;
  57.     light.Diffuse.a = 1.0f;
  58.  
  59.     BeginSceneCallback();
  60. }
  61.  
  62. void D3DRenderer::BeginSceneCallback()
  63. {
  64.     stride4 = stride48 = stride64 = 0;
  65.     playerStencilSurface = NULL;
  66.     stopClear = false;
  67.  
  68.  
  69.     spheres.clear();
  70.     strings.clear();
  71.     rects.clear();
  72.     textures.clear();
  73. }
  74.  
  75. void D3DRenderer::DrawIndexedPrimitiveCallback(int stride)
  76. {
  77.     if (stride == 4) stride4++;
  78.     else if (stride == 48) stride48++;
  79.     else if (stride == 64) stride64++;
  80.    
  81. }
  82. void D3DRenderer::SetDepthStencilSurfaceCallback(LPDIRECT3DSURFACE9 pSurface)
  83. {
  84.     if (!pDevice) return;
  85.     if (stride4 && stride48 && stride64) pDevice->GetDepthStencilSurface(&playerStencilSurface);
  86.     stopClear = (playerStencilSurface == pSurface);
  87.     stride4 = stride48 = stride64 = 0;
  88. }
  89. bool D3DRenderer::shouldStopClear()
  90. {
  91.     return stopClear;
  92. }
  93. void D3DRenderer::Render(dice::RenderView *view) {
  94.     DWORD fvf, fillmode;
  95.     LPDIRECT3DBASETEXTURE9 texture;
  96.     LPDIRECT3DPIXELSHADER9 pixelshader;
  97.     LPDIRECT3DVERTEXSHADER9 vertexshader;
  98.     LPDIRECT3DSURFACE9 depthsurface;
  99.     D3DXMATRIX s_world, s_view, s_proj;
  100.  
  101.     pDevice->GetFVF( &fvf );
  102.     pDevice->GetTexture( 0, &texture );
  103.     pDevice->GetPixelShader( &pixelshader );
  104.     pDevice->GetVertexShader( &vertexshader );
  105.     pDevice->GetRenderState( D3DRS_FILLMODE, &fillmode);
  106.     pDevice->GetTransform(D3DTS_WORLD, &s_world);
  107.     pDevice->GetTransform(D3DTS_VIEW, &s_view);
  108.     pDevice->GetTransform(D3DTS_PROJECTION, &s_proj);
  109.     pDevice->GetDepthStencilSurface(&depthsurface);
  110.     pDevice->SetLight( 0, &light );
  111.     pDevice->LightEnable( 0, TRUE );
  112.  
  113.     pDevice->SetTexture( 0, NULL );
  114.     pDevice->SetPixelShader( NULL );
  115.     pDevice->SetVertexShader( NULL );
  116.     pDevice->SetDepthStencilSurface(playerStencilSurface);
  117.  
  118.     pDevice->SetFVF( D3DFVF_MY_VERTEX );
  119.  
  120.     pDevice->SetRenderState(D3DRS_LIGHTING, TRUE);
  121.     pDevice->SetRenderState(D3DRS_COLORVERTEX, TRUE);
  122.     pDevice->SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_MATERIAL);
  123.     pDevice->SetRenderState(D3DRS_AMBIENTMATERIALSOURCE, D3DMCS_MATERIAL);
  124.     pDevice->SetRenderState(D3DRS_AMBIENT, D3DCOLOR_RGBA(1, 1, 1, 1));
  125.     pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
  126.     pDevice->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
  127.     pDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
  128.     pDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE );
  129.     pDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESS);
  130.     pDevice->SetRenderState(D3DRS_ZWRITEENABLE, TRUE);
  131.     pDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
  132.  
  133.     pDevice->SetTransform(D3DTS_VIEW, &view->m_viewMatrix);
  134.     pDevice->SetTransform(D3DTS_PROJECTION, &view->m_projectionMatrix);
  135.     D3DXMATRIX worldMatrix;
  136.     D3DXMatrixIdentity(&worldMatrix);
  137.     for (vector<RenderSphere>::iterator it = spheres.begin(); it != spheres.end(); it++)
  138.     {
  139.         D3DXMatrixTranslation(&worldMatrix, it->pos.x, it->pos.y, it->pos.z);
  140.         worldMatrix._11 = worldMatrix._22 = worldMatrix._33 = it->radius;
  141.         pDevice->SetTransform(D3DTS_WORLD, &worldMatrix);
  142.         sphereMesh->DrawSubset(0);
  143.     }
  144.  
  145.     pDevice->SetRenderState(D3DRS_FILLMODE, fillmode);
  146.     pDevice->SetPixelShader( pixelshader );
  147.     pDevice->SetTexture( 0, texture );
  148.     pDevice->SetFVF( fvf );
  149.     pDevice->SetVertexShader( vertexshader );
  150.     pDevice->SetDepthStencilSurface(depthsurface);
  151.  
  152.     SptDraw->Begin(D3DXSPRITE_ALPHABLEND);
  153.     for (vector<RenderString>::iterator it = strings.begin(); it != strings.end(); it++) {
  154.         RECT rct;  
  155.         rct.left     = it->x - 1;  
  156.         rct.right    = it->x + 1;  
  157.         rct.top      = it->y - 1;  
  158.         rct.bottom   = it->y + 1;
  159.         pFont->DrawTextA(SptDraw, it->str, -1, &rct, DT_NOCLIP | DT_CENTER, it->color);
  160.     }
  161.  
  162.     for (vector<RenderTexture>::iterator it = textures.begin(); it != textures.end(); it++)
  163.         SptDraw->Draw(it->texture,NULL,NULL,&D3DXVECTOR3(it->x,it->x, 0.0f), 0xFFFFFFFF);
  164.  
  165.     SptDraw->End();
  166.  
  167.     for (vector<RenderRect>::iterator it = rects.begin(); it != rects.end(); it++)
  168.         pDevice->Clear(1, &it->rect, D3DCLEAR_TARGET, it->color, 0, 0);
  169.  
  170. }
  171.  
  172. void D3DRenderer::PrintText(long x, long y, D3DCOLOR fontColor, char *text, ...)
  173. {
  174.     if(!text) { return; }
  175.     RenderString rs;
  176.     va_list va_alist;
  177.     va_start (va_alist, text);
  178.     _vsnprintf (rs.str, 512, text, va_alist);
  179.     va_end (va_alist);
  180.     rs.x = x;
  181.     rs.y = y;
  182.     rs.color = fontColor;
  183.     strings.push_back(rs);
  184. }
  185. void D3DRenderer::DrawSphere(D3DXVECTOR3 *pos, float radius, D3DCOLOR col)
  186. {
  187.     RenderSphere rs;
  188.     rs.pos = *pos;
  189.     rs.col = col;
  190.     rs.radius = radius;
  191.     spheres.push_back(rs);
  192. }
  193. void D3DRenderer::DrawRect(int startx, int starty, int endx, int endy, D3DCOLOR col)
  194. {
  195.     #define RECT_ASSIGN(r, a, b, c, d) r.x1 = a; r.y1 = b; r.x2 = c; r.y2 = d
  196.     RenderRect rr;
  197.     RECT_ASSIGN(rr.rect, startx, starty, endx, endy);
  198.     rr.color = col;
  199.     rects.push_back(rr);
  200. }
  201.  
  202. void D3DRenderer::DrawBox(int startx, int starty, int endx, int endy, int width, D3DCOLOR col)
  203. {
  204.     DrawRect(startx, starty, startx + width, endy, col);
  205.     DrawRect(endx, starty, endx + width, endy, col);
  206.     DrawRect(startx, starty, endx, starty + width, col);
  207.     DrawRect(startx, endy, endx, endy + width, col);
  208. }
  209.  
  210. void D3DRenderer::DrawTexture(int x, int y, LPDIRECT3DTEXTURE9 dTexture)
  211. {
  212.     RenderTexture rt;
  213.     rt.x = x;
  214.     rt.y = y;
  215.     rt.texture = dTexture;
  216.     textures.push_back(rt);
  217. }
  218.  
  219. D3DRenderer::~D3DRenderer(void)
  220. {
  221. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement