1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2025-01-11 18:00:34 +00:00

rug:: better live changing of model_distance and modelscale

This commit is contained in:
Zeno Rogue 2019-05-03 11:46:14 +02:00
parent 0c20fdac3b
commit 6fcb42d9d7

35
rug.cpp
View File

@ -1824,6 +1824,8 @@ void change_texturesize() {
} }
} }
ld old_distance;
void show() { void show() {
cmode = sm::SIDE | sm::MAYDARK; cmode = sm::SIDE | sm::MAYDARK;
gamescreen(0); gamescreen(0);
@ -1924,22 +1926,41 @@ void show() {
else if(uni == 'r') else if(uni == 'r')
addMessage(XLAT("This just shows the 'z' coordinate of the selected point.")); addMessage(XLAT("This just shows the 'z' coordinate of the selected point."));
else if(uni == 'm') { else if(uni == 'm') {
dialog::editNumber(modelscale, 0.1, 10, rugged ? .001 : .1, 1, XLAT("model scale factor"), dialog::editNumber(modelscale, 0.1, 10, rugged ? .01 : .1, 1, XLAT("model scale factor"),
XLAT("This is relevant when the native geometry is not Euclidean. " XLAT("This is relevant when the native geometry is not Euclidean. "
"For example, if the native geometry is spherical, and scale < 1, a 2d sphere will be rendered as a subsphere; " "For example, if the native geometry is spherical, and scale < 1, a 2d sphere will be rendered as a subsphere; "
"if the native geometry is hyperbolic, and scale > 1, a hyperbolic plane will be rendered as an equidistant surface. ") "if the native geometry is hyperbolic, and scale > 1, a hyperbolic plane will be rendered as an equidistant surface. ")
); );
dialog::scaleLog(); dialog::scaleLog();
if(rug::rugged) { if(rug::rugged) {
static bool adjust_points = true;
static bool camera_center = false;
static bool adjust_edges = true;
static bool adjust_distance = true;
static ld last; static ld last;
last = modelscale; last = modelscale;
dialog::extra_options = [] () {
dialog::addBoolItem_action(XLAT("adjust points"), adjust_points, 'P');
if(adjust_points)
dialog::addBoolItem_action(XLAT("center on camera"), camera_center, 'C');
else
dialog::addBreak(100);
dialog::addBoolItem_action(XLAT("adjust edges"), adjust_edges, 'E');
dialog::addBoolItem_action(XLAT("adjust distance"), adjust_distance, 'D');
};
dialog::reaction = [] () { dialog::reaction = [] () {
if(!last || !modelscale) return;
if(!camera_center) push_all_points(2, model_distance);
for(auto p:points) { for(auto p:points) {
for(auto& e: p->edges) e.len *= modelscale / last; if(adjust_edges) for(auto& e: p->edges) e.len *= modelscale / last;
using namespace hyperpoint_vec;
if(adjust_points) p->flat *= modelscale / last;
enqueue(p); enqueue(p);
} }
if(adjust_distance) model_distance = model_distance * modelscale / last;
last = modelscale; last = modelscale;
good_shape = false; good_shape = false;
if(!camera_center) push_all_points(2, -model_distance);
}; };
} }
} }
@ -1952,11 +1973,19 @@ void show() {
push_all_points(2, +model_distance); push_all_points(2, +model_distance);
} }
} }
else if(uni == 'd') else if(uni == 'd') {
dialog::editNumber(model_distance, -10, 10, .1, 1, XLAT("model distance"), dialog::editNumber(model_distance, -10, 10, .1, 1, XLAT("model distance"),
XLAT("In the perspective projection, this sets the distance from the camera to the center of the model. " XLAT("In the perspective projection, this sets the distance from the camera to the center of the model. "
"In the orthogonal projection this just controls the scale.") "In the orthogonal projection this just controls the scale.")
); );
old_distance = model_distance;
dialog::reaction = [] () {
if(rug::rugged && rug_perspective) {
push_all_points(2, old_distance - model_distance);
}
old_distance = model_distance;
};
}
else if(uni == 'e') { else if(uni == 'e') {
dialog::editNumber(err_zero, 1e-9, 1, .1, 1e-3, XLAT("maximum error"), dialog::editNumber(err_zero, 1e-9, 1, .1, 1e-3, XLAT("maximum error"),
XLAT("New points are added when the current error in the model is smaller than this value.") XLAT("New points are added when the current error in the model is smaller than this value.")