diff --git a/fast64_internal/sm64/__init__.py b/fast64_internal/sm64/__init__.py index ec7ab79..bc2364a 100644 --- a/fast64_internal/sm64/__init__.py +++ b/fast64_internal/sm64/__init__.py @@ -1,22 +1,100 @@ -from .sm64_f3d_writer import * -from .sm64_geolayout_writer import * -from .sm64_geolayout_parser import * -from .sm64_level_parser import * -from .sm64_constants import * -from .sm64_rom_tweaks import * -from .sm64_anim import * -from .sm64_geolayout_bone import * -from .sm64_collision import * -from .sm64_camera import * -from .sm64_objects import * -from .sm64_level_writer import * -from .sm64_spline import * -from .sm64_f3d_parser import * +import bpy +from bpy.types import Operator, PropertyGroup, Scene +from bpy.props import BoolProperty, StringProperty, EnumProperty, IntProperty, FloatProperty +from bpy.utils import register_class, unregister_class +from bpy.path import abspath from ..panels import SM64_Panel, sm64GoalTypeEnum, sm64GoalImport from ..render_settings import on_update_render_settings +from .sm64_level_parser import parseLevelAtPointer +from .sm64_constants import level_enums, level_pointers, defaultExtendSegment4 + +from ..utility import ( + prop_split, + checkExpanded, + decodeSegmentedAddr, + encodeSegmentedAddr, + raisePluginError, + enumExportType, + enumCompressionFormat, +) + +from .sm64_collision import ( + sm64_col_panel_register, + sm64_col_panel_unregister, + sm64_col_register, + sm64_col_unregister, +) + +from .sm64_geolayout_bone import ( + sm64_bone_panel_register, + sm64_bone_panel_unregister, + sm64_bone_register, + sm64_bone_unregister, +) + +from .sm64_camera import ( + sm64_cam_panel_register, + sm64_cam_panel_unregister, + sm64_cam_register, + sm64_cam_unregister, +) + +from .sm64_objects import ( + sm64_obj_panel_register, + sm64_obj_panel_unregister, + sm64_obj_register, + sm64_obj_unregister, +) + +from .sm64_geolayout_parser import ( + sm64_geo_parser_panel_register, + sm64_geo_parser_panel_unregister, + sm64_geo_parser_register, + sm64_geo_parser_unregister, +) + +from .sm64_geolayout_writer import ( + sm64_geo_writer_panel_register, + sm64_geo_writer_panel_unregister, + sm64_geo_writer_register, + sm64_geo_writer_unregister, +) + +from .sm64_level_writer import ( + sm64_level_panel_register, + sm64_level_panel_unregister, + sm64_level_register, + sm64_level_unregister, +) + +from .sm64_spline import ( + sm64_spline_panel_register, + sm64_spline_panel_unregister, + sm64_spline_register, + sm64_spline_unregister, +) + +from .sm64_f3d_parser import ( + sm64_dl_parser_panel_register, + sm64_dl_parser_panel_unregister, + sm64_dl_parser_register, + sm64_dl_parser_unregister, +) + +from .sm64_f3d_writer import ( + sm64_dl_writer_panel_register, + sm64_dl_writer_panel_unregister, + sm64_dl_writer_register, + sm64_dl_writer_unregister, +) + +from .sm64_anim import ( + sm64_anim_panel_register, + sm64_anim_panel_unregister, + sm64_anim_register, + sm64_anim_unregister, +) -import bpy -from bpy.utils import register_class, unregister_class enumRefreshVer = [ ("Refresh 3", "Refresh 3", "Refresh 3"), @@ -32,21 +110,21 @@ enumRefreshVer = [ ] -class SM64_AddrConv(bpy.types.Operator): +class SM64_AddrConv(Operator): # set bl_ properties bl_idname = "object.addr_conv" bl_label = "Convert Address" bl_options = {"REGISTER", "UNDO", "PRESET"} - segToVirt: bpy.props.BoolProperty() + segToVirt: BoolProperty() def execute(self, context): romfileSrc = None try: address = int(context.scene.convertibleAddr, 16) importRom = context.scene.importRom - romfileSrc = open(bpy.path.abspath(importRom), "rb") - checkExpanded(bpy.path.abspath(importRom)) + romfileSrc = open(abspath(importRom), "rb") + checkExpanded(abspath(importRom)) levelParsed = parseLevelAtPointer(romfileSrc, level_pointers[context.scene.levelConvert]) segmentData = levelParsed.segmentData if self.segToVirt: @@ -133,35 +211,35 @@ def get_legacy_export_type(): return "C" -class SM64_Properties(bpy.types.PropertyGroup): +class SM64_Properties(PropertyGroup): """Global SM64 Scene Properties found under scene.fast64.sm64""" - version: bpy.props.IntProperty(name="SM64_Properties Version", default=0) + version: IntProperty(name="SM64_Properties Version", default=0) cur_version = 1 # version after property migration # UI Selection - showImportingMenus: bpy.props.BoolProperty(name="Show Importing Menus", default=False) - exportType: bpy.props.EnumProperty(items=enumExportType, name="Export Type", default="C") - goal: bpy.props.EnumProperty(items=sm64GoalTypeEnum, name="Export Goal", default="All") + showImportingMenus: BoolProperty(name="Show Importing Menus", default=False) + exportType: EnumProperty(items=enumExportType, name="Export Type", default="C") + goal: EnumProperty(items=sm64GoalTypeEnum, name="Export Goal", default="All") # TODO: Utilize these across all exports # C exporting - # useCustomExportLocation = bpy.props.BoolProperty(name = 'Use Custom Export Path') - # customExportPath: bpy.props.StringProperty(name = 'Custom Export Path', subtype = 'FILE_PATH') - # exportLocation: bpy.props.EnumProperty(items = enumExportHeaderType, name = 'Export Location', default = 'Actor') - # useSelectedObjectName = bpy.props.BoolProperty(name = 'Use Name From Selected Object', default=False) - # exportName: bpy.props.StringProperty(name='Name', default='mario') - # exportGeolayoutName: bpy.props.StringProperty(name='Name', default='mario_geo') + # useCustomExportLocation = BoolProperty(name = 'Use Custom Export Path') + # customExportPath: StringProperty(name = 'Custom Export Path', subtype = 'FILE_PATH') + # exportLocation: EnumProperty(items = enumExportHeaderType, name = 'Export Location', default = 'Actor') + # useSelectedObjectName = BoolProperty(name = 'Use Name From Selected Object', default=False) + # exportName: StringProperty(name='Name', default='mario') + # exportGeolayoutName: StringProperty(name='Name', default='mario_geo') # Actor exports - # exportGroup: bpy.props.StringProperty(name='Group', default='group0') + # exportGroup: StringProperty(name='Group', default='group0') # Level exports - # exportLevelName: bpy.props.StringProperty(name = 'Level', default = 'bob') - # exportLevelOption: bpy.props.EnumProperty(items = enumLevelNames, name = 'Level', default = 'bob') + # exportLevelName: StringProperty(name = 'Level', default = 'bob') + # exportLevelOption: EnumProperty(items = enumLevelNames, name = 'Level', default = 'bob') # Insertable Binary - # exportInsertableBinaryPath: bpy.props.StringProperty(name = 'Filepath', subtype = 'FILE_PATH') + # exportInsertableBinaryPath: StringProperty(name = 'Filepath', subtype = 'FILE_PATH') @staticmethod def upgrade_changed_props(): @@ -235,10 +313,10 @@ def sm64_register(registerPanels): if registerPanels: sm64_panel_register() - bpy.types.Scene.importRom = bpy.props.StringProperty(name="Import ROM", subtype="FILE_PATH") - bpy.types.Scene.exportRom = bpy.props.StringProperty(name="Export ROM", subtype="FILE_PATH") - bpy.types.Scene.outputRom = bpy.props.StringProperty(name="Output ROM", subtype="FILE_PATH") - bpy.types.Scene.extendBank4 = bpy.props.BoolProperty( + Scene.importRom = StringProperty(name="Import ROM", subtype="FILE_PATH") + Scene.exportRom = StringProperty(name="Export ROM", subtype="FILE_PATH") + Scene.outputRom = StringProperty(name="Output ROM", subtype="FILE_PATH") + Scene.extendBank4 = BoolProperty( name="Extend Bank 4 on Export?", default=True, description="Sets bank 4 range to (" @@ -247,19 +325,17 @@ def sm64_register(registerPanels): + hex(defaultExtendSegment4[1]) + ") and copies data from old bank", ) - bpy.types.Scene.convertibleAddr = bpy.props.StringProperty(name="Address") - bpy.types.Scene.levelConvert = bpy.props.EnumProperty(items=level_enums, name="Level", default="IC") - bpy.types.Scene.refreshVer = bpy.props.EnumProperty(items=enumRefreshVer, name="Refresh", default="Refresh 13") - bpy.types.Scene.disableScroll = bpy.props.BoolProperty(name="Disable Scrolling Textures") + Scene.convertibleAddr = StringProperty(name="Address") + Scene.levelConvert = EnumProperty(items=level_enums, name="Level", default="IC") + Scene.refreshVer = EnumProperty(items=enumRefreshVer, name="Refresh", default="Refresh 13") + Scene.disableScroll = BoolProperty(name="Disable Scrolling Textures") - bpy.types.Scene.blenderToSM64Scale = bpy.props.FloatProperty( + Scene.blenderToSM64Scale = FloatProperty( name="Blender To SM64 Scale", default=100, update=on_update_render_settings ) - bpy.types.Scene.decompPath = bpy.props.StringProperty(name="Decomp Folder", subtype="FILE_PATH") + Scene.decompPath = StringProperty(name="Decomp Folder", subtype="FILE_PATH") - bpy.types.Scene.compressionFormat = bpy.props.EnumProperty( - items=enumCompressionFormat, name="Compression", default="mio0" - ) + Scene.compressionFormat = EnumProperty(items=enumCompressionFormat, name="Compression", default="mio0") def sm64_unregister(unregisterPanels): @@ -281,17 +357,17 @@ def sm64_unregister(unregisterPanels): if unregisterPanels: sm64_panel_unregister() - del bpy.types.Scene.importRom - del bpy.types.Scene.exportRom - del bpy.types.Scene.outputRom - del bpy.types.Scene.extendBank4 + del Scene.importRom + del Scene.exportRom + del Scene.outputRom + del Scene.extendBank4 - del bpy.types.Scene.convertibleAddr - del bpy.types.Scene.levelConvert - del bpy.types.Scene.refreshVer + del Scene.convertibleAddr + del Scene.levelConvert + del Scene.refreshVer - del bpy.types.Scene.disableScroll + del Scene.disableScroll - del bpy.types.Scene.blenderToSM64Scale - del bpy.types.Scene.decompPath - del bpy.types.Scene.compressionFormat + del Scene.blenderToSM64Scale + del Scene.decompPath + del Scene.compressionFormat diff --git a/fast64_internal/sm64/parse_function_map.py b/fast64_internal/sm64/parse_function_map.py index e52158c..06b3589 100644 --- a/fast64_internal/sm64/parse_function_map.py +++ b/fast64_internal/sm64/parse_function_map.py @@ -1,4 +1,4 @@ -import re +from re import search refresh_name = 'Refresh 13' function_map_path = './sm64.us.map' @@ -17,10 +17,10 @@ def parse_func_map(): if nextLine[:17] == ' ' * 16 + '0': outfile.write('\t\t"' + nextLine[26:34] + '" : ') searchName = nextLine[34:] - searchResult = re.search(r'\s*(\S*).*', searchName) + searchResult = search(r'\s*(\S*).*', searchName) outfile.write('"' + searchResult.group(1) + '",\n') nextLine = mapfile.readline() outfile.write("\t}\n") mapfile.close() - outfile.close() \ No newline at end of file + outfile.close() diff --git a/fast64_internal/sm64/sm64_anim.py b/fast64_internal/sm64/sm64_anim.py index c392c68..5ecb09b 100644 --- a/fast64_internal/sm64/sm64_anim.py +++ b/fast64_internal/sm64/sm64_anim.py @@ -1,13 +1,49 @@ -import bpy, mathutils, math, re, os, copy, shutil -from .sm64_constants import * +import bpy, os, copy, shutil, mathutils, math +from bpy.utils import register_class, unregister_class +from ..panels import SM64_Panel, sm64GoalImport from .sm64_level_parser import parseLevelAtPointer from .sm64_rom_tweaks import ExtendBank0x04 from .sm64_geolayout_bone import animatableBoneTypes -from math import pi -from bpy.utils import register_class, unregister_class -from ..utility import * -from ..panels import SM64_Panel, sm64GoalImport +from ..utility import ( + CData, + PluginError, + ValueFrameData, + raisePluginError, + encodeSegmentedAddr, + decodeSegmentedAddr, + getExportDir, + toAlnum, + writeIfNotFound, + get64bitAlignedAddr, + writeInsertableFile, + getFrameInterval, + findStartBones, + saveTranslationFrame, + saveQuaternionFrame, + removeTrailingFrames, + applyRotation, + getPathAndLevel, + applyBasicTweaks, + checkExpanded, + tempName, + bytesToHex, + prop_split, + customExportWarning, + decompFolderMessage, + makeWriteInfoBox, + writeBoxExportType, + enumExportHeaderType, +) + +from .sm64_constants import ( + bank0Segment, + insertableBinaryTypes, + level_pointers, + defaultExtendSegment4, + level_enums, + enumLevelNames, +) sm64_anim_types = {"ROTATE", "TRANSLATE"} diff --git a/fast64_internal/sm64/sm64_camera.py b/fast64_internal/sm64/sm64_camera.py index c349ce5..2fdab9f 100644 --- a/fast64_internal/sm64/sm64_camera.py +++ b/fast64_internal/sm64/sm64_camera.py @@ -1,8 +1,19 @@ -import bpy, math, mathutils +import bpy, mathutils from bpy.utils import register_class, unregister_class -from .sm64_geolayout_constants import * -from .sm64_geolayout_classes import * -from ..utility import * +from ..utility import colorTo16bitRGBA, gammaCorrect + +from .sm64_geolayout_classes import ( + TransformNode, + ScreenAreaNode, + ZBufferNode, + OrthoNode, + BackgroundNode, + FrustumNode, + CameraNode, + StartNode, + RenderObjNode, + FunctionNode, +) enumBackgroundType = [ ("OCEAN_SKY", "Ocean Sky", "Ocean Sky"), diff --git a/fast64_internal/sm64/sm64_collision.py b/fast64_internal/sm64/sm64_collision.py index 02bfec0..3d84c96 100644 --- a/fast64_internal/sm64/sm64_collision.py +++ b/fast64_internal/sm64/sm64_collision.py @@ -1,13 +1,40 @@ -from .sm64_constants import * -from .sm64_objects import * +import bpy, shutil, os, math, mathutils from bpy.utils import register_class, unregister_class +from io import BytesIO +from .sm64_constants import level_enums, level_pointers, enumLevelNames, insertableBinaryTypes, defaultExtendSegment4 +from .sm64_objects import SM64_Area, start_process_sm64_objects from .sm64_level_parser import parseLevelAtPointer from .sm64_rom_tweaks import ExtendBank0x04 -import bpy, shutil, os, math -from io import BytesIO -from ..utility import * from ..panels import SM64_Panel +from ..utility import ( + PluginError, + CData, + toAlnum, + raisePluginError, + encodeSegmentedAddr, + get64bitAlignedAddr, + prop_split, + getExportDir, + writeIfNotFound, + deleteIfFound, + duplicateHierarchy, + cleanupDuplicatedObjects, + writeInsertableFile, + applyRotation, + getPathAndLevel, + applyBasicTweaks, + tempName, + checkExpanded, + bytesToHex, + applyRotation, + customExportWarning, + decompFolderMessage, + makeWriteInfoBox, + writeBoxExportType, + enumExportHeaderType, +) + class CollisionVertex: def __init__(self, position): @@ -228,7 +255,7 @@ class SM64ObjectPanel(bpy.types.Panel): bl_space_type = 'PROPERTIES' bl_region_type = 'WINDOW' bl_context = "object" - bl_options = {'HIDE_HEADER'} + bl_options = {'HIDE_HEADER'} @classmethod def poll(cls, context): diff --git a/fast64_internal/sm64/sm64_f3d_parser.py b/fast64_internal/sm64/sm64_f3d_parser.py index 82d3583..5e191d0 100644 --- a/fast64_internal/sm64/sm64_f3d_parser.py +++ b/fast64_internal/sm64/sm64_f3d_parser.py @@ -1,13 +1,27 @@ -import bpy -from ..panels import SM64_Panel, sm64GoalImport -from ..utility import * -from ..f3d.f3d_parser import * +from mathutils import Matrix +from math import radians +from bpy.types import Operator, Scene +from bpy.path import abspath from bpy.utils import register_class, unregister_class +from bpy.ops import object +from bpy.props import StringProperty, EnumProperty, BoolProperty +from ..panels import SM64_Panel, sm64GoalImport +from ..f3d.f3d_parser import F3DtoBlenderObject from .sm64_constants import level_enums, level_pointers from .sm64_level_parser import parseLevelAtPointer +from ..utility import ( + PluginError, + applyRotation, + raisePluginError, + decodeSegmentedAddr, + applyRotation, + checkExpanded, + prop_split, +) -class SM64_ImportDL(bpy.types.Operator): + +class SM64_ImportDL(Operator): # set bl_ properties bl_idname = "object.sm64_import_dl" bl_label = "Import Display List" @@ -24,8 +38,8 @@ class SM64_ImportDL(bpy.types.Operator): raisePluginError(self, e) return {"CANCELLED"} try: - checkExpanded(bpy.path.abspath(context.scene.importRom)) - romfileSrc = open(bpy.path.abspath(context.scene.importRom), "rb") + checkExpanded(abspath(context.scene.importRom)) + romfileSrc = open(abspath(context.scene.importRom), "rb") levelParsed = parseLevelAtPointer(romfileSrc, level_pointers[context.scene.levelDLImport]) segmentData = levelParsed.segmentData start = ( @@ -37,7 +51,7 @@ class SM64_ImportDL(bpy.types.Operator): romfileSrc, start, context.scene, "sm64_mesh", Matrix.Identity(4), segmentData, True ) - applyRotation([readObj], math.radians(-90), "X") + applyRotation([readObj], radians(-90), "X") romfileSrc.close() self.report({"INFO"}, "Generic import succeeded.") @@ -45,7 +59,7 @@ class SM64_ImportDL(bpy.types.Operator): except Exception as e: if context.mode != "OBJECT": - bpy.ops.object.mode_set(mode="OBJECT") + object.mode_set(mode="OBJECT") if romfileSrc is not None: romfileSrc.close() raisePluginError(self, e) @@ -87,15 +101,15 @@ def sm64_dl_parser_register(): for cls in sm64_dl_parser_classes: register_class(cls) - bpy.types.Scene.DLImportStart = bpy.props.StringProperty(name="Start Address", default="A3BE1C") - bpy.types.Scene.levelDLImport = bpy.props.EnumProperty(items=level_enums, name="Level", default="CG") - bpy.types.Scene.isSegmentedAddrDLImport = bpy.props.BoolProperty(name="Is Segmented Address", default=False) + Scene.DLImportStart = StringProperty(name="Start Address", default="A3BE1C") + Scene.levelDLImport = EnumProperty(items=level_enums, name="Level", default="CG") + Scene.isSegmentedAddrDLImport = BoolProperty(name="Is Segmented Address", default=False) def sm64_dl_parser_unregister(): for cls in reversed(sm64_dl_parser_classes): unregister_class(cls) - del bpy.types.Scene.levelDLImport - del bpy.types.Scene.DLImportStart - del bpy.types.Scene.isSegmentedAddrDLImport + del Scene.levelDLImport + del Scene.DLImportStart + del Scene.isSegmentedAddrDLImport diff --git a/fast64_internal/sm64/sm64_f3d_writer.py b/fast64_internal/sm64/sm64_f3d_writer.py index e0e7753..1f9dec9 100644 --- a/fast64_internal/sm64/sm64_f3d_writer.py +++ b/fast64_internal/sm64/sm64_f3d_writer.py @@ -1,12 +1,69 @@ -import shutil, copy, bpy, cProfile, pstats - -from ..panels import SM64_Panel -from ..f3d.f3d_writer import * -from ..f3d.f3d_material import * -from ..f3d.f3d_gbi import FMaterial -from .sm64_texscroll import * -from .sm64_utility import * +import shutil, copy, bpy, re, os +from io import BytesIO +from math import ceil, log, radians +from mathutils import Matrix, Vector from bpy.utils import register_class, unregister_class +from ..panels import SM64_Panel +from ..f3d.f3d_writer import saveTextureIndex, exportF3DCommon +from ..f3d.f3d_material import TextureProperty, tmemUsageUI, all_combiner_uses, ui_procAnim +from .sm64_texscroll import modifyTexScrollFiles, modifyTexScrollHeadersGroup +from .sm64_utility import starSelectWarning +from .sm64_level_parser import parseLevelAtPointer +from .sm64_rom_tweaks import ExtendBank0x04 + +from ..f3d.f3d_gbi import ( + FMaterial, + FModel, + GfxFormatter, + GfxMatWriteMethod, + ScrollMethod, + DLFormat, + SPDisplayList, + GfxList, + GfxListTag, + FTexRect, + DPPipeSync, + DPSetCycleType, + DPSetTexturePersp, + DPSetAlphaCompare, + DPSetBlendColor, + DPSetRenderMode, + SPScisTextureRectangle, + SPTexture, + SPEndDisplayList, + TextureExportSettings, + GFX_SIZE, +) + +from ..utility import ( + CData, + PluginError, + raisePluginError, + prop_split, + encodeSegmentedAddr, + applyRotation, + toAlnum, + checkIfPathExists, + writeIfNotFound, + overwriteData, + getExportDir, + writeMaterialFiles, + writeMaterialHeaders, + get64bitAlignedAddr, + writeInsertableFile, + getPathAndLevel, + applyBasicTweaks, + checkExpanded, + tempName, + getAddressFromRAMAddress, + bytesToHex, + customExportWarning, + decompFolderMessage, + makeWriteInfoBox, + writeBoxExportType, + enumExportHeaderType, +) + from .sm64_constants import ( level_enums, enumLevelNames, @@ -15,8 +72,6 @@ from .sm64_constants import ( bank0Segment, insertableBinaryTypes, ) -from .sm64_level_parser import parseLevelAtPointer -from .sm64_rom_tweaks import ExtendBank0x04 enumHUDExportLocation = [ @@ -277,12 +332,12 @@ def exportTexRectCommon(texProp, f3dType, isHWv1, name, convertTextureData): texProp.S.low = 0 texProp.S.high = texProp.tex.size[0] - 1 - texProp.S.mask = math.ceil(math.log(texProp.tex.size[0], 2) - 0.001) + texProp.S.mask = ceil(log(texProp.tex.size[0], 2) - 0.001) texProp.S.shift = 0 texProp.T.low = 0 texProp.T.high = texProp.tex.size[1] - 1 - texProp.T.mask = math.ceil(math.log(texProp.tex.size[1], 2) - 0.001) + texProp.T.mask = ceil(log(texProp.tex.size[1], 2) - 0.001) texProp.T.shift = 0 fTexRect = FTexRect(f3dType, isHWv1, toAlnum(name), GfxMatWriteMethod.WriteDifferingAndRevert) @@ -572,20 +627,20 @@ class SM64_ExportDL(bpy.types.Operator): # T, R, S = obj.matrix_world.decompose() # objTransform = R.to_matrix().to_4x4() @ \ - # mathutils.Matrix.Diagonal(S).to_4x4() + # Matrix.Diagonal(S).to_4x4() # finalTransform = (blenderToSM64Rotation * \ # (bpy.context.scene.blenderToSM64Scale)).to_4x4() - # finalTransform = mathutils.Matrix.Identity(4) + # finalTransform = Matrix.Identity(4) scaleValue = bpy.context.scene.blenderToSM64Scale - finalTransform = mathutils.Matrix.Diagonal(mathutils.Vector((scaleValue, scaleValue, scaleValue))).to_4x4() + finalTransform = Matrix.Diagonal(Vector((scaleValue, scaleValue, scaleValue))).to_4x4() except Exception as e: raisePluginError(self, e) return {"CANCELLED"} try: - applyRotation([obj], math.radians(90), "X") + applyRotation([obj], radians(90), "X") if context.scene.fast64.sm64.exportType == "C": exportPath, levelName = getPathAndLevel( context.scene.DLCustomExport, @@ -695,13 +750,13 @@ class SM64_ExportDL(bpy.types.Operator): + ").", ) - applyRotation([obj], math.radians(-90), "X") + applyRotation([obj], radians(-90), "X") return {"FINISHED"} # must return a set except Exception as e: if context.mode != "OBJECT": bpy.ops.object.mode_set(mode="OBJECT") - applyRotation([obj], math.radians(-90), "X") + applyRotation([obj], radians(-90), "X") if context.scene.fast64.sm64.exportType == "Binary": if romfileOutput is not None: romfileOutput.close() diff --git a/fast64_internal/sm64/sm64_geolayout_bone.py b/fast64_internal/sm64/sm64_geolayout_bone.py index 948ecba..20b9d6c 100644 --- a/fast64_internal/sm64/sm64_geolayout_bone.py +++ b/fast64_internal/sm64/sm64_geolayout_bone.py @@ -1,8 +1,21 @@ -import bpy +from bpy.ops import object +from bpy.types import Bone, Object, Panel, Operator, Armature, Mesh, Material, PropertyGroup from bpy.utils import register_class, unregister_class +from ..utility import PluginError, prop_split, obj_scale_is_unified +from ..f3d.f3d_material import sm64EnumDrawLayers from .sm64_geolayout_utility import createBoneGroups, addBoneToGroup -from ..utility import prop_split, PluginError -from ..f3d.f3d_material import * + +from bpy.props import ( + StringProperty, + IntProperty, + FloatProperty, + BoolProperty, + PointerProperty, + CollectionProperty, + EnumProperty, + FloatVectorProperty, +) + enumBoneType = [ ("Switch", "Switch (0x0E)", "Switch"), @@ -67,7 +80,7 @@ enumMatOverrideOptions = [ ] -def drawGeoInfo(panel: bpy.types.Panel, bone: bpy.types.Bone): +def drawGeoInfo(panel: Panel, bone: Bone): panel.layout.box().label(text="Geolayout Inspector") if bone is None: @@ -142,7 +155,7 @@ def drawGeoInfo(panel: bpy.types.Panel, bone: bpy.types.Bone): layerInfoBox.label(text="'Ignore' bones are on any layer.") -class GeolayoutBonePanel(bpy.types.Panel): +class GeolayoutBonePanel(Panel): bl_label = "Geolayout Inspector" bl_idname = "BONE_PT_SM64_Geolayout_Inspector" bl_space_type = "PROPERTIES" @@ -158,7 +171,7 @@ class GeolayoutBonePanel(bpy.types.Panel): drawGeoInfo(self, context.bone) -class GeolayoutArmaturePanel(bpy.types.Panel): +class GeolayoutArmaturePanel(Panel): bl_label = "Geolayout Armature Inspector" bl_idname = "OBJECT_PT_SM64_Armature_Geolayout_Inspector" bl_space_type = "PROPERTIES" @@ -171,7 +184,7 @@ class GeolayoutArmaturePanel(bpy.types.Panel): return ( context.scene.gameEditorMode == "SM64" and context.object is not None - and isinstance(context.object.data, bpy.types.Armature) + and isinstance(context.object.data, Armature) ) def draw(self, context): @@ -192,7 +205,7 @@ def drawLayerWarningBox(layout, prop, data): warningBox.label(text="This is moved to material settings in v4+.") -class GeolayoutObjectPanel(bpy.types.Panel): +class GeolayoutObjectPanel(Panel): bl_label = "Object Geolayout Inspector" bl_idname = "OBJECT_PT_SM64_Object_Geolayout_Inspector" bl_space_type = "PROPERTIES" @@ -205,7 +218,7 @@ class GeolayoutObjectPanel(bpy.types.Panel): return ( context.scene.gameEditorMode == "SM64" and context.object is not None - and isinstance(context.object.data, bpy.types.Mesh) + and isinstance(context.object.data, Mesh) ) def draw(self, context): @@ -244,24 +257,20 @@ class GeolayoutObjectPanel(bpy.types.Panel): # prop_split(col, obj, 'room_num', 'Room') -class MaterialPointerProperty(bpy.types.PropertyGroup): - material: bpy.props.PointerProperty(type=bpy.types.Material) +class MaterialPointerProperty(PropertyGroup): + material: PointerProperty(type=Material) -class SwitchOptionProperty(bpy.types.PropertyGroup): - switchType: bpy.props.EnumProperty(name="Option Type", items=enumSwitchOptions) - optionArmature: bpy.props.PointerProperty(name="Option Armature", type=bpy.types.Object) - materialOverride: bpy.props.PointerProperty(type=bpy.types.Material, name="Material Override") - materialOverrideType: bpy.props.EnumProperty(name="Material Override Type", items=enumMatOverrideOptions) - specificOverrideArray: bpy.props.CollectionProperty( - type=MaterialPointerProperty, name="Specified Materials To Override" - ) - specificIgnoreArray: bpy.props.CollectionProperty( - type=MaterialPointerProperty, name="Specified Materials To Ignore" - ) - overrideDrawLayer: bpy.props.BoolProperty() - drawLayer: bpy.props.EnumProperty(items=sm64EnumDrawLayers, name="Draw Layer") - expand: bpy.props.BoolProperty() +class SwitchOptionProperty(PropertyGroup): + switchType: EnumProperty(name="Option Type", items=enumSwitchOptions) + optionArmature: PointerProperty(name="Option Armature", type=Object) + materialOverride: PointerProperty(type=Material, name="Material Override") + materialOverrideType: EnumProperty(name="Material Override Type", items=enumMatOverrideOptions) + specificOverrideArray: CollectionProperty(type=MaterialPointerProperty, name="Specified Materials To Override") + specificIgnoreArray: CollectionProperty(type=MaterialPointerProperty, name="Specified Materials To Ignore") + overrideDrawLayer: BoolProperty() + drawLayer: EnumProperty(items=sm64EnumDrawLayers, name="Draw Layer") + expand: BoolProperty() def drawSwitchOptionProperty(layout, switchOption, index): @@ -324,12 +333,12 @@ def drawMatArrayProperty(layout, materialPointer, option, index, isSpecific): removeOp.isSpecific = isSpecific -class AddSwitchOptionMat(bpy.types.Operator): +class AddSwitchOptionMat(Operator): bl_idname = "bone.add_switch_option_mat" bl_label = "Add Switch Option Material" bl_options = {"REGISTER", "UNDO"} - option: bpy.props.IntProperty() - isSpecific: bpy.props.BoolProperty() + option: IntProperty() + isSpecific: BoolProperty() def execute(self, context): bone = context.bone @@ -341,13 +350,13 @@ class AddSwitchOptionMat(bpy.types.Operator): return {"FINISHED"} -class RemoveSwitchOptionMat(bpy.types.Operator): +class RemoveSwitchOptionMat(Operator): bl_idname = "bone.remove_switch_option_mat" bl_label = "Remove Switch Option Material" bl_options = {"REGISTER", "UNDO"} - option: bpy.props.IntProperty() - index: bpy.props.IntProperty() - isSpecific: bpy.props.BoolProperty() + option: IntProperty() + index: IntProperty() + isSpecific: BoolProperty() def execute(self, context): if self.isSpecific: @@ -358,11 +367,11 @@ class RemoveSwitchOptionMat(bpy.types.Operator): return {"FINISHED"} -class AddSwitchOption(bpy.types.Operator): +class AddSwitchOption(Operator): bl_idname = "bone.add_switch_option" bl_label = "Add Switch Option" bl_options = {"REGISTER", "UNDO"} - option: bpy.props.IntProperty() + option: IntProperty() def execute(self, context): bone = context.bone @@ -372,11 +381,11 @@ class AddSwitchOption(bpy.types.Operator): return {"FINISHED"} -class RemoveSwitchOption(bpy.types.Operator): +class RemoveSwitchOption(Operator): bl_idname = "bone.remove_switch_option" bl_label = "Remove Switch Option" bl_options = {"REGISTER", "UNDO"} - option: bpy.props.IntProperty() + option: IntProperty() def execute(self, context): context.bone.switch_options.remove(self.option) @@ -384,12 +393,12 @@ class RemoveSwitchOption(bpy.types.Operator): return {"FINISHED"} -class MoveSwitchOption(bpy.types.Operator): +class MoveSwitchOption(Operator): bl_idname = "bone.move_switch_option" bl_label = "Move Switch Option" bl_options = {"REGISTER", "UNDO"} - option: bpy.props.IntProperty() - offset: bpy.props.IntProperty() + option: IntProperty() + offset: IntProperty() def execute(self, context): bone = context.bone @@ -399,7 +408,7 @@ class MoveSwitchOption(bpy.types.Operator): """ -class GeolayoutBoneSidePanel(bpy.types.Panel): +class GeolayoutBoneSidePanel(Panel): bl_idname = "SM64_Geolayout_Inspector_Side" bl_label = "SM64 Geolayout Inspector" bl_space_type = 'VIEW_3D' @@ -441,17 +450,17 @@ def updateBone(self, context): createBoneGroups(armatureObj) if context.bone.geo_cmd not in animatableBoneTypes: addBoneToGroup(armatureObj, context.bone.name, context.bone.geo_cmd) - bpy.ops.object.mode_set(mode="POSE") + object.mode_set(mode="POSE") else: addBoneToGroup(armatureObj, context.bone.name, None) - bpy.ops.object.mode_set(mode="POSE") + object.mode_set(mode="POSE") -class SM64_BoneProperties(bpy.types.PropertyGroup): - version: bpy.props.IntProperty(name="SM64_BoneProperties Version", default=0) +class SM64_BoneProperties(PropertyGroup): + version: IntProperty(name="SM64_BoneProperties Version", default=0) - custom_geo_cmd_macro: bpy.props.StringProperty(name="Geo Command Macro", default="GEO_BONE") - custom_geo_cmd_args: bpy.props.StringProperty(name="Geo Command Args", default="") + custom_geo_cmd_macro: StringProperty(name="Geo Command Macro", default="GEO_BONE") + custom_geo_cmd_args: StringProperty(name="Geo Command Args", default="") sm64_bone_classes = ( @@ -486,108 +495,98 @@ def sm64_bone_register(): for cls in sm64_bone_classes: register_class(cls) - bpy.types.Bone.geo_cmd = bpy.props.EnumProperty( + Bone.geo_cmd = EnumProperty( name="Geolayout Command", items=enumBoneType, default="DisplayListWithOffset", update=updateBone ) - bpy.types.Bone.draw_layer = bpy.props.EnumProperty(name="Draw Layer", items=sm64EnumDrawLayers, default="1") + Bone.draw_layer = EnumProperty(name="Draw Layer", items=sm64EnumDrawLayers, default="1") # Scale - bpy.types.Bone.geo_scale = bpy.props.FloatProperty(name="Scale", min=2 ** (-16), max=2 ** (16), default=1) + Bone.geo_scale = FloatProperty(name="Scale", min=2 ** (-16), max=2 ** (16), default=1) # Function, HeldObject, Switch # 8027795C for HeldObject - bpy.types.Bone.geo_func = bpy.props.StringProperty( + Bone.geo_func = StringProperty( name="Function", default="", description="Name of function for C, hex address for binary." ) # Function - bpy.types.Bone.func_param = bpy.props.IntProperty( - name="Function Parameter", min=-(2 ** (15)), max=2 ** (15) - 1, default=0 - ) + Bone.func_param = IntProperty(name="Function Parameter", min=-(2 ** (15)), max=2 ** (15) - 1, default=0) # TranslateRotate - bpy.types.Bone.field_layout = bpy.props.EnumProperty(name="Field Layout", items=enumFieldLayout, default="0") + Bone.field_layout = EnumProperty(name="Field Layout", items=enumFieldLayout, default="0") # Shadow - bpy.types.Bone.shadow_type = bpy.props.EnumProperty(name="Shadow Type", items=enumShadowType, default="1") + Bone.shadow_type = EnumProperty(name="Shadow Type", items=enumShadowType, default="1") - bpy.types.Bone.shadow_solidity = bpy.props.FloatProperty(name="Shadow Alpha", min=0, max=1, default=1) + Bone.shadow_solidity = FloatProperty(name="Shadow Alpha", min=0, max=1, default=1) - bpy.types.Bone.shadow_scale = bpy.props.IntProperty( - name="Shadow Scale", min=-(2 ** (15)), max=2 ** (15) - 1, default=100 - ) + Bone.shadow_scale = IntProperty(name="Shadow Scale", min=-(2 ** (15)), max=2 ** (15) - 1, default=100) - # bpy.types.Bone.switch_bone = bpy.props.StringProperty( + # Bone.switch_bone = StringProperty( # name = 'Switch Bone') # StartRenderArea - bpy.types.Bone.culling_radius = bpy.props.FloatProperty(name="Culling Radius", default=10) + Bone.culling_radius = FloatProperty(name="Culling Radius", default=10) - bpy.types.Bone.switch_options = bpy.props.CollectionProperty(type=SwitchOptionProperty) + Bone.switch_options = CollectionProperty(type=SwitchOptionProperty) # Static Geolayout - bpy.types.Object.geo_cmd_static = bpy.props.EnumProperty( - name="Geolayout Command", items=enumGeoStaticType, default="Optimal" - ) - bpy.types.Object.draw_layer_static = bpy.props.EnumProperty( - name="Draw Layer", items=sm64EnumDrawLayers, default="1" - ) - bpy.types.Object.use_render_area = bpy.props.BoolProperty(name="Use Render Area") - bpy.types.Object.culling_radius = bpy.props.FloatProperty(name="Culling Radius", default=10) + Object.geo_cmd_static = EnumProperty(name="Geolayout Command", items=enumGeoStaticType, default="Optimal") + Object.draw_layer_static = EnumProperty(name="Draw Layer", items=sm64EnumDrawLayers, default="1") + Object.use_render_area = BoolProperty(name="Use Render Area") + Object.culling_radius = FloatProperty(name="Culling Radius", default=10) - bpy.types.Object.add_shadow = bpy.props.BoolProperty(name="Add Shadow") - bpy.types.Object.shadow_type = bpy.props.EnumProperty(name="Shadow Type", items=enumShadowType, default="1") + Object.add_shadow = BoolProperty(name="Add Shadow") + Object.shadow_type = EnumProperty(name="Shadow Type", items=enumShadowType, default="1") - bpy.types.Object.shadow_solidity = bpy.props.FloatProperty(name="Shadow Alpha", min=0, max=1, default=1) + Object.shadow_solidity = FloatProperty(name="Shadow Alpha", min=0, max=1, default=1) - bpy.types.Object.shadow_scale = bpy.props.IntProperty( - name="Shadow Scale", min=-(2 ** (15)), max=2 ** (15) - 1, default=100 - ) + Object.shadow_scale = IntProperty(name="Shadow Scale", min=-(2 ** (15)), max=2 ** (15) - 1, default=100) - bpy.types.Object.add_func = bpy.props.BoolProperty(name="Add Function Node") + Object.add_func = BoolProperty(name="Add Function Node") - bpy.types.Object.use_render_range = bpy.props.BoolProperty(name="Use Render Range (LOD)") - bpy.types.Object.render_range = bpy.props.FloatVectorProperty(name="Render Range", size=2, default=(0, 100)) + Object.use_render_range = BoolProperty(name="Use Render Range (LOD)") + Object.render_range = FloatVectorProperty(name="Render Range", size=2, default=(0, 100)) - bpy.types.Object.scaleFromGeolayout = bpy.props.BoolProperty( + Object.scaleFromGeolayout = BoolProperty( name="Scale from Geolayout", description="If scale is all a single value (e.g. 2, 2, 2), do not apply scale when exporting, and instead use GeoLayout to scale. Can be used to enhance precision by setting scaling values to a value less than 1.", default=False, ) # Used during object duplication on export - bpy.types.Object.original_name = bpy.props.StringProperty() + Object.original_name = StringProperty() def sm64_bone_unregister(): for cls in reversed(sm64_bone_classes): unregister_class(cls) - del bpy.types.Bone.geo_cmd - del bpy.types.Bone.draw_layer - del bpy.types.Bone.geo_scale - del bpy.types.Bone.geo_func - del bpy.types.Bone.func_param - del bpy.types.Bone.field_layout - del bpy.types.Bone.shadow_type - del bpy.types.Bone.shadow_solidity - del bpy.types.Bone.shadow_scale - del bpy.types.Bone.culling_radius - del bpy.types.Bone.switch_options + del Bone.geo_cmd + del Bone.draw_layer + del Bone.geo_scale + del Bone.geo_func + del Bone.func_param + del Bone.field_layout + del Bone.shadow_type + del Bone.shadow_solidity + del Bone.shadow_scale + del Bone.culling_radius + del Bone.switch_options - del bpy.types.Object.geo_cmd_static - del bpy.types.Object.draw_layer_static - del bpy.types.Object.use_render_area - del bpy.types.Object.culling_radius + del Object.geo_cmd_static + del Object.draw_layer_static + del Object.use_render_area + del Object.culling_radius - del bpy.types.Object.add_shadow - del bpy.types.Object.shadow_type - del bpy.types.Object.shadow_solidity - del bpy.types.Object.shadow_scale - del bpy.types.Object.add_func + del Object.add_shadow + del Object.shadow_type + del Object.shadow_solidity + del Object.shadow_scale + del Object.add_func - del bpy.types.Object.use_render_range - del bpy.types.Object.render_range + del Object.use_render_range + del Object.render_range - del bpy.types.Object.scaleFromGeolayout + del Object.scaleFromGeolayout diff --git a/fast64_internal/sm64/sm64_geolayout_classes.py b/fast64_internal/sm64/sm64_geolayout_classes.py index aa55c7b..9b91bab 100644 --- a/fast64_internal/sm64/sm64_geolayout_classes.py +++ b/fast64_internal/sm64/sm64_geolayout_classes.py @@ -1,9 +1,52 @@ -from .sm64_geolayout_constants import * -from .sm64_geolayout_utility import * -from .sm64_constants import * +import bpy +from struct import pack +from copy import copy from .sm64_function_map import func_map -from ..utility import * -import struct, copy + +from ..utility import ( + PluginError, + CData, + toAlnum, + encodeSegmentedAddr, + writeVectorToShorts, + convertFloatToShort, + writeEulerVectorToShorts, + writeFloatToShort, + convertEulerFloatToShort, + join_c_args, + radians_to_s16, + geoNodeRotateOrder, +) + +from .sm64_geolayout_constants import ( + nodeGroupCmds, + GEO_END, + GEO_RETURN, + GEO_NODE_OPEN, + GEO_NODE_CLOSE, + GEO_BRANCH, + GEO_CALL_ASM, + GEO_HELD_OBJECT, + GEO_START, + GEO_SWITCH, + GEO_TRANSLATE_ROTATE, + GEO_TRANSLATE, + GEO_ROTATE, + GEO_BILLBOARD, + GEO_LOAD_DL, + GEO_START_W_SHADOW, + GEO_START_W_RENDERAREA, + GEO_SET_RENDER_RANGE, + GEO_LOAD_DL_W_OFFSET, + GEO_SCALE, + GEO_SET_RENDER_AREA, + GEO_SET_ORTHO, + GEO_SET_CAMERA_FRUSTRUM, + GEO_SET_Z_BUF, + GEO_CAMERA, + GEO_SETUP_OBJ_RENDER, + GEO_SET_BG, +) drawLayerNames = { 0: "LAYER_FORCE", @@ -96,7 +139,7 @@ class GeolayoutGraph: raise PluginError("Circular geolayout dependency." + str(callOrder)) else: geolayoutList.insert(geolayoutList.index(geolayout), calledGeolayout) - callOrder = copy.copy(callOrder) + callOrder = copy(callOrder) callOrder.append(calledGeolayout) self.sortGeolayouts(geolayoutList, calledGeolayout, callOrder) return geolayoutList @@ -967,7 +1010,7 @@ class OrthoNode: def to_binary(self, segmentData): command = bytearray([GEO_SET_ORTHO, 0x00]) # FIX: This should be f32. - command.extend(bytearray(struct.pack(">f", self.scale))) + command.extend(bytearray(pack(">f", self.scale))) return command def to_c(self): @@ -987,7 +1030,7 @@ class FrustumNode: def to_binary(self, segmentData): command = bytearray([GEO_SET_CAMERA_FRUSTRUM, 0x01 if self.useFunc else 0x00]) - command.extend(bytearray(struct.pack(">f", self.fov))) + command.extend(bytearray(pack(">f", self.fov))) command.extend(self.near.to_bytes(2, "big", signed=True)) # Conversion? command.extend(self.far.to_bytes(2, "big", signed=True)) # Conversion? diff --git a/fast64_internal/sm64/sm64_geolayout_parser.py b/fast64_internal/sm64/sm64_geolayout_parser.py index f4e9cb6..26ab1c0 100644 --- a/fast64_internal/sm64/sm64_geolayout_parser.py +++ b/fast64_internal/sm64/sm64_geolayout_parser.py @@ -1,17 +1,58 @@ -import bpy, mathutils, math, copy -from math import pi +import bpy, mathutils, math, bmesh, copy from bpy.utils import register_class, unregister_class - -from .sm64_level_parser import * -from .sm64_geolayout_bone import enumShadowType -from .sm64_geolayout_constants import * -from .sm64_geolayout_utility import * -from .sm64_constants import * - -from ..f3d.f3d_material import createF3DMat, update_preset_manual -from ..f3d.f3d_parser import * -from ..utility import * +from ..f3d.f3d_parser import createBlankMaterial, parseF3DBinary from ..panels import SM64_Panel, sm64GoalImport +from .sm64_level_parser import parseLevelAtPointer +from .sm64_constants import level_pointers, level_enums +from .sm64_geolayout_bone import enumShadowType +from .sm64_geolayout_constants import getGeoLayoutCmdLength, nodeGroupCmds, GEO_BRANCH_STORE + +from ..utility import ( + PluginError, + decodeSegmentedAddr, + raisePluginError, + bytesToHexClean, + bitMask, + readVectorFromShorts, + findStartBones, + readEulerVectorFromShorts, + readFloatFromShort, + checkExpanded, + doRotation, + prop_split, + sm64BoneUp, + geoNodeRotateOrder, +) + +from .sm64_geolayout_utility import ( + createBoneGroups, + createBoneLayerMask, + getBoneGroupIndex, + addBoneToGroup, + boneLayers, +) + +from .sm64_geolayout_classes import ( + GEO_NODE_CLOSE, + GEO_END, + GEO_BRANCH, + GEO_RETURN, + GEO_NODE_OPEN, + GEO_START, + GEO_SWITCH, + GEO_TRANSLATE_ROTATE, + GEO_TRANSLATE, + GEO_ROTATE, + GEO_LOAD_DL_W_OFFSET, + GEO_BILLBOARD, + GEO_START_W_SHADOW, + GEO_CALL_ASM, + GEO_HELD_OBJECT, + GEO_SCALE, + GEO_START_W_RENDERAREA, + GEO_LOAD_DL, +) + blender_modes = {"OBJECT", "BONE"} diff --git a/fast64_internal/sm64/sm64_geolayout_utility.py b/fast64_internal/sm64/sm64_geolayout_utility.py index c69fb08..752c227 100644 --- a/fast64_internal/sm64/sm64_geolayout_utility.py +++ b/fast64_internal/sm64/sm64_geolayout_utility.py @@ -1,5 +1,5 @@ -from ..utility import PluginError import bpy +from ..utility import PluginError def getBoneGroupByName(armatureObj, name): diff --git a/fast64_internal/sm64/sm64_geolayout_writer.py b/fast64_internal/sm64/sm64_geolayout_writer.py index fe24821..4d4f36e 100644 --- a/fast64_internal/sm64/sm64_geolayout_writer.py +++ b/fast64_internal/sm64/sm64_geolayout_writer.py @@ -1,23 +1,130 @@ -import bpy, mathutils, math, copy, os, shutil +import bpy, mathutils, math, copy, os, shutil, re from bpy.utils import register_class, unregister_class - -from os.path import basename from io import BytesIO -from .sm64_objects import InlineGeolayoutObjConfig, inlineGeoLayoutObjects -from .sm64_geolayout_bone import getSwitchOptionBone, animatableBoneTypes -from .sm64_geolayout_constants import * -from .sm64_geolayout_utility import * -from .sm64_constants import * -from .sm64_camera import saveCameraSettingsToGeolayout -from .sm64_geolayout_classes import * -from .sm64_f3d_writer import * -from .sm64_texscroll import * -from .sm64_utility import * - -from ..utility import * from ..operators import ObjectDataExporter from ..panels import SM64_Panel +from .sm64_objects import InlineGeolayoutObjConfig, inlineGeoLayoutObjects +from .sm64_geolayout_bone import getSwitchOptionBone, animatableBoneTypes +from .sm64_camera import saveCameraSettingsToGeolayout +from .sm64_f3d_writer import SM64Model, SM64GfxFormatter +from .sm64_texscroll import modifyTexScrollFiles, modifyTexScrollHeadersGroup +from .sm64_level_parser import parseLevelAtPointer +from .sm64_rom_tweaks import ExtendBank0x04 +from .sm64_utility import starSelectWarning + +from ..utility import ( + PluginError, + VertexWeightError, + setOrigin, + raisePluginError, + findStartBones, + duplicateHierarchy, + cleanupDuplicatedObjects, + getExportDir, + toAlnum, + writeMaterialFiles, + writeIfNotFound, + get64bitAlignedAddr, + encodeSegmentedAddr, + writeMaterialHeaders, + writeInsertableFile, + bytesToHex, + checkSM64EmptyUsesGeoLayout, + convertEulerFloatToShort, + convertFloatToShort, + checkIsSM64InlineGeoLayout, + checkIsSM64PreInlineGeoLayout, + translate_blender_to_n64, + rotate_quat_blender_to_n64, + get_obj_temp_mesh, + getGroupNameFromIndex, + highlightWeightErrors, + getGroupIndexFromname, + getFMeshName, + checkUniqueBoneNames, + applyRotation, + getPathAndLevel, + applyBasicTweaks, + tempName, + checkExpanded, + getAddressFromRAMAddress, + prop_split, + customExportWarning, + decompFolderMessage, + makeWriteInfoBox, + writeBoxExportType, + enumExportHeaderType, + geoNodeRotateOrder, +) + +from ..f3d.f3d_writer import ( + TriangleConverterInfo, + LoopConvertInfo, + BufferVertex, + revertMatAndEndDraw, + getInfoDict, + saveStaticModel, + getTexDimensions, + checkForF3dMaterialInFaces, + saveOrGetF3DMaterial, + saveMeshWithLargeTexturesByFaces, + saveMeshByFaces, + isLightingDisabled, + getF3DVert, + isTexturePointSampled, + convertVertexData, +) + +from ..f3d.f3d_gbi import ( + GfxList, + GfxListTag, + DPSetAlphaCompare, + FModel, + FMesh, + SPVertex, + DPSetEnvColor, + FAreaData, + FFogData, + ScrollMethod, + TextureExportSettings, + DLFormat, + SPEndDisplayList, + SPDisplayList, +) + +from .sm64_geolayout_classes import ( + DisplayListNode, + TransformNode, + StartNode, + StartRenderAreaNode, + GeolayoutGraph, + JumpNode, + SwitchOverrideNode, + SwitchNode, + TranslateNode, + RotateNode, + TranslateRotateNode, + FunctionNode, + CustomNode, + BillboardNode, + ScaleNode, + RenderRangeNode, + ShadowNode, + DisplayListWithOffsetNode, + CustomAnimatedNode, + HeldObjectNode, + Geolayout, +) + +from .sm64_constants import ( + insertableBinaryTypes, + bank0Segment, + level_pointers, + defaultExtendSegment4, + level_enums, + enumLevelNames +) def appendSecondaryGeolayout(geoDirPath, geoName1, geoName2, additionalNode=""): diff --git a/fast64_internal/sm64/sm64_level_parser.py b/fast64_internal/sm64/sm64_level_parser.py index 9f39d9e..15a801a 100644 --- a/fast64_internal/sm64/sm64_level_parser.py +++ b/fast64_internal/sm64/sm64_level_parser.py @@ -1,11 +1,46 @@ -import bpy, mathutils, copy -from math import pi +import copy +from .sm64_constants import mainLevelLoadScriptSegment, loadSegmentAddresses -from .sm64_level_constants import * -from .sm64_geolayout_constants import * -from .sm64_constants import * +from ..utility import ( + PluginError, + decodeSegmentedAddr, + writeVectorToShorts, + writeFloatToShort, + readVectorFromShorts, + readEulerVectorFromShorts, + writeEulerVectorToShorts, + readFloatFromShort, + readEulerFloatFromShort, + writeEulerFloatToShort, +) -from ..utility import * +from .sm64_level_constants import ( + L_END, + L_JUMP, + L_PUSH, + L_POP, + L_NOOP, + L_LOAD_ROM_SEG, + L_LOAD_MIO0_SEG, + L_LOAD_MIO0_TEX, + L_AREA_START, + L_AREA_END, + L_LOAD_POLY_WO_GEO, + L_LOAD_POLY_W_GEO, + L_PLACE_OBJECT, + L_WARP_CONNECT, + L_WARP_PAINTING, + L_WARP_AREA, + L_SET_DEFAULT_MARIO_POS, + L_LOAD_COLLISION, + L_SHOW_DIALOG, + L_SET_DEFAULT_TERRAIN, + L_NOOP2, + L_SET_MUSIC_SCREEN, + L_SET_MUSIC_LEVEL, + L_PLACE_MACRO_OBJECT, + L_JET_STREAM, +) def parseLevelAtPointer(romfile, pointerAddress): diff --git a/fast64_internal/sm64/sm64_level_writer.py b/fast64_internal/sm64/sm64_level_writer.py index 8280772..5c45210 100644 --- a/fast64_internal/sm64/sm64_level_writer.py +++ b/fast64_internal/sm64/sm64_level_writer.py @@ -1,17 +1,44 @@ +import bpy, os, math, re, shutil, mathutils from collections import defaultdict from bpy.utils import register_class, unregister_class -import bpy, os, math, re, shutil - -from .sm64_constants import * -from .sm64_objects import * -from .sm64_collision import * -from .sm64_geolayout_writer import * -from .sm64_texscroll import * -from .sm64_utility import * - -from ..utility import * from ..panels import SM64_Panel from ..operators import ObjectDataExporter +from .sm64_constants import cameraTriggerNames, levelIDNames, enumLevelNames +from .sm64_objects import exportAreaCommon, backgroundSegments +from .sm64_collision import exportCollisionCommon +from .sm64_f3d_writer import SM64Model, SM64GfxFormatter +from .sm64_geolayout_writer import setRooms, convertObjectToGeolayout +from .sm64_f3d_writer import modifyTexScrollFiles, modifyTexScrollHeadersGroup +from .sm64_utility import cameraWarning, starSelectWarning + +from ..utility import ( + PluginError, + writeIfNotFound, + getDataFromFile, + saveDataToFile, + unhideAllAndGetHiddenList, + hideObjsInList, + overwriteData, + selectSingleObject, + deleteIfFound, + applyBasicTweaks, + applyRotation, + prop_split, + toAlnum, + writeMaterialHeaders, + raisePluginError, + customExportWarning, + decompFolderMessage, + makeWriteInfoBox, + writeMaterialFiles, +) + +from ..f3d.f3d_gbi import ( + ScrollMethod, + TextureExportSettings, + DLFormat, +) + levelDefineArgs = { "internal name": 0, diff --git a/fast64_internal/sm64/sm64_objects.py b/fast64_internal/sm64/sm64_objects.py index 13a9f02..ab91806 100644 --- a/fast64_internal/sm64/sm64_objects.py +++ b/fast64_internal/sm64/sm64_objects.py @@ -1,14 +1,46 @@ -import math, os, bpy, bmesh, mathutils +import math, bpy, mathutils from bpy.utils import register_class, unregister_class -from io import BytesIO - -from .sm64_constants import * from .sm64_function_map import func_map -from .sm64_spline import * -from .sm64_geolayout_classes import * -from ..utility import * -from ..f3d.f3d_material import sm64EnumDrawLayers +from ..utility import ( + PluginError, + CData, + Vector, + toAlnum, + convertRadiansToS16, + checkIdentityRotation, + obj_scale_is_unified, + all_values_equal_x, + checkIsSM64PreInlineGeoLayout, + prop_split, +) + +from .sm64_constants import ( + levelIDNames, + enumLevelNames, + enumModelIDs, + enumMacrosNames, + enumSpecialsNames, + enumBehaviourPresets, +) + +from .sm64_spline import ( + assertCurveValid, + convertSplineObject, +) + +from .sm64_geolayout_classes import ( + DisplayListNode, + JumpNode, + TranslateNode, + RotateNode, + TranslateRotateNode, + FunctionNode, + CustomNode, + BillboardNode, + ScaleNode, +) + enumTerrain = [ ("Custom", "Custom", "Custom"), diff --git a/fast64_internal/sm64/sm64_spline.py b/fast64_internal/sm64/sm64_spline.py index 9eee541..334edd7 100644 --- a/fast64_internal/sm64/sm64_spline.py +++ b/fast64_internal/sm64/sm64_spline.py @@ -1,7 +1,7 @@ -from .sm64_constants import * +import bpy from bpy.utils import register_class, unregister_class -import bpy, bmesh -from ..utility import * +from ..utility import PluginError, CData, toAlnum, prop_split + enumSplineTypes = [ ("Trajectory", "Trajectory", "Exports to Trajectory[]. Used for movement"), diff --git a/fast64_internal/sm64/sm64_texscroll.py b/fast64_internal/sm64/sm64_texscroll.py index 6b2f824..a312c21 100644 --- a/fast64_internal/sm64/sm64_texscroll.py +++ b/fast64_internal/sm64/sm64_texscroll.py @@ -1,5 +1,5 @@ import os, re, bpy -from ..utility import * +from ..utility import PluginError, writeIfNotFound, getDataFromFile, saveDataToFile from .c_templates.tile_scroll import tile_scroll_c, tile_scroll_h from .sm64_utility import getMemoryCFilePath diff --git a/fast64_internal/sm64/sm64_utility.py b/fast64_internal/sm64/sm64_utility.py index 170378c..9c72320 100644 --- a/fast64_internal/sm64/sm64_utility.py +++ b/fast64_internal/sm64/sm64_utility.py @@ -1,4 +1,4 @@ -import bpy, os +import os def starSelectWarning(operator, fileStatus): if fileStatus is not None and not fileStatus.starSelectC: