mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2025-06-28 16:02:53 +00:00
disk model in Euclidean and hyperbolic
This commit is contained in:
parent
266e4e43c4
commit
38eb8c5122
6
glhr.cpp
6
glhr.cpp
@ -298,6 +298,7 @@ struct GLprogram {
|
|||||||
GLint uFog, uFogColor, uColor, tTexture, tInvExpTable, tAirMap, uMV, uProjection, uAlpha, uFogBase, uPP;
|
GLint uFog, uFogColor, uColor, tTexture, tInvExpTable, tAirMap, uMV, uProjection, uAlpha, uFogBase, uPP;
|
||||||
GLint uPRECX, uPRECY, uPRECZ, uIndexSL, uIterations, uLevelLines, uSV, uRadarTransform;
|
GLint uPRECX, uPRECY, uPRECZ, uIndexSL, uIterations, uLevelLines, uSV, uRadarTransform;
|
||||||
GLint uRotSin, uRotCos, uRotNil;
|
GLint uRotSin, uRotCos, uRotNil;
|
||||||
|
GLint uDepthScaling, uCamera, uDepth;
|
||||||
|
|
||||||
flagtype shader_flags;
|
flagtype shader_flags;
|
||||||
|
|
||||||
@ -364,6 +365,7 @@ GLprogram::GLprogram(string vsh, string fsh) {
|
|||||||
uAlpha = -1;
|
uAlpha = -1;
|
||||||
uLevelLines = -1;
|
uLevelLines = -1;
|
||||||
uFogColor = -1;
|
uFogColor = -1;
|
||||||
|
uDepthScaling = uCamera = uDepth = -1;
|
||||||
|
|
||||||
uColor = tTexture = tInvExpTable = tAirMap = -1;
|
uColor = tTexture = tInvExpTable = tAirMap = -1;
|
||||||
uFogBase = -1;
|
uFogBase = -1;
|
||||||
@ -426,6 +428,10 @@ GLprogram::GLprogram(string vsh, string fsh) {
|
|||||||
tInvExpTable = glGetUniformLocation(_program, "tInvExpTable");
|
tInvExpTable = glGetUniformLocation(_program, "tInvExpTable");
|
||||||
tAirMap = glGetUniformLocation(_program, "tAirMap");
|
tAirMap = glGetUniformLocation(_program, "tAirMap");
|
||||||
|
|
||||||
|
uDepth = glGetUniformLocation(_program, "uDepth");
|
||||||
|
uDepthScaling = glGetUniformLocation(_program, "uDepthScaling");
|
||||||
|
uCamera = glGetUniformLocation(_program, "uCamera");
|
||||||
|
|
||||||
uPRECX = glGetUniformLocation(_program, "PRECX");
|
uPRECX = glGetUniformLocation(_program, "PRECX");
|
||||||
uPRECY = glGetUniformLocation(_program, "PRECY");
|
uPRECY = glGetUniformLocation(_program, "PRECY");
|
||||||
uPRECZ = glGetUniformLocation(_program, "PRECZ");
|
uPRECZ = glGetUniformLocation(_program, "PRECZ");
|
||||||
|
21
hypgraph.cpp
21
hypgraph.cpp
@ -411,7 +411,7 @@ EX void apply_other_model(shiftpoint H_orig, hyperpoint& ret, eModel md) {
|
|||||||
case mdBall: {
|
case mdBall: {
|
||||||
ld zlev = find_zlev(H);
|
ld zlev = find_zlev(H);
|
||||||
|
|
||||||
ld zl = vid.depth-geom3::factor_to_lev(zlev);
|
ld zl = vid.depth-geom3::factor_to_lev(zlev) * pconf.depth_scaling;
|
||||||
|
|
||||||
ballmodel(ret, atan2(H), hdist0(H), zl);
|
ballmodel(ret, atan2(H), hdist0(H), zl);
|
||||||
break;
|
break;
|
||||||
@ -434,6 +434,25 @@ EX void apply_other_model(shiftpoint H_orig, hyperpoint& ret, eModel md) {
|
|||||||
ret[3] = 1;
|
ret[3] = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if(vrhr::state == 2) {
|
||||||
|
ld zlev = find_zlev(H);
|
||||||
|
ld zl = vid.depth-geom3::factor_to_lev(zlev) * pconf.depth_scaling;
|
||||||
|
|
||||||
|
ld d = hdist0(H);
|
||||||
|
ld dd = hypot_d(2, H);
|
||||||
|
|
||||||
|
hyperpoint H1 = ypush(vid.camera) * xpush(d) * ypush0(zl);
|
||||||
|
ld tzh = pconf.alpha + H1[2];
|
||||||
|
ld ax = H1[0] / tzh;
|
||||||
|
ld ay = H1[1] / tzh;
|
||||||
|
|
||||||
|
ret[0] = ax * H[0] / dd;
|
||||||
|
ret[1] = ax * H[1] / dd;
|
||||||
|
ret[2] = ay;
|
||||||
|
|
||||||
|
models::apply_vr(ret[2], ret[1]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
ld tz = get_tz(H);
|
ld tz = get_tz(H);
|
||||||
if(!pconf.camera_angle) {
|
if(!pconf.camera_angle) {
|
||||||
ret[0] = H[0] / tz;
|
ret[0] = H[0] / tz;
|
||||||
|
38
shaders.cpp
38
shaders.cpp
@ -156,6 +156,35 @@ shared_ptr<glhr::GLprogram> write_shader(flagtype shader_flags) {
|
|||||||
else if(!vid.consider_shader_projection) {
|
else if(!vid.consider_shader_projection) {
|
||||||
shader_flags |= SF_PIXELS;
|
shader_flags |= SF_PIXELS;
|
||||||
}
|
}
|
||||||
|
else if(among(pmodel, mdDisk, mdBall) && GDIM == 2 && vrhr::state == 2 && !sphere) {
|
||||||
|
shader_flags |= SF_DIRECT | SF_BOX;
|
||||||
|
vsh += "uniform mediump float uAlpha, uDepth, uDepthScaling, uCamera;";
|
||||||
|
|
||||||
|
if(hyperbolic) coordinator +=
|
||||||
|
"float zlev = sqrt(t.z*t.z-t.x*t.x-t.y*t.y);\n"
|
||||||
|
"float zl = uDepth - uDepthScaling * (uDepth - atanh(tanh(uDepth)/zlev));\n"
|
||||||
|
"float dd = sqrt(t.x*t.x+t.y*t.y);\n"
|
||||||
|
"float d = acosh(t.z/zlev);\n"
|
||||||
|
"float uz = uAlpha + cosh(zl) * cosh(d) * cosh(uCamera) + sinh(zl) * sinh(uCamera);\n"
|
||||||
|
"float ux = cosh(zl) * sinh(d) / uz;\n"
|
||||||
|
"t.xy = ux * t.xy / dd;\n"
|
||||||
|
"t.z = (sinh(zl) * cosh(uCamera) + sinh(uCamera) * cosh(zl) * cosh(d)) / uz;\n"
|
||||||
|
;
|
||||||
|
|
||||||
|
else if(euclid) coordinator +=
|
||||||
|
"t.z = uDepth * (1. - (t.z - 1.) * uDepthScaling) + uAlpha + uCamera;\n";
|
||||||
|
|
||||||
|
else if(sphere) coordinator +=
|
||||||
|
"float zlev = sqrt(t.z*t.z+t.x*t.x+t.y*t.y);\n"
|
||||||
|
"float zl = uDepth - uDepthScaling * (uDepth - atan(tan(uDepth)/zlev));\n"
|
||||||
|
"float dd = sqrt(t.x*t.x+t.y*t.y);\n"
|
||||||
|
"float d = acos(t.z/zlev);\n"
|
||||||
|
"float uz = uAlpha + cos(zl) * cos(d) * cos(uCamera) + sin(zl) * sin(uCamera);\n"
|
||||||
|
"float ux = cos(zl) * sin(d) / uz;\n"
|
||||||
|
"t.xy = ux * t.xy / dd;\n"
|
||||||
|
"t.z = (sin(uCamera) * cos(zl) * cos(d) - sin(zl) * cos(uCamera)) / uz;\n"
|
||||||
|
;
|
||||||
|
}
|
||||||
else if(pmodel == mdDisk && MDIM == 3 && !spherespecial && !prod) {
|
else if(pmodel == mdDisk && MDIM == 3 && !spherespecial && !prod) {
|
||||||
shader_flags |= SF_DIRECT;
|
shader_flags |= SF_DIRECT;
|
||||||
}
|
}
|
||||||
@ -615,6 +644,15 @@ void display_data::set_projection(int ed, ld shift) {
|
|||||||
if(selected->uAlpha != -1)
|
if(selected->uAlpha != -1)
|
||||||
glhr::set_ualpha(pconf.alpha);
|
glhr::set_ualpha(pconf.alpha);
|
||||||
|
|
||||||
|
if(selected->uDepth != -1)
|
||||||
|
glUniform1f(selected->uDepth, vid.depth);
|
||||||
|
|
||||||
|
if(selected->uCamera != -1)
|
||||||
|
glUniform1f(selected->uCamera, vid.camera);
|
||||||
|
|
||||||
|
if(selected->uDepthScaling != -1)
|
||||||
|
glUniform1f(selected->uDepthScaling, pconf.depth_scaling);
|
||||||
|
|
||||||
if(selected->uLevelLines != -1) {
|
if(selected->uLevelLines != -1) {
|
||||||
glUniform1f(selected->uLevelLines, levellines);
|
glUniform1f(selected->uLevelLines, levellines);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user