diff --git a/core/unity_import.cpp b/core/unity_import.cpp index f3088e1..a7b3fe0 100644 --- a/core/unity_import.cpp +++ b/core/unity_import.cpp @@ -957,6 +957,50 @@ void bakeLayout(const YNode& rt, float scaleX, float scaleY, UIElement& e) { } } +// ---- Model internal IDs ---- + +uint64_t xxh64(std::string_view s, uint64_t seed) { + constexpr uint64_t P1 = 11400714785074694791ull, P2 = 14029467366897019727ull, P3 = 1609587929392839161ull, + P4 = 9650029242287828579ull, P5 = 2870177450012600261ull; + auto rotl = [](uint64_t x, int r) { return (x << r) | (x >> (64 - r)); }; + auto le = [&](size_t at, int bytes) { + uint64_t v = 0; + for (int b = 0; b < bytes; ++b) v |= uint64_t(uint8_t(s[at + size_t(b)])) << (8 * b); + return v; + }; + auto round = [&](uint64_t acc, uint64_t in) { return rotl(acc + in * P2, 31) * P1; }; + const size_t n = s.size(); + size_t p = 0; + uint64_t h; + if (n >= 32) { + uint64_t v[4] = {seed + P1 + P2, seed + P2, seed, seed - P1}; + for (; p + 32 <= n; p += 32) + for (int k = 0; k < 4; ++k) v[k] = round(v[k], le(p + size_t(k) * 8, 8)); + h = rotl(v[0], 1) + rotl(v[1], 7) + rotl(v[2], 12) + rotl(v[3], 18); + for (uint64_t x : v) h = (h ^ round(0, x)) * P1 + P4; + } else { + h = seed + P5; + } + h += n; + for (; p + 8 <= n; p += 8) h = rotl(h ^ round(0, le(p, 8)), 27) * P1 + P4; + if (p + 4 <= n) { + h = rotl(h ^ (le(p, 4) * P1), 23) * P2 + P3; + p += 4; + } + for (; p < n; ++p) h = rotl(h ^ (uint64_t(uint8_t(s[p])) * P5), 11) * P1; + h ^= h >> 33; + h *= P2; + h ^= h >> 29; + h *= P3; + h ^= h >> 32; + return h; +} + +long long modelObjectId(std::string_view type, std::string_view path, int n) { + const std::string key = "Type:" + std::string(type) + "->" + std::string(path) + std::to_string(n); + return (long long)xxh64(key); +} + // ---- The importer ---- namespace { @@ -1034,6 +1078,7 @@ struct ModelAsset { std::string error; // internal fileID -> (class, name) from the model's .meta std::map> ids; + bool preserveHierarchy = false; // the .meta keeps a lone top-level node below the root }; // The internal IDs of a model's .meta: internalIDToNameTable (Unity 2019.3+) @@ -1401,11 +1446,14 @@ Importer::Unit Importer::instantiateModel(const Ref& source, const YNode& mod) { std::vector nodeObj; if (ma && ma->error.empty()) { const ImportedModel& im = ma->model; - const bool single = im.nodes.size() == 1; + // Unity makes a lone top-level node the prefab root. + int tops = 0; + for (const ImportedNode& n : im.nodes) tops += n.parent < 0; + const bool single = tops == 1 && !ma->preserveHierarchy; for (size_t k = 0; k < im.nodes.size(); ++k) { const ImportedNode& n = im.nodes[k]; int o = root; - if (!single) { + if (!single || n.parent >= 0) { o = int(m_objs.size()); m_objs.emplace_back(); m_objs.back().name = n.name; @@ -1437,6 +1485,26 @@ Importer::Unit Importer::instantiateModel(const Ref& source, const YNode& mod) { break; } } + // Unity 2019.3+ leaves that table empty: the IDs are hashes of each + // object's path in the model. Where the table names an ID, it wins. + std::map taken; + auto hashed = [&](const std::string& path, int o) { + for (const char* t : {"GameObject", "Transform", "MeshFilter", "MeshRenderer", "SkinnedMeshRenderer"}) { + const std::string p = std::strcmp(t, "GameObject") == 0 ? path : path + "/" + t; + u.byFid.emplace(modelObjectId(t, p, taken[std::string(t) + "->" + p]++), o); + } + }; + std::vector paths(im.nodes.size()); + hashed("//RootNode/root", root); + for (size_t k = 0; k < im.nodes.size(); ++k) { + const ImportedNode& n = im.nodes[k]; + if (single && n.parent < 0) { + paths[k] = "//RootNode/root"; + continue; + } + paths[k] = (n.parent >= 0 ? paths[size_t(n.parent)] : std::string("//RootNode/root")) + "/" + n.name; + hashed(paths[k], nodeObj[k]); + } } for (const YNode& m : mod["m_Modifications"].seq) { const Ref target = refOf(m["target"]); @@ -1555,7 +1623,10 @@ ModelAsset* Importer::model(const std::string& guid, const std::string& path) { // Unity's model import scale, when the .meta sets one. for (const YDoc& d : parseYaml(readText(fs::path(src) += ".meta"))) if (const YNode* mi = d.body.find("ModelImporter")) - if (const YNode* meshes = mi->find("meshes")) s.scale = float((*meshes)["globalScale"].num(1)); + if (const YNode* meshes = mi->find("meshes")) { + s.scale = float((*meshes)["globalScale"].num(1)); + ma->preserveHierarchy = (*meshes)["preserveHierarchy"].flag(false); + } saveImportSettings(copy, s); ma->model = importModel(copy, m_dest, s); ma->ids = metaIds(fs::path(src) += ".meta"); @@ -2107,8 +2178,10 @@ void Importer::convertObject(int idx, const std::string& parentPath, std::vector o.active = u.active; o.transform = u.t; const UComp *exp = nullptr, *mf = nullptr, *mr = nullptr; + bool skinExp = false; // its mesh is reported as not imported yet std::vector leftOut; for (const UComp& c : u.comps) { + skinExp |= c.classId == 114 && c.cls == "PSXSkinnedObjectExporter"; if (c.classId == 33) mf = &c; else if (c.classId == 23) mr = &c; else if (c.classId == 114 && c.cls == "PSXObjectExporter") exp = &c; @@ -2208,7 +2281,7 @@ void Importer::convertObject(int idx, const std::string& parentPath, std::vector } const std::string lua = luaOf(field("luaFile", "LuaFile"), path, "script"); if (!lua.empty()) o.script = ScriptComponent{lua, {}}; - } else if ((mf && !refOf((*mf->body)["m_Mesh"]).null()) || !u.modelMesh.empty()) { + } else if (!skinExp && ((mf && !refOf((*mf->body)["m_Mesh"]).null()) || !u.modelMesh.empty())) { item(ReportItem::LeftOut, path, "has a mesh but no PSXObjectExporter, so Unity did not export it either; it is kept without its mesh"); } if (!leftOut.empty()) { diff --git a/core/unity_import.hh b/core/unity_import.hh index f3c6410..1112c5a 100644 --- a/core/unity_import.hh +++ b/core/unity_import.hh @@ -125,6 +125,19 @@ struct Primitive { std::optional builtinMesh(long long fileId); constexpr const char* kBuiltinGuid = "0000000000000000e000000000000000"; +// ---- Model internal IDs ---- + +// XXH64 of `bytes`. +uint64_t xxh64(std::string_view bytes, uint64_t seed = 0); +// The fileID Unity 2019.3+ gives an object inside a model it imported (its +// .meta's internalIDToNameTable is then empty): XXH64 of the UTF-8 +// "Type:->" as a signed 64-bit value, counting the +// earlier objects of the model with the same type and path. The prefab +// root's path is "//RootNode/root", a node's is its parent's + "/" +// (a model's single top-level node is the root), a component's is its +// object's + "/": "Type:Transform->//RootNode/root/Arm/Transform0". +long long modelObjectId(std::string_view type, std::string_view path, int n = 0); + // ---- UI ---- // A RectTransform body (m_AnchorMin/Max, m_AnchoredPosition, m_SizeDelta, diff --git a/src/editor/tests/editor_tests.cpp b/src/editor/tests/editor_tests.cpp index cfc1d68..146142a 100644 --- a/src/editor/tests/editor_tests.cpp +++ b/src/editor/tests/editor_tests.cpp @@ -12715,6 +12715,60 @@ void testUnityPrefab() { CHECK(lamp2 && lamp2->children.size() == 2); } +// Exporters added to models placed in a scene (#223): Unity 6 leaves the +// model's internalIDToNameTable empty, the scene names the model's objects +// by hashed IDs. Fixture: tests/fixtures/unity-models, saved by Unity 6000.3. +void testUnityModelIds() { + using namespace splash::unity; + using namespace unitytest; + CHECK(xxh64("") == 0xEF46DB3751D8E999ull); + CHECK(xxh64("abc") == 0x44BC2CF5AD770999ull); + // IDs Unity wrote: the root and its Transform, a node and its renderer + // (URP's SandBoxModel.fbx), nested, a lone top-level node's child, skinned. + CHECK(modelObjectId("GameObject", "//RootNode/root") == 919132149155446097LL); + CHECK(modelObjectId("Transform", "//RootNode/root/Transform") == -8679921383154817045LL); + CHECK(modelObjectId("GameObject", "//RootNode/root/Circle2") == 3650834566929780429LL); + CHECK(modelObjectId("MeshRenderer", "//RootNode/root/Circle2/MeshRenderer") == 5912129206897006233LL); + CHECK(modelObjectId("GameObject", "//RootNode/root/Base/Arm") == -1537605290578348017LL); + CHECK(modelObjectId("GameObject", "//RootNode/root/Tip") == -8469990867830010200LL); + CHECK(modelObjectId("SkinnedMeshRenderer", "//RootNode/root/Body/SkinnedMeshRenderer") == 1630794972795428178LL); + + const fs::path proj = fs::path(SPLASHEDIT_SOURCE_DIR) / "tests" / "fixtures" / "unity-models"; + const fs::path dest = g_outDir / "unity-model-ids"; + fs::remove_all(dest); + fs::create_directories(dest); + ImportReport r; + const splash::Scene s = convertScene(proj, indexGuids(proj), proj / "Assets" / "Scenes" / "models.unity", dest, r); + std::function&, const std::string&)> at = + [&](const std::vector& objs, const std::string& path) -> const splash::Object* { + const size_t slash = path.find('/'); + const splash::Object* o = findObj(objs, path.substr(0, slash)); + return !o || slash == std::string::npos ? o : at(o->children, path.substr(slash + 1)); + }; + auto meshed = [&](const char* path) { + const splash::Object* o = at(s.objects, path); + return o && o->mesh && !o->mesh->mesh.empty(); + }; + const char* noExporter = "has a mesh but no PSXObjectExporter"; + // solo.fbx: its one top-level node is the root, its child under it. + CHECK(meshed("solo") && meshed("solo/Tip")); + CHECK(at(s.objects, "solo") && at(s.objects, "solo")->children.size() == 1); + // multi.fbx: a nested node and a top-level one carry the added exporter. + CHECK(meshed("multi/Base/Arm") && meshed("multi/Lamp")); + CHECK(!meshed("multi/Base") && !meshed("multi/Base/Arm/Hand")); + CHECK(hasItem(r, ReportItem::LeftOut, "multi/Base", noExporter) && hasItem(r, ReportItem::LeftOut, "multi/Base/Arm/Hand", noExporter)); + // rig.fbx: the skinned child holds its PSXSkinnedObjectExporter. + CHECK(meshed("rig/Prop") && at(s.objects, "rig/Body")); + CHECK(hasItem(r, ReportItem::Later, "rig/Body", "PSXSkinnedObjectExporter")); + for (const char* p : {"solo", "solo/Tip", "multi", "multi/Base/Arm", "multi/Lamp", "rig/Prop", "rig/Body"}) + CHECK(!hasItem(r, ReportItem::LeftOut, p, noExporter)); + // The instances' root overrides land on the root. + CHECK(at(s.objects, "rig") && at(s.objects, "rig")->transform.position.x == 6); + CHECK(at(s.objects, "multi") && at(s.objects, "multi")->transform.position.x == 3); + if (g_failures) + for (const auto& it : r.items) std::fprintf(stderr, " item %d %s: %s\n", int(it.kind), it.object.c_str(), it.what.c_str()); +} + void testUnityPrimitives() { using namespace splash::unity; auto outward = [](const splash::Mesh& m) { @@ -13310,6 +13364,7 @@ int main(int argc, char** argv) { testUnityGuidIndex(); testUnityHierarchy(); testUnityPrefab(); + testUnityModelIds(); testUnityPrimitives(); testUnityReport(); testUnityUi(); diff --git a/tests/fixtures/unity-models/Assets/Models/multi.fbx b/tests/fixtures/unity-models/Assets/Models/multi.fbx new file mode 100644 index 0000000..2d35cb9 Binary files /dev/null and b/tests/fixtures/unity-models/Assets/Models/multi.fbx differ diff --git a/tests/fixtures/unity-models/Assets/Models/multi.fbx.meta b/tests/fixtures/unity-models/Assets/Models/multi.fbx.meta new file mode 100644 index 0000000..5c9a7db --- /dev/null +++ b/tests/fixtures/unity-models/Assets/Models/multi.fbx.meta @@ -0,0 +1,110 @@ +fileFormatVersion: 2 +guid: 6a0cb84423ed59b5ba90c6029650e20b +ModelImporter: + serializedVersion: 24200 + internalIDToNameTable: [] + externalObjects: {} + materials: + materialImportMode: 2 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + removeConstantScaleCurves: 0 + motionNodeName: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + importAnimatedCustomProperties: 0 + importConstraints: 0 + animationCompression: 1 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + extraUserProperties: [] + clipAnimations: [] + isReadable: 0 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + useSRGBMaterialColor: 1 + sortHierarchyByName: 1 + importPhysicalCameras: 1 + importVisibility: 1 + importBlendShapes: 1 + importCameras: 1 + importLights: 1 + nodeNameCollisionStrategy: 1 + fileIdsGeneration: 2 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + keepQuads: 0 + weldVertices: 1 + bakeAxisConversion: 0 + preserveHierarchy: 0 + skinWeightsMode: 0 + maxBonesPerVertex: 4 + minBoneWeight: 0.001 + optimizeBones: 1 + generateMeshLods: 0 + meshLodGenerationFlags: 0 + maximumMeshLod: -1 + meshOptimizationFlags: -1 + indexFormat: 0 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVMarginMethod: 1 + secondaryUVMinLightmapResolution: 40 + secondaryUVMinObjectScale: 1 + secondaryUVPackMargin: 4 + useFileScale: 1 + strictVertexDataChecks: 0 + tangentSpace: + normalSmoothAngle: 60 + normalImportMode: 0 + tangentImportMode: 3 + normalCalculationMode: 4 + legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0 + blendShapeNormalImportMode: 1 + normalSmoothingSource: 0 + referencedClips: [] + importAnimation: 1 + humanDescription: + serializedVersion: 3 + human: [] + skeleton: [] + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + globalScale: 1 + rootMotionBoneName: + hasTranslationDoF: 0 + hasExtraRoot: 0 + skeletonHasParents: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + autoGenerateAvatarMappingIfUnspecified: 1 + animationType: 2 + humanoidOversampling: 1 + avatarSetup: 0 + addHumanoidExtraRootOnlyWhenUsingAvatar: 1 + importBlendShapeDeformPercent: 1 + remapMaterialsIfMaterialImportModeIsNone: 0 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/tests/fixtures/unity-models/Assets/Models/rig.fbx b/tests/fixtures/unity-models/Assets/Models/rig.fbx new file mode 100644 index 0000000..5378bef Binary files /dev/null and b/tests/fixtures/unity-models/Assets/Models/rig.fbx differ diff --git a/tests/fixtures/unity-models/Assets/Models/rig.fbx.meta b/tests/fixtures/unity-models/Assets/Models/rig.fbx.meta new file mode 100644 index 0000000..3b7f2ec --- /dev/null +++ b/tests/fixtures/unity-models/Assets/Models/rig.fbx.meta @@ -0,0 +1,110 @@ +fileFormatVersion: 2 +guid: a3d6abaa1125b2f5e8d2e4f13466b8fd +ModelImporter: + serializedVersion: 24200 + internalIDToNameTable: [] + externalObjects: {} + materials: + materialImportMode: 2 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + removeConstantScaleCurves: 0 + motionNodeName: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + importAnimatedCustomProperties: 0 + importConstraints: 0 + animationCompression: 1 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + extraUserProperties: [] + clipAnimations: [] + isReadable: 0 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + useSRGBMaterialColor: 1 + sortHierarchyByName: 1 + importPhysicalCameras: 1 + importVisibility: 1 + importBlendShapes: 1 + importCameras: 1 + importLights: 1 + nodeNameCollisionStrategy: 1 + fileIdsGeneration: 2 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + keepQuads: 0 + weldVertices: 1 + bakeAxisConversion: 0 + preserveHierarchy: 0 + skinWeightsMode: 0 + maxBonesPerVertex: 4 + minBoneWeight: 0.001 + optimizeBones: 1 + generateMeshLods: 0 + meshLodGenerationFlags: 0 + maximumMeshLod: -1 + meshOptimizationFlags: -1 + indexFormat: 0 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVMarginMethod: 1 + secondaryUVMinLightmapResolution: 40 + secondaryUVMinObjectScale: 1 + secondaryUVPackMargin: 4 + useFileScale: 1 + strictVertexDataChecks: 0 + tangentSpace: + normalSmoothAngle: 60 + normalImportMode: 0 + tangentImportMode: 3 + normalCalculationMode: 4 + legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0 + blendShapeNormalImportMode: 1 + normalSmoothingSource: 0 + referencedClips: [] + importAnimation: 1 + humanDescription: + serializedVersion: 3 + human: [] + skeleton: [] + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + globalScale: 1 + rootMotionBoneName: + hasTranslationDoF: 0 + hasExtraRoot: 0 + skeletonHasParents: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + autoGenerateAvatarMappingIfUnspecified: 1 + animationType: 2 + humanoidOversampling: 1 + avatarSetup: 0 + addHumanoidExtraRootOnlyWhenUsingAvatar: 1 + importBlendShapeDeformPercent: 1 + remapMaterialsIfMaterialImportModeIsNone: 0 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/tests/fixtures/unity-models/Assets/Models/solo.fbx b/tests/fixtures/unity-models/Assets/Models/solo.fbx new file mode 100644 index 0000000..3040fc8 Binary files /dev/null and b/tests/fixtures/unity-models/Assets/Models/solo.fbx differ diff --git a/tests/fixtures/unity-models/Assets/Models/solo.fbx.meta b/tests/fixtures/unity-models/Assets/Models/solo.fbx.meta new file mode 100644 index 0000000..0ac348b --- /dev/null +++ b/tests/fixtures/unity-models/Assets/Models/solo.fbx.meta @@ -0,0 +1,110 @@ +fileFormatVersion: 2 +guid: 5331126aa366f93aa9d03ddcd13dee94 +ModelImporter: + serializedVersion: 24200 + internalIDToNameTable: [] + externalObjects: {} + materials: + materialImportMode: 2 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + removeConstantScaleCurves: 0 + motionNodeName: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + importAnimatedCustomProperties: 0 + importConstraints: 0 + animationCompression: 1 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + extraUserProperties: [] + clipAnimations: [] + isReadable: 0 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + useSRGBMaterialColor: 1 + sortHierarchyByName: 1 + importPhysicalCameras: 1 + importVisibility: 1 + importBlendShapes: 1 + importCameras: 1 + importLights: 1 + nodeNameCollisionStrategy: 1 + fileIdsGeneration: 2 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + keepQuads: 0 + weldVertices: 1 + bakeAxisConversion: 0 + preserveHierarchy: 0 + skinWeightsMode: 0 + maxBonesPerVertex: 4 + minBoneWeight: 0.001 + optimizeBones: 1 + generateMeshLods: 0 + meshLodGenerationFlags: 0 + maximumMeshLod: -1 + meshOptimizationFlags: -1 + indexFormat: 0 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVMarginMethod: 1 + secondaryUVMinLightmapResolution: 40 + secondaryUVMinObjectScale: 1 + secondaryUVPackMargin: 4 + useFileScale: 1 + strictVertexDataChecks: 0 + tangentSpace: + normalSmoothAngle: 60 + normalImportMode: 0 + tangentImportMode: 3 + normalCalculationMode: 4 + legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0 + blendShapeNormalImportMode: 1 + normalSmoothingSource: 0 + referencedClips: [] + importAnimation: 1 + humanDescription: + serializedVersion: 3 + human: [] + skeleton: [] + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + globalScale: 1 + rootMotionBoneName: + hasTranslationDoF: 0 + hasExtraRoot: 0 + skeletonHasParents: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + autoGenerateAvatarMappingIfUnspecified: 1 + animationType: 2 + humanoidOversampling: 1 + avatarSetup: 0 + addHumanoidExtraRootOnlyWhenUsingAvatar: 1 + importBlendShapeDeformPercent: 1 + remapMaterialsIfMaterialImportModeIsNone: 0 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/tests/fixtures/unity-models/Assets/Scenes/models.unity b/tests/fixtures/unity-models/Assets/Scenes/models.unity new file mode 100644 index 0000000..eaecaf7 --- /dev/null +++ b/tests/fixtures/unity-models/Assets/Scenes/models.unity @@ -0,0 +1,578 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 10 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 13 + m_BakeOnSceneLoad: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 2 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 1 + m_PVRFilteringGaussRadiusAO: 1 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 20201, guid: 0000000000000000f000000000000000, type: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 3 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + buildHeightMesh: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1001 &221815434 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: -8679921383154817045, guid: a3d6abaa1125b2f5e8d2e4f13466b8fd, type: 3} + propertyPath: m_LocalPosition.x + value: 6 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: a3d6abaa1125b2f5e8d2e4f13466b8fd, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: a3d6abaa1125b2f5e8d2e4f13466b8fd, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: a3d6abaa1125b2f5e8d2e4f13466b8fd, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: a3d6abaa1125b2f5e8d2e4f13466b8fd, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: a3d6abaa1125b2f5e8d2e4f13466b8fd, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: a3d6abaa1125b2f5e8d2e4f13466b8fd, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: a3d6abaa1125b2f5e8d2e4f13466b8fd, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: a3d6abaa1125b2f5e8d2e4f13466b8fd, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: a3d6abaa1125b2f5e8d2e4f13466b8fd, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 919132149155446097, guid: a3d6abaa1125b2f5e8d2e4f13466b8fd, type: 3} + propertyPath: m_Name + value: rig + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: + - targetCorrespondingSourceObject: {fileID: 635547659545568360, guid: a3d6abaa1125b2f5e8d2e4f13466b8fd, type: 3} + insertIndex: -1 + addedObject: {fileID: 221815438} + - targetCorrespondingSourceObject: {fileID: -2971590244256713485, guid: a3d6abaa1125b2f5e8d2e4f13466b8fd, type: 3} + insertIndex: -1 + addedObject: {fileID: 221815437} + m_SourcePrefab: {fileID: 100100000, guid: a3d6abaa1125b2f5e8d2e4f13466b8fd, type: 3} +--- !u!1 &221815435 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: -2971590244256713485, guid: a3d6abaa1125b2f5e8d2e4f13466b8fd, type: 3} + m_PrefabInstance: {fileID: 221815434} + m_PrefabAsset: {fileID: 0} +--- !u!1 &221815436 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 635547659545568360, guid: a3d6abaa1125b2f5e8d2e4f13466b8fd, type: 3} + m_PrefabInstance: {fileID: 221815434} + m_PrefabAsset: {fileID: 0} +--- !u!114 &221815437 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 221815435} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a192e0a30d827ba40be5c99d32a83a12, type: 3} + m_Name: + m_EditorClassIdentifier: net.psxsplash.splashedit.Runtime::SplashEdit.RuntimeCode.PSXObjectExporter + isActive: 1 + bitDepth: 8 + luaFile: {fileID: 0} + collisionType: 0 + vertexColorMode: 0 + flatVertexColor: + serializedVersion: 2 + rgba: 4286611584 + smoothNormals: 1 + isPlatform: 0 + uvOffsetMaterial: 0 +--- !u!114 &221815438 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 221815436} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a3b7e2f41c9d4a8e95f6d0c3b2e1a7f4, type: 3} + m_Name: + m_EditorClassIdentifier: net.psxsplash.splashedit.Runtime::SplashEdit.RuntimeCode.PSXSkinnedObjectExporter + AnimationClips: [] + TargetFPS: 15 + IsActive: 1 + LuaFile: {fileID: 0} + BitDepth: 8 + ColorMode: 0 + FlatVertexColor: + serializedVersion: 2 + rgba: 4286611584 + SmoothNormals: 1 +--- !u!1001 &718871217 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: -8679921383154817045, guid: 5331126aa366f93aa9d03ddcd13dee94, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 5331126aa366f93aa9d03ddcd13dee94, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 5331126aa366f93aa9d03ddcd13dee94, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 5331126aa366f93aa9d03ddcd13dee94, type: 3} + propertyPath: m_LocalRotation.w + value: 0.7071067 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 5331126aa366f93aa9d03ddcd13dee94, type: 3} + propertyPath: m_LocalRotation.x + value: -0.7071068 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 5331126aa366f93aa9d03ddcd13dee94, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 5331126aa366f93aa9d03ddcd13dee94, type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 5331126aa366f93aa9d03ddcd13dee94, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 5331126aa366f93aa9d03ddcd13dee94, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 5331126aa366f93aa9d03ddcd13dee94, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 919132149155446097, guid: 5331126aa366f93aa9d03ddcd13dee94, type: 3} + propertyPath: m_Name + value: solo + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: + - targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: 5331126aa366f93aa9d03ddcd13dee94, type: 3} + insertIndex: -1 + addedObject: {fileID: 718871220} + - targetCorrespondingSourceObject: {fileID: -8469990867830010200, guid: 5331126aa366f93aa9d03ddcd13dee94, type: 3} + insertIndex: -1 + addedObject: {fileID: 718871221} + m_SourcePrefab: {fileID: 100100000, guid: 5331126aa366f93aa9d03ddcd13dee94, type: 3} +--- !u!1 &718871218 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 919132149155446097, guid: 5331126aa366f93aa9d03ddcd13dee94, type: 3} + m_PrefabInstance: {fileID: 718871217} + m_PrefabAsset: {fileID: 0} +--- !u!1 &718871219 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: -8469990867830010200, guid: 5331126aa366f93aa9d03ddcd13dee94, type: 3} + m_PrefabInstance: {fileID: 718871217} + m_PrefabAsset: {fileID: 0} +--- !u!114 &718871220 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 718871218} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a192e0a30d827ba40be5c99d32a83a12, type: 3} + m_Name: + m_EditorClassIdentifier: net.psxsplash.splashedit.Runtime::SplashEdit.RuntimeCode.PSXObjectExporter + isActive: 1 + bitDepth: 8 + luaFile: {fileID: 0} + collisionType: 0 + vertexColorMode: 0 + flatVertexColor: + serializedVersion: 2 + rgba: 4286611584 + smoothNormals: 1 + isPlatform: 0 + uvOffsetMaterial: 0 +--- !u!114 &718871221 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 718871219} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a192e0a30d827ba40be5c99d32a83a12, type: 3} + m_Name: + m_EditorClassIdentifier: net.psxsplash.splashedit.Runtime::SplashEdit.RuntimeCode.PSXObjectExporter + isActive: 1 + bitDepth: 8 + luaFile: {fileID: 0} + collisionType: 0 + vertexColorMode: 0 + flatVertexColor: + serializedVersion: 2 + rgba: 4286611584 + smoothNormals: 1 + isPlatform: 0 + uvOffsetMaterial: 0 +--- !u!1001 &1607267918 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: -8679921383154817045, guid: 6a0cb84423ed59b5ba90c6029650e20b, type: 3} + propertyPath: m_LocalPosition.x + value: 3 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 6a0cb84423ed59b5ba90c6029650e20b, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 6a0cb84423ed59b5ba90c6029650e20b, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 6a0cb84423ed59b5ba90c6029650e20b, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 6a0cb84423ed59b5ba90c6029650e20b, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 6a0cb84423ed59b5ba90c6029650e20b, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 6a0cb84423ed59b5ba90c6029650e20b, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 6a0cb84423ed59b5ba90c6029650e20b, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 6a0cb84423ed59b5ba90c6029650e20b, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 6a0cb84423ed59b5ba90c6029650e20b, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 919132149155446097, guid: 6a0cb84423ed59b5ba90c6029650e20b, type: 3} + propertyPath: m_Name + value: multi + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: + - targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: 6a0cb84423ed59b5ba90c6029650e20b, type: 3} + insertIndex: -1 + addedObject: {fileID: 1607267924} + - targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: 6a0cb84423ed59b5ba90c6029650e20b, type: 3} + insertIndex: -1 + addedObject: {fileID: 1607267923} + - targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: 6a0cb84423ed59b5ba90c6029650e20b, type: 3} + insertIndex: -1 + addedObject: {fileID: 1607267922} + - targetCorrespondingSourceObject: {fileID: -1537605290578348017, guid: 6a0cb84423ed59b5ba90c6029650e20b, type: 3} + insertIndex: -1 + addedObject: {fileID: 1607267926} + - targetCorrespondingSourceObject: {fileID: 8934777400606672865, guid: 6a0cb84423ed59b5ba90c6029650e20b, type: 3} + insertIndex: -1 + addedObject: {fileID: 1607267925} + m_SourcePrefab: {fileID: 100100000, guid: 6a0cb84423ed59b5ba90c6029650e20b, type: 3} +--- !u!1 &1607267919 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 919132149155446097, guid: 6a0cb84423ed59b5ba90c6029650e20b, type: 3} + m_PrefabInstance: {fileID: 1607267918} + m_PrefabAsset: {fileID: 0} +--- !u!1 &1607267920 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 8934777400606672865, guid: 6a0cb84423ed59b5ba90c6029650e20b, type: 3} + m_PrefabInstance: {fileID: 1607267918} + m_PrefabAsset: {fileID: 0} +--- !u!1 &1607267921 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: -1537605290578348017, guid: 6a0cb84423ed59b5ba90c6029650e20b, type: 3} + m_PrefabInstance: {fileID: 1607267918} + m_PrefabAsset: {fileID: 0} +--- !u!114 &1607267922 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1607267919} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a192e0a30d827ba40be5c99d32a83a12, type: 3} + m_Name: + m_EditorClassIdentifier: net.psxsplash.splashedit.Runtime::SplashEdit.RuntimeCode.PSXObjectExporter + isActive: 1 + bitDepth: 8 + luaFile: {fileID: 0} + collisionType: 0 + vertexColorMode: 0 + flatVertexColor: + serializedVersion: 2 + rgba: 4286611584 + smoothNormals: 1 + isPlatform: 0 + uvOffsetMaterial: 0 +--- !u!23 &1607267923 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1607267919} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_MaskInteraction: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1607267924 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1607267919} + m_Mesh: {fileID: 0} +--- !u!114 &1607267925 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1607267920} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a192e0a30d827ba40be5c99d32a83a12, type: 3} + m_Name: + m_EditorClassIdentifier: net.psxsplash.splashedit.Runtime::SplashEdit.RuntimeCode.PSXObjectExporter + isActive: 1 + bitDepth: 8 + luaFile: {fileID: 0} + collisionType: 0 + vertexColorMode: 0 + flatVertexColor: + serializedVersion: 2 + rgba: 4286611584 + smoothNormals: 1 + isPlatform: 0 + uvOffsetMaterial: 0 +--- !u!114 &1607267926 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1607267921} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a192e0a30d827ba40be5c99d32a83a12, type: 3} + m_Name: + m_EditorClassIdentifier: net.psxsplash.splashedit.Runtime::SplashEdit.RuntimeCode.PSXObjectExporter + isActive: 1 + bitDepth: 8 + luaFile: {fileID: 0} + collisionType: 0 + vertexColorMode: 0 + flatVertexColor: + serializedVersion: 2 + rgba: 4286611584 + smoothNormals: 1 + isPlatform: 0 + uvOffsetMaterial: 0 +--- !u!1660057539 &9223372036854775807 +SceneRoots: + m_ObjectHideFlags: 0 + m_Roots: + - {fileID: 718871217} + - {fileID: 1607267918} + - {fileID: 221815434} diff --git a/tests/fixtures/unity-models/Assets/Scenes/models.unity.meta b/tests/fixtures/unity-models/Assets/Scenes/models.unity.meta new file mode 100644 index 0000000..f7bf611 --- /dev/null +++ b/tests/fixtures/unity-models/Assets/Scenes/models.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: a33ad2e8bd281a29584aa5facb32c7cd +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: