Xonotic
keyframe.qc
Go to the documentation of this file.
1 #include "keyframe.qh"
2 
3 #include "../menu.qh"
4 #include "easing.qh"
5 
6 #include "../item/container.qh"
7 
8 .entity parent;
9 
10  entity makeHostedKeyframe(entity obj, void(entity, float) objSetter, float animDuration, float animStart, float animEnd)
11  {
12  entity this = makeKeyframe(obj, objSetter, animDuration, animStart, animEnd);
13  anim.addAnim(anim, this);
14  return this;
15  }
16 
17  entity makeKeyframe(entity obj, void(entity, float) objSetter, float animDuration, float animStart, float animEnd)
18  {
19  entity this = NEW(Keyframe);
20  this.configureAnimation(this, obj, objSetter, time, animDuration, animStart, animEnd);
21  return this;
22  }
23 
24  METHOD(Keyframe, addEasing, entity(entity this, float animDurationTime, float animEnd, float(float, float, float, float) func))
25  {
26  entity other = makeEasing(this.object, this.setter, func, getNewChildStart(this), getNewChildDuration(this, animDurationTime), getNewChildValue(this), animEnd);
27  this.addAnim(this, other);
28  return other;
29  }
30 
32  {
33  if (this.lastChild) return this.lastChild.startTime + this.lastChild.duration;
34  else return 0;
35  }
36 
37  float getNewChildDuration(entity this, float durationTime)
38  {
39  float maxDura = this.duration;
40  if (this.lastChild) maxDura = maxDura - (this.lastChild.startTime + this.lastChild.duration);
41  float dura = durationTime;
42  if (0 >= dura || dura > maxDura) dura = maxDura;
43  return dura;
44  }
45 
47  {
48  if (this.lastChild) return this.lastChild.startValue + this.lastChild.delta;
49  else return this.startValue;
50  }
51 
52  METHOD(Keyframe, addAnim, void(entity this, entity other))
53  {
54  if (other.parent) error("Can't add already added anim!");
55 
56  if (other.isFinished(other)) error("Can't add finished anim!");
57 
58  other.parent = this;
59 
60  entity l = this.lastChild;
61 
62  if (l)
63  {
64  l.nextSibling = other;
65  }
66  else
67  {
68  this.currentChild = other;
69  this.firstChild = other;
70  }
71 
72  other.prevSibling = l;
73  other.nextSibling = NULL;
74  this.lastChild = other;
75  }
76 
77  METHOD(Keyframe, calcValue, float(entity this, float tickTime, float animDuration, float animStartValue, float animDelta))
78  {
79  if (this.currentChild)
80  if (this.currentChild.isFinished(this.currentChild)) this.currentChild = this.currentChild.nextSibling;
81 
82  if (this.currentChild)
83  {
84  this.currentChild.tick(this.currentChild, tickTime);
85  return this.currentChild.value;
86  }
87 
88  return animStartValue + animDelta;
89  }
entity makeHostedKeyframe(entity obj, void(entity, float) objSetter, float animDuration, float animStart, float animEnd)
Definition: keyframe.qc:10
#define NEW(cname,...)
Definition: oo.qh:105
entity makeEasing(entity obj, void(entity, float) objSetter, float(float, float, float, float) func, float animStartTime, float animDuration, float animStartValue, float animEnd)
Definition: easing.qc:13
entity() spawn
float getNewChildDuration(entity this, float durationTime)
Definition: keyframe.qc:37
#define METHOD(cname, name, prototype)
Definition: oo.qh:257
entity other
Definition: csprogsdefs.qc:14
float getNewChildStart(entity this)
Definition: keyframe.qc:31
#define NULL
Definition: post.qh:17
entity parent
Definition: keyframe.qc:8
entity makeKeyframe(entity obj, void(entity, float) objSetter, float animDuration, float animStart, float animEnd)
Definition: keyframe.qc:17
if(IS_DEAD(this))
Definition: impulse.qc:92
float time
Definition: csprogsdefs.qc:16
float getNewChildValue(entity this)
Definition: keyframe.qc:46