public void OneGroupIterationSystem([Values] CodeGenMode mode)
        {
            SetupTestGraph(mode, g =>
            {
                ComponentQueryDeclarationModel query = GraphModel.CreateComponentQuery("g1");
                TypeHandle positionType = typeof(Translation).GenerateTypeHandle(Stencil);
                query.AddComponent(Stencil, positionType, ComponentDefinitionFlags.None);
                IVariableModel queryInstance = GraphModel.CreateVariableNode(query, Vector2.zero);

                OnUpdateEntitiesNodeModel onUpdateModel = GraphModel.CreateNode <OnUpdateEntitiesNodeModel>("update", Vector2.zero);

                GraphModel.CreateEdge(onUpdateModel.InstancePort, queryInstance.OutputPort);

                SetPropertyGroupNodeModel set = onUpdateModel.CreateStackedNode <SetPropertyGroupNodeModel>("set");
                var member = new TypeMember(TypeHandle.Float, new List <string> {
                    nameof(Translation.Value), nameof(Translation.Value.x)
                });
                set.AddMember(member);

                IVariableModel posComponent = GraphModel.CreateVariableNode(onUpdateModel.FunctionParameterModels.Single(p => p.DataType == positionType), Vector2.zero);
                GraphModel.CreateEdge(set.InstancePort, posComponent.OutputPort);

                ((FloatConstantModel)set.InputConstantsById[member.GetId()]).value = 2f;
            },
                           (manager, entityIndex, e) => manager.AddComponentData(e, new Translation {
                Value = { x = entityIndex }
            }),
                           (manager, entityIndex, e) => Assert.That(manager.GetComponentData <Translation>(e).Value.x, Is.EqualTo(2f)));
        }
Esempio n. 2
0
        public void Test_RemoveSetPropertyMemberKeepsEdges([Values] TestingMode mode)
        {
            // test that removing a SetProperty member doesn't break the edge with it's Instance
            // i.e. here: check that removing Position keeps the link with Transform

            //               |_TestFunction_____|
            // (Transform)---+-o Set Property   |
            //               | o   Position     |

            VariableDeclarationModel trDecl = GraphModel.CreateGraphVariableDeclaration("tr", typeof(Transform).GenerateTypeHandle(Stencil), true);
            IVariableModel           trVar  = GraphModel.CreateVariableNode(trDecl, Vector2.left);

            FunctionModel method = GraphModel.CreateFunction("TestFunction", Vector2.zero);

            SetPropertyGroupNodeModel setters = method.CreateSetPropertyGroupNode(0);

            GraphModel.CreateEdge(setters.InstancePort, trVar.OutputPort);

            PropertyInfo propertyToAdd = typeof(Transform).GetProperty("position");

            var newMember = new TypeMember
            {
                Path = new List <string> {
                    propertyToAdd?.Name
                },
                Type = propertyToAdd.GetUnderlyingType().GenerateTypeHandle(Stencil)
            };

            setters.AddMember(newMember);

            TestPrereqActionPostreq(mode,
                                    () =>
            {
                RefreshReference(ref method);
                RefreshReference(ref setters);
                Assert.That(GetNodeCount(), Is.EqualTo(2));
                Assert.That(GetEdgeCount(), Is.EqualTo(1));
                Assert.That(method.NodeModels.Count(), Is.EqualTo(1));
                Assert.That(setters.InputsByDisplayOrder.Count, Is.EqualTo(2));
                Assert.That(setters.Members.Count, Is.EqualTo(1));
                return(new EditPropertyGroupNodeAction(
                           EditPropertyGroupNodeAction.EditType.Remove, setters, newMember));
            },
                                    () =>
            {
                RefreshReference(ref method);
                RefreshReference(ref setters);
                Assert.That(GetNodeCount(), Is.EqualTo(2));
                Assert.That(GetEdgeCount(), Is.EqualTo(1));
                Assert.That(method.NodeModels.Count(), Is.EqualTo(1));
                Assert.That(GetStackedNode(0, 0), Is.TypeOf <SetPropertyGroupNodeModel>());
                Assert.That(setters.InputsByDisplayOrder.Count, Is.EqualTo(1));
                Assert.That(setters.Members.Count, Is.EqualTo(0));
            });
        }
