示例#1
0
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);
}
示例#3
0
static void SetRect(RECT* r, const Rect& rect)
{
    r->left = rect.Left();
    r->top = rect.Top();
    r->right = rect.Right();
    r->bottom = rect.Bottom();
}
示例#4
0
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;
}
示例#5
0
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();
   }
}
示例#6
0
	bool Rect::IsIntersects(const Rect& rect) const
	{
		return !(
			Right() < rect.Left() ||
			rect.Right() < Left() ||
			Bottom() < rect.Top() ||
			rect.Bottom() < Top());
	}
示例#7
0
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;
   }
}
示例#8
0
	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();
}
示例#10
0
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);
}
示例#12
0
文件: ListBox.cpp 项目: lcs2/carpg
//=================================================================================================
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();
	}
}
示例#13
0
文件: Main.cpp 项目: lcs2/carpg
//=================================================================================================
// 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);
}
示例#14
0
文件: Rect.hpp 项目: ekroth/pool
 bool Intersects(const Rect<T>& value) const { return !(this->Left() > value.Right() || this->Right() < value.Left() || this->Bottom() < value.Top() || this->Top() > value.Bottom()); }
示例#15
0
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();
}