void AttachDependencyData(PPtrObject ptr, ObjectData srcod) { if (m_DependentAssets == null) { return; } long key = ptr.GetKey(); if (m_DependentAssets.ContainsKey(key)) { List <object> dependentlist = m_DependentAssets[key]; foreach (PPtrObject dependentobj in dependentlist) { ObjectData dependentod = GetObjectDataFromPtr(dependentobj); if (dependentod != null) { if (dependentod.path == null || dependentod.path.Length <= 0) { dependentod.path = srcod.path; AttachDependencyData(dependentobj, dependentod); } } } } }
ObjectData GetObjectDataFromPtr(object ptr) { PPtrObject pobj = new PPtrObject(); pobj.m_FileID = -1; pobj.m_PathID = -1; if (ptr.GetType() == typeof(PPtrObject)) { pobj = (PPtrObject)ptr; } else if (ptr.GetType() == typeof(AssetInfo)) { AssetInfo ai = (AssetInfo)ptr; pobj = ai.asset; } if (pobj.m_FileID >= 0 && pobj.m_FileID < afnames.Length) { string assetfilename = afnames[pobj.m_FileID]; AssetFileEx af = afs[assetfilename]; Dictionary <long, ObjectData> ods = af.objects; if (ods.ContainsKey(pobj.m_PathID)) { ObjectData od = ods[pobj.m_PathID]; return(od); } } return(null); }
void AttachPreLoadData(int start, int size, ObjectData srcod) { if (m_PreloadTable == null) { return; } for (int i = start; i < start + size; i++) { if (i >= 0 && i < m_PreloadTable.Count) { PPtrObject ptr = (PPtrObject)m_PreloadTable[i]; ObjectData dependentod = GetObjectDataFromPtr(ptr); if (dependentod != null) { if (dependentod.path == null || dependentod.path.Length <= 0) { dependentod.path = srcod.path; } } } } }
private void postProcessObjectNode(FieldNode fieldNode) { // convert byte buffers to string instances in "string" fields for convenience if (fieldNode.typenode == null || fieldNode.typenode.type == null) { return; } if (fieldNode.typenode.type == "string") { // strings use "char" arrays, so it should be wrapped in a ByteBuffer //ByteBuffer buf = fieldNode.getArrayData<ByteBuffer>(); object arrayobj = fieldNode.getArrayData(); if (arrayobj != null && arrayobj is ByteBuffer) { ByteBuffer buf = (ByteBuffer)arrayobj; char[] carray = new char[buf.data.Length]; for (int i = 0; i < carray.Length; i++) { carray[i] = (char)buf.data[i]; } fieldNode.value = new String(carray);//, "UTF-8" fieldNode.cleanChilds(); } } else if (fieldNode.typenode.isArray) { int size = fieldNode.getSInt32("size"); fieldNode.value = fieldNode.getObject("data"); } else if (fieldNode.typenode.type.StartsWith("PPtr<") && fieldNode.typenode.type.EndsWith(">")) { object obj = new PPtrObject(); fillobject(obj, fieldNode); fieldNode.cleanChilds(); } else if (fieldNode.typenode.type == "Quaternionf" || fieldNode.typenode.type == "Vector3f" || fieldNode.typenode.type == "PackedBitVector" || fieldNode.typenode.type == "VertexData" || fieldNode.typenode.type == "UnityPropertySheet" || fieldNode.typenode.type == "AssetInfo" || fieldNode.typenode.type == "ResourceManager_Dependency") { System.Type t = System.Type.GetType("AssetEx." + fieldNode.typenode.type, false, false); System.Reflection.ConstructorInfo ci = t.GetConstructor(new Type[] { }); object v = ci.Invoke(new object[] { }); fillobject(v, fieldNode); fieldNode.cleanChilds(); } else if (fieldNode.typenode.type == "map") { List <FieldNode> childnodes = (List <FieldNode>)fieldNode.getArrayData(); Dictionary <object, object> map = new Dictionary <object, object>(); foreach (FieldNode fn in childnodes) { object first = fn.getObject("first"); object second = fn.getObject("second"); if (first != null && second != null) { map[first] = second; } } fieldNode.value = map; fieldNode.cleanChilds(); } else if (fieldNode.typenode.type == "vector") { object obj = fieldNode.getArrayData(); if (obj is List <FieldNode> ) { List <FieldNode> childnodes = (List <FieldNode>)obj; List <object> vectorl = new List <object>(); foreach (FieldNode fn in childnodes) { if (fn.value != null) { vectorl.Add(fn.value); } else { vectorl.Add(fn); } } fieldNode.value = vectorl; fieldNode.cleanChilds(); } else { fieldNode.value = obj; fieldNode.cleanChilds(); } } else if (fieldNode.getChilds() != null && fieldNode.getChilds().Count == 1) { fieldNode.value = fieldNode.getArrayData(); if (fieldNode.value != null) { fieldNode.cleanChilds(); } } }