// Handles the WM_KEYDOWN message
LRESULT CApplication::OnKeyDown(WPARAM wParam)
{
    LRESULT lr = 0;

    if (_state == CApplication::VIEW_STATE::ZOOMEDOUT)
    {
        if (wParam == '1' && _currentVisual != 0)
        {
            lr = UpdateVisuals(_currentVisual, 0);
            _currentVisual = 0;
        }

        else if (wParam == '2' && _currentVisual != 1)
        {
            lr = UpdateVisuals(_currentVisual, 1);
            _currentVisual = 1;
        }

        else if (wParam == '3' && _currentVisual != 2)
        {
            lr = UpdateVisuals(_currentVisual, 2);
            _currentVisual = 2;
        }

        else if (wParam == '4' && _currentVisual != 3)
        {
            lr = UpdateVisuals(_currentVisual, 3);
            _currentVisual = 3;
        }
    }

    return lr;
}
示例#2
0
/*
================
rvEffect::UpdateChangeableSpawnArgs
================
*/
void rvEffect::UpdateChangeableSpawnArgs( const idDict *source ) {
    const char* fx;
    const idDecl *newEffect;
    bool		newLoop;

    idEntity::UpdateChangeableSpawnArgs(source);
    if ( !source ) {
        return;
    }

    if ( source->GetString ( "fx", "", &fx ) && *fx ) {
        newEffect = ( const idDecl * )declManager->FindEffect( fx );
    } else {
        newEffect = NULL;
    }

    idVec3 color;
    source->GetVector( "_color", "1 1 1", color );
    renderEntity.shaderParms[ SHADERPARM_RED ]	 = color[0];
    renderEntity.shaderParms[ SHADERPARM_GREEN ] = color[1];
    renderEntity.shaderParms[ SHADERPARM_BLUE ]	 = color[2];
    renderEntity.shaderParms[ SHADERPARM_ALPHA ] = source->GetFloat ( "_alpha", "1" );
    renderEntity.shaderParms[ SHADERPARM_BRIGHTNESS ] = source->GetFloat ( "_brightness", "1" );
    if ( clientEffect ) {
        clientEffect->SetColor ( idVec4(color[0],color[1],color[2],renderEntity.shaderParms[ SHADERPARM_ALPHA ]) );
        clientEffect->SetBrightness ( renderEntity.shaderParms[ SHADERPARM_BRIGHTNESS ] );
    }

    source->GetBool ( "loop", "0", newLoop );

    spawnArgs.Copy( *source );

    // IF the effect handle has changed or the loop status has changed then restart the effect
    if ( newEffect != effect || loop != newLoop ) {
        Stop ( false );

        loop = newLoop;
        effect = newEffect;

        if ( effect ) {
            Play ( );
            BecomeActive( TH_THINK );
            UpdateVisuals();
        } else {
            BecomeInactive ( TH_THINK );
            UpdateVisuals();
        }
    }
}
示例#3
0
void idTrembler::Arm( void )
{
	if ( !itemEnt.IsValid() )
	{
		idStr itemName = spawnArgs.GetString( "itemname", "" );
		if ( itemName.Length() )
		{
			itemEnt = gameLocal.FindEntity( itemName );

			if (!itemEnt.IsValid())
			{
				common->Warning("idTrembler %s couldn't find item '%s'.", name.c_str(), itemName.c_str());
			}
		}
		else
		{
			common->Warning("idTrembler %s has no 'itemname' value.", name.c_str());
		}
	}

	if (itemEnt.IsValid())
	{
		itemOriginalPosition = itemEnt.GetEntity()->GetPhysics()->GetOrigin();
	}

	state = 0;

	renderEntity.shaderParms[ SHADERPARM_RED ] = 1;
	renderEntity.shaderParms[ SHADERPARM_GREEN ] = 1;
	renderEntity.shaderParms[ SHADERPARM_BLUE ] = 0;
	UpdateVisuals();
}
示例#4
0
void hhFuncEmitter::ReadFromSnapshot( const idBitMsgDelta &msg ) {
	renderEntity.shaderParms[ SHADERPARM_PARTICLE_STOPTIME ] = msg.ReadFloat();
	renderEntity.shaderParms[ SHADERPARM_TIMEOFFSET ] = msg.ReadFloat();
	if ( msg.HasChanged() ) {
		UpdateVisuals();
	}
}
示例#5
0
void hhShuttleForceField::ReadFromSnapshot( const idBitMsgDelta &msg ) {
	int contents = msg.ReadBits(32);
	if (contents != GetPhysics()->GetContents()) {
		GetPhysics()->SetContents(contents);
	}

	nextCollideFxTime = msg.ReadBits(32);
	fieldState = (States)msg.ReadBits(8);

	fade.SetStartTime(msg.ReadFloat());
	fade.SetDuration(msg.ReadFloat());
	fade.SetStartValue(msg.ReadFloat());
	fade.SetEndValue(msg.ReadFloat());

	float f;
	bool changed = false;
	
	f = msg.ReadFloat();
	changed = (changed || (renderEntity.shaderParms[SHADERPARM_TIMEOFFSET] != f));
	renderEntity.shaderParms[SHADERPARM_TIMEOFFSET] = f;
	
	f = msg.ReadFloat();
	changed = (changed || (renderEntity.shaderParms[SHADERPARM_MODE] != f));
	renderEntity.shaderParms[SHADERPARM_MODE] = f;

	if (changed) {
		UpdateVisuals();
	}
}
示例#6
0
END_CLASS

