void CEi::Draw(LPDIRECT3DDEVICE7 lpDevice) { if (!CBoundingTube::IsSphereVisible(pos,EGG_SIZE))return; D3DMATRIX m,m2; D3DUtil_SetTranslateMatrix(m,pos); D3DUtil_SetRotateYMatrix(m2,ang.y); D3DMath_MatrixMultiply(m,m2,m); D3DUtil_SetRotateXMatrix(m2,-ang.x+g_PI*0.5f); D3DMath_MatrixMultiply(m,m2,m); lpDevice->SetTexture(0,NULL); lpDevice->SetTransform(D3DTRANSFORMSTATE_WORLD,&m); lpMesh->Render(lpDevice,FALSE); }
void CDrescher::Draw(LPDIRECT3DDEVICE7 lpDevice) { if (!box2->IsVisible())return; lpDevice->SetTexture(0,NULL); D3DMATRIX matrix,m; D3DUtil_SetTranslateMatrix(matrix,pos.x,pos.y+hoehe,pos.z); { // Mähdrescher gemäß Steigung kippen D3DUtil_SetRotateYMatrix(m,beta); D3DMath_MatrixMultiply(matrix,m,matrix); D3DUtil_SetRotateXMatrix(m,alpha); D3DMath_MatrixMultiply(matrix,m,matrix); D3DUtil_SetRotateYMatrix(m,-beta); D3DMath_MatrixMultiply(matrix,m,matrix); } D3DUtil_SetRotateYMatrix(m,ang.y); D3DMath_MatrixMultiply(matrix,m,matrix); if (schaukelphase>0.0f) { // schaukeln const float mittelpunkt=2.0f; D3DUtil_SetTranslateMatrix(m,0,0,-mittelpunkt); D3DMath_MatrixMultiply(matrix,m,matrix); D3DUtil_SetRotateXMatrix(m,schaukelwinkel()); D3DMath_MatrixMultiply(matrix,m,matrix); D3DUtil_SetTranslateMatrix(m,0,0,mittelpunkt); D3DMath_MatrixMultiply(matrix,m,matrix); } lpDevice->SetTransform(D3DTRANSFORMSTATE_WORLD,&matrix); mesh1->Render(lpDevice,FALSE); // Rolle D3DUtil_SetRotateXMatrix(m,rolle); D3DMath_MatrixMultiply(matrix,m,matrix); lpDevice->SetTransform(D3DTRANSFORMSTATE_WORLD,&matrix); mesh2->Render(lpDevice,FALSE); }
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; }
CEi::CEi(const D3DVECTOR vpos,const D3DVECTOR vang,D3DVECTOR ospeed,const D3DVECTOR opos,const BOOLEAN relativespeed,const float vspeed,const UID vowner) :pos(vpos),ang(vang),speed(D3DVECTOR(0,0,vspeed)),owner(vowner),lpMesh(game->models->FindObject("Ei")) { D3DVECTOR v; D3DMATRIX m,m2; D3DUtil_SetRotateYMatrix(m,ang.y); if (!relativespeed)D3DMath_VectorMatrixMultiply(ospeed,ospeed,m); D3DUtil_SetRotateXMatrix(m2,-ang.x); D3DMath_MatrixMultiply(m,m2,m); D3DMath_VectorMatrixMultiply(v,D3DVECTOR(0,0,1)+opos,m); pos+=v; D3DMath_VectorMatrixMultiply(speed,speed,m); speed+=ospeed; speed.y+=ei_offsety; id=MakeUID(IDEi); }
const D3DVECTOR CDrescher::GetOutput()const { D3DMATRIX m,matrix; D3DUtil_SetTranslateMatrix(matrix,pos); { // Mähdrescher gemäß Steigung kippen D3DUtil_SetRotateYMatrix(m,beta); D3DMath_MatrixMultiply(matrix,m,matrix); D3DUtil_SetRotateXMatrix(m,alpha); D3DMath_MatrixMultiply(matrix,m,matrix); D3DUtil_SetRotateYMatrix(m,-beta); D3DMath_MatrixMultiply(matrix,m,matrix); } D3DUtil_SetRotateYMatrix(m,ang.y); D3DMath_MatrixMultiply(matrix,m,matrix); D3DUtil_SetTranslateMatrix(m,D3DVECTOR(-1.48f,1.24f,-3.1f)); D3DMath_MatrixMultiply(matrix,m,matrix); if (schaukelphase>0.0f) { // schaukeln const float mittelpunkt=2.0f; D3DUtil_SetTranslateMatrix(m,0,0,-mittelpunkt); D3DMath_MatrixMultiply(matrix,m,matrix); D3DUtil_SetRotateXMatrix(m,schaukelwinkel()); D3DMath_MatrixMultiply(matrix,m,matrix); D3DUtil_SetTranslateMatrix(m,0,0,mittelpunkt); D3DMath_MatrixMultiply(matrix,m,matrix); } D3DVECTOR v; D3DMath_VectorMatrixMultiply(v,D3DVECTOR(0,0,0),matrix); return v; }
const D3DMATRIX CGolfer::BerechneSchlag() { D3DMATRIX m,m2; if (parent==NULL) { D3DUtil_SetTranslateMatrix(m,pos.x,pos.y+0.035f,pos.z); return m; } CPlayer* p=(CPlayer*)parent; D3DUtil_SetTranslateMatrix(m,p->pos); D3DUtil_SetRotateYMatrix(m2,-p->ang.y); D3DMath_MatrixMultiply(m,m2,m); D3DUtil_SetRotateXMatrix(m2,-p->ang.x); D3DMath_MatrixMultiply(m,m2,m); D3DUtil_SetTranslateMatrix(m2,0.0f,-1.25f,0.2f); D3DMath_MatrixMultiply(m,m2,m); // Schläger um y-Achse drehen D3DUtil_SetRotateYMatrix(m2,-g_PI*0.5f-0.2f); D3DMath_MatrixMultiply(m,m2,m); // Privotpunkt auf Halter verschieben D3DUtil_SetTranslateMatrix(m2,0,1.2f,0); D3DMath_MatrixMultiply(m,m2,m); // Schlag schwenken float winkel=1.2f; if (schlag.phase!=0) { const float back=0.5f; const float front=1.1f; if (schlag.phase>0.8f)winkel=1.2f+(schlag.phase-1.0f)*5.0f*back;else if (schlag.phase>0.5f)winkel=1.2f-back;else if (schlag.phase>0.3f)winkel=1.2f-back-(schlag.phase-0.5f)*5.0f*(front+back);else winkel=1.2f+front-(0.3f-schlag.phase)/0.3f*(front); } D3DUtil_SetRotateZMatrix(m2,winkel); D3DMath_MatrixMultiply(m,m2,m); // Nach hinten kippen D3DUtil_SetRotateXMatrix(m2,0.45f); D3DMath_MatrixMultiply(m,m2,m); // Privotpunkt zurücksetzen D3DUtil_SetTranslateMatrix(m2,0,-1.2f,0); D3DMath_MatrixMultiply(m,m2,m); pos.x=m.m[3][0]; pos.y=m.m[3][1]; pos.z=m.m[3][2]; box->SetPos(pos); return m; }
void CDrescher::GetViewMatrix(D3DMATRIX &view)const { if (parent==NULL)return; D3DMATRIX m; const BOOLEAN lookback=game->KeyDown(DIK_B); switch(abs(BYTE(((CPlayer*)parent)->camera%2))) { case 0: // Dachkamera D3DUtil_SetTranslateMatrix(view,-pos.x,-pos.y,-pos.z); if (1==2) { // Mähdrescher gemäß Steigung kippen D3DUtil_SetRotateYMatrix(m,-beta); D3DMath_MatrixMultiply(view,view,m); D3DUtil_SetRotateXMatrix(m,-alpha); D3DMath_MatrixMultiply(view,view,m); D3DUtil_SetRotateYMatrix(m,beta); D3DMath_MatrixMultiply(view,view,m); } D3DUtil_SetTranslateMatrix(m,0,lookback?-2.2f:-2.8f,0); D3DMath_MatrixMultiply(view,view,m); D3DUtil_SetRotateYMatrix(m,-ang.y); D3DMath_MatrixMultiply(view,view,m); D3DUtil_SetTranslateMatrix(m,0,0,lookback?0.7f:2.5f); D3DMath_MatrixMultiply(view,view,m); D3DUtil_SetRotateXMatrix(m,(lookback?0.15f:-0.35f)-schaukelwinkel()*0.5f); D3DMath_MatrixMultiply(view,view,m); if (lookback) { D3DUtil_SetRotateYMatrix(m,g_PI); D3DMath_MatrixMultiply(view,view,m); } break; case 1: // Von oben D3DUtil_SetTranslateMatrix(view,-pos.x,-pos.y-16.0f,-pos.z); D3DUtil_SetRotateYMatrix(m,-ang.y); D3DMath_MatrixMultiply(view,view,m); D3DUtil_SetTranslateMatrix(m,0,0,lookback?-5.0f:10.0f); D3DMath_MatrixMultiply(view,view,m); D3DUtil_SetRotateXMatrix(m,lookback?0.9f:-0.9f); D3DMath_MatrixMultiply(view,view,m); if (lookback) { D3DUtil_SetRotateYMatrix(m,g_PI); D3DMath_MatrixMultiply(view,view,m); } break; } }
VOID CSelectSrv::Draw3DBorder(RECT rcWnd,COLORREF dwColor,INT nAlpha) { if ( g_xMainWnd.Get3DDevice() ) { D3DVECTOR vTrans; D3DMATRIX matTrans; D3DMATRIX matScale; D3DMATRIX matWorld; D3DMATRIX matView; D3DMATRIX matProj; D3DMATRIX matWorldOriginal; D3DMATERIAL7 mtrl; if( SUCCEEDED(g_xMainWnd.Get3DDevice()->BeginScene())) { g_xMainWnd.Get3DDevice()->GetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal); ZeroMemory(&matView, sizeof(D3DMATRIX)); D3DVECTOR vEyePt = D3DVECTOR(0, 0, -(float)((g_xMainWnd.m_rcWindow.bottom - g_xMainWnd.m_rcWindow.top)/2)); D3DVECTOR vLookatPt = D3DVECTOR(0, 0, 0); D3DVECTOR vUpVec = D3DVECTOR(0, 1, 0); D3DUtil_SetViewMatrix(matView, vEyePt, vLookatPt, vUpVec); D3DUtil_SetProjectionMatrix(matProj, g_PI/2, float(240.0f/320.0f), -1.0f, 1.0f); g_xMainWnd.Get3DDevice()->SetTransform(D3DTRANSFORMSTATE_VIEW, &matView); g_xMainWnd.Get3DDevice()->SetTransform(D3DTRANSFORMSTATE_PROJECTION, &matProj); vTrans.x = (FLOAT)rcWnd.left - 320.0f + (rcWnd.right - rcWnd.left)/2; vTrans.y = (FLOAT)-rcWnd.top + 240.0f - (rcWnd.bottom - rcWnd.top )/2; vTrans.z = 0; D3DUtil_SetTranslateMatrix(matTrans, vTrans); D3DUtil_SetScaleMatrix(matScale, (FLOAT)(rcWnd.right - rcWnd.left), (FLOAT)(rcWnd.bottom - rcWnd.top), 0.0f); D3DMath_MatrixMultiply(matWorld, matScale, matTrans); g_xMainWnd.Get3DDevice()->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorld); // 임시 D3DUtil_InitMaterial(mtrl, (FLOAT)GetRValue(dwColor)/255.0f, (FLOAT)GetGValue(dwColor)/255.0f, (FLOAT)GetBValue(dwColor)/255.0f); mtrl.diffuse.a = nAlpha/255.0f; // alpha value g_xMainWnd.Get3DDevice()->SetMaterial(&mtrl); g_xMainWnd.Get3DDevice()->SetRenderState( D3DRENDERSTATE_ALPHABLENDENABLE, TRUE ); g_xMainWnd.Get3DDevice()->SetRenderState( D3DRENDERSTATE_COLORKEYENABLE, TRUE); g_xMainWnd.Get3DDevice()->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); g_xMainWnd.Get3DDevice()->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE); g_xMainWnd.Get3DDevice()->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE); g_xMainWnd.Get3DDevice()->SetRenderState(D3DRENDERSTATE_SRCBLEND, D3DBLEND_ONE); g_xMainWnd.Get3DDevice()->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_INVSRCALPHA); g_xMainWnd.Get3DDevice()->SetTexture(0, NULL); g_xMainWnd.Get3DDevice()->DrawPrimitive(D3DPT_TRIANGLESTRIP, D3DFVF_VERTEX, m_avBillBoard, 4, NULL); g_xMainWnd.Get3DDevice()->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, FALSE); g_xMainWnd.Get3DDevice()->SetRenderState(D3DRENDERSTATE_COLORKEYENABLE, FALSE); g_xMainWnd.Get3DDevice()->SetRenderState(D3DRENDERSTATE_SRCBLEND , D3DBLEND_ONE); g_xMainWnd.Get3DDevice()->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_ZERO); g_xMainWnd.Get3DDevice()->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal); g_xMainWnd.Get3DDevice()->EndScene(); } } }