/* * Copyright (c) 2008-2017, 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. */ #ifndef SPLINE_H #define SPLINE_H /** @file spline.h * @brief A utility class to manage 3d spline curves. * * This is used heavily by the terrain terraforming tools for roads, lakes, and flatten operations. * * @author John W. Ratcliff */ /** @file spline.cpp * @brief A utility class to manage 3d spline curves. * * This is used heavily by the terrain terraforming tools for roads, lakes, and flatten operations. * * @author John W. Ratcliff */ #include "PsArray.h" #include "PsUserAllocated.h" #include "PxVec3.h" #include "ApexUsingNamespace.h" class SplineNode { public: float GetY(void) const { return y; }; float x; // time/distance x-axis component. float y; // y component. float u; float p; }; typedef nvidia::Array< SplineNode > SplineNodeVector; typedef nvidia::Array< physx::PxVec3 > PxVec3Vector; typedef nvidia::Array< uint32_t > uint32_tVector; class Spline : public nvidia::UserAllocated { public: void Reserve(int32_t size) { mNodes.reserve((uint32_t)size); }; void AddNode(float x,float y); void ComputeSpline(void); float Evaluate(float x,uint32_t &index,float &fraction) const; // evaluate Y component based on X int32_t GetSize(void) const { return (int32_t)mNodes.size(); } float GetEntry(int32_t i) const { return mNodes[(uint32_t)i].GetY(); }; void Clear(void) { mNodes.clear(); }; private: SplineNodeVector mNodes; // nodes. }; class SplineCurve : public nvidia::UserAllocated { public: void Reserve(int32_t size) { mXaxis.Reserve(size); mYaxis.Reserve(size); mZaxis.Reserve(size); }; void setControlPoints(const PxVec3Vector &points) { Clear(); Reserve( (int32_t)points.size() ); for (uint32_t i=0; i