Example #1
0
        public void SendEventNestedTest([Values] CodeGenMode mode)
        {
            SetupTestGraphMultipleFrames(mode, graphModel =>
            {
                // group1 - Position
                var group1 = graphModel.CreateComponentQuery("g1");
                group1.AddComponent(graphModel.Stencil, typeof(Translation).GenerateTypeHandle(Stencil), ComponentDefinitionFlags.None);
                var group1Instance = graphModel.CreateVariableNode(group1, Vector2.zero);

                // group2 - Scale (will add RenderMesh)
                var group2 = graphModel.CreateComponentQuery("g2");
                group2.AddComponent(graphModel.Stencil, typeof(Scale).GenerateTypeHandle(Stencil), ComponentDefinitionFlags.None);
                var group2Instance = graphModel.CreateVariableNode(group2, Vector2.zero);

                // update group 1
                var onUpdateEntities = graphModel.CreateNode <OnUpdateEntitiesNodeModel>("update", Vector2.zero);
                graphModel.CreateEdge(onUpdateEntities.InstancePort, group1Instance.OutputPort);

                // nested update group 2
                var forAllStack = GraphModel.CreateLoopStack <ForAllEntitiesStackModel>(Vector2.zero);
                var forAllNode  = forAllStack.CreateLoopNode(onUpdateEntities, 0) as ForAllEntitiesNodeModel;
                graphModel.CreateEdge(forAllNode.InputPort, group2Instance.OutputPort);
                graphModel.CreateEdge(forAllStack.InputPort, forAllNode.OutputPort);

                TypeHandle eventTypeHandle = typeof(UnitTestEvent).GenerateTypeHandle(Stencil);
                SendEventNodeModel set     = forAllStack.CreateStackedNode <SendEventNodeModel>("set", 0, SpawnFlags.Default, n => n.EventType = eventTypeHandle);

                TypeHandle entityType    = typeof(Entity).GenerateTypeHandle(Stencil);
                IVariableModel entityVar = GraphModel.CreateVariableNode(forAllStack.FunctionParameterModels.Single(p => p.DataType == entityType), Vector2.zero);
                var firstFieldInput      = set.EntityPort;
                GraphModel.CreateEdge(firstFieldInput, entityVar.OutputPort);
            }
                                         );
        }
Example #2
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));
            })
                                         );
        }