Esempio n. 3
0
        public GraphElementSearcherDatabase AddFields(IEnumerable <FieldInfo> fields)
        {
            foreach (FieldInfo field in fields
                     .Where(f => f.GetCustomAttribute <ObsoleteAttribute>() == null &&
                            f.GetCustomAttribute <HiddenAttribute>() == null)
                     .OrderBy(f => f.Name))
            {
                var parent = SearcherItemUtility.GetItemFromPath(Items, field.ReflectedType.FriendlyName(false));

                if (field.IsConstantOrStatic())
                {
                    parent.AddChild(new GraphNodeModelSearcherItem(
                                        new FieldSearcherItemData(field),
                                        data => data.CreateSystemConstantNode(field.DeclaringType, field.FieldType, field.Name),
                                        field.Name
                                        ));
                    continue;
                }

                parent.AddChild(new GraphNodeModelSearcherItem(
                                    new FieldSearcherItemData(field),
                                    data =>
                {
                    var getPropertyGroupModel = data.CreateGetPropertyGroupNode();
                    Undo.RegisterCompleteObjectUndo(getPropertyGroupModel.SerializableAsset, "Add Member");
                    getPropertyGroupModel.AddMember(field.GetUnderlyingType(), field.Name);
                    EditorUtility.SetDirty(getPropertyGroupModel.SerializableAsset);
                    return(getPropertyGroupModel);
                },
                                    field.Name
                                    ));

                if (field.CanWrite())
                {
                    parent.AddChild(new StackNodeModelSearcherItem(
                                        new FieldSearcherItemData(field),
                                        data =>
                    {
                        SetPropertyGroupNodeModel nodeModel = data.CreateSetPropertyGroupNode();
                        Undo.RegisterCompleteObjectUndo(nodeModel.SerializableAsset, "Add Member");
                        nodeModel.AddMember(field.GetUnderlyingType(), field.Name);
                        EditorUtility.SetDirty(nodeModel.SerializableAsset);
                        return(nodeModel);
                    },
                                        field.Name
                                        ));
                }
            }

            return(this);
        }
        public void NestedIterationSystem_DifferentGroups_DifferentComponents([Values] CodeGenMode mode)
        {
            SetupTestGraph(mode, g =>
            {
                TypeHandle translationType = typeof(Translation).GenerateTypeHandle(Stencil);
                TypeHandle rotationType    = typeof(Rotation).GenerateTypeHandle(Stencil);

                // query1 - Position
                ComponentQueryDeclarationModel query1 = GraphModel.CreateComponentQuery("g1");
                query1.AddComponent(Stencil, translationType, ComponentDefinitionFlags.None);
                IVariableModel query1Instance = GraphModel.CreateVariableNode(query1, Vector2.zero);

                // query2 - Rotation too
                ComponentQueryDeclarationModel query2 = GraphModel.CreateComponentQuery("g2");
                query2.AddComponent(Stencil, rotationType, ComponentDefinitionFlags.None);
                IVariableModel query2Instance = GraphModel.CreateVariableNode(query2, Vector2.zero);

                // update query 1
                OnUpdateEntitiesNodeModel onUpdateModel = GraphModel.CreateNode <OnUpdateEntitiesNodeModel>("update", Vector2.zero);
                GraphModel.CreateEdge(onUpdateModel.InstancePort, query1Instance.OutputPort);

                // nested update query 2
                var forAllStack = GraphModel.CreateLoopStack <ForAllEntitiesStackModel>(Vector2.zero);
                var forAllNode  = forAllStack.CreateLoopNode(onUpdateModel, 0) as ForAllEntitiesNodeModel;
                Assert.That(forAllNode, Is.Not.Null);
                GraphModel.CreateEdge(forAllNode.InputPort, query2Instance.OutputPort);
                GraphModel.CreateEdge(forAllStack.InputPort, forAllNode.OutputPort);

                // set  query1.translation = ...
                SetPropertyGroupNodeModel set = forAllStack.CreateStackedNode <SetPropertyGroupNodeModel>("set");
                var member = new TypeMember(TypeHandle.Float, new List <string> {
                    nameof(Translation.Value), nameof(Translation.Value.x)
                });
                set.AddMember(member);

                IVariableModel posComponent = GraphModel.CreateVariableNode(onUpdateModel.FunctionParameterModels.Single(p => p.DataType == translationType), Vector2.zero);
                GraphModel.CreateEdge(set.InstancePort, posComponent.OutputPort);

                ((FloatConstantModel)set.InputConstantsById[member.GetId()]).value = 2f;
            },
                           (manager, entityIndex, e) =>
            {
                manager.AddComponentData(e, new Translation {
                    Value = { x = entityIndex }
                });
                manager.AddComponentData(e, new Rotation());
            },
                           (manager, entityIndex, e) => Assert.That(manager.GetComponentData <Translation>(e).Value.x, Is.EqualTo(2f)));
        }
        public GraphElementSearcherDatabase AddFields(Type type, BindingFlags bindingFlags)
        {
            SearcherItem parent = null;

            foreach (FieldInfo fieldInfo in type.GetFields(bindingFlags)
                     .OrderBy(f => f.Name)
                     .Where(f => f.GetCustomAttribute <ObsoleteAttribute>() == null &&
                            f.GetCustomAttribute <HiddenAttribute>() == null))
            {
                if (parent == null)
                {
                    parent = SearcherItemUtility.GetItemFromPath(Items, type.FriendlyName(false));
                }

                parent.AddChild(new GraphNodeModelSearcherItem(
                                    new FieldSearcherItemData(fieldInfo),
                                    data =>
                {
                    var getPropertyGroupModel = data.CreateGetPropertyGroupNode();
                    Undo.RegisterCompleteObjectUndo(getPropertyGroupModel.SerializableAsset, "Add Member");
                    getPropertyGroupModel.AddMember(fieldInfo.GetUnderlyingType(), fieldInfo.Name);
                    EditorUtility.SetDirty(getPropertyGroupModel.SerializableAsset);
                    return(getPropertyGroupModel);
                },
                                    fieldInfo.Name
                                    ));

                if (fieldInfo.CanWrite())
                {
                    parent.AddChild(new StackNodeModelSearcherItem(
                                        new FieldSearcherItemData(fieldInfo),
                                        data =>
                    {
                        SetPropertyGroupNodeModel nodeModel = data.CreateSetPropertyGroupNode();
                        Undo.RegisterCompleteObjectUndo(nodeModel.SerializableAsset, "Add Member");
                        nodeModel.AddMember(fieldInfo.GetUnderlyingType(), fieldInfo.Name);
                        EditorUtility.SetDirty(nodeModel.SerializableAsset);
                        return(nodeModel);
                    },
                                        fieldInfo.Name
                                        ));
                }
            }

            return(this);
        }
