NSView: Move stair smoothing etc. into our class.
This commit is contained in:
parent
baab5c931c
commit
caefb77078
|
@ -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;
|
||||
|
|
|
@ -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__;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue