Beispiel #1
0
void Bench_CheckEntity( int type, struct cl_entity_s *ent, const char *modelname )
{
	if ( Bench_InStage( THIRD_STAGE ) && !stricmp( modelname, "*3" ) )
	{
		model_t *pmod;
		vec3_t v;
		pmod = (model_t *)( ent->model );

		VectorAdd( pmod->mins, pmod->maxs, v );
		VectorScale( v, 0.5, v );

		VectorAdd( v, ent->origin, g_aimorg );
	}

	if ( Bench_InStage( THIRD_STAGE ) && strstr( modelname, "ppdemodot" ) )
	{
		Bench_SetDotAdded( 1 );
		VectorCopy( ent->origin, g_dotorg );

		// Adjust end position
		if ( Bench_Active() && Bench_InStage( THIRD_STAGE ) )
		{
			static float fZAdjust = 0.0;
			static float fLastTime;
			float dt;
			float fRate = Bench_GetPowerPlay() ? 4.0 : 8.0;
			float fBounds = Bench_GetPowerPlay() ? 8.0 : 15.0;

			dt = gHUD.m_flTime - fLastTime;
			if ( dt > 0.0 && dt < 1.0 )
			{
				fZAdjust += gEngfuncs.pfnRandomFloat( -fRate, fRate );
				fZAdjust = min( fBounds, fZAdjust );
				fZAdjust = max( -fBounds, fZAdjust );

				ent->origin[2] += fZAdjust;

				g_fZAdjust = fZAdjust;
			}
			fLastTime = gHUD.m_flTime;
		}
	}
}
Beispiel #2
0
void Bench_CheckEntity( int type, cl_entity_t *ent, const char *modelname )
{
	if ( Bench_InStage( THIRD_STAGE ) && !stricmp( modelname, "*3" ) )
	{
		model_t *pmod = ent->model;
		const Vector v = ( pmod->mins + pmod->maxs ) * 0.5;

		g_aimorg = v + ent->origin;
	}

	if ( Bench_InStage( THIRD_STAGE ) && strstr( modelname, "ppdemodot" ) )
	{
		Bench_SetDotAdded( 1 );
		g_dotorg = ent->origin;

		// Adjust end position
		if ( Bench_Active() && Bench_InStage( THIRD_STAGE ) )
		{
			static float fZAdjust = 0.0;
			static float fLastTime;
			float dt;
			float fRate = Bench_GetPowerPlay() ? 4.0 : 8.0;
			float fBounds = Bench_GetPowerPlay() ? 8.0 : 15.0;

			dt = gHUD.m_flTime - fLastTime;
			if ( dt > 0.0 && dt < 1.0 )
			{
				fZAdjust += gEngfuncs.pfnRandomFloat( -fRate, fRate );
				fZAdjust = min( fBounds, fZAdjust );
				fZAdjust = max( -fBounds, fZAdjust );

				ent->origin[2] += fZAdjust;

				g_fZAdjust = fZAdjust;
			}
			fLastTime = gHUD.m_flTime;
		}
	}
}
Beispiel #3
0
int CHudBenchmark::Bench_ScoreForValue( int stage, float raw )
{
	int	score = 100.0;
	int power_play = Bench_GetPowerPlay() ? 1 : 0;
	
	switch ( stage )
	{
	case FIRST_STAGE:  // ping
		score = 100.0 * ( m_StoredLatency );
		score = max( score, 0 );
		score = min( score, 100 );

		// score is inverted
		score = 100 - score;

		break;
	case SECOND_STAGE:  // framerate/performance
		score = (int)( 100 * m_fAvgFrameRate ) / 72;
		score = min( score, 100 );
		score = max( score, 0 );

		score *= BENCH_RANGE/100.0;
		if ( power_play )
		{
			score += ( 100 - BENCH_RANGE );
		}
		break;
	case THIRD_STAGE:  // tracking
		score = (100 * m_fAvgScore) / 40;
		score = max( score, 0 );
		score = min( score, 100 );

		// score is inverted
		score = 100 - score;

		score *= BENCH_RANGE/100.0;
		if ( power_play )
		{
			score += ( 100 - BENCH_RANGE );
		}
		break;

		//TODO: missing fourth stage?
	}

	return score;
}
Beispiel #4
0
//TODO: this looks an awful lot like the function above. Consider refactoring - Solokiller
void HUD_CreateBenchObjects( const Vector& origin )
{
	static cl_entity_t bench[ NUM_BENCH_OBJ ];
	cl_entity_t *player;
	Vector forward, right, up;
	Vector farpoint;
	Vector centerspot;
	static int first = true;
	static int failed = false;
	static float last_time;
	float frametime;
	float frac;
	float frac2;
	float dt;

	pmtrace_t tr;
	int i = 0;

	if ( gHUD.m_flTime == last_time )
		return;

	frametime = gHUD.m_flTime - last_time;
	last_time = gHUD.m_flTime;

	if ( frametime <= 0.0 )
		return;

	if ( failed )
		return;

	player = gEngfuncs.GetLocalPlayer();
	if ( !player )
	{
		failed = true;
		return;
	}

	if ( first )
	{
		first = false;
		
		if ( !HUD_SetupBenchObjects( bench, player->index - 1, origin ) )
		{
			failed = true;
			return;
		}
	}

	gEngfuncs.pEventAPI->EV_SetUpPlayerPrediction( false, true );

	// Store off the old count
	gEngfuncs.pEventAPI->EV_PushPMStates();

	// Now add in all of the players.
	gEngfuncs.pEventAPI->EV_SetSolidPlayers ( player->index - 1 );	

	gEngfuncs.pEventAPI->EV_SetTraceHull( 2 );

	dt = gHUD.m_flTime - g_flStartTime;
	if ( dt < 0 )
		return;

	frac = dt / BENCH_CYCLE_TIME;
	if ( frac > 1.0 )
	{
		frac = frac - (float)(int)frac;
	}

	frac2 = dt /BENCH_INNER_CYCLE_TIME;
	if ( frac2 > 1.0 )
	{
		frac2 = frac2 - (float)(int)frac2;
	}

	// Determine forward vector
	AngleVectors ( vec3_origin, forward, right, up );

	centerspot = origin;
	centerspot[2] -= 512;

	gEngfuncs.pEventAPI->EV_PlayerTrace( origin, centerspot, PM_NORMAL, -1, &tr );

	centerspot = tr.endpos;
	centerspot[2] += BENCH_BALLHEIGHT;

	// Move center out from here
	centerspot = centerspot + BENCH_VIEW_OFFSET * forward;

	for ( i = 0; i < NUM_BENCH_OBJ; i++ )
	{
		int j;
		float jitter = 0.0;
		float jfrac;
		float offset;
		float ofs_radius = 5.0;

		Vector ang;
		offset = ( float ) i / (float) ( NUM_BENCH_OBJ - 1 );

		ang[ 0 ] = 0;
		ang[ 2 ] = 0;
		ang[ 1 ] = BENCH_SWEEP * offset + frac * 360.0;
		// normalize
		ang = ang.Normalize();

		// Determine forward vector
		AngleVectors ( ang, forward, right, up );

		// Get a far point for ray trace
		farpoint = centerspot + ( BENCH_RADIUS + ofs_radius * sin( BENCH_SWEEP * offset + frac2 * 2 * M_PI ) ) * forward;
		farpoint[2] += 10 * cos( BENCH_SWEEP * offset + frac2 * 2 * M_PI );

		gEngfuncs.pEventAPI->EV_PlayerTrace( centerspot, farpoint, PM_NORMAL, -1, &tr );

		// Add angular velocity
		VectorMA( bench[ i ].curstate.angles, frametime, bench[ i ].baseline.angles, bench[ i ].curstate.angles );

		bench[ i ].curstate.angles = bench[ i ].curstate.angles.Normalize();
		
		jfrac = ( (float)gHUD.m_Benchmark.GetObjects() / (float)NUM_BENCH_OBJ );

		// Adjust velocity
		//bench[ i ].curstate.velocity[ 2 ] -= bench[ i ].curstate.gravity * frametime * 800;

		/*
		// Did we hit something?
		if ( tr.fraction != 1.0 && !tr.inwater )
		{
			float damp;
			float proj;
			Vector traceNormal;
			int j;

			traceNormal = tr.plane.normal;

			damp = 0.9;

			// Reflect velocity
			if ( damp != 0 )
			{
				proj = DotProduct( bench[ i ].curstate.velocity, traceNormal );
				VectorMA( bench[ i ].curstate.velocity, -proj*2, traceNormal, bench[ i ].curstate.velocity );
				// Reflect rotation (fake)

				for ( j = 0 ; j < 3; j++ )
				{
					if ( bench[ i ].curstate.velocity[ j ] > 1000.0 )
					{
						bench[ i ].curstate.velocity[ j ] = 1000.0;
					}
					else if ( bench[ i ].curstate.velocity[ j ] < -1000.0 )
					{
						bench[ i ].curstate.velocity[ j ] = -1000.0;
					}
				}

				bench[ i ].baseline.angles[1] = -bench[ i ].baseline.angles[1];

				bench[ i ].curstate.velocity = bench[ i ].curstate.velocity * damp;
			}
		}
		*/

		if ( i == ( NUM_BENCH_OBJ - 1 ) )
		{
			g_aimorg = tr.endpos;
		}

		if ( Bench_GetPowerPlay() )
		{
			jitter = 0.5;
		}
		else
		{
			jitter = 8.0;
		}
				
		jitter *= jfrac;

		for ( j = 0; j < 2; j++ )
		{
			tr.endpos[ j ] += gEngfuncs.pfnRandomFloat( -jitter, jitter );
		}

		// Add to visedicts list for rendering
		// Move dot to trace endpoint
		bench[ i ].origin			= tr.endpos;
		bench[ i ].curstate.origin = bench[ i ].origin;
		bench[ i ].angles = bench[ i ].curstate.angles;

		// Force no interpolation, etc., probably not necessary
		bench[ i ].prevstate		= bench[ i ].curstate;

		if ( ( NUM_BENCH_OBJ - i - 1 ) < gHUD.m_Benchmark.GetObjects() )
		{
			if ( bench[ i ].curstate.renderamt == 255 )
			{
				bench[i].curstate.rendermode = kRenderNormal;
			}
			else
			{
				bench[i].curstate.renderamt += BLEND_IN_SPEED * frametime;
				bench[i].curstate.renderamt = min( 255, bench[i].curstate.renderamt );
				bench[i].curstate.rendermode = kRenderTransAlpha;
			}

			gEngfuncs.CL_CreateVisibleEntity( ET_NORMAL, &bench[ i ] );
		}
	}

	gEngfuncs.pEventAPI->EV_PopPMStates();
}
Beispiel #5
0
bool CHudBenchmark::Draw( float flTime )
{
	char sz[ 256 ];
	int x, y;

	if ( m_fDrawTime < flTime || !Bench_Active() )
	{
		m_iFlags &= ~HUD_ACTIVE;
		return true;
	}

	x = 10;
	y = 25; //480 - 150;

	sprintf( sz, "%s: %s", g_title , pp_strings[ Bench_GetPowerPlay() ? 0 : 1]);

	gHUD.DrawHudString( x, y, 320, sz, 251, 237, 7);// , 200, 200); //255, 255, 255 );

	y += 20;
	
//	sprintf( sz, pp_strings[ Bench_GetPowerPlay() ? 0 : 1 ] );

//	gHUD.DrawHudString( x, y, 320, sz, 31, 200, 200 );

//	y += 20;

	
	if ( Bench_InStage( FIRST_STAGE) /*|| Bench_InStage( SECOND_STAGE ) || Bench_InStage( THIRD_STAGE )*/ || Bench_InStage( FOURTH_STAGE ) )
	{
		if ( m_fReceiveTime && m_nSentFinish )
		{
			sprintf( sz, g_stage1[1], Bench_ScoreForValue( FIRST_STAGE, m_StoredLatency ));
		}
		else
		{
			strcpy( sz, g_stage1[0] );
		}
		gHUD.DrawHudString( x, y, 320, sz, 255, 255, 255 );

		y += 20;

	}


	if ( Bench_InStage( SECOND_STAGE )/* || Bench_InStage( THIRD_STAGE )*/ || Bench_InStage( FOURTH_STAGE ) )
	{
		float avg = 0.0;
		
		if ( m_nFPSCount > 0 )
		{
			avg = m_fAverageFT / (float)m_nFPSCount;
			m_fAvgFrameRate = 1.0 / avg;
		}

		if ( m_nSentFinish /* Bench_InStage( THIRD_STAGE ) */|| Bench_InStage( FOURTH_STAGE ) )
		{
			sprintf( sz, g_stage2[1], Bench_ScoreForValue( SECOND_STAGE, m_fAvgFrameRate ) );
		}
		else
		{
			strcpy( sz, g_stage2[0] );
		}
		gHUD.DrawHudString( x, y, 320, sz, 255, 255, 255 );
		y += 20;
	}


	if ( Bench_InStage( THIRD_STAGE ) || Bench_InStage( FOURTH_STAGE ) )
	{
		if ( m_nSentFinish || Bench_InStage( FOURTH_STAGE ) )
		{
			sprintf( sz, g_stage3[1], Bench_ScoreForValue( THIRD_STAGE, m_fAvgScore ) );
		}
		else
		{
			strcpy( sz, g_stage3[0] );
		}

		gHUD.DrawHudString( x, y, 320, sz, 255, 255, 255 );

		y += 20;
	}

	if ( Bench_InStage( FOURTH_STAGE ) )
	{
		sprintf( sz, g_stage4, m_nCompositeScore );
		gHUD.DrawHudString( x, y, 320, sz, 31, 200, 200 );
	}

	m_fDrawTime = gHUD.m_flTime + BENCH_TIME;

	return true;
}