void ZInterfaceBackground::SetFogState( float fStart, float fEnd, unsigned long int color) { RGetDevice()->SetRenderState( D3DRS_FOGENABLE, TRUE); RGetDevice()->SetRenderState( D3DRS_FOGCOLOR, color); RGetDevice()->SetRenderState( D3DRS_FOGTABLEMODE, D3DFOG_LINEAR); RGetDevice()->SetRenderState( D3DRS_FOGSTART, *(DWORD *)(&fStart)); RGetDevice()->SetRenderState( D3DRS_FOGEND, *(DWORD *)(&fEnd)); }
void RFrame_Render() { if (!RIsActive() && RIsFullScreen()) return; RRESULT isOK=RIsReadyToRender(); if(isOK==R_NOTREADY) return; else if(isOK==R_RESTORED) { RMODEPARAMS ModeParams={ RGetScreenWidth(),RGetScreenHeight(),RIsFullScreen(),RGetPixelFormat() }; RResetDevice(&ModeParams); cclog("devices Restored. \n"); } if(timeGetTime() > g_last_mouse_move_time + RTOOLTIP_GAP) g_tool_tip = true; if(g_pFunctions[RF_RENDER]) g_pFunctions[RF_RENDER](NULL); RGetDevice()->SetStreamSource(0,NULL,0,0); RGetDevice()->SetIndices(0); RGetDevice()->SetTexture(0,NULL); RGetDevice()->SetTexture(1,NULL); // Draw FPS // 60fps 가 100점 /* char buf[256]; float fMs = 1000.f/g_fFPS; float fScore = 100-(fMs-(1000.f/60.f))*2; sprintf(buf, "FPS : %3.3f , %d triangles, %4.1f ms,score %4.1f 점",g_fFPS,gNumTrisRendered,fMs,fScore); RECT drawRect; SetRect(&drawRect, 0, 0, RGetScreenWidth(), RGetScreenHeight()); g_lpFont->DrawText(buf, -1, &drawRect, DT_LEFT | DT_TOP, D3DCOLOR_RGBA(255, 255, 255, 255)); // */ /* for(int i=0;i<CCGetLogHistoryCount();i++) { drawRect.top=(i+1)*20; g_lpFont->DrawText(CCGetLogHistory(i), -1, &drawRect, DT_LEFT | DT_TOP, D3DCOLOR_RGBA(255, 255, 255, 255)); } */ }
void ZEffectBase::OnRestore() { SAFE_RELEASE(m_pVB); if(FAILED(RGetDevice()->CreateVertexBuffer( sizeof(ZEFFECTCUSTOMVERTEX) * EFFECTBASE_DISCARD_COUNT * 4 , D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY , ZEFFECTBASE_D3DFVF, D3DPOOL_DEFAULT, &m_pVB,NULL))) return ; SAFE_RELEASE(m_pIB); if(FAILED(RGetDevice()->CreateIndexBuffer( sizeof(WORD) * EFFECTBASE_DISCARD_COUNT * 6 , D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY , D3DFMT_INDEX16 , D3DPOOL_DEFAULT, &m_pIB,NULL))) return ; m_dwBase = EFFECTBASE_DISCARD_COUNT; }
void ZEffectBillboardList::BeginState() { LPDIRECT3DDEVICE9 pDevice = RGetDevice(); pDevice->SetRenderState(D3DRS_ALPHAREF, (DWORD)0x00000000); pDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_NOTEQUAL ); pDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE); pDevice->SetRenderState( D3DRS_LIGHTING, FALSE); pDevice->SetTextureStageState( 0, D3DTSS_COLORARG1 , D3DTA_TEXTURE ); pDevice->SetTextureStageState( 0, D3DTSS_COLORARG2 , D3DTA_DIFFUSE ); pDevice->SetTextureStageState( 0, D3DTSS_COLOROP , D3DTOP_MODULATE ); pDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1 , D3DTA_TEXTURE ); pDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG2 , D3DTA_DIFFUSE ); pDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP , D3DTOP_MODULATE ); pDevice->SetSamplerState( 0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP ); pDevice->SetSamplerState( 0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP ); pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); pDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); pDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); RSetWBuffer(true); pDevice->SetRenderState(D3DRS_ZWRITEENABLE, FALSE); ZEffectBase::BeginState(); }
RRESULT OnCreate(void *pParam) { // RSetGammaRamp(Z_VIDEO_GAMMA_VALUE); RSetRenderFlags(RRENDER_CLEAR_BACKBUFFER); g_pDefFont = new MFontR2; if( !g_pDefFont->Create("Default", "±¼¸²", 9, 1.0f) ) // if( !g_pDefFont->Create("Default", RGetDevice(), "µ¸¿ò", 9, 1.0f, true, false) ) // if( !g_pDefFont->Create("Default", RGetDevice(), "µ¸¿ò", 14, 1.0f, true, false) ) { g_pDefFont->Destroy(); SAFE_DELETE( g_pDefFont ); g_pDefFont = NULL; } g_pDC = new MDrawContextR2(RGetDevice()); g_Mint.Initialize(800, 600, g_pDC, g_pDefFont); g_Mint.SetWorkspaceSize(g_ModeParams.nWidth, g_ModeParams.nHeight); g_Mint.GetMainFrame()->SetSize(g_ModeParams.nWidth, g_ModeParams.nHeight); g_Mint.SetHWND(RealSpace2::g_hWnd); Reload(); // g_IDLResource.LoadFromFile("main.xml"); SetCursor(LoadCursor(NULL, IDC_ARROW)); ShowCursor(TRUE); return R_OK; }
bool ZEmblemInterface::ReloadClanInfo(UINT nClanID) { EmblemInfoMapList::iterator Iterator; if ( !FindClanInfo( nClanID, &Iterator)) return false; ZEmblemInfoNode &EmblemNode = Iterator->second; char szFilePath[256]; if(!ZGetGameClient()->GetEmblemManager()->GetEmblemPathByCLID(nClanID,szFilePath)) return false; SAFE_DELETE(EmblemNode.m_pBitmapEmblem); #ifdef _PUBLISH MZFile::SetReadMode( MZIPREADFLAG_ZIP | MZIPREADFLAG_MRS | MZIPREADFLAG_MRS2 | MZIPREADFLAG_FILE ); #endif // 클랜ID 값을 이용하여 해당 비트맵을 메모리 캐쉬로 로드한다. MBitmapR2 *pBitmap = new MBitmapR2; pBitmap->Create("clanEmblem",RGetDevice(),szFilePath,false); EmblemNode.m_pBitmapEmblem = pBitmap; #ifdef _PUBLISH MZFile::SetReadMode( MZIPREADFLAG_MRS2 ); #endif return true; }
void RMeshNodeMtrl::SetMtrl(D3DXCOLOR* c,float vis_alpha) { if(!c) return; D3DMATERIAL9 mtrl; ZeroMemory( &mtrl, sizeof(D3DMATERIAL9) ); mtrl.Diffuse.r = c->r; mtrl.Diffuse.g = c->g; mtrl.Diffuse.b = c->b; mtrl.Diffuse.a = c->a; mtrl.Ambient.r = c->r*0.5f; mtrl.Ambient.g = c->g*0.5f; mtrl.Ambient.b = c->b*0.5f; mtrl.Ambient.a = 1.0f; mtrl.Specular.r = 1.0f; mtrl.Specular.g = 1.0f; mtrl.Specular.b = 1.0f; mtrl.Specular.a = 1.0f; if(vis_alpha != 1.f) { mtrl.Diffuse.a = vis_alpha; mtrl.Ambient.a = vis_alpha; mtrl.Specular.a = vis_alpha; } RGetDevice()->SetMaterial( &mtrl ); if(RGetShaderMgr()->mbUsingShader ) { RGetShaderMgr()->setMtrl( *c, vis_alpha ); } }
void RMeshNodeMtrl::SetMtrlDiffuse(RMtrl* pMtrl,float vis_alpha) { if(!pMtrl) return; D3DMATERIAL9 mtrl; ZeroMemory( &mtrl, sizeof(D3DMATERIAL9) ); D3DXCOLOR* c = &pMtrl->m_diffuse; mtrl.Diffuse.r = c->r*0.5f; mtrl.Diffuse.g = c->g*0.5f; mtrl.Diffuse.b = c->b*0.5f; mtrl.Diffuse.a = 1.0f; mtrl.Ambient.r = c->r*0.1f; mtrl.Ambient.g = c->g*0.1f; mtrl.Ambient.b = c->b*0.1f; mtrl.Ambient.a = 1.0f; mtrl.Specular.r = 0.5f; mtrl.Specular.g = 0.5f; mtrl.Specular.b = 0.5f; mtrl.Specular.a = 1.f; mtrl.Power = pMtrl->m_power; if( pMtrl->m_power ) { RGetDevice()->SetRenderState( D3DRS_SPECULARENABLE, TRUE ); } else { RGetDevice()->SetRenderState( D3DRS_SPECULARENABLE, FALSE ); } if(vis_alpha != 1.f) { mtrl.Diffuse.a = vis_alpha; mtrl.Ambient.a = vis_alpha; mtrl.Specular.a = vis_alpha; } RGetDevice()->SetMaterial( &mtrl ); if(RGetShaderMgr()->mbUsingShader ) { RGetShaderMgr()->setMtrl( pMtrl, vis_alpha ); } }
void ZDuelTournamentRankingListBox::LoadInterfaceImgs() { if (m_pBmpRankingItemBg == NULL) { m_pBmpRankingItemBg = new MBitmapR2; ((MBitmapR2*)m_pBmpRankingItemBg)->Create( "DuelTournamentRankingItemBg.png", RGetDevice(), "interface/DuelTournamentRankingItemBg.png"); } if (m_pBmpArrowUp == NULL) { m_pBmpArrowUp = new MBitmapR2; ((MBitmapR2*)m_pBmpArrowUp)->Create( "arrow_up.tga", RGetDevice(), "interface/arrow_up.tga"); } if (m_pBmpArrowDown == NULL) { m_pBmpArrowDown = new MBitmapR2; ((MBitmapR2*)m_pBmpArrowDown)->Create( "arrow_down.tga", RGetDevice(), "interface/arrow_down.tga"); } if (m_pBmpArrowBar == NULL) { m_pBmpArrowBar = new MBitmapR2; ((MBitmapR2*)m_pBmpArrowBar)->Create( "arrow_bar.tga", RGetDevice(), "interface/arrow_bar.tga"); } }
////////////////////////////////////////////////////////////////////////// // OnRestore ////////////////////////////////////////////////////////////////////////// void ZClothEmblem::OnRestore() { if( g_hw_Buffer == 0 ) { if( FAILED( RGetDevice()->CreateVertexBuffer( MAX_NUM_CLOTH_PARTICLE* 3 * sizeof( RVertex ), D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY, RVertexType, D3DPOOL_DEFAULT, &g_hw_Buffer ,NULL) )) { mlog( "Fail to Restore Vertex Buffer for Emblems..\n" ); bHardwareBuffer = false; } } }
void ZEffectBase::BeginState() { rmatrix id; D3DXMatrixIdentity(&id); LPDIRECT3DDEVICE9 pDevice = RGetDevice(); pDevice->SetTransform(D3DTS_WORLD, &id); pDevice->SetStreamSource(0,m_pVB,0,sizeof(ZEFFECTCUSTOMVERTEX)); pDevice->SetIndices(m_pIB); pDevice->SetFVF(ZEFFECTBASE_D3DFVF); pDevice->SetTexture(0,m_pBaseTexture ? m_pBaseTexture->GetTexture() : NULL ); }
void RCharCloth::prerender() { LPDIRECT3DDEVICE9 dev = RGetDevice(); // Get Device Pointer dev->SetFVF( RVertexType ); dev->SetRenderState( D3DRS_LIGHTING, TRUE ); dev->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE ); dev->SetRenderState( D3DRS_SPECULARENABLE, FALSE ); dev->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID); if( bHarewareBuffer ) dev->SetStreamSource(0, gpClothVertexBuffer, 0,sizeof(RVertex) ); }
void RCharCloth::OnRestore() { if( gpClothVertexBuffer != 0 ) return; if( FAILED( RGetDevice()->CreateVertexBuffer( sizeof(RVertex) * NUM_MAX_COAT_VERTEX , D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY, RVertexType, D3DPOOL_DEFAULT, &gpClothVertexBuffer ,NULL))) { bHarewareBuffer = false; SAFE_RELEASE( gpClothVertexBuffer ); mlog("Fail to Create Cloth Vertex buffer"); } bHarewareBuffer = true; }
virtual MBitmap* OpenBitmap(const char* szName){ char aliasname[256]; char drive[_MAX_DRIVE],dir[_MAX_DIR],fname[_MAX_FNAME],ext[_MAX_EXT]; _splitpath(szName,drive,dir,fname,ext); sprintf(aliasname,"%s%s",fname,ext); MBitmapR2* pNew = new MBitmapR2; bool bRet = pNew->Create(aliasname, RGetDevice(), szName); if(bRet==false){ delete pNew; return NULL; } return pNew; }
void Draw(DWORD color) { { struct LVERTEX { float x, y, z; // world position DWORD color; } ; RGetDevice()->SetTexture(0,NULL); RGetDevice()->SetRenderState( D3DRS_LIGHTING, FALSE ); LVERTEX lines[1024]; RGetDevice()->SetFVF( D3DFVF_XYZ | D3DFVF_DIFFUSE ); for(int i=0;i<nCount+1;i++) { lines[i].x=pVertices[i%nCount].x; lines[i].y=pVertices[i%nCount].y; lines[i].z=pVertices[i%nCount].z; lines[i].color=color; } HRESULT hr=RGetDevice()->DrawPrimitiveUP(D3DPT_LINESTRIP,nCount,lines,sizeof(LVERTEX)); } }
void ZHelpScreen::ChangeMode() { m_bDrawHelpScreen = !m_bDrawHelpScreen; if(m_bDrawHelpScreen) { m_pHelpScreenBitmap = new MBitmapR2; m_pHelpScreenBitmap->Create("HelpScreen",RGetDevice(), "Interface/default/help/key.png" ); } else { if(m_pHelpScreenBitmap) { delete m_pHelpScreenBitmap; m_pHelpScreenBitmap = NULL; } } }
bool ZLoading::OnCreate() { m_pBackGround=new MPicture("background",this,this); // 직접그린다. m_pBitmap = new MBitmapR2; m_pBitmap->Create("loading", RGetDevice(), "interface/loading_screen.tga"); //*/ // m_pBitmap=(MBitmapR2*)MBitmapManager::Get("loading01.png"); m_pBackGround->SetBitmap(m_pBitmap); m_pBackGround->SetPosition(0, 0); m_pBackGround->SetBounds(0, 0, GetRect().w, GetRect().h); m_pBackGround->SetStretch(true); return true; }
int RInitD3D( RMODEPARAMS* pModeParams ) { RFrame_Create(); ShowWindow(g_hWnd,SW_SHOW); if(!RInitDisplay(g_hWnd,pModeParams)) { cclog("can't init display\n"); return -1; } //RBeginScene(); RGetDevice()->Clear(0 , NULL, D3DCLEAR_TARGET, 0x00000000, 1.0f, 0 ); // REndScene(); RFlip(); return 0; }
void RWeaponTracks::Render() { Update(); LPDIRECT3DDEVICE9 dev = RGetDevice(); if(m_current_node_size > 1) { MakeBuffer(); static D3DXMATRIX _init_mat = GetIdentityMatrix(); dev->SetTransform( D3DTS_WORLD, &_init_mat ); dev->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE ); dev->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE ); dev->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG2 ); dev->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG2 ); dev->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE ); dev->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE); dev->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA ); dev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); dev->SetRenderState( D3DRS_LIGHTING, FALSE ); dev->SetRenderState( D3DRS_ZWRITEENABLE, FALSE ); dev->SetTexture(0, NULL); dev->SetFVF( RLVertexType ); if(m_bSpline) dev->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, m_current_spline_vertex_size-2 ,(LPVOID)m_pVertSpline, sizeof(RLVertex)); else dev->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, m_current_vertex_size-2 ,(LPVOID)m_pVert, sizeof(RLVertex)); dev->SetRenderState( D3DRS_CULLMODE, D3DCULL_CCW ); dev->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE); dev->SetRenderState( D3DRS_ZWRITEENABLE, TRUE ); dev->SetRenderState( D3DRS_LIGHTING, TRUE ); } }
MBitmap* GetItemThumbnailBitmap(MMatchItemDesc* pDesc) { // 아이템의 썸네일 파일을 로딩 if (!pDesc) return NULL; MBitmap* pBitmap = ZGetGameInterface()->GetItemThumbnailMgr()->Get(pDesc->m_nID); if (pBitmap) return pBitmap; char szAliasName[32]; char szFilePath[256]; sprintf(szAliasName, "%d", pDesc->m_nID); sprintf(szFilePath, "interface/itemicon%d.dds", pDesc->m_nID); MBitmapR2* pNewBitmap = new MBitmapR2; if (!pNewBitmap->Create(szAliasName, RGetDevice(), szFilePath)) { delete pNewBitmap; return NULL; } ZGetGameInterface()->GetItemThumbnailMgr()->Add(pDesc->m_nID, pNewBitmap); return pNewBitmap; }
void ZEffectShadowList::BeginState() { LPDIRECT3DDEVICE9 pDev = RGetDevice(); pDev->SetRenderState(D3DRS_LIGHTING, FALSE ); pDev->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE); pDev->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA ); pDev->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA ); pDev->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE ); pDev->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); pDev->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE ); pDev->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE ); pDev->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_TEXTURE ); pDev->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE); // pDev->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_TFACTOR ); pDev->SetRenderState(D3DRS_ZWRITEENABLE, FALSE); RSetWBuffer(true); ZEffectBase::BeginState(); }
void RMeshNodeMtrl::SetMtrl(RMtrl* pMtrl,float vis_alpha,bool bNpc,D3DCOLORVALUE color) { if(!pMtrl) return; D3DMATERIAL9 mtrl; ZeroMemory( &mtrl, sizeof(D3DMATERIAL9) ); if(bNpc) { mtrl.Diffuse.r = color.r; mtrl.Diffuse.g = color.g; mtrl.Diffuse.b = color.b; mtrl.Diffuse.a = 1.0f; mtrl.Ambient.r = color.r/2.f; mtrl.Ambient.g = color.g/2.f; mtrl.Ambient.b = color.b/2.f; mtrl.Ambient.a = 1.0f; } else { mtrl.Diffuse.r = color.r; mtrl.Diffuse.g = color.g; mtrl.Diffuse.b = color.b; mtrl.Diffuse.a = 1.0f; mtrl.Ambient.r = color.r/2.f; mtrl.Ambient.g = color.g/2.f; mtrl.Ambient.b = color.b/2.f; mtrl.Ambient.a = 1.0f; /* mtrl.Diffuse.r = 0.5f; mtrl.Diffuse.g = 0.5f; mtrl.Diffuse.b = 0.5f; mtrl.Diffuse.a = 1.0f; mtrl.Ambient.r = 0.35f; mtrl.Ambient.g = 0.35f; mtrl.Ambient.b = 0.35f; mtrl.Ambient.a = 1.0f; */ } mtrl.Specular.r = 0.5f; mtrl.Specular.g = 0.5f; mtrl.Specular.b = 0.5f; mtrl.Specular.a = 1.f; mtrl.Power = pMtrl->m_power; if( pMtrl->m_power ) { RGetDevice()->SetRenderState( D3DRS_SPECULARENABLE, TRUE ); } else { RGetDevice()->SetRenderState( D3DRS_SPECULARENABLE, FALSE ); } if(vis_alpha != 1.f) { mtrl.Diffuse.a = vis_alpha; mtrl.Ambient.a = vis_alpha; mtrl.Specular.a = vis_alpha; } RGetDevice()->SetMaterial( &mtrl ); if(RGetShaderMgr()->mbUsingShader ) { RGetShaderMgr()->setMtrl( pMtrl, vis_alpha ); } }
////////////////////////////////////////////////////////////////////////// // Render ////////////////////////////////////////////////////////////////////////// void ZClothEmblem::render() { // if( !isInViewFrustum( &mAABB, RGetViewFrustum() ) ) //{ // return; //} // if(g_pGame==NULL || !ZGetGame()->GetWorld()->GetBsp()->IsVisible(mAABB)) return; if( !mbIsInFrustrum ) return; int i, index; UpdateNormal(); //memset(g_Cloth_Buffer,0, sizeof(RVertex)*MAX_NUM_CLOTH_PARTICLE*3 ); //for( i = 0 ; i < mpMeshNode->m_point_num; ++i ) //{ // g_Cloth_Buffer[i].p = m_pX[i]; // g_Cloth_Buffer[i].n = m_pNormal[i]; //} // for( i = 0 ; i < mpMeshNode->m_face_num; ++i ) //{ // for( int j = 0 ; j < 3; ++j ) // { // index = mpMeshNode->m_face_list[i].m_point_index[j]; // g_Cloth_Buffer[index].tu = mpMeshNode->m_face_list[i].m_point_tex[j].x; // g_Cloth_Buffer[index].tv = mpMeshNode->m_face_list[i].m_point_tex[j].y; // g_index_buffer[i*3+j] = index; // } //} for( i = 0 ; i < mpMeshNode->m_face_num; ++i ) { for( int j = 0 ; j < 3; ++j ) { index = mpMeshNode->m_face_list[i].m_point_index[j]; g_Cloth_Buffer[3*i+j].p = m_pX[index]; g_Cloth_Buffer[3*i+j].n = m_pNormal[index]; g_Cloth_Buffer[3*i+j].tu = mpMeshNode->m_face_list[i].m_point_tex[j].x; g_Cloth_Buffer[3*i+j].tv = mpMeshNode->m_face_list[i].m_point_tex[j].y; // g_index_buffer[i*3+j] = index; } } D3DMATERIAL9 mtrl; mtrl.Ambient.r = 1.f; mtrl.Ambient.g = 1.f; mtrl.Ambient.b = 1.f; mtrl.Ambient.a = 0.f; mtrl.Diffuse.r = 1.0f; mtrl.Diffuse.g = 1.0f; mtrl.Diffuse.b = 1.0f; mtrl.Diffuse.a = 1.f; mtrl.Specular.r = 0.f; mtrl.Specular.g = 0.f; mtrl.Specular.b = 0.f; mtrl.Specular.a = 0.f; mtrl.Emissive.r = 0.f; mtrl.Emissive.g = 0.f; mtrl.Emissive.b = 0.f; mtrl.Emissive.a = 0.f; mtrl.Power = 0.0f; RGetDevice()->SetMaterial( &mtrl ); RMtrlMgr* pMtrlMgr = &mpMeshNode->m_pParentMesh->m_mtrl_list_ex; RMtrl* pMtrl = pMtrlMgr->Get_s(mpMeshNode->m_mtrl_id,-1); RGetDevice()->SetTexture( 0, pMtrl->GetTexture() ); RGetDevice()->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE ); RGetDevice()->SetRenderState( D3DRS_SPECULARENABLE, FALSE ); RGetDevice()->SetRenderState( D3DRS_AMBIENT, 0x00555555 ); RGetShaderMgr()->setAmbient( 0x00555555 ); RGetDevice()->SetRenderState( D3DRS_LIGHTING, TRUE ); RGetDevice()->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE ); RGetDevice()->SetRenderState( D3DRS_ALPHATESTENABLE, FALSE ); RGetDevice()->SetLight( 0, mpLight ); RGetDynamicLightManager()->SetLight( m_pX[0], 1, LIGHT_DISTANCE ); rmatrix Identity; D3DXMatrixIdentity( &Identity ); RGetDevice()->SetTransform( D3DTS_WORLD, &Identity ); RGetDevice()->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE ); RGetDevice()->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA ); RGetDevice()->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); RGetDevice()->SetRenderState( D3DRS_ZWRITEENABLE, TRUE ); RGetDevice()->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE ); RGetDevice()->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_DIFFUSE ); RGetDevice()->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_TEXTURE ); RGetDevice()->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 ); RGetDevice()->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); RGetDevice()->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID ); RGetDevice()->LightEnable( 0, TRUE ); RGetDevice()->LightEnable( 1, FALSE ); RGetDevice()->SetFVF( RVertexType ); //RGetDevice()->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME ); if( bHardwareBuffer ) { // TODO: 무조건 DISCARD 로 lock할것이 아니라, nooverwrite 로 적절히 낭비되지않도록해주자. VOID* pVertex; if( FAILED( g_hw_Buffer->Lock( 0, mpMeshNode->m_point_num * 3 * sizeof(RVertex), (VOID**)&pVertex, D3DLOCK_DISCARD ))) { mlog(" Fail to Lock Emblem hw buffer.. Check Buffer Size.. \n" ); bHardwareBuffer = false; return; } memcpy( pVertex, g_Cloth_Buffer, mpMeshNode->m_face_num*3 * sizeof(RVertex) ); if( FAILED( g_hw_Buffer->Unlock() )) { mlog(" Fail to unLock Emblem hw buffer.. Check Buffer Size.. \n" ); bHardwareBuffer = false; return; } RGetDevice()->SetStreamSource( 0, g_hw_Buffer, 0, sizeof(RVertex) ); //RGetDevice()->SetIndices( mIndexBuffer); //RGetDevice()->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0, mpMeshNode->m_point_num, 0, mpMeshNode->m_face_num ); RGetDevice()->DrawPrimitive(D3DPT_TRIANGLELIST,0,mpMeshNode->m_face_num); } else { //RGetDevice()->DrawIndexedPrimitiveUP( D3DPT_TRIANGLELIST, 0, mpMeshNode->m_point_num, mpMeshNode->m_face_num, g_index_buffer, D3DFMT_INDEX16, g_Cloth_Buffer, sizeof(RVertex) ); RGetDevice()->DrawPrimitiveUP(D3DPT_TRIANGLELIST, mpMeshNode->m_face_num, g_Cloth_Buffer, sizeof(RVertex) ); } RGetDevice()->LightEnable( 0, FALSE ); RGetDevice()->LightEnable( 1, FALSE ); //{ // static testv v[1000]; // for( int i = 0; i < m_nCntP; ++i ) // { // v[2*i].n = m_pX[i]; // v[2*i].c = 0xffffffff; // v[2*i + 1].n = m_pX[i] + mpNormal[i] * 50.f; // v[2*i + 1].c = 0xffffffff; // } // RGetDevice()->SetFVF( testvFVF ); // RGetDevice()->DrawPrimitiveUP( D3DPT_LINELIST, m_nCntP, v, sizeof(testv) ); //} }
////////////////////////////////////////////////////////////////////////// // render ////////////////////////////////////////////////////////////////////////// void RCharCloth::render() { // bHarewareBuffer = true; int i; LPDIRECT3DDEVICE9 dev = RGetDevice(); // Get Device Pointer UpdateNormal(); RMtrlMgr* pMtrlMgr = &mpMeshNode->m_pParentMesh->m_mtrl_list_ex; RMtrl* pMtrl = pMtrlMgr->Get_s(mpMeshNode->m_mtrl_id,-1); int num_mtrl = pMtrl->m_sub_mtrl_num; int point_index; // 현재 버텍스의 인덱스 for( i = 0 ; i < mpMeshNode->m_face_num ; ++i ) { for( int j = 0 ; j < 3; ++j ) { point_index = mpMeshNode->m_face_list[i].m_point_index[j]; gVertices[3*i+j].p = m_pX[point_index]; gVertices[3*i+j].tu = mpMeshNode->m_face_list[i].m_point_tex[j].x; gVertices[3*i+j].tv = mpMeshNode->m_face_list[i].m_point_tex[j].y; gVertices[3*i+j].n = m_pNormal[point_index]; } } if( bHarewareBuffer && gpClothVertexBuffer) { //// Copy Begin void *Buffer; if( FAILED( gpClothVertexBuffer->Lock( 0, sizeof(RVertex) * mpMeshNode->m_face_num * 3, (VOID**)&Buffer, D3DLOCK_DISCARD ))) { bHarewareBuffer = false; REL( gpClothVertexBuffer ); mlog("Fail to lock of Vertex Buffer\n"); goto e2SoftRender; } //memcpy( Buffer, gVertices, sizeof(RVertex) * m_nCntP ); memcpy( Buffer, gVertices, sizeof(RVertex) * mpMeshNode->m_face_num * 3 ); gpClothVertexBuffer->Unlock(); // Copy End } e2SoftRender: prerender(); if(mpMesh->m_pVisualMesh) mpMesh->m_pVisualMesh->UpdateLight(); rmatrix rtemp; dev->GetTransform( D3DTS_WORLD, &rtemp ); dev->SetTransform( D3DTS_WORLD , &( mLocalMat * mWorldMat ) ); mpMesh->SetCharacterMtrl_ON( pMtrl,mpMeshNode,1 ,mpMeshNode->GetTColor()); #ifdef USE_TOON_RENDER mpMeshNode->ToonRenderSettingOn(pMtrl); #endif if( bHarewareBuffer ) { dev->DrawPrimitive( D3DPT_TRIANGLELIST, 0, mpMeshNode->m_face_num ); } else { dev->DrawPrimitiveUP( D3DPT_TRIANGLELIST, mpMeshNode->m_face_num, gVertices, sizeof(RVertex)); } #ifdef USE_TOON_RENDER // if(Silhouette) { mpMeshNode->ToonRenderSilhouetteSettingOn(); if( bHarewareBuffer ) dev->DrawPrimitive( D3DPT_TRIANGLELIST, 0, mpMeshNode->m_face_num ); else dev->DrawPrimitiveUP( D3DPT_TRIANGLELIST, mpMeshNode->m_face_num, gVertices, sizeof(RVertex)); mpMeshNode->ToonRenderSilhouetteSettingOff(); } mpMeshNode->ToonRenderSettingOff(); #endif mpMesh->SetCharacterMtrl_OFF( pMtrl, 1 ); dev->SetTransform( D3DTS_WORLD, &rtemp ); postrender(); }
void ZHelpScreen::DrawHelpScreen() { if( !m_bDrawHelpScreen ) return; // 필터링을 끄고.. if(m_pHelpScreenBitmap==NULL) return; if(m_pHelpScreenBitmap->m_pTexture==NULL) return; float mx = 0.f; float my = 0.f; float mw = (float)RGetScreenWidth(); float mh = (float)RGetScreenHeight(); float msx = 0.f; float msy = 0.f; float msw = 800.f; float msh = 600.f; float ftw = 800.f;//(float)m_pHelpScreenBitmap->m_pTexture->GetWidth(); float fth = 600.f;//(float)m_pHelpScreenBitmap->m_pTexture->GetHeight(); float msw2 = msw; float msh2 = msh; D3DFORMAT d3dformat = m_pHelpScreenBitmap->m_pTexture->m_Info.Format; if( d3dformat==D3DFMT_DXT1 || d3dformat==D3DFMT_DXT2 || d3dformat==D3DFMT_DXT3 || d3dformat==D3DFMT_DXT4 || d3dformat==D3DFMT_DXT5 ) { msw2 = (float)Floorer2PowerSize((int)msw); msh2 = (float)Floorer2PowerSize((int)msh); } RGetDevice()->SetRenderState( D3DRS_LIGHTING, FALSE); CUSTOMVERTEX Sprite[4] = { {mx - ADJUST_SIZE , my - ADJUST_SIZE , 0, 1.0f, (msx)/ftw , (msy)/fth }, {mx + mw - ADJUST_SIZE2, my - ADJUST_SIZE , 0, 1.0f, (msx + msw2)/ftw, (msy)/fth }, {mx + mw - ADJUST_SIZE2, my + mh - ADJUST_SIZE2, 0, 1.0f, (msx + msw2)/ftw, (msy + msh2)/fth }, {mx - ADJUST_SIZE , my + mh - ADJUST_SIZE2, 0, 1.0f, (msx)/ftw , (msy + msh2)/fth}, }; // RSetWBuffer(true); RGetDevice()->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE ); RGetDevice()->SetRenderState( D3DRS_SRCBLEND,D3DBLEND_SRCALPHA ); RGetDevice()->SetRenderState( D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA ); RGetDevice()->SetTextureStageState( 0, D3DTSS_COLORARG1 , D3DTA_TEXTURE ); RGetDevice()->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 ); RGetDevice()->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); RGetDevice()->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 ); RGetDevice()->SetFVF(D3DFVF_CUSTOMVERTEX); RGetDevice()->SetTexture( 0, m_pHelpScreenBitmap->m_pTexture->GetTexture() ); RGetDevice()->SetSamplerState( 0, D3DSAMP_MAGFILTER , D3DTEXF_POINT ); RGetDevice()->SetSamplerState( 0, D3DSAMP_MINFILTER , D3DTEXF_POINT ); // RGetDevice()->SetSamplerState( 0, D3DSAMP_MAGFILTER , D3DTEXF_NONE ); // RGetDevice()->SetSamplerState( 0, D3DSAMP_MINFILTER , D3DTEXF_NONE ); RGetDevice()->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, Sprite, sizeof(CUSTOMVERTEX)); // RGetDevice()->SetTextureStageState( 0, D3DTSS_MAGFILTER , D3DTEXF_LINEAR ); // RGetDevice()->SetTextureStageState( 0, D3DTSS_MINFILTER , D3DTEXF_LINEAR ); RGetDevice()->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR ); RGetDevice()->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR ); // 굵은 폰트로 바인딩된 키그려주기... g_pDC->SetColor(MCOLOR(0xFF000000)); // g_pDC->SetFont(MFontManager::Get("FONTc8b")); // g_pDC->SetFont(MFontManager::Get("FONTa12_O1Blr")); g_pDC->SetFont(MFontManager::Get("FONTb11b")); float aspect_x = RGetScreenWidth()/800.f; float aspect_y = RGetScreenHeight()/600.f; MFontR2* pFont = (MFontR2*)g_pDC->GetFont(); pFont->m_fScale = 1.0f * aspect_x; int nHeight = 193 * aspect_y; // x y 중앙 TextOutKeymap(ZACTION_MELEE_WEAPON , 90 * aspect_x, nHeight); TextOutKeymap(ZACTION_PRIMARY_WEAPON , 148 * aspect_x, nHeight); TextOutKeymap(ZACTION_SECONDARY_WEAPON, 209 * aspect_x, nHeight); TextOutKeymap(ZACTION_ITEM1 , 265 * aspect_x, nHeight); TextOutKeymap(ZACTION_ITEM2 , 323 * aspect_x, nHeight); nHeight = 258 * aspect_y; TextOutKeymap(ZACTION_PREV_WEAPON ,105*aspect_x,nHeight); TextOutKeymap(ZACTION_FORWARD ,162*aspect_x,nHeight); TextOutKeymap(ZACTION_NEXT_WEAPON ,222*aspect_x,nHeight); TextOutKeymap(ZACTION_RELOAD ,280*aspect_x,nHeight); nHeight = 323 * aspect_y; TextOutKeymap(ZACTION_LEFT ,120*aspect_x,nHeight); TextOutKeymap(ZACTION_BACK ,178*aspect_x,nHeight); TextOutKeymap(ZACTION_RIGHT ,239*aspect_x,nHeight); nHeight = 390 * aspect_y; TextOutKeymap(ZACTION_JUMP ,196*aspect_x,nHeight); // TodoH(상) - Help 화면은 무엇인가효? pFont->m_fScale = 1.0f; // RSetWBuffer(true); }
bool ZEffectBillboardList::Draw() { if(!m_pVB) return false; if( size()==0 ) return true; BeginState(); HRESULT hr; DWORD dwRemainNum = (DWORD)size(); iterator itr=begin(); while(dwRemainNum) { if(m_dwBase >= EFFECTBASE_DISCARD_COUNT) m_dwBase = 0; // 갯수가 BILLBOARD_FLUSH_COUNT 를 넘어가면 BILLBOARD_FLUSH_COUNT 씩 찍는다 DWORD dwThisNum = min( dwRemainNum , BILLBOARD_FLUSH_COUNT ); // 버퍼의 크기를 넘어가면 개수를 줄여서 크기만큼만 찍는다 dwThisNum = min( dwThisNum , EFFECTBASE_DISCARD_COUNT - m_dwBase ); BYTE *pVertices; if( FAILED( hr = m_pVB->Lock( m_dwBase * sizeof(ZEFFECTCUSTOMVERTEX) * 4, dwThisNum * sizeof(ZEFFECTCUSTOMVERTEX) * 4, (VOID**)&pVertices, m_dwBase ? D3DLOCK_NOOVERWRITE : D3DLOCK_DISCARD ) ) ) { return false; } BYTE *pInd; if( FAILED( hr = m_pIB->Lock( m_dwBase * sizeof(WORD) * 6, dwThisNum * sizeof(WORD) * 6, (VOID**)&pInd, m_dwBase ? D3DLOCK_NOOVERWRITE : D3DLOCK_DISCARD ) ) ) { return false; } for(DWORD j=0;j<dwThisNum;j++) { ZEFFECTBILLBOARDITEM *p = (ZEFFECTBILLBOARDITEM*)*itr; // Transform rmatrix matTranslation; rmatrix matScaling; rmatrix matWorld; rvector dir = p->normal; rvector up=p->up; rvector right; if(IS_EQ(dir.z,1.f)) up=rvector(1,0,0); D3DXVec3Cross(&right, &up, &dir); D3DXVec3Normalize(&right, &right); D3DXVec3Cross(&up, &right, &dir); D3DXVec3Normalize(&up, &up); rmatrix mat; D3DXMatrixIdentity(&mat); mat._11=right.x;mat._12=right.y;mat._13=right.z; mat._21=up.x;mat._22=up.y;mat._23=up.z; mat._31=dir.x;mat._32=dir.y;mat._33=dir.z; rvector pos=p->position; // float fScale=p->fStartSize * p->fOpacity + p->fEndSize * (1.f - p->fOpacity); float fInt = min(1,max(0,(p->fLifeTime - p->fElapsedTime)/p->fLifeTime)); float fScale=p->fStartSize * fInt + p->fEndSize * (1.f - fInt); if( p->bUseTrainSmoke ) { float fRatio = GetLifeRatio(p); float fAddScale = (p->fEndSize - p->fStartSize) / p->fLifeTime; if(fRatio < 0.1f ) { fAddScale *= 0.001f; } else if(fRatio < 0.4) { fAddScale *= 0.02f; } else { fAddScale *= 0.05f; } p->fCurScale += fAddScale; if(p->fCurScale > p->fEndSize) p->fCurScale = p->fEndSize; fScale = p->fCurScale; } D3DXMatrixScaling(&matScaling,fScale*m_Scale.x,fScale*m_Scale.y,fScale*m_Scale.z); D3DXMatrixTranslation(&matTranslation, pos.x, pos.y, pos.z); D3DXMatrixMultiply(&matWorld, &matScaling, &mat); D3DXMatrixMultiply(&matWorld, &matWorld, &matTranslation); // D3DXMatrixMultiply(&matWorld, &mat, &matTranslation); DWORD color = ((DWORD)(p->fOpacity * 255))<<24 | p->dwColor; static ZEFFECTCUSTOMVERTEX v[] = { {-1, -1, 0, 0xFFFFFFFF, 1, 0}, {-1, 1, 0, 0xFFFFFFFF, 1, 1}, { 1, 1, 0, 0xFFFFFFFF, 0, 1}, { 1, -1, 0, 0xFFFFFFFF, 0, 0}, }; static rvector sv[4] = { rvector(-1,-1,0) , rvector(-1,1,0) , rvector(1,1,0) , rvector(1,-1,0) }; // 좋은코드는 아니지만 버텍스 카피를 줄이기위해 타입캐스팅했다. D3DXVec3TransformCoord((D3DXVECTOR3*)&v[0].x,sv+0,&matWorld); D3DXVec3TransformCoord((D3DXVECTOR3*)&v[1].x,sv+1,&matWorld); D3DXVec3TransformCoord((D3DXVECTOR3*)&v[2].x,sv+2,&matWorld); D3DXVec3TransformCoord((D3DXVECTOR3*)&v[3].x,sv+3,&matWorld); v[0].color=v[1].color=v[2].color=v[3].color=color; memcpy(pVertices,v,sizeof(ZEFFECTCUSTOMVERTEX)*4); pVertices+=sizeof(ZEFFECTCUSTOMVERTEX)*4; WORD inds[] = { 0,1,2,0,2,3 }; for(int k=0;k<6;k++) { inds[k]+=(m_dwBase+j)*4; } memcpy(pInd,inds,sizeof(inds)); pInd+=sizeof(inds); itr++; } m_pVB->Unlock(); m_pIB->Unlock(); if(FAILED( hr = RGetDevice()->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,m_dwBase*4,dwThisNum*4,m_dwBase*6,dwThisNum*2) )) return false; m_dwBase+=dwThisNum; dwRemainNum-=dwThisNum; } RGetDevice()->SetStreamSource( 0, NULL , 0,0 ); RGetDevice()->SetIndices(NULL); EndState(); return true; }
void ZInterfaceBackground::Draw(void) { #ifdef _FASTDEBUG MWidget* pWidget = (MWidget*)ZApplication::GetGameInterface()->GetIDLResource()->FindWidget( "CharSelection"); if ( pWidget) { if ( ZApplication::GetGameInterface()->GetState() == GUNZ_CHARSELECTION) pWidget->Show( true); } MPicture* pPicture = (MPicture*)ZApplication::GetGameInterface()->GetIDLResource()->FindWidget( "CharSel_TopScreen"); if ( pPicture) pPicture->SetOpacity( 0); return; #endif // Set rendering state RSetViewport( 0, 0, RGetScreenWidth(), RGetScreenHeight()); RGetDevice()->SetRenderState( D3DRS_CULLMODE ,D3DCULL_CW); // from rbs rendering RGetDevice()->SetRenderState( D3DRS_NORMALIZENORMALS , TRUE ); RGetDevice()->SetSamplerState( 0, D3DSAMP_MINFILTER , D3DTEXF_LINEAR); // Texture filtering RGetDevice()->SetSamplerState( 0, D3DSAMP_MAGFILTER , D3DTEXF_LINEAR); RGetDevice()->SetSamplerState( 0, D3DSAMP_MIPFILTER , D3DTEXF_LINEAR); // Set camera position and direction rvector vCamPos, vCamDir; float fForgDensity; switch ( m_nSceneNumber) { case LOGIN_SCENE_FIXEDSKY : { // Fixed camera vCamPos = m_vCamPosSt; vCamDir = m_vCamDirSt; // Fixed fog -> black screen fForgDensity = 0.0f; break; } case LOGIN_SCENE_FALLDOWN : { // Get current clock DWORD dwClock = ( timeGetTime() - m_dwClock); /* // Show maiet logo if ( !m_bShowMaietLogo) { m_bShowMaietLogo = true; ZGetScreenEffectManager()->AddScreenEffect( "maiet_logo"); } */ // Set fog density fForgDensity = dwClock * 15.0f; // Set wait time if ( dwClock < 500) dwClock = 0; else dwClock -= 500; // Play BGM music //PenguinGuy // if ( dwClock > 2000) // ZApplication::GetSoundEngine()->PlayMusic( true); // End of scroll camera float fSeed = dwClock * 0.00035f; // 카메라가 전부 다 내려오기 까지 걸리는 시간( dwClock에 곱해주는 값이 // 작을수록 빨리 내려옴) if ( fSeed > 3.14) { m_nSceneNumber = LOGIN_SCENE_FIXEDCHAR; // m_bShowMaietLogo = false; } // Move camera position & direction float fGain = ( cos( fSeed) + 1.0f) / 2.0f; // 0 < fGain < 1.0 vCamPos = m_vCamPosEd + ( m_vCamPosSt - m_vCamPosEd) * fGain; vCamDir = m_vCamDirEd + ( m_vCamDirSt - m_vCamDirEd) * fGain; //if (m_bShowMaietLogo) //{ // ZGetScreenEffectManager()->UpdateEffects(); ZGetScreenEffectManager()->DrawEffects(); //} break; } case LOGIN_SCENE_FIXEDCHAR : { // Show menu UI MWidget* pWidget = (MWidget*)ZApplication::GetGameInterface()->GetIDLResource()->FindWidget( "CharSelection"); if ( pWidget) { if ( ZApplication::GetGameInterface()->GetState() == GUNZ_CHARSELECTION) pWidget->Show( true); } MPicture* pPicture = (MPicture*)ZApplication::GetGameInterface()->GetIDLResource()->FindWidget( "CharSel_TopScreen"); if ( pPicture) pPicture->SetOpacity( 0); // Play BGM music //PenguinGuy // ZApplication::GetSoundEngine()->PlayMusic( true); // Fixed camera vCamPos = m_vCamPosEd; vCamDir = m_vCamDirEd; #define FADE_IN_TIME 500 DWORD dwClock = ( timeGetTime() - m_dwClock); float fGain = ((float)dwClock / (float)FADE_IN_TIME); if (fGain > 1.0f) fGain = 1.0f; SetFogMulti(fGain); // Cleared fog fForgDensity = 50000.0f; break; } case LOGIN_SCENE_SELECTCHAR : { // Get current clock DWORD dwClock = ( timeGetTime() - m_dwClock); float fGain = ( cos( dwClock * 0.0012f) + 1.0f) / 2.0f; //vCamPos = m_vCamPosEd + ( m_vCamPosSt - m_vCamPosEd) * fGain; //vCamDir = m_vCamDirEd + ( m_vCamDirSt - m_vCamDirEd) * fGain; vCamPos = m_vCamPosSt; vCamDir = m_vCamDirSt; MPicture* pPicture = (MPicture*)ZApplication::GetGameInterface()->GetIDLResource()->FindWidget( "CharSel_TopScreen"); if ( pPicture) { // Set wait time if ( dwClock < 2000) dwClock = 0; else dwClock -= 2000; // Set opacity of black screen int nOpacity = (int)( dwClock / 3.0f); if ( nOpacity > 255) nOpacity = 255; pPicture->SetOpacity( nOpacity); } // Cleared fog fForgDensity = 50000.0f; break; } case LOGIN_ROAMING : { #define ROAM_SPEED 10000 DWORD dwClock = ( timeGetTime() - m_dwClock); /*if (GetAsyncKeyState(VK_NUMPAD2) & 0x8000) off.y -= 1.0f; if (GetAsyncKeyState(VK_NUMPAD8) & 0x8000) off.y += 1.0f; if (GetAsyncKeyState(VK_NUMPAD4) & 0x8000) off.x += 1.0f; if (GetAsyncKeyState(VK_NUMPAD6) & 0x8000) off.x -= 1.0f; if (GetAsyncKeyState(VK_NUMPAD7) & 0x8000) off.z -= 1.0f; if (GetAsyncKeyState(VK_NUMPAD9) & 0x8000) off.z += 1.0f; vCamPos = m_vCamPosEd + off; vCamDir = m_vCamDirEd; // Cleared fog fForgDensity = 50000.0f;*/ float fGain = ((float)dwClock / (float)ROAM_SPEED); if (fGain > 1.0f) fGain = 1.0f; //vCamDir = mapVecs[mapIndex].second - mapVecs[mapIndex].first; vCamDir = m_vCamDirEd; vCamPos = mapVecs[mapIndex].first + ((mapVecs[mapIndex].second - mapVecs[mapIndex].first) * fGain) + D3DXVECTOR3(0.f,-100.f,0.f); if (dwClock > ROAM_SPEED) { m_dwClock = timeGetTime(); mapIndex = rand() % mapVecs.size(); } //fForgDensity = 50000.0f; //Clear fForgDensity = ((-4 * fGain * fGain) + (4 * fGain)) * 20000.f; break; } } //Fog adjust fForgDensity *= m_fFogMulti; // Set camera RSetCamera( vCamPos, (vCamPos + vCamDir), rvector( 0, 0, 1)); // Draw RSetProjection( D3DX_PI * 70 / 180, RGetScreenWidth() / (float)RGetScreenHeight(), 10.0f, 15000.0f); SetFogState( fForgDensity-10000.0f, fForgDensity, 0x00000000); D3DXMatrixTranslation( &m_matWorld, 0, 0, 0); RGetDevice()->SetTransform( D3DTS_WORLD, &m_matWorld); // Draw background if ( m_pLogin) { m_pLogin->Draw(); m_pLogin->DrawObjects(); } if ( m_pMapDesc) m_pMapDesc->DrawMapDesc(); // Draw effects(smoke, cloud) // ZGetEffectManager()->Draw( timeGetTime()); // Draw maiet logo effect // ZGetScreenEffectManager()->DrawEffects(); }
bool ZEffectShadowList::Draw() { if(!m_pVB) return false; if( empty() ) return true; BeginState(); HRESULT hr; DWORD dwRemainNum = (DWORD)size(); iterator itr=begin(); while(dwRemainNum) { if(m_dwBase >= EFFECTBASE_DISCARD_COUNT) m_dwBase = 0; DWORD dwThisNum = min( dwRemainNum , BILLBOARD_FLUSH_COUNT ); dwThisNum = min( dwThisNum , EFFECTBASE_DISCARD_COUNT - m_dwBase ); BYTE* pVertices; if( FAILED( hr = m_pVB->Lock( m_dwBase * sizeof(ZEFFECTCUSTOMVERTEX) * 4, dwThisNum * sizeof(ZEFFECTCUSTOMVERTEX) * 4, (VOID**)&pVertices, m_dwBase ? D3DLOCK_NOOVERWRITE : D3DLOCK_DISCARD ) ) ) { return false; } BYTE *pInd; if( FAILED( hr = m_pIB->Lock( m_dwBase * sizeof(WORD) * 6, dwThisNum * sizeof(WORD) * 6, (VOID**)&pInd, m_dwBase ? D3DLOCK_NOOVERWRITE : D3DLOCK_DISCARD ) ) ) { return false; } for(DWORD j=0;j<dwThisNum;j++) { ZEFFECTSHADOWITEM *p = (ZEFFECTSHADOWITEM*)*itr; static ZEFFECTCUSTOMVERTEX v[] = { {-0.5f, -0.5f, 0.f, 0xFFFFFFFF, 0.f, 0.f}, { 0.5f, -0.5f, 0.f, 0xFFFFFFFF, 1.f, 0.f}, {-0.5f, 0.5f, 0.f, 0xFFFFFFFF, 0.f, 1.f}, { 0.5f, 0.5f, 0.f, 0xFFFFFFFF, 1.f, 1.f}, }; static rvector sv[4] = { rvector(-0.5f,-0.5f , 0.f) , rvector( 0.5f,-0.5f , 0.f) , rvector(-0.5f, 0.5f , 0.f) , rvector( 0.5f, 0.5f , 0.f) , }; // 좋은코드는 아니지만 버텍스 카피를 줄이기위해 타입캐스팅했다. D3DXVec3TransformCoord((D3DXVECTOR3*)&v[0].x,sv ,&p->worldmat); D3DXVec3TransformCoord((D3DXVECTOR3*)&v[1].x,sv+1,&p->worldmat); D3DXVec3TransformCoord((D3DXVECTOR3*)&v[2].x,sv+2,&p->worldmat); D3DXVec3TransformCoord((D3DXVECTOR3*)&v[3].x,sv+3,&p->worldmat); v[0].color=v[1].color=v[2].color=v[3].color=p->dwColor; memcpy(pVertices,v,sizeof(ZEFFECTCUSTOMVERTEX)*4); pVertices+=sizeof(ZEFFECTCUSTOMVERTEX)*4; WORD inds[] = { 0,1,2,2,1,3 }; for(int k=0;k<6;k++) { inds[k]+=(m_dwBase+j)*4; } memcpy(pInd,inds,sizeof(inds)); pInd+=sizeof(inds); itr++; } m_pVB->Unlock(); m_pIB->Unlock(); if(FAILED( hr = RGetDevice()->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,m_dwBase*4,dwThisNum*4,m_dwBase*6,dwThisNum*2) )) // if(FAILED( hr = RGetDevice()->DrawIndexedPrimitive(D3DPT_TRIANGLESTRIP,0,m_dwBase*4,dwThisNum*4,m_dwBase*6,dwThisNum*2) )) return false; m_dwBase+=dwThisNum; dwRemainNum-=dwThisNum; } RGetDevice()->SetStreamSource( 0, NULL , 0,0 ); RGetDevice()->SetIndices(NULL); EndState(); Clear(); return true; }
bool ZEffectBillboardTexAniList::Draw() { if(!m_pVB) return false; if( size()==0 ) return true; BeginState(); RSetFog(FALSE); HRESULT hr; DWORD dwRemainNum = (DWORD)size(); iterator itr = begin(); while(dwRemainNum) { if(m_dwBase >= EFFECTBASE_DISCARD_COUNT) m_dwBase = 0; DWORD dwThisNum = min( dwRemainNum , BILLBOARD_FLUSH_COUNT ); dwThisNum = min( dwThisNum , EFFECTBASE_DISCARD_COUNT - m_dwBase ); BYTE *pVertices; if( FAILED( hr = m_pVB->Lock( m_dwBase * sizeof(ZEFFECTCUSTOMVERTEX) * 4, dwThisNum * sizeof(ZEFFECTCUSTOMVERTEX) * 4, (VOID**)&pVertices, m_dwBase ? D3DLOCK_NOOVERWRITE : D3DLOCK_DISCARD ) ) ) { return false; } BYTE *pInd; if( FAILED( hr = m_pIB->Lock( m_dwBase * sizeof(WORD) * 6, dwThisNum * sizeof(WORD) * 6, (VOID**)&pInd, m_dwBase ? D3DLOCK_NOOVERWRITE : D3DLOCK_DISCARD ) ) ) { return false; } int nRenderCnt = 0; ZCharacter* pChar = NULL; for(DWORD j=0;j<dwThisNum;j++) { ZEFFECTBILLBOARDTEXANIITEM *p = (ZEFFECTBILLBOARDTEXANIITEM*)*itr; if(p->fElapsedTime < p->fAddTime ) { itr++; continue; } pChar = ZGetCharacterManager()->Find(p->CharUID); if( pChar ) { if( pChar->m_pVMesh ) { if( pChar->m_pVMesh->m_bIsRender==false) {//부모가 안그려졌으면 skip... itr++; continue; } } } nRenderCnt++; // Transform rmatrix matTranslation; rmatrix matScaling; rmatrix matWorld; rvector dir = p->normal; rvector up=p->up; rvector right; if(IS_EQ(dir.z,1.f)) up=rvector(1,0,0); D3DXVec3Cross(&right, &up, &dir); D3DXVec3Normalize(&right, &right); D3DXVec3Cross(&up, &right, &dir); D3DXVec3Normalize(&up, &up); rmatrix mat; D3DXMatrixIdentity(&mat); mat._11=right.x;mat._12=right.y;mat._13=right.z; mat._21=up.x;mat._22=up.y;mat._23=up.z; mat._31=dir.x;mat._32=dir.y;mat._33=dir.z; rvector pos=p->position; // float fScale=p->fStartSize * p->fOpacity + p->fEndSize * (1.f - p->fOpacity); float fInt = min(1,max(0,(p->fLifeTime - p->fElapsedTime)/p->fLifeTime)); float fScale=p->fStartSize * fInt + p->fEndSize * (1.f - fInt); D3DXMatrixScaling(&matScaling,fScale*m_Scale.x,fScale*m_Scale.y,fScale*m_Scale.z); D3DXMatrixTranslation(&matTranslation, pos.x, pos.y, pos.z); D3DXMatrixMultiply(&matWorld, &matScaling, &mat); D3DXMatrixMultiply(&matWorld, &matWorld, &matTranslation); DWORD color = ((DWORD)(p->fOpacity * 255))<<24 | p->dwColor; static ZEFFECTCUSTOMVERTEX v[] = { {-1, -1, 0, 0xFFFFFFFF, 1, 0}, {-1, 1, 0, 0xFFFFFFFF, 1, 1}, { 1, 1, 0, 0xFFFFFFFF, 0, 1}, { 1, -1, 0, 0xFFFFFFFF, 0, 0}, }; static rvector sv[4] = { rvector(-1,-1,0) , rvector(-1,1,0) , rvector(1,1,0) , rvector(1,-1,0) }; GetFrameUV( min( p->frame,m_nMaxFrame-1) ); v[0].tu = m_fUV[0]; v[0].tv = m_fUV[1]; v[1].tu = m_fUV[2]; v[1].tv = m_fUV[3]; v[2].tu = m_fUV[4]; v[2].tv = m_fUV[5]; v[3].tu = m_fUV[6]; v[3].tv = m_fUV[7]; // 좋은코드는 아니지만 버텍스 카피를 줄이기위해 타입캐스팅했다. D3DXVec3TransformCoord((D3DXVECTOR3*)&v[0].x,sv+0,&matWorld); D3DXVec3TransformCoord((D3DXVECTOR3*)&v[1].x,sv+1,&matWorld); D3DXVec3TransformCoord((D3DXVECTOR3*)&v[2].x,sv+2,&matWorld); D3DXVec3TransformCoord((D3DXVECTOR3*)&v[3].x,sv+3,&matWorld); v[0].color=v[1].color=v[2].color=v[3].color=color; memcpy(pVertices,v,sizeof(ZEFFECTCUSTOMVERTEX)*4); pVertices+=sizeof(ZEFFECTCUSTOMVERTEX)*4; WORD inds[] = { 0,1,2,0,2,3 }; for(int k=0;k<6;k++) { inds[k]+=(m_dwBase+j)*4; } memcpy(pInd,inds,sizeof(inds)); pInd+=sizeof(inds); itr++; } m_pVB->Unlock(); m_pIB->Unlock(); if(FAILED( hr = RGetDevice()->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,m_dwBase*4,nRenderCnt*4,m_dwBase*6,nRenderCnt*2) )) return false; m_dwBase+=dwThisNum; dwRemainNum-=dwThisNum; } RGetDevice()->SetStreamSource( 0, NULL , 0,0 ); RGetDevice()->SetIndices(NULL); if(ZGetWorld()) { ZGetWorld()->SetFog(true);// 게임 설정에 따라서 } EndState(); return true; }
void ZEffectShadowList::EndState() { RGetDevice()->SetRenderState(D3DRS_ZWRITEENABLE, TRUE); }