コード例 #1
0
        public override void SetBytes(Stream file, int chunkLength, long offsetPos, bool assemblyMode)
        {
            int bytesToRead = chunkLength - BlockTypeLength;
            int bytesRead   = 0;

            //Loop and create index elements.
            while (bytesRead < bytesToRead)
            {
                byte[] elementTypeBuffer = new byte[ChunkByteLength];
                file.Read(elementTypeBuffer, 0, ChunkByteLength);
                int             rawElementTypeValue = BitConverter.ToInt32(elementTypeBuffer, 0);
                PCFResourceType resourceType        = (PCFResourceType)Enum.ToObject(typeof(PCFResourceType), rawElementTypeValue);

                byte[] byteOffsetBuffer = new byte[ChunkByteLength];
                file.Read(byteOffsetBuffer, 0, ChunkByteLength);
                int rawByteOffsetValue = BitConverter.ToInt32(byteOffsetBuffer, 0);

                IndexElement element = new IndexElement(resourceType, rawByteOffsetValue);
                this.indexElements.Add(element);

                bytesRead += BYTES_PER_ELEMENT;
            }

            #if VERBOSE_LOG
            Debug.Log("Indexblock length: " + bytesToRead);
            #endif
        }
コード例 #2
0
 public ComponentNode(PCFResourceType resourceType, UInt32 referenceID, string resourceIdentifier, string name = "none") : base()
 {
     this.resourceType       = resourceType;
     this.referenceID        = referenceID;
     this.resourceIdentifier = resourceIdentifier;
     this.name = name;
 }
コード例 #3
0
        public T Recreate <T>(UnityNodeBase parentNode, PCFResourceType loadFlags) where T : UnityNodeBase
        {
            UnityNodeBase recreatedNode = null;

            //Allows us to mask nodes to load, makes it easier to do quick lookup of specific things. (like reading script data, no need to load textures etc)
            if ((this.resourceType & loadFlags) != 0)
            {
                //Create implementation specific node based on typetree info.
                recreatedNode = nodeFactory.CreateNodeImplementation(this.nodeName, this.resourceType, this.referenceID);
            }

            //If we are not the root node we will have a parent.
            if (parentNode != null && recreatedNode != null)
            {
                parentNode.AddChildNode(recreatedNode);
            }

            if (this.childNodes != null)
            {
                for (int i = 0; i < this.childNodes.Count; i++)
                {
                    this.childNodes[i].Recreate <T>(recreatedNode, loadFlags);
                }
            }

            //Only true for root node.
            if (parentNode == null)
            {
                return(recreatedNode as T);
            }

            return(null);
        }
コード例 #4
0
 public ResourceBlock(PCFResourceType resourceType, bool streamResources = false)
 {
     this.blockType       = BitConverter.GetBytes((int)PCFBlockTypes.RESOURCEBLOCK);
     this.resourceType    = BitConverter.GetBytes((int)resourceType);
     this.streamResources = streamResources;
     this.objectCount     = 0;
 }
コード例 #5
0
        public NodeResource(PCFResourceType resourceType, UInt32 referenceID, string name)
        {
            this.serializedResourceType   = BitConverter.GetBytes((int)resourceType);
            this.serializedReferenceID    = BitConverter.GetBytes(referenceID);
            this.serializedNodeName       = System.Text.Encoding.UTF8.GetBytes(name);
            this.serializedNodeNameLength = BitConverter.GetBytes(this.serializedNodeName.Length);

            this.childNodes           = new List <NodeResource>();
            this.serializedChildCount = BitConverter.GetBytes(childNodes.Count);
        }
