Skip to content

Commit

Permalink
Updated geometry optimizer to keep dismember body parts, for Fallout …
Browse files Browse the repository at this point in the history
…3 and Fallout New Vegas (fixes issue #3025691 reported by Chaky).
  • Loading branch information
amorilia committed Nov 21, 2010
1 parent b3664bd commit e065a58
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 1 deletion.
3 changes: 3 additions & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@ Release 2.1.7 (in development)
* Added support for Fallout New Vegas (contributed by throttlekitty
and saiden).

* Updated geometry optimizer to keep dismember body parts, for Fallout
3 and Fallout New Vegas (fixes issue #3025691 reported by Chaky).

Release 2.1.6 (13 November 2010)
================================

Expand Down
12 changes: 12 additions & 0 deletions pyffi/formats/nif/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3209,6 +3209,18 @@ def apply_scale(self, scale):
self.dimensions.y *= scale
self.dimensions.z *= scale

class BSDismemberSkinInstance:
def get_dismember_partitions(self):
"""Return triangles and body part indices."""
triangles = []
trianglepartmap = []
for bodypart, skinpartblock in zip(
self.partitions, self.skin_partition.skin_partition_blocks):
part_triangles = list(skinpartblock.get_mapped_triangles())
triangles += part_triangles
trianglepartmap += [bodypart.body_part] * len(part_triangles)
return triangles, trianglepartmap

class ControllerLink:
"""
>>> from pyffi.formats.nif import NifFormat
Expand Down
23 changes: 22 additions & 1 deletion pyffi/spells/nif/optimize.py
Original file line number Diff line number Diff line change
Expand Up @@ -411,10 +411,31 @@ def branchentry(self, branch):
# update skin partition (only if branch already exists)
if branch.get_skin_partition():
self.toaster.msg("updating skin partition")
if isinstance(branch.skin_instance,
NifFormat.BSDismemberSkinInstance):
# get body part indices (in the old system!)
triangles, trianglepartmap = (
branch.skin_instance.get_dismember_partitions())
maximize_bone_sharing = True
# update mapping
new_triangles = []
for triangle in triangles:
# XXX it could happen that v_map[i] is None
# XXX these triangles should be removed
new_triangles.append(
tuple(v_map[i] for i in triangle))
triangles = new_triangles
else:
# no body parts
triangles = None
trianglepartmap = None
maximize_bone_sharing = False
# use Oblivion settings
branch.update_skin_partition(
maxbonesperpartition=18, maxbonespervertex=4,
stripify=False, verbose=0)
stripify=False, verbose=0,
triangles=triangles, trianglepartmap=trianglepartmap,
maximize_bone_sharing=maximize_bone_sharing)

# update morph data
for morphctrl in branch.get_controllers():
Expand Down

0 comments on commit e065a58

Please sign in to comment.