NSView: Move stair smoothing etc. into our class.

This commit is contained in:
Marco Cawthorne 2022-08-03 10:50:44 -07:00
parent baab5c931c
commit caefb77078
Signed by: eukara
GPG Key ID: CE2032F0A2882A22
5 changed files with 140 additions and 126 deletions

View File

@ -25,6 +25,8 @@ NSView
float m_flFieldOfView;
viewmode_e m_viewmode;
vector m_vecLastOrigin;
/* the entity we're targetting */
NSEntity m_viewTarget;
@ -37,11 +39,11 @@ NSView
virtual void(viewmode_e) SetViewMode;
virtual viewmode_e(void) GetViewMode;
virtual void(void) StairSmooth;
virtual void(vector) AddPunchAngle;
virtual void(void) UpdateView;
virtual void(void) Render2D;
virtual void(vector) SetViewPosition;
virtual void(vector) SetViewSize;
virtual void(NSEntity) SetViewTarget;

View File

@ -12,9 +12,18 @@ NSView::SetupView(void)
/* this will hide said entity */
setproperty(VF_VIEWENTITY, player_localentnum);
setproperty(VF_ORIGIN, origin);
//setproperty(VF_CL_VIEWANGLES, angles);
setproperty(VF_ANGLES, angles);
/* handle camera override */
if (pSeat->m_flCameraTime > time || pSeat->m_flCameraTime == -1) {
setproperty(VF_ORIGIN, pSeat->m_vecCameraOrigin);
setproperty(VF_CL_VIEWANGLES, pSeat->m_vecCameraAngle);
setproperty(VF_ANGLES, pSeat->m_vecCameraAngle);
} else {
setproperty(VF_ORIGIN, origin);
//setproperty(VF_CL_VIEWANGLES, angles);
setproperty(VF_ANGLES, angles);
}
m_vecLastOrigin = origin;
}
void
@ -23,6 +32,35 @@ NSView::RenderView(void)
renderscene();
}
void
NSView::StairSmooth(void)
{
/* handle stair stepping */
if (GetViewMode() == VIEWMODE_FPS) {
vector endpos = origin;
/* Have we gone up since last frame? */
if ((m_viewTarget.flags & FL_ONGROUND) && (endpos[2] - m_vecLastOrigin[2] > 0)) {
endpos[2] = m_vecLastOrigin[2] += (clframetime * 150);
if (endpos[2] > origin[2]) {
endpos[2] = origin[2];
}
if (origin[2] - endpos[2] > 18) {
endpos[2] = origin[2] - 18;
}
}
// Teleport hack
if (fabs(origin[2] - m_vecLastOrigin[2]) > 64) {
endpos[2] = origin[2];
}
//setproperty(VF_ORIGIN, endpos);
origin = endpos;
}
}
void
NSView::SetViewPosition(vector new_pos)
{
@ -127,6 +165,12 @@ NSView::GetViewHeight(void)
return m_vecSize[1];
}
void
NSView::AddPunchAngle(vector vecAdd)
{
angles += vecAdd;
}
void View_PreDraw();
void View_PostDraw();
void View_DrawViewModel();
@ -137,12 +181,6 @@ void Voice_DrawHUD();
void Print_DrawCenterprint();
int VGUI_Draw();
void
NSView::Render2D(void)
{
Fade_Update(m_vecPosition[0], m_vecPosition[1], m_vecSize[0], m_vecSize[1]);
}
void
NSView::UpdateView(void)
{
@ -154,11 +192,15 @@ NSView::UpdateView(void)
if (!cl)
return;
/* run preframe code on our viewtarge */
clearscene();
/* run preframe code on our viewtarget */
cl.PreFrame();
/* some mods use this */
View_PreDraw();
/* update our player seat info with predicted info */
pSeat->m_vecPredictedOrigin = cl.origin;
pSeat->m_flPredictedFlags = cl.flags;
pSeat->m_vecPredictedVelocity = cl.velocity;
/* put entities into the scene (and call their predraws */
addentities(MASK_ENGINE);
@ -172,16 +214,15 @@ NSView::UpdateView(void)
cl.UpdateIntermissionCam();
}
pSeat->m_vecPredictedOrigin = cl.GetEyePos();
SetCameraOrigin(cl.GetEyePos());
SetCameraAngle(view_angles);
StairSmooth();
AddPunchAngle(cl.punchangle);
if (Client_IsDead(pl))
pl.UpdateDeathcam();
else
View_DrawViewModel();
break;
case VIEWMODE_THIRDPERSON:
break;
@ -209,72 +250,68 @@ NSView::UpdateView(void)
removeentity(c);
SetCameraOrigin(bp.GetEyePos());
SetCameraAngle(bp.v_angle);
/* 0 means world */
if (spec.spec_ent) {
c = findfloat(world, ::entnum, spec.spec_ent);
/* we found them */
if (c && c != spec) {
player ps = (player)c;
if (ps.health <= 0)
pl.UpdateDeathcam();
else
View_DrawViewModel();
}
}
}
break;
default:
SetCameraOrigin(cl.GetEyePos());
}
/* 0 means world */
if (spec.spec_ent) {
c = findfloat(world, ::entnum, spec.spec_ent);
/* we found them */
if (c && c != spec) {
player ps = (player)c;
if (ps.health <= 0)
pl.UpdateDeathcam();
else
View_DrawViewModel();
}
SetCameraAngle(view_angles);
}
break;
default:
break;
}
if (pSeat->m_flCameraTime > time || pSeat->m_flCameraTime == -1) {
} else {
}
View_PreDraw();
/* prepare our scene properties */
SetupView();
/* properties are locked in place, run logic that depends on final values */
addentities(MASK_GLOWS);
//setproperty(VF_DRAWWORLD, 1);
SkyCamera_Setup(getproperty(VF_ORIGIN));
SkyCamera_Setup(origin);
XR_UpdateView(m_viewTarget);
/* this is running whenever we're doing 'buildcubemaps' */
if (g_iCubeProcess == TRUE) {
//setproperty(VF_ORIGIN, g_vecCubePos);
//setproperty(VF_SIZE_X, g_dCubeSize);
//setproperty(VF_SIZE_Y, g_dCubeSize);
//setproperty(VF_AFOV, 90);
}
/* render the scene, then put monitor RenderTargets on top */
SetupView();
/* render our frame */
RenderView();
RenderTarget_Monitor_Update();
if (g_iCubeProcess == TRUE) {
cl.PostFrame();
return;
}
/* all 2D operations happen after this point */
for (entity b = world; (b = findfloat(b, ::isCSQC, 1));) {
NSEntity pf = (NSEntity) b;
pf.postdraw();
}
Render2D();
/* the blinding stuff */
Fade_Update(m_vecPosition[0], m_vecPosition[1], m_vecSize[0], m_vecSize[1]);
View_PostDraw();
/* move this into NSClient methods */
cl.PostFrame();
#if 0
Font_DrawText(m_vecPosition + [8,8], "NSView Debug Information", FONT_CON);
Font_DrawText(m_vecPosition + [8,20], sprintf("Seat: %i", m_iSeat), FONT_CON);
Font_DrawText(m_vecPosition + [8,32], sprintf("FOV: %d", m_flFieldOfView), FONT_CON);
Font_DrawText(m_vecPosition + [8,44], sprintf("Origin: %v", origin), FONT_CON);
Font_DrawText(m_vecPosition + [8,56], sprintf("Angles: %v", angles), FONT_CON);
Font_DrawText(m_vecPosition + [8,68], sprintf("View-Target: %d", num_for_edict(m_viewTarget)), FONT_CON);
Font_DrawText(m_vecPosition + [8,80], sprintf("View-Mode: %d", m_viewmode), FONT_CON);
#endif
}
void
@ -286,4 +323,4 @@ NSView::NSView(void)
m_iSeat = 0;
m_flFieldOfView = 90.0f;
m_client = __NULL__;
}
}

