r5550 - in trunk/data: . qcsrc/client

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Thu Jan 15 09:27:54 EST 2009


Author: mand1nga
Date: 2009-01-15 09:27:53 -0500 (Thu, 15 Jan 2009)
New Revision: 5550

Modified:
   trunk/data/defaultNexuiz.cfg
   trunk/data/qcsrc/client/View.qc
Log:
Demo camera improvements:
Added support for controlling the camera smoothly (cvars camera_speed_attenuation and camera_mouse_treshold)
Independent speeds for free and chase modes
Support for applying smoothness to player movements (cvar camera_chase_smoothly)
More intuitive cvar names

Modified: trunk/data/defaultNexuiz.cfg
===================================================================
--- trunk/data/defaultNexuiz.cfg	2009-01-15 14:03:07 UTC (rev 5549)
+++ trunk/data/defaultNexuiz.cfg	2009-01-15 14:27:53 UTC (rev 5550)
@@ -1299,30 +1299,34 @@
 alias camera_enable "set cl_demo_mousegrab 1; set _chase_active $chase_active; chase_active 2;" // Enables the camera for demo playback
 alias camera_disable "set cl_demo_mousegrab 0; chase_active $_chase_active;" // Disables the camera for demo playback
 
-set chase_active_rolling_step 1			// Camera rotation speed 
-set chase_active_direction_step 3		// Camera movement speed on the x/y/z axis
-set chase_active_free 0				// Free camera instead of chasing the player
-set chase_active_reset 0			// Reset the camera position
-set chase_active_direction_x 0			// Move the camera on the x axis (relative to the camera angle)
-set chase_active_direction_y 0			// Move the camera on the y axis (relative to the camera angle)
-set chase_active_direction_z 0			// Move the camera on the z axis (relative to the camera rotation)
+set camera_speed_roll 0.9		// Camera rotation speed 
+set camera_speed_chase 4		// Camera movement speed on the x/y/z axis while chasing the player
+set camera_speed_free 8			// Camera movement speed on the x/y/z axis in free mode
+set camera_speed_attenuation 30		// Camera movements attenuation factor. Bigger is smoother
+set camera_free 0			// Free camera instead of chasing the player
+set camera_reset 0			// Reset the camera position
+set camera_direction_x 0		// Move the camera on the x axis (relative to the camera angle)
+set camera_direction_y 0		// Move the camera on the y axis (relative to the camera angle)
+set camera_direction_z 0		// Move the camera on the z axis (relative to the camera rotation)
+set camera_mouse_treshold 0.5		// Use to ignore small mouse movements. This allows for smoother camera contro.
+set camera_chase_smoothly 0		// Attenuate player movements (only in chase mode)
 
-alias +camera_move_forward "set chase_active_direction_x 1"
-alias -camera_move_forward "set chase_active_direction_x 0"
-alias +camera_move_backward "set chase_active_direction_x -1"
+alias +camera_move_forward "set camera_direction_x 1"
+alias -camera_move_forward "set camera_direction_x 0"
+alias +camera_move_backward "set camera_direction_x -1"
 alias -camera_move_backward -camera_move_forward
 
-alias +camera_move_left "set chase_active_direction_y 1"
-alias -camera_move_left "set chase_active_direction_y 0"
-alias +camera_move_right "set chase_active_direction_y -1"
+alias +camera_move_left "set camera_direction_y 1"
+alias -camera_move_left "set camera_direction_y 0"
+alias +camera_move_right "set camera_direction_y -1"
 alias -camera_move_right -camera_move_left
 
-alias +camera_move_up "set chase_active_direction_z 1"
-alias -camera_move_up "set chase_active_direction_z 0"
-alias +camera_move_down "set chase_active_direction_z -1"
+alias +camera_move_up "set camera_direction_z 1"
+alias -camera_move_up "set camera_direction_z 0"
+alias +camera_move_down "set camera_direction_z -1"
 alias -camera_move_down -camera_move_up
 
-alias +camera_roll_right "set chase_active_roll 1"
-alias -camera_roll_right "set chase_active_roll 0"
-alias +camera_roll_left "set chase_active_roll -1"
+alias +camera_roll_right "set camera_roll 1"
+alias -camera_roll_right "set camera_roll 0"
+alias +camera_roll_left "set camera_roll -1"
 alias -camera_roll_left -camera_roll_right

Modified: trunk/data/qcsrc/client/View.qc
===================================================================
--- trunk/data/qcsrc/client/View.qc	2009-01-15 14:03:07 UTC (rev 5549)
+++ trunk/data/qcsrc/client/View.qc	2009-01-15 14:27:53 UTC (rev 5550)
@@ -191,7 +191,7 @@
 float zoomscript_caught;
 float view_set;
 float camera_mode;
