void EditField::Render(Rect& rectArea) throw() { if (!m_text.IsInit()) UpdateTexture(); m_text.Render(rectArea); // render border { glLineWidth(2.0f); //if (m_bShowBorder) // TODO { glBegin(GL_LINE_LOOP); Color m_cForeground = Color::Black(); // TODO glColor4ubv(m_cForeground.m_color); glVertex2i(rectArea.Left(), rectArea.Top()); glVertex2i(rectArea.Left(), rectArea.Bottom()); glVertex2i(rectArea.Right(), rectArea.Bottom()); glVertex2i(rectArea.Right(), rectArea.Top()); glEnd(); } } // draw caret if (m_bFocused) { glBegin(GL_LINES); glColor4ubv(Color::Blue().m_color); glVertex2i(rectArea.Left() + m_uiCaretX, rectArea.Top() + 2); glVertex2i(rectArea.Left() + m_uiCaretX, rectArea.Top() + m_uiCaretHeight + 2); glEnd(); } }
void Checkbox::RenderCheck(Rect& rectArea) { Rect rectBox = rectArea; int iBoxMargin = int(rectArea.Height() * 0.2); int iBoxMarginRight = int(rectArea.Height() * 0.8 * 0.75); rectBox.Left(rectBox.Left() + iBoxMargin); rectBox.Right(rectBox.Left() + iBoxMarginRight); rectBox.Top(rectBox.Top() + iBoxMargin); rectBox.Bottom(rectBox.Bottom() - iBoxMargin); OpenGL::PushedAttributes attr(GL_ENABLE_BIT | GL_LINE_BIT | GL_POINT_BIT); glDisable(GL_TEXTURE_2D); glEnable(GL_LINE_SMOOTH); glEnable(GL_POINT_SMOOTH); Color cBox = GetAttrAsColor(CheckboxAttr::BoxColor); glColor4ubv(cBox.m_color); glLineWidth(2.0); glBegin(GL_LINE_LOOP); glVertex2i(rectBox.Left(), rectBox.Bottom()); glVertex2i(rectBox.Right(), rectBox.Bottom()); glVertex2i(rectBox.Right(), rectBox.Top()); glVertex2i(rectBox.Left(), rectBox.Top()); glEnd(); if (IsChecked()) { double iCheckUnit = rectBox.Height() * 0.1; Point point1(int(rectBox.Left() + 3 * iCheckUnit), int(rectBox.Bottom() - 6 * iCheckUnit)); Point point2(int(rectBox.Left() + 6 * iCheckUnit), int(rectBox.Bottom() - 3 * iCheckUnit)); Point point3(int(rectBox.Left() + 11* iCheckUnit), int(rectBox.Bottom() - 11* iCheckUnit)); Color cCheck = GetAttrAsColor(CheckboxAttr::CheckColor); glColor4ubv(cCheck.m_color); glLineWidth(4.0); glBegin(GL_LINES); glVertex2i(point1.X(), point1.Y()); glVertex2i(point2.X(), point2.Y()); glVertex2i(point2.X(), point2.Y()); glVertex2i(point3.X(), point3.Y()); glEnd(); glPointSize(3.0); glBegin(GL_POINTS); glVertex2i(point1.X(), point1.Y()); glVertex2i(point2.X(), point2.Y()); glVertex2i(point3.X(), point3.Y()); glEnd(); } // adjust rect for size of checkbox int iOffset = int(rectArea.Height() * 1.1); rectArea.Left(rectArea.Left() + iOffset); }
static void SetRect(RECT* r, const Rect& rect) { r->left = rect.Left(); r->top = rect.Top(); r->right = rect.Right(); r->bottom = rect.Bottom(); }
bool Slider::OnMouseButtonEvent(bool bPressed, int iMouseButton, unsigned int x, unsigned int y) { if (bPressed && IsInsideSliderArea(Point(x, y))) { // set focus to ourselves GetWindowManager().SetFocus(shared_from_this()); m_bFocused = true; // start sliding m_bMouseButtonDown = true; // calc drag x offset Rect rect = Window::GetRect(); unsigned int uiMid = DividerPoint(); m_iDragOffset = x - int(rect.Left() + uiMid); // start mouse motion tracking until mouse button is up GetWindowManager().TrackMouseUp(shared_from_this(), iMouseButton); } else m_bMouseButtonDown = false; return true; }
void Slider::RenderSlider(Rect& rectArea) { int iMid = rectArea.Left() + int(DividerPoint()); double dAspect = 1.33333; unsigned int uiRemainingHeight = unsigned(rectArea.Height() * (1.0 - c_dBarHeightPercent)); unsigned int y = static_cast<unsigned int>((c_uiSliderWidth * dAspect / 2.0) / c_dSquareRoot2); unsigned int x = (uiRemainingHeight < y) ? 0 : (uiRemainingHeight - y); for (int i = 0; i<2; i++) { glBegin(i == 0 ? GL_POLYGON : GL_LINE_LOOP); if (i == 0) glColor4ubv(m_sliderColor.m_color); else glColor3ub(0, 0, 0); glVertex2i(iMid - c_uiSliderWidth / 2, rectArea.Top()); glVertex2i(iMid - c_uiSliderWidth / 2, rectArea.Top() + x); glVertex2i(iMid, rectArea.Top() + uiRemainingHeight); glVertex2i(iMid + c_uiSliderWidth / 2, rectArea.Top() + x); glVertex2i(iMid + c_uiSliderWidth / 2, rectArea.Top()); glEnd(); } }
bool Rect::IsIntersects(const Rect& rect) const { return !( Right() < rect.Left() || rect.Right() < Left() || Bottom() < rect.Top() || rect.Bottom() < Top()); }
bool Slider::IsInsideSliderArea(Point pt) const { try { Rect rect = Window::GetRect(); rect.Add(Parent()->GetPos()); unsigned int uiMid = DividerPoint() + rect.Left(); rect.Left(uiMid - c_uiSliderWidth/2); rect.Right(uiMid + c_uiSliderWidth/2); return rect.IsInside(pt); } catch (...) { return false; } }
void Rect::Merge(const Rect& rect) { float left = min(Left(), rect.Left()); float right = max(Right(), rect.Right()); float top = min(Top(), rect.Top()); float bottom = max(Bottom(), rect.Bottom()); origin.x = left; origin.y = top; size.width = right - left; size.height = bottom - top; }
void ProgressBar::Render(Rect& rectArea) { int iMid = int(rectArea.Left() + DividerPoint()); glDisable(GL_TEXTURE_2D); glBegin(GL_QUADS); // render background quad glColor4ubv(m_backColor.m_color); glVertex2i(rectArea.Left(), rectArea.Top()); glVertex2i(rectArea.Left(), rectArea.Bottom()); glVertex2i(rectArea.Right(), rectArea.Bottom()); glVertex2i(rectArea.Right(), rectArea.Top()); // render foreground quad glColor4ubv(m_color.m_color); glVertex2i(rectArea.Left(), rectArea.Top()); glVertex2i(rectArea.Left(), rectArea.Bottom()); glVertex2i(iMid, rectArea.Bottom()); glVertex2i(iMid, rectArea.Top()); glEnd(); }
unsigned int Slider::SliderPosByOffset(unsigned int uiAbsPosX) { Rect rect = Window::GetRect(); if (uiAbsPosX < unsigned(rect.Left())) return 0; if (uiAbsPosX >= unsigned(rect.Right())) return BaseClass::Max(); // else calculate unsigned int uiRelPos = uiAbsPosX - rect.Left(); double dPos = double(uiRelPos) / rect.Width(); // add rounding factor dPos += 0.5 / BaseClass::Max(); unsigned int uiSliderPos = static_cast<unsigned int>(dPos * BaseClass::Max()); return uiSliderPos; }
void TextTexture::Render(Rect rc) { // draw text glEnable(GL_TEXTURE_2D); m_tex.Bind(); double u = 1.0; double v = 1.0; glBegin(GL_QUADS); glColor4f(1.0f, 1.0f, 1.0f, 1.0f); glTexCoord2d(0.0, 0.0); glVertex2i(rc.Left(), rc.Top()); glTexCoord2d(0.0, v); glVertex2i(rc.Left(), rc.Bottom()); glTexCoord2d( u, v); glVertex2i(rc.Right(), rc.Bottom()); glTexCoord2d( u, 0.0); glVertex2i(rc.Right(), rc.Top()); glEnd(); glDisable(GL_TEXTURE_2D); }
//================================================================================================= void ListBox::Draw(ControlDrawData*) { if(collapsed) { // box GUI.DrawItem(GUI.tBox, global_pos, size, WHITE, 8, 32); // element if(selected != -1) { Rect rc = { global_pos.x + 2, global_pos.y + 2, global_pos.x + size.x - 12, global_pos.y + size.y - 2 }; GUI.DrawText(GUI.default_font, items[selected]->ToString(), DT_SINGLELINE, BLACK, rc, &rc); } // obrazek GUI.DrawSprite(GUI.tDown, Int2(global_pos.x + size.x - 10, global_pos.y + (size.y - 10) / 2)); // powinno byæ tu ale wtedy by³a by z³a kolejnoœæ rysowania //if(menu->visible) // menu->Draw(); } else { // box GUI.DrawItem(GUI.tBox, global_pos, real_size, WHITE, 8, 32); // zaznaczenie Rect rc = { global_pos.x, global_pos.y, global_pos.x + real_size.x, global_pos.y + real_size.y }; if(selected != -1) { Rect rs = { global_pos.x + 2, global_pos.y - int(scrollbar.offset) + 2 + selected*item_height, global_pos.x + real_size.x - 2, 0 }; rs.Bottom() = rs.Top() + item_height; Rect out; if(Rect::Intersect(rs, rc, out)) GUI.DrawSpriteRect(GUI.tPix, out, COLOR_RGBA(0, 255, 0, 128)); } // elementy Rect r = { global_pos.x + 2, global_pos.y - int(scrollbar.offset) + 2, global_pos.x + real_size.x - 2, rc.Bottom() - 2 }; int orig_x = global_pos.x + 2; Matrix mat; for(GuiElement* e : items) { if(e->tex) { Int2 required_size = force_img_size, img_size; Vec2 scale; Control::ResizeImage(e->tex, required_size, img_size, scale); mat = Matrix::Transform2D(nullptr, 0.f, &scale, nullptr, 0.f, &Vec2((float)orig_x, float(r.Top() + (item_height - required_size.y) / 2))); GUI.DrawSprite2(e->tex, mat, nullptr, &rc, WHITE); r.Left() = orig_x + required_size.x; } else r.Left() = orig_x; if(!GUI.DrawText(GUI.default_font, e->ToString(), DT_SINGLELINE, BLACK, r, &rc)) break; r.Top() += item_height; } // pasek przewijania if(require_scrollbar) scrollbar.Draw(); } }
//================================================================================================= // G³ówna funkcja programu //================================================================================================= int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { ErrorHandler& error_handler = ErrorHandler::Get(); error_handler.RegisterHandler(); GetCompileTime(); // logger (w tym przypadku prelogger bo jeszcze nie wiemy gdzie to zapisywaæ) PreLogger plog; Logger::global = &plog; // stwórz foldery na zapisy CreateDirectory("saves", nullptr); CreateDirectory("saves/single", nullptr); CreateDirectory("saves/multi", nullptr); //------------------------------------------------------------------------- // pocz¹tek time_t t = time(0); tm t2; localtime_s(&t2, &t); Info("CaRpg " VERSION_STR); Info("Date: %04d-%02d-%02d", t2.tm_year + 1900, t2.tm_mon + 1, t2.tm_mday); Info("Build date: %s", g_ctime.c_str()); Info("Process ID: %d", GetCurrentProcessId()); { cstring build_type = #ifdef _DEBUG "debug "; #else "release "; #endif Info("Build type: %s", build_type); } LogProcessorFeatures(); Game game; Engine::StartupOptions options; Bool3 windowed = None, console = None; game.cfg_file = "carpg.cfg"; bool log_to_file; string log_filename; //------------------------------------------------------------------------- // parsuj linie komend int cmd_len = strlen(lpCmdLine) + 1; char* cmd_line = new char[cmd_len]; memcpy(cmd_line, lpCmdLine, cmd_len); char** argv; Info("Parsing command line."); int argc = ParseCmdLine(cmd_line, &argv); bool restarted = false; for(int i = 0; i < argc; ++i) { char c = argv[i][0]; if(c != '-' && c != '+') { Warn("Unknown command line parameter '%s'.", argv[i]); continue; } cstring arg = argv[i] + 1; if(c == '+') game.ParseConfigVar(arg); else { if(strcmp(arg, "config") == 0) { if(argc != i + 1 && argv[i + 1][0] != '-') { ++i; game.cfg_file = argv[i]; Info("Configuration file: %s", game.cfg_file.c_str()); } else Warn("No argument for parameter '-config'!"); } else if(strcmp(arg, "single") == 0) game.quickstart = QUICKSTART_SINGLE; else if(strcmp(arg, "host") == 0) game.quickstart = QUICKSTART_HOST; else if(strcmp(arg, "join") == 0) game.quickstart = QUICKSTART_JOIN_LAN; else if(strcmp(arg, "joinip") == 0) game.quickstart = QUICKSTART_JOIN_IP; else if(strcmp(arg, "console") == 0) console = True; else if(strcmp(arg, "windowed") == 0) windowed = True; else if(strcmp(arg, "fullscreen") == 0) windowed = False; else if(strcmp(arg, "nosound") == 0) game.nosound = true; else if(strcmp(arg, "nomusic") == 0) game.nomusic = true; else if(strcmp(arg, "test") == 0) { game.testing = true; console = True; } else if(strcmp(arg, "delay-1") == 0) utility::InitDelayLock(); else if(strcmp(arg, "delay-2") == 0) utility::WaitForDelayLock(2); else if(strcmp(arg, "delay-3") == 0) utility::WaitForDelayLock(3); else if(strcmp(arg, "delay-4") == 0) utility::WaitForDelayLock(4); else if(strcmp(arg, "restart") == 0) { if(!restarted) { // try to open mutex Info("Game restarted."); HANDLE mutex = OpenMutex(SYNCHRONIZE, FALSE, RESTART_MUTEX_NAME); if(mutex) { // wait for previous application to close WaitForSingleObject(mutex, INFINITE); CloseHandle(mutex); } restarted = true; } } else Warn("Unknown switch '%s'.", arg); } } LoadSystemDir(); //------------------------------------------------------------------------- // wczytaj plik konfiguracyjny Info("Loading config file"); Config& cfg = Game::Get().cfg; Config::Result result = cfg.Load(game.cfg_file.c_str()); if(result == Config::NO_FILE) Info("Config file not found '%s'.", game.cfg_file.c_str()); else if(result == Config::PARSE_ERROR) Error("Config file parse error '%s' : %s", game.cfg_file.c_str(), cfg.GetError().c_str()); error_handler.ReadConfiguration(cfg); // konsola if(console == None) console = cfg.GetBool3("console", False); if(console == True) { game.have_console = true; // konsola AllocConsole(); freopen("CONIN$", "r", stdin); freopen("CONOUT$", "w", stdout); freopen("CONOUT$", "w", stderr); // polskie znaki w konsoli, tymczasowe rozwi¹zanie SetConsoleCP(1250); SetConsoleOutputCP(1250); } setlocale(LC_COLLATE, ""); setlocale(LC_CTYPE, ""); // tryb okienkowy if(windowed == None) { Bool3 b = cfg.GetBool3("fullscreen", True); if(b == True) windowed = False; else windowed = True; } options.fullscreen = (windowed == False); // rozdzielczoœæ const string& res = cfg.GetString("resolution", "0x0"); if(sscanf_s(res.c_str(), "%dx%d", &options.size.x, &options.size.y) != 2) { Warn("Settings: Invalid resolution value '%s'.", res.c_str()); options.size = Int2::Zero; } else Info("Settings: Resolution %dx%d.", options.size.x, options.size.y); // refresh game.wnd_hz = cfg.GetInt("refresh", 0); Info("Settings: Refresh rate %d Hz.", game.wnd_hz); // adapter game.used_adapter = cfg.GetInt("adapter", 0); Info("Settings: Adapter %d.", game.used_adapter); // logowanie log_to_file = (cfg.GetBool3("log", True) == True); // plik logowania if(log_to_file) log_filename = cfg.GetString("log_filename", "log.txt"); game.hardcore_option = ToBool(cfg.GetBool3("hardcore_mode", False)); // nie zatrzymywanie gry w razie braku aktywnoœci okna if(cfg.GetBool3("inactive_update", False) == True) game.inactive_update = true; // dŸwiêk / muzyka bool play_sound = true, play_music = true; if(cfg.GetBool3("play_sound", True) == False) { cfg.Remove("play_sound"); play_sound = false; } if(cfg.GetBool3("play_music", True) == False) { cfg.Remove("play_music"); play_music = false; } if(game.nosound || cfg.GetBool3("nosound", False) == True) { game.nosound = true; Info("Settings: no sound."); } if(game.nomusic || cfg.GetBool3("nomusic", False) == True) { game.nomusic = true; Info("Settings: no music."); } if(game.nomusic && game.nosound) game.disabled_sound = true; game.sound_volume = Clamp(cfg.GetInt("sound_volume", 100), 0, 100); game.music_volume = Clamp(cfg.GetInt("music_volume", 100), 0, 100); if(!play_sound) { game.sound_volume = 0; cfg.Add("sound_volume", "0"); } if(!play_music) { game.music_volume = 0; cfg.Add("music_volume", "0"); } // ustawienia myszki game.mouse_sensitivity = Clamp(cfg.GetInt("mouse_sensitivity", 50), 0, 100); game.mouse_sensitivity_f = Lerp(0.5f, 1.5f, float(game.mouse_sensitivity) / 100); // tryb multiplayer game.player_name = cfg.GetString("nick", ""); #define LIMIT(x) if(x.length() > 16) x = x.substr(0,16) LIMIT(game.player_name); game.server_name = cfg.GetString("server_name", ""); LIMIT(game.server_name); game.server_pswd = cfg.GetString("server_pswd", ""); LIMIT(game.server_pswd); game.max_players = Clamp(cfg.GetInt("server_players", DEFAULT_PLAYERS), MIN_PLAYERS, MAX_PLAYERS); game.server_ip = cfg.GetString("server_ip", ""); game.mp_timeout = Clamp(cfg.GetFloat("timeout", 10.f), 1.f, 3600.f); // szybki start if(game.quickstart == QUICKSTART_NONE) { const string& mode = cfg.GetString("quickstart", ""); if(mode == "single") game.quickstart = QUICKSTART_SINGLE; else if(mode == "host") game.quickstart = QUICKSTART_HOST; else if(mode == "join") game.quickstart = QUICKSTART_JOIN_LAN; else if(mode == "joinip") game.quickstart = QUICKSTART_JOIN_IP; } // autopicked class in MP { const string& clas = cfg.GetString("autopick", ""); if(!clas.empty()) { if(clas == "random") game.autopick_class = Class::RANDOM; else { ClassInfo* ci = ClassInfo::Find(clas); if(ci) { if(ClassInfo::IsPickable(ci->class_id)) game.autopick_class = ci->class_id; else Warn("Settings [autopick]: Class '%s' is not pickable by players.", clas.c_str()); } else Warn("Settings [autopick]: Invalid class '%s'.", clas.c_str()); } } } // autostart serwera game.autostart_count = cfg.GetInt("autostart"); if(game.autostart_count < -1) game.autostart_count = -1; else if(game.autostart_count > MAX_PLAYERS || game.autostart_count == 0) game.autostart_count = -1; //game.kick_timer = max(0, cfg.GetInt("kick_timer", 900)); game.mp_port = Clamp(cfg.GetInt("port", PORT), 0, 0xFFFF); // autopicked class in quickstart { const string& clas = cfg.GetString("class", ""); if(!clas.empty()) { ClassInfo* ci = ClassInfo::Find(clas); if(ci) { if(ClassInfo::IsPickable(ci->class_id)) game.quickstart_class = ci->class_id; else Warn("Settings [class]: Class '%s' is not pickable by players.", clas.c_str()); } else Warn("Settings [class]: Invalid class '%s'.", clas.c_str()); } } game.quickstart_name = cfg.GetString("name", "Test"); if(game.quickstart_name.empty()) game.quickstart_name = "Test"; game.change_title_a = ToBool(cfg.GetBool3("change_title", False)); // pozycja rozmiar okien int con_pos_x = cfg.GetInt("con_pos_x"), con_pos_y = cfg.GetInt("con_pos_y"); if(game.have_console && (con_pos_x != -1 || con_pos_y != -1)) { HWND con = GetConsoleWindow(); Rect rect; GetWindowRect(con, (RECT*)&rect); if(con_pos_x != -1) rect.Left() = con_pos_x; if(con_pos_y != -1) rect.Top() = con_pos_y; SetWindowPos(con, 0, rect.Left(), rect.Top(), 0, 0, SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOZORDER); } options.force_size.x = cfg.GetInt("wnd_size_x"); options.force_size.y = cfg.GetInt("wnd_size_y"); options.force_pos.x = cfg.GetInt("wnd_pos_x"); options.force_pos.y = cfg.GetInt("wnd_pos_y"); // multisampling int multisampling = cfg.GetInt("multisampling", 0), multisampling_quality = cfg.GetInt("multisampling_quality", 0); game.SetStartingMultisampling(multisampling, multisampling_quality); // inne game.cl_postfx = cfg.GetBool("cl_postfx", true); game.cl_normalmap = cfg.GetBool("cl_normalmap", true); game.cl_specularmap = cfg.GetBool("cl_specularmap", true); game.cl_glow = cfg.GetBool("cl_glow", true); game.shader_version = cfg.GetInt("cl_shader_version"); if(game.shader_version != -1 && game.shader_version != 2 && game.shader_version != 3) { Warn("Settings: Unknown shader version %d.", game.shader_version); game.shader_version = -1; } options.vsync = cfg.GetBool("vsync", true); game.grass_range = cfg.GetFloat("grass_range", 40.f); if(game.grass_range < 0.f) game.grass_range = 0.f; { const string& screenshot_format = cfg.GetString("screenshot_format", "jpg"); if(screenshot_format == "jpg") game.screenshot_format = D3DXIFF_JPG; else if(screenshot_format == "bmp") game.screenshot_format = D3DXIFF_BMP; else if(screenshot_format == "tga") game.screenshot_format = D3DXIFF_TGA; else if(screenshot_format == "png") game.screenshot_format = D3DXIFF_PNG; else { Warn("Settings: Unknown screenshot format '%s'. Defaulting to jpg.", screenshot_format.c_str()); game.screenshot_format = D3DXIFF_JPG; } } game.disable_net_stats = cfg.GetBool("disable_net_stats"); game.SetConfigVarsFromFile(); game.ApplyConfigVars(); //------------------------------------------------------------------------- // logger int ile = 0; if(game.have_console) ++ile; if(log_to_file) ++ile; if(ile == 2) { MultiLogger* multi = new MultiLogger; ConsoleLogger* clog = new ConsoleLogger; TextLogger* tlog = new TextLogger(log_filename.c_str()); multi->loggers.push_back(clog); multi->loggers.push_back(tlog); plog.Apply(multi); Logger::global = multi; } else if(ile == 1) { if(game.have_console) { ConsoleLogger* l = new ConsoleLogger; plog.Apply(l); Logger::global = l; } else { TextLogger* l = new TextLogger(log_filename.c_str()); plog.Apply(l); Logger::global = l; } } else { Logger* l = new Logger; plog.Clear(); Logger::global = l; } //------------------------------------------------------------------------- // skrypty instalacyjne if(!RunInstallScripts()) { MessageBox(nullptr, "Failed to run installation scripts. Check log for details.", nullptr, MB_OK | MB_ICONERROR | MB_TASKMODAL); return 3; } //------------------------------------------------------------------------- // jêzyk LoadLanguages(); const string& lang = cfg.GetString("language", ""); extern string g_lang_prefix; if(lang == "") { LocalString s; if(!ShowPickLanguageDialog(s.get_ref())) { ClearLanguages(); delete[] cmd_line; delete[] argv; delete Logger::global; return 2; } else { g_lang_prefix = s; cfg.Add("language", s->c_str()); } } else g_lang_prefix = lang; //------------------------------------------------------------------------- // pseudolosowoœæ uint cfg_seed = cfg.GetUint("seed"), seed; if(cfg_seed == 0) seed = (uint)time(nullptr); else { seed = cfg_seed; game.force_seed = seed; } game.next_seed = cfg.GetUint("next_seed"); game.force_seed_all = ToBool(cfg.GetBool3("force_seed", False)); Info("random seed: %u/%u/%d", seed, game.next_seed, (game.force_seed_all ? 1 : 0)); Srand(seed); // inne game.check_updates = ToBool(cfg.GetBool3("check_updates", True)); game.skip_tutorial = ToBool(cfg.GetBool3("skip_tutorial", False)); // zapisz konfiguracjê game.SaveCfg(); //------------------------------------------------------------------------- // rozpocznij grê Info("Starting game engine."); bool b = game.Start0(options); //------------------------------------------------------------------------- // sprz¹tanie delete[] cmd_line; delete[] argv; delete Logger::global; return (b ? 0 : 1); }
bool Intersects(const Rect<T>& value) const { return !(this->Left() > value.Right() || this->Right() < value.Left() || this->Bottom() < value.Top() || this->Top() > value.Bottom()); }
void FontRendererImpl::DrawText(const std::string& text, const Rect& rect, const RGBA& color, float fontSize, float fontScale, const std::string& fontRef) { // wait for a swap to complete FrpSeqAllocatorWaitForSwap(); m_mutex.lock(); // create or find a text format ComPtr<IDWriteTextFormat> textFormat; auto formatKey = std::make_pair(fontRef, fontSize); auto formatIter = m_textFormatCache.find(formatKey); if (formatIter != m_textFormatCache.end()) { textFormat = formatIter->second; } else { m_dwFactory->CreateTextFormat(ToWide(fontRef).c_str(), nullptr, DWRITE_FONT_WEIGHT_NORMAL, DWRITE_FONT_STYLE_NORMAL, DWRITE_FONT_STRETCH_NORMAL, fontSize, L"en-us", textFormat.GetAddressOf()); m_textFormatCache[formatKey] = textFormat; } // create or find a cached text layout ComPtr<IDWriteTextLayout> textLayout; auto layoutKey = std::make_pair(textFormat.Get(), std::make_pair(color.AsARGB(), text)); auto layoutIter = m_textLayoutCache.find(layoutKey); if (layoutIter != m_textLayoutCache.end()) { textLayout = layoutIter->second; } else { std::wstring wideText = ToWide(text); // parse colors and the lot std::wstring noColorTextString; std::vector<DWRITE_TEXT_RANGE> textRanges; std::vector<RGBA> textColors; { std::wstringstream noColorText; int count = 0; static const RGBA colors[] = { RGBA(0, 0, 0), RGBA(255, 0, 0), RGBA(0, 255, 0), RGBA(255, 255, 0), RGBA(0, 0, 255), RGBA(0, 255, 255), RGBA(255, 0, 255), RGBA(255, 255, 255), RGBA(100, 0, 0), RGBA(0, 0, 100) }; textRanges.reserve(50); textColors.reserve(50); textRanges.push_back({ 0, UINT32_MAX }); textColors.push_back(color); for (int i = 0; i < wideText.length(); i++) { if (wideText[i] == '^' && (i + 1) < wideText.length() && isdigit(wideText[i + 1])) { textRanges.back().length = count - textRanges.back().startPosition; textRanges.push_back({ (UINT32)count, UINT32_MAX }); textColors.push_back(colors[wideText[i + 1] - '0']); ++i; continue; } noColorText << wideText[i]; ++count; } textRanges.back().length = count - textRanges.back().startPosition; noColorTextString = noColorText.str(); } m_dwFactory->CreateTextLayout(noColorTextString.c_str(), static_cast<UINT32>(noColorTextString.length()), textFormat.Get(), rect.Width(), rect.Height(), textLayout.GetAddressOf()); m_textLayoutCache[layoutKey] = textLayout; // set effect for (size_t i : irange(textRanges.size())) { DWRITE_TEXT_RANGE effectRange = textRanges[i]; RGBA color = textColors[i]; static thread_local std::map<uint32_t, ComPtr<FrDrawingEffect>> effects; auto it = effects.find(color.AsARGB()); if (it == effects.end()) { ComPtr<FrDrawingEffect> effect = Make<FrDrawingEffect>(); effect->SetColor(textColors[i]); it = effects.insert({ color.AsARGB(), effect }).first; } check(SUCCEEDED(textLayout->SetDrawingEffect((IUnknown*)it->second.Get(), effectRange))); } } // draw auto drawingContext = new FrDrawingContext(); textLayout->Draw(drawingContext, m_textRenderer.Get(), rect.Left(), rect.Top()); auto numRuns = drawingContext->glyphRuns.size(); if (numRuns) { for (auto& run : drawingContext->glyphRuns) { m_queuedRenderables.push_back(std::make_unique<FrGlyphRunRenderable>(run)); //m_queuedGlyphRuns.push_back(run); } } delete drawingContext; m_mutex.unlock(); }