From d707e0547122ee4d658dad5c1108da0d700e712a Mon Sep 17 00:00:00 2001 From: kurethedead Date: Sat, 14 Dec 2019 17:59:11 -0800 Subject: [PATCH] Added option to configure Blender to SM64 scale. Fixed bug with material on imported DLs. --- __init__.py | 18 ++++++++---------- fast64_internal/f3d_parser.py | 15 ++++++++++----- fast64_internal/sm64_anim.py | 6 +++--- fast64_internal/sm64_constants.py | 2 +- fast64_internal/sm64_geolayout_classes.py | 8 ++++---- fast64_internal/sm64_geolayout_parser.py | 4 +--- fast64_internal/sm64_geolayout_writer.py | 6 +++--- fast64_internal/utility.py | 6 +++--- 8 files changed, 33 insertions(+), 32 deletions(-) diff --git a/__init__.py b/__init__.py index d8c6deb..e14c9e0 100644 --- a/__init__.py +++ b/__init__.py @@ -339,11 +339,9 @@ class SM64_ExportGeolayoutObject(bpy.types.Operator): context.scene.saveCameraSettings else None finalTransform = mathutils.Matrix.Identity(4) - #finalTransform = (blenderToSM64Rotation * \ - # (1/sm64ToBlenderScale)).to_4x4() @ objTransform] + scaleValue = bpy.context.scene.blenderToSM64Scale finalTransform = mathutils.Matrix.Diagonal(mathutils.Vector(( - 1/sm64ToBlenderScale, 1/sm64ToBlenderScale, 1/sm64ToBlenderScale - ))).to_4x4() + scaleValue, scaleValue, scaleValue))).to_4x4() try: # Rotate all armatures 90 degrees @@ -779,7 +777,7 @@ class SM64_ExportDL(bpy.types.Operator): objTransform = R.to_matrix().to_4x4() @ \ mathutils.Matrix.Diagonal(S).to_4x4() finalTransform = (blenderToSM64Rotation * \ - (1/sm64ToBlenderScale)).to_4x4() @ objTransform + (bpy.context.scene.blenderToSM64Scale)).to_4x4() @ objTransform #cProfile.runctx('exportF3DtoC(bpy.path.abspath(context.scene.DLExportPath), obj,' +\ # 'context.scene.DLExportisStatic, finalTransform,' +\ @@ -1292,11 +1290,7 @@ class SM64_ExportCollision(bpy.types.Operator): objTransform = R.to_matrix().to_4x4() @ \ mathutils.Matrix.Diagonal(S).to_4x4() finalTransform = (blenderToSM64Rotation * \ - (1/sm64ToBlenderScale)).to_4x4() @ objTransform - #finalTransform = mathutils.Matrix.Identity(4) - #finalTransform = mathutils.Matrix.Diagonal(mathutils.Vector(( - # 1/sm64ToBlenderScale, 1/sm64ToBlenderScale, 1/sm64ToBlenderScale - #))).to_4x4() + (bpy.context.scene.blenderToSM64Scale)).to_4x4() @ objTransform try: #applyRotation([obj], math.radians(90), 'X') @@ -1442,6 +1436,7 @@ class SM64_FileSettingsPanel(bpy.types.Panel): col.prop(context.scene, 'extendBank4') col.prop(context.scene, 'decomp_compatible') prop_split(col, context.scene, 'refreshVer', 'Decomp Func Map') + prop_split(col, context.scene, 'blenderToSM64Scale', 'Blender To SM64 Scale') class SM64_AddressConvertPanel(bpy.types.Panel): bl_idname = "SM64_PT_addr_conv" @@ -1708,6 +1703,8 @@ def register(): items = level_enums, name = 'Level', default = 'IC') bpy.types.Scene.refreshVer = bpy.props.EnumProperty( items = enumRefreshVer, name = 'Refresh', default = 'Refresh 4') + bpy.types.Scene.blenderToSM64Scale = bpy.props.FloatProperty( + name = 'Blender To SM64 Scale', default = 212.766) bpy.types.Scene.characterIgnoreSwitch = \ bpy.props.BoolProperty(name = 'Ignore Switch Nodes', default = True) @@ -1823,6 +1820,7 @@ def unregister(): del bpy.types.Scene.convertibleAddr del bpy.types.Scene.levelConvert del bpy.types.Scene.refreshVer + del bpy.types.Scene.blenderToSM64Scale mat_unregister() bone_unregister() diff --git a/fast64_internal/f3d_parser.py b/fast64_internal/f3d_parser.py index d23beb5..441d350 100644 --- a/fast64_internal/f3d_parser.py +++ b/fast64_internal/f3d_parser.py @@ -5,6 +5,7 @@ import pprint from .f3d_gbi import * from .utility import * from .sm64_constants import * +from .f3d_material import createF3DMat, update_preset_manual def getAxisVector(enumValue): sign = -1 if enumValue[0] == '-' else 1 @@ -172,9 +173,9 @@ def getPosition(vertexBuffer, index): yBytes = vertexBuffer[yStart : yStart + 2] zBytes = vertexBuffer[zStart : zStart + 2] - x = int.from_bytes(xBytes, 'big', signed=True) * sm64ToBlenderScale - y = int.from_bytes(yBytes, 'big', signed=True) * sm64ToBlenderScale - z = int.from_bytes(zBytes, 'big', signed=True) * sm64ToBlenderScale + x = int.from_bytes(xBytes, 'big', signed=True) / bpy.context.scene.blenderToSM64Scale + y = int.from_bytes(yBytes, 'big', signed=True) / bpy.context.scene.blenderToSM64Scale + z = int.from_bytes(zBytes, 'big', signed=True) / bpy.context.scene.blenderToSM64Scale return (x, y, z) @@ -303,8 +304,12 @@ def printvbuf(vertexBuffer): def createBlankMaterial(obj): - newMat = bpy.data.materials.new('sm64_material') - obj.data.materials.append(newMat) + material = createF3DMat(obj) + material.f3d_preset = 'Shaded Solid' + update_preset_manual(material, bpy.context) + + #newMat = bpy.data.materials.new('sm64_material') + #obj.data.materials.append(newMat) def createNewTextureMaterial(romfile, textureStart, textureSize, texelCount, colorFormat, colorDepth, obj): newMat = bpy.data.materials.new('sm64_material') diff --git a/fast64_internal/sm64_anim.py b/fast64_internal/sm64_anim.py index c05e363..f5cf998 100644 --- a/fast64_internal/sm64_anim.py +++ b/fast64_internal/sm64_anim.py @@ -274,7 +274,7 @@ def removeTrailingFrames(frameData): def saveTranslationFrame(frameData, translation): for i in range(3): - frameData[i].append(min(int(round(translation[i] / sm64ToBlenderScale)), + frameData[i].append(min(int(round(translation[i] * bpy.context.scene.blenderToSM64Scale)), 2**16 - 1)) def convertAnimationData(anim, armatureObj): @@ -453,8 +453,8 @@ def getKeyFramesTranslation(romfile, transformValuesStart, boneIndex): keyframes = [] for frame in range(boneIndex.numFrames): romfile.seek(ptrToValue + frame * 2) - keyframes.append(int.from_bytes(romfile.read(2), 'big', signed = True) *\ - sm64ToBlenderScale) + keyframes.append(int.from_bytes(romfile.read(2), 'big', signed = True) /\ + bpy.context.scene.blenderToSM64Scale) return keyframes diff --git a/fast64_internal/sm64_constants.py b/fast64_internal/sm64_constants.py index 880fd5c..16a8e1d 100644 --- a/fast64_internal/sm64_constants.py +++ b/fast64_internal/sm64_constants.py @@ -32,7 +32,7 @@ loadSegmentAddresses = { geoNodeRotateOrder = 'ZXY' -sm64ToBlenderScale = 0.0047 +#sm64ToBlenderScale = 0.0047 marioScale = 0.25 sm64BoneUp = mathutils.Vector([1,0,0]) diff --git a/fast64_internal/sm64_geolayout_classes.py b/fast64_internal/sm64_geolayout_classes.py index 4f78752..b86f8ee 100644 --- a/fast64_internal/sm64_geolayout_classes.py +++ b/fast64_internal/sm64_geolayout_classes.py @@ -811,8 +811,8 @@ class OrthoNode: class FrustumNode: def __init__(self, fov, near, far): self.fov = fov - self.near = int(round(100 * near)) - self.far = int(round(100 * far)) + self.near = int(round(bpy.context.scene.blenderToSM64Scale * near)) + self.far = int(round(bpy.context.scene.blenderToSM64Scale * far)) self.useFunc = True # Always use function? def size(self): @@ -857,9 +857,9 @@ class CameraNode: def __init__(self, camType, position, lookAt): self.camType = camType self.position = \ - [int(round(value / sm64ToBlenderScale)) for value in position] + [int(round(value * bpy.context.scene.blenderToSM64Scale)) for value in position] self.lookAt = \ - [int(round(value / sm64ToBlenderScale)) for value in lookAt] + [int(round(value * bpy.context.scene.blenderToSM64Scale)) for value in lookAt] self.geo_func = '80287D30' def size(self): diff --git a/fast64_internal/sm64_geolayout_parser.py b/fast64_internal/sm64_geolayout_parser.py index 7747c1b..f3f7a4d 100644 --- a/fast64_internal/sm64_geolayout_parser.py +++ b/fast64_internal/sm64_geolayout_parser.py @@ -31,9 +31,7 @@ def parseGeoLayout(romfile, startAddress, scene, segmentData, mesh = bpy.data.meshes.new('skinnned-mesh') obj = bpy.data.objects.new('skinned', mesh) scene.collection.objects.link(obj) - material = createF3DMat(obj) - material.f3d_preset = 'Shaded Solid' - update_preset_manual(material, bpy.context) + createBlankMaterial(obj) bMesh = bmesh.new() bMesh.from_mesh(mesh) diff --git a/fast64_internal/sm64_geolayout_writer.py b/fast64_internal/sm64_geolayout_writer.py index 85e438a..0ed3d7d 100644 --- a/fast64_internal/sm64_geolayout_writer.py +++ b/fast64_internal/sm64_geolayout_writer.py @@ -1107,14 +1107,14 @@ def saveModelGivenVertexGroup(fModel, obj, vertexGroup, bone = armatureObj.data.bones[vertexGroup] - currentMatrix = mathutils.Matrix.Scale(1 / sm64ToBlenderScale, 4) @ \ + currentMatrix = mathutils.Matrix.Scale(1 * bpy.context.scene.blenderToSM64Scale, 4) @ \ bone.matrix_local.inverted() if parentGroup is None: - parentMatrix = mathutils.Matrix.Scale(1 / sm64ToBlenderScale, 4) + parentMatrix = mathutils.Matrix.Scale(1 * bpy.context.scene.blenderToSM64Scale, 4) else: parentBone = armatureObj.data.bones[parentGroup] - parentMatrix = mathutils.Matrix.Scale(1 / sm64ToBlenderScale, 4) @ \ + parentMatrix = mathutils.Matrix.Scale(1 * bpy.context.scene.blenderToSM64Scale, 4) @ \ parentBone.matrix_local.inverted() # dict of material_index keys to face array values diff --git a/fast64_internal/utility.py b/fast64_internal/utility.py index eea8e46..cf83b44 100644 --- a/fast64_internal/utility.py +++ b/fast64_internal/utility.py @@ -264,7 +264,7 @@ def readVectorFromShorts(command, offset): def readFloatFromShort(command, offset): return int.from_bytes(command[offset: offset + 2], - 'big', signed = True) * sm64ToBlenderScale + 'big', signed = True) / bpy.context.scene.blenderToSM64Scale def writeVectorToShorts(command, offset, values): for i in range(3): @@ -273,11 +273,11 @@ def writeVectorToShorts(command, offset, values): def writeFloatToShort(command, offset, value): command[offset : offset + 2] = \ - int(round(value / sm64ToBlenderScale)).to_bytes( + int(round(value * bpy.context.scene.blenderToSM64Scale)).to_bytes( 2, 'big', signed = True) def convertFloatToShort(value): - return int(round((value / sm64ToBlenderScale))) + return int(round((value * bpy.context.scene.blenderToSM64Scale))) def convertEulerFloatToShort(value): return int(round(degrees(value)))