@@ -18,7 +18,6 @@ struct Scene : OpaqueWidget { | |||||
RackWidget *rackWidget; | RackWidget *rackWidget; | ||||
Toolbar *toolbar; | Toolbar *toolbar; | ||||
bool devMode = false; | |||||
// Version checking | // Version checking | ||||
bool checkVersion = true; | bool checkVersion = true; | ||||
bool checkedVersion = false; | bool checkedVersion = false; | ||||
@@ -34,7 +33,4 @@ struct Scene : OpaqueWidget { | |||||
}; | }; | ||||
extern Scene *gScene; | |||||
} // namespace rack | } // namespace rack |
@@ -7,7 +7,7 @@ namespace rack { | |||||
namespace asset { | namespace asset { | ||||
void init(bool devMode); | |||||
void init(); | |||||
/** Returns the path of a system resource. Should only read files from this location. */ | /** Returns the path of a system resource. Should only read files from this location. */ | ||||
std::string system(std::string filename); | std::string system(std::string filename); | ||||
/** Returns the path of a user resource. Can read and write files to this location. */ | /** Returns the path of a user resource. Can read and write files to this location. */ | ||||
@@ -0,0 +1,28 @@ | |||||
#pragma once | |||||
#include "common.hpp" | |||||
namespace rack { | |||||
struct Scene; | |||||
struct Engine; | |||||
namespace event { | |||||
struct Context; | |||||
} | |||||
struct Context { | |||||
bool devMode = false; | |||||
event::Context *event = NULL; | |||||
Scene *scene = NULL; | |||||
Engine *engine = NULL; | |||||
}; | |||||
Context *context(); | |||||
} // namespace rack |
@@ -44,8 +44,4 @@ struct Engine { | |||||
}; | }; | ||||
// TODO Move to global state header | |||||
extern Engine *gEngine; | |||||
} // namespace rack | } // namespace rack |
@@ -230,9 +230,5 @@ struct Context { | |||||
}; | }; | ||||
// TODO Move this into a global context class | |||||
extern Context *gContext; | |||||
} // namespace event | } // namespace event | ||||
} // namespace rack | } // namespace rack |
@@ -5,6 +5,7 @@ | |||||
#include "ui/Menu.hpp" | #include "ui/Menu.hpp" | ||||
#include "app/Port.hpp" | #include "app/Port.hpp" | ||||
#include "engine/Module.hpp" | #include "engine/Module.hpp" | ||||
#include "context.hpp" | |||||
namespace rack { | namespace rack { | ||||
@@ -148,7 +149,7 @@ inline Menu *createMenu() { | |||||
MenuOverlay *menuOverlay = new MenuOverlay; | MenuOverlay *menuOverlay = new MenuOverlay; | ||||
menuOverlay->addChild(o); | menuOverlay->addChild(o); | ||||
event::gContext->rootWidget->addChild(menuOverlay); | |||||
context()->event->rootWidget->addChild(menuOverlay); | |||||
return o; | return o; | ||||
} | } | ||||
@@ -24,7 +24,7 @@ enum Level { | |||||
FATAL_LEVEL | FATAL_LEVEL | ||||
}; | }; | ||||
void init(bool devMode); | |||||
void init(); | |||||
void destroy(); | void destroy(); | ||||
/** Do not use this function directly. Use the macros below. */ | /** Do not use this function directly. Use the macros below. */ | ||||
void log(Level level, const char *filename, int line, const char *format, ...); | void log(Level level, const char *filename, int line, const char *format, ...); | ||||
@@ -17,7 +17,7 @@ struct PluginManager { | |||||
std::string downloadName; | std::string downloadName; | ||||
std::string loginStatus; | std::string loginStatus; | ||||
PluginManager(bool devMode); | |||||
PluginManager(); | |||||
~PluginManager(); | ~PluginManager(); | ||||
void logIn(std::string email, std::string password); | void logIn(std::string email, std::string password); | ||||
void logOut(); | void logOut(); | ||||
@@ -9,6 +9,7 @@ | |||||
#include "network.hpp" | #include "network.hpp" | ||||
#include "asset.hpp" | #include "asset.hpp" | ||||
#include "window.hpp" | #include "window.hpp" | ||||
#include "context.hpp" | |||||
#include "helpers.hpp" | #include "helpers.hpp" | ||||
#include "widgets/Widget.hpp" | #include "widgets/Widget.hpp" | ||||
@@ -3,6 +3,7 @@ | |||||
#include "ui/Menu.hpp" | #include "ui/Menu.hpp" | ||||
#include "ui/MenuEntry.hpp" | #include "ui/MenuEntry.hpp" | ||||
#include "ui/MenuOverlay.hpp" | #include "ui/MenuOverlay.hpp" | ||||
#include "context.hpp" | |||||
namespace rack { | namespace rack { | ||||
@@ -17,7 +18,7 @@ struct MenuItem : MenuEntry { | |||||
void draw(NVGcontext *vg) override { | void draw(NVGcontext *vg) override { | ||||
// Get state | // Get state | ||||
BNDwidgetState state = (event::gContext->hoveredWidget == this) ? BND_HOVER : BND_DEFAULT; | |||||
BNDwidgetState state = (context()->event->hoveredWidget == this) ? BND_HOVER : BND_DEFAULT; | |||||
Menu *parentMenu = dynamic_cast<Menu*>(parent); | Menu *parentMenu = dynamic_cast<Menu*>(parent); | ||||
if (parentMenu && parentMenu->activeEntry == this) { | if (parentMenu && parentMenu->activeEntry == this) { | ||||
state = BND_ACTIVE; | state = BND_ACTIVE; | ||||
@@ -2,6 +2,7 @@ | |||||
#include "widgets/OpaqueWidget.hpp" | #include "widgets/OpaqueWidget.hpp" | ||||
#include "ui/common.hpp" | #include "ui/common.hpp" | ||||
#include "event.hpp" | #include "event.hpp" | ||||
#include "context.hpp" | |||||
namespace rack { | namespace rack { | ||||
@@ -111,7 +112,7 @@ struct ScrollWidget : OpaqueWidget { | |||||
void onHover(event::Hover &e) override { | void onHover(event::Hover &e) override { | ||||
// Scroll with arrow keys | // Scroll with arrow keys | ||||
if (!event::gContext->selectedWidget) { | |||||
if (!context()->event->selectedWidget) { | |||||
float arrowSpeed = 30.0; | float arrowSpeed = 30.0; | ||||
if (windowIsShiftPressed() && windowIsModPressed()) | if (windowIsShiftPressed() && windowIsModPressed()) | ||||
arrowSpeed /= 16.0; | arrowSpeed /= 16.0; | ||||
@@ -2,6 +2,7 @@ | |||||
#include "widgets/OpaqueWidget.hpp" | #include "widgets/OpaqueWidget.hpp" | ||||
#include "ui/common.hpp" | #include "ui/common.hpp" | ||||
#include "event.hpp" | #include "event.hpp" | ||||
#include "context.hpp" | |||||
namespace rack { | namespace rack { | ||||
@@ -26,9 +27,9 @@ struct TextField : OpaqueWidget { | |||||
nvgScissor(vg, 0, 0, box.size.x, box.size.y); | nvgScissor(vg, 0, 0, box.size.x, box.size.y); | ||||
BNDwidgetState state; | BNDwidgetState state; | ||||
if (this == event::gContext->selectedWidget) | |||||
if (this == context()->event->selectedWidget) | |||||
state = BND_ACTIVE; | state = BND_ACTIVE; | ||||
else if (this == event::gContext->hoveredWidget) | |||||
else if (this == context()->event->hoveredWidget) | |||||
state = BND_HOVER; | state = BND_HOVER; | ||||
else | else | ||||
state = BND_DEFAULT; | state = BND_DEFAULT; | ||||
@@ -52,7 +53,7 @@ struct TextField : OpaqueWidget { | |||||
} | } | ||||
void onHover(event::Hover &e) override { | void onHover(event::Hover &e) override { | ||||
if (this == event::gContext->draggedWidget) { | |||||
if (this == context()->event->draggedWidget) { | |||||
int pos = getTextPosition(e.pos); | int pos = getTextPosition(e.pos); | ||||
if (pos != selection) { | if (pos != selection) { | ||||
cursor = pos; | cursor = pos; | ||||
@@ -7,6 +7,7 @@ | |||||
#include <thread> | #include <thread> | ||||
#include <mutex> | #include <mutex> | ||||
#include <condition_variable> | #include <condition_variable> | ||||
#include "context.hpp" | |||||
#define AUDIO_OUTPUTS 8 | #define AUDIO_OUTPUTS 8 | ||||
@@ -144,7 +145,7 @@ struct AudioInterface : Module { | |||||
void AudioInterface::step() { | void AudioInterface::step() { | ||||
// Update SRC states | // Update SRC states | ||||
int sampleRate = (int) gEngine->getSampleRate(); | |||||
int sampleRate = (int) context()->engine->getSampleRate(); | |||||
inputSrc.setRates(audioIO.sampleRate, sampleRate); | inputSrc.setRates(audioIO.sampleRate, sampleRate); | ||||
outputSrc.setRates(sampleRate, audioIO.sampleRate); | outputSrc.setRates(sampleRate, audioIO.sampleRate); | ||||
@@ -1,4 +1,5 @@ | |||||
#include "Core.hpp" | #include "Core.hpp" | ||||
#include "context.hpp" | |||||
using namespace rack; | using namespace rack; | ||||
@@ -17,14 +18,14 @@ struct ModuleResizeHandle : virtual Widget { | |||||
// } | // } | ||||
} | } | ||||
void onDragStart(event::DragStart &e) override { | void onDragStart(event::DragStart &e) override { | ||||
dragX = gScene->rackWidget->lastMousePos.x; | |||||
dragX = context()->scene->rackWidget->lastMousePos.x; | |||||
ModuleWidget *m = getAncestorOfType<ModuleWidget>(); | ModuleWidget *m = getAncestorOfType<ModuleWidget>(); | ||||
originalBox = m->box; | originalBox = m->box; | ||||
} | } | ||||
void onDragMove(event::DragMove &e) override { | void onDragMove(event::DragMove &e) override { | ||||
ModuleWidget *m = getAncestorOfType<ModuleWidget>(); | ModuleWidget *m = getAncestorOfType<ModuleWidget>(); | ||||
float newDragX = gScene->rackWidget->lastMousePos.x; | |||||
float newDragX = context()->scene->rackWidget->lastMousePos.x; | |||||
float deltaX = newDragX - dragX; | float deltaX = newDragX - dragX; | ||||
Rect newBox = originalBox; | Rect newBox = originalBox; | ||||
@@ -40,7 +41,7 @@ struct ModuleResizeHandle : virtual Widget { | |||||
newBox.size.x = roundf(newBox.size.x / RACK_GRID_WIDTH) * RACK_GRID_WIDTH; | newBox.size.x = roundf(newBox.size.x / RACK_GRID_WIDTH) * RACK_GRID_WIDTH; | ||||
newBox.pos.x = originalBox.pos.x + originalBox.size.x - newBox.size.x; | newBox.pos.x = originalBox.pos.x + originalBox.size.x - newBox.size.x; | ||||
} | } | ||||
gScene->rackWidget->requestModuleBox(m, newBox); | |||||
context()->scene->rackWidget->requestModuleBox(m, newBox); | |||||
} | } | ||||
void draw(NVGcontext *vg) override { | void draw(NVGcontext *vg) override { | ||||
for (float x = 5.0; x <= 10.0; x += 5.0) { | for (float x = 5.0; x <= 10.0; x += 5.0) { | ||||
@@ -46,7 +46,7 @@ struct MIDICCToCVInterface : Module { | |||||
processMessage(msg); | processMessage(msg); | ||||
} | } | ||||
float lambda = 100.f * gEngine->getSampleTime(); | |||||
float lambda = 100.f * context()->engine->getSampleTime(); | |||||
for (int i = 0; i < 16; i++) { | for (int i = 0; i < 16; i++) { | ||||
int learnedCc = learnedCcs[i]; | int learnedCc = learnedCcs[i]; | ||||
float value = rescale(clamp(ccs[learnedCc], -127, 127), 0, 127, 0.f, 10.f); | float value = rescale(clamp(ccs[learnedCc], -127, 127), 0, 127, 0.f, 10.f); | ||||
@@ -129,8 +129,8 @@ struct MidiCcChoice : GridChoice { | |||||
else { | else { | ||||
text = string::f("%d", module->learnedCcs[id]); | text = string::f("%d", module->learnedCcs[id]); | ||||
color.a = 1.0; | color.a = 1.0; | ||||
if (event::gContext->selectedWidget == this) | |||||
event::gContext->selectedWidget = NULL; | |||||
if (context()->event->selectedWidget == this) | |||||
context()->event->selectedWidget = NULL; | |||||
} | } | ||||
} | } | ||||
@@ -158,11 +158,11 @@ struct MidiCcChoice : GridChoice { | |||||
} | } | ||||
void onSelectKey(event::SelectKey &e) override { | void onSelectKey(event::SelectKey &e) override { | ||||
if (event::gContext->selectedWidget == this) { | |||||
if (context()->event->selectedWidget == this) { | |||||
if (e.key == GLFW_KEY_ENTER || e.key == GLFW_KEY_KP_ENTER) { | if (e.key == GLFW_KEY_ENTER || e.key == GLFW_KEY_KP_ENTER) { | ||||
event::Deselect eDeselect; | event::Deselect eDeselect; | ||||
onDeselect(eDeselect); | onDeselect(eDeselect); | ||||
event::gContext->selectedWidget = NULL; | |||||
context()->event->selectedWidget = NULL; | |||||
e.target = this; | e.target = this; | ||||
} | } | ||||
} | } | ||||
@@ -146,7 +146,7 @@ struct MIDIToCVInterface : Module { | |||||
while (midiInput.shift(&msg)) { | while (midiInput.shift(&msg)) { | ||||
processMessage(msg); | processMessage(msg); | ||||
} | } | ||||
float deltaTime = gEngine->getSampleTime(); | |||||
float deltaTime = context()->engine->getSampleTime(); | |||||
outputs[CV_OUTPUT].value = (lastNote - 60) / 12.f; | outputs[CV_OUTPUT].value = (lastNote - 60) / 12.f; | ||||
outputs[GATE_OUTPUT].value = gate ? 10.f : 0.f; | outputs[GATE_OUTPUT].value = gate ? 10.f : 0.f; | ||||
@@ -71,7 +71,7 @@ struct MIDITriggerToCVInterface : Module { | |||||
while (midiInput.shift(&msg)) { | while (midiInput.shift(&msg)) { | ||||
processMessage(msg); | processMessage(msg); | ||||
} | } | ||||
float deltaTime = gEngine->getSampleTime(); | |||||
float deltaTime = context()->engine->getSampleTime(); | |||||
for (int i = 0; i < 16; i++) { | for (int i = 0; i < 16; i++) { | ||||
if (gateTimes[i] > 0.f) { | if (gateTimes[i] > 0.f) { | ||||
@@ -173,8 +173,8 @@ struct MidiTrigChoice : GridChoice { | |||||
text = string::f("%s%d", noteNames[semi], oct); | text = string::f("%s%d", noteNames[semi], oct); | ||||
color.a = 1.0; | color.a = 1.0; | ||||
if (event::gContext->selectedWidget == this) | |||||
event::gContext->selectedWidget = NULL; | |||||
if (context()->event->selectedWidget == this) | |||||
context()->event->selectedWidget = NULL; | |||||
} | } | ||||
} | } | ||||
@@ -2,6 +2,7 @@ | |||||
#include "asset.hpp" | #include "asset.hpp" | ||||
#include "window.hpp" | #include "window.hpp" | ||||
#include "event.hpp" | #include "event.hpp" | ||||
#include "context.hpp" | |||||
namespace rack { | namespace rack { | ||||
@@ -85,7 +86,7 @@ void LedDisplayTextField::draw(NVGcontext *vg) { | |||||
NVGcolor highlightColor = color; | NVGcolor highlightColor = color; | ||||
highlightColor.a = 0.5; | highlightColor.a = 0.5; | ||||
int begin = std::min(cursor, selection); | int begin = std::min(cursor, selection); | ||||
int end = (this == event::gContext->selectedWidget) ? std::max(cursor, selection) : -1; | |||||
int end = (this == context()->event->selectedWidget) ? std::max(cursor, selection) : -1; | |||||
bndIconLabelCaret(vg, textOffset.x, textOffset.y, | bndIconLabelCaret(vg, textOffset.x, textOffset.y, | ||||
box.size.x - 2*textOffset.x, box.size.y - 2*textOffset.y, | box.size.x - 2*textOffset.x, box.size.y - 2*textOffset.y, | ||||
-1, color, 12, text.c_str(), highlightColor, begin, end); | -1, color, 12, text.c_str(), highlightColor, begin, end); | ||||
@@ -11,6 +11,7 @@ | |||||
#include "ui/List.hpp" | #include "ui/List.hpp" | ||||
#include "ui/TextField.hpp" | #include "ui/TextField.hpp" | ||||
#include "plugin/PluginManager.hpp" | #include "plugin/PluginManager.hpp" | ||||
#include "context.hpp" | |||||
static const float itemMargin = 2.0; | static const float itemMargin = 2.0; | ||||
@@ -157,10 +158,10 @@ struct ModelItem : BrowserListItem { | |||||
ModuleWidget *moduleWidget = model->createModuleWidget(); | ModuleWidget *moduleWidget = model->createModuleWidget(); | ||||
if (!moduleWidget) | if (!moduleWidget) | ||||
return; | return; | ||||
gScene->rackWidget->addModule(moduleWidget); | |||||
context()->scene->rackWidget->addModule(moduleWidget); | |||||
// Move module nearest to the mouse position | // Move module nearest to the mouse position | ||||
moduleWidget->box.pos = gScene->rackWidget->lastMousePos.minus(moduleWidget->box.size.div(2)); | |||||
gScene->rackWidget->requestModuleBoxNearest(moduleWidget, moduleWidget->box); | |||||
moduleWidget->box.pos = context()->scene->rackWidget->lastMousePos.minus(moduleWidget->box.size.div(2)); | |||||
context()->scene->rackWidget->requestModuleBoxNearest(moduleWidget, moduleWidget->box); | |||||
} | } | ||||
}; | }; | ||||
@@ -446,7 +447,7 @@ struct ModuleBrowser : OpaqueWidget { | |||||
moduleScroll->box.size.y = std::min(box.size.y - moduleScroll->box.pos.y, moduleList->box.size.y); | moduleScroll->box.size.y = std::min(box.size.y - moduleScroll->box.pos.y, moduleList->box.size.y); | ||||
box.size.y = std::min(box.size.y, moduleScroll->box.getBottomRight().y); | box.size.y = std::min(box.size.y, moduleScroll->box.getBottomRight().y); | ||||
event::gContext->selectedWidget = searchField; | |||||
context()->event->selectedWidget = searchField; | |||||
Widget::step(); | Widget::step(); | ||||
} | } | ||||
}; | }; | ||||
@@ -557,7 +558,7 @@ void moduleBrowserCreate() { | |||||
ModuleBrowser *moduleBrowser = new ModuleBrowser; | ModuleBrowser *moduleBrowser = new ModuleBrowser; | ||||
overlay->addChild(moduleBrowser); | overlay->addChild(moduleBrowser); | ||||
gScene->addChild(overlay); | |||||
context()->scene->addChild(overlay); | |||||
} | } | ||||
json_t *moduleBrowserToJson() { | json_t *moduleBrowserToJson() { | ||||
@@ -5,6 +5,8 @@ | |||||
#include "asset.hpp" | #include "asset.hpp" | ||||
#include "app/Scene.hpp" | #include "app/Scene.hpp" | ||||
#include "helpers.hpp" | #include "helpers.hpp" | ||||
#include "context.hpp" | |||||
#include "osdialog.h" | #include "osdialog.h" | ||||
@@ -13,7 +15,7 @@ namespace rack { | |||||
ModuleWidget::ModuleWidget(Module *module) { | ModuleWidget::ModuleWidget(Module *module) { | ||||
if (module) { | if (module) { | ||||
gEngine->addModule(module); | |||||
context()->engine->addModule(module); | |||||
} | } | ||||
this->module = module; | this->module = module; | ||||
} | } | ||||
@@ -23,7 +25,7 @@ ModuleWidget::~ModuleWidget() { | |||||
disconnect(); | disconnect(); | ||||
// Remove and delete the Module instance | // Remove and delete the Module instance | ||||
if (module) { | if (module) { | ||||
gEngine->removeModule(module); | |||||
context()->engine->removeModule(module); | |||||
delete module; | delete module; | ||||
module = NULL; | module = NULL; | ||||
} | } | ||||
@@ -217,10 +219,10 @@ void ModuleWidget::saveDialog() { | |||||
void ModuleWidget::disconnect() { | void ModuleWidget::disconnect() { | ||||
for (Port *input : inputs) { | for (Port *input : inputs) { | ||||
gScene->rackWidget->wireContainer->removeAllWires(input); | |||||
context()->scene->rackWidget->wireContainer->removeAllWires(input); | |||||
} | } | ||||
for (Port *output : outputs) { | for (Port *output : outputs) { | ||||
gScene->rackWidget->wireContainer->removeAllWires(output); | |||||
context()->scene->rackWidget->wireContainer->removeAllWires(output); | |||||
} | } | ||||
} | } | ||||
@@ -235,7 +237,7 @@ void ModuleWidget::reset() { | |||||
param->reset(); | param->reset(); | ||||
} | } | ||||
if (module) { | if (module) { | ||||
gEngine->resetModule(module); | |||||
context()->engine->resetModule(module); | |||||
} | } | ||||
} | } | ||||
@@ -244,7 +246,7 @@ void ModuleWidget::randomize() { | |||||
param->randomize(); | param->randomize(); | ||||
} | } | ||||
if (module) { | if (module) { | ||||
gEngine->randomizeModule(module); | |||||
context()->engine->randomizeModule(module); | |||||
} | } | ||||
} | } | ||||
@@ -253,7 +255,7 @@ void ModuleWidget::draw(NVGcontext *vg) { | |||||
Widget::draw(vg); | Widget::draw(vg); | ||||
// Power meter | // Power meter | ||||
if (module && gEngine->powerMeter) { | |||||
if (module && context()->engine->powerMeter) { | |||||
nvgBeginPath(vg); | nvgBeginPath(vg); | ||||
nvgRect(vg, | nvgRect(vg, | ||||
0, box.size.y - 20, | 0, box.size.y - 20, | ||||
@@ -297,7 +299,7 @@ void ModuleWidget::onHover(event::Hover &e) { | |||||
// Instead of checking key-down events, delete the module even if key-repeat hasn't fired yet and the cursor is hovering over the widget. | // Instead of checking key-down events, delete the module even if key-repeat hasn't fired yet and the cursor is hovering over the widget. | ||||
if (glfwGetKey(gWindow, GLFW_KEY_DELETE) == GLFW_PRESS || glfwGetKey(gWindow, GLFW_KEY_BACKSPACE) == GLFW_PRESS) { | if (glfwGetKey(gWindow, GLFW_KEY_DELETE) == GLFW_PRESS || glfwGetKey(gWindow, GLFW_KEY_BACKSPACE) == GLFW_PRESS) { | ||||
if (!windowIsModPressed() && !windowIsShiftPressed()) { | if (!windowIsModPressed() && !windowIsShiftPressed()) { | ||||
gScene->rackWidget->deleteModule(this); | |||||
context()->scene->rackWidget->deleteModule(this); | |||||
delete this; | delete this; | ||||
// e.target = this; | // e.target = this; | ||||
return; | return; | ||||
@@ -346,7 +348,7 @@ void ModuleWidget::onHoverKey(event::HoverKey &e) { | |||||
} break; | } break; | ||||
case GLFW_KEY_D: { | case GLFW_KEY_D: { | ||||
if (windowIsModPressed() && !windowIsShiftPressed()) { | if (windowIsModPressed() && !windowIsShiftPressed()) { | ||||
gScene->rackWidget->cloneModule(this); | |||||
context()->scene->rackWidget->cloneModule(this); | |||||
e.target = this; | e.target = this; | ||||
return; | return; | ||||
} | } | ||||
@@ -364,17 +366,17 @@ void ModuleWidget::onHoverKey(event::HoverKey &e) { | |||||
} | } | ||||
void ModuleWidget::onDragStart(event::DragStart &e) { | void ModuleWidget::onDragStart(event::DragStart &e) { | ||||
dragPos = gScene->rackWidget->lastMousePos.minus(box.pos); | |||||
dragPos = context()->scene->rackWidget->lastMousePos.minus(box.pos); | |||||
} | } | ||||
void ModuleWidget::onDragEnd(event::DragEnd &e) { | void ModuleWidget::onDragEnd(event::DragEnd &e) { | ||||
} | } | ||||
void ModuleWidget::onDragMove(event::DragMove &e) { | void ModuleWidget::onDragMove(event::DragMove &e) { | ||||
if (!gScene->rackWidget->lockModules) { | |||||
if (!context()->scene->rackWidget->lockModules) { | |||||
Rect newBox = box; | Rect newBox = box; | ||||
newBox.pos = gScene->rackWidget->lastMousePos.minus(dragPos); | |||||
gScene->rackWidget->requestModuleBoxNearest(this, newBox); | |||||
newBox.pos = context()->scene->rackWidget->lastMousePos.minus(dragPos); | |||||
context()->scene->rackWidget->requestModuleBoxNearest(this, newBox); | |||||
} | } | ||||
} | } | ||||
@@ -431,14 +433,14 @@ struct ModuleLoadItem : MenuItem { | |||||
struct ModuleCloneItem : MenuItem { | struct ModuleCloneItem : MenuItem { | ||||
ModuleWidget *moduleWidget; | ModuleWidget *moduleWidget; | ||||
void onAction(event::Action &e) override { | void onAction(event::Action &e) override { | ||||
gScene->rackWidget->cloneModule(moduleWidget); | |||||
context()->scene->rackWidget->cloneModule(moduleWidget); | |||||
} | } | ||||
}; | }; | ||||
struct ModuleDeleteItem : MenuItem { | struct ModuleDeleteItem : MenuItem { | ||||
ModuleWidget *moduleWidget; | ModuleWidget *moduleWidget; | ||||
void onAction(event::Action &e) override { | void onAction(event::Action &e) override { | ||||
gScene->rackWidget->deleteModule(moduleWidget); | |||||
context()->scene->rackWidget->deleteModule(moduleWidget); | |||||
delete moduleWidget; | delete moduleWidget; | ||||
} | } | ||||
}; | }; | ||||
@@ -1,6 +1,7 @@ | |||||
#include "app/Port.hpp" | #include "app/Port.hpp" | ||||
#include "app/Scene.hpp" | #include "app/Scene.hpp" | ||||
#include "window.hpp" | #include "window.hpp" | ||||
#include "context.hpp" | |||||
#include "componentlibrary.hpp" | #include "componentlibrary.hpp" | ||||
@@ -24,7 +25,7 @@ Port::Port() { | |||||
Port::~Port() { | Port::~Port() { | ||||
// plugLight is not a child and is thus owned by the Port, so we need to delete it here | // plugLight is not a child and is thus owned by the Port, so we need to delete it here | ||||
delete plugLight; | delete plugLight; | ||||
gScene->rackWidget->wireContainer->removeAllWires(this); | |||||
context()->scene->rackWidget->wireContainer->removeAllWires(this); | |||||
} | } | ||||
void Port::step() { | void Port::step() { | ||||
@@ -41,7 +42,7 @@ void Port::step() { | |||||
} | } | ||||
void Port::draw(NVGcontext *vg) { | void Port::draw(NVGcontext *vg) { | ||||
WireWidget *activeWire = gScene->rackWidget->wireContainer->activeWire; | |||||
WireWidget *activeWire = context()->scene->rackWidget->wireContainer->activeWire; | |||||
if (activeWire) { | if (activeWire) { | ||||
// Dim the Port if the active wire cannot plug into this Port | // Dim the Port if the active wire cannot plug into this Port | ||||
if (type == INPUT ? activeWire->inputPort : activeWire->outputPort) | if (type == INPUT ? activeWire->inputPort : activeWire->outputPort) | ||||
@@ -51,7 +52,7 @@ void Port::draw(NVGcontext *vg) { | |||||
void Port::onButton(event::Button &e) { | void Port::onButton(event::Button &e) { | ||||
if (e.action == GLFW_PRESS && e.button == GLFW_MOUSE_BUTTON_LEFT) { | if (e.action == GLFW_PRESS && e.button == GLFW_MOUSE_BUTTON_LEFT) { | ||||
gScene->rackWidget->wireContainer->removeTopWire(this); | |||||
context()->scene->rackWidget->wireContainer->removeTopWire(this); | |||||
// HACK | // HACK | ||||
// Update hovered*Port of active wire if applicable | // Update hovered*Port of active wire if applicable | ||||
@@ -63,7 +64,7 @@ void Port::onButton(event::Button &e) { | |||||
void Port::onDragStart(event::DragStart &e) { | void Port::onDragStart(event::DragStart &e) { | ||||
// Try to grab wire on top of stack | // Try to grab wire on top of stack | ||||
WireWidget *wire = gScene->rackWidget->wireContainer->getTopWire(this); | |||||
WireWidget *wire = context()->scene->rackWidget->wireContainer->getTopWire(this); | |||||
if (type == OUTPUT && windowIsModPressed()) { | if (type == OUTPUT && windowIsModPressed()) { | ||||
wire = NULL; | wire = NULL; | ||||
} | } | ||||
@@ -84,13 +85,13 @@ void Port::onDragStart(event::DragStart &e) { | |||||
else | else | ||||
wire->outputPort = this; | wire->outputPort = this; | ||||
} | } | ||||
gScene->rackWidget->wireContainer->setActiveWire(wire); | |||||
context()->scene->rackWidget->wireContainer->setActiveWire(wire); | |||||
} | } | ||||
void Port::onDragEnd(event::DragEnd &e) { | void Port::onDragEnd(event::DragEnd &e) { | ||||
// FIXME | // FIXME | ||||
// If the source Port is deleted, this will be called, removing the cable | // If the source Port is deleted, this will be called, removing the cable | ||||
gScene->rackWidget->wireContainer->commitActiveWire(); | |||||
context()->scene->rackWidget->wireContainer->commitActiveWire(); | |||||
} | } | ||||
void Port::onDragDrop(event::DragDrop &e) { | void Port::onDragDrop(event::DragDrop &e) { | ||||
@@ -99,12 +100,12 @@ void Port::onDragDrop(event::DragDrop &e) { | |||||
void Port::onDragEnter(event::DragEnter &e) { | void Port::onDragEnter(event::DragEnter &e) { | ||||
// Reject ports if this is an input port and something is already plugged into it | // Reject ports if this is an input port and something is already plugged into it | ||||
if (type == INPUT) { | if (type == INPUT) { | ||||
WireWidget *topWire = gScene->rackWidget->wireContainer->getTopWire(this); | |||||
WireWidget *topWire = context()->scene->rackWidget->wireContainer->getTopWire(this); | |||||
if (topWire) | if (topWire) | ||||
return; | return; | ||||
} | } | ||||
WireWidget *activeWire = gScene->rackWidget->wireContainer->activeWire; | |||||
WireWidget *activeWire = context()->scene->rackWidget->wireContainer->activeWire; | |||||
if (activeWire) { | if (activeWire) { | ||||
if (type == INPUT) | if (type == INPUT) | ||||
activeWire->hoveredInputPort = this; | activeWire->hoveredInputPort = this; | ||||
@@ -114,7 +115,7 @@ void Port::onDragEnter(event::DragEnter &e) { | |||||
} | } | ||||
void Port::onDragLeave(event::DragLeave &e) { | void Port::onDragLeave(event::DragLeave &e) { | ||||
WireWidget *activeWire = gScene->rackWidget->wireContainer->activeWire; | |||||
WireWidget *activeWire = context()->scene->rackWidget->wireContainer->activeWire; | |||||
if (activeWire) { | if (activeWire) { | ||||
if (type == INPUT) | if (type == INPUT) | ||||
activeWire->hoveredInputPort = NULL; | activeWire->hoveredInputPort = NULL; | ||||
@@ -1,6 +1,7 @@ | |||||
#include "app/RackScrollWidget.hpp" | #include "app/RackScrollWidget.hpp" | ||||
#include "app/Scene.hpp" | #include "app/Scene.hpp" | ||||
#include "window.hpp" | #include "window.hpp" | ||||
#include "context.hpp" | |||||
namespace rack { | namespace rack { | ||||
@@ -10,7 +11,7 @@ void RackScrollWidget::step() { | |||||
Vec pos = gMousePos; | Vec pos = gMousePos; | ||||
Rect viewport = getViewport(box.zeroPos()); | Rect viewport = getViewport(box.zeroPos()); | ||||
// Scroll rack if dragging cable near the edge of the screen | // Scroll rack if dragging cable near the edge of the screen | ||||
if (gScene->rackWidget->wireContainer->activeWire) { | |||||
if (context()->scene->rackWidget->wireContainer->activeWire) { | |||||
float margin = 20.0; | float margin = 20.0; | ||||
float speed = 15.0; | float speed = 15.0; | ||||
if (pos.x <= viewport.pos.x + margin) | if (pos.x <= viewport.pos.x + margin) | ||||
@@ -10,6 +10,7 @@ | |||||
#include "system.hpp" | #include "system.hpp" | ||||
#include "logger.hpp" | #include "logger.hpp" | ||||
#include "plugin/PluginManager.hpp" | #include "plugin/PluginManager.hpp" | ||||
#include "context.hpp" | |||||
namespace rack { | namespace rack { | ||||
@@ -59,7 +60,7 @@ void RackWidget::clear() { | |||||
wireContainer->clearChildren(); | wireContainer->clearChildren(); | ||||
moduleContainer->clearChildren(); | moduleContainer->clearChildren(); | ||||
gScene->scrollWidget->offset = Vec(0, 0); | |||||
context()->scene->scrollWidget->offset = Vec(0, 0); | |||||
} | } | ||||
void RackWidget::reset() { | void RackWidget::reset() { | ||||
@@ -4,6 +4,7 @@ | |||||
#include "app/Scene.hpp" | #include "app/Scene.hpp" | ||||
#include "app/ModuleBrowser.hpp" | #include "app/ModuleBrowser.hpp" | ||||
#include "app/RackScrollWidget.hpp" | #include "app/RackScrollWidget.hpp" | ||||
#include "context.hpp" | |||||
#include <thread> | #include <thread> | ||||
@@ -43,7 +44,7 @@ void Scene::step() { | |||||
zoomWidget->box.size = rackWidget->box.size.mult(zoomWidget->zoom); | zoomWidget->box.size = rackWidget->box.size.mult(zoomWidget->zoom); | ||||
// Request latest version from server | // Request latest version from server | ||||
if (!devMode && checkVersion && !checkedVersion) { | |||||
if (!context()->devMode && checkVersion && !checkedVersion) { | |||||
std::thread t(&Scene::runCheckVersion, this); | std::thread t(&Scene::runCheckVersion, this); | ||||
t.detach(); | t.detach(); | ||||
checkedVersion = true; | checkedVersion = true; | ||||
@@ -149,7 +150,4 @@ void Scene::runCheckVersion() { | |||||
} | } | ||||
Scene *gScene = NULL; | |||||
} // namespace rack | } // namespace rack |
@@ -8,6 +8,7 @@ | |||||
#include "ui/Slider.hpp" | #include "ui/Slider.hpp" | ||||
#include "app/PluginManagerWidget.hpp" | #include "app/PluginManagerWidget.hpp" | ||||
#include "app/Scene.hpp" | #include "app/Scene.hpp" | ||||
#include "context.hpp" | |||||
#include "helpers.hpp" | #include "helpers.hpp" | ||||
@@ -21,13 +22,13 @@ struct TooltipIconButton : IconButton { | |||||
tooltip = new Tooltip; | tooltip = new Tooltip; | ||||
tooltip->box.pos = getAbsoluteOffset(Vec(0, BND_WIDGET_HEIGHT)); | tooltip->box.pos = getAbsoluteOffset(Vec(0, BND_WIDGET_HEIGHT)); | ||||
tooltip->text = getTooltipText(); | tooltip->text = getTooltipText(); | ||||
gScene->addChild(tooltip); | |||||
context()->scene->addChild(tooltip); | |||||
} | } | ||||
IconButton::onEnter(e); | IconButton::onEnter(e); | ||||
} | } | ||||
void onLeave(event::Leave &e) override { | void onLeave(event::Leave &e) override { | ||||
if (tooltip) { | if (tooltip) { | ||||
gScene->removeChild(tooltip); | |||||
context()->scene->removeChild(tooltip); | |||||
delete tooltip; | delete tooltip; | ||||
tooltip = NULL; | tooltip = NULL; | ||||
} | } | ||||
@@ -42,7 +43,7 @@ struct NewButton : TooltipIconButton { | |||||
} | } | ||||
std::string getTooltipText() override {return "New patch (" WINDOW_MOD_KEY_NAME "+N)";} | std::string getTooltipText() override {return "New patch (" WINDOW_MOD_KEY_NAME "+N)";} | ||||
void onAction(event::Action &e) override { | void onAction(event::Action &e) override { | ||||
gScene->rackWidget->reset(); | |||||
context()->scene->rackWidget->reset(); | |||||
} | } | ||||
}; | }; | ||||
@@ -52,7 +53,7 @@ struct OpenButton : TooltipIconButton { | |||||
} | } | ||||
std::string getTooltipText() override {return "Open patch (" WINDOW_MOD_KEY_NAME "+O)";} | std::string getTooltipText() override {return "Open patch (" WINDOW_MOD_KEY_NAME "+O)";} | ||||
void onAction(event::Action &e) override { | void onAction(event::Action &e) override { | ||||
gScene->rackWidget->loadDialog(); | |||||
context()->scene->rackWidget->loadDialog(); | |||||
} | } | ||||
}; | }; | ||||
@@ -62,7 +63,7 @@ struct SaveButton : TooltipIconButton { | |||||
} | } | ||||
std::string getTooltipText() override {return "Save patch (" WINDOW_MOD_KEY_NAME "+S)";} | std::string getTooltipText() override {return "Save patch (" WINDOW_MOD_KEY_NAME "+S)";} | ||||
void onAction(event::Action &e) override { | void onAction(event::Action &e) override { | ||||
gScene->rackWidget->saveDialog(); | |||||
context()->scene->rackWidget->saveDialog(); | |||||
} | } | ||||
}; | }; | ||||
@@ -72,7 +73,7 @@ struct SaveAsButton : TooltipIconButton { | |||||
} | } | ||||
std::string getTooltipText() override {return "Save patch as (" WINDOW_MOD_KEY_NAME "+Shift+S)";} | std::string getTooltipText() override {return "Save patch as (" WINDOW_MOD_KEY_NAME "+Shift+S)";} | ||||
void onAction(event::Action &e) override { | void onAction(event::Action &e) override { | ||||
gScene->rackWidget->saveAsDialog(); | |||||
context()->scene->rackWidget->saveAsDialog(); | |||||
} | } | ||||
}; | }; | ||||
@@ -82,7 +83,7 @@ struct RevertButton : TooltipIconButton { | |||||
} | } | ||||
std::string getTooltipText() override {return "Revert patch";} | std::string getTooltipText() override {return "Revert patch";} | ||||
void onAction(event::Action &e) override { | void onAction(event::Action &e) override { | ||||
gScene->rackWidget->revert(); | |||||
context()->scene->rackWidget->revert(); | |||||
} | } | ||||
}; | }; | ||||
@@ -92,7 +93,7 @@ struct DisconnectCablesButton : TooltipIconButton { | |||||
} | } | ||||
std::string getTooltipText() override {return "Disconnect cables";} | std::string getTooltipText() override {return "Disconnect cables";} | ||||
void onAction(event::Action &e) override { | void onAction(event::Action &e) override { | ||||
gScene->rackWidget->disconnect(); | |||||
context()->scene->rackWidget->disconnect(); | |||||
} | } | ||||
}; | }; | ||||
@@ -102,21 +103,21 @@ struct PowerMeterButton : TooltipIconButton { | |||||
} | } | ||||
std::string getTooltipText() override {return "Toggle power meter (see manual for explanation)";} | std::string getTooltipText() override {return "Toggle power meter (see manual for explanation)";} | ||||
void onAction(event::Action &e) override { | void onAction(event::Action &e) override { | ||||
gEngine->powerMeter ^= true; | |||||
context()->engine->powerMeter ^= true; | |||||
} | } | ||||
}; | }; | ||||
struct EnginePauseItem : MenuItem { | struct EnginePauseItem : MenuItem { | ||||
void onAction(event::Action &e) override { | void onAction(event::Action &e) override { | ||||
gEngine->paused ^= true; | |||||
context()->engine->paused ^= true; | |||||
} | } | ||||
}; | }; | ||||
struct SampleRateItem : MenuItem { | struct SampleRateItem : MenuItem { | ||||
float sampleRate; | float sampleRate; | ||||
void onAction(event::Action &e) override { | void onAction(event::Action &e) override { | ||||
gEngine->setSampleRate(sampleRate); | |||||
gEngine->paused = false; | |||||
context()->engine->setSampleRate(sampleRate); | |||||
context()->engine->paused = false; | |||||
} | } | ||||
}; | }; | ||||
@@ -133,14 +134,14 @@ struct SampleRateButton : TooltipIconButton { | |||||
menu->addChild(createMenuLabel("Engine sample rate")); | menu->addChild(createMenuLabel("Engine sample rate")); | ||||
EnginePauseItem *pauseItem = new EnginePauseItem; | EnginePauseItem *pauseItem = new EnginePauseItem; | ||||
pauseItem->text = gEngine->paused ? "Resume engine" : "Pause engine"; | |||||
pauseItem->text = context()->engine->paused ? "Resume engine" : "Pause engine"; | |||||
menu->addChild(pauseItem); | menu->addChild(pauseItem); | ||||
std::vector<float> sampleRates = {44100, 48000, 88200, 96000, 176400, 192000}; | std::vector<float> sampleRates = {44100, 48000, 88200, 96000, 176400, 192000}; | ||||
for (float sampleRate : sampleRates) { | for (float sampleRate : sampleRates) { | ||||
SampleRateItem *item = new SampleRateItem; | SampleRateItem *item = new SampleRateItem; | ||||
item->text = string::f("%.0f Hz", sampleRate); | item->text = string::f("%.0f Hz", sampleRate); | ||||
item->rightText = CHECKMARK(gEngine->getSampleRate() == sampleRate); | |||||
item->rightText = CHECKMARK(context()->engine->getSampleRate() == sampleRate); | |||||
item->sampleRate = sampleRate; | item->sampleRate = sampleRate; | ||||
menu->addChild(item); | menu->addChild(item); | ||||
} | } | ||||
@@ -153,7 +154,7 @@ struct RackLockButton : TooltipIconButton { | |||||
} | } | ||||
std::string getTooltipText() override {return "Lock modules";} | std::string getTooltipText() override {return "Lock modules";} | ||||
void onAction(event::Action &e) override { | void onAction(event::Action &e) override { | ||||
gScene->rackWidget->lockModules ^= true; | |||||
context()->scene->rackWidget->lockModules ^= true; | |||||
} | } | ||||
}; | }; | ||||
@@ -185,10 +186,10 @@ struct WireTensionQuantity : Quantity { | |||||
struct ZoomQuantity : Quantity { | struct ZoomQuantity : Quantity { | ||||
void setValue(float value) override { | void setValue(float value) override { | ||||
gScene->zoomWidget->setZoom(std::round(value) / 100); | |||||
context()->scene->zoomWidget->setZoom(std::round(value) / 100); | |||||
} | } | ||||
float getValue() override { | float getValue() override { | ||||
return gScene->zoomWidget->zoom * 100; | |||||
return context()->scene->zoomWidget->zoom * 100; | |||||
} | } | ||||
float getMinValue() override {return 25;} | float getMinValue() override {return 25;} | ||||
float getMaxValue() override {return 200;} | float getMaxValue() override {return 200;} | ||||
@@ -4,6 +4,7 @@ | |||||
#include "componentlibrary.hpp" | #include "componentlibrary.hpp" | ||||
#include "window.hpp" | #include "window.hpp" | ||||
#include "event.hpp" | #include "event.hpp" | ||||
#include "context.hpp" | |||||
namespace rack { | namespace rack { | ||||
@@ -108,12 +109,12 @@ void WireWidget::updateWire() { | |||||
wire->outputId = outputPort->portId; | wire->outputId = outputPort->portId; | ||||
wire->inputModule = inputPort->module; | wire->inputModule = inputPort->module; | ||||
wire->inputId = inputPort->portId; | wire->inputId = inputPort->portId; | ||||
gEngine->addWire(wire); | |||||
context()->engine->addWire(wire); | |||||
} | } | ||||
} | } | ||||
else { | else { | ||||
if (wire) { | if (wire) { | ||||
gEngine->removeWire(wire); | |||||
context()->engine->removeWire(wire); | |||||
delete wire; | delete wire; | ||||
wire = NULL; | wire = NULL; | ||||
} | } | ||||
@@ -122,25 +123,25 @@ void WireWidget::updateWire() { | |||||
Vec WireWidget::getOutputPos() { | Vec WireWidget::getOutputPos() { | ||||
if (outputPort) { | if (outputPort) { | ||||
return outputPort->getRelativeOffset(outputPort->box.zeroPos().getCenter(), gScene->rackWidget); | |||||
return outputPort->getRelativeOffset(outputPort->box.zeroPos().getCenter(), context()->scene->rackWidget); | |||||
} | } | ||||
else if (hoveredOutputPort) { | else if (hoveredOutputPort) { | ||||
return hoveredOutputPort->getRelativeOffset(hoveredOutputPort->box.zeroPos().getCenter(), gScene->rackWidget); | |||||
return hoveredOutputPort->getRelativeOffset(hoveredOutputPort->box.zeroPos().getCenter(), context()->scene->rackWidget); | |||||
} | } | ||||
else { | else { | ||||
return gScene->rackWidget->lastMousePos; | |||||
return context()->scene->rackWidget->lastMousePos; | |||||
} | } | ||||
} | } | ||||
Vec WireWidget::getInputPos() { | Vec WireWidget::getInputPos() { | ||||
if (inputPort) { | if (inputPort) { | ||||
return inputPort->getRelativeOffset(inputPort->box.zeroPos().getCenter(), gScene->rackWidget); | |||||
return inputPort->getRelativeOffset(inputPort->box.zeroPos().getCenter(), context()->scene->rackWidget); | |||||
} | } | ||||
else if (hoveredInputPort) { | else if (hoveredInputPort) { | ||||
return hoveredInputPort->getRelativeOffset(hoveredInputPort->box.zeroPos().getCenter(), gScene->rackWidget); | |||||
return hoveredInputPort->getRelativeOffset(hoveredInputPort->box.zeroPos().getCenter(), context()->scene->rackWidget); | |||||
} | } | ||||
else { | else { | ||||
return gScene->rackWidget->lastMousePos; | |||||
return context()->scene->rackWidget->lastMousePos; | |||||
} | } | ||||
} | } | ||||
@@ -166,14 +167,14 @@ void WireWidget::draw(NVGcontext *vg) { | |||||
float opacity = 0.5; | float opacity = 0.5; | ||||
float tension = 0.5; | float tension = 0.5; | ||||
WireWidget *activeWire = gScene->rackWidget->wireContainer->activeWire; | |||||
WireWidget *activeWire = context()->scene->rackWidget->wireContainer->activeWire; | |||||
if (activeWire) { | if (activeWire) { | ||||
// Draw as opaque if the wire is active | // Draw as opaque if the wire is active | ||||
if (activeWire == this) | if (activeWire == this) | ||||
opacity = 1.0; | opacity = 1.0; | ||||
} | } | ||||
else { | else { | ||||
Port *hoveredPort = dynamic_cast<Port*>(event::gContext->hoveredWidget); | |||||
Port *hoveredPort = dynamic_cast<Port*>(context()->event->hoveredWidget); | |||||
if (hoveredPort && (hoveredPort == outputPort || hoveredPort == inputPort)) | if (hoveredPort && (hoveredPort == outputPort || hoveredPort == inputPort)) | ||||
opacity = 1.0; | opacity = 1.0; | ||||
} | } | ||||
@@ -1,5 +1,6 @@ | |||||
#include "asset.hpp" | #include "asset.hpp" | ||||
#include "system.hpp" | #include "system.hpp" | ||||
#include "context.hpp" | |||||
#if ARCH_MAC | #if ARCH_MAC | ||||
#include <CoreFoundation/CoreFoundation.h> | #include <CoreFoundation/CoreFoundation.h> | ||||
@@ -27,9 +28,10 @@ std::string systemDir; | |||||
std::string userDir; | std::string userDir; | ||||
void init(bool devMode) { | |||||
void init() { | |||||
// Get system dir | |||||
if (systemDir.empty()) { | if (systemDir.empty()) { | ||||
if (devMode) { | |||||
if (context()->devMode) { | |||||
systemDir = "."; | systemDir = "."; | ||||
} | } | ||||
else { | else { | ||||
@@ -57,8 +59,9 @@ void init(bool devMode) { | |||||
} | } | ||||
} | } | ||||
// Get user dir | |||||
if (userDir.empty()) { | if (userDir.empty()) { | ||||
if (devMode) { | |||||
if (context()->devMode) { | |||||
userDir = "."; | userDir = "."; | ||||
} | } | ||||
else { | else { | ||||
@@ -0,0 +1,15 @@ | |||||
#include "context.hpp" | |||||
namespace rack { | |||||
static Context c; | |||||
Context *context() { | |||||
return &c; | |||||
} | |||||
} // namespace rack |
@@ -325,7 +325,4 @@ float Engine::getSampleTime() { | |||||
} | } | ||||
Engine *gEngine = NULL; | |||||
} // namespace rack | } // namespace rack |
@@ -1,5 +1,6 @@ | |||||
#include "engine/Light.hpp" | #include "engine/Light.hpp" | ||||
#include "engine/Engine.hpp" | #include "engine/Engine.hpp" | ||||
#include "context.hpp" | |||||
namespace rack { | namespace rack { | ||||
@@ -15,7 +16,7 @@ void Light::setBrightnessSmooth(float brightness, float frames) { | |||||
float v = (brightness > 0.f) ? std::pow(brightness, 2) : 0.f; | float v = (brightness > 0.f) ? std::pow(brightness, 2) : 0.f; | ||||
if (v < value) { | if (v < value) { | ||||
// Fade out light with lambda = framerate | // Fade out light with lambda = framerate | ||||
value += (v - value) * gEngine->getSampleTime() * frames * 60.f; | |||||
value += (v - value) * context()->engine->getSampleTime() * frames * 60.f; | |||||
} | } | ||||
else { | else { | ||||
// Immediately illuminate light | // Immediately illuminate light | ||||
@@ -1,5 +1,6 @@ | |||||
#include "logger.hpp" | #include "logger.hpp" | ||||
#include "asset.hpp" | #include "asset.hpp" | ||||
#include "context.hpp" | |||||
#include <chrono> | #include <chrono> | ||||
@@ -11,9 +12,9 @@ static FILE *outputFile = NULL; | |||||
static std::chrono::high_resolution_clock::time_point startTime; | static std::chrono::high_resolution_clock::time_point startTime; | ||||
void init(bool devMode) { | |||||
void init() { | |||||
startTime = std::chrono::high_resolution_clock::now(); | startTime = std::chrono::high_resolution_clock::now(); | ||||
if (devMode) { | |||||
if (context()->devMode) { | |||||
outputFile = stderr; | outputFile = stderr; | ||||
} | } | ||||
else { | else { | ||||
@@ -11,6 +11,7 @@ | |||||
#include "app/Scene.hpp" | #include "app/Scene.hpp" | ||||
#include "tags.hpp" | #include "tags.hpp" | ||||
#include "plugin/PluginManager.hpp" | #include "plugin/PluginManager.hpp" | ||||
#include "context.hpp" | |||||
#include <unistd.h> | #include <unistd.h> | ||||
#include <osdialog.h> | #include <osdialog.h> | ||||
@@ -26,7 +27,7 @@ int main(int argc, char *argv[]) { | |||||
#ifdef ARCH_WIN | #ifdef ARCH_WIN | ||||
// Windows global mutex to prevent multiple instances | // Windows global mutex to prevent multiple instances | ||||
// Handle will be closed by Windows when the process ends | // Handle will be closed by Windows when the process ends | ||||
HANDLE instanceMutex = CreateMutex(NULL, true, gApplicationName.c_str()); | |||||
HANDLE instanceMutex = CreateMutex(NULL, true, APP_NAME.c_str()); | |||||
if (GetLastError() == ERROR_ALREADY_EXISTS) { | if (GetLastError() == ERROR_ALREADY_EXISTS) { | ||||
osdialog_message(OSDIALOG_ERROR, OSDIALOG_OK, "Rack is already running. Multiple Rack instances are not supported."); | osdialog_message(OSDIALOG_ERROR, OSDIALOG_OK, "Rack is already running. Multiple Rack instances are not supported."); | ||||
exit(1); | exit(1); | ||||
@@ -34,7 +35,6 @@ int main(int argc, char *argv[]) { | |||||
(void) instanceMutex; | (void) instanceMutex; | ||||
#endif | #endif | ||||
bool devMode = false; | |||||
std::string patchFile; | std::string patchFile; | ||||
// Parse command line arguments | // Parse command line arguments | ||||
@@ -43,7 +43,7 @@ int main(int argc, char *argv[]) { | |||||
while ((c = getopt(argc, argv, "ds:u:")) != -1) { | while ((c = getopt(argc, argv, "ds:u:")) != -1) { | ||||
switch (c) { | switch (c) { | ||||
case 'd': { | case 'd': { | ||||
devMode = true; | |||||
context()->devMode = true; | |||||
} break; | } break; | ||||
case 's': { | case 's': { | ||||
asset::systemDir = optarg; | asset::systemDir = optarg; | ||||
@@ -60,28 +60,27 @@ int main(int argc, char *argv[]) { | |||||
// Initialize environment | // Initialize environment | ||||
random::init(); | random::init(); | ||||
asset::init(devMode); | |||||
logger::init(devMode); | |||||
asset::init(); | |||||
logger::init(); | |||||
// Log environment | // Log environment | ||||
INFO("%s %s", APP_NAME.c_str(), APP_VERSION.c_str()); | INFO("%s %s", APP_NAME.c_str(), APP_VERSION.c_str()); | ||||
if (devMode) | |||||
if (context()->devMode) | |||||
INFO("Development mode"); | INFO("Development mode"); | ||||
INFO("System directory: %s", asset::system("").c_str()); | INFO("System directory: %s", asset::system("").c_str()); | ||||
INFO("User directory: %s", asset::user("").c_str()); | INFO("User directory: %s", asset::user("").c_str()); | ||||
// Initialize app | // Initialize app | ||||
tagsInit(); | tagsInit(); | ||||
gPluginManager = new PluginManager(devMode); | |||||
gEngine = new Engine; | |||||
gPluginManager = new PluginManager; | |||||
context()->engine = new Engine; | |||||
rtmidiInit(); | rtmidiInit(); | ||||
bridgeInit(); | bridgeInit(); | ||||
keyboard::init(); | keyboard::init(); | ||||
gamepad::init(); | gamepad::init(); | ||||
event::gContext = new event::Context; | |||||
gScene = new Scene; | |||||
gScene->devMode = devMode; | |||||
event::gContext->rootWidget = gScene; | |||||
context()->event = new event::Context; | |||||
context()->scene = new Scene; | |||||
context()->event->rootWidget = context()->scene; | |||||
windowInit(); | windowInit(); | ||||
settings::load(asset::user("settings.json")); | settings::load(asset::user("settings.json")); | ||||
@@ -92,36 +91,36 @@ int main(int argc, char *argv[]) { | |||||
settings::save(asset::user("settings.json")); | settings::save(asset::user("settings.json")); | ||||
settings::gSkipAutosaveOnLaunch = false; | settings::gSkipAutosaveOnLaunch = false; | ||||
if (oldSkipAutosaveOnLaunch && osdialog_message(OSDIALOG_INFO, OSDIALOG_YES_NO, "Rack has recovered from a crash, possibly caused by a faulty module in your patch. Clear your patch and start over?")) { | if (oldSkipAutosaveOnLaunch && osdialog_message(OSDIALOG_INFO, OSDIALOG_YES_NO, "Rack has recovered from a crash, possibly caused by a faulty module in your patch. Clear your patch and start over?")) { | ||||
gScene->rackWidget->lastPath = ""; | |||||
context()->scene->rackWidget->lastPath = ""; | |||||
} | } | ||||
else { | else { | ||||
// Load autosave | // Load autosave | ||||
std::string oldLastPath = gScene->rackWidget->lastPath; | |||||
gScene->rackWidget->load(asset::user("autosave.vcv")); | |||||
gScene->rackWidget->lastPath = oldLastPath; | |||||
std::string oldLastPath = context()->scene->rackWidget->lastPath; | |||||
context()->scene->rackWidget->load(asset::user("autosave.vcv")); | |||||
context()->scene->rackWidget->lastPath = oldLastPath; | |||||
} | } | ||||
} | } | ||||
else { | else { | ||||
// Load patch | // Load patch | ||||
gScene->rackWidget->load(patchFile); | |||||
gScene->rackWidget->lastPath = patchFile; | |||||
context()->scene->rackWidget->load(patchFile); | |||||
context()->scene->rackWidget->lastPath = patchFile; | |||||
} | } | ||||
gEngine->start(); | |||||
context()->engine->start(); | |||||
windowRun(); | windowRun(); | ||||
gEngine->stop(); | |||||
context()->engine->stop(); | |||||
// Destroy namespaces | // Destroy namespaces | ||||
gScene->rackWidget->save(asset::user("autosave.vcv")); | |||||
context()->scene->rackWidget->save(asset::user("autosave.vcv")); | |||||
settings::save(asset::user("settings.json")); | settings::save(asset::user("settings.json")); | ||||
delete gScene; | |||||
gScene = NULL; | |||||
delete event::gContext; | |||||
event::gContext = NULL; | |||||
delete context()->scene; | |||||
context()->scene = NULL; | |||||
delete context()->event; | |||||
context()->event = NULL; | |||||
windowDestroy(); | windowDestroy(); | ||||
bridgeDestroy(); | bridgeDestroy(); | ||||
delete gEngine; | |||||
gEngine = NULL; | |||||
delete context()->engine; | |||||
context()->engine = NULL; | |||||
midiDestroy(); | midiDestroy(); | ||||
delete gPluginManager; | delete gPluginManager; | ||||
gPluginManager = NULL; | gPluginManager = NULL; | ||||
@@ -4,6 +4,7 @@ | |||||
#include "network.hpp" | #include "network.hpp" | ||||
#include "asset.hpp" | #include "asset.hpp" | ||||
#include "string.hpp" | #include "string.hpp" | ||||
#include "context.hpp" | |||||
#include "app/common.hpp" | #include "app/common.hpp" | ||||
#include <unistd.h> | #include <unistd.h> | ||||
@@ -299,7 +300,7 @@ static void extractPackages(std::string path) { | |||||
// public API | // public API | ||||
//////////////////// | //////////////////// | ||||
PluginManager::PluginManager(bool devMode) { | |||||
PluginManager::PluginManager() { | |||||
// Load core | // Load core | ||||
// This function is defined in core.cpp | // This function is defined in core.cpp | ||||
Plugin *corePlugin = new Plugin; | Plugin *corePlugin = new Plugin; | ||||
@@ -310,7 +311,7 @@ PluginManager::PluginManager(bool devMode) { | |||||
std::string userPlugins = asset::user("plugins"); | std::string userPlugins = asset::user("plugins"); | ||||
mkdir(userPlugins.c_str(), 0755); | mkdir(userPlugins.c_str(), 0755); | ||||
if (!devMode) { | |||||
if (!context()->devMode) { | |||||
// Copy Fundamental package to plugins directory if folder does not exist | // Copy Fundamental package to plugins directory if folder does not exist | ||||
std::string fundamentalSrc = asset::system("Fundamental.zip"); | std::string fundamentalSrc = asset::system("Fundamental.zip"); | ||||
std::string fundamentalDest = asset::user("plugins/Fundamental.zip"); | std::string fundamentalDest = asset::user("plugins/Fundamental.zip"); | ||||
@@ -5,6 +5,7 @@ | |||||
#include "app/Scene.hpp" | #include "app/Scene.hpp" | ||||
#include "app/ModuleBrowser.hpp" | #include "app/ModuleBrowser.hpp" | ||||
#include "engine/Engine.hpp" | #include "engine/Engine.hpp" | ||||
#include "context.hpp" | |||||
#include <jansson.h> | #include <jansson.h> | ||||
@@ -36,17 +37,17 @@ static json_t *settingsToJson() { | |||||
} | } | ||||
// opacity | // opacity | ||||
float opacity = gScene->toolbar->wireOpacity; | |||||
float opacity = context()->scene->toolbar->wireOpacity; | |||||
json_t *opacityJ = json_real(opacity); | json_t *opacityJ = json_real(opacity); | ||||
json_object_set_new(rootJ, "wireOpacity", opacityJ); | json_object_set_new(rootJ, "wireOpacity", opacityJ); | ||||
// tension | // tension | ||||
float tension = gScene->toolbar->wireTension; | |||||
float tension = context()->scene->toolbar->wireTension; | |||||
json_t *tensionJ = json_real(tension); | json_t *tensionJ = json_real(tension); | ||||
json_object_set_new(rootJ, "wireTension", tensionJ); | json_object_set_new(rootJ, "wireTension", tensionJ); | ||||
// zoom | // zoom | ||||
float zoom = gScene->zoomWidget->zoom; | |||||
float zoom = context()->scene->zoomWidget->zoom; | |||||
json_t *zoomJ = json_real(zoom); | json_t *zoomJ = json_real(zoom); | ||||
json_object_set_new(rootJ, "zoom", zoomJ); | json_object_set_new(rootJ, "zoom", zoomJ); | ||||
@@ -55,11 +56,11 @@ static json_t *settingsToJson() { | |||||
json_object_set_new(rootJ, "allowCursorLock", allowCursorLockJ); | json_object_set_new(rootJ, "allowCursorLock", allowCursorLockJ); | ||||
// sampleRate | // sampleRate | ||||
json_t *sampleRateJ = json_real(gEngine->getSampleRate()); | |||||
json_t *sampleRateJ = json_real(context()->engine->getSampleRate()); | |||||
json_object_set_new(rootJ, "sampleRate", sampleRateJ); | json_object_set_new(rootJ, "sampleRate", sampleRateJ); | ||||
// lastPath | // lastPath | ||||
json_t *lastPathJ = json_string(gScene->rackWidget->lastPath.c_str()); | |||||
json_t *lastPathJ = json_string(context()->scene->rackWidget->lastPath.c_str()); | |||||
json_object_set_new(rootJ, "lastPath", lastPathJ); | json_object_set_new(rootJ, "lastPath", lastPathJ); | ||||
// skipAutosaveOnLaunch | // skipAutosaveOnLaunch | ||||
@@ -71,10 +72,10 @@ static json_t *settingsToJson() { | |||||
json_object_set_new(rootJ, "moduleBrowser", moduleBrowserToJson()); | json_object_set_new(rootJ, "moduleBrowser", moduleBrowserToJson()); | ||||
// powerMeter | // powerMeter | ||||
json_object_set_new(rootJ, "powerMeter", json_boolean(gEngine->powerMeter)); | |||||
json_object_set_new(rootJ, "powerMeter", json_boolean(context()->engine->powerMeter)); | |||||
// checkVersion | // checkVersion | ||||
json_object_set_new(rootJ, "checkVersion", json_boolean(gScene->checkVersion)); | |||||
json_object_set_new(rootJ, "checkVersion", json_boolean(context()->scene->checkVersion)); | |||||
return rootJ; | return rootJ; | ||||
} | } | ||||
@@ -104,17 +105,17 @@ static void settingsFromJson(json_t *rootJ) { | |||||
// opacity | // opacity | ||||
json_t *opacityJ = json_object_get(rootJ, "wireOpacity"); | json_t *opacityJ = json_object_get(rootJ, "wireOpacity"); | ||||
if (opacityJ) | if (opacityJ) | ||||
gScene->toolbar->wireOpacity = json_number_value(opacityJ); | |||||
context()->scene->toolbar->wireOpacity = json_number_value(opacityJ); | |||||
// tension | // tension | ||||
json_t *tensionJ = json_object_get(rootJ, "wireTension"); | json_t *tensionJ = json_object_get(rootJ, "wireTension"); | ||||
if (tensionJ) | if (tensionJ) | ||||
gScene->toolbar->wireTension = json_number_value(tensionJ); | |||||
context()->scene->toolbar->wireTension = json_number_value(tensionJ); | |||||
// zoom | // zoom | ||||
json_t *zoomJ = json_object_get(rootJ, "zoom"); | json_t *zoomJ = json_object_get(rootJ, "zoom"); | ||||
if (zoomJ) { | if (zoomJ) { | ||||
gScene->zoomWidget->setZoom(clamp((float) json_number_value(zoomJ), 0.25f, 4.0f)); | |||||
context()->scene->zoomWidget->setZoom(clamp((float) json_number_value(zoomJ), 0.25f, 4.0f)); | |||||
} | } | ||||
// allowCursorLock | // allowCursorLock | ||||
@@ -126,13 +127,13 @@ static void settingsFromJson(json_t *rootJ) { | |||||
json_t *sampleRateJ = json_object_get(rootJ, "sampleRate"); | json_t *sampleRateJ = json_object_get(rootJ, "sampleRate"); | ||||
if (sampleRateJ) { | if (sampleRateJ) { | ||||
float sampleRate = json_number_value(sampleRateJ); | float sampleRate = json_number_value(sampleRateJ); | ||||
gEngine->setSampleRate(sampleRate); | |||||
context()->engine->setSampleRate(sampleRate); | |||||
} | } | ||||
// lastPath | // lastPath | ||||
json_t *lastPathJ = json_object_get(rootJ, "lastPath"); | json_t *lastPathJ = json_object_get(rootJ, "lastPath"); | ||||
if (lastPathJ) | if (lastPathJ) | ||||
gScene->rackWidget->lastPath = json_string_value(lastPathJ); | |||||
context()->scene->rackWidget->lastPath = json_string_value(lastPathJ); | |||||
// skipAutosaveOnLaunch | // skipAutosaveOnLaunch | ||||
json_t *skipAutosaveOnLaunchJ = json_object_get(rootJ, "skipAutosaveOnLaunch"); | json_t *skipAutosaveOnLaunchJ = json_object_get(rootJ, "skipAutosaveOnLaunch"); | ||||
@@ -147,12 +148,12 @@ static void settingsFromJson(json_t *rootJ) { | |||||
// powerMeter | // powerMeter | ||||
json_t *powerMeterJ = json_object_get(rootJ, "powerMeter"); | json_t *powerMeterJ = json_object_get(rootJ, "powerMeter"); | ||||
if (powerMeterJ) | if (powerMeterJ) | ||||
gEngine->powerMeter = json_boolean_value(powerMeterJ); | |||||
context()->engine->powerMeter = json_boolean_value(powerMeterJ); | |||||
// checkVersion | // checkVersion | ||||
json_t *checkVersionJ = json_object_get(rootJ, "checkVersion"); | json_t *checkVersionJ = json_object_get(rootJ, "checkVersion"); | ||||
if (checkVersionJ) | if (checkVersionJ) | ||||
gScene->checkVersion = json_boolean_value(checkVersionJ); | |||||
context()->scene->checkVersion = json_boolean_value(checkVersionJ); | |||||
} | } | ||||
@@ -1,5 +1,6 @@ | |||||
#include "widgets/Widget.hpp" | #include "widgets/Widget.hpp" | ||||
#include "event.hpp" | #include "event.hpp" | ||||
#include "context.hpp" | |||||
#include <algorithm> | #include <algorithm> | ||||
@@ -8,7 +9,7 @@ namespace rack { | |||||
Widget::~Widget() { | Widget::~Widget() { | ||||
// You should only delete orphaned widgets | // You should only delete orphaned widgets | ||||
assert(!parent); | assert(!parent); | ||||
event::gContext->finalizeWidget(this); | |||||
context()->event->finalizeWidget(this); | |||||
clearChildren(); | clearChildren(); | ||||
} | } | ||||
@@ -5,6 +5,7 @@ | |||||
#include "keyboard.hpp" | #include "keyboard.hpp" | ||||
#include "gamepad.hpp" | #include "gamepad.hpp" | ||||
#include "event.hpp" | #include "event.hpp" | ||||
#include "context.hpp" | |||||
#include <map> | #include <map> | ||||
#include <queue> | #include <queue> | ||||
@@ -62,7 +63,7 @@ static void mouseButtonCallback(GLFWwindow *window, int button, int action, int | |||||
} | } | ||||
#endif | #endif | ||||
event::gContext->handleButton(gMousePos, button, action, mods); | |||||
context()->event->handleButton(gMousePos, button, action, mods); | |||||
} | } | ||||
struct MouseButtonArguments { | struct MouseButtonArguments { | ||||
@@ -109,12 +110,12 @@ void cursorPosCallback(GLFWwindow* window, double xpos, double ypos) { | |||||
gMousePos = mousePos; | gMousePos = mousePos; | ||||
event::gContext->handleHover(mousePos, mouseDelta); | |||||
context()->event->handleHover(mousePos, mouseDelta); | |||||
} | } | ||||
void cursorEnterCallback(GLFWwindow* window, int entered) { | void cursorEnterCallback(GLFWwindow* window, int entered) { | ||||
if (!entered) { | if (!entered) { | ||||
event::gContext->handleLeave(); | |||||
context()->event->handleLeave(); | |||||
} | } | ||||
} | } | ||||
@@ -126,15 +127,15 @@ void scrollCallback(GLFWwindow *window, double x, double y) { | |||||
#endif | #endif | ||||
scrollDelta = scrollDelta.mult(50.0); | scrollDelta = scrollDelta.mult(50.0); | ||||
event::gContext->handleScroll(gMousePos, scrollDelta); | |||||
context()->event->handleScroll(gMousePos, scrollDelta); | |||||
} | } | ||||
void charCallback(GLFWwindow *window, unsigned int codepoint) { | void charCallback(GLFWwindow *window, unsigned int codepoint) { | ||||
event::gContext->handleText(gMousePos, codepoint); | |||||
context()->event->handleText(gMousePos, codepoint); | |||||
} | } | ||||
void keyCallback(GLFWwindow *window, int key, int scancode, int action, int mods) { | void keyCallback(GLFWwindow *window, int key, int scancode, int action, int mods) { | ||||
event::gContext->handleKey(gMousePos, key, scancode, action, mods); | |||||
context()->event->handleKey(gMousePos, key, scancode, action, mods); | |||||
// Keyboard MIDI driver | // Keyboard MIDI driver | ||||
if (!(mods & (GLFW_MOD_SHIFT | GLFW_MOD_CONTROL | GLFW_MOD_ALT | GLFW_MOD_SUPER))) { | if (!(mods & (GLFW_MOD_SHIFT | GLFW_MOD_CONTROL | GLFW_MOD_ALT | GLFW_MOD_SUPER))) { | ||||
@@ -152,7 +153,7 @@ void dropCallback(GLFWwindow *window, int count, const char **paths) { | |||||
for (int i = 0; i < count; i++) { | for (int i = 0; i < count; i++) { | ||||
pathsVec.push_back(paths[i]); | pathsVec.push_back(paths[i]); | ||||
} | } | ||||
event::gContext->handleDrop(gMousePos, pathsVec); | |||||
context()->event->handleDrop(gMousePos, pathsVec); | |||||
} | } | ||||
void errorCallback(int error, const char *description) { | void errorCallback(int error, const char *description) { | ||||
@@ -168,7 +169,7 @@ void renderGui() { | |||||
nvgReset(gVg); | nvgReset(gVg); | ||||
nvgScale(gVg, gPixelRatio, gPixelRatio); | nvgScale(gVg, gPixelRatio, gPixelRatio); | ||||
event::gContext->rootWidget->draw(gVg); | |||||
context()->event->rootWidget->draw(gVg); | |||||
glViewport(0, 0, width, height); | glViewport(0, 0, width, height); | ||||
glClearColor(0.0, 0.0, 0.0, 1.0); | glClearColor(0.0, 0.0, 0.0, 1.0); | ||||
@@ -307,9 +308,9 @@ void windowRun() { | |||||
windowTitle = APP_NAME; | windowTitle = APP_NAME; | ||||
windowTitle += " "; | windowTitle += " "; | ||||
windowTitle += APP_VERSION; | windowTitle += APP_VERSION; | ||||
if (!gScene->rackWidget->lastPath.empty()) { | |||||
if (!context()->scene->rackWidget->lastPath.empty()) { | |||||
windowTitle += " - "; | windowTitle += " - "; | ||||
windowTitle += string::filename(gScene->rackWidget->lastPath); | |||||
windowTitle += string::filename(context()->scene->rackWidget->lastPath); | |||||
} | } | ||||
if (windowTitle != lastWindowTitle) { | if (windowTitle != lastWindowTitle) { | ||||
glfwSetWindowTitle(gWindow, windowTitle.c_str()); | glfwSetWindowTitle(gWindow, windowTitle.c_str()); | ||||
@@ -321,7 +322,7 @@ void windowRun() { | |||||
glfwGetWindowContentScale(gWindow, &pixelRatio, NULL); | glfwGetWindowContentScale(gWindow, &pixelRatio, NULL); | ||||
pixelRatio = roundf(pixelRatio); | pixelRatio = roundf(pixelRatio); | ||||
if (pixelRatio != gPixelRatio) { | if (pixelRatio != gPixelRatio) { | ||||
event::gContext->handleZoom(); | |||||
context()->event->handleZoom(); | |||||
gPixelRatio = pixelRatio; | gPixelRatio = pixelRatio; | ||||
} | } | ||||
@@ -332,10 +333,10 @@ void windowRun() { | |||||
glfwGetWindowSize(gWindow, &windowWidth, &windowHeight); | glfwGetWindowSize(gWindow, &windowWidth, &windowHeight); | ||||
gWindowRatio = (float)width / windowWidth; | gWindowRatio = (float)width / windowWidth; | ||||
event::gContext->rootWidget->box.size = Vec(width, height).div(gPixelRatio); | |||||
context()->event->rootWidget->box.size = Vec(width, height).div(gPixelRatio); | |||||
// Step scene | // Step scene | ||||
event::gContext->rootWidget->step(); | |||||
context()->event->rootWidget->step(); | |||||
// Render | // Render | ||||
bool visible = glfwGetWindowAttrib(gWindow, GLFW_VISIBLE) && !glfwGetWindowAttrib(gWindow, GLFW_ICONIFIED); | bool visible = glfwGetWindowAttrib(gWindow, GLFW_VISIBLE) && !glfwGetWindowAttrib(gWindow, GLFW_ICONIFIED); | ||||