Forum

Load palette from console

Post tutorials on how to do certain tasks within game or engine code here.

Moderator: InsideQC Admins

Postby qbism » Fri Jan 21, 2011 3:44 am

phase 2 of this tute: regenerate colormap. This will greatly improve lighting quality for your new palette. Add the following code above loadpalette, it is indeed adapted from qlumpy.
Code: Select all
/*
=============================================================================

COLORMAP GRABBING

=============================================================================
*/

/*
===============
BestColor - qbism- from qlumpy
===============
*/
byte BestColor (int r, int g, int b, int start, int stop)
{
   int   i;
   int   dr, dg, db;
   int   bestdistortion, distortion;
   int   bestcolor;
   byte   *pal;

//
// let any color go to 0 as a last resort
//
   bestdistortion = ( (int)r*r + (int)g*g + (int)b*b )*2;
   bestcolor = 0;

   pal = host_basepal + start*3;
   for (i=start ; i<= stop ; i++)
   {
      dr = r - (int)pal[0];
      dg = g - (int)pal[1];
      db = b - (int)pal[2];
      pal += 3;
      distortion = dr*dr + dg*dg + db*db;
      if (distortion < bestdistortion)
      {
         if (!distortion)
            return i;      // perfect match

         bestdistortion = distortion;
         bestcolor = i;
      }
   }

   return bestcolor;
}


/*
==============
GrabColormap - qbism- from qlumpy

filename COLORMAP levels fullbrights
the first map is an identiy 0-255
the final map is all black except for the fullbrights
the remaining maps are evenly spread
fullbright colors start at the top of the palette.
==============
*/
void GrabColormap (void)
{
   int      levels, brights;
   int      l, c;
   float   frac, red, green, blue;
   byte *colmap;

   colmap = host_colormap;

   levels = 32;
   brights = 256;

// identity lump
   for (l=0 ; l<256 ; l++)
      *colmap++ = l;

// shaded levels
   for (l=1;l<levels;l++)
   {
      frac = 1.0 - (float)l/(levels-1);
      for (c=0 ; c<256-brights ; c++)
      {
         red = host_basepal[c*3];
         green = host_basepal[c*3+1];
         blue = host_basepal[c*3+2];

         red = (int)(red*frac+0.5);
         green = (int)(green*frac+0.5);
         blue = (int)(blue*frac+0.5);

//
// note: 254 instead of 255 because 255 is the transparent color, and we
// don't want anything remapping to that
//
         *colmap++ = BestColor(red,green,blue, 0, 254);
      }
      for ( ; c<256 ; c++)
         *colmap++ = c;
   }

   *colmap++ = brights;
}


In R_LoadPalette, Add this above Vid_SetPalette
Code: Select all
GrabColormap();



If you want to add a palette field to the worldspawn, add a check for it in CL_ParseEntityLump.

Phase 3, if there is one, might be remipping textures using the new palette.[/code]
User avatar
qbism
 
Posts: 1236
Joined: Thu Nov 04, 2004 5:51 am

Previous

Return to Programming Tutorials

Who is online

Users browsing this forum: No registered users and 1 guest