camera_angle now uses matrix dialog

This commit is contained in:
Zeno Rogue 2023-08-14 18:08:28 +02:00
parent 3e1228b7c7
commit 67d38feabd
12 changed files with 56 additions and 76 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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;

View File

@ -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;

View File

@ -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);

View File

@ -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;
}

View File

@ -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;

View File

@ -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",

View File

@ -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;

View File

@ -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) {

View File

@ -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;

View File

@ -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