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