/*
==============
sdSnowEffect::Spawn
==============
*/
void				sdSnowEffect::Spawn( void ) {
    renderEntity_t *re = GetRenderEntity();

    re->numInsts = MAX_GROUPS;
    re->insts = new sdInstInfo[ re->numInsts ];

    idVec3 zero;
    idMat3 I;
    zero.Zero();
    I.Identity();
    this->SetPosition( zero, I );

    idBounds modelbb = re->hModel->Bounds();
    idVec3 extents = (modelbb.GetMaxs() - modelbb.GetMins()) * 0.5f;
    idPlayer *p = gameLocal.GetLocalViewPlayer();
    idVec3 const &v = p->GetViewPos();

    for (int i=0; i<MAX_GROUPS; i++) {
        groups[i].time = -1.f;
    }

    BecomeActive( TH_THINK );
    UpdateVisuals();
}
示例#7
0
/*
================
idSecurityCamera::SetAlertMode
================
*/
void idSecurityCamera::SetAlertMode( int alert ) {
	if( alert >= SCANNING && alert <= ACTIVATED ) {
		alertMode = alert;
	}
	renderEntity.shaderParms[ SHADERPARM_MODE ] = alertMode;
	UpdateVisuals();
}
示例#8
0
/*
================
idExplodingBarrel::Event_Respawn
================
*/
void idExplodingBarrel::Event_Respawn() {
	int i;
	int minRespawnDist = spawnArgs.GetInt( "respawn_range", "256" );
	if ( minRespawnDist ) {
		float minDist = -1;
		for ( i = 0; i < gameLocal.numClients; i++ ) {
			if ( !gameLocal.entities[ i ] || !gameLocal.entities[ i ]->IsType( idPlayer::Type ) ) {
				continue;
			}
			idVec3 v = gameLocal.entities[ i ]->GetPhysics()->GetOrigin() - GetPhysics()->GetOrigin();
			float dist = v.Length();
			if ( minDist < 0 || dist < minDist ) {
				minDist = dist;
			}
		}
		if ( minDist < minRespawnDist ) {
			PostEventSec( &EV_Respawn, spawnArgs.GetInt( "respawn_again", "10" ) );
			return;
		}
	}
	const char *temp = spawnArgs.GetString( "model" );
	if ( temp && *temp ) {
		SetModel( temp );
	}
	health = spawnArgs.GetInt( "health", "5" );
	fl.takedamage = true;
	physicsObj.SetOrigin( spawnOrigin );
	physicsObj.SetAxis( spawnAxis );
	physicsObj.SetContents( CONTENTS_SOLID );
	physicsObj.DropToFloor();
	state = NORMAL;
	Show();
	UpdateVisuals();
}
示例#9
0
/*
==============
sdRainEffect::Think
==============
*/
void		sdRainEffect::Think( void ) {
	renderEntity_t *re = GetRenderEntity();
	if ( re->hModel == NULL ) {
		return;
	}

	idBounds modelbb = re->hModel->Bounds();
	idVec3 extents = (modelbb.GetMaxs() - modelbb.GetMins()) * 0.5f;

	idPlayer *p = gameLocal.GetLocalViewPlayer();
	idVec3 const &v = p->GetViewPos();
	int gridx = idMath::Ftoi( idMath::Floor(v.x / extents.x) );
	int gridy = idMath::Ftoi( idMath::Floor(v.y / extents.y) );

	idBounds bounds;
	bounds.Clear();
	sdInstInfo *inst = re->insts;
	for (int y=-1; y<=1; y++) {
		for (int x=-1; x<=1; x++) {
			idBounds bb2;
			inst->fadeOrigin = inst->inst.origin = idVec3( (x + gridx) * extents.x, (y + gridy) * extents.y, v.z );
			inst->inst.axis.Identity();
			inst->maxVisDist = 0;
			inst->minVisDist = 0.f;
			bb2 = modelbb.Translate( inst->inst.origin );
			bounds.AddBounds( bb2 );
			inst++;
		}
	}
	re->flags.overridenBounds = true;
	re->bounds = bounds;

	UpdateVisuals();
	Present();
}
示例#10
0
/*
============
sdGeneralMover::StartTimedMove
============
*/
void sdGeneralMover::StartTimedMove( int from, int to, int ms, int startTime ) {
	if( from < 0 || from >= _positions.Num() || to < 0 || to >= _positions.Num() ) {
		gameLocal.Warning( "sdGeneralMover: one or more index out of range: from = %d, to = %d", from, to );
		return;
	}

	_curMove.startPos		= from;
	_curMove.endPos			= to;
	_curMove.moveTime		= ms;
	_curMove.startTime		= startTime;

	_physicsObj.StartMove(	_positions[ _curMove.startPos ].pos, _positions[ _curMove.endPos ].pos,
							_positions[ _curMove.startPos ].angles, _positions[ _curMove.endPos ].angles, _curMove.startTime, _curMove.moveTime );

	if ( gameLocal.isServer ) {
		sdEntityBroadcastEvent event( this, EVENT_MOVE );
		event.WriteLong( _curMove.startPos );
		event.WriteLong( _curMove.endPos );
		event.WriteLong( _curMove.moveTime );
		event.WriteLong( _curMove.startTime );
		event.Send( true, sdReliableMessageClientInfoAll() );
	}

	UpdateVisuals();
}
示例#11
0
/*
======================
idMoveableItem::ReadFromSnapshot
======================
*/
void idMoveableItem::ReadFromSnapshot(const idBitMsgDelta &msg)
{
	physicsObj.ReadFromSnapshot(msg);

	if (msg.HasChanged()) {
		UpdateVisuals();
	}
}
示例#12
0
/*
============
sdGeneralMover::Event_SetPosition
============
*/
void sdGeneralMover::Event_SetPosition( int index ) {
	if( index < 0 || index >= _positions.Num() ) {
		gameLocal.Warning( "sdGeneralMover::Event_SetPosition: index out of range: %d", index );
		return;
	}

	StartTimedMove( index, index, 0, gameLocal.time );
	UpdateVisuals();
}
示例#13
0
/*
================
sdWalker::Spawn
================
*/
void sdWalker::Spawn( void ) {
	animator.RemoveOriginOffset( true );
	animator.ClearAllAnims( gameLocal.time, 0 );
	animator.ClearAllJoints();
	int anim = animator.GetAnim( "base" );
	animator.PlayAnim( ANIMCHANNEL_TORSO, anim, gameLocal.time, 0 );
	animator.CreateFrame( gameLocal.time, true );

	LoadAF();

	LoadVehicleScript();

	if ( !spawnArgs.GetBool( "ik_disabled", "0" ) ) {
		LoadIK();
	}

	physicsObj.SetSelf( this );
	physicsObj.SetClipModel( new idClipModel( GetPhysics()->GetClipModel() ), 1.0f );
	physicsObj.SetMass( spawnArgs.GetFloat( "mass", "10000" ) );
	physicsObj.SetClipMask( MASK_VEHICLESOLID | CONTENTS_WALKERCLIP | CONTENTS_MONSTER );

	// move up to make sure the monster is at least an epsilon above the floor
	physicsObj.SetOrigin( GetPhysics()->GetOrigin() + idVec3( 0, 0, CM_CLIP_EPSILON ) );
	physicsObj.SetAxis( mat3_identity );
	
	idVec3 gravity = spawnArgs.GetVector( "gravityDir", "0 0 -1" );
	float gravityScale;
	if ( spawnArgs.GetFloat( "gravity", DEFAULT_GRAVITY_STRING, gravityScale ) ) {
		gravity *= gravityScale;
	} else {
		gravity *= g_gravity.GetFloat();		
	}

	physicsObj.SetGravity( gravity );
	SetPhysics( &physicsObj );

	BecomeActive( TH_THINK );

	physicsObj.SetMaxStepHeight( spawnArgs.GetFloat( "ik_maxStepSpeed", "1" ) );
	physicsObj.SetContents( CONTENTS_MONSTER );

	stompDamage			= gameLocal.declDamageType[ spawnArgs.GetString( "dmg_stomp" ) ];
	minStompScale		= spawnArgs.GetFloat( "stomp_min_scale" );
	maxStompScale		= spawnArgs.GetFloat( "stomp_max_scale" );
	stompSpeedScale		= spawnArgs.GetFloat( "stomp_speed_scale" );

	groundPoundMinSpeed	= spawnArgs.GetFloat( "ground_pound_min_speed", "200" );
	groundPoundForce	= spawnArgs.GetFloat( "ground_pound_force", "25000000" );
	groundPoundRange	= spawnArgs.GetFloat( "ground_pound_range", "512" );

	kickForce			= spawnArgs.GetFloat( "kick_force", "25000000" );

	UpdateVisuals();

	Present();
}
示例#14
0
/*
================
idLight::BecomeBroken
================
*/
void idLight::BecomeBroken( idEntity *activator ) {
	const char *damageDefName;

	fl.takedamage = false;

	if ( brokenModel.Length() ) {
		SetModel( brokenModel );

		if ( !spawnArgs.GetBool( "nonsolid" ) ) {
			GetPhysics()->SetClipModel( new idClipModel( brokenModel.c_str() ), 1.0f );
			GetPhysics()->SetContents( CONTENTS_SOLID );
		}
	} else if ( spawnArgs.GetBool( "hideModelOnBreak" ) ) {
		SetModel( "" );
		GetPhysics()->SetContents( 0 );
	}

	if ( gameLocal.isServer ) {

		ServerSendEvent( EVENT_BECOMEBROKEN, NULL, true, -1 );

		if ( spawnArgs.GetString( "def_damage", "", &damageDefName ) ) {
			idVec3 origin = renderEntity.origin + renderEntity.bounds.GetCenter() * renderEntity.axis;
			gameLocal.RadiusDamage( origin, activator, activator, this, this, damageDefName );
		}

	}

	ActivateTargets( activator );

	// offset the start time of the shader to sync it to the game time
	renderEntity.shaderParms[ SHADERPARM_TIMEOFFSET ] = -MS2SEC( gameLocal.time );
	renderLight.shaderParms[ SHADERPARM_TIMEOFFSET ] = -MS2SEC( gameLocal.time );

	// set the state parm
	renderEntity.shaderParms[ SHADERPARM_MODE ] = 1;
	renderLight.shaderParms[ SHADERPARM_MODE ] = 1;

	// if the light has a sound, either start the alternate (broken) sound, or stop the sound
	const char *parm = spawnArgs.GetString( "snd_broken" );
	if ( refSound.shader || ( parm && *parm ) ) {
		StopSound( SND_CHANNEL_ANY, false );
		const idSoundShader *alternate = refSound.shader ? refSound.shader->GetAltSound() : declManager->FindSound( parm );
		if ( alternate ) {
			// start it with no diversity, so the leadin break sound plays
			refSound.referenceSound->StartSound( alternate, SND_CHANNEL_ANY, 0.0, 0 );
		}
	}

	parm = spawnArgs.GetString( "mtr_broken" );
	if ( parm && *parm ) {
		SetShader( parm );
	}

	UpdateVisuals();
}
示例#15
0
/*
=====================
sdWalker::SetAxis
=====================
*/
void sdWalker::SetAxis( const idMat3& axis ) {
	viewAxis = axis;

	if ( vehicleControl ) {
		idAngles angles = axis.ToAngles();
		vehicleControl->OnYawChanged( angles.yaw );
	}

	UpdateVisuals();
}
示例#16
0
void hhProxDoorSection::ReadFromSnapshot( const idBitMsgDelta &msg ) {
	ReadBindFromSnapshot(msg);
	GetPhysics()->ReadFromSnapshot(msg);

	if (msg.HasChanged()) {
		Show();
		UpdateVisuals();
		Present();
		GetPhysics()->LinkClip();
	}
}
示例#17
0
void hhControlHand::ClientPredictionThink( void ) {
	RunPhysics();
	
	// HUMANHEAD pdm
	if (thinkFlags & TH_TICKER) {
		Ticker();
	}

	UpdateAnimation();
	UpdateVisuals();
	Present();
}
示例#18
0
/*
================
idLight::UpdateChangeableSpawnArgs
================
*/
void idLight::UpdateChangeableSpawnArgs( const idDict *source ) {
	idEntity::UpdateChangeableSpawnArgs( source );
	if( source ) {
		source->Print();
	}
	FreeSoundEmitter( true );
	gameEdit->ParseSpawnArgsToRefSound( source ? source : &spawnArgs, &refSound );
	if( refSound.shader && !refSound.waitfortrigger ) {
		StartSoundShader( refSound.shader, SND_CHANNEL_ANY, 0, false, NULL );
	}
	gameEdit->ParseSpawnArgsToRenderLight( source ? source : &spawnArgs, &renderLight );
	UpdateVisuals();
}
示例#19
0
/*
================
idExplodingBarrel::Event_Respawn
================
*/
void idExplodingBarrel::Event_Respawn() {
 	const char *temp = spawnArgs.GetString( "model" );
	if ( temp && *temp ) {
		SetModel( temp );
	}
	health = spawnArgs.GetInt( "health", "5" );
	fl.takedamage = (health > 0);
	physicsObj.SetOrigin( spawnOrigin );
	physicsObj.SetAxis( spawnAxis );
	physicsObj.SetContents( CONTENTS_SOLID );
	physicsObj.DropToFloor();
	state = NORMAL;
	Show();
	UpdateVisuals();
}
示例#20
0
void hhFuncEmitter::Ticker() {
	if( IsHidden() ) {
		return;
	}

	if( particle && particleStartTime != -1 ) {
		if( !gameLocal.smokeParticles->EmitSmoke(particle, particleStartTime, gameLocal.random.RandomFloat(), GetOrigin(), GetAxis()) ) {
			particleStartTime = -1;
		}
	}

	if( modelDefHandle != -1 ) {
		renderEntity.origin = GetOrigin();
		renderEntity.axis = GetAxis();
		UpdateVisuals();
	}
}
示例#21
0
void idTrembler::Reset( void )
{
	StopSound( SND_CHANNEL_ANY, false );

	renderEntity.shaderParms[ SHADERPARM_RED ] = 0;
	renderEntity.shaderParms[ SHADERPARM_GREEN ] = 0.7f;
	renderEntity.shaderParms[ SHADERPARM_BLUE ] = 1;
	UpdateVisuals();

	state = -1;

	int resettime = spawnArgs.GetInt("armtime");

	Event_PlayAnim("idle", 1);

	PostEventMS( &EV_TremblerArm, resettime ); //give a little delay to let physics settle the objects down.
}
示例#22
0
/*
================
rvEffect::Think
================
*/
void rvEffect::Think( void ) {

    if( clientEntities.IsListEmpty ( ) ) {
        BecomeInactive( TH_THINK );

        // Should the func_fx be removed now?
        if( !(gameLocal.editors & EDITOR_FX) && spawnArgs.GetBool( "remove" ) ) {
            PostEventMS( &EV_Remove, 0 );
        }

        return;
    }
    else if( lookAtTarget ) {
        // If activated and looking at its target then update the target information
        ProcessEvent( &EV_LookAtTarget );
    }

    UpdateVisuals();
    Present ( );
}
示例#23
0
void hhForceField::ReadFromSnapshot( const idBitMsgDelta &msg ) {
	physicsObj.ReadFromSnapshot(msg);
	damagedState = !!msg.ReadBits(1);
	activationRate = msg.ReadFloat();
	deactivationRate = msg.ReadFloat();
	undamageFadeRate = msg.ReadFloat();
	applyImpulseAttempts = msg.ReadBits(32);
	cachedContents = msg.ReadBits(32);
	fade = msg.ReadFloat();
	nextCollideFxTime = msg.ReadBits(32);
	fieldState = (States)msg.ReadBits(4);
	bool hidden = !!msg.ReadBits(1);
	if (IsHidden() != hidden) {
		if (hidden) {
			Hide();
			SetSkinByName( spawnArgs.GetString("skin_off" ) );
			GetPhysics()->SetContents( 0 );
		}
		else {
			Show();
			SetSkinByName( NULL );
			GetPhysics()->SetContents( cachedContents );
		}
	}

	float f;
	bool changed = false;
	
	f = msg.ReadFloat();
	changed = (changed || (renderEntity.shaderParms[SHADERPARM_TIMEOFFSET] != f));
	renderEntity.shaderParms[SHADERPARM_TIMEOFFSET] = f;
	
	f = msg.ReadFloat();
	changed = (changed || (renderEntity.shaderParms[SHADERPARM_MODE] != f));
	renderEntity.shaderParms[SHADERPARM_MODE] = f;

	if (changed) {
		UpdateModel();
		UpdateVisuals();
	}
}
示例#24
0
END_CLASS

