-
Notifications
You must be signed in to change notification settings - Fork 4
/
TrailSource.h
101 lines (76 loc) · 3.22 KB
/
TrailSource.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#ifndef _TRAILSOURCE_H
#define _TRAILSOURCE_H
#include <vector>
#include <max.h>
#include "ParticleState.h"
// ----------------------------------------------------------------------------
//
// Abstract interface for classes that provide the TM's for one or
// more trails.
//
class ITrailSource {
public:
virtual int numTrails() = 0;
virtual Matrix3 getTrailTM(int trailIdx, TimeValue t,
std::vector<TimeValue>& leveltTimes) = 0;
virtual TimeValue getTrailAgeAtTime(int trailIdx, TimeValue t) = 0;
virtual TimeValue getTrailLifeTime(int trailIdx) = 0;
virtual BOOL isTrailStationary(int trailIdx, TimeValue startT, TimeValue endT,
TimeValue keyStep,
std::vector<TimeValue>& levelTimes) = 0;
virtual int getNumStationaryLevels(
int trailIdx, std::vector<TimeValue>& levelTimes) = 0;
virtual int getTrailMtlID(int trailIdx) = 0;
};
// ----------------------------------------------------------------------------
//
// Trail source for ordinary trails generated from the shape object's
// animation.
//
class SplineTrailSource : public ITrailSource {
public:
SplineTrailSource(INode*);
virtual int numTrails();
virtual Matrix3 getTrailTM(int trailIdx, TimeValue t,
std::vector<TimeValue>& leveltTimes);
virtual TimeValue getTrailAgeAtTime(int trailIdx, TimeValue t);
virtual TimeValue getTrailLifeTime(int trailIdx);
virtual BOOL isTrailStationary(int trailIdx, TimeValue startT, TimeValue endT,
TimeValue keyStep,
std::vector<TimeValue>& levelTimes);
virtual int getNumStationaryLevels(int trailIdx,
std::vector<TimeValue>& levelTimes);
virtual int getTrailMtlID(int trailIdx);
private:
Point3 getTMPos(const Matrix3&);
INode* pShapeNode;
static float MIN_TRAIL_MOVEMENT;
};
// ----------------------------------------------------------------------------
//
// Trail source for trails generated from a particle system.
//
class ParticleTrailSource : public ITrailSource {
public:
ParticleTrailSource(ParticleSystemState*);
virtual int numTrails();
virtual Matrix3 getTrailTM(int trailIdx, TimeValue t,
std::vector<TimeValue>& leveltTimes);
virtual TimeValue getTrailAgeAtTime(int trailIdx, TimeValue t);
virtual TimeValue getTrailLifeTime(int trailIdx);
virtual BOOL isTrailStationary(int trailIdx, TimeValue startT, TimeValue endT,
TimeValue keyStep,
std::vector<TimeValue>& levelTimes);
virtual int getNumStationaryLevels(int trailIdx,
std::vector<TimeValue>& levelTimes);
virtual int getTrailMtlID(int trailIdx);
private:
void findSurroundingKeys(ParticleState&, TimeValue, int&, int&);
Matrix3 interpolateMatrices(const Matrix3* leftminusoneTM,
const Matrix3* leftTM, const Matrix3* rightTM,
const Matrix3* rightplusoneTM, TimeValue lTime,
TimeValue rTime, TimeValue cTime);
ParticleSystemState* pPartState;
};
// ----------------------------------------------------------------------------
#endif // _TRAILSOURCE_H