@openglobus/og 0.14.10 → 0.15.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.
Files changed (140) hide show
  1. package/css/og.css +378 -275
  2. package/dist/@openglobus/og.css +1 -1
  3. package/dist/@openglobus/og.esm.js +2 -2
  4. package/dist/@openglobus/og.esm.js.map +1 -1
  5. package/dist/@openglobus/og.umd.js +2 -2
  6. package/dist/@openglobus/og.umd.js.map +1 -1
  7. package/package.json +18 -17
  8. package/src/og/Clock.js +218 -194
  9. package/src/og/Globe.js +5 -5
  10. package/src/og/Object3d.js +104 -145
  11. package/src/og/camera/Camera.js +31 -27
  12. package/src/og/camera/PlanetCamera.js +22 -14
  13. package/src/og/cons.js +107 -107
  14. package/src/og/control/Atmosphere.js +396 -0
  15. package/src/og/control/CompassButton.js +11 -18
  16. package/src/og/control/Control.js +197 -188
  17. package/src/og/control/GeoImageDragControl.js +84 -66
  18. package/src/og/control/LayerSwitcher.js +56 -138
  19. package/src/og/control/Lighting.js +314 -186
  20. package/src/og/control/MouseNavigation.js +2 -2
  21. package/src/og/control/RulerSwitcher.js +24 -19
  22. package/src/og/control/ScaleControl.js +30 -10
  23. package/src/og/control/SimpleSkyBackground.js +210 -0
  24. package/src/og/control/Sun.js +3 -1
  25. package/src/og/control/ZoomControl.js +30 -42
  26. package/src/og/control/index.js +6 -0
  27. package/src/og/control/ruler/RulerScene.js +5 -23
  28. package/src/og/control/selection/Selection.js +99 -0
  29. package/src/og/control/selection/SelectionScene.js +350 -0
  30. package/src/og/control/timeline/TimelineControl.js +99 -0
  31. package/src/og/control/timeline/TimelineModel.js +133 -0
  32. package/src/og/control/timeline/TimelineView.js +449 -0
  33. package/src/og/control/timeline/timelineUtils.js +132 -0
  34. package/src/og/ellipsoid/Ellipsoid.js +120 -93
  35. package/src/og/ellipsoid/wgs84.js +13 -13
  36. package/src/og/entity/Entity.js +36 -9
  37. package/src/og/entity/EntityCollection.js +0 -2
  38. package/src/og/entity/GeoObject.js +72 -56
  39. package/src/og/entity/GeoObjectHandler.js +487 -656
  40. package/src/og/entity/GeometryHandler.js +1341 -1337
  41. package/src/og/entity/Polyline.js +0 -16
  42. package/src/og/entity/Ray.js +0 -10
  43. package/src/og/entity/RayHandler.js +3 -44
  44. package/src/og/entity/Strip.js +1 -6
  45. package/src/og/index.js +13 -7
  46. package/src/og/input/input.js +3 -1
  47. package/src/og/layer/CanvasTiles.js +39 -34
  48. package/src/og/layer/Layer.js +69 -9
  49. package/src/og/layer/Material.js +1 -8
  50. package/src/og/layer/WMS.js +16 -5
  51. package/src/og/light/LightSource.js +2 -0
  52. package/src/og/math/Line3.js +140 -139
  53. package/src/og/math/Plane.js +118 -117
  54. package/src/og/math/Ray.js +242 -239
  55. package/src/og/math/Vec3.js +56 -37
  56. package/src/og/math/Vec4.js +3 -4
  57. package/src/og/math.js +21 -21
  58. package/src/og/quadTree/Node.js +5 -4
  59. package/src/og/quadTree/index.js +12 -0
  60. package/src/og/renderer/Renderer.js +64 -37
  61. package/src/og/renderer/RendererEvents.js +1071 -1065
  62. package/src/og/scene/Planet.js +354 -174
  63. package/src/og/scene/RenderNode.js +27 -12
  64. package/src/og/segment/Segment.js +0 -5
  65. package/src/og/shaders/atmos.js +332 -0
  66. package/src/og/shaders/drawnode.js +475 -109
  67. package/src/og/shaders/geoObject.js +96 -51
  68. package/src/og/shaders/polyline.js +212 -17
  69. package/src/og/shaders/ray.js +13 -6
  70. package/src/og/shaders/toneMapping.js +5 -5
  71. package/src/og/shaders/utils.js +88 -0
  72. package/src/og/terrain/GlobusTerrain.js +5 -4
  73. package/src/og/terrain/MapboxTerrain.js +231 -52
  74. package/src/og/ui/Button.js +106 -0
  75. package/src/og/ui/ButtonGroup.js +57 -0
  76. package/src/og/ui/Dialog.js +242 -0
  77. package/src/og/ui/Slider.js +144 -0
  78. package/src/og/ui/ToggleButton.js +51 -0
  79. package/src/og/{control → ui}/UIhelpers.js +11 -2
  80. package/src/og/ui/View.js +190 -0
  81. package/src/og/utils/shared.js +960 -942
  82. package/src/og/webgl/Framebuffer.js +308 -387
  83. package/src/og/webgl/Handler.js +90 -30
  84. package/src/og/webgl/Multisample.js +8 -0
  85. package/types/Clock.d.ts +7 -2
  86. package/types/Object3d.d.ts +14 -3
  87. package/types/camera/Camera.d.ts +18 -17
  88. package/types/camera/PlanetCamera.d.ts +3 -1
  89. package/types/control/Atmosphere.d.ts +15 -0
  90. package/types/control/CompassButton.d.ts +1 -2
  91. package/types/control/GeoImageDragControl.d.ts +7 -1
  92. package/types/control/LayerSwitcher.d.ts +5 -6
  93. package/types/control/Lighting.d.ts +32 -7
  94. package/types/control/ScaleControl.d.ts +2 -1
  95. package/types/control/SimpleSkyBackground.d.ts +15 -0
  96. package/types/control/ZoomControl.d.ts +0 -1
  97. package/types/control/index.d.ts +4 -1
  98. package/types/control/ruler/RulerScene.d.ts +0 -1
  99. package/types/control/selection/Selection.d.ts +49 -0
  100. package/types/control/selection/SelectionScene.d.ts +34 -0
  101. package/types/ellipsoid/Ellipsoid.d.ts +3 -2
  102. package/types/entity/Entity.d.ts +8 -0
  103. package/types/entity/GeoObject.d.ts +28 -22
  104. package/types/entity/GeoObjectHandler.d.ts +16 -56
  105. package/types/entity/Ray.d.ts +0 -3
  106. package/types/entity/RayHandler.d.ts +0 -4
  107. package/types/index.d.ts +9 -6
  108. package/types/input/input.d.ts +2 -0
  109. package/types/layer/CanvasTiles.d.ts +1 -0
  110. package/types/layer/Layer.d.ts +9 -0
  111. package/types/layer/WMS.d.ts +7 -3
  112. package/types/math/Plane.d.ts +1 -1
  113. package/types/math/Vec3.d.ts +19 -16
  114. package/types/math/Vec4.d.ts +2 -3
  115. package/types/math.d.ts +20 -20
  116. package/types/quadTree/index.d.ts +10 -0
  117. package/types/renderer/Renderer.d.ts +11 -37
  118. package/types/scene/Planet.d.ts +27 -1
  119. package/types/scene/RenderNode.d.ts +2 -1
  120. package/types/segment/Segment.d.ts +1 -1
  121. package/types/shaders/atmos.d.ts +4 -0
  122. package/types/shaders/drawnode.d.ts +3 -2
  123. package/types/shaders/utils.d.ts +1 -0
  124. package/types/terrain/GlobusTerrain.d.ts +1 -1
  125. package/types/terrain/MapboxTerrain.d.ts +2 -1
  126. package/types/ui/Button.d.ts +21 -0
  127. package/types/ui/Dialog.d.ts +41 -0
  128. package/types/ui/Slider.d.ts +30 -0
  129. package/types/ui/ToggleButton.d.ts +10 -0
  130. package/types/{control → ui}/UIhelpers.d.ts +1 -1
  131. package/types/ui/View.d.ts +32 -0
  132. package/types/utils/shared.d.ts +16 -14
  133. package/types/webgl/Framebuffer.d.ts +2 -5
  134. package/types/webgl/Handler.d.ts +15 -10
  135. package/types/webgl/Multisample.d.ts +2 -0
  136. package/src/og/ajax.js +0 -204
  137. package/src/og/entity/Object3d.js +0 -504
  138. package/src/og/utils/quadTreeType.js +0 -11
  139. package/types/ajax.d.ts +0 -24
  140. package/types/utils/quadTreeType.d.ts +0 -8
