コード例 #1
0
        public void Setup()
        {
            _defaultWorld                      = new DefaultWorld(EntityCount);
            _defaultEntitySet                  = _defaultWorld.GetEntities().With <DefaultComponent>().AsSet();
            _defaultRunner                     = new DefaultParallelRunner(Environment.ProcessorCount);
            _defaultSystem                     = new DefaultEcsSystem(_defaultWorld);
            _defaultMultiSystem                = new DefaultEcsSystem(_defaultWorld, _defaultRunner);
            _defaultEntityComponentSystem      = new DefaultEcsEntityComponentSystem(_defaultWorld);
            _defaultMultiEntityComponentSystem = new DefaultEcsEntityComponentSystem(_defaultWorld, _defaultRunner);
            _defaultComponentSystem            = new DefaultEcsComponentSystem(_defaultWorld);
            _defaultComponentMultiSystem       = new DefaultEcsComponentSystem(_defaultWorld, _defaultRunner);

            _entitasWorld       = new Context <EntitasEntity>(1, () => new EntitasEntity());
            _entitasSystem      = new EntitasSystem(_entitasWorld);
            _entitasMultiSystem = new EntitasSystem(_entitasWorld, Environment.ProcessorCount);

            for (int i = 0; i < EntityCount; ++i)
            {
                DefaultEntity defaultEntity = _defaultWorld.CreateEntity();
                defaultEntity.Set <DefaultComponent>();

                EntitasEntity entitasEntity = _entitasWorld.CreateEntity();
                entitasEntity.AddComponent(0, new EntitasComponent());
            }
        }
コード例 #2
0
        public void Update_with_runner_Should_call_update()
        {
            using DefaultParallelRunner runner = new DefaultParallelRunner(2);
            using World world = new World(3);

            Entity entity1 = world.CreateEntity();

            entity1.Set <bool>();

            Entity entity2 = world.CreateEntity();

            entity2.Set <bool>();

            Entity entity3 = world.CreateEntity();

            entity3.Set <bool>();

            using (ISystem <int> system = new System(world, runner))
            {
                system.Update(0);
            }

            Check.That(entity1.Get <bool>()).IsTrue();
            Check.That(entity2.Get <bool>()).IsTrue();
            Check.That(entity3.Get <bool>()).IsTrue();
        }
コード例 #3
0
        public void Optimize_Should_throw_When_action_is_null()
        {
            using World world = new World();
            using DefaultParallelRunner runner = new DefaultParallelRunner(Environment.ProcessorCount);

            Check.ThatCode(() => world.Optimize(runner, null)).Throws <ArgumentNullException>();
        }
コード例 #4
0
        private void InitializeSystems(World world, out ISystem <float> systems)
        {
            var _runner = new DefaultParallelRunner(Environment.ProcessorCount);

            systems = new SequentialSystem <float>(
                new CounterSystem(world),
                new TimerSystem(world),
                new GenerationSystem(world, _cellPool, _gameState),
                new SelectSystem(world, _game.Window, _gameState),
                new SwapSystem(world),
                new CancelSwapSystem(world),
                new SwapFinishedSystem(world),
                new FindMatchesSystem(world, _gameState),
                new CombinationSystem(world, _gameState),
                new DestroyersSystem(world, _gameState),
                new LineBonusSystem(world),
                new BombSystem(world),
                new FallSystem(world, _gameState),
                new TargetPositionSystem(world),
                new WaitFallingSystem(world, _gameState),
                new RotationSystem(world),
                new TransformSystem(world, _runner),
                new FrameAnimationUpdateSystem(world),
                new SpriteRenderSystem(_batch, _backgroundLayer),
                new FrameAnimationDrawSystem(_batch, world),
                new SpriteRenderSystem(_batch, _cellsLayer),
                new SpriteRenderSystem(_batch, _destroyersLayer),
                new SpriteRenderSystem(_batch, _borderLayer),
                new TextRenderSystem(_batch, world),
                new DestroyersDyingSystem(world),
                new DyingSystem(world, _gameState),
                new DelayedDyingSystem(world)
                );
        }
