Implemented fog. However, fog breaks draw layer overrides.

This commit is contained in:
kurethedead
2019-12-18 17:25:40 -08:00
parent 8195676441
commit 45fa863a0b
5 changed files with 359 additions and 188 deletions
+30
View File
@@ -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'),
+91 -48
View File
@@ -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.")
+147 -82
View File
@@ -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,
}
+71 -43
View File
@@ -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)
+20 -15
View File
@@ -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)