@@ -11,20 +11,24 @@ export const geo_object = () =>
11
11
  uniforms: {
12
12
  viewMatrix: "mat4",
13
13
  projectionMatrix: "mat4",
14
- normalMatrix: "mat3",
15
14
 
16
15
  uScaleByDistance: "vec3",
17
16
 
18
17
  eyePositionHigh: "vec3",
19
18
  eyePositionLow: "vec3",
20
19
 
21
- lightsPositions: "vec4",
20
+ lightsPositions: "vec3",
22
21
  lightsParamsv: "vec3",
23
- lightsParamsf: "float"
22
+ lightsParamsf: "float",
23
+
24
+ uTexture: "sampler2d",
25
+ uUseTexture: "float"
24
26
  },
25
27
  attributes: {
26
28
  aVertexPosition: "vec3",
27
29
  aVertexNormal: "vec3",
30
+ aTexCoord: "vec2",
31
+
28
32
  aPositionHigh: { type: "vec3", divisor: 1 },
29
33
  aPositionLow: { type: "vec3", divisor: 1 },
30
34
  aDirection: { type: "vec3", divisor: 1 },
@@ -33,8 +37,9 @@ export const geo_object = () =>
33
37
  aScale: { type: "float", divisor: 1 },
34
38
  aDispose: { type: "float", divisor: 1 }
35
39
  },
