mirror of
https://github.com/ZDoom/qzdoom-gpl.git
synced 2024-11-29 15:12:11 +00:00
Capped sky rendering
This commit is contained in:
parent
ff063a33b5
commit
dbacb75617
6 changed files with 56 additions and 28 deletions
|
@ -107,6 +107,7 @@ extern "C"
|
||||||
void TriDrawNormal8_11_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
void TriDrawNormal8_11_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
void TriDrawNormal8_12_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
void TriDrawNormal8_12_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
void TriDrawNormal8_13_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
void TriDrawNormal8_13_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
|
void TriDrawNormal8_14_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
void TriDrawNormal32_0_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
void TriDrawNormal32_0_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
void TriDrawNormal32_1_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
void TriDrawNormal32_1_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
void TriDrawNormal32_2_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
void TriDrawNormal32_2_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
|
@ -121,6 +122,7 @@ extern "C"
|
||||||
void TriDrawNormal32_11_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
void TriDrawNormal32_11_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
void TriDrawNormal32_12_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
void TriDrawNormal32_12_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
void TriDrawNormal32_13_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
void TriDrawNormal32_13_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
|
void TriDrawNormal32_14_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
void TriFillNormal8_0_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
void TriFillNormal8_0_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
void TriFillNormal8_1_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
void TriFillNormal8_1_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
void TriFillNormal8_2_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
void TriFillNormal8_2_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
|
@ -135,6 +137,7 @@ extern "C"
|
||||||
void TriFillNormal8_11_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
void TriFillNormal8_11_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
void TriFillNormal8_12_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
void TriFillNormal8_12_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
void TriFillNormal8_13_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
void TriFillNormal8_13_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
|
void TriFillNormal8_14_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
void TriFillNormal32_0_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
void TriFillNormal32_0_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
void TriFillNormal32_1_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
void TriFillNormal32_1_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
void TriFillNormal32_2_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
void TriFillNormal32_2_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
|
@ -149,6 +152,7 @@ extern "C"
|
||||||
void TriFillNormal32_11_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
void TriFillNormal32_11_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
void TriFillNormal32_12_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
void TriFillNormal32_12_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
void TriFillNormal32_13_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
void TriFillNormal32_13_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
|
void TriFillNormal32_14_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
void TriDrawSubsector8_0_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
void TriDrawSubsector8_0_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
void TriDrawSubsector8_1_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
void TriDrawSubsector8_1_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
void TriDrawSubsector8_2_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
void TriDrawSubsector8_2_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
|
@ -163,6 +167,7 @@ extern "C"
|
||||||
void TriDrawSubsector8_11_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
void TriDrawSubsector8_11_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
void TriDrawSubsector8_12_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
void TriDrawSubsector8_12_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
void TriDrawSubsector8_13_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
void TriDrawSubsector8_13_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
|
void TriDrawSubsector8_14_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
void TriDrawSubsector32_0_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
void TriDrawSubsector32_0_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
void TriDrawSubsector32_1_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
void TriDrawSubsector32_1_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
void TriDrawSubsector32_2_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
void TriDrawSubsector32_2_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
|
@ -177,6 +182,7 @@ extern "C"
|
||||||
void TriDrawSubsector32_11_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
void TriDrawSubsector32_11_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
void TriDrawSubsector32_12_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
void TriDrawSubsector32_12_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
void TriDrawSubsector32_13_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
void TriDrawSubsector32_13_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
|
void TriDrawSubsector32_14_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
void TriFillSubsector8_0_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
void TriFillSubsector8_0_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
void TriFillSubsector8_1_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
void TriFillSubsector8_1_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
void TriFillSubsector8_2_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
void TriFillSubsector8_2_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
|
@ -191,6 +197,7 @@ extern "C"
|
||||||
void TriFillSubsector8_11_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
void TriFillSubsector8_11_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
void TriFillSubsector8_12_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
void TriFillSubsector8_12_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
void TriFillSubsector8_13_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
void TriFillSubsector8_13_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
|
void TriFillSubsector8_14_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
void TriFillSubsector32_0_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
void TriFillSubsector32_0_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
void TriFillSubsector32_1_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
void TriFillSubsector32_1_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
void TriFillSubsector32_2_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
void TriFillSubsector32_2_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
|
@ -205,6 +212,7 @@ extern "C"
|
||||||
void TriFillSubsector32_11_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
void TriFillSubsector32_11_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
void TriFillSubsector32_12_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
void TriFillSubsector32_12_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
void TriFillSubsector32_13_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
void TriFillSubsector32_13_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
|
void TriFillSubsector32_14_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
void TriStencil_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
void TriStencil_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
void TriStencilClose_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
void TriStencilClose_SSE2(const TriDrawTriangleArgs *, WorkerThreadData *);
|
||||||
}
|
}
|
||||||
|
@ -289,6 +297,7 @@ Drawers::Drawers()
|
||||||
TriDrawNormal8.push_back(TriDrawNormal8_11_SSE2);
|
TriDrawNormal8.push_back(TriDrawNormal8_11_SSE2);
|
||||||
TriDrawNormal8.push_back(TriDrawNormal8_12_SSE2);
|
TriDrawNormal8.push_back(TriDrawNormal8_12_SSE2);
|
||||||
TriDrawNormal8.push_back(TriDrawNormal8_13_SSE2);
|
TriDrawNormal8.push_back(TriDrawNormal8_13_SSE2);
|
||||||
|
TriDrawNormal8.push_back(TriDrawNormal8_14_SSE2);
|
||||||
TriDrawNormal32.push_back(TriDrawNormal32_0_SSE2);
|
TriDrawNormal32.push_back(TriDrawNormal32_0_SSE2);
|
||||||
TriDrawNormal32.push_back(TriDrawNormal32_1_SSE2);
|
TriDrawNormal32.push_back(TriDrawNormal32_1_SSE2);
|
||||||
TriDrawNormal32.push_back(TriDrawNormal32_2_SSE2);
|
TriDrawNormal32.push_back(TriDrawNormal32_2_SSE2);
|
||||||
|
@ -303,6 +312,7 @@ Drawers::Drawers()
|
||||||
TriDrawNormal32.push_back(TriDrawNormal32_11_SSE2);
|
TriDrawNormal32.push_back(TriDrawNormal32_11_SSE2);
|
||||||
TriDrawNormal32.push_back(TriDrawNormal32_12_SSE2);
|
TriDrawNormal32.push_back(TriDrawNormal32_12_SSE2);
|
||||||
TriDrawNormal32.push_back(TriDrawNormal32_13_SSE2);
|
TriDrawNormal32.push_back(TriDrawNormal32_13_SSE2);
|
||||||
|
TriDrawNormal32.push_back(TriDrawNormal32_14_SSE2);
|
||||||
TriFillNormal8.push_back(TriFillNormal8_0_SSE2);
|
TriFillNormal8.push_back(TriFillNormal8_0_SSE2);
|
||||||
TriFillNormal8.push_back(TriFillNormal8_1_SSE2);
|
TriFillNormal8.push_back(TriFillNormal8_1_SSE2);
|
||||||
TriFillNormal8.push_back(TriFillNormal8_2_SSE2);
|
TriFillNormal8.push_back(TriFillNormal8_2_SSE2);
|
||||||
|
@ -317,6 +327,7 @@ Drawers::Drawers()
|
||||||
TriFillNormal8.push_back(TriFillNormal8_11_SSE2);
|
TriFillNormal8.push_back(TriFillNormal8_11_SSE2);
|
||||||
TriFillNormal8.push_back(TriFillNormal8_12_SSE2);
|
TriFillNormal8.push_back(TriFillNormal8_12_SSE2);
|
||||||
TriFillNormal8.push_back(TriFillNormal8_13_SSE2);
|
TriFillNormal8.push_back(TriFillNormal8_13_SSE2);
|
||||||
|
TriFillNormal8.push_back(TriFillNormal8_14_SSE2);
|
||||||
TriFillNormal32.push_back(TriFillNormal32_0_SSE2);
|
TriFillNormal32.push_back(TriFillNormal32_0_SSE2);
|
||||||
TriFillNormal32.push_back(TriFillNormal32_1_SSE2);
|
TriFillNormal32.push_back(TriFillNormal32_1_SSE2);
|
||||||
TriFillNormal32.push_back(TriFillNormal32_2_SSE2);
|
TriFillNormal32.push_back(TriFillNormal32_2_SSE2);
|
||||||
|
@ -331,6 +342,7 @@ Drawers::Drawers()
|
||||||
TriFillNormal32.push_back(TriFillNormal32_11_SSE2);
|
TriFillNormal32.push_back(TriFillNormal32_11_SSE2);
|
||||||
TriFillNormal32.push_back(TriFillNormal32_12_SSE2);
|
TriFillNormal32.push_back(TriFillNormal32_12_SSE2);
|
||||||
TriFillNormal32.push_back(TriFillNormal32_13_SSE2);
|
TriFillNormal32.push_back(TriFillNormal32_13_SSE2);
|
||||||
|
TriFillNormal32.push_back(TriFillNormal32_14_SSE2);
|
||||||
TriDrawSubsector8.push_back(TriDrawSubsector8_0_SSE2);
|
TriDrawSubsector8.push_back(TriDrawSubsector8_0_SSE2);
|
||||||
TriDrawSubsector8.push_back(TriDrawSubsector8_1_SSE2);
|
TriDrawSubsector8.push_back(TriDrawSubsector8_1_SSE2);
|
||||||
TriDrawSubsector8.push_back(TriDrawSubsector8_2_SSE2);
|
TriDrawSubsector8.push_back(TriDrawSubsector8_2_SSE2);
|
||||||
|
@ -345,6 +357,7 @@ Drawers::Drawers()
|
||||||
TriDrawSubsector8.push_back(TriDrawSubsector8_11_SSE2);
|
TriDrawSubsector8.push_back(TriDrawSubsector8_11_SSE2);
|
||||||
TriDrawSubsector8.push_back(TriDrawSubsector8_12_SSE2);
|
TriDrawSubsector8.push_back(TriDrawSubsector8_12_SSE2);
|
||||||
TriDrawSubsector8.push_back(TriDrawSubsector8_13_SSE2);
|
TriDrawSubsector8.push_back(TriDrawSubsector8_13_SSE2);
|
||||||
|
TriDrawSubsector8.push_back(TriDrawSubsector8_14_SSE2);
|
||||||
TriDrawSubsector32.push_back(TriDrawSubsector32_0_SSE2);
|
TriDrawSubsector32.push_back(TriDrawSubsector32_0_SSE2);
|
||||||
TriDrawSubsector32.push_back(TriDrawSubsector32_1_SSE2);
|
TriDrawSubsector32.push_back(TriDrawSubsector32_1_SSE2);
|
||||||
TriDrawSubsector32.push_back(TriDrawSubsector32_2_SSE2);
|
TriDrawSubsector32.push_back(TriDrawSubsector32_2_SSE2);
|
||||||
|
@ -359,6 +372,7 @@ Drawers::Drawers()
|
||||||
TriDrawSubsector32.push_back(TriDrawSubsector32_11_SSE2);
|
TriDrawSubsector32.push_back(TriDrawSubsector32_11_SSE2);
|
||||||
TriDrawSubsector32.push_back(TriDrawSubsector32_12_SSE2);
|
TriDrawSubsector32.push_back(TriDrawSubsector32_12_SSE2);
|
||||||
TriDrawSubsector32.push_back(TriDrawSubsector32_13_SSE2);
|
TriDrawSubsector32.push_back(TriDrawSubsector32_13_SSE2);
|
||||||
|
TriDrawSubsector32.push_back(TriDrawSubsector32_14_SSE2);
|
||||||
TriFillSubsector8.push_back(TriFillSubsector8_0_SSE2);
|
TriFillSubsector8.push_back(TriFillSubsector8_0_SSE2);
|
||||||
TriFillSubsector8.push_back(TriFillSubsector8_1_SSE2);
|
TriFillSubsector8.push_back(TriFillSubsector8_1_SSE2);
|
||||||
TriFillSubsector8.push_back(TriFillSubsector8_2_SSE2);
|
TriFillSubsector8.push_back(TriFillSubsector8_2_SSE2);
|
||||||
|
@ -373,6 +387,7 @@ Drawers::Drawers()
|
||||||
TriFillSubsector8.push_back(TriFillSubsector8_11_SSE2);
|
TriFillSubsector8.push_back(TriFillSubsector8_11_SSE2);
|
||||||
TriFillSubsector8.push_back(TriFillSubsector8_12_SSE2);
|
TriFillSubsector8.push_back(TriFillSubsector8_12_SSE2);
|
||||||
TriFillSubsector8.push_back(TriFillSubsector8_13_SSE2);
|
TriFillSubsector8.push_back(TriFillSubsector8_13_SSE2);
|
||||||
|
TriFillSubsector8.push_back(TriFillSubsector8_14_SSE2);
|
||||||
TriFillSubsector32.push_back(TriFillSubsector32_0_SSE2);
|
TriFillSubsector32.push_back(TriFillSubsector32_0_SSE2);
|
||||||
TriFillSubsector32.push_back(TriFillSubsector32_1_SSE2);
|
TriFillSubsector32.push_back(TriFillSubsector32_1_SSE2);
|
||||||
TriFillSubsector32.push_back(TriFillSubsector32_2_SSE2);
|
TriFillSubsector32.push_back(TriFillSubsector32_2_SSE2);
|
||||||
|
@ -387,6 +402,7 @@ Drawers::Drawers()
|
||||||
TriFillSubsector32.push_back(TriFillSubsector32_11_SSE2);
|
TriFillSubsector32.push_back(TriFillSubsector32_11_SSE2);
|
||||||
TriFillSubsector32.push_back(TriFillSubsector32_12_SSE2);
|
TriFillSubsector32.push_back(TriFillSubsector32_12_SSE2);
|
||||||
TriFillSubsector32.push_back(TriFillSubsector32_13_SSE2);
|
TriFillSubsector32.push_back(TriFillSubsector32_13_SSE2);
|
||||||
|
TriFillSubsector32.push_back(TriFillSubsector32_14_SSE2);
|
||||||
TriStencil = TriStencil_SSE2;
|
TriStencil = TriStencil_SSE2;
|
||||||
TriStencilClose = TriStencilClose_SSE2;
|
TriStencilClose = TriStencilClose_SSE2;
|
||||||
}
|
}
|
||||||
|
|
|
@ -254,10 +254,11 @@ enum class TriBlendMode
|
||||||
TranslateAdd, // blend_add(shade(translate(fg)), bg, srcalpha, calc_blend_bgalpha(fg, destalpha))
|
TranslateAdd, // blend_add(shade(translate(fg)), bg, srcalpha, calc_blend_bgalpha(fg, destalpha))
|
||||||
TranslateSub, // blend_sub(shade(translate(fg)), bg, srcalpha, calc_blend_bgalpha(fg, destalpha))
|
TranslateSub, // blend_sub(shade(translate(fg)), bg, srcalpha, calc_blend_bgalpha(fg, destalpha))
|
||||||
TranslateRevSub,// blend_revsub(shade(translate(fg)), bg, srcalpha, calc_blend_bgalpha(fg, destalpha))
|
TranslateRevSub,// blend_revsub(shade(translate(fg)), bg, srcalpha, calc_blend_bgalpha(fg, destalpha))
|
||||||
AddSrcColorOneMinusSrcColor // glBlendMode(GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR) used by GZDoom's fullbright additive sprites
|
AddSrcColorOneMinusSrcColor, // glBlendMode(GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR) used by GZDoom's fullbright additive sprites
|
||||||
|
Skycap // Fade to sky color when the V texture coordinate go beyond the [-1, 1] range
|
||||||
};
|
};
|
||||||
|
|
||||||
inline int NumTriBlendModes() { return (int)TriBlendMode::AddSrcColorOneMinusSrcColor + 1; }
|
inline int NumTriBlendModes() { return (int)TriBlendMode::Skycap + 1; }
|
||||||
|
|
||||||
class Drawers
|
class Drawers
|
||||||
{
|
{
|
||||||
|
|
|
@ -66,20 +66,24 @@ void PolySkyDome::Render(const TriMatrix &worldToClip)
|
||||||
RenderCapColorRow(args, frontskytex, 0, false);
|
RenderCapColorRow(args, frontskytex, 0, false);
|
||||||
RenderCapColorRow(args, frontskytex, rc, true);
|
RenderCapColorRow(args, frontskytex, rc, true);
|
||||||
|
|
||||||
|
uint32_t topcapcolor = frontskytex->GetSkyCapColor(false);
|
||||||
|
uint32_t bottomcapcolor = frontskytex->GetSkyCapColor(true);
|
||||||
|
|
||||||
for (int i = 1; i <= mRows; i++)
|
for (int i = 1; i <= mRows; i++)
|
||||||
{
|
{
|
||||||
RenderRow(args, i);
|
RenderRow(args, i, topcapcolor);
|
||||||
RenderRow(args, rc + i);
|
RenderRow(args, rc + i, bottomcapcolor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void PolySkyDome::RenderRow(PolyDrawArgs &args, int row)
|
void PolySkyDome::RenderRow(PolyDrawArgs &args, int row, uint32_t capcolor)
|
||||||
{
|
{
|
||||||
args.vinput = &mVertices[mPrimStart[row]];
|
args.vinput = &mVertices[mPrimStart[row]];
|
||||||
args.vcount = mPrimStart[row + 1] - mPrimStart[row];
|
args.vcount = mPrimStart[row + 1] - mPrimStart[row];
|
||||||
args.mode = TriangleDrawMode::Strip;
|
args.mode = TriangleDrawMode::Strip;
|
||||||
args.ccw = false;
|
args.ccw = false;
|
||||||
PolyTriangleDrawer::draw(args, TriDrawVariant::DrawNormal, TriBlendMode::Copy);
|
args.uniforms.color = capcolor;
|
||||||
|
PolyTriangleDrawer::draw(args, TriDrawVariant::DrawNormal, TriBlendMode::Skycap);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PolySkyDome::RenderCapColorRow(PolyDrawArgs &args, FTexture *skytex, int row, bool bottomCap)
|
void PolySkyDome::RenderCapColorRow(PolyDrawArgs &args, FTexture *skytex, int row, bool bottomCap)
|
||||||
|
@ -129,18 +133,6 @@ void PolySkyDome::CreateSkyHemisphere(bool zflip)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TriVertex PolySkyDome::SetVertex(float xx, float yy, float zz, float uu, float vv)
|
|
||||||
{
|
|
||||||
TriVertex v;
|
|
||||||
v.x = xx;
|
|
||||||
v.y = yy;
|
|
||||||
v.z = zz;
|
|
||||||
v.w = 1.0f;
|
|
||||||
v.varying[0] = uu;
|
|
||||||
v.varying[1] = vv;
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
|
|
||||||
TriVertex PolySkyDome::SetVertexXYZ(float xx, float yy, float zz, float uu, float vv)
|
TriVertex PolySkyDome::SetVertexXYZ(float xx, float yy, float zz, float uu, float vv)
|
||||||
{
|
{
|
||||||
TriVertex v;
|
TriVertex v;
|
||||||
|
@ -166,7 +158,6 @@ void PolySkyDome::SkyVertex(int r, int c, bool zflip)
|
||||||
float z = (!zflip) ? scale * height : -scale * height;
|
float z = (!zflip) ? scale * height : -scale * height;
|
||||||
|
|
||||||
float u, v;
|
float u, v;
|
||||||
//uint32_t color = r == 0 ? 0xffffff : 0xffffffff;
|
|
||||||
|
|
||||||
// And the texture coordinates.
|
// And the texture coordinates.
|
||||||
if (!zflip) // Flipped Y is for the lower hemisphere.
|
if (!zflip) // Flipped Y is for the lower hemisphere.
|
||||||
|
@ -184,6 +175,6 @@ void PolySkyDome::SkyVertex(int r, int c, bool zflip)
|
||||||
|
|
||||||
// And finally the vertex.
|
// And finally the vertex.
|
||||||
TriVertex vert;
|
TriVertex vert;
|
||||||
vert = SetVertexXYZ(-pos.X, z - 1.f, pos.Y, u * 4.0f, v * 1.2f + 0.5f/*, color*/);
|
vert = SetVertexXYZ(-pos.X, z - 1.f, pos.Y, u * 4.0f, v * 1.2f - 0.5f);
|
||||||
mVertices.Push(vert);
|
mVertices.Push(vert);
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,9 +38,8 @@ private:
|
||||||
void SkyVertex(int r, int c, bool yflip);
|
void SkyVertex(int r, int c, bool yflip);
|
||||||
void CreateSkyHemisphere(bool zflip);
|
void CreateSkyHemisphere(bool zflip);
|
||||||
void CreateDome();
|
void CreateDome();
|
||||||
void RenderRow(PolyDrawArgs &args, int row);
|
void RenderRow(PolyDrawArgs &args, int row, uint32_t capcolor);
|
||||||
void RenderCapColorRow(PolyDrawArgs &args, FTexture *skytex, int row, bool bottomCap);
|
void RenderCapColorRow(PolyDrawArgs &args, FTexture *skytex, int row, bool bottomCap);
|
||||||
|
|
||||||
TriVertex SetVertex(float xx, float yy, float zz, float uu = 0, float vv = 0);
|
|
||||||
TriVertex SetVertexXYZ(float xx, float yy, float zz, float uu = 0, float vv = 0);
|
TriVertex SetVertexXYZ(float xx, float yy, float zz, float uu = 0, float vv = 0);
|
||||||
};
|
};
|
||||||
|
|
|
@ -333,8 +333,6 @@ void DrawTriangleCodegen::SetupAffineBlock()
|
||||||
{
|
{
|
||||||
AffineVaryingPosX[i] = SSAInt(AffineVaryingPosY[i] * rcpW0, false);
|
AffineVaryingPosX[i] = SSAInt(AffineVaryingPosY[i] * rcpW0, false);
|
||||||
AffineVaryingStepX[i] = (SSAInt((AffineVaryingPosY[i] + gradVaryingX[i]) * rcpW1, false) - AffineVaryingPosX[i]) / q;
|
AffineVaryingStepX[i] = (SSAInt((AffineVaryingPosY[i] + gradVaryingX[i]) * rcpW1, false) - AffineVaryingPosX[i]) / q;
|
||||||
AffineVaryingPosX[i] = AffineVaryingPosX[i] << 8;
|
|
||||||
AffineVaryingStepX[i] = AffineVaryingStepX[i] << 8;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -780,8 +778,8 @@ SSAInt DrawTriangleCodegen::Shade8(SSAInt c)
|
||||||
|
|
||||||
SSAVec4i DrawTriangleCodegen::ProcessPixel32(SSAVec4i bg, SSAInt *varying)
|
SSAVec4i DrawTriangleCodegen::ProcessPixel32(SSAVec4i bg, SSAInt *varying)
|
||||||
{
|
{
|
||||||
SSAInt ufrac = varying[0];
|
SSAInt ufrac = varying[0] << 8;
|
||||||
SSAInt vfrac = varying[1];
|
SSAInt vfrac = varying[1] << 8;
|
||||||
|
|
||||||
SSAInt upos = ((ufrac >> 16) * textureWidth) >> 16;
|
SSAInt upos = ((ufrac >> 16) * textureWidth) >> 16;
|
||||||
SSAInt vpos = ((vfrac >> 16) * textureHeight) >> 16;
|
SSAInt vpos = ((vfrac >> 16) * textureHeight) >> 16;
|
||||||
|
@ -848,6 +846,10 @@ SSAVec4i DrawTriangleCodegen::ProcessPixel32(SSAVec4i bg, SSAInt *varying)
|
||||||
fg = Sample32(uvoffset);
|
fg = Sample32(uvoffset);
|
||||||
output = blend_add_srccolor_oneminussrccolor(shade_bgra_simple(fg, currentlight), bg);
|
output = blend_add_srccolor_oneminussrccolor(shade_bgra_simple(fg, currentlight), bg);
|
||||||
break;
|
break;
|
||||||
|
case TriBlendMode::Skycap:
|
||||||
|
fg = Sample32(uvoffset);
|
||||||
|
output = FadeOut(varying[1], fg);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return output;
|
return output;
|
||||||
|
@ -867,8 +869,8 @@ SSAInt DrawTriangleCodegen::ToPal8(SSAVec4i c)
|
||||||
|
|
||||||
SSAInt DrawTriangleCodegen::ProcessPixel8(SSAInt bg, SSAInt *varying)
|
SSAInt DrawTriangleCodegen::ProcessPixel8(SSAInt bg, SSAInt *varying)
|
||||||
{
|
{
|
||||||
SSAInt ufrac = varying[0];
|
SSAInt ufrac = varying[0] << 8;
|
||||||
SSAInt vfrac = varying[1];
|
SSAInt vfrac = varying[1] << 8;
|
||||||
|
|
||||||
SSAInt upos = ((ufrac >> 16) * textureWidth) >> 16;
|
SSAInt upos = ((ufrac >> 16) * textureWidth) >> 16;
|
||||||
SSAInt vpos = ((vfrac >> 16) * textureHeight) >> 16;
|
SSAInt vpos = ((vfrac >> 16) * textureHeight) >> 16;
|
||||||
|
@ -955,11 +957,28 @@ SSAInt DrawTriangleCodegen::ProcessPixel8(SSAInt bg, SSAInt *varying)
|
||||||
output = ToPal8(blend_add_srccolor_oneminussrccolor(fg, ToBgra(bg)));
|
output = ToPal8(blend_add_srccolor_oneminussrccolor(fg, ToBgra(bg)));
|
||||||
output = (palindex == SSAInt(0)).select(bg, output);
|
output = (palindex == SSAInt(0)).select(bg, output);
|
||||||
break;
|
break;
|
||||||
|
case TriBlendMode::Skycap:
|
||||||
|
fg = ToBgra(Sample8(uvoffset));
|
||||||
|
output = ToPal8(FadeOut(varying[1], fg));
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SSAVec4i DrawTriangleCodegen::FadeOut(SSAInt frac, SSAVec4i fg)
|
||||||
|
{
|
||||||
|
int start_fade = 2; // How fast it should fade out
|
||||||
|
|
||||||
|
SSAInt alpha_top = SSAInt::MAX(SSAInt::MIN(frac.ashr(16 - start_fade), SSAInt(256)), SSAInt(0));
|
||||||
|
SSAInt alpha_bottom = SSAInt::MAX(SSAInt::MIN(((2 << 24) - frac).ashr(16 - start_fade), SSAInt(256)), SSAInt(0));
|
||||||
|
SSAInt alpha = SSAInt::MIN(alpha_top, alpha_bottom);
|
||||||
|
SSAInt inv_alpha = 256 - alpha;
|
||||||
|
|
||||||
|
fg = (fg * alpha + SSAVec4i::unpack(color) * inv_alpha) / 256;
|
||||||
|
return fg.insert(3, 255);
|
||||||
|
}
|
||||||
|
|
||||||
void DrawTriangleCodegen::SetStencilBlock(SSAInt block)
|
void DrawTriangleCodegen::SetStencilBlock(SSAInt block)
|
||||||
{
|
{
|
||||||
StencilBlock = stencilValues[block * 64];
|
StencilBlock = stencilValues[block * 64];
|
||||||
|
|
|
@ -58,6 +58,8 @@ private:
|
||||||
SSAVec4i ToBgra(SSAInt index);
|
SSAVec4i ToBgra(SSAInt index);
|
||||||
SSAInt ToPal8(SSAVec4i c);
|
SSAInt ToPal8(SSAVec4i c);
|
||||||
|
|
||||||
|
SSAVec4i FadeOut(SSAInt frac, SSAVec4i color);
|
||||||
|
|
||||||
void SetStencilBlock(SSAInt block);
|
void SetStencilBlock(SSAInt block);
|
||||||
void StencilClear(SSAUByte value);
|
void StencilClear(SSAUByte value);
|
||||||
SSAUByte StencilGetSingle();
|
SSAUByte StencilGetSingle();
|
||||||
|
|
Loading…
Reference in a new issue