本文整理汇总了C++中VectorNormalize函数的典型用法代码示例。如果您正苦于以下问题:C++ VectorNormalize函数的具体用法?C++ VectorNormalize怎么用?C++ VectorNormalize使用的例子?那么, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了VectorNormalize函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: CG_AddLocalEntities
//.........这里部分代码省略.........
if( le->bounce ) { // FIXME?
int i;
const float adj = 100 * 6 * time; // magic constants here
for( i = 0; i < 3; i++ ) {
if( le->avelocity[i] > 0.0f ) {
le->avelocity[i] -= adj;
if( le->avelocity[i] < 0.0f ) {
le->avelocity[i] = 0.0f;
}
}
else if ( le->avelocity[i] < 0.0f ) {
le->avelocity[i] += adj;
if ( le->avelocity[i] > 0.0f ) {
le->avelocity[i] = 0.0f;
}
}
}
}
if( le->bounce )
{
trace_t trace;
vec3_t next_origin;
VectorMA( ent->origin, time, le->velocity, next_origin );
CG_Trace( &trace, ent->origin, debris_mins, debris_maxs, next_origin, 0, MASK_SOLID );
// remove the particle when going out of the map
if( ( trace.contents & CONTENTS_NODROP ) || ( trace.surfFlags & SURF_SKY ) )
{
le->frames = 0;
}
else if( trace.fraction != 1.0 ) // found solid
{
float dot;
float xyzspeed, orig_xyzspeed;
float bounce;
orig_xyzspeed = VectorLength( le->velocity );
// Reflect velocity
dot = DotProduct( le->velocity, trace.plane.normal );
VectorMA( le->velocity, -2.0f * dot, trace.plane.normal, le->velocity );
//put new origin in the impact point, but move it out a bit along the normal
VectorMA( trace.endpos, 1, trace.plane.normal, ent->origin );
// make sure we don't gain speed from bouncing off
bounce = 2.0f * le->bounce * 0.01f;
if( bounce < 1.5f )
bounce = 1.5f;
xyzspeed = orig_xyzspeed / bounce;
VectorNormalize( le->velocity );
VectorScale( le->velocity, xyzspeed, le->velocity );
//the entity has not speed enough. Stop checks
if( xyzspeed * time < 1.0f )
{
trace_t traceground;
vec3_t ground_origin;
//see if we have ground
VectorCopy( ent->origin, ground_origin );
ground_origin[2] += ( debris_mins[2] - 4 );
CG_Trace( &traceground, ent->origin, debris_mins, debris_maxs, ground_origin, 0, MASK_SOLID );
if( traceground.fraction != 1.0 )
{
le->bounce = 0;
VectorClear( le->velocity );
VectorClear( le->accel );
VectorClear( le->avelocity );
if( le->type == LE_EXPLOSION_TRACER )
{
// blx
le->type = LE_FREE;
CG_FreeLocalEntity( le );
}
}
}
}
else
{
VectorCopy( ent->origin, ent->origin2 );
VectorCopy( next_origin, ent->origin );
}
}
else
{
VectorCopy( ent->origin, ent->origin2 );
VectorMA( ent->origin, time, le->velocity, ent->origin );
}
VectorCopy( ent->origin, ent->lightingOrigin );
VectorMA( le->velocity, time, le->accel, le->velocity );
CG_AddEntityToScene( ent );
}
}
示例2: Trap_Think
//.........这里部分代码省略.........
while ((target = findradius(target, ent->s.origin, 256)) != NULL)
{
if (target == ent)
{
continue;
}
if (!(target->svflags & SVF_MONSTER) && !target->client)
{
continue;
}
if (target->health <= 0)
{
continue;
}
if (!visible(ent, target))
{
continue;
}
if (!best)
{
best = target;
continue;
}
VectorSubtract(ent->s.origin, target->s.origin, vec);
len = VectorLength(vec);
if (len < oldlen)
{
oldlen = len;
best = target;
}
}
/* pull the enemy in */
if (best)
{
vec3_t forward;
if (best->groundentity)
{
best->s.origin[2] += 1;
best->groundentity = NULL;
}
VectorSubtract(ent->s.origin, best->s.origin, vec);
len = VectorLength(vec);
if (best->client)
{
VectorNormalize(vec);
VectorMA(best->velocity, 250, vec, best->velocity);
}
else
{
best->ideal_yaw = vectoyaw(vec);
M_ChangeYaw(best);
AngleVectors(best->s.angles, forward, NULL, NULL);
VectorScale(forward, 256, best->velocity);
}
gi.sound(ent, CHAN_VOICE, gi.soundindex(
"weapons/trapsuck.wav"), 1, ATTN_IDLE, 0);
if (len < 32)
{
if (best->mass < 400)
{
T_Damage(best, ent, ent->owner, vec3_origin, best->s.origin,
vec3_origin, 100000, 1, 0, MOD_TRAP);
ent->enemy = best;
ent->wait = 64;
VectorCopy(ent->s.origin, ent->s.old_origin);
ent->timestamp = level.time + 30;
if (deathmatch->value)
{
ent->mass = best->mass / 4;
}
else
{
ent->mass = best->mass / 10;
}
/* ok spawn the food cube */
ent->s.frame = 5;
}
else
{
BecomeExplosion1(ent);
return;
}
}
}
}
示例3: Pickup_Powerup
int Pickup_Powerup( gentity_t *ent, gentity_t *other ) {
int quantity;
int i;
gclient_t *client;
if ( !other->client->ps.powerups[ent->item->giTag] ) {
// round timing to seconds to make multiple powerup timers
// count in sync
other->client->ps.powerups[ent->item->giTag] =
level.time - ( level.time % 1000 );
}
if ( ent->count ) {
quantity = ent->count;
} else {
quantity = ent->item->quantity;
}
other->client->ps.powerups[ent->item->giTag] += quantity * 1000;
// give any nearby players a "denied" anti-reward
for ( i = 0 ; i < level.maxclients ; i++ ) {
vec3_t delta;
float len;
vec3_t forward;
trace_t tr;
client = &level.clients[i];
if ( client == other->client ) {
continue;
}
if ( client->pers.connected == CON_DISCONNECTED ) {
continue;
}
if ( client->ps.stats[STAT_HEALTH] <= 0 ) {
continue;
}
// if same team in team game, no sound
// cannot use OnSameTeam as it expects to g_entities, not clients
if ( g_gametype.integer >= GT_TEAM && other->client->sess.sessionTeam == client->sess.sessionTeam ) {
continue;
}
// if too far away, no sound
VectorSubtract( ent->s.pos.trBase, client->ps.origin, delta );
len = VectorNormalize( delta );
if ( len > 192 ) {
continue;
}
// if not facing, no sound
AngleVectors( client->ps.viewangles, forward, NULL, NULL );
if ( DotProduct( delta, forward ) < 0.4 ) {
continue;
}
// if not line of sight, no sound
trap_Trace( &tr, client->ps.origin, NULL, NULL, ent->s.pos.trBase, ENTITYNUM_NONE, CONTENTS_SOLID );
if ( tr.fraction != 1.0 ) {
continue;
}
// anti-reward
client->ps.persistant[PERS_PLAYEREVENTS] ^= PLAYEREVENT_DENIEDREWARD;
}
return RESPAWN_POWERUP;
}
示例4: if
//-----------------------------------------------------------------------------
// Purpose: This takes the current place the NPC's trying to get to, figures out
// what keys to press to get the vehicle to go there, and then sends
// them to the vehicle.
//-----------------------------------------------------------------------------
void CNPC_CraneDriver::DriveVehicle( void )
{
// No targets?
if ( !GetEnemy() && m_vecDesiredPosition == vec3_origin )
return;
Vector vecTarget = m_vecDesiredPosition;
// Track our targets
if ( m_hPickupTarget )
{
vecTarget = m_hPickupTarget->GetAbsOrigin();
}
else if ( !m_bForcedPickup && !m_bForcedDropoff && GetEnemy() )
{
vecTarget = GetEnemy()->GetAbsOrigin();
}
// Move the crane over the target
// Use the crane type as a targeting point
Vector vecCraneTip = m_hCrane->GetCraneTipPosition();
Vector2D vecCraneTip2D( vecCraneTip.x, vecCraneTip.y );
Vector2D vecTarget2D( vecTarget.x, vecTarget.y );
Vector2D vecOrigin2D( m_hCrane->GetAbsOrigin().x, m_hCrane->GetAbsOrigin().y );
if ( g_debug_vehicledriver.GetInt() )
{
NDebugOverlay::Box( vecTarget, -Vector(50,50,50), Vector(50,50,50), 0,255,0, true, 0.1 );
NDebugOverlay::Box( vecCraneTip, -Vector(2,2,5000), Vector(2,2,5), 0,255,0, true, 0.1 );
NDebugOverlay::Box( vecTarget, -Vector(2,2,5), Vector(2,2,5000), 0,255,0, true, 0.1 );
}
// Store off the distance to our target
m_flDistanceToTarget = (vecTarget2D - vecCraneTip2D).Length();
// First determine whether we need to extend / retract the arm
float flDistToTarget = (vecOrigin2D - vecTarget2D).LengthSqr();
float flDistToCurrent = (vecOrigin2D - vecCraneTip2D).LengthSqr();
float flDelta = fabs(flDistToTarget - flDistToCurrent);
// Slow down as we get closer, but do it based upon our current extension rate
float flMinDelta = 50 + (50 * fabs(m_hCrane->GetExtensionRate() / CRANE_EXTENSION_RATE_MAX));
flMinDelta *= flMinDelta;
if ( flDelta > flMinDelta )
{
if ( flDistToCurrent > flDistToTarget )
{
// Retract
m_pVehicleInterface->NPC_ThrottleReverse();
}
else if ( flDistToCurrent < flDistToTarget )
{
// Extend
m_pVehicleInterface->NPC_ThrottleForward();
}
}
else
{
m_pVehicleInterface->NPC_ThrottleCenter();
}
// Then figure out if we need to rotate. Do it all in 2D space.
Vector vecRight, vecForward;
m_hCrane->GetVectors( &vecForward, &vecRight, NULL );
vecRight.z = 0;
vecForward.z = 0;
VectorNormalize( vecRight );
VectorNormalize( vecForward );
Vector vecToTarget = ( vecTarget - m_hCrane->GetAbsOrigin() );
vecToTarget.z = 0;
VectorNormalize( vecToTarget );
float flDotRight = DotProduct( vecRight, vecToTarget );
float flDotForward = DotProduct( vecForward, vecToTarget );
// Start slowing if we're going to hit the point soon
float flTurnInDeg = RAD2DEG( acos(flDotForward) );
float flSpeed = m_hCrane->GetMaxTurnRate() * (flTurnInDeg / 15.0);
flSpeed = min( m_hCrane->GetMaxTurnRate(), flSpeed );
if ( fabs(flSpeed) < 0.05 )
{
// We're approaching the target, so stop turning
m_pVehicleInterface->NPC_TurnCenter();
}
else
{
if ( flDotRight < 0 )
{
// Turn right
m_pVehicleInterface->NPC_TurnRight( flSpeed );
}
else if ( flDotRight > 0 )
{
// Turn left
m_pVehicleInterface->NPC_TurnLeft( flSpeed );
}
}
}
示例5: bfg_think
void bfg_think (edict_t *self)
{
edict_t *ent;
edict_t *ignore;
vec3_t point;
vec3_t dir;
vec3_t start;
vec3_t end;
int dmg;
trace_t tr;
if (!self)
{
return;
}
if (deathmatch->value)
{
dmg = 5;
}
else
{
dmg = 10;
}
ent = NULL;
while ((ent = findradius(ent, self->s.origin, 256)) != NULL)
{
if (ent == self)
{
continue;
}
if (ent == self->owner)
{
continue;
}
if (!ent->takedamage)
{
continue;
}
if (!(ent->svflags & SVF_MONSTER) && (!ent->client) &&
(strcmp(ent->classname, "misc_explobox") != 0))
{
continue;
}
VectorMA(ent->absmin, 0.5, ent->size, point);
VectorSubtract(point, self->s.origin, dir);
VectorNormalize(dir);
ignore = self;
VectorCopy(self->s.origin, start);
VectorMA(start, 2048, dir, end);
while (1)
{
tr = gi.trace(start, NULL, NULL, end, ignore,
CONTENTS_SOLID | CONTENTS_MONSTER | CONTENTS_DEADMONSTER);
if (!tr.ent)
{
break;
}
/* hurt it if we can */
if ((tr.ent->takedamage) && !(tr.ent->flags & FL_IMMUNE_LASER) &&
(tr.ent != self->owner))
{
T_Damage(tr.ent, self, self->owner, dir, tr.endpos,
vec3_origin, dmg, 1, DAMAGE_ENERGY, MOD_BFG_LASER);
}
/* if we hit something that's not a monster or player we're done */
if (!(tr.ent->svflags & SVF_MONSTER) && (!tr.ent->client))
{
gi.WriteByte(svc_temp_entity);
gi.WriteByte(TE_LASER_SPARKS);
gi.WriteByte(4);
gi.WritePosition(tr.endpos);
gi.WriteDir(tr.plane.normal);
gi.WriteByte(self->s.skinnum);
gi.multicast(tr.endpos, MULTICAST_PVS);
break;
}
ignore = tr.ent;
VectorCopy(tr.endpos, start);
}
gi.WriteByte(svc_temp_entity);
gi.WriteByte(TE_BFG_LASER);
gi.WritePosition(self->s.origin);
gi.WritePosition(tr.endpos);
gi.multicast(self->s.origin, MULTICAST_PHS);
}
//.........这里部分代码省略.........
示例6: DispMapToCoreDispInfo
//.........这里部分代码省略.........
pFace->m_LightmapTextureMinsInLuxels,
pt,
4,
lmCoords );
int zeroOffset[2] = {0,0};
CalcTextureCoordsAtPoints(
pTexInfo->textureVecsTexelsPerWorldUnits,
zeroOffset,
pt,
4,
tCoords );
}
//
// set face point data ...
//
pSurf->SetPointCount( 4 );
for( int i = 0; i < 4; i++ )
{
// position
pSurf->SetPoint( i, pWinding->p[i] );
for( int j = 0; j < ( NUM_BUMP_VECTS + 1 ); ++j )
{
pSurf->SetLuxelCoord( j, i, lmCoords[i] );
}
pSurf->SetTexCoord( i, tCoords[i] );
}
//
// reset surface given start info
//
pSurf->SetPointStart( pMapDisp->startPosition );
pSurf->FindSurfPointStartIndex();
pSurf->AdjustSurfPointData();
//
// adjust face lightmap data - this will be done a bit more accurately
// when the common code get written, for now it works!!! (GDC, E3)
//
Vector points[4];
for( int ndxPt = 0; ndxPt < 4; ndxPt++ )
{
points[ndxPt] = pSurf->GetPoint( ndxPt );
}
Vector edgeU = points[3] - points[0];
Vector edgeV = points[1] - points[0];
bool bUMajor = ( edgeU.Length() > edgeV.Length() );
if( pFace )
{
int lightmapWidth = pFace->m_LightmapTextureSizeInLuxels[0];
int lightmapHeight = pFace->m_LightmapTextureSizeInLuxels[1];
if ( ( bUMajor && ( lightmapHeight > lightmapWidth ) ) ||
( !bUMajor && ( lightmapWidth > lightmapHeight ) ) )
{
pFace->m_LightmapTextureSizeInLuxels[0] = lightmapHeight;
pFace->m_LightmapTextureSizeInLuxels[1] = lightmapWidth;
lightmapWidth = lightmapHeight;
lightmapHeight = pFace->m_LightmapTextureSizeInLuxels[1];
}
for ( int ndxBump = 0; ndxBump < ( NUM_BUMP_VECTS + 1 ); ndxBump++ )
{
pSurf->SetLuxelCoord( ndxBump, 0, Vector2D( 0.0f, 0.0f ) );
pSurf->SetLuxelCoord( ndxBump, 1, Vector2D( 0.0f, ( float )lightmapHeight ) );
pSurf->SetLuxelCoord( ndxBump, 2, Vector2D( ( float )lightmapWidth, ( float )lightmapHeight ) );
pSurf->SetLuxelCoord( ndxBump, 3, Vector2D( ( float )lightmapWidth, 0.0f ) );
}
}
// Setup the displacement vectors and offsets.
int size = ( ( ( 1 << pMapDisp->power ) + 1 ) * ( ( 1 << pMapDisp->power ) + 1 ) );
Vector vectorDisps[2048];
float dispDists[2048];
Assert( size < sizeof(vectorDisps)/sizeof(vectorDisps[0]) );
for( int j = 0; j < size; j++ )
{
Vector v;
float dist;
VectorScale( pMapDisp->vectorDisps[j], pMapDisp->dispDists[j], v );
VectorAdd( v, pMapDisp->vectorOffsets[j], v );
dist = VectorLength( v );
VectorNormalize( v );
vectorDisps[j] = v;
dispDists[j] = dist;
}
// Use CCoreDispInfo to setup the actual vertex positions.
pCoreDispInfo->InitDispInfo( pMapDisp->power, pMapDisp->minTess, pMapDisp->smoothingAngle,
pMapDisp->alphaValues, vectorDisps, dispDists );
pCoreDispInfo->Create();
}
示例7: UI_DoSFXSaber
void UI_DoSFXSaber( vector3 *blade_muz, vector3 *blade_tip, vector3 *trail_tip, vector3 *trail_muz, float lengthMax, float radius, saber_colors_t color, int rfx, qboolean doLight, qboolean doTrail, int cnum, int bnum ) {
vector3 mid, blade_dir, end_dir, trail_dir, base_dir;
float radiusmult, effectradius, coreradius, effectalpha = 1.0f, AngleScale = 1.0f;
float blade_len, trail_len, base_len;
vector3 rgb = { 1, 1, 1 };
int i;
qhandle_t glow = 0;
refEntity_t saber, sbak;
VectorSubtract( blade_tip, blade_muz, &blade_dir );
VectorSubtract( trail_tip, trail_muz, &trail_dir );
blade_len = lengthMax;//VectorLength(blade_dir);
trail_len = VectorLength( &trail_dir );
VectorNormalize( &blade_dir );
VectorNormalize( &trail_dir );
if ( lengthMax < 1.0f ) {
return;
}
VectorSubtract( trail_tip, blade_tip, &end_dir );
VectorSubtract( trail_muz, blade_muz, &base_dir );
base_len = VectorLength( &base_dir );
VectorNormalize( &end_dir );
VectorNormalize( &base_dir );
switch ( color ) {
case SABER_RED:
glow = redSaberGlowShader;
break;
case SABER_ORANGE:
glow = orangeSaberGlowShader;
break;
case SABER_YELLOW:
glow = yellowSaberGlowShader;
break;
case SABER_GREEN:
glow = greenSaberGlowShader;
break;
case SABER_PURPLE:
glow = purpleSaberGlowShader;
break;
// case SABER_WHITE:
case SABER_RGB:
case SABER_FLAME1:
case SABER_ELEC1:
case SABER_FLAME2:
case SABER_ELEC2:
glow = rgbSaberGlowShader;
break;
case SABER_BLACK:
glow = blackSaberGlowShader;
break;
default:
glow = blueSaberGlowShader;
break;
}
VectorMA( blade_muz, blade_len * 0.5f, &blade_dir, &mid );
memset( &saber, 0, sizeof(refEntity_t) );
if ( blade_len < lengthMax ) {
radiusmult = 0.5f + ((blade_len / lengthMax) / 2);
}
else {
radiusmult = 1.0f;
}
effectradius = ((radius * 1.6f * 1.0f) + crandom() * 0.1f)*radiusmult;
coreradius = ((radius * 0.4f * 1.0f) + crandom() * 0.1f)*radiusmult;
UI_RGBForSaberColor( color, &rgb, bnum );
for ( i = 0; i<3; i++ )
rgb.data[i] *= 255;
{
saber.renderfx = rfx;
if ( blade_len - ((effectradius*1.0f) / 2) > 0 ) {
saber.radius = effectradius*AngleScale;
saber.saberLength = (blade_len - (saber.radius / 2));
VectorCopy( blade_muz, &saber.origin );
VectorCopy( &blade_dir, &saber.axis[0] );
saber.reType = RT_SABER_GLOW;
saber.customShader = glow;
if ( color < SABER_RGB /*&& color != SABER_WHITE*/ )
saber.shaderRGBA[0] = saber.shaderRGBA[1] = saber.shaderRGBA[2] = saber.shaderRGBA[3] = 0xff * 1.0f;
else {
for ( i = 0; i < 3; i++ )
saber.shaderRGBA[i] = rgb.data[i] * effectalpha;
saber.shaderRGBA[3] = 255 * effectalpha;
}
SE_R_AddRefEntityToScene( &saber, cnum );
}
// Do the hot core
VectorMA( blade_muz, blade_len, &blade_dir, &saber.origin );
VectorMA( blade_muz, -1, &blade_dir, &saber.oldorigin );
//.........这里部分代码省略.........
示例8: Mem_Set
/*
=================
R_TraceLine
=================
*/
msurface_t *R_TransformedTraceLine( trace_t *tr, const vec3_t start, const vec3_t end, ref_entity_t *test, int umask )
{
ref_model_t *model;
r_fragmentframecount++; // for multi-check avoidance
// fill in a default trace
Mem_Set( tr, 0, sizeof( trace_t ));
trace_surface = NULL;
trace_umask = umask;
trace_fraction = 1;
VectorCopy( end, trace_impact );
Mem_Set( &trace_plane, 0, sizeof( trace_plane ));
ClearBounds( trace_absmins, trace_absmaxs );
AddPointToBounds( start, trace_absmins, trace_absmaxs );
AddPointToBounds( end, trace_absmins, trace_absmaxs );
model = test->model;
if( model )
{
if( model->type == mod_world || model->type == mod_brush )
{
mbrushmodel_t *bmodel = ( mbrushmodel_t * )model->extradata;
vec3_t temp, start_l, end_l, axis[3];
bool rotated = !Matrix3x3_Compare( test->axis, matrix3x3_identity );
// transform
VectorSubtract( start, test->origin, start_l );
VectorSubtract( end, test->origin, end_l );
if( rotated )
{
VectorCopy( start_l, temp );
Matrix3x3_Transform( test->axis, temp, start_l );
VectorCopy( end_l, temp );
Matrix3x3_Transform( test->axis, temp, end_l );
}
VectorCopy( start_l, trace_start );
VectorCopy( end_l, trace_end );
// world uses a recursive approach using BSP tree, submodels
// just walk the list of surfaces linearly
if( test->model->type == mod_world )
R_RecursiveHullCheck( bmodel->nodes, start_l, end_l );
else if( BoundsIntersect( model->mins, model->maxs, trace_absmins, trace_absmaxs ) )
R_TraceAgainstBmodel( bmodel );
// transform back
if( rotated && trace_fraction != 1 )
{
Matrix3x3_Transpose( axis, test->axis );
VectorCopy( tr->vecPlaneNormal, temp );
Matrix3x3_Transform( axis, temp, trace_plane.normal );
}
}
}
// calculate the impact plane, if any
if( trace_fraction < 1.0f )
{
VectorNormalize( trace_plane.normal );
trace_plane.dist = DotProduct( trace_plane.normal, trace_impact );
CategorizePlane( &trace_plane );
tr->flPlaneDist = trace_plane.dist;
VectorCopy( trace_plane.normal, tr->vecPlaneNormal );
tr->iContents = trace_surface->contents;
tr->pHit = (edict_t *)test;
}
tr->flFraction = trace_fraction;
VectorCopy( trace_impact, tr->vecEndPos );
return trace_surface;
}
示例9: RecordShatterSurface
//.........这里部分代码省略.........
{
hMaterial1 = pGlassEmitter->GetPMaterial( "effects/fleck_glass1" );
hMaterial2 = pGlassEmitter->GetPMaterial( "effects/fleck_glass2" );
}
else
{
hMaterial1 = pGlassEmitter->GetPMaterial( "effects/fleck_tile1" );
hMaterial2 = pGlassEmitter->GetPMaterial( "effects/fleck_tile2" );
}
// ---------------------------------------------------
// Figure out number of particles required to fill space
// ---------------------------------------------------
int nNumWide = m_flWidth / m_flShardSize;
int nNumHigh = m_flHeight / m_flShardSize;
Vector vWidthStep,vHeightStep;
AngleVectors(m_vecAngles,NULL,&vWidthStep,&vHeightStep);
vWidthStep *= m_flShardSize;
vHeightStep *= m_flShardSize;
// ---------------------
// Create glass shards
// ----------------------
Vector vCurPos = m_vecOrigin;
vCurPos.x += 0.5*m_flShardSize;
vCurPos.z += 0.5*m_flShardSize;
float flMinSpeed = 9999999999;
float flMaxSpeed = 0;
Particle3D *pParticle = NULL;
for (int width=0;width<nNumWide;width++)
{
for (int height=0;height<nNumHigh;height++)
{
if (random->RandomInt(0,1))
{
pParticle = (Particle3D *) pGlassEmitter->AddParticle( sizeof(Particle3D), hMaterial1, vCurPos );
}
else
{
pParticle = (Particle3D *) pGlassEmitter->AddParticle( sizeof(Particle3D), hMaterial2, vCurPos );
}
Vector vForceVel = Vector(0,0,0);
if (random->RandomInt(0, 3) != 0)
{
float flForceDistSqr = (vCurPos - m_vecForcePos).LengthSqr();
vForceVel = m_vecForce;
if (flForceDistSqr > 0 )
{
vForceVel *= ( 40.0f / flForceDistSqr );
}
}
if (pParticle)
{
pParticle->m_flLifeRemaining = random->RandomFloat(GLASS_SHARD_MIN_LIFE,GLASS_SHARD_MAX_LIFE);
pParticle->m_vecVelocity = vForceVel;
pParticle->m_vecVelocity += RandomVector(-25,25);
pParticle->m_uchSize = m_flShardSize + random->RandomFloat(-0.5*m_flShardSize,0.5*m_flShardSize);
pParticle->m_vAngles = m_vecAngles;
pParticle->m_flAngSpeed = random->RandomFloat(-400,400);
pParticle->m_uchFrontColor[0] = (byte)(m_uchFrontColor[0] * vecColor.x );
pParticle->m_uchFrontColor[1] = (byte)(m_uchFrontColor[1] * vecColor.y );
pParticle->m_uchFrontColor[2] = (byte)(m_uchFrontColor[2] * vecColor.z );
pParticle->m_uchBackColor[0] = (byte)(m_uchBackColor[0] * vecColor.x );
pParticle->m_uchBackColor[1] = (byte)(m_uchBackColor[1] * vecColor.y );
pParticle->m_uchBackColor[2] = (byte)(m_uchBackColor[2] * vecColor.z );
}
// Keep track of min and max speed for collision detection
float flForceSpeed = vForceVel.Length();
if (flForceSpeed > flMaxSpeed)
{
flMaxSpeed = flForceSpeed;
}
if (flForceSpeed < flMinSpeed)
{
flMinSpeed = flForceSpeed;
}
vCurPos += vHeightStep;
}
vCurPos -= nNumHigh*vHeightStep;
vCurPos += vWidthStep;
}
// --------------------------------------------------
// Set collision parameters
// --------------------------------------------------
Vector vMoveDir = m_vecForce;
VectorNormalize(vMoveDir);
pGlassEmitter->m_ParticleCollision.Setup( m_vecOrigin, &vMoveDir, GLASS_SHARD_NOISE,
flMinSpeed, flMaxSpeed, GLASS_SHARD_GRAVITY, GLASS_SHARD_DAMPING );
}
示例10: CM_TraceThroughVerticalCylinder
/*
================
CM_TraceThroughVerticalCylinder
get the first intersection of the ray with the cylinder
the cylinder extends halfheight above and below the origin
================
*/
void CM_TraceThroughVerticalCylinder( traceWork_t *tw, trace_t &trace, vec3_t origin, float radius, float halfheight, vec3_t start, vec3_t end) {
float length, scale, fraction, l1, l2;
float /*a, */b, c, d, sqrtd;
vec3_t v1, dir, start2d, end2d, org2d, intersection;
// 2d coordinates
VectorSet(start2d, start[0], start[1], 0);
VectorSet(end2d, end[0], end[1], 0);
VectorSet(org2d, origin[0], origin[1], 0);
// if between lower and upper cylinder bounds
if (start[2] <= origin[2] + halfheight &&
start[2] >= origin[2] - halfheight) {
// if inside the cylinder
VectorSubtract(start2d, org2d, dir);
l1 = VectorLengthSquared(dir);
if (l1 < Square(radius)) {
trace.fraction = 0;
trace.startsolid = qtrue;
VectorSubtract(end2d, org2d, dir);
l1 = VectorLengthSquared(dir);
if (l1 < Square(radius)) {
trace.allsolid = qtrue;
}
return;
}
}
//
VectorSubtract(end2d, start2d, dir);
length = VectorNormalize(dir);
//
l1 = CM_DistanceFromLineSquared(org2d, start2d, end2d, dir);
VectorSubtract(end2d, org2d, v1);
l2 = VectorLengthSquared(v1);
// if no intersection with the cylinder and the end point is at least an epsilon away
if (l1 >= Square(radius) && l2 > Square(radius+SURFACE_CLIP_EPSILON)) {
return;
}
//
//
// (start[0] - origin[0] - t * dir[0]) ^ 2 + (start[1] - origin[1] - t * dir[1]) ^ 2 = radius ^ 2
// (v1[0] + t * dir[0]) ^ 2 + (v1[1] + t * dir[1]) ^ 2 = radius ^ 2;
// v1[0] ^ 2 + 2 * v1[0] * t * dir[0] + (t * dir[0]) ^ 2 +
// v1[1] ^ 2 + 2 * v1[1] * t * dir[1] + (t * dir[1]) ^ 2 = radius ^ 2
// t ^ 2 * (dir[0] ^ 2 + dir[1] ^ 2) + t * (2 * v1[0] * dir[0] + 2 * v1[1] * dir[1]) +
// v1[0] ^ 2 + v1[1] ^ 2 - radius ^ 2 = 0
//
VectorSubtract(start, origin, v1);
// dir is normalized so we can use a = 1
//a = 1.0f;// * (dir[0] * dir[0] + dir[1] * dir[1]);
b = 2.0f * (v1[0] * dir[0] + v1[1] * dir[1]);
c = v1[0] * v1[0] + v1[1] * v1[1] - (radius+RADIUS_EPSILON) * (radius+RADIUS_EPSILON);
d = b * b - 4.0f * c;// * a;
if (d > 0) {
sqrtd = sqrtf(d);
// = (- b + sqrtd) * 0.5f;// / (2.0f * a);
fraction = (- b - sqrtd) * 0.5f;// / (2.0f * a);
//
if (fraction < 0) {
fraction = 0;
}
else {
fraction /= length;
}
if ( fraction < trace.fraction ) {
VectorSubtract(end, start, dir);
VectorMA(start, fraction, dir, intersection);
// if the intersection is between the cylinder lower and upper bound
if (intersection[2] <= origin[2] + halfheight &&
intersection[2] >= origin[2] - halfheight) {
//
trace.fraction = fraction;
VectorSubtract(intersection, origin, dir);
dir[2] = 0;
#ifdef CAPSULE_DEBUG
l2 = VectorLength(dir);
if (l2 <= radius) {
int bah = 1;
}
#endif
scale = 1 / (radius+RADIUS_EPSILON);
VectorScale(dir, scale, dir);
VectorCopy(dir, trace.plane.normal);
VectorAdd( tw->modelOrigin, intersection, intersection);
trace.plane.dist = DotProduct(trace.plane.normal, intersection);
trace.contents = CONTENTS_BODY;
}
}
}
else if (d == 0) {
//t[0] = (- b ) / 2 * a;
// slide along the cylinder
//.........这里部分代码省略.........
示例11: CM_TraceThroughLeaf
//.........这里部分代码省略.........
if ( !(patch->contents & tw->contents) ) {
continue;
}
CM_TraceThroughPatch( tw, trace, patch );
if ( !trace.fraction ) {
return;
}
}
}
}
#define RADIUS_EPSILON 1.0f
/*
================
CM_TraceThroughSphere
get the first intersection of the ray with the sphere
================
*/
void CM_TraceThroughSphere( traceWork_t *tw, trace_t &trace, vec3_t origin, float radius, vec3_t start, vec3_t end ) {
float l1, l2, length, scale, fraction;
float /*a, */b, c, d, sqrtd;
vec3_t v1, dir, intersection;
// if inside the sphere
VectorSubtract(start, origin, dir);
l1 = VectorLengthSquared(dir);
if (l1 < Square(radius)) {
trace.fraction = 0;
trace.startsolid = qtrue;
// test for allsolid
VectorSubtract(end, origin, dir);
l1 = VectorLengthSquared(dir);
if (l1 < Square(radius)) {
trace.allsolid = qtrue;
}
return;
}
//
VectorSubtract(end, start, dir);
length = VectorNormalize(dir);
//
l1 = CM_DistanceFromLineSquared(origin, start, end, dir);
VectorSubtract(end, origin, v1);
l2 = VectorLengthSquared(v1);
// if no intersection with the sphere and the end point is at least an epsilon away
if (l1 >= Square(radius) && l2 > Square(radius+SURFACE_CLIP_EPSILON)) {
return;
}
//
// | origin - (start + t * dir) | = radius
// a = dir[0]^2 + dir[1]^2 + dir[2]^2;
// b = 2 * (dir[0] * (start[0] - origin[0]) + dir[1] * (start[1] - origin[1]) + dir[2] * (start[2] - origin[2]));
// c = (start[0] - origin[0])^2 + (start[1] - origin[1])^2 + (start[2] - origin[2])^2 - radius^2;
//
VectorSubtract(start, origin, v1);
// dir is normalized so a = 1
//a = 1.0f;//dir[0] * dir[0] + dir[1] * dir[1] + dir[2] * dir[2];
b = 2.0f * (dir[0] * v1[0] + dir[1] * v1[1] + dir[2] * v1[2]);
c = v1[0] * v1[0] + v1[1] * v1[1] + v1[2] * v1[2] - (radius+RADIUS_EPSILON) * (radius+RADIUS_EPSILON);
d = b * b - 4.0f * c;// * a;
if (d > 0) {
sqrtd = sqrtf(d);
// = (- b + sqrtd) * 0.5f; // / (2.0f * a);
fraction = (- b - sqrtd) * 0.5f; // / (2.0f * a);
//
if (fraction < 0) {
fraction = 0;
}
else {
fraction /= length;
}
if ( fraction < trace.fraction ) {
trace.fraction = fraction;
VectorSubtract(end, start, dir);
VectorMA(start, fraction, dir, intersection);
VectorSubtract(intersection, origin, dir);
#ifdef CAPSULE_DEBUG
l2 = VectorLength(dir);
if (l2 < radius) {
int bah = 1;
}
#endif
scale = 1 / (radius+RADIUS_EPSILON);
VectorScale(dir, scale, dir);
VectorCopy(dir, trace.plane.normal);
VectorAdd( tw->modelOrigin, intersection, intersection);
trace.plane.dist = DotProduct(trace.plane.normal, intersection);
trace.contents = CONTENTS_BODY;
}
}
else if (d == 0) {
//t1 = (- b ) / 2;
// slide along the sphere
}
// no intersection at all
}
示例12: AnimateRiders
//.........这里部分代码省略.........
SETANIM_BOTH, Anim, iFlags, iBlend);
#else
NPC_SetAnim( pVeh->m_pPilot, SETANIM_BOTH, Anim, iFlags, iBlend );
if (pVeh->m_pOldPilot)
{
iAnimLen = PM_AnimLength( pVeh->m_pPilot->client->clientInfo.animFileIndex, BOTH_VS_MOUNTTHROWEE);
NPC_SetAnim( pVeh->m_pOldPilot, SETANIM_BOTH, BOTH_VS_MOUNTTHROWEE, iFlags, iBlend );
}
#endif
}
#ifndef _JK2MP
if (pVeh->m_pOldPilot && pVeh->m_pOldPilot->client->ps.torsoAnimTimer<=0)
{
if (Q_irand(0, player->count)==0)
{
player->count++;
player->lastEnemy = pVeh->m_pOldPilot;
G_StartMatrixEffect(player, MEF_LOOK_AT_ENEMY|MEF_NO_RANGEVAR|MEF_NO_VERTBOB|MEF_NO_SPIN, 1000);
}
gentity_t* oldPilot = pVeh->m_pOldPilot;
pVeh->m_pVehicleInfo->Eject(pVeh, pVeh->m_pOldPilot, qtrue); // will set pointer to zero
// Kill Him
//----------
oldPilot->client->noRagTime = -1; // no ragdoll for you
G_Damage(oldPilot, pVeh->m_pPilot, pVeh->m_pPilot, pVeh->m_pPilot->currentAngles, pVeh->m_pPilot->currentOrigin, 1000, 0, MOD_CRUSH);
// Compute THe Throw Direction As Backwards From The Vehicle's Velocity
//----------------------------------------------------------------------
vec3_t throwDir;
VectorScale(pVeh->m_pParentEntity->client->ps.velocity, -1.0f, throwDir);
VectorNormalize(throwDir);
throwDir[2] += 0.3f; // up a little
// Now Throw Him Out
//-------------------
G_Throw(oldPilot, throwDir, VectorLength(pVeh->m_pParentEntity->client->ps.velocity)/10.0f);
NPC_SetAnim(oldPilot, SETANIM_BOTH, BOTH_DEATHBACKWARD1, SETANIM_FLAG_OVERRIDE, iBlend );
}
#endif
return;
}
#ifdef _JK2MP //fixme
if (1) return;
#endif
#ifdef _JK2MP
pilotPS = pVeh->m_pPilot->playerState;
parentPS = pVeh->m_pPilot->playerState;
#else
pilotPS = &pVeh->m_pPilot->client->ps;
parentPS = &pVeh->m_pParentEntity->client->ps;
#endif
#ifndef _JK2MP//SP
curTime = level.time;
#elif QAGAME//MP GAME
curTime = level.time;
#elif CGAME//MP CGAME
//FIXME: pass in ucmd? Not sure if this is reliable...
curTime = pm->cmd.serverTime;
#endif
示例13: G_UpdateZaps
/*
===============
G_UpdateZaps
===============
*/
void G_UpdateZaps( int msec )
{
int i, j;
zap_t *zap;
int damage;
for( i = 0; i < MAX_ZAPS; i++ )
{
zap = &zaps[ i ];
if( zap->used )
{
//check each target is valid
for( j = 0; j < zap->numTargets; j++ )
{
gentity_t *source;
gentity_t *target = zap->targets[ j ];
if( j == 0 )
source = zap->creator;
else
source = zap->targets[ j - 1 ];
if( target->health <= 0 || !target->inuse || //early out
Distance( source->s.origin, target->s.origin ) > LEVEL2_AREAZAP_RANGE )
{
target = zap->targets[ j ] = G_FindNewZapTarget( source );
//couldn't find a target, so forget about the rest of the chain
if( !target )
zap->numTargets = j;
}
}
if( zap->numTargets )
{
for( j = 0; j < zap->numTargets; j++ )
{
gentity_t *source;
gentity_t *target = zap->targets[ j ];
float r = 1.0f / zap->numTargets;
float damageFraction = 2 * r - 2 * j * r * r - r * r;
vec3_t forward;
if( j == 0 )
source = zap->creator;
else
source = zap->targets[ j - 1 ];
damage = ceil( ( (float)msec / LEVEL2_AREAZAP_TIME ) *
LEVEL2_AREAZAP_DMG * damageFraction );
// don't let a high msec value inflate the total damage
if( damage + zap->damageUsed > LEVEL2_AREAZAP_DMG )
damage = LEVEL2_AREAZAP_DMG - zap->damageUsed;
VectorSubtract( target->s.origin, source->s.origin, forward );
VectorNormalize( forward );
//do the damage
if( damage )
{
G_Damage( target, source, zap->creator, forward, target->s.origin,
damage, DAMAGE_NO_KNOCKBACK | DAMAGE_NO_LOCDAMAGE, MOD_LEVEL2_ZAP );
if( g_modAlienRate.integer > 0 )
damage = damage * 100 / g_modAlienRate.integer;
zap->damageUsed += damage;
}
}
}
G_UpdateZapEffect( zap );
zap->timeToLive -= msec;
if( zap->timeToLive <= 0 || zap->numTargets == 0 || zap->creator->health <= 0 )
{
zap->used = qfalse;
G_FreeEntity( zap->effectChannel );
}
}
}
}
示例14: SpotlightCreate
//------------------------------------------------------------------------------
// Purpose : Update the direction and position of my spotlight
// Input :
// Output :
//------------------------------------------------------------------------------
void CPointSpotlight::SpotlightUpdate(void)
{
// ---------------------------------------------------
// If I don't have a spotlight attempt to create one
// ---------------------------------------------------
if ( !m_hSpotlight )
{
if ( m_bSpotlightOn )
{
// Make the spotlight
SpotlightCreate();
}
else
{
return;
}
}
else if ( !m_bSpotlightOn )
{
SpotlightDestroy();
return;
}
if ( !m_hSpotlightTarget )
{
DevWarning( "**Attempting to update point_spotlight but target ent is NULL\n" );
SpotlightDestroy();
SpotlightCreate();
if ( !m_hSpotlightTarget )
return;
}
m_vSpotlightCurrentPos = SpotlightCurrentPos();
// Update spotlight target velocity
Vector vTargetDir;
VectorSubtract( m_vSpotlightCurrentPos, m_hSpotlightTarget->GetAbsOrigin(), vTargetDir );
float vTargetDist = vTargetDir.Length();
// If we haven't moved at all, don't recompute
if ( vTargetDist < 1 )
{
m_hSpotlightTarget->SetAbsVelocity( vec3_origin );
return;
}
Vector vecNewVelocity = vTargetDir;
VectorNormalize(vecNewVelocity);
vecNewVelocity *= (10 * vTargetDist);
// If a large move is requested, just jump to final spot as we probably hit a discontinuity
if (vecNewVelocity.Length() > 200)
{
VectorNormalize(vecNewVelocity);
vecNewVelocity *= 200;
VectorNormalize(vTargetDir);
m_hSpotlightTarget->SetAbsOrigin( m_vSpotlightCurrentPos );
}
m_hSpotlightTarget->SetAbsVelocity( vecNewVelocity );
m_hSpotlightTarget->m_vSpotlightOrg = GetAbsOrigin();
// Avoid sudden change in where beam fades out when cross disconinuities
VectorSubtract( m_hSpotlightTarget->GetAbsOrigin(), m_hSpotlightTarget->m_vSpotlightOrg, m_hSpotlightTarget->m_vSpotlightDir );
float flBeamLength = VectorNormalize( m_hSpotlightTarget->m_vSpotlightDir );
m_flSpotlightCurLength = (0.60*m_flSpotlightCurLength) + (0.4*flBeamLength);
ComputeRenderInfo();
//NDebugOverlay::Cross3D(GetAbsOrigin(),Vector(-5,-5,-5),Vector(5,5,5),0,255,0,true,0.1);
//NDebugOverlay::Cross3D(m_vSpotlightCurrentPos,Vector(-5,-5,-5),Vector(5,5,5),0,255,0,true,0.1);
//NDebugOverlay::Cross3D(m_vSpotlightTargetPos,Vector(-5,-5,-5),Vector(5,5,5),255,0,0,true,0.1);
}
示例15: CG_MiscModelExplosion
void CG_MiscModelExplosion( vec3_t mins, vec3_t maxs, int size, material_t chunkType )
{
int ct = 13;
float r;
vec3_t org, mid, dir;
char *effect = NULL, *effect2 = NULL;
VectorAdd( mins, maxs, mid );
VectorScale( mid, 0.5f, mid );
switch( chunkType )
{
case MAT_GLASS:
effect = "chunks/glassbreak";
ct = 5;
break;
case MAT_GLASS_METAL:
effect = "chunks/glassbreak";
effect2 = "chunks/metalexplode";
ct = 5;
break;
case MAT_ELECTRICAL:
case MAT_ELEC_METAL:
effect = "chunks/sparkexplode";
ct = 5;
break;
case MAT_METAL:
case MAT_METAL2:
case MAT_METAL3:
case MAT_CRATE1:
case MAT_CRATE2:
effect = "chunks/metalexplode";
ct = 2;
break;
case MAT_GRATE1:
effect = "chunks/grateexplode";
ct = 8;
break;
case MAT_ROPE:
ct = 20;
effect = "chunks/ropebreak";
break;
case MAT_WHITE_METAL: //not sure what this crap is really supposed to be..
case MAT_DRK_STONE:
case MAT_LT_STONE:
case MAT_GREY_STONE:
switch( size )
{
case 2:
effect = "chunks/rockbreaklg";
break;
case 1:
default:
effect = "chunks/rockbreakmed";
break;
}
}
if ( !effect )
{
return;
}
ct += 7 * size;
// FIXME: real precache .. VERify that these need to be here...don't think they would because the effects should be registered in g_breakable
theFxScheduler.RegisterEffect( effect );
if ( effect2 )
{
// FIXME: real precache
theFxScheduler.RegisterEffect( effect2 );
}
// spawn chunk roughly in the bbox of the thing..
for ( int i = 0; i < ct; i++ )
{
for( int j = 0; j < 3; j++ )
{
r = random() * 0.8f + 0.1f;
org[j] = ( r * mins[j] + ( 1 - r ) * maxs[j] );
}
// shoot effect away from center
VectorSubtract( org, mid, dir );
VectorNormalize( dir );
if ( effect2 && ( rand() & 1 ))
{
theFxScheduler.PlayEffect( effect2, org, dir );
}
else
{
theFxScheduler.PlayEffect( effect, org, dir );
}
}
}