mirror of
https://github.com/ApfelTeeSaft/lightspeed64.git
synced 2026-08-26 19:33:24 +00:00
Added option to configure Blender to SM64 scale. Fixed bug with material on imported DLs.
This commit is contained in:
+8
-10
@@ -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()
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -32,7 +32,7 @@ loadSegmentAddresses = {
|
||||
|
||||
geoNodeRotateOrder = 'ZXY'
|
||||
|
||||
sm64ToBlenderScale = 0.0047
|
||||
#sm64ToBlenderScale = 0.0047
|
||||
marioScale = 0.25
|
||||
|
||||
sm64BoneUp = mathutils.Vector([1,0,0])
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)))
|
||||
|
||||
Reference in New Issue
Block a user