36
- vertexShader: `precision highp float;
37
-
40
+ vertexShader:
41
+ `precision highp float;
42
+
38
43
  attribute vec3 aVertexPosition;
39
44
  attribute vec3 aVertexNormal;
40
45
  attribute vec3 aPositionHigh;
@@ -44,34 +49,47 @@ export const geo_object = () =>
44
49
  attribute vec4 aColor;
45
50
  attribute float aScale;
46
51
  attribute float aDispose;
52
+ attribute float aUseTexture;
53
+ attribute vec2 aTexCoord;
47
54
 
55
+ uniform float uUseTexture;
48
56
  uniform vec3 uScaleByDistance;
49
57
  uniform mat4 projectionMatrix;
50
58
  uniform mat4 viewMatrix;
51
- uniform mat3 normalMatrix;
52
59
 
53
60
  uniform vec3 eyePositionHigh;
54
61
  uniform vec3 eyePositionLow;
55
62
 
63
+ varying vec3 cameraPosition;
56
64
  varying vec3 vNormal;
57
- varying vec4 vPosition;
65
+ varying vec3 v_vertex;
58
66
  varying vec4 vColor;
59
67
  varying float vDispose;
68
+ varying float vUseTexture;
69
+ varying vec2 vTexCoords;
60
70
 
61
- const float RADIANS = 3.141592653589793 / 180.0;
62
-
71
+ const float PI = 3.141592653589793;
72
+
73
+ const float RADIANS = PI / 180.0;
74
+
63
75
  void main(void) {
64
76
 
65
- vDispose = aDispose;
77
+ if (aDispose == 0.0) {
78
+ return;
79
+ }
80
+
81
+ vUseTexture = uUseTexture;
66
82
  vColor = aColor;
67
- float roll = aPitchRoll.y * RADIANS;
83
+ vTexCoords = aTexCoord;
84
+
85
+ float roll = aPitchRoll.y;
68
86
  mat3 rotZ = mat3(
69
87
  vec3(cos(roll), sin(roll), 0.0),
70
88
  vec3(-sin(roll), cos(roll), 0.0),
71
89
  vec3(0.0, 0.0, 1.0)
72
90
  );
73
91
 
74
- float pitch = aPitchRoll.x * RADIANS;
92
+ float pitch = aPitchRoll.x;
75
93
  mat3 rotX = mat3(
76
94
  vec3(1.0, 0.0, 0.0),
77
95
  vec3(0.0, cos(pitch), sin(pitch)),
@@ -79,53 +97,71 @@ export const geo_object = () =>
79
97
  );
80
98
 
81
99
  vec3 position = aPositionHigh + aPositionLow;
100
+ cameraPosition = eyePositionHigh + eyePositionLow;
82
101
  vec3 r = cross(normalize(-position), aDirection);
83
- mat3 modelMatrix = mat3(r, normalize(position), -aDirection) * rotX * rotZ; /*up=-cross(aDirection, r)*/
102
+ mat3 modelMatrix = mat3(r, normalize(position), -aDirection) * rotX * rotZ;
84
103
 
85
- vec3 look = position - (eyePositionHigh + eyePositionLow);
86
- float lookLength = length(look);
87
- float scd = aScale * (1.0 - smoothstep(uScaleByDistance[0], uScaleByDistance[1], lookLength)) * (1.0 - step(uScaleByDistance[2], lookLength));
88
- vNormal = normalMatrix * modelMatrix * aVertexNormal;
89
-
90
- vec3 highDiff = aPositionHigh - eyePositionHigh;
91
- vec3 lowDiff = aPositionLow + modelMatrix * (aVertexPosition * scd) - eyePositionLow;
104
+ float dist = length(cameraPosition);
92
105
 
93
106
  mat4 viewMatrixRTE = viewMatrix;
94
107
  viewMatrixRTE[3] = vec4(0.0, 0.0, 0.0, 1.0);
95
108
 
96
- vPosition = viewMatrixRTE * vec4(highDiff + lowDiff, 1.0);
97
-
98
- gl_Position = mix(vec4(0.0, 0.0, 0.0, 0.0), projectionMatrix * vPosition, aDispose);
109
+ vec3 highDiff = aPositionHigh - eyePositionHigh;
110
+ vec3 lowDiff = aPositionLow - eyePositionLow;
111
+
112
+ vec3 look = cameraPosition - position;
113
+ float lookLength = length(look);
114
+ vNormal = modelMatrix * aVertexNormal;
115
+
116
+ // if(lookLength > uScaleByDistance[1])
117
+ // {
118
+ // scd = uScaleByDistance[1] / uScaleByDistance[0];
119
+ // }
120
+ // else if(lookLength > uScaleByDistance[0])
121
+ // {
122
+ // scd = lookLength / uScaleByDistance[0];
123
+ // }
124
+ // ... is the same math
125
+ float scd = uScaleByDistance[2] * clamp(lookLength, uScaleByDistance[0], uScaleByDistance[1]) / uScaleByDistance[0];
126
+
127
+ vec3 vert = modelMatrix * aVertexPosition * aScale * scd;
128
+ v_vertex = position + vert;
129
+
130
+ gl_Position = projectionMatrix * viewMatrixRTE * vec4(highDiff + lowDiff + vert, 1.0);
99
131
  }`,
132
+
100
133
  fragmentShader: `precision highp float;
