@gg-web-engine/core 0.0.1
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/.prettierrc +8 -0
- package/README.md +8 -0
- package/blender_exporter/build_blender_scene.py +180 -0
- package/blender_exporter/spherical_to_cube_texture.py +116 -0
- package/dist/2d/entities/gg-2d-entity.d.ts +20 -0
- package/dist/2d/entities/gg-2d-entity.js +84 -0
- package/dist/2d/entities/gg-2d-trigger.entity.d.ts +10 -0
- package/dist/2d/entities/gg-2d-trigger.entity.js +17 -0
- package/dist/2d/entities/gg-positionable-2d-entity.d.ts +7 -0
- package/dist/2d/entities/gg-positionable-2d-entity.js +16 -0
- package/dist/2d/factories.d.ts +18 -0
- package/dist/2d/factories.js +13 -0
- package/dist/2d/gg-2d-world.d.ts +9 -0
- package/dist/2d/gg-2d-world.js +34 -0
- package/dist/2d/interfaces.d.ts +26 -0
- package/dist/2d/interfaces.js +7 -0
- package/dist/2d/models/body-options.d.ts +3 -0
- package/dist/2d/models/body-options.js +2 -0
- package/dist/2d/models/shapes.d.ts +13 -0
- package/dist/2d/models/shapes.js +2 -0
- package/dist/3d/controllers/car-keyboard.controller.d.ts +25 -0
- package/dist/3d/controllers/car-keyboard.controller.js +98 -0
- package/dist/3d/controllers/free-camera.controller.d.ts +23 -0
- package/dist/3d/controllers/free-camera.controller.js +79 -0
- package/dist/3d/entities/controllers/entity-motion.controller.d.ts +32 -0
- package/dist/3d/entities/controllers/entity-motion.controller.js +100 -0
- package/dist/3d/entities/gg-3d-camera.entity.d.ts +7 -0
- package/dist/3d/entities/gg-3d-camera.entity.js +12 -0
- package/dist/3d/entities/gg-3d-entity.d.ts +25 -0
- package/dist/3d/entities/gg-3d-entity.js +108 -0
- package/dist/3d/entities/gg-3d-map-graph.entity.d.ts +51 -0
- package/dist/3d/entities/gg-3d-map-graph.entity.js +164 -0
- package/dist/3d/entities/gg-3d-raycast-vehicle.entity.d.ts +107 -0
- package/dist/3d/entities/gg-3d-raycast-vehicle.entity.js +372 -0
- package/dist/3d/entities/gg-3d-trigger.entity.d.ts +10 -0
- package/dist/3d/entities/gg-3d-trigger.entity.js +21 -0
- package/dist/3d/entities/gg-positionable-3d-entity.d.ts +11 -0
- package/dist/3d/entities/gg-positionable-3d-entity.js +27 -0
- package/dist/3d/factories.d.ts +21 -0
- package/dist/3d/factories.js +22 -0
- package/dist/3d/gg-3d-world.d.ts +11 -0
- package/dist/3d/gg-3d-world.js +36 -0
- package/dist/3d/interfaces.d.ts +65 -0
- package/dist/3d/interfaces.js +40 -0
- package/dist/3d/loader.d.ts +40 -0
- package/dist/3d/loader.js +129 -0
- package/dist/3d/models/body-options.d.ts +3 -0
- package/dist/3d/models/body-options.js +2 -0
- package/dist/3d/models/gg-meta.d.ts +22 -0
- package/dist/3d/models/gg-meta.js +2 -0
- package/dist/3d/models/shapes.d.ts +35 -0
- package/dist/3d/models/shapes.js +2 -0
- package/dist/base/clock.d.ts +26 -0
- package/dist/base/clock.js +82 -0
- package/dist/base/controllers/common.d.ts +8 -0
- package/dist/base/controllers/common.js +32 -0
- package/dist/base/controllers/i-controller.d.ts +4 -0
- package/dist/base/controllers/i-controller.js +2 -0
- package/dist/base/controllers/keyboard.controller.d.ts +16 -0
- package/dist/base/controllers/keyboard.controller.js +109 -0
- package/dist/base/controllers/mouse.controller.d.ts +24 -0
- package/dist/base/controllers/mouse.controller.js +68 -0
- package/dist/base/data-structures/graph.d.ts +20 -0
- package/dist/base/data-structures/graph.js +118 -0
- package/dist/base/entities/base-gg-renderer.d.ts +28 -0
- package/dist/base/entities/base-gg-renderer.js +49 -0
- package/dist/base/entities/gg-entity.d.ts +14 -0
- package/dist/base/entities/gg-entity.js +55 -0
- package/dist/base/entities/gg-positionable-entity.d.ts +23 -0
- package/dist/base/entities/gg-positionable-entity.js +47 -0
- package/dist/base/entities/inline-controller.d.ts +3 -0
- package/dist/base/entities/inline-controller.js +25 -0
- package/dist/base/entities/interfaces/i-tick-listener.d.ts +7 -0
- package/dist/base/entities/interfaces/i-tick-listener.js +6 -0
- package/dist/base/gg-static.d.ts +9 -0
- package/dist/base/gg-static.js +40 -0
- package/dist/base/gg-viewport-manager.d.ts +14 -0
- package/dist/base/gg-viewport-manager.js +125 -0
- package/dist/base/gg-viewport.d.ts +23 -0
- package/dist/base/gg-viewport.js +123 -0
- package/dist/base/gg-world.d.ts +32 -0
- package/dist/base/gg-world.js +172 -0
- package/dist/base/interfaces/gg-body.d.ts +15 -0
- package/dist/base/interfaces/gg-body.js +2 -0
- package/dist/base/interfaces/gg-debug-physics-drawer.d.ts +7 -0
- package/dist/base/interfaces/gg-debug-physics-drawer.js +2 -0
- package/dist/base/interfaces/gg-object.d.ts +16 -0
- package/dist/base/interfaces/gg-object.js +2 -0
- package/dist/base/interfaces/gg-physics-world.d.ts +18 -0
- package/dist/base/interfaces/gg-physics-world.js +2 -0
- package/dist/base/interfaces/gg-trigger.d.ts +8 -0
- package/dist/base/interfaces/gg-trigger.js +2 -0
- package/dist/base/interfaces/gg-visual-scene.d.ts +9 -0
- package/dist/base/interfaces/gg-visual-scene.js +2 -0
- package/dist/base/math/box.d.ts +5 -0
- package/dist/base/math/box.js +21 -0
- package/dist/base/math/matrix4.d.ts +5 -0
- package/dist/base/math/matrix4.js +33 -0
- package/dist/base/math/numbers.d.ts +2 -0
- package/dist/base/math/numbers.js +14 -0
- package/dist/base/math/point2.d.ts +15 -0
- package/dist/base/math/point2.js +40 -0
- package/dist/base/math/point3.d.ts +25 -0
- package/dist/base/math/point3.js +104 -0
- package/dist/base/math/quaternion.d.ts +28 -0
- package/dist/base/math/quaternion.js +145 -0
- package/dist/base/models/axis-directions.d.ts +3 -0
- package/dist/base/models/axis-directions.js +2 -0
- package/dist/base/models/body-options.d.ts +6 -0
- package/dist/base/models/body-options.js +2 -0
- package/dist/base/models/geometry-nodes.d.ts +7 -0
- package/dist/base/models/geometry-nodes.js +2 -0
- package/dist/base/models/points.d.ts +15 -0
- package/dist/base/models/points.js +2 -0
- package/dist/base/ui/gg-console.ui.d.ts +21 -0
- package/dist/base/ui/gg-console.ui.js +162 -0
- package/dist/base/ui/gg-debugger.ui.d.ts +10 -0
- package/dist/base/ui/gg-debugger.ui.js +68 -0
- package/dist/index.d.ts +51 -0
- package/dist/index.js +67 -0
- package/package.json +64 -0
- package/src/2d/entities/gg-2d-entity.ts +86 -0
- package/src/2d/entities/gg-2d-trigger.entity.ts +17 -0
- package/src/2d/entities/gg-positionable-2d-entity.ts +16 -0
- package/src/2d/factories.ts +20 -0
- package/src/2d/gg-2d-world.ts +32 -0
- package/src/2d/interfaces.ts +31 -0
- package/src/2d/models/body-options.ts +3 -0
- package/src/2d/models/shapes.ts +7 -0
- package/src/3d/controllers/car-keyboard.controller.ts +128 -0
- package/src/3d/controllers/free-camera.controller.ts +86 -0
- package/src/3d/entities/controllers/entity-motion.controller.ts +122 -0
- package/src/3d/entities/gg-3d-camera.entity.ts +8 -0
- package/src/3d/entities/gg-3d-entity.ts +116 -0
- package/src/3d/entities/gg-3d-map-graph.entity.ts +204 -0
- package/src/3d/entities/gg-3d-raycast-vehicle.entity.ts +468 -0
- package/src/3d/entities/gg-3d-trigger.entity.ts +22 -0
- package/src/3d/entities/gg-positionable-3d-entity.ts +31 -0
- package/src/3d/factories.ts +29 -0
- package/src/3d/gg-3d-world.ts +36 -0
- package/src/3d/interfaces.ts +96 -0
- package/src/3d/loader.ts +165 -0
- package/src/3d/models/body-options.ts +3 -0
- package/src/3d/models/gg-meta.ts +12 -0
- package/src/3d/models/shapes.ts +13 -0
- package/src/base/clock.ts +97 -0
- package/src/base/controllers/common.ts +37 -0
- package/src/base/controllers/i-controller.ts +5 -0
- package/src/base/controllers/keyboard.controller.ts +109 -0
- package/src/base/controllers/mouse.controller.ts +73 -0
- package/src/base/data-structures/graph.ts +125 -0
- package/src/base/entities/base-gg-renderer.ts +77 -0
- package/src/base/entities/gg-entity.ts +61 -0
- package/src/base/entities/gg-positionable-entity.ts +64 -0
- package/src/base/entities/inline-controller.ts +31 -0
- package/src/base/entities/interfaces/i-tick-listener.ts +15 -0
- package/src/base/gg-static.ts +30 -0
- package/src/base/gg-viewport-manager.ts +122 -0
- package/src/base/gg-viewport.ts +159 -0
- package/src/base/gg-world.ts +198 -0
- package/src/base/interfaces/gg-body.ts +23 -0
- package/src/base/interfaces/gg-debug-physics-drawer.ts +10 -0
- package/src/base/interfaces/gg-object.ts +26 -0
- package/src/base/interfaces/gg-physics-world.ts +24 -0
- package/src/base/interfaces/gg-trigger.ts +10 -0
- package/src/base/interfaces/gg-visual-scene.ts +11 -0
- package/src/base/math/box.ts +19 -0
- package/src/base/math/matrix4.ts +29 -0
- package/src/base/math/numbers.ts +10 -0
- package/src/base/math/point2.ts +43 -0
- package/src/base/math/point3.ts +119 -0
- package/src/base/math/quaternion.ts +172 -0
- package/src/base/models/axis-directions.ts +3 -0
- package/src/base/models/body-options.ts +6 -0
- package/src/base/models/geometry-nodes.ts +5 -0
- package/src/base/models/points.ts +3 -0
- package/src/base/ui/gg-console.ui.ts +165 -0
- package/src/base/ui/gg-debugger.ui.ts +69 -0
- package/src/index.ts +53 -0
- package/test/base/data-structures/graph.spec.ts +76 -0
- package/tsconfig.json +9 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.lerpNumber = exports.averageAngle = void 0;
|
|
4
|
+
const averageAngle = (angleA, angleB, factor = 0.5) => {
|
|
5
|
+
while (Math.abs(angleA - angleB) > Math.PI) {
|
|
6
|
+
angleB += Math.PI * (angleA > angleB ? 2 : -2);
|
|
7
|
+
}
|
|
8
|
+
return angleA * (1 - factor) + angleB * factor;
|
|
9
|
+
};
|
|
10
|
+
exports.averageAngle = averageAngle;
|
|
11
|
+
const lerpNumber = (a, b, t) => {
|
|
12
|
+
return a + t * (b - a);
|
|
13
|
+
};
|
|
14
|
+
exports.lerpNumber = lerpNumber;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Point2 } from '../models/points';
|
|
2
|
+
export declare class Pnt2 {
|
|
3
|
+
/** clone point */
|
|
4
|
+
static clone(p: Point2): Point2;
|
|
5
|
+
/** add point b to point a */
|
|
6
|
+
static add(a: Point2, b: Point2): Point2;
|
|
7
|
+
/** subtract point b from point a */
|
|
8
|
+
static sub(a: Point2, b: Point2): Point2;
|
|
9
|
+
/** normalize */
|
|
10
|
+
static norm(p: Point2): Point2;
|
|
11
|
+
/** scalar multiplication */
|
|
12
|
+
static scalarMult(p: Point2, m: number): Point2;
|
|
13
|
+
/** linear interpolation */
|
|
14
|
+
static lerp(a: Point2, b: Point2, t: number): Point2;
|
|
15
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Pnt2 = void 0;
|
|
4
|
+
class Pnt2 {
|
|
5
|
+
/** clone point */
|
|
6
|
+
static clone(p) {
|
|
7
|
+
return Object.assign({}, p);
|
|
8
|
+
}
|
|
9
|
+
/** add point b to point a */
|
|
10
|
+
static add(a, b) {
|
|
11
|
+
return { x: a.x + b.x, y: a.y + b.y };
|
|
12
|
+
}
|
|
13
|
+
/** subtract point b from point a */
|
|
14
|
+
static sub(a, b) {
|
|
15
|
+
return { x: a.x - b.x, y: a.y - b.y };
|
|
16
|
+
}
|
|
17
|
+
/** normalize */
|
|
18
|
+
static norm(p) {
|
|
19
|
+
const length = Math.sqrt(p.x ** 2 + p.y ** 2);
|
|
20
|
+
return {
|
|
21
|
+
x: p.x / length,
|
|
22
|
+
y: p.y / length,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/** scalar multiplication */
|
|
26
|
+
static scalarMult(p, m) {
|
|
27
|
+
return {
|
|
28
|
+
x: p.x * m,
|
|
29
|
+
y: p.y * m,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/** linear interpolation */
|
|
33
|
+
static lerp(a, b, t) {
|
|
34
|
+
return {
|
|
35
|
+
x: a.x + t * (b.x - a.x),
|
|
36
|
+
y: a.y + t * (b.y - a.y),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
exports.Pnt2 = Pnt2;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Point3, Point4 } from '../models/points';
|
|
2
|
+
export declare class Pnt3 {
|
|
3
|
+
/** clone point */
|
|
4
|
+
static clone(p: Point3): Point3;
|
|
5
|
+
/** add point b to point a */
|
|
6
|
+
static add(a: Point3, b: Point3): Point3;
|
|
7
|
+
/** subtract point b from point a */
|
|
8
|
+
static sub(a: Point3, b: Point3): Point3;
|
|
9
|
+
/** calculate vector length (squared) */
|
|
10
|
+
static lenSq(v: Point3): number;
|
|
11
|
+
/** calculate vector length */
|
|
12
|
+
static len(v: Point3): number;
|
|
13
|
+
/** cross vectors */
|
|
14
|
+
static cross(a: Point3, b: Point3): Point3;
|
|
15
|
+
/** normalize */
|
|
16
|
+
static norm(p: Point3): Point3;
|
|
17
|
+
/** scalar multiplication */
|
|
18
|
+
static scalarMult(p: Point3, m: number): Point3;
|
|
19
|
+
/** linear interpolation */
|
|
20
|
+
static lerp(a: Point3, b: Point3, t: number): Point3;
|
|
21
|
+
/** rotate point a with quaternion q */
|
|
22
|
+
static rot(p: Point3, q: Point4): Point3;
|
|
23
|
+
/** rotate point around axis a (normalized vector) */
|
|
24
|
+
static rotAround(p: Point3, axis: Point3, angle: number): Point3;
|
|
25
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Pnt3 = void 0;
|
|
4
|
+
const quaternion_1 = require("./quaternion");
|
|
5
|
+
class Pnt3 {
|
|
6
|
+
/** clone point */
|
|
7
|
+
static clone(p) {
|
|
8
|
+
return Object.assign({}, p);
|
|
9
|
+
}
|
|
10
|
+
/** add point b to point a */
|
|
11
|
+
static add(a, b) {
|
|
12
|
+
return { x: a.x + b.x, y: a.y + b.y, z: a.z + b.z };
|
|
13
|
+
}
|
|
14
|
+
/** subtract point b from point a */
|
|
15
|
+
static sub(a, b) {
|
|
16
|
+
return { x: a.x - b.x, y: a.y - b.y, z: a.z - b.z };
|
|
17
|
+
}
|
|
18
|
+
/** calculate vector length (squared) */
|
|
19
|
+
static lenSq(v) {
|
|
20
|
+
return v.x * v.x + v.y * v.y + v.z * v.z;
|
|
21
|
+
}
|
|
22
|
+
/** calculate vector length */
|
|
23
|
+
static len(v) {
|
|
24
|
+
return Math.sqrt(v.x * v.x + v.y * v.y + v.z * v.z);
|
|
25
|
+
}
|
|
26
|
+
/** cross vectors */
|
|
27
|
+
static cross(a, b) {
|
|
28
|
+
const ax = a.x, ay = a.y, az = a.z;
|
|
29
|
+
const bx = b.x, by = b.y, bz = b.z;
|
|
30
|
+
return {
|
|
31
|
+
x: ay * bz - az * by,
|
|
32
|
+
y: az * bx - ax * bz,
|
|
33
|
+
z: ax * by - ay * bx,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/** normalize */
|
|
37
|
+
static norm(p) {
|
|
38
|
+
const length = Math.sqrt(p.x ** 2 + p.y ** 2 + p.z ** 2);
|
|
39
|
+
if (length === 0) {
|
|
40
|
+
return p;
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
x: p.x / length,
|
|
44
|
+
y: p.y / length,
|
|
45
|
+
z: p.z / length,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/** scalar multiplication */
|
|
49
|
+
static scalarMult(p, m) {
|
|
50
|
+
return {
|
|
51
|
+
x: p.x * m,
|
|
52
|
+
y: p.y * m,
|
|
53
|
+
z: p.z * m,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/** linear interpolation */
|
|
57
|
+
static lerp(a, b, t) {
|
|
58
|
+
return {
|
|
59
|
+
x: a.x + t * (b.x - a.x),
|
|
60
|
+
y: a.y + t * (b.y - a.y),
|
|
61
|
+
z: a.z + t * (b.z - a.z),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/** rotate point a with quaternion q */
|
|
65
|
+
static rot(p, q) {
|
|
66
|
+
// faster version of:
|
|
67
|
+
// let qvec: Point4 = {x: v.x, y: v.y, z: v.z, w: 0};
|
|
68
|
+
// let qinv: Point4 = {x: -q.x, y: -q.y, z: -q.z, w: q.w};
|
|
69
|
+
// let res = Qtrn.mult(q, Qtrn.mult(qvec, qinv));
|
|
70
|
+
// return {x: res.x, y: res.y, z: res.z};
|
|
71
|
+
const { x, y, z } = p;
|
|
72
|
+
return {
|
|
73
|
+
x: q.w * q.w * x +
|
|
74
|
+
2 * q.y * q.w * z -
|
|
75
|
+
2 * q.z * q.w * y +
|
|
76
|
+
q.x * q.x * x +
|
|
77
|
+
2 * q.y * q.x * y +
|
|
78
|
+
2 * q.z * q.x * z -
|
|
79
|
+
q.y * q.y * x -
|
|
80
|
+
q.z * q.z * x,
|
|
81
|
+
y: 2 * q.x * q.y * x +
|
|
82
|
+
q.y * q.y * y +
|
|
83
|
+
2 * q.z * q.y * z +
|
|
84
|
+
2 * q.w * q.z * x -
|
|
85
|
+
q.z * q.z * y +
|
|
86
|
+
q.w * q.w * y -
|
|
87
|
+
2 * q.x * q.w * z -
|
|
88
|
+
q.x * q.x * y,
|
|
89
|
+
z: 2 * q.x * q.z * x +
|
|
90
|
+
2 * q.y * q.z * y +
|
|
91
|
+
q.z * q.z * z -
|
|
92
|
+
2 * q.w * q.y * x -
|
|
93
|
+
q.y * q.y * z +
|
|
94
|
+
2 * q.w * q.x * y -
|
|
95
|
+
q.x * q.x * z +
|
|
96
|
+
q.w * q.w * z,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/** rotate point around axis a (normalized vector) */
|
|
100
|
+
static rotAround(p, axis, angle) {
|
|
101
|
+
return this.rot(p, quaternion_1.Qtrn.fromAngle(axis, angle));
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
exports.Pnt3 = Pnt3;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Point3, Point4 } from '../models/points';
|
|
2
|
+
export declare class Qtrn {
|
|
3
|
+
/** clone quaternion */
|
|
4
|
+
static clone(q: Point4): Point4;
|
|
5
|
+
/** add quaternion b to quaternion a */
|
|
6
|
+
static add(a: Point4, b: Point4): Point4;
|
|
7
|
+
static mult(a: Point4, b: Point4): Point4;
|
|
8
|
+
static combineRotations(...quaternions: Point4[]): Point4;
|
|
9
|
+
/** linear interpolation */
|
|
10
|
+
static lerp(a: Point4, b: Point4, t: number): Point4;
|
|
11
|
+
/** spherical interpolation */
|
|
12
|
+
static slerp(a: Point4, b: Point4, t: number): Point4;
|
|
13
|
+
/** creates quaternion from simple angle around axis. Assumes that axis vector is normalized */
|
|
14
|
+
static fromAngle(axis: Point3, angle: number): {
|
|
15
|
+
w: number;
|
|
16
|
+
x: number;
|
|
17
|
+
y: number;
|
|
18
|
+
z: number;
|
|
19
|
+
};
|
|
20
|
+
/** creates quaternion from 4-dimension rotation matrix */
|
|
21
|
+
static fromMatrix4(m: number[]): Point4;
|
|
22
|
+
/** creates a quaternion from euler */
|
|
23
|
+
static fromEuler(e: Point3): Point4;
|
|
24
|
+
/** converts a quaternion to euler */
|
|
25
|
+
static toEuler(q: Point4): Point3;
|
|
26
|
+
/** creates a rotation for object, so it will look at some point in space */
|
|
27
|
+
static lookAt(eye: Point3, target: Point3, up: Point3): Point4;
|
|
28
|
+
}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Qtrn = void 0;
|
|
4
|
+
const point3_1 = require("./point3");
|
|
5
|
+
const matrix4_1 = require("./matrix4");
|
|
6
|
+
class Qtrn {
|
|
7
|
+
/** clone quaternion */
|
|
8
|
+
static clone(q) {
|
|
9
|
+
return Object.assign({}, q);
|
|
10
|
+
}
|
|
11
|
+
/** add quaternion b to quaternion a */
|
|
12
|
+
static add(a, b) {
|
|
13
|
+
const w = a.w + b.w;
|
|
14
|
+
const x = a.x + b.x;
|
|
15
|
+
const y = a.y + b.y;
|
|
16
|
+
const z = a.z + b.z;
|
|
17
|
+
const magnitude = Math.sqrt(w * w + x * x + y * y + z * z);
|
|
18
|
+
return { w: w / magnitude, x: x / magnitude, y: y / magnitude, z: z / magnitude };
|
|
19
|
+
}
|
|
20
|
+
static mult(a, b) {
|
|
21
|
+
return {
|
|
22
|
+
w: a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z,
|
|
23
|
+
x: a.w * b.x + a.x * b.w + a.y * b.z - a.z * b.y,
|
|
24
|
+
y: a.w * b.y - a.x * b.z + a.y * b.w + a.z * b.x,
|
|
25
|
+
z: a.w * b.z + a.x * b.y - a.y * b.x + a.z * b.w,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
static combineRotations(...quaternions) {
|
|
29
|
+
let result = { w: 1, x: 0, y: 0, z: 0 };
|
|
30
|
+
for (const quat of quaternions) {
|
|
31
|
+
result = this.mult(result, quat);
|
|
32
|
+
}
|
|
33
|
+
return result;
|
|
34
|
+
}
|
|
35
|
+
/** linear interpolation */
|
|
36
|
+
static lerp(a, b, t) {
|
|
37
|
+
return {
|
|
38
|
+
x: a.x + t * (b.x - a.x),
|
|
39
|
+
y: a.y + t * (b.y - a.y),
|
|
40
|
+
z: a.z + t * (b.z - a.z),
|
|
41
|
+
w: a.w + t * (b.w - a.w),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/** spherical interpolation */
|
|
45
|
+
static slerp(a, b, t) {
|
|
46
|
+
let dot = a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w;
|
|
47
|
+
let theta = Math.acos(dot);
|
|
48
|
+
let sinTheta = Math.sin(theta);
|
|
49
|
+
let x = (a.x * Math.sin((1 - t) * theta)) / sinTheta + (b.x * Math.sin(t * theta)) / sinTheta;
|
|
50
|
+
let y = (a.y * Math.sin((1 - t) * theta)) / sinTheta + (b.y * Math.sin(t * theta)) / sinTheta;
|
|
51
|
+
let z = (a.z * Math.sin((1 - t) * theta)) / sinTheta + (b.z * Math.sin(t * theta)) / sinTheta;
|
|
52
|
+
let w = (a.w * Math.sin((1 - t) * theta)) / sinTheta + (b.w * Math.sin(t * theta)) / sinTheta;
|
|
53
|
+
if (isNaN(x) || isNaN(y) || isNaN(z) || isNaN(w)) {
|
|
54
|
+
// happens when they are equal
|
|
55
|
+
return Qtrn.clone(a);
|
|
56
|
+
}
|
|
57
|
+
return { x, y, z, w };
|
|
58
|
+
}
|
|
59
|
+
/** creates quaternion from simple angle around axis. Assumes that axis vector is normalized */
|
|
60
|
+
static fromAngle(axis, angle) {
|
|
61
|
+
// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm
|
|
62
|
+
const halfAngle = angle / 2, s = Math.sin(halfAngle);
|
|
63
|
+
return Object.assign(Object.assign({}, point3_1.Pnt3.scalarMult(axis, s)), { w: Math.cos(halfAngle) });
|
|
64
|
+
}
|
|
65
|
+
/** creates quaternion from 4-dimension rotation matrix */
|
|
66
|
+
static fromMatrix4(m) {
|
|
67
|
+
// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm
|
|
68
|
+
// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)
|
|
69
|
+
const m11 = m[0], m12 = m[4], m13 = m[8], m21 = m[1], m22 = m[5], m23 = m[9], m31 = m[2], m32 = m[6], m33 = m[10], trace = m11 + m22 + m33;
|
|
70
|
+
if (trace > 0) {
|
|
71
|
+
const s = 0.5 / Math.sqrt(trace + 1.0);
|
|
72
|
+
return {
|
|
73
|
+
x: (m32 - m23) * s,
|
|
74
|
+
y: (m13 - m31) * s,
|
|
75
|
+
z: (m21 - m12) * s,
|
|
76
|
+
w: 0.25 / s,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
else if (m11 > m22 && m11 > m33) {
|
|
80
|
+
const s = 2.0 * Math.sqrt(1.0 + m11 - m22 - m33);
|
|
81
|
+
return {
|
|
82
|
+
x: 0.25 * s,
|
|
83
|
+
y: (m12 + m21) / s,
|
|
84
|
+
z: (m13 + m31) / s,
|
|
85
|
+
w: (m32 - m23) / s,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
else if (m22 > m33) {
|
|
89
|
+
const s = 2.0 * Math.sqrt(1.0 + m22 - m11 - m33);
|
|
90
|
+
return {
|
|
91
|
+
x: (m12 + m21) / s,
|
|
92
|
+
y: 0.25 * s,
|
|
93
|
+
z: (m23 + m32) / s,
|
|
94
|
+
w: (m13 - m31) / s,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
const s = 2.0 * Math.sqrt(1.0 + m33 - m11 - m22);
|
|
99
|
+
return {
|
|
100
|
+
x: (m13 + m31) / s,
|
|
101
|
+
y: (m23 + m32) / s,
|
|
102
|
+
z: 0.25 * s,
|
|
103
|
+
w: (m21 - m12) / s,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/** creates a quaternion from euler */
|
|
108
|
+
static fromEuler(e) {
|
|
109
|
+
const roll = e.x;
|
|
110
|
+
const pitch = e.y;
|
|
111
|
+
const yaw = e.z;
|
|
112
|
+
const cy = Math.cos(yaw * 0.5);
|
|
113
|
+
const sy = Math.sin(yaw * 0.5);
|
|
114
|
+
const cp = Math.cos(pitch * 0.5);
|
|
115
|
+
const sp = Math.sin(pitch * 0.5);
|
|
116
|
+
const cr = Math.cos(roll * 0.5);
|
|
117
|
+
const sr = Math.sin(roll * 0.5);
|
|
118
|
+
const qw = cr * cp * cy + sr * sp * sy;
|
|
119
|
+
const qx = sr * cp * cy - cr * sp * sy;
|
|
120
|
+
const qy = cr * sp * cy + sr * cp * sy;
|
|
121
|
+
const qz = cr * cp * sy - sr * sp * cy;
|
|
122
|
+
return { w: qw, x: qx, y: qy, z: qz };
|
|
123
|
+
}
|
|
124
|
+
/** converts a quaternion to euler */
|
|
125
|
+
static toEuler(q) {
|
|
126
|
+
const qw = q.w;
|
|
127
|
+
const qx = q.x;
|
|
128
|
+
const qy = q.y;
|
|
129
|
+
const qz = q.z;
|
|
130
|
+
const sinr_cosp = 2 * (qw * qx + qy * qz);
|
|
131
|
+
const cosr_cosp = 1 - 2 * (qx * qx + qy * qy);
|
|
132
|
+
const roll = Math.atan2(sinr_cosp, cosr_cosp);
|
|
133
|
+
const sinp = 2 * (qw * qy - qz * qx);
|
|
134
|
+
const pitch = Math.abs(sinp) >= 1 ? (Math.sign(sinp) * Math.PI) / 2 : Math.asin(sinp);
|
|
135
|
+
const siny_cosp = 2 * (qw * qz + qx * qy);
|
|
136
|
+
const cosy_cosp = 1 - 2 * (qy * qy + qz * qz);
|
|
137
|
+
const yaw = Math.atan2(siny_cosp, cosy_cosp);
|
|
138
|
+
return { x: roll, y: pitch, z: yaw };
|
|
139
|
+
}
|
|
140
|
+
/** creates a rotation for object, so it will look at some point in space */
|
|
141
|
+
static lookAt(eye, target, up) {
|
|
142
|
+
return this.fromMatrix4(matrix4_1.Mtrx4.lookAt(eye, target, up));
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
exports.Qtrn = Qtrn;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export declare class GgConsoleUI {
|
|
2
|
+
private static _instance;
|
|
3
|
+
static get instance(): GgConsoleUI;
|
|
4
|
+
private constructor();
|
|
5
|
+
private output;
|
|
6
|
+
private commandHistory;
|
|
7
|
+
private currentCommandIndex;
|
|
8
|
+
elements: {
|
|
9
|
+
main: HTMLDivElement;
|
|
10
|
+
input: HTMLInputElement;
|
|
11
|
+
output: HTMLTextAreaElement;
|
|
12
|
+
} | null;
|
|
13
|
+
get isUIShown(): boolean;
|
|
14
|
+
createUI(): void;
|
|
15
|
+
destroyUI(): void;
|
|
16
|
+
onUsePreviousCommand(): void;
|
|
17
|
+
onUseNextCommand(): void;
|
|
18
|
+
onInput(): Promise<void>;
|
|
19
|
+
private stdout;
|
|
20
|
+
setupDragging(): void;
|
|
21
|
+
}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.GgConsoleUI = void 0;
|
|
13
|
+
const gg_static_1 = require("../gg-static");
|
|
14
|
+
class GgConsoleUI {
|
|
15
|
+
constructor() {
|
|
16
|
+
this.output = `
|
|
17
|
+
▄████ ▄████ █ █░▓█████ ▄▄▄▄
|
|
18
|
+
██▒ ▀█▒ ██▒ ▀█▒ ▓█░ █ ░█░▓█ ▀ ▓█████▄
|
|
19
|
+
▒██░▄▄▄░▒██░▄▄▄░ ▒█░ █ ░█ ▒███ ▒██▒ ▄██
|
|
20
|
+
░▓█ ██▓░▓█ ██▓ ░█░ █ ░█ ▒▓█ ▄ ▒██░█▀
|
|
21
|
+
░▒▓███▀▒░▒▓███▀▒ ░░██▒██▓ ░▒████▒░▓█ ▀█▓
|
|
22
|
+
░▒ ▒ ░▒ ▒ ░ ▓░▒ ▒ ░░ ▒░ ░░▒▓███▀▒
|
|
23
|
+
â–‘ â–‘ â–‘ â–‘ â–’ â–‘ â–‘ â–‘ â–‘ â–‘â–’â–‘â–’ â–‘
|
|
24
|
+
â–‘ â–‘ â–‘ â–‘ â–‘ â–‘ â–‘ â–‘ â–‘ â–‘ â–‘
|
|
25
|
+
â–‘ â–‘ â–‘ â–‘ â–‘ â–‘
|
|
26
|
+
â–‘
|
|
27
|
+
>>> https://github.com/AndyGura/gg-web-engine <<<
|
|
28
|
+
Welcome to GG web engine UI console.
|
|
29
|
+
Enter command in input below.
|
|
30
|
+
|
|
31
|
+
List of available commands: commandslist
|
|
32
|
+
`;
|
|
33
|
+
this.commandHistory = [];
|
|
34
|
+
this.currentCommandIndex = 0; // for repeating command using up/down arrow keys
|
|
35
|
+
this.elements = null;
|
|
36
|
+
}
|
|
37
|
+
static get instance() {
|
|
38
|
+
if (!this._instance) {
|
|
39
|
+
this._instance = new GgConsoleUI();
|
|
40
|
+
}
|
|
41
|
+
return this._instance;
|
|
42
|
+
}
|
|
43
|
+
get isUIShown() {
|
|
44
|
+
return !!this.elements;
|
|
45
|
+
}
|
|
46
|
+
createUI() {
|
|
47
|
+
if (this.elements) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const main = document.createElement('div');
|
|
51
|
+
main.innerHTML = `
|
|
52
|
+
<div id="gg-console-header" style="padding: 10px; cursor: move; z-index: 10; background-color: #054a81; border: 1px solid white; font-size: large;">GG web engine UI console</div>
|
|
53
|
+
<textarea id="gg-console-output" disabled style="resize: none; flex-grow: 1; background: #555555; border: 1px solid white; color: white; font-family: monospace;" ></textarea>
|
|
54
|
+
<input id="gg-console-input" style="background: #555555; border: 1px solid white; color: white; font-family: monospace;"/>`;
|
|
55
|
+
main.style.position = 'absolute';
|
|
56
|
+
main.style.zIndex = '1000';
|
|
57
|
+
main.style.backgroundColor = '#222222';
|
|
58
|
+
main.style.border = '1px solid white';
|
|
59
|
+
main.style.width = '640px';
|
|
60
|
+
main.style.height = '480px';
|
|
61
|
+
main.style.display = 'flex';
|
|
62
|
+
main.style.flexDirection = 'column';
|
|
63
|
+
main.style.alignItems = 'stretch';
|
|
64
|
+
main.style.padding = '3px';
|
|
65
|
+
main.style.rowGap = '3px';
|
|
66
|
+
main.style.fontFamily = 'monospace';
|
|
67
|
+
main.style.color = 'white';
|
|
68
|
+
document.body.append(main);
|
|
69
|
+
this.elements = {
|
|
70
|
+
main,
|
|
71
|
+
input: document.getElementById('gg-console-input'),
|
|
72
|
+
output: document.getElementById('gg-console-output'),
|
|
73
|
+
};
|
|
74
|
+
this.elements.input.onkeydown = event => {
|
|
75
|
+
if ((event === null || event === void 0 ? void 0 : event.keyCode) === 13) {
|
|
76
|
+
event.preventDefault();
|
|
77
|
+
this.onInput().then();
|
|
78
|
+
}
|
|
79
|
+
else if ((event === null || event === void 0 ? void 0 : event.keyCode) === 38) {
|
|
80
|
+
event.preventDefault();
|
|
81
|
+
this.onUsePreviousCommand();
|
|
82
|
+
}
|
|
83
|
+
else if ((event === null || event === void 0 ? void 0 : event.keyCode) === 40) {
|
|
84
|
+
event.preventDefault();
|
|
85
|
+
this.onUseNextCommand();
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
this.stdout();
|
|
89
|
+
this.setupDragging();
|
|
90
|
+
setTimeout(() => this.elements.input.focus(), 20);
|
|
91
|
+
}
|
|
92
|
+
destroyUI() {
|
|
93
|
+
if (!this.elements) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
document.body.removeChild(this.elements.main);
|
|
97
|
+
this.elements = null;
|
|
98
|
+
}
|
|
99
|
+
onUsePreviousCommand() {
|
|
100
|
+
if (this.commandHistory.length === 0) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
this.currentCommandIndex--;
|
|
104
|
+
if (this.currentCommandIndex < 0) {
|
|
105
|
+
this.currentCommandIndex += this.commandHistory.length;
|
|
106
|
+
}
|
|
107
|
+
this.elements.input.value = this.commandHistory[this.currentCommandIndex % this.commandHistory.length];
|
|
108
|
+
}
|
|
109
|
+
onUseNextCommand() {
|
|
110
|
+
if (this.commandHistory.length === 0) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
this.currentCommandIndex++;
|
|
114
|
+
this.elements.input.value = this.commandHistory[this.currentCommandIndex % this.commandHistory.length];
|
|
115
|
+
}
|
|
116
|
+
onInput() {
|
|
117
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
118
|
+
const command = this.elements.input.value;
|
|
119
|
+
this.elements.input.value = '';
|
|
120
|
+
this.stdout('\n> ' + command);
|
|
121
|
+
this.stdout('\n' + (yield gg_static_1.GgStatic.instance.console(command)));
|
|
122
|
+
this.commandHistory.push(command);
|
|
123
|
+
this.currentCommandIndex = this.commandHistory.length;
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
stdout(s = '') {
|
|
127
|
+
this.output += s;
|
|
128
|
+
this.elements.output.value = this.output;
|
|
129
|
+
this.elements.output.scrollTop = this.elements.output.scrollHeight;
|
|
130
|
+
}
|
|
131
|
+
setupDragging() {
|
|
132
|
+
let x = 0, y = 0;
|
|
133
|
+
const dragMouseDown = (e) => {
|
|
134
|
+
e = e || window.event;
|
|
135
|
+
e.preventDefault();
|
|
136
|
+
// get the mouse cursor position at startup:
|
|
137
|
+
x = e.clientX;
|
|
138
|
+
y = e.clientY;
|
|
139
|
+
document.onmouseup = closeDragElement;
|
|
140
|
+
// call a function whenever the cursor moves:
|
|
141
|
+
document.onmousemove = elementDrag;
|
|
142
|
+
};
|
|
143
|
+
const elementDrag = (e) => {
|
|
144
|
+
e.preventDefault();
|
|
145
|
+
// calculate the new cursor position:
|
|
146
|
+
const curX = x - e.clientX;
|
|
147
|
+
const curY = y - e.clientY;
|
|
148
|
+
x = e.clientX;
|
|
149
|
+
y = e.clientY;
|
|
150
|
+
// set the element's new position:
|
|
151
|
+
this.elements.main.style.left = this.elements.main.offsetLeft - curX + 'px';
|
|
152
|
+
this.elements.main.style.top = this.elements.main.offsetTop - curY + 'px';
|
|
153
|
+
};
|
|
154
|
+
const closeDragElement = () => {
|
|
155
|
+
// stop moving when mouse button is released:
|
|
156
|
+
document.onmouseup = null;
|
|
157
|
+
document.onmousemove = null;
|
|
158
|
+
};
|
|
159
|
+
document.getElementById('gg-console-header').onmousedown = dragMouseDown;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
exports.GgConsoleUI = GgConsoleUI;
|