- add nitevis software drawers - todo: hook them up to the sprite code

This commit is contained in:
Rachael Alexanderson 2018-11-25 06:58:24 -05:00
parent 52b7a77771
commit 52dcec7e85
7 changed files with 230 additions and 2 deletions

View file

@ -66,7 +66,9 @@ namespace swrenderer
virtual void DrawSingleSkyColumn(const SkyDrawerArgs &args) = 0;
virtual void DrawDoubleSkyColumn(const SkyDrawerArgs &args) = 0;
virtual void DrawColumn(const SpriteDrawerArgs &args) = 0;
virtual void DrawNiteVisColumn(const SpriteDrawerArgs &args) = 0;
virtual void FillColumn(const SpriteDrawerArgs &args) = 0;
virtual void FillNiteVisColumn(const SpriteDrawerArgs &args) = 0;
virtual void FillAddColumn(const SpriteDrawerArgs &args) = 0;
virtual void FillAddClampColumn(const SpriteDrawerArgs &args) = 0;
virtual void FillSubClampColumn(const SpriteDrawerArgs &args) = 0;
@ -74,6 +76,7 @@ namespace swrenderer
virtual void DrawFuzzColumn(const SpriteDrawerArgs &args) = 0;
virtual void DrawAddColumn(const SpriteDrawerArgs &args) = 0;
virtual void DrawTranslatedColumn(const SpriteDrawerArgs &args) = 0;
virtual void DrawTranslatedNiteVisColumn(const SpriteDrawerArgs &args) = 0;
virtual void DrawTranslatedAddColumn(const SpriteDrawerArgs &args) = 0;
virtual void DrawShadedColumn(const SpriteDrawerArgs &args) = 0;
virtual void DrawAddClampShadedColumn(const SpriteDrawerArgs &args) = 0;

View file

