Fix some camera bugs
This commit is contained in:
		
							parent
							
								
									b6d28c2886
								
							
						
					
					
						commit
						ffbe827f22
					
				
					 2 changed files with 42 additions and 7 deletions
				
			
		
							
								
								
									
										5
									
								
								game.h
									
										
									
									
									
								
							
							
						
						
									
										5
									
								
								game.h
									
										
									
									
									
								
							|  | @ -170,9 +170,14 @@ uint8_t LCR_gameStep(uint32_t time) | ||||||
|     LCR_keyStates[i] = LCR_keyPressed(i) ? |     LCR_keyStates[i] = LCR_keyPressed(i) ? | ||||||
|       (LCR_keyStates[i] < 255 ? LCR_keyStates[i] + 1 : 255) : 0; |       (LCR_keyStates[i] < 255 ? LCR_keyStates[i] + 1 : 255) : 0; | ||||||
| 
 | 
 | ||||||
|  | //S3L_logTransform3D(LCR_renderer.scene.camera.transform);
 | ||||||
|  | 
 | ||||||
| if ((LCR_racing.tick % 32) == 0) | if ((LCR_racing.tick % 32) == 0) | ||||||
|  | { | ||||||
|   printf("speed: %d\n",LCR_racingGetCarSpeed()); |   printf("speed: %d\n",LCR_racingGetCarSpeed()); | ||||||
| 
 | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|   uint32_t sleep = 0; |   uint32_t sleep = 0; | ||||||
| 
 | 
 | ||||||
|   if (LCR_keyStates[LCR_KEY_B] == 1) |   if (LCR_keyStates[LCR_KEY_B] == 1) | ||||||
|  |  | ||||||
							
								
								
									
										42
									
								
								renderer.h
									
										
									
									
									
								
							
							
						
						
									
										42
									
								
								renderer.h
									
										
									
									
									
								
							|  | @ -898,6 +898,14 @@ void LCR_rendererMoveCamera(LCR_GameUnit forwRightUpOffset[3], | ||||||
|     ((f.z * forwRightUpOffset[0] + r.z * forwRightUpOffset[1] +  |     ((f.z * forwRightUpOffset[0] + r.z * forwRightUpOffset[1] +  | ||||||
|     u.z * forwRightUpOffset[2]) * S3L_F) / LCR_GAME_UNIT;       |     u.z * forwRightUpOffset[2]) * S3L_F) / LCR_GAME_UNIT;       | ||||||
| 
 | 
 | ||||||
|  | LCR_renderer.scene.camera.transform.rotation.y += | ||||||
|  |   (yawPitchOffset[0] * S3L_F) / LCR_GAME_UNIT; | ||||||
|  | 
 | ||||||
|  | LCR_renderer.scene.camera.transform.rotation.x += | ||||||
|  |   (yawPitchOffset[1] * S3L_F) / LCR_GAME_UNIT; | ||||||
|  |   | ||||||
|  | 
 | ||||||
|  | /* 
 | ||||||
|   LCR_renderer.scene.camera.transform.rotation.y = S3L_wrap( |   LCR_renderer.scene.camera.transform.rotation.y = S3L_wrap( | ||||||
|     LCR_renderer.scene.camera.transform.rotation.y + |     LCR_renderer.scene.camera.transform.rotation.y + | ||||||
|     (yawPitchOffset[0] * S3L_F) / LCR_GAME_UNIT, |     (yawPitchOffset[0] * S3L_F) / LCR_GAME_UNIT, | ||||||
|  | @ -907,6 +915,8 @@ void LCR_rendererMoveCamera(LCR_GameUnit forwRightUpOffset[3], | ||||||
|     LCR_renderer.scene.camera.transform.rotation.x + |     LCR_renderer.scene.camera.transform.rotation.x + | ||||||
|     (yawPitchOffset[1] * S3L_F) / LCR_GAME_UNIT, |     (yawPitchOffset[1] * S3L_F) / LCR_GAME_UNIT, | ||||||
|     -1 * S3L_F / 4,S3L_F / 4); |     -1 * S3L_F / 4,S3L_F / 4); | ||||||
|  | */ | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| #define chk(o,c,l) \ | #define chk(o,c,l) \ | ||||||
|   if (LCR_renderer.scene.camera.transform.translation.c o l) \ |   if (LCR_renderer.scene.camera.transform.translation.c o l) \ | ||||||
|  | @ -1189,6 +1199,9 @@ void _LCR_rendererLoadMapChunk(uint8_t chunk, int8_t x, int8_t y, int8_t z) | ||||||
| S3L_Unit _LCR_smoothRotation(S3L_Unit angleOld, S3L_Unit angleNew, | S3L_Unit _LCR_smoothRotation(S3L_Unit angleOld, S3L_Unit angleNew, | ||||||
|   unsigned int amount) |   unsigned int amount) | ||||||
| { | { | ||||||
|  | //  angleOld = S3L_wrap(angleOld,S3L_F);
 | ||||||
|  | //  angleNew = S3L_wrap(angleNew,S3L_F);
 | ||||||
|  | 
 | ||||||
|   S3L_Unit angleDiff = angleNew - angleOld; |   S3L_Unit angleDiff = angleNew - angleOld; | ||||||
| 
 | 
 | ||||||
|   if (angleDiff == 0) |   if (angleDiff == 0) | ||||||
|  | @ -1198,16 +1211,17 @@ S3L_Unit _LCR_smoothRotation(S3L_Unit angleOld, S3L_Unit angleNew, | ||||||
| 
 | 
 | ||||||
|   if (angleDiffAbs > S3L_F / 2) // consider e.g. 350 degrees minus 1 degree
 |   if (angleDiffAbs > S3L_F / 2) // consider e.g. 350 degrees minus 1 degree
 | ||||||
|   { |   { | ||||||
|     angleDiffAbs -= S3L_F / 2; |     angleDiffAbs = S3L_F - angleDiffAbs; | ||||||
|     angleDiff += (angleDiff > 0) ? -1 * (S3L_F / 2) : (S3L_F / 2); |     angleDiff = (angleDiff > 0) ? -1 * angleDiffAbs : angleDiffAbs; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   if (angleDiffAbs > (3 * S3L_F) / 8) // angle too big, rotate immediately
 | //  if (angleDiffAbs > (3 * S3L_F) / 8) // angle too big, rotate immediately
 | ||||||
|     return angleNew; | //    return angleNew;
 | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
| if (angleDiffAbs < S3L_F / 32) | printf("%d %d %d\n",angleOld,angleNew, | ||||||
|   return angleOld; |   angleOld + (angleDiff >> amount) | ||||||
|  | ); | ||||||
| */ | */ | ||||||
| 
 | 
 | ||||||
|   return angleOld + (angleDiff >> amount); // smoothly interpolate
 |   return angleOld + (angleDiff >> amount); // smoothly interpolate
 | ||||||
|  | @ -1439,6 +1453,15 @@ void LCR_rendererCameraFollow(void) | ||||||
|   LCR_renderer.scene.camera.transform.rotation.x = _LCR_smoothRotation( |   LCR_renderer.scene.camera.transform.rotation.x = _LCR_smoothRotation( | ||||||
|     transPrev.rotation.x,LCR_renderer.scene.camera.transform.rotation.x,2); |     transPrev.rotation.x,LCR_renderer.scene.camera.transform.rotation.x,2); | ||||||
| 
 | 
 | ||||||
|  | /*
 | ||||||
|  | printf("aaa %d %d %d\n", | ||||||
|  | transPrev.rotation.y, | ||||||
|  | LCR_renderer.scene.camera.transform.rotation.y, | ||||||
|  |   _LCR_smoothRotation( | ||||||
|  |     transPrev.rotation.y,LCR_renderer.scene.camera.transform.rotation.y,3) | ||||||
|  | ); | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|   LCR_renderer.scene.camera.transform.rotation.y = _LCR_smoothRotation( |   LCR_renderer.scene.camera.transform.rotation.y = _LCR_smoothRotation( | ||||||
|     transPrev.rotation.y,LCR_renderer.scene.camera.transform.rotation.y,3); |     transPrev.rotation.y,LCR_renderer.scene.camera.transform.rotation.y,3); | ||||||
| #endif | #endif | ||||||
|  | @ -1454,6 +1477,13 @@ void LCR_rendererSetWheelState(LCR_GameUnit rotation, LCR_GameUnit steer) | ||||||
| 
 | 
 | ||||||
| void LCR_rendererDraw(void) | void LCR_rendererDraw(void) | ||||||
| { | { | ||||||
|  |   // first make sure rotations are in correct range:
 | ||||||
|  |   LCR_renderer.scene.camera.transform.rotation.y = S3L_wrap( | ||||||
|  |     LCR_renderer.scene.camera.transform.rotation.y, S3L_F); | ||||||
|  | 
 | ||||||
|  |   LCR_renderer.scene.camera.transform.rotation.x = S3L_clamp( | ||||||
|  |     LCR_renderer.scene.camera.transform.rotation.x,-1 * S3L_F / 4,S3L_F / 4); | ||||||
|  | 
 | ||||||
|   LCR_renderer.previousTriID = -1; |   LCR_renderer.previousTriID = -1; | ||||||
|   S3L_newFrame(); |   S3L_newFrame(); | ||||||
|    |    | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue