world_data.ts 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. let _world_data_empty_irr: f32_array_t = null;
  2. function world_data_parse(name: string, id: string): world_data_t {
  3. let format: scene_t = data_get_scene_raw(name);
  4. let raw: world_data_t = world_data_get_raw_by_name(format.world_datas, id);
  5. if (raw == null) {
  6. iron_log("World data '" + id + "' not found!");
  7. return null;
  8. }
  9. raw._ = {};
  10. raw._.radiance_mipmaps = [];
  11. let irr: f32_array_t = world_data_set_irradiance(raw);
  12. raw._.irradiance = irr;
  13. if (raw.radiance != null) {
  14. let rad: gpu_texture_t = data_get_image(raw.radiance);
  15. raw._.radiance = rad;
  16. while (raw._.radiance_mipmaps.length < raw.radiance_mipmaps) {
  17. array_push(raw._.radiance_mipmaps, null);
  18. }
  19. let dot: i32 = string_last_index_of(raw.radiance, ".");
  20. let ext: string = substring(raw.radiance, dot, raw.radiance.length);
  21. let base: string = substring(raw.radiance, 0, dot);
  22. for (let i: i32 = 0; i < raw.radiance_mipmaps; ++i) {
  23. let mipimg: gpu_texture_t = data_get_image(base + "_" + i + ext);
  24. raw._.radiance_mipmaps[i] = mipimg;
  25. }
  26. }
  27. return raw;
  28. }
  29. function world_data_get_raw_by_name(datas: world_data_t[], name: string): world_data_t {
  30. if (name == "") {
  31. return datas[0];
  32. }
  33. for (let i: i32 = 0; i < datas.length; ++i) {
  34. if (datas[i].name == name) {
  35. return datas[i];
  36. }
  37. }
  38. return null;
  39. }
  40. function world_data_get_empty_irradiance(): f32_array_t {
  41. if (_world_data_empty_irr == null) {
  42. _world_data_empty_irr = f32_array_create(28);
  43. for (let i: i32 = 0; i < _world_data_empty_irr.length; ++i) {
  44. _world_data_empty_irr[i] = 0.0;
  45. }
  46. }
  47. return _world_data_empty_irr;
  48. }
  49. function world_data_set_irradiance(raw: world_data_t): f32_array_t {
  50. if (raw.irradiance == null) {
  51. return world_data_get_empty_irradiance();
  52. }
  53. else {
  54. let b: buffer_t = data_get_blob(raw.irradiance + ".arm");
  55. let irradiance_parsed: irradiance_t = armpack_decode(b);
  56. let irr: f32_array_t = f32_array_create(28); // Align to mult of 4 - 27->28
  57. for (let i: i32 = 0; i < 27; ++i) {
  58. irr[i] = irradiance_parsed.irradiance[i];
  59. }
  60. return irr;
  61. }
  62. }
  63. function world_data_load_envmap(raw: world_data_t) {
  64. if (raw.envmap != null) {
  65. let image: gpu_texture_t = data_get_image(raw.envmap);
  66. raw._.envmap = image;
  67. }
  68. }