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:
parent
8996336063
commit
ca88537a6b
@ -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));
|
||||
|
||||
|
@ -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,
|
||||
|
@ -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));
|
||||
|
@ -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));
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
@ -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@) {}
|
||||
|
||||
|
@ -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));
|
||||
|
@ -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));
|
||||
|
@ -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));
|
||||
|
@ -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));
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
|
@ -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));
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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));
|
||||
|
@ -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);
|
||||
|
||||
}
|
||||
|
@ -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),
|
||||
|
@ -163,7 +163,7 @@ namespace spades {
|
||||
if(additive)
|
||||
col.w = 0.f;
|
||||
|
||||
renderer->SetColor(col);
|
||||
renderer->SetColorAlphaPremultiplied(col);
|
||||
renderer->AddSprite(image,
|
||||
position,
|
||||
radius,
|
||||
|
@ -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;
|
||||
|
@ -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));
|
||||
|
@ -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,
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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));
|
||||
|
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user