From 972bfda37bf6b561c0b397d27675b4cab03da1a8 Mon Sep 17 00:00:00 2001 From: Patrick Dulebohn Date: Tue, 11 Oct 2022 18:56:07 -0400 Subject: [PATCH 1/5] Add xSitCam.py functionality to Sitting Modifier Adds new scripting to use xSitCam.py if a camera is selected --- korman/properties/modifiers/avatar.py | 60 +++++++++++++++++++++++++++ korman/ui/modifiers/avatar.py | 3 ++ 2 files changed, 63 insertions(+) diff --git a/korman/properties/modifiers/avatar.py b/korman/properties/modifiers/avatar.py index 00455e6..3f85873 100644 --- a/korman/properties/modifiers/avatar.py +++ b/korman/properties/modifiers/avatar.py @@ -78,6 +78,16 @@ class PlasmaLadderModifier(PlasmaModifierProperties): return True +# Use xSitCam.py for when we want a camera to pop up +sitting_pfms = { + "filename": "xSitCam.py", + "attribs": ( + { 'id': 1, 'type': "ptAttribActivator", 'name': "sitAct" }, + { 'id': 2, 'type': "ptAttribSceneObject", 'name': "sitCam" }, + ) +} + + sitting_approach_flags = [("kApproachFront", "Front", "Approach from the font"), ("kApproachLeft", "Left", "Approach from the left"), ("kApproachRight", "Right", "Approach from the right"), @@ -111,6 +121,11 @@ class PlasmaSittingBehavior(idprops.IDPropObjectMixin, PlasmaModifierProperties, facing_degrees = IntProperty(name="Tolerance", description="How far away we will tolerate the avatar facing the clickable", min=-180, max=180, default=45) + sitting_cam = PointerProperty(name="Camera (optional)", + description="Activate a specific camera when sitting down", + type=bpy.types.Object, + poll=idprops.poll_camera_objects, + options=set()) def harvest_actors(self): if self.facing_enabled: @@ -119,10 +134,50 @@ class PlasmaSittingBehavior(idprops.IDPropObjectMixin, PlasmaModifierProperties, def logicwiz(self, bo, tree): nodes = tree.nodes + if not self.sitting_cam: + # Sitting Modifier + sittingmod = nodes.new("PlasmaSittingBehaviorNode") + sittingmod.approach = self.approach + sittingmod.name = "SittingBeh" + + # Clickable + clickable = nodes.new("PlasmaClickableNode") + clickable.link_output(sittingmod, "satisfies", "condition") + clickable.clickable_object = self.clickable_object + clickable.bounds = find_modifier(self.clickable_object, "collision").bounds + + # Avatar Region (optional) + region_phys = find_modifier(self.region_object, "collision") + if region_phys is not None: + region = nodes.new("PlasmaClickableRegionNode") + region.link_output(clickable, "satisfies", "region") + region.name = "ClickableAvRegion" + region.region_object = self.region_object + region.bounds = region_phys.bounds + + # Facing Target (optional) + if self.facing_enabled: + facing = nodes.new("PlasmaFacingTargetNode") + facing.link_output(clickable, "satisfies", "facing") + facing.name = "FacingClickable" + facing.directional = True + facing.tolerance = self.facing_degrees + else: + # this socket must be explicitly disabled, otherwise it automatically generates a default + # facing target conditional for us. isn't that nice? + clickable.find_input_socket("facing").allow_simple = False + else: + sitting_pfm = sitting_pfms + sittingnode = self._create_python_file_node(tree, sitting_pfm["filename"], sitting_pfm["attribs"]) + self._create_sitting_nodes(bo, tree.nodes, sittingnode) + + + def _create_sitting_nodes(self, clickable_object, nodes, sittingnode): # Sitting Modifier sittingmod = nodes.new("PlasmaSittingBehaviorNode") sittingmod.approach = self.approach sittingmod.name = "SittingBeh" + sittingmod.link_output(sittingnode, "satisfies", "sitAct") # Clickable clickable = nodes.new("PlasmaClickableNode") @@ -130,6 +185,11 @@ class PlasmaSittingBehavior(idprops.IDPropObjectMixin, PlasmaModifierProperties, clickable.clickable_object = self.clickable_object clickable.bounds = find_modifier(self.clickable_object, "collision").bounds + # Camera Object + cameraobj = nodes.new("PlasmaAttribObjectNode") + cameraobj.link_output(sittingnode, "pfm", "sitCam") + cameraobj.target_object = self.sitting_cam + # Avatar Region (optional) region_phys = find_modifier(self.region_object, "collision") if region_phys is not None: diff --git a/korman/ui/modifiers/avatar.py b/korman/ui/modifiers/avatar.py index 11db188..a4f2f0c 100644 --- a/korman/ui/modifiers/avatar.py +++ b/korman/ui/modifiers/avatar.py @@ -41,6 +41,9 @@ def sittingmod(modifier, layout, context): if region is not None: col.prop(region, "bounds") + col = layout.column() + col.prop(modifier, "sitting_cam", icon="CAMERA_DATA") + split = layout.split() split.column().prop(modifier, "facing_enabled") col = split.column() From 348ed7a65892f3496fa52f361a0eb2a67f2c810e Mon Sep 17 00:00:00 2001 From: Patrick Dulebohn Date: Thu, 13 Oct 2022 12:44:33 -0400 Subject: [PATCH 2/5] Fix Scene Object (or "object") * Capital O in "Sceneobject" becomes a small o to get things working! --- korman/properties/modifiers/avatar.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/korman/properties/modifiers/avatar.py b/korman/properties/modifiers/avatar.py index 3f85873..c347874 100644 --- a/korman/properties/modifiers/avatar.py +++ b/korman/properties/modifiers/avatar.py @@ -83,7 +83,7 @@ sitting_pfms = { "filename": "xSitCam.py", "attribs": ( { 'id': 1, 'type': "ptAttribActivator", 'name': "sitAct" }, - { 'id': 2, 'type': "ptAttribSceneObject", 'name': "sitCam" }, + { 'id': 2, 'type': "ptAttribSceneobject", 'name': "sitCam" }, ) } From c6a3ec79ff8e256f12e0a2ca83cac85bb8ff3a8e Mon Sep 17 00:00:00 2001 From: Patrick Dulebohn Date: Wed, 19 Oct 2022 04:41:12 -0400 Subject: [PATCH 3/5] Commit Hoikas' suggestions --- korman/properties/modifiers/avatar.py | 58 +++++---------------------- korman/ui/modifiers/avatar.py | 2 +- 2 files changed, 11 insertions(+), 49 deletions(-) diff --git a/korman/properties/modifiers/avatar.py b/korman/properties/modifiers/avatar.py index c347874..60009f6 100644 --- a/korman/properties/modifiers/avatar.py +++ b/korman/properties/modifiers/avatar.py @@ -79,7 +79,7 @@ class PlasmaLadderModifier(PlasmaModifierProperties): # Use xSitCam.py for when we want a camera to pop up -sitting_pfms = { +sitting_pfm = { "filename": "xSitCam.py", "attribs": ( { 'id': 1, 'type': "ptAttribActivator", 'name': "sitAct" }, @@ -121,7 +121,7 @@ class PlasmaSittingBehavior(idprops.IDPropObjectMixin, PlasmaModifierProperties, facing_degrees = IntProperty(name="Tolerance", description="How far away we will tolerate the avatar facing the clickable", min=-180, max=180, default=45) - sitting_cam = PointerProperty(name="Camera (optional)", + sitting_camera = PointerProperty(name="Camera (optional)", description="Activate a specific camera when sitting down", type=bpy.types.Object, poll=idprops.poll_camera_objects, @@ -134,62 +134,24 @@ class PlasmaSittingBehavior(idprops.IDPropObjectMixin, PlasmaModifierProperties, def logicwiz(self, bo, tree): nodes = tree.nodes - if not self.sitting_cam: - # Sitting Modifier - sittingmod = nodes.new("PlasmaSittingBehaviorNode") - sittingmod.approach = self.approach - sittingmod.name = "SittingBeh" - - # Clickable - clickable = nodes.new("PlasmaClickableNode") - clickable.link_output(sittingmod, "satisfies", "condition") - clickable.clickable_object = self.clickable_object - clickable.bounds = find_modifier(self.clickable_object, "collision").bounds - - # Avatar Region (optional) - region_phys = find_modifier(self.region_object, "collision") - if region_phys is not None: - region = nodes.new("PlasmaClickableRegionNode") - region.link_output(clickable, "satisfies", "region") - region.name = "ClickableAvRegion" - region.region_object = self.region_object - region.bounds = region_phys.bounds - - # Facing Target (optional) - if self.facing_enabled: - facing = nodes.new("PlasmaFacingTargetNode") - facing.link_output(clickable, "satisfies", "facing") - facing.name = "FacingClickable" - facing.directional = True - facing.tolerance = self.facing_degrees - else: - # this socket must be explicitly disabled, otherwise it automatically generates a default - # facing target conditional for us. isn't that nice? - clickable.find_input_socket("facing").allow_simple = False - else: - sitting_pfm = sitting_pfms - sittingnode = self._create_python_file_node(tree, sitting_pfm["filename"], sitting_pfm["attribs"]) - self._create_sitting_nodes(bo, tree.nodes, sittingnode) - - - def _create_sitting_nodes(self, clickable_object, nodes, sittingnode): # Sitting Modifier sittingmod = nodes.new("PlasmaSittingBehaviorNode") sittingmod.approach = self.approach sittingmod.name = "SittingBeh" - sittingmod.link_output(sittingnode, "satisfies", "sitAct") - + # xSitCam.py PythonFileMod + if self.sitting_camera is not None: + sittingpynode = self._create_python_file_node(tree, sitting_pfm["filename"], sitting_pfm["attribs"]) + sittingmod.link_output(sittingpynode, "satisfies", "sitAct") + # Camera Object + cameraobj = nodes.new("PlasmaAttribObjectNode") + cameraobj.link_output(sittingnode, "pfm", "sitCam") + cameraobj.target_object = self.sitting_camera # Clickable clickable = nodes.new("PlasmaClickableNode") clickable.link_output(sittingmod, "satisfies", "condition") clickable.clickable_object = self.clickable_object clickable.bounds = find_modifier(self.clickable_object, "collision").bounds - # Camera Object - cameraobj = nodes.new("PlasmaAttribObjectNode") - cameraobj.link_output(sittingnode, "pfm", "sitCam") - cameraobj.target_object = self.sitting_cam - # Avatar Region (optional) region_phys = find_modifier(self.region_object, "collision") if region_phys is not None: diff --git a/korman/ui/modifiers/avatar.py b/korman/ui/modifiers/avatar.py index a4f2f0c..82d91e4 100644 --- a/korman/ui/modifiers/avatar.py +++ b/korman/ui/modifiers/avatar.py @@ -42,7 +42,7 @@ def sittingmod(modifier, layout, context): col.prop(region, "bounds") col = layout.column() - col.prop(modifier, "sitting_cam", icon="CAMERA_DATA") + col.prop(modifier, "sitting_camera", icon="CAMERA_DATA") split = layout.split() split.column().prop(modifier, "facing_enabled") From 6d2ebcafd43ddc9cb010b9d835ca58aaea82cf68 Mon Sep 17 00:00:00 2001 From: Patrick Dulebohn <40325124+DoobesURU@users.noreply.github.com> Date: Fri, 21 Oct 2022 10:55:59 -0400 Subject: [PATCH 4/5] Apply suggestions from Hoikas' code review Co-authored-by: Adam Johnson --- korman/properties/modifiers/avatar.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/korman/properties/modifiers/avatar.py b/korman/properties/modifiers/avatar.py index 60009f6..fb3413f 100644 --- a/korman/properties/modifiers/avatar.py +++ b/korman/properties/modifiers/avatar.py @@ -122,10 +122,10 @@ class PlasmaSittingBehavior(idprops.IDPropObjectMixin, PlasmaModifierProperties, description="How far away we will tolerate the avatar facing the clickable", min=-180, max=180, default=45) sitting_camera = PointerProperty(name="Camera (optional)", - description="Activate a specific camera when sitting down", - type=bpy.types.Object, - poll=idprops.poll_camera_objects, - options=set()) + description="Activate a specific camera when sitting down", + type=bpy.types.Object, + poll=idprops.poll_camera_objects, + options=set()) def harvest_actors(self): if self.facing_enabled: @@ -142,10 +142,12 @@ class PlasmaSittingBehavior(idprops.IDPropObjectMixin, PlasmaModifierProperties, if self.sitting_camera is not None: sittingpynode = self._create_python_file_node(tree, sitting_pfm["filename"], sitting_pfm["attribs"]) sittingmod.link_output(sittingpynode, "satisfies", "sitAct") + # Camera Object cameraobj = nodes.new("PlasmaAttribObjectNode") cameraobj.link_output(sittingnode, "pfm", "sitCam") cameraobj.target_object = self.sitting_camera + # Clickable clickable = nodes.new("PlasmaClickableNode") clickable.link_output(sittingmod, "satisfies", "condition") From c2a415ceb9ce75610001ea7a027d65b2054afed9 Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Sun, 13 Nov 2022 18:14:19 -0500 Subject: [PATCH 5/5] Ensure property name is completely drawn. The word `(optional)` made the label too long to be drawn, so we remove it. --- korman/properties/modifiers/avatar.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/korman/properties/modifiers/avatar.py b/korman/properties/modifiers/avatar.py index fb3413f..5dc4b59 100644 --- a/korman/properties/modifiers/avatar.py +++ b/korman/properties/modifiers/avatar.py @@ -121,7 +121,7 @@ class PlasmaSittingBehavior(idprops.IDPropObjectMixin, PlasmaModifierProperties, facing_degrees = IntProperty(name="Tolerance", description="How far away we will tolerate the avatar facing the clickable", min=-180, max=180, default=45) - sitting_camera = PointerProperty(name="Camera (optional)", + sitting_camera = PointerProperty(name="Camera", description="Activate a specific camera when sitting down", type=bpy.types.Object, poll=idprops.poll_camera_objects,