Feature/globals handling (#1352)

* Cleaner handling of global state
* Prevent Lua memory corruption (closes #982)
* Initialize glfw first thing to prevent weird joystick loading bug during startup
This commit is contained in:
Alexander Bock
2020-10-21 22:30:05 +02:00
committed by GitHub
parent 1525a0490d
commit efffc25ce0
164 changed files with 1484 additions and 1390 deletions
@@ -511,7 +511,7 @@ void GlobeBrowsingModule::goToChunk(const globebrowsing::RenderableGlobe& globe,
};
// Compute altitude
const glm::dvec3 cameraPosition = global::navigationHandler.camera()->positionVec3();
const glm::dvec3 cameraPosition = global::navigationHandler->camera()->positionVec3();
SceneGraphNode* globeSceneGraphNode = dynamic_cast<SceneGraphNode*>(globe.owner());
if (!globeSceneGraphNode) {
LERROR(
@@ -545,7 +545,7 @@ void GlobeBrowsingModule::goToGeodetic2(const globebrowsing::RenderableGlobe& gl
{
using namespace globebrowsing;
const glm::dvec3 cameraPosition = global::navigationHandler.camera()->positionVec3();
const glm::dvec3 cameraPosition = global::navigationHandler->camera()->positionVec3();
SceneGraphNode* globeSceneGraphNode = dynamic_cast<SceneGraphNode*>(globe.owner());
if (!globeSceneGraphNode) {
LERROR("Error when going to Geodetic2");
@@ -585,7 +585,7 @@ void GlobeBrowsingModule::goToGeodetic3(const globebrowsing::RenderableGlobe& gl
state.position = positionModelSpace;
state.up = slightlyNorth;
global::navigationHandler.setNavigationStateNextFrame(state);
global::navigationHandler->setNavigationStateNextFrame(state);
}
glm::dquat GlobeBrowsingModule::lookDownCameraRotation(
@@ -624,7 +624,7 @@ GlobeBrowsingModule::castFocusNodeRenderableToGlobe()
using namespace globebrowsing;
const Renderable* renderable =
global::navigationHandler.orbitalNavigator().anchorNode()->renderable();
global::navigationHandler->orbitalNavigator().anchorNode()->renderable();
if (!renderable) {
return nullptr;
@@ -53,7 +53,7 @@ int addLayer(lua_State* L) {
const std::string& layerGroupName = ghoul::lua::value<std::string>(L, 2);
// Get the node and make sure it exists
SceneGraphNode* n = global::renderEngine.scene()->sceneGraphNode(globeName);
SceneGraphNode* n = global::renderEngine->scene()->sceneGraphNode(globeName);
if (!n) {
return ghoul::lua::luaError(L, "Unknown globe name: " + globeName);
}
@@ -105,7 +105,7 @@ int deleteLayer(lua_State* L) {
lua_pop(L, 3);
// Get the node and make sure it exists
SceneGraphNode* n = global::renderEngine.scene()->sceneGraphNode(globeName);
SceneGraphNode* n = global::renderEngine->scene()->sceneGraphNode(globeName);
if (!n) {
return ghoul::lua::luaError(L, "Unknown globe name: " + globeName);
}
@@ -220,7 +220,7 @@ int goToChunk(lua_State* L) {
return ghoul::lua::luaError(L, "Identifier must be a RenderableGlobe");
}
global::moduleEngine.module<GlobeBrowsingModule>()->goToChunk(*globe, x, y, level);
global::moduleEngine->module<GlobeBrowsingModule>()->goToChunk(*globe, x, y, level);
ghoul_assert(lua_gettop(L) == 0, "Incorrect number of items left on stack");
return 0;
@@ -243,7 +243,7 @@ int goToGeo(lua_State* L) {
}
}
else {
n = global::navigationHandler.orbitalNavigator().anchorNode();
n = global::navigationHandler->orbitalNavigator().anchorNode();
if (!n) {
return ghoul::lua::luaError(L, "No anchor node is set.");
}
@@ -267,13 +267,13 @@ int goToGeo(lua_State* L) {
}
if (nArguments == parameterOffset + 2) {
global::moduleEngine.module<GlobeBrowsingModule>()->goToGeo(
global::moduleEngine->module<GlobeBrowsingModule>()->goToGeo(
*globe, latitude, longitude
);
}
else if (nArguments == parameterOffset + 3) {
const double altitude = ghoul::lua::value<double>(L, parameterOffset + 3);
global::moduleEngine.module<GlobeBrowsingModule>()->goToGeo(
global::moduleEngine->module<GlobeBrowsingModule>()->goToGeo(
*globe,
latitude,
longitude,
@@ -305,7 +305,7 @@ int getGeoPosition(lua_State* L) {
return ghoul::lua::luaError(L, "Identifier must be a RenderableGlobe");
}
GlobeBrowsingModule& mod = *(global::moduleEngine.module<GlobeBrowsingModule>());
GlobeBrowsingModule& mod = *(global::moduleEngine->module<GlobeBrowsingModule>());
glm::vec3 pos = mod.cartesianCoordinatesFromGeo(
*globe,
latitude,
@@ -322,15 +322,15 @@ int getGeoPosition(lua_State* L) {
int getGeoPositionForCamera(lua_State* L) {
ghoul::lua::checkArgumentsAndThrow(L, 0, "lua::getGeoPositionForCamera");
GlobeBrowsingModule* module = global::moduleEngine.module<GlobeBrowsingModule>();
GlobeBrowsingModule* module = global::moduleEngine->module<GlobeBrowsingModule>();
const RenderableGlobe* globe = module->castFocusNodeRenderableToGlobe();
if (!globe) {
return ghoul::lua::luaError(L, "Focus node must be a RenderableGlobe");
}
const glm::dvec3 cameraPosition = global::navigationHandler.camera()->positionVec3();
const glm::dvec3 cameraPosition = global::navigationHandler->camera()->positionVec3();
const SceneGraphNode* anchor =
global::navigationHandler.orbitalNavigator().anchorNode();
global::navigationHandler->orbitalNavigator().anchorNode();
const glm::dmat4 inverseModelTransform = glm::inverse(anchor->modelTransform());
const glm::dvec3 cameraPositionModelSpace =
glm::dvec3(inverseModelTransform * glm::dvec4(cameraPosition, 1.0));
@@ -357,7 +357,7 @@ int loadWMSCapabilities(lua_State* L) {
std::string globe = ghoul::lua::value<std::string>(L, 2);
std::string url = ghoul::lua::value<std::string>(L, 3);
global::moduleEngine.module<GlobeBrowsingModule>()->loadWMSCapabilities(
global::moduleEngine->module<GlobeBrowsingModule>()->loadWMSCapabilities(
std::move(name),
std::move(globe),
std::move(url)
@@ -378,7 +378,7 @@ int removeWMSServer(lua_State* L) {
ghoul::lua::PopValue::Yes
);
global::moduleEngine.module<GlobeBrowsingModule>()->removeWMSServer(name);
global::moduleEngine->module<GlobeBrowsingModule>()->removeWMSServer(name);
ghoul_assert(lua_gettop(L) == 0, "Incorrect number of items left on stack");
return 0;
@@ -393,7 +393,7 @@ int capabilities(lua_State* L) {
ghoul::lua::PopValue::Yes
);
GlobeBrowsingModule::Capabilities cap =
global::moduleEngine.module<GlobeBrowsingModule>()->capabilities(name);
global::moduleEngine->module<GlobeBrowsingModule>()->capabilities(name);
lua_newtable(L);
for (unsigned long i = 0; i < cap.size(); ++i) {
@@ -48,7 +48,7 @@ AsyncTileDataProvider::AsyncTileDataProvider(std::string name,
{
ZoneScoped
_globeBrowsingModule = global::moduleEngine.module<GlobeBrowsingModule>();
_globeBrowsingModule = global::moduleEngine->module<GlobeBrowsingModule>();
performReset(ResetRawTileDataReader::No);
}
@@ -105,7 +105,7 @@ DashboardItemGlobeLocation::DashboardItemGlobeLocation(
, _fontName(FontNameInfo, KeyFontMono)
, _fontSize(FontSizeInfo, DefaultFontSize, 10.f, 144.f, 1.f)
, _significantDigits(SignificantDigitsInfo, 4, 1, 12)
, _font(global::fontManager.font(KeyFontMono, 10))
, _font(global::fontManager->font(KeyFontMono, 10))
{
documentation::testSpecificationAndThrow(
Documentation(),
@@ -127,12 +127,12 @@ DashboardItemGlobeLocation::DashboardItemGlobeLocation(
_fontName.onChange([this]() {
_font = global::fontManager.font(_fontName, _fontSize);
_font = global::fontManager->font(_fontName, _fontSize);
});
addProperty(_fontName);
_fontSize.onChange([this]() {
_font = global::fontManager.font(_fontName, _fontSize);
_font = global::fontManager->font(_fontName, _fontSize);
});
addProperty(_fontSize);
@@ -148,7 +148,7 @@ DashboardItemGlobeLocation::DashboardItemGlobeLocation(
addProperty(_significantDigits);
updateFormatString();
_font = global::fontManager.font(_fontName, _fontSize);
_font = global::fontManager->font(_fontName, _fontSize);
_buffer.resize(128);
}
@@ -157,7 +157,7 @@ void DashboardItemGlobeLocation::render(glm::vec2& penPosition) {
using namespace globebrowsing;
const SceneGraphNode* n = global::navigationHandler.orbitalNavigator().anchorNode();
const SceneGraphNode* n = global::navigationHandler->orbitalNavigator().anchorNode();
if (!n) {
return;
}
@@ -166,7 +166,7 @@ void DashboardItemGlobeLocation::render(glm::vec2& penPosition) {
return;
}
const glm::dvec3 cameraPosition = global::navigationHandler.camera()->positionVec3();
const glm::dvec3 cameraPosition = global::navigationHandler->camera()->positionVec3();
const glm::dmat4 inverseModelTransform = glm::inverse(n->modelTransform());
const glm::dvec3 cameraPositionModelSpace =
glm::dvec3(inverseModelTransform * glm::dvec4(cameraPosition, 1.0));
+6 -6
View File
@@ -132,12 +132,12 @@ GdalWrapper::GdalWrapper(size_t maximumCacheSize, size_t maximumMaximumCacheSize
}
void GdalWrapper::setGdalProxyConfiguration() {
if (global::configuration.httpProxy.usingHttpProxy) {
const std::string address = global::configuration.httpProxy.address;
const unsigned int port = global::configuration.httpProxy.port;
const std::string user = global::configuration.httpProxy.user;
const std::string password = global::configuration.httpProxy.password;
std::string auth = global::configuration.httpProxy.authentication;
if (global::configuration->httpProxy.usingHttpProxy) {
const std::string address = global::configuration->httpProxy.address;
const unsigned int port = global::configuration->httpProxy.port;
const std::string user = global::configuration->httpProxy.user;
const std::string password = global::configuration->httpProxy.password;
std::string auth = global::configuration->httpProxy.authentication;
std::transform(
auth.begin(),
auth.end(),
@@ -444,7 +444,7 @@ void GlobeLabelsComponent::initialize(const ghoul::Dictionary& dictionary,
}
void GlobeLabelsComponent::initializeFonts() {
_font = openspace::global::fontManager.font(
_font = openspace::global::fontManager->font(
"Mono",
static_cast<float>(_labelsFontSize),
ghoul::fontrendering::FontManager::Outline::Yes,
@@ -562,7 +562,7 @@ bool GlobeLabelsComponent::readLabelsFile(const std::string& file) {
strncpy(lEntry.feature, token.c_str(), 256);
GlobeBrowsingModule* _globeBrowsingModule =
global::moduleEngine.module<openspace::GlobeBrowsingModule>();
global::moduleEngine->module<openspace::GlobeBrowsingModule>();
lEntry.geoPosition = _globeBrowsingModule->cartesianCoordinatesFromGeo(
*_globe,
lEntry.latitude,
@@ -205,7 +205,7 @@ glm::dvec3 GlobeTranslation::position(const UpdateData&) const {
return _position;
}
GlobeBrowsingModule& mod = *(global::moduleEngine.module<GlobeBrowsingModule>());
GlobeBrowsingModule& mod = *(global::moduleEngine->module<GlobeBrowsingModule>());
if (_useHeightmap) {
glm::vec3 groundPos = mod.cartesianCoordinatesFromGeo(
@@ -444,7 +444,7 @@ void RawTileDataReader::initialize() {
throw ghoul::RuntimeError("File path must not be empty");
}
GlobeBrowsingModule& module = *global::moduleEngine.module<GlobeBrowsingModule>();
GlobeBrowsingModule& module = *global::moduleEngine->module<GlobeBrowsingModule>();
std::string content = _datasetFilePath;
if (module.isWMSCachingEnabled()) {
+11 -9
View File
@@ -284,7 +284,7 @@ ChunkTileVector tilesAndSettingsUnsorted(const LayerGroup& layerGroup,
#if defined(__APPLE__) || (defined(__linux__) && defined(__clang__))
ChunkTileVector tilesAndSettings;
#else
ChunkTileVector tilesAndSettings(&global::memoryManager.TemporaryMemory);
ChunkTileVector tilesAndSettings(&global::memoryManager->TemporaryMemory);
#endif
for (Layer* layer : layerGroup.activeLayers()) {
if (layer->tileProvider()) {
@@ -764,12 +764,12 @@ void RenderableGlobe::deinitialize() {
void RenderableGlobe::deinitializeGL() {
if (_localRenderer.program) {
global::renderEngine.removeRenderProgram(_localRenderer.program.get());
global::renderEngine->removeRenderProgram(_localRenderer.program.get());
_localRenderer.program = nullptr;
}
if (_globalRenderer.program) {
global::renderEngine.removeRenderProgram(_globalRenderer.program.get());
global::renderEngine->removeRenderProgram(_globalRenderer.program.get());
_globalRenderer.program = nullptr;
}
@@ -1813,8 +1813,8 @@ void RenderableGlobe::recompileShaders() {
//
// Create local shader
//
global::renderEngine.removeRenderProgram(_localRenderer.program.get());
_localRenderer.program = global::renderEngine.buildRenderProgram(
global::renderEngine->removeRenderProgram(_localRenderer.program.get());
_localRenderer.program = global::renderEngine->buildRenderProgram(
"LocalChunkedLodPatch",
absPath("${MODULE_GLOBEBROWSING}/shaders/localrenderer_vs.glsl"),
absPath("${MODULE_GLOBEBROWSING}/shaders/renderer_fs.glsl"),
@@ -1842,8 +1842,8 @@ void RenderableGlobe::recompileShaders() {
//
// Create global shader
//
global::renderEngine.removeRenderProgram(_globalRenderer.program.get());
_globalRenderer.program = global::renderEngine.buildRenderProgram(
global::renderEngine->removeRenderProgram(_globalRenderer.program.get());
_globalRenderer.program = global::renderEngine->buildRenderProgram(
"GlobalChunkedLodPatch",
absPath("${MODULE_GLOBEBROWSING}/shaders/globalrenderer_vs.glsl"),
absPath("${MODULE_GLOBEBROWSING}/shaders/renderer_fs.glsl"),
@@ -2128,9 +2128,11 @@ void RenderableGlobe::calculateEclipseShadows(ghoul::opengl::ProgramObject& prog
casterPos *= KM_TO_M; // converting to meters
const std::string source = shadowConf.source.first;
SceneGraphNode* sourceNode = global::renderEngine.scene()->sceneGraphNode(source);
SceneGraphNode* sourceNode =
global::renderEngine->scene()->sceneGraphNode(source);
const std::string caster = shadowConf.caster.first;
SceneGraphNode* casterNode = global::renderEngine.scene()->sceneGraphNode(caster);
SceneGraphNode* casterNode =
global::renderEngine->scene()->sceneGraphNode(caster);
const double sourceRadiusScale = std::max(
glm::compMax(sourceNode->scale()),
+6 -6
View File
@@ -265,7 +265,7 @@ void RingsComponent::initializeGL() {
try {
//global::renderEngine.removeRenderProgram(_geometryOnlyShader.get());
_geometryOnlyShader = global::renderEngine.buildRenderProgram(
_geometryOnlyShader = global::renderEngine->buildRenderProgram(
"RingsGeomOnlyProgram",
absPath("${MODULE_GLOBEBROWSING}/shaders/rings_geom_vs.glsl"),
absPath("${MODULE_GLOBEBROWSING}/shaders/rings_geom_fs.glsl")
@@ -298,10 +298,10 @@ void RingsComponent::deinitializeGL() {
_textureFile = nullptr;
_texture = nullptr;
global::renderEngine.removeRenderProgram(_shader.get());
global::renderEngine->removeRenderProgram(_shader.get());
_shader = nullptr;
global::renderEngine.removeRenderProgram(_geometryOnlyShader.get());
global::renderEngine->removeRenderProgram(_geometryOnlyShader.get());
_geometryOnlyShader = nullptr;
}
@@ -410,7 +410,7 @@ void RingsComponent::update(const UpdateData& data) {
}
_sunPosition = glm::normalize(
global::renderEngine.scene()->sceneGraphNode("Sun")->worldPosition() -
global::renderEngine->scene()->sceneGraphNode("Sun")->worldPosition() -
data.modelTransform.translation
);
}
@@ -488,8 +488,8 @@ void RingsComponent::compileShadowShader() {
dict.setValue("nShadowSamples", std::to_string(_nShadowSamples - 1));
try {
global::renderEngine.removeRenderProgram(_shader.get());
_shader = global::renderEngine.buildRenderProgram(
global::renderEngine->removeRenderProgram(_shader.get());
_shader = global::renderEngine->buildRenderProgram(
"RingsProgram",
absPath("${MODULE_GLOBEBROWSING}/shaders/rings_vs.glsl"),
absPath("${MODULE_GLOBEBROWSING}/shaders/rings_fs.glsl"),
@@ -205,7 +205,7 @@ ShadowComponent::ShadowComponent(const ghoul::Dictionary& dictionary)
_dynamicDepthTextureRes = false;
}
else {
glm::ivec2 renderingResolution = global::renderEngine.renderingResolution();
glm::ivec2 renderingResolution = global::renderEngine->renderingResolution();
_shadowDepthTextureWidth = renderingResolution.x * 2;
_shadowDepthTextureHeight = renderingResolution.y * 2;
_dynamicDepthTextureRes = true;
@@ -413,7 +413,7 @@ void ShadowComponent::end() {
if (_viewDepthMap) {
if (!_renderDMProgram) {
_renderDMProgram = global::renderEngine.buildRenderProgram(
_renderDMProgram = global::renderEngine->buildRenderProgram(
"ShadowMappingDebuggingProgram",
absPath("${MODULE_GLOBEBROWSING}/shaders/smviewer_vs.glsl"),
absPath("${MODULE_GLOBEBROWSING}/shaders/smviewer_fs.glsl")
@@ -442,9 +442,9 @@ void ShadowComponent::end() {
void ShadowComponent::update(const UpdateData&) {
ZoneScoped
_sunPosition = global::renderEngine.scene()->sceneGraphNode("Sun")->worldPosition();
_sunPosition = global::renderEngine->scene()->sceneGraphNode("Sun")->worldPosition();
glm::ivec2 renderingResolution = global::renderEngine.renderingResolution();
glm::ivec2 renderingResolution = global::renderEngine->renderingResolution();
if (_dynamicDepthTextureRes && ((_shadowDepthTextureWidth != renderingResolution.x) ||
(_shadowDepthTextureHeight != renderingResolution.y)))
{
+8 -8
View File
@@ -191,7 +191,7 @@ bool initTexturesFromLoadedData(DefaultTileProvider& t) {
void initialize(TextTileProvider& t) {
ZoneScoped
t.font = global::fontManager.font("Mono", static_cast<float>(t.fontSize));
t.font = global::fontManager->font("Mono", static_cast<float>(t.fontSize));
t.fontRenderer = ghoul::fontrendering::FontRenderer::createDefault();
t.fontRenderer->setFramebufferSize(glm::vec2(t.initData.dimensions));
glGenFramebuffers(1, &t.fbo);
@@ -235,7 +235,7 @@ Tile tile(TextTileProvider& t, const TileIndex& tileIndex) {
t.fontRenderer->render(*t.font, t.textPosition, t.text, t.textColor);
glBindFramebuffer(GL_FRAMEBUFFER, defaultFBO);
global::renderEngine.openglStateCache().resetViewportState();
global::renderEngine->openglStateCache().resetViewportState();
//glViewport(viewport[0], viewport[1], viewport[2], viewport[3]);
tile = Tile{ texture, std::nullopt, Tile::Status::OK };
@@ -556,7 +556,7 @@ DefaultTileProvider::DefaultTileProvider(const ghoul::Dictionary& dictionary)
type = Type::DefaultTileProvider;
tileCache = global::moduleEngine.module<GlobeBrowsingModule>()->tileCache();
tileCache = global::moduleEngine->module<GlobeBrowsingModule>()->tileCache();
name = "Name unspecified";
if (dictionary.hasKeyAndValue<std::string>("Name")) {
name = dictionary.value<std::string>("Name");
@@ -635,7 +635,7 @@ TextTileProvider::TextTileProvider(TileTextureInitData initData, size_t fontSize
{
ZoneScoped
tileCache = global::moduleEngine.module<GlobeBrowsingModule>()->tileCache();
tileCache = global::moduleEngine->module<GlobeBrowsingModule>()->tileCache();
}
@@ -649,7 +649,7 @@ SizeReferenceTileProvider::SizeReferenceTileProvider(const ghoul::Dictionary& di
type = Type::SizeReferenceTileProvider;
font = global::fontManager.font("Mono", static_cast<float>(fontSize));
font = global::fontManager->font("Mono", static_cast<float>(fontSize));
if (dictionary.hasKeyAndValue<glm::dvec3>(sizereferenceprovider::KeyRadii)) {
ellipsoid = dictionary.value<glm::dvec3>(sizereferenceprovider::KeyRadii);
@@ -1220,9 +1220,9 @@ int update(TileProvider& tp) {
case Type::TemporalTileProvider: {
TemporalTileProvider& t = static_cast<TemporalTileProvider&>(tp);
if (t.successfulInitialization) {
TileProvider* newCurrent = getTileProvider(t, global::timeManager.time());
if (newCurrent) {
t.currentTileProvider = newCurrent;
TileProvider* newCurr = getTileProvider(t, global::timeManager->time());
if (newCurr) {
t.currentTileProvider = newCurr;
}
if (t.currentTileProvider) {
update(*t.currentTileProvider);