示例#1
0
        protected override LodGroupNode Read(ContentReader input, LodGroupNode existingInstance)
        {
            if (existingInstance == null)
            {
                existingInstance = new LodGroupNode();
            }

            // Use AssetLoadHelper to receive an event when the asset (including all
            // shared resources) is loaded.
            using (var helper = AssetLoadHelper.Get(input.AssetName))
            {
                // ----- SceneNode properties (base class).
                input.ReadRawObject <SceneNode>(existingInstance);

                // ----- LodGroupNode properties
                existingInstance.BeginUpdate();
                existingInstance.Levels.Clear();

                int numberOfLevels = input.ReadInt32();
                for (int i = 0; i < numberOfLevels; i++)
                {
                    float distance = input.ReadSingle();
                    var   lodNode  = input.ReadObject <SceneNode>();
                    existingInstance.Levels.Add(distance, lodNode);
                }

                helper.AssetLoaded += (s, e) => existingInstance.EndUpdate();
            }

            return(existingInstance);
        }
示例#2
0
        public static AssetLoadHelper Get(string assetName)
        {
            if (assetName == null)
            {
                throw new ArgumentNullException("assetName");
            }
            if (assetName.Length == 0)
            {
                throw new ArgumentException("Asset name must not be empty.", "assetName");
            }

            lock (AssetLoadHelpers)
            {
                AssetLoadHelper assetLoadHelper;
                if (!AssetLoadHelpers.TryGetValue(assetName, out assetLoadHelper))
                {
                    // Create and register new helper.
                    assetLoadHelper             = new AssetLoadHelper(assetName);
                    AssetLoadHelpers[assetName] = assetLoadHelper;
                }

                assetLoadHelper.AddReference();
                return(assetLoadHelper);
            }
        }
示例#3
0
            public FixupWrapper(AssetLoadHelper helper, Action <T> fixup)
            {
                Debug.Assert(helper != null, "The AssetLoadHelper must not be null.");
                Debug.Assert(fixup != null, "The fixup action must not be null.");

                _helper = helper;
                _fixup  = fixup;
            }
示例#4
0
        protected override Submesh Read(ContentReader input, Submesh existingInstance)
        {
            // The submesh is deserialized into an existing instance, where Submesh.Mesh is
            // already set!
            if (existingInstance == null)
            {
                throw new ArgumentNullException("existingInstance", "A submesh must be deserialized into an existing instance.");
            }

            using (var helper = AssetLoadHelper.Get(input.AssetName))
            {
                input.ReadSharedResource(helper.Fixup <VertexBuffer>(vb => existingInstance.VertexBuffer = vb));
                existingInstance.StartVertex = input.ReadInt32();
                existingInstance.VertexCount = input.ReadInt32();

                input.ReadSharedResource(helper.Fixup <IndexBuffer>(ib => existingInstance.IndexBuffer = ib));
                existingInstance.StartIndex     = input.ReadInt32();
                existingInstance.PrimitiveCount = input.ReadInt32();

                int numberOfMorphs = input.ReadInt32();
                if (numberOfMorphs > 0)
                {
                    var morphs = new MorphTargetCollection();
                    for (int i = 0; i < numberOfMorphs; i++)
                    {
                        morphs.Add(input.ReadObject <MorphTarget>());
                    }

                    existingInstance.MorphTargets = morphs;
                }

                bool hasSharedMaterial = input.ReadBoolean();
                if (hasSharedMaterial)
                {
                    // Load external material, which is shared between models.
                    existingInstance.SetMaterial(input.ReadExternalReference <Material>());
                }
                else
                {
                    // Load local material, which is only shared within the model.
                    input.ReadSharedResource(helper.Fixup <Material>(existingInstance.SetMaterial));
                }

                // No fixup helper for the UserData because the UserData can be null (see AssetLoadHelper)!
                input.ReadSharedResource <object>(userData => existingInstance.UserData = userData);
            }

            return(existingInstance);
        }
        protected override MorphTarget Read(ContentReader input, MorphTarget existingInstance)
        {
            if (existingInstance == null)
            {
                existingInstance = new MorphTarget();
            }

            using (var helper = AssetLoadHelper.Get(input.AssetName))
            {
                existingInstance.Name = input.ReadString();
                input.ReadSharedResource(helper.Fixup <VertexBuffer>(vb => existingInstance.VertexBuffer = vb));
                existingInstance.StartVertex = input.ReadInt32();
            }

            return(existingInstance);
        }
