bg2e-js 2.1.2 → 2.2.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.
Files changed (147) hide show
  1. package/dist/bg2e-js.js +7031 -6989
  2. package/dist/bg2e-js.js.map +1 -1
  3. package/package.json +20 -2
  4. package/src/app/AppController.ts +39 -0
  5. package/src/app/Bg2KeyboardEvent.ts +54 -0
  6. package/src/app/Bg2MouseEvent.ts +82 -0
  7. package/src/app/Bg2TouchEvent.ts +18 -0
  8. package/src/app/Canvas.ts +108 -0
  9. package/src/app/EventBase.ts +10 -0
  10. package/src/app/MainLoop.ts +273 -0
  11. package/src/app/index.ts +25 -0
  12. package/src/base/Color.ts +134 -0
  13. package/src/base/Environment.ts +183 -0
  14. package/src/base/Light.ts +192 -0
  15. package/src/base/Material.ts +616 -0
  16. package/src/base/PolyList.ts +365 -0
  17. package/src/base/Texture.ts +620 -0
  18. package/src/base/index.ts +81 -0
  19. package/src/db/Bg2LoaderPlugin.ts +129 -0
  20. package/src/db/DBPluginApi.ts +48 -0
  21. package/src/db/Loader.ts +116 -0
  22. package/src/db/LoaderPlugin.ts +34 -0
  23. package/src/db/MtlParser.ts +7 -0
  24. package/src/db/ObjLoaderPlugin.ts +55 -0
  25. package/src/db/ObjParser.ts +252 -0
  26. package/src/db/ObjWriterPlugin.ts +19 -0
  27. package/src/db/VitscnjLoaderPlugin.ts +100 -0
  28. package/src/db/Writer.ts +52 -0
  29. package/src/db/WriterPlugin.ts +22 -0
  30. package/src/db/index.ts +44 -0
  31. package/src/debug/DebugRenderer.ts +173 -0
  32. package/src/debug/WebGLTextureViewer.ts +75 -0
  33. package/src/debug/index.ts +7 -0
  34. package/src/index.html +11 -0
  35. package/src/index.ts +33 -0
  36. package/src/manipulation/SelectionBuffer.ts +82 -0
  37. package/src/manipulation/SelectionHighlight.ts +85 -0
  38. package/src/manipulation/SelectionIdAssignVisitor.ts +97 -0
  39. package/src/manipulation/SelectionManager.ts +166 -0
  40. package/src/manipulation/SelectionMode.ts +6 -0
  41. package/src/math/Mat3.ts +259 -0
  42. package/src/math/Mat4.ts +706 -0
  43. package/src/math/MatrixStrategy.ts +25 -0
  44. package/src/math/Quat.ts +65 -0
  45. package/src/math/Vec.ts +753 -0
  46. package/src/math/constants.ts +47 -0
  47. package/src/math/functions.ts +103 -0
  48. package/src/math/index.ts +74 -0
  49. package/src/phsics/joint.ts +137 -0
  50. package/src/primitives/arrow.ts +58 -0
  51. package/src/primitives/cone.ts +138 -0
  52. package/src/primitives/cube.ts +60 -0
  53. package/src/primitives/cylinder.ts +216 -0
  54. package/src/primitives/index.ts +13 -0
  55. package/src/primitives/plane.ts +31 -0
  56. package/src/primitives/sphere.ts +809 -0
  57. package/src/render/BRDFIntegrationMap.ts +4 -0
  58. package/src/render/Environment.ts +136 -0
  59. package/src/render/FrameBuffer.ts +35 -0
  60. package/src/render/MaterialRenderer.ts +34 -0
  61. package/src/render/Pipeline.ts +109 -0
  62. package/src/render/PolyListRenderer.ts +47 -0
  63. package/src/render/RenderBuffer.ts +197 -0
  64. package/src/render/RenderQueue.ts +199 -0
  65. package/src/render/RenderState.ts +116 -0
  66. package/src/render/Renderer.ts +248 -0
  67. package/src/render/SceneAppController.ts +238 -0
  68. package/src/render/SceneRenderer.ts +373 -0
  69. package/src/render/Shader.ts +32 -0
  70. package/src/render/ShadowRenderer.ts +176 -0
  71. package/src/render/SkyCube.ts +106 -0
  72. package/src/render/SkySphere.ts +118 -0
  73. package/src/render/TextureMergerRenderer.ts +70 -0
  74. package/src/render/TextureRenderer.ts +34 -0
  75. package/src/render/index.ts +67 -0
  76. package/src/render/webgl/FrameBuffer.ts +10 -0
  77. package/src/render/webgl/MaterialRenderer.ts +113 -0
  78. package/src/render/webgl/Pipeline.ts +89 -0
  79. package/src/render/webgl/PolyListRenderer.ts +260 -0
  80. package/src/render/webgl/RenderBuffer.ts +227 -0
  81. package/src/render/webgl/Renderer.ts +262 -0
  82. package/src/render/webgl/SceneRenderer.ts +68 -0
  83. package/src/render/webgl/ShaderProgram.ts +424 -0
  84. package/src/render/webgl/ShadowRenderer.ts +6 -0
  85. package/src/render/webgl/SkyCube.ts +16 -0
  86. package/src/render/webgl/SkySphere.ts +16 -0
  87. package/src/render/webgl/State.ts +152 -0
  88. package/src/render/webgl/TextureRenderer.ts +167 -0
  89. package/src/render/webgl/VertexBuffer.ts +137 -0
  90. package/src/render/webgl/index.ts +35 -0
  91. package/src/scene/Camera.ts +458 -0
  92. package/src/scene/Chain.ts +44 -0
  93. package/src/scene/ChainJoint.ts +58 -0
  94. package/src/scene/Component.ts +173 -0
  95. package/src/scene/ComponentMap.ts +107 -0
  96. package/src/scene/Drawable.ts +154 -0
  97. package/src/scene/EnvironmentComponent.ts +142 -0
  98. package/src/scene/FindNodeVisitor.ts +60 -0
  99. package/src/scene/LightComponent.ts +155 -0
  100. package/src/scene/MatrixState.ts +46 -0
  101. package/src/scene/Node.ts +314 -0
  102. package/src/scene/NodeVisitor.ts +15 -0
  103. package/src/scene/OrbitCameraController.ts +450 -0
  104. package/src/scene/SmoothOrbitCameraController.ts +99 -0
  105. package/src/scene/Transform.ts +73 -0
  106. package/src/scene/index.ts +57 -0
  107. package/src/shaders/BasicDiffuseColorShader.ts +111 -0
  108. package/src/shaders/BasicPBRLightShader.ts +277 -0
  109. package/src/shaders/DebugRenderShader.ts +98 -0
  110. package/src/shaders/DepthRenderShader.ts +91 -0
  111. package/src/shaders/IrradianceMapCubeShader.ts +116 -0
  112. package/src/shaders/PBRLightIBLShader.ts +487 -0
  113. package/src/shaders/PickSelectionShader.ts +101 -0
  114. package/src/shaders/PresentDebugFramebufferShader.ts +118 -0
  115. package/src/shaders/PresentTextureShader.ts +99 -0
  116. package/src/shaders/SelectionHighlightShader.ts +127 -0
  117. package/src/shaders/ShaderFunction.ts +318 -0
  118. package/src/shaders/SkyCubeShader.ts +94 -0
  119. package/src/shaders/SkySphereShader.ts +102 -0
  120. package/src/shaders/SpecularMapCubeShader.ts +165 -0
  121. package/src/shaders/TextureMergerShader.ts +171 -0
  122. package/src/shaders/index.ts +37 -0
  123. package/src/shaders/webgl/color_correction.glsl +47 -0
  124. package/src/shaders/webgl/constants.glsl +6 -0
  125. package/src/shaders/webgl/index.ts +70 -0
  126. package/src/shaders/webgl/normal_map.glsl +9 -0
  127. package/src/shaders/webgl/pbr.glsl +173 -0
  128. package/src/shaders/webgl/uniforms.glsl +91 -0
  129. package/src/shaders/webgl_shader_lib.ts +213 -0
  130. package/src/tools/BinaryResourceProvider.ts +14 -0
  131. package/src/tools/ImageResourceProvider.ts +66 -0
  132. package/src/tools/MaterialModifier.ts +276 -0
  133. package/src/tools/Resource.ts +203 -0
  134. package/src/tools/ResourceProvider.ts +69 -0
  135. package/src/tools/TextResourceProvider.ts +24 -0
  136. package/src/tools/TextureCache.ts +52 -0
  137. package/src/tools/TextureResourceDatabase.ts +100 -0
  138. package/src/tools/UserAgent.ts +362 -0
  139. package/src/tools/VideoResourceProvider.ts +50 -0
  140. package/src/tools/WriteStrategy.ts +22 -0
  141. package/src/tools/base64.ts +11 -0
  142. package/src/tools/crypto.ts +19 -0
  143. package/src/tools/endiantess.ts +13 -0
  144. package/src/tools/image.ts +18 -0
  145. package/src/tools/index.ts +41 -0
  146. package/src/tools/processType.ts +38 -0
  147. package/src/vite-env.d.ts +12 -0
