diff --git a/__init__.py b/__init__.py index bc5a1d977..ca3483864 100644 --- a/__init__.py +++ b/__init__.py @@ -332,13 +332,17 @@ def upgrade_changed_props(): OOT_ObjectProperties.upgrade_changed_props() for scene in bpy.data.scenes: settings: Fast64Settings_Properties = scene.fast64.settings - if settings.internal_game_update_ver != 1: - set_game_defaults(scene, False) - settings.internal_game_update_ver = 1 + if scene.get("decomp_compatible", False): scene.gameEditorMode = "Homebrew" del scene["decomp_compatible"] + if settings.internal_game_update_ver == 0: # set world defaults, since we default to ucode defaults + set_game_defaults(scene, False) + if settings.internal_game_update_ver <= 1 and scene.gameEditorMode != "Homebrew" and scene.world is not None: + scene.world.rdp_defaults.g_lighting_positional = True # set lighting positional in old/new files + settings.internal_game_update_ver = 2 + settings = scene.fast64.renderSettings light0Color = settings.pop("lightColor", None) if light0Color is not None: diff --git a/fast64_internal/f3d/f3d_bleed.py b/fast64_internal/f3d/f3d_bleed.py index 5dcadcafe..511f98324 100644 --- a/fast64_internal/f3d/f3d_bleed.py +++ b/fast64_internal/f3d/f3d_bleed.py @@ -155,9 +155,10 @@ def place_in_flaglist(flag: bool, enum: str, set_list: SPSetGeometryMode, clear_ place_in_flaglist(defaults.g_tex_gen, "G_TEXTURE_GEN", setGeo, clearGeo) place_in_flaglist(defaults.g_tex_gen_linear, "G_TEXTURE_GEN_LINEAR", setGeo, clearGeo) place_in_flaglist(defaults.g_shade_smooth, "G_SHADING_SMOOTH", setGeo, clearGeo) - if bpy.context.scene.f3d_type == "F3DEX_GBI_2" or bpy.context.scene.f3d_type == "F3DEX_GBI": + if self.f3d.F3DEX_GBI: place_in_flaglist(defaults.g_clipping, "G_CLIPPING", setGeo, clearGeo) - + if self.f3d.POINT_LIT_GBI: + place_in_flaglist(defaults.g_lighting_positional, "G_LIGHTING_POSITIONAL", setGeo, clearGeo) self.default_load_geo = SPLoadGeometryMode(setGeo.flagList) self.default_set_geo = setGeo self.default_clear_geo = clearGeo diff --git a/fast64_internal/f3d/f3d_enums.py b/fast64_internal/f3d/f3d_enums.py index 46e2ac678..47726d3de 100644 --- a/fast64_internal/f3d/f3d_enums.py +++ b/fast64_internal/f3d/f3d_enums.py @@ -390,6 +390,12 @@ "Variant of F3DEX2 family using vertex rejection instead of clipping", 5, ), + ( + "F3DEX2_PL", + "F3DEX2 (Point Lit)", + "Variant of F3DEX2 family with support for point lighting used in a few games including MM", + 11, + ), ("F3DEX3", "F3DEX3", "Custom microcode by Sauraen", 6), ("", "Homebrew", "", 8), ("RDPQ", "RDPQ", "Base libdragon microcode", 9), diff --git a/fast64_internal/f3d/f3d_gbi.py b/fast64_internal/f3d/f3d_gbi.py index d4d88d1da..af2372309 100644 --- a/fast64_internal/f3d/f3d_gbi.py +++ b/fast64_internal/f3d/f3d_gbi.py @@ -68,6 +68,7 @@ class GfxMatWriteMethod(enum.Enum): "F3DLX.Rej": (64, 32), "F3DLP.Rej": (80, 32), "F3DEX2/LX2": (32, 32), + "F3DEX2_PL": (32, 32), "F3DEX2.Rej/LX2.Rej": (64, 64), "F3DEX3": (56, 56), "T3D": (70, 70), @@ -138,13 +139,17 @@ def isUcodeF3DEX1(F3D_VER: str) -> bool: def isUcodeF3DEX2(F3D_VER: str) -> bool: - return F3D_VER in {"F3DEX2.Rej/LX2.Rej", "F3DEX2/LX2"} + return F3D_VER in {"F3DEX2.Rej/LX2.Rej", "F3DEX2/LX2", "F3DEX2_PL"} def isUcodeF3DEX3(F3D_VER: str) -> bool: return F3D_VER == "F3DEX3" +def is_ucode_point_lit(F3D_VER: str) -> bool: + return F3D_VER in {"F3DEX3", "F3DEX2_PL"} + + def is_ucode_t3d(UCODE_VER: str) -> bool: return UCODE_VER == "T3D" @@ -163,6 +168,7 @@ def __init__(self, F3D_VER): F3DEX_GBI_3 = self.F3DEX_GBI_3 = isUcodeF3DEX3(F3D_VER) F3DLP_GBI = self.F3DLP_GBI = self.F3DEX_GBI self.F3D_OLD_GBI = not (F3DEX_GBI or F3DEX_GBI_2 or F3DEX_GBI_3) + POINT_LIT_GBI = self.POINT_LIT_GBI = is_ucode_point_lit(F3D_VER) self.F3D_GBI = is_ucode_f3d(F3D_VER) # F3DEX2 is F3DEX1 and F3DEX3 is F3DEX2, but F3DEX3 is not F3DEX1 @@ -372,7 +378,6 @@ def __init__(self, F3D_VER): self.G_LIGHTING_SPECULAR = 0x00002000 self.G_FRESNEL_COLOR = 0x00004000 self.G_FRESNEL_ALPHA = 0x00008000 - self.G_LIGHTING_POSITIONAL = 0x00400000 # Ignored, always on self.allGeomModeFlags = { "G_ZBUFFER", @@ -387,7 +392,6 @@ def __init__(self, F3D_VER): "G_TEXTURE_GEN_LINEAR", "G_LOD", "G_SHADING_SMOOTH", - "G_LIGHTING_POSITIONAL", "G_CLIPPING", } if F3DEX_GBI_3: @@ -401,6 +405,9 @@ def __init__(self, F3D_VER): "G_FRESNEL_COLOR", "G_FRESNEL_ALPHA", } + if POINT_LIT_GBI: + self.G_LIGHTING_POSITIONAL = 0x00400000 + self.allGeomModeFlags.add("G_LIGHTING_POSITIONAL") self.G_FOG_H = self.G_FOG / 0x10000 self.G_LIGHTING_H = self.G_LIGHTING / 0x10000 diff --git a/fast64_internal/f3d/f3d_material.py b/fast64_internal/f3d/f3d_material.py index 890176c34..cd31d48ed 100644 --- a/fast64_internal/f3d/f3d_material.py +++ b/fast64_internal/f3d/f3d_material.py @@ -37,6 +37,7 @@ isUcodeF3DEX1, isUcodeF3DEX3, is_ucode_f3d, + is_ucode_point_lit, is_ucode_t3d, default_draw_layers, ) @@ -170,6 +171,10 @@ def menu_items_enum(_self, context): "clipping": "g_clipping", } +F3D_PL_MODES = { + "positionalLighting": "g_lighting_positional", +} + F3DEX3_GEO_MODES = { "ambientOcclusion": "g_ambocclusion", "attroffsetZ": "g_attroffset_z_enable", @@ -200,6 +205,8 @@ def geo_modes_in_ucode(UCODE_VER: str): geo_modes.update(F3DEX3_GEO_MODES) if is_ucode_t3d(UCODE_VER): geo_modes.update(T3D_GEO_MODES) + if is_ucode_point_lit(UCODE_VER): + geo_modes.update(F3D_PL_MODES) return geo_modes @@ -557,6 +564,8 @@ def indentGroup(parent: UILayout, textOrProp: Union[str, "F3DMaterialProperty"], c.enabled = enable or not disable_dependent return c + f3d = get_F3D_GBI() + ccWarnings = shadeInCC = False blendWarnings = shadeInBlender = zInBlender = False if isinstance(dataHolder, F3DMaterialProperty): @@ -575,6 +584,8 @@ def indentGroup(parent: UILayout, textOrProp: Union[str, "F3DMaterialProperty"], if ccWarnings and not shadeInCC and is_on("g_lighting") and not is_on("g_tex_gen"): multilineLabel(c, "Shade not used in CC, can disable\nlighting.", icon="INFO") draw_mode(c, "g_packed_normals", "g_lighting_specular", "g_ambocclusion", "g_fresnel_color") + if not f3d.F3DEX_GBI_3: # Draw this flag in Not Useful for f3dex3 + draw_mode(c, "g_lighting_positional") if should_draw("g_tex_gen_linear"): d = indentGroup(c, "g_tex_gen", False) else: @@ -663,9 +674,11 @@ def indentGroup(parent: UILayout, textOrProp: Union[str, "F3DMaterialProperty"], elif ccWarnings and is_on("g_shade") and not shadeInCC and not shadeInBlender: c.label(text="Shade is not being used, can disable.", icon="INFO") - if should_draw("g_lod", "g_clipping"): + if should_draw("g_lod", "g_clipping") or f3d.F3DEX_GBI_3: c = indentGroup(inputGroup, "Not useful:", True) draw_mode(c, "g_lod", "g_clipping") + if f3d.F3DEX_GBI_3: + c.prop(settings, "g_lighting_positional", text="Positional Lighting (Always enabled in EX3)") def ui_upper_mode(settings, dataHolder, layout: UILayout, useDropdown): @@ -3452,6 +3465,12 @@ class RDPSettings(PropertyGroup): update=update_node_values_with_preset, description="F3DEX1/LX only, exact function unknown", ) + g_lighting_positional: bpy.props.BoolProperty( + name="Positional Lighting", + default=False, + update=update_node_values_with_preset, + description="F3DEX2 (Point Lit): Enables calculating shade color using positional lights along with directional, ignored in F3DEX3", + ) # upper half mode # v2 only @@ -3721,7 +3740,7 @@ def attributes_from_dict(self, data: dict, info: dict): for key, attr, default in info: setattr(self, attr, data.get(key, default)) - geo_mode_attributes = {**F3D_GEO_MODES, **F3DLX_GEO_MODES, **F3DEX3_GEO_MODES} + geo_mode_attributes = {**F3D_GEO_MODES, **F3DLX_GEO_MODES, **F3D_PL_MODES, **F3DEX3_GEO_MODES, **T3D_GEO_MODES} def geo_mode_to_dict(self): data = {} diff --git a/fast64_internal/f3d/f3d_material_presets.py b/fast64_internal/f3d/f3d_material_presets.py index 89f0502eb..5d13be2f1 100644 --- a/fast64_internal/f3d/f3d_material_presets.py +++ b/fast64_internal/f3d/f3d_material_presets.py @@ -88,6 +88,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -201,6 +202,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -314,6 +316,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -427,6 +430,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -540,6 +544,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -653,6 +658,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -766,6 +772,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -879,6 +886,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -992,6 +1000,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -1105,6 +1114,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -1218,6 +1228,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -1331,6 +1342,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -1444,6 +1456,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -1557,6 +1570,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -1670,6 +1684,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -1783,6 +1798,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -1895,6 +1911,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -2025,6 +2042,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -2137,6 +2155,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -2249,6 +2268,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -2361,6 +2381,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -2473,6 +2494,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -2585,6 +2607,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -2697,6 +2720,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -2809,6 +2833,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -2921,6 +2946,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -3033,6 +3059,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -3145,6 +3172,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -3257,6 +3285,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -3370,6 +3399,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -3484,6 +3514,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -3605,6 +3636,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_DISABLE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -3776,6 +3808,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_DISABLE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -3927,6 +3960,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_DISABLE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -4078,6 +4112,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_DISABLE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -4229,6 +4264,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_DISABLE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -4380,6 +4416,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -4512,6 +4549,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -4644,6 +4682,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -4776,6 +4815,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -4908,6 +4948,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -5040,6 +5081,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -5172,6 +5214,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -5304,6 +5347,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -5436,6 +5480,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -5568,6 +5613,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -5700,6 +5746,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -5832,6 +5879,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -5964,6 +6012,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -6096,6 +6145,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -6228,6 +6278,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' @@ -6360,6 +6411,7 @@ f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_lighting_positional = True f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' diff --git a/fast64_internal/f3d/f3d_parser.py b/fast64_internal/f3d/f3d_parser.py index 6b19b2ed0..9aac34d02 100644 --- a/fast64_internal/f3d/f3d_parser.py +++ b/fast64_internal/f3d/f3d_parser.py @@ -915,6 +915,9 @@ def setGeoFlags(self, command: "ParsedMacro", value: bool): rdp_settings.g_fresnel_color = value if bitFlags & self.f3d.G_FRESNEL_ALPHA: rdp_settings.g_fresnel_alpha = value + if self.f3d.POINT_LIT_GBI: + if bitFlags & self.f3d.G_LIGHTING_POSITIONAL: + rdp_settings.g_lighting_positional = value if bitFlags & self.f3d.G_FOG: rdp_settings.g_fog = value if bitFlags & self.f3d.G_LIGHTING: @@ -959,6 +962,10 @@ def loadGeoFlags(self, command: "ParsedMacro"): rdp_settings.g_lighting_specular = False rdp_settings.g_fresnel_color = False rdp_settings.g_fresnel_alpha = False + if self.f3d.POINT_LIT_GBI: + rdp_settings.g_lighting_positional = bitFlags & self.f3d.G_LIGHTING_POSITIONAL != 0 + else: + rdp_settings.g_lighting_positional = False rdp_settings.g_fog = bitFlags & self.f3d.G_FOG != 0 rdp_settings.g_lighting = bitFlags & self.f3d.G_LIGHTING != 0 rdp_settings.g_tex_gen = bitFlags & self.f3d.G_TEXTURE_GEN != 0 diff --git a/fast64_internal/f3d/f3d_writer.py b/fast64_internal/f3d/f3d_writer.py index 53af72694..b99450617 100644 --- a/fast64_internal/f3d/f3d_writer.py +++ b/fast64_internal/f3d/f3d_writer.py @@ -1593,7 +1593,8 @@ def saveGeoModeCommon(saveFunc: Callable, settings: RDPSettings, defaults: RDPSe saveFunc(settings.g_shade, defaults.g_shade, "G_SHADE", *args) saveFunc(settings.g_cull_front, defaults.g_cull_front, "G_CULL_FRONT", *args) saveFunc(settings.g_cull_back, defaults.g_cull_back, "G_CULL_BACK", *args) - if bpy.context.scene.f3d_type == "F3DEX3": + f3d = get_F3D_GBI() + if f3d.F3DEX_GBI_3: saveFunc(settings.g_ambocclusion, defaults.g_ambocclusion, "G_AMBOCCLUSION", *args) saveFunc(settings.g_attroffset_z_enable, defaults.g_attroffset_z_enable, "G_ATTROFFSET_Z_ENABLE", *args) saveFunc(settings.g_attroffset_st_enable, defaults.g_attroffset_st_enable, "G_ATTROFFSET_ST_ENABLE", *args) @@ -1608,8 +1609,10 @@ def saveGeoModeCommon(saveFunc: Callable, settings: RDPSettings, defaults: RDPSe saveFunc(settings.g_tex_gen_linear, defaults.g_tex_gen_linear, "G_TEXTURE_GEN_LINEAR", *args) saveFunc(settings.g_lod, defaults.g_lod, "G_LOD", *args) saveFunc(settings.g_shade_smooth, defaults.g_shade_smooth, "G_SHADING_SMOOTH", *args) - if isUcodeF3DEX1(bpy.context.scene.f3d_type): + if f3d.F3DLP_GBI: saveFunc(settings.g_clipping, defaults.g_clipping, "G_CLIPPING", *args) + if f3d.POINT_LIT_GBI: + saveFunc(settings.g_lighting_positional, defaults.g_lighting_positional, "G_LIGHTING_POSITIONAL", *args) def saveGeoModeDefinition(fMaterial, settings, defaults, matWriteMethod, is_ex2: bool): diff --git a/fast64_internal/sm64/sm64_constants.py b/fast64_internal/sm64/sm64_constants.py index 68b0c4bb9..cfcf7fdd5 100644 --- a/fast64_internal/sm64/sm64_constants.py +++ b/fast64_internal/sm64/sm64_constants.py @@ -3938,6 +3938,7 @@ def get_member_as_dict(name: str, member: DictOrVal[T]): "cullBack": True, "lighting": True, "shadeSmooth": True, + "positionalLighting": True, }, "otherModeH": { "textureFilter": "G_TF_BILERP", diff --git a/fast64_internal/z64/constants.py b/fast64_internal/z64/constants.py index 6ed83eb2e..55bc3c514 100644 --- a/fast64_internal/z64/constants.py +++ b/fast64_internal/z64/constants.py @@ -511,6 +511,7 @@ "cullBack": True, "lighting": True, "shadeSmooth": True, + "positionalLighting": True, }, "otherModeH": { "alphaDither": "G_AD_NOISE",