Merge branch 'main' into contributions
|
@ -2,7 +2,7 @@
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
package="com.drbeef.jkxr"
|
package="com.drbeef.jkxr"
|
||||||
android:versionCode="64"
|
android:versionCode="64"
|
||||||
android:versionName="1.1.18" android:installLocation="auto" >
|
android:versionName="1.1.19" android:installLocation="auto" >
|
||||||
|
|
||||||
<!-- Tell the system this app requires OpenGL ES 3.1. -->
|
<!-- Tell the system this app requires OpenGL ES 3.1. -->
|
||||||
<uses-feature android:glEsVersion="0x00030002" android:required="true"/>
|
<uses-feature android:glEsVersion="0x00030002" android:required="true"/>
|
||||||
|
|
|
@ -18,6 +18,7 @@ extern cvar_t *vr_force_motion_controlled;
|
||||||
extern cvar_t *vr_force_motion_push;
|
extern cvar_t *vr_force_motion_push;
|
||||||
extern cvar_t *vr_force_motion_pull;
|
extern cvar_t *vr_force_motion_pull;
|
||||||
extern cvar_t *vr_motion_enable_saber;
|
extern cvar_t *vr_motion_enable_saber;
|
||||||
|
extern cvar_t *vr_always_run;
|
||||||
extern cvar_t *vr_crouch_toggle;
|
extern cvar_t *vr_crouch_toggle;
|
||||||
extern cvar_t *vr_irl_crouch_enabled;
|
extern cvar_t *vr_irl_crouch_enabled;
|
||||||
extern cvar_t *vr_irl_crouch_to_stand_ratio;
|
extern cvar_t *vr_irl_crouch_to_stand_ratio;
|
||||||
|
|
|
@ -31,6 +31,7 @@ cvar_t *vr_force_motion_controlled;
|
||||||
cvar_t *vr_force_motion_push;
|
cvar_t *vr_force_motion_push;
|
||||||
cvar_t *vr_force_motion_pull;
|
cvar_t *vr_force_motion_pull;
|
||||||
cvar_t *vr_motion_enable_saber;
|
cvar_t *vr_motion_enable_saber;
|
||||||
|
cvar_t * vr_always_run;
|
||||||
cvar_t *vr_crouch_toggle;
|
cvar_t *vr_crouch_toggle;
|
||||||
cvar_t *vr_irl_crouch_enabled;
|
cvar_t *vr_irl_crouch_enabled;
|
||||||
cvar_t *vr_irl_crouch_to_stand_ratio;
|
cvar_t *vr_irl_crouch_to_stand_ratio;
|
||||||
|
|
|
@ -121,6 +121,14 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew,
|
||||||
Cvar_Set("vr_control_scheme", "99");
|
Cvar_Set("vr_control_scheme", "99");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int cinCameraTimestamp = -1;
|
||||||
|
if (vr.cin_camera && cinCameraTimestamp == -1) {
|
||||||
|
cinCameraTimestamp = Sys_Milliseconds();
|
||||||
|
}
|
||||||
|
else if (!vr.cin_camera) {
|
||||||
|
cinCameraTimestamp = -1;
|
||||||
|
}
|
||||||
|
|
||||||
//Set controller angles - We need to calculate all those we might need (including adjustments) for the client to then take its pick
|
//Set controller angles - We need to calculate all those we might need (including adjustments) for the client to then take its pick
|
||||||
{
|
{
|
||||||
vec3_t rotation = {0};
|
vec3_t rotation = {0};
|
||||||
|
@ -212,6 +220,28 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew,
|
||||||
static float menuYaw = 0;
|
static float menuYaw = 0;
|
||||||
if (VR_UseScreenLayer() && !vr.misc_camera)
|
if (VR_UseScreenLayer() && !vr.misc_camera)
|
||||||
{
|
{
|
||||||
|
if (vr.cin_camera && cinCameraTimestamp + 1000 < Sys_Milliseconds())
|
||||||
|
{
|
||||||
|
// To skip cinematic use any thumb or trigger (but wait a while
|
||||||
|
// to prevent skipping when cinematic is started during action)
|
||||||
|
if ((primaryButtonsNew & primaryThumb) != (primaryButtonsOld & primaryThumb)) {
|
||||||
|
sendButtonAction("+use", (primaryButtonsNew & primaryThumb));
|
||||||
|
}
|
||||||
|
if ((secondaryButtonsNew & secondaryThumb) != (secondaryButtonsOld & secondaryThumb)) {
|
||||||
|
sendButtonAction("+use", (secondaryButtonsNew & secondaryThumb));
|
||||||
|
}
|
||||||
|
if ((pDominantTrackedRemoteNew->Buttons & xrButton_Trigger) != (pDominantTrackedRemoteOld->Buttons & xrButton_Trigger)) {
|
||||||
|
sendButtonAction("+use", (pDominantTrackedRemoteNew->Buttons & xrButton_Trigger));
|
||||||
|
// mark button as already pressed to prevent firing after entering the game
|
||||||
|
pDominantTrackedRemoteOld->Buttons |= xrButton_Trigger;
|
||||||
|
}
|
||||||
|
if ((pOffTrackedRemoteNew->Buttons & xrButton_Trigger) != (pOffTrackedRemoteOld->Buttons & xrButton_Trigger)) {
|
||||||
|
sendButtonAction("+use", (pOffTrackedRemoteNew->Buttons & xrButton_Trigger));
|
||||||
|
// mark button as already pressed to prevent firing after entering the game
|
||||||
|
pOffTrackedRemoteOld->Buttons |= xrButton_Trigger;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool controlsLeftHanded = vr_control_scheme->integer >= 10;
|
bool controlsLeftHanded = vr_control_scheme->integer >= 10;
|
||||||
if (controlsLeftHanded == vr.menu_right_handed) {
|
if (controlsLeftHanded == vr.menu_right_handed) {
|
||||||
interactWithTouchScreen(menuYaw, vr.offhandangles[ANGLES_DEFAULT]);
|
interactWithTouchScreen(menuYaw, vr.offhandangles[ANGLES_DEFAULT]);
|
||||||
|
@ -377,12 +407,6 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cinCameraTimestamp = -1;
|
|
||||||
if (vr.cin_camera && cinCameraTimestamp == -1) {
|
|
||||||
cinCameraTimestamp = Sys_Milliseconds();
|
|
||||||
} else if (!vr.cin_camera) {
|
|
||||||
cinCameraTimestamp = -1;
|
|
||||||
}
|
|
||||||
if (vr.cin_camera && cinCameraTimestamp + 1000 < Sys_Milliseconds())
|
if (vr.cin_camera && cinCameraTimestamp + 1000 < Sys_Milliseconds())
|
||||||
{
|
{
|
||||||
// To skip cinematic use any thumb or trigger (but wait a while
|
// To skip cinematic use any thumb or trigger (but wait a while
|
||||||
|
@ -471,6 +495,22 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Switch movement speed
|
||||||
|
if (!vr.cgzoommode && !vr_always_run->integer)
|
||||||
|
{
|
||||||
|
static bool switched = false;
|
||||||
|
if (between(-0.2f, primaryJoystickX, 0.2f) &&
|
||||||
|
between(0.8f, pPrimaryJoystick->y, 1.0f)) {
|
||||||
|
if (!switched) {
|
||||||
|
vr.move_speed = (++vr.move_speed) % 3;
|
||||||
|
switched = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
switched = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
//Parameter Changer
|
//Parameter Changer
|
||||||
static bool changed = false;
|
static bool changed = false;
|
||||||
|
@ -852,18 +892,34 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew,
|
||||||
vec2_t v;
|
vec2_t v;
|
||||||
rotateAboutOrigin(x, y, controllerYawHeading, v);
|
rotateAboutOrigin(x, y, controllerYawHeading, v);
|
||||||
|
|
||||||
//Move a lot slower if scope is engaged
|
float move_speed_multiplier = 1.0f;
|
||||||
remote_movementSideways =
|
switch (vr.move_speed)
|
||||||
v[0] * (vr.move_speed == 0 ? 0.75f : (vr.move_speed == 1 ? 1.0f : 0.5f));
|
{
|
||||||
remote_movementForward =
|
case 0:
|
||||||
v[1] * (vr.move_speed == 0 ? 0.75f : (vr.move_speed == 1 ? 1.0f : 0.5f));
|
move_speed_multiplier = 0.75f;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
move_speed_multiplier = 1.0f;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
move_speed_multiplier = 0.5f;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vr_always_run->integer)
|
||||||
|
{
|
||||||
|
move_speed_multiplier = 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
remote_movementSideways = move_speed_multiplier * v[0];
|
||||||
|
remote_movementForward = move_speed_multiplier * v[1];
|
||||||
|
|
||||||
|
|
||||||
if (((secondaryButtonsNew & secondaryButton1) !=
|
//X button invokes menu now
|
||||||
(secondaryButtonsOld & secondaryButton1)) &&
|
if ((secondaryButtonsNew & secondaryButton1) &&
|
||||||
(secondaryButtonsNew & secondaryButton1)) {
|
!(secondaryButtonsOld & secondaryButton1))
|
||||||
//Toggle walk/run somehow?!
|
{
|
||||||
vr.move_speed = (++vr.move_speed) % 3;
|
Sys_QueEvent(0, SE_KEY, A_ESCAPE, true, 0, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Open the datapad
|
//Open the datapad
|
||||||
|
|
|
@ -59,6 +59,7 @@ bool VR_UseScreenLayer()
|
||||||
(bool)((vr.cin_camera && !vr.immersive_cinematics) ||
|
(bool)((vr.cin_camera && !vr.immersive_cinematics) ||
|
||||||
vr.misc_camera ||
|
vr.misc_camera ||
|
||||||
(CL_IsRunningInGameCinematic() || CL_InGameCinematicOnStandBy()) ||
|
(CL_IsRunningInGameCinematic() || CL_InGameCinematicOnStandBy()) ||
|
||||||
|
(cls.state == CA_DISCONNECTED) ||
|
||||||
(cls.state == CA_CINEMATIC) ||
|
(cls.state == CA_CINEMATIC) ||
|
||||||
(cls.state == CA_LOADING) ||
|
(cls.state == CA_LOADING) ||
|
||||||
( Key_GetCatcher( ) & KEYCATCH_UI ) ||
|
( Key_GetCatcher( ) & KEYCATCH_UI ) ||
|
||||||
|
@ -233,10 +234,10 @@ void VR_GetMove(float *forward, float *side, float *pos_forward, float *pos_side
|
||||||
}
|
}
|
||||||
else if (vr.cgzoommode == 2 || vr.cgzoommode == 4)
|
else if (vr.cgzoommode == 2 || vr.cgzoommode == 4)
|
||||||
{
|
{
|
||||||
*forward = 0.0f;
|
*forward = remote_movementForward / 3.0f;
|
||||||
*pos_forward = 0.0f;
|
*pos_forward = 0.0f;
|
||||||
*up = 0.0f;
|
*up = 0.0f;
|
||||||
*side = 0.0f;
|
*side = remote_movementSideways / 3.0f;
|
||||||
*pos_side = 0.0f;
|
*pos_side = 0.0f;
|
||||||
*yaw = vr.snapTurn;
|
*yaw = vr.snapTurn;
|
||||||
*pitch = vr.weaponangles[ANGLES_ADJUSTED][PITCH];
|
*pitch = vr.weaponangles[ANGLES_ADJUSTED][PITCH];
|
||||||
|
@ -347,6 +348,7 @@ void VR_Init()
|
||||||
vr_force_motion_push = Cvar_Get ("vr_force_motion_push", "3", CVAR_ARCHIVE);
|
vr_force_motion_push = Cvar_Get ("vr_force_motion_push", "3", CVAR_ARCHIVE);
|
||||||
vr_force_motion_pull = Cvar_Get ("vr_force_motion_pull", "4", CVAR_ARCHIVE);
|
vr_force_motion_pull = Cvar_Get ("vr_force_motion_pull", "4", CVAR_ARCHIVE);
|
||||||
vr_motion_enable_saber = Cvar_Get ("vr_motion_enable_saber", "0", CVAR_ARCHIVE);
|
vr_motion_enable_saber = Cvar_Get ("vr_motion_enable_saber", "0", CVAR_ARCHIVE);
|
||||||
|
vr_always_run = Cvar_Get ("vr_always_run", "0", CVAR_ARCHIVE);
|
||||||
vr_crouch_toggle = Cvar_Get ("vr_crouch_toggle", "0", CVAR_ARCHIVE);
|
vr_crouch_toggle = Cvar_Get ("vr_crouch_toggle", "0", CVAR_ARCHIVE);
|
||||||
vr_irl_crouch_enabled = Cvar_Get ("vr_irl_crouch_enabled", "0", CVAR_ARCHIVE);
|
vr_irl_crouch_enabled = Cvar_Get ("vr_irl_crouch_enabled", "0", CVAR_ARCHIVE);
|
||||||
vr_irl_crouch_to_stand_ratio = Cvar_Get ("vr_irl_crouch_to_stand_ratio", "0.65", CVAR_ARCHIVE);
|
vr_irl_crouch_to_stand_ratio = Cvar_Get ("vr_irl_crouch_to_stand_ratio", "0.65", CVAR_ARCHIVE);
|
||||||
|
|
|
@ -1930,8 +1930,8 @@ void TBXR_submitFrame()
|
||||||
TBXR_updateProjections();
|
TBXR_updateProjections();
|
||||||
|
|
||||||
//Calculate the maximum extent fov for use in culling in the engine (we won't want to cull inside this fov)
|
//Calculate the maximum extent fov for use in culling in the engine (we won't want to cull inside this fov)
|
||||||
vr.fov_x = (fabs(gAppState.Views[0].fov.angleLeft) + fabs(gAppState.Views[1].fov.angleLeft)) * 180.0f / M_PI;
|
vr.fov_x = (fabs(gAppState.Views[0].fov.angleLeft) + fabs(gAppState.Views[1].fov.angleRight)) * 180.0f / M_PI;
|
||||||
vr.fov_y = (fabs(gAppState.Views[0].fov.angleUp) + fabs(gAppState.Views[0].fov.angleUp)) * 180.0f / M_PI;
|
vr.fov_y = (fabs(gAppState.Views[0].fov.angleUp) + fabs(gAppState.Views[0].fov.angleDown)) * 180.0f / M_PI;
|
||||||
|
|
||||||
|
|
||||||
XrFrameEndInfo endFrameInfo = {};
|
XrFrameEndInfo endFrameInfo = {};
|
||||||
|
|
|
@ -138,10 +138,10 @@ void VR_GetMove(float *forward, float *side, float *pos_forward, float *pos_side
|
||||||
}
|
}
|
||||||
else if (vr.cgzoommode == 2 || vr.cgzoommode == 4)
|
else if (vr.cgzoommode == 2 || vr.cgzoommode == 4)
|
||||||
{
|
{
|
||||||
*forward = 0.0f;
|
*forward = remote_movementForward / 3.0f;
|
||||||
*pos_forward = 0.0f;
|
*pos_forward = 0.0f;
|
||||||
*up = 0.0f;
|
*up = 0.0f;
|
||||||
*side = 0.0f;
|
*side = remote_movementSideways / 3.0f;
|
||||||
*pos_side = 0.0f;
|
*pos_side = 0.0f;
|
||||||
*yaw = vr.snapTurn;
|
*yaw = vr.snapTurn;
|
||||||
*pitch = vr.weaponangles[ANGLES_ADJUSTED][PITCH];
|
*pitch = vr.weaponangles[ANGLES_ADJUSTED][PITCH];
|
||||||
|
@ -259,6 +259,7 @@ void VR_Init()
|
||||||
vr_force_motion_push = Cvar_Get ("vr_force_motion_push", "3", CVAR_ARCHIVE);
|
vr_force_motion_push = Cvar_Get ("vr_force_motion_push", "3", CVAR_ARCHIVE);
|
||||||
vr_force_motion_pull = Cvar_Get ("vr_force_motion_pull", "4", CVAR_ARCHIVE);
|
vr_force_motion_pull = Cvar_Get ("vr_force_motion_pull", "4", CVAR_ARCHIVE);
|
||||||
vr_motion_enable_saber = Cvar_Get ("vr_motion_enable_saber", "0", CVAR_ARCHIVE);
|
vr_motion_enable_saber = Cvar_Get ("vr_motion_enable_saber", "0", CVAR_ARCHIVE);
|
||||||
|
vr_always_run = Cvar_Get ("vr_always_run", "0", CVAR_ARCHIVE);
|
||||||
vr_crouch_toggle = Cvar_Get ("vr_crouch_toggle", "0", CVAR_ARCHIVE);
|
vr_crouch_toggle = Cvar_Get ("vr_crouch_toggle", "0", CVAR_ARCHIVE);
|
||||||
vr_irl_crouch_enabled = Cvar_Get ("vr_irl_crouch_enabled", "0", CVAR_ARCHIVE);
|
vr_irl_crouch_enabled = Cvar_Get ("vr_irl_crouch_enabled", "0", CVAR_ARCHIVE);
|
||||||
vr_irl_crouch_to_stand_ratio = Cvar_Get ("vr_irl_crouch_to_stand_ratio", "0.65", CVAR_ARCHIVE);
|
vr_irl_crouch_to_stand_ratio = Cvar_Get ("vr_irl_crouch_to_stand_ratio", "0.65", CVAR_ARCHIVE);
|
||||||
|
|
|
@ -222,7 +222,7 @@ void ovrFramebuffer_Resolve(ovrFramebuffer* frameBuffer) {
|
||||||
int width, height;
|
int width, height;
|
||||||
R_GetModeInfo(&width, &height, r_mode->integer);
|
R_GetModeInfo(&width, &height, r_mode->integer);
|
||||||
|
|
||||||
glBindFramebuffer(GL_READ_FRAMEBUFFER, colorTexture);
|
glBindFramebuffer(GL_READ_FRAMEBUFFER, frameBuffer->FrameBuffers[frameBuffer->TextureSwapChainIndex]);
|
||||||
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
|
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
|
||||||
glBlitFramebuffer(0, 0, gAppState.Width, gAppState.Height,
|
glBlitFramebuffer(0, 0, gAppState.Width, gAppState.Height,
|
||||||
0, 0, width, height,
|
0, 0, width, height,
|
||||||
|
@ -1151,8 +1151,8 @@ void TBXR_submitFrame()
|
||||||
TBXR_updateProjections();
|
TBXR_updateProjections();
|
||||||
|
|
||||||
//Calculate the maximum extent fov for use in culling in the engine (we won't want to cull inside this fov)
|
//Calculate the maximum extent fov for use in culling in the engine (we won't want to cull inside this fov)
|
||||||
vr.fov_x = (fabs(gAppState.Views[0].fov.angleLeft) + fabs(gAppState.Views[1].fov.angleLeft)) * 180.0f / M_PI;
|
vr.fov_x = (fabs(gAppState.Views[0].fov.angleLeft) + fabs(gAppState.Views[1].fov.angleRight)) * 180.0f / M_PI;
|
||||||
vr.fov_y = (fabs(gAppState.Views[0].fov.angleUp) + fabs(gAppState.Views[0].fov.angleUp)) * 180.0f / M_PI;
|
vr.fov_y = (fabs(gAppState.Views[0].fov.angleUp) + fabs(gAppState.Views[0].fov.angleDown)) * 180.0f / M_PI;
|
||||||
|
|
||||||
|
|
||||||
XrFrameEndInfo endFrameInfo = {};
|
XrFrameEndInfo endFrameInfo = {};
|
||||||
|
|
|
@ -4117,15 +4117,24 @@ CG_DrawVignette
|
||||||
float currentComfortVignetteValue = 0.0f;
|
float currentComfortVignetteValue = 0.0f;
|
||||||
float filteredViewYawDelta = 0.0f;
|
float filteredViewYawDelta = 0.0f;
|
||||||
|
|
||||||
static void CG_DrawVignette( void )
|
static void CG_DrawVignette( bool force )
|
||||||
{
|
{
|
||||||
playerState_t *ps;
|
playerState_t *ps;
|
||||||
ps = &cg.snap->ps;
|
ps = &cg.snap->ps;
|
||||||
|
|
||||||
|
float vignetteValue;
|
||||||
cvar_t *vr_comfort_vignette = gi.cvar("vr_comfort_vignette", "0.0", CVAR_ARCHIVE); // defined in VrCvars.h
|
cvar_t *vr_comfort_vignette = gi.cvar("vr_comfort_vignette", "0.0", CVAR_ARCHIVE); // defined in VrCvars.h
|
||||||
if (vr_comfort_vignette->value <= 0.0f || vr_comfort_vignette->value > 1.0f || !cg.zoomMode == 0)
|
if (!force)
|
||||||
{
|
{
|
||||||
return;
|
if (vr_comfort_vignette->value <= 0.0f || vr_comfort_vignette->value > 1.0f || !cg.zoomMode == 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
vignetteValue = vr_comfort_vignette->value;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
vignetteValue = 0.3f;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isMoving = VectorLength(cg.predicted_player_state.velocity) > 30.0;
|
bool isMoving = VectorLength(cg.predicted_player_state.velocity) > 30.0;
|
||||||
|
@ -4144,17 +4153,17 @@ static void CG_DrawVignette( void )
|
||||||
isTurning = filteredViewYawDelta > 1;
|
isTurning = filteredViewYawDelta > 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isMoving || isInAir || isTurning)
|
if (isMoving || isInAir || isTurning || force)
|
||||||
{
|
{
|
||||||
if (currentComfortVignetteValue < vr_comfort_vignette->value)
|
if (currentComfortVignetteValue < vignetteValue)
|
||||||
{
|
{
|
||||||
currentComfortVignetteValue += vr_comfort_vignette->value * 0.05;
|
currentComfortVignetteValue += vignetteValue * 0.05;
|
||||||
if (currentComfortVignetteValue > 1.0f)
|
if (currentComfortVignetteValue > 1.0f)
|
||||||
currentComfortVignetteValue = 1.0f;
|
currentComfortVignetteValue = 1.0f;
|
||||||
}
|
}
|
||||||
} else{
|
} else{
|
||||||
if (currentComfortVignetteValue > 0.0f)
|
if (currentComfortVignetteValue > 0.0f)
|
||||||
currentComfortVignetteValue -= vr_comfort_vignette->value * 0.05;
|
currentComfortVignetteValue -= vignetteValue * 0.05;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (currentComfortVignetteValue > 0.0f && currentComfortVignetteValue <= 1.0f)
|
if (currentComfortVignetteValue > 0.0f && currentComfortVignetteValue <= 1.0f)
|
||||||
|
@ -4295,8 +4304,9 @@ static void CG_Draw2D( void )
|
||||||
if ( (cg.snap->ps.forcePowersActive&(1<<FP_SEE)) )
|
if ( (cg.snap->ps.forcePowersActive&(1<<FP_SEE)) )
|
||||||
{//force sight is on
|
{//force sight is on
|
||||||
//indicate this with sight cone thingy
|
//indicate this with sight cone thingy
|
||||||
cg.drawingHUD = CG_HUD_NORMAL;
|
cg.drawingHUD = CG_HUD_OTHER;
|
||||||
CG_DrawPic( 35, 50, 570, 400, cgi_R_RegisterShader( "gfx/2d/jsense" ));
|
CG_DrawVignette(true);
|
||||||
|
CG_DrawPic( 50, 40, 540, 400, cgi_R_RegisterShader( "gfx/2d/jsense" ));
|
||||||
cg.drawingHUD = CG_HUD_SCALED;
|
cg.drawingHUD = CG_HUD_SCALED;
|
||||||
CG_DrawHealthBars();
|
CG_DrawHealthBars();
|
||||||
}
|
}
|
||||||
|
@ -4306,10 +4316,50 @@ static void CG_Draw2D( void )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if (cg.zoomMode || (cg.snap->ps.forcePowersActive & (1 << FP_SEE)))
|
||||||
|
{
|
||||||
|
cg.drawingHUD = CG_HUD_NORMAL;
|
||||||
|
const auto xOffset = (-vr->off_center_fov_x * 640);
|
||||||
|
const auto yOffset = (vr->off_center_fov_y * 480);
|
||||||
|
|
||||||
|
vec4_t color = { 0, 0, 0, 1 };
|
||||||
|
if (cg.stereoView == STEREO_LEFT)
|
||||||
|
{
|
||||||
|
//Left Gap
|
||||||
|
CG_FillRect(0, 0, -xOffset, 480, color);
|
||||||
|
if (yOffset < 0)
|
||||||
|
{
|
||||||
|
//Bottom Gap
|
||||||
|
CG_FillRect(0, 0, 640, yOffset, color);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//Top Gap
|
||||||
|
CG_FillRect(0, 480 - yOffset, 640, yOffset, color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//Right Gap
|
||||||
|
CG_FillRect(640 - xOffset, 0, xOffset, 480, color);
|
||||||
|
if (yOffset < 0)
|
||||||
|
{
|
||||||
|
//Bottom Gap
|
||||||
|
CG_FillRect(0, 0, 640, yOffset, color);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//Top Gap
|
||||||
|
CG_FillRect(0, 480 - yOffset, 640, yOffset, color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// don't draw any status if dead
|
// don't draw any status if dead
|
||||||
if ( cg.snap->ps.stats[STAT_HEALTH] > 0 )
|
if ( cg.snap->ps.stats[STAT_HEALTH] > 0 )
|
||||||
{
|
{
|
||||||
CG_DrawVignette();
|
CG_DrawVignette(false);
|
||||||
|
|
||||||
if ( !(cent->gent && cent->gent->s.eFlags & (EF_LOCKED_TO_WEAPON )))//|EF_IN_ATST
|
if ( !(cent->gent && cent->gent->s.eFlags & (EF_LOCKED_TO_WEAPON )))//|EF_IN_ATST
|
||||||
{
|
{
|
||||||
|
@ -4345,7 +4395,10 @@ static void CG_Draw2D( void )
|
||||||
|
|
||||||
CG_UseIcon();
|
CG_UseIcon();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cg.drawingHUD = CG_HUD_NORMAL;
|
||||||
CG_SaberClashFlare();
|
CG_SaberClashFlare();
|
||||||
|
cg.drawingHUD = CG_HUD_SCALED;
|
||||||
|
|
||||||
float y = 0;
|
float y = 0;
|
||||||
if (cg_drawSnapshot.integer) {
|
if (cg_drawSnapshot.integer) {
|
||||||
|
|
|
@ -297,6 +297,7 @@ typedef struct {
|
||||||
#define CG_HUD_NORMAL 0x00
|
#define CG_HUD_NORMAL 0x00
|
||||||
#define CG_HUD_SCALED 0x01
|
#define CG_HUD_SCALED 0x01
|
||||||
#define CG_HUD_ZOOM 0x02
|
#define CG_HUD_ZOOM 0x02
|
||||||
|
#define CG_HUD_OTHER 0x03
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
//NOTE: these probably get cleared in save/load!!!
|
//NOTE: these probably get cleared in save/load!!!
|
||||||
|
|
|
@ -1463,7 +1463,6 @@ static void CG_RegisterGraphics( void ) {
|
||||||
|
|
||||||
cgs.media.iconSave = cgi_R_RegisterShaderNoMip( "gfx/icon_save" );
|
cgs.media.iconSave = cgi_R_RegisterShaderNoMip( "gfx/icon_save" );
|
||||||
cgs.media.iconLoad = cgi_R_RegisterShaderNoMip( "gfx/icon_load" );
|
cgs.media.iconLoad = cgi_R_RegisterShaderNoMip( "gfx/icon_load" );
|
||||||
cgs.media.iconExit = cgi_R_RegisterShaderNoMip( "gfx/icon_exit" );
|
|
||||||
|
|
||||||
// FIXME: do these conditionally
|
// FIXME: do these conditionally
|
||||||
cgi_R_RegisterShader( "gfx/2d/workingCamera" );
|
cgi_R_RegisterShader( "gfx/2d/workingCamera" );
|
||||||
|
|
|
@ -150,7 +150,6 @@ typedef struct {
|
||||||
|
|
||||||
qhandle_t iconSave;
|
qhandle_t iconSave;
|
||||||
qhandle_t iconLoad;
|
qhandle_t iconLoad;
|
||||||
qhandle_t iconExit;
|
|
||||||
|
|
||||||
//Chunks
|
//Chunks
|
||||||
qhandle_t chunkModels[NUM_CHUNK_TYPES][4];
|
qhandle_t chunkModels[NUM_CHUNK_TYPES][4];
|
||||||
|
|
|
@ -2954,12 +2954,10 @@ void CG_ItemSelectorSelect_f( void )
|
||||||
}
|
}
|
||||||
else if (cg.itemSelectorType == ST_QUICK_MENU) {
|
else if (cg.itemSelectorType == ST_QUICK_MENU) {
|
||||||
if (cg.itemSelectorSelection == 0) {
|
if (cg.itemSelectorSelection == 0) {
|
||||||
cgi_SendConsoleCommand("togglemenu\n");
|
cgi_SendConsoleCommand("save quick\n");
|
||||||
} else if (cg.itemSelectorSelection == 1) {
|
|
||||||
cgi_SendConsoleCommand("save quik*\n");
|
|
||||||
CG_CenterPrint("Quick Saved", 240);
|
CG_CenterPrint("Quick Saved", 240);
|
||||||
} else {
|
} else {
|
||||||
cgi_SendConsoleCommand("load quik\n");
|
cgi_SendConsoleCommand("load quick\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3123,7 +3121,7 @@ void CG_DrawItemSelector( void )
|
||||||
sRGB[2] = 1.0f;
|
sRGB[2] = 1.0f;
|
||||||
break;
|
break;
|
||||||
case ST_QUICK_MENU:
|
case ST_QUICK_MENU:
|
||||||
count = 3;
|
count = 2;
|
||||||
sRGB[0] = 1.0f;
|
sRGB[0] = 1.0f;
|
||||||
sRGB[1] = 1.0f;
|
sRGB[1] = 1.0f;
|
||||||
sRGB[2] = 1.0f;
|
sRGB[2] = 1.0f;
|
||||||
|
@ -3342,18 +3340,7 @@ void CG_DrawItemSelector( void )
|
||||||
sprite.customShader = force_icons[showPowers[itemId]];
|
sprite.customShader = force_icons[showPowers[itemId]];
|
||||||
break;
|
break;
|
||||||
case ST_QUICK_MENU:
|
case ST_QUICK_MENU:
|
||||||
switch (itemId)
|
sprite.customShader = itemId == 0 ? cgs.media.iconSave : cgs.media.iconLoad;
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
sprite.customShader = cgs.media.iconExit;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
sprite.customShader = cgs.media.iconSave;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
sprite.customShader = cgs.media.iconLoad;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -804,8 +804,10 @@ void BG_CalculateVRSaberPosition( int saberNum, vec3_t origin, vec3_t angles )
|
||||||
//Move position down a bit
|
//Move position down a bit
|
||||||
vec3_t axis[3];
|
vec3_t axis[3];
|
||||||
AnglesToAxis(angles, axis);
|
AnglesToAxis(angles, axis);
|
||||||
//The "forward" axis will be adjusted
|
//Small adjustments to make saber align better
|
||||||
VectorMA(origin, -3.0f, axis[0], origin);
|
VectorMA(origin, -3.0f, axis[0], origin);
|
||||||
|
VectorMA(origin, -0.5f, axis[1], origin);
|
||||||
|
VectorMA(origin, 1.2f, axis[2], origin);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool BG_UseVRPosition( gentity_t *ent )
|
bool BG_UseVRPosition( gentity_t *ent )
|
||||||
|
|
|
@ -23,7 +23,7 @@ along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
// Current version of the single player game
|
// Current version of the single player game
|
||||||
#include "../win32/AutoVersion.h"
|
#include "../win32/AutoVersion.h"
|
||||||
|
|
||||||
#define JKXR_VERSION "1.1.18-ea"
|
#define JKXR_VERSION "1.1.19-ea"
|
||||||
|
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
#define Q3_VERSION "(debug)OpenJK: v" VERSION_STRING_DOTTED " JKXR: " JKXR_VERSION
|
#define Q3_VERSION "(debug)OpenJK: v" VERSION_STRING_DOTTED " JKXR: " JKXR_VERSION
|
||||||
|
|
|
@ -2729,6 +2729,45 @@ static void CG_Draw2D( void )
|
||||||
CG_DrawZoomBorders();
|
CG_DrawZoomBorders();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (cg.zoomMode)
|
||||||
|
{
|
||||||
|
cg.drawingHUD = CG_HUD_NORMAL;
|
||||||
|
const auto xOffset = (-vr->off_center_fov_x * 640);
|
||||||
|
const auto yOffset = (vr->off_center_fov_y * 480);
|
||||||
|
|
||||||
|
vec4_t color = { 0, 0, 0, 1 };
|
||||||
|
if (cg.stereoView == STEREO_LEFT)
|
||||||
|
{
|
||||||
|
//Left Gap
|
||||||
|
CG_FillRect(0, 0, xOffset, 480, color);
|
||||||
|
if (yOffset < 0)
|
||||||
|
{
|
||||||
|
//Bottom Gap
|
||||||
|
CG_FillRect(0, 0, 640, yOffset, color);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//Top Gap
|
||||||
|
CG_FillRect(0, 480 - yOffset, 640, yOffset, color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//Right Gap
|
||||||
|
CG_FillRect(640 - xOffset, 0, xOffset, 480, color);
|
||||||
|
if (yOffset < 0)
|
||||||
|
{
|
||||||
|
//Bottom Gap
|
||||||
|
CG_FillRect(0, 0, 640, yOffset, color);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//Top Gap
|
||||||
|
CG_FillRect(0, 480 - yOffset, 640, yOffset, color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
cg.drawingHUD = CG_HUD_SCALED;
|
cg.drawingHUD = CG_HUD_SCALED;
|
||||||
|
|
||||||
CG_DrawBatteryCharge();
|
CG_DrawBatteryCharge();
|
||||||
|
@ -2802,7 +2841,10 @@ static void CG_Draw2D( void )
|
||||||
|
|
||||||
CG_UseIcon();
|
CG_UseIcon();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cg.drawingHUD = CG_HUD_NORMAL;
|
||||||
CG_SaberClashFlare();
|
CG_SaberClashFlare();
|
||||||
|
cg.drawingHUD = CG_HUD_SCALED;
|
||||||
|
|
||||||
float y = 0;
|
float y = 0;
|
||||||
if (cg_drawSnapshot.integer) {
|
if (cg_drawSnapshot.integer) {
|
||||||
|
|
|
@ -1336,7 +1336,6 @@ static void CG_RegisterGraphics( void ) {
|
||||||
|
|
||||||
cgs.media.iconSave = cgi_R_RegisterShaderNoMip( "gfx/icon_save" );
|
cgs.media.iconSave = cgi_R_RegisterShaderNoMip( "gfx/icon_save" );
|
||||||
cgs.media.iconLoad = cgi_R_RegisterShaderNoMip( "gfx/icon_load" );
|
cgs.media.iconLoad = cgi_R_RegisterShaderNoMip( "gfx/icon_load" );
|
||||||
cgs.media.iconExit = cgi_R_RegisterShaderNoMip( "gfx/icon_exit" );
|
|
||||||
|
|
||||||
|
|
||||||
// FIXME: do these conditionally
|
// FIXME: do these conditionally
|
||||||
|
|
|
@ -107,7 +107,6 @@ typedef struct {
|
||||||
|
|
||||||
qhandle_t iconSave;
|
qhandle_t iconSave;
|
||||||
qhandle_t iconLoad;
|
qhandle_t iconLoad;
|
||||||
qhandle_t iconExit;
|
|
||||||
|
|
||||||
int currentDataPadIconBackground;
|
int currentDataPadIconBackground;
|
||||||
|
|
||||||
|
|
|
@ -2777,8 +2777,6 @@ void CG_ItemSelectorSelect_f( void )
|
||||||
}
|
}
|
||||||
else if (cg.itemSelectorType == ST_QUICK_MENU) {
|
else if (cg.itemSelectorType == ST_QUICK_MENU) {
|
||||||
if (cg.itemSelectorSelection == 0) {
|
if (cg.itemSelectorSelection == 0) {
|
||||||
cgi_SendConsoleCommand("togglemenu\n");
|
|
||||||
} else if (cg.itemSelectorSelection == 1) {
|
|
||||||
cgi_SendConsoleCommand("save quik*\n");
|
cgi_SendConsoleCommand("save quik*\n");
|
||||||
CG_CenterPrint("Quick Saved", 240);
|
CG_CenterPrint("Quick Saved", 240);
|
||||||
} else {
|
} else {
|
||||||
|
@ -2941,7 +2939,7 @@ void CG_DrawItemSelector( void )
|
||||||
sRGB[2] = 1.0f;
|
sRGB[2] = 1.0f;
|
||||||
break;
|
break;
|
||||||
case ST_QUICK_MENU:
|
case ST_QUICK_MENU:
|
||||||
count = 3;
|
count = 2;
|
||||||
sRGB[0] = 1.0f;
|
sRGB[0] = 1.0f;
|
||||||
sRGB[1] = 1.0f;
|
sRGB[1] = 1.0f;
|
||||||
sRGB[2] = 1.0f;
|
sRGB[2] = 1.0f;
|
||||||
|
@ -3158,18 +3156,7 @@ void CG_DrawItemSelector( void )
|
||||||
sprite.customShader = force_icons[showPowers[itemId]];
|
sprite.customShader = force_icons[showPowers[itemId]];
|
||||||
break;
|
break;
|
||||||
case ST_QUICK_MENU:
|
case ST_QUICK_MENU:
|
||||||
switch (itemId)
|
sprite.customShader = itemId == 0 ? cgs.media.iconSave : cgs.media.iconLoad;
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
sprite.customShader = cgs.media.iconExit;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
sprite.customShader = cgs.media.iconSave;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
sprite.customShader = cgs.media.iconLoad;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
cd assets
|
cd assets
|
||||||
del z_vr_assets.pk3
|
del z_vr_assets_jka.pk3
|
||||||
cd ..
|
cd ..
|
||||||
powershell Compress-Archive z_vr_assets/* z_vr_assets.zip
|
powershell Compress-Archive z_vr_assets_jka/* z_vr_assets_jka.zip
|
||||||
rename z_vr_assets.zip z_vr_assets.pk3
|
rename z_vr_assets_jka.zip z_vr_assets_jka.pk3
|
||||||
move z_vr_assets.pk3 assets/
|
move z_vr_assets_jka.pk3 assets/
|
||||||
|
|
||||||
cd assets
|
cd assets
|
||||||
del z_vr_assets_jka.pk3
|
del z_vr_assets_jka.pk3
|
||||||
|
@ -12,4 +12,11 @@ powershell Compress-Archive z_vr_assets_jka/* z_vr_assets_jka.zip
|
||||||
rename z_vr_assets_jka.zip z_vr_assets_jka.pk3
|
rename z_vr_assets_jka.zip z_vr_assets_jka.pk3
|
||||||
move z_vr_assets_jka.pk3 assets/
|
move z_vr_assets_jka.pk3 assets/
|
||||||
|
|
||||||
|
cd assets
|
||||||
|
del z_vr_assets_base.pk3
|
||||||
|
cd ..
|
||||||
|
powershell Compress-Archive z_vr_assets_base/* z_vr_assets_base.zip
|
||||||
|
rename z_vr_assets_base.zip z_vr_assets_base.pk3
|
||||||
|
move z_vr_assets_base.pk3 assets/
|
||||||
|
|
||||||
pause
|
pause
|
||||||
|
|
Before Width: | Height: | Size: 64 KiB |
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 3.3 KiB |
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 6 KiB |
Before Width: | Height: | Size: 64 KiB |
Before Width: | Height: | Size: 64 KiB |
|
@ -1,24 +1,24 @@
|
||||||
|
|
||||||
// Weapon offsets - This is the default for the weapon models
|
// Weapon offsets for JKXR: ACADEMY - This is the default for the weapon models
|
||||||
// put the weapon id at the end of the cvar name, so the knife is vr_weapon_adjustment_1
|
// put the weapon id at the end of the cvar name.
|
||||||
// Values are: scale,right,up,forward,pitch,yaw,roll
|
// Values are: scale,right,up,forward,pitch,yaw,roll
|
||||||
|
// Use "seta vr_control_scheme 99" to activate the in-game tool.
|
||||||
|
|
||||||
seta vr_weapon_adjustment_1 "0.55,-4.89,8.12,-12.36,-28.60,10.80,-199.50"
|
seta vr_weapon_adjustment_1 "0.55,-4.89,8.12,-12.36,-28.60,10.80,-199.50"
|
||||||
seta vr_weapon_adjustment_2 "1.000,-3.840,8.320,-13.680,0.000,0.000,0.000"
|
seta vr_weapon_adjustment_10 "1.590,-3.749,5.990,-8.266,0.000,0.000,0.000"
|
||||||
seta vr_weapon_adjustment_10 "1.840,-3.489,6.370,-7.946,0.000,0.000,0.000"
|
|
||||||
seta vr_weapon_adjustment_11 "1.755,-5.140,4.980,-10.462,18.700,1.000,-11.000"
|
seta vr_weapon_adjustment_11 "1.755,-5.140,4.980,-10.462,18.700,1.000,-11.000"
|
||||||
seta vr_weapon_adjustment_12 "1.840,-3.087,4.424,-8.750,22.400,0.000,-21.400"
|
seta vr_weapon_adjustment_12 "-1.425,-1.900,4.100,-9.320,-164.401,-15.500,73.499"
|
||||||
seta vr_weapon_adjustment_13 "1.000,-3.980,7.680,-10.020,0.000,0.000,0.000"
|
seta vr_weapon_adjustment_13 "1.000,-3.980,7.680,-11.200,0.000,0.000,-1.800"
|
||||||
seta vr_weapon_adjustment_14 "0.52,-12.87,13.29,-22.09,11.30,26.60,-3.40"
|
seta vr_weapon_adjustment_14 "0.52,-12.87,13.29,-22.09,11.30,26.60,-3.40"
|
||||||
seta vr_weapon_adjustment_17 "1.000,-6.860,12.340,-4.600,-49.700,0.000,0.000"
|
|
||||||
seta vr_weapon_adjustment_18 "0.510,-8.235,10.706,-3.922,-5.600,0.400,0.000"
|
seta vr_weapon_adjustment_18 "0.510,-8.235,10.706,-3.922,-5.600,0.400,0.000"
|
||||||
seta vr_weapon_adjustment_19 "0.43,-8.97,13.22,-21.68,-4.80,-4.50,-0.40"
|
seta vr_weapon_adjustment_19 "0.43,-8.97,13.22,-21.68,-4.80,-4.50,-0.40"
|
||||||
|
seta vr_weapon_adjustment_2 "1.000,-3.920,8.480,-14.100,0.000,0.000,0.000"
|
||||||
seta vr_weapon_adjustment_20 "0.44,-13.55,12.79,-26.06,0.30,-1.40,-0.40"
|
seta vr_weapon_adjustment_20 "0.44,-13.55,12.79,-26.06,0.30,-1.40,-0.40"
|
||||||
seta vr_weapon_adjustment_22 "0.64,-12.59,12.94,-20.44,11.30,26.60,-3.40"
|
seta vr_weapon_adjustment_22 "0.64,-12.59,12.94,-20.44,11.30,26.60,-3.40"
|
||||||
seta vr_weapon_adjustment_3 "0.906,-4.194,8.234,-9.801,0.000,0.000,0.000"
|
seta vr_weapon_adjustment_3 "0.741,-4.134,7.474,-12.141,0.000,-1.200,0.000"
|
||||||
seta vr_weapon_adjustment_4 "0.928,-4.095,9.116,-3.707,0.000,0.000,0.000"
|
seta vr_weapon_adjustment_4 "0.813,-3.835,8.496,-4.027,0.600,-0.200,0.000"
|
||||||
seta vr_weapon_adjustment_5 "1.642,-2.826,6.249,-8.429,0.000,0.000,0.000"
|
seta vr_weapon_adjustment_5 "1.417,-3.246,6.909,-7.329,0.000,0.000,0.000"
|
||||||
seta vr_weapon_adjustment_6 "0.652,-3.344,13.988,-7.730,0.000,0.000,0.000"
|
seta vr_weapon_adjustment_6 "0.557,-3.864,12.468,-8.670,0.000,0.000,0.000"
|
||||||
seta vr_weapon_adjustment_7 "0.998,-4.349,6.473,-10.160,0.000,0.000,0.000"
|
seta vr_weapon_adjustment_7 "0.888,-4.729,7.873,-10.240,0.000,0.000,0.000"
|
||||||
seta vr_weapon_adjustment_8 "1.006,-4.553,11.571,-12.545,0.000,0.000,0.000"
|
seta vr_weapon_adjustment_8 "0.796,-4.553,12.111,-14.905,0.000,0.000,0.000"
|
||||||
seta vr_weapon_adjustment_9 "1.456,-3.695,6.676,-3.420,0.000,0.000,0.000"
|
seta vr_weapon_adjustment_9 "1.151,-3.615,5.416,-3.820,0.000,0.000,0.000"
|