Compare commits

..

No commits in common. 'eb250b0ece2bfca1d487469fbb0895d96a1d2727' and '8b67d629eedd4525dcf0278a04130269d8dc6a57' have entirely different histories.

  1. 4
      .github/workflows/ci_build.yml
  2. 4
      korman/exporter/camera.py
  3. 2
      korman/exporter/material.py
  4. 44
      korman/nodes/node_python.py

4
.github/workflows/ci_build.yml

@ -12,7 +12,7 @@ jobs:
cmake-arch: Win32,
python-arch: x86,
str: windows-x86,
blender-url: "https://github.com/Hoikas/blender2.7/releases/download/blender2.79_20250208/blender-2.79.0-git20250208.106afc6db53a-windows32.zip",
blender-url: "https://github.com/Hoikas/blender2.7/releases/download/blender2.79_20221113/blender-2.79.0-git20221114.f970f178c093-windows32.zip",
}
- {
os: windows-2022,
@ -20,7 +20,7 @@ jobs:
cmake-arch: x64,
python-arch: x64,
str: windows-x64,
blender-url: "https://github.com/Hoikas/blender2.7/releases/download/blender2.79_20250208/blender-2.79.0-git20250208.106afc6db53a-windows64.zip",
blender-url: "https://github.com/Hoikas/blender2.7/releases/download/blender2.79_20221113/blender-2.79.0-git20221114.f970f178c093-windows64.zip",
}
env:

4
korman/exporter/camera.py

@ -97,10 +97,6 @@ class CameraConverter:
continue
cam_trans = plCameraModifier.CamTrans()
if manual_trans.camera:
# Don't even bother if a disabled camera is referenced. If we export camera modifier
# for a disabled camera, then it won't get a brain, and the client will crash.
if not manual_trans.camera.plasma_object.enabled:
continue
cam_trans.transTo = self._mgr.find_create_key(plCameraModifier, bl=manual_trans.camera)
cam_trans.ignore = manual_trans.mode == "ignore"

2
korman/exporter/material.py

@ -770,8 +770,6 @@ class MaterialConverter:
# least a SceneObject and CoordInterface so that we can touch it...
# NOTE: that harvest_actor makes sure everyone alread knows we're going to have a CI
if isinstance(viewpt.data, bpy.types.Camera):
if not viewpt.plasma_object.enabled:
raise ExportError(f"DynamicCamMap '{texture.name} wants to use the camera '{viewpt.name}', but it is not a Plasma Object!")
pl_env.camera = self._mgr.find_create_key(plCameraModifier, bl=viewpt)
else:
pl_env.rootNode = self._mgr.find_create_key(plSceneObject, bl=viewpt)

44
korman/nodes/node_python.py

@ -13,16 +13,12 @@
# You should have received a copy of the GNU General Public License
# along with Korman. If not, see <http://www.gnu.org/licenses/>.
from __future__ import annotations
import bpy
from bpy.props import *
from collections.abc import Iterable
from contextlib import contextmanager
from pathlib import Path
from typing import *
from PyHSPlasma import *
from .. import enum_props
@ -72,12 +68,9 @@ _attrib2param = {
_attrib_key_types = {
"ptAttribSceneobject": plFactory.ClassIndex("plSceneObject"),
"ptAttribSceneobjectList": plFactory.ClassIndex("plSceneObject"),
"ptAttribActivator": (plFactory.ClassIndex("plLogicModifier"),
plFactory.ClassIndex("plPythonFileMod")),
"ptAttribActivatorList": (plFactory.ClassIndex("plLogicModifier"),
plFactory.ClassIndex("plPythonFileMod")),
"ptAttribNamedActivator": (plFactory.ClassIndex("plLogicModifier"),
plFactory.ClassIndex("plPythonFileMod")),
"ptAttribActivator": plFactory.ClassIndex("plLogicModifier"),
"ptAttribActivatorList": plFactory.ClassIndex("plLogicModifier"),
"ptAttribNamedActivator": plFactory.ClassIndex("plLogicModifier"),
"ptAttribResponder": plFactory.ClassIndex("plResponderModifier"),
"ptAttribResponderList": plFactory.ClassIndex("plResponderModifier"),
"ptAttribNamedResponder": plFactory.ClassIndex("plResponderModifier"),
@ -194,17 +187,6 @@ class PlasmaPythonFileNode(PlasmaVersionedNode, bpy.types.Node):
bl_label = "Python File"
bl_width_default = 290
# Yas, a PythonFileMod can activate another PythonFileMod
pl_attrib = {"ptAttribActivator", "ptAttribActivatorList", "ptAttribNamedActivator"}
output_sockets: dict[str, dict[str, Any]] = {
"satisfies": {
"text": "Satisfies",
"type": "PlasmaConditionSocket",
"valid_link_nodes": "PlasmaPythonFileNode",
},
}
def _poll_pytext(self, value):
return value.name.endswith(".py")
@ -322,7 +304,7 @@ class PlasmaPythonFileNode(PlasmaVersionedNode, bpy.types.Node):
param.value = i
if not socket.is_simple_value:
self._export_key_attrib(exporter, bo, so, pfm, i, socket)
self._export_key_attrib(exporter, bo, so, i, socket)
pfm.addParameter(param)
def _export_ancillary_sceneobject(self, exporter, bo, so: plSceneObject) -> None:
@ -335,7 +317,7 @@ class PlasmaPythonFileNode(PlasmaVersionedNode, bpy.types.Node):
exporter.report.msg(f"Marking RT light '{so.key.name}' as animated due to usage in a Python File node", so.key.name)
light.setProperty(plLightInfo.kLPMovable, True)
def _export_key_attrib(self, exporter, bo, so: plSceneObject, pfm: plPythonFileMod, key: plKey, socket) -> None:
def _export_key_attrib(self, exporter, bo, so : plSceneObject, key : plKey, socket) -> None:
if key is None:
exporter.report.warn("Attribute '{}' didn't return a key and therefore will be unavailable to Python",
self.id_data.name, socket.links[0].name)
@ -351,11 +333,8 @@ class PlasmaPythonFileNode(PlasmaVersionedNode, bpy.types.Node):
self.id_data.name, socket.links[0].from_node.name,
plFactory.ClassName(key.type))
key_object = key.object
if isinstance(key_object, plSceneObject):
self._export_ancillary_sceneobject(exporter, bo, key_object)
elif isinstance(key_object, plPythonFileMod):
key_object.addReceiver(pfm.key)
if isinstance(key.object, plSceneObject):
self._export_ancillary_sceneobject(exporter, bo, key.object)
def _get_attrib_sockets(self, idx):
for i in self.inputs:
@ -363,9 +342,8 @@ class PlasmaPythonFileNode(PlasmaVersionedNode, bpy.types.Node):
yield i
def generate_valid_links_for(self, context, socket, is_output):
if is_output:
yield from PlasmaNodeBase.generate_valid_links_for(self, context, socket, True)
return
# Python nodes have no outputs...
assert is_output is False
attrib_type = socket.attribute_type
for i in bpy.types.Node.__subclasses__():
@ -515,10 +493,6 @@ class PlasmaPythonFileNode(PlasmaVersionedNode, bpy.types.Node):
while len(unconnected) > 1:
self.inputs.remove(unconnected.pop())
# Make sure the output sockets are present and accounted for.
self._update_extant_sockets(self.output_sockets, self.outputs)
self._update_init_sockets(self.output_sockets, self.outputs)
@property
def latest_version(self):
return 2

Loading…
Cancel
Save