コード例 #1
0
        public override void Serialize(ref RuntimeRasterizedSpriteFont font, ArchiveMode mode, SerializationStream stream)
        {
            SpriteFont spriteFont = font;

            parentSerializer.Serialize(ref spriteFont, mode, stream);
            font = (RuntimeRasterizedSpriteFont)spriteFont;

            if (mode == ArchiveMode.Deserialize)
            {
                var services   = stream.Context.Tags.Get(ServiceRegistry.ServiceRegistryKey);
                var fontSystem = services.GetSafeServiceAs <FontSystem>();

                font.FontName   = stream.Read <string>();
                font.Style      = stream.Read <FontStyle>();
                font.UseKerning = stream.Read <bool>();
                font.AntiAlias  = stream.Read <FontAntiAliasMode>();

                font.FontSystem = fontSystem;
            }
            else
            {
                stream.Write(font.FontName);
                stream.Write(font.Style);
                stream.Write(font.UseKerning);
                stream.Write(font.AntiAlias);
            }
        }
コード例 #2
0
        public override void Serialize(ref T entityComponent, ArchiveMode mode, SerializationStream stream)
        {
            if (mode == ArchiveMode.Serialize)
            {
                stream.Write(entityComponent.Entity);
                stream.Write(CloneEntityComponentData.GenerateEntityComponentData(entityComponent));
            }
            else if (mode == ArchiveMode.Deserialize)
            {
                var entity = stream.Read <Entity>();

                var data = stream.Read <CloneEntityComponentData>();
                CloneEntityComponentData.RestoreEntityComponentData(entityComponent, data);
            }
        }
コード例 #3
0
 /// <inheritdoc/>
 public override void Serialize(ref BasePart basePart, ArchiveMode mode, SerializationStream stream)
 {
     if (mode == ArchiveMode.Serialize)
     {
         stream.Write(basePart.BasePartAsset);
         stream.Write(basePart.BasePartId);
         stream.Write(basePart.InstanceId);
     }
     else
     {
         var asset      = stream.Read <AssetReference>();
         var baseId     = stream.Read <Guid>();
         var instanceId = stream.Read <Guid>();
         basePart = new BasePart(asset, baseId, instanceId);
     }
 }
コード例 #4
0
ファイル: UnloadableComponent.cs プロジェクト: yyzreal/xenko
            public override void Serialize(ref UnloadableComponent obj, ArchiveMode mode, SerializationStream stream)
            {
                var invariantObjectList = stream.Context.Get(AssetCloner.InvariantObjectListProperty);

                if (mode == ArchiveMode.Serialize)
                {
                    stream.Write(invariantObjectList.Count);
                    invariantObjectList.Add(obj);
                }
                else
                {
                    var index = stream.Read <int>();

                    if (index >= invariantObjectList.Count)
                    {
                        throw new InvalidOperationException($"The type [{nameof(UnloadableComponent)}] cannot be only be used for clone serialization");
                    }

                    var invariant = invariantObjectList[index] as UnloadableComponent;
                    if (invariant == null)
                    {
                        throw new InvalidOperationException($"Unexpected null {nameof(UnloadableComponent)} while cloning");
                    }
                    // Create a new UnloadableComponent to avoid exception when adding the previous component to another entity(EntityComponentCollection is validating that a component cannot be added more than once to an entity)
                    obj = new UnloadableComponent(new List <ParsingEvent>(invariant.ParsingEvents), invariant.TypeName);
                }
            }
