diff --git a/src/client/cl_view.c b/src/client/cl_view.c index 7a1581d4..753aedc2 100644 --- a/src/client/cl_view.c +++ b/src/client/cl_view.c @@ -31,11 +31,18 @@ int gun_frame; struct model_s *gun_model; cvar_t *crosshair; +cvar_t *crosshair_3d; +cvar_t *crosshair_3d_glow; +cvar_t *crosshair_3d_color; + cvar_t *crosshair_scale; cvar_t *cl_testparticles; cvar_t *cl_testentities; cvar_t *cl_testlights; cvar_t *cl_testblend; +cvar_t *crosshair_3d_glow_r; +cvar_t *crosshair_3d_glow_g; +cvar_t *crosshair_3d_glow_b; cvar_t *cl_stats; @@ -53,6 +60,8 @@ lightstyle_t r_lightstyles[MAX_LIGHTSTYLES]; char cl_weaponmodels[MAX_CLIENTWEAPONMODELS][MAX_QPATH]; int num_cl_weaponmodels; +void V_Render3dCrosshair(void); + /* * Specifies the model that will be used as the world */ @@ -494,6 +503,9 @@ V_RenderView(float stereo_separation) v_forward, etc. */ CL_AddEntities(); + // before changing viewport we should trace the crosshair position + V_Render3dCrosshair(); + if (cl_testparticles->value) { V_TestParticles(); @@ -519,6 +531,7 @@ V_RenderView(float stereo_separation) /* offset vieworg appropriately if we're doing stereo separation */ + if (stereo_separation != 0) { vec3_t tmp; @@ -602,6 +615,53 @@ V_RenderView(float stereo_separation) SCR_DrawCrosshair(); } +void +V_Render3dCrosshair(void) +{ + trace_t crosshair_trace; + vec3_t end; + vec_t *crosshair_pos; + + crosshair_3d = Cvar_Get("crosshair_3d", "0", CVAR_ARCHIVE); + crosshair_3d_glow = Cvar_Get("crosshair_3d_glow", "0", CVAR_ARCHIVE); + + + if(crosshair_3d->value || crosshair_3d_glow->value){ + VectorMA(cl.refdef.vieworg,8192,cl.v_forward,end); + crosshair_trace = CL_PMTrace(cl.refdef.vieworg, vec3_origin, vec3_origin, end); + + if(crosshair_3d_glow->value){ + crosshair_3d_glow_r = Cvar_Get("crosshair_3d_glow_r", "5", CVAR_ARCHIVE); + crosshair_3d_glow_g = Cvar_Get("crosshair_3d_glow_g", "1", CVAR_ARCHIVE); + crosshair_3d_glow_b = Cvar_Get("crosshair_3d_glow_b", "4", CVAR_ARCHIVE); + + V_AddLight( + crosshair_trace.endpos, + crosshair_3d_glow->value, + crosshair_3d_glow_r->value, + crosshair_3d_glow_g->value, + crosshair_3d_glow_b->value + ); + } + + if(crosshair_3d->value){ + entity_t crosshair_ent = {0}; + + crosshair_ent.origin[0] = crosshair_trace.endpos[0]; + crosshair_ent.origin[1] = crosshair_trace.endpos[1]; + crosshair_ent.origin[2] = crosshair_trace.endpos[2]; + + crosshair_ent.model = R_RegisterModel("models/crosshair/tris.md2"); + crosshair_ent.skin = R_RegisterSkin("models/crosshair/skin.pcx"); + + AngleVectors2(crosshair_trace.plane.normal, crosshair_ent.angles); + crosshair_ent.flags = RF_DEPTHHACK | RF_FULLBRIGHT | RF_NOSHADOW; + + V_AddEntity(&crosshair_ent); + } + } +} + void V_Viewpos_f(void) { diff --git a/src/client/header/client.h b/src/client/header/client.h index 4857b9cd..23ae304f 100644 --- a/src/client/header/client.h +++ b/src/client/header/client.h @@ -511,5 +511,6 @@ void CL_KeyInventory (int key); void CL_DrawInventory (void); void CL_PredictMovement (void); +trace_t CL_PMTrace(vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end); #endif