From 8e2d7a41333ac30058d3281e03a450f04050d7d9 Mon Sep 17 00:00:00 2001 From: yyc12345 Date: Thu, 23 Nov 2023 22:34:06 +0800 Subject: [PATCH] update plugin - revert merge of ballance textures - prepare for naming convension dev - show icons for virtools group list --- bbp_ng/OP_IMPORT_virtools.py | 10 +- bbp_ng/PROP_virtools_group.py | 2 +- bbp_ng/PROP_virtools_texture.py | 357 +------------------------------ bbp_ng/UTIL_ballance_texture.py | 355 ++++++++++++++++++++++++++++++ bbp_ng/UTIL_icons_manager.py | 4 +- bbp_ng/UTIL_naming_convension.py | 3 + 6 files changed, 369 insertions(+), 362 deletions(-) create mode 100644 bbp_ng/UTIL_ballance_texture.py create mode 100644 bbp_ng/UTIL_naming_convension.py diff --git a/bbp_ng/OP_IMPORT_virtools.py b/bbp_ng/OP_IMPORT_virtools.py index 776c651..22070bb 100644 --- a/bbp_ng/OP_IMPORT_virtools.py +++ b/bbp_ng/OP_IMPORT_virtools.py @@ -2,8 +2,8 @@ import bpy from bpy_extras.wm_utils.progress_report import ProgressReport import tempfile, os, typing from . import PROP_preferences, UTIL_ioport_shared -from . import UTIL_virtools_types, UTIL_functions, UTIL_file_browser, UTIL_blender_mesh -from . import PROP_virtools_group, PROP_virtools_material, PROP_virtools_texture, PROP_virtools_mesh +from . import UTIL_virtools_types, UTIL_functions, UTIL_file_browser, UTIL_blender_mesh, UTIL_ballance_texture +from . import PROP_virtools_group, PROP_virtools_material, PROP_virtools_mesh from .PyBMap import bmap_wrapper as bmap class BBP_OT_import_virtools(bpy.types.Operator, UTIL_file_browser.ImportVirtoolsFile, UTIL_ioport_shared.ImportParams, UTIL_ioport_shared.VirtoolsParams): @@ -94,14 +94,14 @@ def _import_virtools_textures( vttexture.save_image(texpath_to_load) # detect whether it is ballance texture and load - try_blc_tex: str | None = PROP_virtools_texture.get_ballance_texture_filename(texpath_to_load) + try_blc_tex: str | None = UTIL_ballance_texture.get_ballance_texture_filename(texpath_to_load) if try_blc_tex: # load as ballance texture - tex = PROP_virtools_texture.load_ballance_texture(try_blc_tex) + tex = UTIL_ballance_texture.load_ballance_texture(try_blc_tex) else: # load as other textures - tex = PROP_virtools_texture.load_other_texture(texpath_to_load) + tex = UTIL_ballance_texture.load_other_texture(texpath_to_load) # rename and insert it to map tex.name = UTIL_functions.virtools_name_regulator(vttexture.get_name()) diff --git a/bbp_ng/PROP_virtools_group.py b/bbp_ng/PROP_virtools_group.py index 1df0edb..92eda73 100644 --- a/bbp_ng/PROP_virtools_group.py +++ b/bbp_ng/PROP_virtools_group.py @@ -270,7 +270,7 @@ class SharedGroupNameInputProperties(): class BBP_UL_virtools_groups(bpy.types.UIList): def draw_item(self, context, layout: bpy.types.UILayout, data, item: BBP_PG_virtools_group, icon, active_data, active_propname): - layout.label(text = item.group_name, translate = False, icon = 'GROUP') + layout.label(text = item.group_name, translate = False, icon_value = _get_group_icon_by_name(item.group_name)) class BBP_OT_add_virtools_groups(bpy.types.Operator, SharedGroupNameInputProperties): """Add a Virtools Group for Active Object.""" diff --git a/bbp_ng/PROP_virtools_texture.py b/bbp_ng/PROP_virtools_texture.py index 81c6637..03cea1e 100644 --- a/bbp_ng/PROP_virtools_texture.py +++ b/bbp_ng/PROP_virtools_texture.py @@ -1,6 +1,6 @@ -import bpy, bpy_extras -import typing, os -from . import PROP_preferences, UTIL_virtools_types, UTIL_functions +import bpy +import typing +from . import UTIL_virtools_types, UTIL_functions #region Virtools Texture Annotation Data @@ -138,354 +138,3 @@ def unregister(): del bpy.types.Image.virtools_texture bpy.utils.unregister_class(BBP_PG_virtools_texture) - -## Ballance Texture Usage -# The aim of this module is to make sure every Ballance texture only have 1 instance in Blender as much as we can -# (it mean that if user force to add multiple textures, we can not stop them) -# -# All image loading and saving operation should be operated via this module, no matter what your are loading is or is not Ballance textures. -# This module provide a universal way to check whether texture is a part of Ballance textures and use different strategy to load them. -# -# The loading and saving of textures frequently happend when importing or exporting, there is 2 example about them. -# ``` -# # bmx loading example -# bmx_texture = blabla() -# if bmx_texture.is_external(): -# tex = PROP_virtools_texture.load_ballance_texture(bmx_texture.filename) -# else: -# tex = PROP_virtools_texture.load_other_texture(os.path.join(tempfolder, 'Textures', bmx_texture.filename)) -# texture_process(tex) # process loaded texture -# -# # nmo loading example -# vt_texture = blabla() -# place_to_load = "" -# if vt_texture.is_raw_data(): -# place_to_load = allocate_place() -# save_vt_raw_data_texture(vt_texture, place_to_load) -# if vt_texture.is_original_file() or vt_texture.is_external(): -# place_to_load = vt_texture.filename -# -# try_filename = PROP_virtools_texture.get_ballance_texture_filename(place_to_load) -# if try_filename: -# # load as ballance texture -# tex = PROP_virtools_texture.load_ballance_texture(try_filename) -# else: -# # load as other texture -# tex = PROP_virtools_texture.load_other_texture(place_to_load) -# texture_process(tex) # process loaded texture -# -# ``` -# -# ``` -# # bmx saving example -# tex: bpy.types.Image = texture_getter() -# try_filename = PROP_virtools_texture.get_ballance_texture_filename( -# PROP_virtools_texture.get_texture_filepath(tex)) -# if try_filename: -# write_external_filename(try_filename) -# else: -# realpath = PROP_virtools_texture.generate_other_texture_save_path(tex, tempfolder) -# PROP_virtools_texture.save_other_texture(tex, realpath) -# write_filename(realpath) -# -# ``` - -#region Ballance Texture Assist Functions - -def _get_ballance_texture_folder() -> str: - """! - Get Ballance texture folder from preferences. - - @exception BBPException Ballance texture folder is not set in preferences - - @return The path to Ballance texture folder. - """ - - pref: PROP_preferences.RawPreferences = PROP_preferences.get_raw_preferences() - if not pref.has_valid_blc_tex_folder(): - raise UTIL_functions.BBPException("No valid Ballance texture folder in preferences.") - - return pref.mBallanceTextureFolder - -def _is_path_equal(path1: str, path2: str) -> bool: - """! - Check whether 2 path are equal. - - The checker will call os.path.normcase and os.path.normpath in series to regulate the give path. - - @param path1[in] The given absolute path 1 - @param path2[in] The given absolute path 2 - @return True if equal. - """ - - return os.path.normpath(os.path.normcase(path1)) == os.path.normpath(os.path.normcase(path2)) - -#endregion - -#region Ballance Texture Detect Functions - -g_OpaqueBallanceTexturePreset: RawVirtoolsTexture = RawVirtoolsTexture( - mSaveOptions = UTIL_virtools_types.CK_TEXTURE_SAVEOPTIONS.CKTEXTURE_EXTERNAL, - mVideoFormat = UTIL_virtools_types.VX_PIXELFORMAT._16_ARGB1555, -) -g_TransparentBallanceTexturePreset: RawVirtoolsTexture = RawVirtoolsTexture( - mSaveOptions = UTIL_virtools_types.CK_TEXTURE_SAVEOPTIONS.CKTEXTURE_EXTERNAL, - mVideoFormat = UTIL_virtools_types.VX_PIXELFORMAT._32_ARGB8888, -) -g_NonBallanceTexturePreset: RawVirtoolsTexture = RawVirtoolsTexture( - mSaveOptions = UTIL_virtools_types.CK_TEXTURE_SAVEOPTIONS.CKTEXTURE_RAWDATA, - mVideoFormat = UTIL_virtools_types.VX_PIXELFORMAT._32_ARGB8888, -) - -## The preset collection of all Ballance texture. -# Key is texture name and can be used as file name checking. -# Value is its preset which can be assigned. -g_BallanceTexturePresets: dict[str, RawVirtoolsTexture] = { - # "atari.avi": g_TransparentBallanceTexturePreset, - "atari.bmp": g_OpaqueBallanceTexturePreset, - "Ball_LightningSphere1.bmp": g_OpaqueBallanceTexturePreset, - "Ball_LightningSphere2.bmp": g_OpaqueBallanceTexturePreset, - "Ball_LightningSphere3.bmp": g_OpaqueBallanceTexturePreset, - "Ball_Paper.bmp": g_OpaqueBallanceTexturePreset, - "Ball_Stone.bmp": g_OpaqueBallanceTexturePreset, - "Ball_Wood.bmp": g_OpaqueBallanceTexturePreset, - "Brick.bmp": g_OpaqueBallanceTexturePreset, - "Button01_deselect.tga": g_TransparentBallanceTexturePreset, - "Button01_select.tga": g_TransparentBallanceTexturePreset, - "Button01_special.tga": g_TransparentBallanceTexturePreset, - "Column_beige.bmp": g_OpaqueBallanceTexturePreset, - "Column_beige_fade.tga": g_TransparentBallanceTexturePreset, - "Column_blue.bmp": g_OpaqueBallanceTexturePreset, - "Cursor.tga": g_TransparentBallanceTexturePreset, - "Dome.bmp": g_OpaqueBallanceTexturePreset, - "DomeEnvironment.bmp": g_OpaqueBallanceTexturePreset, - "DomeShadow.tga": g_TransparentBallanceTexturePreset, - "ExtraBall.bmp": g_OpaqueBallanceTexturePreset, - "ExtraParticle.bmp": g_OpaqueBallanceTexturePreset, - "E_Holzbeschlag.bmp": g_OpaqueBallanceTexturePreset, - "FloorGlow.bmp": g_OpaqueBallanceTexturePreset, - "Floor_Side.bmp": g_OpaqueBallanceTexturePreset, - "Floor_Top_Border.bmp": g_OpaqueBallanceTexturePreset, - "Floor_Top_Borderless.bmp": g_OpaqueBallanceTexturePreset, - "Floor_Top_Checkpoint.bmp": g_OpaqueBallanceTexturePreset, - "Floor_Top_Flat.bmp": g_OpaqueBallanceTexturePreset, - "Floor_Top_Profil.bmp": g_OpaqueBallanceTexturePreset, - "Floor_Top_ProfilFlat.bmp": g_OpaqueBallanceTexturePreset, - "Font_1.tga": g_TransparentBallanceTexturePreset, - "Gravitylogo_intro.bmp": g_OpaqueBallanceTexturePreset, - "HardShadow.bmp": g_OpaqueBallanceTexturePreset, - "Laterne_Glas.bmp": g_OpaqueBallanceTexturePreset, - "Laterne_Schatten.tga": g_TransparentBallanceTexturePreset, - "Laterne_Verlauf.tga": g_TransparentBallanceTexturePreset, - "Logo.bmp": g_OpaqueBallanceTexturePreset, - "Metal_stained.bmp": g_OpaqueBallanceTexturePreset, - "Misc_Ufo.bmp": g_OpaqueBallanceTexturePreset, - "Misc_UFO_Flash.bmp": g_OpaqueBallanceTexturePreset, - "Modul03_Floor.bmp": g_OpaqueBallanceTexturePreset, - "Modul03_Wall.bmp": g_OpaqueBallanceTexturePreset, - "Modul11_13_Wood.bmp": g_OpaqueBallanceTexturePreset, - "Modul11_Wood.bmp": g_OpaqueBallanceTexturePreset, - "Modul15.bmp": g_OpaqueBallanceTexturePreset, - "Modul16.bmp": g_OpaqueBallanceTexturePreset, - "Modul18.bmp": g_OpaqueBallanceTexturePreset, - "Modul18_Gitter.tga": g_TransparentBallanceTexturePreset, - "Modul30_d_Seiten.bmp": g_OpaqueBallanceTexturePreset, - "Particle_Flames.bmp": g_OpaqueBallanceTexturePreset, - "Particle_Smoke.bmp": g_OpaqueBallanceTexturePreset, - "PE_Bal_balloons.bmp": g_OpaqueBallanceTexturePreset, - "PE_Bal_platform.bmp": g_OpaqueBallanceTexturePreset, - "PE_Ufo_env.bmp": g_OpaqueBallanceTexturePreset, - "Pfeil.tga": g_TransparentBallanceTexturePreset, - "P_Extra_Life_Oil.bmp": g_OpaqueBallanceTexturePreset, - "P_Extra_Life_Particle.bmp": g_OpaqueBallanceTexturePreset, - "P_Extra_Life_Shadow.bmp": g_OpaqueBallanceTexturePreset, - "Rail_Environment.bmp": g_OpaqueBallanceTexturePreset, - "sandsack.bmp": g_OpaqueBallanceTexturePreset, - "SkyLayer.bmp": g_OpaqueBallanceTexturePreset, - "Sky_Vortex.bmp": g_OpaqueBallanceTexturePreset, - "Stick_Bottom.tga": g_TransparentBallanceTexturePreset, - "Stick_Stripes.bmp": g_OpaqueBallanceTexturePreset, - "Target.bmp": g_OpaqueBallanceTexturePreset, - "Tower_Roof.bmp": g_OpaqueBallanceTexturePreset, - "Trafo_Environment.bmp": g_OpaqueBallanceTexturePreset, - "Trafo_FlashField.bmp": g_OpaqueBallanceTexturePreset, - "Trafo_Shadow_Big.tga": g_TransparentBallanceTexturePreset, - "Tut_Pfeil01.tga": g_TransparentBallanceTexturePreset, - "Tut_Pfeil_Hoch.tga": g_TransparentBallanceTexturePreset, - "Wolken_intro.tga": g_TransparentBallanceTexturePreset, - "Wood_Metal.bmp": g_OpaqueBallanceTexturePreset, - "Wood_MetalStripes.bmp": g_OpaqueBallanceTexturePreset, - "Wood_Misc.bmp": g_OpaqueBallanceTexturePreset, - "Wood_Nailed.bmp": g_OpaqueBallanceTexturePreset, - "Wood_Old.bmp": g_OpaqueBallanceTexturePreset, - "Wood_Panel.bmp": g_OpaqueBallanceTexturePreset, - "Wood_Plain.bmp": g_OpaqueBallanceTexturePreset, - "Wood_Plain2.bmp": g_OpaqueBallanceTexturePreset, - "Wood_Raft.bmp": g_OpaqueBallanceTexturePreset, -} - -def get_ballance_texture_filename(texpath: str) -> str | None: - """! - Return the filename part for valid Ballance texture path. - - If the file name part of given path is not a entry of Ballance texture file name list, function will return None immediately. - Otherwise, function will check whether the given file path is really point to the Ballance texture folder. - - @exception BBPException Ballance texture folder is not set in preferences - - @param imgpath[in] Absolute path to texture. - @return File name part of given texture path if given path is a valid Ballance texture path, or None if the path not point to a valid Ballance texture. - """ - - # check file name first - filename: str = os.path.basename(texpath) - if filename not in g_BallanceTexturePresets: return None - - # if file name matched, check whether it located in ballance texture folder - probe: str = os.path.join(_get_ballance_texture_folder(), filename) - if not _is_path_equal(probe, texpath): return None - - return filename - -def is_ballance_texture_filepath(texpath: str) -> bool: - """! - Check whether the given path is a valid Ballance texture. - - Simply call get_ballance_texture_filename() and check whether it return string or None. - - @exception BBPException Ballance texture folder is not set in preferences - - @param imgpath[in] Absolute path to texture. - @return True if it is Ballance texture. - @see get_ballance_texture_filename - """ - - return get_ballance_texture_filename(texpath) is not None - -def get_texture_filepath(tex: bpy.types.Image) -> str: - """! - Get the file path referenced by the given texture. - - This function will try getting the referenced file path of given texture, including packed or not packed texture. - - This function will try resolving the file path when given texture is packed according to the path of - current opend blender file and Ballance texture folder speficied in preferences. - - If resolving failed, it may return blender packed data url, for example `\\./xxx.bmp` - - @exception BBPException Ballance texture folder is not set in preferences - - @param tex[in] The image where the file name need to be got. - @return The resolved absolute file path. - """ - - # resolve image path - absfilepath: str = bpy_extras.io_utils.path_reference( - tex.filepath, bpy.data.filepath, _get_ballance_texture_folder(), - 'ABSOLUTE', "", None, None - ) - - # return resolved path - return absfilepath - -def is_ballance_texture(tex: bpy.types.Image) -> bool: - """! - Check whether the provided image is Ballance texture according to its referenced file path. - - A simply calling combination of get_texture_filepath and is_ballance_texture_filepath - - @exception BBPException Ballance texture folder is not set in preferences - - @param tex[in] The texture to check. - @return True if it is Ballance texture. - @see get_texture_filepath, is_ballance_texture_filepath - """ - - return is_ballance_texture_filepath(get_texture_filepath(tex)) - -#endregion - -#region Ballance Texture Load & Save - -def load_ballance_texture(texname: str) -> bpy.types.Image: - """! - Load Ballance texture. - - + The returned image may be redirected to a existing image according to its file path, because all Ballance textures are shared. - + The loaded image is saved as external. No pack will be operated because plugin assume all user have Ballance texture folder. - - @exception BBPException Ballance texture folder is not set in preferences, or provided file name is invalid. - - @param texname[in] the file name (not the path) of loading Ballance texture. Invalid file name will raise exception. - @return The loaded image. - """ - - # try getting preset (also check texture name) - tex_preset: RawVirtoolsTexture = g_BallanceTexturePresets.get(texname, None) - if tex_preset is None: - raise UTIL_functions.BBPException("Invalid Ballance texture file name.") - - # load image - # check existing image in any case. because we need make sure ballance texture is unique. - filepath: str = os.path.join(_get_ballance_texture_folder(), texname) - ret: bpy.types.Image = bpy.data.images.load(filepath, check_existing = True) - - # apply preset and return - set_raw_virtools_texture(ret, tex_preset) - return ret - -def load_other_texture(texname: str) -> bpy.types.Image: - """! - Load the Texture which is not a part of Ballance texture. - - This function is different with load_ballance_texture(). It can be seen as the opposition of load_ballance_texture(). - This function is used when loading the temp images created by BMX file resolving or Virtools engine. - Because these temp file will be deleted after importing, this function need pack the loaded file into blender file immediately after loading. - - @remark - + The loaded texture will be immediately packed into blender file. - + Loading will NOT check any loaded image according to file path. - - @param texname[in] the absolute path to the loading image. - @return The loaded image. - """ - - # load image first - # always do not check the same image. - ret: bpy.types.Image = bpy.data.images.load(texname, check_existing = False) - - # then immediately pack it into file. - ret.pack() - - # apply general non-ballance texture preset and return image - set_raw_virtools_texture(ret, g_NonBallanceTexturePreset) - return ret - -def generate_other_texture_save_path(tex: bpy.types.Image, file_folder: str) -> str: - """! - Generate the path to saved file. - - This function first get file name from texture, then combine it with given dest file folder, - and return it. - Frequently used with save_other_texture to create its parameter. - - @param tex[in] The saving texture - @param filepath[in] The absolute path to the folder where the texture will be saved. - @return The path to saved file. - """ - return os.path.join(file_folder, os.path.basename(get_texture_filepath(tex))) - -def save_other_texture(tex: bpy.types.Image, filepath: str) -> None: - """! - Save the texture which is not a part of Ballance texture. - - This function is frequently used when exporting something. - Usually used to save the texture loaded by load_other_texture, because the texture loaded by load_ballance_texture do not need save. - This function accept textures which is packed or not packed in blender file. - - @param tex[in] The saving texture - @param filepath[in] The absolute path to saving file. - """ - tex.save(filepath) - -#endregion diff --git a/bbp_ng/UTIL_ballance_texture.py b/bbp_ng/UTIL_ballance_texture.py new file mode 100644 index 0000000..7a67769 --- /dev/null +++ b/bbp_ng/UTIL_ballance_texture.py @@ -0,0 +1,355 @@ +import bpy, bpy_extras +import typing, os +from . import PROP_preferences, PROP_virtools_texture +from . import UTIL_virtools_types, UTIL_functions + +## Ballance Texture Usage +# The aim of this module is to make sure every Ballance texture only have 1 instance in Blender as much as we can +# (it mean that if user force to add multiple textures, we can not stop them) +# +# All image loading and saving operation should be operated via this module, no matter what your are loading is or is not Ballance textures. +# This module provide a universal way to check whether texture is a part of Ballance textures and use different strategy to load them. +# +# The loading and saving of textures frequently happend when importing or exporting, there is 2 example about them. +# ``` +# # bmx loading example +# bmx_texture = blabla() +# if bmx_texture.is_external(): +# tex = PROP_virtools_texture.load_ballance_texture(bmx_texture.filename) +# else: +# tex = PROP_virtools_texture.load_other_texture(os.path.join(tempfolder, 'Textures', bmx_texture.filename)) +# texture_process(tex) # process loaded texture +# +# # nmo loading example +# vt_texture = blabla() +# place_to_load = "" +# if vt_texture.is_raw_data(): +# place_to_load = allocate_place() +# save_vt_raw_data_texture(vt_texture, place_to_load) +# if vt_texture.is_original_file() or vt_texture.is_external(): +# place_to_load = vt_texture.filename +# +# try_filename = PROP_virtools_texture.get_ballance_texture_filename(place_to_load) +# if try_filename: +# # load as ballance texture +# tex = PROP_virtools_texture.load_ballance_texture(try_filename) +# else: +# # load as other texture +# tex = PROP_virtools_texture.load_other_texture(place_to_load) +# texture_process(tex) # process loaded texture +# +# ``` +# +# ``` +# # bmx saving example +# tex: bpy.types.Image = texture_getter() +# try_filename = PROP_virtools_texture.get_ballance_texture_filename( +# PROP_virtools_texture.get_texture_filepath(tex)) +# if try_filename: +# write_external_filename(try_filename) +# else: +# realpath = PROP_virtools_texture.generate_other_texture_save_path(tex, tempfolder) +# PROP_virtools_texture.save_other_texture(tex, realpath) +# write_filename(realpath) +# +# ``` + +#region Ballance Texture Assist Functions + +def _get_ballance_texture_folder() -> str: + """! + Get Ballance texture folder from preferences. + + @exception BBPException Ballance texture folder is not set in preferences + + @return The path to Ballance texture folder. + """ + + pref: PROP_preferences.RawPreferences = PROP_preferences.get_raw_preferences() + if not pref.has_valid_blc_tex_folder(): + raise UTIL_functions.BBPException("No valid Ballance texture folder in preferences.") + + return pref.mBallanceTextureFolder + +def _is_path_equal(path1: str, path2: str) -> bool: + """! + Check whether 2 path are equal. + + The checker will call os.path.normcase and os.path.normpath in series to regulate the give path. + + @param path1[in] The given absolute path 1 + @param path2[in] The given absolute path 2 + @return True if equal. + """ + + return os.path.normpath(os.path.normcase(path1)) == os.path.normpath(os.path.normcase(path2)) + +#endregion + +#region Ballance Texture Detect Functions + +g_OpaqueBallanceTexturePreset: PROP_virtools_texture.RawVirtoolsTexture = PROP_virtools_texture.RawVirtoolsTexture( + mSaveOptions = UTIL_virtools_types.CK_TEXTURE_SAVEOPTIONS.CKTEXTURE_EXTERNAL, + mVideoFormat = UTIL_virtools_types.VX_PIXELFORMAT._16_ARGB1555, +) +g_TransparentBallanceTexturePreset: PROP_virtools_texture.RawVirtoolsTexture = PROP_virtools_texture.RawVirtoolsTexture( + mSaveOptions = UTIL_virtools_types.CK_TEXTURE_SAVEOPTIONS.CKTEXTURE_EXTERNAL, + mVideoFormat = UTIL_virtools_types.VX_PIXELFORMAT._32_ARGB8888, +) +g_NonBallanceTexturePreset: PROP_virtools_texture.RawVirtoolsTexture = PROP_virtools_texture.RawVirtoolsTexture( + mSaveOptions = UTIL_virtools_types.CK_TEXTURE_SAVEOPTIONS.CKTEXTURE_RAWDATA, + mVideoFormat = UTIL_virtools_types.VX_PIXELFORMAT._32_ARGB8888, +) + +## The preset collection of all Ballance texture. +# Key is texture name and can be used as file name checking. +# Value is its preset which can be assigned. +g_BallanceTexturePresets: dict[str, PROP_virtools_texture.RawVirtoolsTexture] = { + # "atari.avi": g_TransparentBallanceTexturePreset, + "atari.bmp": g_OpaqueBallanceTexturePreset, + "Ball_LightningSphere1.bmp": g_OpaqueBallanceTexturePreset, + "Ball_LightningSphere2.bmp": g_OpaqueBallanceTexturePreset, + "Ball_LightningSphere3.bmp": g_OpaqueBallanceTexturePreset, + "Ball_Paper.bmp": g_OpaqueBallanceTexturePreset, + "Ball_Stone.bmp": g_OpaqueBallanceTexturePreset, + "Ball_Wood.bmp": g_OpaqueBallanceTexturePreset, + "Brick.bmp": g_OpaqueBallanceTexturePreset, + "Button01_deselect.tga": g_TransparentBallanceTexturePreset, + "Button01_select.tga": g_TransparentBallanceTexturePreset, + "Button01_special.tga": g_TransparentBallanceTexturePreset, + "Column_beige.bmp": g_OpaqueBallanceTexturePreset, + "Column_beige_fade.tga": g_TransparentBallanceTexturePreset, + "Column_blue.bmp": g_OpaqueBallanceTexturePreset, + "Cursor.tga": g_TransparentBallanceTexturePreset, + "Dome.bmp": g_OpaqueBallanceTexturePreset, + "DomeEnvironment.bmp": g_OpaqueBallanceTexturePreset, + "DomeShadow.tga": g_TransparentBallanceTexturePreset, + "ExtraBall.bmp": g_OpaqueBallanceTexturePreset, + "ExtraParticle.bmp": g_OpaqueBallanceTexturePreset, + "E_Holzbeschlag.bmp": g_OpaqueBallanceTexturePreset, + "FloorGlow.bmp": g_OpaqueBallanceTexturePreset, + "Floor_Side.bmp": g_OpaqueBallanceTexturePreset, + "Floor_Top_Border.bmp": g_OpaqueBallanceTexturePreset, + "Floor_Top_Borderless.bmp": g_OpaqueBallanceTexturePreset, + "Floor_Top_Checkpoint.bmp": g_OpaqueBallanceTexturePreset, + "Floor_Top_Flat.bmp": g_OpaqueBallanceTexturePreset, + "Floor_Top_Profil.bmp": g_OpaqueBallanceTexturePreset, + "Floor_Top_ProfilFlat.bmp": g_OpaqueBallanceTexturePreset, + "Font_1.tga": g_TransparentBallanceTexturePreset, + "Gravitylogo_intro.bmp": g_OpaqueBallanceTexturePreset, + "HardShadow.bmp": g_OpaqueBallanceTexturePreset, + "Laterne_Glas.bmp": g_OpaqueBallanceTexturePreset, + "Laterne_Schatten.tga": g_TransparentBallanceTexturePreset, + "Laterne_Verlauf.tga": g_TransparentBallanceTexturePreset, + "Logo.bmp": g_OpaqueBallanceTexturePreset, + "Metal_stained.bmp": g_OpaqueBallanceTexturePreset, + "Misc_Ufo.bmp": g_OpaqueBallanceTexturePreset, + "Misc_UFO_Flash.bmp": g_OpaqueBallanceTexturePreset, + "Modul03_Floor.bmp": g_OpaqueBallanceTexturePreset, + "Modul03_Wall.bmp": g_OpaqueBallanceTexturePreset, + "Modul11_13_Wood.bmp": g_OpaqueBallanceTexturePreset, + "Modul11_Wood.bmp": g_OpaqueBallanceTexturePreset, + "Modul15.bmp": g_OpaqueBallanceTexturePreset, + "Modul16.bmp": g_OpaqueBallanceTexturePreset, + "Modul18.bmp": g_OpaqueBallanceTexturePreset, + "Modul18_Gitter.tga": g_TransparentBallanceTexturePreset, + "Modul30_d_Seiten.bmp": g_OpaqueBallanceTexturePreset, + "Particle_Flames.bmp": g_OpaqueBallanceTexturePreset, + "Particle_Smoke.bmp": g_OpaqueBallanceTexturePreset, + "PE_Bal_balloons.bmp": g_OpaqueBallanceTexturePreset, + "PE_Bal_platform.bmp": g_OpaqueBallanceTexturePreset, + "PE_Ufo_env.bmp": g_OpaqueBallanceTexturePreset, + "Pfeil.tga": g_TransparentBallanceTexturePreset, + "P_Extra_Life_Oil.bmp": g_OpaqueBallanceTexturePreset, + "P_Extra_Life_Particle.bmp": g_OpaqueBallanceTexturePreset, + "P_Extra_Life_Shadow.bmp": g_OpaqueBallanceTexturePreset, + "Rail_Environment.bmp": g_OpaqueBallanceTexturePreset, + "sandsack.bmp": g_OpaqueBallanceTexturePreset, + "SkyLayer.bmp": g_OpaqueBallanceTexturePreset, + "Sky_Vortex.bmp": g_OpaqueBallanceTexturePreset, + "Stick_Bottom.tga": g_TransparentBallanceTexturePreset, + "Stick_Stripes.bmp": g_OpaqueBallanceTexturePreset, + "Target.bmp": g_OpaqueBallanceTexturePreset, + "Tower_Roof.bmp": g_OpaqueBallanceTexturePreset, + "Trafo_Environment.bmp": g_OpaqueBallanceTexturePreset, + "Trafo_FlashField.bmp": g_OpaqueBallanceTexturePreset, + "Trafo_Shadow_Big.tga": g_TransparentBallanceTexturePreset, + "Tut_Pfeil01.tga": g_TransparentBallanceTexturePreset, + "Tut_Pfeil_Hoch.tga": g_TransparentBallanceTexturePreset, + "Wolken_intro.tga": g_TransparentBallanceTexturePreset, + "Wood_Metal.bmp": g_OpaqueBallanceTexturePreset, + "Wood_MetalStripes.bmp": g_OpaqueBallanceTexturePreset, + "Wood_Misc.bmp": g_OpaqueBallanceTexturePreset, + "Wood_Nailed.bmp": g_OpaqueBallanceTexturePreset, + "Wood_Old.bmp": g_OpaqueBallanceTexturePreset, + "Wood_Panel.bmp": g_OpaqueBallanceTexturePreset, + "Wood_Plain.bmp": g_OpaqueBallanceTexturePreset, + "Wood_Plain2.bmp": g_OpaqueBallanceTexturePreset, + "Wood_Raft.bmp": g_OpaqueBallanceTexturePreset, +} + +def get_ballance_texture_filename(texpath: str) -> str | None: + """! + Return the filename part for valid Ballance texture path. + + If the file name part of given path is not a entry of Ballance texture file name list, function will return None immediately. + Otherwise, function will check whether the given file path is really point to the Ballance texture folder. + + @exception BBPException Ballance texture folder is not set in preferences + + @param imgpath[in] Absolute path to texture. + @return File name part of given texture path if given path is a valid Ballance texture path, or None if the path not point to a valid Ballance texture. + """ + + # check file name first + filename: str = os.path.basename(texpath) + if filename not in g_BallanceTexturePresets: return None + + # if file name matched, check whether it located in ballance texture folder + probe: str = os.path.join(_get_ballance_texture_folder(), filename) + if not _is_path_equal(probe, texpath): return None + + return filename + +def is_ballance_texture_filepath(texpath: str) -> bool: + """! + Check whether the given path is a valid Ballance texture. + + Simply call get_ballance_texture_filename() and check whether it return string or None. + + @exception BBPException Ballance texture folder is not set in preferences + + @param imgpath[in] Absolute path to texture. + @return True if it is Ballance texture. + @see get_ballance_texture_filename + """ + + return get_ballance_texture_filename(texpath) is not None + +def get_texture_filepath(tex: bpy.types.Image) -> str: + """! + Get the file path referenced by the given texture. + + This function will try getting the referenced file path of given texture, including packed or not packed texture. + + This function will try resolving the file path when given texture is packed according to the path of + current opend blender file and Ballance texture folder speficied in preferences. + + If resolving failed, it may return blender packed data url, for example `\\./xxx.bmp` + + @exception BBPException Ballance texture folder is not set in preferences + + @param tex[in] The image where the file name need to be got. + @return The resolved absolute file path. + """ + + # resolve image path + absfilepath: str = bpy_extras.io_utils.path_reference( + tex.filepath, bpy.data.filepath, _get_ballance_texture_folder(), + 'ABSOLUTE', "", None, None + ) + + # return resolved path + return absfilepath + +def is_ballance_texture(tex: bpy.types.Image) -> bool: + """! + Check whether the provided image is Ballance texture according to its referenced file path. + + A simply calling combination of get_texture_filepath and is_ballance_texture_filepath + + @exception BBPException Ballance texture folder is not set in preferences + + @param tex[in] The texture to check. + @return True if it is Ballance texture. + @see get_texture_filepath, is_ballance_texture_filepath + """ + + return is_ballance_texture_filepath(get_texture_filepath(tex)) + +#endregion + +#region Ballance Texture Load & Save + +def load_ballance_texture(texname: str) -> bpy.types.Image: + """! + Load Ballance texture. + + + The returned image may be redirected to a existing image according to its file path, because all Ballance textures are shared. + + The loaded image is saved as external. No pack will be operated because plugin assume all user have Ballance texture folder. + + @exception BBPException Ballance texture folder is not set in preferences, or provided file name is invalid. + + @param texname[in] the file name (not the path) of loading Ballance texture. Invalid file name will raise exception. + @return The loaded image. + """ + + # try getting preset (also check texture name) + tex_preset: PROP_virtools_texture.RawVirtoolsTexture = g_BallanceTexturePresets.get(texname, None) + if tex_preset is None: + raise UTIL_functions.BBPException("Invalid Ballance texture file name.") + + # load image + # check existing image in any case. because we need make sure ballance texture is unique. + filepath: str = os.path.join(_get_ballance_texture_folder(), texname) + ret: bpy.types.Image = bpy.data.images.load(filepath, check_existing = True) + + # apply preset and return + PROP_virtools_texture.set_raw_virtools_texture(ret, tex_preset) + return ret + +def load_other_texture(texname: str) -> bpy.types.Image: + """! + Load the Texture which is not a part of Ballance texture. + + This function is different with load_ballance_texture(). It can be seen as the opposition of load_ballance_texture(). + This function is used when loading the temp images created by BMX file resolving or Virtools engine. + Because these temp file will be deleted after importing, this function need pack the loaded file into blender file immediately after loading. + + @remark + + The loaded texture will be immediately packed into blender file. + + Loading will NOT check any loaded image according to file path. + + @param texname[in] the absolute path to the loading image. + @return The loaded image. + """ + + # load image first + # always do not check the same image. + ret: bpy.types.Image = bpy.data.images.load(texname, check_existing = False) + + # then immediately pack it into file. + ret.pack() + + # apply general non-ballance texture preset and return image + PROP_virtools_texture.set_raw_virtools_texture(ret, g_NonBallanceTexturePreset) + return ret + +def generate_other_texture_save_path(tex: bpy.types.Image, file_folder: str) -> str: + """! + Generate the path to saved file. + + This function first get file name from texture, then combine it with given dest file folder, + and return it. + Frequently used with save_other_texture to create its parameter. + + @param tex[in] The saving texture + @param filepath[in] The absolute path to the folder where the texture will be saved. + @return The path to saved file. + """ + return os.path.join(file_folder, os.path.basename(get_texture_filepath(tex))) + +def save_other_texture(tex: bpy.types.Image, filepath: str) -> None: + """! + Save the texture which is not a part of Ballance texture. + + This function is frequently used when exporting something. + Usually used to save the texture loaded by load_other_texture, because the texture loaded by load_ballance_texture do not need save. + This function accept textures which is packed or not packed in blender file. + + @param tex[in] The saving texture + @param filepath[in] The absolute path to saving file. + """ + tex.save(filepath) + +#endregion diff --git a/bbp_ng/UTIL_icons_manager.py b/bbp_ng/UTIL_icons_manager.py index a067234..4258efa 100644 --- a/bbp_ng/UTIL_icons_manager.py +++ b/bbp_ng/UTIL_icons_manager.py @@ -8,9 +8,9 @@ class BlenderPresetIcons(enum.Enum): #region Custom Icons Helper -_g_SupportedImageExts: set[str] = ( +_g_SupportedImageExts: set[str] = set(( '.png', -) +)) _g_IconsManager: bpy.utils.previews.ImagePreviewCollection | None = None diff --git a/bbp_ng/UTIL_naming_convension.py b/bbp_ng/UTIL_naming_convension.py new file mode 100644 index 0000000..6461d4c --- /dev/null +++ b/bbp_ng/UTIL_naming_convension.py @@ -0,0 +1,3 @@ +import bpy +import typing +from . import UTIL_functions