Esempio n. 6
0
        public void Test_DisconnectSetPropertyKeepsPortType([Values] TestingMode mode)
        {
            VariableDeclarationModel trDecl = GraphModel.CreateGraphVariableDeclaration("tr", typeof(Transform).GenerateTypeHandle(Stencil), true);
            IVariableModel           trVar  = GraphModel.CreateVariableNode(trDecl, Vector2.left);

            FunctionModel method = GraphModel.CreateFunction("TestFunction", Vector2.zero);

            SetPropertyGroupNodeModel setters = method.CreateSetPropertyGroupNode(0);

            GraphModel.CreateEdge(setters.InstancePort, trVar.OutputPort);

            setters.AddMember(
                new TypeMember
            {
                Path = new List <string> {
                    "position"
                },
                Type = Stencil.GenerateTypeHandle(typeof(Vector3))
            }
                );

            IConstantNodeModel constToken = GraphModel.CreateConstantNode("v3", typeof(Vector3).GenerateTypeHandle(Stencil), Vector2.left * 200);
            IEdgeModel         edge       = GraphModel.CreateEdge(setters.GetPortsForMembers().First(), constToken.OutputPort);

            TestPrereqActionPostreq(mode,
                                    () =>
            {
                Assert.That(GetNodeCount(), Is.EqualTo(3));
                Assert.That(GetEdgeCount(), Is.EqualTo(2));
                Assert.That(method.NodeModels.Count(), Is.EqualTo(1));
                Assert.That(setters.GetPortsForMembers().First().DataType.Resolve(Stencil), Is.EqualTo(typeof(Vector3)));
                return(new DeleteElementsAction(edge));
            },
                                    () =>
            {
                Assert.That(GetNodeCount(), Is.EqualTo(3));
                Assert.That(GetEdgeCount(), Is.EqualTo(1));
                Assert.That(method.NodeModels.Count(), Is.EqualTo(1));
                Assert.That(GetStackedNode(0, 0), Is.TypeOf <SetPropertyGroupNodeModel>());
                Assert.That(setters.GetPortsForMembers().First().DataType.Resolve(Stencil), Is.EqualTo(typeof(Vector3)));
            });
        }
