mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2025-01-04 14:30:35 +00:00
3D:: now works with anaglyph
This commit is contained in:
parent
56dc2d18c0
commit
f451e017a3
94
polygons.cpp
94
polygons.cpp
@ -529,6 +529,8 @@ void glapplymatrix(const transmatrix& V) {
|
|||||||
glhr::set_modelview(glhr::as_glmatrix(mat));
|
glhr::set_modelview(glhr::as_glmatrix(mat));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int global_projection;
|
||||||
|
|
||||||
void dqi_poly::gldraw() {
|
void dqi_poly::gldraw() {
|
||||||
auto& v = *tab;
|
auto& v = *tab;
|
||||||
|
|
||||||
@ -582,6 +584,7 @@ void dqi_poly::gldraw() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for(int ed = current_display->stereo_active() ? -1 : 0; ed<2; ed+=2) {
|
for(int ed = current_display->stereo_active() ? -1 : 0; ed<2; ed+=2) {
|
||||||
|
if(global_projection && global_projection != ed) continue;
|
||||||
if(ed) current_display->set_projection(ed, true), current_display->set_viewport(ed);
|
if(ed) current_display->set_projection(ed, true), current_display->set_viewport(ed);
|
||||||
bool draw = color;
|
bool draw = color;
|
||||||
|
|
||||||
@ -1440,6 +1443,52 @@ void draw_backside() {
|
|||||||
|
|
||||||
extern bool lshiftclick, lctrlclick;
|
extern bool lshiftclick, lctrlclick;
|
||||||
|
|
||||||
|
void draw_main() {
|
||||||
|
if(sphere && DIM == 3) {
|
||||||
|
for(int p: {0, 1, 2, 3}) {
|
||||||
|
if(elliptic && p < 2) continue;
|
||||||
|
if(p == 1 || p == 3) {
|
||||||
|
#ifdef GL_ES
|
||||||
|
glClearDepthf(1.0f);
|
||||||
|
#else
|
||||||
|
glClearDepth(1.0f);
|
||||||
|
#endif
|
||||||
|
glDepthFunc(GL_LEQUAL);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
#ifdef GL_ES
|
||||||
|
glClearDepthf(0.0f);
|
||||||
|
#else
|
||||||
|
glClearDepth(0.0f);
|
||||||
|
#endif
|
||||||
|
glDepthFunc(GL_GEQUAL);
|
||||||
|
}
|
||||||
|
glClear(GL_DEPTH_BUFFER_BIT);
|
||||||
|
glhr::be_nontextured();
|
||||||
|
spherephase = p;
|
||||||
|
current_display->set_projection(0, true);
|
||||||
|
for(auto& ptd: ptds) ptd->draw();
|
||||||
|
if(elliptic) {
|
||||||
|
spherephase = p - 2;
|
||||||
|
for(auto& ptd: ptds) ptd->draw();
|
||||||
|
}
|
||||||
|
// glflush();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
for(auto& ptd: ptds) if(ptd->prio == PPR::OUTCIRCLE)
|
||||||
|
ptd->draw();
|
||||||
|
|
||||||
|
if(two_sided_model()) draw_backside();
|
||||||
|
|
||||||
|
for(auto& ptd: ptds) if(ptd->prio != PPR::OUTCIRCLE) {
|
||||||
|
dynamicval<int> ss(spherespecial, among(ptd->prio, PPR::MOBILE_ARROW, PPR::OUTCIRCLE, PPR::CIRCLE) ? 0 : spherespecial);
|
||||||
|
ptd->draw();
|
||||||
|
}
|
||||||
|
glflush();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void drawqueue() {
|
void drawqueue() {
|
||||||
callhooks(hook_drawqueue);
|
callhooks(hook_drawqueue);
|
||||||
|
|
||||||
@ -1488,48 +1537,15 @@ void drawqueue() {
|
|||||||
current_display->set_projection(0, true);
|
current_display->set_projection(0, true);
|
||||||
setcameraangle(true);
|
setcameraangle(true);
|
||||||
|
|
||||||
if(sphere && DIM == 3) {
|
if(model_needs_depth() && current_display->stereo_active()) {
|
||||||
for(int p: {0, 1, 2, 3}) {
|
global_projection = -1;
|
||||||
if(elliptic && p < 2) continue;
|
draw_main();
|
||||||
if(p == 1 || p == 3) {
|
|
||||||
#ifdef GL_ES
|
|
||||||
glClearDepthf(1.0f);
|
|
||||||
#else
|
|
||||||
glClearDepth(1.0f);
|
|
||||||
#endif
|
|
||||||
glDepthFunc(GL_LEQUAL);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
#ifdef GL_ES
|
|
||||||
glClearDepthf(0.0f);
|
|
||||||
#else
|
|
||||||
glClearDepth(0.0f);
|
|
||||||
#endif
|
|
||||||
glDepthFunc(GL_GEQUAL);
|
|
||||||
}
|
|
||||||
glClear(GL_DEPTH_BUFFER_BIT);
|
glClear(GL_DEPTH_BUFFER_BIT);
|
||||||
glhr::be_nontextured();
|
global_projection = +1;
|
||||||
spherephase = p;
|
draw_main();
|
||||||
current_display->set_projection(0, true);
|
|
||||||
for(auto& ptd: ptds) ptd->draw();
|
|
||||||
if(elliptic) {
|
|
||||||
spherephase = p - 2;
|
|
||||||
for(auto& ptd: ptds) ptd->draw();
|
|
||||||
}
|
|
||||||
// glflush();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
for(auto& ptd: ptds) if(ptd->prio == PPR::OUTCIRCLE)
|
draw_main();
|
||||||
ptd->draw();
|
|
||||||
|
|
||||||
if(two_sided_model()) draw_backside();
|
|
||||||
|
|
||||||
for(auto& ptd: ptds) if(ptd->prio != PPR::OUTCIRCLE) {
|
|
||||||
dynamicval<int> ss(spherespecial, among(ptd->prio, PPR::MOBILE_ARROW, PPR::OUTCIRCLE, PPR::CIRCLE) ? 0 : spherespecial);
|
|
||||||
ptd->draw();
|
|
||||||
}
|
|
||||||
glflush();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if CAP_GL
|
#if CAP_GL
|
||||||
|
Loading…
Reference in New Issue
Block a user