dvr/app/jni/prboom/tables.c
2016-03-03 22:28:59 +00:00

128 lines
4 KiB
C

/* Emacs style mode select -*- C++ -*-
*-----------------------------------------------------------------------------
*
*
* PrBoom: a Doom port merged with LxDoom and LSDLDoom
* based on BOOM, a modified and improved DOOM engine
* Copyright (C) 1999 by
* id Software, Chi Hoang, Lee Killough, Jim Flynn, Rand Phares, Ty Halderman
* Copyright (C) 1999-2000 by
* Jess Haas, Nicolas Kalkhof, Colin Phipps, Florian Schulze
* Copyright 2005, 2006 by
* Florian Schulze, Colin Phipps, Neil Stevens, Andrey Budko
*
* 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.
*
* DESCRIPTION:
* Lookup tables.
* Do not try to look them up :-).
* In the order of appearance:
*
* int finetangent[4096] - Tangens LUT.
* Should work with BAM fairly well (12 of 16bit,
* effectively, by shifting).
*
* int finesine[10240] - Sine lookup.
* Guess what, serves as cosine, too.
* Remarkable thing is, how to use BAMs with this?
*
* int tantoangle[2049] - ArcTan LUT,
* maps tan(angle) to angle fast. Gotta search.
*
*-----------------------------------------------------------------------------
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <stddef.h>
#include "w_wad.h"
#include "tables.h"
// killough 5/3/98: reformatted
int SlopeDiv(unsigned num, unsigned den)
{
unsigned ans;
if (den < 512)
return SLOPERANGE;
ans = (num<<3)/(den>>8);
return ans <= SLOPERANGE ? ans : SLOPERANGE;
}
fixed_t finetangent[4096];
//const fixed_t *const finecosine = &finesine[FINEANGLES/4];
fixed_t finesine[10240];
angle_t tantoangle[2049];
#include "m_swap.h"
#include "lprintf.h"
// R_LoadTrigTables
// Load trig tables from a wad file lump
// CPhipps 24/12/98 - fix endianness (!)
//
void R_LoadTrigTables(void)
{
int lump;
{
lump = (W_CheckNumForName)("SINETABL",ns_prboom);
if (lump == -1) I_Error("Failed to locate trig tables");
if (W_LumpLength(lump) != sizeof(finesine))
I_Error("R_LoadTrigTables: Invalid SINETABL");
W_ReadLump(lump,(unsigned char*)finesine);
}
{
lump = (W_CheckNumForName)("TANGTABL",ns_prboom);
if (lump == -1) I_Error("Failed to locate trig tables");
if (W_LumpLength(lump) != sizeof(finetangent))
I_Error("R_LoadTrigTables: Invalid TANGTABL");
W_ReadLump(lump,(unsigned char*)finetangent);
}
{
lump = (W_CheckNumForName)("TANTOANG",ns_prboom);
if (lump == -1) I_Error("Failed to locate trig tables");
if (W_LumpLength(lump) != sizeof(tantoangle))
I_Error("R_LoadTrigTables: Invalid TANTOANG");
W_ReadLump(lump,(unsigned char*)tantoangle);
}
// Endianness correction - might still be non-portable, but is fast where possible
{
size_t n;
lprintf(LO_INFO, "Endianness...");
// This test doesn't assume the endianness of the tables, but deduces them from
// en entry. I hope this is portable.
if ((10 < finesine[1]) && (finesine[1] < 100)) {
lprintf(LO_INFO, "ok.");
return; // Endianness is correct
}
// Must correct endianness of every long loaded (!)
#define CORRECT_TABLE_ENDIAN(tbl) \
for (n = 0; n<sizeof(tbl)/sizeof(tbl[0]); n++) tbl[n] = doom_swap_l(tbl[n])
CORRECT_TABLE_ENDIAN(finesine);
CORRECT_TABLE_ENDIAN(finetangent);
CORRECT_TABLE_ENDIAN(tantoangle);
lprintf(LO_INFO, "corrected.");
}
}