Esempio n. 7
0
        public void Test_DisconnectSetPropertyInstanceSetsRightPortType(TestingMode mode, int inputIndex, Type expectedPortType)
        {
            VariableDeclarationModel goDecl = GraphModel.CreateGraphVariableDeclaration("go", typeof(GameObject).GenerateTypeHandle(Stencil), true);
            IVariableModel           goVar  = GraphModel.CreateVariableNode(goDecl, Vector2.left);

            FunctionModel method = GraphModel.CreateFunction("TestFunction", Vector2.zero);

            SetPropertyGroupNodeModel setters = method.CreateSetPropertyGroupNode(0);
            IEdgeModel edge = GraphModel.CreateEdge(setters.InstancePort, goVar.OutputPort);

            PropertyInfo propertyInfo = typeof(Transform).GetProperty("position");

            var newMember = new TypeMember
            {
                Path = new List <string> {
                    propertyInfo?.Name
                },
                Type = typeof(Transform).GenerateTypeHandle(Stencil)
            };

            setters.AddMember(newMember);

            TestPrereqActionPostreq(mode,
                                    () =>
            {
                Assert.That(GetNodeCount(), Is.EqualTo(2));
                Assert.That(GetEdgeCount(), Is.EqualTo(1));
                Assert.That(method.NodeModels.Count(), Is.EqualTo(1));
                Assert.That(setters.GetPortsForMembers().First().DataType, Is.EqualTo(typeof(Transform).GenerateTypeHandle(Stencil)));
                return(new DeleteElementsAction(edge));
            },
                                    () =>
            {
                Assert.That(GetNodeCount(), Is.EqualTo(2));
                Assert.That(GetEdgeCount(), Is.EqualTo(0));
                Assert.That(method.NodeModels.Count(), Is.EqualTo(1));
                Assert.That(GetStackedNode(0, 0), Is.TypeOf <SetPropertyGroupNodeModel>());
                Assert.That(setters.InstancePort.DataType, Is.EqualTo(TypeHandle.Unknown));
                Assert.That(setters.GetPortsForMembers().First().DataType, Is.EqualTo(typeof(Transform).GenerateTypeHandle(Stencil)));
            });
        }
        public static IEnumerable <SyntaxNode> BuildSetPropertyNode(this RoslynTranslator translator, SetPropertyGroupNodeModel model, IPortModel portModel)
        {
            SyntaxNode leftHand;

            IPortModel instancePort = model.InstancePort;

            if (!instancePort.Connected)
            {
                leftHand = SyntaxFactory.ThisExpression();
            }
            else
            {
                leftHand = translator.BuildPort(instancePort).SingleOrDefault();
            }

            foreach (var member in model.Members)
            {
                string     memberId  = member.GetId();
                IPortModel inputPort = model.InputsById[memberId];

                SyntaxNode rightHandExpression = translator.BuildPort(inputPort).SingleOrDefault();
                if (rightHandExpression == null)
                {
                    continue;
                }

                MemberAccessExpressionSyntax access = RoslynBuilder.MemberReference(leftHand, member.Path[0]);
                for (int i = 1; i < member.Path.Count; i++)
                {
                    access = RoslynBuilder.MemberReference(access, member.Path[i]);
                }

                yield return(SyntaxFactory.AssignmentExpression(SyntaxKind.SimpleAssignmentExpression, access, rightHandExpression as ExpressionSyntax));
            }
        }
