Created new renderer method which works like SetColor but only accepts an alpha pre-multiplied color value, deprecating the badly-behaved SetColor method

This commit is contained in:
yvt 2013-12-09 01:00:09 +09:00
parent 8996336063
commit ca88537a6b
29 changed files with 220 additions and 115 deletions

View File

@ -122,14 +122,14 @@ namespace spades {
// fade the map
float fade = Clamp((time - 1.f) / 2.2f, 0.f, 1.f);
if(fade < 1.f) {
renderer.Color = Vector4(0.f, 0.f, 0.f, 1.f - fade);
renderer.ColorNP = Vector4(0.f, 0.f, 0.f, 1.f - fade);
renderer.DrawImage(renderer.RegisterImage("Gfx/White.tga"),
AABB2(0.f, 0.f, renderer.ScreenWidth, renderer.ScreenHeight));
}
// draw title logo
Image@ img = renderer.RegisterImage("Gfx/Title/Logo.png");
renderer.Color = Vector4(1.f, 1.f, 1.f, 1.f);
renderer.ColorNP = Vector4(1.f, 1.f, 1.f, 1.f);
renderer.DrawImage(img, Vector2((renderer.ScreenWidth - img.Width) * 0.5f, 64.f));
manager.RunFrame(dt);
@ -163,11 +163,11 @@ namespace spades {
Vector2 size = Size;
Image@ img = renderer.RegisterImage("Gfx/White.tga");
if(Pressed && Hover) {
renderer.Color = Vector4(1.f, 1.f, 1.f, 0.3f);
renderer.ColorNP = Vector4(1.f, 1.f, 1.f, 0.3f);
} else if(Hover) {
renderer.Color = Vector4(1.f, 1.f, 1.f, 0.15f);
renderer.ColorNP = Vector4(1.f, 1.f, 1.f, 0.15f);
} else {
renderer.Color = Vector4(1.f, 1.f, 1.f, 0.0f);
renderer.ColorNP = Vector4(1.f, 1.f, 1.f, 0.0f);
}
renderer.DrawImage(img, AABB2(pos.x, pos.y, size.x, size.y));
@ -231,11 +231,11 @@ namespace spades {
Vector2 size = Size;
Image@ img = renderer.RegisterImage("Gfx/White.tga");
if(Pressed && Hover) {
renderer.Color = Vector4(1.f, 1.f, 1.f, 0.3f);
renderer.ColorNP = Vector4(1.f, 1.f, 1.f, 0.3f);
} else if(Hover) {
renderer.Color = Vector4(1.f, 1.f, 1.f, 0.15f);
renderer.ColorNP = Vector4(1.f, 1.f, 1.f, 0.15f);
} else {
renderer.Color = Vector4(1.f, 1.f, 1.f, 0.0f);
renderer.ColorNP = Vector4(1.f, 1.f, 1.f, 0.0f);
}
renderer.DrawImage(img, AABB2(pos.x - 2.f, pos.y, size.x, size.y));

View File

@ -100,12 +100,12 @@ namespace spades {
Renderer@ r = Manager.Renderer;
Image@ img = r.RegisterImage("Gfx/White.tga");
r.Color = Vector4(1, 1, 1, 0.08f);
r.ColorNP = Vector4(1, 1, 1, 0.08f);
r.DrawImage(img,
AABB2(pos.x, pos.y + contentsTop - 15.f, size.x, 1.f));
r.DrawImage(img,
AABB2(pos.x, pos.y + contentsTop + contentsHeight + 15.f, size.x, 1.f));
r.Color = Vector4(1, 1, 1, 0.2f);
r.ColorNP = Vector4(1, 1, 1, 0.2f);
r.DrawImage(img,
AABB2(pos.x, pos.y + contentsTop - 14.f, size.x, 1.f));
r.DrawImage(img,

View File

@ -128,12 +128,12 @@ namespace spades {
Renderer@ r = Manager.Renderer;
Image@ img = r.RegisterImage("Gfx/White.tga");
r.Color = Vector4(1, 1, 1, 0.08f);
r.ColorNP = Vector4(1, 1, 1, 0.08f);
r.DrawImage(img,
AABB2(pos.x, pos.y + ContentsTop - 15.f, size.x, 1.f));
r.DrawImage(img,
AABB2(pos.x, pos.y + ContentsTop + ContentsHeight + 15.f, size.x, 1.f));
r.Color = Vector4(1, 1, 1, 0.2f);
r.ColorNP = Vector4(1, 1, 1, 0.2f);
r.DrawImage(img,
AABB2(pos.x, pos.y + ContentsTop - 14.f, size.x, 1.f));
r.DrawImage(img,
@ -366,15 +366,15 @@ namespace spades {
Vector2 pos = ScreenPosition;
Vector2 size = Size;
Image@ img = renderer.RegisterImage("Gfx/White.tga");
renderer.Color = Vector4(0.f, 0.f, 0.f, IsFocused ? 0.3f : 0.1f);
renderer.ColorNP = Vector4(0.f, 0.f, 0.f, IsFocused ? 0.3f : 0.1f);
renderer.DrawImage(img, AABB2(pos.x, pos.y, size.x, size.y));
if(IsFocused) {
renderer.Color = Vector4(1.f, 1.f, 1.f, 0.2f);
renderer.ColorNP = Vector4(1.f, 1.f, 1.f, 0.2f);
}else if(hover) {
renderer.Color = Vector4(1.f, 1.f, 1.f, 0.1f);
renderer.ColorNP = Vector4(1.f, 1.f, 1.f, 0.1f);
} else {
renderer.Color = Vector4(1.f, 1.f, 1.f, 0.06f);
renderer.ColorNP = Vector4(1.f, 1.f, 1.f, 0.06f);
}
renderer.DrawImage(img, AABB2(pos.x, pos.y, size.x, 1.f));
renderer.DrawImage(img, AABB2(pos.x, pos.y + size.y - 1.f, size.x, 1.f));

View File

@ -39,7 +39,7 @@ namespace spades {
if(BackgroundColor.w > 0.f) {
Image@ img = renderer.RegisterImage("Gfx/White.tga");
renderer.Color = BackgroundColor;
renderer.ColorNP = BackgroundColor;
renderer.DrawImage(img, AABB2(pos.x, pos.y, size.x, size.y));
}
@ -182,19 +182,19 @@ namespace spades {
Vector2 size = Size;
Image@ img = renderer.RegisterImage("Gfx/White.tga");
if((Pressed && Hover) || Toggled) {
renderer.Color = Vector4(1.f, 1.f, 1.f, 0.2f);
renderer.ColorNP = Vector4(1.f, 1.f, 1.f, 0.2f);
} else if(Hover) {
renderer.Color = Vector4(1.f, 1.f, 1.f, 0.12f);
renderer.ColorNP = Vector4(1.f, 1.f, 1.f, 0.12f);
} else {
renderer.Color = Vector4(1.f, 1.f, 1.f, 0.07f);
renderer.ColorNP = Vector4(1.f, 1.f, 1.f, 0.07f);
}
renderer.DrawImage(img, AABB2(pos.x, pos.y, size.x, size.y));
if((Pressed && Hover) || Toggled) {
renderer.Color = Vector4(1.f, 1.f, 1.f, 0.1f);
renderer.ColorNP = Vector4(1.f, 1.f, 1.f, 0.1f);
} else if(Hover) {
renderer.Color = Vector4(1.f, 1.f, 1.f, 0.07f);
renderer.ColorNP = Vector4(1.f, 1.f, 1.f, 0.07f);
} else {
renderer.Color = Vector4(1.f, 1.f, 1.f, 0.03f);
renderer.ColorNP = Vector4(1.f, 1.f, 1.f, 0.03f);
}
renderer.DrawImage(img, AABB2(pos.x, pos.y, 1.f, size.y));
renderer.DrawImage(img, AABB2(pos.x, pos.y, size.x, 1.f));
@ -227,7 +227,7 @@ namespace spades {
}else if(Hover) {
color = Vector4(0.4f, 0.4f, 0.4f, 0.7f);
}
renderer.Color = color;
renderer.ColorNP = color;
DrawSliceImage(renderer, image, pos.x, pos.y, size.x, size.y, 12.f);
@ -539,7 +539,7 @@ namespace spades {
void DrawHighlight(float x, float y, float w, float h) {
Renderer@ renderer = Manager.Renderer;
renderer.Color = Vector4(1.f, 1.f, 1.f, 0.2f);
renderer.ColorNP = Vector4(1.f, 1.f, 1.f, 0.2f);
Image@ img = renderer.RegisterImage("Gfx/White.tga");
renderer.DrawImage(img, AABB2(x, y, w, h));
@ -549,7 +549,7 @@ namespace spades {
Renderer@ renderer = Manager.Renderer;
float pulse = sin(Manager.Time * 5.f);
pulse = abs(pulse);
renderer.Color = Vector4(1.f, 1.f, 1.f, pulse);
renderer.ColorNP = Vector4(1.f, 1.f, 1.f, pulse);
Image@ img = renderer.RegisterImage("Gfx/White.tga");
renderer.DrawImage(img, AABB2(x - 1.f, y, 2, h));
@ -607,15 +607,15 @@ namespace spades {
Vector2 pos = ScreenPosition;
Vector2 size = Size;
Image@ img = renderer.RegisterImage("Gfx/White.tga");
renderer.Color = Vector4(0.f, 0.f, 0.f, IsFocused ? 0.3f : 0.1f);
renderer.ColorNP = Vector4(0.f, 0.f, 0.f, IsFocused ? 0.3f : 0.1f);
renderer.DrawImage(img, AABB2(pos.x, pos.y, size.x, size.y));
if(IsFocused) {
renderer.Color = Vector4(1.f, 1.f, 1.f, 0.2f);
renderer.ColorNP = Vector4(1.f, 1.f, 1.f, 0.2f);
}else if(hover) {
renderer.Color = Vector4(1.f, 1.f, 1.f, 0.1f);
renderer.ColorNP = Vector4(1.f, 1.f, 1.f, 0.1f);
} else {
renderer.Color = Vector4(1.f, 1.f, 1.f, 0.06f);
renderer.ColorNP = Vector4(1.f, 1.f, 1.f, 0.06f);
}
renderer.DrawImage(img, AABB2(pos.x, pos.y, size.x, 1.f));
renderer.DrawImage(img, AABB2(pos.x, pos.y + size.y - 1.f, size.x, 1.f));
@ -743,11 +743,11 @@ namespace spades {
}
if(dragging) {
renderer.Color = Vector4(1.f, 1.f, 1.f, 0.4f);
renderer.ColorNP = Vector4(1.f, 1.f, 1.f, 0.4f);
} else if (hover) {
renderer.Color = Vector4(1.f, 1.f, 1.f, 0.2f);
renderer.ColorNP = Vector4(1.f, 1.f, 1.f, 0.2f);
} else {
renderer.Color = Vector4(1.f, 1.f, 1.f, 0.1f);
renderer.ColorNP = Vector4(1.f, 1.f, 1.f, 0.1f);
}
renderer.DrawImage(img, AABB2(pos.x, pos.y, size.x, size.y));
}
@ -809,11 +809,11 @@ namespace spades {
AABB2 srcRect(0.f, 0.f, image.Width, image.Height);
if(Pressed and Hover) {
r.Color = Vector4(1.f, 1.f, 1.f, 0.6f);
r.ColorNP = Vector4(1.f, 1.f, 1.f, 0.6f);
} else if (Hover) {
r.Color = Vector4(1.f, 1.f, 1.f, 0.4f);
r.ColorNP = Vector4(1.f, 1.f, 1.f, 0.4f);
} else {
r.Color = Vector4(1.f, 1.f, 1.f, 0.2f);
r.ColorNP = Vector4(1.f, 1.f, 1.f, 0.2f);
}
if(scrollBar.Orientation == spades::ui::ScrollBarOrientation::Horizontal) {
@ -1014,15 +1014,15 @@ namespace spades {
Image@ img = renderer.RegisterImage("Gfx/White.tga");
if (hover) {
renderer.Color = Vector4(1.f, 1.f, 1.f, 0.5f);
renderer.ColorNP = Vector4(1.f, 1.f, 1.f, 0.5f);
} else {
renderer.Color = Vector4(1.f, 1.f, 1.f, 0.3f);
renderer.ColorNP = Vector4(1.f, 1.f, 1.f, 0.3f);
}
renderer.DrawImage(img,
AABB2(pos.x + size.x * 0.5f - 3.f, pos.y,
6.f, size.y));
renderer.Color = Vector4(0.f, 0.f, 0.f, 0.6f);
renderer.ColorNP = Vector4(0.f, 0.f, 0.f, 0.6f);
renderer.DrawImage(img,
AABB2(pos.x + size.x * 0.5f - 2.f, pos.y + 1.f,
4.f, size.y - 2.f));
@ -1125,12 +1125,12 @@ namespace spades {
Vector2 size = Size;
Image@ img = renderer.RegisterImage("Gfx/White.tga");
renderer.Color = Vector4(1.f, 1.f, 1.f, 0.1f);
renderer.ColorNP = Vector4(1.f, 1.f, 1.f, 0.1f);
renderer.DrawImage(img,
AABB2(pos.x, pos.y + size.y * 0.5f - 3.f,
size.x, 6.f));
renderer.Color = Vector4(0.f, 0.f, 0.f, 0.2f);
renderer.ColorNP = Vector4(0.f, 0.f, 0.f, 0.2f);
renderer.DrawImage(img,
AABB2(pos.x + 1.f, pos.y + size.y * 0.5f - 2.f,
size.x - 2.f, 4.f));
@ -1347,10 +1347,10 @@ namespace spades {
Vector2 pos = ScreenPosition;
Vector2 size = Size;
Image@ img = renderer.RegisterImage("Gfx/White.tga");
renderer.Color = Vector4(0.f, 0.f, 0.f, 0.2f);
renderer.ColorNP = Vector4(0.f, 0.f, 0.f, 0.2f);
renderer.DrawImage(img, AABB2(pos.x, pos.y, size.x, size.y));
renderer.Color = Vector4(1.f, 1.f, 1.f, 0.06f);
renderer.ColorNP = Vector4(1.f, 1.f, 1.f, 0.06f);
renderer.DrawImage(img, AABB2(pos.x, pos.y, size.x, 1.f));
renderer.DrawImage(img, AABB2(pos.x, pos.y + size.y - 1.f, size.x, 1.f));
renderer.DrawImage(img, AABB2(pos.x, pos.y + 1.f, 1.f, size.y - 2.f));

View File

@ -720,7 +720,7 @@ namespace spades {
void Render(Vector2 pos) {
Renderer@ renderer = manager.Renderer;
renderer.Color = Vector4(1.f, 1.f, 1.f, 1.f);
renderer.ColorNP = Vector4(1.f, 1.f, 1.f, 1.f);
renderer.DrawImage(image, Vector2(pos.x - hotSpot.x, pos.y - hotSpot.y));
}
}

View File

@ -60,11 +60,31 @@ namespace spades {
set {}
}
/** Sets a color that is used for drawing. */
/** Sets a color that is used for drawing.
* @deprecated Do not use this virtual property.
* Some methods treat this value as an alpha premultiplied,
* while others treat this value has a straight alpha. */
Vector4 Color {
set { }
}
/** Sets a opaque color that is used for drawing. */
Vector3 ColorOpaque {
set { }
}
/** Sets a color that is used for drawing. The color value is
* alpha premultiplied. */
Vector4 ColorP {
set { }
}
/** Sets a color that is used for drawing. The color value is
* alpha non-premultiplied (straight alpha). */
Vector4 ColorNP {
set { }
}
/** Starts a 3D scene rendering. */
void StartScene(const SceneDefinition@) {}

View File

@ -214,7 +214,7 @@ namespace spades {
}
void Draw2D() {
renderer.Color = (Vector4(1.f, 1.f, 1.f, 1.f));
renderer.ColorNP = (Vector4(1.f, 1.f, 1.f, 1.f));
renderer.DrawImage(sightImage,
Vector2((renderer.ScreenWidth - sightImage.Width) * 0.5f,
(renderer.ScreenHeight - sightImage.Height) * 0.5f));

View File

@ -127,7 +127,7 @@
}
void Draw2D() {
renderer.Color = (Vector4(1.f, 1.f, 1.f, 1.f));
renderer.ColorNP = (Vector4(1.f, 1.f, 1.f, 1.f));
renderer.DrawImage(sightImage,
Vector2((renderer.ScreenWidth - sightImage.Width) * 0.5f,
(renderer.ScreenHeight - sightImage.Height) * 0.5f));

View File

@ -159,7 +159,7 @@
}
void Draw2D() {
renderer.Color = (Vector4(1.f, 1.f, 1.f, 1.f));
renderer.ColorNP = (Vector4(1.f, 1.f, 1.f, 1.f));
renderer.DrawImage(sightImage,
Vector2((renderer.ScreenWidth - sightImage.Width) * 0.5f,
(renderer.ScreenHeight - sightImage.Height) * 0.5f));

View File

@ -173,7 +173,7 @@
}
void Draw2D() {
renderer.Color = (Vector4(1.f, 1.f, 1.f, 1.f));
renderer.ColorNP = (Vector4(1.f, 1.f, 1.f, 1.f));
renderer.DrawImage(sightImage,
Vector2((renderer.ScreenWidth - sightImage.Width) * 0.5f,
(renderer.ScreenHeight - sightImage.Height) * 0.5f));

View File

@ -26,6 +26,7 @@ varying vec2 texCoord;
void main() {
gl_FragColor = texture2D(texture, texCoord);
gl_FragColor.xyz *= gl_FragColor.w; // alpha premultiply
gl_FragColor *= color;
}

View File

@ -154,6 +154,13 @@ namespace spades {
r->SetColor(v);
}
};
class SetColorAlphaPremultiplied: public Command {
public:
Vector4 v;
virtual void Execute(IRenderer *r){
r->SetColorAlphaPremultiplied(v);
}
};
class DrawImage: public Command {
public:
IImage *img;
@ -536,6 +543,12 @@ namespace spades {
cmd->v = c;
}
void AsyncRenderer::SetColorAlphaPremultiplied(Vector4 c) {
SPADES_MARK_FUNCTION();
rcmds::SetColorAlphaPremultiplied *cmd = generator->AllocCommand<rcmds::SetColorAlphaPremultiplied>();
cmd->v = c;
}
void AsyncRenderer::DrawImage(client::IImage *image,
const spades::Vector2 &outTopLeft) {
SPADES_MARK_FUNCTION();

View File

@ -83,6 +83,7 @@ namespace spades {
/** Sets color for image drawing. */
virtual void SetColor(Vector4);
virtual void SetColorAlphaPremultiplied(Vector4);
virtual void DrawImage(IImage *, const Vector2& outTopLeft);
virtual void DrawImage(IImage *, const AABB2& outRect);

View File

@ -2102,11 +2102,11 @@ namespace spades {
renderer->ScreenHeight()};
renderer->SetColor(MakeVector4(0, 0, 0, 1));
renderer->SetColorAlphaPremultiplied(MakeVector4(0, 0, 0, 1));
img = renderer->RegisterImage("Gfx/White.tga");
renderer->DrawImage(img, AABB2(0, 0, siz.x, siz.y));
renderer->SetColor(MakeVector4(1, 1, 1, 1.));
renderer->SetColorAlphaPremultiplied(MakeVector4(1, 1, 1, 1.));
img = renderer->RegisterImage("Gfx/Title/Logo.png");
siz = MakeVector2(img->GetWidth(), img->GetHeight());
@ -2125,7 +2125,7 @@ namespace spades {
Vector2 scrSize = {renderer->ScreenWidth(),
renderer->ScreenHeight()};
renderer->SetColor(MakeVector4(0, 0, 0, 1.));
renderer->SetColorAlphaPremultiplied(MakeVector4(0, 0, 0, 1.));
img = renderer->RegisterImage("Gfx/White.tga");
renderer->DrawImage(img, AABB2(0, 0,
scrSize.x, scrSize.y));
@ -2175,7 +2175,7 @@ namespace spades {
Vector2 v2 = base + centVect + sideVect2;
Vector2 v3 = base + sideVect1;
renderer->SetColor(MakeVector4(0.f, 0.f, 0.f, alpha));
renderer->SetColorAlphaPremultiplied(MakeVector4(0.f, 0.f, 0.f, alpha));
renderer->DrawImage(img,
v1, v2, v3,
AABB2(0, 8.f, img->GetWidth(), img->GetHeight()));
@ -2213,7 +2213,7 @@ namespace spades {
per = 1.f - per;
Vector3 color = {1.f, per, per};
renderer->MultiplyScreenColor(color);
renderer->SetColor(MakeVector4(1,0,0,(1.f - per) * .1f));
renderer->SetColorAlphaPremultiplied(MakeVector4((1.f - per) * .1f,0,0,(1.f - per) * .1f));
renderer->DrawImage(renderer->RegisterImage("Gfx/White.tga"),
AABB2(0, 0, scrWidth, scrHeight));
}
@ -2291,7 +2291,7 @@ namespace spades {
p2.x += (int)ceilf(boundary.max.x);
p2.y += (int)ceilf(boundary.max.y);
renderer->SetColor(MakeVector4(0,0,0,1));
renderer->SetColorAlphaPremultiplied(MakeVector4(0,0,0,1));
renderer->DrawImage(img, AABB2(p1.x - 2, p1.y - 2,
p2.x - p1.x + 4, 1));
renderer->DrawImage(img, AABB2(p1.x - 2, p1.y - 2,
@ -2301,7 +2301,7 @@ namespace spades {
renderer->DrawImage(img, AABB2(p2.x + 1, p1.y - 2,
1, p2.y - p1.y + 4));
renderer->SetColor(MakeVector4(1,1,1,1));
renderer->SetColorAlphaPremultiplied(MakeVector4(1,1,1,1));
renderer->DrawImage(img, AABB2(p1.x - 1, p1.y - 1,
p2.x - p1.x + 2, 1));
renderer->DrawImage(img, AABB2(p1.x - 1, p1.y - 1,
@ -2353,9 +2353,9 @@ namespace spades {
float y = scrHeight - 16.f - iconHeight;
if(clip >= i + 1){
renderer->SetColor(MakeVector4(1,1,1,1));
renderer->SetColorAlphaPremultiplied(MakeVector4(1,1,1,1));
}else{
renderer->SetColor(MakeVector4(0.4,0.4,0.4,1));
renderer->SetColorAlphaPremultiplied(MakeVector4(0.4,0.4,0.4,1));
}
renderer->DrawImage(ammoIcon,
@ -2563,7 +2563,7 @@ namespace spades {
p = p / (float)M_PI + 0.5f;
float op = p * (1.f - p) * 4.f;
renderer->SetColor(MakeVector4(1.f, 1.f, 1.f, op));
renderer->SetColorAlphaPremultiplied(MakeVector4(op, op, op, op));
renderer->DrawImage(img, AABB2(scrWidth - 236.f + p * 234.f, scrHeight - 18.f, 4.f, 4.f));
}

View File

@ -402,7 +402,7 @@ namespace spades {
renderer->AddLight(light);
// add glare
renderer->SetColor(MakeVector4(1, .7f, .5f, 0) * brightness * .3f);
renderer->SetColorAlphaPremultiplied(MakeVector4(1, .7f, .5f, 0) * brightness * .3f);
renderer->AddSprite(renderer->RegisterImage("Gfx/Glare.tga"), (eyeMatrix * MakeVector3(0, 0.3f, -0.3f)).GetXYZ(), .8f, 0.f);
}
@ -757,7 +757,7 @@ namespace spades {
// debug
if(false){
Handle<IImage> img = renderer->RegisterImage("Gfx/Ball.png");
renderer->SetColor(MakeVector4(1, 0, 0, 0));
renderer->SetColorAlphaPremultiplied(MakeVector4(1, 0, 0, 0));
renderer->AddLongSprite(img, lastSceneDef.viewOrigin + MakeVector3(0, 0, 1), p->GetOrigin(), 0.5f);
}

View File

@ -100,8 +100,8 @@ namespace spades {
float fade = item.fade * 2.f;
if(fade > 1.f)fade = 1.f;
Vector4 color = {1,1,1,fade};
renderer->SetColor(color);
Vector4 color = {fade,fade,fade,fade};
renderer->SetColorAlphaPremultiplied(color);
Vector3 dir = -item.dir;
float c = dir.x * playerFront.x + dir.y * playerFront.y;

View File

@ -108,9 +108,15 @@ namespace spades {
virtual void MultiplyScreenColor(Vector3) = 0;
/** Sets color for image drawing. */
/** Sets color for image drawing. Deprecated because
* some methods treats this as an alpha premultiplied, while
* others treats this as an alpha non-premultiplied.
* @deprecated */
virtual void SetColor(Vector4) = 0;
/** Sets color for image drawing. Always alpha premultiplied. */
virtual void SetColorAlphaPremultiplied(Vector4) = 0;
virtual void DrawImage(IImage *, const Vector2& outTopLeft) = 0;
virtual void DrawImage(IImage *, const AABB2& outRect) = 0;
virtual void DrawImage(IImage *, const Vector2& outTopLeft, const AABB2& inRect) = 0;

View File

@ -220,14 +220,14 @@ namespace spades{
Vector4 ringColor = {0, 0, 0, 0};
if(item.hover){
fillColor = MakeVector4(.4f, .4f, .4f, .7f);
ringColor = MakeVector4(.8f, .8f, .8f, .7f);
fillColor = MakeVector4(.4f, .4f, .4f, 1.f) * .7f;
ringColor = MakeVector4(.8f, .8f, .8f, 1.f) * .7f;
}
if(selected){
fillColor = MakeVector4(.7f, .7f, .7f, .9f);
fillColor = MakeVector4(.7f, .7f, .7f, 1.f) * .9f;
}
renderer->SetColor(fillColor);
renderer->SetColorAlphaPremultiplied(fillColor);
if(item.type == MenuSpawn){
renderer->DrawImage(menuItemBigImage, item.rect);
@ -263,7 +263,7 @@ namespace spades{
Handle<IImage> cursor = renderer->RegisterImage("Gfx/Limbo/Cursor.tga");
renderer->SetColor(MakeVector4(1, 1, 1, 1));
renderer->SetColorAlphaPremultiplied(MakeVector4(1, 1, 1, 1));
renderer->DrawImage(cursor, AABB2(cursorPos.x - 8,
cursorPos.y - 8,
32, 32));

View File

@ -222,7 +222,7 @@ namespace spades {
Vector2 scrSize = {renderer->ScreenWidth(),
renderer->ScreenHeight()};
float size = std::max(scrSize.x, scrSize.y);
renderer->SetColor(MakeVector4(0, 0, 0,alpha * .5f));
renderer->SetColorAlphaPremultiplied(MakeVector4(0, 0, 0,alpha * .5f));
renderer->DrawImage(bg,
AABB2((scrSize.x - size) * .5f,
(scrSize.y - size) * .5f,
@ -242,7 +242,7 @@ namespace spades {
}
borderRect = borderRect.Inflate(borderWidth - 8.f);
renderer->SetColor(MakeVector4(1,1,1,alpha));
renderer->SetColorAlphaPremultiplied(MakeVector4(alpha,alpha,alpha,alpha));
renderer->DrawImage(border,
AABB2(borderRect.GetMinX()-16,
borderRect.GetMinY()-16,
@ -285,7 +285,7 @@ namespace spades {
AABB2(16, 16, 16, 0));
// draw map
renderer->SetColor(MakeVector4(1,1,1,alpha));
renderer->SetColorAlphaPremultiplied(MakeVector4(alpha,alpha,alpha,alpha));
renderer->DrawFlatGameMap(outRect, inRect);
this->inRect = inRect;
@ -293,7 +293,7 @@ namespace spades {
// draw grid
renderer->SetColor(MakeVector4(0,0,0,0.8f*alpha));
renderer->SetColorAlphaPremultiplied(MakeVector4(0,0,0,0.8f*alpha));
Handle<IImage> dashLine = renderer->RegisterImage("Gfx/DashLine.tga");
for(float x = 64.f; x < map->Width(); x += 64.f){
float wx = (x - inRect.GetMinX()) / inRect.GetWidth();
@ -317,7 +317,7 @@ namespace spades {
}
// draw grid label
renderer->SetColor(MakeVector4(1,1,1,0.8f*alpha));
renderer->SetColorAlphaPremultiplied(MakeVector4(1,1,1,1)*(0.8f*alpha));
Handle<IImage> mapFont = renderer->RegisterImage("Gfx/Fonts/MapFont.tga");
for(int i = 0; i < 8; i++){
float startX = (float)i * 64.f;
@ -328,7 +328,7 @@ namespace spades {
float fade = std::min((std::min(endX, inRect.GetMaxX()) -
std::max(startX, inRect.GetMinX())) /
(endX - startX) * 2.f, 1.f);
renderer->SetColor(MakeVector4(1,1,1,fade * .8f * alpha));
renderer->SetColorAlphaPremultiplied(MakeVector4(1,1,1,1)*(fade * .8f * alpha));
float center = std::max(startX, inRect.GetMinX());
center = .5f * (center + std::min(endX, inRect.GetMaxX()));
@ -352,7 +352,7 @@ namespace spades {
float fade = std::min((std::min(endY, inRect.GetMaxY()) -
std::max(startY, inRect.GetMinY())) /
(endY - startY) * 2.f, 1.f);
renderer->SetColor(MakeVector4(1,1,1,fade * .8f * alpha));
renderer->SetColorAlphaPremultiplied(MakeVector4(1,1,1,1)*(fade * .8f * alpha));
float center = std::max(startY, inRect.GetMinY());
center = .5f * (center + std::min(endY, inRect.GetMaxY()));
@ -375,7 +375,8 @@ namespace spades {
IntVector3 teamColor = world->GetTeam(world->GetLocalPlayer()->GetTeamId()).color;
Vector4 teamColorF = {teamColor.x /255.f,
teamColor.y / 255.f, teamColor.z / 255.f, alpha};
teamColor.y / 255.f, teamColor.z / 255.f, 1};
teamColorF *= alpha;
for(int i = 0; i < world->GetNumPlayerSlots(); i++){
Player * p = world->GetPlayer(i);
if(p == NULL ||
@ -390,9 +391,9 @@ namespace spades {
}
if(p == world->GetLocalPlayer())
renderer->SetColor(MakeVector4(0,1,1,alpha));
renderer->SetColorAlphaPremultiplied(MakeVector4(0,alpha,alpha,alpha));
else{
renderer->SetColor(teamColorF);
renderer->SetColorAlphaPremultiplied(teamColorF);
}
DrawIcon(player->GetTeamId() >= 2 ?
client->followPos :
@ -410,19 +411,20 @@ namespace spades {
CTFGameMode::Team& team = ctf->GetTeam(tId);
IntVector3 teamColor = world->GetTeam(tId).color;
Vector4 teamColorF = {teamColor.x /255.f,
teamColor.y / 255.f, teamColor.z / 255.f, alpha};
teamColor.y / 255.f, teamColor.z / 255.f, 1};
teamColorF *= alpha;
// draw base
renderer->SetColor(teamColorF);
renderer->SetColorAlphaPremultiplied(teamColorF);
DrawIcon(team.basePos, baseIcon, 0.f);
renderer->SetColor(MakeVector4(1,1,1,alpha));
renderer->SetColorAlphaPremultiplied(MakeVector4(alpha,alpha,alpha,alpha));
DrawIcon(team.basePos, medicalIcon, 0.f);
// draw flag
if(!ctf->GetTeam(1-tId).hasIntel){
renderer->SetColor(teamColorF);
renderer->SetColorAlphaPremultiplied(teamColorF);
DrawIcon(team.flagPos, intelIcon, 0.f);
}else if(world->GetLocalPlayer()->GetTeamId() == 1-tId){
// local player's team is carrying
@ -435,8 +437,8 @@ namespace spades {
world->GetLocalPlayer()->GetTeamId()){
Vector4 col = teamColorF;
col.w = fabsf(sinf(world->GetTime() * 4.f));
renderer->SetColor(col);
col *= fabsf(sinf(world->GetTime() * 4.f));
renderer->SetColorAlphaPremultiplied(col);
DrawIcon(carrier->GetPosition(), intelIcon, 0.f);
}
}
@ -453,10 +455,11 @@ namespace spades {
teamColor = world->GetTeam(t->ownerTeamId).color;
}
Vector4 teamColorF = {teamColor.x /255.f,
teamColor.y / 255.f, teamColor.z / 255.f, alpha};
teamColor.y / 255.f, teamColor.z / 255.f, 1};
teamColorF *= alpha;
// draw base
renderer->SetColor(teamColorF);
renderer->SetColorAlphaPremultiplied(teamColorF);
DrawIcon(t->pos, icon, 0.f);
}

View File

@ -182,7 +182,7 @@ namespace spades {
float x = scrW - 100.f + 10.f * col;
float y = scrH - 96.f + 10.f * row - 40.f;
renderer->SetColor(cl);
renderer->SetColorAlphaPremultiplied(cl);
if(selected){
renderer->DrawImage(img,
MakeVector2(x, y),
@ -193,7 +193,7 @@ namespace spades {
AABB2(0, 0, 16, 16));
}
renderer->SetColor(MakeVector4(1, 1, 1, 1));
renderer->SetColorAlphaPremultiplied(MakeVector4(1, 1, 1, 1));
if(selected){
renderer->DrawImage(img,
MakeVector2(x, y),

View File

@ -163,7 +163,7 @@ namespace spades {
if(additive)
col.w = 0.f;
renderer->SetColor(col);
renderer->SetColorAlphaPremultiplied(col);
renderer->AddSprite(image,
position,
radius,

View File

@ -100,7 +100,10 @@ namespace spades {
offset.y = floorf(offset.y);
}
renderer->SetColor(color);
float a = color.w;
color.w = 1.f;
color *= a;
renderer->SetColorAlphaPremultiplied(color);
for(size_t i = 0; i < txt.size(); i++){
int ch = ((int)txt[i]) & 127;

View File

@ -114,10 +114,10 @@ namespace spades {
// draw shadow
image = renderer->RegisterImage("Gfx/Scoreboard/TopShadow.tga");
size.y = 32.f;
renderer->SetColor(MakeVector4(0,0,0,0.2f));
renderer->SetColorAlphaPremultiplied(MakeVector4(0,0,0,0.2f));
renderer->DrawImage(image, AABB2(0, teamBarTop-size.y,
scrWidth, size.y));
renderer->SetColor(MakeVector4(0,0,0,0.2f));
renderer->SetColorAlphaPremultiplied(MakeVector4(0,0,0,0.2f));
renderer->DrawImage(image, AABB2(0, playersBottom + size.y,
scrWidth, -size.y));
@ -126,7 +126,7 @@ namespace spades {
size = MakeVector2(180.f, 32.f);
pos = MakeVector2((scrWidth - size.x) * .5f,
teamBarTop - size.y);
renderer->SetColor(MakeVector4(1.f, .45f, .2f, 1.f));
renderer->SetColorAlphaPremultiplied(MakeVector4(1.f, .45f, .2f, 1.f));
renderer->DrawImage(image, AABB2(pos.x,pos.y,size.x,size.y));
pos.y = pos.y + 5.f;
@ -155,11 +155,11 @@ namespace spades {
// draw team bar
image = whiteImage;
renderer->SetColor(AdjustColor(GetTeamColor(0), 0.8f, 0.3f));
renderer->SetColorAlphaPremultiplied(AdjustColor(GetTeamColor(0), 0.8f, 0.3f));
renderer->DrawImage(image,
AABB2(0, teamBarTop,
scrWidth * .5f, teamBarHeight));
renderer->SetColor(AdjustColor(GetTeamColor(1), 0.8f, 0.3f));
renderer->SetColorAlphaPremultiplied(AdjustColor(GetTeamColor(1), 0.8f, 0.3f));
renderer->DrawImage(image,
AABB2(scrWidth * .5f, teamBarTop,
scrWidth * .5f, teamBarHeight));
@ -191,7 +191,7 @@ namespace spades {
// players background
image = renderer->RegisterImage("Gfx/Scoreboard/PlayersBg.tga");
renderer->SetColor(MakeVector4(0, 0, 0, 1.f));
renderer->SetColorAlphaPremultiplied(MakeVector4(0, 0, 0, 1.f));
renderer->DrawImage(image,
AABB2(0, playersTop,
scrWidth, playersHeight));

View File

@ -121,10 +121,10 @@ namespace spades {
float y = scrH * 0.7f;
if(nearTerritory->ownerTeamId == 2){
renderer->SetColor(MakeVector4(1, 1, 1, fade));
renderer->SetColorAlphaPremultiplied(MakeVector4(fade, fade, fade, fade));
}else{
IntVector3 c = w->GetTeam(nearTerritory->ownerTeamId).color;
renderer->SetColor(MakeVector4(c.x/255.f, c.y/255.f, c.z/255.f, fade));
renderer->SetColorAlphaPremultiplied(MakeVector4(c.x/255.f, c.y/255.f, c.z/255.f, 1) * fade);
}
renderer->DrawImage(prgBg, MakeVector2(x,y));
@ -133,7 +133,7 @@ namespace spades {
if(state.team1 != 2){
IntVector3 c = w->GetTeam(state.team1).color;
renderer->SetColor(MakeVector4(c.x/255.f, c.y/255.f, c.z/255.f, fade*.8f));
renderer->SetColorAlphaPremultiplied(MakeVector4(c.x/255.f, c.y/255.f, c.z/255.f, 1) * (fade * 0.8f));
renderer->DrawImage(prgBar, MakeVector2(x, y),
AABB2(0,0,
(1.f-state.progress)*256.f,32));
@ -141,7 +141,7 @@ namespace spades {
if(state.team2 != 2){
IntVector3 c = w->GetTeam(state.team2).color;
renderer->SetColor(MakeVector4(c.x/255.f, c.y/255.f, c.z/255.f, fade*.8f));
renderer->SetColorAlphaPremultiplied(MakeVector4(c.x/255.f, c.y/255.f, c.z/255.f, 1) * (fade * 0.8f));
renderer->DrawImage(prgBar, MakeVector2(x+
(1.f-state.progress)*256.f, y),
AABB2((1.f-state.progress)*256.f,0,

View File

@ -56,7 +56,7 @@ namespace spades {
Vector3 pos2 = startPos + dir * endDist;
IRenderer *r = client->GetRenderer();
Vector4 col = {1.f, .6f, .2f, 0.f};
r->SetColor(col * 1.3f);
r->SetColorAlphaPremultiplied(col * 1.3f);
r->AddLongSprite(image, pos1, pos2, .05f);
}

View File

@ -125,7 +125,7 @@ namespace spades {
smoothedFogColor = MakeVector3(-1.f, -1.f, -1.f);
// ready for 2d draw
device->BlendFunc(IGLDevice::SrcAlpha,
device->BlendFunc(IGLDevice::One,
IGLDevice::OneMinusSrcAlpha);
device->Enable(IGLDevice::Blend, true);
@ -547,7 +547,7 @@ namespace spades {
EnsureSceneStarted();
spriteRenderer->Add(im, center, radius, rotation,
drawColor);
drawColorAlphaPremultiplied);
}
void GLRenderer::AddLongSprite(client::IImage *img,
@ -563,7 +563,7 @@ namespace spades {
EnsureSceneStarted();
longSpriteRenderer->Add(im, p1, p2,
radius, drawColor);
radius, drawColorAlphaPremultiplied);
}
#pragma mark - Scene Finalizer
@ -961,7 +961,7 @@ namespace spades {
handle.GetWidth(),
handle.GetHeight(),
false), false);
SetColor(MakeVector4(1, 1, 1, 1));
SetColorAlphaPremultiplied(MakeVector4(1, 1, 1, 1));
DrawImage(image, AABB2(0,handle.GetHeight(),handle.GetWidth(),-handle.GetHeight()));
imageRenderer->Flush();
}
@ -975,6 +975,7 @@ namespace spades {
modelRenderer->Clear();
// prepare for 2d drawing
device->BlendFunc(IGLDevice::One, IGLDevice::OneMinusSrcAlpha);
device->Enable(IGLDevice::Blend, true);
}
@ -1036,7 +1037,7 @@ namespace spades {
device->EnableVertexAttribArray(positionAttribute(), false);
device->EnableVertexAttribArray(colorAttribute(), false);
device->BlendFunc(IGLDevice::SrcAlpha,
device->BlendFunc(IGLDevice::One,
IGLDevice::OneMinusSrcAlpha);
}
@ -1107,6 +1108,15 @@ namespace spades {
imageRenderer->SetImage(img);
Vector4 col = drawColorAlphaPremultiplied;
if(legacyColorPremultiply) {
// in legacy mode, image color is
// non alpha-premultiplied.
col.x *= col.w;
col.y *= col.w;
col.z *= col.w;
}
imageRenderer->Add(outTopLeft.x, outTopLeft.y,
outTopRight.x, outTopRight.y,
outBottomRight.x, outBottomRight.y,
@ -1115,8 +1125,8 @@ namespace spades {
inRect.GetMaxX(), inRect.GetMinY(),
inRect.GetMaxX(), inRect.GetMaxY(),
inRect.GetMinX(), inRect.GetMaxY(),
drawColor.x, drawColor.y,
drawColor.z, drawColor.w);
col.x, col.y,
col.z, col.w);
}
@ -1128,7 +1138,13 @@ namespace spades {
}
void GLRenderer::SetColor(spades::Vector4 col){
drawColor = col;
drawColorAlphaPremultiplied = col;
legacyColorPremultiply = true;
}
void GLRenderer::SetColorAlphaPremultiplied(spades::Vector4 col){
legacyColorPremultiply = false;
drawColorAlphaPremultiplied = col;
}
void GLRenderer::FrameDone() {
@ -1154,7 +1170,7 @@ namespace spades {
device,
w,h,
false), false);
SetColor(MakeVector4(1, 1, 1, 1));
SetColorAlphaPremultiplied(MakeVector4(1, 1, 1, 1));
DrawImage(image, AABB2(0,h,w,-h));
imageRenderer->Flush(); // must flush now because handle is released soon
}
@ -1162,7 +1178,7 @@ namespace spades {
lastTime = sceneDef.time;
// ready for 2d draw of next frame
device->BlendFunc(IGLDevice::SrcAlpha,
device->BlendFunc(IGLDevice::One,
IGLDevice::OneMinusSrcAlpha);
device->Enable(IGLDevice::Blend, true);

View File

@ -109,7 +109,8 @@ namespace spades {
Matrix4 projectionViewMatrix;
bool renderingMirror;
Vector4 drawColor;
Vector4 drawColorAlphaPremultiplied;
bool legacyColorPremultiply;
unsigned int lastTime;
@ -171,6 +172,7 @@ namespace spades {
virtual void MultiplyScreenColor(Vector3);
virtual void SetColor(Vector4);
virtual void SetColorAlphaPremultiplied(Vector4);
virtual void DrawImage(client::IImage *, const Vector2& outTopLeft);
virtual void DrawImage(client::IImage *, const AABB2& outRect);

View File

@ -143,7 +143,7 @@ namespace spades {
Vector2 scrSize = {renderer->ScreenWidth(),
renderer->ScreenHeight()};
renderer->SetColor(MakeVector4(0, 0, 0, 1.));
renderer->SetColorAlphaPremultiplied(MakeVector4(0, 0, 0, 1.));
img = renderer->RegisterImage("Gfx/White.tga");
renderer->DrawImage(img, AABB2(0, 0,
scrSize.x, scrSize.y));

View File

@ -88,13 +88,38 @@ namespace spades {
}
}
static void SetColor(const Vector4& v,
IRenderer *r){
IRenderer *r){
try{
return r->SetColor(v);
}catch(const std::exception& ex) {
ScriptContextUtils().SetNativeException(ex);
}
}
static void SetColorOpaque(const Vector3& v,
IRenderer *r){
try{
return r->SetColorAlphaPremultiplied(MakeVector4(v.x,v.y,v.z,1.f));
}catch(const std::exception& ex) {
ScriptContextUtils().SetNativeException(ex);
}
}
static void SetColorAlphaPremultiplied(const Vector4& v,
IRenderer *r){
try{
return r->SetColorAlphaPremultiplied(v);
}catch(const std::exception& ex) {
ScriptContextUtils().SetNativeException(ex);
}
}
static void SetColorAlphaNonPremultiplied(const Vector4& v,
IRenderer *r){
Vector4 v2 = {v.x * v.w, v.y * v.w, v.z * v.w, v.w};
try{
return r->SetColorAlphaPremultiplied(v2);
}catch(const std::exception& ex) {
ScriptContextUtils().SetNativeException(ex);
}
}
static void SetFogColor(const Vector3& v,
IRenderer *r){
@ -426,6 +451,21 @@ namespace spades {
asFUNCTION(SetColor),
asCALL_CDECL_OBJLAST);
manager->CheckError(r);
r = eng->RegisterObjectMethod("Renderer",
"void set_ColorOpaque(const Vector3&in)",
asFUNCTION(SetColorOpaque),
asCALL_CDECL_OBJLAST);
manager->CheckError(r);
r = eng->RegisterObjectMethod("Renderer",
"void set_ColorP(const Vector4&in)",
asFUNCTION(SetColorAlphaPremultiplied),
asCALL_CDECL_OBJLAST);
manager->CheckError(r);
r = eng->RegisterObjectMethod("Renderer",
"void set_ColorNP(const Vector4&in)",
asFUNCTION(SetColorAlphaNonPremultiplied),
asCALL_CDECL_OBJLAST);
manager->CheckError(r);
r = eng->RegisterObjectMethod("Renderer",
"void DrawImage(Image@, const Vector2& in)",
asMETHODPR(IRenderer, DrawImage,