public void OneGroupIterationSystem_SharedAndRegularComponents([Values(CodeGenMode.NoJobs)] CodeGenMode mode)
        {
            SetupTestGraph(mode, g =>
            {
                var query = GraphModel.CreateComponentQuery("query");

                var positionType = typeof(Translation).GenerateTypeHandle(Stencil);
                query.AddComponent(Stencil, positionType, ComponentDefinitionFlags.None);

                var renderType = typeof(RenderMesh).GenerateTypeHandle(Stencil);
                query.AddComponent(Stencil, renderType, ComponentDefinitionFlags.Shared);

                var queryInstance = GraphModel.CreateVariableNode(query, Vector2.zero);
                var onUpdateModel = GraphModel.CreateNode <OnUpdateEntitiesNodeModel>("update", Vector2.zero);
                GraphModel.CreateEdge(onUpdateModel.InstancePort, queryInstance.OutputPort);

                var posComponent    = GraphModel.CreateVariableNode(onUpdateModel.FunctionParameterModels.Single(p => p.DataType == positionType), Vector2.zero);
                var renderComponent = GraphModel.CreateVariableNode(onUpdateModel.FunctionParameterModels.Single(p => p.DataType == renderType), Vector2.zero);

                var logTranslation = onUpdateModel.CreateFunctionCallNode(typeof(Debug).GetMethod("Log", new[] { typeof(object) }), 0);
                var logRenderMesh  = onUpdateModel.CreateFunctionCallNode(typeof(Debug).GetMethod("Log", new[] { typeof(object) }), 1);

                GraphModel.CreateEdge(logTranslation.GetParameterPorts().First(), posComponent.OutputPort);
                GraphModel.CreateEdge(logRenderMesh.GetParameterPorts().First(), renderComponent.OutputPort);
            },
                           (manager, entityIndex, e) =>
            {
                manager.AddComponentData(e, new Translation {
                    Value = { x = entityIndex }
                });
                manager.AddSharedComponentData(e, new RenderMesh());
            },
                           (manager, entityIndex, e) => Assert.Pass());
        }
        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. 3
0
        public void SendEventTest([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);

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

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

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

                SendEventNodeModel set = onUpdateModel.CreateStackedNode <SendEventNodeModel>("set", 0, SpawnFlags.Default, n => n.EventType = eventTypeHandle);

                TypeHandle entityType    = typeof(Entity).GenerateTypeHandle(Stencil);
                IVariableModel entityVar = GraphModel.CreateVariableNode(onUpdateModel.FunctionParameterModels.Single(p => p.DataType == entityType), Vector2.zero);

                GraphModel.CreateEdge(set.EntityPort, entityVar.OutputPort);
                var firstFieldInput = set.FieldInputs.First();
                ((FloatConstantModel)set.InputConstantsById[firstFieldInput.UniqueId]).value = 2f;
            },

                                         // Add translation to even entities
                                         EachEntity((manager, i, e) =>
            {
                manager.AddComponent(e, typeof(Translation));
                manager.World.CreateSystem <InitializationSystemGroup>();
            }),
                                         (manager, entities) =>
            {
                EventSystem <UnitTestEvent> eventSystem = manager.World.GetExistingSystem <EventSystem <UnitTestEvent> >();
                Assert.That(eventSystem, Is.Not.Null);
                eventSystem.Update();
            },

                                         // OnUpdate should have added a buffer and one event
                                         EachEntity((manager, i, e) =>
            {
                DynamicBuffer <UnitTestEvent> buffer = default;
                Assert.DoesNotThrow(() => buffer     = manager.GetBuffer <UnitTestEvent>(e));
                Assert.That(buffer.IsCreated, Is.True);
                Assert.That(buffer.Length, Is.EqualTo(1));
                Assert.That(buffer[0].i, Is.EqualTo(2f));
            })
                                         );
        }
        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)));
        }