Esempio n. 9
0
        public void OnEventTest([Values] CodeGenMode mode)
        {
            SetupTestGraphMultipleFrames(mode, g =>
            {
                ComponentQueryDeclarationModel query = GraphModel.CreateComponentQuery("g1");
                TypeHandle positionType = typeof(Translation).GenerateTypeHandle(Stencil);
                query.AddComponent(Stencil, positionType, ComponentDefinitionFlags.None);
                IVariableModel queryInstance = GraphModel.CreateVariableNode(query, Vector2.zero);

                TypeHandle eventTypeHandle = typeof(UnitTestEvent).GenerateTypeHandle(Stencil);

                OnEventNodeModel onUpdateModel = GraphModel.CreateNode <OnEventNodeModel>("update", Vector2.zero, SpawnFlags.Default, n => n.EventTypeHandle = eventTypeHandle);

                GraphModel.CreateEdge(onUpdateModel.InstancePort, queryInstance.OutputPort);

                SetPropertyGroupNodeModel set = onUpdateModel.CreateStackedNode <SetPropertyGroupNodeModel>("set", 0);
                var member = new TypeMember(TypeHandle.Float, new List <string> {
                    nameof(Translation.Value), nameof(Translation.Value.x)
                });
                set.AddMember(member);

                IVariableModel posComponent = GraphModel.CreateVariableNode(onUpdateModel.FunctionParameterModels.Single(p => p.DataType == positionType), Vector2.zero);
                GraphModel.CreateEdge(set.InstancePort, posComponent.OutputPort);

                ((FloatConstantModel)set.InputConstantsById[member.GetId()]).value = 2f;
            },

                                         // Add translation to even entities
                                         EachEntity((manager, i, e) =>
            {
                if (e.Index % 2 == 0)
                {
                    manager.AddComponent(e, typeof(Translation));
                }
            }),

                                         // Send event on these
                                         EachEntity(del: (manager, i, e) =>
            {
                if (e.Index % 2 == 0)
                {
                    Assert.That(manager.GetComponentData <Translation>(e).Value.x, Is.EqualTo(0f));
                }
                else
                {
                    Assert.IsFalse(manager.HasComponent <Translation>(e));
                }

                // Add event on all entities
                manager.AddBuffer <UnitTestEvent>(e).Add(new UnitTestEvent());
            }),

                                         // Event handler should set t.x to 2
                                         EachEntity((manager, i, e) =>
            {
                if (e.Index % 2 == 0)
                {
                    Assert.That(manager.GetComponentData <Translation>(e).Value.x, Is.EqualTo(2f));
                }
            }),

                                         // Reset translation
                                         EachEntity((manager, i, e) =>
            {
                if (e.Index % 2 == 0)
                {
                    var t     = manager.GetComponentData <Translation>(e);
                    t.Value.x = 0;
                    manager.SetComponentData(e, t);
                }
            }),

                                         // As we send events manually, the event system is not running and won't cleanup events.
                                         // Event handler should set t.x to 2 again
                                         EachEntity((manager, i, e) =>
            {
                if (e.Index % 2 == 0)
                {
                    Assert.That(manager.GetComponentData <Translation>(e).Value.x, Is.EqualTo(2f));
                }
            })
                                         );
        }