/* ------------------------- NPC_BSHowler_Default ------------------------- */ void NPC_BSHowler_Default( void ) { if ( NPC->client->ps.legsAnim != BOTH_GESTURE1 ) { NPC->count = 0; } //FIXME: if in jump, do damage in front and maybe knock them down? if ( !TIMER_Done( NPC, "attacking" ) ) { if ( NPC->enemy ) { //NPC_FaceEnemy( qfalse ); Howler_Attack( Distance( NPC->enemy->currentOrigin, NPC->currentOrigin ) ); } else { //NPC_UpdateAngles( qfalse, qtrue ); Howler_Attack( 0.0f ); } NPC_UpdateAngles( qfalse, qtrue ); return; } if ( NPC->enemy ) { if ( NPCInfo->stats.aggression > 0 ) { if ( TIMER_Done( NPC, "aggressionDecay" ) ) { NPCInfo->stats.aggression--; TIMER_Set( NPC, "aggressionDecay", 500 ); } } if ( !TIMER_Done( NPC, "flee" ) && NPC_BSFlee() ) //this can clear ENEMY {//successfully trying to run away return; } if ( NPC->enemy == NULL) { NPC_UpdateAngles( qfalse, qtrue ); return; } if ( NPCInfo->localState == LSTATE_FLEE ) {//we were fleeing, now done (either timer ran out or we cannot flee anymore if ( NPC_ClearLOS( NPC->enemy ) ) {//if enemy is still around, go berzerk NPCInfo->localState = LSTATE_BERZERK; } else {//otherwise, lick our wounds? NPCInfo->localState = LSTATE_CLEAR; TIMER_Set( NPC, "standing", Q_irand( 3000, 10000 ) ); } } else if ( NPCInfo->localState == LSTATE_BERZERK ) {//go nuts! } else if ( NPCInfo->stats.aggression >= Q_irand( 75, 125 ) ) {//that's it, go nuts! NPCInfo->localState = LSTATE_BERZERK; } else if ( !TIMER_Done( NPC, "retreating" ) ) {//trying to back off NPC_FaceEnemy( qtrue ); if ( NPC->client->ps.speed > NPCInfo->stats.walkSpeed ) { NPC->client->ps.speed = NPCInfo->stats.walkSpeed; } ucmd.buttons |= BUTTON_WALKING; if ( Distance( NPC->enemy->currentOrigin, NPC->currentOrigin ) < HOWLER_RETREAT_DIST ) {//enemy is close vec3_t moveDir; AngleVectors( NPC->currentAngles, moveDir, NULL, NULL ); VectorScale( moveDir, -1, moveDir ); if ( !NAV_DirSafe( NPC, moveDir, 8 ) ) {//enemy is backing me up against a wall or ledge! Start to get really mad! NPCInfo->stats.aggression += 2; } else {//back off ucmd.forwardmove = -127; } //enemy won't leave me alone, get mad... NPCInfo->stats.aggression++; } return; } else if ( TIMER_Done( NPC, "standing" ) ) {//not standing around if ( !(NPCInfo->last_ucmd.forwardmove) && !(NPCInfo->last_ucmd.rightmove) ) {//stood last frame if ( TIMER_Done( NPC, "walking" ) && TIMER_Done( NPC, "running" ) ) {//not walking or running if ( Q_irand( 0, 2 ) ) {//run for a while TIMER_Set( NPC, "walking", Q_irand( 4000, 8000 ) ); } else {//walk for a bit TIMER_Set( NPC, "running", Q_irand( 2500, 5000 ) ); } } } else if ( (NPCInfo->last_ucmd.buttons&BUTTON_WALKING) ) {//walked last frame if ( TIMER_Done( NPC, "walking" ) ) {//just finished walking if ( Q_irand( 0, 5 ) || DistanceSquared( NPC->enemy->currentOrigin, NPC->currentOrigin ) < MAX_DISTANCE_SQR ) {//run for a while TIMER_Set( NPC, "running", Q_irand( 4000, 20000 ) ); } else {//stand for a bit TIMER_Set( NPC, "standing", Q_irand( 2000, 6000 ) ); } } } else {//ran last frame if ( TIMER_Done( NPC, "running" ) ) {//just finished running if ( Q_irand( 0, 8 ) || DistanceSquared( NPC->enemy->currentOrigin, NPC->currentOrigin ) < MAX_DISTANCE_SQR ) {//walk for a while TIMER_Set( NPC, "walking", Q_irand( 3000, 10000 ) ); } else {//stand for a bit TIMER_Set( NPC, "standing", Q_irand( 2000, 6000 ) ); } } } } if ( NPC_ValidEnemy( NPC->enemy ) == qfalse ) { TIMER_Remove( NPC, "lookForNewEnemy" );//make them look again right now if ( !NPC->enemy->inuse || level.time - NPC->enemy->s.time > Q_irand( 10000, 15000 ) ) {//it's been a while since the enemy died, or enemy is completely gone, get bored with him NPC->enemy = NULL; Howler_Patrol(); NPC_UpdateAngles( qtrue, qtrue ); return; } } if ( TIMER_Done( NPC, "lookForNewEnemy" ) ) { gentity_t *sav_enemy = NPC->enemy;//FIXME: what about NPC->lastEnemy? NPC->enemy = NULL; gentity_t *newEnemy = NPC_CheckEnemy( NPCInfo->confusionTime < level.time, qfalse, qfalse ); NPC->enemy = sav_enemy; if ( newEnemy && newEnemy != sav_enemy ) {//picked up a new enemy! NPC->lastEnemy = NPC->enemy; G_SetEnemy( NPC, newEnemy ); if ( NPC->enemy != NPC->lastEnemy ) {//clear this so that we only sniff the player the first time we pick them up NPC->useDebounceTime = 0; } //hold this one for at least 5-15 seconds TIMER_Set( NPC, "lookForNewEnemy", Q_irand( 5000, 15000 ) ); } else {//look again in 2-5 secs TIMER_Set( NPC, "lookForNewEnemy", Q_irand( 2000, 5000 ) ); } } Howler_Combat(); if ( TIMER_Done( NPC, "speaking" ) ) { if ( !TIMER_Done( NPC, "standing" ) || !TIMER_Done( NPC, "retreating" )) { G_SoundOnEnt( NPC, CHAN_VOICE, va( "sound/chars/howler/idle_hiss%d.mp3", Q_irand( 1, 2 ) ) ); } else if ( !TIMER_Done( NPC, "walking" ) || NPCInfo->localState == LSTATE_FLEE ) { G_SoundOnEnt( NPC, CHAN_VOICE, va( "sound/chars/howler/howl_talk%d.mp3", Q_irand( 1, 5 ) ) ); } else { G_SoundOnEnt( NPC, CHAN_VOICE, va( "sound/chars/howler/howl_yell%d.mp3", Q_irand( 1, 5 ) ) ); } if ( NPCInfo->localState == LSTATE_BERZERK || NPCInfo->localState == LSTATE_FLEE ) { TIMER_Set( NPC, "speaking", Q_irand( 1000, 4000 ) ); } else { TIMER_Set( NPC, "speaking", Q_irand( 3000, 8000 ) ); } } return; } else { if ( TIMER_Done( NPC, "speaking" ) ) { if ( !Q_irand( 0, 3 ) ) { G_SoundOnEnt( NPC, CHAN_VOICE, va( "sound/chars/howler/idle_hiss%d.mp3", Q_irand( 1, 2 ) ) ); } else { G_SoundOnEnt( NPC, CHAN_VOICE, va( "sound/chars/howler/howl_talk%d.mp3", Q_irand( 1, 5 ) ) ); } TIMER_Set( NPC, "speaking", Q_irand( 4000, 12000 ) ); } if ( NPCInfo->stats.aggression > 0 ) { if ( TIMER_Done( NPC, "aggressionDecay" ) ) { NPCInfo->stats.aggression--; TIMER_Set( NPC, "aggressionDecay", 200 ); } } if ( TIMER_Done( NPC, "standing" ) ) {//not standing around if ( !(NPCInfo->last_ucmd.forwardmove) && !(NPCInfo->last_ucmd.rightmove) ) {//stood last frame if ( TIMER_Done( NPC, "walking" ) && TIMER_Done( NPC, "running" ) ) {//not walking or running if ( NPCInfo->goalEntity ) {//have somewhere to go if ( Q_irand( 0, 2 ) ) {//walk for a while TIMER_Set( NPC, "walking", Q_irand( 3000, 10000 ) ); } else {//run for a bit TIMER_Set( NPC, "running", Q_irand( 2500, 5000 ) ); } } } } else if ( (NPCInfo->last_ucmd.buttons&BUTTON_WALKING) ) {//walked last frame if ( TIMER_Done( NPC, "walking" ) ) {//just finished walking if ( Q_irand( 0, 3 ) ) {//run for a while TIMER_Set( NPC, "running", Q_irand( 3000, 6000 ) ); } else {//stand for a bit TIMER_Set( NPC, "standing", Q_irand( 2500, 5000 ) ); } } } else {//ran last frame if ( TIMER_Done( NPC, "running" ) ) {//just finished running if ( Q_irand( 0, 2 ) ) {//walk for a while TIMER_Set( NPC, "walking", Q_irand( 6000, 15000 ) ); } else {//stand for a bit TIMER_Set( NPC, "standing", Q_irand( 4000, 6000 ) ); } } } } if ( NPCInfo->scriptFlags & SCF_LOOK_FOR_ENEMIES ) { Howler_Patrol(); } else { Howler_Idle(); } } NPC_UpdateAngles( qfalse, qtrue ); }
float Ray::Distance(const Capsule &capsule) const { return Max(0.f, Distance(capsule.l) - capsule.r); }
Index(const Matrix<ElementType>& features, const IndexParams& params, Distance distance = Distance() ) : index_params_(params) { flann_algorithm_t index_type = get_param<flann_algorithm_t>(params,"algorithm"); loaded_ = false; if (index_type == FLANN_INDEX_SAVED) { nnIndex_ = load_saved_index<Distance>(features, get_param<cv::String>(params,"filename"), distance); loaded_ = true; } else { nnIndex_ = create_index_by_type<Distance>(features, params, distance); } }
float Ray::Distance(const Ray &ray) const { return Distance(ray, 0, 0); }
float Ray::Distance(const LineSegment &lineSegment) const { return Distance(lineSegment, 0, 0); }
//---------------------------------- void Rancor_Combat( void ) { if ( NPC->count ) {//holding my enemy if ( TIMER_Done2( NPC, "takingPain", qtrue )) { NPCInfo->localState = LSTATE_CLEAR; } else { Rancor_Attack( 0, qfalse ); } NPC_UpdateAngles( qtrue, qtrue ); return; } // If we cannot see our target or we have somewhere to go, then do that if ( !NPC_ClearLOS4( NPC->enemy ) )//|| UpdateGoal( )) { NPCInfo->combatMove = qtrue; NPCInfo->goalEntity = NPC->enemy; NPCInfo->goalRadius = MIN_DISTANCE;//MAX_DISTANCE; // just get us within combat range if ( !NPC_MoveToGoal( qtrue ) ) {//couldn't go after him? Look for a new one TIMER_Set( NPC, "lookForNewEnemy", 0 ); NPCInfo->consecutiveBlockedMoves++; } else { NPCInfo->consecutiveBlockedMoves = 0; } return; } // Sometimes I have problems with facing the enemy I'm attacking, so force the issue so I don't look dumb NPC_FaceEnemy( qtrue ); { float distance; qboolean advance; qboolean doCharge; distance = Distance( NPC->r.currentOrigin, NPC->enemy->r.currentOrigin ); advance = (qboolean)( distance > (NPC->r.maxs[0]+MIN_DISTANCE) ? qtrue : qfalse ); doCharge = qfalse; if ( advance ) {//have to get closer vec3_t yawOnlyAngles; VectorSet( yawOnlyAngles, 0, NPC->r.currentAngles[YAW], 0 ); if ( NPC->enemy->health > 0 && fabs(distance-250) <= 80 && InFOV3( NPC->enemy->r.currentOrigin, NPC->r.currentOrigin, yawOnlyAngles, 30, 30 ) ) { if ( !Q_irand( 0, 9 ) ) {//go for the charge doCharge = qtrue; advance = qfalse; } } } if (( advance /*|| NPCInfo->localState == LSTATE_WAITING*/ ) && TIMER_Done( NPC, "attacking" )) // waiting monsters can't attack { if ( TIMER_Done2( NPC, "takingPain", qtrue )) { NPCInfo->localState = LSTATE_CLEAR; } else { Rancor_Move( 1 ); } } else { Rancor_Attack( distance, doCharge ); } } }
vec3f Plane::Projection( const vec3f& point ) const { return ( point - normal_ * Distance( point ) ); }
bool PlaneGeometry::IsOnPlane( const PlaneGeometry *plane ) const { return ( IsParallel( plane ) && (Distance( plane->GetOrigin() ) < eps) ); }
/** * Resets current offset position of input stream to marked position. * This allows us to back up to this point if the need should arise, * such as when tokenization gets interrupted. * NOTE: IT IS REALLY BAD FORM TO CALL RELEASE WITHOUT CALLING MARK FIRST! * * @update gess 5/12/98 * @param * @return */ void nsScanner::RewindToMark(void){ if (mSlidingBuffer) { mCountRemaining += (Distance(mMarkPosition, mCurrentPosition)); mCurrentPosition = mMarkPosition; } }
bool PlaneGeometry::IsOnPlane( const Point3D &point ) const { return Distance(point) < eps; }
bool PlaneGeometry::IsOnPlane( const Line3D &line ) const { return ( (Distance( line.GetPoint() ) < eps) && (Distance( line.GetPoint2() ) < eps) ); }
int Team_TouchEnemyFlag( gentity_t *ent, gentity_t *other, int team ) { gclient_t *cl = other->client; vec3_t mins, maxs; int num, j, ourFlag; int touch[MAX_GENTITIES]; gentity_t* enemy; float enemyDist, dist; VectorSubtract( ent->s.pos.trBase, minFlagRange, mins ); VectorAdd( ent->s.pos.trBase, maxFlagRange, maxs ); num = trap->EntitiesInBox( mins, maxs, touch, MAX_GENTITIES ); dist = Distance(ent->s.pos.trBase, other->client->ps.origin); if (other->client->sess.sessionTeam == TEAM_RED){ ourFlag = PW_REDFLAG; } else { ourFlag = PW_BLUEFLAG; } for(j = 0; j < num; ++j){ enemy = (g_entities + touch[j]); if (!enemy || !enemy->inuse || !enemy->client){ continue; } //ignore specs if (enemy->client->sess.sessionTeam == TEAM_SPECTATOR) continue; //check if its alive if (enemy->health < 1) continue; // dead people can't pick up items //lets check if he has our flag if (!enemy->client->ps.powerups[ourFlag]) continue; //check if enemy is closer to our flag than us enemyDist = Distance(ent->s.pos.trBase,enemy->client->ps.origin); if (enemyDist < dist){ // possible recursion is hidden in this, but // infinite recursion wont happen, because we cant // have a < b and b < a at the same time return Team_TouchOurFlag( ent, enemy, team ); } } //PrintMsg (NULL, "%s" S_COLOR_WHITE " got the %s flag!\n", // other->client->pers.netname, TeamName(team)); PrintCTFMessage(other->s.number, team, CTFMESSAGE_PLAYER_GOT_FLAG); if (team == TEAM_RED) cl->ps.powerups[PW_REDFLAG] = INT_MAX; // flags never expire else cl->ps.powerups[PW_BLUEFLAG] = INT_MAX; // flags never expire Team_SetFlagStatus( team, FLAG_TAKEN ); AddScore(other, ent->r.currentOrigin, CTF_FLAG_BONUS); cl->pers.teamState.flagsince = level.time; Team_TakeFlagSound( ent, team ); return -1; // Do not respawn this automatically, but do delete it if it was FL_DROPPED }
int Team_TouchOurFlag( gentity_t *ent, gentity_t *other, int team ) { int i, num, j, enemyTeam; gentity_t *player; gclient_t *cl = other->client; int enemy_flag; vec3_t mins, maxs; int touch[MAX_GENTITIES]; gentity_t* enemy; float enemyDist, dist; if (cl->sess.sessionTeam == TEAM_RED) { enemy_flag = PW_BLUEFLAG; } else { enemy_flag = PW_REDFLAG; } if ( ent->flags & FL_DROPPED_ITEM ) { // hey, its not home. return it by teleporting it back //PrintMsg( NULL, "%s" S_COLOR_WHITE " returned the %s flag!\n", // cl->pers.netname, TeamName(team)); PrintCTFMessage(other->s.number, team, CTFMESSAGE_PLAYER_RETURNED_FLAG); AddScore(other, ent->r.currentOrigin, CTF_RECOVERY_BONUS); other->client->pers.teamState.flagrecovery++; other->client->pers.teamState.lastreturnedflag = level.time; //ResetFlag will remove this entity! We must return zero Team_ReturnFlagSound(Team_ResetFlag(team), team); return 0; } // the flag is at home base. if the player has the enemy // flag, he's just won! if (!cl->ps.powerups[enemy_flag]) return 0; // We don't have the flag // fix: captures after timelimit hit could // cause game ending with tied score if (level.intermissionQueued) return 0; // check for enemy closer to grab the flag VectorSubtract( ent->s.pos.trBase, minFlagRange, mins ); VectorAdd( ent->s.pos.trBase, maxFlagRange, maxs ); num = trap->EntitiesInBox( mins, maxs, touch, MAX_GENTITIES ); dist = Distance( ent->s.pos.trBase, other->client->ps.origin ); if (other->client->sess.sessionTeam == TEAM_RED) enemyTeam = TEAM_BLUE; else enemyTeam = TEAM_RED; for (j = 0; j < num; j++) { enemy = (g_entities + touch[j]); if (!enemy || !enemy->inuse || !enemy->client) continue; if (enemy->client->pers.connected != CON_CONNECTED) continue; //check if its alive if (enemy->health < 1) continue; // dead people can't pickup //ignore specs if (enemy->client->sess.sessionTeam == TEAM_SPECTATOR) continue; //check if this is enemy if ((enemy->client->sess.sessionTeam != TEAM_RED && enemy->client->sess.sessionTeam != TEAM_BLUE) || enemy->client->sess.sessionTeam != enemyTeam){ continue; } //check if enemy is closer to our flag than us enemyDist = Distance(ent->s.pos.trBase, enemy->client->ps.origin); if (enemyDist < dist) { // possible recursion is hidden in this, but // infinite recursion wont happen, because we cant // have a < b and b < a at the same time return Team_TouchEnemyFlag( ent, enemy, team ); } } //PrintMsg( NULL, "%s" S_COLOR_WHITE " captured the %s flag!\n", cl->pers.netname, TeamName(OtherTeam(team))); PrintCTFMessage(other->s.number, team, CTFMESSAGE_PLAYER_CAPTURED_FLAG); cl->ps.powerups[enemy_flag] = 0; teamgame.last_flag_capture = level.time; teamgame.last_capture_team = team; // Increase the team's score AddTeamScore(ent->s.pos.trBase, other->client->sess.sessionTeam, 1); other->client->pers.teamState.captures++; other->client->rewardTime = level.time + REWARD_SPRITE_TIME; other->client->ps.persistant[PERS_CAPTURES]++; // other gets another 10 frag bonus AddScore(other, ent->r.currentOrigin, CTF_CAPTURE_BONUS); Team_CaptureFlagSound( ent, team ); // Ok, let's do the player loop, hand out the bonuses for (i = 0; i < sv_maxclients.integer; i++) { player = &g_entities[i]; if (!player->inuse || player == other) continue; if (player->client->sess.sessionTeam != cl->sess.sessionTeam) { player->client->pers.teamState.lasthurtcarrier = -5; } else if (player->client->sess.sessionTeam == cl->sess.sessionTeam) { AddScore(player, ent->r.currentOrigin, CTF_TEAM_BONUS); // award extra points for capture assists if (player->client->pers.teamState.lastreturnedflag + CTF_RETURN_FLAG_ASSIST_TIMEOUT > level.time) { AddScore (player, ent->r.currentOrigin, CTF_RETURN_FLAG_ASSIST_BONUS); other->client->pers.teamState.assists++; player->client->ps.persistant[PERS_ASSIST_COUNT]++; player->client->rewardTime = level.time + REWARD_SPRITE_TIME; } if (player->client->pers.teamState.lastfraggedcarrier + CTF_FRAG_CARRIER_ASSIST_TIMEOUT > level.time) { AddScore(player, ent->r.currentOrigin, CTF_FRAG_CARRIER_ASSIST_BONUS); other->client->pers.teamState.assists++; player->client->ps.persistant[PERS_ASSIST_COUNT]++; player->client->rewardTime = level.time + REWARD_SPRITE_TIME; } } //[EXPsys] if (g_experianceEnabled.integer) { if ((player->client->sess.sessionTeam == cl->sess.sessionTeam)) { GiveExperiance(player, g_experianceWinRound.integer); } else { GiveExperiance(player, g_experianceLoseRound.integer); } } }//[/EXPsys] Team_ResetFlags(); CalculateRanks(); return 0; // Do not respawn this automatically }
static int DelaunayClustering(int MaxClusterSize) { int Count = 0, Count1, Count2 = 0, i, j = 0; Edge *EdgeSet, Key; Node *From, *To, *N, *F, *T; point *u, *v; edge *e_start, *e; delaunay(Dimension); for (i = 0; i < Dimension; i++) { u = &p_array[i]; e_start = e = u->entry_pt; do { v = Other_point(e, u); if (u->id < v->id) Count++; } while ((e = Next(e, u)) != e_start); } assert(EdgeSet = (Edge *) malloc(Count * sizeof(Edge))); for (i = 0; i < Dimension; i++) { u = &p_array[i]; e_start = e = u->entry_pt; do { v = Other_point(e, u); if (u->id < v->id) { EdgeSet[j].From = From = &NodeSet[u->id]; EdgeSet[j].To = To = &NodeSet[v->id]; EdgeSet[j++].Cost = FixedOrCommon(From, To) ? INT_MIN : Distance(From, To) * Precision + From->Pi + To->Pi; } } while ((e = Next(e, u)) != e_start); } free_memory(); if (WeightType == GEO || WeightType == GEOM || WeightType == GEO_MEEUS || WeightType == GEOM_MEEUS) { N = FirstNode; while ((N = N->Suc) != FirstNode) if ((N->Y > 0) != (FirstNode->Y > 0)) break; if (N != FirstNode) { N = FirstNode; do N->Zc = N->Y; while ((N = N->Suc) != FirstNode); /* Transform longitude (180 and -180 map to 0) */ From = FirstNode; do { From->Zc = From->Y; if (WeightType == GEO || WeightType == GEO_MEEUS) From->Y = (int) From->Y + 5.0 * (From->Y - (int) From->Y) / 3.0; From->Y += From->Y > 0 ? -180 : 180; if (WeightType == GEO || WeightType == GEO_MEEUS) From->Y = (int) From->Y + 3.0 * (From->Y - (int) From->Y) / 5.0; } while ((From = From->Suc) != FirstNode); delaunay(Dimension); do From->Y = From->Zc; while ((From = From->Suc) != FirstNode); qsort(EdgeSet, Count, sizeof(Edge), compareFromTo); for (i = 0; i < Dimension; i++) { u = &p_array[i]; e_start = e = u->entry_pt; do { v = Other_point(e, u); if (u->id < v->id) Count2++; } while ((e = Next(e, u)) != e_start); } Count1 = Count; assert(EdgeSet = (Edge *) realloc(EdgeSet, (Count1 + Count2) * sizeof(Edge))); for (i = 0; i < Dimension; i++) { u = &p_array[i]; e_start = e = u->entry_pt; do { v = Other_point(e, u); if (u->id > v->id) continue; Key.From = From = &NodeSet[u->id]; Key.To = To = &NodeSet[v->id]; if (!bsearch (&Key, EdgeSet, Count1, sizeof(Edge), compareFromTo)) { EdgeSet[Count].From = From; EdgeSet[Count].To = To; EdgeSet[Count].Cost = FixedOrCommon(From, To) ? INT_MIN : Distance(From, To) * Precision + From->Pi + To->Pi; Count++; } } while ((e = Next(e, u)) != e_start); } free_memory(); } } qsort(EdgeSet, Count, sizeof(Edge), compareCost); /* Union-Find with path compression */ N = FirstNode; do { N->Next = N; N->Size = 1; } while ((N = N->Suc) != FirstNode); for (i = 0; i < Count; i++) { for (F = EdgeSet[i].From; F != F->Next;) F = F->Next = F->Next->Next; for (T = EdgeSet[i].To; T != T->Next;) T = T->Next = T->Next->Next; if (F != T && F->Size + T->Size <= MaxClusterSize) { if (F->Size < T->Size) { F->Next = T; T->Size += F->Size; } else { T->Next = F; F->Size += T->Size; } } } free(EdgeSet); Count = 0; N = FirstNode; do { if (N->Next == N && N->Size > 3) N->Subproblem = ++Count; } while ((N = N->Suc) != FirstNode); do { for (T = N; T != T->Next;) T = T->Next = T->Next->Next; N->Subproblem = T->Subproblem; } while ((N = N->Suc) != FirstNode); return Count; }
/* =============== CG_CalculateBeamNodeProperties Fills in trailBeamNode_t.textureCoord =============== */ static void CG_CalculateBeamNodeProperties( trailBeam_t *tb ) { trailBeamNode_t *i = nullptr; trailSystem_t *ts; baseTrailBeam_t *btb; float nodeDistances[ MAX_TRAIL_BEAM_NODES ]; float totalDistance = 0.0f, position = 0.0f; int j, numNodes = 0; float TCRange, widthRange, alphaRange; vec3_t colorRange; float fadeAlpha = 1.0f; if ( !tb || !tb->nodes ) { return; } ts = tb->parent; btb = tb->class_; if ( ts->destroyTime > 0 && btb->fadeOutTime ) { fadeAlpha -= ( float )( cg.time - ts->destroyTime ) / btb->fadeOutTime; if ( fadeAlpha < 0.0f ) { fadeAlpha = 0.0f; } } TCRange = tb->class_->backTextureCoord - tb->class_->frontTextureCoord; widthRange = tb->class_->backWidth - tb->class_->frontWidth; alphaRange = tb->class_->backAlpha - tb->class_->frontAlpha; VectorSubtract( tb->class_->backColor, tb->class_->frontColor, colorRange ); for ( i = tb->nodes; i && i->next; i = i->next ) { nodeDistances[ numNodes++ ] = Distance( i->position, i->next->position ); } for ( j = 0; j < numNodes; j++ ) { totalDistance += nodeDistances[ j ]; } for ( j = 0, i = tb->nodes; i; i = i->next, j++ ) { if ( tb->class_->textureType == TBTT_STRETCH ) { i->textureCoord = tb->class_->frontTextureCoord + ( ( position / totalDistance ) * TCRange ); } else if ( tb->class_->textureType == TBTT_REPEAT ) { if ( tb->class_->clampToBack ) { i->textureCoord = ( totalDistance - position ) / tb->class_->repeatLength; } else { i->textureCoord = position / tb->class_->repeatLength; } } i->halfWidth = ( tb->class_->frontWidth + ( ( position / totalDistance ) * widthRange ) ) / 2.0f; i->alpha = ( byte )( ( float ) 0xFF * ( tb->class_->frontAlpha + ( ( position / totalDistance ) * alphaRange ) ) * fadeAlpha ); VectorMA( tb->class_->frontColor, ( position / totalDistance ), colorRange, i->color ); position += nodeDistances[ j ]; } }
Int getUndoTextBuffer(TextBuffer tb) { long caret = -1; if ( tb->undo_buffer != NULL ) { UndoBuffer ub = tb->undo_buffer; UndoCell cell; if ( (cell = ub->current) == NULL ) /* No further undo's */ fail; while(cell != NULL) { DEBUG(NAME_undo, Cprintf("Undo using cell %d: ", Distance(cell, ub->buffer))); switch( cell->type ) { case UNDO_DELETE: { UndoDelete d = (UndoDelete) cell; string s; s.size = d->len; s.iswide = d->iswide; if ( d->iswide ) s.s_textA = d->text.A; else s.s_textW = d->text.W; DEBUG(NAME_undo, Cprintf("Undo delete at %ld, len=%ld\n", d->where, d->len)); insert_textbuffer(tb, d->where, 1, &s); caret = max(caret, d->where + d->len); break; } case UNDO_INSERT: { UndoInsert i = (UndoInsert) cell; DEBUG(NAME_undo, Cprintf("Undo insert at %ld, len=%ld\n", i->where, i->len)); delete_textbuffer(tb, i->where, i->len); caret = max(caret, i->where); break; } case UNDO_CHANGE: { UndoChange c = (UndoChange) cell; string s; s.size = c->len; s.iswide = c->iswide; if ( c->iswide ) s.s_textA = c->text.A; else s.s_textW = c->text.W; DEBUG(NAME_undo, Cprintf("Undo change at %ld, len=%ld\n", c->where, c->len)); change_textbuffer(tb, c->where, &s); caret = max(caret, c->where + c->len); break; } } cell = cell->previous; if ( cell == NULL || cell->marked == TRUE ) { ub->current = cell; if ( cell == ub->checkpoint ) /* reached non-modified checkpoint */ { DEBUG(NAME_undo, Cprintf("Reset modified to @off\n")); CmodifiedTextBuffer(tb, OFF); } changedTextBuffer(tb); ub->undone = TRUE; answer(toInt(caret)); } } } fail; }
const char *AIFunc_Heinrich_Earthquake( cast_state_t *cs ) { gentity_t *ent = &g_entities[cs->entityNum]; gentity_t *enemy; cast_state_t *ecs; vec3_t enemyVec; float enemyDist, scale; trace_t *tr; cs->aiFlags |= AIFL_SPECIAL_FUNC; if ( cs->enemyNum < 0 ) { if ( !ent->client->ps.torsoTimer ) { return AIFunc_DefaultStart( cs ); } return NULL; } enemy = &g_entities[cs->enemyNum]; ecs = AICast_GetCastState( cs->enemyNum ); VectorMA( enemy->r.currentOrigin, HEINRICH_STOMP_DELAY, enemy->client->ps.velocity, enemyVec ); enemyDist = VectorDistance( ent->r.currentOrigin, enemyVec ); if ( ent->client->ps.torsoTimer < 500 ) { int rnd; aicast_predictmove_t move; vec3_t vec; AICast_PredictMovement( ecs, 2, 0.5, &move, &g_entities[cs->enemyNum].client->pers.cmd, -1 ); VectorSubtract( move.endpos, cs->bs->origin, vec ); vec[2] = 0; enemyDist = VectorLength( vec ); enemyDist -= g_entities[cs->enemyNum].r.maxs[0]; enemyDist -= ent->r.maxs[0]; // if ( enemyDist < 140 ) { // combo attack rnd = rand() % 3; switch ( rnd ) { case 0: return AIFunc_Heinrich_SwordSideSlashStart( cs ); case 1: return AIFunc_Heinrich_SwordKnockbackStart( cs ); case 2: return AIFunc_Heinrich_SwordLungeStart( cs ); } } else { // back to roaming ent->client->ps.legsTimer = 0; ent->client->ps.torsoTimer = 0; cs->castScriptStatus.scriptNoMoveTime = 0; AICast_Heinrich_Taunt( cs ); return AIFunc_DefaultStart( cs ); } } // time for the thump? if ( !( cs->aiFlags & AIFL_MISCFLAG1 ) ) { // face them AICast_AimAtEnemy( cs ); // ready for damage? if ( cs->thinkFuncChangeTime < level.time - HEINRICH_STOMP_DELAY ) { cs->aiFlags |= AIFL_MISCFLAG1; // play the stomp sound G_AddEvent( ent, EV_GENERAL_SOUND, G_SoundIndex( aiDefaults[ent->aiCharacter].soundScripts[ORDERSDENYSOUNDSCRIPT] ) ); // check for striking the player tr = CheckMeleeAttack( ent, 70, qfalse ); // do melee damage if ( tr && ( tr->entityNum == cs->enemyNum ) ) { G_Damage( &g_entities[tr->entityNum], ent, ent, vec3_origin, tr->endpos, HEINRICH_STOMP_DAMAGE, 0, MOD_GAUNTLET ); } // call the debris trigger AICast_ScriptEvent( cs, "trigger", "quake" ); } } enemyDist = Distance( enemy->s.pos.trBase, ent->s.pos.trBase ); // do the earthquake effects if ( cs->thinkFuncChangeTime < level.time - HEINRICH_STOMP_DELAY ) { // throw the player into the air, if they are on the ground if ( ( enemy->s.groundEntityNum != ENTITYNUM_NONE ) && enemyDist < HEINRICH_STOMP_RANGE ) { scale = 0.5 + 0.5 * ( (float)ent->client->ps.torsoTimer / 1000.0 ); if ( scale > 1.0 ) { scale = 1.0; } VectorSubtract( ent->s.pos.trBase, enemy->s.pos.trBase, enemyVec ); VectorScale( enemyVec, 2.0 * ( 0.6 + 0.5 * random() ) * scale * ( 0.6 + 0.6 * ( 1.0 - ( enemyDist / HEINRICH_STOMP_RANGE ) ) ), enemyVec ); enemyVec[2] = scale * HEINRICH_STOMP_VELOCITY_Z * ( 1.0 - 0.5 * ( enemyDist / HEINRICH_STOMP_RANGE ) ); // bounce the player using this velocity VectorAdd( enemy->client->ps.velocity, enemyVec, enemy->client->ps.velocity ); } } return NULL; }
bool CircleCollision(const Vector2& v2lhs, const float& radiuslhs, const Vector2& v2rhs, const float& radiusrhs) { if (Distance(v2lhs, v2rhs) <= powf(radiuslhs + radiusrhs, 2)) return true; return false; }
void TKlingonBC::Do_ai() { // Destruction rules if (m_lstHealth[HLT_HULL]<=0) { Explode(); } else { double tsx,tsy; m_blPhaserOn = false; if (m_lstHealth[HLT_SENSOR]<30) { m_pTarget=NULL; } else { if ((m_nTask==TSK_CONTACT)||(m_nTask==TSK_STRIKE)) { m_pTarget=(TShip *) m_pEngine->Seek(ID_PLAYER,m_dViewDistance,m_dX,m_dY); } else { m_pTarget = (TShip *) m_pEngine->Seek(MEM_KLINGON,true,m_dViewDistance,m_dX,m_dY); } if ((m_pTarget!=NULL)&&(m_pTarget->m_blDestroyed)) m_pTarget=NULL; } if (((m_pTarget!=NULL)&&((m_pTarget->m_blDestroyed)||(m_pTarget->m_CloakState == CS_CLOAKED)))||(m_lstHealth[HLT_SENSOR]<30)||(m_lstHealth[HLT_COMPUTER]<30)) m_pTarget=NULL; if ((m_pTarget==NULL)||(m_pTarget->m_blDocked==true)) { if ((m_AI==AI_CHASE)||(m_AI==AI_EVADE)) { m_AI=AI_WANDER; } } else { m_dTargetDistance = Distance(m_dX,m_dY,m_pTarget->GetX(),m_pTarget->GetY()); if (m_AI==AI_WANDER) m_AI=AI_CHASE; if (m_nTask==TSK_STANDARD) { if ((m_lstHealth[HLT_PHOTON]<50)&&(m_lstHealth[HLT_PHASER]<=20)) m_AI=AI_EVADE; } } if ((m_lstHealth[HLT_PHOTON]<40)||(m_nTorpedoes==0)) { if (! TryEnterDocking()) { m_AI=AI_EVADE; } } else if (m_pTarget==NULL) { bool blShouldDock = false; for (size_t i=0;i<m_lstHealth.size();i++) { if (m_lstHealth[i] < (m_nMaxHealth-50)) blShouldDock = true; if (m_nTorpedoes<50) blShouldDock = true; } if (blShouldDock) { if(! TryEnterDocking()) { m_dWaypointX=rand() % SECTORSIZE; m_dWaypointY=rand() % SECTORSIZE; m_AI=AI_WANDER; } } } switch(m_AI) { case AI_WANDER: { SetSpeed(100); m_dAngleSeek=WayPoint(m_dWaypointX,m_dWaypointY); double dDistance = Distance(m_dX,m_dY,m_dWaypointX,m_dWaypointY); if (dDistance<40) { m_dWaypointX=rand() % SECTORSIZE; m_dWaypointY=rand() % SECTORSIZE; } if ((m_nCloakCharge>=CLOAK_DELAY)&&((m_lstHealth[HLT_CLOAK]>60)||(m_nEnergy>500))&&((m_CloakState == CS_UNCLOAKED)||(m_CloakState == CS_DECLOAKING))) { m_CloakState = CS_CLOAKING; } } break; case AI_CHASE: if (m_pTarget!=NULL) { if (((m_CloakState == CS_CLOAKED)||(m_CloakState == CS_CLOAKING))&&(m_dTargetDistance<1000)) { m_CloakState = CS_DECLOAKING; m_nCloakCharge=0; } tsx=m_pTarget->GetX()+cos(m_pTarget->GetAngle())*m_pTarget->GetSpeed(); tsy=m_pTarget->GetY()+sin(m_pTarget->GetAngle())*m_pTarget->GetSpeed(); m_dAngleSeek=WayPoint(tsx,tsy); SetSpeed(m_dTargetDistance/4); double t=m_dAngleSeek-m_dAngle; if (t<0) t=-t; if (m_nTask!=TSK_CONTACT) { if ((m_dTargetDistance<=600)&&(m_dTargetDistance>150)&&(t<0.1)) { fire_photon(); } if (m_dTargetDistance<100) m_AI=AI_EVADE; } } else { m_dWaypointX=rand() % SECTORSIZE; m_dWaypointY=rand() % SECTORSIZE; m_AI=AI_WANDER; } break; case AI_EVADE: if (m_pTarget!=NULL) { if (((m_CloakState == CS_CLOAKED)||(m_CloakState == CS_CLOAKING))&&(m_dTargetDistance<1000)) { m_CloakState = CS_DECLOAKING; m_nCloakCharge=0; } tsx=m_pTarget->GetX()+cos(m_pTarget->GetAngle())*m_pTarget->GetSpeed(); tsy=m_pTarget->GetY()+sin(m_pTarget->GetAngle())*m_pTarget->GetSpeed(); m_dAngleSeek=WayPoint(tsx,tsy); SetSpeed(m_dMaxSpeed); double t=m_dAngleSeek-m_dAngle; if (t<0) t=-t; if (m_nTask!=TSK_CONTACT) { if ((m_dTargetDistance<=600)&&(m_dTargetDistance>100)&&(t<0.1)) { fire_photon(); } if (m_dTargetDistance>400) m_AI=AI_CHASE; } m_dAngleSeek-=PI; } else { m_dWaypointX=rand() % SECTORSIZE; m_dWaypointY=rand() % SECTORSIZE; m_AI=AI_WANDER; } break; case AI_DOCK: if (! m_blDocked) { m_pBaseTarget = (TShip *) m_pEngine->Seekstarbase(m_Member,false,SECTORSIZE * 2,m_dX,m_dY); if ((m_pBaseTarget!=NULL) && ( !Dock(m_pBaseTarget) )) { m_dAngleSeek=WayPoint(m_pBaseTarget->GetX(),m_pBaseTarget->GetY()); } } else { bool can_go=true; if (m_blNoRelease) can_go=false; for (size_t i=0;i<m_lstHealth.size();i++) { if (m_lstHealth[i]<m_nMaxHealth) can_go=false; if (m_nTorpedoes<50) can_go=false; } if (can_go) { m_blDocked = false; m_blDocking = false; m_blReleasing = true; m_AI=AI_RELEASE; } } break; case AI_RELEASE: if (m_blReleasing) { Release(m_pBaseTarget); } else { m_blDocked = false; m_blDocking = false; m_blReleasing = false; m_dWaypointX=rand() % SECTORSIZE; m_dWaypointY=rand() % SECTORSIZE; m_AI=AI_WANDER; } break; default: break; } //******************************************************************************* DoEngineering(); if (m_nEnergy>0) { m_dSteer = m_lstHealth[HLT_THRUSTER]*0.0003; m_dAngleSeek = GetEvasiveAngle(m_dAngleSeek); Control(); } else if (m_lstHealth[HLT_WARPCORE]<20) { m_lstHealth[HLT_HULL]=0; } } if (((m_nEnergy<20)||(m_lstHealth[HLT_CLOAK]<50))&&((m_CloakState == CS_CLOAKED)||(m_CloakState == CS_CLOAKING))) { m_CloakState = CS_DECLOAKING; m_nCloakCharge=0; } if (m_dSpeed>(m_dMaxSpeed*m_lstHealth[HLT_IMPULSE])/100) { m_dSpeed=(m_dMaxSpeed*m_lstHealth[HLT_IMPULSE])/100; } if (m_dSpeed <0) { m_dSpeed =0; } if ((m_blDocked)&& ((m_pBaseTarget==NULL)||((m_pBaseTarget!=NULL)&& (m_pBaseTarget->m_blDestroyed)))) { Die(); } }
/* ===================== CG_AddParticleToScene ===================== */ void CG_AddParticleToScene (cparticle_t *p, vec3_t org, float alpha) { vec3_t point; polyVert_t verts[4]; float width; float height; float time, time2; float ratio; float invratio; vec3_t color; polyVert_t TRIverts[3]; vec3_t rright2, rup2; if (p->type == P_WEATHER || p->type == P_WEATHER_TURBULENT || p->type == P_WEATHER_FLURRY || p->type == P_BUBBLE || p->type == P_BUBBLE_TURBULENT) {// create a front facing polygon if (p->type != P_WEATHER_FLURRY) { if (p->type == P_BUBBLE || p->type == P_BUBBLE_TURBULENT) { if (org[2] > p->end) { p->time = cg.time; VectorCopy (org, p->org); // Ridah, fixes rare snow flakes that flicker on the ground p->org[2] = ( p->start + crandom () * 4 ); if (p->type == P_BUBBLE_TURBULENT) { p->vel[0] = crandom() * 4; p->vel[1] = crandom() * 4; } } } else { if (org[2] < p->end) { p->time = cg.time; VectorCopy (org, p->org); // Ridah, fixes rare snow flakes that flicker on the ground while (p->org[2] < p->end) { p->org[2] += (p->start - p->end); } if (p->type == P_WEATHER_TURBULENT) { p->vel[0] = crandom() * 16; p->vel[1] = crandom() * 16; } } } // Rafael snow pvs check if (!p->link) return; p->alpha = 1; } // Ridah, had to do this or MAX_POLYS is being exceeded in village1.bsp if (Distance( cg.snap->ps.origin, org ) > 1024) { return; } // done. if (p->type == P_BUBBLE || p->type == P_BUBBLE_TURBULENT) { VectorMA (org, -p->height, pvup, point); VectorMA (point, -p->width, pvright, point); VectorCopy (point, verts[0].xyz); verts[0].st[0] = 0; verts[0].st[1] = 0; verts[0].modulate[0] = 255; verts[0].modulate[1] = 255; verts[0].modulate[2] = 255; verts[0].modulate[3] = 255 * p->alpha; VectorMA (org, -p->height, pvup, point); VectorMA (point, p->width, pvright, point); VectorCopy (point, verts[1].xyz); verts[1].st[0] = 0; verts[1].st[1] = 1; verts[1].modulate[0] = 255; verts[1].modulate[1] = 255; verts[1].modulate[2] = 255; verts[1].modulate[3] = 255 * p->alpha; VectorMA (org, p->height, pvup, point); VectorMA (point, p->width, pvright, point); VectorCopy (point, verts[2].xyz); verts[2].st[0] = 1; verts[2].st[1] = 1; verts[2].modulate[0] = 255; verts[2].modulate[1] = 255; verts[2].modulate[2] = 255; verts[2].modulate[3] = 255 * p->alpha; VectorMA (org, p->height, pvup, point); VectorMA (point, -p->width, pvright, point); VectorCopy (point, verts[3].xyz); verts[3].st[0] = 1; verts[3].st[1] = 0; verts[3].modulate[0] = 255; verts[3].modulate[1] = 255; verts[3].modulate[2] = 255; verts[3].modulate[3] = 255 * p->alpha; } else { VectorMA (org, -p->height, pvup, point); VectorMA (point, -p->width, pvright, point); VectorCopy( point, TRIverts[0].xyz ); TRIverts[0].st[0] = 1; TRIverts[0].st[1] = 0; TRIverts[0].modulate[0] = 255; TRIverts[0].modulate[1] = 255; TRIverts[0].modulate[2] = 255; TRIverts[0].modulate[3] = 255 * p->alpha; VectorMA (org, p->height, pvup, point); VectorMA (point, -p->width, pvright, point); VectorCopy (point, TRIverts[1].xyz); TRIverts[1].st[0] = 0; TRIverts[1].st[1] = 0; TRIverts[1].modulate[0] = 255; TRIverts[1].modulate[1] = 255; TRIverts[1].modulate[2] = 255; TRIverts[1].modulate[3] = 255 * p->alpha; VectorMA (org, p->height, pvup, point); VectorMA (point, p->width, pvright, point); VectorCopy (point, TRIverts[2].xyz); TRIverts[2].st[0] = 0; TRIverts[2].st[1] = 1; TRIverts[2].modulate[0] = 255; TRIverts[2].modulate[1] = 255; TRIverts[2].modulate[2] = 255; TRIverts[2].modulate[3] = 255 * p->alpha; } } else if (p->type == P_SPRITE) { vec3_t rr, ru; vec3_t rotate_ang; VectorSet (color, 1.0, 1.0, 0.5); time = cg.time - p->time; time2 = p->endtime - p->time; ratio = time / time2; width = p->width + ( ratio * ( p->endwidth - p->width) ); height = p->height + ( ratio * ( p->endheight - p->height) ); if (p->roll) { vectoangles( cg.refdef.viewaxis[0], rotate_ang ); rotate_ang[ROLL] += p->roll; AngleVectors ( rotate_ang, NULL, rr, ru); } if (p->roll) { VectorMA (org, -height, ru, point); VectorMA (point, -width, rr, point); } else { VectorMA (org, -height, pvup, point); VectorMA (point, -width, pvright, point); } VectorCopy (point, verts[0].xyz); verts[0].st[0] = 0; verts[0].st[1] = 0; verts[0].modulate[0] = 255; verts[0].modulate[1] = 255; verts[0].modulate[2] = 255; verts[0].modulate[3] = 255; if (p->roll) { VectorMA (point, 2*height, ru, point); } else { VectorMA (point, 2*height, pvup, point); } VectorCopy (point, verts[1].xyz); verts[1].st[0] = 0; verts[1].st[1] = 1; verts[1].modulate[0] = 255; verts[1].modulate[1] = 255; verts[1].modulate[2] = 255; verts[1].modulate[3] = 255; if (p->roll) { VectorMA (point, 2*width, rr, point); } else { VectorMA (point, 2*width, pvright, point); } VectorCopy (point, verts[2].xyz); verts[2].st[0] = 1; verts[2].st[1] = 1; verts[2].modulate[0] = 255; verts[2].modulate[1] = 255; verts[2].modulate[2] = 255; verts[2].modulate[3] = 255; if (p->roll) { VectorMA (point, -2*height, ru, point); } else { VectorMA (point, -2*height, pvup, point); } VectorCopy (point, verts[3].xyz); verts[3].st[0] = 1; verts[3].st[1] = 0; verts[3].modulate[0] = 255; verts[3].modulate[1] = 255; verts[3].modulate[2] = 255; verts[3].modulate[3] = 255; } else if (p->type == P_SMOKE || p->type == P_SMOKE_IMPACT) {// create a front rotating facing polygon if ( p->type == P_SMOKE_IMPACT && Distance( cg.snap->ps.origin, org ) > 1024) { return; } if (p->color == BLOODRED) VectorSet (color, 0.22f, 0.0f, 0.0f); else if (p->color == GREY75) { float len; float greyit; float val; len = Distance (cg.snap->ps.origin, org); if (!len) len = 1; val = 4096/len; greyit = 0.25 * val; if (greyit > 0.5) greyit = 0.5; VectorSet (color, greyit, greyit, greyit); } else VectorSet (color, 1.0, 1.0, 1.0); time = cg.time - p->time; time2 = p->endtime - p->time; ratio = time / time2; if (cg.time > p->startfade) { invratio = 1 - ( (cg.time - p->startfade) / (p->endtime - p->startfade) ); if (p->color == EMISIVEFADE) { float fval; fval = (invratio * invratio); if (fval < 0) fval = 0; VectorSet (color, fval , fval , fval ); } invratio *= p->alpha; } else invratio = 1 * p->alpha; if ( cgs.glconfig.hardwareType == GLHW_RAGEPRO ) invratio = 1; if (invratio > 1) invratio = 1; width = p->width + ( ratio * ( p->endwidth - p->width) ); height = p->height + ( ratio * ( p->endheight - p->height) ); if (p->type != P_SMOKE_IMPACT) { vec3_t temp; vectoangles (rforward, temp); p->accumroll += p->roll; temp[ROLL] += p->accumroll * 0.1; AngleVectors ( temp, NULL, rright2, rup2); } else { VectorCopy (rright, rright2); VectorCopy (rup, rup2); } if (p->rotate) { VectorMA (org, -height, rup2, point); VectorMA (point, -width, rright2, point); } else { VectorMA (org, -p->height, pvup, point); VectorMA (point, -p->width, pvright, point); } VectorCopy (point, verts[0].xyz); verts[0].st[0] = 0; verts[0].st[1] = 0; verts[0].modulate[0] = 255 * color[0]; verts[0].modulate[1] = 255 * color[1]; verts[0].modulate[2] = 255 * color[2]; verts[0].modulate[3] = 255 * invratio; if (p->rotate) { VectorMA (org, -height, rup2, point); VectorMA (point, width, rright2, point); } else { VectorMA (org, -p->height, pvup, point); VectorMA (point, p->width, pvright, point); } VectorCopy (point, verts[1].xyz); verts[1].st[0] = 0; verts[1].st[1] = 1; verts[1].modulate[0] = 255 * color[0]; verts[1].modulate[1] = 255 * color[1]; verts[1].modulate[2] = 255 * color[2]; verts[1].modulate[3] = 255 * invratio; if (p->rotate) { VectorMA (org, height, rup2, point); VectorMA (point, width, rright2, point); } else { VectorMA (org, p->height, pvup, point); VectorMA (point, p->width, pvright, point); } VectorCopy (point, verts[2].xyz); verts[2].st[0] = 1; verts[2].st[1] = 1; verts[2].modulate[0] = 255 * color[0]; verts[2].modulate[1] = 255 * color[1]; verts[2].modulate[2] = 255 * color[2]; verts[2].modulate[3] = 255 * invratio; if (p->rotate) { VectorMA (org, height, rup2, point); VectorMA (point, -width, rright2, point); } else { VectorMA (org, p->height, pvup, point); VectorMA (point, -p->width, pvright, point); } VectorCopy (point, verts[3].xyz); verts[3].st[0] = 1; verts[3].st[1] = 0; verts[3].modulate[0] = 255 * color[0]; verts[3].modulate[1] = 255 * color[1]; verts[3].modulate[2] = 255 * color[2]; verts[3].modulate[3] = 255 * invratio; } else if (p->type == P_BLEED) { vec3_t rr, ru; vec3_t rotate_ang; float alpha; alpha = p->alpha; if ( cgs.glconfig.hardwareType == GLHW_RAGEPRO ) alpha = 1; if (p->roll) { vectoangles( cg.refdef.viewaxis[0], rotate_ang ); rotate_ang[ROLL] += p->roll; AngleVectors ( rotate_ang, NULL, rr, ru); } else { VectorCopy (pvup, ru); VectorCopy (pvright, rr); } VectorMA (org, -p->height, ru, point); VectorMA (point, -p->width, rr, point); VectorCopy (point, verts[0].xyz); verts[0].st[0] = 0; verts[0].st[1] = 0; verts[0].modulate[0] = 111; verts[0].modulate[1] = 19; verts[0].modulate[2] = 9; verts[0].modulate[3] = 255 * alpha; VectorMA (org, -p->height, ru, point); VectorMA (point, p->width, rr, point); VectorCopy (point, verts[1].xyz); verts[1].st[0] = 0; verts[1].st[1] = 1; verts[1].modulate[0] = 111; verts[1].modulate[1] = 19; verts[1].modulate[2] = 9; verts[1].modulate[3] = 255 * alpha; VectorMA (org, p->height, ru, point); VectorMA (point, p->width, rr, point); VectorCopy (point, verts[2].xyz); verts[2].st[0] = 1; verts[2].st[1] = 1; verts[2].modulate[0] = 111; verts[2].modulate[1] = 19; verts[2].modulate[2] = 9; verts[2].modulate[3] = 255 * alpha; VectorMA (org, p->height, ru, point); VectorMA (point, -p->width, rr, point); VectorCopy (point, verts[3].xyz); verts[3].st[0] = 1; verts[3].st[1] = 0; verts[3].modulate[0] = 111; verts[3].modulate[1] = 19; verts[3].modulate[2] = 9; verts[3].modulate[3] = 255 * alpha; } else if (p->type == P_FLAT_SCALEUP) { float width, height; float sinR, cosR; if (p->color == BLOODRED) VectorSet (color, 1, 1, 1); else VectorSet (color, 0.5, 0.5, 0.5); time = cg.time - p->time; time2 = p->endtime - p->time; ratio = time / time2; width = p->width + ( ratio * ( p->endwidth - p->width) ); height = p->height + ( ratio * ( p->endheight - p->height) ); if (width > p->endwidth) width = p->endwidth; if (height > p->endheight) height = p->endheight; sinR = height * sin(DEG2RAD(p->roll)) * sqrt(2); cosR = width * cos(DEG2RAD(p->roll)) * sqrt(2); VectorCopy (org, verts[0].xyz); verts[0].xyz[0] -= sinR; verts[0].xyz[1] -= cosR; verts[0].st[0] = 0; verts[0].st[1] = 0; verts[0].modulate[0] = 255 * color[0]; verts[0].modulate[1] = 255 * color[1]; verts[0].modulate[2] = 255 * color[2]; verts[0].modulate[3] = 255; VectorCopy (org, verts[1].xyz); verts[1].xyz[0] -= cosR; verts[1].xyz[1] += sinR; verts[1].st[0] = 0; verts[1].st[1] = 1; verts[1].modulate[0] = 255 * color[0]; verts[1].modulate[1] = 255 * color[1]; verts[1].modulate[2] = 255 * color[2]; verts[1].modulate[3] = 255; VectorCopy (org, verts[2].xyz); verts[2].xyz[0] += sinR; verts[2].xyz[1] += cosR; verts[2].st[0] = 1; verts[2].st[1] = 1; verts[2].modulate[0] = 255 * color[0]; verts[2].modulate[1] = 255 * color[1]; verts[2].modulate[2] = 255 * color[2]; verts[2].modulate[3] = 255; VectorCopy (org, verts[3].xyz); verts[3].xyz[0] += cosR; verts[3].xyz[1] -= sinR; verts[3].st[0] = 1; verts[3].st[1] = 0; verts[3].modulate[0] = 255 * color[0]; verts[3].modulate[1] = 255 * color[1]; verts[3].modulate[2] = 255 * color[2]; verts[3].modulate[3] = 255; } else if (p->type == P_FLAT) { VectorCopy (org, verts[0].xyz); verts[0].xyz[0] -= p->height; verts[0].xyz[1] -= p->width; verts[0].st[0] = 0; verts[0].st[1] = 0; verts[0].modulate[0] = 255; verts[0].modulate[1] = 255; verts[0].modulate[2] = 255; verts[0].modulate[3] = 255; VectorCopy (org, verts[1].xyz); verts[1].xyz[0] -= p->height; verts[1].xyz[1] += p->width; verts[1].st[0] = 0; verts[1].st[1] = 1; verts[1].modulate[0] = 255; verts[1].modulate[1] = 255; verts[1].modulate[2] = 255; verts[1].modulate[3] = 255; VectorCopy (org, verts[2].xyz); verts[2].xyz[0] += p->height; verts[2].xyz[1] += p->width; verts[2].st[0] = 1; verts[2].st[1] = 1; verts[2].modulate[0] = 255; verts[2].modulate[1] = 255; verts[2].modulate[2] = 255; verts[2].modulate[3] = 255; VectorCopy (org, verts[3].xyz); verts[3].xyz[0] += p->height; verts[3].xyz[1] -= p->width; verts[3].st[0] = 1; verts[3].st[1] = 0; verts[3].modulate[0] = 255; verts[3].modulate[1] = 255; verts[3].modulate[2] = 255; verts[3].modulate[3] = 255; } // Ridah else if (p->type == P_ANIM) { vec3_t rr, ru; vec3_t rotate_ang; int i, j; time = cg.time - p->time; time2 = p->endtime - p->time; ratio = time / time2; if (ratio >= 1.0f) { ratio = 0.9999f; } width = p->width + ( ratio * ( p->endwidth - p->width) ); height = p->height + ( ratio * ( p->endheight - p->height) ); // if we are "inside" this sprite, don't draw if (Distance( cg.snap->ps.origin, org ) < width/1.5) { return; } i = p->shaderAnim; j = (int)floor(ratio * shaderAnimCounts[p->shaderAnim]); p->pshader = shaderAnims[i][j]; if (p->roll) { vectoangles( cg.refdef.viewaxis[0], rotate_ang ); rotate_ang[ROLL] += p->roll; AngleVectors ( rotate_ang, NULL, rr, ru); } if (p->roll) { VectorMA (org, -height, ru, point); VectorMA (point, -width, rr, point); } else { VectorMA (org, -height, pvup, point); VectorMA (point, -width, pvright, point); } VectorCopy (point, verts[0].xyz); verts[0].st[0] = 0; verts[0].st[1] = 0; verts[0].modulate[0] = 255; verts[0].modulate[1] = 255; verts[0].modulate[2] = 255; verts[0].modulate[3] = 255; if (p->roll) { VectorMA (point, 2*height, ru, point); } else { VectorMA (point, 2*height, pvup, point); } VectorCopy (point, verts[1].xyz); verts[1].st[0] = 0; verts[1].st[1] = 1; verts[1].modulate[0] = 255; verts[1].modulate[1] = 255; verts[1].modulate[2] = 255; verts[1].modulate[3] = 255; if (p->roll) { VectorMA (point, 2*width, rr, point); } else { VectorMA (point, 2*width, pvright, point); } VectorCopy (point, verts[2].xyz); verts[2].st[0] = 1; verts[2].st[1] = 1; verts[2].modulate[0] = 255; verts[2].modulate[1] = 255; verts[2].modulate[2] = 255; verts[2].modulate[3] = 255; if (p->roll) { VectorMA (point, -2*height, ru, point); } else { VectorMA (point, -2*height, pvup, point); } VectorCopy (point, verts[3].xyz); verts[3].st[0] = 1; verts[3].st[1] = 0; verts[3].modulate[0] = 255; verts[3].modulate[1] = 255; verts[3].modulate[2] = 255; verts[3].modulate[3] = 255; } // done. if (!p->pshader) { // (SA) temp commented out for DM // CG_Printf ("CG_AddParticleToScene type %d p->pshader == ZERO\n", p->type); return; } if (p->type == P_WEATHER || p->type == P_WEATHER_TURBULENT || p->type == P_WEATHER_FLURRY) trap_R_AddPolyToScene( p->pshader, 3, TRIverts ); else trap_R_AddPolyToScene( p->pshader, 4, verts ); }
float Ray::Distance(const float3 &point) const { return Distance(point, 0); }
void InitializeAttackBoards(void) { int i, j, frank, ffile, trank, tfile; int sq, lastsq; int knightsq[8]={-17,-15,-10,-6,6,10,15,17}; int bishopsq[4]={-9,-7,7,9}; int rooksq[4]={-8,-1,1,8}; BITBOARD sqs; /* initialize pawn attack boards */ for(i=0;i<64;i++) { w_pawn_attacks[i]=0; if (i < 56) for(j=2;j<4;j++) { sq=i+bishopsq[j]; if((abs(sq/8-i/8)==1) && (abs((sq&7) - (i&7))==1) && (sq < 64) && (sq > -1)) w_pawn_attacks[i]=Or(w_pawn_attacks[i],Shiftr(mask_1,sq)); } b_pawn_attacks[i]=0; if (i > 7) for(j=0;j<2;j++) { sq=i+bishopsq[j]; if((abs(sq/8-i/8)==1) && (abs((sq&7)-(i&7))==1) && (sq < 64) && (sq > -1)) b_pawn_attacks[i]=Or(b_pawn_attacks[i],Shiftr(mask_1,sq)); } } /* initialize knight attack board */ for(i=0;i<64;i++) { knight_attacks[i]=0; frank=i/8; ffile=i&7; for(j=0;j<8;j++) { sq=i+knightsq[j]; if((sq < 0) || (sq > 63)) continue; trank=sq/8; tfile=sq&7; if((abs(frank-trank) > 2) || (abs(ffile-tfile) > 2)) continue; knight_attacks[i]=Or(knight_attacks[i],Shiftr(mask_1,sq)); } } /* initialize bishop/queen attack boards and masks */ for(i=0;i<64;i++) { bishop_attacks[i]=0; for(j=0;j<4;j++) { sq=i; lastsq=sq; sq=sq+bishopsq[j]; while((abs(sq/8-lastsq/8)==1) && (abs((sq&7)-(lastsq&7))==1) && (sq < 64) && (sq > -1)) { bishop_attacks[i]=Or(bishop_attacks[i],Shiftr(mask_1,sq)); queen_attacks[i]=Or(queen_attacks[i],Shiftr(mask_1,sq)); if(bishopsq[j]==7) plus7dir[i]=Or(plus7dir[i],Shiftr(mask_1,sq)); else if(bishopsq[j]==9) plus9dir[i]=Or(plus9dir[i],Shiftr(mask_1,sq)); else if(bishopsq[j]==-7) minus7dir[i]=Or(minus7dir[i],Shiftr(mask_1,sq)); else minus9dir[i]=Or(minus9dir[i],Shiftr(mask_1,sq)); lastsq=sq; sq=sq+bishopsq[j]; } } } plus1dir[64]=0; plus7dir[64]=0; plus8dir[64]=0; plus9dir[64]=0; minus1dir[64]=0; minus7dir[64]=0; minus8dir[64]=0; minus9dir[64]=0; /* initialize rook/queen attack boards */ for(i=0;i<64;i++) { rook_attacks[i]=0; for(j=0;j<4;j++) { sq=i; lastsq=sq; sq=sq+rooksq[j]; while((((abs(sq/8-lastsq/8)==1) && (abs((sq&7)-(lastsq&7))==0)) || ((abs(sq/8-lastsq/8)==0) && (abs((sq&7)-(lastsq&7))==1))) && (sq < 64) && (sq > -1)) { rook_attacks[i]=Or(rook_attacks[i],Shiftr(mask_1,sq)); queen_attacks[i]=Or(queen_attacks[i],Shiftr(mask_1,sq)); if(rooksq[j]==1) plus1dir[i]=Or(plus1dir[i],Shiftr(mask_1,sq)); else if(rooksq[j]==8) plus8dir[i]=Or(plus8dir[i],Shiftr(mask_1,sq)); else if(rooksq[j]==-1) minus1dir[i]=Or(minus1dir[i],Shiftr(mask_1,sq)); else minus8dir[i]=Or(minus8dir[i],Shiftr(mask_1,sq)); lastsq=sq; sq=sq+rooksq[j]; } } } /* initialize king attack board */ for(i=0;i<64;i++) { king_attacks[i]=0; king_attacks_1[i]=0; king_attacks_2[i]=0; for (j=0;j<64;j++) { if (Distance(i,j) == 1) king_attacks[i]=Or(king_attacks[i],set_mask[j]); if (Distance(i,j) <= 1) king_attacks_1[i]=Or(king_attacks_1[i],set_mask[j]); if (Distance(i,j) <= 2) king_attacks_2[i]=Or(king_attacks_2[i],set_mask[j]); } } /* direction[sq1][sq2] gives the "move direction" to move from sq1 to sq2. obstructed[sq1][sq2] gives a bit vector that indicates which squares must be unoccupied in order for <sq1> to attack <sq2>, assuming a sliding piece is involved. to use this, you simply have to Or(obstructed[sq1][sq2],occupied_squares) and if the result is "0" then a sliding piece on sq1 would attack sq2 and vice-versa. */ for (i=0;i<64;i++) { for (j=0;j<64;j++) obstructed[i][j]=(BITBOARD) -1; sqs=plus1dir[i]; while (sqs) { j=FirstOne(sqs); directions[i][j]=1; obstructed[i][j]=Xor(plus1dir[i],plus1dir[j-1]); Clear(j,sqs); } sqs=plus7dir[i]; while (sqs) { j=FirstOne(sqs); directions[i][j]=7; obstructed[i][j]=Xor(plus7dir[i],plus7dir[j-7]); Clear(j,sqs); } sqs=plus8dir[i]; while (sqs) { j=FirstOne(sqs); directions[i][j]=8; obstructed[i][j]=Xor(plus8dir[i],plus8dir[j-8]); Clear(j,sqs); } sqs=plus9dir[i]; while (sqs) { j=FirstOne(sqs); directions[i][j]=9; obstructed[i][j]=Xor(plus9dir[i],plus9dir[j-9]); Clear(j,sqs); } sqs=minus1dir[i]; while (sqs) { j=FirstOne(sqs); directions[i][j]=-1; obstructed[i][j]=Xor(minus1dir[i],minus1dir[j+1]); Clear(j,sqs); } sqs=minus7dir[i]; while (sqs) { j=FirstOne(sqs); directions[i][j]=-7; obstructed[i][j]=Xor(minus7dir[i],minus7dir[j+7]); Clear(j,sqs); } sqs=minus8dir[i]; while (sqs) { j=FirstOne(sqs); directions[i][j]=-8; obstructed[i][j]=Xor(minus8dir[i],minus8dir[j+8]); Clear(j,sqs); } sqs=minus9dir[i]; while (sqs) { j=FirstOne(sqs); directions[i][j]=-9; obstructed[i][j]=Xor(minus9dir[i],minus9dir[j+9]); Clear(j,sqs); } } { int diag_sq[64] = { 0, 1, 0, 2, 1, 0, 3, 2, 1, 0, 4, 3, 2, 1, 0, 5, 4, 3, 2, 1, 0, 6, 5, 4, 3, 2, 1, 0, 7, 6, 5, 4, 3, 2, 1, 0, 6, 5, 4, 3, 2, 1, 0, 5, 4, 3, 2, 1, 0, 4, 3, 2, 1, 0, 3, 2, 1, 0, 2, 1, 0, 1, 0, 0 }; int bias_rl45[64] = { 0, 1, 1, 3, 3, 3, 6, 6, 6, 6, 10, 10, 10, 10, 10, 15, 15, 15, 15, 15, 15, 21, 21, 21, 21, 21, 21, 21, 28, 28, 28, 28, 28, 28, 28, 28, 36, 36, 36, 36, 36, 36, 36, 43, 43, 43, 43, 43, 43, 49, 49, 49, 49, 49, 54, 54, 54, 54, 58, 58, 58, 61, 61, 63 }; int square, pcs, attacks; int rsq, tsq; int mask; /* initialize the rotated attack board that is based on the normal chess */ for (square=0;square<64;square++) { for (i=0;i<256;i++) { rook_attacks_r0[square][i]=0; rook_mobility_r0[square][i]=0; } for (pcs=0;pcs<256;pcs++) { attacks=InitializeFindAttacks(7-File(square),pcs,8); while (attacks) { sq=first_ones_8bit[attacks]; rook_attacks_r0[square][pcs]= Or(rook_attacks_r0[square][pcs],set_mask[(square&56)+sq]); attacks=attacks&(~(1<<(7-sq))); } rook_mobility_r0[square][pcs]=PopCnt(rook_attacks_r0[square][pcs]); } } /* initialize the rotated attack board that is based on one that rotated left 90 degrees (which lines up a file horizontally, rather than its normal vertical orientation.) */ for (square=0;square<64;square++) { for (i=0;i<256;i++) { rook_attacks_rl90[square][i]=0; rook_mobility_rl90[square][i]=0; } for (pcs=0;pcs<256;pcs++) { attacks=InitializeFindAttacks(Rank(square),pcs,8); while (attacks) { sq=first_ones_8bit[attacks]; rook_attacks_rl90[square][pcs]= Or(rook_attacks_rl90[square][pcs], set_mask[init_r90[((square&7)<<3)+sq]]); attacks=attacks&(~(1<<(7-sq))); } rook_mobility_rl90[square][pcs]=PopCnt(rook_attacks_rl90[square][pcs]); } } /* initialize the rotated attack board that is based on one that is rotated left 45 degrees (which lines up the (a8-h1) diagonal horizontally. */ for (square=0;square<64;square++) { for (i=0;i<256;i++) { bishop_attacks_rl45[square][i]=0; bishop_mobility_rl45[square][i]=0; } for (pcs=0;pcs<(1<<diagonal_length[init_l45[square]]);pcs++) { rsq=init_l45[square]; tsq=diag_sq[rsq]; attacks=InitializeFindAttacks(tsq,pcs,diagonal_length[rsq])<< (8-diagonal_length[rsq]); while (attacks) { sq=first_ones_8bit[attacks]; bishop_attacks_rl45[square][pcs]= Or(bishop_attacks_rl45[square][pcs], set_mask[init_ul45[sq+bias_rl45[rsq]]]); attacks=attacks&(~(1<<(7-sq))); } } mask=(1<<diagonal_length[init_l45[square]])-1; for (pcs=0;pcs<256;pcs++) { if ((pcs&mask) != pcs) bishop_attacks_rl45[square][pcs]= bishop_attacks_rl45[square][pcs&mask]; bishop_mobility_rl45[square][pcs]= PopCnt(bishop_attacks_rl45[square][pcs]); } } /* initialize the rotated attack board that is based on one that is rotated right 45 degrees (which lines up the (a1-h8) diagonal horizontally, */ for (square=0;square<64;square++) { for (i=0;i<256;i++) { bishop_attacks_rr45[square][i]=0; bishop_mobility_rr45[square][i]=0; } for (pcs=0;pcs<(1<<diagonal_length[init_r45[square]]);pcs++) { rsq=init_r45[square]; tsq=diag_sq[rsq]; attacks=InitializeFindAttacks(tsq,pcs,diagonal_length[rsq])<< (8-diagonal_length[rsq]); while (attacks) { sq=first_ones_8bit[attacks]; bishop_attacks_rr45[square][pcs]= Or(bishop_attacks_rr45[square][pcs], set_mask[init_ur45[sq+bias_rl45[rsq]]]); attacks=attacks&(~(1<<(7-sq))); } } mask=(1<<diagonal_length[init_r45[square]])-1; for (pcs=0;pcs<256;pcs++) { if ((pcs&mask) != pcs) bishop_attacks_rr45[square][pcs]= bishop_attacks_rr45[square][pcs&mask]; bishop_mobility_rr45[square][pcs]= PopCnt(bishop_attacks_rr45[square][pcs]); } } } }
float Ray::Distance(const Line &line) const { return Distance(line, 0, 0); }
extern "C" _declspec(dllexport) void __cdecl BrakeWindMouse( float xs, float ys, float xe, float ye, float gravity, float wind, float minWait, float maxWait, float targetArea ) { float veloX = 0.0, veloY = 0.0, windX = 0.0, windY = 0.0, veloMag = 0.0, dist = 0.0, randomDist = 0.0; int lastX = 0, lastY = 0, MSP = 0, W = 0, maxStep = 0, D = 0, TDist = 0; float sqrt2 = 0.0, sqrt3 = 0.0, sqrt5 = 0.0, PDist = 0.0; veloX = 0; veloY = 0; windX = 0; windY = 0; MSP = MouseSpeed; sqrt2 = sqrt( 2 ); sqrt3 = sqrt( 3 ); sqrt5 = sqrt( 5 ); srand(time(NULL)); TDist = Distance( rnd( xs ), rnd( ys ), rnd( xe ), rnd( ye ) ); if ( TDist < 1 ) TDist = 1; do { dist = hypot( xs - xe, ys - ye ); wind = Min( wind, dist ); if ( dist < 1 ) dist = 1; PDist = ( dist / TDist ); if ( PDist < 0.01 ) PDist = 0.01; /* These constants seem smooth to me, but feel free to modify these settings however you wish. */ if ( PDist >= 0.15 ) //15% (or higher) dist to destination { D = rnd( rnd( ( rnd( dist ) * 0.3 ) ) / 5 ); if ( D < 20 ) D = 20; //D := RandomRange(15, 25); {Original} } else if ( PDist < 0.15 ) { if ( ( PDist <= 0.15 ) && ( PDist >= 0.10 ) ) //10%-15% D = RandomRange( 8, 13 ); else if ( PDist < 0.10 ) //< 10% D = RandomRange( 4, 7 ); } if ( D <= rnd( dist ) ) maxStep = D; else maxStep = rnd( dist ); if ( dist >= targetArea ) { windX = windX / sqrt3 + ( rand()% rnd( wind ) * 2 + 1 - wind ) / sqrt5; windY = windY / sqrt3 + ( rand()% rnd( wind ) * 2 + 1 - wind ) / sqrt5; } else { windX = windX / sqrt2; windY = windY / sqrt2; } veloX = veloX + windX; veloY = veloY + windY; veloX = veloX + gravity * ( xe - xs ) / dist; veloY = veloY + gravity * ( ye - ys ) / dist; if ( hypot( veloX, veloY ) > maxStep ) { randomDist = maxStep / 2.0 + rand()% rnd( maxStep ) / 2 ; veloMag = sqrt( veloX * veloX + veloY * veloY ); veloX = ( veloX / veloMag ) * randomDist; veloY = ( veloY / veloMag ) * randomDist; } lastX = rnd( xs ); lastY = rnd( ys ); xs = xs + veloX; ys = ys + veloY; if ( ( lastX != rnd( xs ) ) || ( lastY != rnd( ys ) ) ) MoveMouse( rnd( xs ), rnd( ys ) ); W = ( rand()% rnd( 100 / MSP ) ) * 6; if ( W < 5 ) W = 5; W = rnd( W * 1.2 ); Sleep( W ); // lastDist = dist; } while ( ! ( hypot( xs - xe, ys - ye ) < 1 ) ); if ( ( rnd( xe ) != rnd( xs ) ) || ( rnd( ye ) != rnd( ys ) ) ) MoveMouse( rnd( xe ), rnd( ye ) ); MouseSpeed = MSP; }
float Ray::Distance(const Sphere &sphere) const { return Max(0.f, Distance(sphere.pos) - sphere.r); }
cxFloat cxPoint2F::Distance(const cxPoint2F &d) const { return Distance(*this, d); }
double cPEDetection<_DataType>::ComputeAveRadius(double *CurrPt, double *NextPt, _DataType MatMin, _DataType MatMax) { int i, k, loc[3], DataCoor_i[3], NumBoundaryVoxels_i; double StartPt_d[3], VesselDirection_d[3], VesselDirOrg_d[3], Rays_d[8*3], CurrLoc_d[3]; double GradVec_d[3], ZeroCrossingLoc_Ret[3], FirstDAtTheLoc_Ret, DataPosFromZeroCrossingLoc_Ret; double Radius_d[16], CurrCenterPt_d[3], NextCenterPt_d[3], AveRadius_d, Step_d, Increase_d; Increase_d = 0.5; for (k=0; k<3; k++) VesselDirOrg_d[k] = NextPt[k] - CurrPt[k]; Normalize(VesselDirOrg_d); for (k=0; k<3; k++) VesselDirection_d[k] = VesselDirOrg_d[k]; for (k=0; k<3; k++) StartPt_d[k] = CurrPt[k]; ComputePerpendicular8Rays(StartPt_d, VesselDirection_d, Rays_d); for (k=0; k<3; k++) CurrCenterPt_d[k] = 0.0; NumBoundaryVoxels_i = 0; for (i=0; i<8; i++) { for (Step_d=-0.2; Step_d<=0.2+1e-6; Step_d+=0.4) { loc[0] = getANearestBoundary(StartPt_d, &Rays_d[i*3], Step_d, MatMin, MatMax); if (loc[0]>0) NumBoundaryVoxels_i++; else continue; DataCoor_i[2] = (int)(loc[0]/this->WtimesH_mi); DataCoor_i[1] = (int)((loc[0] - DataCoor_i[2]*this->WtimesH_mi)/this->Width_mi); DataCoor_i[0] = (int)(loc[0] % this->Width_mi); for (k=0; k<3; k++) CurrLoc_d[k] = (double)DataCoor_i[k]; for (k=0; k<3; k++) GradVec_d[k] = (double)this->GradientVec_mf[loc[0]*3 + k]; this->FindZeroCrossingLocation(CurrLoc_d, GradVec_d, ZeroCrossingLoc_Ret, FirstDAtTheLoc_Ret, DataPosFromZeroCrossingLoc_Ret, 0.2); for (k=0; k<3; k++) CurrCenterPt_d[k] += ZeroCrossingLoc_Ret[k]; } } for (k=0; k<3; k++) CurrCenterPt_d[k] /= (double)NumBoundaryVoxels_i; for (k=0; k<3; k++) StartPt_d[k] = CurrPt[k] + VesselDirection_d[k]*Increase_d; ComputePerpendicular8Rays(StartPt_d, VesselDirection_d, Rays_d); for (k=0; k<3; k++) NextCenterPt_d[k] = 0.0; NumBoundaryVoxels_i = 0; for (i=0; i<8; i++) { for (Step_d=-0.2; Step_d<=0.2+1e-6; Step_d+=0.4) { loc[0] = getANearestBoundary(StartPt_d, &Rays_d[i*3], Step_d, MatMin, MatMax); if (loc[0]>0) NumBoundaryVoxels_i++; else continue; DataCoor_i[2] = (int)(loc[0]/this->WtimesH_mi); DataCoor_i[1] = (int)((loc[0] - DataCoor_i[2]*this->WtimesH_mi)/this->Width_mi); DataCoor_i[0] = (int)(loc[0] % this->Width_mi); for (k=0; k<3; k++) CurrLoc_d[k] = (double)DataCoor_i[k]; for (k=0; k<3; k++) GradVec_d[k] = (double)this->GradientVec_mf[loc[0]*3 + k]; this->FindZeroCrossingLocation(CurrLoc_d, GradVec_d, ZeroCrossingLoc_Ret, FirstDAtTheLoc_Ret, DataPosFromZeroCrossingLoc_Ret, 0.2); for (k=0; k<3; k++) NextCenterPt_d[k] += ZeroCrossingLoc_Ret[k]; } } for (k=0; k<3; k++) NextCenterPt_d[k] /= (double)NumBoundaryVoxels_i; for (k=0; k<3; k++) VesselDirection_d[k] = VesselDirOrg_d[k]; #ifdef DEBUG_PED printf ("\n"); #endif double Tempd; int NumRepeat = 0; Step_d = 0.0; AveRadius_d = 0.0; while (NumRepeat<(int)((1.0/Increase_d)*2.0+1e-6)) { NumRepeat++; ComputePerpendicular8Rays(CurrCenterPt_d, VesselDirection_d, Rays_d); for (i=0; i<16; i++) Radius_d[i] = -1.0; NumBoundaryVoxels_i = 0; for (i=0; i<8; i++) { for (Step_d=-0.2; Step_d<=0.2+1e-5; Step_d+=0.4) { loc[0] = getANearestBoundary(StartPt_d, &Rays_d[i*3], Step_d, MatMin, MatMax); if (loc[0]>0) NumBoundaryVoxels_i++; else continue; DataCoor_i[2] = (int)(loc[0]/this->WtimesH_mi); DataCoor_i[1] = (int)((loc[0] - DataCoor_i[2]*this->WtimesH_mi)/this->Width_mi); DataCoor_i[0] = (int)(loc[0] % this->Width_mi); for (k=0; k<3; k++) CurrLoc_d[k] = (double)DataCoor_i[k]; for (k=0; k<3; k++) GradVec_d[k] = (double)this->GradientVec_mf[loc[0]*3 + k]; this->FindZeroCrossingLocation(CurrLoc_d, GradVec_d, ZeroCrossingLoc_Ret, FirstDAtTheLoc_Ret, DataPosFromZeroCrossingLoc_Ret, 0.2); Radius_d[NumBoundaryVoxels_i-1] = Distance (CurrCenterPt_d, ZeroCrossingLoc_Ret); } } Tempd = 0.0; NumBoundaryVoxels_i=0; for (i=0; i<16; i++) { if (Radius_d[i]>0.0) { Tempd += Radius_d[i]; NumBoundaryVoxels_i++; } else continue; } if (NumBoundaryVoxels_i<=0) AveRadius_d += 0.0; else AveRadius_d += (Tempd / (double)NumBoundaryVoxels_i); #ifdef DEBUG_PED printf ("\nComputeAveRadius(): # Repeats = %d\n", NumRepeat); printf ("Sub Ave Radius at (%f %f %f) ", CurrCenterPt_d[0], CurrCenterPt_d[1], CurrCenterPt_d[2]); printf ("(%d ", (int)((CurrCenterPt_d[0] - StartLoc_gi[0])*10.0)); printf ("%d ", (int)((CurrCenterPt_d[1] - StartLoc_gi[1])*10.0)); printf ("%d)", (int)((CurrCenterPt_d[2] - StartLoc_gi[2])*10.0)); printf (" = %f ", (Tempd / (double)NumBoundaryVoxels_i)); printf ("# Boundary Voxels = %d\n", NumBoundaryVoxels_i); printf ("Sub Dir = (%f %f %f) ", VesselDirection_d[0], VesselDirection_d[1], VesselDirection_d[2]); printf ("Next Center = (%f %f %f) ", NextCenterPt_d[0], NextCenterPt_d[1], NextCenterPt_d[2]); printf ("(%d ", (int)((NextCenterPt_d[0] - StartLoc_gi[0])*10.0)); printf ("%d ", (int)((NextCenterPt_d[1] - StartLoc_gi[1])*10.0)); printf ("%d)\n", (int)((NextCenterPt_d[2] - StartLoc_gi[2])*10.0)); #endif for (k=0; k<3; k++) CurrCenterPt_d[k] = NextCenterPt_d[k]; for (k=0; k<3; k++) NextCenterPt_d[k] = CurrCenterPt_d[k] + VesselDirection_d[k]*Increase_d; for (k=0; k<3; k++) VesselDirection_d[k] = VesselDirOrg_d[k]; #ifdef DEBUG_PED printf ("Curr & Next Center = (%f %f %f) ", CurrCenterPt_d[0], CurrCenterPt_d[1], CurrCenterPt_d[2]); printf ("(%f %f %f)\n", NextCenterPt_d[0], NextCenterPt_d[1], NextCenterPt_d[2]); printf ("Curr & Next Center in the Sub Volume = "); printf ("(%d ", (int)((CurrCenterPt_d[0] - StartLoc_gi[0])*10.0)); printf ("%d ", (int)((CurrCenterPt_d[1] - StartLoc_gi[1])*10.0)); printf ("%d) ", (int)((CurrCenterPt_d[2] - StartLoc_gi[2])*10.0)); printf ("(%d ", (int)((NextCenterPt_d[0] - StartLoc_gi[0])*10.0)); printf ("%d ", (int)((NextCenterPt_d[1] - StartLoc_gi[1])*10.0)); printf ("%d) ", (int)((NextCenterPt_d[2] - StartLoc_gi[2])*10.0)); printf ("Weighted Ave. Sub Dir = (%f %f %f)\n", VesselDirection_d[0], VesselDirection_d[1], VesselDirection_d[2]); #endif } #ifdef DEBUG_PED printf ("# Repeat = %d, Ave. Radius = %f\n", NumRepeat, AveRadius_d); #endif AveRadius_d /= (double)NumRepeat; return AveRadius_d; }
/*! * \brief Creates a new via. */ PinType * CreateNewVia (DataType *Data, Coord X, Coord Y, Coord Thickness, Coord Clearance, Coord Mask, Coord DrillingHole, char *Name, FlagType Flags) { PinType *Via; if (!be_lenient) { VIA_LOOP (Data); { if (Distance (X, Y, via->X, via->Y) <= via->DrillingHole / 2 + DrillingHole / 2) { Message (_("%m+Dropping via at %$mD because it's hole would overlap with the via " "at %$mD\n"), Settings.grid_unit->allow, X, Y, via->X, via->Y); return (NULL); /* don't allow via stacking */ } } END_LOOP; } Via = GetViaMemory (Data); if (!Via) return (Via); /* copy values */ Via->X = X; Via->Y = Y; Via->Thickness = Thickness; Via->Clearance = Clearance; Via->Mask = Mask; Via->DrillingHole = vendorDrillMap (DrillingHole); if (Via->DrillingHole != DrillingHole) { Message (_("%m+Mapped via drill hole to %$mS from %$mS per vendor table\n"), Settings.grid_unit->allow, Via->DrillingHole, DrillingHole); } Via->Name = STRDUP (Name); Via->Flags = Flags; CLEAR_FLAG (WARNFLAG, Via); SET_FLAG (VIAFLAG, Via); Via->ID = ID++; /* * don't complain about MIN_PINORVIACOPPER on a mounting hole (pure * hole) */ if (!TEST_FLAG (HOLEFLAG, Via) && (Via->Thickness < Via->DrillingHole + MIN_PINORVIACOPPER)) { Via->Thickness = Via->DrillingHole + MIN_PINORVIACOPPER; Message (_("%m+Increased via thickness to %$mS to allow enough copper" " at %$mD.\n"), Settings.grid_unit->allow, Via->Thickness, Via->X, Via->Y); } SetPinBoundingBox (Via); if (!Data->via_tree) Data->via_tree = r_create_tree (NULL, 0, 0); r_insert_entry (Data->via_tree, (BoxType *) Via, 0); return (Via); }
/** * @brief CG_AddParticleToScene * @param[in,out] p * @param[in] org * @param alpha - unused */ void CG_AddParticleToScene(cparticle_t *p, vec3_t org, float alpha) { polyVert_t verts[4]; polyVert_t TRIverts[3]; switch (p->type) { case P_WEATHER: case P_WEATHER_TURBULENT: case P_WEATHER_FLURRY: case P_BUBBLE: case P_BUBBLE_TURBULENT: // create a front facing polygon { if (p->type != P_WEATHER_FLURRY) { if (p->type == P_BUBBLE || p->type == P_BUBBLE_TURBULENT) { if (org[2] > p->end) { p->time = cg.time; VectorCopy(org, p->org); // fixes rare snow flakes that flicker on the ground p->org[2] = (p->start + crandom() * 4); if (p->type == P_BUBBLE_TURBULENT) { p->vel[0] = crandom() * 4; p->vel[1] = crandom() * 4; } } } else { if (org[2] < p->end) { p->time = cg.time; VectorCopy(org, p->org); // fixes rare snow flakes that flicker on the ground while (p->org[2] < p->end) { p->org[2] += (p->start - p->end); } if (p->type == P_WEATHER_TURBULENT) { p->vel[0] = crandom() * 16; p->vel[1] = crandom() * 16; } } } // snow pvs check if (!p->link) { return; } p->alpha = 1; } // had to do this or MAX_POLYS is being exceeded in village1.bsp if (VectorDistanceSquared(cg.snap->ps.origin, org) > Square(1024)) { return; } if (p->type == P_BUBBLE || p->type == P_BUBBLE_TURBULENT) { vec3_t point; VectorMA(org, -p->height, vup, point); VectorMA(point, -p->width, vright, point); VectorCopy(point, verts[0].xyz); verts[0].st[0] = 0; verts[0].st[1] = 0; verts[0].modulate[0] = 255; verts[0].modulate[1] = 255; verts[0].modulate[2] = 255; verts[0].modulate[3] = (byte)(255 * p->alpha); VectorMA(org, -p->height, vup, point); VectorMA(point, p->width, vright, point); VectorCopy(point, verts[1].xyz); verts[1].st[0] = 0; verts[1].st[1] = 1; verts[1].modulate[0] = 255; verts[1].modulate[1] = 255; verts[1].modulate[2] = 255; verts[1].modulate[3] = (byte)(255 * p->alpha); VectorMA(org, p->height, vup, point); VectorMA(point, p->width, vright, point); VectorCopy(point, verts[2].xyz); verts[2].st[0] = 1; verts[2].st[1] = 1; verts[2].modulate[0] = 255; verts[2].modulate[1] = 255; verts[2].modulate[2] = 255; verts[2].modulate[3] = (byte)(255 * p->alpha); VectorMA(org, p->height, vup, point); VectorMA(point, -p->width, vright, point); VectorCopy(point, verts[3].xyz); verts[3].st[0] = 1; verts[3].st[1] = 0; verts[3].modulate[0] = 255; verts[3].modulate[1] = 255; verts[3].modulate[2] = 255; verts[3].modulate[3] = (byte)(255 * p->alpha); } else { vec3_t point; VectorMA(org, -p->height, vup, point); VectorMA(point, -p->width, vright, point); VectorCopy(point, TRIverts[0].xyz); TRIverts[0].st[0] = 1; TRIverts[0].st[1] = 0; TRIverts[0].modulate[0] = 255; TRIverts[0].modulate[1] = 255; TRIverts[0].modulate[2] = 255; TRIverts[0].modulate[3] = (byte)(255 * p->alpha); VectorMA(org, p->height, vup, point); VectorMA(point, -p->width, vright, point); VectorCopy(point, TRIverts[1].xyz); TRIverts[1].st[0] = 0; TRIverts[1].st[1] = 0; TRIverts[1].modulate[0] = 255; TRIverts[1].modulate[1] = 255; TRIverts[1].modulate[2] = 255; TRIverts[1].modulate[3] = (byte)(255 * p->alpha); VectorMA(org, p->height, vup, point); VectorMA(point, p->width, vright, point); VectorCopy(point, TRIverts[2].xyz); TRIverts[2].st[0] = 0; TRIverts[2].st[1] = 1; TRIverts[2].modulate[0] = 255; TRIverts[2].modulate[1] = 255; TRIverts[2].modulate[2] = 255; TRIverts[2].modulate[3] = (byte)(255 * p->alpha); } } break; case P_SPRITE: { vec3_t point, rr, ru, rotate_ang; float time = cg.time - p->time; float time2 = p->endtime - p->time; float ratio = time / time2; float width = p->width + (ratio * (p->endwidth - p->width)); float height = p->height + (ratio * (p->endheight - p->height)); if (p->roll) { vectoangles(cg.refdef_current->viewaxis[0], rotate_ang); rotate_ang[ROLL] += p->roll; AngleVectors(rotate_ang, NULL, rr, ru); } if (p->roll) { VectorMA(org, -height, ru, point); VectorMA(point, -width, rr, point); } else { VectorMA(org, -height, vup, point); VectorMA(point, -width, vright, point); } VectorCopy(point, verts[0].xyz); verts[0].st[0] = 0; verts[0].st[1] = 0; verts[0].modulate[0] = 255; verts[0].modulate[1] = 255; verts[0].modulate[2] = 255; verts[0].modulate[3] = 255; if (p->roll) { VectorMA(point, 2 * height, ru, point); } else { VectorMA(point, 2 * height, vup, point); } VectorCopy(point, verts[1].xyz); verts[1].st[0] = 0; verts[1].st[1] = 1; verts[1].modulate[0] = 255; verts[1].modulate[1] = 255; verts[1].modulate[2] = 255; verts[1].modulate[3] = 255; if (p->roll) { VectorMA(point, 2 * width, rr, point); } else { VectorMA(point, 2 * width, vright, point); } VectorCopy(point, verts[2].xyz); verts[2].st[0] = 1; verts[2].st[1] = 1; verts[2].modulate[0] = 255; verts[2].modulate[1] = 255; verts[2].modulate[2] = 255; verts[2].modulate[3] = 255; if (p->roll) { VectorMA(point, -2 * height, ru, point); } else { VectorMA(point, -2 * height, vup, point); } VectorCopy(point, verts[3].xyz); verts[3].st[0] = 1; verts[3].st[1] = 0; verts[3].modulate[0] = 255; verts[3].modulate[1] = 255; verts[3].modulate[2] = 255; verts[3].modulate[3] = 255; } break; case P_SMOKE: case P_SMOKE_IMPACT: // create a front rotating facing polygon { vec3_t point, rup2, rright2, color; float invratio, time, time2, ratio, width, height; if (p->type == P_SMOKE_IMPACT && VectorDistanceSquared(cg.snap->ps.origin, org) > Square(1024)) { return; } if (p->color == MUSTARD) { VectorSet(color, 0.42f, 0.33f, 0.19f); } else if (p->color == BLOODRED) { VectorSet(color, 0.22f, 0, 0); } else if (p->color == ZOMBIE) { VectorSet(color, 0.4f, 0.28f, 0.23f); } else if (p->color == GREY75) { float len, greyit; len = Distance(cg.snap->ps.origin, org); if (len == 0.f) { len = 1; } //val = 4096 / len; greyit = 0.25f * (4096 / len); if (greyit > 0.5f) { greyit = 0.5f; } VectorSet(color, greyit, greyit, greyit); } else { VectorSet(color, 1.0f, 1.0f, 1.0f); } time = cg.time - p->time; time2 = p->endtime - p->time; ratio = time / time2; if (cg.time > p->startfade) { invratio = 1 - ((cg.time - p->startfade) / (p->endtime - p->startfade)); if (p->color == EMISIVEFADE) { float fval = invratio * invratio; if (fval < 0) { fval = 0; } VectorSet(color, fval, fval, fval); } invratio *= p->alpha; } else { invratio = 1 * p->alpha; } if (invratio > 1) { invratio = 1; } width = p->width + (ratio * (p->endwidth - p->width)); height = p->height + (ratio * (p->endheight - p->height)); //if (p->type != P_SMOKE_IMPACT) { vec3_t temp; vectoangles(rforward, temp); p->accumroll += p->roll; temp[ROLL] += p->accumroll * 0.1; //temp[ROLL] += p->roll * 0.1; AngleVectors(temp, NULL, rright2, rup2); } //else //{ //VectorCopy (rright, rright2); //VectorCopy (rup, rup2); //} if (p->rotate) { VectorMA(org, -height, rup2, point); VectorMA(point, -width, rright2, point); } else { VectorMA(org, -p->height, vup, point); VectorMA(point, -p->width, vright, point); } VectorCopy(point, verts[0].xyz); verts[0].st[0] = 0; verts[0].st[1] = 0; verts[0].modulate[0] = (byte)(255 * color[0]); verts[0].modulate[1] = (byte)(255 * color[1]); verts[0].modulate[2] = (byte)(255 * color[2]); verts[0].modulate[3] = (byte)(255 * invratio); if (p->rotate) { VectorMA(org, -height, rup2, point); VectorMA(point, width, rright2, point); } else { VectorMA(org, -p->height, vup, point); VectorMA(point, p->width, vright, point); } VectorCopy(point, verts[1].xyz); verts[1].st[0] = 0; verts[1].st[1] = 1; verts[1].modulate[0] = (byte)(255 * color[0]); verts[1].modulate[1] = (byte)(255 * color[1]); verts[1].modulate[2] = (byte)(255 * color[2]); verts[1].modulate[3] = (byte)(255 * invratio); if (p->rotate) { VectorMA(org, height, rup2, point); VectorMA(point, width, rright2, point); } else { VectorMA(org, p->height, vup, point); VectorMA(point, p->width, vright, point); } VectorCopy(point, verts[2].xyz); verts[2].st[0] = 1; verts[2].st[1] = 1; verts[2].modulate[0] = (byte)(255 * color[0]); verts[2].modulate[1] = (byte)(255 * color[1]); verts[2].modulate[2] = (byte)(255 * color[2]); verts[2].modulate[3] = (byte)(255 * invratio); if (p->rotate) { VectorMA(org, height, rup2, point); VectorMA(point, -width, rright2, point); } else { VectorMA(org, p->height, vup, point); VectorMA(point, -p->width, vright, point); } VectorCopy(point, verts[3].xyz); verts[3].st[0] = 1; verts[3].st[1] = 0; verts[3].modulate[0] = (byte)(255 * color[0]); verts[3].modulate[1] = (byte)(255 * color[1]); verts[3].modulate[2] = (byte)(255 * color[2]); verts[3].modulate[3] = (byte)(255 * invratio); } break; case P_BLEED: { vec3_t point, rr, ru, rotate_ang; float alpha = p->alpha; if (p->roll) { vectoangles(cg.refdef_current->viewaxis[0], rotate_ang); rotate_ang[ROLL] += p->roll; AngleVectors(rotate_ang, NULL, rr, ru); } else { VectorCopy(vup, ru); VectorCopy(vright, rr); } VectorMA(org, -p->height, ru, point); VectorMA(point, -p->width, rr, point); VectorCopy(point, verts[0].xyz); verts[0].st[0] = 0; verts[0].st[1] = 0; verts[0].modulate[0] = 111; verts[0].modulate[1] = 19; verts[0].modulate[2] = 9; verts[0].modulate[3] = (byte)(255 * alpha); VectorMA(org, -p->height, ru, point); VectorMA(point, p->width, rr, point); VectorCopy(point, verts[1].xyz); verts[1].st[0] = 0; verts[1].st[1] = 1; verts[1].modulate[0] = 111; verts[1].modulate[1] = 19; verts[1].modulate[2] = 9; verts[1].modulate[3] = (byte)(255 * alpha); VectorMA(org, p->height, ru, point); VectorMA(point, p->width, rr, point); VectorCopy(point, verts[2].xyz); verts[2].st[0] = 1; verts[2].st[1] = 1; verts[2].modulate[0] = 111; verts[2].modulate[1] = 19; verts[2].modulate[2] = 9; verts[2].modulate[3] = (byte)(255 * alpha); VectorMA(org, p->height, ru, point); VectorMA(point, -p->width, rr, point); VectorCopy(point, verts[3].xyz); verts[3].st[0] = 1; verts[3].st[1] = 0; verts[3].modulate[0] = 111; verts[3].modulate[1] = 19; verts[3].modulate[2] = 9; verts[3].modulate[3] = (byte)(255 * alpha); } break; case P_FLAT_SCALEUP: { vec3_t color; float width, height; float sinR, cosR; float time = cg.time - p->time; float time2 = p->endtime - p->time; float ratio = time / time2; if (p->color == BLOODRED) { VectorSet(color, 1, 1, 1); } else { VectorSet(color, 0.5f, 0.5f, 0.5f); } width = p->width + (ratio * (p->endwidth - p->width)); height = p->height + (ratio * (p->endheight - p->height)); if (width > p->endwidth) { width = p->endwidth; } if (height > p->endheight) { height = p->endheight; } sinR = height * (float)(sin(DEG2RAD(p->roll)) * M_SQRT2); cosR = width * (float)(cos(DEG2RAD(p->roll)) * M_SQRT2); VectorCopy(org, verts[0].xyz); verts[0].xyz[0] -= sinR; verts[0].xyz[1] -= cosR; verts[0].st[0] = 0; verts[0].st[1] = 0; verts[0].modulate[0] = (byte)(255 * color[0]); verts[0].modulate[1] = (byte)(255 * color[1]); verts[0].modulate[2] = (byte)(255 * color[2]); verts[0].modulate[3] = 255; VectorCopy(org, verts[1].xyz); verts[1].xyz[0] -= cosR; verts[1].xyz[1] += sinR; verts[1].st[0] = 0; verts[1].st[1] = 1; verts[1].modulate[0] = verts[0].modulate[0]; verts[1].modulate[1] = verts[0].modulate[1]; verts[1].modulate[2] = verts[0].modulate[2]; verts[1].modulate[3] = verts[0].modulate[3]; VectorCopy(org, verts[2].xyz); verts[2].xyz[0] += sinR; verts[2].xyz[1] += cosR; verts[2].st[0] = 1; verts[2].st[1] = 1; verts[2].modulate[0] = verts[0].modulate[0]; verts[2].modulate[1] = verts[0].modulate[1]; verts[2].modulate[2] = verts[0].modulate[2]; verts[2].modulate[3] = verts[0].modulate[3]; VectorCopy(org, verts[3].xyz); verts[3].xyz[0] += cosR; verts[3].xyz[1] -= sinR; verts[3].st[0] = 1; verts[3].st[1] = 0; verts[3].modulate[0] = verts[0].modulate[0]; verts[3].modulate[1] = verts[0].modulate[1]; verts[3].modulate[2] = verts[0].modulate[2]; verts[3].modulate[3] = verts[0].modulate[3]; } break; case P_FLAT: { VectorCopy(org, verts[0].xyz); verts[0].xyz[0] -= p->height; verts[0].xyz[1] -= p->width; verts[0].st[0] = 0; verts[0].st[1] = 0; verts[0].modulate[0] = 255; verts[0].modulate[1] = 255; verts[0].modulate[2] = 255; verts[0].modulate[3] = 255; VectorCopy(org, verts[1].xyz); verts[1].xyz[0] -= p->height; verts[1].xyz[1] += p->width; verts[1].st[0] = 0; verts[1].st[1] = 1; verts[1].modulate[0] = 255; verts[1].modulate[1] = 255; verts[1].modulate[2] = 255; verts[1].modulate[3] = 255; VectorCopy(org, verts[2].xyz); verts[2].xyz[0] += p->height; verts[2].xyz[1] += p->width; verts[2].st[0] = 1; verts[2].st[1] = 1; verts[2].modulate[0] = 255; verts[2].modulate[1] = 255; verts[2].modulate[2] = 255; verts[2].modulate[3] = 255; VectorCopy(org, verts[3].xyz); verts[3].xyz[0] += p->height; verts[3].xyz[1] -= p->width; verts[3].st[0] = 1; verts[3].st[1] = 0; verts[3].modulate[0] = 255; verts[3].modulate[1] = 255; verts[3].modulate[2] = 255; verts[3].modulate[3] = 255; } break; case P_ANIM: case P_DLIGHT_ANIM: { vec3_t point, rr, ru, rotate_ang; float width, height; float time = cg.time - p->time; float time2 = p->endtime - p->time; float ratio = time / time2; int i, j; if (ratio >= 1) { ratio = 0.9999f; } else if (ratio < 0) { // make sure that ratio isn't negative or // we'll walk out of bounds when j is calculated below ratio = 0.0001f; } width = p->width + (ratio * (p->endwidth - p->width)); height = p->height + (ratio * (p->endheight - p->height)); // add dlight if necessary if (p->type == P_DLIGHT_ANIM) { // fixme: support arbitrary color trap_R_AddLightToScene(org, 320, //% 1.5 * (width > height ? width : height), 1.25f * (1.0f - ratio), 1.0f, 0.95f, 0.85f, 0, 0); } // if we are "inside" this sprite, don't draw if (VectorDistanceSquared(cg.snap->ps.origin, org) < Square(width / 1.5f)) { return; } i = p->shaderAnim; j = (int)floor((double)ratio * shaderAnimCounts[p->shaderAnim]); p->pshader = shaderAnims[i][j]; if (p->roll) { vectoangles(cg.refdef_current->viewaxis[0], rotate_ang); rotate_ang[ROLL] += p->roll; AngleVectors(rotate_ang, NULL, rr, ru); } if (p->roll) { VectorMA(org, -height, ru, point); VectorMA(point, -width, rr, point); } else { VectorMA(org, -height, vup, point); VectorMA(point, -width, vright, point); } VectorCopy(point, verts[0].xyz); verts[0].st[0] = 0; verts[0].st[1] = 0; verts[0].modulate[0] = 255; verts[0].modulate[1] = 255; verts[0].modulate[2] = 255; verts[0].modulate[3] = 255; if (p->roll) { VectorMA(point, 2 * height, ru, point); } else { VectorMA(point, 2 * height, vup, point); } VectorCopy(point, verts[1].xyz); verts[1].st[0] = 0; verts[1].st[1] = 1; verts[1].modulate[0] = 255; verts[1].modulate[1] = 255; verts[1].modulate[2] = 255; verts[1].modulate[3] = 255; if (p->roll) { VectorMA(point, 2 * width, rr, point); } else { VectorMA(point, 2 * width, vright, point); } VectorCopy(point, verts[2].xyz); verts[2].st[0] = 1; verts[2].st[1] = 1; verts[2].modulate[0] = 255; verts[2].modulate[1] = 255; verts[2].modulate[2] = 255; verts[2].modulate[3] = 255; if (p->roll) { VectorMA(point, -2 * height, ru, point); } else { VectorMA(point, -2 * height, vup, point); } VectorCopy(point, verts[3].xyz); verts[3].st[0] = 1; verts[3].st[1] = 0; verts[3].modulate[0] = 255; verts[3].modulate[1] = 255; verts[3].modulate[2] = 255; verts[3].modulate[3] = 255; } break; default: break; } if (!cg_wolfparticles.integer) { return; } if (!p->pshader) { CG_Printf("CG_AddParticleToScene type %d p->pshader == ZERO\n", p->type); return; } if (p->type == P_WEATHER || p->type == P_WEATHER_TURBULENT || p->type == P_WEATHER_FLURRY) { trap_R_AddPolyToScene(p->pshader, 3, TRIverts); } else { trap_R_AddPolyToScene(p->pshader, 4, verts); } }
qboolean NPC_MoveToGoal( qboolean tryStraight ) { float distance; vec3_t dir; #if AI_TIMERS int startTime = GetTime(0); #endif// AI_TIMERS //If taking full body pain, don't move if ( PM_InKnockDown( &NPC->client->ps ) || ( ( NPC->s.legsAnim >= BOTH_PAIN1 ) && ( NPC->s.legsAnim <= BOTH_PAIN18 ) ) ) { return qfalse; } #ifdef __DOMINANCE_NPC__ if (NPC->enemy && NPC->s.weapon == WP_SABER && (!NPC_EnemyVisible( NPC, NPC->enemy ) || (Distance(NPC->r.currentOrigin, NPC->enemy->r.currentOrigin) > 96 || NPC->genericValue15 < level.time))) { // Enemy is visible, but out of range for lghtsaber... Move closer... NPC->client->ps.speed = NPCInfo->stats.runSpeed; if (!NPC_FollowRoutes()) { //trap->Print("NPC_FollowRoutes failed!\n"); return qfalse; } return qtrue; } else if (NPC->enemy && NPC_EnemyVisible( NPC, NPC->enemy )) { // Enemy is visible and in range, no need to move at the moment... return qfalse; } else if (NPC->enemy) {// Have an enemy that is not currently visible... if (NPC->s.weapon == WP_SABER && (Distance(NPC->r.currentOrigin, NPC->enemy->r.currentOrigin) > 96 || NPC->genericValue15 < level.time)) { if (NPC->genericValue14 < level.time) { // Give up... NPC->enemy = NULL; NPCInfo->goalEntity = NULL; NPC->longTermGoal = -1; } } else if (NPC->enemy && NPC->genericValue15 < level.time) { if (NPC->genericValue14 < level.time) { // Give up... NPC->enemy = NULL; NPCInfo->goalEntity = NULL; NPC->longTermGoal = -1; } } NPC->client->ps.speed = NPCInfo->stats.runSpeed; if (!NPC_FollowRoutes()) { //trap->Print("NPC_FollowRoutes failed!\n"); return qfalse; } return qtrue; } else {// Dominance: Use bot waypointing AI if it is available! - Unique1 NPC->enemy = NULL; NPCInfo->goalEntity = NULL; NPC->client->ps.speed = NPCInfo->stats.walkSpeed; if (!NPC_FollowRoutes()) { //trap->Print("NPC_FollowRoutes failed!\n"); return qfalse; } return qtrue; } #endif //__DOMINANCE_NPC__ /* if( NPC->s.eFlags & EF_LOCKED_TO_WEAPON ) {//If in an emplaced gun, never try to navigate! return qtrue; } */ //rwwFIXMEFIXME: emplaced support //FIXME: if can't get to goal & goal is a target (enemy), try to find a waypoint that has line of sight to target, at least? //Get our movement direction #if 1 if ( NPC_GetMoveDirectionAltRoute( dir, &distance, tryStraight ) == qfalse ) #else if ( NPC_GetMoveDirection( dir, &distance ) == qfalse ) #endif return qfalse; NPCInfo->distToGoal = distance; //Convert the move to angles vectoangles( dir, NPCInfo->lastPathAngles ); if ( (ucmd.buttons&BUTTON_WALKING) ) { NPC->client->ps.speed = NPCInfo->stats.walkSpeed; } else { NPC->client->ps.speed = NPCInfo->stats.runSpeed; } //FIXME: still getting ping-ponging in certain cases... !!! Nav/avoidance error? WTF???!!! //If in combat move, then move directly towards our goal if ( NPC_CheckCombatMove() ) {//keep current facing G_UcmdMoveForDir( NPC, &ucmd, dir ); } else {//face our goal //FIXME: strafe instead of turn if change in dir is small and temporary NPCInfo->desiredPitch = 0.0f; NPCInfo->desiredYaw = AngleNormalize360( NPCInfo->lastPathAngles[YAW] ); //Pitch towards the goal and also update if flying or swimming if ( (NPC->client->ps.eFlags2&EF2_FLYING) )//moveType == MT_FLYSWIM ) { NPCInfo->desiredPitch = AngleNormalize360( NPCInfo->lastPathAngles[PITCH] ); if ( dir[2] ) { float scale = (dir[2] * distance); if ( scale > 64 ) { scale = 64; } else if ( scale < -64 ) { scale = -64; } NPC->client->ps.velocity[2] = scale; //NPC->client->ps.velocity[2] = (dir[2] > 0) ? 64 : -64; } } //Set any final info ucmd.forwardmove = 127; } #if AI_TIMERS navTime += GetTime( startTime ); #endif// AI_TIMERS return qtrue; }