tela.js 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/.eslintrc.yml +8 -0
  2. package/LICENSE +201 -0
  3. package/README.md +54 -0
  4. package/assets/bunny.obj +7474 -0
  5. package/assets/expand.svg +1 -0
  6. package/assets/great.jpg +0 -0
  7. package/assets/kakashi.jpg +0 -0
  8. package/assets/spot.obj +11999 -0
  9. package/assets/spot.png +0 -0
  10. package/assets/torus.obj +3137 -0
  11. package/assets/x.svg +1 -0
  12. package/bun.lockb +0 -0
  13. package/bundle.js +39 -0
  14. package/dist/node/index.js +37048 -0
  15. package/dist/web/index.js +1511 -0
  16. package/index.css +129 -0
  17. package/index.html +19 -0
  18. package/index.js +534 -0
  19. package/package.json +40 -0
  20. package/src/Animation/Animation.js +61 -0
  21. package/src/Box/Box.js +105 -0
  22. package/src/Camera/Camera.js +133 -0
  23. package/src/Canvas/Canvas.js +203 -0
  24. package/src/Canvas/README.md +83 -0
  25. package/src/Color/Color.js +77 -0
  26. package/src/DomBuilder/DomBuilder.js +126 -0
  27. package/src/IO/IO.js +120 -0
  28. package/src/Image/Image.js +138 -0
  29. package/src/Image/README.md +33 -0
  30. package/src/Monads/Monads.js +28 -0
  31. package/src/Ray/Ray.js +7 -0
  32. package/src/Scene/Mesh.js +103 -0
  33. package/src/Scene/NaiveScene.js +77 -0
  34. package/src/Scene/Point.js +109 -0
  35. package/src/Scene/PointCloud.js +51 -0
  36. package/src/Scene/Scene.js +200 -0
  37. package/src/Stream/Stream.js +10 -0
  38. package/src/Utils/Constants.js +1 -0
  39. package/src/Utils/Math.js +65 -0
  40. package/src/Utils/Utils.js +39 -0
  41. package/src/Vector/Vector.js +495 -0
  42. package/src/index.js +32 -0
  43. package/src/index.node.js +5 -0
  44. package/test/node/amazing_shader.js +56 -0
  45. package/test/node/bunny.js +55 -0
  46. package/test/node/bunny_parallel.js +102 -0
  47. package/test/node/image2rgb.js +57 -0
  48. package/test/node/image_test.js +38 -0
  49. package/test/node/lorentz.js +0 -0
  50. package/test/web/amazing_shader.js +60 -0
  51. package/test/web/amazing_shader_2.js +54 -0
  52. package/test/web/bunny.js +72 -0
  53. package/test/web/image2rgb.js +77 -0
  54. package/test/web/interactive_wave.js +108 -0
  55. package/test/web/lorenz.js +60 -0
  56. package/test/web/mandelbrot.js +59 -0
  57. package/test/web/rotating_grid.js +62 -0
  58. package/test/web/signed_bunny.js +139 -0
  59. package/test/web/signed_distance.js +95 -0
  60. package/test/web/simple_animation.js +39 -0
  61. package/test/web/simple_shader.js +14 -0
  62. package/test/web/six_spheres.js +102 -0
  63. package/test/web/wave_equation.js +93 -0
  64. package/vs-monaco/package/LICENSE +21 -0
  65. package/vs-monaco/package/ThirdPartyNotices.txt +448 -0
  66. package/vs-monaco/package/min/vs/base/browser/ui/codicons/codicon/codicon.ttf +0 -0
  67. package/vs-monaco/package/min/vs/base/common/worker/simpleWorker.nls.de.js +8 -0
  68. package/vs-monaco/package/min/vs/base/common/worker/simpleWorker.nls.es.js +8 -0
  69. package/vs-monaco/package/min/vs/base/common/worker/simpleWorker.nls.fr.js +8 -0
  70. package/vs-monaco/package/min/vs/base/common/worker/simpleWorker.nls.it.js +8 -0
  71. package/vs-monaco/package/min/vs/base/common/worker/simpleWorker.nls.ja.js +8 -0
  72. package/vs-monaco/package/min/vs/base/common/worker/simpleWorker.nls.js +8 -0
  73. package/vs-monaco/package/min/vs/base/common/worker/simpleWorker.nls.ko.js +8 -0
  74. package/vs-monaco/package/min/vs/base/common/worker/simpleWorker.nls.ru.js +8 -0
  75. package/vs-monaco/package/min/vs/base/common/worker/simpleWorker.nls.zh-cn.js +8 -0
  76. package/vs-monaco/package/min/vs/base/common/worker/simpleWorker.nls.zh-tw.js +8 -0
  77. package/vs-monaco/package/min/vs/base/worker/workerMain.js +27 -0
  78. package/vs-monaco/package/min/vs/basic-languages/abap/abap.js +10 -0
  79. package/vs-monaco/package/min/vs/basic-languages/apex/apex.js +10 -0
  80. package/vs-monaco/package/min/vs/basic-languages/azcli/azcli.js +10 -0
  81. package/vs-monaco/package/min/vs/basic-languages/bat/bat.js +10 -0
  82. package/vs-monaco/package/min/vs/basic-languages/bicep/bicep.js +11 -0
  83. package/vs-monaco/package/min/vs/basic-languages/cameligo/cameligo.js +10 -0
  84. package/vs-monaco/package/min/vs/basic-languages/clojure/clojure.js +10 -0
  85. package/vs-monaco/package/min/vs/basic-languages/coffee/coffee.js +10 -0
  86. package/vs-monaco/package/min/vs/basic-languages/cpp/cpp.js +10 -0
  87. package/vs-monaco/package/min/vs/basic-languages/csharp/csharp.js +10 -0
  88. package/vs-monaco/package/min/vs/basic-languages/csp/csp.js +10 -0
  89. package/vs-monaco/package/min/vs/basic-languages/css/css.js +12 -0
  90. package/vs-monaco/package/min/vs/basic-languages/cypher/cypher.js +10 -0
  91. package/vs-monaco/package/min/vs/basic-languages/dart/dart.js +10 -0
  92. package/vs-monaco/package/min/vs/basic-languages/dockerfile/dockerfile.js +10 -0
  93. package/vs-monaco/package/min/vs/basic-languages/ecl/ecl.js +10 -0
  94. package/vs-monaco/package/min/vs/basic-languages/elixir/elixir.js +10 -0
  95. package/vs-monaco/package/min/vs/basic-languages/flow9/flow9.js +10 -0
  96. package/vs-monaco/package/min/vs/basic-languages/freemarker2/freemarker2.js +12 -0
  97. package/vs-monaco/package/min/vs/basic-languages/fsharp/fsharp.js +10 -0
  98. package/vs-monaco/package/min/vs/basic-languages/go/go.js +10 -0
  99. package/vs-monaco/package/min/vs/basic-languages/graphql/graphql.js +10 -0
  100. package/vs-monaco/package/min/vs/basic-languages/handlebars/handlebars.js +10 -0
  101. package/vs-monaco/package/min/vs/basic-languages/hcl/hcl.js +10 -0
  102. package/vs-monaco/package/min/vs/basic-languages/html/html.js +10 -0
  103. package/vs-monaco/package/min/vs/basic-languages/ini/ini.js +10 -0
  104. package/vs-monaco/package/min/vs/basic-languages/java/java.js +10 -0
  105. package/vs-monaco/package/min/vs/basic-languages/javascript/javascript.js +10 -0
  106. package/vs-monaco/package/min/vs/basic-languages/julia/julia.js +10 -0
  107. package/vs-monaco/package/min/vs/basic-languages/kotlin/kotlin.js +10 -0
  108. package/vs-monaco/package/min/vs/basic-languages/less/less.js +11 -0
  109. package/vs-monaco/package/min/vs/basic-languages/lexon/lexon.js +10 -0
  110. package/vs-monaco/package/min/vs/basic-languages/liquid/liquid.js +10 -0
  111. package/vs-monaco/package/min/vs/basic-languages/lua/lua.js +10 -0
  112. package/vs-monaco/package/min/vs/basic-languages/m3/m3.js +10 -0
  113. package/vs-monaco/package/min/vs/basic-languages/markdown/markdown.js +10 -0
  114. package/vs-monaco/package/min/vs/basic-languages/mdx/mdx.js +10 -0
  115. package/vs-monaco/package/min/vs/basic-languages/mips/mips.js +10 -0
  116. package/vs-monaco/package/min/vs/basic-languages/msdax/msdax.js +10 -0
  117. package/vs-monaco/package/min/vs/basic-languages/mysql/mysql.js +10 -0
  118. package/vs-monaco/package/min/vs/basic-languages/objective-c/objective-c.js +10 -0
  119. package/vs-monaco/package/min/vs/basic-languages/pascal/pascal.js +10 -0
  120. package/vs-monaco/package/min/vs/basic-languages/pascaligo/pascaligo.js +10 -0
  121. package/vs-monaco/package/min/vs/basic-languages/perl/perl.js +10 -0
  122. package/vs-monaco/package/min/vs/basic-languages/pgsql/pgsql.js +10 -0
  123. package/vs-monaco/package/min/vs/basic-languages/php/php.js +10 -0
  124. package/vs-monaco/package/min/vs/basic-languages/pla/pla.js +10 -0
  125. package/vs-monaco/package/min/vs/basic-languages/postiats/postiats.js +10 -0
  126. package/vs-monaco/package/min/vs/basic-languages/powerquery/powerquery.js +10 -0
  127. package/vs-monaco/package/min/vs/basic-languages/powershell/powershell.js +10 -0
  128. package/vs-monaco/package/min/vs/basic-languages/protobuf/protobuf.js +11 -0
  129. package/vs-monaco/package/min/vs/basic-languages/pug/pug.js +10 -0
  130. package/vs-monaco/package/min/vs/basic-languages/python/python.js +10 -0
  131. package/vs-monaco/package/min/vs/basic-languages/qsharp/qsharp.js +10 -0
  132. package/vs-monaco/package/min/vs/basic-languages/r/r.js +10 -0
  133. package/vs-monaco/package/min/vs/basic-languages/razor/razor.js +10 -0
  134. package/vs-monaco/package/min/vs/basic-languages/redis/redis.js +10 -0
  135. package/vs-monaco/package/min/vs/basic-languages/redshift/redshift.js +10 -0
  136. package/vs-monaco/package/min/vs/basic-languages/restructuredtext/restructuredtext.js +10 -0
  137. package/vs-monaco/package/min/vs/basic-languages/ruby/ruby.js +10 -0
  138. package/vs-monaco/package/min/vs/basic-languages/rust/rust.js +10 -0
  139. package/vs-monaco/package/min/vs/basic-languages/sb/sb.js +10 -0
  140. package/vs-monaco/package/min/vs/basic-languages/scala/scala.js +10 -0
  141. package/vs-monaco/package/min/vs/basic-languages/scheme/scheme.js +10 -0
  142. package/vs-monaco/package/min/vs/basic-languages/scss/scss.js +12 -0
  143. package/vs-monaco/package/min/vs/basic-languages/shell/shell.js +10 -0
  144. package/vs-monaco/package/min/vs/basic-languages/solidity/solidity.js +10 -0
  145. package/vs-monaco/package/min/vs/basic-languages/sophia/sophia.js +10 -0
  146. package/vs-monaco/package/min/vs/basic-languages/sparql/sparql.js +10 -0
  147. package/vs-monaco/package/min/vs/basic-languages/sql/sql.js +10 -0
  148. package/vs-monaco/package/min/vs/basic-languages/st/st.js +10 -0
  149. package/vs-monaco/package/min/vs/basic-languages/swift/swift.js +13 -0
  150. package/vs-monaco/package/min/vs/basic-languages/systemverilog/systemverilog.js +10 -0
  151. package/vs-monaco/package/min/vs/basic-languages/tcl/tcl.js +10 -0
  152. package/vs-monaco/package/min/vs/basic-languages/twig/twig.js +10 -0
  153. package/vs-monaco/package/min/vs/basic-languages/typescript/typescript.js +10 -0
  154. package/vs-monaco/package/min/vs/basic-languages/vb/vb.js +10 -0
  155. package/vs-monaco/package/min/vs/basic-languages/wgsl/wgsl.js +307 -0
  156. package/vs-monaco/package/min/vs/basic-languages/xml/xml.js +10 -0
  157. package/vs-monaco/package/min/vs/basic-languages/yaml/yaml.js +10 -0
  158. package/vs-monaco/package/min/vs/editor/editor.main.css +6 -0
  159. package/vs-monaco/package/min/vs/editor/editor.main.js +745 -0
  160. package/vs-monaco/package/min/vs/editor/editor.main.nls.de.js +31 -0
  161. package/vs-monaco/package/min/vs/editor/editor.main.nls.es.js +31 -0
  162. package/vs-monaco/package/min/vs/editor/editor.main.nls.fr.js +29 -0
  163. package/vs-monaco/package/min/vs/editor/editor.main.nls.it.js +29 -0
  164. package/vs-monaco/package/min/vs/editor/editor.main.nls.ja.js +31 -0
  165. package/vs-monaco/package/min/vs/editor/editor.main.nls.js +29 -0
  166. package/vs-monaco/package/min/vs/editor/editor.main.nls.ko.js +29 -0
  167. package/vs-monaco/package/min/vs/editor/editor.main.nls.ru.js +31 -0
  168. package/vs-monaco/package/min/vs/editor/editor.main.nls.zh-cn.js +31 -0
  169. package/vs-monaco/package/min/vs/editor/editor.main.nls.zh-tw.js +29 -0
  170. package/vs-monaco/package/min/vs/language/css/cssMode.js +13 -0
  171. package/vs-monaco/package/min/vs/language/css/cssWorker.js +81 -0
  172. package/vs-monaco/package/min/vs/language/html/htmlMode.js +13 -0
  173. package/vs-monaco/package/min/vs/language/html/htmlWorker.js +453 -0
  174. package/vs-monaco/package/min/vs/language/json/jsonMode.js +15 -0
  175. package/vs-monaco/package/min/vs/language/json/jsonWorker.js +36 -0
  176. package/vs-monaco/package/min/vs/language/typescript/tsMode.js +20 -0
  177. package/vs-monaco/package/min/vs/language/typescript/tsWorker.js +37016 -0
  178. package/vs-monaco/package/min/vs/loader.js +11 -0
