1
0
mirror of https://github.com/rwengine/openrw.git synced 2024-09-03 17:19:46 +02:00

Add HUD scaling config parameter

This commit is contained in:
Petar Kukolj 2018-10-26 22:04:09 +02:00 committed by Filip Gawin
parent 4940ae0d6b
commit 36f188611c
7 changed files with 95 additions and 25 deletions

View File

@ -169,11 +169,11 @@ void MapRenderer::draw(GameWorld* world, const MapInfo& mi) {
glm::vec2 plyblip(player->getPosition());
float hdg = glm::roll(player->getRotation());
drawBlip(plyblip, view, mi, "radar_centre",
glm::vec4(0.0f, 0.0f, 0.0f, 1.0f), 18.0f, mi.rotation - hdg);
glm::vec4(0.0f, 0.0f, 0.0f, 1.0f), defaultBlipSize, mi.rotation - hdg);
}
drawBlip(mi.worldCenter + glm::vec2(0.f, mi.worldSize), view, mi,
"radar_north", glm::vec4(0.0f, 0.0f, 0.0f, 1.0f), 24.f);
"radar_north", glm::vec4(0.0f, 0.0f, 0.0f, 1.0f), radarNorthBlipSize);
for (auto& radarBlip : world->state->radarBlips) {
const auto& blip = radarBlip.second;
@ -194,7 +194,7 @@ void MapRenderer::draw(GameWorld* world, const MapInfo& mi) {
const auto& texture = blip.texture;
if (!texture.empty()) {
drawBlip(blippos, view, mi, texture,
glm::vec4(0.0f, 0.0f, 0.0f, 1.0f), 18.0f);
glm::vec4(0.0f, 0.0f, 0.0f, 1.0f), defaultBlipSize);
} else {
// Colours from http://www.gtamodding.com/wiki/0165 (colors not
// specific to that opcode!)
@ -232,7 +232,7 @@ void MapRenderer::draw(GameWorld* world, const MapInfo& mi) {
1.0f // Note: Alpha is not controlled by blip
);
drawBlip(blippos, view, mi, colour, blip.size * 2.0f);
drawBlip(blippos, view, mi, colour, blip.size * otherBlipsScalingFactor * 2.0f);
}
}
@ -289,3 +289,9 @@ void MapRenderer::drawBlip(const glm::vec2& coord, const glm::mat4& view,
renderer->setUniform(rectProg.get(), "colour", glm::vec4(0.0f, 0.0f, 0.0f, 1.0f));
glDrawArrays(GL_LINE_LOOP, 0, 4);
}
void MapRenderer::setHUDScale(const float scale) {
defaultBlipSize *= scale;
radarNorthBlipSize *= scale;
otherBlipsScalingFactor = scale;
}

View File