コード例 #5
0
ファイル: AssetCloner.cs プロジェクト: Beefr/xenko-wd
            public override void PreSerialize(ref T obj, ArchiveMode mode, SerializationStream stream)
            {
                var invariantObjectList = stream.Context.Get(InvariantObjectListProperty);

                if (mode == ArchiveMode.Serialize)
                {
                    stream.Write(invariantObjectList.Count);
                    invariantObjectList.Add(obj);
                }
                else
                {
                    var index = stream.Read <int>();

                    if (index >= invariantObjectList.Count)
                    {
                        throw new InvalidOperationException($"The type [{typeof(T).FullName}] cannot be only be used for clone serialization");
                    }

                    var invariant = invariantObjectList[index] as T;
                    if (invariant == null)
                    {
                        throw new InvalidOperationException($"Unexpected null {typeof(T).FullName} while cloning");
                    }

                    // Create a new object to avoid exception in case its identity is important
                    obj = (T)Activator.CreateInstance(typeof(T), invariant.TypeName, invariant.AssemblyName, invariant.Error, invariant.ParsingEvents);
                }
            }
コード例 #6
0
 public override void Serialize(ref ParameterCollection parameterCollection, ArchiveMode mode, SerializationStream stream)
 {
     if (mode == ArchiveMode.Serialize)
     {
         var parameters = new ParameterCollectionData();
         foreach (var parameter in parameterCollection.InternalValues)
         {
             if (parameterCollection.IsValueOwner(parameter.Value))
             {
                 parameters.Add(parameter.Key, parameter.Value.Object);
             }
         }
         stream.Write(parameters);
     }
     else if (mode == ArchiveMode.Deserialize)
     {
         var parameters = stream.Read <ParameterCollectionData>();
         foreach (var parameter in parameters)
         {
             var parameterValue = parameter.Value;
             if (parameterValue is ContentReference)
             {
                 parameterValue = ((ContentReference)parameterValue).ObjectValue;
             }
             parameterCollection.SetObject(parameter.Key, parameterValue);
         }
     }
 }
コード例 #7
0
        public override void Serialize(ref Buffer buffer, ArchiveMode mode, SerializationStream stream)
        {
            if (mode == ArchiveMode.Deserialize)
            {
                var bufferData = stream.Read <BufferData>();

                var services = stream.Context.Tags.Get(ServiceRegistry.ServiceRegistryKey);
                if (services == null)
                {
                    buffer.SetSerializationData(bufferData);
                }
                else
                {
                    var graphicsDeviceService = services.GetSafeServiceAs <IGraphicsDeviceService>();

                    buffer.AttachToGraphicsDevice(graphicsDeviceService.GraphicsDevice);
                    buffer.InitializeFrom(bufferData.Content, bufferData.StructureByteStride, bufferData.BufferFlags, PixelFormat.None, bufferData.Usage);

                    // Setup reload callback (reload from asset manager)
                    var contentSerializerContext = stream.Context.Get(ContentSerializerContext.ContentSerializerContextProperty);
                    if (contentSerializerContext != null)
                    {
                        buffer.Reload = static (graphicsResource, services) =>
                        {
                            var assetManager = services.GetService <ContentManager>();
                            assetManager.TryGetAssetUrl(graphicsResource, out var url);

                            // When service isn't provided to the ContentManager, deserialized data is stored in a cache instead
                            // of being sent right away to GPU.
                            // See 'SetSerializationData()' above
                            assetManager = new ContentManager(services.GetService <IDatabaseFileProviderService>());

                            // TODO: Avoid loading/unloading the same data
                            //       ^ perhaps out of date, will need to be discussed
                            var loadedBufferData = assetManager.Load <Buffer>(url);
                            try
                            {
                                var data = loadedBufferData.GetSerializationData().Content;
                                ((Buffer)graphicsResource).Recreate(data);
                            }
                            finally
                            {
                                assetManager.Unload(loadedBufferData);
                            }
                        };
                    }
                }
            }
            else
            {
                var bufferData = buffer.GetSerializationData();
                if (bufferData == null)
                {
                    throw new InvalidOperationException("Trying to serialize a Buffer without CPU info.");
                }

                stream.Write(bufferData);
            }
        }
コード例 #8
0
 public override void Serialize(ref PropertyContainer propertyCollection, ArchiveMode mode, SerializationStream stream)
 {
     if (mode == ArchiveMode.Serialize)
     {
         stream.Write(propertyCollection.properties);
     }
     else if (mode == ArchiveMode.Deserialize)
     {
         propertyCollection.properties = stream.Read <Dictionary <PropertyKey, object> >();
     }
 }
