Пример #1
0
 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));
 }
Пример #2
0
        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>());
        }
Пример #3
0
        int AddCriteriaModelRows(IIteratorStackModel iteratorStackModel, ExpandedContainer expandedContainer)
        {
            foreach (var criteriaModel in iteratorStackModel.CriteriaModels)
            {
                AddCriteriaModelRow(criteriaModel, iteratorStackModel, expandedContainer);
            }

            return(iteratorStackModel.CriteriaModels.Count);
        }
Пример #4
0
        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));
        }
Пример #6
0
        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);
        }
Пример #7
0
        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());
        }
Пример #8
0
        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)
            });
        }
Пример #9
0
        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));
        }
Пример #10
0
            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;
            }
Пример #11
0
    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);
    }
Пример #12
0
        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));
            }
        }
Пример #13
0
        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);
        }
Пример #14
0
        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);
        }
Пример #15
0
 public void PushContext(IIteratorStackModel query, UpdateMode mode)
 {
     context = context.PushContext(query, this, mode);
 }
Пример #16
0
 public ForEachContext(IIteratorStackModel query, TranslationContext parent, UpdateMode mode)
     : base(parent)
 {
     IterationContext = new RoslynEcsTranslator.IterationContext(this, query, parent.MakeUniqueName(query.ComponentQueryDeclarationModel.VariableName), mode);
     GetOrDeclareComponentQuery(IterationContext);
 }
Пример #17
0
 public void PushContext(IIteratorStackModel query, UpdateMode mode, bool isCoroutine = false)
 {
     context = context.PushContext(query, this, mode, isCoroutine);
 }
Пример #18
0
 public override TranslationContext PushContext(IIteratorStackModel query, RoslynEcsTranslator roslynEcsTranslator, UpdateMode mode)
 {
     return(new ForEachContext(query, this, mode));
 }
Пример #19
0
 public ForEachLambdaContext(IIteratorStackModel query, TranslationContext parent, UpdateMode mode)
     : base(query, parent, mode)
 {
 }
Пример #20
0
 void BuildCriteriaForIteratorStackModel(ref int nbRows, IIteratorStackModel iteratorStackModel, ExpandedContainer expandedContainer)
 {
     nbRows += AddCriteriaModelRows(iteratorStackModel, expandedContainer);
 }
 public abstract string GetComponentVariableName(IIteratorStackModel query, TypeHandle componentVariableType1);
Пример #22
0
 public override string GetComponentVariableName(IIteratorStackModel groupDeclaration, TypeHandle componentVariableType1)
 {
     Assert.AreEqual(groupDeclaration, IterationContext.Query);
     return(IterationContext.GetComponentDataName(componentVariableType1.Resolve(IterationContext.Stencil)));
 }
Пример #23
0
 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>();
 }
Пример #25
0
        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);
Пример #27
0
 public override string GetComponentVariableName(IIteratorStackModel query, TypeHandle type)
 {
     return(Parent.GetComponentVariableName(query, type));
 }
Пример #28
0
        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();
 }