View File

@ -46,7 +46,7 @@ CSQC_Init(float apilevel, string enginename, float engineversion)
for (int i = 0; i < 4; i++) {
g_viewSeats[i] = spawn(NSView);
//g_viewSeats[i].SetSeatID(i+1);
g_viewSeats[i].SetSeatID(i);
}
pSeat = &g_seats[0];
@ -145,15 +145,13 @@ void
CSQC_RenderScene(void)
{
renderscene();
if (XR_Available(pSeat->m_ePlayer))
renderscene(); /* render it twice, for the normal window */
}
void
CSQC_Update2D(float w, float h, bool focus)
{
NSClientPlayer cl = (NSClientPlayer)pSeat->m_ePlayer;
self = cl;
if (Util_GetMaxPlayers() > 1 && !VGUI_Active() && (Client_InIntermission() || (!cl.IsFakeSpectator() && cl.IsDead()))) {
Scores_Draw();
@ -228,10 +226,6 @@ CSQC_UpdateView(float w, float h, float focus)
if (serverkeyfloat("background") == 1)
setpause(FALSE);
/* prepare rendering our views... */
clearscene();
setproperty(VF_DRAWENGINESBAR, 0);
setproperty(VF_DRAWCROSSHAIR, 0);
/* bounds sanity check */
if (numclientseats > g_seats.length) {
@ -246,29 +240,44 @@ CSQC_UpdateView(float w, float h, float focus)
pSeat->m_ePlayer = world;
}
/* now render each player seat */
for (s = numclientseats; s-- > 0;) {
pSeat = &g_seats[s];
pSeatLocal = &g_seatslocal[s];
g_view = g_viewSeats[s];
pSeat->m_ePlayer = findfloat(world, ::entnum, player_localentnum);
cl = (NSClient)pSeat->m_ePlayer;
/* this is running whenever we're doing 'buildcubemaps' */
if (g_iCubeProcess == TRUE) {
setproperty(VF_DRAWENGINESBAR, 0);
setproperty(VF_DRAWCROSSHAIR, 0);
setproperty(VF_DRAWWORLD, 1);
setproperty(VF_MIN, [0,0]);
setproperty(VF_VIEWENTITY, player_localentnum);
setproperty(VF_ORIGIN, g_vecCubePos);
setproperty(VF_ANGLES, [0,0,0]);
setproperty(VF_SIZE_X, g_dCubeSize);
setproperty(VF_SIZE_Y, g_dCubeSize);
setproperty(VF_AFOV, 90);
CSQC_RenderScene();
} else {
/* now render each player seat */
for (s = numclientseats; s-- > 0;) {
pSeat = &g_seats[s];
pSeatLocal = &g_seatslocal[s];
g_view = g_viewSeats[s];
pSeat->m_ePlayer = findfloat(world, ::entnum, player_localentnum);
cl = (NSClient)pSeat->m_ePlayer;
/* set up our single/split viewport */
View_CalcViewport(s, w, h);
/* set up our single/split viewport */
View_CalcViewport(s, w, h);
/* our view target ourselves, if we're alive... */
g_view.SetViewTarget((NSEntity)pSeat->m_ePlayer);
/* our view target ourselves, if we're alive... */
g_view.SetViewTarget((NSEntity)pSeat->m_ePlayer);
if (Client_IsSpectator(cl))
g_view.SetViewMode(VIEWMODE_SPECTATING);
else
g_view.SetViewMode(VIEWMODE_FPS);
if (Client_IsSpectator(cl))
g_view.SetViewMode(VIEWMODE_SPECTATING);
else
g_view.SetViewMode(VIEWMODE_FPS);
g_view.UpdateView();
g_view.UpdateView();
/* 2D calls happen here, after rendering is done */
CSQC_Update2D(w, h, focus);
/* 2D calls happen here, after rendering is done */
CSQC_Update2D(w, h, focus);
}
}
/* this sucks and doesn't take seats into account */

View File

@ -235,20 +235,12 @@ View_DrawViewModel(void)
/* now apply the scale hack */
m_eViewModelL.scale = m_eViewModel.scale = autocvar_r_viewmodelscale;
if (Client_IsSpectator(cl)) {
m_eViewModelL.origin = getproperty(VF_ORIGIN);
m_eViewModel.origin = getproperty(VF_ORIGIN);
m_eViewModel.angles = pl.v_angle;
m_eViewModelL.angles = pl.v_angle;
} else {
m_eViewModelL.origin = pl.m_xrInputLeft.GetOrigin();
m_eViewModel.origin = pl.m_xrInputRight.GetOrigin();
}
if (Client_IsSpectator(cl) || XR_Available(pl) == false) {
m_eViewModelL.origin = g_view.GetCameraOrigin();
m_eViewModel.origin = g_view.GetCameraOrigin();
m_eViewModel.angles = g_view.GetCameraAngle();
m_eViewModelL.angles = g_view.GetCameraAngle();
if (XR_Available(pl) && !Client_IsSpectator(cl)) {
m_eViewModel.angles = pl.m_xrInputRight.GetAngles();
m_eViewModelL.angles = pl.m_xrInputLeft.GetAngles();
} else {
/* we only calculate bob on the right model, to avoid double speed bobbing */
Viewmodel_CalcBob();
Viewmodel_ApplyBob(m_eViewModel);
@ -260,6 +252,11 @@ View_DrawViewModel(void)
Camera_RunBob(view_angles);
setproperty(VF_ANGLES, view_angles + pl.punchangle);
}
} else {
m_eViewModelL.origin = pl.m_xrInputLeft.GetOrigin();
m_eViewModel.origin = pl.m_xrInputRight.GetOrigin();
m_eViewModel.angles = pl.m_xrInputRight.GetAngles();
m_eViewModelL.angles = pl.m_xrInputLeft.GetAngles();
}
/* this is currently broken */
@ -310,41 +307,10 @@ View_DrawViewModel(void)
}
}
void
View_Stairsmooth(void)
{
vector currentpos = pSeat->m_vecPredictedOrigin;
vector endpos = currentpos;
static vector oldpos;
/* Have we gone up since last frame? */
if ((pSeat->m_flPredictedFlags & FL_ONGROUND) && (endpos[2] - oldpos[2] > 0)) {
endpos[2] = oldpos[2] += (clframetime * 150);
if (endpos[2] > currentpos[2]) {
endpos[2] = currentpos[2];
}
if (currentpos[2] - endpos[2] > 18) {
endpos[2] = currentpos[2] - 18;
}
}
// Teleport hack
if (fabs(currentpos[2] - oldpos[2]) > 64) {
endpos[2] = currentpos[2];
}
//setproperty(VF_ORIGIN, endpos);
pSeat->m_vecPredictedOrigin = endpos;
oldpos = endpos;
}
void
View_PreDraw(void)
{
ClientGame_PreDraw();
View_Stairsmooth();
}
void

View File

@ -68,7 +68,7 @@ XR_UpdateView(entity ePlayer)
/* update our space */
if (XR_Available(ePlayer)) {
pl.m_xrSpace.SetOrigin(pSeat->m_vecPredictedOrigin);
pl.m_xrSpace.SetOrigin(g_view.GetCameraOrigin());
pl.m_xrSpace.SetAngles(view_angles);
/* now we get the HMD's org/ang and send that off to the renderer */