From a4e010a738995bb086e87d0321f4e6d111cbb571 Mon Sep 17 00:00:00 2001 From: kurethedead Date: Sat, 28 Dec 2019 10:07:14 -0800 Subject: [PATCH] You can now skin scross switch nodes for the first option, which will work with material/draw layer overrides. Fixed geolayout import bugs. --- fast64_internal/f3d_writer.py | 2 +- fast64_internal/sm64_geolayout_parser.py | 20 ++++++++++++-------- fast64_internal/sm64_geolayout_writer.py | 24 ++++++++++++++---------- 3 files changed, 27 insertions(+), 19 deletions(-) diff --git a/fast64_internal/f3d_writer.py b/fast64_internal/f3d_writer.py index d53da84..c6d66ef 100644 --- a/fast64_internal/f3d_writer.py +++ b/fast64_internal/f3d_writer.py @@ -275,7 +275,7 @@ def getBinaryBank0F3DData(fModel, RAMAddr, exportRange): def checkForF3DMaterial(obj): if len(obj.material_slots) == 0: - raise ValueError(obj.name + " has no Fast3D material.") + raise ValueError(obj.name + " has no Fast3D material. Make sure to add a Fast3D material to it.") for materialSlot in obj.material_slots: if materialSlot.material is None or \ not materialSlot.material.is_f3d: diff --git a/fast64_internal/sm64_geolayout_parser.py b/fast64_internal/sm64_geolayout_parser.py index f3f7a4d..3908701 100644 --- a/fast64_internal/sm64_geolayout_parser.py +++ b/fast64_internal/sm64_geolayout_parser.py @@ -618,8 +618,9 @@ def parseDL(romfile, currentAddress, currentTransform, bMesh, obj, armatureObj, currentTransform, True, command, segmentData, bMesh, obj, nodeIndex, 'DisplayList', vertexBuffer, f3dType, isHWv1) - bone = armatureObj.data.bones[boneName] - bone.draw_layer = str(drawLayer) + if armatureObj is not None: + bone = armatureObj.data.bones[boneName] + bone.draw_layer = str(drawLayer) currentAddress += commandSize return currentAddress @@ -857,8 +858,9 @@ def parseTranslate(romfile, currentAddress, finalTransform, loadDL, command, segmentData, bMesh, obj, nodeIndex, 'Translate', vertexBuffer, f3dType, isHWv1) - bone = armatureObj.data.bones[boneName] - bone.draw_layer = str(drawLayer) + if armatureObj is not None: + bone = armatureObj.data.bones[boneName] + bone.draw_layer = str(drawLayer) else: boneName = None @@ -891,8 +893,9 @@ def parseRotate(romfile, currentAddress, finalTransform, loadDL, command, segmentData, bMesh, obj, nodeIndex, 'Rotate', vertexBuffer, f3dType, isHWv1) - bone = armatureObj.data.bones[boneName] - bone.draw_layer = str(drawLayer) + if armatureObj is not None: + bone = armatureObj.data.bones[boneName] + bone.draw_layer = str(drawLayer) else: boneName = None @@ -925,8 +928,9 @@ def parseBillboard(romfile, currentAddress, finalTransform, loadDL, command, segmentData, bMesh, obj, nodeIndex, 'Billboard', vertexBuffer, f3dType, isHWv1) - bone = armatureObj.data.bones[boneName] - bone.draw_layer = str(drawLayer) + if armatureObj is not None: + bone = armatureObj.data.bones[boneName] + bone.draw_layer = str(drawLayer) else: boneName = None diff --git a/fast64_internal/sm64_geolayout_writer.py b/fast64_internal/sm64_geolayout_writer.py index f983408..199bda2 100644 --- a/fast64_internal/sm64_geolayout_writer.py +++ b/fast64_internal/sm64_geolayout_writer.py @@ -418,9 +418,9 @@ def generateSwitchOptions(transformNode, geolayout, geolayoutGraph, prefix): copyNode = optionGeolayout.nodes[0] #i -= 1 - # Assumes first child is a jump node to option 0 + # Assumes first child is a start node, where option 0 is # assumes overrideChild starts with a Start node - option0Nodes = transformNode.children[0].node.geolayout.nodes + option0Nodes = [transformNode.children[0]] if len(option0Nodes) == 1 and \ isinstance(option0Nodes[0].node, StartNode): for startChild in option0Nodes[0].children: @@ -787,18 +787,22 @@ def processBone(fModel, boneName, obj, armatureObj, transformMatrix, else: #print(boneGroup.name if boneGroup is not None else "Offset") if len(bone.children) > 0: - optionGeolayout = \ - geolayoutGraph.addGeolayout( - transformNode, boneName + '_opt0') - geolayoutGraph.addJumpNode(transformNode, geolayout, - optionGeolayout) - optionGeolayout.nodes.append(TransformNode(StartNode())) + #optionGeolayout = \ + # geolayoutGraph.addGeolayout( + # transformNode, boneName + '_opt0') + #geolayoutGraph.addJumpNode(transformNode, geolayout, + # optionGeolayout) + #optionGeolayout.nodes.append(TransformNode(StartNode())) + nextStartNode = TransformNode(StartNode()) + transformNode.children.append(nextStartNode) + nextStartNode.parent = transformNode + childrenNames = sorted([bone.name for bone in bone.children]) for name in childrenNames: processBone(fModel, name, obj, armatureObj, finalTransform, lastTranslateName, lastRotateName, - lastDeformName, optionGeolayout.nodes[0], materialOverrides, - namePrefix, optionGeolayout, + lastDeformName, nextStartNode, materialOverrides, + namePrefix, geolayout, geolayoutGraph, infoDict) #transformNode.children.append(childNode) #childNode.parent = transformNode