mirror of
https://github.com/DrBeef/DVR.git
synced 2024-12-19 09:01:35 +00:00
128 lines
4 KiB
C
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.");
|
|
}
|
|
}
|