Added option to configure Blender to SM64 scale. Fixed bug with material on imported DLs.

This commit is contained in:
kurethedead
2019-12-14 17:59:11 -08:00
parent 500492b2f4
commit d707e05471
8 changed files with 33 additions and 32 deletions
+8 -10
View File
@@ -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()
+10 -5
View File
@@ -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')
+3 -3
View File
@@ -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
+1 -1
View File
@@ -32,7 +32,7 @@ loadSegmentAddresses = {
geoNodeRotateOrder = 'ZXY'
sm64ToBlenderScale = 0.0047
#sm64ToBlenderScale = 0.0047
marioScale = 0.25
sm64BoneUp = mathutils.Vector([1,0,0])
+4 -4
View File
@@ -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):
+1 -3
View File
@@ -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)
+3 -3
View File
@@ -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
+3 -3
View File
@@ -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)))