Skip to content

Commit 7834ea4

Browse files
committed
Bezier curve based animation now properly samples curves based on x (not t) except for quaternion curve animations, entity mouse events now contain ray depth information, entity editor will now select closest entity at first click, added visibility layers to SceneEntityInstance and visibility layer sheets to the entity editor
1 parent ba87969 commit 7834ea4

27 files changed

+4168
-3478
lines changed

Bindings/Scripts/create_lua_library/create_lua_library.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ def typeFilter(ty):
5252
ty = ty.replace("virtual", "")
5353
ty = ty.replace("&", "")
5454
ty = re.sub(r'^.*\sint\s*$', 'int', ty) # eg "unsigned int"
55+
ty = re.sub(r'^.*\schar\s*$', 'char', ty) # eg "unsigned int"
5556
ty = re.sub(r'^.*\slong\s*$', 'int', ty)
5657
ty = re.sub(r'^.*\sshort\s*$', 'int', ty)
5758
ty = re.sub(r'^.*\sfloat\s*$', 'Number', ty)

Core/Contents/Include/PolyBezierCurve.h

Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,10 @@
2626

2727
#include "PolyGlobals.h"
2828
#include "PolyVector3.h"
29+
#include "PolyVector2.h"
2930
#include <vector>
3031

3132

32-
#define BUFFER_CACHE_PRECISION 100
33-
3433
namespace Polycode {
3534

3635
/**
@@ -143,12 +142,6 @@ namespace Polycode {
143142
*/
144143
void addControlPoint2d(Number x, Number y);
145144

146-
/**
147-
* Returns the height of the curve at a specified point on the curve. Heights are cached into a buffer with a finite cache precision to speed up the curve usage in animation. If you need to quickly get 2D height out of a curve and you don't care about total precision, use this method.
148-
* @param a Normalized (0-1) position along the curve.
149-
* @return Height value at specified position.
150-
*/
151-
Number getHeightAt(Number a);
152145

153146
/**
154147
* Returns the 3d point of the curve at a specified point on the curve.
@@ -163,33 +156,33 @@ namespace Polycode {
163156
* @return 3d point at specified position.
164157
*/
165158
Vector3 getPointBetween(Number a, BezierPoint *bp1, BezierPoint *bp2);
166-
159+
167160
void clearControlPoints();
168-
169-
/**
170-
* Rebuilds the height cache buffers for 2d height curves.
171-
*/
172-
void rebuildBuffers();
161+
162+
Number getYValueAtX(Number x);
163+
Number getTValueAtX(Number x);
173164

174165
/**
175166
* Removes (and deletes!) a given point by pointer
176167
*/
177168
void removePoint(BezierPoint *point);
178-
179-
Number heightBuffer[BUFFER_CACHE_PRECISION];
180-
169+
181170
BezierPoint *insertPoint;
182171

183172
std::vector<BezierPoint*> controlPoints;
184173
std::vector<Number> distances;
185174

186-
void recalculateDistances();
175+
void recalculateDistances();
176+
177+
Number evaluationAccuracy;
187178

188179
protected:
189180

181+
Number minX;
182+
Number maxX;
183+
Number midX;
184+
190185
bool distancesDirty;
191-
192-
193186

194187
};
195188