コード例 #9
0
 /// <inheritdoc/>
 public override void Serialize(ref SceneCameraSlotId assetReference, ArchiveMode mode, SerializationStream stream)
 {
     if (mode == ArchiveMode.Serialize)
     {
         stream.Write(assetReference.Id);
     }
     else
     {
         var id = stream.Read <Guid>();
         assetReference = new SceneCameraSlotId(id);
     }
 }
コード例 #10
0
            public override void Serialize(ref VertexBufferBinding vertexBufferBinding, ArchiveMode mode, SerializationStream stream)
            {
                if (mode == ArchiveMode.Deserialize)
                {
                    var buffer      = stream.Read <Buffer>();
                    var declaration = stream.Read <VertexDeclaration>();
                    var count       = stream.ReadInt32();
                    var stride      = stream.ReadInt32();
                    var offset      = stream.ReadInt32();

                    vertexBufferBinding = new VertexBufferBinding(buffer, declaration, count, stride, offset);
                }
                else
                {
                    stream.Write(vertexBufferBinding.Buffer);
                    stream.Write(vertexBufferBinding.Declaration);
                    stream.Write(vertexBufferBinding.Count);
                    stream.Write(vertexBufferBinding.Stride);
                    stream.Write(vertexBufferBinding.Offset);
                }
            }
コード例 #11
0
 public override void Serialize(ref BuildParameterCollection obj, ArchiveMode mode, SerializationStream stream)
 {
     if (mode == ArchiveMode.Serialize)
     {
         stream.Write(obj.parameterList);
     }
     else
     {
         var parameterList = stream.Read <List <BuildParameter> >();
         obj = new BuildParameterCollection();
         obj.parameterList.AddRange(parameterList);
     }
 }
コード例 #12
0
        public override void Serialize(ref SignedDistanceFieldSpriteFont font, ArchiveMode mode, SerializationStream stream)
        {
            SpriteFont spriteFont = font;

            parentSerializer.Serialize(ref spriteFont, mode, stream);
            font = (SignedDistanceFieldSpriteFont)spriteFont;

            if (mode == ArchiveMode.Deserialize)
            {
                var services   = stream.Context.Tags.Get(ServiceRegistry.ServiceRegistryKey);
                var fontSystem = services.GetSafeServiceAs <FontSystem>();

                font.CharacterToGlyph = stream.Read <Dictionary <char, Glyph> >();
                font.StaticTextures   = stream.Read <List <Texture> >();

                font.FontSystem = fontSystem;
            }
            else
            {
                stream.Write(font.CharacterToGlyph);
                stream.Write(font.StaticTextures);
            }
        }
コード例 #13
0
ファイル: ObjectUrl.cs プロジェクト: rohitshe/Code
 public override void Serialize(ref ObjectUrl obj, ArchiveMode mode, SerializationStream stream)
 {
     if (mode == ArchiveMode.Serialize)
     {
         stream.Write(obj.Type);
         stream.Write(obj.Path);
     }
     else
     {
         var type = stream.Read <UrlType>();
         var path = stream.ReadString();
         obj = new ObjectUrl(type, path);
     }
 }
コード例 #14
0
        public override void Serialize(ref T obj, ArchiveMode mode, SerializationStream stream)
        {
            var invariantObjectList = stream.Context.Get(AssetCloner.InvariantObjectListProperty);

            if (mode == ArchiveMode.Serialize)
            {
                stream.Write(invariantObjectList.Count);
                invariantObjectList.Add(obj);
            }
            else
            {
                var index = stream.Read <Int32>();
                obj = (T)invariantObjectList[index];
            }
        }
