Beispiel #1
0
float
vsPerlinOctave::InterpolatedNoise2D(float x, float y, int wrap)
{
	int integer_X    = vsFloor(x);
	float fractional_X = x - integer_X;

	int integer_Y    = vsFloor(y);
	float fractional_Y = y - integer_Y;

	vsAssert( fractional_X >= 0.f && fractional_X < 1.f, "Maths error:  fractional_X out of bounds!" );
	vsAssert( fractional_Y >= 0.f && fractional_Y < 1.f, "Maths error:  fractional_Y out of bounds!" );

	fractional_X = (3.0f * fractional_X * fractional_X) - (2.0f * fractional_X * fractional_X * fractional_X);
	fractional_Y = (3.0f * fractional_Y * fractional_Y) - (2.0f * fractional_Y * fractional_Y * fractional_Y);

	float v1 = Noise2D(integer_X,     integer_Y, wrap);
	float v2 = Noise2D(integer_X + 1, integer_Y, wrap);
	float v3 = Noise2D(integer_X,     integer_Y + 1, wrap);
	float v4 = Noise2D(integer_X + 1, integer_Y + 1, wrap);

	float i1 = vsInterpolate(fractional_X, v1 , v2);
	float i2 = vsInterpolate(fractional_X, v3 , v4);

	return vsInterpolate(fractional_Y, i1 , i2);
}
void
rpFader::DynamicDraw( vsRenderQueue *queue )
{
	vsDisplayList *list = queue->MakeTemporaryBatchList(m_material, queue->GetMatrix(), 10 * 1024);
	vsVector2D tl = vsSystem::GetScreen()->GetScene(2)->GetTopLeftCorner();
	vsVector2D br = vsSystem::GetScreen()->GetScene(2)->GetBottomRightCorner();

	vsVector2D v[4];

	switch ( m_fadeType )
	{
		case 0:
		{
			float x = vsInterpolate( m_alpha, tl.x, br.x );
			v[0] = tl;
			v[1].Set(x, tl.y);
			v[2].Set(x, br.y);
			v[3].Set(tl.x,br.y);
			break;
		}
		case 1:
		{
			float x = vsInterpolate( m_alpha, br.x, tl.x );
			v[0].Set(x, tl.y);
			v[1].Set(br.x, tl.y);
			v[2].Set(br.x, br.y);
			v[3].Set(x,br.y);
			break;
		}
		case 2:
		{
			float y = vsInterpolate( m_alpha, tl.y, br.y );
			v[0] = tl;
			v[1].Set(br.x, tl.y);
			v[2].Set(br.x, y);
			v[3].Set(tl.x, y);
			break;
		}
		case 3:
		{
			float y = vsInterpolate( m_alpha, br.y, tl.y );
			v[0].Set(tl.x, br.y);
			v[1].Set(br.x, br.y);
			v[2].Set(br.x, y);
			v[3].Set(tl.x, y);
			break;
		}
	}

	int indices[4] = { 0, 1, 2, 3 };

	list->SetColor( vsColor(0.f,0.f,0.f,1.f) );
	list->VertexArray(v,4);
	list->TriangleFan(indices,4);
}
void
astPlayerShip::HandleSpawnTimer( float timeStep )
{
	m_timeSinceSpawn += timeStep;

	const float c_invulnerableTime = 3.0f;	// three seconds of invulnerability

	if ( m_spawnInvulnerable )
	{
		float scale = 1.0f;
		vsColor c = vsColor::Blue;
		if ( m_timeSinceSpawn > c_invulnerableTime )
		{
			SetCollisionsActive(true);
			m_spawnInvulnerable = false;
		}
		else if ( m_timeSinceSpawn > 2.0f )
		{
			float frac = (m_timeSinceSpawn - 2.0f);

			float theta = frac * TWOPI;
			float pulseAmt = vsFabs(vsSin(theta));

			c = vsInterpolate(pulseAmt, vsColor::LightBlue, vsColor::White);
		}
		else if ( m_timeSinceSpawn > 1.0f )
		{
			float frac = (m_timeSinceSpawn - 1.0f);

			float theta = frac * TWOPI;
			float pulseAmt = vsFabs(vsSin(theta));

			c = vsInterpolate(pulseAmt, vsColor::LightBlue, vsColor::White);
		}
		else
		{
			c = vsInterpolate(m_timeSinceSpawn, vsColor::Black, vsColor::LightBlue);
		}

		const float c_scaleTime = 3.0f;
		if ( m_timeSinceSpawn < c_scaleTime )
		{
			float frac = m_timeSinceSpawn / c_scaleTime;
			frac = 1.0f - ((frac-1.f) * (frac-1.f));									// slam in, ease out
			//frac = (3.0f * frac * frac) - (2.0f * frac * frac * frac);			// ease in, ease out

			scale = vsInterpolate( frac, 5.0f, 1.0f );
		}

		SetColor(c);
		m_transform.SetScale( vsVector2D(scale,scale) );
	}
}
Beispiel #4
0
float
vsSpline3D::TimeAtLength(float target)
{
	// let's take 100 samples, and take the linear distance.
	float distance = 0.f;
	float timeCursor = 0.f;
	vsVector3D cursor = m_start;
	while ( timeCursor < 1.f )
	{
		float nextTime = timeCursor + 0.01f;
		vsVector3D next = PositionAtTime(nextTime);
		float thisDistance = (cursor - next).Length();

		if ( distance + thisDistance > target )
		{
			// we've gone too far!  Interpolate.
			float fraction = vsProgressFraction( target, distance, distance + thisDistance );
			timeCursor = vsInterpolate( fraction, timeCursor, nextTime );
			break;
		}
		distance += thisDistance;
		cursor = next;
		timeCursor = nextTime;
	}
	return timeCursor;
}
vsTransform2D
sstSequence::GetTransformAtTime( float time )
{
	float timeFraction = (time - m_start) / ( m_end - m_start );

	return vsInterpolate( timeFraction, m_transformA, m_transformB );
}
void
sstSequence::Draw( vsRenderQueue *queue )
{
	vsDisplayList *list = queue->GetGenericList();

	float musicTime = m_mode->GetMusicTime();
//	vsColor baseColor = vsColor::Blue;
//	vsColor c = vsColor::Blue;
	for ( int i = 0; i < m_beatCount; i++ )
		m_segment[i].m_color = vsColor::Blue * GetBrightnessForTimeDelta( musicTime - m_segment[i].m_time );

	float starBrightness = 0.5f;

	float starFadeInTime = 2.0f;
	float starFadeOutTime = 2.0f;

	if ( musicTime < m_start + starFadeInTime )
	{
		starBrightness = vsInterpolate( (musicTime-m_start) / starFadeInTime, 0.f, starBrightness );
	}
	else if ( musicTime < m_end - starFadeOutTime )
	{
		starBrightness = 0.5f;
	}
	else
	{
		float startFadingOutTime = m_end - starFadeOutTime;

		starBrightness = vsInterpolate( (musicTime-startFadingOutTime) / starFadeOutTime, starBrightness, 0.f );
	}

	list->SetColor( vsColor(1.0f, 1.0f, 1.0f, starBrightness) );
	for ( int i = 0; i < m_beatCount; i++ )
	{
		DrawStar( list, i );
	}

	for ( int i = 0; i < m_beatCount; i++ )
	{
		DrawTarget( list, i );

		if ( i < m_beatCount-1 )
		{
			DrawConnectingLine( list, i, i+1 );
		}
	}
}
Beispiel #7
0
float
vsPerlinOctave::InterpolatedNoise1D(float x)
{
	int integer_X		= int(x);
	float fractional_X	= x - integer_X;

	vsAssert( fractional_X >= 0.f && fractional_X < 1.f, "Maths error:  fractional_X out of bounds!" );

	fractional_X = (3.0f * fractional_X * fractional_X) - (2.0f * fractional_X * fractional_X * fractional_X);

	float v1 = SmoothedNoise1D(integer_X);
	float v2 = SmoothedNoise1D(integer_X + 1);

	return vsInterpolate(fractional_X, v1 , v2);
}
void
astHud::Update(float timeStep)
{
	if ( m_fading )
	{
		m_fadeTimer += timeStep;

		if ( m_fadeTimer > 1.0f )
		{
			m_fadeTimer = 1.0f;
			m_fading = false;
		}

		m_opacity = vsInterpolate( m_fadeTimer, m_fadingFrom, m_fadingTo );
	}
}
void
rpFader::Update( float timeStep )
{
	if ( m_fading )
	{
		m_timer += timeStep;

		if ( m_timer > m_fadeDuration )
		{
			m_alpha = m_endAlpha;
			m_fading = false;
		}
		else
		{
			m_alpha = vsInterpolate( m_timer / m_fadeDuration, m_startAlpha, m_endAlpha );
		}
	}
}
void
vsPhysicsEmitter::Update(float timeStep)
{
	for ( int i = 0; i < m_particleCount; i++ )
	{
		if ( m_particleInUse[i] )
		{
			m_particleLife[i] += timeStep;

			if ( m_particleLife[i] > m_particleLifetime )
			{
				m_particle[i]->SetCollisionsActive( false );
				m_particle[i]->Extract();

				m_particleLife[i] = 0.f;
				m_particleInUse[i] = false;
			}
			else
			{
				float amt = /*1.0f -*/ (m_particleLife[i] / m_particleLifetime);

				vsColor c = m_particleColor[i];

				//c.a = vsInterpolate( amt, c.a, 0.f );

				m_particle[i]->SetColor( vsInterpolate( amt, c, c_black ) );
			}
		}
	}


	m_hose += timeStep * m_spawnRate;

	while ( m_hose > 1.0f )
	{
		vsVector2D pos = m_position + vsRandom::GetVector2D( m_radius );
		vsVector2D vel = m_velocity + vsRandom::GetVector2D( m_velRadius );

		Spawn( pos, vel, m_color );

		m_hose -= 1.0f;
	}
}
void
daSplat::Update( float timeStep )
{
	m_timer -= timeStep;
	
	SetScale(vsVector2D(1.2f,1.2f));
	
	if ( m_timer <= 0.f )
	{
		Extract();	// despawn us.
	}
	else
	{
		vsColor grey(0.5f,0.5f,0.5f,1.0f);
		if ( m_timer > 1.0f )
			SetColor(grey);
		else
			SetColor( vsInterpolate( m_timer, vsColor::Black, grey ) );
	}
}
void
astPlayerShip::HandleThrusters( float timeStep )
{
	UNUSED(timeStep);

	vsInput *input = core::GetGame()->GetInput();

	ControlID thrusterControl[Thruster_MAX] =
	{
		CID_B,
		CID_LeftRightLAxis,
		CID_LeftRightLAxis
	};

	/*
	 SetColor 1.0 1.0 1.0 0.8
	 MoveTo -0.75 -1.8
	 LineTo 7.5 -3.0
	 LineTo 0.75 1.8
	 */

	for( int i = 0; i < Thruster_MAX; i++ )
	{
		float desired = input->GetState( thrusterControl[i] );
		float current = m_thrustAmt[i];

		if ( i == 1 )	// left
			desired = vsMax(0.f, -desired);
		else
			desired = vsMax(0.f, desired);

		m_thrustAmt[i] = vsInterpolate( 0.15f, current, desired );
	}

	m_thrust->m_transform.SetScale( m_thrustAmt[Thruster_Main], m_thrustAmt[Thruster_Main] );
	m_leftAttitude->m_transform.SetScale( m_thrustAmt[Thruster_Left], m_thrustAmt[Thruster_Left] );
	m_rightAttitude->m_transform.SetScale( -m_thrustAmt[Thruster_Right], m_thrustAmt[Thruster_Right] );

	m_rightRearAttitude->m_transform.SetScale( -m_thrustAmt[Thruster_Left], m_thrustAmt[Thruster_Left] );
	m_leftRearAttitude->m_transform.SetScale( m_thrustAmt[Thruster_Right], m_thrustAmt[Thruster_Right] );
}
void
vpDrawable::Draw( vsRenderQueue *queue )
{
	if ( m_toDelete )
		return;

	if ( m_sampleCount >= 2 )
	{
		vsDisplayList *list = queue->GetGenericList();

		if ( m_drawing )
		{
			vsColor c = m_color;
			float pulse = m_colorPulse;
			c.a = pulse;

			list->SetColor(c);
			int i = 0;
			list->MoveTo( m_samplePos[i] );

			for ( i = 1; i < m_sampleCount; i++ )
			{
				pulse -= (1.0f/30.0f);
				if ( pulse < 0.0f )
					pulse += 1.0f;
				c.a = vsInterpolate(pulse, 0.8f, 0.3f);
				list->SetColor(c);

				list->LineTo(m_samplePos[i]);
			}
		}
		else
		{
			//list->SetShader(m_shader);
			if ( m_hilighted )
				list->SetColor(vsColor::Red);
			else
				list->SetColor(m_color);

			if ( m_drawMode == DrawMode_Rope )
			{
				list->MoveTo( m_object[0]->GetPosition() );
				for ( int i = 1; i < m_objectCount; i++ )
				{
					list->LineTo( m_object[i]->GetPosition() );
				}
			}
			else	// static
			{
				vsTransform2D t;
				t.SetTranslation( m_object[0]->GetPosition() );
				t.SetAngle( m_object[0]->GetAngle() );

				list->PushTransform(t);
				list->VertexArray( m_samplePos, m_sampleCount );
				list->LineStrip( m_optimisedIndex, m_optimisedIndexCount );
				list->PopTransform();
			}
			//list->SetShader(NULL);
		}
	}
}
void
sstFireworks::Draw( vsRenderQueue *queue )
{
/*	vsVector2D tl(-3.f,-3.f);
	vsVector2D tr(3.f,-3.f);
	vsVector2D bl(-3.f,3.f);
	vsVector2D br(3.f,3.f);*/
	
	vsDisplayList *list = queue->GetGenericList();
	
	vsColor c;
	vsVector2D pos;
	vsVector2D dest;
	
	sstFireworkParticle *p = m_usedList->m_next;
	int i = 0;
	
	while( p && p != m_usedList )
	{
		float backVelTime = 0.5f;
		if ( p->m_life < backVelTime )
			backVelTime = p->m_life;
		pos = p->m_position;
		dest = pos - (p->m_velocity * backVelTime);
		float lifeFraction = p->m_life / p->m_lifeTime;
		
		c = vsInterpolate( lifeFraction, p->m_color, vsColor::Black );
		
		m_vertexArray[i] = pos;
		m_vertexArray[i+1] = dest;
		m_colorArray[i] = c;
		m_colorArray[i+1].Set(c.r,c.g,c.b,0.f);
		m_indexArray[i] = i;
		m_indexArray[i+1] = i+1;
		
		i+=2;
		
/*		list->SetColor( c );
		
		list->MoveTo( pos );
		c.a = 0.0f;
		list->SetColor( c );
		list->LineTo( dest );*/
		
		p = p->m_next;
	}
	
	if ( i > 0 )
	{
		m_vertexBuffer->SetArray(m_vertexArray,i);
		m_colorBuffer->SetArray(m_colorArray,i);
		m_indexBuffer->SetArray(m_indexArray,i);
		
		list->VertexBuffer(m_vertexBuffer);
		list->ColorBuffer(m_colorBuffer);
		list->LineListBuffer(m_indexBuffer);
		
//		list->VertexArray(m_vertexArray, i);
//		list->ColorArray(m_colorArray, i);
		
//		list->LineList(m_indexArray, i);
		list->ClearColorArray();
		list->ClearVertexArray();
	}
}
void
rpModeCredits::Update( float timeStep )
{
	int activeLines = 0;
	for ( int i = 0; i < MAX_CREDIT_LINES; i++ )
	{
		if ( m_lineUsed[i] )
			activeLines++;
	}

	const float c_creditsScrollSpeed = 50.0f;	// 50 'units' per second
	const float c_creditLineSpacing = 50.0f;
	float top = vsSystem::GetScreen()->GetScene(1)->GetTopLeftCorner().y - 50.0f;

	m_creditsPos += (timeStep * c_creditsScrollSpeed);

	for ( int i = 0; i < MAX_CREDIT_LINES; i++ )
	{
		if ( m_lineUsed[i] )
		{
			float yCoord = m_lineId[i] * c_creditLineSpacing;
			yCoord -= m_creditsPos;

			if ( m_creditsDone && m_lineId[i] == m_lineCount-1 && yCoord < top )
				m_fadingOut = true;

			if ( m_creditsDone && m_lineId[i] == m_lineCount-1 )	// last line
				yCoord = vsMax( yCoord, 0.f );	// last line doesn't go past halfway.

			if ( yCoord < top )
				LoadLine(i);
			else
				m_line[i]->SetPosition( vsVector2D(0.f, yCoord) );
		}
		else if ( !m_creditsDone )
			LoadLine(i);
	}

	if ( m_game->GetInput()->WasPressed(CID_A) )
		m_fadingOut = true;

	if ( m_fadingOut )
	{
		m_fadingTimer += timeStep;
		const float c_fadeDuration = 2.0f;
		float frac = m_fadingTimer / c_fadeDuration;
		vsColor c = vsColor::Black;

		if ( !m_inittedFade )
		{
			//m_game->FadeOutMusic( c_fadeDuration );
			m_inittedFade = true;
		}

		if ( frac < 1.0f )
		{
			c = vsInterpolate( frac, vsColor::LightBlue, vsColor::Black );

			for ( int i = 0; i < MAX_CREDIT_LINES; i++ )
			{
				if ( m_lineUsed[i] )
				{
					m_line[i]->SetColor(c);
				}
			}
		}
		else
		{
			return core::SetExit();
		}
	}
}
void
daModeTitleScreen::Update( float timeStep )
{
	UNUSED(timeStep);
	
	if ( m_menu->GetHilitedItem() != m_menuItemSelected )
	{
		m_menuItemSelected = m_menu->GetHilitedItem();
		m_menuThump->Play();
	}
	
	if ( m_transitioningIn || m_transitioningOut )
	{
		
		m_transitionTimer += timeStep;
		
		if ( m_transitionTimer > c_transitionDuration )
		{
			m_transitionTimer = c_transitionDuration;
			if ( m_transitioningOut )
			{
				if ( m_transitioningOutTo == NewGame )
					m_game->SetMode(daGame::Mode_InGame);	// Mode_LevelSelect?  Are levels appropriate for this game?
				if ( m_transitioningOutTo == Options )
					m_game->GoToPreferences();
				if ( m_transitioningOutTo == Credits )
					m_game->SetMode(daGame::Mode_Credits);
				else if ( m_transitioningOutTo == HowToPlay )
					m_game->SetMode(daGame::Mode_Tutorial);
				
				return;
			}
			m_transitioningIn = false;
			m_transitioningOut = false;
		}
		
		float timer = m_transitionTimer;
		if ( m_transitioningOut )
			timer = c_transitionDuration - m_transitionTimer;
		
		float transitionFraction = timer / c_transitionDuration;
		transitionFraction = (3.0f * transitionFraction * transitionFraction) - (2.0f * transitionFraction * transitionFraction * transitionFraction);
		
		m_menu->SetPosition( vsInterpolate(transitionFraction, m_iniMenuPos, menuPos) );
		m_title->SetPosition( vsInterpolate(transitionFraction, m_iniTitlePos, titlePos) );
		m_title->SetColor( vsInterpolate(transitionFraction, vsColor::Black, vsColor::Red) );
	}
	
	if ( !m_transitioningIn && !m_transitioningOut )
	{
		if ( m_menu->WasActionTaken() )
		{
			utMenuAction a = m_menu->GetAction();
			
			if ( a.type == utMenuAction::Type_Select )
			{
				switch( a.menuItemId )
				{
					case NewGame:
						StartTransitionOut();
						m_transitioningOutTo = NewGame;
						break;
					case HowToPlay:
						StartTransitionOut();
						m_transitioningOutTo = HowToPlay;
						//m_game->GetHowToPlayScreen()->Show(true);
						m_game->FadeOutMusic(c_transitionDuration);
						break;
					case Options:
						StartTransitionOut();
						m_transitioningOutTo = Options;
						m_game->FadeOutMusic(c_transitionDuration);
						break;
					case Credits:
						StartTransitionOut();
						m_transitioningOutTo = Credits;
						m_game->FadeOutMusic(c_transitionDuration);
						break;
					case Quit:
						core::SetExitToMenu();
						break;
					default:
						break;
				}
			}
		}
	}
}
void
ctCameraScript_LerpFollow::Update( float timeStep )
{
	m_position = vsInterpolate( 0.1f, m_position, m_targetPosition );
}