mirror of
				https://github.com/zenorogue/hyperrogue.git
				synced 2025-10-31 05:52:59 +00:00 
			
		
		
		
	fixed linked settings
This commit is contained in:
		
							
								
								
									
										54
									
								
								config.cpp
									
									
									
									
									
								
							
							
						
						
									
										54
									
								
								config.cpp
									
									
									
									
									
								
							| @@ -22,6 +22,42 @@ EX bool return_false() { return false; } | |||||||
|  |  | ||||||
| EX bool use_bool_dialog; | EX bool use_bool_dialog; | ||||||
|  |  | ||||||
|  | /** set to true if a parameter was changed as a consequence of changing linked parameters */ | ||||||
|  | EX bool linked_consequence; | ||||||
|  |  | ||||||
|  | EX void adjust_linked() { | ||||||
|  |   indenter ind(2); | ||||||
|  |   geom3::invalid = ""; | ||||||
|  |   dynamicval<bool> d(linked_consequence, true); | ||||||
|  |   if(vid.tc_alpha < vid.tc_depth && vid.tc_alpha < vid.tc_camera) { | ||||||
|  |     find_edit(&pconf.alpha)->set_cld(tan_auto(vid.depth) / tan_auto(vid.camera)); | ||||||
|  |     } | ||||||
|  |   else if(vid.tc_depth < vid.tc_alpha && vid.tc_depth < vid.tc_camera) { | ||||||
|  |     ld v = pconf.alpha * tan_auto(vid.camera); | ||||||
|  |     if(hyperbolic && (v<1e-6-12 || v>1-1e-12)) { | ||||||
|  |       geom3::invalid = XLAT("cannot adjust depth"); | ||||||
|  |       v = vid.camera; | ||||||
|  |       } | ||||||
|  |     else v = atan_auto(v); | ||||||
|  |     find_edit(&vid.depth)->set_cld(v); | ||||||
|  |     } | ||||||
|  |   else { | ||||||
|  |     ld v = tan_auto(vid.depth) / pconf.alpha; | ||||||
|  |     if(hyperbolic && (v<1e-12-1 || v>1-1e-12)) { | ||||||
|  |       geom3::invalid = XLAT("cannot adjust camera"); | ||||||
|  |       v = vid.depth; | ||||||
|  |       } | ||||||
|  |     else v = atan_auto(v); | ||||||
|  |     find_edit(&vid.camera)->set_cld(v); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  | EX void update_linked(int& t) { | ||||||
|  |   if(linked_consequence) return; | ||||||
|  |   t = ticks; | ||||||
|  |   adjust_linked(); | ||||||
|  |   } | ||||||
|  |  | ||||||
| EX string param_esc(string s); | EX string param_esc(string s); | ||||||
|  |  | ||||||
| EX void non_editable_pre() { if(game_active) stop_game(); }; | EX void non_editable_pre() { if(game_active) stop_game(); }; | ||||||
| @@ -1853,7 +1889,7 @@ EX void saveConfig() { | |||||||
|   if(vid.tc_depth > vid.tc_camera) pt_depth++; |   if(vid.tc_depth > vid.tc_camera) pt_depth++; | ||||||
|   if(vid.tc_depth < vid.tc_camera) pt_camera++; |   if(vid.tc_depth < vid.tc_camera) pt_camera++; | ||||||
|   if(vid.tc_depth > vid.tc_alpha ) pt_depth++; |   if(vid.tc_depth > vid.tc_alpha ) pt_depth++; | ||||||
|   if(vid.tc_depth < vid.tc_alpha ) pt_alpha ++; |   if(vid.tc_depth < vid.tc_alpha ) pt_alpha++; | ||||||
|   if(vid.tc_alpha > vid.tc_camera) pt_alpha++; |   if(vid.tc_alpha > vid.tc_camera) pt_alpha++; | ||||||
|   if(vid.tc_alpha < vid.tc_camera) pt_camera++; |   if(vid.tc_alpha < vid.tc_camera) pt_camera++; | ||||||
|   vid.tc_alpha = pt_alpha; |   vid.tc_alpha = pt_alpha; | ||||||
| @@ -2562,7 +2598,6 @@ EX void showJoyConfig() { | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
| EX void projectionDialog() { | EX void projectionDialog() { | ||||||
|   vid.tc_alpha = ticks; |  | ||||||
|   dialog::editNumber(vpconf.alpha, -5, 5, .1, 1, |   dialog::editNumber(vpconf.alpha, -5, 5, .1, 1, | ||||||
|     XLAT("projection distance"), |     XLAT("projection distance"), | ||||||
|     XLAT("HyperRogue uses the Minkowski hyperboloid model internally. " |     XLAT("HyperRogue uses the Minkowski hyperboloid model internally. " | ||||||
| @@ -2591,6 +2626,7 @@ EX void projectionDialog() { | |||||||
|     dialog::addItem(sphere ? "towards orthographic" : "towards Gans model", 'T'); |     dialog::addItem(sphere ? "towards orthographic" : "towards Gans model", 'T'); | ||||||
|     dialog::add_action([] () { double d = 1.1; vpconf.alpha *= d; vpconf.scale *= d; dialog::get_ne().reset_str(); }); |     dialog::add_action([] () { double d = 1.1; vpconf.alpha *= d; vpconf.scale *= d; dialog::get_ne().reset_str(); }); | ||||||
|     }; |     }; | ||||||
|  |   dialog::get_di().reaction = [] { update_linked(vid.tc_alpha); }; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| EX void menuitem_projection_distance(key_type key) { | EX void menuitem_projection_distance(key_type key) { | ||||||
| @@ -3154,7 +3190,6 @@ EX int config3 = addHook(hooks_configfile, 100, [] { | |||||||
|     ->editable(-5, 5, .1, "eye level", "", 'E') |     ->editable(-5, 5, .1, "eye level", "", 'E') | ||||||
|     ->set_extra([] { |     ->set_extra([] { | ||||||
|       dialog::get_di().dialogflags |= sm::CENTER; |       dialog::get_di().dialogflags |= sm::CENTER; | ||||||
|       vid.tc_camera = ticks; |  | ||||||
|      |      | ||||||
|       dialog::addHelp(XLAT("In the FPP mode, the camera will be set at this altitude (before applying shifts).")); |       dialog::addHelp(XLAT("In the FPP mode, the camera will be set at this altitude (before applying shifts).")); | ||||||
|  |  | ||||||
| @@ -3164,7 +3199,8 @@ EX int config3 = addHook(hooks_configfile, 100, [] { | |||||||
|         vid.auto_eye = !vid.auto_eye; |         vid.auto_eye = !vid.auto_eye; | ||||||
|         geom3::do_auto_eye(); |         geom3::do_auto_eye(); | ||||||
|         }); |         }); | ||||||
|       }); |       }) | ||||||
|  |     ->set_reaction([] { update_linked(vid.tc_camera); }); | ||||||
|    |    | ||||||
|   param_b(vid.auto_eye, "auto-eyelevel", false); |   param_b(vid.auto_eye, "auto-eyelevel", false); | ||||||
|  |  | ||||||
| @@ -3250,7 +3286,6 @@ EX int config3 = addHook(hooks_configfile, 100, [] { | |||||||
|   param_f(vid.depth, parameter_names("depth", "3D depth"), 1) |   param_f(vid.depth, parameter_names("depth", "3D depth"), 1) | ||||||
|     ->editable(0, 5, .1, "Ground level below the plane", "", 'd') |     ->editable(0, 5, .1, "Ground level below the plane", "", 'd') | ||||||
|     ->set_extra([] { |     ->set_extra([] { | ||||||
|         vid.tc_depth = ticks; |  | ||||||
|         help = XLAT( |         help = XLAT( | ||||||
|           "Ground level is actually an equidistant surface, " |           "Ground level is actually an equidistant surface, " | ||||||
|           "%1 absolute units below the plane P. " |           "%1 absolute units below the plane P. " | ||||||
| @@ -3282,17 +3317,13 @@ EX int config3 = addHook(hooks_configfile, 100, [] { | |||||||
|         dialog::addHelp(help); |         dialog::addHelp(help); | ||||||
|         }) |         }) | ||||||
|     ->set_reaction([] { |     ->set_reaction([] { | ||||||
|         bool b = vid.tc_alpha < vid.tc_camera; |         update_linked(vid.tc_depth); | ||||||
|         if(vid.tc_alpha >= vid.tc_depth) vid.tc_alpha = vid.depth - 1; |  | ||||||
|         if(vid.tc_camera >= vid.tc_depth) vid.tc_camera = vid.depth - 1; |  | ||||||
|         if(vid.tc_alpha == vid.tc_camera) (b ? vid.tc_alpha : vid.tc_camera)--; |  | ||||||
|         geom3::apply_settings_light(); |         geom3::apply_settings_light(); | ||||||
|         }); |         }); | ||||||
|   param_f(vid.camera, parameter_names("camera", "3D camera level"), 1) |   param_f(vid.camera, parameter_names("camera", "3D camera level"), 1) | ||||||
|     ->editable(0, 5, .1, "", "", 'c') |     ->editable(0, 5, .1, "", "", 'c') | ||||||
|     ->modif([] (float_parameter* x) { x->menu_item_name = (GDIM == 2 ? "Camera level above the plane" : "Z shift"); }) |     ->modif([] (float_parameter* x) { x->menu_item_name = (GDIM == 2 ? "Camera level above the plane" : "Z shift"); }) | ||||||
|     ->set_extra([] {     |     ->set_extra([] {     | ||||||
|        vid.tc_camera = ticks; |  | ||||||
|        if(GDIM == 2) |        if(GDIM == 2) | ||||||
|        dialog::addHelp(XLAT( |        dialog::addHelp(XLAT( | ||||||
|          "Camera is placed %1 absolute units above a plane P in a three-dimensional " |          "Camera is placed %1 absolute units above a plane P in a three-dimensional " | ||||||
| @@ -3309,6 +3340,9 @@ EX int config3 = addHook(hooks_configfile, 100, [] { | |||||||
|          dialog::addHelp(XLAT("Look from behind.")); |          dialog::addHelp(XLAT("Look from behind.")); | ||||||
|        if(GDIM == 3 && pmodel == mdPerspective)  |        if(GDIM == 3 && pmodel == mdPerspective)  | ||||||
|          dialog::addBoolItem_action(XLAT("reduce if walls on the way"), vid.use_wall_radar, 'R'); |          dialog::addBoolItem_action(XLAT("reduce if walls on the way"), vid.use_wall_radar, 'R'); | ||||||
|  |        }) | ||||||
|  |     ->set_reaction([] { | ||||||
|  |       update_linked(vid.tc_camera); | ||||||
|       }); |       }); | ||||||
|   param_f(vid.wall_height, parameter_names("wall_height", "3D wall height"), .3) |   param_f(vid.wall_height, parameter_names("wall_height", "3D wall height"), .3) | ||||||
|     ->editable(0, 1, .1, "Height of walls", "", 'w') |     ->editable(0, 1, .1, "Height of walls", "", 'w') | ||||||
|   | |||||||
							
								
								
									
										14
									
								
								geometry.cpp
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								geometry.cpp
									
									
									
									
									
								
							| @@ -1011,21 +1011,9 @@ EX namespace geom3 { | |||||||
|     using namespace geom3; |     using namespace geom3; | ||||||
|     DEBBI(DF_INIT | DF_POLY | DF_GEOM, ("geom3::compute")); |     DEBBI(DF_INIT | DF_POLY | DF_GEOM, ("geom3::compute")); | ||||||
|     // tanh(depth) / tanh(camera) == pconf.alpha |     // tanh(depth) / tanh(camera) == pconf.alpha | ||||||
|     invalid = ""; |  | ||||||
|      |      | ||||||
|     if(GDIM == 3 || flipped || changing_embedded_settings); |     if(GDIM == 3 || flipped || changing_embedded_settings); | ||||||
|     else if(vid.tc_alpha < vid.tc_depth && vid.tc_alpha < vid.tc_camera) |     else adjust_linked(); | ||||||
|       pconf.alpha = tan_auto(vid.depth) / tan_auto(vid.camera); |  | ||||||
|     else if(vid.tc_depth < vid.tc_alpha && vid.tc_depth < vid.tc_camera) { |  | ||||||
|       ld v = pconf.alpha * tan_auto(vid.camera); |  | ||||||
|       if(hyperbolic && (v<1e-6-12 || v>1-1e-12)) invalid = XLAT("cannot adjust depth"), vid.depth = vid.camera; |  | ||||||
|       else vid.depth = atan_auto(v); |  | ||||||
|       } |  | ||||||
|     else { |  | ||||||
|       ld v = tan_auto(vid.depth) / pconf.alpha; |  | ||||||
|       if(hyperbolic && (v<1e-12-1 || v>1-1e-12)) invalid = XLAT("cannot adjust camera"), vid.camera = vid.depth; |  | ||||||
|       else vid.camera = atan_auto(v); |  | ||||||
|       } |  | ||||||
|      |      | ||||||
|     if(fabs(pconf.alpha) < 1e-6) invalid = XLAT("does not work with perfect Klein"); |     if(fabs(pconf.alpha) < 1e-6) invalid = XLAT("does not work with perfect Klein"); | ||||||
|    |    | ||||||
|   | |||||||
| @@ -1078,6 +1078,7 @@ EX namespace models { | |||||||
|         p.alpha = 1; |         p.alpha = 1; | ||||||
|         auto proj = param_custom_ld(p.alpha, sp+"projection", menuitem_projection_distance, 'p'); |         auto proj = param_custom_ld(p.alpha, sp+"projection", menuitem_projection_distance, 'p'); | ||||||
|         proj->help_text = "projection distance|Gans Klein Poincare orthographic stereographic"; |         proj->help_text = "projection distance|Gans Klein Poincare orthographic stereographic"; | ||||||
|  |         proj->reaction = [] { update_linked(vid.tc_alpha); }; | ||||||
|         } |         } | ||||||
|       else { |       else { | ||||||
|         param_f(p.alpha, sp+"projection", 1); |         param_f(p.alpha, sp+"projection", 1); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Zeno Rogue
					Zeno Rogue