Esempio n. 5
0
 public void AddComponentToQuery([Values] TestingMode mode)
 {
     var query = GraphModel.CreateComponentQuery("query");
     var rotationType = typeof(Rotation).GenerateTypeHandle(Stencil);
     TestPrereqActionPostreq(mode, () =>
     {
         Assert.That(GraphModel.VariableDeclarations.Count, Is.EqualTo(1));
         Assert.That(query.Components.Count(), Is.EqualTo(0));
         return new AddComponentToQueryAction(query, rotationType, ComponentDefinitionFlags.None);
     }, () =>
     {
         Assert.That(query.Components.Count(), Is.EqualTo(1));
         Assert.That(query.Components.Single().Component.TypeHandle, Is.EqualTo(rotationType));
     });
 }
        public void MultipleOnUpdateEntities([Values] CodeGenMode mode)
        {
            SetupTestGraph(mode, graph =>
            {
                var translationType = typeof(Translation).GenerateTypeHandle(Stencil);
                var query           = GraphModel.CreateComponentQuery("g1");
                query.AddComponent(Stencil, translationType, ComponentDefinitionFlags.None);
                var queryInstance = GraphModel.CreateVariableNode(query, Vector2.zero);

                CreateUpdateAndLogEntity(graph, queryInstance);
                CreateUpdateAndLogEntity(graph, queryInstance);
            },
                           (manager, index, entity) => manager.AddComponentData(entity, new Translation()),
                           (manager, index, entity) => Assert.Pass()
                           );
        }
        public void OneGroupIterationSystem_LocalVariable([Values] CodeGenMode mode)
        {
            SetupTestGraph(mode, g =>
            {
                ComponentQueryDeclarationModel query = GraphModel.CreateComponentQuery("g1");
                TypeHandle translationType           = typeof(Translation).GenerateTypeHandle(Stencil);
                query.AddComponent(Stencil, translationType, ComponentDefinitionFlags.None);
                IVariableModel queryInstance = GraphModel.CreateVariableNode(query, Vector2.zero);

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

                var localDeclaration = onUpdateModel.CreateFunctionVariableDeclaration("local", TypeHandle.Float);
                var local            = GraphModel.CreateVariableNode(localDeclaration, Vector2.zero);

                var log = onUpdateModel.CreateFunctionCallNode(typeof(Debug).GetMethod("Log", new[] { typeof(object) }), 0);

                GraphModel.CreateEdge(log.GetParameterPorts().First(), local.OutputPort);
            },
                           (manager, entityIndex, e) => {},
                           (manager, entityIndex, e) => Assert.Pass());
        }
        public void NestedIterationSystem_DifferentGroups_NestedLocalVariable([Values] CodeGenMode mode)
        {
            SetupTestGraphMultipleFrames(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);

                var decl = forAllStack.CreateFunctionVariableDeclaration("x", TypeHandle.Int);
                // set  query1.translation = ...
                SetVariableNodeModel set = forAllStack.CreateStackedNode <SetVariableNodeModel>("set");

                IVariableModel posComponent = GraphModel.CreateVariableNode(decl, Vector2.zero);
                GraphModel.CreateEdge(set.InstancePort, posComponent.OutputPort);
            });
        }
        public void OneGroupIterationSystem_ReadOnly([Values] CodeGenMode mode)
        {
            SetupTestGraph(mode, g =>
            {
                ComponentQueryDeclarationModel query = GraphModel.CreateComponentQuery("g1");
                TypeHandle translationType           = typeof(Translation).GenerateTypeHandle(Stencil);
                TypeHandle rotationType = typeof(Rotation).GenerateTypeHandle(Stencil);
                query.AddComponent(Stencil, translationType, ComponentDefinitionFlags.None);
                query.AddComponent(Stencil, rotationType, ComponentDefinitionFlags.None);
                IVariableModel queryInstance = GraphModel.CreateVariableNode(query, Vector2.zero);

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

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

                var log = onUpdateModel.CreateFunctionCallNode(typeof(Debug).GetMethod("Log", new[] { typeof(object) }), 0);

                IVariableModel posComponent = GraphModel.CreateVariableNode(onUpdateModel.FunctionParameterModels.Single(p => p.DataType == translationType), Vector2.zero);
                GraphModel.CreateEdge(log.GetParameterPorts().First(), posComponent.OutputPort);
            },
                           (manager, entityIndex, e) => manager.AddComponents(e,
                                                                              new ComponentTypes(ComponentType.ReadWrite <Translation>(), ComponentType.ReadWrite <Rotation>())),
                           (manager, entityIndex, e) => Assert.Pass());
        }
Esempio n. 10
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));
                }
            })
                                         );
        }
        public void NestedIteration_DifferentGroups_DifferentEntitiesAccess([Values] CodeGenMode mode)
        {
            SetupTestGraph(mode, graph =>
            {
                var translationType = typeof(Translation).GenerateTypeHandle(Stencil);
                var scaleType       = typeof(Scale).GenerateTypeHandle(Stencil);

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

                // query2 - Scale
                var query2 = GraphModel.CreateComponentQuery("g2");
                query2.AddComponent(Stencil, scaleType, ComponentDefinitionFlags.None);
                var query2Instance = GraphModel.CreateVariableNode(query2, Vector2.zero);

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

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

                // entity from query 1
                var entity1 = graph.CreateVariableNode(
                    update.FunctionParameterModels.Single(
                        p => p.DataType == typeof(Entity).GenerateTypeHandle(graph.Stencil)),
                    Vector2.zero);

                // entity from query 2
                var entity2 = graph.CreateVariableNode(
                    forAllStack.FunctionParameterModels.Single(
                        p => p.DataType == typeof(Entity).GenerateTypeHandle(graph.Stencil)),
                    Vector2.zero);

                // set a new Translation to entities of query1
                var setTranslation           = forAllStack.CreateStackedNode <SetComponentNodeModel>("set translation");
                setTranslation.ComponentType = typeof(Translation).GenerateTypeHandle(graph.Stencil);
                setTranslation.DefineNode();
                ((FloatConstantModel)setTranslation.InputConstantsById["z"]).value = 10f;
                graph.CreateEdge(setTranslation.EntityPort, entity1.OutputPort);

                // set a new Scale to entities of query2
                var setScale           = forAllStack.CreateStackedNode <SetComponentNodeModel>("set scale");
                setScale.ComponentType = typeof(Scale).GenerateTypeHandle(graph.Stencil);
                setScale.DefineNode();
                ((FloatConstantModel)setScale.InputConstantsById["Value"]).value = 30f;
                graph.CreateEdge(setScale.EntityPort, entity2.OutputPort);
            },
                           (manager, index, entity) =>
            {
                if (index % 2 == 0)
                {
                    manager.AddComponentData(entity, new Translation());
                }
                else
                {
                    manager.AddComponentData(entity, new Scale());
                }
            },
                           (manager, index, entity) =>
            {
                if (manager.HasComponent <Translation>(entity))
                {
                    Assert.That(manager.GetComponentData <Translation>(entity).Value.z, Is.EqualTo(10f));
                }

                if (manager.HasComponent <Scale>(entity))
                {
                    Assert.That(manager.GetComponentData <Scale>(entity).Value, Is.EqualTo(30f));
                }
            }
                           );
        }