@@ -0,0 +1,495 @@
1
+ //========================================================================================
2
+ /* *
3
+ * UTILS *
4
+ * */
5
+ //========================================================================================
6
+
7
+ const ARRAY_TYPES = {
8
+ Float32Array: Float32Array,
9
+ Float64Array: Float64Array,
10
+ };
11
+ //stateful function
12
+ function _sanitize_input(arrayIn, arrayOut) {
13
+ for (let i = 0; i < arrayIn.length; i++) {
14
+ const z = arrayIn[i];
15
+ const zIsNumber = z !== null && z !== undefined && typeof z === "number";
16
+ arrayOut[i] = zIsNumber ? z : 0;
17
+ }
18
+ return arrayOut;
19
+ }
20
+
21
+ function sameSizeOrError(a, b) {
22
+ if (a.n === b.n) {
23
+ return true;
24
+ }
25
+ throw new VectorException("Vector must have same size");
26
+ }
27
+
28
+ //========================================================================================
29
+ /* *
30
+ * VECTOR *
31
+ * */
32
+ //========================================================================================
33
+
34
+ /** Dense Vector data structure
35
+ *
36
+ * Immutable class, not managing exceptions
37
+ * For is faster than reduce, forEach, maps, perf here: https://replit.com/@pedroth/forVsForEach#index.js
38
+ * Didn't use private vars because of performance
39
+ */
40
+ export default class Vec {
41
+ constructor(array) {
42
+ this._vec = array;
43
+ this._n = this._vec.length;
44
+ }
45
+
46
+ get n() {
47
+ return this._n;
48
+ }
49
+
50
+ get dim() {
51
+ return this._n;
52
+ }
53
+
54
+ size = () => this._n;
55
+ shape = () => [this._n];
56
+
57
+ clone() {
58
+ return new Vec(COPY_VEC(this._vec));
59
+ }
60
+
61
+ /**index starts at zero */
62
+ get(i) {
63
+ return this._vec[i];
64
+ }
65
+
66
+ toArray() {
67
+ return COPY_VEC(this._vec);
68
+ }
69
+
70
+ toString() {
71
+ return "[" + this._vec.join(", ") + "]";
72
+ }
73
+
74
+ serialize() {
75
+ return this._vec.join(", ");
76
+ }
77
+
78
+ add(u) {
79
+ return this.op(u, (a, b) => a + b);
80
+ }
81
+
82
+ sub(u) {
83
+ return this.op(u, (a, b) => a - b);
84
+ }
85
+
86
+ mul(u) {
87
+ return this.op(u, (a, b) => a * b);
88
+ }
89
+
90
+ div(u) {
91
+ return this.op(u, (a, b) => a / b);
92
+ }
93
+
94
+ dot(u) {
95
+ // didn't use reduce because this is faster
96
+ let acc = 0;
97
+ for (let i = 0; i < this._n; i++) {
98
+ acc += this._vec[i] * u._vec[i];
99
+ }
100
+ return acc;
101
+ }
102
+
103
+ squareLength() {
104
+ return this.dot(this);
105
+ }
106
+
107
+ length() {
108
+ return Math.sqrt(this.dot(this));
109
+ }
110
+
111
+ normalize() {
112
+ return this.scale(1 / this.length());
113
+ }
114
+
115
+ scale(r) {
116
+ return this.map((z) => z * r);
117
+ }
118
+
119
+ map(lambda) {
120
+ const ans = BUILD_VEC(this._n);
121
+ for (let i = 0; i < this._n; i++) {
122
+ ans[i] = lambda(this._vec[i], i);
123
+ }
124
+ return new Vec(ans);
125
+ }
126
+
127
+ /**
128
+ *
129
+ * @param {*} u: Vec
130
+ * @param {*} operation: (a,b) => op(a,b)
131
+ */
132
+ op(u, operation) {
133
+ sameSizeOrError(this, u);
134
+ const ans = BUILD_VEC(this._n);
135
+ for (let i = 0; i < this._n; i++) {
136
+ ans[i] = operation(this._vec[i], u._vec[i]);
137
+ }
138
+ return new Vec(ans);
139
+ }
140
+
141
+ reduce(fold, init = 0) {
142
+ let acc = init;
143
+ for (let i = 0; i < this._n; i++) {
144
+ acc = fold(acc, this._vec[i], i);
145
+ }
146
+ return acc;
147
+ }
148
+
149
+ fold = this.reduce;
150
+ foldLeft = this.fold;
151
+
152
+ equals(u, precision = 1e-5) {
153
+ if (!(u instanceof Vec)) return false;
154
+ return this.sub(u).length() < precision;
155
+ }
156
+
157
+ take(n = 0, m = this._vec.length) {
158
+ return new Vec(this._vec.slice(n, m));
159
+ }
160
+
161
+ findIndex(predicate) {
162
+ for (let i = 0; i < this._n; i++) {
163
+ if (predicate(this._vec[i])) return i;
164
+ }
165
+ return -1;
166
+ }
167
+
168
+ static fromArray(array) {
169
+ if (array.length === 2) return Vector2.fromArray(array);
170
+ if (array.length === 3) return Vector3.fromArray(array);
171
+ return new Vec(_sanitize_input(array, BUILD_VEC(array.length)));
172
+ }
173
+
174
+ static of(...values) {
175
+ if (values.length === 2) return Vector2.of(...values);
176
+ if (values.length === 3) return Vector3.of(...values);
177
+ return new Vec(_sanitize_input(values, BUILD_VEC(values.length)));
178
+ }
179
+
180
+ static ZERO = (n) =>
181
+ n === 3 ? new Vector3() : n === 2 ? new Vector2() : new Vec(BUILD_VEC(n));
182
+
183
+ static ONES = (n) => {
184
+ if (n === 2) return Vector2.ONES;
185
+ if (n === 3) return Vector3.ONES;
186
+ return Vec.ZERO(n).map(() => 1);
187
+ };
188
+
189
+ static e = (n) => (i) => {
190
+ if (n === 2) return Vector2.e(i);
191
+ if (n === 3) return Vector3.e(i);
192
+ const vec = BUILD_VEC(n);
193
+ if (i >= 0 && i < n) {
194
+ vec[i] = 1;
195
+ }
196
+ return new Vec(vec);
197
+ };
198
+
199
+ static RANDOM = (n) => {
200
+ if (n === 2) return Vector2.RANDOM();
201
+ if (n === 3) return Vector3.RANDOM();
202
+ const v = BUILD_VEC(n);
203
+ for (let i = 0; i < n; i++) {
204
+ v[i] = Math.random();
205
+ }
206
+ return new Vec(v);
207
+ };
208
+ }
209
+
210
+ export const BUILD_VEC = (n) => new ARRAY_TYPES.Float64Array(n);
211
+ export const COPY_VEC = (array) => ARRAY_TYPES.Float64Array.from(array);
212
+ export class VectorException extends Error { }
213
+
214
+ export const Vec3 = (x = 0, y = 0, z = 0) => new Vector3(x, y, z);
215
+ export const Vec2 = (x = 0, y = 0) => new Vector2(x, y);
216
+
217
+ class Vector3 {
218
+ constructor(x = 0, y = 0, z = 0) {
219
+ this.x = x;
220
+ this.y = y;
221
+ this.z = z;
222
+
223
+ }
224
+
225
+ get n() {
226
+ return 3;
227
+ }
228
+
229
+ get dim() {
230
+ return 3;
231
+ }
232
+
233
+ size = () => 3;
234
+ shape = () => [3];
235
+
236
+ clone() {
237
+ return new Vector3(this.x, this.y, this.z);
238
+ }
239
+
240
+ /**index starts at zero */
241
+ get(i) {
242
+ return [this.x, this.y, this.z][i]
243
+ }
244
+
245
+ toArray() {
246
+ return [this.x, this.y, this.z];
247
+ }
248
+
249
+ toString() {
250
+ return "[" + this.toArray().join(", ") + "]";
251
+ }
252
+
253
+ serialize() {
254
+ return this.toArray().join(", ");
255
+ }
256
+
257
+ add(u) {
258
+ return this.op(u, (a, b) => a + b);
259
+ }
260
+
261
+ sub(u) {
262
+ return this.op(u, (a, b) => a - b);
263
+ }
264
+
265
+ mul(u) {
266
+ return this.op(u, (a, b) => a * b);
267
+ }
268
+
269
+ div(u) {
270
+ return this.op(u, (a, b) => a / b);
271
+ }
272
+
273
+ dot(u) {
274
+ return this.x * u.x + this.y * u.y + this.z * u.z;
275
+ }
276
+
277
+ squareLength() {
278
+ return this.dot(this);
279
+ }
280
+
281
+ length() {
282
+ return Math.sqrt(this.dot(this));
283
+ }
284
+
285
+ normalize() {
286
+ return this.scale(1 / this.length());
287
+ }
288
+
289
+ scale(r) {
290
+ return this.map((z) => z * r);
291
+ }
292
+
293
+ map(lambda) {
294
+ return new Vector3(lambda(this.x, 0), lambda(this.y, 1), lambda(this.z, 2));
295
+ }
296
+
297
+ /**
298
+ *
299
+ * @param {*} y: Vec
300
+ * @param {*} operation: (a,b) => op(a,b)
301
+ */
302
+ op(u, operation) {
303
+ return new Vector3(
304
+ operation(this.x, u.x),
305
+ operation(this.y, u.y),
306
+ operation(this.z, u.z)
307
+ );
308
+ }
309
+
310
+ reduce(fold, init = 0) {
311
+ let acc = init;
312
+ acc = fold(acc, this.x);
313
+ acc = fold(acc, this.y);
314
+ acc = fold(acc, this.z);
315
+ return acc;
316
+ }
317
+
318
+ fold = this.reduce;
319
+ foldLeft = this.fold;
320
+
321
+ equals(u, precision = 1e-5) {
322
+ if (!(u instanceof Vector3)) return false;
323
+ return this.sub(u).length() < precision;
324
+ }
325
+
326
+ take(n = 0, m = 3) {
327
+ const array = [this.x, this.y, this.z].slice(n, m);
328
+ if (array.length === 2) return Vector2.fromArray(array);
329
+ if (array.length === 3) return Vector3.fromArray(array);
330
+ return Vec.fromArray(array);
331
+ }
332
+
333
+ findIndex(predicate) {
334
+ if (predicate(this.x)) return 0;
335
+ if (predicate(this.y)) return 1;
336
+ if (predicate(this.z)) return 2;
337
+ return -1;
338
+ }
339
+
340
+ static fromArray(array) {
341
+ return new Vector3(...array);
342
+ }
343
+
344
+ static of(...values) {
345
+ return new Vector3(...values);
346
+ }
347
+
348
+ static e = (i) => {
349
+ if (i === 0) return new Vector3(1, 0, 0);
350
+ if (i === 1) return new Vector3(0, 1, 0);
351
+ if (i === 2) return new Vector3(0, 0, 1);
352
+ return new Vec3();
353
+ };
354
+
355
+ static RANDOM = () => {
356
+ return new Vector3(Math.random(), Math.random(), Math.random());
357
+ };
358
+
359
+ static ONES = new Vector3(1, 1, 1);
360
+ }
361
+
362
+ class Vector2 {
363
+ constructor(x = 0, y = 0) {
364
+ this.x = x;
365
+ this.y = y;
366
+ }
367
+
368
+ get n() {
369
+ return 2;
370
+ }
371
+
372
+ get dim() {
373
+ return 2;
374
+ }
375
+
376
+ size = () => 2;
377
+ shape = () => [2];
378
+
379
+ clone() {
380
+ return new Vector2(this.x, this.y);
381
+ }
382
+
383
+ /**index starts at zero */
384
+ get(i) {
385
+ return [this.x, this.y][i]
386
+ }
387
+
388
+ toArray() {
389
+ return [this.x, this.y];
390
+ }
391
+
392
+ toString() {
393
+ return "[" + this.toArray().join(", ") + "]";
394
+ }
395
+
396
+ serialize() {
397
+ return this.toArray().join(", ");
398
+ }
399
+
400
+ add(u) {
401
+ return this.op(u, (a, b) => a + b);
402
+ }
403
+
404
+ sub(u) {
405
+ return this.op(u, (a, b) => a - b);
406
+ }
407
+
408
+ mul(u) {
409
+ return this.op(u, (a, b) => a * b);
410
+ }
411
+
412
+ div(u) {
413
+ return this.op(u, (a, b) => a / b);
414
+ }
415
+
416
+ dot(u) {
417
+ return this.x * u.x + this.y * u.y;
418
+ }
419
+
420
+ squareLength() {
421
+ return this.dot(this);
422
+ }
423
+
424
+ length() {
425
+ return Math.sqrt(this.dot(this));
426
+ }
427
+
428
+ normalize() {
429
+ return this.scale(1 / this.length());
430
+ }
431
+
432
+ scale(r) {
433
+ return this.map((z) => z * r);
434
+ }
435
+
436
+ map(lambda) {
437
+ return new Vector2(lambda(this.x, 0), lambda(this.y, 1));
438
+ }
439
+
440
+ /**
441
+ *
442
+ * @param {*} y: Vec
443
+ * @param {*} operation: (a,b) => op(a,b)
444
+ */
445
+ op(u, operation) {
446
+ return new Vector2(operation(this.x, u.x), operation(this.y, u.y));
447
+ }
448
+
449
+ reduce(fold, init = 0) {
450
+ let acc = init;
451
+ acc = fold(acc, this.x);
452
+ acc = fold(acc, this.y);
453
+ return acc;
454
+ }
455
+
456
+ fold = this.reduce;
457
+ foldLeft = this.fold;
458
+
459
+ equals(u, precision = 1e-5) {
460
+ if (!(u instanceof Vector2)) return false;
461
+ return this.sub(u).length() < precision;
462
+ }
463
+
464
+ take(n = 0, m = 2) {
465
+ const array = [this.x, this.y].slice(n, m);
466
+ if (array.length === 2) return Vector2.fromArray(array);
467
+ return Vec.fromArray(array);
468
+ }
469
+
470
+ findIndex(predicate) {
471
+ if (predicate(this.x)) return 0;
472
+ if (predicate(this.y)) return 1;
473
+ return -1;
474
+ }
475
+
476
+ static fromArray(array) {
477
+ return new Vector2(...array);
478
+ }
479
+
480
+ static of(...values) {
481
+ return new Vector2(...values);
482
+ }
483
+
484
+ static e = (i) => {
485
+ if (i === 0) return new Vector2(1, 0);
486
+ if (i === 1) return new Vector2(0, 1);
487
+ return new Vector2();
488
+ };
489
+
490
+ static RANDOM = () => {
491
+ return new Vector2(Math.random(), Math.random());
492
+ };
493
+
494
+ static ONES = new Vector2(1, 1);
495
+ }
package/src/index.js ADDED
@@ -0,0 +1,32 @@
1
+ import Animation from "./Animation/Animation.js"
2
+ import Canvas from "./Canvas/Canvas.js"
3
+ import Color from "./Color/Color.js"
4
+ import DOM from "./DomBuilder/DomBuilder.js"
5
+ import Stream from "./Stream/Stream.js"
6
+ import Camera from "./Camera/Camera.js"
7
+ import Scene from "./Scene/Scene.js"
8
+ import NaiveScene from "./Scene/NaiveScene.js"
9
+ import Vec, { Vec2, Vec3 } from "./Vector/Vector.js"
10
+ import Box from "./Box/Box.js"
11
+ import Point from "./Scene/Point.js"
12
+ import Mesh from "./Scene/Mesh.js"
13
+
14
+ export {
15
+ Box,
16
+ DOM,
17
+ Vec,
18
+ Mesh,
19
+ Vec2,
20
+ Vec3,
21
+ Color,
22
+ Point,
23
+ Scene,
24
+ Canvas,
25
+ Camera,
26
+ Stream,
27
+ Animation,
28
+ NaiveScene,
29
+ }
30
+
31
+ export * as Utils from "./Utils/Utils.js";
32
+ export * as Monads from "./Monads/Monads.js";
@@ -0,0 +1,5 @@
1
+ export * from "./index.js";
2
+ import * as IO from "./IO/IO.js"
3
+ import Image from "./Image/Image.js"
4
+
5
+ export { IO, Image };
@@ -0,0 +1,56 @@
1
+ import { Color, Image, Stream, IO, Utils } from "../../dist/node/index.js";
2
+ const { measureTime } = Utils;
3
+ const { saveStreamToFile } = IO;
4
+
5
+ const width = 640;
6
+ const height = 480;
7
+ const clamp = x => Math.max(Math.min(1, x), 0);
8
+ function palette(t) {
9
+ let a = [0.5, 0.5, 0.5];
10
+ let b = [0.5, 0.5, 0.5];
11
+ let c = [1.0, 1.0, 1.0];
12
+ let d = [0.263, 0.416, 0.557];
13
+ return [a[0] + b[0] * Math.cos(6.28318 * (c[0] * t + d[0])), a[1] + b[1] * Math.cos(6.28318 * (c[1] * t + d[1])), a[2] + b[2] * Math.cos(6.28318 * (c[2] * t + d[2]))];
14
+ }
15
+
16
+ const imageStream = new Stream(
17
+ { time: 0, image: Image.ofSize(width, height) },
18
+ ({ time, image }) => {
19
+ const dt = 0.01; // 100 FPS
20
+ return {
21
+ time: time + dt,
22
+ image: image
23
+ .map((x, y) => {
24
+ let u = (2 * x - width) / height
25
+ let v = (2 * y - height) / height;
26
+ const u0 = u;
27
+ const v0 = v;
28
+ let finalColor = [0, 0, 0]
29
+ for (let i = 0; i < 4; i++) {
30
+ u = (u * 1.5 - Math.floor(u * 1.5)) - 0.5;
31
+ v = (v * 1.5 - Math.floor(v * 1.5)) - 0.5;
32
+ const d0 = -Math.sqrt(u0 * u0 + v0 * v0);
33
+ let d = Math.sqrt(u * u + v * v) * Math.exp(d0);
34
+ const col = palette(d0 + i * 0.4 + time * 0.4);
35
+ d = Math.sin(d * 8 + time) / 8;
36
+ d = Math.abs(d);
37
+ d = Math.pow(0.01 / d, 1.2);
38
+
39
+ finalColor = [finalColor[0] + col[0] * d, finalColor[1] + col[1] * d, finalColor[2] + col[2] * d]
40
+ }
41
+ return Color.ofRGB(clamp(finalColor[0]), clamp(finalColor[1]), clamp(finalColor[2]));
42
+ })
43
+ }
44
+ }
45
+ )
46
+
47
+ console.log(
48
+ "Video created in: ",
49
+ measureTime(() => {
50
+ saveStreamToFile(
51
+ "./amazing.mp4",
52
+ imageStream,
53
+ { fps: 100 }
54
+ ).until(({ time }) => time < 5)
55
+ })
56
+ )
@@ -0,0 +1,55 @@
1
+ import { Color, Image, Stream, IO, Utils, Mesh, Vec3, Scene, Camera } from "../../dist/node/index.js";
2
+ import { readFileSync } from "fs"
3
+
4
+ const { measureTime } = Utils;
5
+ const { saveStreamToFile } = IO;
6
+
7
+ const measureTime2 = lambda => {
8
+ const t = performance.now();
9
+ const ans = lambda()
10
+ return [ans, 1e-3 * (performance.now() - t)];
11
+ }
12
+
13
+ const width = 640;
14
+ const height = 480;
15
+
16
+ // scene
17
+ const scene = new Scene()
18
+ const camera = new Camera({ sphericalCoords: Vec3(5, 0, 0) });
19
+ const stanfordBunnyObj = readFileSync("./assets/bunny.obj", { encoding: "utf-8" });
20
+ let bunnyMesh = Mesh.readObj(stanfordBunnyObj);
21
+ const bunnyBox = bunnyMesh.getBoundingBox();
22
+ bunnyMesh = bunnyMesh
23
+ .mapVertices(v => v.sub(bunnyBox.min).div(bunnyBox.diagonal).scale(2).sub(Vec3(1, 1, 1)))
24
+ .mapVertices(v => Vec3(-v.y, v.x, v.z))
25
+ .mapVertices(v => Vec3(v.z, v.y, -v.x))
26
+ .mapColors(v => Color.ofRGB(...v.map(x => Math.max(0, Math.min(1, 0.5 * (x + 1)))).toArray()));
27
+ scene.add(...bunnyMesh.asPoints("bunny", 0.05));
28
+
29
+ const imageStream = new Stream(
30
+ { time: 0, image: camera.sceneShot(scene).to(Image.ofSize(width, height)) },
31
+ ({ time, image }) => {
32
+ const dt = 0.04; // 25 FPS
33
+ const theta = Math.PI / 4 * time;
34
+ camera.sphericalCoords = Vec3(camera.sphericalCoords.get(0), theta, 0);
35
+ camera.orbit();
36
+ const [newImage, t] = measureTime2(() => camera.sceneShot(scene).to(image));
37
+ console.log(`Image took ${t}s`);
38
+ return {
39
+ time: time + dt,
40
+ image: newImage
41
+ };
42
+ }
43
+ )
44
+
45
+ console.log(
46
+ "Video created in: ",
47
+ measureTime(() => {
48
+ saveStreamToFile(
49
+ "./bunny_stream.mp4",
50
+ imageStream,
51
+ { fps: 25 }
52
+ ).until(({ time }) => time < 10);
53
+ })
54
+ )
55
+