void hhWallWalkable::Spawn( void ) {
	wallwalkOn = spawnArgs.GetBool("active");
	flicker	= spawnArgs.GetBool("flicker");

	// Get skin references (already precached)
	onSkin = declManager->FindSkin( spawnArgs.GetString("skinOn") );
	offSkin = declManager->FindSkin( spawnArgs.GetString("skinOff") );

	if (wallwalkOn) {
		SetSkin( onSkin );
		alphaOn.Init(gameLocal.time, 0, 1.0f, 1.0f);
	}
	else {
		SetSkin( offSkin );
		alphaOn.Init(gameLocal.time, 0, 0.0f, 0.0f);
	}
	alphaOn.SetHermiteParms(WALLWALK_HERM_S1, WALLWALK_HERM_S2);
	SetShaderParm(4, alphaOn.GetCurrentValue(gameLocal.time));
	UpdateVisuals();

	fl.networkSync = true;
}
示例#25
0
END_CLASS

/*
==============
sdRainEffect::Spawn
==============
*/
void		sdRainEffect::Spawn( void ) {
	renderEntity_t *re = GetRenderEntity();

	re->numInsts = 9;
	re->insts = new sdInstInfo[ re->numInsts ];

	idVec3 zero;
	idMat3 I;
	zero.Zero();
	I.Identity();
	this->SetPosition( zero, I );


	BecomeActive( TH_THINK );
	UpdateVisuals();

}
示例#26
0
/*
================
idLight::Spawn
================
*/
void idLight::Spawn( void ) {
	bool start_off;
	bool needBroken;
	const char *demonic_shader;

	// do the parsing the same way dmap and the editor do
	gameEdit->ParseSpawnArgsToRenderLight( &spawnArgs, &renderLight );

	// we need the origin and axis relative to the physics origin/axis
	localLightOrigin = ( renderLight.origin - GetPhysics()->GetOrigin() ) * GetPhysics()->GetAxis().Transpose();
	localLightAxis = renderLight.axis * GetPhysics()->GetAxis().Transpose();

	// set the base color from the shader parms
	baseColor.Set( renderLight.shaderParms[ SHADERPARM_RED ], renderLight.shaderParms[ SHADERPARM_GREEN ], renderLight.shaderParms[ SHADERPARM_BLUE ] );

	// set the number of light levels
	spawnArgs.GetInt( "levels", "1", levels );
	currentLevel = levels;
	if ( levels <= 0 ) {
		gameLocal.Error( "Invalid light level set on entity #%d(%s)", entityNumber, name.c_str() );
	}

	// make sure the demonic shader is cached
	if ( spawnArgs.GetString( "mat_demonic", NULL, &demonic_shader ) ) {
		declManager->FindType( DECL_MATERIAL, demonic_shader );
	}

	// game specific functionality, not mirrored in
	// editor or dmap light parsing

	// also put the light texture on the model, so light flares
	// can get the current intensity of the light
	renderEntity.referenceShader = renderLight.shader;

	lightDefHandle = -1;		// no static version yet

	// see if an optimized shadow volume exists
	// the renderer will ignore this value after a light has been moved,
	// but there may still be a chance to get it wrong if the game moves
	// a light before the first present, and doesn't clear the prelight
	renderLight.prelightModel = 0;
	if ( name[ 0 ] ) {
		// this will return 0 if not found
		renderLight.prelightModel = renderModelManager->CheckModel( va( "_prelight_%s", name.c_str() ) );
	}

	spawnArgs.GetBool( "start_off", "0", start_off );
	if ( start_off ) {
		Off();
	}

	health = spawnArgs.GetInt( "health", "0" );
	spawnArgs.GetString( "broken", "", brokenModel );
	spawnArgs.GetBool( "break", "0", breakOnTrigger );
	spawnArgs.GetInt( "count", "1", count );

	triggercount = 0;

	fadeFrom.Set( 1, 1, 1, 1 );
	fadeTo.Set( 1, 1, 1, 1 );
	fadeStart			= 0;
	fadeEnd				= 0;

	// if we have a health make light breakable
	if ( health ) {
		idStr model = spawnArgs.GetString( "model" );		// get the visual model
		if ( !model.Length() ) {
			gameLocal.Error( "Breakable light without a model set on entity #%d(%s)", entityNumber, name.c_str() );
		}

		fl.takedamage	= true;

		// see if we need to create a broken model name
		needBroken = true;
		if ( model.Length() && !brokenModel.Length() ) {
			int	pos;

			needBroken = false;

			pos = model.Find( "." );
			if ( pos < 0 ) {
				pos = model.Length();
			}
			if ( pos > 0 ) {
				model.Left( pos, brokenModel );
			}
			brokenModel += "_broken";
			if ( pos > 0 ) {
				brokenModel += &model[ pos ];
			}
		}

		// make sure the model gets cached
		if ( !renderModelManager->CheckModel( brokenModel ) ) {
			if ( needBroken ) {
				gameLocal.Error( "Model '%s' not found for entity %d(%s)", brokenModel.c_str(), entityNumber, name.c_str() );
			} else {
				brokenModel = "";
			}
		}

		GetPhysics()->SetContents( spawnArgs.GetBool( "nonsolid" ) ? 0 : CONTENTS_SOLID );

		// make sure the collision model gets cached
		idClipModel::CheckModel( brokenModel );
	}

	PostEventMS( &EV_PostSpawn, 0 );

// sikk---> Soft Shadows PostProcess
	// only put lights that cast shadows into the list
	if ( spawnArgs.GetInt( "noshadows" ) == 0  ) {
		gameLocal.currentLights.Append( entityNumber );
	}
// <---sikk

	UpdateVisuals();
}
示例#27
0
/*
==============
sdSnowEffect::Think
==============
*/
void		sdSnowEffect::Think( void ) {
    renderEntity_t *re = GetRenderEntity();
    if ( re->hModel == NULL ) {
        return;
    }

    idBounds modelbb = re->hModel->Bounds();
    idVec3 extents = (modelbb.GetMaxs() - modelbb.GetMins()) * 0.5f;

    idPlayer *p = gameLocal.GetLocalViewPlayer();
    idVec3 const &v = p->GetViewPos();

    for (int i=0; i<MAX_GROUPS; i++) {
        groups[i].time -= 1.f / 30.f;
        if ( groups[i].time < 0.f ) {
            groups[i].axis = idVec3( idRandom::StaticRandom().RandomFloat()- 0.15f , idRandom::StaticRandom().RandomFloat() - 0.5f , idRandom::StaticRandom().RandomFloat() - 0.5f );
            groups[i].axis.z *= 40.25f;
            groups[i].axis.Normalize();
            groups[i].rotate = 0.f;
            groups[i].rotateSpeed = idRandom::StaticRandom().RandomFloat() * 50.f + 50.f;
            groups[i].rotationPoint = idVec3( idRandom::StaticRandom().RandomFloat() * extents.x,
                                              idRandom::StaticRandom().RandomFloat() * extents.y,
                                              idRandom::StaticRandom().RandomFloat() * extents.z );

            groups[i].alpha = 0.f;
            groups[i].time = idRandom::StaticRandom().RandomFloat() * 1.f + 1.f;
            groups[i].worldPos = v + idVec3( (idRandom::StaticRandom().RandomFloat()-0.5f) * extents.x * 3,
                                             (idRandom::StaticRandom().RandomFloat()-0.5f) * extents.y * 3,
                                             (idRandom::StaticRandom().RandomFloat()-0.5f) * extents.z * 3 );
        } else {
            if ( groups[i].time > 0.25f ) {
                groups[i].alpha += 1.f / 7.5f;
                if ( groups[i].alpha > 1.f ) {
                    groups[i].alpha = 1.f;
                }
            } else {
                groups[i].alpha = groups[i].time * 4.f;
                if ( groups[i].alpha < 0.f ) {
                    groups[i].alpha = 0.f;
                }
            }
            groups[i].worldPos += idVec3( 0.f, 0.f, -600.f ) * 1.f / 30.f;
            groups[i].rotate += groups[i].rotateSpeed * 1.f / 30.f;
        }
    }


    int gridx = idMath::Ftoi( idMath::Floor(v.x / extents.x) );
    int gridy = idMath::Ftoi( idMath::Floor(v.y / extents.y) );

    idBounds bounds;
    bounds.Clear();
    sdInstInfo *inst = re->insts;
    for (int i=0; i<MAX_GROUPS; i++) {
        idRotation r( groups[i].rotationPoint, groups[i].axis, groups[i].rotate );

        idBounds bb2;
        inst->inst.color[0] = 0xff;
        inst->inst.color[1] = 0xff;
        inst->inst.color[2] = 0xff;
        inst->inst.color[3] = 0xff;
        inst->fadeOrigin = inst->inst.origin = groups[i].worldPos;
        inst->inst.axis = r.ToMat3();
        inst->maxVisDist = 0;
        inst->minVisDist = 0.f;
        bb2.FromTransformedBounds( modelbb, inst->inst.origin, inst->inst.axis );
        bounds.AddBounds( bb2 );
        inst++;
    }
    re->flags.overridenBounds = true;
    re->bounds = bounds;

    UpdateVisuals();
    Present();
}
示例#28
0
/*
===========
hhForceField::Ticker
===========
*/
void hhForceField::Ticker( void ) {

	if( fieldState == StatePreTurningOn ) {
		idEntity*		entityList[MAX_GENTITIES];
		idEntity*		entity = NULL;
		idPhysics*		physics = NULL;
		int				numEntities = 0;
		int				numEntitiesImpulseAppliedTo = 0;
		idVec3			force = DetermineForce() * GetAxis();

		numEntities = gameLocal.clip.EntitiesTouchingBounds( GetPhysics()->GetAbsBounds(), MASK_SOLID, entityList, MAX_GENTITIES );
		for( int ix = 0; ix < numEntities; ++ix ) {
			entity = entityList[ix];
			
			if( !entity ) {
				continue;
			}

			if( entity == this ) {
				continue;
			}

			//Removing mass from any calculations regarding impulse
			entity->ApplyImpulse( this, 0, entity->GetOrigin(), force * entity->GetPhysics()->GetMass() );
			numEntitiesImpulseAppliedTo++;
		}

		--applyImpulseAttempts;
		if( !numEntitiesImpulseAppliedTo || !applyImpulseAttempts ) {
			fieldState = StateTurningOn;
			GetPhysics()->SetContents( cachedContents );
			SetSkin( NULL );
			StartSound( "snd_start", SND_CHANNEL_ANY );

			Show();

			EnterTurningOnState();
		}
	} else if( fieldState == StateTurningOn ) {
		float deltaTime = MS2SEC( gameLocal.msec );

		renderEntity.shaderParms[SHADERPARM_TIMEOFFSET] += activationRate * deltaTime;
		if( renderEntity.shaderParms[SHADERPARM_TIMEOFFSET] >= 1.0f ) {
			EnterOnState();
		}

		UpdateVisuals();
	} else if( fieldState == StateTurningOff ) {
		float deltaTime = MS2SEC( gameLocal.msec );

		renderEntity.shaderParms[SHADERPARM_TIMEOFFSET] -= deactivationRate * deltaTime;
		if( renderEntity.shaderParms[SHADERPARM_TIMEOFFSET] <= 0.0f ) {
			EnterOffState();
		}

		UpdateVisuals();
	}

	if( damagedState ) {
		float deltaTime = MS2SEC( gameLocal.msec );

		// Fade parm back to normal
		fade -= undamageFadeRate * deltaTime;
		if ( fade <= 0.0f ) { // Finished fading
			fade = 0;
			damagedState = false;
		}

		SetShaderParm( SHADERPARM_MODE, fade );
	}

	if (!damagedState && (fieldState==StateOn || fieldState==StateOff)) {
		BecomeInactive( TH_TICKER );
	}
}
示例#29
0
void idTrembler::Event_Touch( idEntity *other, trace_t *trace )
{
	


	if (state == 0)
	{
		idEntity	*entityList[ MAX_GENTITIES ];
		int			i;
		int			flyforce;

		state = 1;

		Event_PlayAnim("bounce", 1);
		StartSound( "snd_trigger", SND_CHANNEL_BODY, 0, false, NULL );
		StartSound( "snd_trigger_idle", SND_CHANNEL_BODY2, 0, false, NULL );


		ticksoundTime = gameLocal.time + (spawnArgs.GetInt("ticktime", "10") * 1000);


		if (g_skill.GetInteger() > 0)
		{
			ActivateTargets(this); //activate alarm.
		}






		int listedEntities = gameLocal.EntitiesWithinRadius( GetPhysics()->GetOrigin(), FLYRADIUS, entityList, MAX_GENTITIES );

		flyforce = spawnArgs.GetInt("force", "256");

		renderEntity.shaderParms[ SHADERPARM_RED ] = 1;
		renderEntity.shaderParms[ SHADERPARM_GREEN ] = 0;
		renderEntity.shaderParms[ SHADERPARM_BLUE ] = 0;
		UpdateVisuals();



		//KA BOIIIIINNNGGGGGG
		for (i = 0; i < listedEntities; i++)
		{
			idEntity *ent = entityList[ i ];

			if (!ent)
			{
				continue;
			}

			float ent_zpos = ent->GetPhysics()->GetOrigin().z;
			float trembler_zpos = this->GetPhysics()->GetOrigin().z;

			//only affect things above the trembler.
			if (ent_zpos < trembler_zpos)
				continue;

			//only affect things within X height of trembler.
			if (ent_zpos > trembler_zpos + HEIGHT_MAX)
				continue;

			if ( !ent->IsType( idMoveableItem::Type ) && !ent->IsType( idMoveable::Type ) )
				continue;

			ent->GetPhysics()->SetLinearVelocity(idVec3(0,0,1) * flyforce);
		}
	}
}
示例#30
0
void hhFuncEmitter::Event_Activate( idEntity *activator ) {
	(IsHidden() || spawnArgs.GetBool("cycleTrigger")) ? Show() : Hide();

	UpdateVisuals();
}