コード例 #15
0
        /// <inheritdoc/>
        public override void Serialize(ref AssetReference assetReference, ArchiveMode mode, SerializationStream stream)
        {
            if (mode == ArchiveMode.Serialize)
            {
                stream.Write(assetReference.Id);
                stream.Write(assetReference.Location);
            }
            else
            {
                var id       = stream.Read <AssetId>();
                var location = stream.ReadString();

                assetReference = new AssetReference(id, location);
            }
        }
コード例 #16
0
 public override void Serialize(ref VertexDeclaration obj, ArchiveMode mode, SerializationStream stream)
 {
     if (mode == ArchiveMode.Deserialize)
     {
         var elements      = stream.Read <VertexElement[]>();
         var instanceCount = stream.ReadInt32();
         var vertexStride  = stream.ReadInt32();
         obj = new VertexDeclaration(elements, instanceCount, vertexStride);
     }
     else
     {
         stream.Write(obj.VertexElements);
         stream.Write(obj.InstanceCount);
         stream.Write(obj.VertexStride);
     }
 }
コード例 #17
0
ファイル: RenderFrame.cs プロジェクト: tiomke/paradox
            public override void Serialize(ref RenderFrame renderFrame, ArchiveMode mode, SerializationStream stream)
            {
                if (mode == ArchiveMode.Deserialize)
                {
                    var services = stream.Context.Tags.Get(ServiceRegistry.ServiceRegistryKey);
                    var graphicsDeviceService = services.GetSafeServiceAs <IGraphicsDeviceService>();

                    var descriptor = stream.Read <RenderFrameDescriptor>();
                    renderFrame.InitializeFrom(graphicsDeviceService.GraphicsDevice, descriptor);
                }
                else
                {
                    var descriptor = renderFrame.Descriptor;
                    stream.Write(descriptor);
                }
            }
コード例 #18
0
ファイル: BufferSerializer.cs プロジェクト: vol16bit/xenko
        public override void Serialize(ref Buffer buffer, ArchiveMode mode, SerializationStream stream)
        {
            if (mode == ArchiveMode.Deserialize)
            {
                var bufferData = stream.Read <BufferData>();

                var services = stream.Context.Tags.Get(ServiceRegistry.ServiceRegistryKey);
                if (services == null)
                {
                    buffer.SetSerializationData(bufferData);
                }
                else
                {
                    var graphicsDeviceService = services.GetSafeServiceAs <IGraphicsDeviceService>();

                    buffer.AttachToGraphicsDevice(graphicsDeviceService.GraphicsDevice);
                    buffer.InitializeFrom(bufferData.Content, bufferData.StructureByteStride, bufferData.BufferFlags, PixelFormat.None, bufferData.Usage);

                    // Setup reload callback (reload from asset manager)
                    var contentSerializerContext = stream.Context.Get(ContentSerializerContext.ContentSerializerContextProperty);
                    if (contentSerializerContext != null)
                    {
                        var assetManager = contentSerializerContext.ContentManager;
                        var url          = contentSerializerContext.Url;

                        buffer.Reload = (graphicsResource) =>
                        {
                            // TODO: Avoid loading/unloading the same data
                            var loadedBufferData = assetManager.Load <BufferData>(url);
                            ((Buffer)graphicsResource).Recreate(loadedBufferData.Content);
                            assetManager.Unload(loadedBufferData);
                        };
                    }
                }
            }
            else
            {
                var bufferData = buffer.GetSerializationData();
                if (bufferData == null)
                {
                    throw new InvalidOperationException("Trying to serialize a Buffer without CPU info.");
                }

                stream.Write(bufferData);
            }
        }
コード例 #19
0
 public override void Serialize(ref VertexElement obj, ArchiveMode mode, SerializationStream stream)
 {
     if (mode == ArchiveMode.Deserialize)
     {
         obj.semanticName      = stream.ReadString();
         obj.semanticIndex     = stream.ReadInt32();
         obj.format            = stream.Read <PixelFormat>();
         obj.alignedByteOffset = stream.ReadInt32();
         obj.ComputeHashCode();
     }
     else
     {
         stream.Write(obj.semanticName);
         stream.Write(obj.semanticIndex);
         stream.Write(obj.format);
         stream.Write(obj.alignedByteOffset);
     }
 }
