Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[OOT] Use Room objects to set which room you come from/go to #243

Merged
merged 7 commits into from
Dec 25, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 18 additions & 6 deletions fast64_internal/oot/actor/properties.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -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
):
Expand All @@ -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", "")
Expand Down
14 changes: 9 additions & 5 deletions fast64_internal/oot/oot_level_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Yanis42 marked this conversation as resolved.
Show resolved Hide resolved
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)
Expand Down
13 changes: 8 additions & 5 deletions fast64_internal/oot/oot_level_writer.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
18 changes: 18 additions & 0 deletions fast64_internal/oot/oot_upgrade.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions fast64_internal/oot/props_panel_main.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down