mirror of
				https://github.com/zenorogue/hyperrogue.git
				synced 2025-10-31 05:52:59 +00:00 
			
		
		
		
	cleaned up keep_vertical_orientation; camera rotation is now nicer if yes
This commit is contained in:
		
							
								
								
									
										19
									
								
								control.cpp
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								control.cpp
									
									
									
									
									
								
							| @@ -318,8 +318,23 @@ EX void full_rotate_camera(int dir, ld val) { | |||||||
|   else if(rug::rug_control() && rug::in_crystal()) |   else if(rug::rug_control() && rug::in_crystal()) | ||||||
|     crystal::apply_rotation(cspin(dir, 2, val)); |     crystal::apply_rotation(cspin(dir, 2, val)); | ||||||
|   #endif |   #endif | ||||||
|   else if(GDIM == 3) |   else if(GDIM == 3) { | ||||||
|     rotate_view(cspin(dir, 2, val)), didsomething = true; |     if(keep_vertical()) { | ||||||
|  |       hyperpoint vv = vertical_vector(); | ||||||
|  |       ld alpha = -atan2(vv[2], vv[1]); | ||||||
|  |       rotate_view(cspin(2, 1, alpha)); | ||||||
|  |       ld max_angle = quarter_circle - 1e-4; | ||||||
|  |       if(dir == 1 && alpha + val > max_angle) | ||||||
|  |         val = max_angle - alpha; | ||||||
|  |       if(dir == 1 && alpha + val < -max_angle) | ||||||
|  |         val = -max_angle - alpha; | ||||||
|  |       rotate_view(cspin(dir, 2, val)); | ||||||
|  |       rotate_view(cspin(1, 2, alpha)); | ||||||
|  |       } | ||||||
|  |     else | ||||||
|  |       rotate_view(cspin(dir, 2, val)); | ||||||
|  |     if(!rug::rug_control()) didsomething = true; | ||||||
|  |     } | ||||||
|   else |   else | ||||||
|     View = cpush(dir, val) * View, playermoved = false, didsomething = true;       |     View = cpush(dir, val) * View, playermoved = false, didsomething = true;       | ||||||
|   }; |   }; | ||||||
|   | |||||||
							
								
								
									
										51
									
								
								hypgraph.cpp
									
									
									
									
									
								
							
							
						
						
									
										51
									
								
								hypgraph.cpp
									
									
									
									
									
								
							| @@ -1252,6 +1252,24 @@ void hrmap_standard::draw() { | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  | EX bool keep_vertical() { | ||||||
|  |   if(CAP_ORIENTATION) return false; | ||||||
|  |   if((WDIM == 2 || prod) && GDIM == 3 && vid.fixed_yz) return true; | ||||||
|  |   if(downseek.qty) return true; | ||||||
|  |   return false; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  | EX hyperpoint vertical_vector() { | ||||||
|  |   auto& ds = downseek; | ||||||
|  |   if((WDIM == 2 || prod) && GDIM == 3 && vid.fixed_yz)  | ||||||
|  |     return get_view_orientation() * ztangent(1);   | ||||||
|  |   else if(ds.qty && prod) | ||||||
|  |     return get_view_orientation() * product::inverse_exp(ds.point); | ||||||
|  |   else if(ds.qty) | ||||||
|  |     return ds.point; | ||||||
|  |   return C0; | ||||||
|  |   } | ||||||
|  |  | ||||||
| EX void spinEdge(ld aspd) {  | EX void spinEdge(ld aspd) {  | ||||||
|   ld downspin = 0; |   ld downspin = 0; | ||||||
|   auto& ds = downseek; |   auto& ds = downseek; | ||||||
| @@ -1272,33 +1290,20 @@ EX void spinEdge(ld aspd) { | |||||||
|     downspin = atan2(H[1], H[0]); |     downspin = atan2(H[1], H[0]); | ||||||
|     downspin += vid.fixed_facing_dir * degree; |     downspin += vid.fixed_facing_dir * degree; | ||||||
|     if(flipplayer) downspin += M_PI; |     if(flipplayer) downspin += M_PI; | ||||||
|     while(downspin < -M_PI) downspin += 2*M_PI; |     cyclefix(downspin, 0); | ||||||
|     while(downspin > +M_PI) downspin -= 2*M_PI; |  | ||||||
|     aspd = (1 + 2 * abs(downspin)) * aspd; |     aspd = (1 + 2 * abs(downspin)) * aspd; | ||||||
|     } |     } | ||||||
|   else if((WDIM == 2 || prod) && GDIM == 3 && vid.fixed_yz && !CAP_ORIENTATION) { |   else if(keep_vertical()) { | ||||||
|     aspd = 999999; |     hyperpoint h = vertical_vector(); | ||||||
|     auto& vo = get_view_orientation(); |     downspin = -atan2(h[0], h[1]); | ||||||
|     // does not work well (also need change auto& to auto) |     if(ds.qty && GDIM == 2) { | ||||||
|     // if(hybri && !prod) vo = vo * inverse(nisot::translate(tC0(vo))); |       downspin += models::rotation * degree; | ||||||
|     if(ds.qty) { |  | ||||||
|       auto sdp = ds.point; |  | ||||||
|       if(prod) sdp = vo * product::inverse_exp(sdp); |  | ||||||
|       if(sdp[0]) |  | ||||||
|         downspin = models::rotation * degree - atan2(sdp[0], sdp[1]); |  | ||||||
|       } |       } | ||||||
|     else { |     if(GDIM == 2) { | ||||||
|       if(vo[0][2])  |       cyclefix(downspin, 0);       | ||||||
|         downspin = -atan2(vo[0][2], vo[1][2]); |       downspin = downspin * min(ds.speed, (double)1); | ||||||
|       } |       } | ||||||
|     } |     else aspd = 999999; | ||||||
|   else if(ds.qty) { |  | ||||||
|     downspin = atan2(ds.point[1], ds.point[0]); |  | ||||||
|     downspin -= M_PI/2; |  | ||||||
|     downspin += models::rotation * degree; |  | ||||||
|     while(downspin < -M_PI) downspin += 2*M_PI; |  | ||||||
|     while(downspin > +M_PI) downspin -= 2*M_PI; |  | ||||||
|     downspin = downspin * min(ds.speed, (double)1); |  | ||||||
|     } |     } | ||||||
|   if(downspin >  aspd) downspin =  aspd; |   if(downspin >  aspd) downspin =  aspd; | ||||||
|   if(downspin < -aspd) downspin = -aspd; |   if(downspin < -aspd) downspin = -aspd; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Zeno Rogue
					Zeno Rogue