Skip to content

Commit

Permalink
Common|Crosshair: Convert crosshair variable API to RGB vitality colours
Browse files Browse the repository at this point in the history
  • Loading branch information
RomanHargrave committed Jun 5, 2015
1 parent e6adefd commit ae0078c
Show file tree
Hide file tree
Showing 10 changed files with 118 additions and 13 deletions.
9 changes: 7 additions & 2 deletions doomsday/apps/plugins/common/include/config.h
Expand Up @@ -120,9 +120,14 @@ typedef struct libcommon_config_s {
float xhairWeight;

/// Reference hue value for the crosshair at 0% health
float xhairDeadHue;
float xhairLiveRed;
float xhairLiveGreen;
float xhairLiveBlue;

/// Reference hue value for the crosshair at 100% health
float xhairLiveHue;
float xhairDeadRed;
float xhairDeadGreen;
float xhairDeadBlue;


// Automap:
Expand Down
22 changes: 22 additions & 0 deletions doomsday/apps/plugins/common/src/hu_menu.cpp
Expand Up @@ -1273,6 +1273,12 @@ void Hu_MenuInitHUDOptionsPage()
page->addWidget(new CVarSliderWidget("view-cross-size"))
.setGroup(3);

page->addWidget(new LabelWidget("Thickness"))
.setGroup(3);

page->addWidget(new CVarSliderWidget("view-cross-weight"))
.setGroup(3);

page->addWidget(new LabelWidget("Angle"))
.setGroup(3);

Expand All @@ -1291,6 +1297,22 @@ void Hu_MenuInitHUDOptionsPage()
page->addWidget(new CVarToggleWidget("view-cross-vitality"))
.setGroup(3);

page->addWidget(new LabelWidget("Vitality Colour (Dead)"))
.setGroup(3);

page->addWidget(new CVarColorEditWidget("view-cross-dead-r", "view-cross-dead-g", "view-cross-dead-b"))
.setGroup(3)
.setAction(Widget::Deactivated, CVarColorEditWidget_UpdateCVar)
.setAction(Widget::Activated, Hu_MenuActivateColorWidget);

page->addWidget(new LabelWidget("Vitality Colour (Full Health)"))
.setGroup(3);

page->addWidget(new CVarColorEditWidget("view-cross-live-r", "view-cross-live-g", "view-cross-live-b"))
.setGroup(3)
.setAction(Widget::Deactivated, CVarColorEditWidget_UpdateCVar)
.setAction(Widget::Activated, Hu_MenuActivateColorWidget);

page->addWidget(new LabelWidget("Color"))
.setGroup(3);

Expand Down
79 changes: 68 additions & 11 deletions doomsday/apps/plugins/common/src/x_hair.c
Expand Up @@ -42,24 +42,82 @@ void X_Register(void)
C_VAR_FLOAT("view-cross-b", &cfg.common.xhairColor[2], 0, 0, 1);
C_VAR_FLOAT("view-cross-a", &cfg.common.xhairColor[3], 0, 0, 1);
C_VAR_FLOAT("view-cross-width", &cfg.common.xhairWeight, 0, 0, 5);
C_VAR_FLOAT("view-cross-hue-dead", &cfg.common.xhairDeadHue, 0, 0, 1);
C_VAR_FLOAT("view-cross-hue-live", &cfg.common.xhairLiveHue, 0, 0, 1);
C_VAR_FLOAT("view-cross-live-r", &cfg.common.xhairLiveRed, 0, 0, 1);
C_VAR_FLOAT("view-cross-live-g", &cfg.common.xhairLiveGreen, 0, 0, 1);
C_VAR_FLOAT("view-cross-live-b", &cfg.common.xhairLiveBlue, 0, 0, 1);
C_VAR_FLOAT("view-cross-dead-r", &cfg.common.xhairDeadRed, 0, 0, 1);
C_VAR_FLOAT("view-cross-dead-g", &cfg.common.xhairDeadGreen, 0, 0, 1);
C_VAR_FLOAT("view-cross-dead-b", &cfg.common.xhairDeadBlue, 0, 0, 1);
}

static dd_bool currentColor(player_t* player, float color[3])
static inline float Max3F(float x, float y, float z)
{
return (x > y)
? (x > z)
? x
: z
: (y > z)
? y
: z;
}

static inline float Min3F(float x, float y, float z)
{
// Color the crosshair according to how close the player is to death.
/// @todo These colors should be cvars.
static float const HUE_DEAD = 0.0F;
static float const HUE_LIVE = 0.3F;
return (x < y)
? (x < z)
? x
: z
: (y < z)
? y
: z;
}

static inline float const RGBtoHue(float const red, float const green, float const blue)
{
float const rgbMax = Max3F(red, green, blue);
float const rgbMin = Min3F(red, green, blue);
float const chroma = rgbMax - rgbMin;

float hue = 0;

if(chroma != 0)
{
float const deltaRed = (((rgbMax - red) / 6.0F) + (chroma / 2.0F)) / chroma;
float const deltaGreen = (((rgbMax - green) / 6.0F) + (chroma / 2.0F)) / chroma;
float const deltaBlue = (((rgbMax - blue) / 6.0F) + (chroma / 2.0F)) / chroma;

if(rgbMax == red)
{
hue = deltaBlue - deltaGreen;
}
else if(rgbMax == green)
{
hue = (1.0F / 3.0F) + deltaRed - deltaBlue;
}
else if(rgbMax == blue)
{
hue = (2.0F / 3.0F) + deltaGreen - deltaRed;
}
}

return hue;
}

static dd_bool currentColor(player_t* player, float color[3])
{
if(!player || !color) return false;

if(cfg.common.xhairVitality)
{
M_HSVToRGB(color,
cfg.common.xhairDeadHue + (cfg.common.xhairLiveHue - cfg.common.xhairDeadHue)
* MINMAX_OF(0, (float) player->plr->mo->health / maxHealth, 1), 1, 1);
float const liveHue = RGBtoHue(cfg.common.xhairLiveRed,
cfg.common.xhairLiveGreen,
cfg.common.xhairLiveBlue);
float const deadHue = RGBtoHue(cfg.common.xhairDeadRed,
cfg.common.xhairDeadGreen,
cfg.common.xhairDeadBlue);

M_HSVToRGB(color, deadHue + (liveHue - deadHue)
* MINMAX_OF(0, (float) player->plr->mo->health / maxHealth, 1), 1, 1);
}
else
{
Expand Down Expand Up @@ -91,7 +149,6 @@ static float currentOpacity(player_t* player)

void X_Drawer(int pnum)
{
static int const XHAIR_LINE_WIDTH = 1.0F;
player_t* player = players + pnum;
int xhair = MINMAX_OF(0, cfg.common.xhair, NUM_XHAIRS);
float scale, oldLineWidth, color[4];
Expand Down
3 changes: 3 additions & 0 deletions doomsday/doc/libcommon/variable/view-cross-dead-b.ame
@@ -0,0 +1,3 @@
@summary{
Crosshair color blue component at no health (dead).
}
3 changes: 3 additions & 0 deletions doomsday/doc/libcommon/variable/view-cross-dead-g.ame
@@ -0,0 +1,3 @@
@summary{
Crosshair color green component at no health (dead).
}
3 changes: 3 additions & 0 deletions doomsday/doc/libcommon/variable/view-cross-dead-r.ame
@@ -0,0 +1,3 @@
@summary{
Crosshair color red component at no health (dead).
}
3 changes: 3 additions & 0 deletions doomsday/doc/libcommon/variable/view-cross-live-b.ame
@@ -0,0 +1,3 @@
@summary{
Crosshair color blue component at full health.
}
3 changes: 3 additions & 0 deletions doomsday/doc/libcommon/variable/view-cross-live-g.ame
@@ -0,0 +1,3 @@
@summary{
Crosshair color green component at full health.
}
3 changes: 3 additions & 0 deletions doomsday/doc/libcommon/variable/view-cross-live-r.ame
@@ -0,0 +1,3 @@
@summary{
Crosshair color red component at full health.
}
3 changes: 3 additions & 0 deletions doomsday/doc/libcommon/variable/view-cross-weight.ame
@@ -0,0 +1,3 @@
@summary {
Crosshair line weight
}

0 comments on commit ae0078c

Please sign in to comment.