示例#6
0
        protected override ModelNode Read(ContentReader input, ModelNode existingInstance)
        {
            if (existingInstance == null)
            {
                existingInstance = new ModelNode();
            }

            // Use AssetLoadHelper to receive an event when the asset (including all
            // shared resources) is loaded.
            using (var helper = AssetLoadHelper.Get(input.AssetName))
            {
                input.ReadRawObject <SceneNode>(existingInstance);
                helper.AssetLoaded += existingInstance.OnAssetLoaded;
            }

            return(existingInstance);
        }
示例#7
0
        protected override OccluderNode Read(ContentReader input, OccluderNode existingInstance)
        {
            if (existingInstance == null)
            {
                existingInstance = new OccluderNode();
            }

            // ----- SceneNode properties (base class).
            input.ReadRawObject <SceneNode>(existingInstance);

            // ----- OccluderNode properties
            using (var helper = AssetLoadHelper.Get(input.AssetName))
            {
                input.ReadSharedResource(helper.Fixup <Occluder>(o => existingInstance.Occluder = o));
            }

            return(existingInstance);
        }
示例#8
0
        protected override MeshNode Read(ContentReader input, MeshNode existingInstance)
        {
            if (existingInstance == null)
            {
                existingInstance = new MeshNode();
            }

            // Use AssetLoadHelper to receive an event when the asset (including all
            // shared resources) is loaded.
            using (var helper = AssetLoadHelper.Get(input.AssetName))
            {
                // ----- SceneNode properties (base class).
                input.ReadRawObject <SceneNode>(existingInstance);

                // ----- MeshNode properties
                input.ReadSharedResource(helper.Fixup <Mesh>(m => existingInstance.Mesh = m));

                helper.AssetLoaded += existingInstance.OnAssetLoaded;
            }

            return(existingInstance);
        }
示例#9
0
        protected override Mesh Read(ContentReader input, Mesh existingInstance)
        {
            if (existingInstance == null)
            {
                existingInstance = new Mesh();
            }

            existingInstance.BoundingShape = input.ReadObject <Shape>();

            int numberOfSubmeshes = input.ReadInt32();

            for (int i = 0; i < numberOfSubmeshes; i++)
            {
                // Add submesh to Mesh.Submeshes before loading it. This is necessary
                // because the submesh tries to store its material in Mesh.Materials.
                Submesh submesh = new Submesh();
                existingInstance.Submeshes.Add(submesh);
                input.ReadObject(submesh);
            }

            existingInstance.Name = input.ReadString();

            bool hasOccluder = input.ReadBoolean();

            if (hasOccluder)
            {
                using (var helper = AssetLoadHelper.Get(input.AssetName))
                {
                    input.ReadSharedResource(helper.Fixup <Occluder>(o => existingInstance.Occluder = o));
                }
            }

            bool hasSkeleton = input.ReadBoolean();

            if (hasSkeleton)
            {
#if ANIMATION
                using (var helper = AssetLoadHelper.Get(input.AssetName))
                {
                    input.ReadSharedResource(helper.Fixup <Skeleton>(s => existingInstance.Skeleton = s));
                }
#else
                throw new ContentLoadException("Mesh contains a skeleton, but this build of DigitalRune Graphics does not support animations.");
#endif
            }

            var hasAnimations = input.ReadBoolean();
            if (hasAnimations)
            {
#if ANIMATION
                using (var helper = AssetLoadHelper.Get(input.AssetName))
                {
                    input.ReadSharedResource(helper.Fixup <Dictionary <string, SkeletonKeyFrameAnimation> >(a => existingInstance.Animations = a));
                }
#else
                throw new ContentLoadException("Mesh contains animations, but this build of DigitalRune Graphics does not support animations.");
#endif
            }

            input.ReadSharedResource <object>(userData => existingInstance.UserData = userData);

            return(existingInstance);
        }