CDrescher::CDrescher() :sound(NULL),box1(NULL),box2(NULL),rolle(0.0f),speed(D3DVECTOR(0,0,0)),acc(D3DVECTOR(0,0,0)), rot(0.0f),schaukelphase(0.0f) { statusmessage=new CMessageChain(2); schaukelphase=0.0f; Normale=IstNormale=D3DVECTOR(0,1,0); }
CSelectSrv::CSelectSrv():CBMWnd() { m_ppxSrvBtn = NULL; D3DVECTOR vNorm(0, 0, -1); m_avBillBoard[0] = D3DVERTEX(D3DVECTOR(-0.5f, 0.5f, 0), vNorm, 0, 0); m_avBillBoard[1] = D3DVERTEX(D3DVECTOR(-0.5f,-0.5f, 0), vNorm, 0, 1); m_avBillBoard[2] = D3DVERTEX(D3DVECTOR( 0.5f, 0.5f, 0), vNorm, 1, 0); m_avBillBoard[3] = D3DVERTEX(D3DVECTOR( 0.5f,-0.5f, 0), vNorm, 1, 1); }
//----------------------------------------------------------------------------- // Name: D3DUtil_SetViewMatrix() // Desc: Given an eye point, a lookat point, and an up vector, this // function builds a 4x4 view matrix. //----------------------------------------------------------------------------- HRESULT D3DUtil_SetViewMatrix( D3DMATRIX& mat, D3DVECTOR& vFrom, D3DVECTOR& vAt, D3DVECTOR& vWorldUp ) { // Get the z basis vector, which points straight ahead. This is the // difference from the eyepoint to the lookat point. D3DVECTOR vView = vAt - vFrom; FLOAT fLength = Magnitude( vView ); if( fLength < 1e-6f ) return E_INVALIDARG; // Normalize the z basis vector vView /= fLength; // Get the dot product, and calculate the projection of the z basis // vector onto the up vector. The projection is the y basis vector. FLOAT fDotProduct = DotProduct( vWorldUp, vView ); D3DVECTOR vUp = vWorldUp - fDotProduct * vView; // If this vector has near-zero length because the input specified a // bogus up vector, let's try a default up vector if( 1e-6f > ( fLength = Magnitude( vUp ) ) ) { vUp = D3DVECTOR( 0.0f, 1.0f, 0.0f ) - vView.y * vView; // If we still have near-zero length, resort to a different axis. if( 1e-6f > ( fLength = Magnitude( vUp ) ) ) { vUp = D3DVECTOR( 0.0f, 0.0f, 1.0f ) - vView.z * vView; if( 1e-6f > ( fLength = Magnitude( vUp ) ) ) return E_INVALIDARG; } } // Normalize the y basis vector vUp /= fLength; // The x basis vector is found simply with the cross product of the y // and z basis vectors D3DVECTOR vRight = CrossProduct( vUp, vView ); // Start building the matrix. The first three rows contains the basis // vectors used to rotate the view to point at the lookat point D3DUtil_SetIdentityMatrix( mat ); mat._11 = vRight.x; mat._12 = vUp.x; mat._13 = vView.x; mat._21 = vRight.y; mat._22 = vUp.y; mat._23 = vView.y; mat._31 = vRight.z; mat._32 = vUp.z; mat._33 = vView.z; // Do the translation values (rotations are still about the eyepoint) mat._41 = - DotProduct( vFrom, vRight ); mat._42 = - DotProduct( vFrom, vUp ); mat._43 = - DotProduct( vFrom, vView ); return S_OK; }
void CSprite::DrawSmooth(LPDIRECT3DDEVICE7 lpDevice,const D3DVECTOR pos,const float w,const float h,const DWORD color,const int spritenr) { D3DVECTOR rightVect,upVect; D3DMATRIX mat; { lpDevice->GetTransform(D3DTRANSFORMSTATE_VIEW,&mat); rightVect=Normalize(D3DVECTOR(mat._11,mat._21,mat._31))*w*0.5f; upVect=Normalize(D3DVECTOR(mat._12,mat._22,mat._32))*h*0.5f; } const D3DVECTOR n=D3DVECTOR(0,0,0); D3DLVERTEX verts[4]= { D3DLVERTEX(pos-rightVect+upVect, color,0, 1.0f, 0.0f), D3DLVERTEX(pos+rightVect+upVect, color,0, 0.0f, 0.0f), D3DLVERTEX(pos-rightVect-upVect, color,0, 1.0f, 1.0f), D3DLVERTEX(pos+rightVect-upVect, color,0, 0.0f, 1.0f) }; D3DUtil_SetIdentityMatrix(mat); lpDevice->SetTransform(D3DTRANSFORMSTATE_WORLD,&mat); if (Config.alpha) { lpDevice->SetRenderState(D3DRENDERSTATE_ZWRITEENABLE,FALSE); lpDevice->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, TRUE); lpDevice->SetRenderState(D3DRENDERSTATE_LIGHTING,FALSE); lpDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); lpDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); lpDevice->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_MODULATE); lpDevice->SetRenderState(D3DRENDERSTATE_SRCBLEND,D3DBLEND_SRCCOLOR); lpDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND,D3DBLEND_INVSRCCOLOR); lpDevice->SetRenderState(D3DRENDERSTATE_ALPHATESTENABLE,TRUE); lpDevice->SetRenderState(D3DRENDERSTATE_ALPHAREF,0x08); } lpDevice->SetTexture(0,GetSurface(spritenr)); lpDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,D3DFVF_LVERTEX,verts,4,0); lpDevice->SetTexture(0,NULL); if (Config.alpha) { lpDevice->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, FALSE); lpDevice->SetRenderState(D3DRENDERSTATE_LIGHTING,TRUE); lpDevice->SetRenderState(D3DRENDERSTATE_ALPHATESTENABLE,FALSE); lpDevice->SetRenderState(D3DRENDERSTATE_ZWRITEENABLE,TRUE); } }
void CGolfer::Throw() { CPlayer* p=(CPlayer*)parent; D3DMATRIX m; D3DVECTOR v=D3DVECTOR(0,0,2); D3DUtil_SetRotateYMatrix(m,-p->ang.y); D3DMath_VectorMatrixMultiply(v,v,m); pos=p->pos+v; if (!world->IsInside(pos))world->MakeInside(pos); pos.y=world->HeightAtPoint(pos.x,pos.z); box->SetPos(pos); CObject* akt=chain->GetFirst(); while (akt) { if (GetType(akt->id)==IDStall) { Rebound(((CStall*)akt)->box); Rebound(((CStall*)akt)->eingang); } if (GetType(akt->id)==IDTree) Rebound(((CTree*)akt)->box); if (GetType(akt->id)==IDDrescher) Rebound(((CDrescher*)akt)->box2); akt=akt->next; } schlag.phase=0.0f; parent=NULL; ejecttime=3.0f; }
VOID CLightFog::Init(DWORD dwLightColor) { m_dwLightColor = dwLightColor; for ( INT nCntY = 0; nCntY < (NUM_CNTY_LIGHTTILE+1); nCntY++ ) { for ( INT nCntX = 0; nCntX < (NUM_CNTX_LIGHTTILE+1); nCntX++ ) { m_avLight[nCntY][nCntX] = D3DLVERTEX(D3DVECTOR((FLOAT)(TILE_START_XPOS+(nCntX*TILE_WIDTH)), (FLOAT)(-TILE_START_YPOS-(nCntY*TILE_HEIGHT)), 0), m_dwLightColor, RGB(0, 0, 0), 0, 0); } } memcpy(m_avSaveLight, m_avLight, sizeof(D3DLVERTEX)*(NUM_CNTY_LIGHTTILE+1)*(NUM_CNTX_LIGHTTILE+1)); // 타일폴리곤의 인덱스 생성. WORD* pwIndex = m_pwLightIndices; for ( nCntY = 0; nCntY < NUM_CNTY_LIGHTTILE; nCntY++ ) { for ( INT nCntX = 0; nCntX < NUM_CNTX_LIGHTTILE; nCntX++ ) { *pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*nCntY); *pwIndex++ = nCntX+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1)); *pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1)); *pwIndex++ = nCntX+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1)); *pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*nCntY); *pwIndex++ = (nCntX)+((NUM_CNTX_LIGHTTILE+1)*nCntY); } } }
void CDrescher::HandleInput(const int mx,const int my,const int mz) { acc=D3DVECTOR(0,0,0); // Beschl. if ((game->KeyDown(DIK_W))||(game->KeyDown(DIK_UP))) { if (speed.z>0.0f)acc.z=5.75f;else acc.z=7.5f; } if ((game->KeyDown(DIK_S))||(game->KeyDown(DIK_DOWN))) { if (speed.z>0.0f)acc.z=-7.0f;else acc.z=-4.0f; } acc*=game->harvesterspeed; rot=0.0f; // Drehen if ((game->KeyDown(DIK_A))||(game->KeyDown(DIK_LEFT))) if (speed.z<0.0f)rot+=1.0f;else rot-=1.0f; if ((game->KeyDown(DIK_D))||(game->KeyDown(DIK_RIGHT))) if (speed.z<0.0f)rot-=1.0f;else rot+=1.0f; rot*=game->harvesterrotspeed; }
void CRadar::DrawUI(LPDIRECT3DDEVICE7 lpDevice) { if (!Enabled)return; if ((lpSurface==NULL)||(lpSurface->IsLost())) { UpdateSurface(); Update(); } const float w=130.0f*game->width/640.0f; const float h=130.0f*game->width/640.0f; const float x=game->width-20-w; const float y=game->height-20-h; const int c=D3DRGBA(1,1,1,0.45f); const float r=0.9f; D3DTLVERTEX v[4]={ D3DTLVERTEX(D3DVECTOR(x,y,0),r,c,0,0,0), D3DTLVERTEX(D3DVECTOR(x+w,y,0),r,c,0,1,0), D3DTLVERTEX(D3DVECTOR(x,y+h,0),r,c,0,0,1), D3DTLVERTEX(D3DVECTOR(x+w,y+h,0),r,c,0,1,1) }; if (Config.alpha) { // lpDevice->SetRenderState(D3DRENDERSTATE_ZENABLE,FALSE); lpDevice->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE,TRUE); lpDevice->SetRenderState(D3DRENDERSTATE_SRCBLEND,D3DBLEND_SRCALPHA); lpDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND,D3DBLEND_INVSRCALPHA); lpDevice->SetTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_MODULATE); lpDevice->SetRenderState(D3DRENDERSTATE_ALPHATESTENABLE,TRUE); lpDevice->SetRenderState(D3DRENDERSTATE_ALPHAREF,8); lpDevice->SetRenderState(D3DRENDERSTATE_ALPHAFUNC,D3DCMP_GREATEREQUAL); } lpDevice->SetTexture(0,lpSurface); lpDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,D3DFVF_TLVERTEX,v,4,0); lpDevice->SetTexture(0,NULL); lpDevice->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE,0); lpDevice->SetRenderState(D3DRENDERSTATE_ALPHATESTENABLE,0); // lpDevice->SetRenderState(D3DRENDERSTATE_ZENABLE,TRUE); }
const float CComputerBauer::GetSchussY(const float x,const float alpha)const { const float c=cosf(alpha); const float s=sinf(alpha); const float v0=Magnitude(D3DVECTOR(20.0f*c,20.0f*s+3.5f,0)); return -(game->gravity*0.7f*sqr(x))/(2*sqr(v0)*sqr(c))+x*(s/c)+3.5f*x/(v0*c); }
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); }
VOID CImageHandler::InitAllImage() { for ( INT nCnt = 0; nCnt < _MAX_IMAGE; nCnt++ ) m_xImageList[nCnt].Init(); ZeroMemory(m_nLoadedMagic, sizeof(INT)*_MAX_MAGIC); D3DVECTOR vNorm(0, 0, -1); m_avBillBoard[0] = D3DVERTEX(D3DVECTOR(-0.5f, 0.5f, 0), vNorm, 0, 0); m_avBillBoard[1] = D3DVERTEX(D3DVECTOR(-0.5f,-0.5f, 0), vNorm, 0, 1); m_avBillBoard[2] = D3DVERTEX(D3DVECTOR( 0.5f, 0.5f, 0), vNorm, 1, 0); m_avBillBoard[3] = D3DVERTEX(D3DVECTOR( 0.5f,-0.5f, 0), vNorm, 1, 1); for ( nCnt = 0; nCnt < _MAX_TEXTR_FILE; nCnt++ ) { m_xTextrFileList[nCnt].ClearAllNodes(); } }
const BOOLEAN CDrescher::GetIn(CPlayer* p) { if (parent!=NULL)return FALSE; parent=(CObject*)p; speed=D3DVECTOR(0,0,0); return TRUE; }
const D3DVECTOR CDrescher::PrivotFromCenter2(const D3DVECTOR p)const { D3DMATRIX m; D3DUtil_SetRotateYMatrix(m,ang.y); D3DVECTOR v; D3DMath_VectorMatrixMultiply(v,D3DVECTOR(0,0,-1.186f),m); return p-v; }
const D3DVECTOR CDrescher::GetCenter2()const { D3DMATRIX m; D3DUtil_SetRotateYMatrix(m,ang.y); D3DVECTOR v; D3DMath_VectorMatrixMultiply(v,D3DVECTOR(0,0,-1.186f),m); return v+pos; }
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; }
void CDrescher::UpdateWinkel() { const D3DVECTOR back=GetCenter1(); world->HeightAtPoint(back.x,back.z,&Normale); Normale=Normalize(Normale); if (parent==NULL) { IstNormale=Normale; alpha=acosf(DotProduct(IstNormale,D3DVECTOR(0,1,0))); beta=atan2f(IstNormale.x,IstNormale.z); } }
void DrawShadow(LPDIRECT3DDEVICE7 lpDevice) { lpDevice->SetRenderState( D3DRENDERSTATE_ZENABLE, FALSE ); lpDevice->SetRenderState( D3DRENDERSTATE_STENCILENABLE, TRUE ); // Turn on alphablending lpDevice->SetRenderState( D3DRENDERSTATE_ALPHABLENDENABLE, TRUE ); lpDevice->SetRenderState( D3DRENDERSTATE_SRCBLEND, D3DBLEND_SRCALPHA ); lpDevice->SetRenderState( D3DRENDERSTATE_DESTBLEND, D3DBLEND_INVSRCALPHA ); lpDevice->SetTextureStageState(0,D3DTSS_ALPHAARG1,D3DTA_DIFFUSE); // Only write where the stencil value == 1 lpDevice->SetRenderState( D3DRENDERSTATE_STENCILREF, 0x1 ); lpDevice->SetRenderState( D3DRENDERSTATE_STENCILFUNC, D3DCMP_EQUAL ); lpDevice->SetRenderState( D3DRENDERSTATE_STENCILPASS, D3DSTENCILOP_KEEP ); // Get viewport dimensions for big, gray square D3DVIEWPORT7 vp; lpDevice->GetViewport(&vp); FLOAT sx = (FLOAT)vp.dwWidth; FLOAT sy = (FLOAT)vp.dwHeight; D3DCOLOR color=D3DRGBA(0,0,0,0.5f); // Draw a big, gray square D3DTLVERTEX vBigGraySquare[4]; vBigGraySquare[0] = D3DTLVERTEX( D3DVECTOR( 0,sy,0.0f),1.0f,color,0,0,0 ); vBigGraySquare[1] = D3DTLVERTEX( D3DVECTOR( 0, 0,0.0f),1.0f,color,0,0,0 ); vBigGraySquare[2] = D3DTLVERTEX( D3DVECTOR(sx,sy,0.0f),1.0f,color,0,0,0 ); vBigGraySquare[3] = D3DTLVERTEX( D3DVECTOR(sx, 0,0.0f),1.0f,color,0,0,0 ); lpDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, D3DFVF_TLVERTEX, vBigGraySquare, 4, NULL ); // Restore render states lpDevice->SetRenderState( D3DRENDERSTATE_ZENABLE, TRUE ); lpDevice->SetRenderState( D3DRENDERSTATE_STENCILENABLE, FALSE ); lpDevice->SetRenderState( D3DRENDERSTATE_ALPHABLENDENABLE, FALSE ); }
void CDrescher::Unbind() { if (parent!=NULL) { CBauer* b=(CBauer*)parent; b->pos=pos; b->ang=ang; D3DMATRIX m; D3DVECTOR v=D3DVECTOR(0,0,-5.5f); D3DUtil_SetRotateYMatrix(m,b->ang.y); D3DMath_VectorMatrixMultiply(v,v,m); b->ang.y=-b->ang.y; b->pos+=v; b->object=NULL; } }
const BOOLEAN CComputerBauer::SearchWeapon(const float elapsed) { // Nächste Waffe in der Umgebung suchen ang.x=0.0f; CWeapon* found=NULL; float entf=150.0f; CObject* o=chain->GetFirst(); while (o) { switch(GetType(o->id)) { case IDDrescher: case IDPlasmaCannon: case IDGartenkralle: case IDGolfer: { CWeapon *w=(CWeapon*)o; if ((w->parent==NULL)&&(Magnitude(w->pos-pos)<entf)) { if ((o->IsType(IDPlasmaCannon))&&(((CPlasmaCannon*)w)->munition<3))goto dochnicht; if ((o->IsType(IDGartenkralle))&&(((CGartenkralle*)w)->werfer!=NULL))goto dochnicht; found=w; entf=Magnitude(w->pos-pos); } } break; } dochnicht: o=o->next; } if (found!=NULL) { float w=RotateTo(found->pos,elapsed); if (w<0.3f)speed.z=5.0f;else speed.z=1.5f; return TRUE; }else{ // Keine brauchbare Waffe gefunden -> Dumm rumlaufen? speed=D3DVECTOR(0,0,0); return FALSE; } }
// Runden Schatten malen void RenderRoundShadow(LPDIRECT3DDEVICE7 lpDevice,float x,float y,float z,float r) { #define EDGES 12 static D3DVERTEX v[(EDGES+1)*2]; D3DLIGHT7 light; lpDevice->GetLight(0,&light); D3DVECTOR length=Normalize(light.dvDirection)*(-100.0f); for (int i=0;i<=EDGES;i++) { v[i]=v[i+EDGES+1]=D3DVERTEX(D3DVECTOR(x+sinf(float(i)/float(EDGES)*g_PI*2.0f)*r,y,z+cosf(float(i)/float(EDGES)*g_PI*2.0f)*r),D3DVECTOR(0,1,0),0,0); v[i+EDGES+1].x-=length.x; v[i+EDGES+1].y-=length.y; v[i+EDGES+1].z-=length.z; } static WORD wIndices[(EDGES-2)*3+EDGES*6]; const PWORD Cap=&wIndices[0]; const PWORD Side=&wIndices[(EDGES-2)*3]; for (i=0;i<EDGES-2;i++) { Cap[i*3]=0; Cap[i*3+1]=i+1; Cap[i*3+2]=i+2; } for (i=0;i<EDGES;i++) { Side[i*6+0]=i; Side[i*6+1]=i+EDGES+2; Side[i*6+2]=i+1; Side[i*6+3]=i; Side[i*6+4]=i+EDGES+1; Side[i*6+5]=i+EDGES+2; } RenderShadow(lpDevice,v,EDGES*2+2,wIndices,sizeof(wIndices)/sizeof(wIndices[0])); // RenderShadow(lpDevice,v,8,wIndices,(EDGES-2)*3); }
BOOLEAN CDrescher::Init() { pos=world->Rand(4.0f); ang=D3DVECTOR(0,randf()*6.0f,0); mesh1=game->models->FindObject("Drescher"); mesh2=game->models->FindObject("Rolle"); id=MakeUID(IDDrescher); box1=new CBoundingTube(GetCenter1(),3.6f/2.0f,1.5f); box2=new CBoundingTube(GetCenter2(),4.2f/2.0f,1.5f); sound=new CSound(game->lpBuffers[16],FALSE); sound->Set3DParameters(pos); sound->SetFrequency(16000); game->AddSound(sound); sound->Play(DSBPLAY_LOOPING); UpdateWinkel(); return TRUE; }
void RenderSquareShadow(LPDIRECT3DDEVICE7 lpDevice,float x,float y,float z,float w,float h) { WORD wIndices[] = { 0,1,2, 3,2,1, 1,5,3, 3,5,7, 0,4,1, 1,4,5, 0,2,4, 4,2,6, 2,3,6, 6,3,7, }; D3DLIGHT7 light; lpDevice->GetLight(0,&light); D3DVECTOR length=Normalize(light.dvDirection)*(-100); D3DVERTEX v[8]; v[0] = D3DVERTEX( D3DVECTOR( x-w/2, y, z-h/2 ),D3DVECTOR(0,1,0), 0, 1 ); v[1] = D3DVERTEX( D3DVECTOR( x-w/2, y, z+h/2 ),D3DVECTOR(0,1,0), 0, 0 ); v[2] = D3DVERTEX( D3DVECTOR( x+w/2, y, z-h/2 ),D3DVECTOR(0,1,0), 1, 1 ); v[3] = D3DVERTEX( D3DVECTOR( x+w/2, y, z+h/2 ),D3DVECTOR(0,1,0), 1, 0 ); v[4] = D3DVERTEX( D3DVECTOR( x-w/2, y, z-h/2 )-length,D3DVECTOR(0,1,0), 0, 0 ); v[5] = D3DVERTEX( D3DVECTOR( x-w/2, y, z+h/2 )-length,D3DVECTOR(0,1,0), 0, 0 ); v[6] = D3DVERTEX( D3DVECTOR( x+w/2, y, z-h/2 )-length,D3DVECTOR(0,1,0), 0, 0 ); v[7] = D3DVERTEX( D3DVECTOR( x+w/2, y, z+h/2 )-length,D3DVECTOR(0,1,0), 0, 0 ); RenderShadow(lpDevice,v,8,wIndices,sizeof(wIndices)/sizeof(wIndices[0])); }
CEi::CEi() :pos(D3DVECTOR(0,0,0)),ang(D3DVECTOR(0,0,0)),speed(D3DVECTOR(0,0,0)),owner(0),lpMesh(game->models->FindObject("Ei")) { id=MakeUID(IDEi); }
// Does a lot more that just a standard begin scene, this restores the surfaces, // erases the backbuffer, points the camara etc. HRESULT Direct3D::BeginScene(D3DVECTOR At, // Viewer position D3DVECTOR To) // Look to position { // Make sure the device pointer is valid if(0 == D3DDevice) return(E_FAIL); // Restore any lost surfaces if(DDERR_SURFACELOST == PrimarySurface->IsLost()) PrimarySurface->Restore(); if(DDERR_SURFACELOST == BackBuffer->IsLost()) BackBuffer->Restore(); if(DDERR_SURFACELOST == ZBuffer->IsLost()) ZBuffer->Restore(); D3DTextr_RestoreAllTextures(D3DDevice); static HRESULT Return; // Set up a view matrix static D3DMATRIX VM; D3DUtil_SetViewMatrix(VM, At, To, D3DVECTOR(0, 1, 0)); // Apply the view matrix Return = D3DDevice->SetTransform(D3DTRANSFORMSTATE_VIEW, &VM); if(FAILED(Return)) return Return; // Clear the viewport if freeform is off, or just clear the ZBuffer // and draw a copy of the GDI surface if it is on if(IsFreeForm) { // clear the z-buffer Return = D3DDevice->Clear(0, 0, D3DCLEAR_ZBUFFER, 0, 1.0f, 0); if(FAILED(Return)) return Return; // Copy the screenshot onto the backbuffer HDC hdc, xdc; BackBuffer->GetDC(&hdc); GDIScreenShot->GetDC(&xdc); StretchBlt(hdc, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), xdc, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), SRCCOPY); BackBuffer->ReleaseDC(hdc); GDIScreenShot->ReleaseDC(xdc); } // end if else { // Just clear the viewport Return = D3DDevice->Clear(0, 0, D3DCLEAR_ZBUFFER | D3DCLEAR_TARGET, FogColor, 1.0f, 0); if(FAILED(Return)) return Return; } // end else // Start the scene render Return = D3DDevice->BeginScene(); if(FAILED(Return)) return Return; // Return success return(D3D_OK); } // end Direct3D::BeginScene
void CDrescher::GetOut() { parent=NULL; speed=acc=D3DVECTOR(0,0,0); sound->SetFrequency(16000); }
/*------------------------------------------------------------------------------------- メッセージハンドラ Windowsからメッセージが来るとここにくる ---------------------------------------------------------------------------------------*/ LRESULT CALLBACK WndProc ( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { HDC hdc; // デバイスコンテキスト PAINTSTRUCT ps; // D3DVECTOR v1, v2; // ベクトル float dot, ang; // 内積計算用 static float angle1 = 0.0f; // ベクトルの角度( これからベクトルを計算 ) static float angle2 = 0.0f; // ベクトルの角度( これからベクトルを計算 ) char str[ 128]; /*-------------------------------------------- Windows からのメッセージにより分岐 ----------------------------------------------*/ switch ( message ){ // 作成時 --------------------------------------------------------- case WM_CREATE: break; // ウインドウがアクティブになったとき ----------------------------- case WM_ACTIVATE: // 描画する InvalidateRect( hwnd, NULL, TRUE ); break; // キー入力関連 ---------------------------------------------------- case WM_KEYDOWN: switch( wParam ){ // キーに応じて処理 case VK_F12: // 強制終了ボタン // Windows へプログラム終了の合図 PostMessage( hwnd, WM_CLOSE, 0, 0 ); break; /*---------------------------------- ベクトルの回転( 角度 ) ------------------------------------*/ case VK_UP: // 回転 angle1 += 2.0f; break; case VK_DOWN: // 回転 angle1 -= 2.0f; break; case VK_RIGHT: // 回転 angle2 += 2.0f; break; case VK_LEFT: // 回転 angle2 -= 2.0f; break; } // 描画する InvalidateRect( hwnd, NULL, TRUE ); break; // ウインドウを閉じようとするとき ---------------------------------- case WM_CLOSE: // 現在未使用機能 ------------ #if 0 // メッセージボックスで終了の確認 Dx.SetMessageBox(); ret = MessageBox( hwnd, "ツールを終了しますか?", "確認", MB_YESNO | MB_ICONQUESTION ); // いいえなら終了しない if( ret == IDNO ) return 0; #endif break; // プログラム終了 -------------------------------------------------- case WM_DESTROY: PostQuitMessage( 0 ); break; // 描画要求を行ったとき----------------------------------------------- case WM_PAINT: // ベクトルを計算( 正規化 ) v1 = D3DVECTOR( ( float)cos( angle1 * RD_ ), ( float)sin( angle1 * RD_ ), 0.0f ); v2 = D3DVECTOR( ( float)cos( angle2 * RD_ ), ( float)sin( angle2 * RD_ ), 0.0f ); // 内積を計算 dot = v1.x * v2.x + v1.y * v2.y + v1.z * v2.z; // 角度を取得 // この角度は180度までしか調べられないので注意 ang = ( float)acos( dot ) * DEG_; /*------------------------------------------ 描画関連 --------------------------------------------*/ // 描画開始 hdc = BeginPaint( hwnd, &ps ); // ベクトルを描画 LineDisp( hdc, 320, 240, 320 + ( int)( 128 * v1.x ), 240 + ( int)( 128 * v1.y ), 0xFFFFFF ); // ベクトルを描画 LineDisp( hdc, 320, 240, 320 + ( int)( 128 * v2.x ), 240 + ( int)( 128 * v2.y ), 0x00FF00 ); /*------------------------------------ 操作説明 --------------------------------------*/ // テキストの設定 SetTextColor( hdc, 0xFFFFFF ); SetBkMode( hdc, TRANSPARENT ); // 文字表示 TextOut( hdc, 0, 0, "ベクトル1", 10 ); TextOut( hdc, 0, 16, "ベクトル2", 10 ); // 線の種類 LineDisp( hdc, 96, 8, 160, 8, 0xFFFFFF ); LineDisp( hdc, 96, 24, 160, 24, 0x00FF00 ); // 文字描画 sprintf( str, "内積結果 = %f", dot ); TextOut( hdc, 0, 32, str, strlen( str ) ); sprintf( str, "角度 = %f", ang ); TextOut( hdc, 0, 48, str, strlen( str ) ); // 説明 sprintf( str, "上下左右キーでベクトルの回転", ang ); TextOut( hdc, 0, 464, str, strlen( str ) ); // 描画終了 EndPaint( hwnd, &ps ); break; // デフォルト ------------------------------------------------------ default: // 通常の関数処理 return DefWindowProc( hwnd, message, wParam, lParam); } // 通常の関数処理 return DefWindowProc( hwnd, message, wParam, lParam); }
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(); } } }
void read_n_tri_object(CHUNK *chunk) { CHUNK *c, *c_point, *c_face, *c_tex; c = chunk->Child; do { if(POINT_ARRAY == c->hdr.id) c_point = c; else if(FACE_ARRAY == c->hdr.id) c_face = c; else if(TEX_VERTS == c->hdr.id) c_tex = c; c = c->Next; } while(c != chunk->Child); if(!c_point->data) return; WORD point_count = *(WORD*)c_point->data; _3DS_POINT *points = (_3DS_POINT*)((BYTE*)c_point->data + sizeof(WORD)); #if 1 /************************************/ for(int a = 0; a < point_count; a++) { //points[a].x *= 1.2f; points[a].y += 2.5f; //points[a].z *= 1.2f; } /************************************/ #endif if(!c_face->data) return; WORD face_count = *(WORD*)c_face->data; _3DS_FACE *faces = (_3DS_FACE*)((BYTE*)c_face->data + sizeof(WORD)); WORD w = sizeof(_3DS_FACE) * face_count; _3DS_FACE *new_faces; new_faces = (_3DS_FACE*)malloc(w); memset(new_faces, 0, w); WORD i = 0, f; for(f = 0; f < face_count; f++) { D3DVECTOR vA = D3DVECTOR(points[faces[f].b].x, points[faces[f].b].y, points[faces[f].b].z) - D3DVECTOR(points[faces[f].a].x, points[faces[f].a].y, points[faces[f].a].z); D3DVECTOR vB = D3DVECTOR(points[faces[f].c].x, points[faces[f].c].y, points[faces[f].c].z) - D3DVECTOR(points[faces[f].a].x, points[faces[f].a].y, points[faces[f].a].z); D3DVECTOR n = Normalize(CrossProduct(Normalize(vA), Normalize(vB))); if((n.x <= 1.0f) && (n.x >= -1.0f) && (n.y <= 1.0f) && (n.y >= -1.0f) && (n.z <= 1.0f) && (n.z >= -1.0f)) { new_faces[i].a = faces[f].a; new_faces[i].b = faces[f].b; new_faces[i].c = faces[f].c; new_faces[i].flag = faces[f].flag; i++; } else dwVertFixCount++; } free(c_face->data); c_face->data = 0; c_face->data_size = 0; w = sizeof(WORD) + sizeof(_3DS_FACE) * i; c_face->data = malloc(w); c_face->data_size = w; w -= sizeof(WORD); *(WORD*)c_face->data = i; memcpy((BYTE*)c_face->data + sizeof(WORD), new_faces, w); free(new_faces); if(c_face->Child) { CHUNK *chunk0 = c_face->Child; do { if(chunk0->data) { char sz[17]; strcpy(sz, (char*)chunk0->data); free(chunk0->data); chunk0->data = 0; chunk0->data_size = 0; f = lstrlen(sz) + 1; chunk0->data_size = f + sizeof(WORD) + sizeof(WORD) * i; chunk0->data = malloc(chunk0->data_size); strcpy((char*)chunk0->data, sz); WORD *pw = (WORD*)((BYTE*)chunk0->data + f); *pw++ = i; for(f = 0; f < i; f++) *pw++ = f; } chunk0 = chunk0->Next; } while(chunk0 != c_face->Child); } }
void CDrescher::Execute(float elapsed) { if (schaukelphase>0.0f) { schaukelphase-=(elapsed*12.0f); if (schaukelphase<0.0f)schaukelphase=0.0f; } if (IstNormale!=Normale) { // Den Mähdrescher "weich" an Untergrundsteigung anpassen GlattAnpassen(IstNormale.x,Normale.x,elapsed); GlattAnpassen(IstNormale.z,Normale.z,elapsed); // Y-Koordinate anpassen IstNormale.y=sqrtf(1-sqr(IstNormale.x)-sqr(IstNormale.z)); alpha=acosf(DotProduct(IstNormale,D3DVECTOR(0,1,0))); beta=atan2f(IstNormale.x,IstNormale.z); } if (parent!=NULL) { rolle+=elapsed*5.75f; D3DMATRIX m; D3DVECTOR v; D3DUtil_SetRotateYMatrix(m,ang.y); D3DMath_VectorMatrixMultiply(v,speed,m); pos+=(v*elapsed); pos.y=world->HeightAtPoint(pos.x,pos.z); float r=box1->GetRadius()*1.2f; D3DVECTOR c=GetCenter1(); c=korrigieren(c,D3DVECTOR(r,0,0)); c=korrigieren(c,D3DVECTOR(-r,0,0)); c=korrigieren(c,D3DVECTOR(0,0,r)); c=korrigieren(c,D3DVECTOR(0,0,-r)); pos=pos-GetCenter1()+c; UpdateBox(); speed+=(acc*elapsed); speed*=powf(0.45f,elapsed); const float s=sqrtf(sqr(speed.x)+sqr(speed.z)); if (rot!=0.0f) { float s2=sqrtf(s/5.0f); ang.y+=rot*s2*elapsed; } CPlayer* driver=(CPlayer*)parent; driver->pos=GetCenter1(); driver->ang=ang; driver->ang.y=-driver->ang.y; sound->SetFrequency(ULONG(20000.0f+s*3200.0f)); sound->Set3DParameters(pos); if (driver->IsLocal) { // An Objekten abprallen und Position senden CObject* o; o=chain->GetFirst(); while (o) { if (GetType(o->id)==IDTree) { CTree* t=(CTree*)o; if (t->box->Collidate(box2)) { pos=PrivotFromCenter2(box2->MoveOut(t->box)); UpdateBox(); goto weiter; } } if (GetType(o->id)==IDStall) { CStall* s=(CStall*)o; if (s->box->Collidate(box2)) { pos=PrivotFromCenter2(box2->MoveOut(s->box)); UpdateBox(); goto weiter; } } if ((o->IsType(IDDrescher))&&(o!=this)) { CDrescher* d=(CDrescher*)o; if (d->box2->Collidate(box2)) { pos=PrivotFromCenter2(box2->MoveOut(d->box2)); UpdateBox(); goto weiter; } } weiter: o=o->next; } struct _r { D3DVECTOR pos,ang,speed; }r; r.pos=pos; r.ang=ang; r.speed=speed; statusmessage->Send(DPID_ALLPLAYERS,NM_NOTIFY,id,1,0,0,&r,sizeof(r),FALSE); } }else rolle+=elapsed*0.7f; statusmessage->Execute(elapsed); // Kollisionen nur bei Server checken if (!game->IsServer)return; // Kollisionen mit Hühnern testen CObject* o=chain->GetFirst(); while (o) { if (GetType(o->id)==IDChicken) { CChicken* c=(CChicken*)o; if (c->dead!=0.0f)goto weiter2; // if (c->bound!=NULL)goto weiter2; if (parent!=NULL)if (HitRolle(c->box)) { // Getroffen schaukelphase=2*g_PI; c->Splat(SPLAT_NORMAL); ((CPlayer*)parent)->HasHit(c->id); ((CPlayer*)parent)->SendNotify(3,c->id); if (Config.blut)game->AddGimmick(new CDrescherBlood(id,1.5f)); if (Config.federn)game->AddGimmick(new CDrescherFedern(id,1.5f)); goto weiter2; } CBoundingTube* box=(parent?box1:box2); if (c->box->Collidate(box)) // Huhn nach ausserhalb bewegen { c->pos=c->box->MoveOut(box); goto weiter2; } } weiter2: o=o->next; } }
//*********************************************************************************************** // hum... to be checked again for performance and result quality. //----------------------------------------------------------------------------------------------- // VERIFIED (Cyril 2001/10/15) //*********************************************************************************************** void ARXDRAW_DrawInterShadows(LPDIRECT3DDEVICE7 pd3dDevice) { bool bNoVB = false; if( bSoftRender ) { bNoVB = GET_FORCE_NO_VB(); SET_FORCE_NO_VB( true ); } GDevice->SetRenderState(D3DRENDERSTATE_FOGCOLOR,0); SetZBias(pd3dDevice,1); long k; long first=1; for (long i=0;i<TREATZONE_CUR;i++) { if ((treatio[i].show!=1) || (treatio[i].io==NULL)) continue; INTERACTIVE_OBJ * io=treatio[i].io; if ( (!io->obj) || (io->ioflags & IO_JUST_COLLIDE) ) { continue; } if ((Project.hide & HIDE_NPC) && (io->ioflags & IO_NPC)) continue; if ((Project.hide & HIDE_ITEMS) && (io->ioflags & IO_ITEM)) continue; if ((Project.hide & HIDE_FIXINTER) && (io->ioflags & IO_FIX)) continue; long xx,yy; F2L((io->pos.x)*ACTIVEBKG->Xmul,&xx); F2L((io->pos.z)*ACTIVEBKG->Zmul,&yy); if ( (xx>=1) && (yy>=1) && (xx<ACTIVEBKG->Xsize-1) && (yy<ACTIVEBKG->Zsize-1) ) { FAST_BKG_DATA * feg=(FAST_BKG_DATA *)&ACTIVEBKG->fastdata[xx][yy]; if(!feg->treat) continue; } if (!( io->ioflags & IO_NOSHADOW ) ) if ( io->show==SHOW_FLAG_IN_SCENE ) if ( !(io->ioflags & IO_GOLD) ) { register EERIEPOLY * ep; D3DTLVERTEX in; D3DTLVERTEX ltv[4]; ltv[0]= D3DTLVERTEX( D3DVECTOR( 0, 0, 0.001f ), 1.f, 0, 1, 0.3f, 0.3f) ; ltv[1]= D3DTLVERTEX( D3DVECTOR( 0, 0, 0.001f ), 1.f, 0, 1, 0.7f, 0.3f) ; ltv[2]= D3DTLVERTEX( D3DVECTOR( 0, 0, 0.001f ), 1.f, 0, 1, 0.7f, 0.7f) ; ltv[3]= D3DTLVERTEX( D3DVECTOR( 0, 0, 0.001f ), 1.f, 0, 1, 0.3f, 0.7f) ; float s1=16.f*io->scale; float s2=s1 * DIV2; if (io->obj->nbgroups<=1) { for (k=0;k<io->obj->nbvertex;k+=9) { ep=EECheckInPoly(&io->obj->vertexlist3[k].v); if (ep!=NULL) { in.sy=ep->min.y-3.f; float r=0.5f-((float)EEfabs(io->obj->vertexlist3[k].v.y-in.sy))*DIV500; r-=io->invisibility; r*=io->scale; if (r<=0.f) continue; in.sx=io->obj->vertexlist3[k].v.x-s2; in.sz=io->obj->vertexlist3[k].v.z-s2; long lv; r*=255.f; F2L(r,&lv); ltv[0].color=ltv[1].color=ltv[2].color=ltv[3].color=0xFF000000 | lv<<16 | lv<<8 | lv; if (first) { first=0; SETZWRITE(pd3dDevice, FALSE ); SETBLENDMODE(pd3dDevice,D3DBLEND_ZERO,D3DBLEND_INVSRCCOLOR); SETALPHABLEND(pd3dDevice,TRUE); SETTC(pd3dDevice,Boom); } EE_RT2(&in,<v[0]); in.sx+=s1; EE_RT2(&in,<v[1]); in.sz+=s1; EE_RT2(&in,<v[2]); in.sx-=s1; EE_RT2(&in,<v[3]); if ((ltv[0].sz>0.f) && (ltv[1].sz>0.f) && (ltv[2].sz>0.f)) { ARX_DrawPrimitive_SoftClippZ( <v[0], <v[1], <v[2], 50.f); ARX_DrawPrimitive_SoftClippZ( <v[0], <v[2], <v[3], 50.f); } } } } else { for (k=0;k<io->obj->nbgroups;k++) { long origin=io->obj->grouplist[k].origin; ep=EECheckInPoly( &io->obj->vertexlist3[origin].v ); if (ep!=NULL) { in.sy=ep->min.y-3.f; float r=0.8f-((float)EEfabs(io->obj->vertexlist3[origin].v.y-in.sy))*DIV500; r*=io->obj->grouplist[k].siz; r-=io->invisibility; if (r<=0.f) continue; float s1=io->obj->grouplist[k].siz*44.f; float s2=s1*DIV2; in.sx=io->obj->vertexlist3[origin].v.x-s2; in.sz=io->obj->vertexlist3[origin].v.z-s2; long lv; r*=255.f; F2L(r,&lv); ltv[0].color= ltv[1].color = ltv[2].color = ltv[3].color = 0xFF000000 | lv<<16 | lv<<8 | lv; if (first) { first=0; SETZWRITE(pd3dDevice, FALSE ); SETBLENDMODE(pd3dDevice,D3DBLEND_ZERO,D3DBLEND_INVSRCCOLOR); SETALPHABLEND(pd3dDevice,TRUE); SETTC(pd3dDevice,Boom); } EE_RT2(&in,<v[0]); in.sx+=s1; EE_RT2(&in,<v[1]); in.sz+=s1; EE_RT2(&in,<v[2]); in.sx-=s1; EE_RT2(&in,<v[3]); ARX_DrawPrimitive_SoftClippZ( <v[0], <v[1], <v[2], 50.f); ARX_DrawPrimitive_SoftClippZ( <v[0], <v[2], <v[3], 50.f); } } } } } SETALPHABLEND(pd3dDevice,FALSE); SETZWRITE(pd3dDevice, TRUE ); SetZBias(pd3dDevice,0); GDevice->SetRenderState(D3DRENDERSTATE_FOGCOLOR,ulBKGColor); if( bSoftRender ) SET_FORCE_NO_VB( bNoVB ); }