コード例 #20
0
            public override void Serialize(ref IndexBufferBinding indexBufferBinding, ArchiveMode mode, SerializationStream stream)
            {
                if (mode == ArchiveMode.Deserialize)
                {
                    var buffer  = stream.Read <Buffer>();
                    var is32Bit = stream.ReadBoolean();
                    var count   = stream.ReadInt32();
                    var offset  = stream.ReadInt32();

                    indexBufferBinding = new IndexBufferBinding(buffer, is32Bit, count, offset);
                }
                else
                {
                    stream.Write(indexBufferBinding.Buffer);
                    stream.Write(indexBufferBinding.Is32Bit);
                    stream.Write(indexBufferBinding.Count);
                    stream.Write(indexBufferBinding.Offset);
                }
            }
コード例 #21
0
        public override void Serialize(ref Effect effect, ArchiveMode mode, SerializationStream stream)
        {
            if (mode == ArchiveMode.Serialize)
            {
                throw new InvalidOperationException();
            }

            var services = stream.Context.Tags.Get(ServiceRegistry.ServiceRegistryKey);
            var graphicsDeviceService = services.GetSafeServiceAs <IGraphicsDeviceService>();

            var effectBytecode = stream.Read <EffectBytecode>();

            if (effect == null)
            {
                effect = new Effect();
            }

            effect.InitializeFrom(graphicsDeviceService.GraphicsDevice, effectBytecode);
        }
コード例 #22
0
        /// <inheritdoc/>
        public override void Serialize(ref T urlReference, ArchiveMode mode, [NotNull] SerializationStream stream)
        {
            if (mode == ArchiveMode.Serialize)
            {
                var attachedReference = AttachedReferenceManager.GetAttachedReference(urlReference);
                if (attachedReference is null)
                {
                    throw new InvalidOperationException("UrlReference does not have an AttachedReference.");
                }

                stream.Write(attachedReference.Id);
                stream.Write(attachedReference.Url);
            }
            else
            {
                var id  = stream.Read <AssetId>();
                var url = stream.ReadString();

                urlReference = (T)UrlReferenceHelper.CreateReference(typeof(T), id, url);
            }
        }
コード例 #23
0
 public override void Serialize(ref MaterialNull obj, ArchiveMode mode, SerializationStream stream)
 {
     if (stream.Context.SerializerSelector.HasProfile("AssetClone"))
     {
         // At design time, when performing a clone, we keep the associated id of this instance.
         if (mode == ArchiveMode.Serialize)
         {
             var id = IdentifiableHelper.GetId(obj);
             stream.Write(id);
         }
         else
         {
             var id = stream.Read <Guid>();
             obj = new MaterialNull();
             IdentifiableHelper.SetId(obj, id);
         }
     }
     else
     {
         // For runtime serialization, a MaterialNull becomes null
         obj = null;
     }
 }
コード例 #24
0
 public override void Serialize(ref ParameterCollection parameterCollection, ArchiveMode mode, SerializationStream stream)
 {
     if (mode == ArchiveMode.Serialize)
     {
         var parameters = new Dictionary <ParameterKey, object>();
         foreach (var parameter in parameterCollection.InternalValues)
         {
             if (parameterCollection.IsValueOwner(parameter.Value))
             {
                 parameters.Add(parameter.Key, parameter.Value.Object);
             }
         }
         stream.Write(parameters);
     }
     else if (mode == ArchiveMode.Deserialize)
     {
         var parameters = stream.Read <Dictionary <ParameterKey, object> >();
         foreach (var parameter in parameters)
         {
             var parameterValue = parameter.Value;
             parameterCollection.SetObject(parameter.Key, parameterValue);
         }
     }
 }
