HRESULT CImageHandler::DrawBillBoard(LPDIRECT3DDEVICE7 lpDevice, D3DVECTOR vTrans, D3DVECTOR vScale, /*D3DVECTOR vRot, */D3DMATERIAL7 mtrl, /*FLOAT fRotRad, */LPDIRECTDRAWSURFACE7 lpddsTextr) { if ( lpDevice ) { if( SUCCEEDED(lpDevice->BeginScene()) ) { D3DMATRIX matTrans; D3DMATRIX matScale; D3DMATRIX matRot; D3DMATRIX matWorld; D3DMATRIX matTempWorld; D3DMATRIX matWorldOriginal; lpDevice->GetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal); vTrans.x = vTrans.x+vScale.x/2-400; vTrans.y = -vTrans.y-vScale.y/2+300; D3DUtil_SetTranslateMatrix(matTrans, vTrans); D3DUtil_SetScaleMatrix(matScale, vScale.x, vScale.y, vScale.z); // D3DUtil_SetRotationMatrix(matRot, vRot, fRotRad); D3DMath_MatrixMultiply(/*matTempWorld*/matWorld, matScale, matTrans); // D3DMath_MatrixMultiply(matWorld, matRot, matTempWorld); lpDevice->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorld); SetBlendRenderState(lpDevice, _BLEND_NORMAL, mtrl); lpDevice->SetMaterial(&mtrl); lpDevice->SetTexture(0, lpddsTextr); lpDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, D3DFVF_VERTEX, m_avBillBoard, 4, NULL); // 원상복귀. ZeroMemory(&mtrl, sizeof(mtrl)); mtrl.diffuse.r = mtrl.diffuse.g = mtrl.diffuse.b = 0.1f; mtrl.ambient.r = mtrl.ambient.g = mtrl.ambient.b = 1.0f; lpDevice->SetMaterial(&mtrl); ResetBlendenderState(lpDevice); lpDevice->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal); } lpDevice->EndScene(); return S_OK; } return E_FAIL; }
/// <summary> /// <c>wBeginScene</c> /// </summary> /// <remarks> /// </remarks> /// <param name="d3dDevice7"></param> /// <returns></returns> HRESULT __stdcall wBeginScene( LPDIRECT3DDEVICE7 d3dDevice7) { PSTR pszErrorMessage; HRESULT hResult; InternalFunctionSpew("GameOS_Direct3D", "BeginScene()"); hResult = d3dDevice7->BeginScene(); if (FAILED(hResult)) { if ( hResult != DDERR_SURFACELOST) { pszErrorMessage = ErrorNumberToMessage(hResult); if ( InternalFunctionPause("FAILED (0x%x - %s) - BeginScene()", hResult, pszErrorMessage) ) ENTER_DEBUGGER; } } return hResult; }
////////////////////////////////////////////////////////////////////////////// //MAIN GAME LOOP ////////////////////////////////////////////////////////////////////////////// void Prog_Loop() { //set up the vertex positions vert[0].sx=(float) (cos(angle)*240.0+320.0); vert[0].sy=(float) (sin(angle)*240.0+240.0); vert[0].sz=(float) (sin(angle)*240.0+240.0); vert[1].sx=(float) (cos(angle+PI/2)*240.0+320.0); vert[1].sy=(float) (sin(angle+PI/2)*240.0+240.0); vert[1].sz=(float) (sin(angle+PI/2)*240.0+240.0); vert[2].sx=(float) (cos(angle-PI/2)*240.0+320.0); vert[2].sy=(float) (sin(angle-PI/2)*240.0+240.0); vert[2].sz=(float) (sin(angle-PI/2)*240.0+240.0); vert[3].sx=(float) (cos(angle-PI)*240.0+320.0); vert[3].sy=(float) (sin(angle-PI)*240.0+240.0); vert[3].sz=(float) (sin(angle-PI)*240.0+240.0); //add to the angle for next time angle+=PI/90; //clear the viewport to black lpd3ddev->Clear(0,NULL,D3DCLEAR_TARGET,0,0,0); //start the scene lpd3ddev->BeginScene(); //draw the triangle lpd3ddev->DrawPrimitive(D3DPT_TRIANGLESTRIP,D3DFVF_TLVERTEX,vert,4,0); //end the scene lpd3ddev->EndScene(); //flip lpddsPrime->Flip(NULL,DDFLIP_WAIT); }