diff options
author | Tim Angus <tim@ngus.net> | 2001-12-02 02:16:25 +0000 |
---|---|---|
committer | Tim Angus <tim@ngus.net> | 2001-12-02 02:16:25 +0000 |
commit | 771b1c676714928ab1dea4f3b9277ff991b00f65 (patch) | |
tree | 853f47aa806862283959f23134d2b74a6295e48e | |
parent | 749407ffc26c647c1faf675734559ab9fd8774fe (diff) |
Tag based turrets
-rw-r--r-- | src/cgame/cg_buildable.c | 58 | ||||
-rw-r--r-- | src/game/bg_misc.c | 2 |
2 files changed, 29 insertions, 31 deletions
diff --git a/src/cgame/cg_buildable.c b/src/cgame/cg_buildable.c index de0b1061..a931638a 100644 --- a/src/cgame/cg_buildable.c +++ b/src/cgame/cg_buildable.c @@ -384,7 +384,9 @@ void CG_Buildable( centity_t *cent ) refEntity_t ent; entityState_t *es; vec3_t angles; - vec3_t forward, surfNormal, end, start, mins, maxs; + vec3_t forward, surfNormal, xNormal, end, start, mins, maxs; + vec3_t refNormal = { 0.0f, 0.0f, 1.0f }; + float rotAngle; trace_t tr; es = ¢->currentState; @@ -406,6 +408,10 @@ void CG_Buildable( centity_t *cent ) VectorCopy( cent->lerpOrigin, ent.lightingOrigin ); VectorCopy( es->origin2, surfNormal ); + CrossProduct( surfNormal, refNormal, xNormal ); + VectorNormalize( xNormal ); + rotAngle = RAD2DEG( acos( DotProduct( surfNormal, refNormal ) ) ); + VectorCopy( es->angles, angles ); BG_FindBBoxForBuildable( es->modelindex, mins, maxs ); @@ -444,31 +450,19 @@ void CG_Buildable( centity_t *cent ) if( cg_buildables[ es->modelindex ].models[ 1 ] ) { refEntity_t turretBarrel; + vec3_t flatAxis[ 3 ]; memset( &turretBarrel, 0, sizeof( turretBarrel ) ); - AnglesToAxis( es->angles2, turretBarrel.axis ); - turretBarrel.hModel = cg_buildables[ es->modelindex ].models[ 1 ]; VectorCopy( cent->lerpOrigin, turretBarrel.lightingOrigin ); - CG_PositionRotatedEntityOnTag( &turretBarrel, &ent, ent.hModel, "tag_turret" ); + CG_PositionEntityOnTag( &turretBarrel, &ent, ent.hModel, "tag_turret" ); + AnglesToAxis( es->angles2, flatAxis ); -/* AngleVectors( es->angles2, forward, NULL, NULL ); - VectorCopy( surfNormal, turretBarrel.axis[ 2 ] ); - ProjectPointOnPlane( turretBarrel.axis[ 0 ], forward, turretBarrel.axis[ 2 ] ); - - if( !VectorNormalize( turretBarrel.axis[ 0 ] ) ) - { - AngleVectors( es->angles2, NULL, NULL, forward ); - ProjectPointOnPlane( turretBarrel.axis[ 0 ], forward, turretBarrel.axis[ 2 ] ); - VectorNormalize( turretBarrel.axis[ 0 ] ); - } - - CrossProduct( turretBarrel.axis[ 0 ], turretBarrel.axis[ 2 ], turretBarrel.axis[ 1 ] ); - turretBarrel.axis[ 1 ][ 0 ] = -turretBarrel.axis[ 1 ][ 0 ]; - turretBarrel.axis[ 1 ][ 1 ] = -turretBarrel.axis[ 1 ][ 1 ]; - turretBarrel.axis[ 1 ][ 2 ] = -turretBarrel.axis[ 1 ][ 2 ];*/ + RotatePointAroundVector( turretBarrel.axis[ 0 ], xNormal, flatAxis[ 0 ], -rotAngle ); + RotatePointAroundVector( turretBarrel.axis[ 1 ], xNormal, flatAxis[ 1 ], -rotAngle ); + RotatePointAroundVector( turretBarrel.axis[ 2 ], xNormal, flatAxis[ 2 ], -rotAngle ); turretBarrel.oldframe = ent.oldframe; turretBarrel.frame = ent.frame; @@ -480,26 +474,30 @@ void CG_Buildable( centity_t *cent ) //turret barrel bit if( cg_buildables[ es->modelindex ].models[ 2 ] ) { - refEntity_t turretBarrel; + refEntity_t turretTop; + vec3_t flatAxis[ 3 ]; vec3_t swivelAngles; - memset( &turretBarrel, 0, sizeof( turretBarrel ) ); + memset( &turretTop, 0, sizeof( turretTop ) ); VectorCopy( es->angles2, swivelAngles ); swivelAngles[ PITCH ] = 0.0f; - AnglesToAxis( swivelAngles, turretBarrel.axis ); + turretTop.hModel = cg_buildables[ es->modelindex ].models[ 2 ]; + VectorCopy( cent->lerpOrigin, turretTop.lightingOrigin ); - turretBarrel.hModel = cg_buildables[ es->modelindex ].models[ 1 ]; - VectorCopy( cent->lerpOrigin, turretBarrel.lightingOrigin ); + CG_PositionEntityOnTag( &turretTop, &ent, ent.hModel, "tag_turret" ); + AnglesToAxis( swivelAngles, flatAxis ); - CG_PositionRotatedEntityOnTag( &turretBarrel, &ent, ent.hModel, "tag_turret" ); - - turretBarrel.oldframe = ent.oldframe; - turretBarrel.frame = ent.frame; - turretBarrel.backlerp = ent.backlerp; + RotatePointAroundVector( turretTop.axis[ 0 ], xNormal, flatAxis[ 0 ], -rotAngle ); + RotatePointAroundVector( turretTop.axis[ 1 ], xNormal, flatAxis[ 1 ], -rotAngle ); + RotatePointAroundVector( turretTop.axis[ 2 ], xNormal, flatAxis[ 2 ], -rotAngle ); + + turretTop.oldframe = ent.oldframe; + turretTop.frame = ent.frame; + turretTop.backlerp = ent.backlerp; - trap_R_AddRefEntityToScene( &turretBarrel ); + trap_R_AddRefEntityToScene( &turretTop ); } // add to refresh list diff --git a/src/game/bg_misc.c b/src/game/bg_misc.c index 450bcd85..d7925ef2 100644 --- a/src/game/bg_misc.c +++ b/src/game/bg_misc.c @@ -1483,7 +1483,7 @@ buildableAttributes_t bg_buildableList[ ] = BA_H_DEF2, //int buildNum; "mgturret", //char *buildName; "team_human_def2", //char *entityName; - { "models/buildables/plasmaturret/pturret_base.md3", "models/weapons2/machinegun/machinegun.md3", 0, 0 }, + { "models/buildables/mgturret/turret_base.md3", "models/buildables/mgturret/turret_barrel.md3", "models/buildables/mgturret/turret_top.md3", 0 }, { -24, -24, -11 }, //vec3_t mins; { 24, 24, 11 }, //vec3_t maxs; TR_GRAVITY, //trType_t traj; |