コード例 #6
0
        public static NodeResource DeserializeNode(Stream file, ref int bytesRead, bool readNames, bool assemblyMode)
        {
            file.Read(CHUNK_BYTE_BUFFER, 0, ChunkByteLength);
            int childCount = BitConverter.ToInt32(CHUNK_BYTE_BUFFER, 0);

            bytesRead += ChunkByteLength;

            file.Read(CHUNK_BYTE_BUFFER, 0, ChunkByteLength);
            int             rawResourceTypeValue = BitConverter.ToInt32(CHUNK_BYTE_BUFFER, 0);
            PCFResourceType resourceType         = (PCFResourceType)Enum.ToObject(typeof(PCFResourceType), rawResourceTypeValue);

            bytesRead += ChunkByteLength;

            file.Read(CHUNK_BYTE_BUFFER, 0, ChunkByteLength);
            UInt32 referenceID = BitConverter.ToUInt32(CHUNK_BYTE_BUFFER, 0);

            bytesRead += ChunkByteLength;

            file.Read(CHUNK_BYTE_BUFFER, 0, ChunkByteLength);
            int nameLength = BitConverter.ToInt32(CHUNK_BYTE_BUFFER, 0);

            bytesRead += ChunkByteLength;

            string nodeName = null;

            if (readNames)
            {
                file.Read(NODE_NAME_BUFFER, 0, nameLength);
                nodeName = System.Text.Encoding.UTF8.GetString(NODE_NAME_BUFFER, 0, nameLength);
            }
            else
            {
                //Object nodes must have names read in because other nodes may reference them by name.
                if (resourceType == PCFResourceType.OBJECT || resourceType == PCFResourceType.TRANSFORM)
                {
                    file.Read(NODE_NAME_BUFFER, 0, nameLength);
                    nodeName = System.Text.Encoding.UTF8.GetString(NODE_NAME_BUFFER, 0, nameLength);
                }
                else
                {
                    nodeName = DEFAULT_NODE_NAME;
                    file.Seek(nameLength, SeekOrigin.Current);
                }
            }

            bytesRead += nameLength;

            return(new NodeResource(resourceType, referenceID, nodeName, childCount, assemblyMode));
        }
コード例 #7
0
        public void AddResource(uint refID, PCFResourceType resourceType, AssetResource resource)
        {
            if (this.dataBlocks.ContainsKey(resourceType))
            {
                ResourceBlock dataBlock = this.dataBlocks[resourceType] as ResourceBlock;
                dataBlock.AddResource(refID, resource);
            }
            else
            {
                ResourceBlock block = new ResourceBlock(resourceType);
                block.AddResource(refID, resource);

                this.dataBlocks.Add(resourceType, block);
            }
        }
コード例 #8
0
        public UnityNodeBase GetChildNodeByType(PCFResourceType type)
        {
            if (this.ChildNodes != null)
            {
                for (int i = 0; i < this.ChildNodes.Count; i++)
                {
                    UnityNodeBase child = this.ChildNodes[i];

                    if (child.GetResourceType() == type)
                    {
                        return(child);
                    }
                }
            }

            return(null);
        }
コード例 #9
0
        public NodeResource(PCFResourceType resourceType, UInt32 referenceID, string name, int childCount, bool assemblyMode)
        {
            if (assemblyMode)
            {
                this.serializedResourceType   = BitConverter.GetBytes((int)resourceType);
                this.serializedReferenceID    = BitConverter.GetBytes(referenceID);
                this.serializedNodeName       = System.Text.Encoding.UTF8.GetBytes(name);
                this.serializedNodeNameLength = BitConverter.GetBytes(this.serializedNodeName.Length);

                this.childNodes           = new List <NodeResource>();
                this.serializedChildCount = BitConverter.GetBytes(childCount);
            }

            this.resourceType     = resourceType;
            this.referenceID      = referenceID;
            this.nodeName         = name;
            this.numberOfChildren = childCount;
        }
コード例 #10
0
        void PopulateReferencedNodes(Dictionary <UInt32, UnityNodeBase> referencedNodes, UnityNodeBase node)
        {
            if (referencedNodes.ContainsKey(node.GetReferenceID()))
            {
                referencedNodes[node.GetReferenceID()] = node;
            }

            List <UnityNodeBase> children = node.ChildNodes;

            for (int i = 0; i < children.Count; i++)
            {
                UnityNodeBase   child = children[i];
                PCFResourceType type  = child.GetResourceType();

                if (type == PCFResourceType.ROOT || type == PCFResourceType.OBJECT || type == PCFResourceType.TRANSFORM)
                {
                    PopulateReferencedNodes(referencedNodes, children[i]);
                }
            }
        }