@ -39,6 +39,7 @@ public:
MapRenderer(std::shared_ptr<Renderer> renderer, GameData* data);
void draw(GameWorld* world, const MapInfo& mi);
void setHUDScale(const float scale);
private:
GameData* data;
@ -50,6 +51,10 @@ private:
GeometryBuffer circleGeom;
DrawBuffer circle;
float radarNorthBlipSize = 24.f;
float defaultBlipSize = 18.f;
float otherBlipsScalingFactor = 1.f;
std::unique_ptr<Renderer::ShaderProgram> rectProg;
void prepareBlip(const glm::vec2& coord, const glm::mat4& view,

View File

@ -35,15 +35,29 @@ constexpr float ui_mapSize = 150.f;
constexpr float ui_worldSizeMin = 200.f;
constexpr float ui_worldSizeMax = 300.f;
static float hudScale = 1.f;
static float final_ui_textSize = ui_textSize;
static float final_ui_textHeight = ui_textHeight;
static float final_ui_elementMargin = ui_elementMargin;
static float final_ui_outerMargin = ui_outerMargin;
static float final_ui_infoMargin = ui_infoMargin;
static float final_ui_weaponSize = ui_weaponSize;
static float final_ui_ammoSize = ui_ammoSize;
static float final_ui_ammoHeight = ui_ammoHeight;
static float final_ui_wantedLevelHeight = ui_wantedLevelHeight;
static float final_ui_scriptTimerHeight = ui_scriptTimerHeight;
static float final_ui_armourOffset = ui_armourOffset;
static float final_ui_mapSize = ui_mapSize;
void drawScriptTimer(GameWorld* world, GameRenderer* render) {
if (world->state->scriptTimerVariable) {
float scriptTimerTextX = static_cast<float>(
render->getRenderer()->getViewport().x - ui_outerMargin);
float scriptTimerTextY = ui_scriptTimerHeight;
render->getRenderer()->getViewport().x - final_ui_outerMargin);
float scriptTimerTextY = final_ui_scriptTimerHeight;
TextRenderer::TextInfo ti;
ti.font = FONT_PRICEDOWN;
ti.size = ui_textSize;
ti.size = final_ui_textSize;
ti.align = TextRenderer::TextInfo::TextAlignment::Right;
{
@ -84,12 +98,12 @@ void drawMap(ViewCamera& currentView, PlayerController* player,
const glm::ivec2& vp = render->getRenderer()->getViewport();
glm::vec2 mapTop =
glm::vec2(ui_outerMargin, vp.y - (ui_outerMargin + ui_mapSize));
glm::vec2(final_ui_outerMargin, vp.y - (final_ui_outerMargin + final_ui_mapSize));
glm::vec2 mapBottom =
glm::vec2(ui_outerMargin + ui_mapSize, vp.y - ui_outerMargin);
glm::vec2(final_ui_outerMargin + final_ui_mapSize, vp.y - final_ui_outerMargin);
map.screenPosition = (mapTop + mapBottom) / 2.f;
map.screenSize = ui_mapSize * 0.95f;
map.screenSize = final_ui_mapSize * 0.95f;
render->map.draw(world, map);
}
@ -98,17 +112,17 @@ void drawMap(ViewCamera& currentView, PlayerController* player,
void drawPlayerInfo(PlayerController* player, GameWorld* world,
GameRenderer* render) {
float infoTextX = static_cast<float>(render->getRenderer()->getViewport().x -
(ui_outerMargin + ui_weaponSize + ui_infoMargin));
(final_ui_outerMargin + final_ui_weaponSize + ui_infoMargin));
float infoTextY = 0.f + ui_outerMargin;
float iconX = static_cast<float>(render->getRenderer()->getViewport().x -
(ui_outerMargin + ui_weaponSize));
float iconY = ui_outerMargin;
float wantedX = static_cast<float>(render->getRenderer()->getViewport().x - ui_outerMargin);
float wantedY = ui_wantedLevelHeight;
(final_ui_outerMargin + final_ui_weaponSize));
float iconY = final_ui_outerMargin;
float wantedX = static_cast<float>(render->getRenderer()->getViewport().x - final_ui_outerMargin);
float wantedY = final_ui_wantedLevelHeight;
TextRenderer::TextInfo ti;
ti.font = FONT_PRICEDOWN;
ti.size = ui_textSize;
ti.size = final_ui_textSize;
ti.align = TextRenderer::TextInfo::TextAlignment::Right;
{
@ -128,7 +142,7 @@ void drawPlayerInfo(PlayerController* player, GameWorld* world,
render->text.renderText(ti);
infoTextY += ui_textHeight;
infoTextY += final_ui_textHeight;
{
std::stringstream ss;
@ -147,7 +161,7 @@ void drawPlayerInfo(PlayerController* player, GameWorld* world,
ti.screenPosition = glm::vec2(infoTextX, infoTextY);
render->text.renderText(ti);
infoTextY += ui_textHeight;
infoTextY += final_ui_textHeight;
if ((world->state->hudFlash != HudFlash::FlashHealth &&
player->getCharacter()->getCurrentState().health > ui_lowHealth) ||
@ -178,11 +192,11 @@ void drawPlayerInfo(PlayerController* player, GameWorld* world,
ti.baseColour = ui_shadowColour;
ti.screenPosition =
glm::vec2(infoTextX + 1.f - ui_armourOffset, infoTextY + 1.f);
glm::vec2(infoTextX + 1.f - final_ui_armourOffset, infoTextY + 1.f);
render->text.renderText(ti);
ti.baseColour = ui_armourColour;
ti.screenPosition = glm::vec2(infoTextX - ui_armourOffset, infoTextY);
ti.screenPosition = glm::vec2(infoTextX - final_ui_armourOffset, infoTextY);
render->text.renderText(ti);
}
@ -231,7 +245,7 @@ void drawPlayerInfo(PlayerController* player, GameWorld* world,
RW_CHECK(itemTexture->getName() != 0, "Item has 0 texture");
render->drawTexture(
itemTexture.get(),
glm::vec4(iconX, iconY, ui_weaponSize, ui_weaponSize));
glm::vec4(iconX, iconY, final_ui_weaponSize, final_ui_weaponSize));
}
if (weapon->fireType != WeaponData::MELEE) {
@ -263,10 +277,10 @@ void drawPlayerInfo(PlayerController* player, GameWorld* world,
ti.baseColour = ui_shadowColour;
ti.font = FONT_ARIAL;
ti.size = ui_ammoSize;
ti.size = final_ui_ammoSize;
ti.align = TextRenderer::TextInfo::TextAlignment::Center;
ti.screenPosition = glm::vec2(iconX + ui_weaponSize / 2.f,
iconY + ui_weaponSize - ui_ammoHeight);
ti.screenPosition = glm::vec2(iconX + final_ui_weaponSize / 2.f,
iconY + final_ui_weaponSize - final_ui_ammoHeight);
render->text.renderText(ti);
}
}
@ -292,7 +306,7 @@ void drawOnScreenText(GameWorld* world, GameRenderer* renderer) {
for (auto& l : alltext) {
for (auto& t : l) {
ti.size = static_cast<float>(t.size);
ti.size = static_cast<float>(t.size * hudScale);
ti.font = t.font;
ti.text = t.text;
ti.wrapX = t.wrapX;
@ -330,3 +344,19 @@ void drawOnScreenText(GameWorld* world, GameRenderer* renderer) {
}
}
}
void setHUDScale(const float scale) {
hudScale = scale;
final_ui_textSize = ui_textSize * scale;
final_ui_textHeight = ui_textHeight * scale;
final_ui_elementMargin = ui_elementMargin * scale;
final_ui_outerMargin = ui_outerMargin * scale;
final_ui_infoMargin = ui_infoMargin * scale;
final_ui_weaponSize = ui_weaponSize * scale;
final_ui_ammoSize = ui_ammoSize * scale;
final_ui_ammoHeight = ui_ammoHeight * scale;
final_ui_wantedLevelHeight = ui_wantedLevelHeight * scale;
final_ui_scriptTimerHeight = ui_scriptTimerHeight * scale;
final_ui_armourOffset = ui_armourOffset * scale;
final_ui_mapSize = ui_mapSize * scale;
}

View File

@ -10,4 +10,6 @@ void drawHUD(ViewCamera& currentView, PlayerController* player,
void drawOnScreenText(GameWorld* world, GameRenderer* renderer);
void setHUDScale(const float scale);
#endif

View File

@ -129,6 +129,22 @@ struct IntTranslator {
}
};
struct FloatTranslator {
typedef std::string internal_type;
typedef float external_type;
boost::optional<external_type> get_value(const internal_type &str) {
boost::optional<external_type> res;
try {
res = std::stof(stripComments(str));
} catch (std::invalid_argument &) {
}
return res;
}
boost::optional<internal_type> put_value(const external_type &f) {
return std::to_string(f);
}
};
GameConfig::ParseResult GameConfig::saveConfig() {
auto configPath = getConfigPath().string();
return parseConfig(ParseType::CONFIG, "", ParseType::FILE, configPath);
@ -229,6 +245,7 @@ GameConfig::ParseResult GameConfig::parseConfig(GameConfig::ParseType srcType,
auto boolt = BoolTranslator();
auto patht = PathTranslator();
auto intt = IntTranslator();
auto floatt = FloatTranslator();
// Add new configuration parameters here.
// Additionally, add them to the unit test.
@ -237,6 +254,7 @@ GameConfig::ParseResult GameConfig::parseConfig(GameConfig::ParseType srcType,
read_config("game.path", this->m_gamePath, "/opt/games/Grand Theft Auto 3",
patht, false);
read_config("game.language", this->m_gameLanguage, "american", deft);
read_config("game.hud_scale", this->m_HUDscale, 1.f, floatt);
read_config("input.invert_y", this->m_inputInvertY, false, boolt);

View File

@ -231,6 +231,9 @@ public:
bool getWindowFullscreen() const {
return m_windowFullscreen;
}
float getHUDScale() const {
return m_HUDscale;
}
static rwfs::path getDefaultConfigPath();
private:
@ -272,6 +275,9 @@ private:
/// Set the window to fullscreen
bool m_windowFullscreen = false;
/// HUD scale parameter
float m_HUDscale = 1.f;
};
#endif

View File

@ -108,6 +108,9 @@ RWGame::RWGame(Logger& log, int argc, char* argv[])
}
});
setHUDScale(config.getHUDScale());
renderer.map.setHUDScale(config.getHUDScale());
log.info("Game", "Started");
RW_TIMELINE_LEAVE("Startup");
}