fixed the rug becoming black on some computers when resizing window or during the start animation

This commit is contained in:
Zeno Rogue 2019-11-03 15:52:19 +01:00
parent 1eb27b3393
commit af9b049057
4 changed files with 24 additions and 12 deletions

View File

@ -600,10 +600,7 @@ EX void resetGL() {
matched_programs.clear();
glhr::current_glprogram = nullptr;
ray::reset_raycaster();
if(rug::rugged) {
rug::close();
rug::reopen();
}
if(rug::glbuf) rug::close_glbuf();
}
#endif

View File

@ -3595,3 +3595,4 @@ Other:
- hell unlock message on 10th shard
- levellines feature: shade rendered output by Z coordinate (nice in Hypersian Rug mode)
- fixed the overlay in the texture mode (also disabled in ray -- not implemented)
- fixed the rug becoming black on some computers when resizing window or during the start animation

29
rug.cpp
View File

@ -1287,6 +1287,8 @@ void drawTriangle(triangle& t) {
EX struct renderbuffer *glbuf;
EX void prepareTexture() {
ensure_glbuf();
if(!glbuf) { rug::close(); return; }
resetbuffer rb;
dynamicval<eStereo> d(vid.stereo_mode, sOFF);
@ -1446,18 +1448,29 @@ EX void drawRugScene() {
//--------------
EX transmatrix currentrot;
EX void close_glbuf() {
delete glbuf;
glbuf = nullptr;
}
EX void ensure_glbuf() {
if(glbuf) return;
glbuf = new renderbuffer(TEXTURESIZE, TEXTURESIZE, vid.usingGL && !rendernogl);
if(!glbuf->valid) {
addMessage(XLAT("Failed to enable"));
close_glbuf();
return;
}
}
EX void reopen() {
if(rugged) return;
rugdim = 2 * GDIM - 1;
when_enabled = 0;
GLERR("before init");
glbuf = new renderbuffer(TEXTURESIZE, TEXTURESIZE, vid.usingGL && !rendernogl);
if(!glbuf->valid) {
addMessage(XLAT("Failed to enable"));
delete glbuf;
return;
}
ensure_glbuf();
if(!glbuf) { rugged = false; return; }
rugged = true;
if(renderonce) prepareTexture();
if(!rugged) return;
@ -1527,7 +1540,7 @@ EX void clear_model() {
EX void close() {
if(!rugged) return;
rugged = false;
delete glbuf;
close_glbuf();
finger_center = NULL;
}

View File

@ -1172,6 +1172,7 @@ void rug() {
rug::apply_rotation(cspin(1, 2, ticks / 3000.));
gamescreen(2);
rug::apply_rotation(cspin(1, 2, -ticks / 3000.));
if(!rug::rugged) current = null_animation;
}
#endif