コード例 #11
0
        private void FindTransformsInHierarchy(UnityNodeBase node, Dictionary <string, Transform> mapping)
        {
            if (node.GetResourceType() == PCFResourceType.TRANSFORM)
            {
                Transform trans = node.GetTransform();
                mapping.Add(node.GetName(), trans);
            }

            for (int i = 0; i < node.ChildNodes.Count; i++)
            {
                UnityNodeBase   child = node.ChildNodes[i];
                PCFResourceType type  = child.GetResourceType();

                //Optimize search by not going into subtress that do not contain bones.
                if (type == PCFResourceType.ROOT || type == PCFResourceType.OBJECT || type == PCFResourceType.TRANSFORM)
                {
                    FindTransformsInHierarchy(child, mapping);
                }
            }
        }
コード例 #12
0
 public UnityColliderNode(string name, PCFResourceType resourceType, UInt32 referenceID) : base(name, resourceType, referenceID)
 {
     this.resourceType = PCFResourceType.COLLIDER;
 }
コード例 #13
0
        public UnityNodeBase CreateNodeImplementation(string nodeName, PCFResourceType resourceType, UInt32 referenceID)
        {
            UnityNodeBase recreatedNode = null;

            if (this.customCreators != null && this.customCreators.ContainsKey(resourceType))
            {
                recreatedNode = this.customCreators[resourceType](nodeName, resourceType, referenceID);
            }
            else
            {
                switch (resourceType)
                {
                case PCFResourceType.ROOT:
                    recreatedNode = new UnityRootNode(nodeName, referenceID);
                    break;

                case PCFResourceType.OBJECT:
                    recreatedNode = new UnityObjectNode(nodeName, referenceID);
                    break;

                case PCFResourceType.TRANSFORM:
                    recreatedNode = new UnityTransformNode(nodeName, resourceType, referenceID);
                    break;

                case PCFResourceType.TRANSFORMPOINTER:
                    recreatedNode = new UnityTransformPointerNode(nodeName, resourceType, referenceID);
                    break;

                case PCFResourceType.MESH:
                    recreatedNode = new UnityMeshNode(nodeName, resourceType, referenceID);
                    break;

                case PCFResourceType.ANIMATOR:
                    recreatedNode = new UnityAnimatorNode(nodeName, resourceType, referenceID);
                    break;

                case PCFResourceType.AUDIO:
                    recreatedNode = new UnityAudioNode(nodeName, resourceType, referenceID);
                    break;

                case PCFResourceType.AVATAR:
                    recreatedNode = new UnityAvatarReferenceNode(nodeName, resourceType, referenceID);
                    break;

                case PCFResourceType.SKINNEDMESH:
                    recreatedNode = new UnitySkinnedMeshNode(nodeName, resourceType, referenceID);
                    break;

                case PCFResourceType.SCRIPT:
                    recreatedNode = new UnityScriptNode(nodeName, resourceType, referenceID, null);
                    break;

                case PCFResourceType.MATERIAL:
                    recreatedNode = new UnityMaterialNode(nodeName, resourceType, referenceID);
                    break;

                case PCFResourceType.MATERIALPOINTER:
                    recreatedNode = new UnityMaterialPointerNode(nodeName, resourceType, referenceID);
                    break;

                case PCFResourceType.TEXTURE:
                    recreatedNode = new UnityTextureNode(nodeName, resourceType, referenceID);
                    break;

                case PCFResourceType.CAMERA:
                    recreatedNode = new UnityCameraNode(nodeName, resourceType, referenceID);
                    break;

                case PCFResourceType.LIGHT:
                    recreatedNode = new UnityLightNode(nodeName, resourceType, referenceID);
                    break;

                case PCFResourceType.LIGHTPROBES:
                    recreatedNode = new UnityLightProbesNode(nodeName, resourceType, referenceID);
                    break;

                case PCFResourceType.COLLIDER:
                    recreatedNode = new UnityColliderNode(nodeName, resourceType, referenceID);
                    break;

                case PCFResourceType.PRIMITIVE:
                    recreatedNode = new UnityPrimitiveNode(nodeName, resourceType, referenceID);
                    break;

                case PCFResourceType.COLLECTION:
                    recreatedNode = new UnityCollectionNode(nodeName, resourceType, referenceID);
                    break;

                case PCFResourceType.POINTERCOLLECTION:
                    recreatedNode = new UnityPointerCollectionNode(nodeName, resourceType, referenceID);
                    break;

                case PCFResourceType.CLASS:
                    recreatedNode = new UnityClassNode(nodeName, resourceType, referenceID);
                    break;

                case PCFResourceType.INTERNALBUNDLE:
                    recreatedNode = new UnityInternalBundleNode(nodeName, resourceType, referenceID);
                    break;

                case PCFResourceType.GRADIENT:
                    recreatedNode = new UnityGradientNode(nodeName, resourceType, referenceID);
                    break;

                case PCFResourceType.ANIMATION:
                    recreatedNode = new UnityAnimationNode(nodeName, resourceType, referenceID);
                    break;

                case PCFResourceType.ANIMATIONCLIP:
                    recreatedNode = new UnityAnimationClipNode(nodeName, resourceType, referenceID);
                    break;

                case PCFResourceType.ANIMATIONCLIPREFERENCE:
                    recreatedNode = new UnityAnimationClipPointerNode(nodeName, resourceType, referenceID);
                    break;
                }
            }


            return(recreatedNode);
        }
