2015-02-11 18:14:22 +08:00
|
|
|
/****************************************************************************
|
2015-02-25 18:05:41 +08:00
|
|
|
Copyright (C) 2013 Henry van Merode. All rights reserved.
|
2018-01-29 16:25:32 +08:00
|
|
|
Copyright (c) 2015-2016 Chukong Technologies Inc.
|
|
|
|
Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd.
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2022-08-08 18:02:17 +08:00
|
|
|
https://axys1.github.io/
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2015-02-11 18:14:22 +08:00
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
|
|
of this software and associated documentation files (the "Software"), to deal
|
|
|
|
in the Software without restriction, including without limitation the rights
|
|
|
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
|
|
copies of the Software, and to permit persons to whom the Software is
|
|
|
|
furnished to do so, subject to the following conditions:
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2015-02-11 18:14:22 +08:00
|
|
|
The above copyright notice and this permission notice shall be included in
|
|
|
|
all copies or substantial portions of the Software.
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2015-02-11 18:14:22 +08:00
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
|
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
|
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
|
|
THE SOFTWARE.
|
|
|
|
****************************************************************************/
|
|
|
|
|
2022-07-15 19:17:01 +08:00
|
|
|
#ifndef __AX_PU_PARTICLE_3D_SIMPLE_SPLINE_H__
|
|
|
|
#define __AX_PU_PARTICLE_3D_SIMPLE_SPLINE_H__
|
2015-02-11 18:14:22 +08:00
|
|
|
|
|
|
|
#include "base/CCRef.h"
|
|
|
|
#include "math/CCMath.h"
|
|
|
|
#include <vector>
|
2020-10-07 00:15:11 +08:00
|
|
|
#include "ExtensionExport.h"
|
2015-02-11 18:14:22 +08:00
|
|
|
|
2022-07-11 17:50:21 +08:00
|
|
|
NS_AX_BEGIN
|
2015-02-11 18:14:22 +08:00
|
|
|
class PUSimpleSpline
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
PUSimpleSpline();
|
|
|
|
~PUSimpleSpline();
|
|
|
|
|
|
|
|
/** Adds a control point to the end of the spline. */
|
|
|
|
void addPoint(const Vec3& p);
|
|
|
|
|
|
|
|
/** Gets the detail of one of the control points of the spline. */
|
|
|
|
const Vec3& getPoint(unsigned short index) const;
|
|
|
|
|
|
|
|
/** Gets the number of control points in the spline. */
|
2019-07-22 09:38:46 +08:00
|
|
|
unsigned short getNumPoints() const;
|
2015-02-11 18:14:22 +08:00
|
|
|
|
|
|
|
/** Clears all the points in the spline. */
|
2019-07-22 09:38:46 +08:00
|
|
|
void clear();
|
2015-02-11 18:14:22 +08:00
|
|
|
|
2021-12-25 10:04:45 +08:00
|
|
|
/** Updates a single point in the spline.
|
2015-02-11 18:14:22 +08:00
|
|
|
@remarks
|
|
|
|
This point must already exist in the spline.
|
|
|
|
*/
|
|
|
|
void updatePoint(unsigned short index, const Vec3& value);
|
|
|
|
|
|
|
|
/** Returns an interpolated point based on a parametric value over the whole series.
|
|
|
|
@remarks
|
|
|
|
Given a t value between 0 and 1 representing the parametric distance along the
|
|
|
|
whole length of the spline, this method returns an interpolated point.
|
|
|
|
@param t Parametric value.
|
|
|
|
*/
|
|
|
|
Vec3 interpolate(float t) const;
|
|
|
|
|
|
|
|
/** Interpolates a single segment of the spline given a parametric value.
|
|
|
|
@param fromIndex The point index to treat as t=0. fromIndex + 1 is deemed to be t=1
|
|
|
|
@param t Parametric value
|
|
|
|
*/
|
|
|
|
Vec3 interpolate(unsigned int fromIndex, float t) const;
|
|
|
|
|
|
|
|
/** Tells the spline whether it should automatically calculate tangents on demand
|
|
|
|
as points are added.
|
|
|
|
@remarks
|
|
|
|
The spline calculates tangents at each point automatically based on the input points.
|
|
|
|
Normally it does this every time a point changes. However, if you have a lot of points
|
2021-12-25 10:04:45 +08:00
|
|
|
to add in one go, you probably don't want to incur this overhead and would prefer to
|
2015-02-11 18:14:22 +08:00
|
|
|
defer the calculation until you are finished setting all the points. You can do this
|
2021-12-25 10:04:45 +08:00
|
|
|
by calling this method with a parameter of 'false'. Just remember to manually call
|
2015-02-11 18:14:22 +08:00
|
|
|
the recalcTangents method when you are done.
|
2021-12-25 10:04:45 +08:00
|
|
|
@param autoCalc If true, tangents are calculated for you whenever a point changes. If false,
|
2015-02-11 18:14:22 +08:00
|
|
|
you must call reclacTangents to recalculate them when it best suits.
|
|
|
|
*/
|
|
|
|
void setAutoCalculate(bool autoCalc);
|
|
|
|
|
2021-12-25 10:04:45 +08:00
|
|
|
/** Recalculates the tangents associated with this spline.
|
2015-02-11 18:14:22 +08:00
|
|
|
@remarks
|
|
|
|
If you tell the spline not to update on demand by calling setAutoCalculate(false)
|
|
|
|
then you must call this after completing your updates to the spline points.
|
|
|
|
*/
|
2019-07-22 09:38:46 +08:00
|
|
|
void recalcTangents();
|
2015-02-11 18:14:22 +08:00
|
|
|
|
|
|
|
protected:
|
|
|
|
bool _autoCalc;
|
|
|
|
|
|
|
|
std::vector<Vec3> _points;
|
|
|
|
std::vector<Vec3> _tangents;
|
|
|
|
|
2021-12-25 10:04:45 +08:00
|
|
|
/// Matrix of coefficients
|
2015-02-11 18:14:22 +08:00
|
|
|
Mat4 _coeffs;
|
|
|
|
};
|
2022-07-11 17:50:21 +08:00
|
|
|
NS_AX_END
|
2015-02-11 18:14:22 +08:00
|
|
|
|
|
|
|
#endif
|