101
134
 
102
- varying vec4 vColor;
103
135
  #define MAX_POINT_LIGHTS 1
104
136
 
105
- uniform vec4 lightsPositions[MAX_POINT_LIGHTS];
137
+ uniform vec3 lightsPositions[MAX_POINT_LIGHTS];
106
138
  uniform vec3 lightsParamsv[MAX_POINT_LIGHTS * 3];
107
- uniform float lightsParamsf[MAX_POINT_LIGHTS];
139
+ uniform float lightsParamsf[MAX_POINT_LIGHTS];
140
+ uniform sampler2D uTexture;
108
141
 
142
+ varying vec3 cameraPosition;
143
+ varying vec3 v_vertex;
144
+ varying vec4 vColor;
109
145
  varying vec3 vNormal;
110
- varying vec4 vPosition;
146
+ varying vec2 vTexCoords;
147
+ varying float vUseTexture;
111
148
 
112
- void main(void) {
113
- vec3 lightWeighting;
114
- vec3 lightDirection;
115
- vec3 normal;
116
- vec3 eyeDirection;
117
- vec3 reflectionDirection;
118
- float specularLightWeighting;
119
- float diffuseLightWeighting;
149
+ void main(void) {
150
+ vec3 normal = normalize(vNormal);
120
151
 
121
- lightDirection = normalize(lightsPositions[0].xyz - vPosition.xyz * lightsPositions[0].w);
122
- normal = normalize(vNormal);
123
- eyeDirection = normalize(-vPosition.xyz);
124
- reflectionDirection = reflect(-lightDirection, normal);
125
- specularLightWeighting = pow(max(dot(reflectionDirection, eyeDirection), 0.0), lightsParamsf[0]);
126
- diffuseLightWeighting = max(dot(normal, lightDirection), 0.0);
127
- lightWeighting = lightsParamsv[0] + lightsParamsv[1] * diffuseLightWeighting + lightsParamsv[2] * specularLightWeighting;
128
- gl_FragColor = vec4(lightWeighting, 1.0) * vColor;
152
+ vec3 lightDir = normalize(lightsPositions[0]);
153
+ vec3 viewDir = normalize(cameraPosition - v_vertex);
154
+ vec3 reflectionDirection = reflect(-lightDir, normal);
155
+ float reflection = max( dot(reflectionDirection, viewDir), 0.0);
156
+ float specularLightWeighting = pow( reflection, lightsParamsf[0]);
157
+ float diffuseLightWeighting = max(dot(normal, lightDir), 0.0);
158
+ vec3 lightWeighting = lightsParamsv[0] + lightsParamsv[1] * diffuseLightWeighting + lightsParamsv[2] * specularLightWeighting;
159
+ vec4 tColor = texture2D(uTexture, vTexCoords);
160
+ if(vUseTexture > 0.0){
161
+ gl_FragColor = vec4(tColor.rgb * lightWeighting, tColor.a);
162
+ } else {
163
+ gl_FragColor = vec4(vColor.rgb * lightWeighting, vColor.a);
164
+ }
129
165
  }`
130
166
  });
131
167
 
@@ -178,7 +214,11 @@ export const geo_object_picking = () =>
178
214
 
179
215
  void main(void) {
180
216
 
181
- vDispose = aDispose;
217
+
218
+ if (aDispose == 0.0) {
219
+ return;
220
+ }
221
+
182
222
  vColor = aPickingColor;
183
223
  float roll = aPitchRoll.y * RADIANS;
184
224
  mat3 rotZ = mat3(
@@ -198,17 +238,22 @@ export const geo_object_picking = () =>
198
238
  vec3 r = cross(normalize(-position), aDirection);
199
239
  mat3 modelMatrix = mat3(r, normalize(position), -aDirection) * rotX * rotZ; /*up=-cross(aDirection, r)*/
200
240
 
201
- vec3 look = position - (eyePositionHigh + eyePositionLow);
202
- float lookLength = length(look);
203
- float scd = aScale * pickingScale * (1.0 - smoothstep(uScaleByDistance[0], uScaleByDistance[1], lookLength)) * (1.0 - step(uScaleByDistance[2], lookLength));
204
-
205
- vec3 highDiff = aPositionHigh - eyePositionHigh;
206
- vec3 lowDiff = aPositionLow + modelMatrix * (aVertexPosition * scd) - eyePositionLow;
241
+ float dist = length(eyePositionHigh + eyePositionLow);
207
242
 
208
243
  mat4 viewMatrixRTE = viewMatrix;
209
244
  viewMatrixRTE[3] = vec4(0.0, 0.0, 0.0, 1.0);
210
245
 
211
- gl_Position = mix(vec4(0.0, 0.0, 0.0, 0.0), projectionMatrix *viewMatrixRTE * vec4(highDiff + lowDiff, 1.0), aDispose);
246
+ vec3 highDiff = aPositionHigh - eyePositionHigh;
247
+ vec3 lowDiff = aPositionLow - eyePositionLow;
248
+
249
+ vec3 look = position - (eyePositionHigh + eyePositionLow);
250
+ float lookLength = length(look);
251
+
252
+ float scd = uScaleByDistance[2] * clamp(lookLength, uScaleByDistance[0], uScaleByDistance[1]) / uScaleByDistance[0];
253
+
254
+ vec4 pos = vec4((highDiff + lowDiff) + modelMatrix * aVertexPosition * aScale * pickingScale * scd, 1.0);
255
+
256
+ gl_Position = projectionMatrix * viewMatrixRTE * pos;
212
257
  }`,
213
258
  fragmentShader:
214
259
  `precision highp float;
@@ -6,6 +6,188 @@
6
6
 
7
7
  import { Program } from '../webgl/Program.js';
8
8
 
9
+ // export function polyline_screen() {
10
+ // return new Program("polyline_screen", {
11
+ // uniforms: {
12
+ // viewport: "vec2",
13
+ // proj: "mat4",
14
+ // view: "mat4",
15
+ // eyePositionHigh: "vec3",
16
+ // eyePositionLow: "vec3",
17
+ // uFloatParams: "vec2",
18
+ // thickness: "float",
19
+ // opacity: "float",
20
+ // depthOffset: "float"
21
+ // },
22
+ // attributes: {
23
+ // prevHigh: "vec3",
24
+ // currentHigh: "vec3",
25
+ // nextHigh: "vec3",
26
+ //
27
+ // prevLow: "vec3",
28
+ // currentLow: "vec3",
29
+ // nextLow: "vec3",
30
+ //
31
+ // order: "float",
32
+ //
33
+ // color: "vec4"
34
+ // },
35
+ //
36
+ // vertexShader:
37
+ // `precision highp float;
38
+ //
39
+ // attribute vec3 prevHigh;
40
+ // attribute vec3 currentHigh;
41
+ // attribute vec3 nextHigh;
42
+ //
43
+ // attribute vec3 prevLow;
44
+ // attribute vec3 currentLow;
45
+ // attribute vec3 nextLow;
46
+ //
47
+ // attribute float order;
48
+ //
49
+ // attribute vec4 color;
50
+ //
51
+ // uniform float thickness;
52
+ // uniform mat4 proj;
53
+ // uniform mat4 view;
54
+ // uniform vec2 viewport;
55
+ // uniform vec3 eyePositionHigh;
56
+ // uniform vec3 eyePositionLow;
57
+ // uniform float opacity;
58
+ // uniform float depthOffset;
59
+ //
60
+ // varying vec4 vColor;
61
+ // varying vec3 vPos;
62
+ // varying vec3 uCamPos;
63
+ //
64
+ // const float NEAR = -1.0;
65
+ //
66
+ // vec2 getIntersection(vec2 start1, vec2 end1, vec2 start2, vec2 end2){
67
+ // vec2 dir = end2 - start2;
68
+ // vec2 perp = vec2(-dir.y, dir.x);
69
+ // float d2 = dot(perp, start2);
70
+ // float seg = dot(perp, start1) - d2;
71
+ // float prl = seg - dot(perp, end1) + d2;
72
+ // if(prl > -1.0 && prl < 1.0){
73
+ // return start1;
74
+ // }
75
+ // float u = seg / prl;
76
+ // return start1 + u * (end1 - start1);
77
+ // }
78
+ //
79
+ // vec2 project(vec4 p){
80
+ // return (0.5 * p.xyz / p.w + 0.5).xy * viewport;
81
+ // }
82
+ //
83
+ // void main(){
84
+ //
85
+ // uCamPos = eyePositionHigh + eyePositionLow;
86
+ //
87
+ // vColor = vec4(color.rgb, color.a * opacity);
88
+ //
89
+ // vec3 current = currentHigh + currentLow;
90
+ //
91
+ // vPos = current;
92
+ //
93
+ // mat4 viewMatrixRTE = view;
94
+ // viewMatrixRTE[3] = vec4(0.0, 0.0, 0.0, 1.0);
95
+ //
96
+ // vec3 highDiff, lowDiff;
97
+ //
98
+ // highDiff = currentHigh - eyePositionHigh;
99
+ // lowDiff = currentLow - eyePositionLow;
100
+ // vec4 vCurrent = viewMatrixRTE * vec4(highDiff + lowDiff, 1.0);
101
+ //
102
+ // highDiff = prevHigh - eyePositionHigh;
103
+ // lowDiff = prevLow - eyePositionLow;
104
+ // vec4 vPrev = viewMatrixRTE * vec4(highDiff + lowDiff, 1.0);
105
+ //
106
+ // highDiff = nextHigh - eyePositionHigh;
107
+ // lowDiff = nextLow - eyePositionLow;
108
+ // vec4 vNext = viewMatrixRTE * vec4(highDiff + lowDiff, 1.0);
109
+ //
110
+ // /*Clip near plane, the point behind view plane*/
111
+ // if(vCurrent.z > NEAR) {
112
+ // if(vPrev.z < NEAR && abs(order) == 1.0){
113
+ // vCurrent = vPrev + (vCurrent - vPrev) * (NEAR - vPrev.z) / (vCurrent.z - vPrev.z);
114
+ // } else if(vNext.z < NEAR && abs(order) == 2.0){
115
+ // vCurrent = vNext + (vCurrent - vNext) * (NEAR - vNext.z) / (vCurrent.z - vNext.z);
116
+ // }
117
+ // }
118
+ //
119
+ // vec4 dCurrent = proj * vCurrent;
120
+ // vec2 _next = project(proj * vNext);
121
+ // vec2 _prev = project(proj * vPrev);
122
+ // vec2 _current = project(dCurrent);
123
+ //
124
+ // if(_prev == _current){
125
+ // if(_next == _current){
126
+ // _next = _current + vec2(1.0, 0.0);
127
+ // _prev = _current - _next;
128
+ // }else{
129
+ // _prev = _current + normalize(_current - _next);
130
+ // }
131
+ // }
132
+ //
133
+ // if(_next == _current){
134
+ // _next = _current + normalize(_current - _prev);
135
+ // }
136
+ //
137
+ // vec2 sNext = _next,
138
+ // sCurrent = _current,
139
+ // sPrev = _prev;
140
+ //
141
+ // vec2 dirNext = normalize(sNext - sCurrent);
142
+ // vec2 dirPrev = normalize(sPrev - sCurrent);
143
+ // float dotNP = dot(dirNext, dirPrev);
144
+ //
145
+ // vec2 normalNext = normalize(vec2(-dirNext.y, dirNext.x));
146
+ // vec2 normalPrev = normalize(vec2(dirPrev.y, -dirPrev.x));
147
+ //
148
+ // float d = thickness * sign(order);
149
+ //
150
+ // vec2 m;
151
+ // if(dotNP >= 0.99991){
152
+ // m = sCurrent - normalPrev * d;
153
+ // }else{
154
+ // m = getIntersection( sCurrent + normalPrev * d, sPrev + normalPrev * d,
155
+ // sCurrent + normalNext * d, sNext + normalNext * d );
156
+ //
157
+ // if( dotNP > 0.5 && dot(dirNext + dirPrev, m - sCurrent) < 0.0 ){
158
+ // float occw = order * sign(dirNext.x * dirPrev.y - dirNext.y * dirPrev.x);
159
+ // if(occw == -1.0){
160
+ // m = sCurrent + normalPrev * d;
161
+ // }else if(occw == 1.0){
162
+ // m = sCurrent + normalNext * d;
163
+ // }else if(occw == -2.0){
164
+ // m = sCurrent + normalNext * d;
165
+ // }else if(occw == 2.0){
166
+ // m = sCurrent + normalPrev * d;
167
+ // }
168
+ // }else if(distance(sCurrent, m) > min(distance(sCurrent, sNext), distance(sCurrent, sPrev))){
169
+ // m = sCurrent + normalNext * d;
170
+ // }
171
+ // }
172
+ //
173
+ // gl_Position = vec4((2.0 * m / viewport - 1.0) * dCurrent.w, dCurrent.z + depthOffset, dCurrent.w);
174
+ // }`,
175
+ //
176
+ // fragmentShader:
177
+ // `precision highp float;
178
+ // uniform vec2 uFloatParams;
179
+ // varying vec3 uCamPos;
180
+ // varying vec4 vColor;
181
+ // varying vec3 vPos;
182
+ // void main() {
183
+ // vec3 look = vPos - uCamPos;
184
+ // float lookLength = length(look);
185
+ // float a = vColor.a * step(lookLength, sqrt(dot(uCamPos,uCamPos) - uFloatParams[0]) + sqrt(dot(vPos,vPos) - uFloatParams[0]));
186
+ // gl_FragColor = vec4(vColor.rgb, a);
187
+ // }`
188
+ // });
189
+ // }
190
+
9
191
  export function polyline_screen() {
10
192
  return new Program("polyline_screen", {
11
193
  uniforms: {
@@ -34,19 +216,21 @@ export function polyline_screen() {
34
216
  },
35
217
 
36
218
  vertexShader:
37
- `precision highp float;
219
+ `#version 300 es
38
220
 
39
- attribute vec3 prevHigh;
40
- attribute vec3 currentHigh;
41
- attribute vec3 nextHigh;
221
+ precision highp float;
42
222
 
43
- attribute vec3 prevLow;
44
- attribute vec3 currentLow;
45
- attribute vec3 nextLow;
223
+ in vec3 prevHigh;
224
+ in vec3 currentHigh;
225
+ in vec3 nextHigh;
226
+
227
+ in vec3 prevLow;
228
+ in vec3 currentLow;
229
+ in vec3 nextLow;
46
230
 
47
- attribute float order;
231
+ in float order;
48
232
 
49
- attribute vec4 color;
233
+ in vec4 color;
50
234
 
51
235
  uniform float thickness;
52
236
  uniform mat4 proj;
@@ -57,9 +241,9 @@ export function polyline_screen() {
57
241
  uniform float opacity;
58
242
  uniform float depthOffset;
59
243
 
60
- varying vec4 vColor;
61
- varying vec3 vPos;
62
- varying vec3 uCamPos;
244
+ out vec4 vColor;
245
+ out vec3 vPos;
246
+ out vec3 uCamPos;
63
247
 
64
248
  const float NEAR = -1.0;
65
249
 
@@ -174,16 +358,27 @@ export function polyline_screen() {
174
358
  }`,
175
359
 
176
360
  fragmentShader:
177
- `precision highp float;
361
+ `#version 300 es
362
+
363
+ precision highp float;
364
+
178
365
  uniform vec2 uFloatParams;
179
- varying vec3 uCamPos;
180
- varying vec4 vColor;
181
- varying vec3 vPos;
366
+
367
+ layout(location = 0) out vec4 diffuseColor;
368
+ layout(location = 1) out vec4 normalColor;
369
+ layout(location = 2) out vec4 distanceColor;
370
+
371
+ in vec3 uCamPos;
372
+ in vec4 vColor;
373
+ in vec3 vPos;
374
+
182
375
  void main() {
183
376
  vec3 look = vPos - uCamPos;
184
377
  float lookLength = length(look);
185
378
  float a = vColor.a * step(lookLength, sqrt(dot(uCamPos,uCamPos) - uFloatParams[0]) + sqrt(dot(vPos,vPos) - uFloatParams[0]));
186
- gl_FragColor = vec4(vColor.rgb, a);
379
+ diffuseColor = vec4(vColor.rgb, a);
380
+ normalColor = vec4(1.0);
381
+ distanceColor = vec4(1.0);
187
382
  }`
188
383
  });
189
384
  }
@@ -22,7 +22,6 @@ export function rayScreen() {
22
22
  a_startPosLow: "vec3",
23
23
  a_endPosHigh: "vec3",
24
24
  a_endPosLow: "vec3",
25
- a_length: "float",
26
25
  a_thickness: "float",
27
26
  a_rgba: "vec4"
28
27
  },
@@ -34,7 +33,6 @@ export function rayScreen() {
34
33
  attribute vec3 a_endPosHigh;
35
34
  attribute vec3 a_endPosLow;
36
35
  attribute float a_thickness;
37
- attribute float a_length;
38
36
  attribute vec4 a_rgba;
39
37
 
40
38
  varying vec4 v_rgba;
@@ -53,8 +51,9 @@ export function rayScreen() {
53
51
  vec3 camPos = eyePositionHigh + eyePositionLow;
54
52
 
55
53
  vec3 startPos = a_startPosHigh + a_startPosLow;
54
+ float length = length((a_endPosHigh + a_endPosLow) - startPos);
56
55
  vec3 direction = normalize((a_endPosHigh + a_endPosLow) - startPos);
57
- vec3 vertPos = startPos + a_vertices.y * direction * a_length;
56
+ vec3 vertPos = startPos + a_vertices.y * direction * length;
58
57
 
59
58
  vec3 look = vertPos - camPos;
60
59
  vec3 up = normalize(direction);
@@ -62,10 +61,18 @@ export function rayScreen() {
62
61
 
63
62
  float dist = dot(camPos - vertPos, vec3(viewMatrix[0][2], viewMatrix[1][2], viewMatrix[2][2]));
64
63
  float focalSize = 2.0 * dist * resolution;
65
- vec3 rr = right * a_thickness * focalSize * a_vertices.x + up * a_length * a_vertices.y;
64
+ vec3 rr = right * a_thickness * focalSize * a_vertices.x;
66
65
 
67
- vec3 highDiff = a_startPosHigh - eyePositionHigh;
68
- vec3 lowDiff = a_startPosLow + rr - eyePositionLow;
66
+ vec3 highDiff = -eyePositionHigh;
67
+ vec3 lowDiff = rr - eyePositionLow;
68
+
69
+ if(a_vertices.y == 0.0){
70
+ highDiff += a_startPosHigh;
71
+ lowDiff += a_startPosLow;
72
+ }else{
73
+ highDiff += a_endPosHigh;
74
+ lowDiff += a_endPosLow;
75
+ }
69
76
 
70
77
  mat4 viewMatrixRTE = viewMatrix;
71
78
  viewMatrixRTE[3] = vec4(0.0, 0.0, 0.0, 1.0);
@@ -75,16 +75,16 @@ export function toneMapping() {
75
75
  layout(location = 0) out vec4 fragColor;
76
76
 
77
77
  void main(void) {
78
- vec3 hdrColor = texture(hdrBuffer, tc).rgb;
78
+ vec4 hdrColor = texture(hdrBuffer, tc).rgba;
79
79
 
80
80
  float oneByGamma = gamma / gamma;
81
81
  float oneByWhitePoint = whitepoint / whitepoint;
82
- vec3 mapped = ReinhardToneMapping2(hdrColor) * oneByGamma * oneByWhitePoint;
83
- //vec3 mapped = ACESFilmicToneMapping(hdrColor) * oneByGamma * oneByWhitePoint;
82
+ vec3 mapped = ReinhardToneMapping2(hdrColor.rgb) * oneByGamma * oneByWhitePoint;
83
+ //vec3 mapped = ACESFilmicToneMapping(hdrColor.rgb) * oneByGamma * oneByWhitePoint;
84
84
 
85
85
  mapped = pow(mapped, vec3(1.0 / gamma));
86
-
87
- fragColor = vec4(mapped, 1.0);
86
+
87
+ fragColor = vec4(mapped, hdrColor.a);
88
88
  }`
89
89
  });
90
90
  }
@@ -0,0 +1,88 @@
1
+ 'use strict';
2
+
3
+ export const UTILS = `
4
+ float getLerpValue(in float min, in float max, in float between)
5
+ {
6
+ return (clamp(between, min, max) - min) / (max - min);
7
+ }
8
+
9
+ vec3 aces(vec3 color)
10
+ {
11
+ float a = 2.51;
12
+ float b = 0.03;
13
+ float c = 2.43;
14
+ float d = 0.59;
15
+ float e = 0.14;
16
+ return clamp((color * (a * color + b)) / (color * (c * color + d ) + e), 0.0, 1.0);
17
+ }
18
+
19
+ bool intersectSphere(vec3 rayOrigin, vec3 rayDirection, float radius, inout float t1, inout float t2)
20
+ {
21
+ float b = dot(rayDirection, rayOrigin);
22
+ float c = dot(rayOrigin, rayOrigin) - radius * radius;
23
+ float d = b * b - c;
24
+ if (d < 0.0) {
25
+ return false;
26
+ }
27
+ t1 = -b - sqrt(d);
28
+ t2 = -b + sqrt(d);
29
+ return true;
30
+ }
31
+
32
+ bool intersectSphere(vec3 rayOrigin, vec3 rayDirection, float radius, inout float t)
33
+ {
34
+ float b = dot(rayDirection, rayOrigin);
35
+ float c = dot(rayOrigin, rayOrigin) - radius * radius;
36
+ float d = b * b - c;
37
+ if (d < 0.0) {
38
+ return false;
39
+ }
40
+ t = -b - sqrt(d);
41
+ return true;
42
+ }
43
+
44
+ bool intersectEllipsoid( in vec3 ro, in vec3 rd, in vec3 ra, inout float t )
45
+ {
46
+ vec3 ocn = ro/ra;
47
+ vec3 rdn = rd/ra;
48
+ float a = dot( rdn, rdn );
49
+ float b = dot( ocn, rdn );
50
+ float c = dot( ocn, ocn );
51
+ float h = b*b - a*(c-1.0);
52
+
53
+ if (h < 0.0)
54
+ {
55
+ return false;
56
+ }
57
+
58
+ t = (-b-sqrt(h))/a;
59
+
60
+ return true;
61
+ }
62
+
63
+ bool intersectEllipsoid( in vec3 ro, in vec3 rd, in vec3 ra, inout float t1, inout float t2)
64
+ {
65
+ vec3 ocn = ro/ra;
66
+ vec3 rdn = rd/ra;
67
+ float a = dot( rdn, rdn );
68
+ float b = dot( ocn, rdn );
69
+ float c = dot( ocn, ocn );
70
+ float h = b*b - a*(c-1.0);
71
+
72
+ if (h < 0.0)
73
+ {
74
+ return false;
75
+ }
76
+
77
+ h = sqrt(h);
78
+ t1 = (-b-h)/a;
79
+ t2 = (-b+h)/a;
80
+
81
+ return true;
82
+ }
83
+
84
+ vec3 normalEllipsoid( in vec3 pos, in vec3 ra )
85
+ {
86
+ return normalize( pos/(ra*ra) );
87
+ }
88
+ `;