@zappar/zappar-cv 3.0.1-alpha.8 → 3.0.1-beta.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/README.md +2 -2
- package/lib/additional.d.ts +3 -1
- package/lib/deserializer.d.ts +5 -1
- package/lib/deserializer.js +12 -0
- package/lib/direct.js +1 -1
- package/lib/drawaxis.d.ts +2 -0
- package/lib/drawaxis.js +137 -0
- package/lib/drawgrid.js +5 -2
- package/lib/drawpoints.d.ts +1 -0
- package/lib/drawpoints.js +2 -2
- package/lib/drawpointswithtype.d.ts +13 -0
- package/lib/drawpointswithtype.js +190 -0
- package/lib/drawpolygon.d.ts +5 -0
- package/lib/drawpolygon.js +94 -0
- package/lib/gen/zappar-bridge.d.ts +44 -11
- package/lib/gen/zappar-bridge.js +3 -0
- package/lib/gen/zappar-client.d.ts +1 -0
- package/lib/gen/zappar-client.js +347 -47
- package/lib/gen/zappar-cwrap.js +251 -41
- package/lib/gen/zappar-native.d.ts +56 -13
- package/lib/gen/zappar-native.js +23 -1
- package/lib/gen/zappar-server.d.ts +3 -0
- package/lib/gen/zappar-server.js +166 -21
- package/lib/gen/zappar.d.ts +51 -13
- package/lib/gen/zappar.js +3 -0
- package/lib/html-element-source.d.ts +4 -0
- package/lib/html-element-source.js +30 -2
- package/lib/index.d.ts +1 -1
- package/lib/index.js +1 -1
- package/lib/mstp-camera-source.js +2 -1
- package/lib/native.js +59 -4
- package/lib/permission.js +35 -9
- package/lib/pipeline.d.ts +1 -1
- package/lib/pipeline.js +3 -2
- package/lib/sequencesource.js +1 -1
- package/lib/serializer.d.ts +5 -1
- package/lib/serializer.js +4 -0
- package/lib/tr.js +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/worker-client.js +4 -1
- package/lib/worker-imagebitmap.js +1 -1
- package/lib/worker-server.d.ts +1 -1
- package/lib/worker-server.js +5 -5
- package/lib/worker.js +1 -1
- package/lib/workerinterface.d.ts +1 -0
- package/lib/zappar-cv.js +1 -212
- package/lib/zappar-cv.wasm +0 -0
- package/package.json +1 -1
- package/umd/751.zappar-cv.js +1 -1
- package/umd/867.zappar-cv.js +1 -1
- package/umd/{5a86c8fa5c139c48ad64.wasm → c8e05439176ea756192a.wasm} +0 -0
- package/umd/zappar-cv.js +1 -1
- package/umd/zappar-cv.worker.js +1 -1
package/README.md
CHANGED
|
@@ -18,8 +18,8 @@ npm i @zappar/zappar-cv
|
|
|
18
18
|
|
|
19
19
|
You can use our CDN from within your HTML:
|
|
20
20
|
```
|
|
21
|
-
<script src="https://libs.zappar.com/zappar-cv/3.0.1-
|
|
21
|
+
<script src="https://libs.zappar.com/zappar-cv/3.0.1-beta.0/zappar-cv.js"></script>
|
|
22
22
|
```
|
|
23
23
|
|
|
24
24
|
Or you can download and host our standalone JavaScript bundle:
|
|
25
|
-
[https://libs.zappar.com/zappar-cv/3.0.1-
|
|
25
|
+
[https://libs.zappar.com/zappar-cv/3.0.1-beta.0/zappar-cv.zip](https://libs.zappar.com/zappar-cv/3.0.1-beta.0/zappar-cv.zip)
|
package/lib/additional.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CameraFrameData } from "./camera-frame-data";
|
|
2
|
-
import { zappar_face_mesh_t, zappar_face_tracker_t, zappar_pipeline_t, zappar_image_tracker_t, zappar_sequence_source_t } from "./gen/zappar";
|
|
2
|
+
import { zappar_face_mesh_t, zappar_face_tracker_t, zappar_world_tracker_t, zappar_pipeline_t, zappar_image_tracker_t, zappar_sequence_source_t } from "./gen/zappar";
|
|
3
3
|
export declare type zappar_html_element_source_t = number & {
|
|
4
4
|
_: 'zappar_html_element_source_t';
|
|
5
5
|
};
|
|
@@ -15,6 +15,7 @@ export interface Additional {
|
|
|
15
15
|
pipeline_camera_frame_data_height(pipeline: zappar_pipeline_t): number;
|
|
16
16
|
draw_plane(gl: WebGLRenderingContext, projectionMatrix: Float32Array, cameraMatrix: Float32Array, targetMatrix: Float32Array, texture: string): void;
|
|
17
17
|
draw_grid(gl: WebGLRenderingContext, projectionMatrix: Float32Array, cameraMatrix: Float32Array, targetMatrix: Float32Array): void;
|
|
18
|
+
draw_axis(gl: WebGLRenderingContext, projectionMatrix: Float32Array, cameraMatrix: Float32Array, targetMatrix: Float32Array): void;
|
|
18
19
|
image_tracker_target_image(o: zappar_image_tracker_t, indx: number): HTMLImageElement | undefined;
|
|
19
20
|
face_mesh_load_default(o: zappar_face_mesh_t): Promise<void>;
|
|
20
21
|
face_mesh_load_default_face(o: zappar_face_mesh_t, fillMouth: boolean, fillEyeL: boolean, fillEyeR: boolean): Promise<void>;
|
|
@@ -30,4 +31,5 @@ export interface Additional {
|
|
|
30
31
|
browser_incompatible_ui: () => void;
|
|
31
32
|
sequence_source_time_set: (o: zappar_sequence_source_t, ms: number) => void;
|
|
32
33
|
cookies_permitted: (p: boolean) => void;
|
|
34
|
+
world_tracker_points_data_matrix(wt: zappar_world_tracker_t, screenWidth: number, screenHeight: number, mirror: boolean): Float32Array;
|
|
33
35
|
}
|
package/lib/deserializer.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { barcode_format_t, face_landmark_name_t, instant_world_tracker_transform_orientation_t, log_level_t } from "./gen/zappar-native";
|
|
1
|
+
import { barcode_format_t, face_landmark_name_t, instant_world_tracker_transform_orientation_t, transform_orientation_t, log_level_t, plane_orientation_t, anchor_status_t } from "./gen/zappar-native";
|
|
2
2
|
interface Message {
|
|
3
3
|
int: () => number;
|
|
4
4
|
float: () => number;
|
|
@@ -8,6 +8,7 @@ interface Message {
|
|
|
8
8
|
type: () => number;
|
|
9
9
|
matrix4x4: () => Float32Array;
|
|
10
10
|
matrix3x3: () => Float32Array;
|
|
11
|
+
ucharArray: () => Uint8Array;
|
|
11
12
|
floatArray: () => Float32Array;
|
|
12
13
|
identityCoefficients: () => Float32Array;
|
|
13
14
|
expressionCoefficients: () => Float32Array;
|
|
@@ -16,6 +17,9 @@ interface Message {
|
|
|
16
17
|
barcodeFormat: () => barcode_format_t;
|
|
17
18
|
faceLandmarkName: () => face_landmark_name_t;
|
|
18
19
|
instantTrackerTransformOrientation: () => instant_world_tracker_transform_orientation_t;
|
|
20
|
+
transformOrientation: () => transform_orientation_t;
|
|
21
|
+
planeOrientation: () => plane_orientation_t;
|
|
22
|
+
anchorStatus: () => anchor_status_t;
|
|
19
23
|
logLevel: () => log_level_t;
|
|
20
24
|
}
|
|
21
25
|
export declare class MessageDeserializer {
|
package/lib/deserializer.js
CHANGED
|
@@ -40,6 +40,15 @@ export class MessageDeserializer {
|
|
|
40
40
|
this._startOffset++;
|
|
41
41
|
return ret.buffer;
|
|
42
42
|
},
|
|
43
|
+
ucharArray: () => {
|
|
44
|
+
let len = this._i32View[this._startOffset++];
|
|
45
|
+
let ret = new Uint8Array(len);
|
|
46
|
+
ret.set(this._u8View.subarray(this._startOffset * 4, this._startOffset * 4 + len));
|
|
47
|
+
this._startOffset += (ret.byteLength >> 2);
|
|
48
|
+
if ((ret.byteLength & 3) !== 0)
|
|
49
|
+
this._startOffset++;
|
|
50
|
+
return ret;
|
|
51
|
+
},
|
|
43
52
|
floatArray: () => {
|
|
44
53
|
let len = this._i32View[this._startOffset++];
|
|
45
54
|
let ret = new Float32Array(len);
|
|
@@ -85,6 +94,9 @@ export class MessageDeserializer {
|
|
|
85
94
|
barcodeFormat: () => this._i32View[this._startOffset++],
|
|
86
95
|
faceLandmarkName: () => this._i32View[this._startOffset++],
|
|
87
96
|
instantTrackerTransformOrientation: () => this._i32View[this._startOffset++],
|
|
97
|
+
transformOrientation: () => this._i32View[this._startOffset++],
|
|
98
|
+
planeOrientation: () => this._i32View[this._startOffset++],
|
|
99
|
+
anchorStatus: () => this._i32View[this._startOffset++],
|
|
88
100
|
logLevel: () => this._i32View[this._startOffset++],
|
|
89
101
|
};
|
|
90
102
|
}
|
package/lib/direct.js
CHANGED
package/lib/drawaxis.js
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { compileShader, linkProgram } from "./shader";
|
|
2
|
+
let shader;
|
|
3
|
+
let vbo;
|
|
4
|
+
let uvbo;
|
|
5
|
+
let texturesByUrl = {};
|
|
6
|
+
export function disposeDrawPlane() {
|
|
7
|
+
shader = undefined;
|
|
8
|
+
vbo = undefined;
|
|
9
|
+
uvbo = undefined;
|
|
10
|
+
texturesByUrl = {};
|
|
11
|
+
}
|
|
12
|
+
function generate(gl) {
|
|
13
|
+
if (vbo)
|
|
14
|
+
return vbo;
|
|
15
|
+
vbo = gl.createBuffer();
|
|
16
|
+
if (!vbo)
|
|
17
|
+
throw new Error("Unable to create buffer object");
|
|
18
|
+
let coords = [
|
|
19
|
+
0, 0, 0, 0.1, 0, 0,
|
|
20
|
+
0, 0, 0, 0, 0.1, 0,
|
|
21
|
+
0, 0, 0, 0, 0, 0.1
|
|
22
|
+
];
|
|
23
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
|
|
24
|
+
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(coords), gl.STATIC_DRAW);
|
|
25
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, null);
|
|
26
|
+
return vbo;
|
|
27
|
+
}
|
|
28
|
+
function generateColor(gl) {
|
|
29
|
+
if (uvbo)
|
|
30
|
+
return uvbo;
|
|
31
|
+
uvbo = gl.createBuffer();
|
|
32
|
+
if (!uvbo)
|
|
33
|
+
throw new Error("Unable to create buffer object");
|
|
34
|
+
let coords = [
|
|
35
|
+
1, 0, 0, 1, 1, 0, 0, 1,
|
|
36
|
+
0, 1, 0, 1, 0, 1, 0, 1,
|
|
37
|
+
0, 0, 1, 1, 0, 0, 1, 1
|
|
38
|
+
];
|
|
39
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, uvbo);
|
|
40
|
+
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(coords), gl.STATIC_DRAW);
|
|
41
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, null);
|
|
42
|
+
return uvbo;
|
|
43
|
+
}
|
|
44
|
+
export function drawAxis(gl, projectionMatrix, cameraMatrix, targetMatrix) {
|
|
45
|
+
let shader = getShader(gl);
|
|
46
|
+
let v = generate(gl);
|
|
47
|
+
let uvbo = generateColor(gl);
|
|
48
|
+
gl.disable(gl.DEPTH_TEST);
|
|
49
|
+
gl.useProgram(shader.prog);
|
|
50
|
+
gl.uniformMatrix4fv(shader.unif_proj, false, projectionMatrix);
|
|
51
|
+
gl.uniformMatrix4fv(shader.unif_camera, false, cameraMatrix);
|
|
52
|
+
gl.uniformMatrix4fv(shader.unif_matrix, false, targetMatrix);
|
|
53
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, v);
|
|
54
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
55
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
56
|
+
gl.vertexAttribPointer(shader.attr_position, 3, gl.FLOAT, false, 3 * 4, 0);
|
|
57
|
+
gl.enableVertexAttribArray(shader.attr_position);
|
|
58
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, uvbo);
|
|
59
|
+
gl.vertexAttribPointer(shader.attr_color, 4, gl.FLOAT, false, 4 * 4, 0);
|
|
60
|
+
gl.enableVertexAttribArray(shader.attr_color);
|
|
61
|
+
gl.lineWidth(2);
|
|
62
|
+
gl.drawArrays(gl.LINES, 0, 6);
|
|
63
|
+
gl.disableVertexAttribArray(shader.attr_position);
|
|
64
|
+
gl.disableVertexAttribArray(shader.attr_color);
|
|
65
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, null);
|
|
66
|
+
}
|
|
67
|
+
function generateLocalMatrix() {
|
|
68
|
+
let position = [0, 0, -5];
|
|
69
|
+
return new Float32Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, position[0], position[1], position[2], 1]);
|
|
70
|
+
}
|
|
71
|
+
let vertexShaderSrc = `
|
|
72
|
+
#ifndef GL_ES
|
|
73
|
+
#define highp
|
|
74
|
+
#define mediump
|
|
75
|
+
#define lowp
|
|
76
|
+
#endif
|
|
77
|
+
|
|
78
|
+
uniform mat4 projMatrix;
|
|
79
|
+
uniform mat4 cameraMatrix;
|
|
80
|
+
uniform mat4 modelViewMatrix;
|
|
81
|
+
attribute vec4 position;
|
|
82
|
+
attribute vec4 color;
|
|
83
|
+
|
|
84
|
+
varying highp vec4 vColor;
|
|
85
|
+
|
|
86
|
+
void main()
|
|
87
|
+
{
|
|
88
|
+
gl_Position = projMatrix * cameraMatrix * modelViewMatrix * position;
|
|
89
|
+
vColor = color;
|
|
90
|
+
}`;
|
|
91
|
+
let fragmentShaderSrc = `
|
|
92
|
+
#define highp mediump
|
|
93
|
+
#ifdef GL_ES
|
|
94
|
+
// define default precision for float, vec, mat.
|
|
95
|
+
precision highp float;
|
|
96
|
+
#else
|
|
97
|
+
#define highp
|
|
98
|
+
#define mediump
|
|
99
|
+
#define lowp
|
|
100
|
+
#endif
|
|
101
|
+
|
|
102
|
+
varying highp vec4 vColor;
|
|
103
|
+
|
|
104
|
+
void main()
|
|
105
|
+
{
|
|
106
|
+
gl_FragColor = vColor;
|
|
107
|
+
}`;
|
|
108
|
+
function getShader(gl) {
|
|
109
|
+
if (shader)
|
|
110
|
+
return shader;
|
|
111
|
+
let prog = gl.createProgram();
|
|
112
|
+
if (!prog)
|
|
113
|
+
throw new Error("Unable to create program");
|
|
114
|
+
let vertexShader = compileShader(gl, gl.VERTEX_SHADER, vertexShaderSrc);
|
|
115
|
+
let fragmentShader = compileShader(gl, gl.FRAGMENT_SHADER, fragmentShaderSrc);
|
|
116
|
+
gl.attachShader(prog, vertexShader);
|
|
117
|
+
gl.attachShader(prog, fragmentShader);
|
|
118
|
+
linkProgram(gl, prog);
|
|
119
|
+
let unif_proj = gl.getUniformLocation(prog, "projMatrix");
|
|
120
|
+
if (!unif_proj)
|
|
121
|
+
throw new Error("Unable to get uniform location projMatrix");
|
|
122
|
+
let unif_matrix = gl.getUniformLocation(prog, "modelViewMatrix");
|
|
123
|
+
if (!unif_matrix)
|
|
124
|
+
throw new Error("Unable to get uniform location modelViewMatrix");
|
|
125
|
+
let unif_camera = gl.getUniformLocation(prog, "cameraMatrix");
|
|
126
|
+
if (!unif_camera)
|
|
127
|
+
throw new Error("Unable to get uniform location cameraMatrix");
|
|
128
|
+
shader = {
|
|
129
|
+
prog,
|
|
130
|
+
unif_matrix,
|
|
131
|
+
unif_proj,
|
|
132
|
+
unif_camera,
|
|
133
|
+
attr_position: gl.getAttribLocation(prog, "position"),
|
|
134
|
+
attr_color: gl.getAttribLocation(prog, "color")
|
|
135
|
+
};
|
|
136
|
+
return shader;
|
|
137
|
+
}
|
package/lib/drawgrid.js
CHANGED
|
@@ -2,6 +2,7 @@ import { compileShader, linkProgram } from "./shader";
|
|
|
2
2
|
let shader;
|
|
3
3
|
let vbo;
|
|
4
4
|
let uvbo;
|
|
5
|
+
const gridSize = 10;
|
|
5
6
|
export function disposeDrawGrid() {
|
|
6
7
|
shader = undefined;
|
|
7
8
|
vbo = undefined;
|
|
@@ -19,6 +20,7 @@ function generate(gl) {
|
|
|
19
20
|
0.5, 0, 0.5,
|
|
20
21
|
0.5, 0, -0.5
|
|
21
22
|
];
|
|
23
|
+
coords = coords.map(entry => entry * gridSize);
|
|
22
24
|
gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
|
|
23
25
|
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(coords), gl.STATIC_DRAW);
|
|
24
26
|
gl.bindBuffer(gl.ARRAY_BUFFER, null);
|
|
@@ -36,6 +38,7 @@ function generateUVBO(gl) {
|
|
|
36
38
|
1, 1,
|
|
37
39
|
1, 0
|
|
38
40
|
];
|
|
41
|
+
coords = coords.map(entry => entry * gridSize);
|
|
39
42
|
gl.bindBuffer(gl.ARRAY_BUFFER, uvbo);
|
|
40
43
|
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(coords), gl.STATIC_DRAW);
|
|
41
44
|
gl.bindBuffer(gl.ARRAY_BUFFER, null);
|
|
@@ -97,8 +100,8 @@ uniform sampler2D skinSampler;
|
|
|
97
100
|
|
|
98
101
|
void main()
|
|
99
102
|
{
|
|
100
|
-
vec2 pixels =
|
|
101
|
-
if ((int(mod(pixels.x,
|
|
103
|
+
vec2 pixels = 500.0 * vTextureCoord + 0.5;
|
|
104
|
+
if ((int(mod(pixels.x, 50.0)) == 0) || (int(mod(pixels.y, 50.0)) == 0)) {
|
|
102
105
|
gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);
|
|
103
106
|
} else {
|
|
104
107
|
discard;
|
package/lib/drawpoints.d.ts
CHANGED
|
@@ -8,3 +8,4 @@ export declare class PointsDraw {
|
|
|
8
8
|
drawPoints(screenWidth: number, screenHeight: number, dataWidth: number, dataHeight: number, points: Float32Array, mirror: boolean, color: [number, number, number], pointSize: number): void;
|
|
9
9
|
private _getCameraShader;
|
|
10
10
|
}
|
|
11
|
+
export declare function getPointsDataMatrix(frameWidth: number, frameHeight: number, screenWidth: number, screenHeight: number, mirror: boolean): Float32Array;
|
package/lib/drawpoints.js
CHANGED
|
@@ -48,7 +48,7 @@ export class PointsDraw {
|
|
|
48
48
|
gl.useProgram(shader.prog);
|
|
49
49
|
gl.uniform3f(shader.unif_color, color[0], color[1], color[2]);
|
|
50
50
|
gl.uniform1f(shader.unif_pointSize, pointSize);
|
|
51
|
-
gl.uniformMatrix4fv(shader.unif_skinTexTransform, false,
|
|
51
|
+
gl.uniformMatrix4fv(shader.unif_skinTexTransform, false, getPointsDataMatrix(dataWidth, dataHeight, screenWidth, screenHeight, mirror));
|
|
52
52
|
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
53
53
|
gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
|
|
54
54
|
gl.vertexAttribPointer(shader.attr_position, 2, gl.FLOAT, false, 0, 0);
|
|
@@ -157,7 +157,7 @@ function cameraRotationForScreenOrientation() {
|
|
|
157
157
|
}
|
|
158
158
|
return 0;
|
|
159
159
|
}
|
|
160
|
-
function
|
|
160
|
+
export function getPointsDataMatrix(frameWidth, frameHeight, screenWidth, screenHeight, mirror) {
|
|
161
161
|
let ret = mat4.create();
|
|
162
162
|
let trans = mat4.create();
|
|
163
163
|
// Translate to centre UV coords
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare class PointsWithTypeDraw {
|
|
2
|
+
private _gl;
|
|
3
|
+
private _vbo;
|
|
4
|
+
private _typebo;
|
|
5
|
+
private _shader;
|
|
6
|
+
constructor(_gl: WebGL2RenderingContext);
|
|
7
|
+
dispose(): void;
|
|
8
|
+
private _generate;
|
|
9
|
+
private _generateTypes;
|
|
10
|
+
drawPoints(screenWidth: number, screenHeight: number, dataWidth: number, dataHeight: number, points: Float32Array, mirror: boolean, type: Uint8Array, pointSize: number): void;
|
|
11
|
+
private _getCameraShader;
|
|
12
|
+
}
|
|
13
|
+
export declare function getPointsDataMatrix(frameWidth: number, frameHeight: number, screenWidth: number, screenHeight: number, mirror: boolean): Float32Array;
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { profile } from "./profile";
|
|
2
|
+
import { compileShader, linkProgram } from "./shader";
|
|
3
|
+
import { mat4 } from "gl-matrix";
|
|
4
|
+
let identity = mat4.create();
|
|
5
|
+
export class PointsWithTypeDraw {
|
|
6
|
+
constructor(_gl) {
|
|
7
|
+
this._gl = _gl;
|
|
8
|
+
}
|
|
9
|
+
dispose() {
|
|
10
|
+
if (this._vbo)
|
|
11
|
+
this._gl.deleteBuffer(this._vbo);
|
|
12
|
+
this._vbo = undefined;
|
|
13
|
+
if (this._shader)
|
|
14
|
+
this._gl.deleteProgram(this._shader.prog);
|
|
15
|
+
this._shader = undefined;
|
|
16
|
+
}
|
|
17
|
+
_generate(gl, points) {
|
|
18
|
+
if (!this._vbo)
|
|
19
|
+
this._vbo = gl.createBuffer();
|
|
20
|
+
if (!this._vbo)
|
|
21
|
+
throw new Error("Unable to create buffer object");
|
|
22
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, this._vbo);
|
|
23
|
+
gl.bufferData(gl.ARRAY_BUFFER, points, gl.DYNAMIC_DRAW);
|
|
24
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, null);
|
|
25
|
+
return this._vbo;
|
|
26
|
+
}
|
|
27
|
+
_generateTypes(gl, points) {
|
|
28
|
+
if (!this._typebo)
|
|
29
|
+
this._typebo = gl.createBuffer();
|
|
30
|
+
if (!this._typebo)
|
|
31
|
+
throw new Error("Unable to create buffer object");
|
|
32
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, this._typebo);
|
|
33
|
+
gl.bufferData(gl.ARRAY_BUFFER, points, gl.DYNAMIC_DRAW);
|
|
34
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, null);
|
|
35
|
+
return this._typebo;
|
|
36
|
+
}
|
|
37
|
+
drawPoints(screenWidth, screenHeight, dataWidth, dataHeight, points, mirror, type, pointSize) {
|
|
38
|
+
if (points.length === 0)
|
|
39
|
+
return; // points = new Float32Array([0, 1, 0, 1]);
|
|
40
|
+
let gl = this._gl;
|
|
41
|
+
const reenableDepthTest = gl.isEnabled(gl.DEPTH_TEST);
|
|
42
|
+
const reenableScissorTest = gl.isEnabled(gl.SCISSOR_TEST);
|
|
43
|
+
const reenableCullFace = gl.isEnabled(gl.CULL_FACE);
|
|
44
|
+
const reenableStencilTest = gl.isEnabled(gl.STENCIL_TEST);
|
|
45
|
+
const reenableBlend = gl.isEnabled(gl.BLEND);
|
|
46
|
+
const previousBoundTexture = gl.getParameter(gl.TEXTURE_BINDING_2D);
|
|
47
|
+
const previousBoundFramebuffer = gl.getParameter(gl.FRAMEBUFFER_BINDING);
|
|
48
|
+
const previousProgram = gl.getParameter(gl.CURRENT_PROGRAM);
|
|
49
|
+
const previousActiveTexture = gl.getParameter(gl.ACTIVE_TEXTURE);
|
|
50
|
+
gl.disable(gl.DEPTH_TEST);
|
|
51
|
+
gl.disable(gl.SCISSOR_TEST);
|
|
52
|
+
gl.disable(gl.CULL_FACE);
|
|
53
|
+
gl.disable(gl.STENCIL_TEST);
|
|
54
|
+
gl.disable(gl.BLEND);
|
|
55
|
+
let shader = this._getCameraShader(gl);
|
|
56
|
+
let vbo = this._generate(gl, points);
|
|
57
|
+
let typebo = this._generateTypes(gl, type);
|
|
58
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
59
|
+
gl.useProgram(shader.prog);
|
|
60
|
+
gl.uniform1f(shader.unif_pointSize, pointSize);
|
|
61
|
+
gl.uniformMatrix4fv(shader.unif_skinTexTransform, false, getPointsDataMatrix(dataWidth, dataHeight, screenWidth, screenHeight, mirror));
|
|
62
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
63
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
|
|
64
|
+
gl.vertexAttribPointer(shader.attr_position, 2, gl.FLOAT, false, 0, 0);
|
|
65
|
+
gl.enableVertexAttribArray(shader.attr_position);
|
|
66
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, typebo);
|
|
67
|
+
gl.vertexAttribIPointer(shader.attr_type, 1, gl.UNSIGNED_BYTE, 0, 0);
|
|
68
|
+
gl.enableVertexAttribArray(shader.attr_type);
|
|
69
|
+
gl.drawArrays(gl.POINTS, 0, points.length / 2);
|
|
70
|
+
gl.disableVertexAttribArray(shader.attr_type);
|
|
71
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
|
|
72
|
+
gl.disableVertexAttribArray(shader.attr_position);
|
|
73
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, previousBoundFramebuffer);
|
|
74
|
+
gl.useProgram(previousProgram);
|
|
75
|
+
gl.bindTexture(gl.TEXTURE_2D, previousBoundTexture);
|
|
76
|
+
gl.activeTexture(previousActiveTexture);
|
|
77
|
+
if (reenableBlend)
|
|
78
|
+
gl.enable(gl.BLEND);
|
|
79
|
+
if (reenableCullFace)
|
|
80
|
+
gl.enable(gl.CULL_FACE);
|
|
81
|
+
if (reenableDepthTest)
|
|
82
|
+
gl.enable(gl.DEPTH_TEST);
|
|
83
|
+
if (reenableScissorTest)
|
|
84
|
+
gl.enable(gl.SCISSOR_TEST);
|
|
85
|
+
if (reenableStencilTest)
|
|
86
|
+
gl.enable(gl.STENCIL_TEST);
|
|
87
|
+
}
|
|
88
|
+
_getCameraShader(gl) {
|
|
89
|
+
if (this._shader)
|
|
90
|
+
return this._shader;
|
|
91
|
+
let prog = gl.createProgram();
|
|
92
|
+
if (!prog)
|
|
93
|
+
throw new Error("Unable to create program");
|
|
94
|
+
let vertexShader = compileShader(gl, gl.VERTEX_SHADER, vertexShaderSrc);
|
|
95
|
+
let fragmentShader = compileShader(gl, gl.FRAGMENT_SHADER, fragmentShaderSrc);
|
|
96
|
+
gl.attachShader(prog, vertexShader);
|
|
97
|
+
gl.attachShader(prog, fragmentShader);
|
|
98
|
+
linkProgram(gl, prog);
|
|
99
|
+
let unif_skinTexTransform = gl.getUniformLocation(prog, "skinTexTransform");
|
|
100
|
+
if (!unif_skinTexTransform)
|
|
101
|
+
throw new Error("Unable to get uniform location skinTexTransform");
|
|
102
|
+
let unif_pointSize = gl.getUniformLocation(prog, "pointSize");
|
|
103
|
+
if (!unif_pointSize)
|
|
104
|
+
throw new Error("Unable to get uniform location pointSize");
|
|
105
|
+
this._shader = {
|
|
106
|
+
prog,
|
|
107
|
+
unif_skinTexTransform,
|
|
108
|
+
unif_pointSize,
|
|
109
|
+
attr_position: gl.getAttribLocation(prog, "pos"),
|
|
110
|
+
attr_type: gl.getAttribLocation(prog, "aType"),
|
|
111
|
+
};
|
|
112
|
+
return this._shader;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
let vertexShaderSrc = `#version 300 es
|
|
116
|
+
|
|
117
|
+
in vec2 pos;
|
|
118
|
+
in uint aType;
|
|
119
|
+
uniform mat4 skinTexTransform;
|
|
120
|
+
uniform float pointSize;
|
|
121
|
+
|
|
122
|
+
out vec4 vColor;
|
|
123
|
+
|
|
124
|
+
void main()
|
|
125
|
+
{
|
|
126
|
+
gl_Position = skinTexTransform * vec4(pos, 0.0, 1.0);
|
|
127
|
+
vColor = vec4(1.0, 0.0, 0.0, 1.0);
|
|
128
|
+
if (aType == 1u) {
|
|
129
|
+
vColor = vec4(1.0, 0.7, 0.0, 1.0);
|
|
130
|
+
} else if (aType >= 4u) {
|
|
131
|
+
vColor = vec4(0.0, 0.0, 1.0, 1.0);
|
|
132
|
+
} else if (aType > 1u) {
|
|
133
|
+
vColor = vec4(0.0, 1.0, 0.0, 1.0);
|
|
134
|
+
}
|
|
135
|
+
gl_PointSize = pointSize;
|
|
136
|
+
}`;
|
|
137
|
+
let fragmentShaderSrc = `#version 300 es
|
|
138
|
+
precision highp float;
|
|
139
|
+
|
|
140
|
+
in vec4 vColor;
|
|
141
|
+
out vec4 outColor;
|
|
142
|
+
|
|
143
|
+
void main()
|
|
144
|
+
{
|
|
145
|
+
outColor = vColor;
|
|
146
|
+
}`;
|
|
147
|
+
function cameraRotationForScreenOrientation() {
|
|
148
|
+
if (window.screen.orientation && !profile.forceWindowOrientation) {
|
|
149
|
+
switch (window.screen.orientation.type) {
|
|
150
|
+
case "portrait-primary":
|
|
151
|
+
return 270;
|
|
152
|
+
case "landscape-secondary":
|
|
153
|
+
return 180;
|
|
154
|
+
case "portrait-secondary":
|
|
155
|
+
return 90;
|
|
156
|
+
default:
|
|
157
|
+
return 0;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
else if (window.orientation !== undefined) {
|
|
161
|
+
switch (window.orientation) {
|
|
162
|
+
case 0: return 270;
|
|
163
|
+
case 90: return 0;
|
|
164
|
+
case 180: return 90;
|
|
165
|
+
case -90: return 180;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return 0;
|
|
169
|
+
}
|
|
170
|
+
export function getPointsDataMatrix(frameWidth, frameHeight, screenWidth, screenHeight, mirror) {
|
|
171
|
+
let ret = mat4.create();
|
|
172
|
+
let trans = mat4.create();
|
|
173
|
+
// Translate to centre UV coords
|
|
174
|
+
mat4.fromTranslation(trans, [-0.5 * frameWidth, -0.5 * frameHeight, 0]);
|
|
175
|
+
mat4.multiply(ret, trans, ret);
|
|
176
|
+
mat4.fromScaling(trans, [2 / frameWidth, 2 / -frameHeight, 1]);
|
|
177
|
+
mat4.multiply(ret, trans, ret);
|
|
178
|
+
if (mirror) {
|
|
179
|
+
mat4.fromScaling(trans, [-1, 1, 1]);
|
|
180
|
+
mat4.multiply(ret, trans, ret);
|
|
181
|
+
}
|
|
182
|
+
let screenAspect = screenWidth > screenHeight ? (screenWidth / screenHeight) : (screenHeight / screenWidth);
|
|
183
|
+
let frameAspect = frameWidth / frameHeight;
|
|
184
|
+
mat4.fromScaling(trans, [1, screenAspect / frameAspect, 1]);
|
|
185
|
+
mat4.multiply(ret, trans, ret);
|
|
186
|
+
// Apply rotation back into ZCV's landscape space
|
|
187
|
+
mat4.fromRotation(trans, cameraRotationForScreenOrientation() * Math.PI / 180.0, [0, 0, 1]);
|
|
188
|
+
mat4.multiply(ret, trans, ret);
|
|
189
|
+
return ret;
|
|
190
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { compileShader, linkProgram } from "./shader";
|
|
2
|
+
let shader;
|
|
3
|
+
export class PolygonDraw {
|
|
4
|
+
_generate(gl, points) {
|
|
5
|
+
if (!this._vbo) {
|
|
6
|
+
this._vbo = gl.createBuffer();
|
|
7
|
+
}
|
|
8
|
+
if (!this._vbo)
|
|
9
|
+
throw new Error("Unable to create buffer object");
|
|
10
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, this._vbo);
|
|
11
|
+
gl.bufferData(gl.ARRAY_BUFFER, points, gl.DYNAMIC_DRAW);
|
|
12
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, null);
|
|
13
|
+
return this._vbo;
|
|
14
|
+
}
|
|
15
|
+
drawPolygon(gl, projectionMatrix, cameraMatrix, targetMatrix, points) {
|
|
16
|
+
let shader = getShader(gl);
|
|
17
|
+
let v = this._generate(gl, points);
|
|
18
|
+
gl.disable(gl.DEPTH_TEST);
|
|
19
|
+
gl.disable(gl.SCISSOR_TEST);
|
|
20
|
+
gl.disable(gl.CULL_FACE);
|
|
21
|
+
gl.disable(gl.STENCIL_TEST);
|
|
22
|
+
gl.disable(gl.BLEND);
|
|
23
|
+
gl.useProgram(shader.prog);
|
|
24
|
+
gl.uniformMatrix4fv(shader.unif_proj, false, projectionMatrix);
|
|
25
|
+
gl.uniformMatrix4fv(shader.unif_camera, false, cameraMatrix);
|
|
26
|
+
gl.uniformMatrix4fv(shader.unif_matrix, false, targetMatrix);
|
|
27
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, v);
|
|
28
|
+
gl.vertexAttribPointer(shader.attr_position, 2, gl.FLOAT, false, 0, 0);
|
|
29
|
+
gl.enableVertexAttribArray(shader.attr_position);
|
|
30
|
+
gl.drawArrays(gl.LINE_LOOP, 0, points.length / 2);
|
|
31
|
+
gl.disableVertexAttribArray(shader.attr_position);
|
|
32
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, null);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
let vertexShaderSrc = `
|
|
36
|
+
#ifndef GL_ES
|
|
37
|
+
#define highp
|
|
38
|
+
#define mediump
|
|
39
|
+
#define lowp
|
|
40
|
+
#endif
|
|
41
|
+
|
|
42
|
+
uniform mat4 projMatrix;
|
|
43
|
+
uniform mat4 cameraMatrix;
|
|
44
|
+
uniform mat4 modelViewMatrix;
|
|
45
|
+
attribute vec2 position;
|
|
46
|
+
|
|
47
|
+
void main()
|
|
48
|
+
{
|
|
49
|
+
gl_Position = projMatrix * cameraMatrix * modelViewMatrix * vec4(position.x, 0.0, position.y, 1.0);
|
|
50
|
+
}`;
|
|
51
|
+
let fragmentShaderSrc = `
|
|
52
|
+
#define highp mediump
|
|
53
|
+
#ifdef GL_ES
|
|
54
|
+
// define default precision for float, vec, mat.
|
|
55
|
+
precision highp float;
|
|
56
|
+
#else
|
|
57
|
+
#define highp
|
|
58
|
+
#define mediump
|
|
59
|
+
#define lowp
|
|
60
|
+
#endif
|
|
61
|
+
|
|
62
|
+
void main()
|
|
63
|
+
{
|
|
64
|
+
gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
|
|
65
|
+
}`;
|
|
66
|
+
function getShader(gl) {
|
|
67
|
+
if (shader)
|
|
68
|
+
return shader;
|
|
69
|
+
let prog = gl.createProgram();
|
|
70
|
+
if (!prog)
|
|
71
|
+
throw new Error("Unable to create program");
|
|
72
|
+
let vertexShader = compileShader(gl, gl.VERTEX_SHADER, vertexShaderSrc);
|
|
73
|
+
let fragmentShader = compileShader(gl, gl.FRAGMENT_SHADER, fragmentShaderSrc);
|
|
74
|
+
gl.attachShader(prog, vertexShader);
|
|
75
|
+
gl.attachShader(prog, fragmentShader);
|
|
76
|
+
linkProgram(gl, prog);
|
|
77
|
+
let unif_proj = gl.getUniformLocation(prog, "projMatrix");
|
|
78
|
+
if (!unif_proj)
|
|
79
|
+
throw new Error("Unable to get uniform location projMatrix");
|
|
80
|
+
let unif_matrix = gl.getUniformLocation(prog, "modelViewMatrix");
|
|
81
|
+
if (!unif_matrix)
|
|
82
|
+
throw new Error("Unable to get uniform location modelViewMatrix");
|
|
83
|
+
let unif_camera = gl.getUniformLocation(prog, "cameraMatrix");
|
|
84
|
+
if (!unif_camera)
|
|
85
|
+
throw new Error("Unable to get uniform location cameraMatrix");
|
|
86
|
+
shader = {
|
|
87
|
+
prog,
|
|
88
|
+
unif_matrix,
|
|
89
|
+
unif_proj,
|
|
90
|
+
unif_camera,
|
|
91
|
+
attr_position: gl.getAttribLocation(prog, "position"),
|
|
92
|
+
};
|
|
93
|
+
return shader;
|
|
94
|
+
}
|