Tex/Tim folder separation

This commit is contained in:
ABelliqueux 2021-05-02 19:15:34 +02:00
parent 2c45d57c56
commit e1efa0bb6f
1 changed files with 93 additions and 36 deletions

View File

@ -113,7 +113,7 @@ class ExportMyFormat(bpy.types.Operator, ExportHelper):
name="Level number",
description="That nimber is used in the symbols name.",
description="That number is used in the symbols name.",
min=1, max=10,
@ -121,6 +121,26 @@ class ExportMyFormat(bpy.types.Operator, ExportHelper):
)
exp_expMode = BoolProperty(
name="Use blender file name",
description="By default, files are exported as 'level*' in a folder named 'levels'. Enable to use the blender file name.",
default=False,
)
exp_CustomTexFolder = StringProperty(
name = "Textures Dir",
description = "By default, the script looks for / saves textures in the ./TEX folder. You can tell it to use a different folder.",
default="TEX"
)
def execute(self, context):
@ -134,6 +154,8 @@ class ExportMyFormat(bpy.types.Operator, ExportHelper):
global TIMbpp
global timFolder
### Functions
def triangulate_object(obj):
@ -373,10 +395,14 @@ class ExportMyFormat(bpy.types.Operator, ExportHelper):
def convertBGtoTIM( filePathWithExt, colors = 256, bpp = 8, timX = 640, timY = 0, clutX = 0, clutY = 480, transparency = 'alpha'):
global timFolder
# By default, converts a RGB to 8bpp, 256 colors indexed PNG, then to a 8bpp TIM image
filePathWithoutExt = filePathWithExt[ : filePathWithExt.rfind('.') ]
fileBaseName = os.path.basename(filePathWithoutExt)
# For windows users, add '.exe' to the command
exe = ""
@ -427,7 +453,7 @@ class ExportMyFormat(bpy.types.Operator, ExportHelper):
# Convert to tim with img2tim ( https://github.com/Lameguy64/img2tim )
subprocess.call( [ "img2tim" + exe, transpMethod, "-bpp", str( bpp ), "-org", str( timX ), str( timY ), "-plt" , str( clutX ), str( clutY ),"-o", filePathWithoutExt + ".tim", filePathWithExt ] )
subprocess.call( [ "img2tim" + exe, transpMethod, "-bpp", str( bpp ), "-org", str( timX ), str( timY ), "-plt" , str( clutX ), str( clutY ),"-o", timFolder + os.sep + fileBaseName + ".tim", filePathWithExt ] )
def VramIsFull( size ):
@ -568,6 +594,13 @@ class ExportMyFormat(bpy.types.Operator, ExportHelper):
freeClutSlot -= 1
# Set rendering resolution to 320x240
bpy.context.scene.render.resolution_x = 320
bpy.context.scene.render.resolution_y = 240
### VRam Layout
nextTpage = 320
@ -612,11 +645,33 @@ class ExportMyFormat(bpy.types.Operator, ExportHelper):
# Get working directory path
workFolder = os.path.dirname(bpy.path.abspath(bpy.data.filepath))
# Get export directory path
filepath = bpy.data.filepath
folder = os.path.dirname(bpy.path.abspath(filepath))
if self.exp_expMode:
filepath = self.filepath
expFolder = os.path.dirname(bpy.path.abspath(filepath))
dirpath = os.path.join(folder, "TIM")
# Get texture folder, default to ./TEX
textureFolder = os.path.join( workFolder, "TEX")
if self.exp_CustomTexFolder != "TEX":
textureFolder = os.path.join( expFolder, self.exp_CustomTexFolder)
timFolder = os.path.join( expFolder, "TIM")
# If the TIM folder doesn't exist, create it
if not os.path.exists(timFolder):
os.mkdir(timFolder)
### Export pre-calculated backgrounds and construct a list of visible objects for each camera angle
@ -632,12 +687,6 @@ class ExportMyFormat(bpy.types.Operator, ExportHelper):
if self.exp_Precalc:
# Set rendering resolution
bpy.context.scene.render.resolution_x = 320
bpy.context.scene.render.resolution_y = 240
# Get BGs TIM size depending on mode
timSize = bpy.context.scene.render.resolution_x >> TIMshift
@ -646,7 +695,7 @@ class ExportMyFormat(bpy.types.Operator, ExportHelper):
# Create folder if it doesn't exist
os.makedirs(dirpath, exist_ok = 1)
# ~ os.makedirs(timFolder, exist_ok = 1)
# Set file format config
@ -676,7 +725,7 @@ class ExportMyFormat(bpy.types.Operator, ExportHelper):
if o.type == 'CAMERA' and o.name.startswith("camPath"):
filepath = folder + os.sep + "TIM" + os.sep
filepath = textureFolder + os.sep
filename = "bg_" + CleanName(o.name)
@ -696,7 +745,7 @@ class ExportMyFormat(bpy.types.Operator, ExportHelper):
if not VramIsFull( bpy.context.scene.render.resolution_x ):
convertBGtoTIM( filepath + filename + fileext , bpp = TIMbpp, timX = nextTpage, timY = tpageY, clutY = nextClutSlot )
convertBGtoTIM( filepath + filename + fileext , bpp = TIMbpp, timX = nextTpage, timY = tpageY, clutY = nextClutSlot, transparency = "nonblack" )
else:
@ -706,7 +755,7 @@ class ExportMyFormat(bpy.types.Operator, ExportHelper):
if not VramIsFull( bpy.context.scene.render.resolution_x ):
convertBGtoTIM( filepath + filename + fileext , bpp = TIMbpp, timX = nextTpage, timY = tpageY, clutY = nextClutSlot )
convertBGtoTIM( filepath + filename + fileext , bpp = TIMbpp, timX = nextTpage, timY = tpageY, clutY = nextClutSlot, transparency = "nonblack" )
# Add camera object to camAngles
@ -738,33 +787,43 @@ class ExportMyFormat(bpy.types.Operator, ExportHelper):
# ~ else:
# For now, use .blender file name
# ~ fileName = bpy.path.basename(filepath)
lvlNbr = self.exp_LvlNbr
fileName = 'level' + str( lvlNbr )
# We're writing a few files:
# - custom_types.h contains the 'engine' 's specific struct definitions
# - level.h contains the forward declaration of the level's variables
# - level.c contains the initialization and data of those variables
# 'custom_types.h' goes in project's root
# 'custom_types.h' goes in export folder
custom_types_h = folder + os.sep + 'custom_types.h'
custom_types_h = expFolder + os.sep + 'custom_types.h'
# If export mode is set to Use blender file name
# ~ if self.exp_expMode:
# ~ fileName = bpy.path.basename(filepath)
# ~ filepath = self.filepath
# ~ folder = os.path.dirname(bpy.path.abspath(filepath))
# ~ levels_folder = folder + os.sep
# ~ else:
lvlNbr = self.exp_LvlNbr
fileName = 'level' + str( lvlNbr )
# Levels files go in ./levels/
# If ./levels does not exist, create it
if not os.path.exists(folder + os.sep + 'levels'):
if not os.path.exists( expFolder + os.sep + 'levels'):
os.mkdir(folder + os.sep + 'levels')
levels_folder = folder + os.sep + 'levels' + os.sep
os.mkdir( expFolder + os.sep + 'levels')
levels_folder = expFolder + os.sep + 'levels' + os.sep
# TODO : dynamic filenaming
level_h = levels_folder + fileName + '.h'
@ -1280,7 +1339,7 @@ class ExportMyFormat(bpy.types.Operator, ExportHelper):
f.write("SVECTOR " + fileName + "_model"+cleanName+"_uv[] = {\n")
level_symbols.append( "SVECTOR " + fileName + "_model"+cleanName+"_uv[]")
level_symbols.append( "SVECTOR " + fileName + "_model" + cleanName + "_uv[]" )
texture_image = m.uv_textures[t].data[0].image
@ -1320,9 +1379,9 @@ class ExportMyFormat(bpy.types.Operator, ExportHelper):
if texture_image.filepath == '':
os.makedirs(dirpath, exist_ok = 1)
# ~ os.makedirs(dirpath, exist_ok = 1)
texture_image.filepath_raw = folder + os.sep + "TIM" + os.sep + CleanName(texture_image.name) + "." + texture_image.file_format
texture_image.filepath_raw = textureFolder + os.sep + CleanName(texture_image.name) + "." + texture_image.file_format
texture_image.save()
@ -1704,9 +1763,7 @@ class ExportMyFormat(bpy.types.Operator, ExportHelper):
tex_name = tex_name[ : tex_name.rfind( '.' ) ]
# TODO : Add a way to arrange TIM's VM layout to avoid overlapping
filePathWithExt = folder + os.sep + "TIM" + os.sep + CleanName( tex_name ) + "." + texture_image.file_format.lower()
filePathWithExt = textureFolder + os.sep + CleanName( tex_name ) + "." + texture_image.file_format.lower()
if not VramIsFull( bpy.context.scene.render.resolution_x ):
@ -2670,7 +2727,7 @@ class ExportMyFormat(bpy.types.Operator, ExportHelper):
"\t&" + fileName + "_lgtmat,\n" +
"\t&" + fileName + "_meshes,\n" +
"\t(MESH **)&" + fileName + "_meshes,\n" +
"\t&" + fileName + "_meshes_length,\n" +
@ -2684,7 +2741,7 @@ class ExportMyFormat(bpy.types.Operator, ExportHelper):
"\t&" + fileName + "_camPath,\n" +
"\t&" + fileName + "_camAngles,\n" +
"\t(CAMANGLE **)&" + fileName + "_camAngles,\n" +
"\t&" + fileName + "_node" + CleanName(nodePtr) + ",\n" +