[ioquake3] 06/33: Update UI player animation handling to match CGame
Simon McVittie
smcv at debian.org
Mon Oct 30 14:00:24 UTC 2017
This is an automated email from the git hooks/post-receive script.
smcv pushed a commit to branch debian/master
in repository ioquake3.
commit 11b3bca5555e8dd1fb73081ae27f34c46edfed1e
Author: Zack Middleton <zack at cloemail.com>
Date: Sun Sep 10 19:16:47 2017 -0500
Update UI player animation handling to match CGame
Fix "Error parsing animation file" messages in UI. Caused by fixing the
handling of missing tokens in animation.cfg parser in a past commit.
Fix new Team Arena torso animation frame numbers in UI.
Add support for fixedtorso and fixedlegs keywords.
Add support for reversed animations (negative numframes).
---
code/q3_ui/ui_local.h | 3 ++
code/q3_ui/ui_players.c | 72 +++++++++++++++++++++++++++++++++++++++++------
code/ui/ui_local.h | 3 ++
code/ui/ui_players.c | 74 +++++++++++++++++++++++++++++++++++++++++++------
4 files changed, 135 insertions(+), 17 deletions(-)
diff --git a/code/q3_ui/ui_local.h b/code/q3_ui/ui_local.h
index 72979a9..6bb0fb3 100644
--- a/code/q3_ui/ui_local.h
+++ b/code/q3_ui/ui_local.h
@@ -486,6 +486,9 @@ typedef struct {
animation_t animations[MAX_ANIMATIONS];
+ qboolean fixedlegs; // true if legs yaw is always the same as torso yaw
+ qboolean fixedtorso; // true if torso never changes yaw
+
qhandle_t weaponModel;
qhandle_t barrelModel;
qhandle_t flashModel;
diff --git a/code/q3_ui/ui_players.c b/code/q3_ui/ui_players.c
index b40ec90..cf2730a 100644
--- a/code/q3_ui/ui_players.c
+++ b/code/q3_ui/ui_players.c
@@ -363,7 +363,7 @@ UI_RunLerpFrame
===============
*/
static void UI_RunLerpFrame( playerInfo_t *ci, lerpFrame_t *lf, int newAnimation ) {
- int f;
+ int f, numFrames;
animation_t *anim;
// see if the animation sequence is switching
@@ -379,25 +379,41 @@ static void UI_RunLerpFrame( playerInfo_t *ci, lerpFrame_t *lf, int newAnimation
// get the next frame based on the animation
anim = lf->animation;
+ if ( !anim->frameLerp ) {
+ return; // shouldn't happen
+ }
if ( dp_realtime < lf->animationTime ) {
lf->frameTime = lf->animationTime; // initial lerp
} else {
lf->frameTime = lf->oldFrameTime + anim->frameLerp;
}
f = ( lf->frameTime - lf->animationTime ) / anim->frameLerp;
- if ( f >= anim->numFrames ) {
- f -= anim->numFrames;
+
+ numFrames = anim->numFrames;
+ if (anim->flipflop) {
+ numFrames *= 2;
+ }
+ if ( f >= numFrames ) {
+ f -= numFrames;
if ( anim->loopFrames ) {
f %= anim->loopFrames;
f += anim->numFrames - anim->loopFrames;
} else {
- f = anim->numFrames - 1;
+ f = numFrames - 1;
// the animation is stuck at the end, so it
// can immediately transition to another sequence
lf->frameTime = dp_realtime;
}
}
- lf->frame = anim->firstFrame + f;
+ if ( anim->reversed ) {
+ lf->frame = anim->firstFrame + anim->numFrames - 1 - f;
+ }
+ else if (anim->flipflop && f>=anim->numFrames) {
+ lf->frame = anim->firstFrame + anim->numFrames - 1 - (f%anim->numFrames);
+ }
+ else {
+ lf->frame = anim->firstFrame + f;
+ }
if ( dp_realtime > lf->frameTime ) {
lf->frameTime = dp_realtime;
}
@@ -615,6 +631,16 @@ static void UI_PlayerAngles( playerInfo_t *pi, vec3_t legs[3], vec3_t torso[3],
UI_SwingAngles( dest, 15, 30, 0.1f, &pi->torso.pitchAngle, &pi->torso.pitching );
torsoAngles[PITCH] = pi->torso.pitchAngle;
+ if ( pi->fixedtorso ) {
+ torsoAngles[PITCH] = 0.0f;
+ }
+
+ if ( pi->fixedlegs ) {
+ legsAngles[YAW] = torsoAngles[YAW];
+ legsAngles[PITCH] = 0.0f;
+ legsAngles[ROLL] = 0.0f;
+ }
+
// pull the angles back out of the hierarchial chain
AnglesSubtract( headAngles, torsoAngles, headAngles );
AnglesSubtract( torsoAngles, legsAngles, torsoAngles );
@@ -930,7 +956,7 @@ static qboolean UI_RegisterClientSkin( playerInfo_t *pi, const char *modelName,
UI_ParseAnimationFile
======================
*/
-static qboolean UI_ParseAnimationFile( const char *filename, animation_t *animations ) {
+static qboolean UI_ParseAnimationFile( const char *filename, playerInfo_t *pi ) {
char *text_p, *prev;
int len;
int i;
@@ -939,9 +965,15 @@ static qboolean UI_ParseAnimationFile( const char *filename, animation_t *animat
int skip;
char text[20000];
fileHandle_t f;
+ animation_t *animations;
+
+ animations = pi->animations;
memset( animations, 0, sizeof( animation_t ) * MAX_ANIMATIONS );
+ pi->fixedlegs = qfalse;
+ pi->fixedtorso = qfalse;
+
// load the file
len = trap_FS_FOpenFile( filename, &f, FS_READ );
if ( len <= 0 ) {
@@ -987,6 +1019,12 @@ static qboolean UI_ParseAnimationFile( const char *filename, animation_t *animat
break;
}
continue;
+ } else if ( !Q_stricmp( token, "fixedlegs" ) ) {
+ pi->fixedlegs = qtrue;
+ continue;
+ } else if ( !Q_stricmp( token, "fixedtorso" ) ) {
+ pi->fixedtorso = qtrue;
+ continue;
}
// if it is a number, start parsing animations
@@ -1003,6 +1041,16 @@ static qboolean UI_ParseAnimationFile( const char *filename, animation_t *animat
token = COM_Parse( &text_p );
if ( !token[0] ) {
+ if( i >= TORSO_GETFLAG && i <= TORSO_NEGATIVE ) {
+ animations[i].firstFrame = animations[TORSO_GESTURE].firstFrame;
+ animations[i].frameLerp = animations[TORSO_GESTURE].frameLerp;
+ animations[i].initialLerp = animations[TORSO_GESTURE].initialLerp;
+ animations[i].loopFrames = animations[TORSO_GESTURE].loopFrames;
+ animations[i].numFrames = animations[TORSO_GESTURE].numFrames;
+ animations[i].reversed = qfalse;
+ animations[i].flipflop = qfalse;
+ continue;
+ }
break;
}
animations[i].firstFrame = atoi( token );
@@ -1010,7 +1058,7 @@ static qboolean UI_ParseAnimationFile( const char *filename, animation_t *animat
if ( i == LEGS_WALKCR ) {
skip = animations[LEGS_WALKCR].firstFrame - animations[TORSO_GESTURE].firstFrame;
}
- if ( i >= LEGS_WALKCR ) {
+ if ( i >= LEGS_WALKCR && i<TORSO_GETFLAG) {
animations[i].firstFrame -= skip;
}
@@ -1020,6 +1068,14 @@ static qboolean UI_ParseAnimationFile( const char *filename, animation_t *animat
}
animations[i].numFrames = atoi( token );
+ animations[i].reversed = qfalse;
+ animations[i].flipflop = qfalse;
+ // if numFrames is negative the animation is reversed
+ if (animations[i].numFrames < 0) {
+ animations[i].numFrames = -animations[i].numFrames;
+ animations[i].reversed = qtrue;
+ }
+
token = COM_Parse( &text_p );
if ( !token[0] ) {
break;
@@ -1110,7 +1166,7 @@ qboolean UI_RegisterClientModelname( playerInfo_t *pi, const char *modelSkinName
// load the animations
Com_sprintf( filename, sizeof( filename ), "models/players/%s/animation.cfg", modelName );
- if ( !UI_ParseAnimationFile( filename, pi->animations ) ) {
+ if ( !UI_ParseAnimationFile( filename, pi ) ) {
Com_Printf( "Failed to load animation file %s\n", filename );
return qfalse;
}
diff --git a/code/ui/ui_local.h b/code/ui/ui_local.h
index cb41362..f635482 100644
--- a/code/ui/ui_local.h
+++ b/code/ui/ui_local.h
@@ -533,6 +533,9 @@ typedef struct {
animation_t animations[MAX_TOTALANIMATIONS];
+ qboolean fixedlegs; // true if legs yaw is always the same as torso yaw
+ qboolean fixedtorso; // true if torso never changes yaw
+
qhandle_t weaponModel;
qhandle_t barrelModel;
qhandle_t flashModel;
diff --git a/code/ui/ui_players.c b/code/ui/ui_players.c
index 87812ef..7f7ff0e 100644
--- a/code/ui/ui_players.c
+++ b/code/ui/ui_players.c
@@ -364,7 +364,7 @@ UI_RunLerpFrame
===============
*/
static void UI_RunLerpFrame( playerInfo_t *ci, lerpFrame_t *lf, int newAnimation ) {
- int f;
+ int f, numFrames;
animation_t *anim;
// see if the animation sequence is switching
@@ -380,25 +380,41 @@ static void UI_RunLerpFrame( playerInfo_t *ci, lerpFrame_t *lf, int newAnimation
// get the next frame based on the animation
anim = lf->animation;
+ if ( !anim->frameLerp ) {
+ return; // shouldn't happen
+ }
if ( dp_realtime < lf->animationTime ) {
lf->frameTime = lf->animationTime; // initial lerp
} else {
lf->frameTime = lf->oldFrameTime + anim->frameLerp;
}
f = ( lf->frameTime - lf->animationTime ) / anim->frameLerp;
- if ( f >= anim->numFrames ) {
- f -= anim->numFrames;
+
+ numFrames = anim->numFrames;
+ if (anim->flipflop) {
+ numFrames *= 2;
+ }
+ if ( f >= numFrames ) {
+ f -= numFrames;
if ( anim->loopFrames ) {
f %= anim->loopFrames;
f += anim->numFrames - anim->loopFrames;
} else {
- f = anim->numFrames - 1;
+ f = numFrames - 1;
// the animation is stuck at the end, so it
// can immediately transition to another sequence
lf->frameTime = dp_realtime;
}
}
- lf->frame = anim->firstFrame + f;
+ if ( anim->reversed ) {
+ lf->frame = anim->firstFrame + anim->numFrames - 1 - f;
+ }
+ else if (anim->flipflop && f>=anim->numFrames) {
+ lf->frame = anim->firstFrame + anim->numFrames - 1 - (f%anim->numFrames);
+ }
+ else {
+ lf->frame = anim->firstFrame + f;
+ }
if ( dp_realtime > lf->frameTime ) {
lf->frameTime = dp_realtime;
}
@@ -616,6 +632,16 @@ static void UI_PlayerAngles( playerInfo_t *pi, vec3_t legs[3], vec3_t torso[3],
UI_SwingAngles( dest, 15, 30, 0.1f, &pi->torso.pitchAngle, &pi->torso.pitching );
torsoAngles[PITCH] = pi->torso.pitchAngle;
+ if ( pi->fixedtorso ) {
+ torsoAngles[PITCH] = 0.0f;
+ }
+
+ if ( pi->fixedlegs ) {
+ legsAngles[YAW] = torsoAngles[YAW];
+ legsAngles[PITCH] = 0.0f;
+ legsAngles[ROLL] = 0.0f;
+ }
+
// pull the angles back out of the hierarchial chain
AnglesSubtract( headAngles, torsoAngles, headAngles );
AnglesSubtract( torsoAngles, legsAngles, torsoAngles );
@@ -1015,7 +1041,7 @@ static qboolean UI_RegisterClientSkin( playerInfo_t *pi, const char *modelName,
UI_ParseAnimationFile
======================
*/
-static qboolean UI_ParseAnimationFile( const char *filename, animation_t *animations ) {
+static qboolean UI_ParseAnimationFile( const char *filename, playerInfo_t *pi ) {
char *text_p, *prev;
int len;
int i;
@@ -1024,9 +1050,15 @@ static qboolean UI_ParseAnimationFile( const char *filename, animation_t *animat
int skip;
char text[20000];
fileHandle_t f;
+ animation_t *animations;
+
+ animations = pi->animations;
memset( animations, 0, sizeof( animation_t ) * MAX_ANIMATIONS );
+ pi->fixedlegs = qfalse;
+ pi->fixedtorso = qfalse;
+
// load the file
len = trap_FS_FOpenFile( filename, &f, FS_READ );
if ( len <= 0 ) {
@@ -1074,6 +1106,12 @@ static qboolean UI_ParseAnimationFile( const char *filename, animation_t *animat
break;
}
continue;
+ } else if ( !Q_stricmp( token, "fixedlegs" ) ) {
+ pi->fixedlegs = qtrue;
+ continue;
+ } else if ( !Q_stricmp( token, "fixedtorso" ) ) {
+ pi->fixedtorso = qtrue;
+ continue;
}
// if it is a number, start parsing animations
@@ -1090,6 +1128,16 @@ static qboolean UI_ParseAnimationFile( const char *filename, animation_t *animat
token = COM_Parse( &text_p );
if ( !token[0] ) {
+ if( i >= TORSO_GETFLAG && i <= TORSO_NEGATIVE ) {
+ animations[i].firstFrame = animations[TORSO_GESTURE].firstFrame;
+ animations[i].frameLerp = animations[TORSO_GESTURE].frameLerp;
+ animations[i].initialLerp = animations[TORSO_GESTURE].initialLerp;
+ animations[i].loopFrames = animations[TORSO_GESTURE].loopFrames;
+ animations[i].numFrames = animations[TORSO_GESTURE].numFrames;
+ animations[i].reversed = qfalse;
+ animations[i].flipflop = qfalse;
+ continue;
+ }
break;
}
animations[i].firstFrame = atoi( token );
@@ -1097,7 +1145,7 @@ static qboolean UI_ParseAnimationFile( const char *filename, animation_t *animat
if ( i == LEGS_WALKCR ) {
skip = animations[LEGS_WALKCR].firstFrame - animations[TORSO_GESTURE].firstFrame;
}
- if ( i >= LEGS_WALKCR ) {
+ if ( i >= LEGS_WALKCR && i<TORSO_GETFLAG) {
animations[i].firstFrame -= skip;
}
@@ -1107,6 +1155,14 @@ static qboolean UI_ParseAnimationFile( const char *filename, animation_t *animat
}
animations[i].numFrames = atoi( token );
+ animations[i].reversed = qfalse;
+ animations[i].flipflop = qfalse;
+ // if numFrames is negative the animation is reversed
+ if (animations[i].numFrames < 0) {
+ animations[i].numFrames = -animations[i].numFrames;
+ animations[i].reversed = qtrue;
+ }
+
token = COM_Parse( &text_p );
if ( !token[0] ) {
break;
@@ -1225,9 +1281,9 @@ qboolean UI_RegisterClientModelname( playerInfo_t *pi, const char *modelSkinName
// load the animations
Com_sprintf( filename, sizeof( filename ), "models/players/%s/animation.cfg", modelName );
- if ( !UI_ParseAnimationFile( filename, pi->animations ) ) {
+ if ( !UI_ParseAnimationFile( filename, pi ) ) {
Com_sprintf( filename, sizeof( filename ), "models/players/characters/%s/animation.cfg", modelName );
- if ( !UI_ParseAnimationFile( filename, pi->animations ) ) {
+ if ( !UI_ParseAnimationFile( filename, pi ) ) {
Com_Printf( "Failed to load animation file %s\n", filename );
return qfalse;
}
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/ioquake3.git
More information about the Pkg-games-commits
mailing list