コード例 #5
0
        public DefaultGame()
        {
            _deviceManager  = new GraphicsDeviceManager(this);
            IsFixedTimeStep = false;
            _deviceManager.GraphicsProfile                = GraphicsProfile.HiDef;
            _deviceManager.IsFullScreen                   = true;
            _deviceManager.PreferredBackBufferWidth       = ResolutionWidth;
            _deviceManager.PreferredBackBufferHeight      = ResolutionHeight;
            _deviceManager.SynchronizeWithVerticalRetrace = false;
            _deviceManager.ApplyChanges();
            GraphicsDevice.RasterizerState = RasterizerState.CullCounterClockwise;
            GraphicsDevice.BlendState      = BlendState.AlphaBlend;
            Content.RootDirectory          = "Content";

            _batch = new SpriteBatch(GraphicsDevice);
            using (Stream stream = File.OpenRead(@"Content\square.png"))
            {
                _square = Texture2D.FromStream(GraphicsDevice, stream);
            }
            _font = Content.Load <SpriteFont>("font");

            _world = new World();
            Grid grid = new Grid();

            _runner = new DefaultParallelRunner(Environment.ProcessorCount);
            _system = new SequentialSystem <float>(
                new BoidsSystem(_world, _runner, grid),
                new MoveSystem(_world, _runner, grid));

            _drawSystem = new DrawSystem(_batch, _square, _world, _runner);

            Random random = new Random();

            for (int i = 0; i < BoidsCount; ++i)
            {
                Entity entity = _world.CreateEntity();
                entity.Set(new DrawInfo
                {
                    Color    = new Color((float)random.NextDouble(), (float)random.NextDouble(), (float)random.NextDouble(), 1f),
                    Position = new Vector2((float)random.NextDouble() * _deviceManager.PreferredBackBufferWidth, (float)random.NextDouble() * _deviceManager.PreferredBackBufferHeight),
                    Size     = new Vector2(random.Next(3, 6), random.Next(10, 15)),
                });

                Vector2 velocity = new Vector2((float)random.NextDouble() - .5f, (float)random.NextDouble() - .5f);
                if (velocity != Vector2.Zero)
                {
                    velocity.Normalize();
                }

                entity.Set(new Velocity {
                    Value = velocity * (MinVelocity + ((float)random.NextDouble() * (MaxVelocity - MinVelocity)))
                });
                entity.Set <Acceleration>();
                entity.Set(grid);
            }

            _watch = Stopwatch.StartNew();
        }
コード例 #6
0
        private void InitializeSystems(World world, out ISystem <float> systems)
        {
            var _runner = new DefaultParallelRunner(Environment.ProcessorCount);

            systems = new SequentialSystem <float>(
                new SpriteRenderSystem(_batch, world.GetEntities().With <SpriteRenderer>().AsSet()),
                new TransformSystem(world, _runner),
                new ButtonSystem(world, _game.Window)
                );
        }
コード例 #7
0
        public void Setup()
        {
            _defaultWorld                      = new DefaultWorld(EntityCount);
            _defaultEntitySet                  = _defaultWorld.GetEntities().With <DefaultComponent>().AsSet();
            _defaultRunner                     = new DefaultParallelRunner(Environment.ProcessorCount);
            _defaultSystem                     = new DefaultEcsSystem(_defaultWorld);
            _defaultMultiSystem                = new DefaultEcsSystem(_defaultWorld, _defaultRunner);
            _defaultEntityComponentSystem      = new DefaultEcsEntityComponentSystem(_defaultWorld);
            _defaultMultiEntityComponentSystem = new DefaultEcsEntityComponentSystem(_defaultWorld, _defaultRunner);
            _defaultComponentSystem            = new DefaultEcsComponentSystem(_defaultWorld);
            _defaultComponentMultiSystem       = new DefaultEcsComponentSystem(_defaultWorld, _defaultRunner);
            _defaultGeneratorSystem            = new DefaultEcsGeneratorSystem(_defaultWorld);
            _defaultGeneratorMultiSystem       = new DefaultEcsGeneratorSystem(_defaultWorld, _defaultRunner);

            _entitasWorld       = new Context <EntitasEntity>(1, () => new EntitasEntity());
            _entitasSystem      = new EntitasSystem(_entitasWorld);
            _entitasMultiSystem = new EntitasSystem(_entitasWorld, Environment.ProcessorCount);

            _monoWorld = new WorldBuilder().AddSystem(new MonoSystem()).Build();
            _time      = new GameTime();

            _leoWorld   = new LeoWorld();
            _leoSystem  = new LeoSystem();
            _leoSystems = new LeoSystems(_leoWorld).Add(_leoSystem);
            _leoSystems.ProcessInjects().Init();

            SimpleEntitiesSubmissionScheduler sveltoScheduler = new SimpleEntitiesSubmissionScheduler();

            _sveltoWorld  = new EnginesRoot(sveltoScheduler);
            _sveltoSystem = new SveltoSystem();
            _sveltoWorld.AddEngine(_sveltoSystem);
            IEntityFactory sveltoFactory = _sveltoWorld.GenerateEntityFactory();

            for (int i = 0; i < EntityCount; ++i)
            {
                DefaultEntity defaultEntity = _defaultWorld.CreateEntity();
                defaultEntity.Set <DefaultComponent>();

                EntitasEntity entitasEntity = _entitasWorld.CreateEntity();
                entitasEntity.AddComponent(0, new EntitasComponent());

                MonoEntity monoEntity = _monoWorld.CreateEntity();
                monoEntity.Attach(new MonoComponent());

                LeoEntity leoEntity = _leoWorld.NewEntity();
                leoEntity.Get <LeoComponent>();

                sveltoFactory.BuildEntity <SveltoEntity>((uint)i, _sveltoGroup);
            }

            sveltoScheduler.SubmitEntities();
        }
