in src/spg/spg.py [0:0]
def add_pattens_to_raster(self, per_wall_results):
""" Takes all the results from the pattern generators, and processes them into the valid raster
maps for each of the processors
:param per_wall_results: dict of results data from generate patterns method
"""
generator_changes_per_frame_threads = []
generator_threads = []
replicator_threads = []
results = {}
count = 0
for raster_name, raster_map in self.rasters.items():
self.status = "Generating Raster: " + raster_name
yield self.progress()
results[raster_name] = {}
base_path = self.get_raster_base_path(raster_name)
if not os.path.exists(base_path):
os.makedirs(base_path)
start_frame_offset = self.project_settings.sequence_start_frame
for pattern_generator, pattern_results in per_wall_results.items():
first_pattern_frame = True
first_pattern_sequence_frame = 0
for frame in range(int(pattern_generator.sequence_length * self.project_settings.frame_rate)):
full_sequence_frame_num = start_frame_offset
kwargs = {
"full_sequence_frame_num": full_sequence_frame_num,
"raster_map": raster_map,
"pattern_results": pattern_results
}
# If we are the first frame of a pattern we stitch it
# If we are also a none fixed pattern we stitch it (ie every frame)
generator_changes_per_frame = pattern_generator.method != _constants.GM_FIXED
if first_pattern_frame or generator_changes_per_frame:
# We create a new thread which executes our generator, which we start and keep track of
first_pattern_sequence_frame = full_sequence_frame_num
thread = _ThreadedFunction(self.stitch_raster_frame, frame, kwargs, results)
thread.start()
if generator_changes_per_frame:
generator_changes_per_frame_threads.append(thread)
else:
generator_threads.append(thread)
else:
# If we are not the first frame and not a fixed pattern we replicate the first frame
kwargs["first_pattern_sequence_frame"] = first_pattern_sequence_frame
thread = _ThreadedFunction(self.replicate_stitch_raster_frame, frame, kwargs, results)
replicator_threads.append(thread)
first_pattern_frame = False
start_frame_offset += 1
count += 1
# We wait for all the generator threads to complete first
[thread.join() for thread in generator_threads]
# We start the replicator threads and wait for them to all finish
[thread.start() for thread in replicator_threads]
[thread.join() for thread in replicator_threads]
# Finally we wait for all the per frame generators to finish stitching
[thread.join() for thread in generator_changes_per_frame_threads]
self.completed_tasks += count
yield self.progress()
return results