Skip to content

Commit 6d0bc5f

Browse files
committed
Simplify Lua rendering
1 parent b9bfe0e commit 6d0bc5f

1 file changed

Lines changed: 17 additions & 37 deletions

File tree

Source/Objects/LuaObject.h

Lines changed: 17 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)