Skip to content

Commit

Permalink
Add initial support for laser projection
Browse files Browse the repository at this point in the history
  • Loading branch information
vanous committed Apr 2, 2024
1 parent cc5471c commit 5b83383
Show file tree
Hide file tree
Showing 8 changed files with 470 additions and 1 deletion.
19 changes: 19 additions & 0 deletions __init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,16 @@

class DMX_TempData(PropertyGroup):

def onUpdateCollections(self, context):
dmx = context.scene.dmx
dmx.update_laser_collision_collect()

collections_list: PointerProperty(
type=bpy.types.Collection,
name = _("Laser collistions"),
update = onUpdateCollections
)

pause_render: BoolProperty(
description="The renderer is paused during MVR import and in 2D view. This checkbox allows to re-enable it in case of some failure during import, which would leave it paused",
name = _("Pause renderer"),
Expand Down Expand Up @@ -138,6 +148,7 @@ class DMX(PropertyGroup):
DMX_Fixture_Image,
DMX_Emitter_Material,
DMX_IES_Data,
DMX_Geometry_Node,
DMX_Fixture_Channel,
DMX_Fixture,
DMX_MVR_Object,
Expand Down Expand Up @@ -1625,6 +1636,14 @@ def render(self):
def set_fixtures_filter(self, fixtures_filter):
DMX.fixtures_filter = fixtures_filter

def update_laser_collision_collect(self):
for fixture in self.fixtures:
for nodes in fixture.geometry_nodes:
print("nodes", nodes)
collection_info = nodes.node.nodes["Collection Info"]
collection = bpy.context.window_manager.dmx.collections_list
collection_info.inputs[0].default_value = collection


# Handlers #

Expand Down
Binary file not shown.
40 changes: 39 additions & 1 deletion fixture.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
import random
import os

from dmx.material import getEmitterMaterial, get_gobo_material, set_light_nodes, get_ies_node
from dmx.material import getEmitterMaterial, get_gobo_material, set_light_nodes, get_ies_node, getGeometryNodes
from dmx.model import DMX_Model
from dmx.logging import DMX_Log

Expand All @@ -36,6 +36,7 @@
Object,
Image,
Material,
GeometryNodeTree,
Text)

# Shader Nodes default labels
Expand Down Expand Up @@ -77,6 +78,10 @@ class DMX_Emitter_Material(PropertyGroup):
name = "Emitter > Material",
type = Material)

class DMX_Geometry_Node(PropertyGroup):
node: PointerProperty(
name = "Geometry Node",
type = GeometryNodeTree)

class DMX_IES_Data(PropertyGroup):
ies: PointerProperty(
Expand Down Expand Up @@ -122,6 +127,10 @@ class DMX_Fixture(PropertyGroup):
name = "Fixture > Materials",
type = DMX_Emitter_Material)

geometry_nodes: CollectionProperty(
name = "Fixture > Geometry Nodes",
type = DMX_Geometry_Node)

gobo_materials: CollectionProperty(
name = "Fixture > Gobo Materials",
type = DMX_Emitter_Material)
Expand Down Expand Up @@ -265,6 +274,7 @@ def build(self, name, profile, mode, universe, address, gel_color, display_beams
self.channels.clear()
self.virtual_channels.clear()
self.emitter_materials.clear()
self.geometry_nodes.clear()
self.gobo_materials.clear()
self.ies_data.clear()

Expand Down Expand Up @@ -436,6 +446,25 @@ def build(self, name, profile, mode, universe, address, gel_color, display_beams
obj.material_slots[0].material = gobo_material
material.material = gobo_material

# Setup laser geometry nodes
if "laser" in obj.get("geometry_type", ""):
#emitter
emitter = obj
self.emitter_materials.add()
self.emitter_materials[-1].name = obj.name
emitter_material = getEmitterMaterial(obj.name)
emitter_material.shadow_method = "NONE" # laser beam should not cast shadows
self.emitter_materials[-1].material = emitter_material
#laser beam
geo_node = obj
node = self.geometry_nodes.add()
node.name = obj.name
modifier = geo_node.modifiers.new(type="NODES", name="base_object")
node_group = getGeometryNodes(obj)
modifier.node_group = node_group
node.node = node_group


# setup light for gobo in cycles
for light in self.lights:
set_light_nodes(light)
Expand Down Expand Up @@ -761,6 +790,15 @@ def updateShutterDimmer(self, shutter, dimmer, geometry, bits, current_frame):
if current_frame:
light.object.data.keyframe_insert(data_path='energy', frame=current_frame)

for nodes in self.geometry_nodes:
vector = nodes.node.nodes["Vector"]
if dimmer > 0:
vector.vector = (0,0,-1)
else:
vector.vector = (0,0,0)
if current_frame:
vector.keyframe_insert(data_path='vector', frame=current_frame)

except Exception as e:
DMX_Log.log.error(f"Error updating dimmer {e}")

Expand Down
15 changes: 15 additions & 0 deletions gdtf.py
Original file line number Diff line number Diff line change
Expand Up @@ -374,6 +374,8 @@ def get_geometry_type_as_string(geometry):
return "camera"
if isinstance(geometry, pygdtf.GeometryBeam):
return "beam"
if isinstance(geometry, pygdtf.GeometryLaser):
return "laser"
if isinstance(geometry, pygdtf.GeometryAxis):
return "axis"
if isinstance(geometry, pygdtf.GeometryReference):
Expand Down Expand Up @@ -433,6 +435,15 @@ def create_beam(geometry):
beam_radius = geometry.beam_radius)
create_gobo(geometry, goboGeometry)

def create_laser(geometry):
if (sanitize_obj_name(geometry) not in objs):
return
obj_child = objs[sanitize_obj_name(geometry)]
if "laser" not in obj_child.name.lower():
obj_child.name=f"Laser {obj_child.name}"
obj_child.visible_shadow = False
obj_child["beam_diameter"] = geometry.beam_diameter

def create_gobo(geometry, goboGeometry):
obj = DMX_GDTF.loadBlenderPrimitive(goboGeometry)
obj["geometry_type"] = "gobo"
Expand Down Expand Up @@ -499,6 +510,8 @@ def update_geometry(geometry):

if isinstance(geometry, pygdtf.GeometryBeam):
create_beam(geometry)
if isinstance(geometry, pygdtf.GeometryLaser):
create_laser(geometry)
elif isinstance(geometry, (pygdtf.GeometryMediaServerCamera)):
create_camera(geometry)

Expand All @@ -511,6 +524,8 @@ def update_geometry(geometry):

if isinstance(reference, pygdtf.GeometryBeam):
create_beam(reference)
if isinstance(reference, pygdtf.GeometryLaser):
create_laser(reference)
elif isinstance(reference, (pygdtf.GeometryMediaServerCamera)):
create_camera(reference)

Expand Down
Loading

0 comments on commit 5b83383

Please sign in to comment.