コード例 #8
0
        public void Setup()
        {
            _defaultWorld                      = new World(EntityCount);
            _defaultEntitySet                  = _defaultWorld.GetEntities().With <DefaultComponent>().AsSet();
            _defaultRunner                     = new DefaultParallelRunner(Environment.ProcessorCount);
            _defaultSystem                     = new DefaultEcsSystem(_defaultWorld);
            _defaultMultiSystem                = new DefaultEcsSystem(_defaultWorld, _defaultRunner);
            _defaultEntityComponentSystem      = new DefaultEcsEntityComponentSystem(_defaultWorld);
            _defaultMultiEntityComponentSystem = new DefaultEcsEntityComponentSystem(_defaultWorld, _defaultRunner);
            _defaultComponentSystem            = new DefaultEcsComponentSystem(_defaultWorld);
            _defaultComponentMultiSystem       = new DefaultEcsComponentSystem(_defaultWorld, _defaultRunner);
            _defaultGeneratorSystem            = new DefaultEcsGeneratorSystem(_defaultWorld);
            _defaultGeneratorMultiSystem       = new DefaultEcsGeneratorSystem(_defaultWorld, _defaultRunner);

            for (int i = 0; i < EntityCount; ++i)
            {
                Entity defaultEntity = _defaultWorld.CreateEntity();
                defaultEntity.Set <DefaultComponent>();
            }
        }
コード例 #9
0
        public DefaultGame()
        {
            _deviceManager  = new GraphicsDeviceManager(this);
            IsFixedTimeStep = true;
            _deviceManager.GraphicsProfile           = GraphicsProfile.HiDef;
            _deviceManager.IsFullScreen              = false;
            _deviceManager.PreferredBackBufferWidth  = 800;
            _deviceManager.PreferredBackBufferHeight = 600;
            _deviceManager.ApplyChanges();
            GraphicsDevice.RasterizerState = RasterizerState.CullCounterClockwise;
            GraphicsDevice.BlendState      = BlendState.AlphaBlend;
            Content.RootDirectory          = "Content";

            _batch = new SpriteBatch(GraphicsDevice);
            using (Stream stream = File.OpenRead(@"Content\square.png"))
            {
                _square = Texture2D.FromStream(GraphicsDevice, stream);
            }
            _breakSound  = Content.Load <SoundEffect>("Slap");
            _bounceSound = Content.Load <SoundEffect>("Jump");

            _world = new World(1000);

            _runner = new DefaultParallelRunner(Environment.ProcessorCount);
            _system = new SequentialSystem <float>(
                new GameSystem(_world),
                new PlayerSystem(_world, Window),
                new BallToBarSystem(_world, Window),
                new VelocitySystem(_world, _runner),
                new CollisionSystem(_world),
                new BallBoundSystem(_world),
                new PositionSystem(_world, _runner),
                new DrawSystem(_batch, _square, _world));

            _world.Subscribe <BrickBrokenMessage>(On);
            _world.Subscribe <BarBounceMessage>(On);

            Level1.CreatePlayer(_world);
        }
コード例 #10
0
        public void Optimize_Should_return_When_mainAction_is_done()
        {
            using World world   = new World();
            using EntitySet set = world.GetEntities().With <int>().AsSet();
            using DefaultParallelRunner runner = new DefaultParallelRunner(Environment.ProcessorCount);

            List <Entity> entities = Enumerable.Repeat(world, 100000).Select(w => w.CreateEntity()).ToList();

            int value = entities.Count;

            foreach (Entity entity in entities.AsEnumerable().Reverse())
            {
                entity.Set(value--);
            }

            Check.That(set.GetEntities().ToArray()).ContainsExactly(entities.AsEnumerable().Reverse());
            Check.That(world.Get <int>().ToArray()).ContainsExactly(Enumerable.Range(1, entities.Count).Reverse());

            world.Optimize(runner, () => Thread.Sleep(1));

            Check.That(set.GetEntities().ToArray().Select((e, i) => (i, e)).Any(t => entities[t.i] != t.e)).IsTrue();
            Check.That(world.Get <int>().ToArray().Select((v, i) => (i, v)).Any(t => t.i != t.v)).IsTrue();
        }
コード例 #11
0
        public void Update_with_runner_Should_call_update_on_all_systems()
        {
            bool done1 = false;
            bool done2 = false;
            bool done3 = false;
            bool done4 = false;

            using (DefaultParallelRunner runner = new DefaultParallelRunner(2))
                using (ISystem <int> system = new ParallelSystem <int>(
                           runner,
                           new ActionSystem <int>(_ => done1 = true),
                           new ActionSystem <int>(_ => done2 = true),
                           new ActionSystem <int>(_ => done3 = true),
                           new ActionSystem <int>(_ => done4 = true)))
                {
                    system.Update(0);
                }

            Check.That(done1).IsTrue();
            Check.That(done2).IsTrue();
            Check.That(done3).IsTrue();
            Check.That(done4).IsTrue();
        }
