diff options
| author | git perforce import user <a@b> | 2016-10-25 12:29:14 -0600 |
|---|---|---|
| committer | Sheikh Dawood Abdul Ajees <Sheikh Dawood Abdul Ajees> | 2016-10-25 18:56:37 -0500 |
| commit | 3dfe2108cfab31ba3ee5527e217d0d8e99a51162 (patch) | |
| tree | fa6485c169e50d7415a651bf838f5bcd0fd3bfbd /APEX_1.4/common/src/Spline.cpp | |
| download | physx-3.4-3dfe2108cfab31ba3ee5527e217d0d8e99a51162.tar.xz physx-3.4-3dfe2108cfab31ba3ee5527e217d0d8e99a51162.zip | |
Initial commit:
PhysX 3.4.0 Update @ 21294896
APEX 1.4.0 Update @ 21275617
[CL 21300167]
Diffstat (limited to 'APEX_1.4/common/src/Spline.cpp')
| -rw-r--r-- | APEX_1.4/common/src/Spline.cpp | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/APEX_1.4/common/src/Spline.cpp b/APEX_1.4/common/src/Spline.cpp new file mode 100644 index 00000000..098883ca --- /dev/null +++ b/APEX_1.4/common/src/Spline.cpp @@ -0,0 +1,176 @@ +/* + * Copyright (c) 2008-2015, NVIDIA CORPORATION. All rights reserved. + * + * NVIDIA CORPORATION and its licensors retain all intellectual property + * and proprietary rights in and to this software, related documentation + * and any modifications thereto. Any use, reproduction, disclosure or + * distribution of this software and related documentation without an express + * license agreement from NVIDIA CORPORATION is strictly prohibited. + */ + + +#include "Spline.h" +#include <assert.h> + +using namespace nvidia; + +static float f(float x) +{ + return( x*x*x - x); +} + + +// build spline. +// copied from Sedgwick's Algorithm's in C, page 548. +void Spline::ComputeSpline(void) +{ + uint32_t i; + uint32_t n = mNodes.size(); + + float *d = new float[n]; + float *w = new float[n]; + + for (i=1; i<(n-1); i++) + { + d[i] = 2.0f * (mNodes[i+1].x - mNodes[i-1].x); + } + + for (i=0; i<(n-1); i++) + { + mNodes[i].u = mNodes[i+1].x-mNodes[i].x;} + + for (i=1; i<(n-1); i++) + { + w[i] = 6.0f*((mNodes[i+1].y - mNodes[i].y) / mNodes[i].u - (mNodes[i].y - mNodes[i-1].y) / mNodes[i-1].u); + } + + mNodes[0].p = 0.0f; + mNodes[n-1].p = 0.0f; + + for (i=1; i<(n-2); i++) + { + w[i+1] = w[i+1] - w[i]*mNodes[i].u /d[i]; + d[i+1] = d[i+1] - mNodes[i].u * mNodes[i].u / d[i]; + } + + for (i=n-2; i>0; i--) + { + mNodes[i].p = (w[i] - mNodes[i].u * mNodes[i+1].p ) / d[i]; + } + + delete[]d; + delete[]w; +} + +float Spline::Evaluate(float v,uint32_t &index,float &fraction) const +{ + float t; + uint32_t i=0; + uint32_t n = mNodes.size(); + + while ( i < (n-1) && v > mNodes[i+1].x ) + { + i++; + } + if ( i == (n-1) ) + { + i = n-2; + } + + index = (uint32_t)i; + + t = (v - mNodes[i].x ) / mNodes[i].u; + + fraction = t; + + return( t*mNodes[i+1].y + (1-t)*mNodes[i].y + mNodes[i].u * mNodes[i].u * (f(t)*mNodes[i+1].p + f(1-t)*mNodes[i].p )/6.0f ); +} + + +void Spline::AddNode(float x,float y) +{ + SplineNode s; + s.x = x; + s.y = y; + mNodes.pushBack(s); +} + +float SplineCurve::AddControlPoint(const PxVec3& p) // add control point. +{ + int32_t size = mXaxis.GetSize(); + + if ( size ) + { + size--; + PxVec3 last; + last.x = mXaxis.GetEntry(size); + last.y = mYaxis.GetEntry(size); + last.z = mZaxis.GetEntry(size); + PxVec3 diff = last-p; + float dist = diff.magnitude(); + mTime+=dist; + } + else + { + mTime = 0; + } + + mXaxis.AddNode(mTime,p.x); + mYaxis.AddNode(mTime,p.y); + mZaxis.AddNode(mTime,p.z); + return mTime; +} + +void SplineCurve::AddControlPoint(const PxVec3& p,float t) // add control point. +{ + int32_t size = mXaxis.GetSize(); + if ( size ) + { + size--; + PxVec3 last; + last.x = mXaxis.GetEntry(size); + last.y = mYaxis.GetEntry(size); + last.z = mZaxis.GetEntry(size); + } + + mTime = t; + + mXaxis.AddNode(mTime,p.x); + mYaxis.AddNode(mTime,p.y); + mZaxis.AddNode(mTime,p.z); +} + +void SplineCurve::ComputeSpline(void) // compute spline. +{ + mXaxis.ComputeSpline(); + mYaxis.ComputeSpline(); + mZaxis.ComputeSpline(); +} + +PxVec3 SplineCurve::Evaluate(float dist,uint32_t &index,float &fraction) +{ + PxVec3 p; + + uint32_t index1,index2,index3; + float t1,t2,t3; + p.x = mXaxis.Evaluate(dist,index1,t1); + p.y = mYaxis.Evaluate(dist,index2,t2); + p.z = mZaxis.Evaluate(dist,index3,t3); + assert( index1 == index2 && index1 == index3 && index2 == index3 ); + index = index1; + fraction = t1; + + return p; +} + +PxVec3 SplineCurve::GetEntry(int32_t i) +{ + PxVec3 p; + if ( i >= 0 && i < GetSize() ) + { + p.x = mXaxis.GetEntry(i); + p.y = mYaxis.GetEntry(i); + p.z = mZaxis.GetEntry(i); + } + return p; +} |