コード例 #14
0
 public UnityAnimationClipPointerNode(string name, PCFResourceType resourceType, UInt32 referenceID) : base(name, resourceType, referenceID)
 {
     this.resourceType = PCFResourceType.ANIMATIONCLIPREFERENCE;
 }
コード例 #15
0
 public UnityPrimitiveNode(string name, PCFResourceType resourceType, UInt32 referenceID) : base(name, resourceType, referenceID)
 {
     this.resourceType = PCFResourceType.PRIMITIVE;
 }
コード例 #16
0
ファイル: PCFFile.cs プロジェクト: asdlei99/AssetSerializer
 public void LoadFile(PCFResourceType loadFlags, bool streamResources, bool assemblyMode = false)
 {
     LoadDataFromDisk(loadFlags, streamResources, assemblyMode);
 }
コード例 #17
0
 public UnityTransformPointerNode(string name, PCFResourceType resourceType, UInt32 referenceID) : base(name, resourceType, referenceID)
 {
     this.resourceType = PCFResourceType.TRANSFORMPOINTER;
 }
コード例 #18
0
 public UnityAudioNode(string name, PCFResourceType resourceType, UInt32 referenceID) : base(name, resourceType, referenceID)
 {
     this.resourceType = PCFResourceType.AUDIO;
 }
コード例 #19
0
 public UnityAnimatorNode(string name, PCFResourceType resourceType, UInt32 referenceID) : base(name, resourceType, referenceID)
 {
     this.resourceType = PCFResourceType.ANIMATOR;
 }
コード例 #20
0
 public UnityScriptNode(string name, PCFResourceType resourceType, UInt32 referenceID, List <string> scriptMask) : base(name, resourceType, referenceID)
 {
     this.scriptMask   = scriptMask;
     this.resourceType = PCFResourceType.SCRIPT;
 }
コード例 #21
0
 public UnityGradientNode(string name, PCFResourceType resourceType, UInt32 referenceID) : base(name, resourceType, referenceID)
 {
     this.resourceType = PCFResourceType.GRADIENT;
 }
コード例 #22
0
 public UnityClassNode(string name, PCFResourceType resourceType, UInt32 referenceID) : base(name, resourceType, referenceID)
 {
     this.resourceType = PCFResourceType.CLASS;
 }
コード例 #23
0
ファイル: PCFFile.cs プロジェクト: asdlei99/AssetSerializer
        void LoadDataFromDisk(PCFResourceType loadFlags, bool streamResources, bool assemblyMode)
        {
            Stream file = this.path.GetFileStream(FileMode.Open);

            //Load header first.
            this.fileHeader = LoadHeader(file);

            int bytesRead  = HeaderByteLength;
            int fileLength = (int)file.Length;

            while (bytesRead < fileLength)
            {
                int             chunkLength  = GetNextSegmentLength(file);
                PCFBlockTypes   blockType    = GetNextBlockType(file);
                DataBlockBase   block        = null;
                PCFResourceType resourceType = PCFResourceType.NONE;

                if (blockType == PCFBlockTypes.INDEXBLOCK)
                {
                    block = new IndexBlock();

                    this.blockData.Add(PCFResourceType.INDEX, block);
                }
                else if (blockType == PCFBlockTypes.NODEBLOCK)
                {
                    block = new NodeBlock(loadFlags);

                    this.blockData.Add(PCFResourceType.NODE, block);
                }
                else if (blockType == PCFBlockTypes.RESOURCEBLOCK)
                {
                    //Read 4 bytes to determine resourcetype.
                    file.Read(INT_BUFFER, 0, ChunkByteLength);
                    int rawResourceTypeValue = BitConverter.ToInt32(INT_BUFFER, 0);
                    resourceType = (PCFResourceType)Enum.ToObject(typeof(PCFResourceType), rawResourceTypeValue);

                    //Allows us to mask what blocks to read in from file.
                    if ((resourceType & loadFlags) != 0)
                    {
                        block = new ResourceBlock(resourceType, streamResources);
                        this.blockData.Add(resourceType, block);
                    }
                }
                else
                {
                    Debug.LogError("Unknown block type");
                }

                //Increment file position, make sure to count the chunk size bytes.
                bytesRead += chunkLength + ChunkByteLength;

                if (block != null)
                {
                    if (memStream)
                    {
                        int bytsOffset = ChunkByteLength;
                        if (blockType == PCFBlockTypes.RESOURCEBLOCK)
                        {
                            bytsOffset += ChunkByteLength;
                        }

                        long   fileStreamPos = file.Position;
                        byte[] streamBytes   = new byte[chunkLength - bytsOffset];
                        file.Read(streamBytes, 0, chunkLength - bytsOffset);

                        Stream stream = new MemoryStream(streamBytes);

                        block.SetBytes(stream, chunkLength, fileStreamPos, assemblyMode);
                    }
                    else
                    {
                        //Will internally read from file and increment its position.
                        block.SetBytes(file, chunkLength, 0, assemblyMode);
                    }
                }
                else
                {
                    //Manually seek to next chunk incase SetBytes was never called.
                    file.Seek(bytesRead, SeekOrigin.Begin);
                }
            }

            if (file != null)
            {
                //Stop reading pcf file.
                file.Close();
            }
        }
コード例 #24
0
        private byte[] byteOffset;         // 4 Bytes UINT32

        public IndexElement(PCFResourceType elementType, int byteOffset)
        {
            this.elementType = BitConverter.GetBytes((int)elementType);
            this.byteOffset  = BitConverter.GetBytes(byteOffset);
        }
コード例 #25
0
 public UnitySkinnedMeshNode(string name, PCFResourceType resourceType, UInt32 referenceID) : base(name, resourceType, referenceID)
 {
     this.resourceType = PCFResourceType.SKINNEDMESH;
 }
コード例 #26
0
 public UnityAvatarReferenceNode(string name, PCFResourceType resourceType, UInt32 referenceID) : base(name, resourceType, referenceID)
 {
     this.resourceType = PCFResourceType.AVATAR;
 }
コード例 #27
0
 public UnityCameraNode(string name, PCFResourceType resourceType, UInt32 referenceID) : base(name, resourceType, referenceID)
 {
     this.resourceType = PCFResourceType.CAMERA;
 }
コード例 #28
0
 public UnityPointerCollectionNode(string name, PCFResourceType resourceType, UInt32 referenceID) : base(name, resourceType, referenceID)
 {
     this.resourceType = PCFResourceType.POINTERCOLLECTION;
 }
コード例 #29
0
 public UnityMaterialNode(string name, PCFResourceType resourceType, UInt32 referenceID) : base(name, resourceType, referenceID)
 {
     this.resourceType = PCFResourceType.MATERIAL;
 }
コード例 #30
0
 public UnityLightProbesNode(string name, PCFResourceType resourceType, UInt32 referenceID) : base(name, resourceType, referenceID)
 {
     this.resourceType = PCFResourceType.LIGHTPROBES;
 }