371 lines
8.7 KiB
C
371 lines
8.7 KiB
C
/*
|
||
* Copyright (c) 2016-2022 Vera Visions LLC.
|
||
*
|
||
* Permission to use, copy, modify, and distribute this software for any
|
||
* purpose with or without fee is hereby granted, provided that the above
|
||
* copyright notice and this permission notice appear in all copies.
|
||
*
|
||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
|
||
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
|
||
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||
*/
|
||
|
||
#include "text.h"
|
||
#include "textmenu.h"
|
||
#include "efx.h"
|
||
#include "font.h"
|
||
#include "fade.h"
|
||
#include "cmd.h"
|
||
#include "util.h"
|
||
#include "NSView.h"
|
||
#include "crosshair.h"
|
||
|
||
var bool g_net_debug = false;
|
||
|
||
#define PRINTFLAG(x) if (cvar("net_showUpdates") || g_net_debug) \
|
||
print(sprintf("%f %s read update %s\n", time, classname, #x));
|
||
|
||
#define READENTITY_BYTE(field, changedflag) {\
|
||
if (flChanged & changedflag) {\
|
||
field = readbyte();\
|
||
PRINTFLAG(changedflag); \
|
||
}\
|
||
}
|
||
|
||
#define READENTITY_SHORT(field, changedflag) {\
|
||
if (flChanged & changedflag) {\
|
||
field = readshort();\
|
||
PRINTFLAG(changedflag); \
|
||
}\
|
||
}
|
||
|
||
#define READENTITY_FLOAT(field, changedflag) {\
|
||
if (flChanged & changedflag) {\
|
||
field = readfloat();\
|
||
PRINTFLAG(changedflag); \
|
||
}\
|
||
}
|
||
|
||
#define READENTITY_INT(field, changedflag) {\
|
||
if (flChanged & changedflag) {\
|
||
field = readint();\
|
||
PRINTFLAG(changedflag); \
|
||
}\
|
||
}
|
||
|
||
#define READENTITY_STRING(field, changedflag) {\
|
||
if (flChanged & changedflag) {\
|
||
field = readstring();\
|
||
PRINTFLAG(changedflag); \
|
||
}\
|
||
}
|
||
|
||
#define READENTITY_COORD(field, changedflag) {\
|
||
if (flChanged & changedflag) {\
|
||
field = readcoord();\
|
||
PRINTFLAG(changedflag); \
|
||
}\
|
||
}
|
||
|
||
#define READENTITY_ANGLE(field, changedflag) {\
|
||
if (flChanged & changedflag) {\
|
||
field = readshort() / (32767 / 360);\
|
||
PRINTFLAG(changedflag); \
|
||
}\
|
||
}
|
||
|
||
#define READENTITY_ENTITY(field, changedflag) {\
|
||
if (flChanged & changedflag) {\
|
||
field = findfloat(world, ::entnum, readentitynum());\
|
||
PRINTFLAG(changedflag); \
|
||
}\
|
||
}
|
||
|
||
#define READENTITY_ENTNUM(field, changedflag) {\
|
||
if (flChanged & changedflag) {\
|
||
field = readentitynum();\
|
||
PRINTFLAG(changedflag); \
|
||
}\
|
||
}
|
||
|
||
/* undocumented printcall types */
|
||
#define PRINT_LOW 0
|
||
#define PRINT_MEDIUM 1
|
||
#define PRINT_HIGH 2
|
||
#define PRINT_CHAT 3
|
||
|
||
var bool g_dlight_cached = false;
|
||
|
||
const float MASK_GLOWS = 16;
|
||
var bool g_focus;
|
||
bool Util_IsFocused(void);
|
||
|
||
var int g_numplayerslots;
|
||
int Util_GetMaxPlayers(void);
|
||
|
||
/* fonts */
|
||
font_s FONT_16;
|
||
font_s FONT_20;
|
||
font_s FONT_CON;
|
||
|
||
//var string g_shellchrome;
|
||
var float g_shellchromeshader;
|
||
var float g_shellchromeshader_cull;
|
||
|
||
/* clientside cvars */
|
||
var float autocvar_in_zoomSensitivity = 1.0f;
|
||
var int autocvar_pm_stairSmoothing = TRUE;
|
||
var int autocvar_pm_thirdPerson = FALSE;
|
||
var int autocvar_cg_viewmodelFlip = FALSE;
|
||
var vector autocvar_con_color = [255,150,0];
|
||
var vector autocvar_vgui_color = [255,170,0];
|
||
var vector autocvar_cg_viewmodelOffset = [0,0,0];
|
||
var int autocvar_cg_viewmodelPass = 0;
|
||
var float autocvar_cg_viewmodelFov = 90.0f;
|
||
var float autocvar_cg_viewmodelScale = 1.0f;
|
||
var float autocvar_cg_hudAspect = 0.0f;
|
||
var bool autocvar_pm_crouchToggle = false;
|
||
|
||
/* particle descriptors */
|
||
var float PART_DUSTMOTE;
|
||
var float PART_BURNING;
|
||
|
||
/* misc globals */
|
||
vector video_mins;
|
||
vector video_res;
|
||
vector mouse_pos;
|
||
int g_iIntermission;
|
||
|
||
/* this actually belongs in builtins.h since its an undocumented global */
|
||
float clframetime;
|
||
|
||
string(string modelname, int frame, float frametime) spriteframe = #0;
|
||
|
||
void CSQC_UpdateSeat(void);
|
||
|
||
/** Like drawstring() but aligns text to the right from the specified screen coordinates. */
|
||
void
|
||
drawstring_r(vector p, string t, vector s, vector c, float a, float f)
|
||
{
|
||
p[0] -= stringwidth(t, TRUE, s);
|
||
drawstring(p, t, s, c, a, f);
|
||
}
|
||
|
||
void GameMessage_Setup(string, int);
|
||
void View_SetMuzzleflash(int);
|
||
|
||
void Event_Callback(float mtime, __inout float btime);
|
||
void View_AddEvent(void(void) pCallback, float flTime);
|
||
void View_PlayAnimation(int);
|
||
void View_PlayAnimation(int);
|
||
void Event_ProcessModel(float, int, string);
|
||
void ClientGame_ModelEvent(float, int, string);
|
||
|
||
void View_EnableViewmodel(void);
|
||
void View_DisableViewmodel(void);
|
||
|
||
/** Draws a non-filled rectangle with a specified outline. */
|
||
void drawrect(vector pos, vector sz, float thickness, vector rgb, float al, optional float dfl)
|
||
{
|
||
/* top */
|
||
drawfill(pos, [sz[0], thickness], rgb, al, dfl);
|
||
/* bottom */
|
||
drawfill(pos + [0, sz[1] - thickness], [sz[0], thickness], rgb, al, dfl);
|
||
/* left */
|
||
drawfill(pos + [0, thickness], [thickness, sz[1] - (thickness * 2)], rgb, al, dfl);
|
||
/* right */
|
||
drawfill(pos + [sz[0] - thickness, thickness], [thickness, sz[1] - (thickness * 2)], rgb, al, dfl);
|
||
}
|
||
|
||
|
||
/** Like drawpic, but instead of screen coords, it will take world coords.
|
||
Will project the 2D image relative to the active NSView that we're currently
|
||
rendering in (g_view). So it may only be called within certain contexts. */
|
||
void
|
||
drawpic3d(vector worldpos, string mat, vector sz, vector rgb, float alpha)
|
||
{
|
||
static bool
|
||
drawpic3d_visible(vector p1) {
|
||
vector delta;
|
||
float fov;
|
||
vector p2 = g_view.GetCameraOrigin();
|
||
vector ang = g_view.GetCameraAngle();
|
||
|
||
makevectors(ang);
|
||
delta = normalize (p1 - p2);
|
||
fov = delta * v_forward;
|
||
|
||
if (fov > (g_view.GetAFOV()/180)) {
|
||
traceline(p2, p1, MOVE_WORLDONLY, self);
|
||
if (trace_fraction == 1.0) {
|
||
return (1);
|
||
}
|
||
}
|
||
return (0);
|
||
}
|
||
|
||
if (drawpic3d_visible(worldpos) == true) {
|
||
vector vecProj = project(worldpos) - (sz/2);
|
||
drawpic(vecProj, mat, sz, rgb, alpha);
|
||
}
|
||
}
|
||
|
||
/** Draws a (debug) cone in 3D space. */
|
||
void
|
||
drawcone(vector vecOrigin, vector vecAngle, int iDivisions, float flLength, float flRadius, vector vecColor, float flAlpha)
|
||
{
|
||
vector c;
|
||
vector e0;
|
||
vector e1;
|
||
float angDelta;
|
||
|
||
static vector
|
||
perpendicularCross(vector v)
|
||
{
|
||
float min = fabs(v[0]);
|
||
vector ca = [1, 0, 0];
|
||
|
||
if (fabs(v[1]) < min) {
|
||
min = fabs(v.y);
|
||
ca = [0, 1, 0];
|
||
}
|
||
|
||
if (fabs(v[2]) < min) {
|
||
ca = [0, 0, 1];
|
||
}
|
||
|
||
return crossproduct(v, ca);
|
||
}
|
||
|
||
makevectors(vecAngle + [0, 0, 0]);
|
||
vecAngle = v_forward * -1;
|
||
c = vecOrigin + (-vecAngle * flLength);
|
||
e0 = perpendicularCross(vecAngle);
|
||
e1 = crossproduct(e0, vecAngle);
|
||
angDelta = 360.0 / |