UltimateZoneBuilder/Source/Native/VPO/vpo_local.h
Magnus Norddahl 8eb522c873 Move vpo native code into BuilderNative as it is easier to manage. The plugins folder doesn't support including native dlls properly anyway.
Fix visplane explorer busy looping when waiting for data and reduce the used core count to 75% of the total available
Made vpo native code thread safe, removing the need for ungodly DLL patching hacks
2020-04-19 15:56:24 +02:00

435 lines
10 KiB
C++

//------------------------------------------------------------------------
// Visplane Overflow Library
//------------------------------------------------------------------------
//
// Copyright (C) 1993-1996 Id Software, Inc.
// Copyright (C) 2005 Simon Howard
// Copyright (C) 2012 Andrew Apted
//
// 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.
//
//------------------------------------------------------------------------
#ifndef __VPO_LOCAL_H__
#define __VPO_LOCAL_H__
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4244) // warning C4244: '=': conversion from '__int64' to 'int', possible loss of data
#pragma warning(disable: 4146) // warning C4146: unary minus operator applied to unsigned type, result still unsigned
#pragma warning(disable: 4267) // warning C4267: '=': conversion from 'size_t' to 'int', possible loss of data
#pragma warning(disable: 4996) // warning C4996: 'strdup': The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name: _strdup.
#endif
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <math.h>
#include "sys_type.h"
#include "sys_macro.h"
#include "sys_endian.h"
namespace vpo
{
#include "doomtype.h"
#include "doomdef.h"
#include "doomdata.h"
#include "m_bbox.h"
#include "m_fixed.h"
#include "w_file.h"
#include "w_wad.h"
#include "tables.h"
#include "r_defs.h"
#include "r_state.h"
#include "r_main.h"
#include "r_bsp.h"
#include "r_plane.h"
//------------------------------------------------------------
#define SHORT(x) LE_S16(x)
#define LONG(x) LE_S32(x)
const char * P_SetupLevel (const char *lumpname, bool *is_hexen );
void P_FreeLevelData (void);
void I_Error (const char *error, ...);
sector_t * X_SectorForPoint(fixed_t x, fixed_t y);
// exceptions thrown on overflows
class overflow_exception { };
//
// ClipWallSegment
// Clips the given range of columns
// and includes it in the new clip list.
//
typedef struct
{
int first;
int last;
} cliprange_t;
// andrewj: increased limit to 128 for Visplane Explorer
// #define MAXSOLIDSEGS 32
#define MAXSOLIDSEGS 128
typedef struct
{
// Should be "IWAD" or "PWAD".
char identification[4];
int numlumps;
int infotableofs;
} PACKEDATTR wadinfo_t;
typedef struct
{
int filepos;
int size;
char name[8];
} PACKEDATTR filelump_t;
struct Context
{
void M_ClearBox(fixed_t* box);
void M_AddToBox(fixed_t* box, fixed_t x, fixed_t y);
void LevelError(const char* msg, ...);
void P_LoadVertexes(int lump);
sector_t* GetSectorAtNullAddress();
void P_LoadSegs(int lump);
void P_LoadSubsectors(int lump);
void ValidateSubsectors();
void P_LoadSectors(int lump);
bool isChildValid(unsigned short child);
void P_LoadNodes(int lump);
void LineDef_CommonSetup(line_t* ld);
void P_LoadLineDefs(int lump);
void P_LoadLineDefs_Hexen(int lump);
void P_LoadSideDefs(int lump);
void P_GroupLines();
int HasManualDoor(const sector_t* sec);
void CalcDoorAltHeight(sector_t* sec);
void P_DetectDoorSectors();
const char* P_SetupLevel(const char* lumpname, bool* is_hexen);
void P_FreeLevelData();
void R_ClearDrawSegs();
void R_ClipSolidWallSegment(int first, int last);
void R_ClipPassWallSegment(int first, int last);
void R_ClearClipSegs();
void R_AddLine(seg_t* line);
boolean R_CheckBBox(fixed_t* bspcoord);
void R_Subsector(int num);
void R_RenderBSPNode(int bspnum);
void R_AddPointToBox(int x, int y, fixed_t* box);
int R_PointOnSide(fixed_t x, fixed_t y, node_t* node);
int R_PointOnSegSide(fixed_t x, fixed_t y, seg_t* line);
angle_t R_PointToAngle(fixed_t x, fixed_t y);
angle_t R_PointToAngle2(fixed_t x1, fixed_t y1, fixed_t x2, fixed_t y2);
fixed_t R_PointToDist(fixed_t x, fixed_t y);
fixed_t R_ScaleFromGlobalAngle(angle_t visangle);
void R_InitBuffer(int width, int height);
void R_InitTextureMapping();
void R_SetViewSize(int blocks, int detail);
void R_Init();
subsector_t* R_PointInSubsector(fixed_t x, fixed_t y);
void R_SetupFrame(fixed_t x, fixed_t y, fixed_t z, angle_t angle);
void R_RenderView(fixed_t x, fixed_t y, fixed_t z, angle_t angle);
void R_ClearPlanes();
visplane_t* R_FindPlane(fixed_t height, int picnum, int lightlevel);
visplane_t* R_CheckPlane(visplane_t* pl, int start, int stop);
void R_RenderSegLoop();
void R_StoreWallRange(int start, int stop);
void ClearError();
void SetError(const char* msg, ...);
void I_Error(const char* error, ...);
int ClosestLine_CastingHoriz(fixed_t x, fixed_t y, int* side);
sector_t* X_SectorForPoint(fixed_t x, fixed_t y);
wad_file_t* W_OpenFile(const char* path);
void W_CloseFile(wad_file_t* wad);
size_t W_Read(wad_file_t* wad, unsigned int offset, void* buffer, size_t buffer_len);
int CheckMapHeader(filelump_t* lumps, int num_after);
bool W_AddFile(const char* filename);
void W_RemoveFile();
int W_NumLumps();
int W_CheckNumForName(const char* name);
int W_LumpLength(int lumpnum);
void W_ReadLump(int lump, void* dest);
byte* W_LoadLump(int lumpnum);
void W_FreeLump(byte* data);
void W_BeginRead();
void W_EndRead();
// the error message returned from P_SetupLevel()
char level_error_msg[1024] = {};
bool level_is_hexen = {};
vertex_t* vertexes = {};
int numvertexes = {};
seg_t* segs = {};
int numsegs = {};
sector_t* sectors = {};
int numsectors = {};
subsector_t* subsectors = {};
int numsubsectors = {};
node_t* nodes = {};
int numnodes = {};
line_t* lines = {};
int numlines = {};
side_t* sides = {};
int numsides = {};
fixed_t Map_bbox[4] = {};
seg_t* curline = {};
side_t* sidedef = {};
line_t* linedef = {};
sector_t* frontsector = {};
sector_t* backsector = {};
drawseg_t drawsegs[MAXDRAWSEGS + 10] = {};
drawseg_t* ds_p = {};
int total_drawsegs = {};
// newend is one past the last valid seg
cliprange_t solidsegs[MAXSOLIDSEGS + 8] = {};
cliprange_t* newend = {};
int max_solidsegs = {};
int viewangleoffset = {};
// increment every time a check is made
int validcount = 1;
int centerx = {};
int centery = {};
fixed_t centerxfrac = {};
fixed_t centeryfrac = {};
fixed_t projection = {};
// just for profiling purposes
int framecount = {};
int sscount = {};
int linecount = {};
int loopcount = {};
fixed_t viewx = {};
fixed_t viewy = {};
fixed_t viewz = {};
angle_t viewangle = {};
fixed_t viewcos = {};
fixed_t viewsin = {};
//
// precalculated math tables
//
angle_t clipangle = {};
// The viewangletox[viewangle + FINEANGLES/4] lookup
// maps the visible view angles to screen X coordinates,
// flattening the arc to a flat projection plane.
// There will be many angles mapped to the same X.
int viewangletox[FINEANGLES / 2] = {};
// The xtoviewangleangle[] table maps a screen pixel
// to the lowest viewangle that maps back to x ranges
// from clipangle to -clipangle.
angle_t xtoviewangle[SCREENWIDTH + 1] = {};
// UNUSED.
// The finetangentgent[angle+FINEANGLES/4] table
// holds the fixed_t tangent values for view angles,
// ranging from INT_MIN to 0 to INT_MAX.
// fixed_t finetangent[FINEANGLES/2];
// fixed_t finesine[5*FINEANGLES/4];
const fixed_t* finecosine = &finesine[FINEANGLES / 4];
// bumped light from gun blasts
int extralight = {};
// from R_DRAW
int viewwidth = {};
int scaledviewwidth = {};
int viewheight = {};
int viewwindowx = {};
int viewwindowy = {};
// from R_THINGS
fixed_t pspritescale = {};
fixed_t pspriteiscale = {};
short screenheightarray[SCREENWIDTH] = {};
short negonearray[SCREENWIDTH] = {};
//
// opening
//
// Here comes the obnoxious "visplane".
visplane_t visplanes[MAXVISPLANES + 10] = {};
visplane_t* lastvisplane = {};
visplane_t* floorplane = {};
visplane_t* ceilingplane = {};
int total_visplanes = {};
short openings[MAXOPENINGS + 400] = {};
short* lastopening = {};
int total_openings = {};
//
// Clip values are the solid pixel bounding the range.
// floorclip starts out SCREENHEIGHT
// ceilingclip starts out -1
//
short floorclip[SCREENWIDTH] = {};
short ceilingclip[SCREENWIDTH] = {};
//
// spanstart holds the start of a plane span
// initialized to 0 at start
//
int spanstart[SCREENHEIGHT] = {};
int spanstop[SCREENHEIGHT] = {};
//
// texture mapping
//
fixed_t planeheight = {};
fixed_t yslope[SCREENHEIGHT] = {};
fixed_t distscale[SCREENWIDTH] = {};
fixed_t basexscale = {};
fixed_t baseyscale = {};
fixed_t cachedheight[SCREENHEIGHT] = {};
fixed_t cacheddistance[SCREENHEIGHT] = {};
fixed_t cachedxstep[SCREENHEIGHT] = {};
fixed_t cachedystep[SCREENHEIGHT] = {};
// OPTIMIZE: closed two sided lines as single sided
// True if any of the segs textures might be visible.
boolean segtextured = {};
// False if the back side is the same plane.
boolean markfloor = {};
boolean markceiling = {};
boolean maskedtexture = {};
int toptexture = {};
int bottomtexture = {};
int midtexture = {};
angle_t rw_normalangle = {};
// angle to line origin
int rw_angle1 = {};
//
// regular wall
//
int rw_x = {};
int rw_stopx = {};
angle_t rw_centerangle = {};
fixed_t rw_offset = {};
fixed_t rw_distance = {};
fixed_t rw_scale = {};
fixed_t rw_scalestep = {};
fixed_t rw_midtexturemid = {};
fixed_t rw_toptexturemid = {};
fixed_t rw_bottomtexturemid = {};
int worldtop = {};
int worldbottom = {};
int worldhigh = {};
int worldlow = {};
fixed_t pixhigh = {};
fixed_t pixlow = {};
fixed_t pixhighstep = {};
fixed_t pixlowstep = {};
fixed_t topfrac = {};
fixed_t topstep = {};
fixed_t bottomfrac = {};
fixed_t bottomstep = {};
short* maskedtexturecol = {};
// R_DRAW bits
int dc_x = {};
int dc_yl = {};
int dc_yh = {};
fixed_t dc_iscale = {};
fixed_t dc_texturemid = {};
char error_buffer[1024] = {};
char mapname_buffer[16] = {};
// cache for the sector lookup
int last_x = {};
int last_y = {};
sector_t* last_sector = {};
// Location of each lump on disk.
lumpinfo_t* lumpinfo = {};
int numlumps = 0;
char* wad_filename = {};
wad_file_t* current_file = {};
};
} // namespace vpo
#endif /* __VPO_LOCAL_H__ */
//--- editor settings ---
// vi:ts=4:sw=4:noexpandtab