Use a dict for retrieving object's name from data

This commit is contained in:
ABelliqueux 2021-09-13 15:14:29 +02:00
parent c30a6aedb8
commit a2e9c2ffe1

View File

@ -922,6 +922,69 @@ class ExportMyFormat(bpy.types.Operator, ExportHelper):
"VECTOR " + fileName + "_BKc = { " + BKr + ", " + BKg + ", " + BKb + ", 0 };\n\n"
)
level_symbols.append( "VECTOR " + fileName + "_BKc" )
# Dictionaries
# Sound
# These speaker objects's positions will have to be updated
spkrParents = defaultdict(dict)
spkrOrphans = []
# array of Sound objects
soundFiles = []
# current XA files and channel
freeXAfile = 0
freeXAchannel = 0
# Lights
lmpObjects = {}
for obj in bpy.data.objects:
# Build a dictionary of objects that have child SPEAKER objects
if obj.type == 'SPEAKER':
if obj.data.sound is not None:
# and child of a mesh
if obj.parent is not None:
if obj.parent.type == 'MESH':
parent = obj.parent
# if parent exists in parent list, append to child list
# ~ if obj.parent.name in spkrParents:
# ~ spkrParents[obj.parent.name].append(obj.name)
# ~ else:
# if parent does not exist in list yet, create array
# ~ spkrParents[obj.parent.name] = [obj.name]
# has no parent
else:
# ~ spkrOrphans.append(obj.name)
parent = 0
# get sound informations
objName = obj.name
soundName = obj.data.sound.name
soundPath = bpy.path.abspath(obj.data.sound.filepath)
location = obj.location
volume = int(obj.data.volume)
volume_min = int(obj.data.volume_min)
volume_max = int(obj.data.volume_max)
# convert sound
if obj.data.get('isXA'):
XAsectorsize = 2336 if XAmode else 2352
if freeXAchannel > 7:
freeXAfile += 1
freeXAchannel = 0
convertedSoundPath = sound2XA(soundPath, soundName, bpp=4, XAfile=freeXAfile, XAchannel=freeXAchannel)
XAfile = freeXAfile
XAchannel = freeXAchannel
freeXAchannel += 1
if os.path.exists(convertedSoundPath):
XAsize = os.path.getsize(convertedSoundPath)
XAend = int((( XAsize / XAsectorsize ) - 1))
else:
XAsize = -1
XAend = -1
soundFiles.append( Sound( objName, soundName, soundPath, convertedSoundPath, parent, location, volume, volume_min, volume_max, -1, XAfile, XAchannel, XAsize, XAend ) )
else:
convertedSoundPath = sound2VAG(soundPath, soundName)
soundFiles.append( Sound( objName, soundName, soundPath, convertedSoundPath, parent, location, volume, volume_min, volume_max, -1 ) )
# Build dict of LAMPs objects
# We want to be able to find an object based on it's data name.
if obj.type == 'LAMP':
lmpObjects[obj.data.name] = obj.name
## Camera setup
# List of points defining the camera path
camPathPoints = []
@ -989,42 +1052,54 @@ class ExportMyFormat(bpy.types.Operator, ExportHelper):
# Light sources will be similar to Blender's sunlamp
# A maximum of 3 light sources will be used
# LLM : Local Light Matrix
if len( bpy.data.lamps ) is not None:
if len( lmpObjects ) is not None:
cnt = 0
pad = 3 - len( bpy.data.lamps )
pad = 3 - len( lmpObjects ) if ( len( lmpObjects ) < 3 ) else 0
f.write( "MATRIX " + fileName + "_lgtmat = {\n")
for l in range(len(bpy.data.lamps)):
# Lightsource energy
energy = int( bpy.data.lamps[ l ].energy * 4096 )
# Get lightsource's world orientation
lightdir = bpy.data.objects[ bpy.data.lamps[ l ].name ].matrix_world * Vector( ( 0, 0, -1, 0 ) )
f.write(
"\t" + str( int( lightdir.x * energy ) ) + "," +
"\t" + str( int( -lightdir.z * energy ) ) + "," +
"\t" + str( int( lightdir.y * energy ) )
)
if l != len( bpy.data.lamps ) - 1:
f.write(",\n")
# If less than 3 light sources exist in blender, fill the matrix with 0s.
if pad:
f.write(",\n")
while cnt < pad:
f.write("\t0,0,0")
if cnt != pad:
f.write(",\n")
for light in sorted(lmpObjects):
# Get rid of orphans
if bpy.data.lamps[light].users == 0:
continue
# PSX can only use 3 light sources
if cnt < 3 :
# Lightsource energy
energy = int( bpy.data.lamps[light].energy * 4096 )
# ~ energy = int( light.energy * 4096 )
# Get lightsource's world orientation
lightdir = bpy.data.objects[lmpObjects[light]].matrix_world * Vector( ( 0, 0, -1, 0 ) )
f.write(
"\t" + str( int( lightdir.x * energy ) ) + "," +
"\t" + str( int( -lightdir.z * energy ) ) + "," +
"\t" + str( int( lightdir.y * energy ) )
)
if cnt < 2:
f.write(",\n")
# If less than 3 light sources exist in blender, fill the matrix with 0s.
if pad:
f.write(",\n")
while cnt < pad:
f.write("\t0,0,0")
if cnt != pad:
f.write(",\n")
cnt += 1
else:
cnt += 1
f.write("\n\t};\n\n")
level_symbols.append( "MATRIX " + fileName + "_lgtmat" )
# LCM : Local Color Matrix
f.write( "MATRIX " + fileName + "_cmat = {\n")
LCM = []
for l in bpy.data.lamps:
cnt = 0
# If more than 3 light sources exists, use the 3 first in alphabetic order (same as in Blender's outliner)
for light in sorted(lmpObjects):
# If orphan, get on with it
if l.users == 0:
if bpy.data.lamps[light].users == 0:
continue
LCM.append( str( int( l.color.r * 4096 ) if l.color.r else 0 ) )
LCM.append( str( int( l.color.g * 4096 ) if l.color.g else 0 ) )
LCM.append( str( int( l.color.b * 4096 ) if l.color.b else 0 ) )
if cnt < 3 :
LCM.append( str( int( bpy.data.lamps[light].color.r * 4096 ) if bpy.data.lamps[light].color.r else 0 ) )
LCM.append( str( int( bpy.data.lamps[light].color.g * 4096 ) if bpy.data.lamps[light].color.g else 0 ) )
LCM.append( str( int( bpy.data.lamps[light].color.b * 4096 ) if bpy.data.lamps[light].color.b else 0 ) )
cnt += 1
if len(LCM) < 9:
while len(LCM) < 9:
LCM.append('0')
@ -1778,61 +1853,7 @@ class ExportMyFormat(bpy.types.Operator, ExportHelper):
level_symbols.append( "CAMANGLE * " + fileName + "_camPtr" )
level_symbols.append( "NODE * " + fileName + "_curNode" )
## Sound
# Build a dictionary of objects that have child SPEAKER objects
# These objects's positions will have to be updated
spkrParents = defaultdict(dict)
spkrOrphans = []
# array of Sound objects
soundFiles = []
# current XA files and channel
freeXAfile = 0
freeXAchannel = 0
for obj in bpy.data.objects:
# if obj is a speaker
if obj.type == 'SPEAKER':
if obj.data.sound is not None:
# and child of a mesh
if obj.parent is not None:
if obj.parent.type == 'MESH':
parent = obj.parent
# if parent exists in parent list, append to child list
# ~ if obj.parent.name in spkrParents:
# ~ spkrParents[obj.parent.name].append(obj.name)
# ~ else:
# if parent does not exist in list yet, create array
# ~ spkrParents[obj.parent.name] = [obj.name]
# has no parent
else:
# ~ spkrOrphans.append(obj.name)
parent = 0
# get sound informations
objName = obj.name
soundName = obj.data.sound.name
soundPath = bpy.path.abspath(obj.data.sound.filepath)
location = obj.location
volume = int(obj.data.volume)
volume_min = int(obj.data.volume_min)
volume_max = int(obj.data.volume_max)
# convert sound
if obj.data.get('isXA'):
XAsectorsize = 2336 if XAmode else 2352
if freeXAchannel > 7:
freeXAfile += 1
freeXAchannel = 0
convertedSoundPath = sound2XA(soundPath, soundName, bpp=4, XAfile=freeXAfile, XAchannel=freeXAchannel)
XAfile = freeXAfile
XAchannel = freeXAchannel
freeXAchannel += 1
if os.path.exists(convertedSoundPath):
XAsize = os.path.getsize(convertedSoundPath)
XAend = int((( XAsize / XAsectorsize ) - 1))
else:
XAsize = -1
XAend = -1
soundFiles.append( Sound( objName, soundName, soundPath, convertedSoundPath, parent, location, volume, volume_min, volume_max, -1, XAfile, XAchannel, XAsize, XAend ) )
else:
convertedSoundPath = sound2VAG(soundPath, soundName)
soundFiles.append( Sound( objName, soundName, soundPath, convertedSoundPath, parent, location, volume, volume_min, volume_max, -1 ) )
# Use dict generated earlier
# Default values
XAFiles = "0"
VAGBank = "0"