strings.ts 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445
  1. function strings_arm_file_expected(): string {
  2. return tr("Error: .arm file expected");
  3. }
  4. function strings_unknown_asset_format(): string {
  5. return tr("Error: Unknown asset format");
  6. }
  7. function strings_could_not_locate_texture(): string {
  8. return tr("Error: Could not locate texture");
  9. }
  10. function strings_failed_to_read_mesh_data(): string {
  11. return tr("Error: Failed to read mesh data");
  12. }
  13. function strings_check_internet_connection(): string {
  14. return tr("Error: Check internet connection to access the cloud");
  15. }
  16. function strings_asset_already_imported(): string {
  17. return tr("Info: Asset already imported");
  18. }
  19. function strings_graphics_api(): string {
  20. ///if arm_direct3d12
  21. return "Direct3D12";
  22. ///elseif arm_metal
  23. return "Metal";
  24. ///else
  25. return "Vulkan";
  26. ///end
  27. }
  28. let str_tex_checker: string = "\
  29. fun tex_checker(co: float3, col1: float3, col2: float3, scale: float): float3 { \
  30. /* Prevent precision issues on unit coordinates */ \
  31. var p: float3 = (co + 0.000001 * 0.999999) * scale; \
  32. var xi: float = abs(floor(p.x)); \
  33. var yi: float = abs(floor(p.y)); \
  34. var zi: float = abs(floor(p.z)); \
  35. /* var check: bool = (xi % 2.0 == yi % 2.0) == zi % 2.0;*/ \
  36. var checka: int = 0; \
  37. var checkb: int = 0; \
  38. if (xi % 2.0 == yi % 2.0) { checka = 1; } \
  39. if (zi % 2.0 != 0.0) { checkb = 1; } \
  40. if (checka == checkb) { return col1; } return col2; \
  41. } \
  42. fun tex_checker_f(co: float3, scale: float): float { \
  43. var p: float3 = (co + 0.000001 * 0.999999) * scale; \
  44. var xi: float = abs(floor(p.x)); \
  45. var yi: float = abs(floor(p.y)); \
  46. var zi: float = abs(floor(p.z)); \
  47. /*return float((xi % 2.0 == yi % 2.0) == zi % 2.0);*/ \
  48. var checka: int = 0; \
  49. var checkb: int = 0; \
  50. if (xi % 2.0 == yi % 2.0) { checka = 1; } \
  51. if (zi % 2.0 != 0.0) { checkb = 1; } \
  52. if (checka == checkb) { return 1.0; } return 0.0; \
  53. \
  54. } \
  55. ";
  56. // Created by inigo quilez - iq/2013
  57. // License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
  58. let str_tex_voronoi: string = "\
  59. fun tex_voronoi(x: float3): float4 { \
  60. var p: float3 = floor3(x); \
  61. var f: float3 = frac3(x); \
  62. var id: float = 0.0; \
  63. var res: float = 100.0; \
  64. for (var k: int = 0; k <= 2; k += 1) \
  65. for (var j: int = 0; j <= 2; j += 1) \
  66. for (var i: int = 0; i <= 2; i += 1) { \
  67. var b: float3 = float3(float(i - 1), float(j - 1), float(k - 1)); \
  68. var pb: float3 = p + b; \
  69. var snoise_sample: float3 = sample(snoise256, sampler_linear, (pb.xy + float2(3.0, 1.0) * pb.z + 0.5) / 256.0).xyz; \
  70. var r: float3 = b - f + snoise_sample; \
  71. var d: float = dot(r, r); \
  72. if (d < res) { \
  73. id = dot(p + b, float3(1.0, 57.0, 113.0)); \
  74. res = d; \
  75. } \
  76. } \
  77. /*var col: float3 = 0.5 + 0.5 * cos(id * 0.35 + float3(0.0, 1.0, 2.0));*/ \
  78. var col: float3; \
  79. col.x = 0.5 + 0.5 * cos(id * 0.35 + 0.0); \
  80. col.y = 0.5 + 0.5 * cos(id * 0.35 + 1.0); \
  81. col.z = 0.5 + 0.5 * cos(id * 0.35 + 2.0); \
  82. return float4(col, sqrt(res)); \
  83. } \
  84. ";
  85. // By Morgan McGuire @morgan3d, http://graphicscodex.com Reuse permitted under the BSD license.
  86. // https://www.shadertoy.com/view/4dS3Wd
  87. let str_tex_noise: string = "\
  88. fun hash(n: float): float { return frac(sin(n) * 10000.0); } \
  89. fun tex_noise_f(x: float3): float { \
  90. var step: float3 = float3(110.0, 241.0, 171.0); \
  91. var i: float3 = floor3(x); \
  92. var f: float3 = frac3(x); \
  93. var n: float = dot(i, step); \
  94. var u: float3 = f * f * (3.0 - 2.0 * f); \
  95. return lerp(lerp(lerp(hash(n + dot(step, float3(0.0, 0.0, 0.0))), hash(n + dot(step, float3(1.0, 0.0, 0.0))), u.x), \
  96. lerp(hash(n + dot(step, float3(0.0, 1.0, 0.0))), hash(n + dot(step, float3(1.0, 1.0, 0.0))), u.x), u.y), \
  97. lerp(lerp(hash(n + dot(step, float3(0.0, 0.0, 1.0))), hash(n + dot(step, float3(1.0, 0.0, 1.0))), u.x), \
  98. lerp(hash(n + dot(step, float3(0.0, 1.0, 1.0))), hash(n + dot(step, float3(1.0, 1.0, 1.0))), u.x), u.y), u.z); \
  99. } \
  100. fun tex_noise(p: float3): float { \
  101. p = p * 1.25; \
  102. var f: float = 0.5 * tex_noise_f(p); p = p * 2.01; \
  103. f += 0.25 * tex_noise_f(p); p = p * 2.02; \
  104. f += 0.125 * tex_noise_f(p); p = p * 2.03; \
  105. f += 0.0625 * tex_noise_f(p); \
  106. return 1.0 - f; \
  107. } \
  108. ";
  109. // Based on noise created by Nikita Miropolskiy, nikat/2013
  110. // Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
  111. let str_tex_musgrave: string = "\
  112. fun random3(c: float3): float3 { \
  113. var j: float = 4096.0 * sin(dot(c, float3(17.0, 59.4, 15.0))); \
  114. var r: float3; \
  115. r.z = frac(512.0 * j); \
  116. j *= 0.125; \
  117. r.x = frac(512.0 * j); \
  118. j *= 0.125; \
  119. r.y = frac(512.0 * j); \
  120. return r - 0.5; \
  121. } \
  122. fun tex_musgrave_f(p: float3): float { \
  123. var F3: float = 0.3333333; \
  124. var G3: float = 0.1666667; \
  125. var s: float3 = floor3(p + dot(p, float3(F3, F3, F3))); \
  126. var x: float3 = p - s + dot(s, float3(G3, G3, G3)); \
  127. var e: float3 = step3(float3(0.0, 0.0, 0.0), x - x.yzx); \
  128. var i1: float3 = e * (1.0 - e.zxy); \
  129. var i2: float3 = 1.0 - e.zxy * (1.0 - e); \
  130. var x1: float3 = x - i1 + G3; \
  131. var x2: float3 = x - i2 + 2.0 * G3; \
  132. var x3: float3 = x - 1.0 + 3.0 * G3; \
  133. var w: float4; \
  134. var d: float4; \
  135. w.x = dot(x, x); \
  136. w.y = dot(x1, x1); \
  137. w.z = dot(x2, x2); \
  138. w.w = dot(x3, x3); \
  139. w = max4(float4(0.6, 0.6, 0.6, 0.6) - w, float4(0.0, 0.0, 0.0, 0.0)); \
  140. d.x = dot(random3(s), x); \
  141. d.y = dot(random3(s + i1), x1); \
  142. d.z = dot(random3(s + i2), x2); \
  143. d.w = dot(random3(s + 1.0), x3); \
  144. w *= w; \
  145. w *= w; \
  146. d *= w; \
  147. return clamp(dot(d, float4(52.0, 52.0, 52.0, 52.0)), 0.0, 1.0); \
  148. } \
  149. ";
  150. let str_hue_sat: string = "\
  151. fun hsv_to_rgb(c: float3): float3 { \
  152. var K: float4 = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); \
  153. var p: float3 = abs3(frac3(c.xxx + K.xyz) * 6.0 - K.www); \
  154. return lerp3(K.xxx, clamp3(p - K.xxx, float3(0.0, 0.0, 0.0), float3(1.0, 1.0, 1.0)), c.y) * c.z; \
  155. } \
  156. fun rgb_to_hsv(c: float3): float3 { \
  157. var K: float4 = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); \
  158. var p: float4 = lerp4(float4(c.bg, K.wz), float4(c.gb, K.xy), step(c.b, c.g)); \
  159. var q: float4 = lerp4(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r)); \
  160. var d: float = q.x - min(q.w, q.y); \
  161. var e: float = 0.0000000001; \
  162. return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); \
  163. } \
  164. fun hue_sat(col: float3, shift: float4): float3 { \
  165. var hsv: float3 = rgb_to_hsv(col); \
  166. hsv.x += shift.x; \
  167. hsv.y *= shift.y; \
  168. hsv.z *= shift.z; \
  169. return lerp3(hsv_to_rgb(hsv), col, shift.w); \
  170. } \
  171. ";
  172. // https://x.com/Donzanoid/status/903424376707657730
  173. let str_wavelength_to_rgb: string = "\
  174. fun wavelength_to_rgb(t: float): float3 { \
  175. var r: float3 = t * 2.1 - float3(1.8, 1.14, 0.3); \
  176. return 1.0 - r * r; \
  177. } \
  178. ";
  179. let str_tex_magic: string = "\
  180. fun tex_magic(p: float3): float3 { \
  181. var a: float = 1.0 - (sin(p.x) + sin(p.y)); \
  182. var b: float = 1.0 - sin(p.x - p.y); \
  183. var c: float = 1.0 - sin(p.x + p.y); \
  184. return float3(a, b, c); \
  185. } \
  186. fun tex_magic_f(p: float3): float { \
  187. var c: float3 = tex_magic(p); \
  188. return (c.x + c.y + c.z) / 3.0; \
  189. } \
  190. ";
  191. let str_tex_brick: string = "\
  192. fun tex_brick_noise(n: int): float { \
  193. var nn: int; \
  194. n = (n >> 13) ^ n; \
  195. /*nn = (n * (n * n * 60493 + 19990303) + 1376312589) & 0x7fffffff;*/ \
  196. nn = (n * (n * n * 60493 + 19990303) + 1376312589) & 2147483647; \
  197. return 0.5 * float(nn) / 1073741824.0; \
  198. } \
  199. fun tex_brick(p: float3, c1: float3, c2: float3, c3: float3): float3 { \
  200. var brick_size: float3 = float3(0.9, 0.49, 0.49); \
  201. var mortar_size: float3 = float3(0.05, 0.1, 0.1); \
  202. p /= brick_size / 2.0; \
  203. if (frac(p.y * 0.5) > 0.5) { p.x += 0.5; } \
  204. var col: float = floor(p.x / (brick_size.x + (mortar_size.x * 2.0))); \
  205. var row: float = p.y; \
  206. p = frac3(p); \
  207. var b: float3 = step3(p, 1.0 - mortar_size); \
  208. /*var tint: float = min(max(tex_brick_noise((int(col) << 16) + (int(row) & 0xffff)), 0.0), 1.0);*/ \
  209. var tint: float = min(max(tex_brick_noise((int(col) << 16) + (int(row) & 65535)), 0.0), 1.0); \
  210. return lerp3(c3, lerp3(c1, c2, tint), b.x * b.y * b.z); \
  211. } \
  212. fun tex_brick_f(p: float3): float { \
  213. p /= float3(0.9, 0.49, 0.49) / 2.0; \
  214. if (frac(p.y * 0.5) > 0.5) { p.x += 0.5; } \
  215. p = frac3(p); \
  216. var b: float3 = step3(p, float3(0.95, 0.9, 0.9)); \
  217. return lerp(1.0, 0.0, b.x * b.y * b.z); \
  218. } \
  219. ";
  220. let str_tex_wave: string = "\
  221. fun tex_wave_f(p: float3): float { \
  222. return 1.0 - sin((p.x + p.y) * 10.0); \
  223. } \
  224. ";
  225. let str_brightcontrast: string = "\
  226. fun brightcontrast(col: float3, bright: float, contr: float): float3 { \
  227. var a: float = 1.0 + contr; \
  228. var b: float = bright - contr * 0.5; \
  229. return max3(a * col + b, float3(0.0, 0.0, 0.0)); \
  230. } \
  231. ";
  232. let str_cotangent_frame: string = "\
  233. fun cotangent_frame(n: float3, p: float3, tex_coord: float2): float3x3 { \
  234. var duv1: float2 = ddx2(tex_coord); \
  235. var duv2: float2 = ddy2(tex_coord); \
  236. var dp1: float3 = ddx3(p); \
  237. var dp2: float3 = ddy3(p); \
  238. var dp2perp: float3 = cross(dp2, n); \
  239. var dp1perp: float3 = cross(n, dp1); \
  240. var t: float3 = dp2perp * duv1.x + dp1perp * duv2.x; \
  241. var b: float3 = dp2perp * duv1.y + dp1perp * duv2.y; \
  242. var invmax: float = rsqrt(max(dot(t, t), dot(b, b))); \
  243. return float3x3(t * invmax, b * invmax, n); \
  244. } \
  245. ";
  246. let str_transpose: string = "\
  247. fun _transpose(m: float3x3): float3x3 { return float3x3(m[0][0], m[1][0], m[2][0], m[0][1], m[1][1], m[2][1], m[0][2], m[1][2], m[2][2]); }\
  248. ";
  249. let str_octahedron_wrap: string = "\
  250. fun octahedron_wrap(v: float2): float2 { \
  251. var a: float2; \
  252. if (v.x >= 0.0) { a.x = 1.0; } else { a.x = -1.0; } \
  253. if (v.y >= 0.0) { a.y = 1.0; } else { a.y = -1.0; } \
  254. var r: float2; \
  255. r.x = abs(v.y); \
  256. r.y = abs(v.x); \
  257. r.x = 1.0 - r.x; \
  258. r.y = 1.0 - r.y; \
  259. return r * a; \
  260. } \
  261. ";
  262. // let str_octahedron_wrap: string = "\
  263. // fun octahedron_wrap(v: float2): float2 { \
  264. // return (1.0 - abs(v.yx)) * (float2(v.x >= 0.0 ? 1.0 : -1.0, v.y >= 0.0 ? 1.0 : -1.0)); \
  265. // } \
  266. // ";
  267. let str_pack_float_int16: string = "\
  268. fun pack_f32_i16(f: float, i: uint): float { \
  269. return 0.062504762 * f + 0.062519999 * float(i); \
  270. } \
  271. ";
  272. // let str_pack_float_int16: string = "\
  273. // fun pack_f32_i16(f: float, i: uint): float { \
  274. // var prec: float = float(1 << 16); \
  275. // var maxi: float = float(1 << 4); \
  276. // var prec_minus_one: float = prec - 1.0; \
  277. // var t1: float = ((prec / maxi) - 1.0) / prec_minus_one; \
  278. // var t2: float = (prec / maxi) / prec_minus_one; \
  279. // return t1 * f + t2 * float(i); \
  280. // } \
  281. // ";
  282. ///if arm_skin
  283. let str_get_skinning_dual_quat: string = "\
  284. fun get_skinning_dual_quat(bone: int4, weight: float4, out A: float4, inout B: float4) { \
  285. var bonei: int4 = bone * 2; \
  286. var mat_a: float4x4 = float4x4( \
  287. skin_bones[bonei.x], \
  288. skin_bones[bonei.y], \
  289. skin_bones[bonei.z], \
  290. skin_bones[bonei.w]); \
  291. var mat_b: float4x4 = float4x4( \
  292. skin_bones[bonei.x + 1], \
  293. skin_bones[bonei.y + 1], \
  294. skin_bones[bonei.z + 1], \
  295. skin_bones[bonei.w + 1]); \
  296. weight.xyz *= sign(mat_a[3] * mat_a).xyz; \
  297. A = mat_a * weight; \
  298. B = mat_b * weight; \
  299. var inv_norm_a: float = 1.0 / length(A); \
  300. A *= inv_norm_a; \
  301. B *= inv_norm_a; \
  302. } \
  303. ";
  304. ///end
  305. let str_create_basis: string = "\
  306. fun create_basis(normal: float3, out tangent: float3, out binormal: float3) { \
  307. tangent = normalize(camera_right - normal * dot(camera_right, normal)); \
  308. binormal = cross(tangent, normal); \
  309. } \
  310. ";
  311. let str_sh_irradiance: string = "\
  312. fun sh_irradiance(nor: float3): float3 { \
  313. var c1: float = 0.429043; \
  314. var c2: float = 0.511664; \
  315. var c3: float = 0.743125; \
  316. var c4: float = 0.886227; \
  317. var c5: float = 0.247708; \
  318. var cl00: float3 = float3(constants.shirr0.x, constants.shirr0.y, constants.shirr0.z); \
  319. var cl1m1: float3 = float3(constants.shirr0.w, constants.shirr1.x, constants.shirr1.y); \
  320. var cl10: float3 = float3(constants.shirr1.z, constants.shirr1.w, constants.shirr2.x); \
  321. var cl11: float3 = float3(constants.shirr2.y, constants.shirr2.z, constants.shirr2.w); \
  322. var cl2m2: float3 = float3(constants.shirr3.x, constants.shirr3.y, constants.shirr3.z); \
  323. var cl2m1: float3 = float3(constants.shirr3.w, constants.shirr4.x, constants.shirr4.y); \
  324. var cl20: float3 = float3(constants.shirr4.z, constants.shirr4.w, constants.shirr5.x); \
  325. var cl21: float3 = float3(constants.shirr5.y, constants.shirr5.z, constants.shirr5.w); \
  326. var cl22: float3 = float3(constants.shirr6.x, constants.shirr6.y, constants.shirr6.z); \
  327. return ( \
  328. cl22 * c1 * (nor.y * nor.y - (-nor.z) * (-nor.z)) + \
  329. cl20 * c3 * nor.x * nor.x + \
  330. cl00 * c4 - \
  331. cl20 * c5 + \
  332. cl2m2 * 2.0 * c1 * nor.y * (-nor.z) + \
  333. cl21 * 2.0 * c1 * nor.y * nor.x + \
  334. cl2m1 * 2.0 * c1 * (-nor.z) * nor.x + \
  335. cl11 * 2.0 * c2 * nor.y + \
  336. cl1m1 * 2.0 * c2 * (-nor.z) + \
  337. cl10 * 2.0 * c2 * nor.x \
  338. ); \
  339. } \
  340. ";
  341. let str_envmap_equirect: string = "\
  342. fun envmap_equirect(normal: float3, angle: float): float2 { \
  343. var PI: float = 3.1415926535; \
  344. var PI2: float = PI * 2.0; \
  345. var phi: float = acos(normal.z); \
  346. var theta: float = atan2(-normal.y, normal.x) + PI + angle; \
  347. return float2(theta / PI2, phi / PI); \
  348. } \
  349. ";
  350. let str_envmap_sample: string = "\
  351. fun envmap_sample(lod: float, coord: float2): float3 { \
  352. if (lod == 0.0) { \
  353. return sample_lod(senvmap_radiance, sampler_linear, coord, 0.0).rgb; \
  354. } \
  355. if (lod == 1.0) { \
  356. return sample_lod(senvmap_radiance0, sampler_linear, coord, 0.0).rgb; \
  357. } \
  358. if (lod == 2.0) { \
  359. return sample_lod(senvmap_radiance1, sampler_linear, coord, 0.0).rgb; \
  360. } \
  361. if (lod == 3.0) { \
  362. return sample_lod(senvmap_radiance2, sampler_linear, coord, 0.0).rgb; \
  363. } \
  364. if (lod == 4.0) { \
  365. return sample_lod(senvmap_radiance3, sampler_linear, coord, 0.0).rgb; \
  366. } \
  367. return sample_lod(senvmap_radiance4, sampler_linear, coord, 0.0).rgb; \
  368. } \
  369. ";
  370. let str_get_pos_nor_from_depth: string = "\
  371. fun get_pos_from_depth(uv: float2, invVP: float4x4): float3 { \
  372. var depth: float = sample_lod(gbufferD, sampler_linear, float2(uv.x, 1.0 - uv.y), 0.0).r; \
  373. var wpos: float4 = float4(uv * 2.0 - 1.0, depth * 2.0 - 1.0, 1.0); \
  374. wpos = invVP * wpos; \
  375. return wpos.xyz / wpos.w; \
  376. } \
  377. fun get_nor_from_depth(p0: float3, uv: float2, invVP: float4x4, tex_step: float2): float3 { \
  378. var p1: float3 = get_pos_from_depth(uv + float2(tex_step.x * 4.0, 0.0), invVP); \
  379. var p2: float3 = get_pos_from_depth(uv + float2(0.0, tex_step.y * 4.0), invVP); \
  380. return normalize(cross(p2 - p0, p1 - p0)); \
  381. } \
  382. ";
  383. ////
  384. let str_get_smudge_tool_weight: string = "\
  385. fun get_smudge_tool_weight(i: int): float { \
  386. if (i == 0) { return 1.0 / 28.0; } \
  387. if (i == 1) { return 2.0 / 28.0; } \
  388. if (i == 2) { return 3.0 / 28.0; } \
  389. if (i == 3) { return 4.0 / 28.0; } \
  390. if (i == 4) { return 5.0 / 28.0; } \
  391. if (i == 5) { return 6.0 / 28.0; } \
  392. return 7.0 / 28.0; \
  393. } \
  394. ";
  395. let str_get_blur_tool_weight: string = "\
  396. fun get_blur_tool_weight(i: int): float { \
  397. if (i == 0) { return 0.034619 / 2.0; } \
  398. if (i == 1) { return 0.044859 / 2.0; } \
  399. if (i == 2) { return 0.055857 / 2.0; } \
  400. if (i == 3) { return 0.066833 / 2.0; } \
  401. if (i == 4) { return 0.076841 / 2.0; } \
  402. if (i == 5) { return 0.084894 / 2.0; } \
  403. if (i == 6) { return 0.090126 / 2.0; } \
  404. if (i == 7) { return 0.09194 / 2.0; } \
  405. if (i == 8) { return 0.090126 / 2.0; } \
  406. if (i == 9) { return 0.084894 / 2.0; } \
  407. if (i == 10) { return 0.076841 / 2.0; } \
  408. if (i == 11) { return 0.066833 / 2.0; } \
  409. if (i == 12) { return 0.055857 / 2.0; } \
  410. if (i == 13) { return 0.044859 / 2.0; } \
  411. return 0.034619 / 2.0; \
  412. } \
  413. ";
  414. ////