public override string GetComponentVariableName(IIteratorStackModel query, TypeHandle componentVariableType) { // TODO forward to parent if necessary return(query == IterationContext.Query ? IterationContext.GetComponentDataName(componentVariableType.Resolve(IterationContext.Stencil)) : Parent.GetComponentVariableName(query, componentVariableType)); }
internal IEnumerable <TypeHandle> GetComponentTypesFromEntityPort() { var entityTypeHandle = typeof(Entity).GenerateTypeHandle(EntityPort.GraphModel.Stencil); IIteratorStackModel iteratorStackModel = null; if (EntityPort.Connected) { var variable = (EntityPort.ConnectionPortModels?.FirstOrDefault()?.NodeModel as VariableNodeModel)?.DeclarationModel; if (variable != null && variable.DataType.Equals(entityTypeHandle) && variable.Owner is IIteratorStackModel ism) { iteratorStackModel = ism; } } else if (ParentStackModel.OwningFunctionModel is IIteratorStackModel ism) { iteratorStackModel = ism; } return(iteratorStackModel != null ? iteratorStackModel.ComponentQueryDeclarationModel.Components.Select(c => c.Component.TypeHandle) : Enumerable.Empty <TypeHandle>()); }
int AddCriteriaModelRows(IIteratorStackModel iteratorStackModel, ExpandedContainer expandedContainer) { foreach (var criteriaModel in iteratorStackModel.CriteriaModels) { AddCriteriaModelRow(criteriaModel, iteratorStackModel, expandedContainer); } return(iteratorStackModel.CriteriaModels.Count); }
public IterationContext FindContext(IIteratorStackModel groupDeclaration) { var current = context; while (current != null && current.IterationContext.Query != groupDeclaration) { current = current.Parent; } return(current?.IterationContext); }
public override TranslationContext PushContext(IIteratorStackModel query, RoslynEcsTranslator roslynEcsTranslator, UpdateMode mode, bool isCoroutine = false) { if (isCoroutine) { return(new CoroutineContext(this, roslynEcsTranslator)); } return(new ForEachContext(query, this, mode)); }
public JobContext(IIteratorStackModel query, RootContext parent, UpdateMode mode) : base(parent) { IterationContext = new RoslynEcsTranslator.IterationContext(this, query, parent.MakeUniqueName(query.ComponentQueryDeclarationModel.VariableName), mode); m_JobName = query is OnEventNodeModel onEventNodeModel ? parent.MakeUniqueName($"On_{onEventNodeModel.EventTypeHandle.Name(IterationContext.Stencil)}_Job") : parent.MakeUniqueName($"Update_{IterationContext.GroupName}_Job"); m_ExcludedComponents = new HashSet <TypeHandle>(query.ComponentQueryDeclarationModel.Components.Where(c => c.Component.Subtract) .Select(c => c.Component.TypeHandle)); GetOrDeclareComponentQuery(IterationContext); }
void BuildCoroutineStack(IIteratorStackModel stack, ref BlockSyntax block) { PushContext(stack, context.IterationContext.UpdateMode, true); var ctx = (CoroutineContext)context; ctx.BuildComponent(stack, this); var statement = PopContext(); block = block.AddStatements(statement.ToArray()); }
public override TranslationContext PushContext(IIteratorStackModel query, RoslynEcsTranslator roslynEcsTranslator, UpdateMode mode) { if (roslynEcsTranslator.GameObjectCodeGen || !m_TranslationOptions.HasFlag(RoslynEcsTranslator.TranslationOptions.UseJobs)) { m_NeedToCompleteDependenciesFirst = true; return(new ForEachLambdaContext(query, this, mode)); } return(new JobContext(query, this, mode) { BurstCompileJobs = m_TranslationOptions.HasFlag(RoslynEcsTranslator.TranslationOptions.BurstCompile) }); }
public IteratorStackNode(Store store, IIteratorStackModel model, INodeBuilder builder) : base(store, model, builder) { // TODO: Move affecting rules in a more generic USS file and share with BlackboardEcsProvider styleSheets.Add(AssetDatabase.LoadAssetAtPath <StyleSheet>(UICreationHelper.TemplatePath + "BlackboardECS.uss")); // @TODO: This might need to be reviewed in favor of a better / more scalable approach (non preprocessor based) // that would ideally bring the same level of backward/forward compatibility and/or removed when a 2013 beta version lands. #if UNITY_2019_3_OR_NEWER styleSheets.Add(AssetDatabase.LoadAssetAtPath <StyleSheet>(UICreationHelper.TemplatePath + "BlackboardECS.2019.3.uss")); #endif var stackNodeHeaderContainer = this.MandatoryQ("stackNodeHeaderContainer"); var stencil = Store.GetState().CurrentGraphModel?.Stencil; stackNodeHeaderContainer.Add(new CriteriaSubSection(stencil, model, store)); }
public IterationContext(TranslationContext ctx, IIteratorStackModel queryDeclaration, string groupName, UpdateMode mode) { Stencil = queryDeclaration.GraphModel.Stencil; m_Definitions = queryDeclaration.ComponentQueryDeclarationModel.Components.Select(x => x.Component).ToArray(); m_Ctx = ctx; Query = queryDeclaration; GroupName = groupName; switch (mode) { case UpdateMode.OnStart: GroupName += "Enter"; break; case UpdateMode.OnEnd: GroupName += "Exit"; break; } IndexVariableName = GroupName + "Idx"; UpdateMode = mode; }
public static bool ContainsCoroutine(this IIteratorStackModel stack) { if (stack.NodeModels.Any(n => n is CoroutineNodeModel)) { return(true); } foreach (var outputPort in stack.OutputPorts) { foreach (var connectedStack in outputPort.ConnectionPortModels) { if (connectedStack.NodeModel is IStackModel nextStack && nextStack.NodeModels.Any(n => n is CoroutineNodeModel)) { return(true); } } } return(false); }
public JobContext(IIteratorStackModel query, RootContext parent, UpdateMode mode) : base(parent) { IterationContext = new RoslynEcsTranslator.IterationContext(this, query, parent.MakeUniqueName(query.ComponentQueryDeclarationModel.VariableName), mode); m_JobName = query is OnEventNodeModel onEventNodeModel ? parent.MakeUniqueName($"On_{onEventNodeModel.EventTypeHandle.Name(IterationContext.Stencil)}_Job") : parent.MakeUniqueName($"Update_{IterationContext.GroupName}_Job"); m_ExcludedComponents = new HashSet <TypeHandle>(query.ComponentQueryDeclarationModel.Components.Where(c => c.Component.Subtract) .Select(c => c.Component.TypeHandle)); GetOrDeclareComponentQuery(IterationContext); if ((TranslationOptions & RoslynEcsTranslator.TranslationOptions.Tracing) != 0) { m_RecorderJobFieldName = (IdentifierNameSyntax)GetCachedValue(k_RecorderWriterName, InvocationExpression( MemberAccessExpression( SyntaxKind.SimpleMemberAccessExpression, IdentifierName($"{IterationContext.GroupName}Recorder"), IdentifierName("AsWriter"))), typeof(GraphStream.Writer).GenerateTypeHandle(this.IterationContext.Stencil)); } }
public CriteriaSubSection(Stencil stencil, IIteratorStackModel iteratorStackModel, Store store) : base(SectionTitleText, graphElementModel: null, store: store, parentElement: null, rebuildCallback: null, canAcceptDrop: null) { m_Stencil = stencil; Sortable = true; name = "criteriaSection"; userData = name; AddToClassList("subSection"); GraphElementModel = iteratorStackModel; Add(new Button(() => { AddCriteriaModel(iteratorStackModel); }) { name = "addCriteriaButton", text = "+" }); int nbRows = 0; BuildCriteriaForIteratorStackModel(ref nbRows, iteratorStackModel, ExpandedContainer); ExpandableGraphElementModel = iteratorStackModel; OnExpanded = e => Store.GetState().EditorDataModel?.ExpandElementsUponCreation(new[] { this }, e); viewDataKey = "IteratorStackCriteriaSection"; SectionTitle.text += " (" + nbRows + ")"; RegisterCallback <AttachToPanelEvent>(AttachToPanel); }
internal static bool VariableIsAGeneratedEcsComponent(this IVariableDeclarationModel variableDeclarationModel, out IIteratorStackModel iteratorStackModel) { var isEntity = variableDeclarationModel.DataType.Equals(typeof(Entity).GenerateTypeHandle(variableDeclarationModel.GraphModel.Stencil)); iteratorStackModel = variableDeclarationModel is LoopVariableDeclarationModel loopDecl?loopDecl.GetComponentQueryDeclarationModel() : null; return(!isEntity && iteratorStackModel != null && (((VariableDeclarationModel)variableDeclarationModel).variableFlags & VariableFlags.Generated) != 0); }
public void PushContext(IIteratorStackModel query, UpdateMode mode) { context = context.PushContext(query, this, mode); }
public ForEachContext(IIteratorStackModel query, TranslationContext parent, UpdateMode mode) : base(parent) { IterationContext = new RoslynEcsTranslator.IterationContext(this, query, parent.MakeUniqueName(query.ComponentQueryDeclarationModel.VariableName), mode); GetOrDeclareComponentQuery(IterationContext); }
public void PushContext(IIteratorStackModel query, UpdateMode mode, bool isCoroutine = false) { context = context.PushContext(query, this, mode, isCoroutine); }
public override TranslationContext PushContext(IIteratorStackModel query, RoslynEcsTranslator roslynEcsTranslator, UpdateMode mode) { return(new ForEachContext(query, this, mode)); }
public ForEachLambdaContext(IIteratorStackModel query, TranslationContext parent, UpdateMode mode) : base(query, parent, mode) { }
void BuildCriteriaForIteratorStackModel(ref int nbRows, IIteratorStackModel iteratorStackModel, ExpandedContainer expandedContainer) { nbRows += AddCriteriaModelRows(iteratorStackModel, expandedContainer); }
public abstract string GetComponentVariableName(IIteratorStackModel query, TypeHandle componentVariableType1);
public override string GetComponentVariableName(IIteratorStackModel groupDeclaration, TypeHandle componentVariableType1) { Assert.AreEqual(groupDeclaration, IterationContext.Query); return(IterationContext.GetComponentDataName(componentVariableType1.Resolve(IterationContext.Stencil))); }
public abstract TranslationContext PushContext(IIteratorStackModel query, RoslynEcsTranslator roslynEcsTranslator, UpdateMode mode);
public ForEachLambdaContext(IIteratorStackModel query, TranslationContext parent, UpdateMode mode) : base(query, parent, mode) { m_BodyConditions = new List <ExpressionSyntax>(); }
public static GraphElement CreateIteratorStack(this INodeBuilder builder, Store store, IIteratorStackModel model) { var iteratorStackNode = new IteratorStackNode(store, model, builder); return(iteratorStackNode); }
public abstract TranslationContext PushContext(IIteratorStackModel query, RoslynEcsTranslator roslynEcsTranslator, UpdateMode mode, bool isCoroutine = false);
public override string GetComponentVariableName(IIteratorStackModel query, TypeHandle type) { return(Parent.GetComponentVariableName(query, type)); }
internal static void CreateComponentVariables(Stencil stencil, VariableCreator variableCreator, IIteratorStackModel iteratorStackModel) { var componentQueryDeclarationModel = iteratorStackModel.ComponentQueryDeclarationModel; if (componentQueryDeclarationModel != null) { foreach (QueryComponent component in componentQueryDeclarationModel.Components.Where(def => !def.Component.Subtract)) { variableCreator.DeclareVariable <LoopVariableDeclarationModel>( component.Component.TypeHandle.GetMetadata(stencil).FriendlyName, component.Component.TypeHandle, TitleComponentIcon.Item, VariableFlags.Generated, component.ForceInsert); component.ForceInsert = false; } } }
public override string GetComponentVariableName(IIteratorStackModel groupDeclaration, TypeHandle componentVariableType1) { throw new NotImplementedException(); }