using UnityEngine;
using System;
namespace MoreMountains.Tools
{
///
/// Bool property setter
///
public class MMPropertyLinkBool : MMPropertyLink
{
public Func GetBoolDelegate;
public Action SetBoolDelegate;
protected bool _initialValue;
protected bool _newValue;
///
/// On init we grab our initial value
///
///
public override void Initialization(MMProperty property)
{
base.Initialization(property);
_initialValue = (bool)GetPropertyValue(property);
}
///
/// Creates cached getter and setters for properties
///
///
public override void CreateGettersAndSetters(MMProperty property)
{
base.CreateGettersAndSetters(property);
if (property.MemberType == MMProperty.MemberTypes.Property)
{
object firstArgument = (property.TargetScriptableObject == null) ? (object)property.TargetComponent : (object)property.TargetScriptableObject;
if (property.MemberPropertyInfo.GetGetMethod() != null)
{
GetBoolDelegate = (Func)Delegate.CreateDelegate(typeof(Func),
firstArgument,
property.MemberPropertyInfo.GetGetMethod());
}
if (property.MemberPropertyInfo.GetSetMethod() != null)
{
SetBoolDelegate = (Action)Delegate.CreateDelegate(typeof(Action),
firstArgument,
property.MemberPropertyInfo.GetSetMethod());
}
_getterSetterInitialized = true;
}
}
///
/// Gets the raw value of the property, a normalized float value, caching the operation if possible
///
///
///
///
public override object GetValue(MMPropertyEmitter emitter, MMProperty property)
{
return GetValueOptimized(property);
}
///
/// Sets the raw property value, float normalized, caching the operation if possible
///
///
///
///
public override void SetValue(MMPropertyReceiver receiver, MMProperty property, object newValue)
{
SetValueOptimized(property, (bool)newValue);
}
///
/// Returns this property link's level between 0 and 1
///
///
///
///
///
public override float GetLevel(MMPropertyEmitter emitter, MMProperty property)
{
bool boolValue = GetValueOptimized(property);
float returnValue = (boolValue == true) ? emitter.BoolRemapTrue : emitter.BoolRemapFalse;
emitter.Level = returnValue;
return returnValue;
}
///
/// Set the level (more than the link's Threshold > true, less > false)
///
///
///
///
public override void SetLevel(MMPropertyReceiver receiver, MMProperty property, float level)
{
base.SetLevel(receiver, property, level);
_newValue = (level > receiver.Threshold) ? receiver.BoolRemapOne : receiver.BoolRemapZero;
SetValueOptimized(property, _newValue);
}
///
/// Gets either the cached value or the raw value
///
///
///
protected virtual bool GetValueOptimized(MMProperty property)
{
return _getterSetterInitialized ? GetBoolDelegate() : (bool)GetPropertyValue(property);
}
///
/// Sets either the cached value or the raw value
///
///
///
protected virtual void SetValueOptimized(MMProperty property, bool newValue)
{
if (_getterSetterInitialized)
{
SetBoolDelegate(_newValue);
}
else
{
SetPropertyValue(property, _newValue);
}
}
}
}