@ -933,6 +933,107 @@ namespace swrenderer
}
}
void DrawColumnNiteVisPalCommand::Execute(DrawerThread *thread)
{
int count;
uint8_t *dest;
fixed_t frac;
fixed_t fracstep;
count = args.Count();
// Framebuffer destination address.
dest = args.Dest();
// Determine scaling,
// which is the only mapping to be done.
fracstep = args.TextureVStep();
frac = args.TextureVPos();
count = thread->count_for_thread(args.DestY(), count);
if (count <= 0)
return;
int pitch = args.Viewport()->RenderTarget->GetPitch();
dest = thread->dest_for_thread(args.DestY(), pitch, dest);
frac += fracstep * thread->skipped_by_thread(args.DestY());
fracstep *= thread->num_cores;
pitch *= thread->num_cores;
// [RH] Get local copies of these variables so that the compiler
// has a better chance of optimizing this well.
const uint8_t *colormap = args.Colormap(args.Viewport());
const uint8_t *source = args.TexturePixels();
do
{
uint8_t fg = source[frac >> FRACBITS];
// lumi is a desaturated colour and goes between 0.0 and 1.0, this is intentional
float lumi = ((float)GPalette.BaseColors[colormap[fg]].r * 30.f +
GPalette.BaseColors[colormap[fg]].g * 59.f +
GPalette.BaseColors[colormap[fg]].b * 11.f) / 25500.f;
float r = 255.f - lumi * 255.f;
float g = clamp(511.f - lumi * 511.f, 0.f, 255.f);
float b = 255.f - lumi * 255.f;
*dest = RGB256k.RGB[(int)r>>2][(int)g>>2][(int)b>>2];
dest += pitch;
frac += fracstep;
} while (--count);
}
void DrawColumnTranslatedNiteVisPalCommand::Execute(DrawerThread *thread)
{
int count;
uint8_t *dest;
fixed_t frac;
fixed_t fracstep;
count = args.Count();
// Framebuffer destination address.
dest = args.Dest();
// Determine scaling,
// which is the only mapping to be done.
fracstep = args.TextureVStep();
frac = args.TextureVPos();
count = thread->count_for_thread(args.DestY(), count);
if (count <= 0)
return;
int pitch = args.Viewport()->RenderTarget->GetPitch();
dest = thread->dest_for_thread(args.DestY(), pitch, dest);
frac += fracstep * thread->skipped_by_thread(args.DestY());
fracstep *= thread->num_cores;
pitch *= thread->num_cores;
const uint8_t *translation = args.TranslationMap();
// [RH] Get local copies of these variables so that the compiler
// has a better chance of optimizing this well.
const uint8_t *colormap = args.Colormap(args.Viewport());
const uint8_t *source = args.TexturePixels();
do
{
uint8_t fg = translation[source[frac >> FRACBITS]];
// lumi is a desaturated colour and goes between 0.0 and 1.0, this is intentional
float lumi = ((float)GPalette.BaseColors[colormap[fg]].r * 30.f +
GPalette.BaseColors[colormap[fg]].g * 59.f +
GPalette.BaseColors[colormap[fg]].b * 11.f) / 25500.f;
float r = 255.f - lumi * 255.f;
float g = clamp(511.f - lumi * 511.f, 0.f, 255.f);
float b = 255.f - lumi * 255.f;
*dest = RGB256k.RGB[(int)r>>2][(int)g>>2][(int)b>>2];
dest += pitch;
frac += fracstep;
} while (--count);
}
void FillColumnPalCommand::Execute(DrawerThread *thread)
{
int count;
@ -957,6 +1058,55 @@ namespace swrenderer
} while (--count);
}
void FillColumnNiteVisPalCommand::Execute(DrawerThread *thread)
{
int count;
uint8_t *dest;
fixed_t frac;
fixed_t fracstep;
count = args.Count();
// Framebuffer destination address.
dest = args.Dest();
// Determine scaling,
// which is the only mapping to be done.
fracstep = args.TextureVStep();
frac = args.TextureVPos();
count = thread->count_for_thread(args.DestY(), count);
if (count <= 0)
return;
int pitch = args.Viewport()->RenderTarget->GetPitch();
dest = thread->dest_for_thread(args.DestY(), pitch, dest);
frac += fracstep * thread->skipped_by_thread(args.DestY());
fracstep *= thread->num_cores;
pitch *= thread->num_cores;
// [RH] Get local copies of these variables so that the compiler
// has a better chance of optimizing this well.
const uint8_t *colormap = args.Colormap(args.Viewport());
const uint8_t *source = args.TexturePixels();
uint8_t fg = args.SolidColor();
do
{
// lumi is a desaturated colour and goes between 0.0 and 1.0, this is intentional
float lumi = ((float)GPalette.BaseColors[colormap[fg]].r * 30.f +
GPalette.BaseColors[colormap[fg]].g * 59.f +
GPalette.BaseColors[colormap[fg]].b * 11.f) / 25500.f;
float r = 255.f - lumi * 255.f;
float g = clamp(511.f - lumi * 511.f, 0.f, 255.f);
float b = 255.f - lumi * 255.f;
*dest = RGB256k.RGB[(int)r>>2][(int)g>>2][(int)b>>2];
dest += pitch;
frac += fracstep;
} while (--count);
}
void FillColumnAddPalCommand::Execute(DrawerThread *thread)
{
int count;

View file

@ -53,13 +53,16 @@ namespace swrenderer
};
class DrawColumnPalCommand : public PalColumnCommand { public: using PalColumnCommand::PalColumnCommand; void Execute(DrawerThread *thread) override; };
class DrawColumnNiteVisPalCommand : public PalColumnCommand { public: using PalColumnCommand::PalColumnCommand; void Execute(DrawerThread *thread) override; };
class FillColumnPalCommand : public PalColumnCommand { public: using PalColumnCommand::PalColumnCommand; void Execute(DrawerThread *thread) override; };
class FillColumnNiteVisPalCommand : public PalColumnCommand { public: using PalColumnCommand::PalColumnCommand; void Execute(DrawerThread *thread) override; };
class FillColumnAddPalCommand : public PalColumnCommand { public: using PalColumnCommand::PalColumnCommand; void Execute(DrawerThread *thread) override; };
class FillColumnAddClampPalCommand : public PalColumnCommand { public: using PalColumnCommand::PalColumnCommand; void Execute(DrawerThread *thread) override; };
class FillColumnSubClampPalCommand : public PalColumnCommand { public: using PalColumnCommand::PalColumnCommand; void Execute(DrawerThread *thread) override; };
class FillColumnRevSubClampPalCommand : public PalColumnCommand { public: using PalColumnCommand::PalColumnCommand; void Execute(DrawerThread *thread) override; };
class DrawColumnAddPalCommand : public PalColumnCommand { public: using PalColumnCommand::PalColumnCommand; void Execute(DrawerThread *thread) override; };
class DrawColumnTranslatedPalCommand : public PalColumnCommand { public: using PalColumnCommand::PalColumnCommand; void Execute(DrawerThread *thread) override; };
class DrawColumnTranslatedNiteVisPalCommand : public PalColumnCommand { public: using PalColumnCommand::PalColumnCommand; void Execute(DrawerThread *thread) override; };
class DrawColumnTlatedAddPalCommand : public PalColumnCommand { public: using PalColumnCommand::PalColumnCommand; void Execute(DrawerThread *thread) override; };
class DrawColumnShadedPalCommand : public PalColumnCommand { public: using PalColumnCommand::PalColumnCommand; void Execute(DrawerThread *thread) override; };
class DrawColumnAddClampShadedPalCommand : public PalColumnCommand { public: using PalColumnCommand::PalColumnCommand; void Execute(DrawerThread *thread) override; };
@ -247,7 +250,9 @@ namespace swrenderer
void DrawSingleSkyColumn(const SkyDrawerArgs &args) override { Queue->Push<DrawSingleSky1PalCommand>(args); }
void DrawDoubleSkyColumn(const SkyDrawerArgs &args) override { Queue->Push<DrawDoubleSky1PalCommand>(args); }
void DrawColumn(const SpriteDrawerArgs &args) override { Queue->Push<DrawColumnPalCommand>(args); }
void DrawNiteVisColumn(const SpriteDrawerArgs &args) override { Queue->Push<DrawColumnNiteVisPalCommand>(args); }
void FillColumn(const SpriteDrawerArgs &args) override { Queue->Push<FillColumnPalCommand>(args); }
void FillNiteVisColumn(const SpriteDrawerArgs &args) override { Queue->Push<FillColumnNiteVisPalCommand>(args); }
void FillAddColumn(const SpriteDrawerArgs &args) override { Queue->Push<FillColumnAddPalCommand>(args); }
void FillAddClampColumn(const SpriteDrawerArgs &args) override { Queue->Push<FillColumnAddClampPalCommand>(args); }
void FillSubClampColumn(const SpriteDrawerArgs &args) override { Queue->Push<FillColumnSubClampPalCommand>(args); }
@ -262,6 +267,7 @@ namespace swrenderer
}
void DrawAddColumn(const SpriteDrawerArgs &args) override { Queue->Push<DrawColumnAddPalCommand>(args); }
void DrawTranslatedColumn(const SpriteDrawerArgs &args) override { Queue->Push<DrawColumnTranslatedPalCommand>(args); }
void DrawTranslatedNiteVisColumn(const SpriteDrawerArgs &args) override { Queue->Push<DrawColumnTranslatedNiteVisPalCommand>(args); }
void DrawTranslatedAddColumn(const SpriteDrawerArgs &args) override { Queue->Push<DrawColumnTlatedAddPalCommand>(args); }
void DrawShadedColumn(const SpriteDrawerArgs &args) override { Queue->Push<DrawColumnShadedPalCommand>(args); }
void DrawAddClampShadedColumn(const SpriteDrawerArgs &args) override { Queue->Push<DrawColumnAddClampShadedPalCommand>(args); }