Core/Contents/Include/PolyEntity.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -641,7 +641,10 @@ namespace Polycode {
641641

642642
Entity *getEntityById(String id, bool recursive) const;
643643
std::vector<Entity*> getEntitiesByTag(String tag, bool recursive) const;
644-
644+
645+
std::vector<Entity*> getEntitiesByLayerID(unsigned char layerID, bool recursive) const;
646+
647+
645648
std::vector <EntityProp> entityProps;
646649
String getEntityProp(const String& propName);
647650
void setEntityProp(const String& propName, const String& propValue);
@@ -716,6 +719,8 @@ namespace Polycode {
716719
void setLocalBoundingBoxZ(Number z);
717720

718721
bool rendererVis;
722+
723+
unsigned char layerID;
719724

720725
protected:
721726

Core/Contents/Include/PolyInputEvent.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,8 @@ namespace Polycode {
115115
unsigned int joystickButton;
116116
unsigned int joystickAxis;
117117
unsigned int joystickIndex;
118+
119+
Number hitDistance;
118120

119121
protected:
120122

Core/Contents/Include/PolyQuaternionCurve.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ namespace Polycode {
3333
public:
3434
Quaternion q1;
3535
Quaternion q2;
36-
Quaternion q3;
36+
Quaternion q3;
37+
Number time;
3738
};
3839

3940
class _PolyExport QuaternionCurve : public PolyBase {
@@ -45,12 +46,9 @@ namespace Polycode {
4546
Quaternion interpolate(unsigned int fromIndex, Number t, bool useShortestPath);
4647

4748
void generatePointsFromCurves(BezierCurve *wCurve, BezierCurve *xCurve, BezierCurve *yCurve, BezierCurve *zCurve);
48-
void recalcTangents();
4949

5050
protected:
5151

5252
std::vector<QuatTriple> tPoints;
53-
std::vector<Quaternion> points;
54-
std::vector<Quaternion> tangents;
5553
};
5654
}

Core/Contents/Include/PolyRay.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ namespace Polycode {
3636
Ray();
3737
Ray(const Vector3 &origin, const Vector3 &direction);
3838

39-
bool boxIntersect(const Vector3 &box, const Matrix4 &transformMatrix, float near = 0.0, float far = 9999.0) const;
39+
Number boxIntersect(const Vector3 &box, const Matrix4 &transformMatrix, float near = 0.0, float far = 9999.0) const;
4040

4141
Vector3 planeIntersectPoint(const Vector3 &planeNormal, Number planeDistance) const;
4242
Ray tranformByMatrix(const Matrix4& matrix) const;

Core/Contents/Include/PolySceneEntityInstance.h

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ THE SOFTWARE.
3636
namespace Polycode {
3737

3838
class SceneEntityInstanceResourceEntry;
39-
39+
class SceneEntityInstanceLayer;
40+
4041
class SceneEntityInstance : public Entity {
4142
public:
4243

@@ -69,6 +70,13 @@ class SceneEntityInstance : public Entity {
6970

7071
ResourcePool *getTopLevelResourcePool();
7172

73+
bool hasLayerID(unsigned char layerID) const;
74+
unsigned int getNumLayers() const;
75+
SceneEntityInstanceLayer *getLayerAtIndex(unsigned int index) const;
76+
void removeLayer(SceneEntityInstanceLayer *layer);
77+
78+
79+
SceneEntityInstanceLayer *createNewLayer(String name);
7280

7381
String getFileName() const;
7482
bool cloneUsingReload;
@@ -77,6 +85,8 @@ class SceneEntityInstance : public Entity {
7785

7886
protected:
7987

88+
std::vector<SceneEntityInstanceLayer*> layers;
89+
8090
void rebuildResourceLinks();
8191

8292
ResourcePool *topLevelResourcePool;
@@ -85,6 +95,19 @@ class SceneEntityInstance : public Entity {
8595
SceneEntityInstanceResourceEntry *resourceEntry;
8696

8797
};
98+
99+
class SceneEntityInstanceLayer {
100+
public:
101+
SceneEntityInstanceLayer(SceneEntityInstance *instance,String name);
102+
103+
void setLayerVisibility(bool val);
104+
105+
String name;
106+
unsigned char layerID;
107+
bool visible;
108+
SceneEntityInstance *instance;
109+
};
110+
88111

89112
class SceneEntityInstanceResourceEntry : public Resource {
90113
public:

Core/Contents/Include/PolySkeleton.h

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ THE SOFTWARE.
2727
#include "PolyColor.h"
2828
#include "PolyVector3.h"
2929
#include "PolyQuaternion.h"
30+
#include "PolyQuaternionCurve.h"
3031
#include "PolyEntity.h"
3132
#include <vector>
3233

@@ -40,13 +41,11 @@ namespace Polycode {
4041
class _PolyExport BoneTrack : public PolyBase {
4142
public:
4243
BoneTrack(Bone *bone, Number length);
43-
44-
void initTweens();
4544
~BoneTrack();
4645

4746
void Play(bool once=false);
4847
void Stop();
49-
void Update();
48+
void Update(Number elapsed);
5049
void Reset();
5150

5251
void setSpeed(Number speed);
@@ -62,30 +61,21 @@ namespace Polycode {
6261
BezierCurve *LocY;
6362
BezierCurve *LocZ;
6463

65-
Vector3 LocXVec;
66-
Vector3 LocYVec;
67-
Vector3 LocZVec;
68-
69-
Vector3 ScaleXVec;
70-
Vector3 ScaleYVec;
71-
Vector3 ScaleZVec;
72-
73-
64+
Vector3 position;
65+
Vector3 scale;
7466
Quaternion boneQuat;
75-
QuaternionTween *quatTween;
76-
77-
Vector3 QuatWVec;
78-
Vector3 QuatXVec;
79-
Vector3 QuatYVec;
80-
Vector3 QuatZVec;
81-
67+
QuaternionCurve *quatCurve;
68+
8269
Number weight;
8370

8471
protected:
8572

8673
Number length;
74+
Number speed;
75+
bool paused;
76+
Number time;
8777
Bone *targetBone;
88-
std::vector <BezierPathTween*> pathTweens;
78+
bool playOnce;
8979

9080
};
9181

Core/Contents/Source/PolyBezierCurve.cpp

Lines changed: 46 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -39,19 +39,12 @@ BezierPoint::BezierPoint(Number p1x, Number p1y, Number p1z, Number p2x, Number
3939

4040
BezierCurve::BezierCurve(){
4141
insertPoint = NULL;
42-
for(int i=0; i < BUFFER_CACHE_PRECISION; i++) {
43-
heightBuffer[i] = 0;
44-
}
45-
42+
evaluationAccuracy = 0.01;
4643
distancesDirty = false;
4744
}
4845

4946
void BezierCurve::clearControlPoints() {
5047
insertPoint = NULL;
51-
for(int i=0; i < BUFFER_CACHE_PRECISION; i++) {
52-
heightBuffer[i] = 0;
53-
}
54-
5548
distancesDirty = true;
5649
for(int i=0; i < controlPoints.size(); i++) {
5750
delete controlPoints[i];
@@ -103,6 +96,7 @@ void BezierCurve::addControlPoint2d(Number x, Number y) {
10396
void BezierCurve::recalculateDistances() {
10497
if(controlPoints.size() < 2)
10598
return;
99+
106100
distancesDirty = false;
107101

108102
Number dist, lastDist = 0;
@@ -128,7 +122,10 @@ void BezierCurve::recalculateDistances() {
128122
distances[i] = distances[i]/totalDistance;
129123
}
130124

131-
rebuildBuffers();
125+
minX = getPointAt(0.0).x;
126+
maxX = getPointAt(1.0).x;
127+
midX = getPointAt(0.5).x;
128+
132129
}
133130

134131
Vector3 BezierCurve::getPointBetween(Number a, BezierPoint *bp1, BezierPoint *bp2) {
@@ -142,6 +139,46 @@ Vector3 BezierCurve::getPointBetween(Number a, BezierPoint *bp1, BezierPoint *bp
142139
return retVector;
143140
}
144141

142+
Number BezierCurve::getYValueAtX(Number x) {
143+
return getPointAt(getTValueAtX(x)).y;
144+
}
145+
146+
Number BezierCurve::getTValueAtX(Number x) {
147+
if(controlPoints.size() < 2) {
148+
return 0;
149+
}
150+
151+
if (distancesDirty) {
152+
recalculateDistances();
153+
}
154+
155+
if(x <= minX) {
156+
return 0.0;
157+
}
158+
if(x >= maxX) {
159+
return 1.0;
160+
}
161+
162+
Number _x = midX;
163+
164+
Number lower = 0.0;
165+
Number upper = 1.0;
166+
Number percent = (upper + lower) / 2.0;
167+
168+
while(fabs(x - _x) > evaluationAccuracy) {
169+
if(x > _x) {
170+
lower = percent;
171+
} else {
172+
upper = percent;
173+
}
174+
175+
percent = (upper + lower) / 2.0;
176+
_x = getPointAt(percent).x;
177+
}
178+
179+
return percent;
180+
}
181+
145182
BezierPoint *BezierCurve::getControlPoint(unsigned int index) {
146183
return controlPoints[index];
147184
}
@@ -161,26 +198,6 @@ void BezierCurve::removePoint(BezierPoint *point) {
161198
distancesDirty = true;
162199
}
163200

164-
Number BezierCurve::getHeightAt(Number a) {
165-
if (distancesDirty) {
166-
recalculateDistances();
167-
}
168-
169-
int unsigned index = ((Number)(BUFFER_CACHE_PRECISION)) * a;
170-
171-
if(index > BUFFER_CACHE_PRECISION-1)
172-
index = BUFFER_CACHE_PRECISION-1;
173-
return heightBuffer[index];
174-
175-
// return getPointAt(a).y;
176-
}
177-
178-
void BezierCurve::rebuildBuffers() {
179-
for(int i=0; i < BUFFER_CACHE_PRECISION; i++) {
180-
heightBuffer[i] = getPointAt(((Number)i)/((Number)BUFFER_CACHE_PRECISION)).y;
181-
}
182-
}
183-
184201
Vector3 BezierCurve::getPointAt(Number a) {
185202

186203
if (distancesDirty) {

0 commit comments

Comments
 (0)