Browse Source

Avoid normalmap export code duplication

pull/50/head
Darryl Pogue 7 years ago
parent
commit
4cf1933398
No known key found for this signature in database
GPG Key ID: CB824715C3E6FD41
  1. 108
      korman/exporter/material.py

108
korman/exporter/material.py

@ -145,21 +145,22 @@ class MaterialConverter:
# Loop over layers
for idx, slot in slots:
# Prepend any BumpMapping magic layers
if slot.use_map_normal:
if bo in self._bumpMats:
raise ExportError("Material '{}' has more than one bumpmap layer".format(bm.name))
du, dw, dv = self.export_bumpmap_slot(bo, bm, hsgmat, slot, idx)
hsgmat.addLayer(du.key) # Du
hsgmat.addLayer(dw.key) # Dw
hsgmat.addLayer(dv.key) # Dv
bump_layers = self.export_bumpmap_slot(bo, bm, hsgmat, slot, idx)
hsgmat.addLayer(bump_layers[0].key) # Du
hsgmat.addLayer(bump_layers[1].key) # Dw
hsgmat.addLayer(bump_layers[2].key) # Dv
hsgmat.addLayer(bump_layers[3].key) # Normal map
self._bumpMats[bo] = (bump_layers[3].UVWSrc, bump_layers[3].transform)
elif slot.use_stencil:
if slot.use_stencil:
stencils.append((idx, slot))
else:
tex_layer = self.export_texture_slot(bo, bm, hsgmat, slot, idx)
hsgmat.addLayer(tex_layer.key)
if slot.use_map_normal:
self._bumpMats[bo] = (tex_layer.UVWSrc, tex_layer.transform)
if stencils:
tex_state = tex_layer.state
if not tex_state.blendFlags & hsGMatState.kBlendMask:
@ -206,62 +207,26 @@ class MaterialConverter:
# Wasn't that easy?
return hsgmat.key
def export_bumpmap_slot(self, bo, bm, hsgmat, slot, idx):
name = "{}_{}".format(bm.name if bm is not None else bo.name, slot.name)
print(" Exporting Plasma Bumpmap Layer '{}'".format(name))
# The normal map layer
nm_layer = self._mgr.add_object(plLayer, name=name, bl=bo)
# UVW Channel
if slot.texture_coords == "UV":
for i, uvchan in enumerate(bo.data.uv_layers):
if uvchan.name == slot.uv_layer:
nm_layer.UVWSrc = i
print(" Using UV Map #{} '{}'".format(i, name))
break
else:
print(" No UVMap specified... Blindly using the first one, maybe it exists :|")
# Transform
xform = hsMatrix44()
xform.setTranslate(hsVector3(*slot.offset))
xform.setScale(hsVector3(*slot.scale))
nm_layer.transform = xform
state = nm_layer.state
state.blendFlags = hsGMatState.kBlendDot3
state.miscFlags = hsGMatState.kMiscBumpLayer
strength = max(min(1.0, slot.normal_factor), 0.0)
nm_layer.ambient = hsColorRGBA(0.0, 0.0, 0.0, 1.0)
nm_layer.preshade = hsColorRGBA(0.0, 0.0, 0.0, 1.0)
nm_layer.runtime = hsColorRGBA(strength, 0.0, 0.0, 1.0)
nm_layer.specular = hsColorRGBA(0.0, 0.0, 0.0, 1.0)
texture = slot.texture
# Export the specific texture type
self._tex_exporters[texture.type](bo, nm_layer, slot)
print(" Exporting Plasma Bumpmap Layers for '{}'".format(name))
# Okay, now we need to make 3 layers for the Du, Dw, and Dv
du_layer = self._mgr.add_object(plLayer, name="{}_DU_BumpLut".format(name), bl=bo)
dw_layer = self._mgr.add_object(plLayer, name="{}_DW_BumpLut".format(name), bl=bo)
dv_layer = self._mgr.add_object(plLayer, name="{}_DV_BumpLut".format(name), bl=bo)
for layer in [du_layer, dw_layer, dv_layer]:
for layer in (du_layer, dw_layer, dv_layer):
layer.ambient = hsColorRGBA(1.0, 1.0, 1.0, 1.0)
layer.preshade = hsColorRGBA(0.0, 0.0, 0.0, 1.0)
layer.runtime = hsColorRGBA(0.0, 0.0, 0.0, 1.0)
layer.specular = hsColorRGBA(0.0, 0.0, 0.0, 1.0)
layer.state.ZFlags = hsGMatState.kZNoZWrite
layer.state.clampFlags = hsGMatState.kClampTexture
layer.state.miscFlags = hsGMatState.kMiscBindNext
layer.state.blendFlags = hsGMatState.kBlendAdd
state = layer.state
state.ZFlags = hsGMatState.kZNoZWrite
state.clampFlags = hsGMatState.kClampTexture
state.miscFlags = hsGMatState.kMiscBindNext
state.blendFlags = hsGMatState.kBlendAdd
if not slot.use_map_specular:
du_layer.state.blendFlags = hsGMatState.kBlendMADD
@ -286,14 +251,14 @@ class MaterialConverter:
dw_layer.texture = self._bumpLUT.key
dv_layer.texture = self._bumpLUT.key
return (du_layer, dw_layer, dv_layer, nm_layer)
return (du_layer, dw_layer, dv_layer)
def export_texture_slot(self, bo, bm, hsgmat, slot, idx, name=None, blend_flags=True):
if name is None:
name = "{}_{}".format(bm.name if bm is not None else bo.name, slot.name)
print(" Exporting Plasma Layer '{}'".format(name))
layer = self._mgr.add_object(plLayer, name=name, bl=bo)
if bm is not None:
if bm is not None and not slot.use_map_normal:
self._propagate_material_settings(bm, layer)
# UVW Channel
@ -312,7 +277,7 @@ class MaterialConverter:
xform.setScale(hsVector3(*slot.scale))
layer.transform = xform
wantStencil, canStencil = slot.use_stencil, slot.use_stencil and bm is not None
wantStencil, canStencil = slot.use_stencil, slot.use_stencil and bm is not None and not slot.use_map_normal
if wantStencil and not canStencil:
self._exporter().report.warn("{} wants to stencil, but this is not a real Material".format(slot.name))
@ -334,25 +299,34 @@ class MaterialConverter:
texture = slot.texture
# Apply custom layer properties
layer_props = texture.plasma_layer
layer.opacity = layer_props.opacity / 100
if layer_props.opacity < 100:
state.blendFlags |= hsGMatState.kBlendAlpha
if layer_props.alpha_halo:
state.blendFlags |= hsGMatState.kBlendAlphaTestHigh
if layer_props.z_bias:
state.ZFlags |= hsGMatState.kZIncLayer
if layer_props.skip_depth_test:
state.ZFlags |= hsGMatState.kZNoZRead
if layer_props.skip_depth_write:
state.ZFlags |= hsGMatState.kZNoZWrite
if slot.use_map_normal:
state.blendFlags = hsGMatState.kBlendDot3
state.miscFlags = hsGMatState.kMiscBumpLayer
strength = max(min(1.0, slot.normal_factor), 0.0)
layer.ambient = hsColorRGBA(0.0, 0.0, 0.0, 1.0)
layer.preshade = hsColorRGBA(0.0, 0.0, 0.0, 1.0)
layer.runtime = hsColorRGBA(strength, 0.0, 0.0, 1.0)
layer.specular = hsColorRGBA(0.0, 0.0, 0.0, 1.0)
else:
layer_props = texture.plasma_layer
layer.opacity = layer_props.opacity / 100
if layer_props.opacity < 100:
state.blendFlags |= hsGMatState.kBlendAlpha
if layer_props.alpha_halo:
state.blendFlags |= hsGMatState.kBlendAlphaTestHigh
if layer_props.z_bias:
state.ZFlags |= hsGMatState.kZIncLayer
if layer_props.skip_depth_test:
state.ZFlags |= hsGMatState.kZNoZRead
if layer_props.skip_depth_write:
state.ZFlags |= hsGMatState.kZNoZWrite
# Export the specific texture type
self._tex_exporters[texture.type](bo, layer, slot)
# Export any layer animations
# NOTE: animated stencils are nonsense.
if not slot.use_stencil:
# NOTE: animated stencils and bumpmaps are nonsense.
if not slot.use_stencil and not slot.use_map_normal:
layer = self._export_layer_animations(bo, bm, slot, idx, layer)
return layer

Loading…
Cancel
Save