internal void Broadcast(RSTriggerId inTriggerId, RSValue inArgument, bool inbForce) { foreach (var entity in Entities.EntitiesForTrigger(inTriggerId)) { TriggerRS(entity, inTriggerId, inArgument, inbForce); } }
static private void ValidateValue(RSValue inValue, RSTypeInfo inExpectedType, RSValidationFlags inFlags, RSValidationState ioState, RSValidationContext inContext) { Type systemType = inExpectedType.SystemType; if (systemType.IsEnum) { try { Enum currentValue = inValue.AsEnum(); } catch (Exception e) { Debug.LogException(e); ioState.Error("Enum {0} cannot be represented as type {1}", inValue, inExpectedType); } return; } if (inExpectedType == RSBuiltInTypes.Entity) { EntityScopeData scope = inValue.AsEntity; ValidateEntityScope(scope, inFlags.ForEntityValue(), ioState, inContext); } else if (inExpectedType == RSBuiltInTypes.GroupId) { RSGroupId group = inValue.AsGroupId; ValidateGroupId(group, inFlags, ioState, inContext); } else if (inExpectedType == RSBuiltInTypes.TriggerId) { RSTriggerId triggerId = inValue.AsTriggerId; ValidateTriggerId(triggerId, inFlags, ioState, inContext); } }
/// <summary> /// A trigger selector for a specific entity. /// </summary> static public RSTriggerId TriggerSelector(GUIContent inLabel, RSTriggerId inCurrentId, RSLibrary inLibrary) { RSEditorUtility.s_TriggerElements.Clear(); inLibrary.GetAllTriggers(RSEditorUtility.s_TriggerElements); int trigger = RSGUILayout.RSElementSelector(inLabel, (int)inCurrentId, RSEditorUtility.s_TriggerElements); return(new RSTriggerId(trigger)); }
/// <summary> /// A trigger selector. /// </summary> static public RSTriggerId TriggerSelector(Rect inPosition, RSTriggerId inCurrentId, RSLibrary inLibrary) { RSEditorUtility.s_TriggerElements.Clear(); inLibrary.GetAllTriggers(RSEditorUtility.s_TriggerElements); int trigger = RSGUI.RSElementSelector(inPosition, (int)inCurrentId, RSEditorUtility.s_TriggerElements); return(new RSTriggerId(trigger)); }
/// <summary> /// A trigger selector. /// </summary> static public RSTriggerId TriggerSelector(Rect inPosition, RSTriggerId inCurrentId, RSTypeInfo inParameterType, RSLibrary inLibrary) { RSEditorUtility.s_TriggerElements.Clear(); inLibrary.GetAllTriggers(RSEditorUtility.s_TriggerElements, inParameterType ?? RSBuiltInTypes.Void); int trigger = RSGUI.RSElementSelector(inPosition, (int)inCurrentId, RSEditorUtility.s_TriggerElements); return(new RSTriggerId(trigger)); }
static public void Trigger(this IRSRuntimeEntity inEntity, RSTriggerId inTriggerId, object inArgument = null, bool inbForce = false) { IRSRuntimeEntityMgr mgr = inEntity?.Manager; if (mgr != null && mgr.IsReady() && mgr.Context != null) { mgr.Context.Trigger(inEntity, inTriggerId, inArgument, inbForce); } }
public void Broadcast(RSTriggerId inTriggerId, object inArgument, bool inbForce) { if (m_Destroyed) { return; } Broadcast(inTriggerId, RSInterop.ToRSValue(inArgument), inbForce); }
public void Trigger(IRSRuntimeEntity inEntity, RSTriggerId inTriggerId, object inArgument, bool inbForce) { if (m_Destroyed) { return; } TriggerRS(inEntity, inTriggerId, RSInterop.ToRSValue(inArgument), inbForce); }
/// <summary> /// A trigger selector for a specific entity. /// </summary> static public RSTriggerId TriggerSelector(RSTriggerId inCurrentId, IRSEntity inEntity, RSTypeInfo inParameterType, RSLibrary inLibrary) { RSEditorUtility.s_TriggerElements.Clear(); inLibrary.GetAllTriggersForEntity(inEntity, RSEditorUtility.s_TriggerElements, inParameterType ?? RSBuiltInTypes.Void); inLibrary.GetAllGlobalTriggers(RSEditorUtility.s_TriggerElements, inParameterType ?? RSBuiltInTypes.Void); int trigger = RSGUILayout.RSElementSelector((int)inCurrentId, RSEditorUtility.s_TriggerElements); return(new RSTriggerId(trigger)); }
private HashSet <T> GetHashSet(RSTriggerId inTriggerId, bool inbCreate = true) { HashSet <T> set; if (!m_Map.TryGetValue((int)inTriggerId, out set) && inbCreate) { set = new HashSet <T>(EntityEqualityComparer <T> .Instance); m_Map.Add((int)inTriggerId, set); } return(set); }
public RSTriggerInfo(RSTriggerAttribute inAttribute, FieldInfo inFieldInfo) : base(inAttribute, inFieldInfo) { TriggerId = new RSTriggerId(IdHash); if (inAttribute.ParameterType != null) { ParameterType = new RSParameterInfo(inAttribute.ParameterName, inAttribute.ParameterDescription, inAttribute.ParameterType, false); } OwnerType = inAttribute.Global ? null : (inAttribute.OwnerType ?? OwnerType); }
static private RSTriggerInfo ValidateTriggerId(RSTriggerId inTriggerId, RSValidationFlags inFlags, RSValidationState ioState, RSValidationContext inContext) { RSTypeInfo restrictTriggerType = inContext.Parameter?.TriggerParameterType; if (inTriggerId == RSTriggerId.Null) { if (restrictTriggerType != null) { ioState.Error("Null trigger id provided - require trigger with parameter type {0}", restrictTriggerType); } else { ioState.Warn("Null trigger provided"); } return(null); } else { RSTriggerInfo triggerInfo = inContext.Library.GetTrigger(inTriggerId); if (triggerInfo == null) { ioState.Error("Trigger {0} does not exist", inTriggerId); } else { if (restrictTriggerType != null) { if (restrictTriggerType == RSBuiltInTypes.Void) { if (triggerInfo.ParameterType != null) { ioState.Error("Trigger with no parameter required, but trigger {0} with parameter {1} provided", triggerInfo.Name, triggerInfo.ParameterType.Type); } } else { if (triggerInfo.ParameterType == null) { ioState.Error("Trigger with parameter {0} required, but trigger {1} with no parameter provided", restrictTriggerType, triggerInfo.Name); } else if (!restrictTriggerType.CanConvert(triggerInfo.ParameterType.Type)) { ioState.Error("Trigger with parameter {0} required, but trigger {1} with incompatible parameter {2} provided", restrictTriggerType, triggerInfo.Name, triggerInfo.ParameterType.Type); } } } } return(triggerInfo); } }
internal void TriggerRS(IRSRuntimeEntity inEntity, RSTriggerId inTriggerId, RSValue inArgument, bool inbForce) { if (!inbForce && inEntity.IsLocked()) { return; } ExecutionScope scope = CreateScope(inEntity, inArgument, 0); using (new SharedRef <ExecutionScope>(scope)) { inEntity?.RuleTable?.EvaluateTrigger(inTriggerId, scope); } }
/// <summary> /// Finds the trigger metadata with the given id. /// </summary> public RSTriggerInfo GetTrigger(RSTriggerId inId) { if (inId == RSTriggerId.Null) { return(null); } RSTriggerInfo meta; if (!m_Triggers.TryGetValue((int)inId, out meta)) { Log.Error("[RSMetaDatabase] No trigger type with id {0} registered", inId); } return(meta); }
static public bool IsListeningForTrigger(this IRSRuntimeEntity inEntity, RSTriggerId inTriggerId) { if (inTriggerId == RSTriggerId.Null) { return(false); } RSTriggerId[] triggers = (inEntity.RuleTable?.Data?.UniqueTriggers); if (triggers != null) { return(Array.IndexOf(triggers, inTriggerId) >= 0); } return(false); }
/// <summary> /// Outputs all entities listening for the given trigger to a collection. /// </summary> public int GetListeners(RSTriggerId inTrigger, ICollection <T> outCollection) { HashSet <T> set = GetHashSet(inTrigger, false); if (set == null) { return(0); } foreach (var entity in set) { outCollection.Add(entity); } return(set.Count); }
static private void BroadcastTriggerWithString(IScriptContext inContext, [RSParameter("Trigger", TriggerParameterType = typeof(string))] RSTriggerId inTrigger, [RSParameter("Trigger Parameter")] string inArgument) { inContext?.Broadcast(inTrigger, inArgument); }
static private void BroadcastTrigger(IScriptContext inContext, [RSParameter("Trigger", TriggerParameterType = typeof(void))] RSTriggerId inTrigger) { inContext?.Broadcast(inTrigger); }
static private void DispatchTriggerWithString(this IRSRuntimeEntity inEntity, IScriptContext inContext, [RSParameter("Trigger", TriggerParameterType = typeof(string))] RSTriggerId inTrigger, [RSParameter("Trigger Parameter")] string inArgument) { inContext?.Trigger(inEntity, inTrigger, inArgument); }
static private void DispatchTrigger(this IRSRuntimeEntity inEntity, IScriptContext inContext, [RSParameter("Trigger", TriggerParameterType = typeof(void))] RSTriggerId inTrigger) { inContext?.Trigger(inEntity, inTrigger); }
internal void EvaluateTrigger(RSTriggerId inTriggerId, ExecutionScope inScope) { if (!m_Entity.IsAlive()) { return; } if (OnTrigger != null) { object arg = RSInterop.ToObject(inScope.Argument, inScope); OnTrigger.Invoke(inTriggerId, arg); } RSRuleData[] rules = m_Table?.Rules; int ruleCount; if (rules == null || (ruleCount = rules.Length) <= 0) { return; } using (PooledSet <string> triggeredGroups = PooledSet <string> .Alloc()) { for (int i = 0; i < ruleCount; ++i) { RSRuleData rule = rules[i]; if (rule.TriggerId != inTriggerId) { continue; } if (m_States[i].HasFlag(RuleState.Disabled)) { continue; } if (rule.DontInterrupt && m_Routines[i]) { continue; } if (!inScope.EvaluateConditions(rule.Conditions, rule.ConditionSubset)) { continue; } if (!string.IsNullOrEmpty(rule.RoutineGroup)) { if (!triggeredGroups.Add(rule.RoutineGroup)) { continue; } StopRuleGroup(rule.RoutineGroup); } if (rule.OnlyOnce) { m_States[i] |= RuleState.Disabled; } if (rule.Actions != null) { ExecutionScope scope = inScope; scope.m_Environment.CloneScopeIfNecessary(scope, rule.Flags, out scope); m_Routines[i].Replace(m_Entity.ProxyObject, scope.PerformActions(rule.Actions)) .ExecuteWhileDisabled().SetPhase(m_Entity.ExecutionPhase) .TryManuallyUpdate(0); } } } }
/// <summary> /// Registers the given entity as a listener on the given trigger id. /// </summary> public void Register(T inEntity, RSTriggerId inTrigger) { GetHashSet(inTrigger).Add(inEntity); }
static private RSValue DoRSValueField(GUIContent inLabel, RSValue inValue, RSTypeInfo inExpectedType, RSValidationFlags inFlags, RSValidationContext inContext) { Type systemType = inExpectedType.SystemType; if (systemType.IsEnum) { Enum currentValue; try { currentValue = inValue.AsEnum(); } catch (Exception e) { Debug.LogException(e); currentValue = inExpectedType.DefaultValue.AsEnum(); } Enum nextValue = EnumGUILayout.EnumField(inLabel, currentValue); return(RSValue.FromEnum(nextValue)); } if (inExpectedType == RSBuiltInTypes.Int) { int currentValue = inValue.AsInt; int nextValue = EditorGUILayout.DelayedIntField(inLabel, currentValue); return(RSValue.FromInt(nextValue)); } else if (inExpectedType == RSBuiltInTypes.Float) { float currentValue = inValue.AsFloat; float nextValue = EditorGUILayout.DelayedFloatField(inLabel, currentValue); return(RSValue.FromFloat(nextValue)); } else if (inExpectedType == RSBuiltInTypes.Bool) { bool currentValue = inValue.AsBool; bool nextValue = EditorGUILayout.Toggle(inLabel, currentValue); return(RSValue.FromBool(nextValue)); } else if (inExpectedType == RSBuiltInTypes.Color) { Color currentValue = inValue.AsColor; Color nextValue = EditorGUILayout.ColorField(inLabel, currentValue); return(RSValue.FromColor(nextValue)); } else if (inExpectedType == RSBuiltInTypes.String) { string currentValue = inValue.AsString; string nextValue = EditorGUILayout.TextField(inLabel, currentValue); return(RSValue.FromString(nextValue)); } else if (inExpectedType == RSBuiltInTypes.Vector2) { Vector2 currentValue = inValue.AsVector2; Vector2 nextValue = EditorGUILayout.Vector2Field(inLabel, currentValue); return(RSValue.FromVector2(nextValue)); } else if (inExpectedType == RSBuiltInTypes.Vector3) { Vector3 currentValue = inValue.AsVector3; Vector3 nextValue = EditorGUILayout.Vector3Field(inLabel, currentValue); return(RSValue.FromVector3(nextValue)); } else if (inExpectedType == RSBuiltInTypes.Vector4) { Vector4 currentValue = inValue.AsVector4; Vector4 nextValue = EditorGUILayout.Vector4Field(inLabel, currentValue); return(RSValue.FromVector4(nextValue)); } else if (inExpectedType == RSBuiltInTypes.Entity) { EntityScopeData currentValue = inValue.AsEntity; EntityScopeData nextValue = EntityScopeField(inLabel, currentValue, inFlags.ForEntityValue(), inContext); return(RSValue.FromEntity(nextValue)); } else if (inExpectedType == RSBuiltInTypes.GroupId) { RSGroupId currentValue = inValue.AsGroupId; RSGroupId nextValue = LibraryGUILayout.GroupSelector(inLabel, currentValue, inContext.Library); return(RSValue.FromGroupId(nextValue)); } else if (inExpectedType == RSBuiltInTypes.TriggerId) { RSTriggerId currentValue = inValue.AsTriggerId; RSTypeInfo restrictTriggerType = inContext.Parameter?.TriggerParameterType; RSTriggerId nextValue; if (restrictTriggerType != null) { nextValue = LibraryGUILayout.TriggerSelector(inLabel, currentValue, restrictTriggerType, inContext.Library); } else { nextValue = LibraryGUILayout.TriggerSelector(inLabel, currentValue, inContext.Library); } return(RSValue.FromTriggerId(nextValue)); } else { EditorGUILayout.HelpBox(string.Format("Unable to display editor for type {0}", inExpectedType), MessageType.Error); } return(inValue); }
/// <summary> /// Deregisters the given entity as a listener on the given trigger id. /// </summary> public void Deregister(T inEntity, RSTriggerId inTrigger) { GetHashSet(inTrigger, false)?.Remove(inEntity); }
/// <summary> /// A trigger selector for a specific entity. /// </summary> static public RSTriggerId TriggerSelector(Rect inPosition, GUIContent inLabel, RSTriggerId inCurrentId, IRSEntity inEntity, RSLibrary inLibrary) { RSEditorUtility.s_TriggerElements.Clear(); inLibrary.GetAllTriggersForEntity(inEntity, RSEditorUtility.s_TriggerElements); inLibrary.GetAllGlobalTriggers(RSEditorUtility.s_TriggerElements); int trigger = RSGUI.RSElementSelector(inPosition, inLabel, (int)inCurrentId, RSEditorUtility.s_TriggerElements); return(new RSTriggerId(trigger)); }
void IScriptContext.Trigger(IRSRuntimeEntity inEntity, RSTriggerId inTriggerId, object inArgument, bool inbForce) { m_Environment.Trigger(inEntity, inTriggerId, RSInterop.ToRSValue(inArgument), inbForce); }
void IScriptContext.Broadcast(RSTriggerId inTriggerId, object inArgument, bool inbForce) { m_Environment.Broadcast(inTriggerId, RSInterop.ToRSValue(inArgument), inbForce); }