mirror of
https://github.com/ApfelTeeSaft/lightspeed64.git
synced 2026-08-26 19:33:24 +00:00
Implemented fog. However, fog breaks draw layer overrides.
This commit is contained in:
@@ -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
@@ -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
@@ -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,
|
||||
}
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user