@openglobus/og 0.13.4 → 0.13.5
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/dist/@openglobus/og.esm.js +2 -2
- package/dist/@openglobus/og.esm.js.map +1 -1
- package/dist/@openglobus/og.umd.js +2 -2
- package/dist/@openglobus/og.umd.js.map +1 -1
- package/package.json +1 -1
- package/src/og/entity/Billboard.js +165 -165
- package/src/og/entity/BillboardHandler.js +1 -1
- package/src/og/entity/Geometry.js +319 -319
- package/src/og/entity/Label.js +348 -346
- package/src/og/entity/LabelHandler.js +44 -37
- package/src/og/shaders/label.js +56 -13
- package/src/og/utils/FontAtlas.js +25 -15
- package/src/og/utils/TextureAtlas.js +291 -280
- package/types/entity/Label.d.ts +1 -0
- package/types/entity/LabelHandler.d.ts +1 -1
- package/types/utils/TextureAtlas.d.ts +2 -0
|
@@ -24,6 +24,9 @@ const OUTLINECOLOR_BUFFER = 10;
|
|
|
24
24
|
|
|
25
25
|
window.LABEL_DEPTH_OFFSET = -0;
|
|
26
26
|
|
|
27
|
+
const EMPTY = -1.0;
|
|
28
|
+
const RTL = 1.0;
|
|
29
|
+
|
|
27
30
|
/*
|
|
28
31
|
* og.LabelHandler
|
|
29
32
|
*
|
|
@@ -201,6 +204,8 @@ class LabelHandler extends BillboardHandler {
|
|
|
201
204
|
var gl = h.gl,
|
|
202
205
|
ec = this._entityCollection;
|
|
203
206
|
|
|
207
|
+
gl.disable(gl.CULL_FACE);
|
|
208
|
+
|
|
204
209
|
gl.uniform1iv(shu.fontTextureArr, r.fontAtlas.samplerArr);
|
|
205
210
|
gl.uniform4fv(shu.sdfParamsArr, r.fontAtlas.sdfParamsArr);
|
|
206
211
|
gl.uniformMatrix4fv(shu.viewMatrix, false, r.activeCamera._viewMatrix._m);
|
|
@@ -264,6 +269,8 @@ class LabelHandler extends BillboardHandler {
|
|
|
264
269
|
gl.drawArrays(gl.TRIANGLES, 0, this._vertexBuffer.numItems);
|
|
265
270
|
|
|
266
271
|
gl.depthFunc(gl.LESS);
|
|
272
|
+
|
|
273
|
+
gl.enable(gl.CULL_FACE);
|
|
267
274
|
}
|
|
268
275
|
|
|
269
276
|
_pickingPASS() {
|
|
@@ -359,7 +366,10 @@ class LabelHandler extends BillboardHandler {
|
|
|
359
366
|
label._isReady = false;
|
|
360
367
|
}
|
|
361
368
|
|
|
362
|
-
setText(index, text, fontIndex, align) {
|
|
369
|
+
setText(index, text, fontIndex, align, isRTL = false) {
|
|
370
|
+
|
|
371
|
+
text = text.normalize('NFKC');
|
|
372
|
+
|
|
363
373
|
var fa = this._renderer.fontAtlas.atlasesArr[fontIndex];
|
|
364
374
|
|
|
365
375
|
if (!fa) return;
|
|
@@ -370,15 +380,19 @@ class LabelHandler extends BillboardHandler {
|
|
|
370
380
|
|
|
371
381
|
let c = 0;
|
|
372
382
|
|
|
373
|
-
let n = fa.nodes[text[c]];
|
|
374
|
-
let offset = 0.0;
|
|
375
383
|
let len = Math.min(this._maxLetters, text.length);
|
|
384
|
+
let _rtl_ = 0.0;
|
|
385
|
+
if (isRTL) {
|
|
386
|
+
_rtl_ = RTL;
|
|
387
|
+
}
|
|
388
|
+
let n = fa.get(text[c].charCodeAt());
|
|
389
|
+
let offset = 0.0;
|
|
376
390
|
let kern = fa.kernings;
|
|
377
391
|
|
|
378
392
|
for (c = 0; c < len; c++) {
|
|
379
393
|
let j = i + c * 24;
|
|
380
394
|
let char = text[c];
|
|
381
|
-
n = fa.
|
|
395
|
+
n = fa.get(char.charCodeAt()) || fa.get(" ".charCodeAt());
|
|
382
396
|
let tc = n.texCoords;
|
|
383
397
|
|
|
384
398
|
let m = n.metrics;
|
|
@@ -386,32 +400,32 @@ class LabelHandler extends BillboardHandler {
|
|
|
386
400
|
a[j] = tc[0];
|
|
387
401
|
a[j + 1] = tc[1];
|
|
388
402
|
a[j + 2] = offset;
|
|
389
|
-
a[j + 3] =
|
|
403
|
+
a[j + 3] = _rtl_;
|
|
390
404
|
|
|
391
405
|
a[j + 4] = tc[2];
|
|
392
406
|
a[j + 5] = tc[3];
|
|
393
407
|
a[j + 6] = offset;
|
|
394
|
-
a[j + 7] =
|
|
408
|
+
a[j + 7] = _rtl_;
|
|
395
409
|
|
|
396
410
|
a[j + 8] = tc[4];
|
|
397
411
|
a[j + 9] = tc[5];
|
|
398
412
|
a[j + 10] = offset;
|
|
399
|
-
a[j + 11] =
|
|
413
|
+
a[j + 11] = _rtl_;
|
|
400
414
|
|
|
401
415
|
a[j + 12] = tc[6];
|
|
402
416
|
a[j + 13] = tc[7];
|
|
403
417
|
a[j + 14] = offset;
|
|
404
|
-
a[j + 15] =
|
|
418
|
+
a[j + 15] = _rtl_;
|
|
405
419
|
|
|
406
420
|
a[j + 16] = tc[8];
|
|
407
421
|
a[j + 17] = tc[9];
|
|
408
422
|
a[j + 18] = offset;
|
|
409
|
-
a[j + 19] =
|
|
423
|
+
a[j + 19] = _rtl_;
|
|
410
424
|
|
|
411
425
|
a[j + 20] = tc[10];
|
|
412
426
|
a[j + 21] = tc[11];
|
|
413
427
|
a[j + 22] = offset;
|
|
414
|
-
a[j + 23] =
|
|
428
|
+
a[j + 23] = _rtl_;
|
|
415
429
|
|
|
416
430
|
//
|
|
417
431
|
// Gliph
|
|
@@ -446,9 +460,9 @@ class LabelHandler extends BillboardHandler {
|
|
|
446
460
|
g[j + 22] = m.nXOffset;
|
|
447
461
|
g[j + 23] = m.nYOffset;
|
|
448
462
|
|
|
449
|
-
let k = kern[char];
|
|
450
|
-
if (k) {
|
|
451
|
-
k = k[text[c + 1]];
|
|
463
|
+
let k = kern[char.charCodeAt()];
|
|
464
|
+
if (k && text[c + 1]) {
|
|
465
|
+
k = k[text[c + 1].charCodeAt()];
|
|
452
466
|
if (k) {
|
|
453
467
|
offset += m.nAdvance + k;
|
|
454
468
|
} else {
|
|
@@ -464,33 +478,23 @@ class LabelHandler extends BillboardHandler {
|
|
|
464
478
|
offset *= -0.5;
|
|
465
479
|
for (c = 0; c < len; c++) {
|
|
466
480
|
let j = i + c * 24;
|
|
467
|
-
a[j +
|
|
468
|
-
a[j +
|
|
469
|
-
a[j +
|
|
470
|
-
a[j +
|
|
471
|
-
a[j +
|
|
472
|
-
a[j +
|
|
473
|
-
}
|
|
474
|
-
} else if (align === ALIGN.LEFT) {
|
|
475
|
-
for (c = 0; c < len; c++) {
|
|
476
|
-
let j = i + c * 24;
|
|
477
|
-
a[j + 3] = 0;
|
|
478
|
-
a[j + 7] = 0;
|
|
479
|
-
a[j + 11] = 0;
|
|
480
|
-
a[j + 15] = 0;
|
|
481
|
-
a[j + 19] = 0;
|
|
482
|
-
a[j + 23] = 0;
|
|
481
|
+
a[j + 2] += offset;
|
|
482
|
+
a[j + 6] += offset;
|
|
483
|
+
a[j + 10] += offset;
|
|
484
|
+
a[j + 14] += offset;
|
|
485
|
+
a[j + 18] += offset;
|
|
486
|
+
a[j + 22] += offset;
|
|
483
487
|
}
|
|
484
488
|
}
|
|
485
489
|
|
|
486
490
|
for (; c < this._maxLetters; c++) {
|
|
487
491
|
let j = i + c * 24;
|
|
488
|
-
a[j +
|
|
489
|
-
a[j +
|
|
490
|
-
a[j +
|
|
491
|
-
a[j +
|
|
492
|
-
a[j +
|
|
493
|
-
a[j +
|
|
492
|
+
a[j + 3] = EMPTY;
|
|
493
|
+
a[j + 7] = EMPTY;
|
|
494
|
+
a[j + 11] = EMPTY;
|
|
495
|
+
a[j + 15] = EMPTY;
|
|
496
|
+
a[j + 19] = EMPTY;
|
|
497
|
+
a[j + 23] = EMPTY;
|
|
494
498
|
}
|
|
495
499
|
|
|
496
500
|
this._changedBuffers[TEXCOORD_BUFFER] = true;
|
|
@@ -793,19 +797,22 @@ class LabelHandler extends BillboardHandler {
|
|
|
793
797
|
|
|
794
798
|
for (var q = 0; q < this._maxLetters; q++) {
|
|
795
799
|
var j = i + q * 12;
|
|
800
|
+
|
|
796
801
|
a[j] = vertexArr[0];
|
|
797
802
|
a[j + 1] = vertexArr[1];
|
|
798
|
-
a[j + 2] = vertexArr[2];
|
|
799
803
|
|
|
804
|
+
a[j + 2] = vertexArr[2];
|
|
800
805
|
a[j + 3] = vertexArr[3];
|
|
806
|
+
|
|
801
807
|
a[j + 4] = vertexArr[4];
|
|
802
808
|
a[j + 5] = vertexArr[5];
|
|
803
809
|
|
|
804
810
|
a[j + 6] = vertexArr[6];
|
|
805
811
|
a[j + 7] = vertexArr[7];
|
|
806
|
-
a[j + 8] = vertexArr[8];
|
|
807
812
|
|
|
813
|
+
a[j + 8] = vertexArr[8];
|
|
808
814
|
a[j + 9] = vertexArr[9];
|
|
815
|
+
|
|
809
816
|
a[j + 10] = vertexArr[10];
|
|
810
817
|
a[j + 11] = vertexArr[11];
|
|
811
818
|
}
|
package/src/og/shaders/label.js
CHANGED
|
@@ -6,6 +6,10 @@
|
|
|
6
6
|
|
|
7
7
|
import { Program } from '../webgl/Program.js';
|
|
8
8
|
|
|
9
|
+
const DEFINE = `
|
|
10
|
+
#define EMPTY -1.0
|
|
11
|
+
#define RTL 1.0`;
|
|
12
|
+
|
|
9
13
|
const PROJECT = `vec2 project(vec4 p) {
|
|
10
14
|
return (0.5 * p.xyz / p.w + 0.5).xy * viewport;
|
|
11
15
|
}`;
|
|
@@ -47,7 +51,9 @@ export function label_webgl2() {
|
|
|
47
51
|
},
|
|
48
52
|
vertexShader:
|
|
49
53
|
`#version 300 es
|
|
50
|
-
|
|
54
|
+
|
|
55
|
+
${DEFINE}
|
|
56
|
+
|
|
51
57
|
in float a_outline;
|
|
52
58
|
in vec4 a_gliphParam;
|
|
53
59
|
in vec2 a_vertices;
|
|
@@ -77,14 +83,14 @@ export function label_webgl2() {
|
|
|
77
83
|
uniform float depthOffset;
|
|
78
84
|
|
|
79
85
|
const vec3 ZERO3 = vec3(0.0);
|
|
80
|
-
|
|
86
|
+
|
|
81
87
|
${PROJECT}
|
|
82
88
|
|
|
83
89
|
${ROTATE2D}
|
|
84
90
|
|
|
85
91
|
void main() {
|
|
86
92
|
|
|
87
|
-
if(a_texCoord.
|
|
93
|
+
if(a_texCoord.w == EMPTY) {
|
|
88
94
|
gl_Position = vec4(0.0);
|
|
89
95
|
return;
|
|
90
96
|
}
|
|
@@ -95,7 +101,7 @@ export function label_webgl2() {
|
|
|
95
101
|
v_outline = a_outline;
|
|
96
102
|
|
|
97
103
|
v_fontIndex = int(a_fontIndex);
|
|
98
|
-
v_uv =
|
|
104
|
+
v_uv = a_texCoord.xy;
|
|
99
105
|
vec3 look = a_positions - cameraPos;
|
|
100
106
|
float lookDist = length(look);
|
|
101
107
|
v_rgba = a_rgba;
|
|
@@ -127,8 +133,18 @@ export function label_webgl2() {
|
|
|
127
133
|
projPos.z += depthOffset + a_offset.z;
|
|
128
134
|
|
|
129
135
|
vec2 screenPos = project(projPos);
|
|
130
|
-
|
|
131
|
-
vec2
|
|
136
|
+
|
|
137
|
+
vec2 vert = a_vertices;
|
|
138
|
+
vec4 gp = a_gliphParam;
|
|
139
|
+
if(a_texCoord.w == RTL){
|
|
140
|
+
vert.x = step(vert.x * 0.5 + 1.0, 1.0);
|
|
141
|
+
gp.x = -a_gliphParam.x;
|
|
142
|
+
gp.z = -(a_gliphParam.z + a_texCoord.z);
|
|
143
|
+
}else{
|
|
144
|
+
gp.z = a_gliphParam.z + a_texCoord.z;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
vec2 v = screenPos + rotate2d(a_rotation) * ((vert * gp.xy + gp.zw) * a_size * scd + a_offset.xy);
|
|
132
148
|
|
|
133
149
|
gl_Position = vec4((2.0 * v / viewport - 1.0) * projPos.w, projPos.z, projPos.w);
|
|
134
150
|
}`,
|
|
@@ -270,7 +286,9 @@ export function label_screen() {
|
|
|
270
286
|
a_fontIndex: "float"
|
|
271
287
|
},
|
|
272
288
|
vertexShader:
|
|
273
|
-
`
|
|
289
|
+
`
|
|
290
|
+
${DEFINE}
|
|
291
|
+
|
|
274
292
|
attribute float a_outline;
|
|
275
293
|
attribute vec4 a_gliphParam;
|
|
276
294
|
attribute vec2 a_vertices;
|
|
@@ -306,7 +324,7 @@ export function label_screen() {
|
|
|
306
324
|
|
|
307
325
|
void main() {
|
|
308
326
|
|
|
309
|
-
if(a_texCoord.
|
|
327
|
+
if(a_texCoord.w == EMPTY) {
|
|
310
328
|
gl_Position = vec4(0.0);
|
|
311
329
|
return;
|
|
312
330
|
}
|
|
@@ -349,9 +367,19 @@ export function label_screen() {
|
|
|
349
367
|
projPos.z += depthOffset + a_offset.z;
|
|
350
368
|
|
|
351
369
|
vec2 screenPos = project(projPos);
|
|
352
|
-
|
|
353
|
-
vec2
|
|
354
|
-
|
|
370
|
+
|
|
371
|
+
vec2 vert = a_vertices;
|
|
372
|
+
vec4 gp = a_gliphParam;
|
|
373
|
+
if(a_texCoord.w == RTL){
|
|
374
|
+
vert.x = step(vert.x * 0.5 + 1.0, 1.0);
|
|
375
|
+
gp.x = -a_gliphParam.x;
|
|
376
|
+
gp.z = -(a_gliphParam.z + a_texCoord.z);
|
|
377
|
+
}else{
|
|
378
|
+
gp.z = a_gliphParam.z + a_texCoord.z;
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
vec2 v = screenPos + rotate2d(a_rotation) * ((vert * gp.xy + gp.zw) * a_size * scd + a_offset.xy);
|
|
382
|
+
|
|
355
383
|
gl_Position = vec4((2.0 * v / viewport - 1.0) * projPos.w, projPos.z, projPos.w);
|
|
356
384
|
}`,
|
|
357
385
|
fragmentShader:
|
|
@@ -487,6 +515,9 @@ export function labelPicking() {
|
|
|
487
515
|
},
|
|
488
516
|
vertexShader:
|
|
489
517
|
`
|
|
518
|
+
|
|
519
|
+
${DEFINE}
|
|
520
|
+
|
|
490
521
|
attribute vec4 a_gliphParam;
|
|
491
522
|
attribute vec2 a_vertices;
|
|
492
523
|
attribute vec4 a_texCoord;
|
|
@@ -519,7 +550,7 @@ export function labelPicking() {
|
|
|
519
550
|
vec3 a_positions = a_positionsHigh + a_positionsLow;
|
|
520
551
|
vec3 cameraPos = eyePositionHigh + eyePositionLow;
|
|
521
552
|
|
|
522
|
-
if(a_texCoord.
|
|
553
|
+
if(a_texCoord.w == EMPTY) {
|
|
523
554
|
gl_Position = vec4(0.0);
|
|
524
555
|
return;
|
|
525
556
|
}
|
|
@@ -554,7 +585,19 @@ export function labelPicking() {
|
|
|
554
585
|
projPos.z += depthOffset + a_offset.z;
|
|
555
586
|
|
|
556
587
|
vec2 screenPos = project(projPos);
|
|
557
|
-
|
|
588
|
+
|
|
589
|
+
vec2 vert = a_vertices;
|
|
590
|
+
vec4 gp = a_gliphParam;
|
|
591
|
+
if(a_texCoord.w == RTL){
|
|
592
|
+
vert.x = step(vert.x * 0.5 + 1.0, 1.0);
|
|
593
|
+
gp.x = -a_gliphParam.x;
|
|
594
|
+
gp.z = -(a_gliphParam.z + a_texCoord.z);
|
|
595
|
+
}else{
|
|
596
|
+
gp.z = a_gliphParam.z + a_texCoord.z;
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
vec2 v = screenPos + rotate2d(a_rotation) * ((vert * gp.xy + gp.zw) * a_size * scd + a_offset.xy);
|
|
600
|
+
|
|
558
601
|
gl_Position = vec4((2.0 * v / viewport - 1.0) * projPos.w, projPos.z, projPos.w);
|
|
559
602
|
}`,
|
|
560
603
|
fragmentShader:
|
|
@@ -86,16 +86,20 @@ class FontAtlas {
|
|
|
86
86
|
tc[10] = r.left / w;
|
|
87
87
|
tc[11] = r.top / h;
|
|
88
88
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
89
|
+
let taNode = new TextureAtlasNode(r, tc);
|
|
90
|
+
let ciNorm = ci.char.normalize('NFKC');
|
|
91
|
+
let ciCode = ciNorm.charCodeAt();
|
|
92
|
+
taNode.metrics = ci;
|
|
93
|
+
taNode.metrics.nChar = ciNorm;
|
|
94
|
+
taNode.metrics.nCode = ciCode;
|
|
95
|
+
taNode.metrics.nWidth = taNode.metrics.width / s;
|
|
96
|
+
taNode.metrics.nHeight = taNode.metrics.height / s;
|
|
97
|
+
taNode.metrics.nAdvance = taNode.metrics.xadvance / s;
|
|
98
|
+
taNode.metrics.nXOffset = taNode.metrics.xoffset / s;
|
|
99
|
+
taNode.metrics.nYOffset = 1.0 - taNode.metrics.yoffset / s;
|
|
100
|
+
taNode.emptySize = 1;
|
|
101
|
+
|
|
102
|
+
atlas.nodes.set(ciNorm.charCodeAt(), taNode);
|
|
99
103
|
}
|
|
100
104
|
|
|
101
105
|
atlas.kernings = {};
|
|
@@ -106,14 +110,20 @@ class FontAtlas {
|
|
|
106
110
|
let first = ki.first,
|
|
107
111
|
second = ki.second;
|
|
108
112
|
|
|
109
|
-
let charFirst = idToChar[first],
|
|
110
|
-
|
|
113
|
+
//let charFirst = idToChar[first],
|
|
114
|
+
// charSecond = idToChar[second];
|
|
115
|
+
|
|
116
|
+
// if (!atlas.kernings[charFirst]) {
|
|
117
|
+
// atlas.kernings[charFirst] = {};
|
|
118
|
+
// }
|
|
119
|
+
//
|
|
120
|
+
// atlas.kernings[charFirst][charSecond] = ki.amount / s;
|
|
111
121
|
|
|
112
|
-
if (!atlas.kernings[
|
|
113
|
-
atlas.kernings[
|
|
122
|
+
if (!atlas.kernings[first]) {
|
|
123
|
+
atlas.kernings[first] = {};
|
|
114
124
|
}
|
|
115
125
|
|
|
116
|
-
atlas.kernings[
|
|
126
|
+
atlas.kernings[first][second] = ki.amount / s;
|
|
117
127
|
}
|
|
118
128
|
}
|
|
119
129
|
|