diff --git a/fast64_internal/oot/actor/properties.py b/fast64_internal/oot/actor/properties.py index d8df1fdad..e005a45de 100644 --- a/fast64_internal/oot/actor/properties.py +++ b/fast64_internal/oot/actor/properties.py @@ -3,6 +3,7 @@ from bpy.props import EnumProperty, StringProperty, IntProperty, BoolProperty, CollectionProperty, PointerProperty from ...utility import prop_split, label_split from ..oot_constants import ootData, ootEnumCamTransition +from ..oot_upgrade import upgradeActors from ..scene.properties import OOTAlternateSceneHeaderProperty from ..room.properties import OOTAlternateRoomHeaderProperty from .operators import OOT_SearchActorIDEnumOperator @@ -116,6 +117,11 @@ class OOTActorProperty(PropertyGroup): rotOverrideZ: StringProperty(name="Rot Z", default="0") headerSettings: PointerProperty(type=OOTActorHeaderProperty) + @staticmethod + def upgrade_object(obj: Object): + print(f"Processing '{obj.name}'...") + upgradeActors(obj) + def draw_props(self, layout: UILayout, altRoomProp: OOTAlternateRoomHeaderProperty, objName: str): # prop_split(layout, actorProp, 'actorID', 'Actor') actorIDBox = layout.column() @@ -151,15 +157,19 @@ def draw_props(self, layout: UILayout, altRoomProp: OOTAlternateRoomHeaderProper class OOTTransitionActorProperty(PropertyGroup): - roomIndex: IntProperty(min=0) + fromRoom: PointerProperty(type=Object, poll=lambda self, object: self.isRoomEmptyObject(object)) + toRoom: PointerProperty(type=Object, poll=lambda self, object: self.isRoomEmptyObject(object)) cameraTransitionFront: EnumProperty(items=ootEnumCamTransition, default="0x00") cameraTransitionFrontCustom: StringProperty(default="0x00") cameraTransitionBack: EnumProperty(items=ootEnumCamTransition, default="0x00") cameraTransitionBackCustom: StringProperty(default="0x00") - dontTransition: BoolProperty(default=False) + isRoomTransition: BoolProperty(name="Is Room Transition", default=True) actor: PointerProperty(type=OOTActorProperty) + def isRoomEmptyObject(self, obj: Object): + return obj.type == "EMPTY" and obj.ootEmptyType == "Room" + def draw_props( self, layout: UILayout, altSceneProp: OOTAlternateSceneHeaderProperty, roomObj: Object, objName: str ): @@ -181,10 +191,12 @@ def draw_props( if roomObj is None: actorIDBox.label(text="This must be part of a Room empty's hierarchy.", icon="OUTLINER") else: - actorIDBox.prop(self, "dontTransition") - if not self.dontTransition: - label_split(actorIDBox, "Room To Transition From", str(roomObj.ootRoomHeader.roomIndex)) - prop_split(actorIDBox, self, "roomIndex", "Room To Transition To") + actorIDBox.prop(self, "isRoomTransition") + if self.isRoomTransition: + prop_split(actorIDBox, self, "fromRoom", "Room To Transition From") + prop_split(actorIDBox, self, "toRoom", "Room To Transition To") + if self.fromRoom == self.toRoom: + actorIDBox.label(text="Warning: You selected the same room!", icon="ERROR") actorIDBox.label(text='Y+ side of door faces toward the "from" room.', icon="ORIENTATION_NORMAL") drawEnumWithCustom(actorIDBox, self, "cameraTransitionFront", "Camera Transition Front", "") drawEnumWithCustom(actorIDBox, self, "cameraTransitionBack", "Camera Transition Back", "") diff --git a/fast64_internal/oot/oot_level_parser.py b/fast64_internal/oot/oot_level_parser.py index b41752c2c..6a958f5bd 100644 --- a/fast64_internal/oot/oot_level_parser.py +++ b/fast64_internal/oot/oot_level_parser.py @@ -727,12 +727,16 @@ def parseTransActorList( sharedSceneData.transDict[actorHash] = actorObj - if roomIndexFront != 255: - parentObject(roomObjs[roomIndexFront], actorObj) - transActorProp.roomIndex = roomIndexBack + fromRoom = roomObjs[roomIndexFront] + toRoom = roomObjs[roomIndexBack] + if roomIndexFront != roomIndexBack: + parentObject(fromRoom, actorObj) + transActorProp.fromRoom = fromRoom + transActorProp.toRoom = toRoom + transActorProp.isRoomTransition = True else: - parentObject(roomObjs[roomIndexBack], actorObj) - transActorProp.dontTransition = True + transActorProp.isRoomTransition = False + parentObject(toRoom, actorObj) setCustomProperty(transActorProp, "cameraTransitionFront", camFront, ootEnumCamTransition) setCustomProperty(transActorProp, "cameraTransitionBack", camBack, ootEnumCamTransition) diff --git a/fast64_internal/oot/oot_level_writer.py b/fast64_internal/oot/oot_level_writer.py index 797417fa1..f8e6b9e5f 100644 --- a/fast64_internal/oot/oot_level_writer.py +++ b/fast64_internal/oot/oot_level_writer.py @@ -782,12 +782,15 @@ def ootProcessEmpties(scene, room, sceneObj, obj, transformMatrix): elif obj.ootEmptyType == "Transition Actor": transActorProp = obj.ootTransitionActorProperty if transActorProp.actor.actorID != "None": - if transActorProp.dontTransition: - front = (255, getCustomProperty(transActorProp, "cameraTransitionBack")) - back = (room.roomIndex, getCustomProperty(transActorProp, "cameraTransitionFront")) + if transActorProp.isRoomTransition: + if transActorProp.fromRoom is None or transActorProp.toRoom is None: + raise PluginError("ERROR: Missing room empty object assigned to transition.") + fromIndex = transActorProp.fromRoom.ootRoomHeader.roomIndex + toIndex = transActorProp.toRoom.ootRoomHeader.roomIndex else: - front = (room.roomIndex, getCustomProperty(transActorProp, "cameraTransitionFront")) - back = (transActorProp.roomIndex, getCustomProperty(transActorProp, "cameraTransitionBack")) + fromIndex = toIndex = room.roomIndex + front = (fromIndex, getCustomProperty(transActorProp, "cameraTransitionFront")) + back = (toIndex, getCustomProperty(transActorProp, "cameraTransitionBack")) transActorName = ( ootData.actorData.actorsByID[transActorProp.actor.actorID].name.replace( diff --git a/fast64_internal/oot/oot_upgrade.py b/fast64_internal/oot/oot_upgrade.py index a5bdecd43..eb2c283f7 100644 --- a/fast64_internal/oot/oot_upgrade.py +++ b/fast64_internal/oot/oot_upgrade.py @@ -40,6 +40,24 @@ def upgradeRoomHeaders(roomObj: Object, objData: OoT_ObjectData): upgradeObjectList(altHeaders.cutsceneHeaders[i].objectList, objData) +def upgradeActors(actorObj: Object): + if actorObj.ootEmptyType == "Transition Actor": + transActorProp = actorObj.ootTransitionActorProperty + transActorProp.isRoomTransition = actorObj["ootTransitionActorProperty"]["dontTransition"] == False + del actorObj["ootTransitionActorProperty"]["dontTransition"] + + if transActorProp.isRoomTransition: + for obj in bpy.data.objects: + if obj.type == "EMPTY": + if obj.ootEmptyType == "Room": + if actorObj in obj.children_recursive: + transActorProp.fromRoom = obj + + if obj.ootRoomHeader.roomIndex == actorObj["ootTransitionActorProperty"]["roomIndex"]: + transActorProp.toRoom = obj + del actorObj["ootTransitionActorProperty"]["roomIndex"] + + def upgradeCutsceneMotion(csMotionObj: Object): """Main upgrade logic for Cutscene Motion data from zcamedit""" objName = csMotionObj.name diff --git a/fast64_internal/oot/props_panel_main.py b/fast64_internal/oot/props_panel_main.py index ef3d14a8c..9cb22a1a5 100644 --- a/fast64_internal/oot/props_panel_main.py +++ b/fast64_internal/oot/props_panel_main.py @@ -198,6 +198,8 @@ def upgrade_changed_props(): if obj.type == "EMPTY": if obj.ootEmptyType == "Room": OOTObjectProperty.upgrade_object(obj) + if obj.ootEmptyType == "Transition Actor": + OOTActorProperty.upgrade_object(obj) if any(obj.name.startswith(elem) for elem in ["ActionList.", "Point.", "Preview."]): OOTCutsceneMotionProperty.upgrade_object(obj)