コード例 #12
0
ファイル: DefaultGame.cs プロジェクト: Doraku/DefaultEcs
        public DefaultGame()
        {
            _deviceManager  = new GraphicsDeviceManager(this);
            IsFixedTimeStep = true;
            _deviceManager.GraphicsProfile           = GraphicsProfile.HiDef;
            _deviceManager.IsFullScreen              = false;
            _deviceManager.PreferredBackBufferWidth  = 800;
            _deviceManager.PreferredBackBufferHeight = 600;
            _deviceManager.ApplyChanges();
            GraphicsDevice.RasterizerState = RasterizerState.CullCounterClockwise;
            GraphicsDevice.BlendState      = BlendState.AlphaBlend;
            Content.RootDirectory          = "Content";

            _batch = new SpriteBatch(GraphicsDevice);
            using (Stream stream = File.OpenRead(@"Content\square.png"))
            {
                _square = Texture2D.FromStream(GraphicsDevice, stream);
            }
            _slapSound   = Content.Load <SoundEffect>("Slap");
            _bounceSound = Content.Load <SoundEffect>("Jump");

            _world = new World(1000);

            _world.SetMaxCapacity <PlayerState>(1);

            _runner = new DefaultParallelRunner(Environment.ProcessorCount);
            _system = new SequentialSystem <float>(
                new PlayerSystem(_world, Window),
                new HitSystem(_world),
                new GameSystem(_world),
                new AISystem(_world, _runner),
                new PositionSystem(_world, _runner),
                new DrawSystem(_world, _batch, _square));

            Entity player = _world.CreateEntity();

            player.Set <PlayerState>(default);
コード例 #13
0
        private static void _client_Started()
        {
            var world           = new World();
            var commandRecorder = new EntityCommandRecorder();

            var scene = new Scene("Client", world, commandRecorder);

            var factory = _client.GraphicsDevice.ResourceFactory;

            var materialInputLayouts = new MaterialInputLayouts();

            var textureLayout = factory.CreateResourceLayout(
                new ResourceLayoutDescription(
                    new ResourceLayoutElementDescription("SurfaceTexture", ResourceKind.TextureReadOnly, ShaderStages.Fragment),
                    new ResourceLayoutElementDescription("SurfaceSampler", ResourceKind.Sampler, ShaderStages.Fragment),
                    new ResourceLayoutElementDescription("TextureColour", ResourceKind.UniformBuffer, ShaderStages.Fragment)));

            materialInputLayouts.ResourceLayouts["Texture"] = textureLayout;

            materialInputLayouts.ResourceLayouts["WorldTransform"] = factory.CreateResourceLayout(
                new ResourceLayoutDescription(
                    new ResourceLayoutElementDescription("WorldBuffer", ResourceKind.UniformBuffer, ShaderStages.Vertex)));

            materialInputLayouts.ResourceLayouts["SceneInputs"] = factory.CreateResourceLayout(
                new ResourceLayoutDescription(
                    new ResourceLayoutElementDescription("ProjectionBuffer", ResourceKind.UniformBuffer, ShaderStages.Vertex),
                    new ResourceLayoutElementDescription("ViewBuffer", ResourceKind.UniformBuffer, ShaderStages.Vertex),
                    new ResourceLayoutElementDescription("SceneLighting", ResourceKind.UniformBuffer, ShaderStages.Fragment)));

            materialInputLayouts.ResourceLayouts["CameraInputs"] = factory.CreateResourceLayout(
                new ResourceLayoutDescription(
                    new ResourceLayoutElementDescription("CameraInfo", ResourceKind.UniformBuffer, ShaderStages.Vertex)));

            materialInputLayouts.VertexLayouts["Model"] = new VertexLayoutDescription(
                new VertexElementDescription("Position", VertexElementSemantic.Position, VertexElementFormat.Float3),
                new VertexElementDescription("TexCoords", VertexElementSemantic.TextureCoordinate, VertexElementFormat.Float2),
                new VertexElementDescription("Normal", VertexElementSemantic.Normal, VertexElementFormat.Float3));

            materialInputLayouts.VertexLayouts["Lighting"] = new VertexLayoutDescription(
                new VertexElementDescription("Light", VertexElementSemantic.Color, VertexElementFormat.Float1));

            var mesh3dMaterial = new Material(_client.GraphicsDevice, _client.MainSceneFramebuffer, _client.Resources.LoadText("Shaders\\Mesh.vs"), _client.Resources.LoadText("Shaders\\Mesh.fg"),
                                              new string[] { "Model" }, new string[] { "SceneInputs", "WorldTransform", "Texture" }, materialInputLayouts);

            var lightMeshMaterial = new Material(_client.GraphicsDevice, _client.MainSceneFramebuffer, _client.Resources.LoadText("Shaders\\LightMesh.vs"), _client.Resources.LoadText("Shaders\\LightMesh.fg"),
                                                 new string[] { "Model", "Lighting" }, new string[] { "SceneInputs", "WorldTransform", "Texture", "CameraInputs" }, materialInputLayouts);

            var voxelTexturesResource = _client.Resources.LoadImage("Textures\\spritesheet_tiles.png");
            var voxelTexture          = new MaterialTexture(_client.GraphicsDevice, textureLayout, voxelTexturesResource, RgbaFloat.White);
            var redVoxelTexture       = new MaterialTexture(_client.GraphicsDevice, textureLayout, voxelTexturesResource, RgbaFloat.Red);
            var semiTransVoxelColour  = new MaterialTexture(_client.GraphicsDevice, textureLayout, voxelTexturesResource, new RgbaFloat(1.0f, 1.0f, 1.0f, 0.8f));

            Action <Entity> setVoxelRender = (Entity e) =>
            {
                e.Set(new LightVertexResources());
                e.Set(lightMeshMaterial);
                e.Set(voxelTexture);
            };

            var networkedEntities = new NetworkedEntities(world);

            var clientSystem = new ClientSystem(world, _messageTargetMap, _clientMessagingChannel);

            clientSystem.AddListener(new TransformMessageApplier(networkedEntities));
            clientSystem.AddListener(new ClientEntityAssignmentApplier(networkedEntities));
            clientSystem.AddListener(new VoxelSpaceMessageApplier(networkedEntities));
            clientSystem.AddListener(new VoxelGridMessageApplier(setVoxelRender, networkedEntities));
            clientSystem.AddListener(new VoxelGridChangeMessageApplier(networkedEntities));
            clientSystem.AddListener(new EntityRemover(networkedEntities));
            clientSystem.AddListener(new ComponentSyncMessageApplier <EntityMetaData>(networkedEntities));

            scene.AddSystem(clientSystem);

            var parallelRunner = new DefaultParallelRunner(8);

            var px = Image.Load("Assets\\Textures\\cloudtop_rt.png");
            var nx = Image.Load("Assets\\Textures\\cloudtop_lf.png");
            var py = Image.Load("Assets\\Textures\\cloudtop_up.png");
            var ny = Image.Load("Assets\\Textures\\cloudtop_dn.png");
            var pz = Image.Load("Assets\\Textures\\cloudtop_bk.png");
            var nz = Image.Load("Assets\\Textures\\cloudtop_ft.png");

            scene.AddSystem(new SkyboxRenderer(_client.GraphicsDevice, _client.MainSceneFramebuffer, px, nx, py, ny, pz, nz));

            scene.AddSystem(new MeshGeometryRenderer(_client.GraphicsDevice, materialInputLayouts, world));
            scene.AddSystem(new LightMeshGeometryRenderer(_client.GraphicsDevice, materialInputLayouts, world));

            var voxelTypes = LoadVoxelTypes();

            var editors = new List <IEditor>()
            {
                new SelectedEntitySystem(world),
                new EntityInspector(world),
                new EntityList(world),
                new SystemList(scene),
                new VoxelEditor(_clientMessagingChannel, world, voxelTypes.Select((t, i) => (t.Name, new Voxel()
                {
                    Exists = true, BlockType = (ushort)i
                })).ToArray()),
                new VoxelSpaceLoader(_clientMessagingChannel, world)
            };

            _editorMenu.AddEditorSet("Client", editors);

            scene.AddSystem(_editorMenu);
            scene.AddSystems(editors);

            scene.AddSystem(new SunLightPropogationSystem(world, new VoxelTypes(voxelTypes)));

            scene.AddSystem(new VoxelGridMesher(commandRecorder, world, new VoxelTypes(voxelTypes), _client.GraphicsDevice, parallelRunner));

            scene.AddSystem(new MeshGeometryCleaner(world));
            scene.AddSystem(new LightVertexCleaner(world));

            scene.AddSystem(new TransformLerper(networkedEntities, world));

            scene.AddSystem(new FlagClearingSystem <NeighbourMemberChanged>(world));

            scene.AddSystem(new InputForceApplierInputSystem(_clientMessagingChannel, world));
            scene.AddSystem(new SimpleCameraMoverInputSystem(_clientMessagingChannel, world));

            world.SubscribeEntityDisposed((in Entity e) =>
            {
                if (e.Has <VoxelGrid>())
                {
                    var voxelGrid = e.Get <VoxelGrid>();
                    voxelGrid.VoxelSpace.Remove(voxelGrid.MemberIndex);
                }
            });
コード例 #14
0
        private static void _server_Started()
        {
            var world           = new World();
            var commandRecorder = new EntityCommandRecorder();

            var scene = new Scene("Server", world, commandRecorder);

            var networkedEntities = new NetworkedEntities(world);
            var physicsSystem     = new PhysicsSystem();

            var editors = new List <IEditor>()
            {
                //new EditorConsole(_client.Scene),
                new SelectedEntitySystem(world),
                new EntityInspector(world),
                new EntityList(world),
                new SystemList(scene),
                new AverageMetricValue(),
                new MetricGraph()
            };

            _editorMenu.AddEditorSet("Server", editors);
            scene.AddSystems(editors);

            var parallelRunner = new DefaultParallelRunner(4);

            var serverSystem = new ServerSystem(world, _messageTargetMap);

            serverSystem.AddListener(new TransformMessageApplier(networkedEntities));
            serverSystem.AddListener(new InputForceApplier(physicsSystem, world));
            serverSystem.AddListener(new SimpleCameraMover(physicsSystem, networkedEntities));
            serverSystem.AddListener(new VoxelEditReceiver(physicsSystem));
            serverSystem.AddListener(new VoxelSpaceLoadReciever(world));

            scene.AddSystem(serverSystem);

            var voxelTypes = LoadVoxelTypes();

            var worldVoxelSpace = world.CreateEntity();

            worldVoxelSpace.Set(new NetworkedEntity()
            {
                Id = Guid.NewGuid()
            });
            worldVoxelSpace.Set(new Transform(worldVoxelSpace));
            worldVoxelSpace.Set(new VoxelSpace(32, 1, worldVoxelSpace));
            worldVoxelSpace.Set(new EntityMetaData()
            {
                Name = "Voxel Space"
            });

            scene.AddSystem(new WorldSpaceLoader((e) => { }, world, worldVoxelSpace, 4, 3, 32));
            scene.AddSystem(new ChunkGeneratorSystem(commandRecorder, parallelRunner, new ChunkGenerator(), world));

            scene.AddSystem(new VoxelSpaceExpanderSystem((e) => { }, world));

            scene.AddSystem(new PhysicsBlockFinder(world, parallelRunner));

            scene.AddSystem(new VoxelSpaceChangePropogator(world));
            scene.AddSystem(new VoxelStaticBodyGenerator(physicsSystem, world));
            scene.AddSystem(new VoxelSpaceDynamicBodyGenerator(physicsSystem, world));
            scene.AddSystem(physicsSystem);
            scene.AddSystem(new DynamicBodyPositionSync(world));

            scene.AddSystem(new CharacterInputSystem(physicsSystem, world));

            scene.AddSystem(new EntityRemovalSync(world));
            scene.AddSystem(new ClientEntityAssignmentSystem());
            scene.AddSystem(new TransformChangeServerSystem(world));
            scene.AddSystem(new VoxelSpaceAddedServerSystem(world));
            scene.AddSystem(new VoxelGridExistenceServerSystem(world));
            scene.AddSystem(new VoxelGridChangeServerSystem(world));
            scene.AddSystem(new ComponentSyncServerSystem <EntityMetaData>(world));

            scene.AddSystem(new FlagClearingSystem <NeighbourMemberChanged>(world));

            _server.SetScene(scene);
        }
コード例 #15
0
ファイル: Program.cs プロジェクト: my0n/Wrecker
        protected override void Initialize()
        {
            var factory = GraphicsDevice.ResourceFactory;

            var materialInputLayouts = new MaterialInputLayouts();

            var textureLayout = factory.CreateResourceLayout(
                new ResourceLayoutDescription(
                    new ResourceLayoutElementDescription("SurfaceTexture", ResourceKind.TextureReadOnly, ShaderStages.Fragment),
                    new ResourceLayoutElementDescription("SurfaceSampler", ResourceKind.Sampler, ShaderStages.Fragment),
                    new ResourceLayoutElementDescription("TextureColour", ResourceKind.UniformBuffer, ShaderStages.Fragment)));

            materialInputLayouts.ResourceLayouts["Texture"] = textureLayout;

            materialInputLayouts.ResourceLayouts["WorldTransform"] = factory.CreateResourceLayout(
                new ResourceLayoutDescription(
                    new ResourceLayoutElementDescription("WorldBuffer", ResourceKind.UniformBuffer, ShaderStages.Vertex)));

            materialInputLayouts.ResourceLayouts["SceneInputs"] = factory.CreateResourceLayout(
                new ResourceLayoutDescription(
                    new ResourceLayoutElementDescription("ProjectionBuffer", ResourceKind.UniformBuffer, ShaderStages.Vertex),
                    new ResourceLayoutElementDescription("ViewBuffer", ResourceKind.UniformBuffer, ShaderStages.Vertex),
                    new ResourceLayoutElementDescription("SceneLighting", ResourceKind.UniformBuffer, ShaderStages.Fragment)));

            materialInputLayouts.ResourceLayouts["CameraInputs"] = factory.CreateResourceLayout(
                new ResourceLayoutDescription(
                    new ResourceLayoutElementDescription("CameraInfo", ResourceKind.UniformBuffer, ShaderStages.Vertex)));

            materialInputLayouts.VertexLayouts["Model"] = new VertexLayoutDescription(
                new VertexElementDescription("Position", VertexElementSemantic.Position, VertexElementFormat.Float3),
                new VertexElementDescription("TexCoords", VertexElementSemantic.TextureCoordinate, VertexElementFormat.Float2),
                new VertexElementDescription("Normal", VertexElementSemantic.Normal, VertexElementFormat.Float3));

            materialInputLayouts.VertexLayouts["Lighting"] = new VertexLayoutDescription(
                new VertexElementDescription("Light", VertexElementSemantic.Color, VertexElementFormat.Float1));

            var mesh3dMaterial = new Material(GraphicsDevice, MainSceneFramebuffer, Resources.LoadText("Shaders\\Mesh.vs"), Resources.LoadText("Shaders\\Mesh.fg"),
                                              new string[] { "Model" }, new string[] { "SceneInputs", "WorldTransform", "Texture" }, materialInputLayouts);

            var lightMeshMaterial = new Material(GraphicsDevice, MainSceneFramebuffer, Resources.LoadText("Shaders\\LightMesh.vs"), Resources.LoadText("Shaders\\LightMesh.fg"),
                                                 new string[] { "Model", "Lighting" }, new string[] { "SceneInputs", "WorldTransform", "Texture", "CameraInputs" }, materialInputLayouts);

            var voxelTexturesResource = Resources.LoadImage("Textures\\spritesheet_tiles.png");
            var voxelTexture          = new MaterialTexture(GraphicsDevice, textureLayout, voxelTexturesResource, RgbaFloat.White);
            var redVoxelTexture       = new MaterialTexture(GraphicsDevice, textureLayout, voxelTexturesResource, RgbaFloat.Red);
            var semiTransVoxelColour  = new MaterialTexture(GraphicsDevice, textureLayout, voxelTexturesResource, new RgbaFloat(1.0f, 1.0f, 1.0f, 0.8f));

            Action <Entity> setVoxelRender = (Entity e) =>
            {
                e.Set(lightMeshMaterial);
                e.Set(voxelTexture);
            };

            var parallelRunner = new DefaultParallelRunner(4);

            var player          = Scene.World.CreateEntity();
            var playerTransform = new Transform();

            playerTransform.Position = new Vector3(0, 40, 0);
            player.Set(playerTransform);
            player.Set(new Camera());

            var worldVoxelSpace = Scene.World.CreateEntity();

            worldVoxelSpace.Set(new Transform());
            worldVoxelSpace.Set(new VoxelSpace(32, 1, worldVoxelSpace));

            var px = Image.Load("Assets\\Textures\\cloudtop_rt.png");
            var nx = Image.Load("Assets\\Textures\\cloudtop_lf.png");
            var py = Image.Load("Assets\\Textures\\cloudtop_up.png");
            var ny = Image.Load("Assets\\Textures\\cloudtop_dn.png");
            var pz = Image.Load("Assets\\Textures\\cloudtop_bk.png");
            var nz = Image.Load("Assets\\Textures\\cloudtop_ft.png");

            Scene.RendererSystems.Add(new SkyboxRenderer(GraphicsDevice, MainSceneFramebuffer, px, nx, py, ny, pz, nz));

            Scene.RendererSystems.Add(new MeshGeometryRenderer(GraphicsDevice, materialInputLayouts, Scene.World));
            Scene.RendererSystems.Add(new LightMeshGeometryRenderer(GraphicsDevice, materialInputLayouts, Scene.World));

            var physicsSystem = new PhysicsSystem();

            var voxelTypes = LoadVoxelTypes();

            var tools = new List <ITool>()
            {
                new RemoveVoxelEditingTool((e) => { e.Set(lightMeshMaterial); e.Set(redVoxelTexture); }, Scene.World, physicsSystem, player)
            };

            tools.AddRange(voxelTypes.Select((type, i) => new BasicVoxelAddingTool(type.Name, (ushort)i, (e) => { e.Set(lightMeshMaterial); e.Set(semiTransVoxelColour); }, Scene.World, physicsSystem, player)));

            Scene.LogicSystems.Add(new EditorMenu(Scene, new List <IEditor>()
            {
                new EditorConsole(Scene),
                new Toolbar(tools.ToArray()),
                new SelectedEntitySystem(Scene.World),
                new PhysicsEntitySelector(Scene.World, physicsSystem, playerTransform),
                new EntityInspector(Scene.World),
                new EntityList(Scene.World),
                new SystemList(Scene),
                new VoxelSpaceLoader(Scene.World, playerTransform, setVoxelRender)
            }));

            Scene.LogicSystems.Add(new SimpleCameraMover(player, physicsSystem, Scene.World));
            Scene.LogicSystems.Add(new WorldSpaceLoader(setVoxelRender, Scene.World, playerTransform, worldVoxelSpace, 10, 3, 32));
            Scene.LogicSystems.Add(new ChunkGeneratorSystem(Scene, parallelRunner, new ChunkGenerator()));

            Scene.LogicSystems.Add(new VoxelSpaceExpanderSystem(setVoxelRender, Scene.World));

            Scene.LogicSystems.Add(new InputForceApplier(physicsSystem, Scene.World));

            Scene.LogicSystems.Add(new PhysicsBlockFinder(Scene.World, parallelRunner));

            Scene.LogicSystems.Add(new ParallelSystem <double>(parallelRunner,
                                                               new SequentialSystem <double>(
                                                                   new VoxelSpaceChangePropogator(Scene.World),
                                                                   new VoxelStaticBodyGenerator(physicsSystem, Scene.World),
                                                                   new VoxelSpaceDynamicBodyGenerator(physicsSystem, Scene.World),
                                                                   physicsSystem,
                                                                   new DynamicBodyPositionSync(Scene.World)),
                                                               new SunLightPropogationSystem(new VoxelTypes(voxelTypes), Scene)));

            Scene.LogicSystems.Add(new VoxelGridMesher(Scene, new VoxelTypes(voxelTypes), GraphicsDevice, parallelRunner));

            Scene.LogicSystems.Add(new CharacterInputSystem(physicsSystem, Scene.World));

            Scene.LogicSystems.Add(new MeshGeometryCleaner(Scene.World));
            Scene.LogicSystems.Add(new LightVertexCleaner(Scene.World));

            Scene.LogicSystems.Add(new FlagClearingSystem <NeighbourMemberChanged>(Scene.World));

            //var cylinder = Scene.World.CreateEntity();
            //AddCylinder(cylinder, mesh3dMaterial, voxelTexture);
        }