mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2024-11-21 20:11:12 +00:00
171 lines
5.1 KiB
C
171 lines
5.1 KiB
C
// SONIC ROBO BLAST 2
|
|
//-----------------------------------------------------------------------------
|
|
// Copyright (C) 1993-1996 by id Software, Inc.
|
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
|
// Copyright (C) 1999-2000 by Jess Haas, Nicolas Kalkhof, Colin Phipps, Florian Schulze, Andrey Budko (prboom)
|
|
// Copyright (C) 1999-2024 by Sonic Team Junior.
|
|
//
|
|
// This program is free software distributed under the
|
|
// terms of the GNU General Public License, version 2.
|
|
// See the 'LICENSE' file for more details.
|
|
//-----------------------------------------------------------------------------
|
|
/// \file r_fps.h
|
|
/// \brief Uncapped framerate stuff.
|
|
|
|
#ifndef __R_FPS_H__
|
|
#define __R_FPS_H__
|
|
|
|
#include "m_fixed.h"
|
|
#include "p_local.h"
|
|
#include "r_state.h"
|
|
#include "m_perfstats.h" // ps_metric_t
|
|
|
|
extern consvar_t cv_fpscap;
|
|
|
|
extern ps_metric_t ps_interp_frac;
|
|
extern ps_metric_t ps_interp_lag;
|
|
|
|
UINT32 R_GetFramerateCap(void);
|
|
boolean R_UsingFrameInterpolation(void);
|
|
|
|
enum viewcontext_e
|
|
{
|
|
VIEWCONTEXT_PLAYER1 = 0,
|
|
VIEWCONTEXT_PLAYER2,
|
|
VIEWCONTEXT_SKY1,
|
|
VIEWCONTEXT_SKY2
|
|
};
|
|
|
|
typedef struct {
|
|
fixed_t x;
|
|
fixed_t y;
|
|
fixed_t z;
|
|
boolean sky;
|
|
sector_t *sector;
|
|
player_t *player;
|
|
|
|
angle_t angle;
|
|
angle_t aim;
|
|
fixed_t cos;
|
|
fixed_t sin;
|
|
mobj_t *mobj;
|
|
} viewvars_t;
|
|
|
|
extern viewvars_t *newview;
|
|
|
|
typedef struct {
|
|
fixed_t x;
|
|
fixed_t y;
|
|
fixed_t z;
|
|
subsector_t *subsector;
|
|
angle_t angle;
|
|
angle_t pitch;
|
|
angle_t roll;
|
|
angle_t spriteroll;
|
|
fixed_t scale;
|
|
fixed_t radius;
|
|
fixed_t height;
|
|
fixed_t spritexscale;
|
|
fixed_t spriteyscale;
|
|
fixed_t spritexoffset;
|
|
fixed_t spriteyoffset;
|
|
} interpmobjstate_t;
|
|
|
|
// Level interpolators
|
|
|
|
// The union tag for levelinterpolator_t
|
|
typedef enum {
|
|
LVLINTERP_SectorPlane,
|
|
LVLINTERP_SectorScroll,
|
|
LVLINTERP_SideScroll,
|
|
LVLINTERP_Polyobj,
|
|
LVLINTERP_DynSlope,
|
|
} levelinterpolator_type_e;
|
|
|
|
// Tagged union of a level interpolator
|
|
typedef struct levelinterpolator_s {
|
|
levelinterpolator_type_e type;
|
|
thinker_t *thinker;
|
|
union {
|
|
struct {
|
|
sector_t *sector;
|
|
fixed_t oldheight;
|
|
fixed_t bakheight;
|
|
boolean ceiling;
|
|
} sectorplane;
|
|
struct {
|
|
sector_t *sector;
|
|
fixed_t oldxoffs, oldyoffs, bakxoffs, bakyoffs;
|
|
boolean ceiling;
|
|
} sectorscroll;
|
|
struct {
|
|
side_t *side;
|
|
fixed_t oldtextureoffset, oldrowoffset, baktextureoffset, bakrowoffset;
|
|
} sidescroll;
|
|
struct {
|
|
polyobj_t *polyobj;
|
|
fixed_t *oldvertices;
|
|
fixed_t *bakvertices;
|
|
size_t vertices_size;
|
|
fixed_t oldcx, oldcy, bakcx, bakcy;
|
|
angle_t oldangle, bakangle;
|
|
} polyobj;
|
|
struct {
|
|
pslope_t *slope;
|
|
vector3_t oldo, bako;
|
|
vector2_t oldd, bakd;
|
|
fixed_t oldzdelta, bakzdelta;
|
|
dvector3_t oldorigin, bakorigin;
|
|
dvector3_t oldnormdir, baknormdir;
|
|
double olddzdelta, bakdzdelta;
|
|
} dynslope;
|
|
};
|
|
} levelinterpolator_t;
|
|
|
|
// Interpolates the current view variables (r_state.h) against the selected view context in R_SetViewContext
|
|
void R_InterpolateView(fixed_t frac);
|
|
// Buffer the current new views into the old views. Call once after each real tic.
|
|
void R_UpdateViewInterpolation(void);
|
|
// Reset the view states (e.g. after level load) so R_InterpolateView doesn't interpolate invalid data
|
|
void R_ResetViewInterpolation(UINT8 p);
|
|
// Set the current view context (the viewvars pointed to by newview)
|
|
void R_SetViewContext(enum viewcontext_e _viewcontext);
|
|
|
|
fixed_t R_InterpolateFixed(fixed_t from, fixed_t to);
|
|
angle_t R_InterpolateAngle(angle_t from, angle_t to);
|
|
|
|
// Evaluate the interpolated mobj state for the given mobj
|
|
void R_InterpolateMobjState(mobj_t *mobj, fixed_t frac, interpmobjstate_t *out);
|
|
// Evaluate the interpolated mobj state for the given precipmobj
|
|
void R_InterpolatePrecipMobjState(precipmobj_t *mobj, fixed_t frac, interpmobjstate_t *out);
|
|
|
|
void R_CreateInterpolator_SectorPlane(thinker_t *thinker, sector_t *sector, boolean ceiling);
|
|
void R_CreateInterpolator_SectorScroll(thinker_t *thinker, sector_t *sector, boolean ceiling);
|
|
void R_CreateInterpolator_SideScroll(thinker_t *thinker, side_t *side);
|
|
void R_CreateInterpolator_Polyobj(thinker_t *thinker, polyobj_t *polyobj);
|
|
void R_CreateInterpolator_DynSlope(thinker_t *thinker, pslope_t *slope);
|
|
|
|
// Initialize level interpolators after a level change
|
|
void R_InitializeLevelInterpolators(void);
|
|
// Update level interpolators, storing the previous and current states.
|
|
void R_UpdateLevelInterpolators(void);
|
|
// Clear states for all level interpolators for the thinker
|
|
void R_ClearLevelInterpolatorState(thinker_t *thinker);
|
|
// Apply level interpolators to the actual game state
|
|
void R_ApplyLevelInterpolators(fixed_t frac);
|
|
// Restore level interpolators to the real game state
|
|
void R_RestoreLevelInterpolators(void);
|
|
// Destroy interpolators associated with a thinker
|
|
void R_DestroyLevelInterpolators(thinker_t *thinker);
|
|
|
|
// Initialize internal mobj interpolator list (e.g. during level loading)
|
|
void R_InitMobjInterpolators(void);
|
|
// Add interpolation state for the given mobj
|
|
void R_AddMobjInterpolator(mobj_t *mobj);
|
|
// Remove the interpolation state for the given mobj
|
|
void R_RemoveMobjInterpolator(mobj_t *mobj);
|
|
void R_UpdateMobjInterpolators(void);
|
|
void R_ResetMobjInterpolationState(mobj_t *mobj);
|
|
void R_ResetPrecipitationMobjInterpolationState(precipmobj_t *mobj);
|
|
|
|
#endif
|