mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2025-11-13 12:17:10 +00:00
fixed a potential crash on resetGL
This commit is contained in:
@@ -776,9 +776,12 @@ EX void resetGL() {
|
|||||||
airbuf = nullptr;
|
airbuf = nullptr;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
compiled_programs.clear();
|
compiled_programs.clear();
|
||||||
matched_programs.clear();
|
matched_programs.clear();
|
||||||
glhr::current_glprogram = nullptr;
|
glhr::current_glprogram = nullptr;
|
||||||
|
glhr::flags_become(0);
|
||||||
|
|
||||||
check_cgi();
|
check_cgi();
|
||||||
if(currentmap) cgi.require_shapes();
|
if(currentmap) cgi.require_shapes();
|
||||||
cgi.initPolyForGL();
|
cgi.initPolyForGL();
|
||||||
|
|||||||
43
glhr.cpp
43
glhr.cpp
@@ -460,8 +460,8 @@ GLprogram::GLprogram(string vsh, string fsh) {
|
|||||||
|
|
||||||
GLprogram::~GLprogram() {
|
GLprogram::~GLprogram() {
|
||||||
glDeleteProgram(_program);
|
glDeleteProgram(_program);
|
||||||
if(vertShader) glDeleteShader(vertShader), vertShader = 0;
|
if(vertShader) glDeleteShader(vertShader);
|
||||||
if(fragShader) glDeleteShader(fragShader), fragShader = 0;
|
if(fragShader) glDeleteShader(fragShader);
|
||||||
}
|
}
|
||||||
|
|
||||||
EX void set_index_sl(ld x) {
|
EX void set_index_sl(ld x) {
|
||||||
@@ -566,22 +566,12 @@ EX void colorClear(color_t color) {
|
|||||||
glClearColor(part(color, 3) / 255.0, part(color, 2) / 255.0, part(color, 1) / 255.0, part(color, 0) / 255.0);
|
glClearColor(part(color, 3) / 255.0, part(color, 2) / 255.0, part(color, 1) / 255.0, part(color, 0) / 255.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
EX void full_enable(shared_ptr<GLprogram> p) {
|
EX flagtype cur_shader_flags;
|
||||||
auto& cur = current_glprogram;
|
|
||||||
flagtype oldflags = cur ? cur->shader_flags : 0;
|
EX void flags_become(flagtype f) {
|
||||||
if(p == cur) return;
|
flagtype oldflags = cur_shader_flags & ~f;
|
||||||
if(!vid.usingGL) return;
|
flagtype newflags = f & ~cur_shader_flags;
|
||||||
cur = p;
|
cur_shader_flags = f;
|
||||||
GLERR("pre_switch_mode");
|
|
||||||
WITHSHADER({
|
|
||||||
if(detailed_shader) println(hlog, "\n*** ENABLING VERTEX SHADER:\n", cur->_vsh, "\n\nENABLING FRAGMENT SHADER:\n", cur->_fsh, "\n");
|
|
||||||
glUseProgram(cur->_program);
|
|
||||||
GLERR("after_enable");
|
|
||||||
}, {
|
|
||||||
});
|
|
||||||
reset_projection();
|
|
||||||
flagtype newflags = cur->shader_flags;
|
|
||||||
tie(oldflags, newflags) = make_pair(oldflags & ~newflags, newflags & ~oldflags);
|
|
||||||
|
|
||||||
if(newflags & GF_TEXTURE) {
|
if(newflags & GF_TEXTURE) {
|
||||||
GLERR("xsm");
|
GLERR("xsm");
|
||||||
@@ -651,6 +641,23 @@ EX void full_enable(shared_ptr<GLprogram> p) {
|
|||||||
if(oldflags & GF_LIGHTFOG) {
|
if(oldflags & GF_LIGHTFOG) {
|
||||||
WITHSHADER({}, {glDisable(GL_FOG);})
|
WITHSHADER({}, {glDisable(GL_FOG);})
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
EX void full_enable(shared_ptr<GLprogram> p) {
|
||||||
|
auto& cur = current_glprogram;
|
||||||
|
if(p == cur) return;
|
||||||
|
if(!vid.usingGL) return;
|
||||||
|
cur = p;
|
||||||
|
GLERR("pre_switch_mode");
|
||||||
|
WITHSHADER({
|
||||||
|
if(detailed_shader) println(hlog, "\n*** ENABLING VERTEX SHADER:\n", cur->_vsh, "\n\nENABLING FRAGMENT SHADER:\n", cur->_fsh, "\n");
|
||||||
|
glUseProgram(cur->_program);
|
||||||
|
GLERR("after_enable");
|
||||||
|
}, {
|
||||||
|
});
|
||||||
|
reset_projection();
|
||||||
|
flags_become(cur->shader_flags);
|
||||||
WITHSHADER({
|
WITHSHADER({
|
||||||
glUniform1f(cur->uFogBase, 1); fogbase = 1;
|
glUniform1f(cur->uFogBase, 1); fogbase = 1;
|
||||||
}, {})
|
}, {})
|
||||||
|
|||||||
Reference in New Issue
Block a user