gzdoom/src/r_utility.h

168 lines
4.6 KiB
C
Raw Normal View History

2016-03-01 15:47:10 +00:00
#ifndef __R_UTIL_H
#define __R_UTIL_H
#include "r_state.h"
#include "vectors.h"
class FSerializer;
2016-03-01 15:47:10 +00:00
//
// Stuff from r_main.h that's needed outside the rendering code.
// Number of diminishing brightness levels.
// There a 0-31, i.e. 32 LUT in the COLORMAP lump.
#define NUMCOLORMAPS 32
struct FRenderViewpoint
{
player_t *player; // For which player is this viewpoint being renderered? (can be null for camera textures)
DVector3 Pos; // Camera position
DVector3 ActorPos; // Camera actor's position
DRotator Angles; // Camera angles
DVector3 Path; // View path for portal calculations
double Cos; // cos(Angles.Yaw)
double Sin; // sin(Angles.Yaw)
double TanCos; // FocalTangent * cos(Angles.Yaw)
double TanSin; // FocalTangent * sin(Angles.Yaw)
AActor *camera; // camera actor
sector_t *sector; // [RH] keep track of sector viewing from
DAngle FieldOfView; // current field of view
double TicFrac; // fraction of tic for interpolation
uint32_t FrameTime; // current frame's time in tics.
int extralight; // extralight to be added to this viewpoint
bool showviewer; // show the camera actor?
};
extern DVector3 ViewPos;
extern DVector3 ViewActorPos;
extern DAngle ViewAngle;
extern DAngle ViewPitch;
extern DAngle ViewRoll;
extern DVector3 ViewPath[2];
extern double ViewCos;
extern double ViewSin;
extern double ViewTanCos;
extern double ViewTanSin;
extern AActor* camera; // [RH] camera instead of viewplayer
extern sector_t* viewsector; // [RH] keep track of sector viewing from
extern DAngle FieldOfView;
extern double r_TicFracF;
extern uint32_t r_FrameTime;
extern int extralight;
extern bool r_showviewer;
//-----------------------------------
struct FViewWindow
{
double FocalTangent;
int centerx;
int centerxwide;
int centery;
float WidescreenRatio;
};
2016-03-01 15:47:10 +00:00
extern int centerx, centerxwide;
extern int centery;
extern double FocalTangent;
extern float WidescreenRatio;
2016-03-01 15:47:10 +00:00
//-----------------------------------
2016-03-01 15:47:10 +00:00
extern int setblocks;
2016-03-01 15:47:10 +00:00
extern bool r_NoInterpolate;
extern int validcount;
extern angle_t LocalViewAngle; // [RH] Added to consoleplayer's angle
extern int LocalViewPitch; // [RH] Used directly instead of consoleplayer's pitch
extern bool LocalKeyboardTurner; // [RH] The local player used the keyboard to turn, so interpolate
extern unsigned int R_OldBlend;
const double r_Yaspect = 200.0; // Why did I make this a variable? It's never set anywhere.
2016-03-01 15:47:10 +00:00
2016-12-30 05:08:47 +00:00
2016-03-01 15:47:10 +00:00
//==========================================================================
//
// R_PointOnSide
//
// Traverse BSP (sub) tree, check point against partition plane.
// Returns side 0 (front/on) or 1 (back).
//
// [RH] inlined, stripped down, and made more precise
//
//==========================================================================
inline int R_PointOnSide (fixed_t x, fixed_t y, const node_t *node)
{
return DMulScale32 (y-node->y, node->dx, node->x-x, node->dy) > 0;
}
inline int R_PointOnSide(double x, double y, const node_t *node)
{
return DMulScale32(FLOAT2FIXED(y) - node->y, node->dx, node->x - FLOAT2FIXED(x), node->dy) > 0;
}
inline int R_PointOnSide(const DVector2 &pos, const node_t *node)
{
return DMulScale32(FLOAT2FIXED(pos.Y) - node->y, node->dx, node->x - FLOAT2FIXED(pos.X), node->dy) > 0;
}
2016-03-01 15:47:10 +00:00
// Used for interpolation waypoints.
struct DVector3a
2016-03-01 15:47:10 +00:00
{
DVector3 pos;
DAngle angle;
2016-03-01 15:47:10 +00:00
};
subsector_t *R_PointInSubsector (fixed_t x, fixed_t y);
inline subsector_t *R_PointInSubsector(const DVector2 &pos)
{
return R_PointInSubsector(FLOAT2FIXED(pos.X), FLOAT2FIXED(pos.Y));
}
2016-03-01 15:47:10 +00:00
void R_ResetViewInterpolation ();
void R_RebuildViewInterpolation(player_t *player);
bool R_GetViewInterpolationStatus();
void R_ClearInterpolationPath();
void R_AddInterpolationPoint(const DVector3a &vec);
2016-03-01 15:47:10 +00:00
void R_SetViewSize (int blocks);
void R_SetFOV (DAngle fov);
2016-03-01 15:47:10 +00:00
void R_SetupFrame (AActor * camera);
void R_SetViewAngle ();
// Called by startup code.
void R_Init (void);
void R_ExecuteSetViewSize (void);
// Called by M_Responder.
void R_SetViewSize (int blocks);
void R_SetWindow (int windowSize, int fullWidth, int fullHeight, int stHeight, bool renderingToCanvas = false);
2016-03-01 15:47:10 +00:00
extern void R_FreePastViewers ();
extern void R_ClearPastViewer (AActor *actor);
class FCanvasTexture;
2016-03-01 15:47:10 +00:00
// This list keeps track of the cameras that draw into canvas textures.
struct FCanvasTextureInfo
{
FCanvasTextureInfo *Next;
TObjPtr<AActor*> Viewpoint;
2016-03-01 15:47:10 +00:00
FCanvasTexture *Texture;
FTextureID PicNum;
int FOV;
static void Add (AActor *viewpoint, FTextureID picnum, int fov);
static void UpdateAll ();
static void EmptyList ();
static void Serialize(FSerializer &arc);
2016-03-01 15:47:10 +00:00
static void Mark();
private:
static FCanvasTextureInfo *List;
};
#endif