mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2024-12-27 02:20:36 +00:00
pconf.ball now a matrix (but not implemented draw_boundary yet)
This commit is contained in:
parent
3069dbd316
commit
cb05649732
14
drawing.cpp
14
drawing.cpp
@ -353,10 +353,9 @@ EX int get_side(const hyperpoint& H) {
|
|||||||
}
|
}
|
||||||
if(pmodel == mdRotatedHyperboles)
|
if(pmodel == mdRotatedHyperboles)
|
||||||
return H[1] > 0 ? -1 : 1;
|
return H[1] > 0 ? -1 : 1;
|
||||||
if(pmodel == mdHyperboloid && hyperbolic)
|
if(pmodel == mdHyperboloid) {
|
||||||
return (models::sin_ball * H[2] > -models::cos_ball * H[1]) ? -1 : 1;
|
return det2(pconf.ball() * cspin90(1, 2) * rgpushxto0(H)) > 0 ? 1 : -1;
|
||||||
if(pmodel == mdHyperboloid && sphere)
|
}
|
||||||
return (models::sin_ball * H[2] > models::cos_ball * H[1]) ? -1 : 1;
|
|
||||||
if(pmodel == mdHyperboloidFlat && sphere)
|
if(pmodel == mdHyperboloidFlat && sphere)
|
||||||
return H[2] >= 0 ? 1 : -1;
|
return H[2] >= 0 ? 1 : -1;
|
||||||
if(pmodel == mdHemisphere && hyperbolic) {
|
if(pmodel == mdHemisphere && hyperbolic) {
|
||||||
@ -369,8 +368,9 @@ EX int get_side(const hyperpoint& H) {
|
|||||||
int s = H1[2] > 0 ? 1 : -1;
|
int s = H1[2] > 0 ? 1 : -1;
|
||||||
if(hemi_side && s != hemi_side) return -spherespecial;
|
if(hemi_side && s != hemi_side) return -spherespecial;
|
||||||
H1[0] /= H1[2]; H1[1] /= H1[2];
|
H1[0] /= H1[2]; H1[1] /= H1[2];
|
||||||
H1[2] = s * sqrt(1 + H1[0]*H1[0] + H1[1] * H1[1]);
|
H1[2] = -s * sqrt(1 + H1[0]*H1[0] + H1[1] * H1[1]);
|
||||||
return (models::sin_ball * H1[2] > models::cos_ball * H1[1]) ? 1 : -1;
|
dynamicval<geometryinfo1> g(cginf.g, giHyperb2);
|
||||||
|
return det2(pconf.ball() * cspin90(1, 2) * rgpushxto0(H1)) > 0 ? 1 : -1;
|
||||||
}
|
}
|
||||||
if(pmodel == mdSpiral && pconf.spiral_cone < 360) {
|
if(pmodel == mdSpiral && pconf.spiral_cone < 360) {
|
||||||
return cone_side(shiftless(H));
|
return cone_side(shiftless(H));
|
||||||
@ -2435,7 +2435,7 @@ EX void draw_main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(pmodel == mdHemisphere && sphere && hemi_side == 0 && !vrhr::rendering()) {
|
if(pmodel == mdHemisphere && sphere && hemi_side == 0 && !vrhr::rendering()) {
|
||||||
hemi_side = models::sin_ball > 0 ? 1 : -1;
|
hemi_side = (pconf.ball() * hyperpoint(0,1,0,1)) [2] < 0 ? 1 : -1;
|
||||||
draw_main();
|
draw_main();
|
||||||
|
|
||||||
if(pconf.show_hyperboloid_flat) {
|
if(pconf.show_hyperboloid_flat) {
|
||||||
|
24
hypgraph.cpp
24
hypgraph.cpp
@ -162,7 +162,7 @@ void ballmodel(hyperpoint& ret, double alpha, double d, double zl) {
|
|||||||
ret[1] = ay;
|
ret[1] = ay;
|
||||||
ret[2] = ax * sa;
|
ret[2] = ax * sa;
|
||||||
|
|
||||||
models::apply_ball(ret[2], ret[1]);
|
ret = pconf.ball() * ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool use_z_coordinate() {
|
bool use_z_coordinate() {
|
||||||
@ -970,7 +970,7 @@ EX void apply_other_model(shiftpoint H_orig, hyperpoint& ret, eModel md) {
|
|||||||
|
|
||||||
swap(ret[1], ret[2]);
|
swap(ret[1], ret[2]);
|
||||||
|
|
||||||
models::apply_ball(ret[2], ret[1]);
|
ret = pconf.ball() * ret;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1032,7 +1032,7 @@ EX void apply_other_model(shiftpoint H_orig, hyperpoint& ret, eModel md) {
|
|||||||
ret[0] = ret[0] / 3;
|
ret[0] = ret[0] / 3;
|
||||||
tie(ret[1], ret[2]) = make_pair(((sphere?0:1) - ret[2]) / 3, ret[1] / 3);
|
tie(ret[1], ret[2]) = make_pair(((sphere?0:1) - ret[2]) / 3, ret[1] / 3);
|
||||||
|
|
||||||
models::apply_ball(ret[2], ret[1]);
|
ret = pconf.ball() * ret;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1443,7 +1443,7 @@ EX void apply_other_model(shiftpoint H_orig, hyperpoint& ret, eModel md) {
|
|||||||
if(euclid) ret = models::euclidean_spin * ret;
|
if(euclid) ret = models::euclidean_spin * ret;
|
||||||
ret[2] = (r-1) * sqrt( pow(360/pconf.spiral_cone, 2) - 1);
|
ret[2] = (r-1) * sqrt( pow(360/pconf.spiral_cone, 2) - 1);
|
||||||
|
|
||||||
models::apply_ball(ret[2], ret[1]);
|
ret = pconf.ball() * ret;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
z = exp(z);
|
z = exp(z);
|
||||||
@ -2614,8 +2614,8 @@ EX void draw_model_elements() {
|
|||||||
ld z = acosh(tz);
|
ld z = acosh(tz);
|
||||||
|
|
||||||
hyperpoint a = xpush0(z);
|
hyperpoint a = xpush0(z);
|
||||||
ld cb = models::cos_ball;
|
ld cb = pconf.ball() [1][1];
|
||||||
ld sb = models::sin_ball;
|
ld sb = pconf.ball() [1][2];
|
||||||
|
|
||||||
a[1] = sb * a[2] / -cb;
|
a[1] = sb * a[2] / -cb;
|
||||||
a[0] = sqrt(-1 + a[2] * a[2] - a[1] * a[1]);
|
a[0] = sqrt(-1 + a[2] * a[2] - a[1] * a[1]);
|
||||||
@ -2807,11 +2807,13 @@ EX void draw_boundary(int w) {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case mdHemisphere: {
|
case mdHemisphere: {
|
||||||
|
ld cb = pconf.ball() [1][1];
|
||||||
|
ld sb = pconf.ball() [2][1];
|
||||||
if(hyperbolic) {
|
if(hyperbolic) {
|
||||||
queuereset(mdPixel, p);
|
queuereset(mdPixel, p);
|
||||||
for(int i=0; i<=360; i++) {
|
for(int i=0; i<=360; i++) {
|
||||||
ld s = sin(i * degree);
|
ld s = sin(i * degree);
|
||||||
curvepoint(point3(current_display->radius * cos(i * degree), current_display->radius * s * (models::cos_ball * s >= 0 - 1e-6 ? 1 : abs(models::sin_ball)), 0));
|
curvepoint(point3(current_display->radius * cos(i * degree), current_display->radius * s * (cb * s >= 0 - 1e-6 ? 1 : abs(sb)), 0));
|
||||||
}
|
}
|
||||||
queuecurve(shiftless(Id), lc, fc, p);
|
queuecurve(shiftless(Id), lc, fc, p);
|
||||||
queuereset(pmodel, p);
|
queuereset(pmodel, p);
|
||||||
@ -2820,7 +2822,7 @@ EX void draw_boundary(int w) {
|
|||||||
|
|
||||||
for(int i=0; i<=360; i++) {
|
for(int i=0; i<=360; i++) {
|
||||||
ld s = sin(i * degree);
|
ld s = sin(i * degree);
|
||||||
curvepoint(point3(current_display->radius * cos(i * degree), current_display->radius * s * models::sin_ball, 0));
|
curvepoint(point3(current_display->radius * cos(i * degree), current_display->radius * s * sb, 0));
|
||||||
}
|
}
|
||||||
queuecurve(shiftless(Id), lc, fc, p);
|
queuecurve(shiftless(Id), lc, fc, p);
|
||||||
queuereset(pmodel, p);
|
queuereset(pmodel, p);
|
||||||
@ -2842,8 +2844,8 @@ EX void draw_boundary(int w) {
|
|||||||
as_hyperboloid:
|
as_hyperboloid:
|
||||||
ld& tz = pconf.top_z;
|
ld& tz = pconf.top_z;
|
||||||
ld mz = sphere ? atan(sqrt(tz*tz-1)) : acosh(tz);
|
ld mz = sphere ? atan(sqrt(tz*tz-1)) : acosh(tz);
|
||||||
ld cb = models::cos_ball;
|
ld cb = pconf.ball() [1][1];
|
||||||
ld sb = models::sin_ball;
|
ld sb = pconf.ball() [2][1];
|
||||||
|
|
||||||
if(abs(sb) <= abs(cb) + 1e-5) {
|
if(abs(sb) <= abs(cb) + 1e-5) {
|
||||||
ld step = .01 / (1 << vid.linequality);
|
ld step = .01 / (1 << vid.linequality);
|
||||||
@ -3196,7 +3198,7 @@ EX int cone_side(const shiftpoint H) {
|
|||||||
ret[1] = cos(alpha) * r;
|
ret[1] = cos(alpha) * r;
|
||||||
ret[2] = (r-1) * sqrt( pow(360/pconf.spiral_cone, 2) - 1);
|
ret[2] = (r-1) * sqrt( pow(360/pconf.spiral_cone, 2) - 1);
|
||||||
|
|
||||||
models::apply_ball(ret[2], ret[1]);
|
ret = pconf.ball() * ret;
|
||||||
return ret;
|
return ret;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -358,6 +358,11 @@ int read_legacy_args() {
|
|||||||
PHASE(3); start_game();
|
PHASE(3); start_game();
|
||||||
View = Id; playermoved = false;
|
View = Id; playermoved = false;
|
||||||
}
|
}
|
||||||
|
else if(argis("-ballangle")) {
|
||||||
|
PHASEFROM(2);
|
||||||
|
shift(); println(hlog, "-ballangle not implemented");
|
||||||
|
// shift_arg_formula(vpconf.ballangle);
|
||||||
|
}
|
||||||
else return 1;
|
else return 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
23
models.cpp
23
models.cpp
@ -136,6 +136,8 @@ projection_configuration::projection_configuration() {
|
|||||||
dualfocus_autoscale = false;
|
dualfocus_autoscale = false;
|
||||||
axial_angle = 90;
|
axial_angle = 90;
|
||||||
ptr_model_orientation = new trans23;
|
ptr_model_orientation = new trans23;
|
||||||
|
ptr_ball = new transmatrix;
|
||||||
|
*ptr_ball = cspin(1, 2, 20._deg);
|
||||||
}
|
}
|
||||||
|
|
||||||
EX namespace models {
|
EX namespace models {
|
||||||
@ -144,7 +146,6 @@ EX namespace models {
|
|||||||
EX ld rotation_xz = 90;
|
EX ld rotation_xz = 90;
|
||||||
EX ld rotation_xy2 = 90;
|
EX ld rotation_xy2 = 90;
|
||||||
EX int do_rotate = 1;
|
EX int do_rotate = 1;
|
||||||
EX ld cos_ball, sin_ball;
|
|
||||||
EX bool model_straight, model_straight_yz;
|
EX bool model_straight, model_straight_yz;
|
||||||
|
|
||||||
/** screen coordinates to orientation logical coordinates */
|
/** screen coordinates to orientation logical coordinates */
|
||||||
@ -155,11 +156,6 @@ EX namespace models {
|
|||||||
EX void scr_to_ori(hyperpoint& h) { if(!model_straight) h = iso_inverse(pconf.mori().get()) * h; }
|
EX void scr_to_ori(hyperpoint& h) { if(!model_straight) h = iso_inverse(pconf.mori().get()) * h; }
|
||||||
EX void scr_to_ori(transmatrix& h) { if(!model_straight) h = iso_inverse(pconf.mori().get()) * h; }
|
EX void scr_to_ori(transmatrix& h) { if(!model_straight) h = iso_inverse(pconf.mori().get()) * h; }
|
||||||
|
|
||||||
#if HDR
|
|
||||||
template<class A>
|
|
||||||
void apply_ball(A& x, A& y) { tie(x,y) = make_pair(x*cos_ball + y*sin_ball, y*cos_ball - x*sin_ball); }
|
|
||||||
#endif
|
|
||||||
|
|
||||||
EX transmatrix rotmatrix() {
|
EX transmatrix rotmatrix() {
|
||||||
if(GDIM == 2 || gproduct) return spin(rotation * degree);
|
if(GDIM == 2 || gproduct) return spin(rotation * degree);
|
||||||
return spin(rotation_xy2 * degree) * cspin(0, 2, -rotation_xz * degree) * spin(rotation * degree);
|
return spin(rotation_xy2 * degree) * cspin(0, 2, -rotation_xz * degree) * spin(rotation * degree);
|
||||||
@ -175,8 +171,6 @@ EX namespace models {
|
|||||||
EX transmatrix euclidean_spin;
|
EX transmatrix euclidean_spin;
|
||||||
|
|
||||||
EX void configure() {
|
EX void configure() {
|
||||||
ld ball = -pconf.ballangle * degree;
|
|
||||||
cos_ball = cos(ball), sin_ball = sin(ball);
|
|
||||||
model_straight = (pconf.mori().get()[0][0] > 1 - 1e-9);
|
model_straight = (pconf.mori().get()[0][0] > 1 - 1e-9);
|
||||||
model_straight_yz = GDIM == 2 || (pconf.mori().get()[2][2] > 1-1e-9);
|
model_straight_yz = GDIM == 2 || (pconf.mori().get()[2][2] > 1-1e-9);
|
||||||
if(history::on) history::apply();
|
if(history::on) history::apply();
|
||||||
@ -603,7 +597,7 @@ EX namespace models {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(is_3d(vpconf) && GDIM == 2 && !vr_settings)
|
if(is_3d(vpconf) && GDIM == 2 && !vr_settings)
|
||||||
add_edit(vpconf.ballangle);
|
add_edit(vpconf.ball());
|
||||||
|
|
||||||
if(vr_settings) {
|
if(vr_settings) {
|
||||||
dialog::addSelItem(XLAT("VR: rotate the 3D model"), fts(vpconf.vr_angle) + "°", 'B');
|
dialog::addSelItem(XLAT("VR: rotate the 3D model"), fts(vpconf.vr_angle) + "°", 'B');
|
||||||
@ -848,10 +842,6 @@ EX namespace models {
|
|||||||
shift(); vpconf.formula = args();
|
shift(); vpconf.formula = args();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(argis("-ballangle")) {
|
|
||||||
PHASEFROM(2);
|
|
||||||
shift_arg_formula(vpconf.ballangle);
|
|
||||||
}
|
|
||||||
else if(argis("-topz")) {
|
else if(argis("-topz")) {
|
||||||
PHASEFROM(2);
|
PHASEFROM(2);
|
||||||
shift_arg_formula(vpconf.top_z);
|
shift_arg_formula(vpconf.top_z);
|
||||||
@ -1099,16 +1089,15 @@ EX namespace models {
|
|||||||
param_f(p.camera_angle, pp+"cameraangle", sp+"camera angle", 0);
|
param_f(p.camera_angle, pp+"cameraangle", sp+"camera angle", 0);
|
||||||
addsaver(p.ballproj, sp+"ballproj", 1);
|
addsaver(p.ballproj, sp+"ballproj", 1);
|
||||||
|
|
||||||
param_f(p.ballangle, pp+"ballangle", sp+"ball angle", 20)
|
param_matrix(p.ball(), pp+"ballangle", 3)
|
||||||
-> editable(0, 90, 5, "camera rotation in 3D models",
|
-> editable("camera rotation in 3D models",
|
||||||
"Rotate the camera in 3D models (ball model, hyperboloid, and hemisphere). "
|
"Rotate the camera in 3D models (ball model, hyperboloid, and hemisphere). "
|
||||||
"Note that hyperboloid and hemisphere models are also available in the "
|
"Note that hyperboloid and hemisphere models are also available in the "
|
||||||
"Hypersian Rug surfaces menu, but they are rendered differently there -- "
|
"Hypersian Rug surfaces menu, but they are rendered differently there -- "
|
||||||
"by making a flat picture first, then mapping it to a surface. "
|
"by making a flat picture first, then mapping it to a surface. "
|
||||||
"This makes the output better in some ways, but 3D effects are lost. "
|
"This makes the output better in some ways, but 3D effects are lost. "
|
||||||
"Hypersian Rug model also allows more camera freedom.",
|
"Hypersian Rug model also allows more camera freedom.",
|
||||||
'b')
|
'b');
|
||||||
-> unit = "°";
|
|
||||||
|
|
||||||
string help =
|
string help =
|
||||||
"This parameter has a bit different scale depending on the settings:\n"
|
"This parameter has a bit different scale depending on the settings:\n"
|
||||||
|
Loading…
Reference in New Issue
Block a user