77 lines
2.2 KiB
D
77 lines
2.2 KiB
D
module otya.smilebasic.fade;
|
|
import otya.smilebasic.petitcomputer;
|
|
import derelict.opengl3.gl;
|
|
|
|
class Fade
|
|
{
|
|
PetitComputer petitcom;
|
|
int display;
|
|
public this(PetitComputer p, int display)
|
|
{
|
|
petitcom = p;
|
|
this.display = display;
|
|
fade(0);
|
|
}
|
|
int color;
|
|
int start;
|
|
int startColor;
|
|
int end;
|
|
int endColor;
|
|
public void fade(int color)
|
|
{
|
|
this.color = color;
|
|
end = -1;
|
|
start = -1;
|
|
}
|
|
public void fade(int color, int time)
|
|
{
|
|
this.startColor = this.color;
|
|
this.endColor = color;
|
|
this.start = petitcom.maincntRender;
|
|
this.end = this.start + time;
|
|
}
|
|
public int fade()
|
|
{
|
|
return color;
|
|
}
|
|
Tt linear(Tx, Tt)(Tx x1, Tx x2, Tt t)
|
|
{
|
|
return (x2 - x1) / t;
|
|
}
|
|
void render()
|
|
{
|
|
auto m = petitcom.maincntRender;
|
|
ubyte a, r, g, b;
|
|
petitcom.RGBRead(color, r, g, b, a);
|
|
if (m <= end)
|
|
{
|
|
int a1, r1, g1, b1, a2, r2, g2, b2;
|
|
petitcom.RGBRead(startColor, r1, g1, b1, a1);
|
|
petitcom.RGBRead(endColor, r2, g2, b2, a2);
|
|
auto t1 = m - start;
|
|
auto t2 = end - start;
|
|
a = cast(ubyte)(a1 + (linear(a1, a2, cast(double)t2) * t1));
|
|
r = cast(ubyte)(r1 + (linear(r1, r2, cast(double)t2) * t1));
|
|
g = cast(ubyte)(g1 + (linear(g1, g2, cast(double)t2) * t1));
|
|
b = cast(ubyte)(b1 + (linear(b1, b2, cast(double)t2) * t1));
|
|
color = petitcom.RGB(a, r, g, b);
|
|
}
|
|
if (!a)
|
|
return;
|
|
petitcom.chRenderingDisplay(display);
|
|
glEnable(GL_BLEND);
|
|
glDisable(GL_DEPTH_TEST);
|
|
glDepthMask(GL_FALSE);
|
|
glColor4ub(r, g, b, a);
|
|
glDisable(GL_TEXTURE_2D);
|
|
glBegin(GL_QUADS);
|
|
glVertex2i(0, 0);
|
|
glVertex2i(petitcom.currentDisplay.rect[display].w, 0);
|
|
glVertex2i(petitcom.currentDisplay.rect[display].w, petitcom.currentDisplay.rect[display].h);
|
|
glVertex2i(0, petitcom.currentDisplay.rect[display].h);
|
|
glEnd();
|
|
glDepthMask(GL_TRUE);
|
|
glEnable(GL_DEPTH_TEST);
|
|
glDisable(GL_BLEND);
|
|
}
|
|
} |