// creates OpenGL drawing context BOOL CGfxLibrary::CreateContext_OGL(HDC hdc) { SDL_Window *window = (SDL_Window *) hdc; if( !SetupPixelFormat_OGL( hdc, TRUE)) return FALSE; go_hglRC = SDL_GL_CreateContext(window); if( go_hglRC==NULL) { sdlCheckError(0, "OpenGL context creation"); return FALSE; } if (SDL_GL_MakeCurrent(window, go_hglRC) == -1) { // NOTE: This error is sometimes reported without a reason on 3dfx hardware // so we just have to ignore it. sdlCheckError(0, "MakeCurrent after CreateContext"); return FALSE; } int val = 0; if (SDL_GL_GetAttribute(SDL_GL_DEPTH_SIZE, &val) != -1) { // keep depth bits gl_iCurrentDepth = val; } else { gl_iCurrentDepth = 16; // oh well. } // prepare functions OGL_SetFunctionPointers_t(gl_hiDriver); return TRUE; }
void SDLFrontend::renderLine (int x1, int y1, int x2, int y2, const Color& color) { assert(_renderer); setSDLColor(color); if (SDL_RenderDrawLine(_renderer, x1, y1, x2, y2) == -1) sdlCheckError(); }
void SDLFrontend::renderBegin () { assert(_renderer); resetColor(); SDL_ClearError(); setSDLColor(colorBlack); if (SDL_RenderClear(_renderer) == -1) sdlCheckError(); }
void SDLFrontend::setSDLColor (const Color& rgba) { assert(_renderer); const Uint8 r = rgba[0] * 255.0f; const Uint8 g = rgba[1] * 255.0f; const Uint8 b = rgba[2] * 255.0f; const Uint8 a = rgba[3] * 255.0f; if (SDL_SetRenderDrawColor(_renderer, r, g, b, a) == -1) sdlCheckError(); }
bool SDLFrontend::rumble (float strength, int lengthMillis) { if (!_haptic) { return false; } if (SDL_HapticRumblePlay(_haptic, strength, lengthMillis) != 0) { sdlCheckError(); return false; } return true; }
BOOL CGfxLibrary::InitDriver_OGL(BOOL init3dfx) { ASSERT( gl_hiDriver==NONE); // this is managed inside SDL, so we never load a library ourselves. if (SDL_GL_LoadLibrary(NULL) == -1) { sdlCheckError(0, "Failed to load OpenGL API"); return FALSE; } // done return TRUE; }
void SDLFrontend::renderFilledRect (int x, int y, int w, int h, const Color& fillColor) { assert(_renderer); if (w <= 0) w = getWidth(); if (h <= 0) h = getHeight(); const SDL_Rect r = { x, y, w, h }; setSDLColor(fillColor); if (SDL_RenderFillRect(_renderer, &r) == -1) sdlCheckError(); }
bool SDLFrontend::loadTexture (Texture *texture, const std::string& filename) { assert(_renderer); const std::string file = FS.getFile(FS.getPicsDir() + filename + ".png")->getName(); SDL_RWops *src = FS.createRWops(file); if (src == nullptr) { error(LOG_CLIENT, "could not load the file: " + file); return false; } SDL_Surface *surface = IMG_Load_RW(src, 1); if (surface) { SDL_Texture *sdltexture = SDL_CreateTextureFromSurface(_renderer, surface); texture->setData(sdltexture); texture->setRect(0, 0, surface->w, surface->h); SDL_FreeSurface(surface); return texture->isValid(); } sdlCheckError(); return false; }
void SDLFrontend::setGLAttributes () { SDL_ClearError(); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); sdlCheckError(); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 0); sdlCheckError(); SDL_GL_SetAttribute(SDL_GL_RETAINED_BACKING, 1); sdlCheckError(); #ifdef __ANDROID__ SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 6); sdlCheckError(); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5); sdlCheckError(); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 6); sdlCheckError(); #else SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); sdlCheckError(); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8); sdlCheckError(); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8); sdlCheckError(); #endif #ifdef __IPHONEOS__ SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); sdlCheckError(); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2); sdlCheckError(); #endif }
int SDLFrontend::init (int width, int height, bool fullscreen, EventHandler &eventHandler) { if (width == -1 && height == -1) fullscreen = true; info(LOG_CLIENT, String::format("initializing: %i:%i - fullscreen: %s", width, height, fullscreen ? "true" : "false")); INIT_Subsystem(SDL_INIT_VIDEO, true); INIT_Subsystem(SDL_INIT_JOYSTICK, false); INIT_Subsystem(SDL_INIT_GAMECONTROLLER, false); INIT_Subsystem(SDL_INIT_HAPTIC, false); initJoystickAndHaptic(); SDL_DisplayMode displayMode; SDL_GetDesktopDisplayMode(0, &displayMode); const char *name = SDL_GetPixelFormatName(displayMode.format); info(LOG_CLIENT, String::format("current desktop mode: %dx%d@%dHz (%s)", displayMode.w, displayMode.h, displayMode.refresh_rate, name)); if (width == -1) width = 800;//displayMode.w; if (height == -1) height = 480; //displayMode.h; setGLAttributes(); setHints(); int doubleBuffered = 0; SDL_GL_GetAttribute(SDL_GL_DOUBLEBUFFER, &doubleBuffered); info(LOG_CLIENT, String::format("doublebuffer: %s", doubleBuffered ? "activated" : "disabled")); int flags = SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN; #ifdef __IPHONEOS__ flags |= SDL_WINDOW_RESIZABLE; #endif #if 1 //defined __IPHONEOS__ || defined __ANDROID__ if (fullscreen) flags |= SDL_WINDOW_FULLSCREEN | SDL_WINDOW_BORDERLESS; #else if (fullscreen) flags |= SDL_WINDOW_FULLSCREEN_DESKTOP | SDL_WINDOW_BORDERLESS; #endif const int videoDrivers = SDL_GetNumVideoDrivers(); for (int i = 0; i < videoDrivers; ++i) { info(LOG_CLIENT, String::format("available driver: %s", SDL_GetVideoDriver(i))); } info(LOG_CLIENT, String::format("driver: %s", SDL_GetCurrentVideoDriver())); const int displays = SDL_GetNumVideoDisplays(); info(LOG_CLIENT, String::format("found %i display(s)", displays)); if (fullscreen && displays > 1) { width = displayMode.w; height = displayMode.h; info(LOG_CLIENT, String::format("use fake fullscreen for the first display: %i:%i", width, height)); } _window = SDL_CreateWindow(Singleton<Application>::getInstance().getName().c_str(), SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, flags); if (!_window) { sdlCheckError(); return -1; } SDL_DisableScreenSaver(); initRenderer(); resetColor(); GLContext::get().init(); if (SDL_SetWindowBrightness(_window, 1.0f) == -1) sdlCheckError(); if (Config.isGrabMouse() && (!fullscreen || displays > 1)) { SDL_SetWindowGrab(_window, SDL_TRUE); } int screen = 0; int modes = SDL_GetNumDisplayModes(screen); info(LOG_CLIENT, "possible display modes:"); for (int i = 0; i < modes; i++) { SDL_GetDisplayMode(screen, i, &displayMode); name = SDL_GetPixelFormatName(displayMode.format); info(LOG_CLIENT, String::format("%dx%d@%dHz %s", displayMode.w, displayMode.h, displayMode.refresh_rate, name)); } // some platforms may override or hardcode the resolution - so // we have to query it here to get the actual resolution SDL_GetWindowSize(_window, &width, &height); if (SDL_SetRelativeMouseMode(SDL_TRUE) == -1) error(LOG_CLIENT, "no relative mouse mode support"); SDL_ShowCursor(0); info(LOG_CLIENT, String::format("actual resolution: %dx%d", width, height)); setVSync(ConfigManager::get().isVSync()); const int initState = IMG_Init(IMG_INIT_PNG); if (!(initState & IMG_INIT_PNG)) { sdlCheckError(); System.exit("No png support", 1); } _width = width; _height = height; updateViewport(0, 0, getWidth(), getHeight()); onInit(); _eventHandler = &eventHandler; _eventHandler->registerObserver(_console.get()); _eventHandler->registerObserver(this); info(LOG_CLIENT, "init the shader manager"); ShaderManager::get().init(); if (!Config.isSoundEnabled()) { info(LOG_CLIENT, "sound disabled"); } else if (!SoundControl.init(true)) { error(LOG_CLIENT, "sound initialization failed"); } return 0; }