Das mit den 3 Videos liegt daran, dass man für die Videowiedergabe eine C API mit Multithreading und jeweils eigener static Callback Funktion aufrufen muss. Deswegen kann man den Videoplayer leider nicht in eine Klasse packen und mehrfach instanzieren (habs zumindest noch nicht hinbekommen), sondern muss den Videoplayercode jeweils kopieren und mehrfach die gleiche Funktion im Code haben. Da man so bei einer Codeänderung das ganze gleich an mehreren Stellen korrigieren muss hab ich das mal wilkürlich auf 3 festgelegt um das ganze jetzt erstmal zu testen. Sollte alles funktionieren kann man mit copy paste und Nummerierung hochzählen die Zahl der Videoplayer erhöhen (z.B 10 viel mehr macht wahrscheinlich aus Performancegründen nicht Sinn). Um die Videoplayer herum gibt es einen Wrapper der die Verteilung der Texturen auf die einzelnen Player übernimmt. (Der Zeigt dann auch die Fehlertextur an wenn gerade alle Player belegt sind.)
Das die Texturen im Moment noch alle beim Start geladen werden hat einen anderen Grund. Ich habe versucht das ganze so Modular wie möglich aufzubauen um das ganze leicht erweitern zu können. Die verschiedenen Laserinstanzen hab ich zu Zeichenflächen (Canvas) abstrahiert, und einen Content Manager hinzugefügt der beliebige Content Plugins verwaltet. (Plugin Schnittstelle gibt es noch nicht wirklich, im Moment sind das jeweils alles C++ Klassen). Im Moment gibt es nur das Content Plugin das lokale Texturen verwaltet, aber ich könnt mir z.B irgendwann mal ein Plugin vorstellen das Videostreams empfangen kann oder so.
Das laden der Texturen erst bei Bedarf wäre zwar mit ganz wenigen Zeilen erledigt, aufwendig wird aber das wieder freigeben der Texturen. Die Plugin Schnittstelle wollte ich zum einen so schmal wie möglich halten, sonst müsste man durch diese Schittstelle eine Liste mit allen Momentan benötigten Texturen verwalten, was die Abstraktion und Abkapselung nicht mehr ganz so schön macht.
Das größere Problem daran wäre wenn man z.B den Fall hat wenn man in kurzer Zeit zwischen mehreren Texturen wechselt werden diese dauernd geladen und wieder gelöscht. Meine bevorzugte Lösung bzw. mein Plan ist deswegen eine Art Garbage Collector einzusetzten der alle Texturen die z.B. in den letzten 3 Sekunden nicht benötig wurden zu löschen. Dazu werd ich aber sicher noch einige Zeit benötigen und solange die Texturen nicht dynamisch gelöscht werden macht es auch wenig Sinn diese Dynamisch zu laden. (Im schlimmsten Fall stürzt das Beamertool sonst nach 5h Laufzeit ab, weil man dann in der Liveshow eine Textur zu viel aufruft, deswegen solange es keinen Garbage Collector gibt lieber erstmal alle laden, dann stellt man Probleme wenigstens gleich fest (ist auch besser für den Beta Test :-)))
Die Modularisierung hab ich auch für den Empfang vorgesehen (noch nicht so weit wie die Content Modularisierung) um z.B. ein OSC Receiver Plugin einzubauen um langfristig weitere Features des Windows Beamertools einzubauen, insbesondere mit dem Ziel Kompatiblität zu DMXC3 oder einem zukünftigen DMXC3 Beamertool.
Im Zuge der Modularisierung hab ich auch den Namen von "Lasersim" zu "RPI_Beamertool" geändert. Ich hoff mal das gibt keinen Namenskonflikt zum "richtigen" Beamertool.
mfg
Moritz