Skip to content

Commit

Permalink
refine module
Browse files Browse the repository at this point in the history
  • Loading branch information
SantyWang committed Sep 18, 2023
1 parent ca68bc6 commit 5b9593a
Show file tree
Hide file tree
Showing 50 changed files with 1,268 additions and 594 deletions.
46 changes: 46 additions & 0 deletions cocos/particle/Impl.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@

export declare namespace Impl {
export class ParticleSystem {

}

export class CurveRange {

}

export class GradientRange {

}

export class ParticleSystemModule {
setEnable(enable: boolean): void;
}

export class Shape extends ParticleSystemModule {

}

export enum EmitFrom {
VOLUME,
SHELL,
EDGE,
}

export class BoxShape extends Shape {
setBoxThickness(x: number, y: number, z: number): void;
setEmitFrom(emitFrom: EmitFrom): void;
}

export class ColorBySpeed extends ParticleSystemModule {
getWritableColor(): GradientRange;
setSpeedRange(min: number, max: number): void;
}

export class ColorOverLifetime extends ParticleSystemModule {
getWritableColor(): GradientRange;
}
}

export class Impl {

}
6 changes: 0 additions & 6 deletions cocos/particle/modules/shape.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,6 @@ export class Shape extends ParticleSystemModule {
* @en Emitter rotation.
* @zh 粒子发射器旋转角度。
*/
@displayOrder(14)
@tooltip('i18n:shapeModule.rotation')
get rotation (): Vec3 {
return this._rotation;
Expand All @@ -70,7 +69,6 @@ export class Shape extends ParticleSystemModule {
* @en Emitter size scale.
* @zh 粒子发射器缩放比例。
*/
@displayOrder(15)
@tooltip('i18n:shapeModule.scale')
get scale (): Vec3 {
return this._scale;
Expand All @@ -84,7 +82,6 @@ export class Shape extends ParticleSystemModule {
* @zh 根据粒子的初始方向决定粒子的移动方向。
*/
@serializable
@displayOrder(16)
@tooltip('i18n:shapeModule.alignToDirection')
public alignToDirection = false;

Expand All @@ -93,7 +90,6 @@ export class Shape extends ParticleSystemModule {
* @zh 粒子生成方向随机设定。
*/
@serializable
@displayOrder(17)
@tooltip('i18n:shapeModule.randomDirectionAmount')
public randomDirectionAmount = 0;

Expand All @@ -102,7 +98,6 @@ export class Shape extends ParticleSystemModule {
* @zh 表示当前发射方向与当前位置到结点中心连线方向的插值。
*/
@serializable
@displayOrder(18)
@tooltip('i18n:shapeModule.sphericalDirectionAmount')
public sphericalDirectionAmount = 0;

Expand All @@ -111,7 +106,6 @@ export class Shape extends ParticleSystemModule {
* @zh 粒子生成位置随机设定(设定此值为非 0 会使粒子生成位置超出生成器大小范围)。
*/
@serializable
@displayOrder(19)
@tooltip('i18n:shapeModule.randomPositionAmount')
public randomPositionAmount = 0;

Expand Down
20 changes: 20 additions & 0 deletions native/cocos/math/Vec2.h
Original file line number Diff line number Diff line change
Expand Up @@ -364,6 +364,16 @@ class CC_DLL Vec2 {
*/
inline const Vec2 operator-(const Vec2 &v) const;

/**
* Calculates the product of this vector with the given vector.
*
* Note: this does not modify this vector.
*
* @param v The vector to multiply.
* @return The vector product.
*/
inline const Vec2 operator*(const Vec2 &v) const;

/**
* Subtracts the given vector from this vector.
*
Expand Down Expand Up @@ -391,6 +401,16 @@ class CC_DLL Vec2 {
*/
inline const Vec2 operator*(float s) const;

/**
* Return a new Vector which x = this->x + s, y = this->y + s;
*
* Note: this does not modify this vector.
*
* @param s The value to substract.
* @return The result.
*/
inline const Vec2 operator-(float s) const;

/**
* Scales this vector by the given value.
*
Expand Down
14 changes: 14 additions & 0 deletions native/cocos/math/Vec2.inl
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,13 @@ inline const Vec2 Vec2::operator-(const Vec2& v) const {
return result;
}

inline const Vec2 Vec2::operator*(const Vec2& v) const {
Vec2 result(*this);
result.x *= v.x;
result.y *= v.y;
return result;
}

inline Vec2& Vec2::operator-=(const Vec2& v) {
subtract(v);
return *this;
Expand All @@ -153,6 +160,13 @@ inline const Vec2 Vec2::operator*(float s) const {
return result;
}

inline const Vec2 Vec2::operator-(float s) const {
Vec2 result(*this);
result.x -= s;
result.y -= s;
return result;
}

inline Vec2& Vec2::operator*=(float s) {
scale(s);
return *this;
Expand Down
18 changes: 9 additions & 9 deletions native/cocos/particle/CurveRange.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,27 +9,27 @@ const OptimizedCurve OptimizedCurve::ZERO{0.F, 1.F, {0.F, 0.F}};
const OptimizedCurve OptimizedCurve::ZERO_TO_ONE{0.F, 1.F, {0.F, 1.F}};
float OptimizedCurve::evaluate(float time) const {
CC_ASSERT(time > (minTime - mathutils::EPSILON) && time < (minTime + length + mathutils::EPSILON));
float reletiveTime = time - minTime;
uint32_t sizeMinusOne = lookUpTable.size() - 1;
float t = reletiveTime / length * sizeMinusOne;
float reletiveTime = time - _minTime;
uint32_t sizeMinusOne = _lookUpTable.size() - 1;
float t = reletiveTime / _length * sizeMinusOne;
int32_t prevEntry = static_cast<int32_t>(std::floor(t));
int32_t nextEntry = prevEntry < sizeMinusOne ? prevEntry + 1 : prevEntry;
float prev = lookUpTable[prevEntry];
float next = lookUpTable[nextEntry];
float prev = _lookUpTable[prevEntry];
float next = _lookUpTable[nextEntry];
return MathUtil::lerp(prev, next, t - prevEntry);
}

float CurveRange::evaluateSlow(float time, float alpha) const {
if (mode == CurveRangeMode::CONSTANT) {
if (_mode == CurveRangeMode::CONSTANT) {
return evaluate<CurveRangeMode::CONSTANT>(time, alpha);
}
if (mode == CurveRangeMode::CURVE) {
if (_mode == CurveRangeMode::CURVE) {
return evaluate<CurveRangeMode::CURVE>(time, alpha);
}
if (mode == CurveRangeMode::RANDOM_BETWEEN_TWO_CONSTANTS) {
if (_mode == CurveRangeMode::RANDOM_BETWEEN_TWO_CONSTANTS) {
return evaluate<CurveRangeMode::RANDOM_BETWEEN_TWO_CONSTANTS>(time, alpha);
}
if (mode == CurveRangeMode::RANDOM_BETWEEN_TWO_CURVES) {
if (_mode == CurveRangeMode::RANDOM_BETWEEN_TWO_CURVES) {
return evaluate<CurveRangeMode::RANDOM_BETWEEN_TWO_CURVES>(time, alpha);
}
}
Expand Down
92 changes: 72 additions & 20 deletions native/cocos/particle/CurveRange.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,30 +19,80 @@ struct OptimizedCurve {

inline OptimizedCurve() = default;
inline OptimizedCurve(const OptimizedCurve& other) {
minTime = other.minTime;
length = other.length;
lookUpTable = other.lookUpTable;
(*this) = other;
}

inline OptimizedCurve& operator=(const OptimizedCurve& other) {
_minTime = other._minTime;
_length = other._length;
_lookUpTable = other._lookUpTable;
return *this;
}

inline OptimizedCurve(float minTime, float length, const std::initializer_list<float>& lookUpTable) :
minTime(minTime), length(length), lookUpTable(lookUpTable) {}
_minTime(minTime), _length(length), _lookUpTable(lookUpTable) {}

float evaluate(float time) const;

private:
std::vector<float> lookUpTable{1.F, 1.F};
float minTime{0.F};
float length{1.F};
std::vector<float> _lookUpTable{1.F, 1.F};
float _minTime{0.F};
float _length{1.F};
};

struct CurveRange {
inline CurveRange() = default;
inline CurveRange(float scalar) : scalar(scalar){};
inline CurveRange(float scalar, float minScalar) : scalar(scalar), minScalar(minScalar), mode(CurveRangeMode::RANDOM_BETWEEN_TWO_CONSTANTS){};
inline CurveRange(float scalar, const OptimizedCurve& curve) : scalar(scalar), curve(curve), mode(CurveRangeMode::CURVE){};
inline CurveRange(float scalar, const OptimizedCurve& curve, const OptimizedCurve& minCurve) : scalar(scalar), curve(curve), minCurve(minCurve), mode(CurveRangeMode::RANDOM_BETWEEN_TWO_CURVES){};
inline CurveRange(float scalar) : _scalar(scalar){};
inline CurveRange(float scalar, float minScalar) : _scalar(scalar), _minScalar(minScalar) {
setMode(CurveRangeMode::RANDOM_BETWEEN_TWO_CONSTANTS);
}
inline CurveRange(float scalar, const OptimizedCurve& curve) : _scalar(scalar) {
setMode(CurveRangeMode::CURVE);
getWritableCurve() = curve;
}
inline CurveRange(float scalar, const OptimizedCurve& curve, const OptimizedCurve& minCurve) : _scalar(scalar) {
setMode(CurveRangeMode::RANDOM_BETWEEN_TWO_CURVES);
getWritableCurve() = curve;
getWritableMinCurve() = minCurve;
}
~CurveRange() = default;

inline CurveRangeMode getMode() const {
return _mode;
}

inline void setMode(CurveRangeMode mode) {
if (_mode == mode) return;
if (mode == CurveRangeMode::CURVE) {
getWritableCurve();
} else if (mode == CurveRangeMode::RANDOM_BETWEEN_TWO_CURVES) {
getWritableCurve();
getWritableMinCurve();
}
_mode = mode;
}

inline const OptimizedCurve& getCurve() const {
return *_curve;
}

inline OptimizedCurve& getWritableCurve() {
if (_curve == nullptr) {
_curve = std::move(std::make_unique<OptimizedCurve>());
}
return *_curve;
}

inline const OptimizedCurve& getMinCurve() const {
return *_minCurve;
}

inline OptimizedCurve& getWritableMinCurve() {
if (_minCurve == nullptr) {
_minCurve = std::move(std::make_unique<OptimizedCurve>());
}
return *_minCurve;
}

template <CurveRangeMode mode>
static inline constexpr bool needsRandomAlpha() {
Expand All @@ -63,28 +113,30 @@ struct CurveRange {
template<CurveRangeMode mode>
inline float evaluate(float time, float alpha) const {
if constexpr (mode == CurveRangeMode::CONSTANT) {
return scalar;
return _scalar;
}

if constexpr (mode == CurveRangeMode::CURVE) {
return curve.evaluate(time) * scalar;
return getCurve().evaluate(time) * _scalar;
}

if constexpr (mode == CurveRangeMode::RANDOM_BETWEEN_TWO_CONSTANTS) {
return MathUtil::lerp(minScalar, scalar, alpha);
return MathUtil::lerp(_minScalar, _scalar, alpha);
}
if constexpr (mode == CurveRangeMode::RANDOM_BETWEEN_TWO_CURVES) {
return MathUtil::lerp(minCurve.evaluate(time), curve.evaluate(time), alpha) * scalar;
return MathUtil::lerp(getMinCurve().evaluate(time), getCurve().evaluate(time), alpha) * _scalar;
}
}

float evaluateSlow(float time, float alpha) const ;

OptimizedCurve minCurve{};
OptimizedCurve curve{};
float minScalar{1.F};
float scalar{1.F};
CurveRangeMode mode{CurveRangeMode::CONSTANT};
private:

std::unique_ptr<OptimizedCurve> _minCurve{nullptr};
std::unique_ptr<OptimizedCurve> _curve{nullptr};
float _minScalar{1.F};
float _scalar{1.F};
CurveRangeMode _mode{CurveRangeMode::CONSTANT};
};
}; // namespace cc

Expand Down
22 changes: 11 additions & 11 deletions native/cocos/particle/GradientRange.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,46 +35,46 @@ Color OptimizedGradient::evaluate(float time) const {
}

Color OptimizedGradient::evaluateSlow(float time) const {
if (mode == GradientMode::BLEND) {
if (_mode == GradientMode::BLEND) {
return evaluate<GradientMode::BLEND>(time);
} else {
return evaluate<GradientMode::FIXED>(time);
}
}

Color GradientRange::evaluateSlow(float time, float alpha) const {
if (mode == GradientRangeMode::COLOR) {
if (_mode == GradientRangeMode::COLOR) {
return evaluate<GradientRangeMode::COLOR>(time, alpha);
}

if (mode == GradientRangeMode::GRADIENT) {
if (gradient.mode == GradientMode::BLEND) {
if (_mode == GradientRangeMode::GRADIENT) {
if (getGradient().getMode() == GradientMode::BLEND) {
return evaluate<GradientRangeMode::GRADIENT, GradientMode::BLEND>(time, alpha);
} else {
return evaluate<GradientRangeMode::GRADIENT, GradientMode::FIXED>(time, alpha);
}
}

if (mode == GradientRangeMode::RANDOM_BETWEEN_TWO_COLORS) {
if (_mode == GradientRangeMode::RANDOM_BETWEEN_TWO_COLORS) {
return evaluate<GradientRangeMode::RANDOM_BETWEEN_TWO_COLORS>(time, alpha);
}
if (mode == GradientRangeMode::RANDOM_BETWEEN_TWO_GRADIENTS) {
if (gradient.mode == GradientMode::BLEND) {
if (minGradient.mode == GradientMode::BLEND) {
if (_mode == GradientRangeMode::RANDOM_BETWEEN_TWO_GRADIENTS) {
if (getGradient().getMode() == GradientMode::BLEND) {
if (getMinGradient().getMode() == GradientMode::BLEND) {
return evaluate<GradientRangeMode::RANDOM_BETWEEN_TWO_GRADIENTS, GradientMode::BLEND, GradientMode::BLEND>(time, alpha);
} else {
return evaluate<GradientRangeMode::RANDOM_BETWEEN_TWO_GRADIENTS, GradientMode::BLEND, GradientMode::FIXED>(time, alpha);
}
} else {
if (minGradient.mode == GradientMode::BLEND) {
if (getMinGradient().getMode() == GradientMode::BLEND) {
return evaluate<GradientRangeMode::RANDOM_BETWEEN_TWO_GRADIENTS, GradientMode::FIXED, GradientMode::BLEND>(time, alpha);
} else {
return evaluate<GradientRangeMode::RANDOM_BETWEEN_TWO_GRADIENTS, GradientMode::FIXED, GradientMode::FIXED>(time, alpha);
}
}
}
if (mode == GradientRangeMode::RANDOM_COLOR) {
if (gradient.mode == GradientMode::BLEND) {
if (_mode == GradientRangeMode::RANDOM_COLOR) {
if (getGradient().getMode() == GradientMode::BLEND) {
return evaluate<GradientRangeMode::RANDOM_COLOR, GradientMode::BLEND>(time, alpha);
} else {
return evaluate<GradientRangeMode::RANDOM_COLOR, GradientMode::FIXED>(time, alpha);
Expand Down
Loading

0 comments on commit 5b9593a

Please sign in to comment.