コード例 #25
0
        public override void Serialize(ref T obj, ArchiveMode mode, SerializationStream stream)
        {
            var referenceSerialization   = stream.Context.Get(ContentSerializerContext.SerializeAttachedReferenceProperty);
            var contentSerializerContext = stream.Context.Get(ContentSerializerContext.ContentSerializerContextProperty);

            if (contentSerializerContext != null)
            {
                if (mode == ArchiveMode.Serialize)
                {
                    var contentReference = new ContentReference <T>(obj);
                    int index            = contentSerializerContext.AddContentReference(contentReference);
                    stream.Write(index);
                }
                else
                {
                    int index            = stream.ReadInt32();
                    var contentReference = contentSerializerContext.GetContentReference <T>(index);
                    obj = contentReference.Value;
                    if (obj == null)
                    {
                        // Check if already deserialized
                        var assetReference = contentSerializerContext.ContentManager.FindDeserializedObject(contentReference.Location, typeof(T));
                        if (assetReference != null)
                        {
                            obj = (T)assetReference.Object;
                            if (obj != null)
                            {
                                contentReference.Value = obj;
                            }
                        }
                    }

                    if (obj == null && contentSerializerContext.LoadContentReferences)
                    {
                        var contentSerializer = cachedContentSerializer ?? (cachedContentSerializer = contentSerializerContext.ContentManager.Serializer.GetSerializer(null, typeof(T)));
                        if (contentSerializer == null)
                        {
                            // Need to read chunk header to know actual type (note that we can't cache it in cachedContentSerializer as it depends on content)
                            var chunkHeader = contentSerializerContext.ContentManager.ReadChunkHeader(contentReference.Location);
                            if (chunkHeader == null || (contentSerializer = contentSerializerContext.ContentManager.Serializer.GetSerializer(AssemblyRegistry.GetType(chunkHeader.Type), typeof(T))) == null)
                            {
                                throw new InvalidOperationException($"Could not find a valid content serializer for {typeof(T)} when loading {contentReference.Location}");
                            }
                        }

                        // First time, let's create it
                        if (contentSerializerContext.ContentManager.Exists(contentReference.Location))
                        {
                            obj = (T)contentSerializer.Construct(contentSerializerContext);
                            contentSerializerContext.ContentManager.RegisterDeserializedObject(contentReference.Location, obj);
                            contentReference.Value = obj;
                        }
                    }
                }
            }
            else if (referenceSerialization == ContentSerializerContext.AttachedReferenceSerialization.AsNull)
            {
                if (mode == ArchiveMode.Deserialize)
                {
                    obj = default(T);
                }
            }
            else if (referenceSerialization == ContentSerializerContext.AttachedReferenceSerialization.AsSerializableVersion)
            {
                if (mode == ArchiveMode.Serialize)
                {
                    // This case will happen when serializing build engine command hashes: we still want Location to still be written
                    var attachedReference = AttachedReferenceManager.GetAttachedReference(obj);
                    if (attachedReference?.Url == null)
                    {
                        throw new InvalidOperationException("Error when serializing reference.");
                    }

                    // TODO: Do not use string
                    stream.Write(obj.GetType().AssemblyQualifiedName);
                    stream.Write(attachedReference.Id);
                    stream.Write(attachedReference.Url);
                }
                else
                {
                    var type = AssemblyRegistry.GetType(stream.ReadString());
                    var id   = stream.Read <AssetId>();
                    var url  = stream.ReadString();

                    obj = (T)AttachedReferenceManager.CreateProxyObject(type, id, url);
                }
            }
            else
            {
                // This case will happen when serializing build engine command hashes: we still want Location to still be written
                if (mode == ArchiveMode.Serialize)
                {
                    // This case will happen when serializing build engine command hashes: we still want Location to still be written
                    var attachedReference = AttachedReferenceManager.GetAttachedReference(obj);
                    if (attachedReference?.Url == null)
                    {
                        throw new InvalidOperationException("Error when serializing reference.");
                    }

                    stream.Write(attachedReference.Url);
                }
                else
                {
                    // No real case yet
                    throw new NotSupportedException();
                }
            }
        }