diff --git a/src/gl/models/gl_voxels.cpp b/src/gl/models/gl_voxels.cpp index e81c6531c5..85b46185b5 100644 --- a/src/gl/models/gl_voxels.cpp +++ b/src/gl/models/gl_voxels.cpp @@ -46,6 +46,7 @@ #include "g_game.h" #include "doomstat.h" #include "g_level.h" +#include "colormatcher.h" #include "textures/bitmap.h" //#include "gl/gl_intern.h" @@ -84,6 +85,7 @@ public: protected: FVoxel *SourceVox; + BYTE *Pixels; }; @@ -101,6 +103,7 @@ FVoxelTexture::FVoxelTexture(FVoxel *vox) WidthBits = 4; HeightBits = 4; WidthMask = 15; + Pixels = NULL; gl_info.bNoFilter = true; gl_info.bNoCompress = true; } @@ -123,12 +126,42 @@ const BYTE *FVoxelTexture::GetColumn (unsigned int column, const Span **spans_ou const BYTE *FVoxelTexture::GetPixels () { - // not needed - return NULL; + // GetPixels gets called when a translated palette is used so we still need to implement it here. + if (Pixels == NULL) + { + Pixels = new BYTE[256]; + + BYTE *pp = SourceVox->Palette; + + if(pp != NULL) + { + for(int i=0;i<256;i++, pp+=3) + { + PalEntry pe; + pe.r = (pp[0] << 2) | (pp[0] >> 4); + pe.g = (pp[1] << 2) | (pp[1] >> 4); + pe.b = (pp[2] << 2) | (pp[2] >> 4); + Pixels[i] = ColorMatcher.Pick(pe); + } + } + else + { + for(int i=0;i<256;i++, pp+=3) + { + Pixels[i] = (BYTE)i; + } + } + } + return Pixels; } void FVoxelTexture::Unload () { + if (Pixels != NULL) + { + delete[] Pixels; + Pixels = NULL; + } } //=========================================================================== @@ -146,15 +179,26 @@ int FVoxelTexture::CopyTrueColorPixels(FBitmap *bmp, int x, int y, int rotate, F BYTE bitmap[256]; BYTE *pp = SourceVox->Palette; - for(int i=0;i<256;i++, pp+=3) + if(pp != NULL) { - bitmap[i] = (BYTE)i; - pe[i].r = (pp[0] << 2) | (pp[0] >> 4); - pe[i].g = (pp[1] << 2) | (pp[1] >> 4); - pe[i].b = (pp[2] << 2) | (pp[2] >> 4); - pe[i].a = 255; - } - + for(int i=0;i<256;i++, pp+=3) + { + bitmap[i] = (BYTE)i; + pe[i].r = (pp[0] << 2) | (pp[0] >> 4); + pe[i].g = (pp[1] << 2) | (pp[1] >> 4); + pe[i].b = (pp[2] << 2) | (pp[2] >> 4); + pe[i].a = 255; + } + } + else + { + for(int i=0;i<256;i++, pp+=3) + { + bitmap[i] = (BYTE)i; + pe[i] = GPalette.BaseColors[i]; + pe[i].a = 255; + } + } bmp->CopyPixelData(x, y, bitmap, Width, Height, 1, 16, rotate, pe, inf); return 0; }