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.
- package/.eslintrc.yml +8 -0
- package/LICENSE +201 -0
- package/README.md +54 -0
- package/assets/bunny.obj +7474 -0
- package/assets/expand.svg +1 -0
- package/assets/great.jpg +0 -0
- package/assets/kakashi.jpg +0 -0
- package/assets/spot.obj +11999 -0
- package/assets/spot.png +0 -0
- package/assets/torus.obj +3137 -0
- package/assets/x.svg +1 -0
- package/bun.lockb +0 -0
- package/bundle.js +39 -0
- package/dist/node/index.js +37048 -0
- package/dist/web/index.js +1511 -0
- package/index.css +129 -0
- package/index.html +19 -0
- package/index.js +534 -0
- package/package.json +40 -0
- package/src/Animation/Animation.js +61 -0
- package/src/Box/Box.js +105 -0
- package/src/Camera/Camera.js +133 -0
- package/src/Canvas/Canvas.js +203 -0
- package/src/Canvas/README.md +83 -0
- package/src/Color/Color.js +77 -0
- package/src/DomBuilder/DomBuilder.js +126 -0
- package/src/IO/IO.js +120 -0
- package/src/Image/Image.js +138 -0
- package/src/Image/README.md +33 -0
- package/src/Monads/Monads.js +28 -0
- package/src/Ray/Ray.js +7 -0
- package/src/Scene/Mesh.js +103 -0
- package/src/Scene/NaiveScene.js +77 -0
- package/src/Scene/Point.js +109 -0
- package/src/Scene/PointCloud.js +51 -0
- package/src/Scene/Scene.js +200 -0
- package/src/Stream/Stream.js +10 -0
- package/src/Utils/Constants.js +1 -0
- package/src/Utils/Math.js +65 -0
- package/src/Utils/Utils.js +39 -0
- package/src/Vector/Vector.js +495 -0
- package/src/index.js +32 -0
- package/src/index.node.js +5 -0
- package/test/node/amazing_shader.js +56 -0
- package/test/node/bunny.js +55 -0
- package/test/node/bunny_parallel.js +102 -0
- package/test/node/image2rgb.js +57 -0
- package/test/node/image_test.js +38 -0
- package/test/node/lorentz.js +0 -0
- package/test/web/amazing_shader.js +60 -0
- package/test/web/amazing_shader_2.js +54 -0
- package/test/web/bunny.js +72 -0
- package/test/web/image2rgb.js +77 -0
- package/test/web/interactive_wave.js +108 -0
- package/test/web/lorenz.js +60 -0
- package/test/web/mandelbrot.js +59 -0
- package/test/web/rotating_grid.js +62 -0
- package/test/web/signed_bunny.js +139 -0
- package/test/web/signed_distance.js +95 -0
- package/test/web/simple_animation.js +39 -0
- package/test/web/simple_shader.js +14 -0
- package/test/web/six_spheres.js +102 -0
- package/test/web/wave_equation.js +93 -0
- package/vs-monaco/package/LICENSE +21 -0
- package/vs-monaco/package/ThirdPartyNotices.txt +448 -0
- package/vs-monaco/package/min/vs/base/browser/ui/codicons/codicon/codicon.ttf +0 -0
- package/vs-monaco/package/min/vs/base/common/worker/simpleWorker.nls.de.js +8 -0
- package/vs-monaco/package/min/vs/base/common/worker/simpleWorker.nls.es.js +8 -0
- package/vs-monaco/package/min/vs/base/common/worker/simpleWorker.nls.fr.js +8 -0
- package/vs-monaco/package/min/vs/base/common/worker/simpleWorker.nls.it.js +8 -0
- package/vs-monaco/package/min/vs/base/common/worker/simpleWorker.nls.ja.js +8 -0
- package/vs-monaco/package/min/vs/base/common/worker/simpleWorker.nls.js +8 -0
- package/vs-monaco/package/min/vs/base/common/worker/simpleWorker.nls.ko.js +8 -0
- package/vs-monaco/package/min/vs/base/common/worker/simpleWorker.nls.ru.js +8 -0
- package/vs-monaco/package/min/vs/base/common/worker/simpleWorker.nls.zh-cn.js +8 -0
- package/vs-monaco/package/min/vs/base/common/worker/simpleWorker.nls.zh-tw.js +8 -0
- package/vs-monaco/package/min/vs/base/worker/workerMain.js +27 -0
- package/vs-monaco/package/min/vs/basic-languages/abap/abap.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/apex/apex.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/azcli/azcli.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/bat/bat.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/bicep/bicep.js +11 -0
- package/vs-monaco/package/min/vs/basic-languages/cameligo/cameligo.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/clojure/clojure.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/coffee/coffee.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/cpp/cpp.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/csharp/csharp.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/csp/csp.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/css/css.js +12 -0
- package/vs-monaco/package/min/vs/basic-languages/cypher/cypher.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/dart/dart.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/dockerfile/dockerfile.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/ecl/ecl.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/elixir/elixir.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/flow9/flow9.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/freemarker2/freemarker2.js +12 -0
- package/vs-monaco/package/min/vs/basic-languages/fsharp/fsharp.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/go/go.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/graphql/graphql.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/handlebars/handlebars.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/hcl/hcl.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/html/html.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/ini/ini.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/java/java.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/javascript/javascript.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/julia/julia.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/kotlin/kotlin.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/less/less.js +11 -0
- package/vs-monaco/package/min/vs/basic-languages/lexon/lexon.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/liquid/liquid.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/lua/lua.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/m3/m3.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/markdown/markdown.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/mdx/mdx.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/mips/mips.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/msdax/msdax.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/mysql/mysql.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/objective-c/objective-c.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/pascal/pascal.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/pascaligo/pascaligo.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/perl/perl.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/pgsql/pgsql.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/php/php.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/pla/pla.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/postiats/postiats.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/powerquery/powerquery.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/powershell/powershell.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/protobuf/protobuf.js +11 -0
- package/vs-monaco/package/min/vs/basic-languages/pug/pug.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/python/python.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/qsharp/qsharp.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/r/r.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/razor/razor.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/redis/redis.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/redshift/redshift.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/restructuredtext/restructuredtext.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/ruby/ruby.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/rust/rust.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/sb/sb.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/scala/scala.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/scheme/scheme.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/scss/scss.js +12 -0
- package/vs-monaco/package/min/vs/basic-languages/shell/shell.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/solidity/solidity.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/sophia/sophia.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/sparql/sparql.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/sql/sql.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/st/st.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/swift/swift.js +13 -0
- package/vs-monaco/package/min/vs/basic-languages/systemverilog/systemverilog.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/tcl/tcl.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/twig/twig.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/typescript/typescript.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/vb/vb.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/wgsl/wgsl.js +307 -0
- package/vs-monaco/package/min/vs/basic-languages/xml/xml.js +10 -0
- package/vs-monaco/package/min/vs/basic-languages/yaml/yaml.js +10 -0
- package/vs-monaco/package/min/vs/editor/editor.main.css +6 -0
- package/vs-monaco/package/min/vs/editor/editor.main.js +745 -0
- package/vs-monaco/package/min/vs/editor/editor.main.nls.de.js +31 -0
- package/vs-monaco/package/min/vs/editor/editor.main.nls.es.js +31 -0
- package/vs-monaco/package/min/vs/editor/editor.main.nls.fr.js +29 -0
- package/vs-monaco/package/min/vs/editor/editor.main.nls.it.js +29 -0
- package/vs-monaco/package/min/vs/editor/editor.main.nls.ja.js +31 -0
- package/vs-monaco/package/min/vs/editor/editor.main.nls.js +29 -0
- package/vs-monaco/package/min/vs/editor/editor.main.nls.ko.js +29 -0
- package/vs-monaco/package/min/vs/editor/editor.main.nls.ru.js +31 -0
- package/vs-monaco/package/min/vs/editor/editor.main.nls.zh-cn.js +31 -0
- package/vs-monaco/package/min/vs/editor/editor.main.nls.zh-tw.js +29 -0
- package/vs-monaco/package/min/vs/language/css/cssMode.js +13 -0
- package/vs-monaco/package/min/vs/language/css/cssWorker.js +81 -0
- package/vs-monaco/package/min/vs/language/html/htmlMode.js +13 -0
- package/vs-monaco/package/min/vs/language/html/htmlWorker.js +453 -0
- package/vs-monaco/package/min/vs/language/json/jsonMode.js +15 -0
- package/vs-monaco/package/min/vs/language/json/jsonWorker.js +36 -0
- package/vs-monaco/package/min/vs/language/typescript/tsMode.js +20 -0
- package/vs-monaco/package/min/vs/language/typescript/tsWorker.js +37016 -0
- 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,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
|
+
|