If Blender is in your PATH, run the following command from the js directory:
35 |
npm run build-examples
36 |
Otherwise, or if you haven't understood the previous paragraph, open animations.blend (in the parent directory) and use the HTML5 Animations add-on to export exported-animations.js (in this directory) with the default settings.
37 |
Afterwards, refresh this page.
38 |
39 |
My object
40 |
41 |
42 |
43 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/js/src/bezier.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | function bezierInterpolation(A, B, C, D, t) {
4 | var T = 1 - t;
5 | return T*T*T*A + 3*T*T*t*B + 3*T*t*t*C + t*t*t*D;
6 | }
7 |
8 | function bezier(time, leftKeyframe, rightKeyframe) {
9 | var aT = leftKeyframe.time;
10 | var aV = leftKeyframe.value;
11 | var bT = leftKeyframe.rightTime;
12 | var bV = leftKeyframe.rightValue;
13 | var cT = rightKeyframe.leftTime;
14 | var cV = rightKeyframe.leftValue;
15 | var dT = rightKeyframe.time;
16 | var dV = rightKeyframe.value;
17 |
18 | var leftDeltaTime = bT - aT;
19 | var rightDeltaTime = dT - cT;
20 | var duration = dT - aT;
21 |
22 | if (leftDeltaTime + rightDeltaTime > duration) {
23 | var leftDeltaValue = bV - aV;
24 | var rightDeltaValue = dV - cV;
25 |
26 | var factor = duration / (leftDeltaTime + rightDeltaTime);
27 |
28 | bT = aT + factor * leftDeltaTime;
29 | bV = aV + factor * leftDeltaValue;
30 |
31 | cT = dT - factor * rightDeltaTime;
32 | cV = dV - factor * rightDeltaValue;
33 | }
34 |
35 | var uLeft = 0, uRight = 1;
36 | var u, T;
37 | do {
38 | u = (uLeft + uRight) / 2;
39 | T = bezierInterpolation(aT, bT, cT, dT, u);
40 | if (T > time)
41 | uRight = u;
42 | else
43 | uLeft = u;
44 | } while (Math.abs(T - time) > 0.01);
45 |
46 | return bezierInterpolation(aV, bV, cV, dV, u);
47 | }
48 |
49 | module.exports = bezier;
50 |
--------------------------------------------------------------------------------
/js/Readme.md:
--------------------------------------------------------------------------------
1 | # Blender HTML5 Animations
2 |
3 | Use animation curves from Blender.
4 |
5 | ## API
6 |
7 | The entry point is the class *ActionLibrary*. Create an *ActionLibrary* with the data exported from Blender, and enjoy.
8 |
9 | The library relies on [glMatrix](https://github.com/toji/gl-matrix) for math computations.
10 |
11 | ## Browser
12 |
13 | Copy *blender-html5-animations.min.js* from the *dist* folder.
14 |
15 | Copy *gl-matrix-min.js* from [glMatrix](https://github.com/toji/gl-matrix)'s *dist* folder.
16 |
17 | ```html
18 |
19 |
20 |
21 |
26 | ```
27 |
28 | ## Node.js
29 |
30 | npm install --save blender-html5-animations
31 |
32 | ```js
33 | var exportedData = require('./exported-data.json');
34 | var blenderHTML5Animations = require('blender-html5-animations');
35 |
36 | var myActionLibrary = new blenderHTML5Animations.ActionLibrary(exportedData);
37 |
38 | var value = myActionLibrary['my-action'].paths['location'].evaluate(time, blenderHTML5Animations.FCurveArray.DefaultValues.LOCATION);
39 | ```
40 |
41 | ## License
42 |
43 | Copyright 2016 Jonathan Giroux
44 |
45 | [MIT licence](https://opensource.org/licenses/MIT)
46 |
--------------------------------------------------------------------------------
/js/example/js/script.js:
--------------------------------------------------------------------------------
1 | (function() {
2 | 'use strict';
3 |
4 | if (typeof actions === 'undefined') {
5 | document.getElementById('build-missing').style.display = 'block';
6 | return;
7 | }
8 |
9 | var objectElement = document.getElementById('object');
10 | objectElement.style.display = 'block';
11 |
12 | var myActions = new blenderHTML5Animations.ActionLibrary(actions);
13 | var myAction = myActions['my-action'];
14 | var myActionTime = myAction.startTime;
15 |
16 | function markerCallback(marker) {
17 | var element = document.createElement('div');
18 | document.body.appendChild(element);
19 | element.textContent = marker.name;
20 |
21 | setTimeout(function() {
22 | element.remove();
23 | }, 500);
24 | }
25 |
26 | var startTime = Date.now();
27 | var lastTime = 0;
28 |
29 | function render() {
30 | requestAnimationFrame(render);
31 |
32 | var time = (Date.now() - startTime) / 1000;
33 | var dt = Math.min(time - lastTime, 0.1);
34 | lastTime = time;
35 |
36 | var newActionTime = myActionTime + dt;
37 | while (newActionTime >= myAction.endTime) {
38 | myAction.forEachMarker(myActionTime, myAction.endTime, markerCallback);
39 | myActionTime = 0;
40 |
41 | newActionTime -= (myAction.endTime - myAction.startTime);
42 | }
43 |
44 | myAction.forEachMarker(myActionTime, newActionTime, markerCallback);
45 |
46 | myActionTime = newActionTime;
47 |
48 | myAction.setElementTransform(objectElement, myActionTime, blenderHTML5Animations.Action.RotationMode.EULER_XYZ);
49 | }
50 |
51 | requestAnimationFrame(render);
52 | })();
53 |
--------------------------------------------------------------------------------
/js/src/FCurveArray.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | var FCurve = require('./FCurve');
4 | /**
5 | * Provides a value when a FCurve does not exist.
6 | * @callback FCurveArray~DefaultValues
7 | * @param {number} index Array index
8 | * @param {number} time Evaluation time
9 | * @return {number} Value
10 | */
11 |
12 | /**
13 | * @class A FCurveArray is an array of FCurves.
14 | * @param data Data from Blender.
15 | */
16 | function FCurveArray(data) {
17 | var array = data.map(function(data) {
18 | return data && new FCurve(data);
19 | });
20 |
21 | /**
22 | * Evaluates the array.
23 | * @method FCurveArray~evaluate
24 | * @param {number} time Evaluation time.
25 | * @param {FCurveArray~DefaultValues} defaultValues In case a FCurve does not exist.
26 | * @return {number[]}
27 | */
28 | array.evaluate = function(time, defaultValues) {
29 | return array.map(function(fcurve, index) {
30 | return fcurve ? fcurve.evaluate(time) : defaultValues(index, time);
31 | });
32 | };
33 |
34 | return array;
35 | }
36 |
37 | /**
38 | * Built-in DefaultValues functions.
39 | * @enum {FCurveArray~DefaultValues}
40 | * @readonly
41 | */
42 | FCurveArray.DefaultValues = {
43 | /** Returns 0. */
44 | LOCATION: function() {
45 | return 0;
46 | },
47 | /** Returns 0. */
48 | ROTATION: function() {
49 | return 0;
50 | },
51 | /** Returns 0 for XYZ and 1 for W. */
52 | ROTATION_QUATERNION: function(index) {
53 | return (index === 3 ? 1 : 0);
54 | },
55 | /** Returns 1. */
56 | SCALE: function() {
57 | return 1;
58 | },
59 | };
60 |
61 | module.exports = FCurveArray;
62 |
--------------------------------------------------------------------------------
/js/docs/ActionLibrary.js.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | JSDoc: Source: ActionLibrary.js
6 |
7 |
8 |
9 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
Source: ActionLibrary.js
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
'use strict';
30 |
31 | var Action = require('./Action');
32 |
33 | /**
34 | * @class An ActionLibrary is an object of Actions.
35 | * @param data Data from Blender.
36 | */
37 | function ActionLibrary(data) {
38 | for (var actionName in data) {
39 | this[actionName] = new Action(data[actionName]);
40 | }
41 | }
42 |
43 | module.exports = ActionLibrary;
44 |
The entry point is the class ActionLibrary. Create an ActionLibrary with the data exported from Blender, and enjoy.
48 |
The library relies on glMatrix for math computations.
49 |
Browser
Copy blender-html5-animations.min.js from the dist folder.
50 |
Copy gl-matrix-min.js from glMatrix's dist folder.
51 |
<script src="exported-data.js"></script>
52 | <script src="gl-matrix-min.js"></script>
53 | <script src="blender-html5-animations.min.js"></script>
54 | <script>
55 | var myActionLibrary = new blenderHTML5Animations.ActionLibrary(exportedData);
56 |
57 | var value = myActionLibrary['my-action'].paths['location'].evaluate(time, blenderHTML5Animations.FCurveArray.DefaultValues.LOCATION);
58 | </script>
Node.js
npm install --save blender-html5-animations
var exportedData = require('./exported-data.json');
59 | var blenderHTML5Animations = require('blender-html5-animations');
60 |
61 | var myActionLibrary = new blenderHTML5Animations.ActionLibrary(exportedData);
62 |
63 | var value = myActionLibrary['my-action'].paths['location'].evaluate(time, blenderHTML5Animations.FCurveArray.DefaultValues.LOCATION);
275 |
276 |
279 |
280 |
281 |
282 |
285 |
286 |
287 |
288 |
289 |
290 |
--------------------------------------------------------------------------------
/blender-addon/html5_animations.py:
--------------------------------------------------------------------------------
1 | # Blender HTML5 Animations
2 | # Copyright 2016 Jonathan Giroux
3 | # MIT License
4 |
5 | bl_info = {
6 | "name": "HTML5 Animations",
7 | "author": "Jonathan Giroux",
8 | "version": (1, 0, 2),
9 | "blender": (2, 70, 0),
10 | "location": "File > Export > HTML5 Animations",
11 | "description": "Export animation curves as CSS, JS, or JSON.",
12 | "warning": "",
13 | "wiki_url": "http://wiki.blender.org/index.php/Extensions:2.6/Py/Scripts/System/HTML5_Animations",
14 | "category": "Import-Export",
15 | }
16 |
17 | import bpy
18 | import json
19 |
20 | from bpy.props import (
21 | BoolProperty,
22 | EnumProperty,
23 | StringProperty,
24 | )
25 | from bpy.types import Operator
26 | from bpy_extras.io_utils import (
27 | ExportHelper,
28 | orientation_helper_factory,
29 | )
30 |
31 |
32 | Easings = bpy.types.GRAPH_OT_easing_type.bl_rna.properties['type'].enum_items
33 | Extrapolations = bpy.types.GRAPH_OT_extrapolation_type.bl_rna.properties['type'].enum_items
34 | Interpolations = bpy.types.GRAPH_OT_interpolation_type.bl_rna.properties['type'].enum_items
35 |
36 |
37 | CoordinateSystemChangeDataPaths = {
38 | 'location',
39 | 'delta_location',
40 | 'rotation_axis',
41 | 'rotation_euler',
42 | 'delta_rotation_euler',
43 | 'rotation_quaternion',
44 | 'delta_rotation_quaternion',
45 | }
46 |
47 | CoordinateSystemChangeAxisIndex = {
48 | 'X': (0, 1),
49 | '-X': (0, -1),
50 | 'Y': (1, 1),
51 | '-Y': (1, -1),
52 | 'Z': (2, 1),
53 | '-Z': (2, -1),
54 | }
55 |
56 | def export_json(time_coefficient, coordinate_system_mapping):
57 | actions_obj = {}
58 |
59 | for action in bpy.data.actions:
60 | fcurves_obj = {}
61 | for fcurve in action.fcurves:
62 | if fcurve.data_path not in fcurves_obj:
63 | fcurves_obj[fcurve.data_path] = []
64 | fcurves_arr = fcurves_obj[fcurve.data_path]
65 |
66 | array_index = fcurve.array_index
67 | value_coefficient = 1
68 | if coordinate_system_mapping is not None:
69 | array_index, value_coefficient = coordinate_system_mapping(array_index)
70 |
71 | # Fill missing array indexes
72 | while len(fcurves_arr) <= array_index:
73 | fcurves_arr.append(0)
74 |
75 | keyframes_arr = []
76 | for keyframe_point in fcurve.keyframe_points:
77 | keyframe_arr = [
78 | keyframe_point.co[0] * time_coefficient,
79 | keyframe_point.co[1] * value_coefficient,
80 | keyframe_point.handle_left[0] * time_coefficient,
81 | keyframe_point.handle_left[1] * value_coefficient,
82 | keyframe_point.handle_right[0] * time_coefficient,
83 | keyframe_point.handle_right[1] * value_coefficient,
84 | Interpolations[keyframe_point.interpolation].value,
85 | ]
86 |
87 | if keyframe_point.interpolation not in {'BEZIER', 'CONSTANT', 'LINEAR'}:
88 | keyframe_arr.append(Easings[keyframe_point.easing].value)
89 |
90 | if keyframe_point.interpolation == 'BACK':
91 | keyframe_arr.append(keyframe_point.back)
92 |
93 | if keyframe_point.interpolation == 'ELASTIC':
94 | keyframe_arr.append(keyframe_point.amplitude)
95 | keyframe_arr.append(keyframe_point.period)
96 |
97 | keyframes_arr.append(keyframe_arr)
98 |
99 | fcurve_obj = [
100 | keyframes_arr,
101 | Extrapolations[fcurve.extrapolation].value,
102 | ]
103 |
104 | fcurves_arr[array_index] = fcurve_obj
105 |
106 | markers_arr = []
107 | for marker in action.pose_markers:
108 | marker_arr = [
109 | marker.frame * time_coefficient,
110 | marker.name,
111 | ]
112 | markers_arr.append(marker_arr)
113 |
114 | action_arr = [
115 | fcurves_obj,
116 | ]
117 |
118 | if len(markers_arr) > 0:
119 | action_arr.append(markers_arr)
120 |
121 | actions_obj[action.name] = action_arr
122 |
123 | return actions_obj
124 |
125 |
126 | HTML5AnimationsOrientationHelper = orientation_helper_factory("HTML5AnimationsOrientationHelper", axis_forward='-Z', axis_up='Y')
127 |
128 |
129 | class Export(Operator, ExportHelper, HTML5AnimationsOrientationHelper):
130 | """Export animation curves as CSS, JS, or JSON."""
131 | bl_idname = "html5_animations.export"
132 | bl_label = "Export HTML5 Animations"
133 |
134 | filename_ext = ".js"
135 |
136 | filter_glob = StringProperty(
137 | default="*.css;*.js;*.json",
138 | options={'HIDDEN'},
139 | maxlen=255,
140 | )
141 |
142 | change_coordinate_system = BoolProperty(
143 | name="Change coordinate system",
144 | description="Affected data paths: location, rotation_axis, rotation_euler, rotation_quaternion, scale + delta_",
145 | default=False,
146 | )
147 |
148 | format = EnumProperty(
149 | name="Format",
150 | items=(
151 | ('CSS', "CSS", ""),
152 | ('JS', "JS", ""),
153 | ('JSON', "JSON", "")
154 | ),
155 | default='JS',
156 | )
157 |
158 | css_vendor_prefixes = EnumProperty(
159 | name="Vendor Prefixes",
160 | options={'ENUM_FLAG'},
161 | items=(
162 | ('NONE', "", ""),
163 | ('MOZ', "-moz-", ""),
164 | ('O', "-o-", ""),
165 | ('WEBKIT', "-webkit-", ""),
166 | ),
167 | default={'NONE'},
168 | )
169 |
170 | css_animation_prefix = StringProperty(
171 | name="Prefix",
172 | description="Animation name prefix.",
173 | default="",
174 | )
175 |
176 | js_json_pretty_formatting = BoolProperty(
177 | name="Pretty Formatting",
178 | description="If true, format with indents and line breaks.",
179 | default=False,
180 | )
181 |
182 | js_variable_name = StringProperty(
183 | name="Variable Name",
184 | description="It can be a complex path, e.g. 'foo.bar' (provided that foo is an object).",
185 | default="actions",
186 | )
187 |
188 | def draw(self, context):
189 | layout = self.layout
190 |
191 | layout.prop(self, "change_coordinate_system")
192 | if self.change_coordinate_system:
193 | layout.prop(self, "axis_forward")
194 | layout.prop(self, "axis_up")
195 |
196 | layout.separator()
197 |
198 | layout.prop(self, 'format', expand=True)
199 |
200 | if self.format == 'CSS':
201 | self.filename_ext = ".css"
202 | layout.prop(self, 'css_vendor_prefixes')
203 | layout.prop(self, 'css_animation_prefix')
204 |
205 | elif self.format == 'JS':
206 | self.filename_ext = ".js"
207 | layout.prop(self, 'js_json_pretty_formatting')
208 | layout.prop(self, 'js_variable_name')
209 |
210 | elif self.format == 'JSON':
211 | self.filename_ext = ".json"
212 | layout.prop(self, 'js_json_pretty_formatting')
213 |
214 | def execute(self, context):
215 | if not self.filepath:
216 | raise Exception("filepath not set")
217 |
218 | coordinate_system_mapping = None
219 | if self.change_coordinate_system:
220 | forward_index, forward_coefficient = CoordinateSystemChangeAxisIndex[self.axis_forward]
221 | up_index, up_coefficient = CoordinateSystemChangeAxisIndex[self.axis_up]
222 | if forward_index == up_index:
223 | raise Exception("Wrong coordinate system change")
224 | right_index = 3 - forward_index - up_index
225 | right_coefficient = 1 if (forward_index < up_index) == (forward_coefficient == up_coefficient) else -1
226 |
227 | def coordinate_system_mapping(array_index):
228 | if array_index == 0:
229 | return (right_index, right_coefficient)
230 | if array_index == 1:
231 | return (forward_index, forward_coefficient)
232 | if array_index == 2:
233 | return (up_index, up_coefficient)
234 | return (array_index, 1)
235 |
236 | time_coefficient = context.scene.render.fps_base / context.scene.render.fps
237 |
238 | if self.format == 'CSS':
239 | raise Exception("Not implemented")
240 |
241 | else:
242 | if self.js_json_pretty_formatting:
243 | indent = ' '
244 | separators = (', ', ': ')
245 | else:
246 | indent = None
247 | separators = (',', ':')
248 |
249 | obj = export_json(time_coefficient, coordinate_system_mapping)
250 |
251 | if self.format == 'JS':
252 | with open(self.filepath, 'w', encoding='utf-8') as f:
253 | f.write(self.js_variable_name + '=')
254 | json.dump(obj, f, indent=indent, separators=separators)
255 | f.write(';\n')
256 | return {'FINISHED'}
257 |
258 | elif self.format == 'JSON':
259 | with open(self.filepath, 'w', encoding='utf-8') as f:
260 | json.dump(obj, f, indent=indent, separators=separators)
261 | return {'FINISHED'}
262 |
263 |
264 | def menu_export(self, context):
265 | self.layout.operator(Export.bl_idname, text="HTML5 Animations (.css, .js, .json)")
266 |
267 |
268 | def register():
269 | bpy.utils.register_module(__name__)
270 | bpy.types.INFO_MT_file_export.append(menu_export)
271 |
272 |
273 | def unregister():
274 | bpy.utils.unregister_module(__name__)
275 | bpy.types.INFO_MT_file_export.remove(menu_export)
276 |
277 |
278 | if __name__ == "__main__":
279 | register()
280 |
--------------------------------------------------------------------------------
/js/src/easing.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | // easing.c
4 |
5 | function backEaseIn(time, begin, change, duration, overshoot) {
6 | time /= duration;
7 | return change * time * time * ((overshoot + 1) * time - overshoot) + begin;
8 | }
9 |
10 | function backEaseOut(time, begin, change, duration, overshoot) {
11 | time = time / duration - 1;
12 | return change * (time * time * ((overshoot + 1) * time + overshoot) + 1) + begin;
13 | }
14 |
15 | function backEaseInOut(time, begin, change, duration, overshoot) {
16 | overshoot *= 1.525;
17 | if ((time /= duration / 2) < 1) {
18 | return change / 2 * (time * time * ((overshoot + 1) * time - overshoot)) + begin;
19 | }
20 | time -= 2.0;
21 | return change / 2 * (time * time * ((overshoot + 1) * time + overshoot) + 2) + begin;
22 | }
23 |
24 | function bounceEaseOut(time, begin, change, duration) {
25 | time /= duration;
26 | if (time < (1 / 2.75)) {
27 | return change * (7.5625 * time * time) + begin;
28 | }
29 | else if (time < (2 / 2.75)) {
30 | time -= (1.5 / 2.75);
31 | return change * ((7.5625 * time) * time + 0.75) + begin;
32 | }
33 | else if (time < (2.5 / 2.75)) {
34 | time -= (2.25 / 2.75);
35 | return change * ((7.5625 * time) * time + 0.9375) + begin;
36 | }
37 | else {
38 | time -= (2.625 / 2.75);
39 | return change * ((7.5625 * time) * time + 0.984375) + begin;
40 | }
41 | }
42 |
43 | function bounceEaseIn(time, begin, change, duration) {
44 | return change - bounceEaseOut(duration - time, 0, change, duration) + begin;
45 | }
46 |
47 | function bounceEaseInOut(time, begin, change, duration) {
48 | if (time < duration / 2)
49 | return bounceEaseIn(time * 2, 0, change, duration) * 0.5 + begin;
50 | else
51 | return bounceEaseOut(time * 2 - duration, 0, change, duration) * 0.5 + change * 0.5 + begin;
52 | }
53 |
54 | function circularEaseIn(time, begin, change, duration) {
55 | time /= duration;
56 | return -change * (Math.sqrt(1 - time * time) - 1) + begin;
57 | }
58 |
59 | function circularEaseOut(time, begin, change, duration) {
60 | time = time / duration - 1;
61 | return change * Math.sqrt(1 - time * time) + begin;
62 | }
63 |
64 | function circularEaseInOut(time, begin, change, duration) {
65 | if ((time /= duration / 2) < 1.0)
66 | return -change / 2 * (Math.sqrt(1 - time * time) - 1) + begin;
67 | time -= 2.0;
68 | return change / 2 * (Math.sqrt(1 - time * time) + 1) + begin;
69 | }
70 |
71 | function cubicEaseIn(time, begin, change, duration) {
72 | time /= duration;
73 | return change * time * time * time + begin;
74 | }
75 |
76 | function cubicEaseOut(time, begin, change, duration) {
77 | time = time / duration - 1;
78 | return change * (time * time * time + 1) + begin;
79 | }
80 |
81 | function cubicEaseInOut(time, begin, change, duration) {
82 | if ((time /= duration / 2) < 1.0)
83 | return change / 2 * time * time * time + begin;
84 | time -= 2.0;
85 | return change / 2 * (time * time * time + 2) + begin;
86 | }
87 |
88 | function elasticBlend(time, change, duration, amplitude, s, f) {
89 | if (change) {
90 | var t = Math.abs(s);
91 | if (amplitude) {
92 | f *= amplitude / Math.abs(change);
93 | }
94 | else {
95 | f = 0;
96 | }
97 |
98 | var td = Math.abs(time * duration);
99 | if (td < t) {
100 | var l = td / t;
101 | f = (f * l) + (1 - l);
102 | }
103 | }
104 |
105 | return f;
106 | }
107 |
108 | function elasticEaseIn(time, begin, change, duration, amplitude, period) {
109 | var s;
110 | var f = 1.0;
111 |
112 | if (time <= 0.0)
113 | return begin;
114 | if ((time /= duration) >= 1.0)
115 | return begin + change;
116 | time -= 1.0;
117 | if (!period)
118 | period = duration * 0.3;
119 | if (!amplitude || amplitude < Math.abs(change)) {
120 | s = period / 4;
121 | f = elasticBlend(time, change, duration, amplitude, s, f);
122 | amplitude = change;
123 | }
124 | else
125 | s = period / (2 * Math.PI) * Math.asin(change / amplitude);
126 |
127 | return (-f * (amplitude * Math.pow(2, 10 * time) * Math.sin((time * duration - s) * (2 * Math.PI) / period))) + begin;
128 | }
129 |
130 | function elasticEaseOut(time, begin, change, duration, amplitude, period) {
131 | var s;
132 | var f = 1;
133 |
134 | if (time <= 0)
135 | return begin;
136 | if ((time /= duration) >= 1.0)
137 | return begin + change;
138 | time = -time;
139 | if (!period)
140 | period = duration * 0.3;
141 | if (!amplitude || amplitude < Math.abs(change)) {
142 | s = period / 4;
143 | f = elasticBlend(time, change, duration, amplitude, s, f);
144 | amplitude = change;
145 | } else
146 | s = period / (2 * Math.PI) * Math.asin(change / amplitude);
147 |
148 | return (f * (amplitude * Math.pow(2, 10 * time) * Math.sin((time * duration - s) * (2 * Math.PI) / period))) + change + begin;
149 | }
150 |
151 | function elasticEaseInOut(time, begin, change, duration, amplitude, period) {
152 | var s;
153 | var f = 1.0;
154 |
155 | if (time <= 0.0)
156 | return begin;
157 | if ((time /= duration / 2) >= 2.0)
158 | return begin + change;
159 | time -= 1.0;
160 | if (!period)
161 | period = duration * (0.3 * 1.5);
162 | if (!amplitude || amplitude < Math.abs(change)) {
163 | s = period / 4;
164 | f = elasticBlend(time, change, duration, amplitude, s, f);
165 | amplitude = change;
166 | }
167 | else
168 | s = period / (2 * Math.PI) * Math.asin(change / amplitude);
169 |
170 | if (time < 0.0) {
171 | f *= -0.5;
172 | return (f * (amplitude * Math.pow(2, 10 * time) * Math.sin((time * duration - s) * (2 * Math.PI) / period))) + begin;
173 | }
174 | else {
175 | time = -time;
176 | f *= 0.5;
177 | return (f * (amplitude * Math.pow(2, 10 * time) * Math.sin((time * duration - s) * (2 * Math.PI) / period))) + change + begin;
178 | }
179 | }
180 |
181 | function exponentialEaseIn(time, begin, change, duration) {
182 | return (time <= 0.0) ? begin : change * Math.pow(2, 10 * (time / duration - 1)) + begin;
183 | }
184 |
185 | function exponentialEaseOut(time, begin, change, duration) {
186 | return (time >= duration) ? begin + change : change * (-Math.pow(2, -10 * time / duration) + 1) + begin;
187 | }
188 |
189 | function exponentialEaseInOut(time, begin, change, duration) {
190 | if (time <= 0.0)
191 | return begin;
192 | if (time >= duration)
193 | return begin + change;
194 | if ((time /= duration / 2) < 1)
195 | return change / 2 * Math.pow(2, 10 * (time - 1)) + begin;
196 | time -= 1.0;
197 | return change / 2 * (-Math.pow(2, -10 * time) + 2) + begin;
198 | }
199 |
200 | function linear(time, begin, change, duration) {
201 | return change * time / duration + begin;
202 | }
203 |
204 | function quadraticEaseIn(time, begin, change, duration) {
205 | time /= duration;
206 | return change * time * time + begin;
207 | }
208 |
209 | function quadraticEaseOut(time, begin, change, duration) {
210 | time /= duration;
211 | return -change * time * (time - 2) + begin;
212 | }
213 |
214 | function quadraticEaseInOut(time, begin, change, duration) {
215 | if ((time /= duration / 2) < 1.0)
216 | return change / 2 * time * time + begin;
217 | time -= 1.0;
218 | return -change / 2 * (time * (time - 2) - 1) + begin;
219 | }
220 |
221 |
222 | function quarticEaseIn(time, begin, change, duration) {
223 | time /= duration;
224 | return change * time * time * time * time + begin;
225 | }
226 |
227 | function quarticEaseOut(time, begin, change, duration) {
228 | time = time / duration - 1;
229 | return -change * (time * time * time * time - 1) + begin;
230 | }
231 |
232 | function quarticEaseInOut(time, begin, change, duration) {
233 | if ((time /= duration / 2) < 1.0)
234 | return change / 2 * time * time * time * time + begin;
235 | time -= 2.0;
236 | return -change / 2 * ( time * time * time * time - 2) + begin;
237 | }
238 |
239 | function quinticEaseIn(time, begin, change, duration) {
240 | time /= duration;
241 | return change * time * time * time * time * time + begin;
242 | }
243 |
244 | function quinticEaseOut(time, begin, change, duration) {
245 | time = time / duration - 1;
246 | return change * (time * time * time * time * time + 1) + begin;
247 | }
248 |
249 | function quinticEaseInOut(time, begin, change, duration) {
250 | if ((time /= duration / 2) < 1.0)
251 | return change / 2 * time * time * time * time * time + begin;
252 | time -= 2.0;
253 | return change / 2 * (time * time * time * time * time + 2) + begin;
254 | }
255 |
256 | function sinusoidalEaseIn(time, begin, change, duration) {
257 | return -change * Math.cos(time / duration * Math.PI / 2) + change + begin;
258 | }
259 |
260 | function sinusoidalEaseOut(time, begin, change, duration) {
261 | return change * Math.sin(time / duration * Math.PI / 2) + begin;
262 | }
263 |
264 | function sinusoidalEaseInOut(time, begin, change, duration) {
265 | return -change / 2 * (Math.cos(Math.PI * time / duration) - 1) + begin;
266 | }
267 |
268 | module.exports.backEaseIn = backEaseIn;
269 | module.exports.backEaseOut = backEaseOut;
270 | module.exports.backEaseInOut = backEaseInOut;
271 | module.exports.bounceEaseOut = bounceEaseOut;
272 | module.exports.bounceEaseIn = bounceEaseIn;
273 | module.exports.bounceEaseInOut = bounceEaseInOut;
274 | module.exports.circularEaseIn = circularEaseIn;
275 | module.exports.circularEaseOut = circularEaseOut;
276 | module.exports.circularEaseInOut = circularEaseInOut;
277 | module.exports.cubicEaseIn = cubicEaseIn;
278 | module.exports.cubicEaseOut = cubicEaseOut;
279 | module.exports.cubicEaseInOut = cubicEaseInOut;
280 | module.exports.elasticEaseIn = elasticEaseIn;
281 | module.exports.elasticEaseOut = elasticEaseOut;
282 | module.exports.elasticEaseInOut = elasticEaseInOut;
283 | module.exports.exponentialEaseIn = exponentialEaseIn;
284 | module.exports.exponentialEaseOut = exponentialEaseOut;
285 | module.exports.exponentialEaseInOut = exponentialEaseInOut;
286 | module.exports.linear = linear;
287 | module.exports.quadraticEaseIn = quadraticEaseIn;
288 | module.exports.quadraticEaseOut = quadraticEaseOut;
289 | module.exports.quadraticEaseInOut = quadraticEaseInOut;
290 | module.exports.quarticEaseIn = quarticEaseIn;
291 | module.exports.quarticEaseOut = quarticEaseOut;
292 | module.exports.quarticEaseInOut = quarticEaseInOut;
293 | module.exports.quinticEaseIn = quinticEaseIn;
294 | module.exports.quinticEaseOut = quinticEaseOut;
295 | module.exports.quinticEaseInOut = quinticEaseInOut;
296 | module.exports.sinusoidalEaseIn = sinusoidalEaseIn;
297 | module.exports.sinusoidalEaseOut = sinusoidalEaseOut;
298 | module.exports.sinusoidalEaseInOut = sinusoidalEaseInOut;
299 |
--------------------------------------------------------------------------------
/js/dist/blender-html5-animations.min.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Blender HTML5 Animations 1.0.2
3 | * Copyright 2016 Jonathan Giroux
4 | * MIT licence
5 | */
6 | !function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e(require("gl-matrix")):"function"==typeof define&&define.amd?define(["gl-matrix"],e):"object"==typeof exports?exports.blenderHTML5Animations=e(require("gl-matrix")):t.blenderHTML5Animations=e(t.window)}(this,function(t){return function(t){function e(r){if(a[r])return a[r].exports;var n=a[r]={exports:{},id:r,loaded:!1};return t[r].call(n.exports,n,n.exports,e),n.loaded=!0,n.exports}var a={};return e.m=t,e.c=a,e.p="",e(0)}([function(t,e,a){"use strict";t.exports.Action=a(1),t.exports.ActionLibrary=a(9),t.exports.FCurve=a(4),t.exports.FCurveArray=a(3),t.exports.Keyframe=a(7),t.exports.Marker=a(8)},function(t,e,a){"use strict";function r(t){function e(t){t&&(a.startTime=Math.min(a.startTime,t.keyframes[0].time),a.endTime=Math.max(a.endTime,t.keyframes[t.keyframes.length-1].time))}var a=this;this.startTime=+(1/0),this.endTime=-(1/0),this.paths={};for(var r in t[0]){var n=new u(t[0][r]);this.paths[r]=n,n.forEach(e)}this.markers=t.length>1?t[1].map(function(t){return new c(t)}):[]}var n=a(2),i=n.glMatrix,s=n.mat4,o=n.vec3,u=a(3),c=a(8);r.RotationMode={QUATERNION:0,EULER_XYZ:1,EULER_YXZ:3,EULER_XZY:2,EULER_ZXY:5,EULER_YZX:4,EULER_ZYX:6,AXIS_ANGLE:-1},r.prototype.forEachMarker=function(t,e,a){return this.markers.forEach(function(r,n){if(r.time>=t&&r.time=c.time)switch(this.extrapolation){case r.Extrapolation.LINEAR:return c.value+(c.rightValue-c.value)*(t-c.time)/(c.rightTime-c.time);default:return c.value}for(;u-e>1;){var l=(e+u)/2|0;this.keyframes[l].time>=t?u=l:e=l}if(a=this.keyframes[e],n(t,a.time))return a.value;if(c=this.keyframes[u],n(t,c.time))return c.value;var f=t-a.time,E=a.value,p=c.time-a.time,I=c.value-a.value;switch(a.interpolation){case o.Interpolation.BACK:switch(a.easing){case o.Easing.IN:return s.backEaseIn(f,E,I,p,a.overshoot);case o.Easing.IN_OUT:return s.backEaseInOut(f,E,I,p,a.overshoot);default:return s.backEaseOut(f,E,I,p,a.overshoot)}break;case o.Interpolation.BEZIER:return i(t,a,c);case o.Interpolation.BOUNCE:switch(a.easing){case o.Easing.IN:return s.bounceEaseIn(f,E,I,p);case o.Easing.IN_OUT:return s.bounceEaseInOut(f,E,I,p);default:return s.bounceEaseOut(f,E,I,p)}break;case o.Interpolation.CIRCULAR:switch(a.easing){case o.Easing.OUT:return s.circularEaseOut(f,E,I,p);case o.Easing.IN_OUT:return s.circularEaseInOut(f,E,I,p);default:return s.circularEaseIn(f,E,I,p)}break;case o.Interpolation.CUBIC:switch(a.easing){case o.Easing.OUT:return s.cubicEaseOut(f,E,I,p);case o.Easing.IN_OUT:return s.cubicEaseInOut(f,E,I,p);default:return s.cubicEaseIn(f,E,I,p)}break;case o.Interpolation.ELASTIC:switch(a.easing){case o.Easing.IN:return s.elasticEaseIn(f,E,I,p);case o.Easing.IN_OUT:return s.elasticEaseInOut(f,E,I,p);default:return s.elasticEaseOut(f,E,I,p,a.amplitude,a.period)}break;case o.Interpolation.EXPONENTIAL:switch(a.easing){case o.Easing.OUT:return s.exponentialEaseOut(f,E,I,p);case o.Keyframe.Easing.IN_OUT:return s.exponentialEaseInOut(f,E,I,p);default:return s.exponentialEaseIn(f,E,I,p)}break;case o.Interpolation.LINEAR:return s.linear(f,E,I,p);case o.Interpolation.QUADRATIC:switch(a.easing){case o.Easing.OUT:return s.quadraticEaseOut(f,E,I,p);case o.Easing.IN_OUT:return s.quadraticEaseInOut(f,E,I,p);default:return s.quadraticEaseIn(f,E,I,p)}break;case o.Interpolation.QUARTIC:switch(a.easing){case o.Easing.OUT:return s.quarticEaseOut(f,E,I,p);case o.Easing.IN_OUT:return s.quarticEaseInOut(f,E,I,p);default:return s.quarticEaseIn(f,E,I,p)}break;case o.Interpolation.QUINTIC:switch(a.easing){case o.Easing.OUT:return s.quinticEaseOut(f,E,I,p);case o.Easing.IN_OUT:return s.quinticEaseInOut(f,E,I,p);default:return s.quinticEaseIn(f,E,I,p)}break;case o.Interpolation.SINUSOIDAL:switch(a.easing){case o.Easing.OUT:return s.sinusoidalEaseOut(f,E,I,p);case o.Easing.IN_OUT:return s.sinusoidalEaseInOut(f,E,I,p);default:return s.sinusoidalEaseIn(f,E,I,p)}break;default:return E}},t.exports=r},function(t,e){"use strict";function a(t,e,a,r,n){var i=1-n;return i*i*i*t+3*i*i*n*e+3*i*n*n*a+n*n*n*r}function r(t,e,r){var n=e.time,i=e.value,s=e.rightTime,o=e.rightValue,u=r.leftTime,c=r.leftValue,l=r.time,f=r.value,E=s-n,p=l-u,I=l-n;if(E+p>I){var h=o-i,O=f-c,m=I/(E+p);s=n+m*E,o=i+m*h,u=l-m*p,c=f-m*O}var x,T,d=0,v=1;do x=(d+v)/2,T=a(n,s,u,l,x),T>t?v=x:d=x;while(Math.abs(T-t)>.01);return a(i,o,c,f,x)}t.exports=r},function(t,e){"use strict";function a(t,e,a,r,n){return t/=r,a*t*t*((n+1)*t-n)+e}function r(t,e,a,r,n){return t=t/r-1,a*(t*t*((n+1)*t+n)+1)+e}function n(t,e,a,r,n){return n*=1.525,(t/=r/2)<1?a/2*(t*t*((n+1)*t-n))+e:(t-=2,a/2*(t*t*((n+1)*t+n)+2)+e)}function i(t,e,a,r){return t/=r,t<1/2.75?a*(7.5625*t*t)+e:t<2/2.75?(t-=1.5/2.75,a*(7.5625*t*t+.75)+e):t<2.5/2.75?(t-=2.25/2.75,a*(7.5625*t*t+.9375)+e):(t-=2.625/2.75,a*(7.5625*t*t+.984375)+e)}function s(t,e,a,r){return a-i(r-t,0,a,r)+e}function o(t,e,a,r){return t=1?e+a:(t-=1,i||(i=.3*r),!n||n=1?e+a:(t=-t,i||(i=.3*r),!n||n=2?e+a:(t-=1,i||(i=r*(.3*1.5)),!n||n=r?e+a:a*(-Math.pow(2,-10*t/r)+1)+e}function d(t,e,a,r){return t<=0?e:t>=r?e+a:(t/=r/2)<1?a/2*Math.pow(2,10*(t-1))+e:(t-=1,a/2*(-Math.pow(2,-10*t)+2)+e)}function v(t,e,a,r){return a*t/r+e}function M(t,e,a,r){return t/=r,a*t*t+e}function N(t,e,a,r){return t/=r,-a*t*(t-2)+e}function b(t,e,a,r){return(t/=r/2)<1?a/2*t*t+e:(t-=1,-a/2*(t*(t-2)-1)+e)}function A(t,e,a,r){return t/=r,a*t*t*t*t+e}function U(t,e,a,r){return t=t/r-1,-a*(t*t*t*t-1)+e}function R(t,e,a,r){return(t/=r/2)<1?a/2*t*t*t*t+e:(t-=2,-a/2*(t*t*t*t-2)+e)}function g(t,e,a,r){return t/=r,a*t*t*t*t*t+e}function _(t,e,a,r){return t=t/r-1,a*(t*t*t*t*t+1)+e}function k(t,e,a,r){return(t/=r/2)<1?a/2*t*t*t*t*t+e:(t-=2,a/2*(t*t*t*t*t+2)+e)}function L(t,e,a,r){return-a*Math.cos(t/r*Math.PI/2)+a+e}function w(t,e,a,r){return a*Math.sin(t/r*Math.PI/2)+e}function C(t,e,a,r){return-a/2*(Math.cos(Math.PI*t/r)-1)+e}t.exports.backEaseIn=a,t.exports.backEaseOut=r,t.exports.backEaseInOut=n,t.exports.bounceEaseOut=i,t.exports.bounceEaseIn=s,t.exports.bounceEaseInOut=o,t.exports.circularEaseIn=u,t.exports.circularEaseOut=c,t.exports.circularEaseInOut=l,t.exports.cubicEaseIn=f,t.exports.cubicEaseOut=E,t.exports.cubicEaseInOut=p,t.exports.elasticEaseIn=h,t.exports.elasticEaseOut=O,t.exports.elasticEaseInOut=m,t.exports.exponentialEaseIn=x,t.exports.exponentialEaseOut=T,t.exports.exponentialEaseInOut=d,t.exports.linear=v,t.exports.quadraticEaseIn=M,t.exports.quadraticEaseOut=N,t.exports.quadraticEaseInOut=b,t.exports.quarticEaseIn=A,t.exports.quarticEaseOut=U,t.exports.quarticEaseInOut=R,t.exports.quinticEaseIn=g,t.exports.quinticEaseOut=_,t.exports.quinticEaseInOut=k,t.exports.sinusoidalEaseIn=L,t.exports.sinusoidalEaseOut=w,t.exports.sinusoidalEaseInOut=C},function(t,e){"use strict";function a(t){this.time=t[0],this.value=t[1],this.leftTime=t[2],this.leftValue=t[3],this.rightTime=t[4],this.rightValue=t[5],this.interpolation=t[6],this.easing=t[7],this.overshoot=t[8],this.amplitude=t[8],this.period=t[9]}a.Easing={AUTO:0,IN:1,OUT:2,IN_OUT:3},a.Interpolation={CONSTANT:0,LINEAR:1,BEZIER:2,BACK:3,BOUNCE:4,CIRCULAR:5,CUBIC:6,ELASTIC:7,EXPONENTIAL:8,QUADRATIC:9,QUARTIC:10,QUINTIC:11,SINUSOIDAL:12},t.exports=a},function(t,e){"use strict";function a(t){this.time=t[0],this.name=t[1]}t.exports=a},function(t,e,a){"use strict";function r(t){for(var e in t)this[e]=new n(t[e])}var n=a(1);t.exports=r}])});
--------------------------------------------------------------------------------
/js/docs/scripts/prettify/Apache-License-2.0.txt:
--------------------------------------------------------------------------------
1 |
2 | Apache License
3 | Version 2.0, January 2004
4 | http://www.apache.org/licenses/
5 |
6 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
7 |
8 | 1. Definitions.
9 |
10 | "License" shall mean the terms and conditions for use, reproduction,
11 | and distribution as defined by Sections 1 through 9 of this document.
12 |
13 | "Licensor" shall mean the copyright owner or entity authorized by
14 | the copyright owner that is granting the License.
15 |
16 | "Legal Entity" shall mean the union of the acting entity and all
17 | other entities that control, are controlled by, or are under common
18 | control with that entity. For the purposes of this definition,
19 | "control" means (i) the power, direct or indirect, to cause the
20 | direction or management of such entity, whether by contract or
21 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
22 | outstanding shares, or (iii) beneficial ownership of such entity.
23 |
24 | "You" (or "Your") shall mean an individual or Legal Entity
25 | exercising permissions granted by this License.
26 |
27 | "Source" form shall mean the preferred form for making modifications,
28 | including but not limited to software source code, documentation
29 | source, and configuration files.
30 |
31 | "Object" form shall mean any form resulting from mechanical
32 | transformation or translation of a Source form, including but
33 | not limited to compiled object code, generated documentation,
34 | and conversions to other media types.
35 |
36 | "Work" shall mean the work of authorship, whether in Source or
37 | Object form, made available under the License, as indicated by a
38 | copyright notice that is included in or attached to the work
39 | (an example is provided in the Appendix below).
40 |
41 | "Derivative Works" shall mean any work, whether in Source or Object
42 | form, that is based on (or derived from) the Work and for which the
43 | editorial revisions, annotations, elaborations, or other modifications
44 | represent, as a whole, an original work of authorship. For the purposes
45 | of this License, Derivative Works shall not include works that remain
46 | separable from, or merely link (or bind by name) to the interfaces of,
47 | the Work and Derivative Works thereof.
48 |
49 | "Contribution" shall mean any work of authorship, including
50 | the original version of the Work and any modifications or additions
51 | to that Work or Derivative Works thereof, that is intentionally
52 | submitted to Licensor for inclusion in the Work by the copyright owner
53 | or by an individual or Legal Entity authorized to submit on behalf of
54 | the copyright owner. For the purposes of this definition, "submitted"
55 | means any form of electronic, verbal, or written communication sent
56 | to the Licensor or its representatives, including but not limited to
57 | communication on electronic mailing lists, source code control systems,
58 | and issue tracking systems that are managed by, or on behalf of, the
59 | Licensor for the purpose of discussing and improving the Work, but
60 | excluding communication that is conspicuously marked or otherwise
61 | designated in writing by the copyright owner as "Not a Contribution."
62 |
63 | "Contributor" shall mean Licensor and any individual or Legal Entity
64 | on behalf of whom a Contribution has been received by Licensor and
65 | subsequently incorporated within the Work.
66 |
67 | 2. Grant of Copyright License. Subject to the terms and conditions of
68 | this License, each Contributor hereby grants to You a perpetual,
69 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
70 | copyright license to reproduce, prepare Derivative Works of,
71 | publicly display, publicly perform, sublicense, and distribute the
72 | Work and such Derivative Works in Source or Object form.
73 |
74 | 3. Grant of Patent License. Subject to the terms and conditions of
75 | this License, each Contributor hereby grants to You a perpetual,
76 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
77 | (except as stated in this section) patent license to make, have made,
78 | use, offer to sell, sell, import, and otherwise transfer the Work,
79 | where such license applies only to those patent claims licensable
80 | by such Contributor that are necessarily infringed by their
81 | Contribution(s) alone or by combination of their Contribution(s)
82 | with the Work to which such Contribution(s) was submitted. If You
83 | institute patent litigation against any entity (including a
84 | cross-claim or counterclaim in a lawsuit) alleging that the Work
85 | or a Contribution incorporated within the Work constitutes direct
86 | or contributory patent infringement, then any patent licenses
87 | granted to You under this License for that Work shall terminate
88 | as of the date such litigation is filed.
89 |
90 | 4. Redistribution. You may reproduce and distribute copies of the
91 | Work or Derivative Works thereof in any medium, with or without
92 | modifications, and in Source or Object form, provided that You
93 | meet the following conditions:
94 |
95 | (a) You must give any other recipients of the Work or
96 | Derivative Works a copy of this License; and
97 |
98 | (b) You must cause any modified files to carry prominent notices
99 | stating that You changed the files; and
100 |
101 | (c) You must retain, in the Source form of any Derivative Works
102 | that You distribute, all copyright, patent, trademark, and
103 | attribution notices from the Source form of the Work,
104 | excluding those notices that do not pertain to any part of
105 | the Derivative Works; and
106 |
107 | (d) If the Work includes a "NOTICE" text file as part of its
108 | distribution, then any Derivative Works that You distribute must
109 | include a readable copy of the attribution notices contained
110 | within such NOTICE file, excluding those notices that do not
111 | pertain to any part of the Derivative Works, in at least one
112 | of the following places: within a NOTICE text file distributed
113 | as part of the Derivative Works; within the Source form or
114 | documentation, if provided along with the Derivative Works; or,
115 | within a display generated by the Derivative Works, if and
116 | wherever such third-party notices normally appear. The contents
117 | of the NOTICE file are for informational purposes only and
118 | do not modify the License. You may add Your own attribution
119 | notices within Derivative Works that You distribute, alongside
120 | or as an addendum to the NOTICE text from the Work, provided
121 | that such additional attribution notices cannot be construed
122 | as modifying the License.
123 |
124 | You may add Your own copyright statement to Your modifications and
125 | may provide additional or different license terms and conditions
126 | for use, reproduction, or distribution of Your modifications, or
127 | for any such Derivative Works as a whole, provided Your use,
128 | reproduction, and distribution of the Work otherwise complies with
129 | the conditions stated in this License.
130 |
131 | 5. Submission of Contributions. Unless You explicitly state otherwise,
132 | any Contribution intentionally submitted for inclusion in the Work
133 | by You to the Licensor shall be under the terms and conditions of
134 | this License, without any additional terms or conditions.
135 | Notwithstanding the above, nothing herein shall supersede or modify
136 | the terms of any separate license agreement you may have executed
137 | with Licensor regarding such Contributions.
138 |
139 | 6. Trademarks. This License does not grant permission to use the trade
140 | names, trademarks, service marks, or product names of the Licensor,
141 | except as required for reasonable and customary use in describing the
142 | origin of the Work and reproducing the content of the NOTICE file.
143 |
144 | 7. Disclaimer of Warranty. Unless required by applicable law or
145 | agreed to in writing, Licensor provides the Work (and each
146 | Contributor provides its Contributions) on an "AS IS" BASIS,
147 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
148 | implied, including, without limitation, any warranties or conditions
149 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
150 | PARTICULAR PURPOSE. You are solely responsible for determining the
151 | appropriateness of using or redistributing the Work and assume any
152 | risks associated with Your exercise of permissions under this License.
153 |
154 | 8. Limitation of Liability. In no event and under no legal theory,
155 | whether in tort (including negligence), contract, or otherwise,
156 | unless required by applicable law (such as deliberate and grossly
157 | negligent acts) or agreed to in writing, shall any Contributor be
158 | liable to You for damages, including any direct, indirect, special,
159 | incidental, or consequential damages of any character arising as a
160 | result of this License or out of the use or inability to use the
161 | Work (including but not limited to damages for loss of goodwill,
162 | work stoppage, computer failure or malfunction, or any and all
163 | other commercial damages or losses), even if such Contributor
164 | has been advised of the possibility of such damages.
165 |
166 | 9. Accepting Warranty or Additional Liability. While redistributing
167 | the Work or Derivative Works thereof, You may choose to offer,
168 | and charge a fee for, acceptance of support, warranty, indemnity,
169 | or other liability obligations and/or rights consistent with this
170 | License. However, in accepting such obligations, You may act only
171 | on Your own behalf and on Your sole responsibility, not on behalf
172 | of any other Contributor, and only if You agree to indemnify,
173 | defend, and hold each Contributor harmless for any liability
174 | incurred by, or claims asserted against, such Contributor by reason
175 | of your accepting any such warranty or additional liability.
176 |
177 | END OF TERMS AND CONDITIONS
178 |
179 | APPENDIX: How to apply the Apache License to your work.
180 |
181 | To apply the Apache License to your work, attach the following
182 | boilerplate notice, with the fields enclosed by brackets "[]"
183 | replaced with your own identifying information. (Don't include
184 | the brackets!) The text should be enclosed in the appropriate
185 | comment syntax for the file format. We also recommend that a
186 | file or class name and description of purpose be included on the
187 | same "printed page" as the copyright notice for easier
188 | identification within third-party archives.
189 |
190 | Copyright [yyyy] [name of copyright owner]
191 |
192 | Licensed under the Apache License, Version 2.0 (the "License");
193 | you may not use this file except in compliance with the License.
194 | You may obtain a copy of the License at
195 |
196 | http://www.apache.org/licenses/LICENSE-2.0
197 |
198 | Unless required by applicable law or agreed to in writing, software
199 | distributed under the License is distributed on an "AS IS" BASIS,
200 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
201 | See the License for the specific language governing permissions and
202 | limitations under the License.
203 |
--------------------------------------------------------------------------------
/js/docs/FCurve.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | JSDoc: Class: FCurve
6 |
7 |
8 |
9 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |