/*********************************************************************** zoomWidget.script ***********************************************************************/ object zoomWidget { void destroy(); void Init( entity other ); void Enable(); void Disable(); float GetZoomState(); float GetNumZoomStates(); float GetZoomFov( float indexValue ); // cycle the zoom levels one by one void Cycle(); // zoom in or zoom out by 1/4 levels of zoom void Zoom( float delta ); void ZoomIn(); void ZoomOut(); float numZoomStates; float zoomTime; float currentZoomState; boolean enabled; entity owner; boolean IsFullyZoomedIn() { return currentZoomState == numZoomStates - 1; } boolean IsFullyZoomedOut() { return currentZoomState == 0.0f; } boolean IsEnabled() { return enabled; } }; void zoomWidget::destroy() { Disable(); } void zoomWidget::Init( entity other ) { owner = other; numZoomStates = other.getIntKey( "num_zoom_levels" ); zoomTime = other.getFloatKeyWithDefault( "zoom_time", 0.5f ); } float zoomWidget::GetZoomState() { return currentZoomState; } float zoomWidget::GetNumZoomStates() { return numZoomStates; } void zoomWidget::Enable() { if ( enabled ) { return; } enabled = true; owner.setFov( sys.getDefaultFov(), GetZoomFov( currentZoomState ), zoomTime ); } void zoomWidget::Disable() { currentZoomState = 0; if ( !enabled ) { return; } enabled = false; owner.setFov( GetZoomFov( currentZoomState ), sys.getDefaultFov(), zoomTime ); } float zoomWidget::GetZoomFov( float indexValue ) { if ( numZoomStates <= 1 ) { return owner.getFloatKeyWithDefault( "zoom_fov", 45 ); } float index = int( indexValue ); float interpValue = indexValue - index; float fov = owner.getFloatKey( "zoom_fov_" + ( index + 1 ) ); if ( fov <= 0 ) { fov = 90; } if ( interpValue > 0 ) { float fov2 = owner.getFloatKey( "zoom_fov_" + ( index + 2 ) ); if ( fov2 <= 0 ) { fov2 = 90; } fov = fov + interpValue * ( fov2 - fov ); } return fov; } void zoomWidget::Cycle() { sys.assert( enabled ); float oldFov = owner.getFov(); currentZoomState = currentZoomState + 1; if ( currentZoomState >= numZoomStates ) { currentZoomState = 0; } else { currentZoomState = int( currentZoomState ); } owner.setFov( oldFov, GetZoomFov( currentZoomState ), zoomTime ); } void zoomWidget::Zoom( float delta ) { sys.assert( enabled ); float oldZoomState = currentZoomState; float oldFov = owner.getFov(); float oldTargetFov = GetZoomFov( oldZoomState ); float maxZoomState = numZoomStates - 1; currentZoomState = currentZoomState + delta; if ( currentZoomState > maxZoomState ) { currentZoomState = maxZoomState; } if ( currentZoomState < 0 ) { currentZoomState = 0; } owner.setFov( oldFov, GetZoomFov( currentZoomState ), zoomTime ); } void zoomWidget::ZoomIn() { Zoom( 0.25 ); } void zoomWidget::ZoomOut() { Zoom( -0.25 ); }