From c620b3b66604ecd84c0447b9093217685cbfbfd9 Mon Sep 17 00:00:00 2001 From: Joseph Davies Date: Mon, 7 Aug 2017 19:43:14 -0700 Subject: [PATCH] Add plAvLadderMod. Adds modifier panel and export for Uru-style ladders. --- korman/properties/modifiers/avatar.py | 62 +++++++++++++++++++++++++++ korman/ui/modifiers/avatar.py | 9 ++++ 2 files changed, 71 insertions(+) diff --git a/korman/properties/modifiers/avatar.py b/korman/properties/modifiers/avatar.py index 81c0457..1803393 100644 --- a/korman/properties/modifiers/avatar.py +++ b/korman/properties/modifiers/avatar.py @@ -15,6 +15,7 @@ import bpy from bpy.props import * +import mathutils from PyHSPlasma import * from .base import PlasmaModifierProperties, PlasmaModifierLogicWiz @@ -22,6 +23,67 @@ from ...exporter.explosions import ExportError from ...helpers import find_modifier from ... import idprops + +class PlasmaLadderModifier(PlasmaModifierProperties): + pl_id = "laddermod" + + bl_category = "Avatar" + bl_label = "Ladder" + bl_description = "Climbable Ladder" + bl_icon = "COLLAPSEMENU" + + is_enabled = BoolProperty(name="Enabled", + description="Ladder enabled by default at Age start", + default=True) + direction = EnumProperty(name="Direction", + description="Direction of climb", + items=[("UP", "Up", "The avatar will mount the ladder and climb upward"), + ("DOWN", "Down", "The avatar will mount the ladder and climb downward"),], + default="DOWN") + num_loops = IntProperty(name="Loops", + description="How many full animation loops after the first to play before dismounting", + min=0, default=4) + facing_object = PointerProperty(name="Facing Object", + description="Target object the avatar must be facing through this region to trigger climb (optional)", + type=bpy.types.Object, + poll=idprops.poll_mesh_objects) + + def export(self, exporter, bo, so): + # Create the ladder modifier + mod = exporter.mgr.find_create_object(plAvLadderMod, so=so, name=self.key_name) + mod.type = plAvLadderMod.kBig + mod.loops = self.num_loops + mod.enabled = self.is_enabled + mod.goingUp = self.direction == "UP" + + # Create vector pointing from the Facing Object to the Detector. + # Animation only activates if the avatar is facing it within + # engine-defined (45 degree) tolerance + if self.facing_object is not None: + # Use object if one has been selected + ladderVec = self.facing_object.matrix_world.translation - bo.matrix_world.translation + else: + # Make our own artificial target -1.0 units back on the local Y axis. + world = bo.matrix_world.copy() + world.invert() + target = bo.location - (mathutils.Vector((0.0, 1.0, 0.0)) * world) + ladderVec = target - bo.matrix_local.translation + mod.ladderView = hsVector3(ladderVec.x, ladderVec.y, 0.0) + mod.ladderView.normalize() + + # Generate the detector's physical bounds + det_name = "{}_LadderDetector".format(self.id_data.name) + bounds = bo.plasma_modifiers.collision.bounds + simIface, physical = exporter.physics.generate_physical(bo, so, bounds, det_name) + physical.memberGroup = plSimDefs.kGroupDetector + physical.reportGroup |= 1 << plSimDefs.kGroupAvatar + physical.boundsType = plSimDefs.kHullBounds + + @property + def requires_actor(self): + return True + + sitting_approach_flags = [("kApproachFront", "Front", "Approach from the font"), ("kApproachLeft", "Left", "Approach from the left"), ("kApproachRight", "Right", "Approach from the right"), diff --git a/korman/ui/modifiers/avatar.py b/korman/ui/modifiers/avatar.py index 31cc508..11db188 100644 --- a/korman/ui/modifiers/avatar.py +++ b/korman/ui/modifiers/avatar.py @@ -17,6 +17,15 @@ import bpy from ...helpers import find_modifier +def laddermod(modifier, layout, context): + layout.label(text="Avatar climbs facing negative Y.") + + layout.prop(modifier, "is_enabled") + layout.prop(modifier, "num_loops") + layout.prop(modifier, "direction") + + layout.prop(modifier, "facing_object", icon="MESH_DATA") + def sittingmod(modifier, layout, context): layout.row().prop(modifier, "approach")