-vector camera_offset, new_angles;
+vector camera_offset, current_origin, mouse_angles, current_camera_offset, new_angles;
 void CSQC_UpdateView(float w, float h)
 {
 	entity e;
@@ -308,64 +308,89 @@
 
 	R_SetView(VF_FOV, GetCurrentFov(fov));
 
-	if (cvar("chase_active") > 1 && isdemo())
+	// Camera for demo playback
+	if (cvar("chase_active") > 1 && cvar("cl_demo_mousegrab") && isdemo())
 	{
-		float distance, chase_view_angle, step;
+		float speed, attenuation;
 		vector new_origin, m;
 
-		step = cvar("chase_active_direction_step");
+		speed = ((cvar("camera_free")) ? cvar("camera_speed_free") : cvar("camera_speed_chase"));
+			
+		attenuation = cvar("camera_speed_attenuation");
 		
-		if( cvar("chase_active_reset") || !camera_mode )
+		attenuation = ((attenuation<1) ? 1 : (1 / attenuation));
+
+		if( cvar("camera_reset") || !camera_mode )
 		{
 			camera_offset = '0 0 0';
 			new_angles = view_angles;
 			camera_offset_z += 20;
 			camera_offset_x -= 20 * cos(new_angles_y * DEG2RAD);
 			camera_offset_y -= 20 * sin(new_angles_y * DEG2RAD);
+			current_origin = view_origin;
 		}
 
-		if( cvar("chase_active_roll") )
-			new_angles_z += cvar("chase_active_roll") * cvar("chase_active_rolling_step");
+		// Camera angles
+		if( cvar("camera_roll") )
+			mouse_angles_z += cvar("camera_roll") * cvar("camera_speed_roll");
 
 		m = getmousepos() * 0.1;
-		new_angles_x += m_y * cos(new_angles_z * DEG2RAD) + (m_x * sin(new_angles_z * DEG2RAD));
-		new_angles_y -= m_x * cos(new_angles_z * DEG2RAD) + (m_y * -sin(new_angles_z * DEG2RAD));
-
-		if( cvar("chase_active_direction_x") )
+		if(vlen(m)>cvar("camera_mouse_treshold"))
 		{
-			camera_offset_x += cvar("chase_active_direction_x") * step * cos(new_angles_y * DEG2RAD);
-			camera_offset_y += cvar("chase_active_direction_x") * step * sin(new_angles_y * DEG2RAD);
+			mouse_angles_x += m_y * cos(mouse_angles_z * DEG2RAD) + (m_x * sin(mouse_angles_z * DEG2RAD));
+			mouse_angles_y -= m_x * cos(mouse_angles_z * DEG2RAD) + (m_y * -sin(mouse_angles_z * DEG2RAD));
 		}
+		
+		new_angles += (mouse_angles - new_angles) * attenuation;
+		
+		// Camera position
+		if( cvar("camera_direction_x") )
+		{
+			camera_offset_x += cvar("camera_direction_x") * speed * cos(new_angles_y * DEG2RAD);
+			camera_offset_y += cvar("camera_direction_x") * speed * sin(new_angles_y * DEG2RAD);
+		}
 
-		if( cvar("chase_active_direction_y") )
+		if( cvar("camera_direction_y") )
 		{
-			camera_offset_y += cvar("chase_active_direction_y") * step * cos(new_angles_y * DEG2RAD) * cos(new_angles_z * DEG2RAD);
-			camera_offset_x += cvar("chase_active_direction_y") * step * -sin(new_angles_y * DEG2RAD);
-			camera_offset_z += cvar("chase_active_direction_y") * step * sin(new_angles_z * DEG2RAD);
+			camera_offset_y += cvar("camera_direction_y") * speed * cos(new_angles_y * DEG2RAD) * cos(new_angles_z * DEG2RAD);
+			camera_offset_x += cvar("camera_direction_y") * speed * -sin(new_angles_y * DEG2RAD);
+			camera_offset_z += cvar("camera_direction_y") * speed * sin(new_angles_z * DEG2RAD);
 		}
 
-		if( cvar("chase_active_direction_z") )
-			camera_offset_z += cvar("chase_active_direction_z") * step * cos(new_angles_z * DEG2RAD);
+		if( cvar("camera_direction_z") )
+			camera_offset_z += cvar("camera_direction_z") * speed * cos(new_angles_z * DEG2RAD);
 
-		if( cvar("chase_active_free") )
+		current_camera_offset += (camera_offset - current_camera_offset) * attenuation;
+
+		// Camera modes
+		if( cvar("camera_free") )
 		{
-			if ( camera_mode == CAMERA_CHASE ){
-				camera_offset = view_origin + camera_offset;
+			if ( camera_mode == CAMERA_CHASE )
+			{
+				current_camera_offset = current_origin + current_camera_offset;
+				camera_offset = current_origin + camera_offset;
 			}
 
 			camera_mode = CAMERA_FREE;
-			
-			new_origin = camera_offset;
+			new_origin = current_camera_offset;
 		}
 		else
 		{
 			if ( camera_mode == CAMERA_FREE )
 			{
-				camera_offset = camera_offset - view_origin;
+				current_origin = view_origin;
+				camera_offset = camera_offset - current_origin;
+				current_camera_offset = current_camera_offset - current_origin;
 			}
 
 			camera_mode = CAMERA_CHASE;
-			new_origin = view_origin + camera_offset;
+			
+			if(cvar("camera_chase_smoothly"))
+				current_origin += (view_origin - current_origin) * attenuation;
+			else
+				current_origin = view_origin;
+				
+			new_origin = current_origin + current_camera_offset;
 		}
 
 		R_SetView(VF_ANGLES, new_angles);




More information about the nexuiz-commits mailing list