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));
	}

*/
}
Beispiel #3
0
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();
}
Beispiel #5
0
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");
	}
}
Beispiel #10
0
//////////////////////////////////////////////////////////////////////////
//	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;
		}
	}
}
Beispiel #11
0
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 );
}
Beispiel #12
0
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) );
}
Beispiel #13
0
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;
}
Beispiel #14
0
	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;
	}
Beispiel #15
0
	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));
		}
	}
Beispiel #16
0
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;
		}
	}
}
Beispiel #17
0
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;
}
Beispiel #19
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 );
	}
}
Beispiel #23
0
//////////////////////////////////////////////////////////////////////////
//	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) );
	//}
}
Beispiel #24
0
//////////////////////////////////////////////////////////////////////////
//	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();

}
Beispiel #25
0
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);
}