diff --git a/korman/nodes/node_messages.py b/korman/nodes/node_messages.py index 237b88a..7f0fab8 100644 --- a/korman/nodes/node_messages.py +++ b/korman/nodes/node_messages.py @@ -299,6 +299,50 @@ class PlasmaAnimCmdMsgNode(idprops.IDPropMixin, PlasmaMessageWithCallbacksNode, "texture_name": bpy.data.textures} +class PlasmaCameraMsgNode(PlasmaMessageNode, bpy.types.Node): + bl_category = "MSG" + bl_idname = "PlasmaCameraMsgNode" + bl_label = "Camera" + bl_width_default = 200 + + cmd = EnumProperty(name="Command", + description="Command to send to the camera system", + items=[("push", "Push Camera", "Pushes a new camera onto the camera stack and transitions to it"), + ("pop", "Pop Camera", "Pops the camera off the camera stack"), + ("disablefp", "Disable First Person", "Forces the camera into third person if it is currently in first person and disables first person mode"), + ("enablefp", "Enable First Person", "Reenables the first person camera and switches back to it if the player was in first person previously")], + options=set()) + camera = PointerProperty(name="Camera", + type=bpy.types.Object, + poll=idprops.poll_camera_objects, + options=set()) + + def convert_message(self, exporter, so): + msg = plCameraMsg() + msg.BCastFlags |= plMessage.kLocalPropagate | plMessage.kBCastByType + if self.cmd in {"push", "pop"}: + if self.camera is not None: + msg.newCam = exporter.mgr.find_create_key(plSceneObject, bl=self.camera) + # It appears that kRegionPopCamera is unused. pushing is controlled by observing + # the presence of the kResponderTrigger command. + msg.setCmd(plCameraMsg.kResponderTrigger, self.cmd == "push") + msg.setCmd(plCameraMsg.kRegionPushCamera, True) + msg.setCmd(plCameraMsg.kSetAsPrimary, self.camera is None + or self.camera.data.plasma_camera.settings.primary_camera) + elif self.cmd == "disablefp": + msg.setCmd(plCameraMsg.kResponderSetThirdPerson) + elif self.cmd == "enablefp": + msg.setCmd(plCameraMsg.kResponderUndoThirdPerson) + else: + raise RuntimeError() + return msg + + def draw_buttons(self, context, layout): + layout.prop(self, "cmd") + if self.cmd in {"push", "pop"}: + layout.prop(self, "camera") + + class PlasmaEnableMsgNode(PlasmaMessageNode, bpy.types.Node): bl_category = "MSG" bl_idname = "PlasmaEnableMsgNode"