本文整理汇总了C++中VectorSubtract函数的典型用法代码示例。如果您正苦于以下问题:C++ VectorSubtract函数的具体用法?C++ VectorSubtract怎么用?C++ VectorSubtract使用的例子?那么, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了VectorSubtract函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: memcpy
void CASW_Prediction::CheckMarineError( int nSlot, int commands_acknowledged )
{
C_ASW_Player *player;
Vector origin;
Vector delta;
float len;
static int pos = 0;
// Not in the game yet
if ( !engine->IsInGame() )
return;
// Not running prediction
if ( !cl_predict->GetInt() )
return;
player = C_ASW_Player::GetLocalASWPlayer( nSlot );
if ( !player )
return;
C_ASW_Marine* pMarine = player->GetMarine();
if (!pMarine)
return;
// Not predictable yet (flush entity packet?)
if ( !pMarine->IsIntermediateDataAllocated() )
return;
origin = pMarine->GetNetworkOrigin();
const void *slot = pMarine->GetPredictedFrame( commands_acknowledged - 1 );
if ( !slot )
return;
if ( !m_bMarineOriginTypedescriptionSearched )
{
m_bMarineOriginTypedescriptionSearched = true;
const typedescription_t *td = CPredictionCopy::FindFlatFieldByName( "m_vecNetworkOrigin", pMarine->GetPredDescMap() );
if ( td )
{
m_MarineOriginTypeDescription.AddToTail( td );
}
}
if ( !m_MarineOriginTypeDescription.Count() )
return;
Vector predicted_origin;
memcpy( (Vector *)&predicted_origin, (Vector *)( (byte *)slot + m_MarineOriginTypeDescription[ 0 ]->flatOffset[ TD_OFFSET_PACKED ] ), sizeof( Vector ) );
// Compare what the server returned with what we had predicted it to be
VectorSubtract ( predicted_origin, origin, delta );
len = VectorLength( delta );
if (len > MAX_PREDICTION_ERROR )
{
// A teleport or something, clear out error
len = 0;
}
else
{
if ( len > MIN_PREDICTION_EPSILON )
{
pMarine->NotePredictionError( delta );
if ( cl_showerror.GetInt() >= 1 )
{
con_nprint_t np;
np.fixed_width_font = true;
np.color[0] = 1.0f;
np.color[1] = 0.95f;
np.color[2] = 0.7f;
np.index = 20 + ( ++pos % 20 );
np.time_to_live = 2.0f;
engine->Con_NXPrintf( &np, "marine pred error %6.3f units (%6.3f %6.3f %6.3f)", len, delta.x, delta.y, delta.z );
}
}
}
}
示例2: func_explosive_objective_explode
/*
========================
func_explosive_objective
========================
*/
void func_explosive_objective_explode (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point)
{
vec3_t origin;
vec3_t chunkorigin;
vec3_t size;
int count;
int mass;
int enemy;
int otherteam;
//gi.dprintf(DEVELOPER_MSG_GAME, "self: %s\ninflictor: %s\n attacker: %s\n",
// self->classname, inflictor->classname, attacker->classname);
if (!attacker->client ||
!attacker->client->resp.mos)
return;
// bmodel origins are (0 0 0), we need to adjust that here
VectorScale (self->size, 0.5, size);
VectorAdd (self->absmin, size, origin);
VectorCopy (origin, self->s.origin);
self->takedamage = DAMAGE_NO;
if (self->dmg)
T_RadiusDamage (self, attacker, self->dmg, NULL, self->dmg+40, MOD_EXPLOSIVE);
VectorSubtract (self->s.origin, inflictor->s.origin, self->velocity);
VectorNormalize (self->velocity);
VectorScale (self->velocity, 150, self->velocity);
// start chunks towards the center
VectorScale (size, 0.5, size);
mass = self->mass;
if (!mass)
mass = 75;
// big chunks
if (mass >= 100)
{
count = mass / 100;
if (count > 8)
count = 8;
while(count--)
{
chunkorigin[0] = origin[0] + crandom() * size[0];
chunkorigin[1] = origin[1] + crandom() * size[1];
chunkorigin[2] = origin[2] + crandom() * size[2];
ThrowDebris (self, "models/objects/debris1/tris.md2", 1, chunkorigin);
}
}
// small chunks
count = mass / 25;
if (count > 16)
count = 16;
while(count--)
{
chunkorigin[0] = origin[0] + crandom() * size[0];
chunkorigin[1] = origin[1] + crandom() * size[1];
chunkorigin[2] = origin[2] + crandom() * size[2];
ThrowDebris (self, "models/objects/debris2/tris.md2", 2, chunkorigin);
}
G_UseTargets (self, attacker);
// hack for 2 team games
if (self->obj_owner != 99) {
team_list[self->obj_owner]->score -= self->obj_loss;
enemy = (self->obj_owner) ? 0 : 1;
} else
enemy = 99;
if (self->obj_owner != attacker->client->resp.team_on->index)
team_list[attacker->client->resp.team_on->index]->score += self->obj_gain;
else if (self->obj_owner == attacker->client->resp.team_on->index && enemy != 99)
team_list[enemy]->score += self->obj_gain;
if (dedicated->value)
safe_cprintf(NULL, PRINT_HIGH, "%s destroyed by %s [%s]\n",
self->obj_name,
attacker->client->pers.netname,
team_list[attacker->client->resp.team_on->index]->teamname);
centerprintall("%s destroyed by:\n\n%s\n%s",
self->obj_name,
attacker->client->pers.netname,
team_list[attacker->client->resp.team_on->index]->teamname);
otherteam = (self->obj_owner+1)%2;
if ((!team_list[otherteam]->kills_and_points && team_list[otherteam]->score < team_list[otherteam]->need_points) ||
(team_list[otherteam]->kills_and_points && team_list[otherteam]->kills < team_list[otherteam]->need_kills))
gi.sound(self, CHAN_NO_PHS_ADD, gi.soundindex(va("%s/objectives/touch_cap.wav", team_list[otherteam]->teamid)), 1, 0, 0);
//.........这里部分代码省略.........
示例3: OldBuildST
static void OldBuildST( triangle_t *ptri, int numtri ){
int i, j;
int width, height, iwidth, iheight, swidth;
float basex, basey;
float s_scale, t_scale;
float scale;
vec3_t mins, maxs;
float *pbasevert;
vec3_t vtemp1, vtemp2, normal;
//
// find bounds of all the verts on the base frame
//
ClearBounds( mins, maxs );
for ( i = 0 ; i < numtri ; i++ )
for ( j = 0 ; j < 3 ; j++ )
AddPointToBounds( ptri[i].verts[j], mins, maxs );
for ( i = 0 ; i < 3 ; i++ )
{
mins[i] = floor( mins[i] );
maxs[i] = ceil( maxs[i] );
}
width = maxs[0] - mins[0];
height = maxs[2] - mins[2];
if ( !g_fixedwidth ) { // old style
scale = 8;
if ( width * scale >= 150 ) {
scale = 150.0 / width;
}
if ( height * scale >= 190 ) {
scale = 190.0 / height;
}
s_scale = t_scale = scale;
iwidth = ceil( width * s_scale );
iheight = ceil( height * t_scale );
iwidth += 4;
iheight += 4;
}
else
{ // new style
iwidth = g_fixedwidth / 2;
iheight = g_fixedheight;
s_scale = (float)( iwidth - 4 ) / width;
t_scale = (float)( iheight - 4 ) / height;
}
//
// determine which side of each triangle to map the texture to
//
for ( i = 0 ; i < numtri ; i++ )
{
VectorSubtract( ptri[i].verts[0], ptri[i].verts[1], vtemp1 );
VectorSubtract( ptri[i].verts[2], ptri[i].verts[1], vtemp2 );
CrossProduct( vtemp1, vtemp2, normal );
if ( normal[1] > 0 ) {
basex = iwidth + 2;
}
else
{
basex = 2;
}
basey = 2;
for ( j = 0 ; j < 3 ; j++ )
{
pbasevert = ptri[i].verts[j];
triangle_st[i][j][0] = Q_rint( ( pbasevert[0] - mins[0] ) * s_scale + basex );
triangle_st[i][j][1] = Q_rint( ( maxs[2] - pbasevert[2] ) * t_scale + basey );
}
}
// make the width a multiple of 4; some hardware requires this, and it ensures
// dword alignment for each scan
swidth = iwidth * 2;
model.skinwidth = ( swidth + 3 ) & ~3;
model.skinheight = iheight;
}
示例4: 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;
}
示例5: impact
/*
=================
fire_hit
Used for all impact (hit/punch/slash) attacks
=================
*/
qboolean fire_hit (edict_t *self, vec3_t aim, int damage, int kick)
{
trace_t tr;
vec3_t forward, right, up;
vec3_t v;
vec3_t point;
float range;
vec3_t dir;
//see if enemy is in range
VectorSubtract (self->enemy->s.origin, self->s.origin, dir);
range = VectorLength(dir);
if (range > aim[0])
return false;
if (aim[1] > self->mins[0] && aim[1] < self->maxs[0])
{
// the hit is straight on so back the range up to the edge of their bbox
range -= self->enemy->maxs[0];
}
else
{
// this is a side hit so adjust the "right" value out to the edge of their bbox
if (aim[1] < 0)
aim[1] = self->enemy->mins[0];
else
aim[1] = self->enemy->maxs[0];
}
VectorMA (self->s.origin, range, dir, point);
tr = gi.trace (self->s.origin, NULL, NULL, point, self, MASK_SHOT);
if (tr.fraction < 1)
{
if (!tr.ent->takedamage)
return false;
// if it will hit any client/monster then hit the one we wanted to hit
if ((tr.ent->svflags & SVF_MONSTER) || (tr.ent->client))
tr.ent = self->enemy;
}
AngleVectors(self->s.angles, forward, right, up);
VectorMA (self->s.origin, range, forward, point);
VectorMA (point, aim[1], right, point);
VectorMA (point, aim[2], up, point);
VectorSubtract (point, self->enemy->s.origin, dir);
// do the damage
T_Damage (tr.ent, self, self, dir, point, vec3_origin, damage, kick/2, DAMAGE_NO_KNOCKBACK, MOD_HIT);
if (!(tr.ent->svflags & SVF_MONSTER) && (!tr.ent->client))
return false;
// do our special form of knockback here
VectorMA (self->enemy->absmin, 0.5, self->enemy->size, v);
VectorSubtract (v, point, v);
VectorNormalize (v);
VectorMA (self->enemy->velocity, kick, v, self->enemy->velocity);
if (self->enemy->velocity[2] > 0)
self->enemy->groundentity = NULL;
return true;
}
示例6: heat_think
void heat_think (edict_t *self)
{
edict_t *target = NULL;
edict_t *aquire = NULL;
vec3_t vec;
int len;
int oldlen = 0;
if (!self)
{
return;
}
VectorClear(vec);
/* aquire new target */
while ((target = findradius(target, self->s.origin, 1024)) != NULL)
{
if (self->owner == target)
{
continue;
}
if (!(target->svflags & SVF_MONSTER))
{
continue;
}
if (!target->client)
{
continue;
}
if (target->health <= 0)
{
continue;
}
if (!visible(self, target))
{
continue;
}
if (!infront(self, target))
{
continue;
}
VectorSubtract(self->s.origin, target->s.origin, vec);
len = VectorLength(vec);
if ((aquire == NULL) || (len < oldlen))
{
aquire = target;
self->target_ent = aquire;
oldlen = len;
}
}
if (aquire != NULL)
{
VectorSubtract(aquire->s.origin, self->s.origin, vec);
vectoangles(vec, self->s.angles);
VectorNormalize(vec);
VectorCopy(vec, self->movedir);
VectorScale(vec, 500, self->velocity);
}
self->nextthink = level.time + 0.1;
}
示例7: Grenade_Explode
/*
=================
fire_grenade
=================
*/
void Grenade_Explode (edict_t *ent)
{
vec3_t origin;
int mod;
if (!ent)
{
return;
}
if (ent->owner->client)
{
PlayerNoise(ent->owner, ent->s.origin, PNOISE_IMPACT);
}
if (ent->enemy)
{
float points;
vec3_t v;
vec3_t dir;
VectorAdd(ent->enemy->mins, ent->enemy->maxs, v);
VectorMA(ent->enemy->s.origin, 0.5, v, v);
VectorSubtract(ent->s.origin, v, v);
points = ent->dmg - 0.5 * VectorLength(v);
VectorSubtract(ent->enemy->s.origin, ent->s.origin, dir);
if (ent->spawnflags & 1)
{
mod = MOD_HANDGRENADE;
}
else
{
mod = MOD_GRENADE;
}
T_Damage(ent->enemy, ent, ent->owner, dir, ent->s.origin, vec3_origin,
(int)points, (int)points, DAMAGE_RADIUS, mod);
}
if (ent->spawnflags & 2)
{
mod = MOD_HELD_GRENADE;
}
else if (ent->spawnflags & 1)
{
mod = MOD_HG_SPLASH;
}
else
{
mod = MOD_G_SPLASH;
}
T_RadiusDamage(ent, ent->owner, ent->dmg, ent->enemy, ent->dmg_radius, mod);
VectorMA(ent->s.origin, -0.02, ent->velocity, origin);
gi.WriteByte(svc_temp_entity);
if (ent->waterlevel)
{
if (ent->groundentity)
{
gi.WriteByte(TE_GRENADE_EXPLOSION_WATER);
}
else
{
gi.WriteByte(TE_ROCKET_EXPLOSION_WATER);
}
}
else
{
if (ent->groundentity)
{
gi.WriteByte(TE_GRENADE_EXPLOSION);
}
else
{
gi.WriteByte(TE_ROCKET_EXPLOSION);
}
}
gi.WritePosition(origin);
gi.multicast(ent->s.origin, MULTICAST_PHS);
G_FreeEdict(ent);
}
示例8: InitFlyby
static qboolean
InitFlyby (player_state_t * self, player_state_t * player, int checkvis)
{
float f, max;
vec3_t vec, vec2;
vec3_t forward, right, up;
VectorCopy (player->viewangles, vec);
vec[0] = 0;
AngleVectors (vec, forward, right, up);
// for (i = 0; i < 3; i++)
// forward[i] *= 3;
max = 1000;
VectorAdd (forward, up, vec2);
VectorAdd (vec2, right, vec2);
if ((f = Cam_TryFlyby (self, player, vec2, checkvis)) < max) {
max = f;
VectorCopy (vec2, vec);
}
VectorAdd (forward, up, vec2);
VectorSubtract (vec2, right, vec2);
if ((f = Cam_TryFlyby (self, player, vec2, checkvis)) < max) {
max = f;
VectorCopy (vec2, vec);
}
VectorAdd (forward, right, vec2);
if ((f = Cam_TryFlyby (self, player, vec2, checkvis)) < max) {
max = f;
VectorCopy (vec2, vec);
}
VectorSubtract (forward, right, vec2);
if ((f = Cam_TryFlyby (self, player, vec2, checkvis)) < max) {
max = f;
VectorCopy (vec2, vec);
}
VectorAdd (forward, up, vec2);
if ((f = Cam_TryFlyby (self, player, vec2, checkvis)) < max) {
max = f;
VectorCopy (vec2, vec);
}
VectorSubtract (forward, up, vec2);
if ((f = Cam_TryFlyby (self, player, vec2, checkvis)) < max) {
max = f;
VectorCopy (vec2, vec);
}
VectorAdd (up, right, vec2);
VectorSubtract (vec2, forward, vec2);
if ((f = Cam_TryFlyby (self, player, vec2, checkvis)) < max) {
max = f;
VectorCopy (vec2, vec);
}
VectorSubtract (up, right, vec2);
VectorSubtract (vec2, forward, vec2);
if ((f = Cam_TryFlyby (self, player, vec2, checkvis)) < max) {
max = f;
VectorCopy (vec2, vec);
}
// invert
VectorSubtract (vec3_origin, forward, vec2);
if ((f = Cam_TryFlyby (self, player, vec2, checkvis)) < max) {
max = f;
VectorCopy (vec2, vec);
}
VectorCopy (forward, vec2);
if ((f = Cam_TryFlyby (self, player, vec2, checkvis)) < max) {
max = f;
VectorCopy (vec2, vec);
}
// invert
VectorSubtract (vec3_origin, right, vec2);
if ((f = Cam_TryFlyby (self, player, vec2, checkvis)) < max) {
max = f;
VectorCopy (vec2, vec);
}
VectorCopy (right, vec2);
if ((f = Cam_TryFlyby (self, player, vec2, checkvis)) < max) {
max = f;
VectorCopy (vec2, vec);
}
// ack, can't find him
if (max >= 1000) {
// Cam_Unlock();
return false;
}
locked = true;
VectorCopy (vec, desired_position);
return true;
}
示例9: Cam_Track
// ZOID
//
// Take over the user controls and track a player.
// We find a nice position to watch the player and move there
void
Cam_Track (usercmd_t *cmd)
{
player_state_t *player, *self;
frame_t *frame;
vec3_t vec;
float len;
if (!cl.spectator)
return;
if (cl_hightrack->int_val && !locked)
Cam_CheckHighTarget ();
if (!autocam || cls.state != ca_active)
return;
if (locked
&& (!cl.players[spec_track].name[0]
|| cl.players[spec_track].spectator)) {
locked = false;
if (cl_hightrack->int_val)
Cam_CheckHighTarget ();
else
Cam_Unlock ();
return;
}
frame = &cl.frames[cls.netchan.incoming_sequence & UPDATE_MASK];
player = frame->playerstate + spec_track;
self = frame->playerstate + cl.playernum;
if (!locked || !Cam_IsVisible (player, desired_position)) {
if (!locked || realtime - cam_lastviewtime > 0.1) {
if (!InitFlyby (self, player, true))
InitFlyby (self, player, false);
cam_lastviewtime = realtime;
}
} else
cam_lastviewtime = realtime;
// couldn't track for some reason
if (!locked || !autocam)
return;
if (cl_chasecam->int_val) {
cmd->forwardmove = cmd->sidemove = cmd->upmove = 0;
VectorCopy (player->viewangles, cl.viewangles);
VectorCopy (player->origin, desired_position);
if (memcmp (&desired_position, &self->origin, sizeof (desired_position))
!= 0) {
MSG_WriteByte (&cls.netchan.message, clc_tmove);
MSG_WriteCoord (&cls.netchan.message, desired_position[0]);
MSG_WriteCoord (&cls.netchan.message, desired_position[1]);
MSG_WriteCoord (&cls.netchan.message, desired_position[2]);
// move there locally immediately
VectorCopy (desired_position, self->origin);
}
self->weaponframe = player->weaponframe;
} else {
// Ok, move to our desired position and set our angles to view
// the player
VectorSubtract (desired_position, self->origin, vec);
len = vlen (vec);
cmd->forwardmove = cmd->sidemove = cmd->upmove = 0;
if (len > 16) { // close enough?
MSG_WriteByte (&cls.netchan.message, clc_tmove);
MSG_WriteCoord (&cls.netchan.message, desired_position[0]);
MSG_WriteCoord (&cls.netchan.message, desired_position[1]);
MSG_WriteCoord (&cls.netchan.message, desired_position[2]);
}
// move there locally immediately
VectorCopy (desired_position, self->origin);
VectorSubtract (player->origin, desired_position, vec);
vectoangles (vec, cl.viewangles);
cl.viewangles[0] = -cl.viewangles[0];
}
}
示例10: fabs
/*
=================
BaseWindingForPlane
=================
*/
winding_t *BaseWindingForPlane (vec3_t normal, vec_t dist)
{
int i, x;
vec_t max, v;
vec3_t org, vright, vup;
winding_t *w;
// find the major axis
max = -MAX_MAP_BOUNDS;
x = -1;
for (i=0 ; i<3; i++)
{
v = fabs(normal[i]);
if (v > max)
{
x = i;
max = v;
}
}
if (x==-1)
Com_Error (ERR_DROP, "BaseWindingForPlane: no axis found");
VectorCopy (vec3_origin, vup);
switch (x)
{
case 0:
case 1:
vup[2] = 1;
break;
case 2:
vup[0] = 1;
break;
}
v = DotProduct (vup, normal);
VectorMA (vup, -v, normal, vup);
VectorNormalize2(vup, vup);
VectorScale (normal, dist, org);
CrossProduct (vup, normal, vright);
VectorScale (vup, MAX_MAP_BOUNDS, vup);
VectorScale (vright, MAX_MAP_BOUNDS, vright);
// project a really big axis aligned box onto the plane
w = AllocWinding (4);
VectorSubtract (org, vright, w->p[0]);
VectorAdd (w->p[0], vup, w->p[0]);
VectorAdd (org, vright, w->p[1]);
VectorAdd (w->p[1], vup, w->p[1]);
VectorAdd (org, vright, w->p[2]);
VectorSubtract (w->p[2], vup, w->p[2]);
VectorSubtract (org, vright, w->p[3]);
VectorSubtract (w->p[3], vup, w->p[3]);
w->numpoints = 4;
return w;
}
示例11: AddWindingToConvexHull
void AddWindingToConvexHull( winding_t *w, winding_t **hull, vec3_t normal ) {
int i, j, k;
float *p, *copy;
vec3_t dir;
float d;
int numHullPoints, numNew;
vec3_t hullPoints[MAX_HULL_POINTS];
vec3_t newHullPoints[MAX_HULL_POINTS];
vec3_t hullDirs[MAX_HULL_POINTS];
qboolean hullSide[MAX_HULL_POINTS];
qboolean outside;
if ( !*hull ) {
*hull = CopyWinding( w );
return;
}
numHullPoints = (*hull)->numpoints;
Com_Memcpy( hullPoints, (*hull)->p, numHullPoints * sizeof(vec3_t) );
for ( i = 0 ; i < w->numpoints ; i++ ) {
p = w->p[i];
// calculate hull side vectors
for ( j = 0 ; j < numHullPoints ; j++ ) {
k = ( j + 1 ) % numHullPoints;
VectorSubtract( hullPoints[k], hullPoints[j], dir );
VectorNormalize2( dir, dir );
CrossProduct( normal, dir, hullDirs[j] );
}
outside = qfalse;
for ( j = 0 ; j < numHullPoints ; j++ ) {
VectorSubtract( p, hullPoints[j], dir );
d = DotProduct( dir, hullDirs[j] );
if ( d >= ON_EPSILON ) {
outside = qtrue;
}
if ( d >= -ON_EPSILON ) {
hullSide[j] = qtrue;
} else {
hullSide[j] = qfalse;
}
}
// if the point is effectively inside, do nothing
if ( !outside ) {
continue;
}
// find the back side to front side transition
for ( j = 0 ; j < numHullPoints ; j++ ) {
if ( !hullSide[ j % numHullPoints ] && hullSide[ (j + 1) % numHullPoints ] ) {
break;
}
}
if ( j == numHullPoints ) {
continue;
}
// insert the point here
VectorCopy( p, newHullPoints[0] );
numNew = 1;
// copy over all points that aren't double fronts
j = (j+1)%numHullPoints;
for ( k = 0 ; k < numHullPoints ; k++ ) {
if ( hullSide[ (j+k) % numHullPoints ] && hullSide[ (j+k+1) % numHullPoints ] ) {
continue;
}
copy = hullPoints[ (j+k+1) % numHullPoints ];
VectorCopy( copy, newHullPoints[numNew] );
numNew++;
}
numHullPoints = numNew;
Com_Memcpy( hullPoints, newHullPoints, numHullPoints * sizeof(vec3_t) );
}
FreeWinding( *hull );
w = AllocWinding( numHullPoints );
w->numpoints = numHullPoints;
*hull = w;
Com_Memcpy( w->p, hullPoints, numHullPoints * sizeof(vec3_t) );
}
示例12: RB_DrawSun
/*
** RB_DrawSun
*/
void RB_DrawSun( void ) {
float size;
float dist;
vec3_t origin, vec1, vec2;
vec3_t temp;
if ( !backEnd.skyRenderedThisView ) {
return;
}
if ( !r_drawSun->integer ) {
return;
}
qglLoadMatrixf( backEnd.viewParms.world.modelMatrix );
qglTranslatef (backEnd.viewParms.or.origin[0], backEnd.viewParms.or.origin[1], backEnd.viewParms.or.origin[2]);
dist = backEnd.viewParms.zFar / 1.75; // div sqrt(3)
size = dist * 0.4;
VectorScale( tr.sunDirection, dist, origin );
PerpendicularVector( vec1, tr.sunDirection );
CrossProduct( tr.sunDirection, vec1, vec2 );
VectorScale( vec1, size, vec1 );
VectorScale( vec2, size, vec2 );
// farthest depth range
qglDepthRange( 1.0, 1.0 );
// FIXME: use quad stamp
RB_BeginSurface( tr.sunShader, tess.fogNum );
VectorCopy( origin, temp );
VectorSubtract( temp, vec1, temp );
VectorSubtract( temp, vec2, temp );
VectorCopy( temp, tess.xyz[tess.numVertexes] );
tess.texCoords[tess.numVertexes][0][0] = 0;
tess.texCoords[tess.numVertexes][0][1] = 0;
tess.vertexColors[tess.numVertexes][0] = 255;
tess.vertexColors[tess.numVertexes][1] = 255;
tess.vertexColors[tess.numVertexes][2] = 255;
tess.numVertexes++;
VectorCopy( origin, temp );
VectorAdd( temp, vec1, temp );
VectorSubtract( temp, vec2, temp );
VectorCopy( temp, tess.xyz[tess.numVertexes] );
tess.texCoords[tess.numVertexes][0][0] = 0;
tess.texCoords[tess.numVertexes][0][1] = 1;
tess.vertexColors[tess.numVertexes][0] = 255;
tess.vertexColors[tess.numVertexes][1] = 255;
tess.vertexColors[tess.numVertexes][2] = 255;
tess.numVertexes++;
VectorCopy( origin, temp );
VectorAdd( temp, vec1, temp );
VectorAdd( temp, vec2, temp );
VectorCopy( temp, tess.xyz[tess.numVertexes] );
tess.texCoords[tess.numVertexes][0][0] = 1;
tess.texCoords[tess.numVertexes][0][1] = 1;
tess.vertexColors[tess.numVertexes][0] = 255;
tess.vertexColors[tess.numVertexes][1] = 255;
tess.vertexColors[tess.numVertexes][2] = 255;
tess.numVertexes++;
VectorCopy( origin, temp );
VectorSubtract( temp, vec1, temp );
VectorAdd( temp, vec2, temp );
VectorCopy( temp, tess.xyz[tess.numVertexes] );
tess.texCoords[tess.numVertexes][0][0] = 1;
tess.texCoords[tess.numVertexes][0][1] = 0;
tess.vertexColors[tess.numVertexes][0] = 255;
tess.vertexColors[tess.numVertexes][1] = 255;
tess.vertexColors[tess.numVertexes][2] = 255;
tess.numVertexes++;
tess.indexes[tess.numIndexes++] = 0;
tess.indexes[tess.numIndexes++] = 1;
tess.indexes[tess.numIndexes++] = 2;
tess.indexes[tess.numIndexes++] = 0;
tess.indexes[tess.numIndexes++] = 2;
tess.indexes[tess.numIndexes++] = 3;
RB_EndSurface();
// back to normal depth range
qglDepthRange( 0.0, 1.0 );
}
示例13: PM_StepSlideMove
//.........这里部分代码省略.........
pm->trace (&trace, start_o, pm->mins, pm->maxs, up, pm->ps->clientNum, pm->tracemask);
if ( trace.allsolid ) {
if ( pm->debugLevel ) {
Com_Printf("%i:bend can't step\n", c_pmove);
}
return; // can't step up
}
stepSize = trace.endpos[2] - start_o[2];
// try slidemove from this position
VectorCopy (trace.endpos, pm->ps->origin);
VectorCopy (start_v, pm->ps->velocity);
PM_SlideMove( gravity );
// push down the final amount
VectorCopy (pm->ps->origin, down);
down[2] -= stepSize;
pm->trace (&trace, pm->ps->origin, pm->mins, pm->maxs, down, pm->ps->clientNum, pm->tracemask);
if ( pm->stepSlideFix )
{
if ( pm->ps->clientNum < MAX_CLIENTS
&& trace.plane.normal[2] < MIN_WALK_NORMAL )
{ //normal players cannot step up slopes that are too steep to walk on!
vec3_t stepVec;
//okay, the step up ends on a slope that it too steep to step up onto,
//BUT:
//If the step looks like this:
// (B)\__
// \_____(A)
//Then it might still be okay, so we figure out the slope of the entire move
//from (A) to (B) and if that slope is walk-upabble, then it's okay
VectorSubtract( trace.endpos, down_o, stepVec );
VectorNormalize( stepVec );
if ( stepVec[2] > (1.0f-MIN_WALK_NORMAL) )
{
skipStep = qtrue;
}
}
}
if ( !trace.allsolid
&& !skipStep ) //normal players cannot step up slopes that are too steep to walk on!
{
if ( pm->ps->clientNum >= MAX_CLIENTS//NPC
&& isGiant
&& trace.entityNum < MAX_CLIENTS
&& pEnt
&& pEnt->s.NPC_class == CLASS_RANCOR )
{ //Rancor don't step on clients
if ( pm->stepSlideFix )
{
VectorCopy (down_o, pm->ps->origin);
VectorCopy (down_v, pm->ps->velocity);
}
else
{
VectorCopy (start_o, pm->ps->origin);
VectorCopy (start_v, pm->ps->velocity);
}
}
/*
else if ( pm->ps->clientNum >= MAX_CLIENTS//NPC
&& isGiant
&& trace.entityNum < MAX_CLIENTS
示例14: PM_VehicleImpact
//.........这里部分代码省略.........
if (pSelfVeh->m_pVehicleInfo->type == VH_SPEEDER)
{
pm->ps->speed *= pml.frametime;
VectorCopy(trace->plane.normal, bounceDir);
}
else if ( trace->plane.normal[2] >= MIN_LANDING_SLOPE//flat enough to land on
&& pSelfVeh->m_LandTrace.fraction < 1.0f //ground present
&& pm->ps->speed <= MIN_LANDING_SPEED )
{ //could land here, don't bounce off, in fact, return altogether!
return;
}
else
{
if (pSelfVeh->m_pVehicleInfo->type == VH_FIGHTER)
{
turnFromImpact = qtrue;
}
VectorCopy(trace->plane.normal, bounceDir);
}
}
else if ( pSelfVeh->m_pVehicleInfo->type == VH_FIGHTER )
{ //check for impact with another fighter
#ifndef QAGAME
bgEntity_t *hitEnt = PM_BGEntForNum(trace->entityNum);
#endif
if ( hitEnt->s.NPC_class == CLASS_VEHICLE
&& hitEnt->m_pVehicle
&& hitEnt->m_pVehicle->m_pVehicleInfo
&& hitEnt->m_pVehicle->m_pVehicleInfo->type == VH_FIGHTER )
{ //two vehicles hit each other, turn away from the impact
turnFromImpact = qtrue;
turnHitEnt = qtrue;
#ifndef QAGAME
VectorSubtract( pm->ps->origin, hitEnt->s.origin, bounceDir );
#else
VectorSubtract( pm->ps->origin, hitEnt->r.currentOrigin, bounceDir );
#endif
VectorNormalize( bounceDir );
}
}
if ( turnFromImpact )
{ //bounce off impact surf and turn away
vec3_t pushDir= {0}, turnAwayAngles, turnDelta;
float turnStrength, pitchTurnStrength, yawTurnStrength;
vec3_t moveDir;
float bounceDot, turnDivider;
//bounce
if ( !turnHitEnt )
{ //hit wall
VectorScale(bounceDir, (pm->ps->speed*0.25f/pSelfVeh->m_pVehicleInfo->mass), pushDir);
}
else
{ //hit another fighter
#ifndef QAGAME
VectorScale( bounceDir, (pm->ps->speed+hitEnt->s.speed)*0.5f, bounceDir );
#else
if ( hitEnt->client )
{
VectorScale( bounceDir, (pm->ps->speed+hitEnt->client->ps.speed)*0.5f, pushDir );
}
else
{
VectorScale( bounceDir, (pm->ps->speed+hitEnt->s.speed)*0.5f, pushDir );
}
#endif
VectorScale(pushDir, (l/pSelfVeh->m_pVehicleInfo->mass), pushDir);
示例15: 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 );
//.........这里部分代码省略.........