View file

@ -115,11 +115,21 @@ namespace swrenderer
Queue->Push<DrawSprite32Command>(args);
}
void SWTruecolorDrawers::DrawNiteVisColumn(const SpriteDrawerArgs &args)
{
Queue->Push<DrawSpriteNiteVis32Command>(args);
}
void SWTruecolorDrawers::FillColumn(const SpriteDrawerArgs &args)
{
Queue->Push<FillSprite32Command>(args);
}
void SWTruecolorDrawers::FillNiteVisColumn(const SpriteDrawerArgs &args)
{
Queue->Push<FillSpriteNiteVis32Command>(args);
}
void SWTruecolorDrawers::FillAddColumn(const SpriteDrawerArgs &args)
{
Queue->Push<FillSpriteAddClamp32Command>(args);
@ -159,6 +169,11 @@ namespace swrenderer
Queue->Push<DrawSpriteTranslated32Command>(args);
}
void SWTruecolorDrawers::DrawTranslatedNiteVisColumn(const SpriteDrawerArgs &args)
{
Queue->Push<DrawSpriteTranslatedNiteVis32Command>(args);
}
void SWTruecolorDrawers::DrawTranslatedAddColumn(const SpriteDrawerArgs &args)
{
Queue->Push<DrawSpriteTranslatedAddClamp32Command>(args);

View file

@ -253,7 +253,9 @@ namespace swrenderer
void DrawSingleSkyColumn(const SkyDrawerArgs &args) override;
void DrawDoubleSkyColumn(const SkyDrawerArgs &args) override;
void DrawColumn(const SpriteDrawerArgs &args) override;
void DrawNiteVisColumn(const SpriteDrawerArgs &args) override;
void FillColumn(const SpriteDrawerArgs &args) override;
void FillNiteVisColumn(const SpriteDrawerArgs &args) override;
void FillAddColumn(const SpriteDrawerArgs &args) override;
void FillAddClampColumn(const SpriteDrawerArgs &args) override;
void FillSubClampColumn(const SpriteDrawerArgs &args) override;
@ -261,6 +263,7 @@ namespace swrenderer
void DrawFuzzColumn(const SpriteDrawerArgs &args) override;
void DrawAddColumn(const SpriteDrawerArgs &args) override;
void DrawTranslatedColumn(const SpriteDrawerArgs &args) override;
void DrawTranslatedNiteVisColumn(const SpriteDrawerArgs &args) override;
void DrawTranslatedAddColumn(const SpriteDrawerArgs &args) override;
void DrawShadedColumn(const SpriteDrawerArgs &args) override;
void DrawAddClampShadedColumn(const SpriteDrawerArgs &args) override;

View file

@ -29,9 +29,10 @@ namespace swrenderer
{
namespace DrawSprite32TModes
{
enum class SpriteBlendModes { Copy, Opaque, Shaded, AddClampShaded, AddClamp, SubClamp, RevSubClamp };
enum class SpriteBlendModes { Copy, Opaque, NiteVis, Shaded, AddClampShaded, AddClamp, SubClamp, RevSubClamp };
struct CopySprite { static const int Mode = (int)SpriteBlendModes::Copy; };
struct OpaqueSprite { static const int Mode = (int)SpriteBlendModes::Opaque; };
struct NiteVisSprite { static const int Mode = (int)SpriteBlendModes::NiteVis; };
struct ShadedSprite { static const int Mode = (int)SpriteBlendModes::Shaded; };
struct AddClampShadedSprite { static const int Mode = (int)SpriteBlendModes::AddClampShaded; };
struct AddClampSprite { static const int Mode = (int)SpriteBlendModes::AddClamp; };
@ -325,6 +326,19 @@ namespace swrenderer
fgcolor.a = 255;
return fgcolor;
}
if (BlendT::Mode == (int)SpriteBlendModes::NiteVis)
{
// lumi is a desaturated colour and goes between 0.0 and 1.0, this is intentional
float lumi = ((float)fgcolor.r * 30.0f +
fgcolor.g * 59.0f +
fgcolor.b * 11.0f) / 25500.0f;
fgcolor.r = int(255.0f - lumi * 255.0f);
fgcolor.g = int(clamp(511.0f - lumi * 511.0f, 0.0f, 255.0f));
fgcolor.b = int(255.0f - lumi * 255.0f);
fgcolor.a = 255;
return fgcolor;
}
else if (BlendT::Mode == (int)SpriteBlendModes::Shaded)
{
uint32_t alpha = ifgshade;
@ -391,11 +405,13 @@ namespace swrenderer
typedef DrawSprite32T<DrawSprite32TModes::CopySprite, DrawSprite32TModes::TextureSampler> DrawSpriteCopy32Command;
typedef DrawSprite32T<DrawSprite32TModes::OpaqueSprite, DrawSprite32TModes::TextureSampler> DrawSprite32Command;
typedef DrawSprite32T<DrawSprite32TModes::NiteVisSprite, DrawSprite32TModes::TextureSampler> DrawSpriteNiteVis32Command;
typedef DrawSprite32T<DrawSprite32TModes::AddClampSprite, DrawSprite32TModes::TextureSampler> DrawSpriteAddClamp32Command;
typedef DrawSprite32T<DrawSprite32TModes::SubClampSprite, DrawSprite32TModes::TextureSampler> DrawSpriteSubClamp32Command;
typedef DrawSprite32T<DrawSprite32TModes::RevSubClampSprite, DrawSprite32TModes::TextureSampler> DrawSpriteRevSubClamp32Command;
typedef DrawSprite32T<DrawSprite32TModes::OpaqueSprite, DrawSprite32TModes::FillSampler> FillSprite32Command;
typedef DrawSprite32T<DrawSprite32TModes::NiteVisSprite, DrawSprite32TModes::FillSampler> FillSpriteNiteVis32Command;
typedef DrawSprite32T<DrawSprite32TModes::AddClampSprite, DrawSprite32TModes::FillSampler> FillSpriteAddClamp32Command;
typedef DrawSprite32T<DrawSprite32TModes::SubClampSprite, DrawSprite32TModes::FillSampler> FillSpriteSubClamp32Command;
typedef DrawSprite32T<DrawSprite32TModes::RevSubClampSprite, DrawSprite32TModes::FillSampler> FillSpriteRevSubClamp32Command;
@ -404,6 +420,7 @@ namespace swrenderer
typedef DrawSprite32T<DrawSprite32TModes::AddClampShadedSprite, DrawSprite32TModes::ShadedSampler> DrawSpriteAddClampShaded32Command;
typedef DrawSprite32T<DrawSprite32TModes::OpaqueSprite, DrawSprite32TModes::TranslatedSampler> DrawSpriteTranslated32Command;
typedef DrawSprite32T<DrawSprite32TModes::NiteVisSprite, DrawSprite32TModes::TranslatedSampler> DrawSpriteTranslatedNiteVis32Command;
typedef DrawSprite32T<DrawSprite32TModes::AddClampSprite, DrawSprite32TModes::TranslatedSampler> DrawSpriteTranslatedAddClamp32Command;
typedef DrawSprite32T<DrawSprite32TModes::SubClampSprite, DrawSprite32TModes::TranslatedSampler> DrawSpriteTranslatedSubClamp32Command;
typedef DrawSprite32T<DrawSprite32TModes::RevSubClampSprite, DrawSprite32TModes::TranslatedSampler> DrawSpriteTranslatedRevSubClamp32Command;

View file

@ -29,9 +29,10 @@ namespace swrenderer
{
namespace DrawSprite32TModes
{
enum class SpriteBlendModes { Copy, Opaque, Shaded, AddClampShaded, AddClamp, SubClamp, RevSubClamp };
enum class SpriteBlendModes { Copy, Opaque, NiteVis, Shaded, AddClampShaded, AddClamp, SubClamp, RevSubClamp };
struct CopySprite { static const int Mode = (int)SpriteBlendModes::Copy; };
struct OpaqueSprite { static const int Mode = (int)SpriteBlendModes::Opaque; };
struct NiteVisSprite { static const int Mode = (int)SpriteBlendModes::NiteVis; };
struct ShadedSprite { static const int Mode = (int)SpriteBlendModes::Shaded; };
struct AddClampShadedSprite { static const int Mode = (int)SpriteBlendModes::AddClampShaded; };
struct AddClampSprite { static const int Mode = (int)SpriteBlendModes::AddClamp; };
@ -371,6 +372,36 @@ namespace swrenderer
outcolor = _mm_or_si128(outcolor, _mm_set1_epi32(0xff000000));
return outcolor;
}
if (BlendT::Mode == (int)SpriteBlendModes::NiteVis)
{
// this is a WIP, todo: translate this to SSE2 instructions later
// i am writing it this way for now so the implementation can be changed and
// finalized before going full SSE2
// it is easier to understand and change in this form, but it's incredibly slow
BgraColor bgra_fgcolor[2];
BgraColor bgra_outcolor[2];
_mm_storeu_si128((__m128i*)&bgra_fgcolor[0], _mm_unpacklo_epi16(fgcolor, _mm_setzero_si128()));
_mm_storeu_si128((__m128i*)&bgra_fgcolor[1], _mm_unpackhi_epi16(fgcolor, _mm_setzero_si128()));
for (int i = 0; i < 2; i++)
{
// lumi is a desaturated colour and goes between 0.0 and 1.0, this is intentional
float lumi = ((float)bgra_fgcolor[i].r * 30.0f +
bgra_fgcolor[i].g * 59.0f +
bgra_fgcolor[i].b * 11.0f) / 25500.0f;
bgra_outcolor[i].r = int(255.0f - lumi * 255.0f);
bgra_outcolor[i].g = int(clamp(511.0f - lumi * 511.0f, 0.0f, 255.0f));
bgra_outcolor[i].b = int(255.0f - lumi * 255.0f);
bgra_outcolor[i].a = 255;
}
__m128i outcolor = _mm_packs_epi32(_mm_loadu_si128((__m128i*)&bgra_outcolor[0]), _mm_loadu_si128((__m128i*)&bgra_outcolor[1]));
_mm_packus_epi16(outcolor, _mm_setzero_si128());
return outcolor;
}
else if (BlendT::Mode == (int)SpriteBlendModes::Shaded)
{
__m128i alpha = _mm_set_epi16(ifgshade1, ifgshade1, ifgshade1, ifgshade1, ifgshade0, ifgshade0, ifgshade0, ifgshade0);
@ -448,11 +479,13 @@ namespace swrenderer
typedef DrawSprite32T<DrawSprite32TModes::CopySprite, DrawSprite32TModes::TextureSampler> DrawSpriteCopy32Command;
typedef DrawSprite32T<DrawSprite32TModes::OpaqueSprite, DrawSprite32TModes::TextureSampler> DrawSprite32Command;
typedef DrawSprite32T<DrawSprite32TModes::NiteVisSprite, DrawSprite32TModes::TextureSampler> DrawSpriteNiteVis32Command;
typedef DrawSprite32T<DrawSprite32TModes::AddClampSprite, DrawSprite32TModes::TextureSampler> DrawSpriteAddClamp32Command;
typedef DrawSprite32T<DrawSprite32TModes::SubClampSprite, DrawSprite32TModes::TextureSampler> DrawSpriteSubClamp32Command;
typedef DrawSprite32T<DrawSprite32TModes::RevSubClampSprite, DrawSprite32TModes::TextureSampler> DrawSpriteRevSubClamp32Command;
typedef DrawSprite32T<DrawSprite32TModes::OpaqueSprite, DrawSprite32TModes::FillSampler> FillSprite32Command;
typedef DrawSprite32T<DrawSprite32TModes::NiteVisSprite, DrawSprite32TModes::FillSampler> FillSpriteNiteVis32Command;
typedef DrawSprite32T<DrawSprite32TModes::AddClampSprite, DrawSprite32TModes::FillSampler> FillSpriteAddClamp32Command;
typedef DrawSprite32T<DrawSprite32TModes::SubClampSprite, DrawSprite32TModes::FillSampler> FillSpriteSubClamp32Command;
typedef DrawSprite32T<DrawSprite32TModes::RevSubClampSprite, DrawSprite32TModes::FillSampler> FillSpriteRevSubClamp32Command;
@ -461,6 +494,7 @@ namespace swrenderer
typedef DrawSprite32T<DrawSprite32TModes::AddClampShadedSprite, DrawSprite32TModes::ShadedSampler> DrawSpriteAddClampShaded32Command;
typedef DrawSprite32T<DrawSprite32TModes::OpaqueSprite, DrawSprite32TModes::TranslatedSampler> DrawSpriteTranslated32Command;
typedef DrawSprite32T<DrawSprite32TModes::NiteVisSprite, DrawSprite32TModes::TranslatedSampler> DrawSpriteTranslatedNiteVis32Command;
typedef DrawSprite32T<DrawSprite32TModes::AddClampSprite, DrawSprite32TModes::TranslatedSampler> DrawSpriteTranslatedAddClamp32Command;
typedef DrawSprite32T<DrawSprite32TModes::SubClampSprite, DrawSprite32TModes::TranslatedSampler> DrawSpriteTranslatedSubClamp32Command;
typedef DrawSprite32T<DrawSprite32TModes::RevSubClampSprite, DrawSprite32TModes::TranslatedSampler> DrawSpriteTranslatedRevSubClamp32Command;