@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.
@@ -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.nodes[char] || fa.nodes[" "];
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] = 0.0;
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] = 0.0;
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] = 0.0;
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] = 0.0;
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] = 0.0;
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] = 0.0;
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 + 3] = offset;
468
- a[j + 7] = offset;
469
- a[j + 11] = offset;
470
- a[j + 15] = offset;
471
- a[j + 19] = offset;
472
- a[j + 23] = offset;
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 + 2] = -1.0;
489
- a[j + 6] = -1.0;
490
- a[j + 10] = -1.0;
491
- a[j + 14] = -1.0;
492
- a[j + 18] = -1.0;
493
- a[j + 17] = -1.0;
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
  }
@@ -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.z == -1.0) {
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 = vec2(a_texCoord.xy);
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 v = screenPos + rotate2d(a_rotation) * ((a_vertices * a_gliphParam.xy + a_gliphParam.zw + vec2(a_texCoord.z, 0.0) + vec2(a_texCoord.w, 0.0)) * a_size * scd + a_offset.xy);
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.z == -1.0) {
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 v = screenPos + rotate2d(a_rotation) * ((a_vertices * a_gliphParam.xy + a_gliphParam.zw + vec2(a_texCoord.z, 0.0) + vec2(a_texCoord.w, 0.0)) * a_size * scd + a_offset.xy);
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.z == -1.0){
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
- vec2 v = screenPos + rotate2d(a_rotation) * ((a_vertices * a_gliphParam.xy + a_gliphParam.zw + vec2(a_texCoord.z, 0.0) + vec2(a_texCoord.w, 0.0)) * a_size * scd + a_offset.xy);
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
- atlas.nodes[ti] = new TextureAtlasNode(r, tc);
90
- atlas.nodes[ti].metrics = ci;
91
-
92
- atlas.nodes[ti].metrics.nWidth = atlas.nodes[ti].metrics.width / s;
93
- atlas.nodes[ti].metrics.nHeight = atlas.nodes[ti].metrics.height / s;
94
- atlas.nodes[ti].metrics.nAdvance = atlas.nodes[ti].metrics.xadvance / s;
95
- atlas.nodes[ti].metrics.nXOffset = atlas.nodes[ti].metrics.xoffset / s;
96
- atlas.nodes[ti].metrics.nYOffset = 1.0 - atlas.nodes[ti].metrics.yoffset / s;
97
-
98
- atlas.nodes[ti].emptySize = 1;
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
- charSecond = idToChar[second];
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[charFirst]) {
113
- atlas.kernings[charFirst] = {};
122
+ if (!atlas.kernings[first]) {
123
+ atlas.kernings[first] = {};
114
124
  }
115
125
 
116
- atlas.kernings[charFirst][charSecond] = ki.amount / s;
126
+ atlas.kernings[first][second] = ki.amount / s;
117
127
  }
118
128
  }
119
129