mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2025-03-29 14:57:03 +00:00
camera_angle now uses matrix dialog
This commit is contained in:
parent
3e1228b7c7
commit
67d38feabd
21
config.cpp
21
config.cpp
@ -2605,7 +2605,7 @@ EX geom3::eSpatialEmbedding shown_spatial_embedding() {
|
||||
return geom3::spatial_embedding;
|
||||
}
|
||||
|
||||
EX bool in_tpp() { return pmodel == mdDisk && pconf.camera_angle; }
|
||||
EX bool in_tpp() { return pmodel == mdDisk && !models::camera_straight; }
|
||||
|
||||
EX void display_embedded_errors() {
|
||||
using namespace geom3;
|
||||
@ -2854,19 +2854,7 @@ EX void show3D() {
|
||||
dialog::editNumber(mouseaim_sensitivity, -1, 1, 0.002, 0.01, XLAT("mouse aiming sensitivity"), "set to 0 to disable");
|
||||
});
|
||||
}
|
||||
if(true) {
|
||||
dialog::addSelItem(XLAT("camera rotation"), fts(vpconf.camera_angle), 'S');
|
||||
dialog::add_action([] {
|
||||
dialog::editNumber(vpconf.camera_angle, -180, 180, 5, 0, XLAT("camera rotation"),
|
||||
XLAT("Rotate the camera. Can be used to obtain a first person perspective, "
|
||||
"or third person perspective when combined with Y shift.")
|
||||
);
|
||||
dialog::get_di().extra_options = [] {
|
||||
dialog::addBoolItem(XLAT("render behind the camera"), vpconf.back_and_front, 'R');
|
||||
dialog::add_action([] { vpconf.back_and_front = !vpconf.back_and_front; });
|
||||
};
|
||||
});
|
||||
}
|
||||
if(true) add_edit(vpconf.cam());
|
||||
if(GDIM == 2) {
|
||||
dialog::addSelItem(XLAT("fixed facing"), vid.fixed_facing ? fts(vid.fixed_facing_dir) : XLAT("OFF"), 'f');
|
||||
dialog::add_action([] () { vid.fixed_facing = !vid.fixed_facing;
|
||||
@ -3960,11 +3948,6 @@ EX int read_config_args() {
|
||||
else if(argis("-mrsv")) {
|
||||
PHASEFROM(2); shift(); reserve_limit = argi(); apply_memory_reserve();
|
||||
}
|
||||
else if(argis("-yca")) {
|
||||
PHASEFROM(2);
|
||||
shift_arg_formula(vid.yshift);
|
||||
shift_arg_formula(pconf.camera_angle);
|
||||
}
|
||||
else if(argis("-pside")) {
|
||||
PHASEFROM(2);
|
||||
permaside = true;
|
||||
|
@ -1381,7 +1381,7 @@ void geometry_information::make_floor_textures_here() {
|
||||
vid.xres = FLOORTEXTURESIZE;
|
||||
vid.yres = FLOORTEXTURESIZE;
|
||||
pconf.scale = 0.125;
|
||||
pconf.camera_angle = 0;
|
||||
dynamicval<transmatrix> vm(pconf.cam(), Id);
|
||||
pconf.alpha = 1;
|
||||
dynamicval<ld> lw(vid.linewidth, 2);
|
||||
|
||||
|
@ -1116,9 +1116,9 @@ EX namespace geom3 {
|
||||
EX void switch_tpp() {
|
||||
if(dual::split(switch_fpp)) return;
|
||||
if(rug::rugged) rug::close();
|
||||
if(pmodel == mdDisk && pconf.camera_angle) {
|
||||
if(pmodel == mdDisk && !models::camera_straight) {
|
||||
vid.yshift = 0;
|
||||
pconf.camera_angle = 0;
|
||||
pconf.cam() = Id;
|
||||
pconf.xposition = 0;
|
||||
pconf.yposition = 0;
|
||||
pconf.scale = 1;
|
||||
@ -1126,7 +1126,7 @@ EX namespace geom3 {
|
||||
}
|
||||
else {
|
||||
vid.yshift = -0.3;
|
||||
pconf.camera_angle = -45;
|
||||
pconf.cam() = cspin(1, 2, -45._deg);
|
||||
pconf.scale = 18/16. * vid.xres / vid.yres / multi::players;
|
||||
pconf.xposition = 0;
|
||||
pconf.yposition = -0.9;
|
||||
|
17
graph.cpp
17
graph.cpp
@ -3343,7 +3343,7 @@ EX void drawaura() {
|
||||
ld hx = (x * 1. - current_display->xcenter) / rad;
|
||||
ld hy = (y * 1. - current_display->ycenter) / rad / pconf.stretch;
|
||||
|
||||
if(pconf.camera_angle) camrotate(hx, hy);
|
||||
if(!models::camera_straight) camrotate(hx, hy);
|
||||
|
||||
ld fac = sqrt(hx*hx+hy*hy);
|
||||
if(fac < 1) continue;
|
||||
@ -3419,16 +3419,11 @@ EX void drawaura() {
|
||||
ld x = rad0 * c;
|
||||
ld y = rad0 * s;
|
||||
|
||||
if(pconf.camera_angle) {
|
||||
ld z = rad0;
|
||||
|
||||
ld cam = pconf.camera_angle * degree;
|
||||
GLfloat cc = cos(cam);
|
||||
GLfloat ss = sin(cam);
|
||||
|
||||
tie(y, z) = make_pair(y * cc - z * ss, z * cc + y * ss);
|
||||
x *= rad0 / z;
|
||||
y *= rad0 / z;
|
||||
if(!models::camera_straight) {
|
||||
hyperpoint p = hyperpoint(x, y, rad0, 1);
|
||||
p = pconf.cam() * p;
|
||||
x = p[0] * rad0 / p[2];
|
||||
y = p[1] * rad0 / p[2];
|
||||
}
|
||||
cx[r][z][0] = x;
|
||||
cx[r][z][1] = y * pconf.stretch;
|
||||
|
33
hypgraph.cpp
33
hypgraph.cpp
@ -24,11 +24,9 @@ void ghcheck(hyperpoint &ret, const shiftpoint &H) {
|
||||
}
|
||||
|
||||
EX void camrotate(ld& hx, ld& hy) {
|
||||
ld cam = pconf.camera_angle * degree;
|
||||
GLfloat cc = cos(cam);
|
||||
GLfloat ss = sin(cam);
|
||||
ld ux = hx, uy = hy * cc + ss, uz = cc - ss * hy;
|
||||
hx = ux / uz, hy = uy / uz;
|
||||
hyperpoint p = hyperpoint(hx, hy, 1, 1);
|
||||
p = pconf.cam() * p;
|
||||
hx = p[0] / p[2], hy = p[1] / p[2];
|
||||
}
|
||||
|
||||
EX bool non_spatial_model() {
|
||||
@ -145,7 +143,7 @@ EX shiftpoint gethyper(ld x, ld y) {
|
||||
return find_on_screen(hxy, rgpushxto0(ghpm));
|
||||
}
|
||||
|
||||
if(pconf.camera_angle) camrotate(hx, hy);
|
||||
if(!models::camera_straight) camrotate(hx, hy);
|
||||
|
||||
return shiftless(perspective_to_space(hpxyz(hx, hy, 0)));
|
||||
}
|
||||
@ -703,7 +701,7 @@ EX void apply_other_model(shiftpoint H_orig, hyperpoint& ret, eModel md) {
|
||||
return;
|
||||
}
|
||||
ld tz = get_tz(H);
|
||||
if(!pconf.camera_angle) {
|
||||
if(models::camera_straight) {
|
||||
ret[0] = H[0] / tz;
|
||||
ret[1] = H[1] / tz;
|
||||
if(GDIM == 3) ret[2] = H[2] / tz;
|
||||
@ -713,13 +711,13 @@ EX void apply_other_model(shiftpoint H_orig, hyperpoint& ret, eModel md) {
|
||||
else {
|
||||
ld tx = H[0];
|
||||
ld ty = H[1];
|
||||
ld cam = pconf.camera_angle * degree;
|
||||
GLfloat cc = cos(cam);
|
||||
GLfloat ss = sin(cam);
|
||||
ld ux = tx, uy = ty * cc - ss * tz, uz = tz * cc + ss * ty;
|
||||
ret[0] = ux / uz;
|
||||
ret[1] = uy / uz;
|
||||
ret[2] = vid.xres * current_display->eyewidth() / 2 / current_display->radius - vid.ipd / uz / 2;
|
||||
|
||||
hyperpoint p = hyperpoint(tx, ty, tz, 1);
|
||||
p = rot_inverse(pconf.cam()) * p;
|
||||
|
||||
ret[0] = p[0] / p[2];
|
||||
ret[1] = p[1] / p[2];
|
||||
ret[2] = vid.xres * current_display->eyewidth() / 2 / current_display->radius - vid.ipd / p[2] / 2;
|
||||
}
|
||||
return;
|
||||
}
|
||||
@ -2386,6 +2384,7 @@ eGeometry backup_geometry;
|
||||
eVariation backup_variation;
|
||||
videopar backup_vid;
|
||||
bool backup_lpu;
|
||||
transmatrix backup_cam;
|
||||
|
||||
/** \brief enable the 'flat' model for drawing HUD. See hr::flat_model_enabler */
|
||||
EX void enable_flat_model(int val) {
|
||||
@ -2395,6 +2394,7 @@ EX void enable_flat_model(int val) {
|
||||
#endif
|
||||
backup_geometry = geometry;
|
||||
backup_variation = variation;
|
||||
backup_cam = pconf.cam();
|
||||
backup_lpu = nisot::local_perspective_used;
|
||||
backup_vid = vid;
|
||||
geometry = gNormal;
|
||||
@ -2404,7 +2404,7 @@ EX void enable_flat_model(int val) {
|
||||
pmodel = mdDisk;
|
||||
pconf.alpha = 1;
|
||||
pconf.scale = 1;
|
||||
pconf.camera_angle = 0;
|
||||
pconf.cam() = Id;
|
||||
pconf.stretch = 1;
|
||||
|
||||
vid.always3 = false;
|
||||
@ -2421,6 +2421,7 @@ EX void enable_flat_model(int val) {
|
||||
geometry = backup_geometry;
|
||||
variation = backup_variation;
|
||||
nisot::local_perspective_used = backup_lpu;
|
||||
pconf.cam() = backup_cam;
|
||||
vid = backup_vid;
|
||||
geom3::apply_always3();
|
||||
calcparam();
|
||||
@ -2466,7 +2467,7 @@ EX transmatrix atscreenpos(ld x, ld y, ld size) {
|
||||
|
||||
void circle_around_center(ld radius, color_t linecol, color_t fillcol, PPR prio) {
|
||||
#if CAP_QUEUE
|
||||
if(among(pmodel, mdDisk, mdEquiarea, mdEquidistant, mdFisheye) && !(pmodel == mdDisk && hyperbolic && pconf.alpha <= -1) && pconf.camera_angle == 0) {
|
||||
if(among(pmodel, mdDisk, mdEquiarea, mdEquidistant, mdFisheye) && !(pmodel == mdDisk && hyperbolic && pconf.alpha <= -1) && models::camera_straight) {
|
||||
hyperpoint ret;
|
||||
applymodel(shiftless(xpush0(radius)), ret);
|
||||
ld r = hypot_d(2, ret);
|
||||
|
@ -370,6 +370,12 @@ int read_legacy_args() {
|
||||
if(GDIM == 3) shift_arg_formula(models::rotation_xz);
|
||||
if(GDIM == 3) shift_arg_formula(models::rotation_xy2); */
|
||||
}
|
||||
else if(argis("-yca")) {
|
||||
PHASEFROM(2);
|
||||
shift_arg_formula(vid.yshift);
|
||||
shift(); ld angle = argf();
|
||||
pconf.cam() = cspin(0, 2, angle);
|
||||
}
|
||||
else return 1;
|
||||
return 0;
|
||||
}
|
||||
|
@ -956,7 +956,7 @@ EX void showStartMenu() {
|
||||
pconf.mori() = racing::race_angle;
|
||||
racing::race_advance = 1;
|
||||
vid.yshift = 0;
|
||||
pconf.camera_angle = 0;
|
||||
pconf.cam() = Id;
|
||||
pconf.xposition = 0;
|
||||
pconf.yposition = 0;
|
||||
pconf.scale = 1;
|
||||
|
13
models.cpp
13
models.cpp
@ -138,13 +138,14 @@ projection_configuration::projection_configuration() {
|
||||
ptr_model_orientation = new trans23;
|
||||
ptr_ball = new transmatrix;
|
||||
*ptr_ball = cspin(1, 2, 20._deg);
|
||||
ptr_camera = new transmatrix; *ptr_camera = Id;
|
||||
}
|
||||
|
||||
EX namespace models {
|
||||
|
||||
EX trans23 rotation;
|
||||
EX int do_rotate = 1;
|
||||
EX bool model_straight, model_straight_yz;
|
||||
EX bool model_straight, model_straight_yz, camera_straight;
|
||||
|
||||
/** screen coordinates to orientation logical coordinates */
|
||||
EX void ori_to_scr(hyperpoint& h) { if(!model_straight) h = pconf.mori().get() * h; }
|
||||
@ -171,6 +172,7 @@ EX namespace models {
|
||||
EX void configure() {
|
||||
model_straight = (pconf.mori().get()[0][0] > 1 - 1e-9);
|
||||
model_straight_yz = GDIM == 2 || (pconf.mori().get()[2][2] > 1-1e-9);
|
||||
camera_straight = eqmatrix(pconf.cam(), Id);
|
||||
if(history::on) history::apply();
|
||||
|
||||
if(!euclid) {
|
||||
@ -1057,8 +1059,13 @@ EX namespace models {
|
||||
param_custom(p.alpha, sp+"projection", menuitem_projection_distance, 'p')
|
||||
->help_text = "projection distance|Gans Klein Poincare orthographic stereographic";
|
||||
|
||||
param_f(p.camera_angle, pp+"cameraangle", sp+"camera angle", 0);
|
||||
addsaver(p.ballproj, sp+"ballproj", 1);
|
||||
param_matrix(p.cam(), pp+"cameraangle", 3)
|
||||
-> editable(pp+"camera angle", "Rotate the camera. Can be used to obtain a first person perspective, "
|
||||
"or third person perspective when combined with Y shift.", 'S')
|
||||
-> set_extra([] {
|
||||
dialog::addBoolItem(XLAT("render behind the camera"), vpconf.back_and_front, 'R');
|
||||
dialog::add_action([] { vpconf.back_and_front = !vpconf.back_and_front; });
|
||||
});
|
||||
|
||||
param_matrix(p.ball(), pp+"ballangle", 3)
|
||||
-> editable("camera rotation in 3D models",
|
||||
|
12
racing.cpp
12
racing.cpp
@ -967,12 +967,12 @@ void race_projection() {
|
||||
|
||||
dialog::init(XLAT("racing projections"));
|
||||
|
||||
dialog::addBoolItem(XLAT("Poincaré disk model"), pmodel == mdDisk && !pconf.camera_angle, '1');
|
||||
dialog::addBoolItem(XLAT("Poincaré disk model"), pmodel == mdDisk && models::camera_straight, '1');
|
||||
dialog::add_action([] () {
|
||||
pmodel = mdDisk;
|
||||
race_advance = 0;
|
||||
vid.yshift = 0;
|
||||
pconf.camera_angle = 0;
|
||||
pconf.cam() = Id;
|
||||
pconf.xposition = 0;
|
||||
pconf.yposition = 0;
|
||||
pconf.scale = 1;
|
||||
@ -986,7 +986,7 @@ void race_projection() {
|
||||
pconf.mori() = race_angle;
|
||||
race_advance = 1;
|
||||
vid.yshift = 0;
|
||||
pconf.camera_angle = 0;
|
||||
pconf.cam() = Id;
|
||||
pconf.xposition = 0;
|
||||
pconf.yposition = 0;
|
||||
pconf.scale = 1;
|
||||
@ -1000,7 +1000,7 @@ void race_projection() {
|
||||
pconf.mori() = race_angle * spin90();
|
||||
race_advance = 0.5;
|
||||
vid.yshift = 0;
|
||||
pconf.camera_angle = 0;
|
||||
pconf.cam() = Id;
|
||||
pconf.xposition = 0;
|
||||
pconf.yposition = 0;
|
||||
pconf.scale = 1;
|
||||
@ -1008,12 +1008,12 @@ void race_projection() {
|
||||
vid.smart_range_detail = 3;
|
||||
});
|
||||
|
||||
dialog::addBoolItem(XLAT("third-person perspective"), pmodel == mdDisk && pconf.camera_angle, '4');
|
||||
dialog::addBoolItem(XLAT("third-person perspective"), pmodel == mdDisk && !models::camera_straight, '4');
|
||||
dialog::add_action([] () {
|
||||
pmodel = mdDisk;
|
||||
race_advance = 0;
|
||||
vid.yshift = -0.3;
|
||||
pconf.camera_angle = -45;
|
||||
pconf.cam() = cspin(1, 2, -45._deg);
|
||||
pconf.scale = 18/16. * vid.xres / vid.yres / multi::players;
|
||||
pconf.xposition = 0;
|
||||
pconf.yposition = -0.9;
|
||||
|
16
shaders.cpp
16
shaders.cpp
@ -836,20 +836,8 @@ void display_data::set_projection(int ed, ld shift) {
|
||||
glhr::projection_multiply(glhr::translate(0, 0.5, 0));
|
||||
}
|
||||
|
||||
if(pconf.camera_angle && pmodel != mdPixel) {
|
||||
ld cam = pconf.camera_angle * degree;
|
||||
|
||||
GLfloat cc = cos(cam);
|
||||
GLfloat ss = sin(cam);
|
||||
|
||||
GLfloat yzspin[16] = {
|
||||
1, 0, 0, 0,
|
||||
0, cc, ss, 0,
|
||||
0, -ss, cc, 0,
|
||||
0, 0, 0, 1
|
||||
};
|
||||
|
||||
glhr::projection_multiply(glhr::as_glmatrix(yzspin));
|
||||
if(!models::camera_straight && pmodel != mdPixel) {
|
||||
glhr::projection_multiply(glhr::tmtogl_transpose(pconf.cam()));
|
||||
}
|
||||
|
||||
if(u_alpha) {
|
||||
|
2
sky.cpp
2
sky.cpp
@ -645,7 +645,7 @@ EX void make_air() {
|
||||
|
||||
pconf.alpha = 1;
|
||||
pconf.scale = 1;
|
||||
pconf.camera_angle = 0;
|
||||
dynamicval<transmatrix> vm(pconf.cam(), Id);
|
||||
pconf.stretch = 1;
|
||||
pmodel = mdDisk;
|
||||
|
||||
|
@ -998,7 +998,7 @@ void init_textureconfig() {
|
||||
addsaver(vid.yshift, "Y shift", 0);
|
||||
addsaver(pconf.yposition, "Y position", 0);
|
||||
addsaver(pconf.xposition, "X position", 0);
|
||||
addsaver(pconf.camera_angle, "camera angle", 0);
|
||||
addsaver((matrix_eq&)pconf.cam(), "camera angle");
|
||||
addsaverenum(targetvariation, "bitruncated", eVariation::bitruncated);
|
||||
// ... geometry parameters
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user