-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathresults.json
More file actions
105 lines (105 loc) · 35.7 KB
/
results.json
File metadata and controls
105 lines (105 loc) · 35.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
[
{
"task_id": "Fast-64-fast64-689",
"docker_image": "platformnetwork/swe-forge:Fast-64-fast64-689",
"agent_results": {
"turns": [
{
"turn": 1,
"action": {
"thoughts": "{\"thoughts\":\"I\u2019ll inspect the repository and search for Blender post-load handlers and timer usage to locate the code that needs delaying.\",\"commands\":[\"pwd && ls -la && grep -RIn \\\"load_post\\\\|persistent\\\\|app.handlers\\\\|timers.register\\\\|register_timer\\\\|post_load\\\" .\"],\"task_complete\":false}{\"thoughts\":\"I\u2019ll inspect the repository and search for Blender post-load handlers and timer usage to locate the code that needs delaying.\",\"commands\":[\"pwd && ls -la && grep -RIn \\\"load_post\\\\|persistent\\\\|app.handlers\\\\|timers.register\\\\|register_timer\\\\|post_load\\\" .\"],\"task_complete\":false}\n\n{\"thoughts\":\"I\u2019ll inspect the repository and search for Blender post-load handlers and timer usage to locate the code that needs delaying.\",\"commands\":[\"pwd && ls -la && grep -RIn \\\"load_post\\\\|persistent\\\\|app.handlers\\\\|timers.register\\\\|register_timer\\\\|post_load\\\" .\"],\"task_complete\":false}",
"commands": [],
"task_complete": false
},
"outputs": []
},
{
"turn": 2,
"action": {
"thoughts": "Need continue with exploration. I'll run repository searches for load handlers and likely failing code path, then inspect matching files.",
"commands": [
"cd /repo && grep -RIn \"load_post\\|persistent\\|app.handlers\\|timers.register\\|register_timer\\|post_load\" .",
"cd /repo && grep -RIn \"load_pre\\|depsgraph_update_post\\|save_post\\|save_pre\" ."
],
"task_complete": false
},
"outputs": [
"EXIT: 0\nSTDOUT: ./__init__.py:390:@bpy.app.handlers.persistent\n./__init__.py:503: bpy.app.handlers.load_post.append(after_load)\n./__init__.py:539: bpy.app.handlers.load_post.remove(after_load)\n./addon_updater.py:89: self._auto_reload_post_update = False\n./addon_updater.py:171: def auto_reload_post_update(self):\n./addon_updater.py:172: return self._auto_reload_post_update\n./addon_updater.py:174: @auto_reload_post_update.setter\n./addon_updater.py:175: def auto_reload_post_update(self, value):\n./addon_updater.py:177: self._auto_reload_post_update = bool(value)\n./addon_updater.py:179: raise ValueError(\"auto_reload_post_update must be a boolean value\")\n./addon_updater.py:1150: if not self._auto_reload_post_update:\n./fast64_internal/f3d/flipbook.py:4:from bpy.app.handlers import persistent\n./fast64_internal/f3d/flipbook.py:257:@persistent\n./fast64_internal/f3d/flipbook.py:334: bpy.app.handlers.frame_change_pre.append(flipbookAnimHandler)\n./fast64_internal/f3d/flipbook.py:342: bpy.app.handlers.frame_change_pre.remove(flipbookAnimHandler)\n./fast64_internal/f3d/f3d_material.py:51:from bpy.app.handlers import persistent\n./fast64_internal/f3d/f3d_material.py:2434:@persistent\n./fast64_internal/f3d/f3d_material.py:5340: bpy.app.handlers.load_post.append(load_handler)\n./fast64_internal/f3d/f3d_material.py:5345: while load_handler in bpy.app.handlers.load_post:\n./fast64_internal/f3d/f3d_material.py:5346: bpy.app.handlers.load_post.remove(load_handler)\n./fast64_internal/z64/cutscene/preview.py:6:from bpy.app.handlers import persistent\n./fast64_internal/z64/cutscene/preview.py:223:@persistent\n./fast64_internal/z64/cutscene/preview.py:291: bpy.app.handlers.frame_change_pre.append(cutscenePreviewFrameHandler)\n./fast64_internal/z64/cutscene/preview.py:295: if cutscenePreviewFrameHandler in bpy.app.handlers.frame_change_pre:\n./fast64_internal/z64/cutscene/preview.py:296: bpy.app.handlers.frame_change_pre.remove(cutscenePreviewFrameHandler)\n./fast64_internal/z64/cutscene/motion/preview.py:5:from bpy.app.handlers import persistent\n./fast64_internal/z64/cutscene/motion/preview.py:175:@persistent\n./fast64_internal/z64/cutscene/motion/preview.py:215: bpy.app.handlers.frame_change_pre.append(previewFrameHandler)\n./fast64_internal/z64/cutscene/motion/preview.py:219: if previewFrameHandler in bpy.app.handlers.frame_change_pre:\n./fast64_internal/z64/cutscene/motion/preview.py:220: bpy.app.handlers.frame_change_pre.remove(previewFrameHandler)\n./fast64_internal/sm64/sm64_function_map.py:2765: \"803170d4\": \"persistent_pool_clear\",\n./fast64_internal/sm64/sm64_function_map.py:2771: \"8031727c\": \"persistent_pools_init\",\n./fast64_internal/sm64/sm64_function_map.py:7912: \"803170d4\": \"persistent_pool_clear\",\n./fast64_internal/sm64/sm64_function_map.py:7918: \"8031727c\": \"persistent_pools_init\",\n./fast64_internal/sm64/sm64_function_map.py:13057: \"803170d4\": \"persistent_pool_clear\",\n./fast64_internal/sm64/sm64_function_map.py:13063: \"8031727c\": \"persistent_pools_init\",\n./fast64_internal/sm64/sm64_function_map.py:18215: \"803170d4\": \"persistent_pool_clear\",\n./fast64_internal/sm64/sm64_function_map.py:18221: \"8031727c\": \"persistent_pools_init\",\n./fast64_internal/sm64/sm64_function_map.py:23391: \"803170d4\": \"persistent_pool_clear\",\n./fast64_internal/sm64/sm64_function_map.py:23397: \"8031727c\": \"persistent_pools_init\",\n./fast64_internal/sm64/sm64_function_map.py:28575: \"803170d4\": \"persistent_pool_clear\",\n./fast64_internal/sm64/sm64_function_map.py:28581: \"8031727c\": \"persistent_pools_init\",\n./fast64_internal/sm64/sm64_function_map.py:33756: \"803170d4\": \"persistent_pool_clear\",\n./fast64_internal/sm64/sm64_function_map.py:33762: \"8031727c\": \"persistent_pools_init\",\n./fast64_internal/sm64/sm64_function_map.py:38938: \"803170d4\": \"persistent_pool_clear\",\n./fast64_internal/sm64/sm64_function_map.py:38944: \"8031727c\": \"persistent_pools_init\",\n./fast64_internal/sm64/sm64_function_map.py:44119: \"803170d4\": \"persistent_pool_clear\",\n./fast64_internal/sm64/sm64_function_map.py:44125: \"8031727c\": \"persistent_pools_init\",\n./fast64_internal/sm64/sm64_function_map.py:49288: \"803170d4\": \"persistent_pool_clear\",\n./fast64_internal/sm64/sm64_function_map.py:49294: \"8031727c\": \"persistent_pools_init\",\n./fast64_internal/sm64/sm64_function_map.py:54462: \"803170d4\": \"persistent_pool_clear\",\n./fast64_internal/sm64/sm64_function_map.py:54468: \"8031727c\": \"persistent_pools_init\",\n./fast64_internal/sm64/sm64_level_writer.py:264: beginMagic = \"Fast64 begin persistent block\"\n./fast64_internal/sm64/sm64_level_writer.py:265: endMagic = \"Fast64 end persistent block\"\n./fast64_internal/sm64/sm64_level_writer.py:307: self.persistentBlocks = PersistentBlocks.new()\n./fast64_internal/sm64/sm64_level_writer.py:316: def sub_script_to_c(self, root_persistent_block):\n./fast64_internal/sm64/sm64_level_writer.py:321: for line in root_persistent_block.get(PersistentBlocks.scripts, [])\n./fast64_internal/sm64/sm64_level_writer.py:326: result += sub_script.sub_script_to_c(result, root_persistent_block)\n./fast64_internal/sm64/sm64_level_writer.py:352: # persistent block\n./fast64_internal/sm64/sm64_level_writer.py:353: f\"{self.get_persistent_block(PersistentBlocks.scripts)}\\n\",\n./fast64_internal/sm64/sm64_level_writer.py:355: \"\".join([script.sub_script_to_c(self.persistentBlocks) for script in self.sub_scripts]),\n./fast64_internal/sm64/sm64_level_writer.py:365: f\"{self.get_persistent_block(PersistentBlocks.levelCommands, nTabs=1)}\\n\",\n./fast64_internal/sm64/sm64_level_writer.py:377: def get_persistent_block(self, retainType: str, nTabs=0, areaIndex: str = None):\n./fast64_internal/sm64/sm64_level_writer.py:381: lines.extend(self.persistentBlocks[PersistentBlocks.areaCommands].get(areaIndex, []))\n./fast64_internal/sm64/sm64_level_writer.py:383: lines.extend(self.persistentBlocks.get(retainType, []))\n./fast64_internal/sm64/sm64_level_writer.py:616: levelScript.persistentBlocks[curBlock][areaIndex].append(line)\n./fast64_internal/sm64/sm64_level_writer.py:623: levelScript.persistentBlocks[curBlock].append(line)\n./fast64_internal/sm64/sm64_level_writer.py:629: f\"script.c: Found new persistent block ({blockNameMatch.group(1)}) while looking for an end block for {curBlock}\"\n./fast64_internal/sm64/sm64_level_writer.py:808: persistentBlockString = prev_level_script.get_persistent_block(\n./fast64_internal/sm64/sm64_level_writer.py:811: level_data.area_data += area.to_c_script(area_root.enableRoomSwitch, persistentBlockString=persistentBlockString)\n./fast64_internal/sm64/sm64_objects.py:540: def to_c_script(self, includeRooms, persistentBlockString: str = \"\"):\n./fast64_internal/sm64/sm64_objects.py:559: data += f\"{persistentBlockString}\\n\"\n./fast64_internal/sm64/animation/operators.py:7:from bpy.app.handlers import persistent\n./fast64_internal/sm64/animation/operators.py:31:@persistent\n./fast64_internal/sm64/animation/operators.py:379: bpy.app.handlers.frame_change_pre.append(emulate_no_loop)\n./addon_updater_ops.py:28:from bpy.app.handlers import persistent\n./addon_updater_ops.py:582: elif not updater.auto_reload_post_update:\n./addon_updater_ops.py:703:@persistent\n./addon_updater_ops.py:713: if \"scene_update_post\" in dir(bpy.app.handlers):\n./addon_updater_ops.py:714: bpy.app.handlers.scene_update_post.remove(\n./addon_updater_ops.py:717: bpy.app.handlers.depsgraph_update_post.remove(\n./addon_updater_ops.py:726:@persistent\n./addon_updater_ops.py:737: if \"scene_update_post\" in dir(bpy.app.handlers):\n./addon_updater_ops.py:738: bpy.app.handlers.scene_update_post.remove(\n./addon_updater_ops.py:741: bpy.app.handlers.depsgraph_update_post.remove(\n./addon_updater_ops.py:779: if \"scene_update_post\" in dir(bpy.app.handlers): # 2.7x\n./addon_updater_ops.py:780: handlers = bpy.app.handlers.scene_update_post\n./addon_updater_ops.py:782: handlers = bpy.app.handlers.depsgraph_update_post\n./addon_updater_ops.py:788: if \"scene_update_post\" in dir(bpy.app.handlers): # 2.7x\n./addon_updater_ops.py:789: bpy.app.handlers.scene_update_post.append(\n./addon_updater_ops.py:792: bpy.app.handlers.depsgraph_update_post.append(\n./addon_updater_ops.py:801: Only makes sense to use this if \"auto_reload_post_update\" == False,\n./addon_updater_ops.py:815: # function, ie if \"auto_reload_post_update\" == True, skip code.\n./addon_updater_ops.py:920: if not updater.auto_reload_post_update:\n./addon_updater_ops.py:925: if \"scene_update_post\" in dir(bpy.app.handlers): # 2.7x\n./addon_updater_ops.py:926: handlers = bpy.app.handlers.scene_update_post\n./addon_updater_ops.py:928: handlers = bpy.app.handlers.depsgraph_update_post\n./addon_updater_ops.py:934: if \"scene_update_post\" in dir(bpy.app.handlers): # 2.7x\n./addon_updater_ops.py:935: bpy.app.handlers.scene_update_post.append(\n./addon_updater_ops.py:938: bpy.app.handlers.depsgraph_update_post.append(\n./addon_updater_ops.py:958: if not updater.auto_reload_post_update:\n./addon_updater_ops.py:1035: if not updater.auto_reload_post_update:\n./addon_updater_ops.py:1198: if not updater.auto_reload_post_update:\n./addon_updater_ops.py:1569: updater.auto_reload_post_update = False\n\nSTDERR: ",
"EXIT: 0\nSTDOUT: ./addon_updater_ops.py:717: bpy.app.handlers.depsgraph_update_post.remove(\n./addon_updater_ops.py:741: bpy.app.handlers.depsgraph_update_post.remove(\n./addon_updater_ops.py:782: handlers = bpy.app.handlers.depsgraph_update_post\n./addon_updater_ops.py:792: bpy.app.handlers.depsgraph_update_post.append(\n./addon_updater_ops.py:928: handlers = bpy.app.handlers.depsgraph_update_post\n./addon_updater_ops.py:938: bpy.app.handlers.depsgraph_update_post.append(\n\nSTDERR: "
]
},
{
"turn": 3,
"action": {
"thoughts": "The likely target is __init__.py after_load or f3d_material load_handler. I\u2019ll inspect those sections to see what should be deferred via bpy.app.timers.register.",
"commands": [
"cd /repo && sed -n '360,560p' __init__.py",
"cd /repo && sed -n '2410,2465p' fast64_internal/f3d/f3d_material.py",
"cd /repo && sed -n '5315,5360p' fast64_internal/f3d/f3d_material.py"
],
"task_complete": false
},
"outputs": [
"EXIT: 0\nSTDOUT: OOT_Properties.upgrade_changed_props()\n MK64_Properties.upgrade_changed_props()\n SM64_ObjectProperties.upgrade_changed_props()\n SM64_BoneProperties.upgrade_changed_props()\n OOT_ObjectProperties.upgrade_changed_props()\n for scene in bpy.data.scenes:\n settings: Fast64Settings_Properties = scene.fast64.settings\n if settings.internal_game_update_ver != 1:\n set_game_defaults(scene, False)\n settings.internal_game_update_ver = 1\n if scene.get(\"decomp_compatible\", False):\n scene.gameEditorMode = \"Homebrew\"\n del scene[\"decomp_compatible\"]\n\n settings = scene.fast64.renderSettings\n light0Color = settings.pop(\"lightColor\", None)\n if light0Color is not None:\n settings.light0Color = light0Color\n light0Direction = settings.pop(\"lightDirection\", None)\n if light0Direction is not None:\n settings.light0Direction = light0Direction\n\n\ndef upgrade_scene_props_node():\n \"\"\"update f3d materials with SceneProperties node\"\"\"\n has_old_f3d_mats = any(mat.is_f3d and mat.mat_ver < F3D_MAT_CUR_VERSION for mat in bpy.data.materials)\n if has_old_f3d_mats:\n bpy.ops.dialog.upgrade_f3d_materials(\"INVOKE_DEFAULT\")\n\n\n@bpy.app.handlers.persistent\ndef after_load(_a, _b):\n game_data.update(bpy.context.scene.gameEditorMode)\n\n settings = bpy.context.scene.fast64.settings\n if any(mat.is_f3d for mat in bpy.data.materials):\n check_or_ask_color_management(bpy.context)\n if not settings.internal_fixed_4_2 and bpy.app.version >= (4, 2, 0):\n upgrade_f3d_version_all_meshes()\n if bpy.app.version >= (4, 2, 0):\n settings.internal_fixed_4_2 = True\n upgrade_changed_props()\n upgrade_scene_props_node()\n resync_scene_props()\n try:\n if settings.repo_settings_path:\n load_repo_settings(bpy.context.scene, abspath(settings.repo_settings_path), True)\n except Exception as exc:\n print(exc)\n\n\ndef set_game_defaults(scene: bpy.types.Scene, set_ucode=True):\n world_defaults = None\n if scene.gameEditorMode == \"SM64\":\n f3d_type = \"F3D\"\n world_defaults = sm64_world_defaults\n elif scene.gameEditorMode == \"MK64\":\n f3d_type = \"F3DEX\"\n world_defaults = mk64_world_defaults\n elif scene.gameEditorMode in {\"OOT\", \"MM\"}:\n f3d_type = \"F3DEX2/LX2\"\n world_defaults = oot_world_defaults\n elif scene.gameEditorMode == \"MK64\":\n f3d_type = \"F3DEX/LX\"\n elif scene.gameEditorMode == \"Homebrew\":\n f3d_type = \"F3D\"\n world_defaults = {} # This will set some pretty bad defaults, but trust the user\n if set_ucode:\n scene.f3d_type = f3d_type\n if scene.world is not None:\n scene.world.rdp_defaults.from_dict(world_defaults)\n\n\ndef gameEditorUpdate(scene: bpy.types.Scene, _context):\n game_data.update(scene.gameEditorMode)\n set_game_defaults(scene)\n\n\n# called on add-on enabling\n# register operators and panels here\n# append menu layout drawing function to an existing window\ndef register():\n if bpy.app.version < (3, 2, 0):\n msg = \"\\n\".join(\n (\n \"This version of Fast64 does not support Blender 3.1.x and earlier Blender versions.\",\n \"Your Blender version is: \" + \".\".join(str(i) for i in bpy.app.version),\n \"Please upgrade Blender to 3.2.0 or above.\",\n )\n )\n print(msg)\n unsupported_exc = Exception(\"\\n\\n\" + msg)\n raise unsupported_exc\n\n # Register addon updater first,\n # this way if a broken version fails to register the user can still pick another version.\n register_class(ExampleAddonPreferences)\n addon_updater_ops.register(bl_info)\n\n register_class(Matrix4x4Property)\n initOOTActorProperties()\n utility_anim_register()\n mat_register()\n bsdf_conv_register()\n sm64_register(True)\n oot_register(True)\n mk64_register(True)\n\n gltf_extension_register()\n\n repo_settings_operators_register()\n\n for cls in classes:\n register_class(cls)\n\n bsdf_conv_panel_regsiter()\n f3d_writer_register()\n flipbook_register()\n f3d_parser_register()\n op_largetexture_register()\n\n # ROM\n\n bpy.types.Scene.ignoreTextureRestrictions = bpy.props.BoolProperty(name=\"Ignore Texture Restrictions\")\n bpy.types.Scene.fullTraceback = bpy.props.BoolProperty(name=\"Show Full Error Traceback\", default=False)\n bpy.types.Scene.gameEditorMode = bpy.props.EnumProperty(\n name=\"Game\", default=\"SM64\", items=gameEditorEnum, update=gameEditorUpdate\n )\n bpy.types.Scene.saveTextures = bpy.props.BoolProperty(name=\"Save Textures As PNGs (Breaks CI Textures)\")\n bpy.types.Scene.exportHiddenGeometry = bpy.props.BoolProperty(name=\"Export Hidden Geometry\", default=True)\n bpy.types.Scene.exportInlineF3D = bpy.props.BoolProperty(\n name=\"Bleed and Inline Material Exports\",\n description=\"Inlines and bleeds materials in a single mesh. GeoLayout + Armature exports bleed over entire model\",\n default=False,\n )\n bpy.types.Scene.blenderF3DScale = bpy.props.FloatProperty(\n name=\"F3D Blender Scale\", default=100, update=on_update_render_settings\n )\n\n bpy.types.Scene.fast64 = bpy.props.PointerProperty(type=Fast64_Properties, name=\"Fast64 Properties\")\n bpy.types.Bone.fast64 = bpy.props.PointerProperty(type=Fast64_BoneProperties, name=\"Fast64 Bone Properties\")\n bpy.types.Object.fast64 = bpy.props.PointerProperty(type=Fast64_ObjectProperties, name=\"Fast64 Object Properties\")\n bpy.types.Action.fast64 = bpy.props.PointerProperty(type=Fast64_ActionProperties, name=\"Fast64 Action Properties\")\n bpy.app.handlers.load_post.append(after_load)\n\n\n# called on add-on disabling\ndef unregister():\n utility_anim_unregister()\n op_largetexture_unregister()\n flipbook_unregister()\n f3d_writer_unregister()\n f3d_parser_unregister()\n sm64_unregister(True)\n oot_unregister(True)\n mk64_unregister(True)\n mat_unregister()\n gltf_extension_unregister()\n bsdf_conv_unregister()\n bsdf_conv_panel_unregsiter()\n unregister_class(Matrix4x4Property)\n\n del bpy.types.Scene.fullTraceback\n del bpy.types.Scene.ignoreTextureRestrictions\n del bpy.types.Scene.saveTextures\n del bpy.types.Scene.gameEditorMode\n del bpy.types.Scene.exportHiddenGeometry\n del bpy.types.Scene.blenderF3DScale\n\n del bpy.types.Scene.fast64\n del bpy.types.Bone.fast64\n del bpy.types.Object.fast64\n del bpy.types.Action.fast64\n\n repo_settings_operators_unregister()\n\n for cls in classes:\n unregister_class(cls)\n\n bpy.app.handlers.load_post.remove(after_load)\n\n addon_updater_ops.unregister()\n unregister_class(ExampleAddonPreferences)\n\nSTDERR: ",
"EXIT: 0\nSTDOUT: \ndef material_apply_preset(material, filepath):\n material.f3d_update_flag = True\n with bpy.context.temp_override(material=material):\n bpy.ops.script.execute_preset(filepath=filepath, menu_idname=\"MATERIAL_MT_f3d_presets\")\n\n # Since the material preset is executed under f3d_update_flag,\n # it setting the rendermode presets does not propagate to the individual\n # rendermode values.\n # So manually call the function to propagate the preset.\n # Also that function will set props, which results in the material preset name\n # being set to Custom (as if changed by the user).\n # So save the preset name and restore it after the rendermode propagation.\n savedPresetName = material.f3d_mat.presetName\n rendermode_preset_to_advanced(material)\n material.f3d_mat.presetName = savedPresetName\n\n material.f3d_update_flag = False\n\n\ndef has_f3d_nodes(material: Material):\n return \"Material Output F3D\" in material.node_tree.nodes\n\n\n@persistent\ndef load_handler(dummy):\n logger.info(\"Checking for base F3D material library.\")\n for lib in bpy.data.libraries:\n lib_path = bpy.path.abspath(lib.filepath)\n\n # detect if this is one your addon's libraries here\n if \"f3d_material_library.blend\" in lib_path:\n addon_dir = os.path.dirname(os.path.abspath(__file__))\n new_lib_path = os.path.join(addon_dir, \"f3d_material_library.blend\")\n\n if lib_path != new_lib_path:\n logger.info(\"Reloading the library: %s : %s => %s\" % (lib.name, lib_path, new_lib_path))\n\n lib.filepath = new_lib_path\n lib.reload()\n bpy.context.scene[\"f3d_lib_dir\"] = None # force node reload!\n link_f3d_material_library()\n\n for mat in bpy.data.materials:\n if mat is not None and mat.use_nodes and mat.is_f3d:\n rendermode_preset_to_advanced(mat)\n\n\nSCENE_PROPERTIES_VERSION = 2\n\n\ndef createOrUpdateSceneProperties():\n group = bpy.data.node_groups.get(\"SceneProperties\")\n upgrade_group = bool(group and group.get(\"version\", -1) < SCENE_PROPERTIES_VERSION)\n\n if group and not upgrade_group:\n\nSTDERR: ",
"EXIT: 0\nSTDOUT: Material.f3d_update_flag = bpy.props.BoolProperty()\n Material.f3d_mat = bpy.props.PointerProperty(type=F3DMaterialProperty)\n Material.menu_tab = bpy.props.EnumProperty(items=menu_items_enum)\n\n Scene.f3dUserPresetsOnly = bpy.props.BoolProperty(name=\"User Presets Only\")\n Scene.f3d_simple = bpy.props.BoolProperty(name=\"Display Simple\", default=True)\n\n Object.use_f3d_culling = bpy.props.BoolProperty(\n name=\"Use Culling\", description=\"F3DEX: Adds culling vertices\", default=True\n )\n Object.ignore_render = bpy.props.BoolProperty(name=\"Ignore Render\")\n Object.ignore_collision = bpy.props.BoolProperty(name=\"Ignore Collision\")\n Object.bleed_independently = bpy.props.BoolProperty(\n name=\"Bleed Independently\",\n description=\"While bleeding, this object will not inherit properties from previously drawn meshes in the drawing graph\",\n )\n Object.f3d_lod_z = bpy.props.IntProperty(\n name=\"F3D LOD Z\",\n min=1,\n default=10,\n )\n Object.f3d_lod_always_render_farthest = bpy.props.BoolProperty(name=\"Always Render Farthest LOD\")\n Object.is_occlusion_planes = bpy.props.BoolProperty(name=\"Is Occlusion Planes\")\n\n VIEW3D_HT_header.append(draw_f3d_render_settings)\n bpy.app.handlers.load_post.append(load_handler)\n\n\ndef mat_unregister():\n VIEW3D_HT_header.remove(draw_f3d_render_settings)\n while load_handler in bpy.app.handlers.load_post:\n bpy.app.handlers.load_post.remove(load_handler)\n\n del Material.menu_tab\n del Material.f3d_mat\n del Material.is_f3d\n del Material.mat_ver\n del Material.f3d_update_flag\n del Scene.f3d_simple\n del Object.ignore_render\n del Object.ignore_collision\n del Object.bleed_independently\n del Object.use_f3d_culling\n del Scene.f3dUserPresetsOnly\n del Object.f3d_lod_z\n del Object.f3d_lod_always_render_farthest\n\nSTDERR: "
]
},
{
"turn": 4,
"action": {
"thoughts": "Need determine issue and implement delayed post-load via timer. The main after_load directly uses bpy.context.scene and operators; likely too early after load. I'll inspect top imports and maybe any existing timer patterns, then patch after_load to schedule real work on a timer with safe signature. Also likely unregister should remove only if present.",
"commands": [
"cd /repo && sed -n '1,120p' __init__.py",
"cd /repo && grep -RIn \"timers.register\\|is_registered\" ."
],
"task_complete": false
},
"outputs": [
"EXIT: 0\nSTDOUT: import bpy\n\nfrom bpy.utils import register_class, unregister_class\nfrom bpy.path import abspath\n\nfrom . import addon_updater_ops\n\nfrom .fast64_internal.game_data import game_data\nfrom .fast64_internal.utility import prop_split, multilineLabel, set_prop_if_in_data, Matrix4x4Property\n\nfrom .fast64_internal.repo_settings import (\n draw_repo_settings,\n load_repo_settings,\n repo_settings_operators_register,\n repo_settings_operators_unregister,\n)\n\nfrom .fast64_internal.sm64 import sm64_register, sm64_unregister, SM64_ActionProperty\nfrom .fast64_internal.sm64.sm64_constants import sm64_world_defaults\nfrom .fast64_internal.sm64.settings.properties import SM64_Properties\nfrom .fast64_internal.sm64.sm64_geolayout_bone import SM64_BoneProperties\nfrom .fast64_internal.sm64.sm64_objects import SM64_ObjectProperties\n\nfrom .fast64_internal.z64 import OOT_Properties, oot_register, oot_unregister\nfrom .fast64_internal.z64.constants import oot_world_defaults\nfrom .fast64_internal.z64.props_panel_main import OOT_ObjectProperties\nfrom .fast64_internal.z64.actor.properties import initOOTActorProperties\nfrom .fast64_internal.utility_anim import utility_anim_register, utility_anim_unregister, ArmatureApplyWithMeshOperator\n\nfrom .fast64_internal.mk64 import MK64_Properties, mk64_register, mk64_unregister\nfrom .fast64_internal.mk64.mk64_constants import mk64_world_defaults\n\nfrom .fast64_internal.f3d.f3d_gbi import get_F3D_GBI\nfrom .fast64_internal.f3d.f3d_material import (\n F3D_MAT_CUR_VERSION,\n mat_register,\n mat_unregister,\n check_or_ask_color_management,\n)\nfrom .fast64_internal.f3d.f3d_writer import f3d_writer_register, f3d_writer_unregister\nfrom .fast64_internal.f3d.f3d_parser import f3d_parser_register, f3d_parser_unregister\nfrom .fast64_internal.f3d.flipbook import flipbook_register, flipbook_unregister\nfrom .fast64_internal.f3d.op_largetexture import op_largetexture_register, op_largetexture_unregister, ui_oplargetexture\n\nfrom .fast64_internal.f3d_material_converter import (\n MatUpdateConvert,\n upgrade_f3d_version_all_meshes,\n bsdf_conv_register,\n bsdf_conv_unregister,\n bsdf_conv_panel_regsiter,\n bsdf_conv_panel_unregsiter,\n)\n\nfrom .fast64_internal.render_settings import (\n Fast64RenderSettings_Properties,\n ManualUpdatePreviewOperator,\n resync_scene_props,\n on_update_render_settings,\n)\n\nfrom .fast64_internal.gltf_extension import (\n glTF2ExportUserExtension, # Import these so they are visible to the glTF add-on\n glTF2ImportUserExtension,\n glTF2_pre_export_callback,\n Fast64GlTFSettings,\n gltf_extension_register,\n gltf_extension_unregister,\n)\n\n# info about add on\nbl_info = {\n \"name\": \"Fast64\",\n \"version\": (2, 5, 3),\n \"author\": \"kurethedead\",\n \"location\": \"3DView\",\n \"description\": \"Plugin for exporting F3D display lists and other game data related to Nintendo 64 games.\",\n \"category\": \"Import-Export\",\n \"blender\": (3, 2, 0),\n}\n\ngameEditorEnum = (\n (\"SM64\", \"SM64\", \"Super Mario 64\", 0),\n (\"OOT\", \"OOT\", \"Ocarina Of Time\", 1),\n # (\"MM\", \"MM\", \"Majora's Mask\", 4),\n (\"MK64\", \"MK64\", \"Mario Kart 64\", 3),\n (\"Homebrew\", \"Homebrew\", \"Homebrew\", 2),\n)\n\n\nclass F3D_GlobalSettingsPanel(bpy.types.Panel):\n bl_idname = \"F3D_PT_global_settings\"\n bl_label = \"F3D Global Settings\"\n bl_space_type = \"VIEW_3D\"\n bl_region_type = \"UI\"\n bl_category = \"Fast64\"\n\n @classmethod\n def poll(cls, context):\n return True\n\n # called every frame\n def draw(self, context):\n col = self.layout.column()\n col.scale_y = 1.1 # extra padding\n\n col.prop(context.scene, \"f3d_simple\", text=\"Simple Material UI\")\n col.separator()\n\n col.label(text=\"Saved to Repo Settings file\", icon=\"PROPERTIES\")\n prop_split(col, context.scene, \"f3d_type\", \"Microcode\")\n gbi = get_F3D_GBI()\n\n if context.scene.f3d_type in {\"F3DEX3\", \"T3D\"}:\n prop_split(col, context.scene, \"packed_normals_algorithm\", \"Packed normals alg\")\n col.prop(context.scene, \"saveTextures\")\n col.prop(context.scene, \"exportInlineF3D\", text=\"Bleed and Inline Material Exports\")\n if context.scene.exportInlineF3D:\n multilineLabel(\n col.box(),\n \"While inlining, all meshes will be restored to world default values.\\n You can configure these values in the world properties tab.\",\n\nSTDERR: ",
"EXIT: 1\nSTDOUT: \nSTDERR: "
]
},
{
"turn": 5,
"action": {
"thoughts": "No timer usage found. I'll implement a minimal delayed load pattern in __init__.py: move current after_load body into a helper called by bpy.app.timers.register after a short delay, guard against missing scene/context by retrying, and avoid duplicate registrations. Then inspect diff.",
"commands": [
"cd /repo && python - <<'PY'\nfrom pathlib import Path\npath = Path('__init__.py')\ntext = path.read_text()\nold = '''@bpy.app.handlers.persistent\ndef after_load(_a, _b):\n game_data.update(bpy.context.scene.gameEditorMode)\n\n settings = bpy.context.scene.fast64.settings\n if any(mat.is_f3d for mat in bpy.data.materials):\n check_or_ask_color_management(bpy.context)\n if not settings.internal_fixed_4_2 and bpy.app.version >= (4, 2, 0):\n upgrade_f3d_version_all_meshes()\n if bpy.app.version >= (4, 2, 0):\n settings.internal_fixed_4_2 = True\n upgrade_changed_props()\n upgrade_scene_props_node()\n resync_scene_props()\n try:\n if settings.repo_settings_path:\n load_repo_settings(bpy.context.scene, abspath(settings.repo_settings_path), True)\n except Exception as exc:\n print(exc)\n'''\nnew = '''def _run_after_load():\n scene = bpy.context.scene\n if scene is None:\n return 0.1\n\n game_data.update(scene.gameEditorMode)\n\n settings = scene.fast64.settings\n if any(mat.is_f3d for mat in bpy.data.materials):\n check_or_ask_color_management(bpy.context)\n if not settings.internal_fixed_4_2 and bpy.app.version >= (4, 2, 0):\n upgrade_f3d_version_all_meshes()\n if bpy.app.version >= (4, 2, 0):\n settings.internal_fixed_4_2 = True\n upgrade_changed_props()\n upgrade_scene_props_node()\n resync_scene_props()\n try:\n if settings.repo_settings_path:\n load_repo_settings(scene, abspath(settings.repo_settings_path), True)\n except Exception as exc:\n print(exc)\n\n return None\n\n\n@bpy.app.handlers.persistent\ndef after_load(_a, _b):\n if bpy.app.timers.is_registered(_run_after_load):\n bpy.app.timers.unregister(_run_after_load)\n bpy.app.timers.register(_run_after_load, first_interval=0.1)\n'''\nif old not in text:\n raise SystemExit('target block not found')\npath.write_text(text.replace(old, new))\nPY\nsed -n '384,435p' /repo/__init__.py",
"cd /repo && git diff -- __init__.py"
],
"task_complete": false
},
"outputs": [
"EXIT: 0\nSTDOUT: \"\"\"update f3d materials with SceneProperties node\"\"\"\n has_old_f3d_mats = any(mat.is_f3d and mat.mat_ver < F3D_MAT_CUR_VERSION for mat in bpy.data.materials)\n if has_old_f3d_mats:\n bpy.ops.dialog.upgrade_f3d_materials(\"INVOKE_DEFAULT\")\n\n\ndef _run_after_load():\n scene = bpy.context.scene\n if scene is None:\n return 0.1\n\n game_data.update(scene.gameEditorMode)\n\n settings = scene.fast64.settings\n if any(mat.is_f3d for mat in bpy.data.materials):\n check_or_ask_color_management(bpy.context)\n if not settings.internal_fixed_4_2 and bpy.app.version >= (4, 2, 0):\n upgrade_f3d_version_all_meshes()\n if bpy.app.version >= (4, 2, 0):\n settings.internal_fixed_4_2 = True\n upgrade_changed_props()\n upgrade_scene_props_node()\n resync_scene_props()\n try:\n if settings.repo_settings_path:\n load_repo_settings(scene, abspath(settings.repo_settings_path), True)\n except Exception as exc:\n print(exc)\n\n return None\n\n\n@bpy.app.handlers.persistent\ndef after_load(_a, _b):\n if bpy.app.timers.is_registered(_run_after_load):\n bpy.app.timers.unregister(_run_after_load)\n bpy.app.timers.register(_run_after_load, first_interval=0.1)\n\n\ndef set_game_defaults(scene: bpy.types.Scene, set_ucode=True):\n world_defaults = None\n if scene.gameEditorMode == \"SM64\":\n f3d_type = \"F3D\"\n world_defaults = sm64_world_defaults\n elif scene.gameEditorMode == \"MK64\":\n f3d_type = \"F3DEX\"\n world_defaults = mk64_world_defaults\n elif scene.gameEditorMode in {\"OOT\", \"MM\"}:\n f3d_type = \"F3DEX2/LX2\"\n world_defaults = oot_world_defaults\n elif scene.gameEditorMode == \"MK64\":\n f3d_type = \"F3DEX/LX\"\n\nSTDERR: ",
"EXIT: 0\nSTDOUT: diff --git a/__init__.py b/__init__.py\nindex 6413282..6eec00b 100644\n--- a/__init__.py\n+++ b/__init__.py\n@@ -387,11 +387,14 @@ def upgrade_scene_props_node():\n bpy.ops.dialog.upgrade_f3d_materials(\"INVOKE_DEFAULT\")\n \n \n-@bpy.app.handlers.persistent\n-def after_load(_a, _b):\n- game_data.update(bpy.context.scene.gameEditorMode)\n+def _run_after_load():\n+ scene = bpy.context.scene\n+ if scene is None:\n+ return 0.1\n \n- settings = bpy.context.scene.fast64.settings\n+ game_data.update(scene.gameEditorMode)\n+\n+ settings = scene.fast64.settings\n if any(mat.is_f3d for mat in bpy.data.materials):\n check_or_ask_color_management(bpy.context)\n if not settings.internal_fixed_4_2 and bpy.app.version >= (4, 2, 0):\n@@ -403,10 +406,19 @@ def after_load(_a, _b):\n resync_scene_props()\n try:\n if settings.repo_settings_path:\n- load_repo_settings(bpy.context.scene, abspath(settings.repo_settings_path), True)\n+ load_repo_settings(scene, abspath(settings.repo_settings_path), True)\n except Exception as exc:\n print(exc)\n \n+ return None\n+\n+\n+@bpy.app.handlers.persistent\n+def after_load(_a, _b):\n+ if bpy.app.timers.is_registered(_run_after_load):\n+ bpy.app.timers.unregister(_run_after_load)\n+ bpy.app.timers.register(_run_after_load, first_interval=0.1)\n+\n \n def set_game_defaults(scene: bpy.types.Scene, set_ucode=True):\n world_defaults = None\n\nSTDERR: "
]
},
{
"turn": 6,
"action": {
"thoughts": "The requested fix is implemented minimally: the load_post handler now defers its work through a Blender timer, with a retry if scene is not yet ready and duplicate timer prevention. No further changes seem necessary for the specific issue.",
"commands": [],
"task_complete": true
},
"outputs": []
}
],
"final_patch": null,
"error": null
},
"verification": {
"fail_to_pass_results": [
{
"command": "python -m unittest tests/test_after_load_timer.py",
"exit_code": 1,
"success": false,
"output": ""
}
],
"pass_to_pass_results": [],
"all_passed": false
},
"success": false
}
]