view src/gcolour1.cc @ 24:b2dc19044bf3

Import simple 3D preview, an old patch by Andrew Apted. Pressing 'R' key enables it, use arrows etc. to move.
author Matti Hamalainen <ccr@tnsp.org>
date Sat, 24 Sep 2011 13:12:09 +0300
parents f1fb248bf997
children 8eaf72e2041b
line wrap: on
line source

/*
 *	gcolour1.cc
 *	Allocate and free the game colours.
 *
 *	By "game colours", I mean the colours used to draw
 *	the game graphics (flats, textures, sprites), as
 *	opposed to the "application colours" which don't
 *	depend on the the game and are used to draw the
 *	windows, the menus and the map.
 *
 *	The application colours are handled in acolours.cc.
 *
 *	AYM 1998-11-29
 */


/*
This file is part of Yadex.

Yadex incorporates code from DEU 5.21 that was put in the public domain in
1994 by Raphaël Quinet and Brendon Wyber.

The rest of Yadex is Copyright © 1997-2003 André Majorel and others.

This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation; either version 2 of the License, or (at your option) any later
version.

This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
Place, Suite 330, Boston, MA 02111-1307, USA.
*/


#include "yadex.h"
#include "gcolour1.h"
#include "gcolour2.h"
#include "gfx.h"
#include "img.h"	/* IMG_TRANSP */
#include "rgb.h"
#include "wadfile.h"
#include "wads.h"


/*
 *	alloc_game_colours
 *	Allocate the DOOM_COLOURS of PLAYPAL no. <playpalnum>.
 *	Put the DOOM_COLOURS physical colour numbers corresponding
 *	to the game colours in the <game_colour> array.
 */
pcolour_t *alloc_game_colours (int playpalnum)
{
MDirPtr dir;
u8	*dpal;
pcolour_t *game_colours = 0;

dir = FindMasterDir (MasterDir, "PLAYPAL");
if (dir == NULL)
   {
   warn ("PLAYPAL lump not found.\n");
   return 0;
   }

int playpal_count = dir->dir.size / (3 * DOOM_COLOURS);
if (playpalnum < 0 || playpalnum >= playpal_count)
   {
   warn ("playpalnum %d out of range (0-%d). Using #0 instead.\n",
      playpalnum, playpal_count - 1);
   playpalnum = 0;
   }

dpal = (u8 *) GetMemory (3 * DOOM_COLOURS);
dir->wadfile->seek (dir->dir.start);
if (dir->wadfile->error ())
   {
   warn ("%s: can't seek to %lXh\n",
       dir->wadfile->pathname (), (unsigned long) dir->dir.start);
   warn ("PLAYPAL: seek error\n");
   }
for (int n = 0; n <= playpalnum; n++)
   {
   dir->wadfile->read_bytes (dpal, 3 * DOOM_COLOURS);
   if (dir->wadfile->error ())
      {
      warn ("%s: read error\n", dir->wadfile->where ());
      warn ("PLAYPAL: error reading entry #%d\n", n);
      }
   }
#if defined Y_BGI
for (int n = 0; n < 3 * DOOM_COLOURS; n++)
   dpal[n] /= 4;
_AX = 0x1012;
_BX = 0;
_CX = DOOM_COLOURS;
_ES = FP_SEG (dpal);
_DX = FP_OFF (dpal);
__int__ (0x10);
#elif defined Y_X11

rgb_c rgb_values[DOOM_COLOURS];
for (size_t n = 0; n < DOOM_COLOURS; n++)
   {
   rgb_values[n].r = (u8) dpal[3 * n];
   rgb_values[n].g = (u8) dpal[3 * n + 1];
   rgb_values[n].b = (u8) dpal[3 * n + 2];
   }
game_colours = alloc_colours (rgb_values, DOOM_COLOURS);

// Find the colour closest to IMG_TRANSP
{
  colour0 = IMG_TRANSP;
  int smallest_delta = INT_MAX;

  for (size_t n = 1; n < DOOM_COLOURS; n++)
  {
    int delta = rgb_values[IMG_TRANSP] - rgb_values[n];
    if (delta < smallest_delta)
    {
      colour0 = n;
      smallest_delta = delta;
    }
  }
  verbmsg ("colours: colour %d remapped to %d (delta %d)\n",
    IMG_TRANSP, colour0, smallest_delta);
   
   rgb_c med_blue (0, 0, 128);
   sky_colour = 0;
   smallest_delta = INT_MAX;
 
   for (size_t n = 0; n < DOOM_COLOURS; n++)
   {
     int delta = med_blue - rgb_values[n];
     if (delta < smallest_delta)
     {
       sky_colour = n;
       smallest_delta = delta;
     }
   }
   verbmsg ("Sky Colour remapped to %d (delta %d)\n", sky_colour, smallest_delta);
}

#endif
FreeMemory (dpal);
return game_colours;
}


/*
 *	free_game_colours
 *	Free the game colours allocated by alloc_game_colours()
 */
void free_game_colours (pcolour_t *game_colours)
{
free_colours (game_colours, DOOM_COLOURS);
}



/* This is how I used to calculate
   the physical colour numbers.
   Works only on TrueColor/DirectColor visuals. */

#if 0
/* FIXME this is a gross hack */
for (n = 0; n < DOOM_COLOURS; n++)
   {
   xpv_t r = dpal[3*n];
   xpv_t g = dpal[3*n+1];
   xpv_t b = dpal[3*n+2];
   if (win_vis_class == DirectColor || win_vis_class == TrueColor)
      {
      xpv_t r_scaled, g_scaled, b_scaled;
      if (win_r_ofs + win_r_bits < 8)
	 r_scaled = r >> (8 - (win_r_ofs + win_r_bits));
      else
	 r_scaled = r << (win_r_ofs + win_r_bits - 8) & win_r_mask;
      if (win_g_ofs + win_g_bits < 8)
	 g_scaled = g >> (8 - (win_g_ofs + win_g_bits));
      else
	 g_scaled = g << (win_g_ofs + win_g_bits - 8) & win_g_mask;
      if (win_b_ofs + win_b_bits < 8)
	 b_scaled = b >> (8 - (win_b_ofs + win_b_bits));
      else
	 b_scaled = b << (win_b_ofs + win_b_bits - 8) & win_b_mask;
      game_colour[n] = r_scaled | g_scaled | b_scaled;
      }
   else if (win_vis_class== PseudoColor || win_vis_class == StaticColor)
      game_colour[n] = n;  /* Ugh! */
   else if (win_vis_class == GrayScale || win_vis_class == StaticGray)
      {
      game_colour[n] = (r + g + b) / 3;
      if (win_depth < 8)
	 game_colour[n] >>= 8 - win_depth;
      else
	 game_colour[n] <<= win_depth - 8;
      }
   // printf ("%02X %08lX", n, (unsigned long) game_colour[n]);
   // if (n % 6 == 5)
   //    putchar ('\n');
   // else
   //    printf ("  ");
   }
#endif  /* #if 0 */