From 7532f5eb4981ddc76b70d468781d25e46c5a998d Mon Sep 17 00:00:00 2001 From: Darryl Pogue Date: Mon, 7 Sep 2020 17:24:50 -0700 Subject: [PATCH] First pass at SharedMesh export --- korman/exporter/mesh.py | 51 +++++++++++++++++---------- korman/properties/modifiers/avatar.py | 13 +++++++ korman/ui/modifiers/avatar.py | 3 ++ 3 files changed, 48 insertions(+), 19 deletions(-) diff --git a/korman/exporter/mesh.py b/korman/exporter/mesh.py index 4ef35ed..2c2b3af 100644 --- a/korman/exporter/mesh.py +++ b/korman/exporter/mesh.py @@ -270,6 +270,10 @@ class MeshConverter(_MeshManager): dspan.composeGeometry(True, True) inc_progress() + def _is_shared_mesh(self, bo): + cm = bo.plasma_modifiers.clothing_mesh + return cm.enabled + def _export_geometry(self, bo, mesh, materials, geospans): # Recall that materials is a mapping of exported materials to blender material indices. # Therefore, geodata maps blender material indices to working geometry data. @@ -491,7 +495,7 @@ class MeshConverter(_MeshManager): drawables = self._export_mesh(bo) # Create the DrawInterface - if drawables: + if drawables and not self._is_shared_mesh(bo): diface = self._mgr.find_create_object(plDrawInterface, bl=bo) for dspan_key, idx in drawables: diface.addDrawable(dspan_key, idx) @@ -517,24 +521,33 @@ class MeshConverter(_MeshManager): # Step 2: Export Blender mesh data to Plasma GeometrySpans self._export_geometry(bo, mesh, materials, geospans) - # Step 3: Add plGeometrySpans to the appropriate DSpan and create indices - _diindices = {} - for geospan, pass_index in geospans: - dspan = self._find_create_dspan(bo, geospan.material.object, pass_index) - self._report.msg("Exported hsGMaterial '{}' geometry into '{}'", - geospan.material.name, dspan.key.name, indent=1) - idx = dspan.addSourceSpan(geospan) - diidx = _diindices.setdefault(dspan, []) - diidx.append(idx) - - # Step 3.1: Harvest Span indices and create the DIIndices - drawables = [] - for dspan, indices in _diindices.items(): - dii = plDISpanIndex() - dii.indices = indices - idx = dspan.addDIIndex(dii) - drawables.append((dspan.key, idx)) - return drawables + if self._is_shared_mesh(bo): + # Step 3: Add plGeometrySpans to a plSharedMesh object + shared = self._mgr.find_create_object(plSharedMesh, bl=bo) + shared.flags |= plSharedMesh.kDontSaveMorphState + for geospan, pass_index in geospans: + geospan.props |= (plGeometrySpan.kRequiresBlending | plGeometrySpan.kPropForceShadow) + shared.addSpan(geospan) + return shared + else: + # Step 3: Add plGeometrySpans to the appropriate DSpan and create indices + _diindices = {} + for geospan, pass_index in geospans: + dspan = self._find_create_dspan(bo, geospan.material.object, pass_index) + self._report.msg("Exported hsGMaterial '{}' geometry into '{}'", + geospan.material.name, dspan.key.name, indent=1) + idx = dspan.addSourceSpan(geospan) + diidx = _diindices.setdefault(dspan, []) + diidx.append(idx) + + # Step 3.1: Harvest Span indices and create the DIIndices + drawables = [] + for dspan, indices in _diindices.items(): + dii = plDISpanIndex() + dii.indices = indices + idx = dspan.addDIIndex(dii) + drawables.append((dspan.key, idx)) + return drawables def _export_material_spans(self, bo, mesh, materials): """Exports all Materials and creates plGeometrySpans""" diff --git a/korman/properties/modifiers/avatar.py b/korman/properties/modifiers/avatar.py index c5f1ed1..fa6a9e6 100644 --- a/korman/properties/modifiers/avatar.py +++ b/korman/properties/modifiers/avatar.py @@ -24,6 +24,19 @@ from ...helpers import find_modifier from ... import idprops +class PlasmaClothingMeshModifier(PlasmaModifierProperties): + pl_id = "clothing_mesh" + + bl_category = "Avatar" + bl_label = "Clothing Mesh" + bl_description = "Mesh for a Clothing Item" + bl_icon = "MOD_CLOTH" + + def export(self, exporter, bo, so): + # This is handled in the mesh exporter code + pass + + class PlasmaLadderModifier(PlasmaModifierProperties): pl_id = "laddermod" diff --git a/korman/ui/modifiers/avatar.py b/korman/ui/modifiers/avatar.py index 11db188..6a11017 100644 --- a/korman/ui/modifiers/avatar.py +++ b/korman/ui/modifiers/avatar.py @@ -17,6 +17,9 @@ import bpy from ...helpers import find_modifier +def clothing_mesh(modifier, layout, context): + pass + def laddermod(modifier, layout, context): layout.label(text="Avatar climbs facing negative Y.")