bool DisplayManager::initialize()
{
  QLOG_INFO() << QString("DisplayManager found %1 Display(s).").arg(displays.size());

  // list video modes
  foreach(int displayid, displays.keys())
  {
    DMDisplayPtr display = displays[displayid];
    QLOG_INFO() << QString("Available modes for Display #%1 (%2)").arg(displayid).arg(display->name);
    for (int modeid = 0; modeid < display->videoModes.size(); modeid++)
    {
      DMVideoModePtr mode = display->videoModes[modeid];
      QLOG_INFO() << QString("Mode %1: %2").arg(modeid, 2).arg(mode->getPrettyName());
    }
  }

  // Log current display mode
  int mainDisplay = getMainDisplay();
  if (mainDisplay >= 0)
  {
    int currentMode = getCurrentDisplayMode(mainDisplay);
    if (currentMode >= 0)
      QLOG_INFO() << QString("DisplayManager : Current Display Mode on Display #%1 is %2")
                     .arg(mainDisplay)
                     .arg(displays[mainDisplay]->videoModes[currentMode]->getPrettyName());
    else
      QLOG_ERROR() << "DisplayManager : unable to retrieve current video mode";
  }
  else
    QLOG_ERROR() << "DisplayManager : unable to retrieve main display";

  return true;
}
DMVideoModePtr DisplayManager::getCurrentVideoMode(int display)
{
  int currentMode = getCurrentDisplayMode(display);
  DMVideoModePtr currentVideoMode;

  if (currentMode >= 0)
    currentVideoMode = displays[display]->videoModes[currentMode];

  return currentVideoMode;
}
int DisplayManagerWin::getDisplayFromPoint(int x, int y)
{
  for (int displayId = 0; displayId < displays.size(); displayId++)
  {
    int currentMode = getCurrentDisplayMode(displayId);
    if (currentMode > 0)
    {
      DEVMODEW modeInfo;
      if (getModeInfo(displayId, currentMode, modeInfo))
      {
        QRect displayRect(modeInfo.dmPosition.x, modeInfo.dmPosition.y, modeInfo.dmPelsWidth,
                          modeInfo.dmPelsHeight);

        if (displayRect.contains(x, y))
          return displayId;
      }
    }
  }

  return -1;
}
int DisplayManagerWin::getDisplayFromPoint(int x, int y)
{
  foreach (int displayId, displays.keys())
  {
    int currentMode = getCurrentDisplayMode(displayId);
    if (currentMode >= 0)
    {
      DEVMODEW modeInfo;
      if (getModeInfo(displayId, currentMode, modeInfo))
      {
        QRect displayRect(modeInfo.dmPosition.x, modeInfo.dmPosition.y, modeInfo.dmPelsWidth,
                          modeInfo.dmPelsHeight);
        QLOG_DEBUG() << "Looking at display" << displayId << "mode" << currentMode
                     << "at" << displayRect;

        if (displayRect.contains(x, y))
          return displayId;
      }
    }
  }

  return -1;
}
Beispiel #5
0
	type_result DX9::__initializeDevice()
	{	
		//	pre:
		//		사전 준비:
		//			외부로부터 set 될 수 있는 데이터의 형태가 다양하게 존재하기 때문에, 
		//			어떤 형태로 데이터를 준비해야 하는지도 판단해야 한다.
		//			판단해야 하는 데이터의 종류는 2종류다.
		//				1. 윈도우 핸들
		//					a. 스크립트편집을 통해 키셋에 지정한 모듈셀렉터로 가져온다.(기본값)
		//					b. 강제로 프로그램상에서 핸들을 지정한다.(이 경우, b의 과정은 건너 뜀)
		//				2. PresentParameters
		//					a. INI로부터 키셋의 데이터를 가져온다. 이후로는 b와 동일
		//					b. 스크립트 편집을 통해 키셋에 지정한 값들로 PresentParameters를 생성한다
		//					(기본값. PresentParameters의 값이 많이 있기 때문에 가장 많이 쓸법한 몇개만을
		//					편집 가능하다)
		//					c. 강제로 프로그램상에서 PresentParameters 지정한다.( a의 과정은 건너 뜀)
		//			핸들:		
		if(global_window)
			_window_handle = global_window;

		if( ! _window_handle)
			if( NEResult::hasError(_bindWindowHandle()))
				return ALERT_ERROR(" : 윈도우 핸들을 바인딩하는 과정에서 실패함. 작업을 취소합니다.");

		//			PresentParameters:
		//				데이터가 외부에서 입력되지 않았다면:
		//					왜 Valid를 검사하는 것이 데이터가 외부에서 입력되지 않았다는
		//					것을 의미하게 되는가:
		//						외부에서 데이터를 입력하지 않으면 PresentParameters는 release를
		//						수행한 상태일 것이고, BackBufferWidth, Height는 각각 0이 된다.
		//						그런데, Width와 Height가 0이라는 부분은 명백하게 유효하지 않은
		//						부분 이므로 isValid로 검사할 때 에러가 나오게 된다.
		if(NEResult::hasError(getPresentParameters().isValid()))
		{
			//				키셋으로부터 PresentParameters를 생성:
			//					타겟팅:
			PresentParameters& parameters = _present_parameter;
			//					초기화:
			parameters.release();			
			//					데이터 할당:
			//						Display에 관한 부분 차후 검증과정을 수행해야 한다. 하드웨어의 특성을 타기 때문에
			//						지원가능한 Display 목록을 획득한 다음에 가장 일치하는 디스플레이 목록으로
			//						변경해야만 한다.
			//						일단 선호하는 디스플레이 정보를 할당:
			DisplayMode just_preferred;
			just_preferred.setWindowed(arg_is_windowed.getValue());
			just_preferred.Width = arg_screen_width.getValue();
			just_preferred.Height = arg_screen_height.getValue();
			just_preferred.RefreshRate = arg_screen_reflesh_rate.getValue();
			//						parameters에 할당:
			parameters.setPreferredDisplayMode(just_preferred);
			//						기타 데이터:
			parameters.hDeviceWindow = _window_handle;
			parameters.SwapEffect = D3DSWAPEFFECT(arg_swap_effect.getValue());
			parameters.BackBufferCount = arg_back_buffer_count.getValue();
			if(arg_is_windowed.getValue())
				parameters.BackBufferFormat = getCurrentDisplayMode().Format;
			parameters.BackBufferHeight = arg_screen_height.getValue();
			parameters.BackBufferWidth = arg_screen_width.getValue();
			parameters.AutoDepthStencilFormat = D3DFMT_D24S8;	//	이거 임의로 주면 안되지 않나?
			parameters.EnableAutoDepthStencil = true;
			if( ! arg_is_vertical_synchronized.getValue())
				parameters.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
		}


		//	main:			
		//		PresentParameters 할당:
		//			PreferredDisplay를 조정:
		DisplayMode& displaymode_to_adjust = getPresentParameters().getPreferredDisplayMode();		
		_display_mode_manager.makeDisplayModeAvailable(displaymode_to_adjust, getDirect3D());
		_present_parameter.setPreferredDisplayMode(displaymode_to_adjust);
		//		Capabilities 획득:		
		__initializeCapabilities();	//	DirectX가 초기화 되었으므로 initialize가 호출 가능하다.
		//		윈도우 크기 변경:
		_updateTargetWindowSizeWithSpecifiedScreenSize();
		//		Direct 3D 디바이스 생성:
		HRESULT result = S_OK;

		if (FAILED(result = _direct3d->CreateDevice(
			D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, _window_handle, 
			_capabilities.isHardWareVertexProcessingAvailable() ? D3DCREATE_HARDWARE_VERTEXPROCESSING : D3DCREATE_SOFTWARE_VERTEXPROCESSING, 
			&_present_parameter, &_device)) ) // 스태틱변수(HWND)를 사용하고있다
			return ALERT_ERROR(" : 디바이스 생성 실패.\n\t에러코드: %d", result);

		return RESULT_SUCCESS;
	}