Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix performance #8

Merged
merged 2 commits into from
Dec 16, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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.