本文整理汇总了C++中float3::distance方法的典型用法代码示例。如果您正苦于以下问题:C++ float3::distance方法的具体用法?C++ float3::distance怎么用?C++ float3::distance使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类float3
的用法示例。
在下文中一共展示了float3::distance方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: if
CSmokeTrailProjectile::CSmokeTrailProjectile(
const float3& pos1,
const float3& pos2,
const float3& dir1,
const float3& dir2,
CUnit* owner,
bool firstSegment,
bool lastSegment,
float size,
int time,
float color,
bool drawTrail,
CProjectile* drawCallback,
AtlasedTexture* texture):
CProjectile((pos1 + pos2) * 0.5f, ZeroVector, owner, false, false, false),
pos1(pos1),
pos2(pos2),
orgSize(size),
creationTime(gs->frameNum),
lifeTime(time),
color(color),
dir1(dir1),
dir2(dir2),
drawTrail(drawTrail),
drawSegmented(false),
firstSegment(firstSegment),
lastSegment(lastSegment),
drawCallbacker(drawCallback),
texture(texture)
{
checkCol = false;
castShadow = true;
// if no custom texture is defined, use the default texture
// Note that this will crash anyway (no idea why) so never have a null texture!
if (texture == NULL) {
texture = projectileDrawer->smoketrailtex;
}
if (!drawTrail) {
const float dist = pos1.distance(pos2);
dirpos1 = pos1 - dir1 * dist * 0.33f;
dirpos2 = pos2 + dir2 * dist * 0.33f;
} else if (dir1.dot(dir2) < 0.98f) {
const float dist = pos1.distance(pos2);
dirpos1 = pos1 - dir1 * dist * 0.33f;
dirpos2 = pos2 + dir2 * dist * 0.33f;
// float3 mp = (pos1 + pos2) / 2;
midpos = CalcBeizer(0.5f, pos1, dirpos1, dirpos2, pos2);
middir = (dir1 + dir2).ANormalize();
drawSegmented = true;
}
SetRadiusAndHeight(pos1.distance(pos2), 0.0f);
if ((pos.y - ground->GetApproximateHeight(pos.x, pos.z)) > 10) {
useAirLos = true;
}
}
示例2: if
CSmokeTrailProjectile::CSmokeTrailProjectile(
CUnit* owner,
const float3& pos1,
const float3& pos2,
const float3& dir1,
const float3& dir2,
bool firstSegment,
bool lastSegment,
float size,
int time,
float color,
bool drawTrail,
CProjectile* drawCallback,
AtlasedTexture* texture
):
CProjectile((pos1 + pos2) * 0.5f, ZeroVector, owner, false, false, false),
pos1(pos1),
pos2(pos2),
orgSize(size),
creationTime(gs->frameNum),
lifeTime(time),
color(color),
dir1(dir1),
dir2(dir2),
drawTrail(drawTrail),
drawSegmented(false),
firstSegment(firstSegment),
lastSegment(lastSegment),
drawCallbacker(drawCallback),
texture(texture == NULL ? projectileDrawer->smoketrailtex : texture)
{
checkCol = false;
castShadow = true;
if (!drawTrail) {
const float dist = pos1.distance(pos2);
dirpos1 = pos1 - dir1 * dist * 0.33f;
dirpos2 = pos2 + dir2 * dist * 0.33f;
} else if (dir1.dot(dir2) < 0.98f) {
const float dist = pos1.distance(pos2);
dirpos1 = pos1 - dir1 * dist * 0.33f;
dirpos2 = pos2 + dir2 * dist * 0.33f;
// float3 mp = (pos1 + pos2) / 2;
midpos = CalcBeizer(0.5f, pos1, dirpos1, dirpos2, pos2);
middir = (dir1 + dir2).ANormalize();
drawSegmented = true;
}
SetRadiusAndHeight(pos1.distance(pos2), 0.0f);
if ((pos.y - CGround::GetApproximateHeight(pos.x, pos.z)) > 10) {
useAirLos = true;
}
}
示例3: PlaySample
void CSound::PlaySample(size_t id, const float3& p, const float3& velocity, float volume, bool relative)
{
boost::mutex::scoped_lock lck(soundMutex);
if (sources.empty() || volume == 0.0f)
return;
if (id == 0)
{
numEmptyPlayRequests++;
return;
}
if (p.distance(myPos) > sounds[id].MaxDistance())
{
if (!relative)
return;
else
LogObject(LOG_SOUND) << "CSound::PlaySample: maxdist ignored for relative payback: " << sounds[id].Name();
}
SoundSource* best = GetNextBestSource(false);
if (!best->IsPlaying() || (best->GetCurrentPriority() <= 0 && best->GetCurrentPriority() < sounds[id].GetPriority()))
best->Play(&sounds[id], p, velocity, volume, relative);
CheckError("CSound::PlaySample");
}
示例4: GetClosestEnemy
int cCombatManager::GetClosestEnemy(float3 Pos, UnitInfo* U)
{
U->enemyID=-1;
// these two function need improvement, for now I'll just use a short cut
if( !G->UM->ActiveAttackOrders() && U->udrBL->task != TASK_SUICIDE )
return GetClosestThreat(Pos, U);
sWeaponEfficiency* weTemp;
float distance,fTemp;
float3 fE;
for( map<int,EnemyInfo>::iterator E=G->Enemies.begin(); E!=G->Enemies.end(); E++ )
{
fE=GetEnemyPosition(E->first,&E->second);
if( (weTemp = CanAttack(U,&E->second,fE)) != 0 )
{
fTemp=Pos.distance(fE);
if( U->enemyID == -1 || fTemp < distance )
{
U->enemyID=E->first;
U->E = &E->second;
U->enemyEff = weTemp;
distance=fTemp;
}
}
}
if( U->enemyID != -1 && U->group != 0 )
G->UM->GroupAddEnemy(U->enemyID,U->E,U->group);
return U->enemyID;
}
示例5:
CLightingProjectile::CLightingProjectile(const float3& pos,const float3& end,CUnit* owner,const float3& color, WeaponDef *weaponDef,int ttl,CWeapon* weap)
: CWeaponProjectile(pos,ZeroVector, owner, 0, ZeroVector, weaponDef,0), //CProjectile(pos,ZeroVector,owner),
ttl(ttl),
color(color),
endPos(end),
weapon(weap)
{
checkCol=false;
drawRadius=pos.distance(endPos);
displacements[0]=0;
for(int a=1;a<10;++a)
displacements[a]=(gs->randFloat()-0.5f)*drawRadius*0.05f;
displacements2[0]=0;
for(int a=1;a<10;++a)
displacements2[a]=(gs->randFloat()-0.5f)*drawRadius*0.05f;
if(weapon)
AddDeathDependence(weapon);
#ifdef TRACE_SYNC
tracefile << "New lighting: ";
tracefile << pos.x << " " << pos.y << " " << pos.z << " " << end.x << " " << end.y << " " << end.z << "\n";
#endif
}
示例6: FindEmptyDropSpots
bool CTransportCAI::FindEmptyDropSpots(float3 startpos, float3 endpos, std::list<float3>& dropSpots) {
//should only be used by air
CTransportUnit* transport=(CTransportUnit*)owner;
//dropSpots.clear();
float gap = 25.5; //TODO - set tag for this?
float3 dir = endpos - startpos;
dir.Normalize();
float3 nextPos = startpos;
float3 pos;
list<CTransportUnit::TransportedUnit>::iterator ti = transport->transported.begin();
dropSpots.push_front(nextPos);
//first spot
if (ti!=transport->transported.end()) {
//float3 p = nextPos; //test to make intended land spots visible
//inMapDrawer->CreatePoint(p,ti->unit->unitDef->name);
//p.z +=transport->transportCapacityUsed*5;
nextPos += dir*(gap + ti->unit->radius);
ti++;
}
//remaining spots
if (dynamic_cast<CTAAirMoveType*>(owner->moveType)) {
while (ti != transport->transported.end() && startpos.distance(nextPos) < startpos.distance(endpos)) {
nextPos += dir*(ti->unit->radius);
nextPos.y = ground->GetHeight(nextPos.x, nextPos.z);
//check landing spot is ok for landing on
if (!SpotIsClear(nextPos,ti->unit))
continue;
dropSpots.push_front(nextPos);
//float3 p = nextPos; //test to make intended land spots visible
//inMapDrawer->CreatePoint(p,ti->unit->unitDef->name);
//p.z +=transport->transportCapacityUsed*5;
nextPos += dir*(gap + ti->unit->radius);
ti++;
}
return true;
}
return false;
}
示例7: CWeaponProjectile
CMissileProjectile::CMissileProjectile(const float3& pos,const float3& speed,CUnit* owner,const DamageArray& damages,float areaOfEffect,float maxSpeed, int ttl,CUnit* target, WeaponDef *weaponDef,float3 targetPos)
: CWeaponProjectile(pos,speed,owner,target,ZeroVector,weaponDef,0),
damages(damages),
ttl(ttl),
maxSpeed(maxSpeed),
target(target),
dir(speed),
oldSmoke(pos),
age(0),
drawTrail(true),
numParts(0),
areaOfEffect(areaOfEffect),
decoyTarget(0),
targPos(targetPos),
wobbleTime(1),
wobbleDir(0,0,0),
wobbleDif(0,0,0),
isWobbling(weaponDef->wobble>0),
extraHeightTime(0)
{
curSpeed=speed.Length();
dir.Normalize();
oldDir=dir;
if(target)
AddDeathDependence(target);
SetRadius(0.0);
if(!weaponDef->visuals.modelName.empty()){
S3DOModel* model = modelParser->Load3DO(string("objects3d/")+weaponDef->visuals.modelName,1,0);
if(model){
SetRadius(model->radius);
}
}
drawRadius=radius+maxSpeed*8;
ENTER_MIXED;
float3 camDir=(pos-camera->pos).Normalize();
if(camera->pos.distance(pos)*0.2+(1-fabs(camDir.dot(dir)))*3000 < 200)
drawTrail=false;
ENTER_SYNCED;
castShadow=true;
#ifdef TRACE_SYNC
tracefile << "New missile: ";
tracefile << pos.x << " " << pos.y << " " << pos.z << " " << speed.x << " " << speed.y << " " << speed.z << "\n";
#endif
if(target)
target->IncomingMissile(this);
if(weaponDef->trajectoryHeight>0){
float dist=pos.distance(targPos);
extraHeight=dist*weaponDef->trajectoryHeight;
if(dist<maxSpeed)
dist=maxSpeed;
extraHeightTime=(int)(dist/*+pos.distance(targPos+UpVector*dist))*0.5*//maxSpeed);
extraHeightDecay=extraHeight/extraHeightTime;
}
}
示例8: CProjectile
CSmokeTrailProjectile::CSmokeTrailProjectile(const float3& pos1,const float3& pos2,const float3& dir1,const float3& dir2, CUnit* owner,bool firstSegment,bool lastSegment,float size,float time,float color,bool drawTrail,CProjectile* drawCallback)
: CProjectile((pos1+pos2)*0.5f,ZeroVector,owner, false),
pos1(pos1),
pos2(pos2),
creationTime(gs->frameNum),
lifeTime((int)time),
orgSize(size),
color(color),
dir1(dir1),
dir2(dir2),
drawTrail(drawTrail),
drawSegmented(false),
drawCallbacker(drawCallback),
firstSegment(firstSegment),
lastSegment(lastSegment)
{
checkCol=false;
castShadow=true;
if(!drawTrail){
float dist=pos1.distance(pos2);
dirpos1=pos1-dir1*dist*0.33f;
dirpos2=pos2+dir2*dist*0.33f;
} else if(dir1.dot(dir2)<0.98f){
float dist=pos1.distance(pos2);
dirpos1=pos1-dir1*dist*0.33f;
dirpos2=pos2+dir2*dist*0.33f;
float3 mp=(pos1+pos2)/2;
midpos=CalcBeizer(0.5f,pos1,dirpos1,dirpos2,pos2);
middir=(dir1+dir2).Normalize();
drawSegmented=true;
}
SetRadius(pos1.distance(pos2));
if(pos.y-ground->GetApproximateHeight(pos.x,pos.z)>10)
useAirLos=true;
}
示例9: PlaySample
void CSound::PlaySample(size_t id, const float3& p, const float3& velocity, float volume, bool relative)
{
GML_RECMUTEX_LOCK(sound); // PlaySample
if (sources.empty() || volume == 0.0f)
return;
if (id == 0)
{
numEmptyPlayRequests++;
return;
}
if (p.distance(myPos) > sounds[id].MaxDistance())
{
if (!relative)
return;
else
LogObject(LOG_SOUND) << "CSound::PlaySample: maxdist ignored for relative payback: " << sounds[id].Name();
}
bool found1Free = false;
int minPriority = 1;
size_t minPos = 0;
for (size_t pos = 0; pos != sources.size(); ++pos)
{
if (!sources[pos].IsPlaying())
{
minPos = pos;
found1Free = true;
break;
}
else
{
if (sources[pos].GetCurrentPriority() < minPriority && sources[pos].GetCurrentPriority() <= sounds[id].GetPriority())
{
found1Free = true;
minPriority = sources[pos].GetCurrentPriority();
minPos = pos;
}
}
}
if (found1Free)
sources[minPos].Play(&sounds[id], p, velocity, volume, relative);
CheckError("CSound::PlaySample");
}
示例10: CProjectile
CGeoSquareProjectile::CGeoSquareProjectile(const float3& p1,const float3& p2,const float3& v1,const float3& v2,float w1,float w2)
: CProjectile((p1+p2)*0.5f,ZeroVector,0, false),
p1(p1),
p2(p2),
v1(v1),
v2(v2),
w1(w1),
w2(w2),
r(0.5f),
g(1.0f),
b(0.5f),
a(0.5f)
{
checkCol=false;
alwaysVisible=true;
SetRadius(p1.distance(p2)*0.55f);
}
示例11: FindSourceAndPlay
void AudioChannel::FindSourceAndPlay(size_t id, const float3& pos, const float3& velocity, float volume, bool relative)
{
if (!enabled)
return;
if (volume <= 0.0f)
return;
boost::recursive_mutex::scoped_lock slck(soundMutex);
SoundItem* sndItem = sound->GetSoundItem(id);
if (!sndItem)
{
sound->numEmptyPlayRequests++;
return;
}
if (pos.distance(sound->GetListenerPos()) > sndItem->MaxDistance())
{
if (!relative)
return;
else
LogObject(LOG_SOUND) << "CSound::PlaySample: maxdist ignored for relative payback: " << sndItem->Name();
}
if (emmitsThisFrame >= emmitsPerFrame)
return;
emmitsThisFrame++;
CSoundSource* sndSource = sound->GetNextBestSource();
if (!sndSource)
return;
if (sndSource->GetCurrentPriority() < sndItem->GetPriority())
{
if (sndSource->IsPlaying())
sound->numAbortedPlays++;
sndSource->Play(this, sndItem, pos, velocity, volume, relative);
CheckError("CSound::FindSourceAndPlay");
boost::recursive_mutex::scoped_lock lck(chanMutex);
cur_sources[sndSource] = true;
}
}
示例12: GetClosestThreat
int cCombatManager::GetClosestThreat(float3 Pos, UnitInfo* U)
{
sWeaponEfficiency* weTemp;
float distance,fTemp;
distance=0.0f;
float3 fE;
set<int> deletion;
for( map<int,EnemyInfo*>::iterator E=G->EThreat.begin(); E!=G->EThreat.end(); ++E )
{
fE=GetEnemyPosition(E->first,E->second);
if( E->second->baseThreatFrame > cb->GetCurrentFrame()+3600 ||
(E->second->baseThreatFrame > cb->GetCurrentFrame()+1200 && G->UImmobile.find(E->second->baseThreatID) == G->UImmobile.end() ) ||
(E->second->ud != 0 && G->UImmobile.find(E->second->baseThreatID) != G->UImmobile.end() && 1.3*E->second->ud->maxWeaponRange < fE.distance(cb->GetUnitPos(E->second->baseThreatID)) ) )
{
E->second->baseThreatID = -1;
E->second->baseThreatFrame = -1;
deletion.insert(E->first);
}
else if( (weTemp = CanAttack(U,E->second,fE)) != 0 )
{
fTemp=Pos.distance(fE);
if( U->enemyID == -1 || fTemp < distance )
{
U->enemyID=E->first;
U->E = E->second;
U->enemyEff = weTemp;
distance=fTemp;
}
}
}
while( int(deletion.size()) > 0 )
{
if( !G->UM->ActiveAttackOrders() )
{
EnemyInfo* E = G->EThreat.find(*deletion.begin())->second;
while( int(E->attackGroups.size()) > 0 )
G->UM->GroupRemoveEnemy(*deletion.begin(),E,*E->attackGroups.begin());
}
G->EThreat.erase(*deletion.begin());
deletion.erase(*deletion.begin());
}
if( U->enemyID != -1 && U->group != 0 )
G->UM->GroupAddEnemy(U->enemyID,U->E,U->group);
return U->enemyID;
}
示例13:
CLightningProjectile::CLightningProjectile(
const float3& pos, const float3& end,
CUnit* owner,
const float3& color,
const WeaponDef* weaponDef,
int ttl, CWeapon* weap):
CWeaponProjectile(pos, ZeroVector, owner, 0, ZeroVector, weaponDef, 0, ttl),
color(color),
endPos(end),
weapon(weap)
{
projectileType = WEAPON_LIGHTNING_PROJECTILE;
checkCol = false;
drawRadius = pos.distance(endPos);
displacements[0]=0;
for(int a=1;a<10;++a)
displacements[a]=(gs->randFloat()-0.5f)*drawRadius*0.05f;
displacements2[0]=0;
for(int a=1;a<10;++a)
displacements2[a]=(gs->randFloat()-0.5f)*drawRadius*0.05f;
if(weapon)
AddDeathDependence(weapon);
#ifdef TRACE_SYNC
tracefile << "New lightning: ";
tracefile << pos.x << " " << pos.y << " " << pos.z << " " << end.x << " " << end.y << " " << end.z << "\n";
#endif
if (!cegTag.empty()) {
ceg.Load(explGenHandler, cegTag);
}
}
示例14: CWeaponProjectile
CLightningProjectile::CLightningProjectile(
const float3& pos, const float3& end,
CUnit* owner,
const float3& color,
const WeaponDef* weaponDef,
int ttl, CWeapon* weap)
: CWeaponProjectile(pos, ZeroVector, owner, NULL, ZeroVector, weaponDef, NULL, ttl)
, color(color)
, endPos(end)
, weapon(weap)
{
projectileType = WEAPON_LIGHTNING_PROJECTILE;
checkCol = false;
drawRadius = pos.distance(endPos);
displacements[0] = 0.0f;
for (size_t d = 1; d < displacements_size; ++d) {
displacements[d] = (gs->randFloat() - 0.5f) * drawRadius * 0.05f;
}
displacements2[0] = 0.0f;
for (size_t d = 1; d < displacements_size; ++d) {
displacements2[d] = (gs->randFloat() - 0.5f) * drawRadius * 0.05f;
}
if (weapon) {
AddDeathDependence(weapon);
}
#ifdef TRACE_SYNC
tracefile << "New lightning: ";
tracefile << pos.x << " " << pos.y << " " << pos.z << " " << end.x << " " << end.y << " " << end.z << "\n";
#endif
cegID = gCEG->Load(explGenHandler, cegTag);
}
示例15: FindSourceAndPlay
void AudioChannel::FindSourceAndPlay(size_t id, const float3& pos, const float3& velocity, float volume, bool relative)
{
std::lock_guard<spring::recursive_mutex> lck(soundMutex);
if (!enabled)
return;
if (volume <= 0.0f)
return;
// generate the sound item
SoundItem* sndItem = sound->GetSoundItem(id);
if (sndItem == nullptr) {
sound->numEmptyPlayRequests++;
return;
}
// check distance to listener
if (pos.distance(sound->GetListenerPos()) > sndItem->MaxDistance()) {
if (!relative)
return;
LOG("CSound::PlaySample: maxdist ignored for relative playback: %s", sndItem->Name().c_str());
}
// don't spam to many sounds per frame
if (emitsThisFrame >= emitsPerFrame)
return;
emitsThisFrame++;
// check if the sound item is already played
if (curSources.size() >= maxConcurrentSources) {
CSoundSource* src = nullptr;
int prio = INT_MAX;
for (auto it = curSources.begin(); it != curSources.end(); ++it) {
if ((*it)->GetCurrentPriority() < prio) {
src = *it;
prio = src->GetCurrentPriority();
}
}
if (src == nullptr || prio > sndItem->GetPriority()) {
LOG_L(L_DEBUG, "CSound::PlaySample: Max concurrent sounds in channel reached! Dropping playback!");
return;
}
src->Stop();
}
// find a sound source to play the item in
CSoundSource* sndSource = sound->GetNextBestSource();
if (sndSource == nullptr || (sndSource->GetCurrentPriority() >= sndItem->GetPriority())) {
LOG_L(L_DEBUG, "CSound::PlaySample: Max sounds reached! Dropping playback!");
return;
}
if (sndSource->IsPlaying())
sound->numAbortedPlays++;
// play the sound item
sndSource->PlayAsync(this, sndItem, pos, velocity, volume, relative);
curSources.insert(sndSource);
}