本文整理汇总了C++中Point3F::lenSquared方法的典型用法代码示例。如果您正苦于以下问题:C++ Point3F::lenSquared方法的具体用法?C++ Point3F::lenSquared怎么用?C++ Point3F::lenSquared使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Point3F
的用法示例。
在下文中一共展示了Point3F::lenSquared方法的6个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: updateCameraPos
void Etherform::updateCameraPos(F32 delta)
{
//
// Update 3rd person camera position.
//
F32 min,max;
Point3F offset;
MatrixF rot;
this->getCameraParameters(&min,&max,&offset,&rot);
Point3F vec = mCameraTargetPos - mCameraPos;
F32 dist = vec.len();
if(dist == 0)
{
// Catch camera position up to its target position.
mCameraPos = mCameraTargetPos;
}
else if(dist > max)
{
// Catch camera up to max allowed dist from target position.
vec.normalize(); vec.neg();
mCameraPos = mCameraTargetPos + vec * max;
}
else
{
// Move camera pos towards its target pos.
#if 0
F32 speed = mDataBlock->accelerationForce;
speed *= 1 - (1/vec.lenSquared());
vec.normalize();
mCameraPos += vec * speed * delta;
#else
//F32 speedScale = this->getVelocity().len() / mDataBlock->accelerationForce;
F32 speedScale = 4; //mDataBlock->accelerationForce / 2;
F32 distScale = 1 - (1/vec.lenSquared());
vec *= speedScale * distScale * delta;
if(vec.len() > dist)
mCameraPos = mCameraTargetPos;
else
mCameraPos += vec;
#endif
}
}
示例2: sqrDistanceEdges
//-----------------------------------------------------------------------------
// This function based on code originally written for the book:
// 3D Game Engine Design, by David H. Eberly
//
F32 sqrDistanceEdges(const Point3F& start0, const Point3F& end0,
const Point3F& start1, const Point3F& end1,
Point3F* is, Point3F* it)
{
Point3F direction0 = end0 - start0;
F32 fA00 = direction0.lenSquared();
Point3F direction1 = end1 - start1;
F32 fA11 = direction1.lenSquared();
F32 fA01 = -mDot(direction0, direction1);
Point3F kDiff = start0 - start1;
F32 fC = kDiff.lenSquared();
F32 fB0 = mDot(kDiff, direction0);
F32 fDet = mFabs(fA00*fA11 - fA01*fA01);
// Since the endpoints are tested as vertices, we're not interested
// in parallel lines, and intersections that don't involve end-points.
if (fDet >= 0.00001) {
// Calculate time of intersection for each line
F32 fB1 = -mDot(kDiff, direction1);
F32 fS = fA01*fB1-fA11*fB0;
F32 fT = fA01*fB0-fA00*fB1;
// Only interested in collisions that don't involve the end points
if (fS >= 0.0 && fS <= fDet && fT >= 0.0 && fT <= fDet) {
F32 fInvDet = 1.0 / fDet;
fS *= fInvDet;
fT *= fInvDet;
F32 fSqrDist = (fS*(fA00*fS + fA01*fT + 2.0*fB0) +
fT*(fA01*fS + fA11*fT + 2.0*fB1) + fC);
// Intersection points.
*is = start0 + direction0 * fS;
*it = start1 + direction1 * fT;
return mFabs(fSqrDist);
}
}
// Return a large number in the cases where endpoints are involved.
return 1e10f;
}
示例3: _scanCallback
// Used to build potential target list
static void _scanCallback( SceneObject* object, void* data )
{
AITurretShape* turret = (AITurretShape*)data;
ShapeBase* shape = dynamic_cast<ShapeBase*>(object);
if (shape && shape->getDamageState() == ShapeBase::Enabled)
{
Point3F targetPos = shape->getBoxCenter();
// Put target position into the scan node's space
turret->mScanWorkspaceScanWorldMat.mulP(targetPos);
// Is the target within scanning distance
if (targetPos.lenSquared() > turret->getMaxScanDistanceSquared())
return;
// Make sure the target is in front and within the maximum
// heading range
Point2F targetXY(targetPos.x, targetPos.y);
targetXY.normalizeSafe();
F32 headingDot = mDot(Point2F(0, 1), targetXY);
F32 heading = mAcos(headingDot);
if (headingDot < 0 || heading > turret->getMaxScanHeading())
return;
// Make sure the target is in front and within the maximum
// pitch range
Point2F targetZY(targetPos.z, targetPos.y);
targetZY.normalizeSafe();
F32 pitchDot = mDot(Point2F(0, 1), targetZY);
F32 pitch = mAcos(pitchDot);
if (pitchDot < 0 || pitch > turret->getMaxScanPitch())
return;
turret->addPotentialTarget(shape);
}
}
示例4: updateWind
void ForestWindMgr::updateWind( const Point3F &camPos,
const TreePlacementInfo &info,
F32 timeDelta )
{
PROFILE_SCOPE(ForestWindMgr_updateWind);
// See if we have the blended source available.
ForestWindAccumulator *blendDest = NULL;
{
IdToWindMap::Iterator iter = mPrevSources->find( info.itemKey );
if ( iter != mPrevSources->end() )
{
blendDest = iter->value;
mPrevSources->erase( iter );
}
}
// Get some stuff we'll need for finding the emitters.
F32 treeHeight = info.scale * info.dataBlock->getObjBox().len_z();
Point3F top = info.pos;
top.z += treeHeight;
if ( blendDest )
top += ( 1.0f / info.scale ) * blendDest->getDirection();
// Go thru the emitters to accumulate the total wind force.
VectorF windForce( 0, 0, 0 );
F32 time = Sim::getCurrentTime() / 1000.0f;
ForestWindEmitterList::iterator iter = mEmitters.begin();
for ( ; iter != mEmitters.end(); iter++ )
{
ForestWindEmitter *emitter = (*iter);
// If disabled or no wind object... skip it.
if ( !emitter->isEnabled() || !emitter->getWind() )
continue;
ForestWind *wind = emitter->getWind();
F32 strength = wind->getStrength();
if ( emitter->isRadialEmitter() )
{
Point3F closest = MathUtils::mClosestPointOnSegment( info.pos, top, emitter->getPosition() );
Point3F dir = closest - emitter->getPosition();
F32 lenSquared = dir.lenSquared();
if ( lenSquared > emitter->getWindRadiusSquared() )
continue;
dir *= 1.0f / mSqrt( lenSquared );
F32 att = lenSquared / emitter->getWindRadiusSquared();
strength *= 1.0f - att;
windForce += dir * strength;
}
else
{
F32 d = mDot( info.pos, Point3F::One ); //PlaneF( Point3F::Zero, wind->getDirection() ).distToPlane( Point3F( info.pos.x, info.pos.y, 0 ) );
//F32 d = PlaneF( Point3F::Zero, wind->getDirection() ).distToPlane( Point3F( info.pos.x, info.pos.y, 0 ) );
F32 scale = 1.0f + ( mSin( d + ( time / 10.0 ) ) * 0.5f );
windForce += wind->getDirection() * strength * scale;
}
}
// If we need a accumulator then we also need to presimulate.
if ( !blendDest )
{
blendDest = new ForestWindAccumulator( info );
blendDest->presimulate( windForce, 4.0f / TickSec );
}
else
blendDest->updateWind( windForce, timeDelta );
mSources->insertUnique( info.itemKey, blendDest );
}
示例5: createCullingVolume
bool SceneCullingState::createCullingVolume( const Point3F* vertices, U32 numVertices, SceneCullingVolume::Type type, SceneCullingVolume& outVolume )
{
const Point3F& viewPos = getCameraState().getViewPosition();
const Point3F& viewDir = getCameraState().getViewDirection();
const bool isOrtho = getCullingFrustum().isOrtho();
//TODO: check if we need to handle penetration of the near plane for occluders specially
// Allocate space for the clipping planes we generate. Assume the worst case
// of every edge generating a plane and, for includers, all edges meeting at
// steep angles so we need to insert extra planes (the latter is not possible,
// of course, but it makes things less complicated here). For occluders, add
// an extra plane for the near cap.
const U32 maxPlanes = ( type == SceneCullingVolume::Occluder ? numVertices + 1 : numVertices * 2 );
PlaneF* planes = allocateData< PlaneF >( maxPlanes );
// Keep track of the world-space bounds of the polygon. We use this later
// to derive some metrics.
Box3F wsPolyBounds;
wsPolyBounds.minExtents = Point3F( TypeTraits< F32 >::MAX, TypeTraits< F32 >::MAX, TypeTraits< F32 >::MAX );
wsPolyBounds.maxExtents = Point3F( TypeTraits< F32 >::MIN, TypeTraits< F32 >::MIN, TypeTraits< F32 >::MIN );
// For occluders, also keep track of the nearest, and two farthest silhouette points. We use
// this later to construct a near capping plane.
F32 minVertexDistanceSquared = TypeTraits< F32 >::MAX;
U32 leastDistantVert = 0;
F32 maxVertexDistancesSquared[ 2 ] = { TypeTraits< F32 >::MIN, TypeTraits< F32 >::MIN };
U32 mostDistantVertices[ 2 ] = { 0, 0 };
// Generate the extrusion volume. For orthographic projections, extrude
// parallel to the view direction whereas for parallel projections, extrude
// from the viewpoint.
U32 numPlanes = 0;
U32 lastVertex = numVertices - 1;
bool invert = false;
for( U32 i = 0; i < numVertices; lastVertex = i, ++ i )
{
AssertFatal( numPlanes < maxPlanes, "SceneCullingState::createCullingVolume - Did not allocate enough planes!" );
const Point3F& v1 = vertices[ i ];
const Point3F& v2 = vertices[ lastVertex ];
// Keep track of bounds.
wsPolyBounds.minExtents.setMin( v1 );
wsPolyBounds.maxExtents.setMax( v1 );
// Skip the edge if it's length is really short.
const Point3F edgeVector = v2 - v1;
const F32 edgeVectorLenSquared = edgeVector.lenSquared();
if( edgeVectorLenSquared < 0.025f )
continue;
//TODO: might need to do additional checks here for non-planar polygons used by occluders
//TODO: test for colinearity of edge vector with view vector (occluders only)
// Create a plane for the edge.
if( isOrtho )
{
// Compute a plane through the two edge vertices and one
// of the vertices extended along the view direction.
if( !invert )
planes[ numPlanes ] = PlaneF( v1, v1 + viewDir, v2 );
else
planes[ numPlanes ] = PlaneF( v2, v1 + viewDir, v1 );
}
else
{
// Compute a plane going through the viewpoint and the two
// edge vertices.
if( !invert )
planes[ numPlanes ] = PlaneF( v1, viewPos, v2 );
else
planes[ numPlanes ] = PlaneF( v2, viewPos, v1 );
}
numPlanes ++;
// If this is the first plane that we have created, find out whether
// the vertex ordering is giving us the plane orientations that we want
// (facing inside). If not, invert vertex order from now on.
if( numPlanes == 1 )
{
Point3F center( 0, 0, 0 );
for( U32 n = 0; n < numVertices; ++ n )
center += vertices[n];
center /= numVertices;
if( planes[numPlanes - 1].whichSide( center ) == PlaneF::Back )
//.........这里部分代码省略.........
示例6: terrTexGen
//.........这里部分代码省略.........
// transition artifacts at the edges (which are not visible
// in the shader path due to its use of /2 in the vertex
// shader and saturate(fade*2) in the pixel shader, which
// allows sharp transitions to be interpolated more cleanly)
mVertexStorePCNT[i].color.set(255, 255, 255, (U8)mClampF(128.0f - (relative.len() * (2.0f * fadeConstant) - (fadeConstant - 1.0f)) * 255.0f, 0.0f, 255.0f));
}
}
else if (vtype == vertexTypeDLight)
{
// Compute the fixedfunction vert stuff now
AssertFatal(clipmapMapping != NULL, "TerrBatch::end - vertexTypeDLight requires clipmapMapping variable!");
AssertFatal(light != NULL, "TerrBatch::end - vertexTypeDLight requires light variable!");
AssertFatal(light->mRadius > 0, "TerrBatch::end - vertexTypeDLight requires light->mRadius > 0!");
const F32 blockTexCoordScale2 = blockTexCoordScale * clipmapMapping->z;
const F32 heightOffset = sceneManager->getFogHeightOffset();
const F32 inverseHeightRange = sceneManager->getFogInvHeightRange();
const F32 inverseVisibleDistanceMod = 1.0f / sceneManager->getVisibleDistanceMod();
Point3F worldPoint;
const F32 lightRadius = light->mRadius;
const Point3F lightPosition = light->mPos;
F32 intensity;
const F32 inverseLightRadius = 1.0f / lightRadius;
// note: this imitates sgLightingModel only very loosely for
// performance reasons, it does look very similar to the shader path
for(U32 i=0; i<mCurVertex; i++)
{
mVertexStorePCNTT[i].point = mVertexStore[i].point;
mVertexStorePCNTT[i].normal = mVertexStore[i].normal;
mVertexStorePCNTT[i].texCoord[0].x = mVertexStore[i].point.x * blockTexCoordScale2;
mVertexStorePCNTT[i].texCoord[0].y = mVertexStore[i].point.y * blockTexCoordScale2;
blockTransform.mulP(mVertexStore[i].point, &worldPoint);
relative = worldPoint - cameraPosition;
mVertexStorePCNTT[i].texCoord[1].x = 1.0 - (relative.len() * inverseVisibleDistanceMod);
mVertexStorePCNTT[i].texCoord[1].y = (worldPoint.z - heightOffset) * inverseHeightRange;
relative = worldPoint - lightPosition;
intensity = getMax(1.0f - relative.len() * inverseLightRadius, 0.0f);
intensity = 512.0f * intensity;
if (intensity > 0)
mVertexStorePCNTT[i].color.set((U8)getMin(light->mColor.red * intensity, 255.0f), (U8)getMin(light->mColor.green * intensity, 255.0f), (U8)getMin(light->mColor.blue * intensity, 255.0f), 255);
else
mVertexStorePCNTT[i].color.set(0, 0, 0, 255);
}
}
else if (vtype == vertexTypeFog)
{
const F32 heightOffset = sceneManager->getFogHeightOffset();
const F32 inverseHeightRange = sceneManager->getFogInvHeightRange();
const F32 inverseVisibleDistanceMod = 1.0f / sceneManager->getVisibleDistanceMod();
Point3F worldPoint;
for(U32 i=0; i<mCurVertex; i++)
{
mVertexStorePCNT[i].point = mVertexStore[i].point;
mVertexStorePCNT[i].normal = mVertexStore[i].normal;
blockTransform.mulP(mVertexStore[i].point, &worldPoint);
relative = worldPoint - cameraPosition;
mVertexStorePCNT[i].texCoord.x = 1.0 - (relative.len() * inverseVisibleDistanceMod);
mVertexStorePCNT[i].texCoord.y = (worldPoint.z - heightOffset) * inverseHeightRange;
mVertexStorePCNT[i].color.set(255, 255, 255, 255);
}
}
// The only time 'vertexTypeDetail' is used is during a fixed-function detail pass.
else if( vtype == vertexTypeDetail )
{
// Get detail distance squared to save us from sqrt
const F32 detailDistanceSquared = TerrainRender::mCurrentBlock->mDetailDistance * TerrainRender::mCurrentBlock->mDetailDistance;
// Detail Brightness done via assignment of color values
const U8 colorByte = mClamp( 255 * TerrainRender::mCurrentBlock->mDetailBrightness, 0, 255 );
Point3F worldPoint;
for( U32 i = 0; i < mCurVertex; i++ )
{
mVertexStorePCNT[i].point = mVertexStore[i].point;
mVertexStorePCNT[i].normal = mVertexStore[i].normal;
mVertexStorePCNT[i].texCoord.x = mVertexStore[i].point.x * blockTexCoordScale;
mVertexStorePCNT[i].texCoord.y = mVertexStore[i].point.y * blockTexCoordScale;
// Transform vertex into world space
blockTransform.mulP( mVertexStore[i].point, &worldPoint );
relative = worldPoint - cameraPosition;
// Alpha
const F32 alpha = TerrainRender::mCurrentBlock->mDetailBrightness * ( 1.0f - ( relative.lenSquared() / detailDistanceSquared ) );
// Assign alpha value to vert so the detail texture blend fades
mVertexStorePCNT[i].color.set( colorByte, colorByte, colorByte, mClamp( alpha * 255, 0, 255 ) );
}
}
else
{
for(U32 i=0; i<mCurVertex; i++)
{
mVertexStorePCNT[i].point = mVertexStore[i].point;
mVertexStorePCNT[i].normal = mVertexStore[i].normal;
mVertexStorePCNT[i].texCoord.x = mVertexStore[i].point.x * blockTexCoordScale;
mVertexStorePCNT[i].texCoord.y = mVertexStore[i].point.y * blockTexCoordScale;
mVertexStorePCNT[i].color.set(255, 255, 255, 255);
}
}
}