93 lines
3.0 KiB
Plaintext
93 lines
3.0 KiB
Plaintext
|
setupMiniMap( material )
|
||
|
{
|
||
|
level.minimap_image = material;
|
||
|
if ( !isdefined( level._loadStarted ) )
|
||
|
{
|
||
|
println( "^1Warning: shouldn't call setupMiniMap until after _load::main()" );
|
||
|
}
|
||
|
|
||
|
// use 0 for no required map aspect ratio.
|
||
|
requiredMapAspectRatio = getdvarfloat( "scr_requiredMapAspectRatio", 1 );
|
||
|
|
||
|
corners = getentarray( "minimap_corner", "targetname" );
|
||
|
if ( corners.size != 2 )
|
||
|
{
|
||
|
println( "^1Error: There are not exactly two \"minimap_corner\" entities in the map. Could not set up minimap." );
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
corner0 = ( corners[ 0 ].origin[ 0 ], corners[ 0 ].origin[ 1 ], 0 );
|
||
|
corner1 = ( corners[ 1 ].origin[ 0 ], corners[ 1 ].origin[ 1 ], 0 );
|
||
|
|
||
|
cornerdiff = corner1 - corner0;
|
||
|
|
||
|
north = ( cos( getnorthyaw() ), sin( getnorthyaw() ), 0 );
|
||
|
west = ( 0 - north[ 1 ], north[ 0 ], 0 );
|
||
|
|
||
|
// we need the northwest and southeast corners. all we know is that corner0 is opposite of corner1.
|
||
|
if ( vectordot( cornerdiff, west ) > 0 ) {
|
||
|
// corner1 is further west than corner0
|
||
|
if ( vectordot( cornerdiff, north ) > 0 ) {
|
||
|
// corner1 is northwest, corner0 is southeast
|
||
|
northwest = corner1;
|
||
|
southeast = corner0;
|
||
|
}
|
||
|
else {
|
||
|
// corner1 is southwest, corner0 is northeast
|
||
|
side = vecscale( north, vectordot( cornerdiff, north ) );
|
||
|
northwest = corner1 - side;
|
||
|
southeast = corner0 + side;
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
// corner1 is further east than corner0
|
||
|
if ( vectordot( cornerdiff, north ) > 0 ) {
|
||
|
// corner1 is northeast, corner0 is southwest
|
||
|
side = vecscale( north, vectordot( cornerdiff, north ) );
|
||
|
northwest = corner0 + side;
|
||
|
southeast = corner1 - side;
|
||
|
}
|
||
|
else {
|
||
|
// corner1 is southeast, corner0 is northwest
|
||
|
northwest = corner0;
|
||
|
southeast = corner1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// expand map area to fit required aspect ratio
|
||
|
if ( requiredMapAspectRatio > 0 )
|
||
|
{
|
||
|
northportion = vectordot( northwest - southeast, north );
|
||
|
westportion = vectordot( northwest - southeast, west );
|
||
|
mapAspectRatio = westportion / northportion;
|
||
|
if ( mapAspectRatio < requiredMapAspectRatio )
|
||
|
{
|
||
|
incr = requiredMapAspectRatio / mapAspectRatio;
|
||
|
addvec = vecscale( west, westportion * ( incr - 1 ) * 0.5 );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
incr = mapAspectRatio / requiredMapAspectRatio;
|
||
|
addvec = vecscale( north, northportion * ( incr - 1 ) * 0.5 );
|
||
|
}
|
||
|
northwest += addvec;
|
||
|
southeast -= addvec;
|
||
|
}
|
||
|
|
||
|
// This level.map_extents stuff seems to rely on northyaw being in a specific direction. It is not correct in the general case. I would not recommend using it.
|
||
|
level.map_extents = [];
|
||
|
level.map_extents[ "top" ] = northwest[ 1 ];
|
||
|
level.map_extents[ "left" ] = southeast[ 0 ];
|
||
|
level.map_extents[ "bottom" ] = southeast[ 1 ];
|
||
|
level.map_extents[ "right" ] = northwest[ 0 ];
|
||
|
level.map_width = level.map_extents[ "right" ] - level.map_extents[ "left" ];
|
||
|
level.map_height = level.map_extents[ "top" ] - level.map_extents[ "bottom" ];
|
||
|
|
||
|
setMiniMap( material, northwest[ 0 ], northwest[ 1 ], southeast[ 0 ], southeast[ 1 ] );
|
||
|
}
|
||
|
|
||
|
vecscale( vec, scalar )
|
||
|
{
|
||
|
return( vec[ 0 ] * scalar, vec[ 1 ] * scalar, vec[ 2 ] * scalar );
|
||
|
}
|