@@ -233,8 +233,9 @@ class LuaObject final : public ObjectBase
233233 }
234234 };
235235
236+ CriticalSection frameSwapLock;
236237 UnorderedSegmentedMap<int , HeapArray<LuaGuiMessage>> guiCommandBuffer;
237- UnorderedSegmentedMap<int , moodycamel::ReaderWriterQueue <LuaGuiMessage>> guiMessageQueue ;
238+ UnorderedSegmentedMap<int , HeapArray <LuaGuiMessage>> currentFrame ;
238239
239240 static inline auto allDrawTargets = UnorderedMap<t_pdlua*, SmallArray<LuaObject*>>();
240241
@@ -873,44 +874,16 @@ class LuaObject final : public ObjectBase
873874 void updateFramebuffers (NVGcontext* nvg) override
874875 {
875876 LuaGuiMessage guiMessage;
876- for (auto & [layer, layerQueue] : guiMessageQueue) {
877- if (layer == -1 ) // non-layer related messages
878- {
879- while (layerQueue.try_dequeue (guiMessage)) {
880- handleGuiMessage (nvg, layer, guiMessage.symbol , guiMessage.size , guiMessage.data .data ());
881- }
882- continue ;
883- }
884877
885- while (layerQueue.try_dequeue (guiMessage)) {
886- guiCommandBuffer[layer].add (guiMessage);
887- }
888-
889- auto const * startMesage = pd->generateSymbol (" lua_start_paint" );
890- auto const * endMessage = pd->generateSymbol (" lua_end_paint" );
878+ frameSwapLock.enter ();
879+ auto frames = currentFrame;
880+ frameSwapLock.exit ();
891881
892- int startIdx = -1 , endIdx = -1 ;
893- bool updateScene = false ;
894- for (int i = guiCommandBuffer[layer].size () - 1 ; i >= 0 ; i--) {
895- if (guiCommandBuffer[layer][i].symbol == startMesage)
896- startIdx = i;
897- if (guiCommandBuffer[layer][i].symbol == endMessage)
898- endIdx = i + 1 ;
899-
900- if (startIdx != -1 && endIdx != -1 ) {
901- updateScene = true ;
902- break ;
903- }
904- }
905-
906- if (updateScene) {
907- if (endIdx > startIdx) {
908- for (int i = startIdx; i < endIdx; i++) {
909- handleGuiMessage (nvg, layer, guiCommandBuffer[layer][i].symbol , guiCommandBuffer[layer][i].size , guiCommandBuffer[layer][i].data .data ());
910- }
911- }
912- guiCommandBuffer[layer].erase (guiCommandBuffer[layer].begin (), guiCommandBuffer[layer].begin () + endIdx);
882+ for (auto & [layer, layerMessages] : frames) {
883+ for (auto & guiMessage : layerMessages) {
884+ handleGuiMessage (nvg, layer, guiMessage.symbol , guiMessage.size , guiMessage.data .data ());
913885 }
886+ currentFrame.clear ();
914887
915888 if (isSelected != object->isSelected () || !framebuffers[layer].isValid ()) {
916889 isSelected = object->isSelected ();
@@ -1017,7 +990,14 @@ class LuaObject final : public ObjectBase
1017990 static void drawCallback (void * target, int const layer, t_symbol* sym, int argc, t_atom* argv)
1018991 {
1019992 for (auto * object : allDrawTargets[static_cast <t_pdlua*>(target)]) {
1020- object->guiMessageQueue [layer].enqueue ({ sym, argc, argv });
993+ object->guiCommandBuffer [layer].add ({ sym, argc, argv });
994+ if (sym == gensym (" lua_end_paint" ))
995+ {
996+ object->frameSwapLock .enter ();
997+ object->currentFrame [layer] = object->guiCommandBuffer [layer];
998+ object->frameSwapLock .exit ();
999+ object->guiCommandBuffer [layer].clear ();
1000+ }
10211001 }
10221002 }
10231003
0 commit comments