示例#1
0
        public NetworkedEntity(string networkedType, Client relatedClient)
            : base()
        {
            NetworkedType = networkedType.Replace('¬', '-');
            EntityID      = GetNewEntityID();

            NetworkedEntities.Add(EntityID, this);

            RelatedClient = relatedClient;
            DoFieldSetup();
        }
示例#2
0
        public override void Delete()
        {
            base.Delete();

            NetworkedEntities.Remove(EntityID);

            foreach (Client c in Client.AllClients.Values)
            {
                if (ShouldSendToClient(c))
                {
                    c.DeletedEntities.Add(EntityID, true);
                }
            }
        }
示例#3
0
 private ushort GetNewEntityID()
 {
     while (NetworkedEntities.ContainsKey(nextEntityID))
     {
         if (nextEntityID == ushort.MaxValue)
         {
             nextEntityID = ushort.MinValue;
         }
         else
         {
             nextEntityID++;
         }
     }
     return(nextEntityID++);
 }
示例#4
0
 public VoxelSpaceMessageApplier(NetworkedEntities entities) : base(entities)
 {
 }
示例#5
0
 public TransformLerper(NetworkedEntities networkedEntities, World world) : base(world)
 {
     _entities = networkedEntities;
 }
示例#6
0
 public ProjectileMessageApplier(NetworkedEntities entities) : base(entities)
 {
 }
示例#7
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);
                }
            });
示例#8
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);
        }
示例#9
0
 public ConstructPilotingApplier(NetworkedEntities entities) : base(entities)
 {
 }
示例#10
0
 public override void Delete()
 {
     base.Delete();
     NetworkedEntities.Remove(EntityID);
 }
 public ClientEntityAssignmentApplier(NetworkedEntities entities) : base(entities)
 {
 }
示例#12
0
 public ThrusterMessageApplier(NetworkedEntities entities) : base(entities)
 {
 }
示例#13
0
 public ComponentSyncMessageApplier(NetworkedEntities entities) : base(entities)
 {
 }
示例#14
0
        private static byte[] GetNetworkTableHash(IList <NetworkedEntity> types)
        {
            bool          first;
            const char    separator = '¬';
            StringBuilder sb        = new StringBuilder();

            foreach (var ent in types)
            {
                sb.Append(separator);
                sb.Append(separator);
                sb.Append(separator);

                sb.Append(ent.NetworkedType);

                sb.Append(separator);
                sb.Append(separator);

                first = true;
                foreach (NetworkField field in ent.Fields)
                {
                    if (first)
                    {
                        first = false;
                    }
                    else
                    {
                        sb.Append(separator);
                    }

                    sb.Append(field.Describe());
                }

                if (ent.UsesRelatedClient)
                {
                    sb.Append(separator);
                    sb.Append(separator);

                    first = true;
                    foreach (NetworkField field in ent.RelatedClientFields)
                    {
                        if (first)
                        {
                            first = false;
                        }
                        else
                        {
                            sb.Append(separator);
                        }

                        sb.Append(field.Describe());
                    }

                    sb.Append(separator);
                    sb.Append(separator);

                    first = true;
                    foreach (NetworkField field in ent.OtherClientFields)
                    {
                        if (first)
                        {
                            first = false;
                        }
                        else
                        {
                            sb.Append(separator);
                        }

                        sb.Append(field.Describe());
                    }
                }
            }

            string fullTable = sb.Length > 0 ? sb.ToString().Substring(3) : string.Empty;

#if DEBUG
#if SERVER
            Console.WriteLine("Server network table:");
#elif CLIENT
            Console.WriteLine("Client network table:");
#endif
            Console.WriteLine(fullTable.Replace(separator, '\n'));
#endif
            MD5    md5  = MD5.Create();
            byte[] hash = md5.ComputeHash(Constants.NetworkTableStringEncoding.GetBytes(fullTable));
            md5.Clear();

            AllEntities.Clear();
            NetworkedEntities.Clear();
            return(hash);
        }