@@ -0,0 +1,100 @@
1
+ import Color from "../base/Color"
2
+ import Texture, { ProceduralTextureFunction, TextureFilter, TextureTarget, TextureWrap } from "../base/Texture"
3
+ import BRDFIntegrationMap from "../render/BRDFIntegrationMap";
4
+ import Renderer from "../render/Renderer";
5
+
6
+ interface TextureCache {
7
+ [key: string]: Texture;
8
+ }
9
+
10
+ interface TextureDatabaseType {
11
+ whiteTexture: TextureCache;
12
+ blackTexture: TextureCache;
13
+ normalTexture: TextureCache;
14
+ brdfIntegrationTexture: TextureCache;
15
+ }
16
+
17
+ const g_textureDatabase: TextureDatabaseType = {
18
+ whiteTexture: {},
19
+ blackTexture: {},
20
+ normalTexture: {},
21
+ brdfIntegrationTexture: {}
22
+ }
23
+
24
+ const createColorTexture = async (color: Color, name: string = ""): Promise<Texture> => {
25
+ const result = new Texture();
26
+ result.magFilter = TextureFilter.NEAREST;
27
+ result.minFilter = TextureFilter.NEAREST;
28
+ result.wrapModeXY = TextureWrap.REPEAT;
29
+ result.proceduralFunction = ProceduralTextureFunction.PLAIN_COLOR;
30
+ result.proceduralParameters = color;
31
+ result.size = [2, 2];
32
+ name = name || `ColorTexture_${color.r}_${color.g}_${color.b}_${color.a}`;
33
+ result.name = `${ name }_${result.size.width}_${result.size.height}`;
34
+ await result.loadImageData();
35
+ return result;
36
+ }
37
+
38
+ export const createWhiteTexture = async (renderer: Renderer): Promise<Texture> => {
39
+ if (!g_textureDatabase.whiteTexture[renderer.uniqueId]) {
40
+ g_textureDatabase.whiteTexture[renderer.uniqueId] = await createColorTexture(Color.White(), "WhiteTexture");
41
+ }
42
+ return g_textureDatabase.whiteTexture[renderer.uniqueId];
43
+ }
44
+
45
+ export const whiteTexture = (renderer: Renderer): Texture => {
46
+ if (!g_textureDatabase.whiteTexture[renderer.uniqueId]) {
47
+ throw new Error(`TextureResourceDatabase: whiteTexture is not initialize. Call 'createWhiteTexture' before use 'whiteTexture' function`);
48
+ }
49
+ return g_textureDatabase.whiteTexture[renderer.uniqueId];
50
+ }
51
+
52
+ export const createBlackTexture = async (renderer: Renderer): Promise<Texture> => {
53
+ if (!g_textureDatabase.blackTexture[renderer.uniqueId]) {
54
+ g_textureDatabase.blackTexture[renderer.uniqueId] = await createColorTexture(Color.Black(), "BlackTexture");
55
+ }
56
+ return g_textureDatabase.blackTexture[renderer.uniqueId];
57
+ }
58
+
59
+ export const blackTexture = (renderer: Renderer): Texture => {
60
+ if (!g_textureDatabase.blackTexture[renderer.uniqueId]) {
61
+ throw new Error(`TextureResourceDatabase: blackTexture is not initialize. Call 'createBlackTexture' before use 'blackTexture' function`);
62
+ }
63
+ return g_textureDatabase.blackTexture[renderer.uniqueId];
64
+ }
65
+
66
+ export const createNormalTexture = async (renderer: Renderer): Promise<Texture> => {
67
+ if (!g_textureDatabase.normalTexture[renderer.uniqueId]) {
68
+ g_textureDatabase.normalTexture[renderer.uniqueId] = await createColorTexture(new Color([0.5, 0.5, 1, 1]), "NormalMapTexture");
69
+ }
70
+ return g_textureDatabase.normalTexture[renderer.uniqueId];
71
+ }
72
+
73
+ export const normalTexture = (renderer: Renderer): Texture => {
74
+ if (!g_textureDatabase.normalTexture[renderer.uniqueId]) {
75
+ throw new Error(`TextureResourceDatabase: normalTexture is not initialized. Call 'createNormalTexture' before use 'normalTexture' function`);
76
+ }
77
+ return g_textureDatabase.normalTexture[renderer.uniqueId];
78
+ }
79
+
80
+ export const createBRDFIntegrationTexture = async (renderer: Renderer): Promise<Texture> => {
81
+ if (!g_textureDatabase.brdfIntegrationTexture[renderer.uniqueId]) {
82
+ const tex = new Texture();
83
+ tex.name = "BRDFIntegrationMapTexture";
84
+ tex.target = TextureTarget.TEXTURE_2D;
85
+ tex.proceduralFunction = ProceduralTextureFunction.FROM_BASE64;
86
+ tex.proceduralParameters = {
87
+ imageData: BRDFIntegrationMap
88
+ };
89
+ await tex.loadImageData();
90
+ g_textureDatabase.brdfIntegrationTexture[renderer.uniqueId] = tex;
91
+ }
92
+ return g_textureDatabase.brdfIntegrationTexture[renderer.uniqueId];
93
+ }
94
+
95
+ export const BRDFIntegrationTexture = (renderer: Renderer): Texture => {
96
+ if (!g_textureDatabase.brdfIntegrationTexture[renderer.uniqueId]) {
97
+ throw new Error(`TextureResourceDatabase: BRDFIntegrationTexture is not initialized. Call 'createBRDFIntegrationTexture' before use 'BRDFIntegrationTexture' function`);
98
+ }
99
+ return g_textureDatabase.brdfIntegrationTexture[renderer.uniqueId];
100
+ }
@@ -0,0 +1,362 @@
1
+
2
+ interface VersionInfo {
3
+ major: number;
4
+ minor: number;
5
+ revision: number;
6
+ stringValue: string;
7
+ name: string;
8
+ versionString: string;
9
+ }
10
+
11
+ interface SystemInfo {
12
+ OSX: boolean;
13
+ Windows: boolean;
14
+ iPhone: boolean;
15
+ iPodTouch: boolean;
16
+ iPad: boolean;
17
+ iOS: boolean;
18
+ Android: boolean;
19
+ Linux: boolean;
20
+ OSName: string;
21
+ Version: VersionInfo;
22
+ }
23
+
24
+ interface BrowserInfo {
25
+ Version: VersionInfo;
26
+ Safari: boolean;
27
+ Chrome: boolean;
28
+ Opera: boolean;
29
+ Firefox: boolean;
30
+ Edge: boolean;
31
+ Explorer: boolean;
32
+ MobileSafari: boolean;
33
+ Android: boolean;
34
+ IsMobileVersion: boolean;
35
+ Name: string;
36
+ Vendor: string;
37
+ }
38
+
39
+ export default class UserAgent {
40
+ system: SystemInfo = {
41
+ OSX: false,
42
+ Windows: false,
43
+ iPhone: false,
44
+ iPodTouch: false,
45
+ iPad: false,
46
+ iOS: false,
47
+ Android: false,
48
+ Linux: false,
49
+ OSName: "",
50
+ Version: {
51
+ major: 0,
52
+ minor: 0,
53
+ revision: 0,
54
+ stringValue: "",
55
+ name: "",
56
+ versionString: ""
57
+ }
58
+ }
59
+ browser: BrowserInfo = {
60
+ Version: {
61
+ major: 0,
62
+ minor: 0,
63
+ revision: 0,
64
+ stringValue: "",
65
+ name: "",
66
+ versionString: ""
67
+ },
68
+ Safari: false,
69
+ Chrome: false,
70
+ Opera: false,
71
+ Firefox: false,
72
+ Edge: false,
73
+ Explorer: false,
74
+ MobileSafari: false,
75
+ Android: false,
76
+ IsMobileVersion: false,
77
+ Name: "",
78
+ Vendor: ""
79
+ }
80
+
81
+ constructor(userAgentString?: string) {
82
+ if (!userAgentString) {
83
+ userAgentString = navigator.userAgent;
84
+ }
85
+ this.parseOperatingSystem(userAgentString);
86
+ this.parseBrowser(userAgentString);
87
+ }
88
+
89
+ parseOperatingSystem(userAgentString: string): void {
90
+ this.system.OSX = /Macintosh/.test(userAgentString);
91
+ this.system.Windows = /Windows/.test(userAgentString);
92
+ this.system.iPhone = /iPhone/.test(userAgentString);
93
+ this.system.iPodTouch = /iPod/.test(userAgentString);
94
+ this.system.iPad = /iPad/.test(userAgentString);
95
+ this.system.iOS = this.system.iPhone || this.system.iPad || this.system.iPodTouch;
96
+ this.system.Android = /Android/.test(userAgentString);
97
+ this.system.Linux = (this.system.Android) ? false:/Linux/.test(userAgentString);
98
+
99
+ if (this.system.OSX) {
100
+ this.system.OSName = "OS X";
101
+ this.parseOSXVersion(userAgentString);
102
+ }
103
+ else if (this.system.Windows) {
104
+ this.system.OSName = "Windows";
105
+ this.parseWindowsVersion(userAgentString);
106
+ }
107
+ else if (this.system.Linux) {
108
+ this.system.OSName = "Linux";
109
+ this.parseLinuxVersion(userAgentString);
110
+ }
111
+ else if (this.system.iOS) {
112
+ this.system.OSName = "iOS";
113
+ this.parseIOSVersion(userAgentString);
114
+ }
115
+ else if (this.system.Android) {
116
+ this.system.OSName = "Android";
117
+ this.parseAndroidVersion(userAgentString);
118
+ }
119
+ }
120
+
121
+ parseBrowser(userAgentString: string): void {
122
+ // Safari: Version/X.X.X Safari/XXX
123
+ // Chrome: Chrome/XX.X.XX.XX Safari/XXX
124
+ // Opera: Opera/X.XX
125
+ // Firefox: Gecko/XXXXXX Firefox/XX.XX.XX
126
+ // Explorer: MSIE X.X
127
+ this.browser.Safari = /Version\/([\d\.]+) Safari\//.test(userAgentString);
128
+ if (this.browser.Safari) {
129
+ this.browser.Name = "Safari";
130
+ this.browser.Vendor = "Apple";
131
+ this.browser.Version.versionString = RegExp.$1;
132
+ }
133
+
134
+ this.browser.Chrome = /Chrome\/([\d\.]+) Safari\//.test(userAgentString);
135
+ if (this.browser.Chrome) {
136
+ this.browser.Name = "Chrome";
137
+ this.browser.Vendor = "Google";
138
+ this.browser.Version.versionString = RegExp.$1;
139
+ }
140
+
141
+ this.browser.Opera = /Opera\/[\d\.]+/.test(userAgentString);
142
+ if (this.browser.Opera) {
143
+ this.browser.Name = "Opera";
144
+ this.browser.Vendor = "Opera Software";
145
+ var versionString = /Version\/([\d\.]+)/.test(userAgentString);
146
+ this.browser.Version.versionString = RegExp.$1;
147
+ }
148
+
149
+ this.browser.Firefox = /Gecko\/[\d\.]+ Firefox\/([\d\.]+)/.test(userAgentString);
150
+ if (this.browser.Firefox) {
151
+ this.browser.Name = "Firefox";
152
+ this.browser.Vendor = "Mozilla Foundation";
153
+ this.browser.Version.versionString = RegExp.$1;
154
+ }
155
+
156
+ this.browser.Edge = /Edge\/(.*)/.test(userAgentString);
157
+ if (this.browser.Edge) {
158
+ var result = /Edge\/(.*)/.exec(userAgentString);
159
+ this.browser.Name = "Edge";
160
+ this.browser.Chrome = false;
161
+ this.browser.Vendor = "Microsoft";
162
+ this.browser.Version.versionString = result && result[1] || "unknown";
163
+ }
164
+
165
+ this.browser.Explorer = /MSIE ([\d\.]+)/.test(userAgentString);
166
+ if (!this.browser.Explorer) {
167
+ var re = /\Mozilla\/5.0 \(([^)]+)\) like Gecko/
168
+ var matches = re.exec(userAgentString);
169
+ if (matches) {
170
+ re = /rv:(.*)/
171
+ var version = re.exec(matches[1]);
172
+ this.browser.Explorer = true;
173
+ this.browser.Name = "Internet Explorer";
174
+ this.browser.Vendor = "Microsoft";
175
+ if (version) {
176
+ this.browser.Version.versionString = version[1];
177
+ }
178
+ else {
179
+ this.browser.Version.versionString = "unknown";
180
+ }
181
+ }
182
+ }
183
+ else {
184
+ this.browser.Name = "Internet Explorer";
185
+ this.browser.Vendor = "Microsoft";
186
+ this.browser.Version.versionString = RegExp.$1;
187
+ }
188
+
189
+ if (this.system.iOS) {
190
+ this.browser.IsMobileVersion = true;
191
+ this.browser.MobileSafari = /Version\/([\d\.]+) Mobile/.test(userAgentString);
192
+ if (this.browser.MobileSafari) {
193
+ this.browser.Name = "Mobile Safari";
194
+ this.browser.Vendor = "Apple";
195
+ this.browser.Version.versionString = RegExp.$1;
196
+ }
197
+ this.browser.Android = false;
198
+ }
199
+ else if (this.system.Android) {
200
+ this.browser.IsMobileVersion = true;
201
+ this.browser.Android = /Version\/([\d\.]+) Mobile/.test(userAgentString);
202
+ if (this.browser.MobileSafari) {
203
+ this.browser.Name = "Android Browser";
204
+ this.browser.Vendor = "Google";
205
+ this.browser.Version.versionString = RegExp.$1;
206
+ }
207
+ else {
208
+ this.browser.Chrome = /Chrome\/([\d\.]+)/.test(userAgentString);
209
+ this.browser.Name = "Chrome";
210
+ this.browser.Vendor = "Google";
211
+ this.browser.Version.versionString = RegExp.$1;
212
+ }
213
+
214
+ this.browser.Safari = false;
215
+ }
216
+ else {
217
+ this.browser.IsMobileVersion = false;
218
+ }
219
+
220
+ this.parseBrowserVersion(userAgentString);
221
+ }
222
+
223
+ parseBrowserVersion(userAgentString: string): void {
224
+ if (/([\d]+)\.([\d]+)\.*([\d]*)/.test(this.browser.Version.versionString)) {
225
+ this.browser.Version.major = Number(RegExp.$1);
226
+ this.browser.Version.minor = Number(RegExp.$2);
227
+ this.browser.Version.revision = (RegExp.$3) ? Number(RegExp.$3):0;
228
+ }
229
+ }
230
+
231
+ parseOSXVersion(userAgentString: string): void {
232
+ var versionString = (/Mac OS X (\d+_\d+_*\d*)/.test(userAgentString)) ? RegExp.$1:'';
233
+ // Safari/Chrome
234
+ if (versionString!='') {
235
+ if (/(\d+)_(\d+)_*(\d*)/.test(versionString)) {
236
+ this.system.Version.major = Number(RegExp.$1);
237
+ this.system.Version.minor = Number(RegExp.$2);
238
+ this.system.Version.revision = (RegExp.$3) ? Number(RegExp.$3):0;
239
+ }
240
+ }
241
+ // Firefox/Opera
242
+ else {
243
+ versionString = (/Mac OS X (\d+\.\d+\.*\d*)/.test(userAgentString)) ? RegExp.$1:'Unknown';
244
+ if (/(\d+)\.(\d+)\.*(\d*)/.test(versionString)) {
245
+ this.system.Version.major = Number(RegExp.$1);
246
+ this.system.Version.minor = Number(RegExp.$2);
247
+ this.system.Version.revision = (RegExp.$3) ? Number(RegExp.$3):0;
248
+ }
249
+ }
250
+ if (!this.system.Version.major) {
251
+ this.system.Version.major = 0;
252
+ this.system.Version.minor = 0;
253
+ this.system.Version.revision = 0;
254
+ }
255
+ this.system.Version.stringValue = this.system.Version.major + '.' + this.system.Version.minor + '.' + this.system.Version.revision;
256
+ switch (this.system.Version.minor) {
257
+ case 0:
258
+ this.system.Version.name = "Cheetah";
259
+ break;
260
+ case 1:
261
+ this.system.Version.name = "Puma";
262
+ break;
263
+ case 2:
264
+ this.system.Version.name = "Jaguar";
265
+ break;
266
+ case 3:
267
+ this.system.Version.name = "Panther";
268
+ break;
269
+ case 4:
270
+ this.system.Version.name = "Tiger";
271
+ break;
272
+ case 5:
273
+ this.system.Version.name = "Leopard";
274
+ break;
275
+ case 6:
276
+ this.system.Version.name = "Snow Leopard";
277
+ break;
278
+ case 7:
279
+ this.system.Version.name = "Lion";
280
+ break;
281
+ case 8:
282
+ this.system.Version.name = "Mountain Lion";
283
+ break;
284
+ }
285
+ }
286
+
287
+ parseWindowsVersion(userAgentString: string): void {
288
+ if (/NT (\d+)\.(\d*)/.test(userAgentString)) {
289
+ this.system.Version.major = Number(RegExp.$1);
290
+ this.system.Version.minor = Number(RegExp.$2);
291
+ this.system.Version.revision = 0; // Solo por compatibilidad
292
+ this.system.Version.stringValue = "NT " + this.system.Version.major + "." + this.system.Version.minor;
293
+ var major = this.system.Version.major;
294
+ var minor = this.system.Version.minor;
295
+ var name = 'undefined';
296
+ if (major==5) {
297
+ if (minor==0) this.system.Version.name = '2000';
298
+ else this.system.Version.name = 'XP';
299
+ }
300
+ else if (major==6) {
301
+ if (minor==0) this.system.Version.name = 'Vista';
302
+ else if (minor==1) this.system.Version.name = '7';
303
+ else if (minor==2) this.system.Version.name = '8';
304
+ }
305
+ }
306
+ else {
307
+ this.system.Version.major = 0;
308
+ this.system.Version.minor = 0;
309
+ this.system.Version.name = "Unknown";
310
+ this.system.Version.stringValue = "Unknown";
311
+ }
312
+ }
313
+
314
+ parseLinuxVersion(userAgentString: string): void {
315
+ this.system.Version.major = 0;
316
+ this.system.Version.minor = 0;
317
+ this.system.Version.revision = 0;
318
+ this.system.Version.name = "";
319
+ this.system.Version.stringValue = "Unknown distribution";
320
+ }
321
+
322
+ parseIOSVersion(userAgentString: string): void {
323
+ if (/iPhone OS (\d+)_(\d+)_*(\d*)/i.test(userAgentString)) {
324
+ this.system.Version.major = Number(RegExp.$1);
325
+ this.system.Version.minor = Number(RegExp.$2);
326
+ this.system.Version.revision = (RegExp.$3) ? Number(RegExp.$3):0;
327
+ this.system.Version.stringValue = this.system.Version.major + "." + this.system.Version.minor + '.' + this.system.Version.revision;
328
+ this.system.Version.name = "iOS";
329
+ }
330
+ else {
331
+ this.system.Version.major = 0;
332
+ this.system.Version.minor = 0;
333
+ this.system.Version.name = "Unknown";
334
+ this.system.Version.stringValue = "Unknown";
335
+ }
336
+ }
337
+
338
+ parseAndroidVersion(userAgentString: string): void {
339
+ if (/Android (\d+)\.(\d+)\.*(\d*)/.test(userAgentString)) {
340
+ this.system.Version.major = Number(RegExp.$1);
341
+ this.system.Version.minor = Number(RegExp.$2);
342
+ this.system.Version.revision = (RegExp.$3) ? Number(RegExp.$3):0;
343
+ this.system.Version.stringValue = this.system.Version.major + "." + this.system.Version.minor + '.' + this.system.Version.revision;
344
+ }
345
+ else {
346
+ this.system.Version.major = 0;
347
+ this.system.Version.minor = 0;
348
+ this.system.Version.revision = 0;
349
+ }
350
+ if (/Build\/([a-zA-Z]+)/.test(userAgentString)) {
351
+ this.system.Version.name = RegExp.$1;
352
+ }
353
+ else {
354
+ this.system.Version.name = "Unknown version";
355
+ }
356
+ this.system.Version.stringValue = this.system.Version.major + "." + this.system.Version.minor + '.' + this.system.Version.revision;
357
+ }
358
+
359
+ getInfoString(): string {
360
+ return navigator.userAgent;
361
+ }
362
+ }
@@ -0,0 +1,50 @@
1
+ import ResourceProvider from "./ResourceProvider";
2
+
3
+ const g_preventVideoDump: HTMLVideoElement[] = [];
4
+
5
+ const beginLoadVideo = (video: HTMLVideoElement): void => {
6
+ if (g_preventVideoDump.indexOf(video) === -1) {
7
+ g_preventVideoDump.push(video);
8
+ }
9
+ };
10
+
11
+ const endLoadVideo = (video: HTMLVideoElement): void => {
12
+ const i = g_preventVideoDump.indexOf(video);
13
+ if (i !== -1) {
14
+ g_preventVideoDump.splice(i, 1);
15
+ }
16
+ }
17
+
18
+ const loadVideo = (url: string): Promise<HTMLVideoElement> => {
19
+ return new Promise((resolve, reject) => {
20
+ const video = document.createElement("video");
21
+ beginLoadVideo(video);
22
+ video.crossOrigin = "";
23
+ video.autoplay = true;
24
+ video.setAttribute("playsinline", "");
25
+ video.addEventListener("canplay", evt => {
26
+ endLoadVideo(evt.target as HTMLVideoElement);
27
+ resolve(evt.target as HTMLVideoElement);
28
+ });
29
+ video.addEventListener("error", evt => {
30
+ endLoadVideo(evt.target as HTMLVideoElement);
31
+ reject(new Error(`Error loading video ${ url }`));
32
+ });
33
+ video.addEventListener("abort", evt => {
34
+ endLoadVideo(evt.target as HTMLVideoElement);
35
+ reject(new Error(`Video load aborted '${ url }'`));
36
+ });
37
+ video.src = url;
38
+ });
39
+ }
40
+
41
+ export default class VideoResourceProvider extends ResourceProvider {
42
+ async load(url: string): Promise<HTMLVideoElement> {
43
+ const video = await loadVideo(url);
44
+ return video;
45
+ }
46
+
47
+ async write(url: string, data: any): Promise<void> {
48
+ throw new Error("VideoResourceProvider.write(): not supported");
49
+ }
50
+ }
@@ -0,0 +1,22 @@
1
+
2
+ export default class WriteStrategy {
3
+ async writeBytes(path: string, data: ArrayBuffer): Promise<void> {
4
+ throw new Error("WriteStrategy: writeBytes() not implemented");
5
+ }
6
+
7
+ async writeImage(path: string, img: HTMLImageElement | ImageData): Promise<void> {
8
+ throw new Error("WriteStrategy: writeImage() not implemented");
9
+ }
10
+
11
+ async writeText(path: string, data: string): Promise<void> {
12
+ throw new Error("WriteStrategy: writeText() not implemented");
13
+ }
14
+
15
+ async writeJson(path: string, object: any): Promise<void> {
16
+ throw new Error("WriteStrategy: writeJson() not implemented");
17
+ }
18
+
19
+ async copyFile(srcPath: string, dstPath: string): Promise<void> {
20
+ throw new Error("WriteStrategy: copyFile() not implemented");
21
+ }
22
+ }
@@ -0,0 +1,11 @@
1
+ import { isNode, isBrowser } from "./processType";
2
+
3
+ export const base64ToArrayBuffer = async (base64: string) : Promise<Uint8Array> => {
4
+ if (isBrowser() || isNode()) {
5
+ return new Uint8Array(atob(base64).split('').map(c => c.charCodeAt(0)));
6
+ }
7
+ else {
8
+ throw new Error("base64ToArrayBuffer: Unsupported platform. Valid platforms are NodeJS or Browser");
9
+ }
10
+ }
11
+
@@ -0,0 +1,19 @@
1
+ // @ts-ignore
2
+ !function(r){function n(r){for(var n="",t="",o=0,e=0,a=0,i=r.length;i>a;a++){var f=r.charCodeAt(a);128>f?e++:(t=2048>f?String.fromCharCode(f>>6|192,63&f|128):String.fromCharCode(f>>12|224,f>>6&63|128,63&f|128),e>o&&(n+=r.slice(o,e)),n+=t,o=e=a+1)}return e>o&&(n+=r.slice(o,i)),n}function t(r){var n,t;if(r+="",s=!1,v=w=r.length,w>63){for(o(r.substring(0,64)),i(A),s=!0,n=128;w>=n;n+=64)o(r.substring(n-64,n)),f(A);r=r.substring(n-64),w=r.length}for(d[0]=d[1]=d[2]=d[3]=d[4]=d[5]=d[6]=d[7]=d[8]=d[9]=d[10]=d[11]=d[12]=d[13]=d[14]=d[15]=0,n=0;w>n;n++)t=3&n,0===t?d[n>>2]=r.charCodeAt(n):d[n>>2]|=r.charCodeAt(n)<<C[t];return d[n>>2]|=h[3&n],n>55?(s?f(d):(i(d),s=!0),f([0,0,0,0,0,0,0,0,0,0,0,0,0,0,v<<3,0])):(d[14]=v<<3,void(s?f(d):i(d)))}function o(r){for(var n=16;n--;){var t=n<<2;A[n]=r.charCodeAt(t)+(r.charCodeAt(t+1)<<8)+(r.charCodeAt(t+2)<<16)+(r.charCodeAt(t+3)<<24)}}function e(r,o,e){t(o?r:n(r));var a=g[0];return u[1]=l[15&a],u[0]=l[15&(a>>=4)],u[3]=l[15&(a>>=4)],u[2]=l[15&(a>>=4)],u[5]=l[15&(a>>=4)],u[4]=l[15&(a>>=4)],u[7]=l[15&(a>>=4)],u[6]=l[15&(a>>=4)],a=g[1],u[9]=l[15&a],u[8]=l[15&(a>>=4)],u[11]=l[15&(a>>=4)],u[10]=l[15&(a>>=4)],u[13]=l[15&(a>>=4)],u[12]=l[15&(a>>=4)],u[15]=l[15&(a>>=4)],u[14]=l[15&(a>>=4)],a=g[2],u[17]=l[15&a],u[16]=l[15&(a>>=4)],u[19]=l[15&(a>>=4)],u[18]=l[15&(a>>=4)],u[21]=l[15&(a>>=4)],u[20]=l[15&(a>>=4)],u[23]=l[15&(a>>=4)],u[22]=l[15&(a>>=4)],a=g[3],u[25]=l[15&a],u[24]=l[15&(a>>=4)],u[27]=l[15&(a>>=4)],u[26]=l[15&(a>>=4)],u[29]=l[15&(a>>=4)],u[28]=l[15&(a>>=4)],u[31]=l[15&(a>>=4)],u[30]=l[15&(a>>=4)],e?u:u.join("")}function a(r,n,t,o,e,a,i){return n+=r+o+i,(n<<e|n>>>a)+t<<0}function i(r){c(0,0,0,0,r),g[0]=y[0]+1732584193<<0,g[1]=y[1]-271733879<<0,g[2]=y[2]-1732584194<<0,g[3]=y[3]+271733878<<0}function f(r){c(g[0],g[1],g[2],g[3],r),g[0]=y[0]+g[0]<<0,g[1]=y[1]+g[1]<<0,g[2]=y[2]+g[2]<<0,g[3]=y[3]+g[3]<<0}function c(r,n,t,o,e){var i,f;s?(r=a((t^o)&n^o,r,n,e[0],7,25,-680876936),o=a((n^t)&r^t,o,r,e[1],12,20,-389564586),t=a((r^n)&o^n,t,o,e[2],17,15,606105819),n=a((o^r)&t^r,n,t,e[3],22,10,-1044525330)):(r=e[0]-680876937,r=(r<<7|r>>>25)-271733879<<0,o=e[1]-117830708+(2004318071&r^-1732584194),o=(o<<12|o>>>20)+r<<0,t=e[2]-1126478375+((-271733879^r)&o^-271733879),t=(t<<17|t>>>15)+o<<0,n=e[3]-1316259209+((o^r)&t^r),n=(n<<22|n>>>10)+t<<0),r=a((t^o)&n^o,r,n,e[4],7,25,-176418897),o=a((n^t)&r^t,o,r,e[5],12,20,1200080426),t=a((r^n)&o^n,t,o,e[6],17,15,-1473231341),n=a((o^r)&t^r,n,t,e[7],22,10,-45705983),r=a((t^o)&n^o,r,n,e[8],7,25,1770035416),o=a((n^t)&r^t,o,r,e[9],12,20,-1958414417),t=a((r^n)&o^n,t,o,e[10],17,15,-42063),n=a((o^r)&t^r,n,t,e[11],22,10,-1990404162),r=a((t^o)&n^o,r,n,e[12],7,25,1804603682),o=a((n^t)&r^t,o,r,e[13],12,20,-40341101),t=a((r^n)&o^n,t,o,e[14],17,15,-1502002290),n=a((o^r)&t^r,n,t,e[15],22,10,1236535329),r=a((n^t)&o^t,r,n,e[1],5,27,-165796510),o=a((r^n)&t^n,o,r,e[6],9,23,-1069501632),t=a((o^r)&n^r,t,o,e[11],14,18,643717713),n=a((t^o)&r^o,n,t,e[0],20,12,-373897302),r=a((n^t)&o^t,r,n,e[5],5,27,-701558691),o=a((r^n)&t^n,o,r,e[10],9,23,38016083),t=a((o^r)&n^r,t,o,e[15],14,18,-660478335),n=a((t^o)&r^o,n,t,e[4],20,12,-405537848),r=a((n^t)&o^t,r,n,e[9],5,27,568446438),o=a((r^n)&t^n,o,r,e[14],9,23,-1019803690),t=a((o^r)&n^r,t,o,e[3],14,18,-187363961),n=a((t^o)&r^o,n,t,e[8],20,12,1163531501),r=a((n^t)&o^t,r,n,e[13],5,27,-1444681467),o=a((r^n)&t^n,o,r,e[2],9,23,-51403784),t=a((o^r)&n^r,t,o,e[7],14,18,1735328473),n=a((t^o)&r^o,n,t,e[12],20,12,-1926607734),i=n^t,r=a(i^o,r,n,e[5],4,28,-378558),o=a(i^r,o,r,e[8],11,21,-2022574463),f=o^r,t=a(f^n,t,o,e[11],16,16,1839030562),n=a(f^t,n,t,e[14],23,9,-35309556),i=n^t,r=a(i^o,r,n,e[1],4,28,-1530992060),o=a(i^r,o,r,e[4],11,21,1272893353),f=o^r,t=a(f^n,t,o,e[7],16,16,-155497632),n=a(f^t,n,t,e[10],23,9,-1094730640),i=n^t,r=a(i^o,r,n,e[13],4,28,681279174),o=a(i^r,o,r,e[0],11,21,-358537222),f=o^r,t=a(f^n,t,o,e[3],16,16,-722521979),n=a(f^t,n,t,e[6],23,9,76029189),i=n^t,r=a(i^o,r,n,e[9],4,28,-640364487),o=a(i^r,o,r,e[12],11,21,-421815835),f=o^r,t=a(f^n,t,o,e[15],16,16,530742520),n=a(f^t,n,t,e[2],23,9,-995338651),r=a(t^(n|~o),r,n,e[0],6,26,-198630844),o=a(n^(r|~t),o,r,e[7],10,22,1126891415),t=a(r^(o|~n),t,o,e[14],15,17,-1416354905),n=a(o^(t|~r),n,t,e[5],21,11,-57434055),r=a(t^(n|~o),r,n,e[12],6,26,1700485571),o=a(n^(r|~t),o,r,e[3],10,22,-1894986606),t=a(r^(o|~n),t,o,e[10],15,17,-1051523),n=a(o^(t|~r),n,t,e[1],21,11,-2054922799),r=a(t^(n|~o),r,n,e[8],6,26,1873313359),o=a(n^(r|~t),o,r,e[15],10,22,-30611744),t=a(r^(o|~n),t,o,e[6],15,17,-1560198380),n=a(o^(t|~r),n,t,e[13],21,11,1309151649),r=a(t^(n|~o),r,n,e[4],6,26,-145523070),o=a(n^(r|~t),o,r,e[11],10,22,-1120210379),t=a(r^(o|~n),t,o,e[2],15,17,718787259),n=a(o^(t|~r),n,t,e[9],21,11,-343485551),y[0]=r,y[1]=n,y[2]=t,y[3]=o}var u=[],d=[],A=[],h=[],l="0123456789abcdef".split(""),C=[],g=[],s=!1,v=0,w=0,y=[];if(r.Int32Array)d=new Int32Array(16),A=new Int32Array(16),h=new Int32Array(4),C=new Int32Array(4),g=new Int32Array(4),y=new Int32Array(4);else{var I;for(I=0;16>I;I++)d[I]=A[I]=0;for(I=0;4>I;I++)h[I]=C[I]=g[I]=y[I]=0}h[0]=128,h[1]=32768,h[2]=8388608,h[3]=-2147483648,C[0]=0,C[1]=8,C[2]=16,C[3]=24,r.md5=r.md5||e}("undefined"==typeof global?window:global);
3
+
4
+ export const generateMD5 = (data: string) => {
5
+ // @ts-ignore
6
+ return md5(data);
7
+ }
8
+
9
+ export const generateUUID = () => {
10
+ let d = new Date().getTime();
11
+ if (typeof performance !== 'undefined' && typeof performance.now === 'function'){
12
+ d += performance.now(); //use high-precision timer if available
13
+ }
14
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
15
+ var r = (d + Math.random() * 16) % 16 | 0;
16
+ d = Math.floor(d / 16);
17
+ return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);
18
+ });
19
+ }
@@ -0,0 +1,13 @@
1
+
2
+ export const isBigEndian = (): boolean => {
3
+ const arr32 = new Uint32Array(1);
4
+ arr32[0] = 255;
5
+ return arr32[3] === 255;
6
+ };
7
+
8
+ export const isLittleEndian = (): boolean => {
9
+ const arr32 = new Uint32Array(1);
10
+ arr32[0] = 255;
11
+ return arr32[0] === 255;
12
+ };
13
+
@@ -0,0 +1,18 @@
1
+ import { generateMD5 } from '../tools/crypto';
2
+
3
+ export const imageToBase64 = (image: HTMLImageElement, format = 'image/jpeg') => {
4
+ const canvas = document.createElement('canvas');
5
+ const ctx = canvas.getContext('2d');
6
+ canvas.height = image.naturalHeight;
7
+ canvas.width = image.naturalWidth;
8
+ if (ctx === null) {
9
+ throw new Error('Could not get canvas 2D context');
10
+ }
11
+ ctx.drawImage(image, 0, 0);
12
+ return canvas.toDataURL(format);
13
+ }
14
+
15
+ export const generateImageHash = (image: HTMLImageElement) => {
16
+ const base64 = imageToBase64(image);
17
+ return generateMD5(base64);
18
+ }
@@ -0,0 +1,41 @@
1
+ import { generateUUID, generateMD5 } from './crypto';
2
+ import { isBigEndian, isLittleEndian } from './endiantess';
3
+ import UserAgent from './UserAgent';
4
+ import Resource, {
5
+ isFormat,
6
+ addFormats,
7
+ isValidImage,
8
+ addImageFormats,
9
+ getValidImageFormats,
10
+ isValidVideo,
11
+ addVideoFormats,
12
+ getValidVideoFormats,
13
+ isValidBinary,
14
+ addBinaryFormats,
15
+ getValidBinaryFormats
16
+ } from './Resource';
17
+ import ResourceProvider from './ResourceProvider';
18
+ import ImageResourceProvider from './ImageResourceProvider';
19
+ import VideoResourceProvider from './VideoResourceProvider';
20
+ import BinaryResourceProvider from './BinaryResourceProvider';
21
+ import TextResourceProvider from './TextResourceProvider';
22
+ import {
23
+ ProcessType,
24
+ ProcessTypeName,
25
+ getProcessType,
26
+ getProcessTypeName,
27
+ isBrowser, isNode
28
+ } from './processType';
29
+
30
+ export default {
31
+ generateUUID, generateMD5,
32
+ isBigEndian, isLittleEndian,
33
+ UserAgent,
34
+ Resource, isFormat, addFormats, isValidImage, addImageFormats, getValidImageFormats, isValidVideo, addVideoFormats, getValidVideoFormats, isValidBinary, addBinaryFormats, getValidBinaryFormats,
35
+ ResourceProvider,
36
+ ImageResourceProvider,
37
+ VideoResourceProvider,
38
+ BinaryResourceProvider,
39
+ TextResourceProvider,
40
+ ProcessType, ProcessTypeName, getProcessType, getProcessTypeName, isBrowser, isNode
41
+ };