diff options
Diffstat (limited to 'src/cgame/cg_buildable.c')
| -rw-r--r-- | src/cgame/cg_buildable.c | 58 | 
1 files changed, 28 insertions, 30 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  | 
