Ejemplo n.º 1
0
// Viewport 생성
BOOL CreateViewport()
{

    D3DVIEWPORT2 viewport;

    // Viewport 생성
    HRESULT hresult = lpD3D->CreateViewport( &lpD3DViewport, NULL );
    if ( hresult != D3D_OK )
        return FALSE;

    // Direct3D Device 에 Viewport 추가
    hresult = lpD3DDevice->AddViewport( lpD3DViewport );
    if ( hresult != D3D_OK )
        return FALSE;


    ZeroMemory( &viewport, sizeof(D3DVIEWPORT2) );

    viewport.dwSize         = sizeof( viewport );
    viewport.dwX            = D3DRect.x1;
    viewport.dwY            = D3DRect.y1;
	
    viewport.dwWidth        = D3DRect.x2;
    viewport.dwHeight       = D3DRect.y2;	
    viewport.dvClipWidth    = 2.0f;
    viewport.dvClipHeight   = (D3DVALUE)(D3DRect.y2 * 2.0 / D3DRect.x2);
    viewport.dvClipX        = -1.0f;
    viewport.dvClipY        = viewport.dvClipHeight / 2.0f;
    viewport.dvMinZ         = 0.0f;
    viewport.dvMaxZ         = 1.0f;

    //viewport.dvMinZ         = 0.0f;
    //viewport.dvMaxZ         = 1.0f;

    // lpD3DViewport2 설정
    hresult = lpD3DViewport->SetViewport2( &viewport );
    if ( hresult != D3D_OK )
        return FALSE;

    // 현제 Viewport를 lpD3DViewport2로 설정
    hresult = lpD3DDevice->SetCurrentViewport( lpD3DViewport );
    if ( hresult != D3D_OK )
        return FALSE;

	//######################################################################################
	//작 성 자 : 오 영 석
	if( g_IsCreateFilterEffect )
        CreateNewRenderTarget();
	//######################################################################################

    return TRUE;
}
HRESULT __stdcall DDRAWSURFACE4_HOOK_Flip(LPVOID *ppvOut, LPDIRECTDRAWSURFACE4 lpDDSurfaceTargetOverride, DWORD dwFlags) {
	const unsigned int hpos = 11;

	HRESULT ret;
	if(!g_config.fullscreen && ((LPDIRECTDRAWSURFACE4)ppvOut) == g_frontbuffer) {
		RECT rect;
		POINT p1, p2;
		GetClientRect(g_hwnd, &rect);

		p1.x = rect.left;
		p1.y = rect.top;
		p2.x = rect.right;
		p2.y = rect.bottom;

		ClientToScreen(g_hwnd, &p1);
		ClientToScreen(g_hwnd, &p2);

		rect.left = p1.x;
		rect.top = p1.y;
		rect.right = p2.x;
		rect.bottom = p2.y;

		ret = ((LPDIRECTDRAWSURFACE4)ppvOut)->Blt(&rect, g_backbuffer, NULL, DDBLT_WAIT, NULL);

		Log("BLIT FLIP\n");
	} else {
		DDRAWSURFACE4_Flip_Type ofn = (DDRAWSURFACE4_Flip_Type)ddrawsurface4_hooks[hpos].oldFunc;
		HRESULT ret = ofn(ppvOut, lpDDSurfaceTargetOverride, dwFlags);
		LogDXError(ret);

		Log("IDirectDrawSurface4::%s(this=%#010lx, lpDDSurfaceTargetOverride=%#010lx, dwFlags=%#010lx)\n", ddrawsurface4_hooks[hpos].name, ppvOut, lpDDSurfaceTargetOverride, dwFlags);
		if(g_d3ddevice != NULL && g_binkActive == FALSE) {
			LPDIRECT3DVIEWPORT3 lpVP = NULL;
			D3DVIEWPORT2 d3dvp_old, d3dvp_new;
			D3DRECT rect[4];
			memset(&rect, 0, sizeof(rect));
			memset(&d3dvp_old, 0, sizeof(d3dvp_old));
			d3dvp_old.dwSize = sizeof(d3dvp_old);

			((LPDIRECT3DDEVICE3)g_d3ddevice)->GetCurrentViewport(&lpVP);
			lpVP->GetViewport2(&d3dvp_old);

			memcpy(&d3dvp_new, &d3dvp_old, sizeof(d3dvp_new));
			d3dvp_new.dwSize = 0; //special case for internal call
			d3dvp_old.dwSize = 0;
			d3dvp_new.dwX = d3dvp_new.dwY = 0;
			d3dvp_new.dwWidth = displaymode_options[g_config.displaymode].resX;
			d3dvp_new.dwHeight = displaymode_options[g_config.displaymode].resY;

			lpVP->SetViewport2(&d3dvp_new);

			SetD3DRect(rect[0], 0, displaymode_options[g_config.displaymode].resX, 0, g_currentviewport.y);
			SetD3DRect(rect[1], 0, displaymode_options[g_config.displaymode].resX, g_currentviewport.y+g_game.height, displaymode_options[g_config.displaymode].resY);
			SetD3DRect(rect[2], 0, g_currentviewport.x, 0, displaymode_options[g_config.displaymode].resY);
			SetD3DRect(rect[3], g_currentviewport.x+g_game.width, displaymode_options[g_config.displaymode].resX, 0, displaymode_options[g_config.displaymode].resY);

			lpVP->Clear2(4, (LPD3DRECT)&rect, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x00000000, 0, 0);
			lpVP->SetViewport2(&d3dvp_old);
		}
	}

	return ret;
}