Skip to content

Commit

Permalink
Merge pull request #8 from goodtimes-code/dev
Browse files Browse the repository at this point in the history
Fix performance
  • Loading branch information
goodtimes-code committed Dec 16, 2023
2 parents f67ab91 + 47f991b commit 38d292b
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 68 deletions.
4 changes: 2 additions & 2 deletions osc-receiver/config_laser1.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ laser_point = no
laser_object_points = no
points_per_frame = no
osc_server_received_message = no
osc_server_add_or_remove_laser_object = yes
osc_server_add_or_remove_laser_object = no
osc_server_effect_handling = no

[laser_output]
Expand All @@ -24,7 +24,7 @@ scan_rate = 40000
# min: 0.01
# max: 1.0 (=100% intensity)
#intensity_factor = 0.7
intensity_factor = 0.3
intensity_factor = 0.7

# How often blank points (at the beginning of each new laser object) shall be repeated
# min: 1
Expand Down
100 changes: 34 additions & 66 deletions osc-receiver/optimizer.py
Original file line number Diff line number Diff line change
@@ -1,90 +1,58 @@
import configparser
import logging
import numpy as np
from models import LaserPoint
from copy import copy
import global_data


# return point list, but with:
# - blank points (so laser objects will not become connected by a line)
# - effects
# Efficiently optimize point list with effects and blank points
def get_optimized_point_list():
from models import LaserPoint
from copy import copy
import numpy
import global_data

config = configparser.ConfigParser()
config.read('config.txt')

optimized_point_list = []

for visible_laser_object in global_data.visible_laser_objects:

# Some LaserObjects need to update themselves due to current time (moving waves, moving SVG images...)
# Update anomated laser objects
visible_laser_object.update()

# prepare effects
x_shift = 0 # per laser object !
y_shift = 0 # per laser object !
if len(visible_laser_object.effects) > 0:
for effect in visible_laser_object.effects:
if effect.name == 'X_POS':
x_shift += effect.level
elif effect.name == 'Y_POS':
y_shift += effect.level
# Prepare effects (shifts)
x_shift = sum(effect.level for effect in visible_laser_object.effects if effect.name == 'X_POS')
y_shift = sum(effect.level for effect in visible_laser_object.effects if effect.name == 'Y_POS')

# add a blank point before every laser object
# to make objects not become connected
i = 0
while i < int(global_data.config['laser_output']['blank_point_frames']):
blank_laser_point1 = LaserPoint(visible_laser_object.point_list[0].x + x_shift, visible_laser_object.point_list[0].y + y_shift)
blank_laser_point1.set_color(0, 0, 0)
optimized_point_list.append(blank_laser_point1)
i += 1
# Add a blank point before every laser object
blank_point_frames = int(global_data.config['laser_output']['blank_point_frames'])
blank_point = LaserPoint(visible_laser_object.point_list[0].x + x_shift, visible_laser_object.point_list[0].y + y_shift)
blank_point.set_color(0, 0, 0)
optimized_point_list.extend([copy(blank_point)] * blank_point_frames)

# add interpolated points
# for laser objects with just a small point amount (line)
# to have sharper line ends
laser_object_points = len(visible_laser_object.point_list)
if global_data.config['logging']['laser_object_points'] == 'yes':
logging.debug('[Optimizer] LaserObject points: ' + str(laser_object_points))

# Process each point in the laser object
previously_optimized_laser_point = None
for laser_point in visible_laser_object.point_list:
optimized_laser_point = copy(laser_point)

optimized_laser_point.x += x_shift
optimized_laser_point.y += y_shift

# TODO optimized_laser_point.r *= intensity

if previously_optimized_laser_point and laser_object_points < 80:
# includes original start and end point
interpolated_x_coords = numpy.linspace(previously_optimized_laser_point.x, optimized_laser_point.x, num=int(global_data.config['laser_output']['interpolated_points']))
interpolated_y_coords = numpy.linspace(previously_optimized_laser_point.y, optimized_laser_point.y, num=int(global_data.config['laser_output']['interpolated_points']))
# Interpolate points for objects with small number of points
if previously_optimized_laser_point and len(visible_laser_object.point_list) < 80:
interpolated_x_coords = np.linspace(previously_optimized_laser_point.x, optimized_laser_point.x, num=int(global_data.config['laser_output']['interpolated_points']))
interpolated_y_coords = np.linspace(previously_optimized_laser_point.y, optimized_laser_point.y, num=int(global_data.config['laser_output']['interpolated_points']))

i = 0
for interpolated_x_coord in interpolated_x_coords:
interpolated_optimized_laser_point = copy(optimized_laser_point)
interpolated_optimized_laser_point.x = interpolated_x_coords[i]
interpolated_optimized_laser_point.y = interpolated_y_coords[i]
optimized_point_list.append(interpolated_optimized_laser_point)
i += 1
for x, y in zip(interpolated_x_coords, interpolated_y_coords):
interpolated_point = copy(optimized_laser_point)
interpolated_point.x = x
interpolated_point.y = y
optimized_point_list.append(interpolated_point)

else:
optimized_point_list.append(optimized_laser_point)

previously_optimized_laser_point = optimized_laser_point

# add blank point at end of laser object
blank_laser_point2 = LaserPoint(visible_laser_object.point_list[0].x + x_shift, visible_laser_object.point_list[0].y+ y_shift)
blank_laser_point2.set_color(0, 0, 0)
optimized_point_list.append(blank_laser_point2)

# remove laser points out of screen coordinates
new_optimized_point_list = copy(optimized_point_list)
for optimized_point in optimized_point_list:
if not optimized_point.is_blank():
if optimized_point.y >= int(global_data.config['laser_output']['height']) or optimized_point.y <= 0 or optimized_point.x >= int(global_data.config['laser_output']['width']) or optimized_point.x <= 0:
new_optimized_point_list.remove(optimized_point)
optimized_point_list = new_optimized_point_list
# Add blank point at end of laser object
blank_point_end = copy(blank_point)
optimized_point_list.append(blank_point_end)

# Remove laser points out of screen coordinates
screen_width = int(global_data.config['laser_output']['width'])
screen_height = int(global_data.config['laser_output']['height'])
optimized_point_list = [pt for pt in optimized_point_list if 0 < pt.x < screen_width and 0 < pt.y < screen_height]

return optimized_point_list
return optimized_point_list
Binary file modified osc-senders/max-for-live-device/osc2laser.amxd
Binary file not shown.

0 comments on commit 38d292b

Please sign in to comment.