diff --git a/fast64_internal/f3d_enums.py b/fast64_internal/f3d_enums.py index 3e2c9ba..69e2c31 100644 --- a/fast64_internal/f3d_enums.py +++ b/fast64_internal/f3d_enums.py @@ -230,6 +230,36 @@ enumBlendMix = [ ('G_BL_0', '0', '0') ] +enumRenderModesCycle1 = [ + #('Use Draw Layer', 'Use Draw Layer', 'Use Draw Layer'), + ('G_RM_ZB_OPA_SURF', 'Background', 'G_RM_ZB_OPA_SURF'), + ('G_RM_AA_ZB_OPA_SURF', 'Opaque', 'G_RM_AA_ZB_OPA_SURF'), + ('G_RM_AA_ZB_OPA_DECAL', 'Opaque Decal', 'G_RM_AA_ZB_OPA_DECAL'), + ('G_RM_AA_ZB_OPA_INTER', 'Opaque Intersecting', 'G_RM_AA_ZB_OPA_INTER'), + ('G_RM_AA_ZB_TEX_EDGE', 'Cutout', 'G_RM_AA_ZB_TEX_EDGE'), + ('G_RM_AA_ZB_XLU_SURF', 'Transparent', 'G_RM_AA_ZB_XLU_SURF'), + ('G_RM_AA_ZB_XLU_DECAL', 'Transparent Decal', 'G_RM_AA_ZB_XLU_DECAL'), + ('G_RM_AA_ZB_XLU_INTER', 'Transparent Intersecting', 'G_RM_AA_ZB_XLU_INTER'), + ('G_RM_FOG_SHADE_A', 'Fog Shade', 'G_RM_FOG_SHADE_A'), + ('G_RM_FOG_PRIM_A', 'Fog Primitive', 'G_RM_FOG_PRIM_A'), + ('G_RM_ADD', 'Add', 'G_RM_ADD'), + ('G_RM_NOOP', 'No Op', 'G_RM_NOOP'), +] + +enumRenderModesCycle2 = [ + #('Use Draw Layer', 'Use Draw Layer', 'Use Draw Layer'), + ('G_RM_ZB_OPA_SURF2', 'Background', 'G_RM_ZB_OPA_SURF2'), + ('G_RM_AA_ZB_OPA_SURF2', 'Opaque', 'G_RM_AA_ZB_OPA_SURF2'), + ('G_RM_AA_ZB_OPA_DECAL2', 'Opaque Decal', 'G_RM_AA_ZB_OPA_DECAL2'), + ('G_RM_AA_ZB_OPA_INTER2', 'Opaque Intersecting', 'G_RM_AA_ZB_OPA_INTER2'), + ('G_RM_AA_ZB_TEX_EDGE2', 'Cutout', 'G_RM_AA_ZB_TEX_EDGE2'), + ('G_RM_AA_ZB_XLU_SURF2', 'Transparent', 'G_RM_AA_ZB_XLU_SURF2'), + ('G_RM_AA_ZB_XLU_DECAL2', 'Transparent Decal', 'G_RM_AA_ZB_XLU_DECAL2'), + ('G_RM_AA_ZB_XLU_INTER2', 'Transparent Intersecting', 'G_RM_AA_ZB_XLU_INTER2'), + ('G_RM_ADD2', 'Add', 'G_RM_ADD2'), + ('G_RM_NOOP', 'No Op', 'G_RM_NOOP'), +] + enumTexFormat = [ ('I4','Intensity 4-bit', 'Intensity 4-bit'), ('I8','Intensity 8-bit', 'Intensity 8-bit'), diff --git a/fast64_internal/f3d_gbi.py b/fast64_internal/f3d_gbi.py index e271aa2..9416695 100644 --- a/fast64_internal/f3d_gbi.py +++ b/fast64_internal/f3d_gbi.py @@ -4,6 +4,7 @@ from .utility import decodeSegmentedAddr, encodeSegmentedAddr, get64bitAlignedAd from math import ceil import os from .utility import getNameFromPath +import copy lightIndex = { 'LIGHT_1' : 1, @@ -26,6 +27,17 @@ vertexBufferSize = { 'F3DEX2.Rej/LX2.Rej' : (64, 64), } +drawLayerRenderMode = { + 0: ('G_RM_ZB_OPA_SURF', 'G_RM_NOOP2'), + 1: ('G_RM_AA_ZB_OPA_SURF', 'G_RM_NOOP2'), + 2: ('G_RM_AA_ZB_OPA_DECAL', 'G_RM_NOOP2'), + 3: ('G_RM_AA_ZB_OPA_INTER', 'G_RM_NOOP2'), + 4: ('G_RM_AA_ZB_TEX_EDGE', 'G_RM_NOOP2'), + 5: ('G_RM_AA_ZB_XLU_SURF', 'G_RM_NOOP2'), + 6: ('G_RM_AA_ZB_XLU_DECAL', 'G_RM_NOOP2'), + 7: ('G_RM_AA_ZB_XLU_INTER', 'G_RM_NOOP2'), +} + class F3D: def __init__(self, F3D_VER, _HW_VERSION_1): if F3D_VER == 'F3DEX2.Rej/LX2.Rej' or \ @@ -1471,7 +1483,7 @@ class FModel: self.lights = {} # dict of (texture, (texture format, palette format)) : FImage self.textures = {} - # dict of material: (FMaterial, (width, height)) + # dict of (material, drawLayer): (FMaterial, (width, height)) self.materials = {} # dict of body part name : FMeshGroup self.meshGroups = {} @@ -1482,7 +1494,7 @@ class FModel: addresses = [] for name, meshGroup in self.meshGroups.items(): addresses.extend(meshGroup.get_ptr_addresses(f3d)) - for material, (fMaterial, texDimensions) in self.materials.items(): + for (material, drawLayer), (fMaterial, texDimensions) in self.materials.items(): addresses.extend(fMaterial.get_ptr_addresses(f3d)) return addresses @@ -1506,7 +1518,7 @@ class FModel: if not startAddrSet: startAddrSet = True startAddress = addrRange[0] - for material, (fMaterial, texDimensions) in self.materials.items(): + for (material, drawLayer), (fMaterial, texDimensions) in self.materials.items(): addrRange = fMaterial.set_addr(addrRange[1], self.f3d) if not startAddrSet: startAddrSet = True @@ -1518,7 +1530,7 @@ class FModel: light.save_binary(romfile) for info, texture in self.textures.items(): texture.save_binary(romfile) - for material, (fMaterial, texDimensions) in self.materials.items(): + for (material, drawLayer), (fMaterial, texDimensions) in self.materials.items(): fMaterial.save_binary(romfile, self.f3d, segments) for name, meshGroup in self.meshGroups.items(): meshGroup.save_binary(romfile, self.f3d, segments) @@ -1529,7 +1541,7 @@ class FModel: data += light.to_c() + '\n' for info, texture in self.textures.items(): data += texture.to_c() + '\n' - for material, (fMaterial, texDimensions) in self.materials.items(): + for (material, drawLayer), (fMaterial, texDimensions) in self.materials.items(): data += fMaterial.to_c(static) + '\n' for name, meshGroup in self.meshGroups.items(): data += meshGroup.to_c(static) + '\n' @@ -1574,7 +1586,7 @@ class FModel: raise Exception(str(e)) image.filepath = oldpath - for material, (fMaterial, texDimensions) in self.materials.items(): + for (material, drawLayer), (fMaterial, texDimensions) in self.materials.items(): data += fMaterial.to_c(static) + '\n' for name, meshGroup in self.meshGroups.items(): data += meshGroup.to_c(static) + '\n' @@ -1600,7 +1612,7 @@ class FModel: def to_c_def(self): data = '' - for material, (fMaterial, texDimensions) in self.materials.items(): + for (material, drawLayer), (fMaterial, texDimensions) in self.materials.items(): data += fMaterial.to_c_def() for name, meshGroup in self.meshGroups.items(): data += meshGroup.to_c_def() @@ -1664,7 +1676,8 @@ class FMesh: self.triangleLists = [] # VtxList self.vertexList = VtxList(name + '_vtx') - # dict of (override Material, specified Material to override) : GfxList + # dict of (override Material, specified Material to override, + # overrideType, draw layer) : GfxList self.drawMatOverrides = {} def get_ptr_addresses(self, f3d): @@ -1720,6 +1733,40 @@ class FMaterial: self.material = GfxList('mat_' + name) self.revert = GfxList('mat_revert_' + name) + def sets_rendermode(self): + for command in self.material.commands: + if isinstance(command, DPSetRenderMode): + return True + return False + + def createOrGetDrawLayerSpecific(self, drawLayer): + if not self.sets_rendermode() or drawLayer == self.defaultDrawlayer: + return [self.material, self.revert] + elif drawLayer in self.drawLayerOverrides: + return self.drawLayerOverrides[drawLayer] + else: + overrideMat = [] + for command in self.material.commands: + if isinstance(command, DPSetRenderMode): + overrideMat.append(DPSetRenderMode([ + command.flagList[0] if not self.renderModeUseDrawLayer[0] \ + else drawLayerRenderMode[drawLayer][0], + command.flagList[1] if not self.renderModeUseDrawLayer[1] \ + else drawLayerRenderMode[drawLayer][1], + ], [])) + + overrideMat.append(copy.copy(command)) + overrideRevert = [] + for command in self.revert.commands: + if isinstance(command, DPSetRenderMode): + overrideRevert.append(DPSetRenderMode(drawLayerRenderMode[drawLayer], [])) + else: + overrideRevert.append(copy.copy(command)) + + + self.drawLayerOverrides[drawLayer] = [overrideMat, overrideRevert] + return self.drawLayerOverrides[drawLayer] + def get_ptr_addresses(self, f3d): addresses = self.material.get_ptr_addresses(f3d) if self.revert is not None: @@ -1737,7 +1784,7 @@ class FMaterial: self.material.save_binary(romfile, f3d, segments) if self.revert is not None: self.revert.save_binary(romfile, f3d, segments) - + def to_c(self, static): data = self.material.to_c(static) + '\n' if self.revert is not None: @@ -2167,7 +2214,7 @@ def gsMoveWd(index, offset, data, f3d): if f3d.F3DEX_GBI_2: return gsDma1p(f3d.G_MOVEWORD, data, offset, index) else: - return gsImmp21(f3d.G_MOVEWORD, data, offset, index) + return gsImmp21(f3d.G_MOVEWORD, offset, index, data) # SPSprite2DScaleFlip # SPSprite2DDraw @@ -2672,8 +2719,8 @@ class SPFogFactor: class SPFogPosition: def __init__(self, minVal, maxVal): - self.minVal = minVal - self.maxVal = maxVal + self.minVal = int(round(minVal)) + self.maxVal = int(round(maxVal)) def to_binary(self, f3d, segments): return gsMoveWd(f3d.G_MW_FOG, f3d.G_MWO_FOG,\ @@ -3200,24 +3247,7 @@ class DPSetDepthSource: def renderFlagListToWord(flagList, f3d): word = 0 for name in flagList: - if name == 'AA_EN': word += f3d.AA_EN - elif name == 'Z_CMP': word += f3d.Z_CMP - elif name == 'Z_UPD': word += f3d.Z_UPD - elif name == 'IM_RD': word += f3d.IM_RD - elif name == 'CLR_ON_CVG': word += f3d.CLR_ON_CVG - elif name == 'CVG_DST_CLAMP': word += f3d.CVG_DST_CLAMP - elif name == 'CVG_DST_WRAP': word += f3d.CVG_DST_WRAP - elif name == 'CVG_DST_FULL': word += f3d.CVG_DST_FULL - elif name == 'CVG_DST_SAVE': word += f3d.CVG_DST_SAVE - elif name == 'ZMODE_OPA': word += f3d.ZMODE_OPA - elif name == 'ZMODE_INTER': word += f3d.ZMODE_INTER - elif name == 'ZMODE_XLU': word += f3d.ZMODE_XLU - elif name == 'ZMODE_DEC': word += f3d.ZMODE_DEC - elif name == 'CVG_X_ALPHA': word += f3d.CVG_X_ALPHA - elif name == 'ALPHA_CVG_SEL': word += f3d.ALPHA_CVG_SEL - elif name == 'FORCE_BL': word += f3d.FORCE_BL - elif name == 'TEX_EDGE': word += f3d.TEX_EDGE - else: raise ValueError("Invalid render mode flag " + name) + word += getattr(f3d, name) return word @@ -3228,17 +3258,18 @@ def GBL_c2(m1a, m1b, m2a, m2b): class DPSetRenderMode: # bl0-3 are string for each blender enum - def __init__(self, flagList, bl00, bl01, bl02, bl03, - bl10, bl11, bl12, bl13): + def __init__(self, flagList, blendList): self.flagList = flagList - self.bl00 = bl00 - self.bl01 = bl01 - self.bl02 = bl02 - self.bl03 = bl03 - self.bl10 = bl10 - self.bl11 = bl11 - self.bl12 = bl12 - self.bl13 = bl13 + self.use_preset = blendList is None + if not self.use_preset: + self.bl00 = blendList[0][0] + self.bl01 = blendList[0][1] + self.bl02 = blendList[0][2] + self.bl03 = blendList[0][3] + self.bl10 = blendList[1][0] + self.bl11 = blendList[1][1] + self.bl12 = blendList[1][2] + self.bl13 = blendList[1][3] def getGBL_c(self, f3d): bl00 = getattr(f3d, self.bl00) @@ -3254,18 +3285,30 @@ class DPSetRenderMode: def to_binary(self, f3d, segments): flagWord = renderFlagListToWord(self.flagList, f3d) - return gsSPSetOtherMode(f3d.G_SETOTHERMODE_L, - f3d.G_MDSFT_RENDERMODE, 29, flagWord | self.getGBL_c(f3d), f3d) + + if not self.use_preset: + return gsSPSetOtherMode(f3d.G_SETOTHERMODE_L, + f3d.G_MDSFT_RENDERMODE, 29, flagWord | self.getGBL_c(f3d), f3d) + else: + return gsSPSetOtherMode(f3d.G_SETOTHERMODE_L, + f3d.G_MDSFT_RENDERMODE, 29, flagWord, f3d) def to_c(self, static = True): data = 'gsDPSetRenderMode(' if static else \ 'gsDPSetRenderMode(glistp++, ' - data += 'GBL_c1(' + self.bl00 + ', ' + self.bl01 + ', ' + \ - self.bl02 + ', ' + self.bl03 + ') | GBL_c2(' + self.bl10 + \ - ', ' + self.bl11 + ', ' + self.bl12 + ', ' + self.bl13 + '), ' - for name in self.flagList: - data += name + ' | ' - return data[:-3] + ')' + + if not self.use_preset: + data += 'GBL_c1(' + self.bl00 + ', ' + self.bl01 + ', ' + \ + self.bl02 + ', ' + self.bl03 + ') | GBL_c2(' + self.bl10 + \ + ', ' + self.bl11 + ', ' + self.bl12 + ', ' + self.bl13 + '), ' + for name in self.flagList: + data += name + ' | ' + return data[:-3] + ')' + else: + if len(self.flagList) != 2: + raise ValueError("For a rendermode preset, only two fields should be used.") + data += self.flagList[0] + ', ' + self.flagList[1] + ')' + return data def to_sm64_decomp_s(self): raise ValueError("Cannot use DPSetRenderMode with gbi.inc.") diff --git a/fast64_internal/f3d_material.py b/fast64_internal/f3d_material.py index 89200f8..1f2bb3b 100644 --- a/fast64_internal/f3d_material.py +++ b/fast64_internal/f3d_material.py @@ -12,6 +12,7 @@ from .f3d_material_nodes import * from .sm64_constants import * from .utility import prop_split from bpy.utils import register_class, unregister_class +import copy def F3DOrganizeLights(self, context): # Flag to prevent infinite recursion on update callback @@ -127,8 +128,8 @@ def ui_geo_mode(settings, dataHolder, layout): if isinstance(dataHolder, bpy.types.Material) and \ settings.g_fog: material = dataHolder - layout.prop(material, 'set_fog', text = 'Set Fog') - fogGroup = layout.column() + inputGroup.prop(material, 'set_fog', text = 'Set Fog') + fogGroup = inputGroup.column() fogColorGroup = fogGroup.row().split(factor = 0.5) fogColorGroup.label(text = 'Fog Color') fogColorGroup.prop(material, 'fog_color', text = '') @@ -136,6 +137,16 @@ def ui_geo_mode(settings, dataHolder, layout): fogPositionGroup.label(text = 'Fog Range') fogPositionGroup.prop(material, 'fog_position', text = '') fogGroup.enabled = material.set_fog + inputGroup.box().label(text = 'NOTE: Fog will break with draw layer overrides.') + fogInfoBox = inputGroup.box() + fogInfoBox.label(text = 'To enable fog, make sure to do these things:') + fogInfoBox.label(text = '(Ignore this if you used the preset)') + fogInfoBox.label(text = 'In Other Mode Upper Settings, set Cycle Type to "2 Cycle".') + fogInfoBox.label(text = 'Use a combiner that has "Shade Color".') + fogInfoBox.label(text = 'In Render Settings, check "Set Render Mode".') + fogInfoBox.label(text = 'Set the first field to "Fog Shade".') + fogInfoBox.label(text = 'Set the second to the material\'s draw layer, usually "Opaque".') + inputGroup.prop(settings, 'g_lighting', text = 'Lighting') inputGroup.prop(settings, 'g_tex_gen', text = 'Texture UV Generate') inputGroup.prop(settings, 'g_tex_gen_linear', @@ -381,51 +392,60 @@ class F3DPanel(bpy.types.Panel): # cycle independent inputGroup = layout.column() inputGroup.prop(material, 'menu_lower_render', - text = 'Other Mode Lower Render Settings', + text = 'Render Settings', icon = 'TRIA_DOWN' if material.menu_lower_render else 'TRIA_RIGHT') if material.menu_lower_render: - inputGroup.prop(material, 'set_rendermode', + inputGroup.prop(material.rdp_settings, 'set_rendermode', text ='Set Render Mode?') renderGroup = inputGroup.column() - prop_split(renderGroup, material.rdp_settings, 'aa_en', 'Antialiasing') - prop_split(renderGroup, material.rdp_settings, 'z_cmp', 'Z Testing') - prop_split(renderGroup, material.rdp_settings, 'z_upd', 'Z Writing') - prop_split(renderGroup, material.rdp_settings, 'im_rd', 'IM_RD (?)') - prop_split(renderGroup, material.rdp_settings, 'clr_on_cvg', - 'Clear On Coverage') - prop_split(renderGroup, material.rdp_settings, 'cvg_dst', - 'Coverage Destination') - prop_split(renderGroup, material.rdp_settings, 'zmode', 'Z Mode') - prop_split(renderGroup, material.rdp_settings, 'cvg_x_alpha', - 'Multiply Coverage And Alpha') - prop_split(renderGroup, material.rdp_settings, 'alpha_cvg_sel', - 'Use Coverage For Alpha') - prop_split(renderGroup, material.rdp_settings, 'force_bl', 'Force Blending') + renderGroup.prop(material.rdp_settings, 'rendermode_advanced_enabled', + text = 'Show Advanced Settings') + if not material.rdp_settings.rendermode_advanced_enabled: + prop_split(renderGroup, material.rdp_settings, + 'rendermode_preset_cycle_1', "Render Mode") + if material.rdp_settings.g_mdsft_cycletype == 'G_CYC_2CYCLE': + prop_split(renderGroup, material.rdp_settings, + 'rendermode_preset_cycle_2', "Render Mode Cycle 2") + else: + prop_split(renderGroup, material.rdp_settings, 'aa_en', 'Antialiasing') + prop_split(renderGroup, material.rdp_settings, 'z_cmp', 'Z Testing') + prop_split(renderGroup, material.rdp_settings, 'z_upd', 'Z Writing') + prop_split(renderGroup, material.rdp_settings, 'im_rd', 'IM_RD (?)') + prop_split(renderGroup, material.rdp_settings, 'clr_on_cvg', + 'Clear On Coverage') + prop_split(renderGroup, material.rdp_settings, 'cvg_dst', + 'Coverage Destination') + prop_split(renderGroup, material.rdp_settings, 'zmode', 'Z Mode') + prop_split(renderGroup, material.rdp_settings, 'cvg_x_alpha', + 'Multiply Coverage And Alpha') + prop_split(renderGroup, material.rdp_settings, 'alpha_cvg_sel', + 'Use Coverage For Alpha') + prop_split(renderGroup, material.rdp_settings, 'force_bl', 'Force Blending') - # cycle dependent - (P * A + M - B) / (A + B) - combinerBox = renderGroup.box() - combinerBox.label(text='Blender (Color = (P * A + M - B) / (A + B)') - combinerCol = combinerBox.row() - rowColor = combinerCol.column() - rowAlpha = combinerCol.column() - rowColor.prop(material.rdp_settings, 'blend_p1', text = 'P') - rowColor.prop(material.rdp_settings, 'blend_m1', text = 'M') - rowAlpha.prop(material.rdp_settings, 'blend_a1', text = 'A') - rowAlpha.prop(material.rdp_settings, 'blend_b1', text = 'B') + # cycle dependent - (P * A + M - B) / (A + B) + combinerBox = renderGroup.box() + combinerBox.label(text='Blender (Color = (P * A + M - B) / (A + B)') + combinerCol = combinerBox.row() + rowColor = combinerCol.column() + rowAlpha = combinerCol.column() + rowColor.prop(material.rdp_settings, 'blend_p1', text = 'P') + rowColor.prop(material.rdp_settings, 'blend_m1', text = 'M') + rowAlpha.prop(material.rdp_settings, 'blend_a1', text = 'A') + rowAlpha.prop(material.rdp_settings, 'blend_b1', text = 'B') - if material.rdp_settings.g_mdsft_cycletype == 'G_CYC_2CYCLE': - combinerBox2 = renderGroup.box() - combinerBox2.label(text='Blender Cycle 2') - combinerCol2 = combinerBox2.row() - rowColor2 = combinerCol2.column() - rowAlpha2 = combinerCol2.column() - rowColor2.prop(material.rdp_settings, 'blend_p2', text = 'P') - rowColor2.prop(material.rdp_settings, 'blend_m2', text = 'M') - rowAlpha2.prop(material.rdp_settings, 'blend_a2', text = 'A') - rowAlpha2.prop(material.rdp_settings, 'blend_b2', text = 'B') + if material.rdp_settings.g_mdsft_cycletype == 'G_CYC_2CYCLE': + combinerBox2 = renderGroup.box() + combinerBox2.label(text='Blender Cycle 2') + combinerCol2 = combinerBox2.row() + rowColor2 = combinerCol2.column() + rowAlpha2 = combinerCol2.column() + rowColor2.prop(material.rdp_settings, 'blend_p2', text = 'P') + rowColor2.prop(material.rdp_settings, 'blend_m2', text = 'M') + rowAlpha2.prop(material.rdp_settings, 'blend_a2', text = 'A') + rowAlpha2.prop(material.rdp_settings, 'blend_b2', text = 'B') - renderGroup.enabled = material.set_rendermode + renderGroup.enabled = material.rdp_settings.set_rendermode def ui_procAnimVec(self, procAnimVec, layout, name, vecType): layout.prop(procAnimVec, 'menu', text = name, @@ -574,8 +594,8 @@ class F3DPanel(bpy.types.Panel): ui_geo_mode(material.rdp_settings, material, layout) ui_upper_mode(material.rdp_settings, material, layout) ui_lower_mode(material.rdp_settings, material, layout) - layout.box().label(text = \ - 'WARNING: Render mode settings not reset after drawing.') + #layout.box().label(text = \ + # 'WARNING: Render mode settings not reset after drawing.') self.ui_lower_render_mode(material, layout) def update_node_values(self, context): @@ -989,6 +1009,7 @@ class F3DMaterialSettings: self.g_cull_front = False self.g_cull_back = True self.g_fog = False + self.set_fog = False self.g_lighting = True self.g_tex_gen = False self.g_tex_gen_linear = False @@ -1029,14 +1050,17 @@ class F3DMaterialSettings: self.force_bl = False # cycle dependent - (P * A + M - B) / (A + B) - self.blend_p1 = None - self.blend_p2 = None - self.blend_m1 = None - self.blend_m2 = None - self.blend_a1 = None - self.blend_a2 = None - self.blend_b1 = None - self.blend_b2 = None + self.rendermode_advanced_enabled = False + self.rendermode_preset_cycle_1 = 'G_RM_AA_ZB_OPA_SURF' + self.rendermode_preset_cycle_2 = 'G_RM_AA_ZB_OPA_SURF2' + self.blend_p1 = 'G_BL_CLR_IN' + self.blend_p2 = 'G_BL_CLR_IN' + self.blend_m1 = 'G_BL_CLR_IN' + self.blend_m2 = 'G_BL_CLR_IN' + self.blend_a1 = 'G_BL_A_IN' + self.blend_a2 = 'G_BL_A_IN' + self.blend_b1 = 'G_BL_1MA' + self.blend_b2 = 'G_BL_1MA' def loadFromMaterial(self, material): if not material.is_f3d: @@ -1056,10 +1080,10 @@ class F3DMaterialSettings: material.combiner2.B, material.combiner2.C, material.combiner2.D, - material.combiner1.A_alpha, - material.combiner1.B_alpha, - material.combiner1.C_alpha, - material.combiner1.D_alpha, + material.combiner2.A_alpha, + material.combiner2.B_alpha, + material.combiner2.C_alpha, + material.combiner2.D_alpha, ) self.set_texture0 = material.tex0.tex_set self.set_texture1 = material.tex1.tex_set @@ -1069,7 +1093,7 @@ class F3DMaterialSettings: self.set_key = material.set_key self.set_k0_5 = material.set_k0_5 self.set_combiner = material.set_combiner - self.set_rendermode = material.set_rendermode + self.set_rendermode = material.rdp_settings.set_rendermode self.scale_autoprop = material.scale_autoprop # geometry mode @@ -1078,6 +1102,7 @@ class F3DMaterialSettings: self.g_cull_front = material.rdp_settings.g_cull_front self.g_cull_back = material.rdp_settings.g_cull_back self.g_fog = material.rdp_settings.g_fog + self.set_fog = material.set_fog self.g_lighting = material.rdp_settings.g_lighting self.g_tex_gen = material.rdp_settings.g_tex_gen self.g_tex_gen_linear = material.rdp_settings.g_tex_gen_linear @@ -1118,6 +1143,9 @@ class F3DMaterialSettings: self.force_bl = material.rdp_settings.force_bl # cycle dependent - (P * A + M - B) / (A + B) + self.rendermode_advanced_enabled = material.rdp_settings.rendermode_advanced_enabled + self.rendermode_preset_cycle_1 = material.rdp_settings.rendermode_preset_cycle_1 + self.rendermode_preset_cycle_2 = material.rdp_settings.rendermode_preset_cycle_2 self.blend_p1 = material.rdp_settings.blend_p1 self.blend_p2 = material.rdp_settings.blend_p2 self.blend_m1 = material.rdp_settings.blend_m1 @@ -1145,10 +1173,10 @@ class F3DMaterialSettings: material.combiner2.B = self.color_combiner[9] material.combiner2.C = self.color_combiner[10] material.combiner2.D = self.color_combiner[11] - material.combiner1.A_alpha = self.color_combiner[12] - material.combiner1.B_alpha = self.color_combiner[13] - material.combiner1.C_alpha = self.color_combiner[14] - material.combiner1.D_alpha = self.color_combiner[15] + material.combiner2.A_alpha = self.color_combiner[12] + material.combiner2.B_alpha = self.color_combiner[13] + material.combiner2.C_alpha = self.color_combiner[14] + material.combiner2.D_alpha = self.color_combiner[15] material.tex0.tex_set = self.set_texture0 material.tex1.tex_set = self.set_texture1 @@ -1158,7 +1186,7 @@ class F3DMaterialSettings: material.set_key = self.set_key material.set_k0_5 = self.set_k0_5 material.set_combiner = self.set_combiner - material.set_rendermode = self.set_rendermode + material.rdp_settings.set_rendermode = self.set_rendermode material.scale_autoprop = self.scale_autoprop # geometry mode @@ -1167,6 +1195,7 @@ class F3DMaterialSettings: material.rdp_settings.g_cull_front = self.g_cull_front material.rdp_settings.g_cull_back = self.g_cull_back material.rdp_settings.g_fog = self.g_fog + material.set_fog = self.set_fog material.rdp_settings.g_lighting = self.g_lighting material.rdp_settings.g_tex_gen = self.g_tex_gen material.rdp_settings.g_tex_gen_linear = self.g_tex_gen_linear @@ -1195,6 +1224,9 @@ class F3DMaterialSettings: # cycle independent if self.set_rendermode: + material.rdp_settings.rendermode_advanced_enabled = self.rendermode_advanced_enabled + material.rdp_settings.rendermode_preset_cycle_1 = self.rendermode_preset_cycle_1 + material.rdp_settings.rendermode_preset_cycle_2 = self.rendermode_preset_cycle_2 material.rdp_settings.aa_en = self.aa_en material.rdp_settings.z_cmp = self.z_cmp material.rdp_settings.z_upd = self.z_upd @@ -1379,37 +1411,43 @@ class RDPSettings(bpy.types.PropertyGroup): default = 'G_ZS_PIXEL') # cycle independent - set_rendermode : bpy.props.BoolProperty(default = False) - aa_en : bpy.props.BoolProperty() - z_cmp : bpy.props.BoolProperty() - z_upd : bpy.props.BoolProperty() - im_rd : bpy.props.BoolProperty() - clr_on_cvg : bpy.props.BoolProperty() + set_rendermode : bpy.props.BoolProperty(default = False, update = update_node_values) + rendermode_advanced_enabled : bpy.props.BoolProperty(default = False, update = update_node_values) + rendermode_preset_cycle_1 : bpy.props.EnumProperty(items = enumRenderModesCycle1, + default = 'G_RM_AA_ZB_OPA_SURF', name = 'Render Mode Cycle 1', update = update_node_values) + rendermode_preset_cycle_2 : bpy.props.EnumProperty(items = enumRenderModesCycle2, + default = 'G_RM_AA_ZB_OPA_SURF2', name = 'Render Mode Cycle 2', update = update_node_values) + aa_en : bpy.props.BoolProperty(update = update_node_values) + z_cmp : bpy.props.BoolProperty(update = update_node_values) + z_upd : bpy.props.BoolProperty(update = update_node_values) + im_rd : bpy.props.BoolProperty(update = update_node_values) + clr_on_cvg : bpy.props.BoolProperty(update = update_node_values) cvg_dst : bpy.props.EnumProperty( - name = 'Coverage Destination', items = enumCoverage) + name = 'Coverage Destination', items = enumCoverage, + update = update_node_values) zmode : bpy.props.EnumProperty( - name = 'Z Mode', items = enumZMode) - cvg_x_alpha : bpy.props.BoolProperty() - alpha_cvg_sel : bpy.props.BoolProperty() - force_bl : bpy.props.BoolProperty() + name = 'Z Mode', items = enumZMode, update = update_node_values) + cvg_x_alpha : bpy.props.BoolProperty(update = update_node_values) + alpha_cvg_sel : bpy.props.BoolProperty(update = update_node_values) + force_bl : bpy.props.BoolProperty(update = update_node_values) # cycle dependent - (P * A + M - B) / (A + B) blend_p1 : bpy.props.EnumProperty( - name = 'Color Source 1', items = enumBlendColor) + name = 'Color Source 1', items = enumBlendColor, update = update_node_values) blend_p2 : bpy.props.EnumProperty( - name = 'Color Source 1', items = enumBlendColor) + name = 'Color Source 1', items = enumBlendColor, update = update_node_values) blend_m1 : bpy.props.EnumProperty( - name = 'Color Source 2', items = enumBlendColor) + name = 'Color Source 2', items = enumBlendColor, update = update_node_values) blend_m2 : bpy.props.EnumProperty( - name = 'Color Source 2', items = enumBlendColor) + name = 'Color Source 2', items = enumBlendColor, update = update_node_values) blend_a1 : bpy.props.EnumProperty( - name = 'Alpha Source', items = enumBlendAlpha) + name = 'Alpha Source', items = enumBlendAlpha, update = update_node_values) blend_a2 : bpy.props.EnumProperty( - name = 'Alpha Source', items = enumBlendAlpha) + name = 'Alpha Source', items = enumBlendAlpha, update = update_node_values) blend_b1 : bpy.props.EnumProperty( - name = 'Alpha Mix', items = enumBlendMix) + name = 'Alpha Mix', items = enumBlendMix, update = update_node_values) blend_b2 : bpy.props.EnumProperty( - name = 'Alpha Mix', items = enumBlendMix) + name = 'Alpha Mix', items = enumBlendMix, update = update_node_values) class DefaultRDPSettingsPanel(bpy.types.Panel): bl_label = "RDP Default Settings" @@ -1632,7 +1670,7 @@ def mat_register(): bpy.types.Material.fog_color = bpy.props.FloatVectorProperty( name = 'Fog Color', subtype='COLOR', size = 4, min = 0, max = 1, default = (0,0,0,1)) bpy.types.Material.fog_position = bpy.props.IntVectorProperty( - name = 'Fog Range', size = 2, min = 0, max = 1000, default = (500,1000)) + name = 'Fog Range', size = 2, min = 0, max = 1000, default = (900,1000)) bpy.types.Material.set_fog = bpy.props.BoolProperty() # geometry mode @@ -1640,7 +1678,6 @@ def mat_register(): bpy.types.Material.menu_upper = bpy.props.BoolProperty() bpy.types.Material.menu_lower = bpy.props.BoolProperty() bpy.types.Material.menu_lower_render = bpy.props.BoolProperty() - bpy.types.Material.set_rendermode = bpy.props.BoolProperty(default = False) bpy.types.Material.rdp_settings = bpy.props.PointerProperty( type = RDPSettings) @@ -1698,6 +1735,29 @@ sm64_prim_transparent_shade.color_combiner = tuple(S_PRIM_TRANSPARENT_SHADE + \ sm64_prim_transparent_shade.set_env = False sm64_prim_transparent_shade.g_cull_back = False +sm64_fog_shaded_texture = F3DMaterialSettings() +sm64_fog_shaded_texture.g_fog = True +sm64_fog_shaded_texture.color_combiner = tuple(S_SHADED_TEX + S_SHADED_TEX) +sm64_fog_shaded_texture.set_env = False +sm64_fog_shaded_texture.set_fog = True +sm64_fog_shaded_texture.g_mdsft_cycletype = 'G_CYC_2CYCLE' +sm64_fog_shaded_texture.set_rendermode = True +sm64_fog_shaded_texture.rendermode_advanced_enabled = False +sm64_fog_shaded_texture.rendermode_preset_cycle_1 = 'G_RM_FOG_SHADE_A' +sm64_fog_shaded_texture.rendermode_preset_cycle_2 = 'G_RM_AA_ZB_OPA_SURF2' + +sm64_fog_shaded_texture_cutout = copy.deepcopy(sm64_fog_shaded_texture) +sm64_fog_shaded_texture_cutout.color_combiner = \ + tuple(S_SHADED_TEX_CUTOUT + S_SHADED_TEX_CUTOUT) +sm64_fog_shaded_texture_cutout.rendermode_preset_cycle_2 = 'G_RM_AA_ZB_TEX_EDGE2' +sm64_fog_shaded_texture_cutout.g_cull_back = False + +sm64_fog_shaded_texture_transparent = copy.deepcopy(sm64_fog_shaded_texture) +sm64_fog_shaded_texture_transparent.color_combiner = \ + tuple(S_PRIM_TRANSPARENT_SHADE + S_PRIM_TRANSPARENT_SHADE) +sm64_fog_shaded_texture_transparent.rendermode_preset_cycle_2 = 'G_RM_AA_ZB_XLU_SURF2' +sm64_fog_shaded_texture_transparent.g_cull_back = False + enumMaterialPresets = [ ('Custom', 'Custom', 'Custom'), ('Unlit Texture', 'Unlit Texture', 'Unlit Texture'), @@ -1706,9 +1766,12 @@ enumMaterialPresets = [ ('Decal On Shaded Solid', 'Decal On Shaded Solid', 'Decal On Shaded Solid'), ('Shaded Texture', 'Shaded Texture', 'Shaded Texture'), ('Shaded Texture Cutout', 'Shaded Texture Cutout', 'Shaded Texture Cutout'), - ('Shaded Texture Transparent', 'Shaded Texture Transparent', 'Shaded Texture Transparent'), + ('Shaded Texture Transparent', 'Shaded Texture Transparent (Prim Alpha)', 'Shaded Texture Transparent (Prim Alpha)'), ('Vertex Colored Texture', 'Vertex Colored Texture', 'Vertex Colored Texture'), ('Environment Mapped', 'Environment Mapped', 'Environment Mapped'), + ('Fog Shaded Texture', 'Fog Shaded Texture', 'Fog Shaded Texture'), + ('Fog Shaded Texture Cutout', 'Fog Shaded Texture Cutout', 'Fog Shaded Texture Cutout'), + ('Fog Shaded Texture Transparent', 'Fog Shaded Texture Transparent (Prim Alpha)', 'Fog Shaded Texture Transparent (Prim Alpha)'), ] materialPresetDict = { @@ -1721,5 +1784,7 @@ materialPresetDict = { 'Environment Mapped' : sm64_unlit_env_map, 'Decal On Shaded Solid' : sm64_decal, 'Vertex Colored Texture' : sm64_vert_colored_tex, - + 'Fog Shaded Texture' : sm64_fog_shaded_texture, + 'Fog Shaded Texture Cutout' : sm64_fog_shaded_texture_cutout, + 'Fog Shaded Texture Transparent' : sm64_fog_shaded_texture_transparent, } \ No newline at end of file diff --git a/fast64_internal/f3d_writer.py b/fast64_internal/f3d_writer.py index 25453e2..4d506a1 100644 --- a/fast64_internal/f3d_writer.py +++ b/fast64_internal/f3d_writer.py @@ -146,7 +146,8 @@ def saveStaticModel(fModel, obj, transformMatrix): for material_index, faces in facesByMat.items(): material = obj.data.materials[material_index] saveMeshByFaces(material, faces, - fModel, fMeshGroup.mesh, obj, transformMatrix, infoDict) + fModel, fMeshGroup.mesh, obj, transformMatrix, + infoDict, None) revertMatAndEndDraw(fMeshGroup.mesh.draw) return fMeshGroup @@ -396,12 +397,12 @@ def checkIfFlatShaded(material): return not material.rdp_settings.g_shade_smooth def saveMeshByFaces(material, faces, fModel, fMesh, obj, transformMatrix, - infoDict): + infoDict, drawLayer): if len(faces) == 0: print('0 Faces Provided.') return fMaterial, texDimensions = \ - saveOrGetF3DMaterial(material, fModel, obj) + saveOrGetF3DMaterial(material, fModel, obj, drawLayer) isPointSampled = isTexturePointSampled(material) exportVertexColors = isLightingDisabled(material) uv_layer = obj.data.uv_layers.active.data @@ -778,14 +779,18 @@ defaultLighting = [ (mathutils.Vector((1,1,1)), mathutils.Vector((1, 1, 1)).normalized()), (mathutils.Vector((0.5, 0.5, 0.5)), mathutils.Vector((1, 1, 1)).normalized())] -def saveOrGetF3DMaterial(material, fModel, obj): - if material in fModel.materials: - return fModel.materials[material] +def saveOrGetF3DMaterial(material, fModel, obj, drawLayer): + if material.rdp_settings.set_rendermode: + if (material, drawLayer) in fModel.materials: + return fModel.materials[(material, drawLayer)] + elif (material, None) in fModel.materials: + return fModel.materials[(material, None)] if len(obj.data.materials) == 0: raise ValueError("Mesh must have at least one material.") - - fMaterial = FMaterial(toAlnum(material.name)) + materialName = toAlnum(material.name) + (('_layer' + str(drawLayer)) \ + if material.rdp_settings.set_rendermode else '') + fMaterial = FMaterial(materialName) fMaterial.material.commands.append(DPPipeSync()) fMaterial.revert.commands.append(DPPipeSync()) @@ -852,7 +857,8 @@ def saveOrGetF3DMaterial(material, fModel, obj): defaults = bpy.context.scene.world.rdp_defaults saveGeoModeDefinition(fMaterial, material.rdp_settings, defaults) saveOtherModeHDefinition(fMaterial, material.rdp_settings, defaults) - saveOtherModeLDefinition(fMaterial, material.rdp_settings, defaults) + saveOtherModeLDefinition(fMaterial, material.rdp_settings, defaults, + drawLayerRenderMode[drawLayer] if drawLayer is not None else None) # Set scale s = int(material.tex_scale[0] * 0xFFFF) @@ -901,7 +907,7 @@ def saveOrGetF3DMaterial(material, fModel, obj): if useDict['Shade'] and material.set_lights: fLights = saveLightsDefinition(fModel, material, - fMaterial.material.name + '_lights') + materialName + '_lights') fMaterial.material.commands.extend([ SPSetLights(fLights) # TODO: handle synching: NO NEED? ]) @@ -938,12 +944,15 @@ def saveOrGetF3DMaterial(material, fModel, obj): # End Display List fMaterial.material.commands.append(SPEndDisplayList()) + #revertMatAndEndDraw(fMaterial.revert) if len(fMaterial.revert.commands) > 1: # 1 being the pipe sync fMaterial.revert.commands.append(SPEndDisplayList()) else: fMaterial.revert = None - fModel.materials[material] = (fMaterial, texDimensions) + + materialKey = material, (drawLayer if material.rdp_settings.set_rendermode else None) + fModel.materials[materialKey] = (fMaterial, texDimensions) return fMaterial, texDimensions @@ -1299,6 +1308,8 @@ def saveLightsDefinition(fModel, material, lightsName): if material.f3d_light7 is not None: addLightDefinition(material, material.f3d_light7, lights) + if lightsName in fModel.lights: + raise ValueError("Duplicate light name.") fModel.lights[lightsName] = lights return lights @@ -1422,7 +1433,7 @@ def saveOtherModeHDefinition(fMaterial, settings, defaults): saveModeSetting(fMaterial, settings.g_mdsft_pipeline, defaults.g_mdsft_pipeline, DPPipelineMode) -def saveOtherModeLDefinition(fMaterial, settings, defaults): +def saveOtherModeLDefinition(fMaterial, settings, defaults, defaultRenderMode): saveModeSetting(fMaterial, settings.g_mdsft_alpha_compare, defaults.g_mdsft_alpha_compare, DPSetAlphaCompare) @@ -1431,39 +1442,56 @@ def saveOtherModeLDefinition(fMaterial, settings, defaults): # cycle independent if settings.set_rendermode: - if settings.g_mdsft_cycletype == 'G_CYC_2CYCLE': - renderModeSet = DPSetRenderMode([], - settings.blend_p1, settings.blend_a1, - settings.blend_m1, settings.blend_b1, - settings.blend_p2, settings.blend_a2, - settings.blend_m2, settings.blend_b2) + if not settings.rendermode_advanced_enabled: + fMaterial.renderModeUseDrawLayer = [ + settings.rendermode_preset_cycle_1 == 'Use Draw Layer', + settings.rendermode_preset_cycle_2 == 'Use Draw Layer'] + + if settings.g_mdsft_cycletype == 'G_CYC_2CYCLE': + renderModeSet = DPSetRenderMode([ + settings.rendermode_preset_cycle_1, + settings.rendermode_preset_cycle_2], None) + else: # ??? + renderModeSet = DPSetRenderMode([ + settings.rendermode_preset_cycle_1, + settings.rendermode_preset_cycle_2], None) else: - renderModeSet = DPSetRenderMode([], - settings.blend_p1, settings.blend_a1, - settings.blend_m1, settings.blend_b1, - settings.blend_p1, settings.blend_a1, - settings.blend_m1, settings.blend_b1) + if settings.g_mdsft_cycletype == 'G_CYC_2CYCLE': + renderModeSet = DPSetRenderMode([], + [[settings.blend_p1, settings.blend_a1, + settings.blend_m1, settings.blend_b1], + [settings.blend_p2, settings.blend_a2, + settings.blend_m2, settings.blend_b2]]) + else: + renderModeSet = DPSetRenderMode([], + [[settings.blend_p1, settings.blend_a1, + settings.blend_m1, settings.blend_b1], + [settings.blend_p1, settings.blend_a1, + settings.blend_m1, settings.blend_b1]]) - if settings.aa_en: - renderModeSet.flagList.append("AA_EN") - if settings.z_cmp: - renderModeSet.flagList.append("Z_CMP") - if settings.z_upd: - renderModeSet.flagList.append("Z_UPD") - if settings.im_rd: - renderModeSet.flagList.append("IM_RD") - if settings.clr_on_cvg: - renderModeSet.flagList.append("CLR_ON_CVG") + if settings.aa_en: + renderModeSet.flagList.append("AA_EN") + if settings.z_cmp: + renderModeSet.flagList.append("Z_CMP") + if settings.z_upd: + renderModeSet.flagList.append("Z_UPD") + if settings.im_rd: + renderModeSet.flagList.append("IM_RD") + if settings.clr_on_cvg: + renderModeSet.flagList.append("CLR_ON_CVG") - renderModeSet.flagList.append(settings.cvg_dst) - renderModeSet.flagList.append(settings.zmode) - - if settings.cvg_x_alpha: - renderModeSet.flagList.append("CVG_X_ALPHA") - if settings.alpha_cvg_sel: - renderModeSet.flagList.append("ALPHA_CVG_SEL") - if settings.force_bl: - renderModeSet.flagList.append("FORCE_BL") - + renderModeSet.flagList.append(settings.cvg_dst) + renderModeSet.flagList.append(settings.zmode) + + if settings.cvg_x_alpha: + renderModeSet.flagList.append("CVG_X_ALPHA") + if settings.alpha_cvg_sel: + renderModeSet.flagList.append("ALPHA_CVG_SEL") + if settings.force_bl: + renderModeSet.flagList.append("FORCE_BL") + fMaterial.material.commands.append(renderModeSet) + if defaultRenderMode is not None: + fMaterial.revert.commands.append( + DPSetRenderMode(defaultRenderMode, None)) #fMaterial.revert.commands.append(defaultRenderMode) \ No newline at end of file diff --git a/fast64_internal/sm64_geolayout_writer.py b/fast64_internal/sm64_geolayout_writer.py index 0ed3d7d..5f1d99e 100644 --- a/fast64_internal/sm64_geolayout_writer.py +++ b/fast64_internal/sm64_geolayout_writer.py @@ -714,7 +714,7 @@ def processBone(fModel, boneName, obj, armatureObj, transformMatrix, meshGroup = saveModelGivenVertexGroup( fModel, obj, bone.name, lastDeformName, finalTransform, armatureObj, materialOverrides, - namePrefix, infoDict) + namePrefix, infoDict, node.drawLayer) if meshGroup is None: #print("No mesh data.") @@ -1090,7 +1090,7 @@ def checkUniqueBoneNames(fModel, name, vertexGroup): def saveModelGivenVertexGroup(fModel, obj, vertexGroup, parentGroup, transformMatrix, armatureObj, materialOverrides, namePrefix, - infoDict): + infoDict, drawLayer): checkForF3DMaterial(obj) mesh = obj.data @@ -1170,7 +1170,8 @@ def saveModelGivenVertexGroup(fModel, obj, vertexGroup, if len(skinnedFaces) > 0: #print("Skinned") fMeshGroup = saveSkinnedMeshByMaterial(skinnedFaces, fModel, - vertexGroup, obj, currentMatrix, parentMatrix, namePrefix, infoDict, vertexGroup) + vertexGroup, obj, currentMatrix, parentMatrix, namePrefix, + infoDict, vertexGroup, drawLayer) elif len(groupFaces) > 0: fMeshGroup = FMeshGroup(toAlnum(namePrefix + \ ('_' if namePrefix != '' else '') + vertexGroup), @@ -1187,7 +1188,7 @@ def saveModelGivenVertexGroup(fModel, obj, vertexGroup, for material_index, bFaces in groupFaces.items(): material = obj.data.materials[material_index] saveMeshByFaces(material, bFaces, - fModel, fMeshGroup.mesh, obj, currentMatrix, infoDict) + fModel, fMeshGroup.mesh, obj, currentMatrix, infoDict, drawLayer) # End mesh drawing # Reset settings to prevent issues with other models @@ -1197,23 +1198,23 @@ def saveModelGivenVertexGroup(fModel, obj, vertexGroup, for (material, specificMat, overrideType) in materialOverrides: if fMeshGroup.mesh is not None: saveOverrideDraw(obj, fModel, material, specificMat, overrideType, - fMeshGroup.mesh) + fMeshGroup.mesh, drawLayer) if fMeshGroup.skinnedMesh is not None: saveOverrideDraw(obj, fModel, material, specificMat, overrideType, - fMeshGroup.skinnedMesh) + fMeshGroup.skinnedMesh, drawLayer) return fMeshGroup -def saveOverrideDraw(obj, fModel, material, specificMat, overrideType, fMesh): +def saveOverrideDraw(obj, fModel, material, specificMat, overrideType, fMesh, drawLayer): fOverrideMat, texDimensions = \ - saveOrGetF3DMaterial(material, fModel, obj) + saveOrGetF3DMaterial(material, fModel, obj, drawLayer) overrideIndex = str(len(fMesh.drawMatOverrides)) if (material, specificMat, overrideType) in fMesh.drawMatOverrides: overrideIndex = fMesh.drawMatOverrides[(material, specificMat, overrideType)].name[-1] meshMatOverride = GfxList( fMesh.name + '_mat_override_' + toAlnum(material.name) + \ '_' + overrideIndex) - print(fMesh.drawMatOverrides) + #print(fMesh.drawMatOverrides) #print('fdddddddddddddddd ' + str(fMesh.name) + " " + str(material) + " " + str(specificMat) + " " + str(overrideType)) fMesh.drawMatOverrides[(material, specificMat, overrideType)] = meshMatOverride removeReverts = [] @@ -1266,7 +1267,7 @@ def convertVertDictToArray(vertDict): return data, matRegions # This collapses similar loops together IF they are in the same material. -def splitSkinnedFacesIntoTwoGroups(skinnedFaces, fModel, obj, uv_layer): +def splitSkinnedFacesIntoTwoGroups(skinnedFaces, fModel, obj, uv_layer, drawLayer): inGroupVertArray = [] notInGroupVertArray = [] loopDict = {} @@ -1280,7 +1281,7 @@ def splitSkinnedFacesIntoTwoGroups(skinnedFaces, fModel, obj, uv_layer): material = obj.data.materials[material_index] fMaterial, texDimensions = \ - saveOrGetF3DMaterial(material, fModel, obj) + saveOrGetF3DMaterial(material, fModel, obj, drawLayer) exportVertexColors = isLightingDisabled(material) convertInfo = LoopConvertInfo(uv_layer, obj, exportVertexColors) @@ -1305,12 +1306,12 @@ def getGroupVertCount(group): return count def saveSkinnedMeshByMaterial(skinnedFaces, fModel, name, obj, - currentMatrix, parentMatrix, namePrefix, infoDict, vertexGroup): + currentMatrix, parentMatrix, namePrefix, infoDict, vertexGroup, drawLayer): # We choose one or more loops per vert to represent a material from which # texDimensions can be found, since it is required for UVs. uv_layer = obj.data.uv_layers.active.data inGroupVertArray, notInGroupVertArray, loopDict = \ - splitSkinnedFacesIntoTwoGroups(skinnedFaces, fModel, obj, uv_layer) + splitSkinnedFacesIntoTwoGroups(skinnedFaces, fModel, obj, uv_layer, drawLayer) notInGroupCount = getGroupVertCount(notInGroupVertArray) if notInGroupCount > fModel.f3d.vert_load_size - 2: @@ -1331,7 +1332,11 @@ def saveSkinnedMeshByMaterial(skinnedFaces, fModel, name, obj, curIndex = 0 for material_index, vertData in notInGroupVertArray: material = obj.data.materials[material_index] - fMaterial, texDimensions = fModel.materials[material] + if material.rdp_settings.set_rendermode: + drawLayerKey = drawLayer + else: + drawLayerKey = None + fMaterial, texDimensions = fModel.materials[(material, drawLayerKey)] isPointSampled = isTexturePointSampled(material) exportVertexColors = isLightingDisabled(material) @@ -1364,7 +1369,7 @@ def saveSkinnedMeshByMaterial(skinnedFaces, fModel, name, obj, # We've already saved all materials, this just returns the existing ones. material = obj.data.materials[material_index] fMaterial, texDimensions = \ - saveOrGetF3DMaterial(material, fModel, obj) + saveOrGetF3DMaterial(material, fModel, obj, drawLayer) isPointSampled = isTexturePointSampled(material) exportVertexColors = isLightingDisabled(material)