@aguacerowx/react-native 0.0.39 → 0.0.42

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 (408) hide show
  1. package/README.md +126 -126
  2. package/aguacerowx-react-native.podspec +38 -38
  3. package/android/.gradle/buildOutputCleanup/cache.properties +2 -2
  4. package/android/build/.transforms/42e9b8fa82d77a1c205db5bf0d0ed519/results.bin +1 -0
  5. package/android/build/.transforms/42e9b8fa82d77a1c205db5bf0d0ed519/transformed/classes/classes_dex/classes.dex +0 -0
  6. package/android/build/.transforms/8f329a9571a96a1c1c0869d49784e448/results.bin +1 -0
  7. package/android/build/.transforms/8f329a9571a96a1c1c0869d49784e448/transformed/classes/classes_dex/classes.dex +0 -0
  8. package/android/build/.transforms/c8ab78b63f2cc835ac936d58e29a17ab/results.bin +1 -0
  9. package/android/build/.transforms/c8ab78b63f2cc835ac936d58e29a17ab/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/aguacerowx/reactnative/AguaceroPackage.dex +0 -0
  10. package/android/build/.transforms/c8ab78b63f2cc835ac936d58e29a17ab/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/aguacerowx/reactnative/BuildConfig.dex +0 -0
  11. package/android/build/.transforms/c8ab78b63f2cc835ac936d58e29a17ab/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/aguacerowx/reactnative/GridRenderLayer$VertexInfo.dex +0 -0
  12. package/android/build/.transforms/c8ab78b63f2cc835ac936d58e29a17ab/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/aguacerowx/reactnative/GridRenderLayer.dex +0 -0
  13. package/android/build/.transforms/c8ab78b63f2cc835ac936d58e29a17ab/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/aguacerowx/reactnative/GridRenderLayerView.dex +0 -0
  14. package/android/build/.transforms/c8ab78b63f2cc835ac936d58e29a17ab/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/aguacerowx/reactnative/GridRenderManager.dex +0 -0
  15. package/android/build/.transforms/c8ab78b63f2cc835ac936d58e29a17ab/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/aguacerowx/reactnative/InspectorModule.dex +0 -0
  16. package/android/build/.transforms/c8ab78b63f2cc835ac936d58e29a17ab/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/aguacerowx/reactnative/ShaderUtils.dex +0 -0
  17. package/android/build/.transforms/c8ab78b63f2cc835ac936d58e29a17ab/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/aguacerowx/reactnative/WeatherFrameProcessorModule$1.dex +0 -0
  18. package/android/build/.transforms/c8ab78b63f2cc835ac936d58e29a17ab/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/aguacerowx/reactnative/WeatherFrameProcessorModule.dex +0 -0
  19. package/android/build/.transforms/c8ab78b63f2cc835ac936d58e29a17ab/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/facebook/react/viewmanagers/GridRenderLayerManagerDelegate.dex +0 -0
  20. package/android/build/.transforms/c8ab78b63f2cc835ac936d58e29a17ab/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/facebook/react/viewmanagers/GridRenderLayerManagerInterface.dex +0 -0
  21. package/android/build/.transforms/c8ab78b63f2cc835ac936d58e29a17ab/transformed/bundleLibRuntimeToDirDebug/desugar_graph.bin +0 -0
  22. package/android/build/.transforms/f95abdfc98a7a06fc247f75cdd74def9/results.bin +1 -0
  23. package/android/build/.transforms/f95abdfc98a7a06fc247f75cdd74def9/transformed/classes/classes_dex/classes.dex +0 -0
  24. package/android/build/generated/source/buildConfig/debug/com/aguacerowx/reactnative/BuildConfig.java +10 -0
  25. package/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/GridRenderLayerManagerDelegate.java +43 -0
  26. package/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/GridRenderLayerManagerInterface.java +22 -0
  27. package/android/build/generated/source/codegen/jni/AguaceroWxReactNativeSpec-generated.cpp +22 -0
  28. package/android/build/generated/source/codegen/jni/AguaceroWxReactNativeSpec.h +24 -0
  29. package/android/build/generated/source/codegen/jni/CMakeLists.txt +28 -0
  30. package/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/AguaceroWxReactNativeSpecJSI-generated.cpp +17 -0
  31. package/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/AguaceroWxReactNativeSpecJSI.h +19 -0
  32. package/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/ComponentDescriptors.cpp +22 -0
  33. package/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/ComponentDescriptors.h +24 -0
  34. package/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/EventEmitters.cpp +16 -0
  35. package/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/EventEmitters.h +23 -0
  36. package/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/Props.cpp +62 -0
  37. package/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/Props.h +40 -0
  38. package/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/ShadowNodes.cpp +17 -0
  39. package/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/ShadowNodes.h +32 -0
  40. package/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/States.cpp +16 -0
  41. package/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/States.h +20 -0
  42. package/android/build/generated/source/codegen/schema.json +1 -0
  43. package/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml +8 -0
  44. package/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json +18 -0
  45. package/android/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties +6 -0
  46. package/android/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json +1 -0
  47. package/android/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar +0 -0
  48. package/android/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar +0 -0
  49. package/android/build/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt +4 -0
  50. package/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/raw_debug_fragment_shader.glsl.flat +0 -0
  51. package/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/raw_debug_vertex_shader.glsl.flat +0 -0
  52. package/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/raw_fragment_shader.glsl.flat +0 -0
  53. package/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/raw_vertex_shader.glsl.flat +0 -0
  54. package/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +5 -0
  55. package/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml +2 -0
  56. package/android/build/intermediates/incremental/mergeDebugAssets/merger.xml +2 -0
  57. package/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml +2 -0
  58. package/android/build/intermediates/incremental/mergeDebugShaders/merger.xml +2 -0
  59. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/AguaceroPackage.class +0 -0
  60. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/BuildConfig.class +0 -0
  61. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/GridRenderLayer$VertexInfo.class +0 -0
  62. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/GridRenderLayer.class +0 -0
  63. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/GridRenderLayerView.class +0 -0
  64. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/GridRenderManager.class +0 -0
  65. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/InspectorModule.class +0 -0
  66. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/ShaderUtils.class +0 -0
  67. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/WeatherFrameProcessorModule$1.class +0 -0
  68. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/WeatherFrameProcessorModule.class +0 -0
  69. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/facebook/react/viewmanagers/GridRenderLayerManagerDelegate.class +0 -0
  70. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/facebook/react/viewmanagers/GridRenderLayerManagerInterface.class +0 -0
  71. package/android/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt +6 -0
  72. package/android/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt +8 -0
  73. package/android/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml +8 -0
  74. package/android/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json +1 -0
  75. package/android/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt +1 -0
  76. package/android/build/intermediates/packaged_res/debug/packageDebugResources/raw/debug_fragment_shader.glsl +13 -0
  77. package/android/build/intermediates/packaged_res/debug/packageDebugResources/raw/debug_vertex_shader.glsl +13 -0
  78. package/android/build/intermediates/packaged_res/debug/packageDebugResources/raw/fragment_shader.glsl +181 -0
  79. package/android/build/intermediates/packaged_res/debug/packageDebugResources/raw/vertex_shader.glsl +20 -0
  80. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/AguaceroPackage.class +0 -0
  81. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/BuildConfig.class +0 -0
  82. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/GridRenderLayer$VertexInfo.class +0 -0
  83. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/GridRenderLayer.class +0 -0
  84. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/GridRenderLayerView.class +0 -0
  85. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/GridRenderManager.class +0 -0
  86. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/InspectorModule.class +0 -0
  87. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/ShaderUtils.class +0 -0
  88. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/WeatherFrameProcessorModule$1.class +0 -0
  89. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/WeatherFrameProcessorModule.class +0 -0
  90. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/facebook/react/viewmanagers/GridRenderLayerManagerDelegate.class +0 -0
  91. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/facebook/react/viewmanagers/GridRenderLayerManagerInterface.class +0 -0
  92. package/android/build/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar +0 -0
  93. package/android/build/intermediates/symbol_list_with_package_name/debug/generateDebugRFile/package-aware-r.txt +5 -0
  94. package/android/build/outputs/logs/manifest-merger-debug-report.txt +17 -0
  95. package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/AguaceroPackage.class.uniqueId2 +0 -0
  96. package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/WeatherFrameProcessorModule$1.class.uniqueId0 +0 -0
  97. package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/WeatherFrameProcessorModule.class.uniqueId1 +0 -0
  98. package/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin +0 -0
  99. package/android/build.gradle +107 -107
  100. package/android/src/main/AndroidManifest.xml +6 -6
  101. package/android/src/main/java/com/aguacerowx/reactnative/AguaceroPackage.java +33 -33
  102. package/android/src/main/java/com/aguacerowx/reactnative/GridRenderLayer.java +732 -688
  103. package/android/src/main/java/com/aguacerowx/reactnative/GridRenderLayerView.java +232 -304
  104. package/android/src/main/java/com/aguacerowx/reactnative/GridRenderManager.java +125 -125
  105. package/android/src/main/java/com/aguacerowx/reactnative/InspectorModule.java +145 -71
  106. package/android/src/main/java/com/aguacerowx/reactnative/ShaderUtils.java +106 -106
  107. package/android/src/main/java/com/aguacerowx/reactnative/WeatherFrameProcessorModule.java +270 -151
  108. package/android/src/main/res/raw/debug_fragment_shader.glsl +12 -12
  109. package/android/src/main/res/raw/debug_vertex_shader.glsl +12 -12
  110. package/android/src/main/res/raw/fragment_shader.glsl +180 -180
  111. package/android/src/main/res/raw/vertex_shader.glsl +19 -19
  112. package/index.js +2 -2
  113. package/ios/AguaceroPackage.m +18 -18
  114. package/ios/FragmentUniforms.swift +15 -15
  115. package/ios/GridRenderLayer.swift +1158 -1114
  116. package/ios/GridRenderLayerBridge.swift +44 -44
  117. package/ios/GridRenderLayerManager.mm +171 -171
  118. package/ios/GridRenderLayerView.h +30 -30
  119. package/ios/GridRenderLayerView.m +200 -200
  120. package/ios/InspectorDataCache.swift +63 -63
  121. package/ios/InspectorModule.m +9 -9
  122. package/ios/InspectorModule.swift +112 -112
  123. package/ios/Shaders.metal +319 -319
  124. package/ios/WeatherFrameProcessorModule.m +15 -15
  125. package/ios/WeatherFrameProcessorModule.swift +152 -152
  126. package/lib/commonjs/README.md +126 -126
  127. package/lib/commonjs/aguacerowx-react-native.podspec +38 -38
  128. package/lib/commonjs/android/build/generated/source/buildConfig/debug/com/aguacerowx/reactnative/BuildConfig.java +10 -0
  129. package/lib/commonjs/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/GridRenderLayerManagerDelegate.java +43 -0
  130. package/lib/commonjs/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/GridRenderLayerManagerInterface.java +22 -0
  131. package/lib/commonjs/android/build/generated/source/codegen/jni/AguaceroWxReactNativeSpec-generated.cpp +22 -0
  132. package/lib/commonjs/android/build/generated/source/codegen/jni/AguaceroWxReactNativeSpec.h +24 -0
  133. package/lib/commonjs/android/build/generated/source/codegen/jni/CMakeLists.txt +28 -0
  134. package/lib/commonjs/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/AguaceroWxReactNativeSpecJSI-generated.cpp +17 -0
  135. package/lib/commonjs/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/AguaceroWxReactNativeSpecJSI.h +19 -0
  136. package/lib/commonjs/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/ComponentDescriptors.cpp +22 -0
  137. package/lib/commonjs/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/ComponentDescriptors.h +24 -0
  138. package/lib/commonjs/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/EventEmitters.cpp +16 -0
  139. package/lib/commonjs/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/EventEmitters.h +23 -0
  140. package/lib/commonjs/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/Props.cpp +62 -0
  141. package/lib/commonjs/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/Props.h +40 -0
  142. package/lib/commonjs/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/ShadowNodes.cpp +17 -0
  143. package/lib/commonjs/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/ShadowNodes.h +32 -0
  144. package/lib/commonjs/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/States.cpp +16 -0
  145. package/lib/commonjs/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/States.h +20 -0
  146. package/lib/commonjs/android/build/generated/source/codegen/schema.json +1 -0
  147. package/lib/commonjs/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml +8 -0
  148. package/lib/commonjs/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json +18 -0
  149. package/lib/commonjs/android/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties +6 -0
  150. package/lib/commonjs/android/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json +1 -0
  151. package/lib/commonjs/android/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar +0 -0
  152. package/lib/commonjs/android/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar +0 -0
  153. package/lib/commonjs/android/build/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt +4 -0
  154. package/lib/commonjs/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/raw_debug_fragment_shader.glsl.flat +0 -0
  155. package/lib/commonjs/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/raw_debug_vertex_shader.glsl.flat +0 -0
  156. package/lib/commonjs/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/raw_fragment_shader.glsl.flat +0 -0
  157. package/lib/commonjs/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/raw_vertex_shader.glsl.flat +0 -0
  158. package/lib/commonjs/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +5 -0
  159. package/lib/commonjs/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml +2 -0
  160. package/lib/commonjs/android/build/intermediates/incremental/mergeDebugAssets/merger.xml +2 -0
  161. package/lib/commonjs/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml +2 -0
  162. package/lib/commonjs/android/build/intermediates/incremental/mergeDebugShaders/merger.xml +2 -0
  163. package/lib/commonjs/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/AguaceroPackage.class +0 -0
  164. package/lib/commonjs/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/BuildConfig.class +0 -0
  165. package/lib/commonjs/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/GridRenderLayer$VertexInfo.class +0 -0
  166. package/lib/commonjs/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/GridRenderLayer.class +0 -0
  167. package/lib/commonjs/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/GridRenderLayerView.class +0 -0
  168. package/lib/commonjs/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/GridRenderManager.class +0 -0
  169. package/lib/commonjs/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/InspectorModule.class +0 -0
  170. package/lib/commonjs/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/ShaderUtils.class +0 -0
  171. package/lib/commonjs/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/WeatherFrameProcessorModule$1.class +0 -0
  172. package/lib/commonjs/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/WeatherFrameProcessorModule.class +0 -0
  173. package/lib/commonjs/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/facebook/react/viewmanagers/GridRenderLayerManagerDelegate.class +0 -0
  174. package/lib/commonjs/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/facebook/react/viewmanagers/GridRenderLayerManagerInterface.class +0 -0
  175. package/lib/commonjs/android/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt +6 -0
  176. package/lib/commonjs/android/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt +8 -0
  177. package/lib/commonjs/android/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml +8 -0
  178. package/lib/commonjs/android/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json +1 -0
  179. package/lib/commonjs/android/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt +1 -0
  180. package/lib/commonjs/android/build/intermediates/packaged_res/debug/packageDebugResources/raw/debug_fragment_shader.glsl +13 -0
  181. package/lib/commonjs/android/build/intermediates/packaged_res/debug/packageDebugResources/raw/debug_vertex_shader.glsl +13 -0
  182. package/lib/commonjs/android/build/intermediates/packaged_res/debug/packageDebugResources/raw/fragment_shader.glsl +181 -0
  183. package/lib/commonjs/android/build/intermediates/packaged_res/debug/packageDebugResources/raw/vertex_shader.glsl +20 -0
  184. package/lib/commonjs/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/AguaceroPackage.class +0 -0
  185. package/lib/commonjs/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/BuildConfig.class +0 -0
  186. package/lib/commonjs/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/GridRenderLayer$VertexInfo.class +0 -0
  187. package/lib/commonjs/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/GridRenderLayer.class +0 -0
  188. package/lib/commonjs/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/GridRenderLayerView.class +0 -0
  189. package/lib/commonjs/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/GridRenderManager.class +0 -0
  190. package/lib/commonjs/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/InspectorModule.class +0 -0
  191. package/lib/commonjs/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/ShaderUtils.class +0 -0
  192. package/lib/commonjs/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/WeatherFrameProcessorModule$1.class +0 -0
  193. package/lib/commonjs/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/WeatherFrameProcessorModule.class +0 -0
  194. package/lib/commonjs/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/facebook/react/viewmanagers/GridRenderLayerManagerDelegate.class +0 -0
  195. package/lib/commonjs/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/facebook/react/viewmanagers/GridRenderLayerManagerInterface.class +0 -0
  196. package/lib/commonjs/android/build/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar +0 -0
  197. package/lib/commonjs/android/build/intermediates/symbol_list_with_package_name/debug/generateDebugRFile/package-aware-r.txt +5 -0
  198. package/lib/commonjs/android/build/outputs/logs/manifest-merger-debug-report.txt +17 -0
  199. package/lib/commonjs/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/AguaceroPackage.class.uniqueId2 +0 -0
  200. package/lib/commonjs/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/WeatherFrameProcessorModule$1.class.uniqueId0 +0 -0
  201. package/lib/commonjs/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/WeatherFrameProcessorModule.class.uniqueId1 +0 -0
  202. package/lib/commonjs/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin +0 -0
  203. package/lib/commonjs/android/build.gradle +107 -107
  204. package/lib/commonjs/android/src/main/AndroidManifest.xml +6 -6
  205. package/lib/commonjs/android/src/main/java/com/aguacerowx/reactnative/AguaceroPackage.java +33 -33
  206. package/lib/commonjs/android/src/main/java/com/aguacerowx/reactnative/GridRenderLayer.java +732 -688
  207. package/lib/commonjs/android/src/main/java/com/aguacerowx/reactnative/GridRenderLayerView.java +232 -304
  208. package/lib/commonjs/android/src/main/java/com/aguacerowx/reactnative/GridRenderManager.java +125 -125
  209. package/lib/commonjs/android/src/main/java/com/aguacerowx/reactnative/InspectorModule.java +145 -71
  210. package/lib/commonjs/android/src/main/java/com/aguacerowx/reactnative/ShaderUtils.java +106 -106
  211. package/lib/commonjs/android/src/main/java/com/aguacerowx/reactnative/WeatherFrameProcessorModule.java +270 -151
  212. package/lib/commonjs/android/src/main/res/raw/debug_fragment_shader.glsl +12 -12
  213. package/lib/commonjs/android/src/main/res/raw/debug_vertex_shader.glsl +12 -12
  214. package/lib/commonjs/android/src/main/res/raw/fragment_shader.glsl +180 -180
  215. package/lib/commonjs/android/src/main/res/raw/vertex_shader.glsl +19 -19
  216. package/lib/commonjs/babel.config.js.map +1 -1
  217. package/lib/commonjs/index.js.map +1 -1
  218. package/lib/commonjs/ios/AguaceroPackage.m +18 -18
  219. package/lib/commonjs/ios/FragmentUniforms.swift +15 -15
  220. package/lib/commonjs/ios/GridRenderLayer.swift +1158 -1114
  221. package/lib/commonjs/ios/GridRenderLayerBridge.swift +44 -44
  222. package/lib/commonjs/ios/GridRenderLayerManager.mm +171 -171
  223. package/lib/commonjs/ios/GridRenderLayerView.h +30 -30
  224. package/lib/commonjs/ios/GridRenderLayerView.m +200 -200
  225. package/lib/commonjs/ios/InspectorDataCache.swift +63 -63
  226. package/lib/commonjs/ios/InspectorModule.m +9 -9
  227. package/lib/commonjs/ios/InspectorModule.swift +112 -112
  228. package/lib/commonjs/ios/Shaders.metal +319 -319
  229. package/lib/commonjs/ios/WeatherFrameProcessorModule.m +15 -15
  230. package/lib/commonjs/ios/WeatherFrameProcessorModule.swift +152 -152
  231. package/lib/commonjs/package.json +72 -72
  232. package/lib/commonjs/react-native-builder-bob.config.js.map +1 -1
  233. package/lib/commonjs/scripts/compile-shaders.js.map +1 -1
  234. package/lib/commonjs/scripts/compile-shaders.sh +38 -38
  235. package/lib/commonjs/src/AguaceroContext.js.map +1 -1
  236. package/lib/commonjs/src/GridRenderLayer.js.map +1 -1
  237. package/lib/commonjs/src/GridRenderLayerNativeComponent.js.map +1 -1
  238. package/lib/commonjs/src/MapManager.js.map +1 -1
  239. package/lib/commonjs/src/MapRegistry.js.map +1 -1
  240. package/lib/commonjs/src/StyleApplicator.js +6 -6
  241. package/lib/commonjs/src/StyleApplicator.js.map +1 -1
  242. package/lib/commonjs/src/WeatherLayerManager.js +6 -42
  243. package/lib/commonjs/src/WeatherLayerManager.js.map +1 -1
  244. package/lib/commonjs/tsconfig.json +23 -23
  245. package/lib/module/README.md +126 -126
  246. package/lib/module/aguacerowx-react-native.podspec +38 -38
  247. package/lib/module/android/build/generated/source/buildConfig/debug/com/aguacerowx/reactnative/BuildConfig.java +10 -0
  248. package/lib/module/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/GridRenderLayerManagerDelegate.java +43 -0
  249. package/lib/module/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/GridRenderLayerManagerInterface.java +22 -0
  250. package/lib/module/android/build/generated/source/codegen/jni/AguaceroWxReactNativeSpec-generated.cpp +22 -0
  251. package/lib/module/android/build/generated/source/codegen/jni/AguaceroWxReactNativeSpec.h +24 -0
  252. package/lib/module/android/build/generated/source/codegen/jni/CMakeLists.txt +28 -0
  253. package/lib/module/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/AguaceroWxReactNativeSpecJSI-generated.cpp +17 -0
  254. package/lib/module/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/AguaceroWxReactNativeSpecJSI.h +19 -0
  255. package/lib/module/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/ComponentDescriptors.cpp +22 -0
  256. package/lib/module/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/ComponentDescriptors.h +24 -0
  257. package/lib/module/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/EventEmitters.cpp +16 -0
  258. package/lib/module/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/EventEmitters.h +23 -0
  259. package/lib/module/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/Props.cpp +62 -0
  260. package/lib/module/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/Props.h +40 -0
  261. package/lib/module/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/ShadowNodes.cpp +17 -0
  262. package/lib/module/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/ShadowNodes.h +32 -0
  263. package/lib/module/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/States.cpp +16 -0
  264. package/lib/module/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/States.h +20 -0
  265. package/lib/module/android/build/generated/source/codegen/schema.json +1 -0
  266. package/lib/module/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml +8 -0
  267. package/lib/module/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json +18 -0
  268. package/lib/module/android/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties +6 -0
  269. package/lib/module/android/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json +1 -0
  270. package/lib/module/android/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar +0 -0
  271. package/lib/module/android/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar +0 -0
  272. package/lib/module/android/build/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt +4 -0
  273. package/lib/module/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/raw_debug_fragment_shader.glsl.flat +0 -0
  274. package/lib/module/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/raw_debug_vertex_shader.glsl.flat +0 -0
  275. package/lib/module/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/raw_fragment_shader.glsl.flat +0 -0
  276. package/lib/module/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/raw_vertex_shader.glsl.flat +0 -0
  277. package/lib/module/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +5 -0
  278. package/lib/module/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml +2 -0
  279. package/lib/module/android/build/intermediates/incremental/mergeDebugAssets/merger.xml +2 -0
  280. package/lib/module/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml +2 -0
  281. package/lib/module/android/build/intermediates/incremental/mergeDebugShaders/merger.xml +2 -0
  282. package/lib/module/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/AguaceroPackage.class +0 -0
  283. package/lib/module/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/BuildConfig.class +0 -0
  284. package/lib/module/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/GridRenderLayer$VertexInfo.class +0 -0
  285. package/lib/module/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/GridRenderLayer.class +0 -0
  286. package/lib/module/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/GridRenderLayerView.class +0 -0
  287. package/lib/module/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/GridRenderManager.class +0 -0
  288. package/lib/module/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/InspectorModule.class +0 -0
  289. package/lib/module/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/ShaderUtils.class +0 -0
  290. package/lib/module/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/WeatherFrameProcessorModule$1.class +0 -0
  291. package/lib/module/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/WeatherFrameProcessorModule.class +0 -0
  292. package/lib/module/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/facebook/react/viewmanagers/GridRenderLayerManagerDelegate.class +0 -0
  293. package/lib/module/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/facebook/react/viewmanagers/GridRenderLayerManagerInterface.class +0 -0
  294. package/lib/module/android/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt +6 -0
  295. package/lib/module/android/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt +8 -0
  296. package/lib/module/android/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml +8 -0
  297. package/lib/module/android/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json +1 -0
  298. package/lib/module/android/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt +1 -0
  299. package/lib/module/android/build/intermediates/packaged_res/debug/packageDebugResources/raw/debug_fragment_shader.glsl +13 -0
  300. package/lib/module/android/build/intermediates/packaged_res/debug/packageDebugResources/raw/debug_vertex_shader.glsl +13 -0
  301. package/lib/module/android/build/intermediates/packaged_res/debug/packageDebugResources/raw/fragment_shader.glsl +181 -0
  302. package/lib/module/android/build/intermediates/packaged_res/debug/packageDebugResources/raw/vertex_shader.glsl +20 -0
  303. package/lib/module/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/AguaceroPackage.class +0 -0
  304. package/lib/module/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/BuildConfig.class +0 -0
  305. package/lib/module/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/GridRenderLayer$VertexInfo.class +0 -0
  306. package/lib/module/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/GridRenderLayer.class +0 -0
  307. package/lib/module/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/GridRenderLayerView.class +0 -0
  308. package/lib/module/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/GridRenderManager.class +0 -0
  309. package/lib/module/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/InspectorModule.class +0 -0
  310. package/lib/module/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/ShaderUtils.class +0 -0
  311. package/lib/module/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/WeatherFrameProcessorModule$1.class +0 -0
  312. package/lib/module/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/WeatherFrameProcessorModule.class +0 -0
  313. package/lib/module/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/facebook/react/viewmanagers/GridRenderLayerManagerDelegate.class +0 -0
  314. package/lib/module/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/facebook/react/viewmanagers/GridRenderLayerManagerInterface.class +0 -0
  315. package/lib/module/android/build/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar +0 -0
  316. package/lib/module/android/build/intermediates/symbol_list_with_package_name/debug/generateDebugRFile/package-aware-r.txt +5 -0
  317. package/lib/module/android/build/outputs/logs/manifest-merger-debug-report.txt +17 -0
  318. package/lib/module/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/AguaceroPackage.class.uniqueId2 +0 -0
  319. package/lib/module/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/WeatherFrameProcessorModule$1.class.uniqueId0 +0 -0
  320. package/lib/module/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/WeatherFrameProcessorModule.class.uniqueId1 +0 -0
  321. package/lib/module/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin +0 -0
  322. package/lib/module/android/build.gradle +107 -107
  323. package/lib/module/android/src/main/AndroidManifest.xml +6 -6
  324. package/lib/module/android/src/main/java/com/aguacerowx/reactnative/AguaceroPackage.java +33 -33
  325. package/lib/module/android/src/main/java/com/aguacerowx/reactnative/GridRenderLayer.java +732 -688
  326. package/lib/module/android/src/main/java/com/aguacerowx/reactnative/GridRenderLayerView.java +232 -304
  327. package/lib/module/android/src/main/java/com/aguacerowx/reactnative/GridRenderManager.java +125 -125
  328. package/lib/module/android/src/main/java/com/aguacerowx/reactnative/InspectorModule.java +145 -71
  329. package/lib/module/android/src/main/java/com/aguacerowx/reactnative/ShaderUtils.java +106 -106
  330. package/lib/module/android/src/main/java/com/aguacerowx/reactnative/WeatherFrameProcessorModule.java +270 -151
  331. package/lib/module/android/src/main/res/raw/debug_fragment_shader.glsl +12 -12
  332. package/lib/module/android/src/main/res/raw/debug_vertex_shader.glsl +12 -12
  333. package/lib/module/android/src/main/res/raw/fragment_shader.glsl +180 -180
  334. package/lib/module/android/src/main/res/raw/vertex_shader.glsl +19 -19
  335. package/lib/module/babel.config.js.map +1 -1
  336. package/lib/module/index.js.map +1 -1
  337. package/lib/module/ios/AguaceroPackage.m +18 -18
  338. package/lib/module/ios/FragmentUniforms.swift +15 -15
  339. package/lib/module/ios/GridRenderLayer.swift +1158 -1114
  340. package/lib/module/ios/GridRenderLayerBridge.swift +44 -44
  341. package/lib/module/ios/GridRenderLayerManager.mm +171 -171
  342. package/lib/module/ios/GridRenderLayerView.h +30 -30
  343. package/lib/module/ios/GridRenderLayerView.m +200 -200
  344. package/lib/module/ios/InspectorDataCache.swift +63 -63
  345. package/lib/module/ios/InspectorModule.m +9 -9
  346. package/lib/module/ios/InspectorModule.swift +112 -112
  347. package/lib/module/ios/Shaders.metal +319 -319
  348. package/lib/module/ios/WeatherFrameProcessorModule.m +15 -15
  349. package/lib/module/ios/WeatherFrameProcessorModule.swift +152 -152
  350. package/lib/module/lib/commonjs/README.md +126 -126
  351. package/lib/module/lib/commonjs/aguacerowx-react-native.podspec +38 -38
  352. package/lib/module/lib/commonjs/android/build.gradle +108 -0
  353. package/lib/module/lib/commonjs/android/src/main/AndroidManifest.xml +7 -0
  354. package/lib/module/lib/commonjs/babel.config.js.map +1 -1
  355. package/lib/module/lib/commonjs/index.js.map +1 -1
  356. package/lib/module/lib/commonjs/ios/AguaceroPackage.m +19 -0
  357. package/lib/module/lib/commonjs/ios/FragmentUniforms.swift +16 -0
  358. package/lib/module/lib/commonjs/ios/GridRenderLayer.swift +1159 -0
  359. package/lib/module/lib/commonjs/ios/GridRenderLayerBridge.swift +44 -44
  360. package/lib/module/lib/commonjs/ios/GridRenderLayerManager.mm +171 -171
  361. package/lib/module/lib/commonjs/ios/GridRenderLayerView.h +30 -30
  362. package/lib/module/lib/commonjs/ios/GridRenderLayerView.m +200 -200
  363. package/lib/module/lib/commonjs/ios/InspectorDataCache.swift +63 -63
  364. package/lib/module/lib/commonjs/ios/InspectorModule.m +9 -9
  365. package/lib/module/lib/commonjs/ios/InspectorModule.swift +112 -112
  366. package/lib/module/lib/commonjs/ios/Shaders.metal +319 -319
  367. package/lib/module/lib/commonjs/ios/WeatherFrameProcessorModule.m +15 -15
  368. package/lib/module/lib/commonjs/ios/WeatherFrameProcessorModule.swift +152 -152
  369. package/lib/module/lib/commonjs/ios/compiled-shaders/Shaders-device.metallib +0 -0
  370. package/lib/module/lib/commonjs/ios/generated/AguaceroWxReactNativeSpec-generated.mm +0 -0
  371. package/lib/module/lib/commonjs/ios/generated/AguaceroWxReactNativeSpec.h +0 -0
  372. package/lib/module/lib/commonjs/package.json +72 -72
  373. package/lib/module/lib/commonjs/react-native-builder-bob.config.js.map +1 -1
  374. package/lib/module/lib/commonjs/scripts/compile-shaders.js.map +1 -1
  375. package/lib/module/lib/commonjs/scripts/compile-shaders.sh +38 -38
  376. package/lib/module/lib/commonjs/src/AguaceroContext.js.map +1 -1
  377. package/lib/module/lib/commonjs/src/GridRenderLayer.js.map +1 -1
  378. package/lib/module/lib/commonjs/src/GridRenderLayerNativeComponent.js.map +1 -1
  379. package/lib/module/lib/commonjs/src/MapManager.js.map +1 -1
  380. package/lib/module/lib/commonjs/src/MapRegistry.js.map +1 -1
  381. package/lib/module/lib/commonjs/src/StyleApplicator.js +6 -6
  382. package/lib/module/lib/commonjs/src/StyleApplicator.js.map +1 -1
  383. package/lib/module/lib/commonjs/src/WeatherLayerManager.js +6 -42
  384. package/lib/module/lib/commonjs/src/WeatherLayerManager.js.map +1 -1
  385. package/lib/module/lib/commonjs/tsconfig.json +23 -23
  386. package/lib/module/package.json +72 -72
  387. package/lib/module/react-native-builder-bob.config.js.map +1 -1
  388. package/lib/module/scripts/compile-shaders.js.map +1 -1
  389. package/lib/module/scripts/compile-shaders.sh +38 -38
  390. package/lib/module/src/AguaceroContext.js.map +1 -1
  391. package/lib/module/src/GridRenderLayer.js.map +1 -1
  392. package/lib/module/src/GridRenderLayerNativeComponent.js.map +1 -1
  393. package/lib/module/src/MapManager.js.map +1 -1
  394. package/lib/module/src/MapRegistry.js.map +1 -1
  395. package/lib/module/src/StyleApplicator.js +6 -6
  396. package/lib/module/src/StyleApplicator.js.map +1 -1
  397. package/lib/module/src/WeatherLayerManager.js +6 -42
  398. package/lib/module/src/WeatherLayerManager.js.map +1 -1
  399. package/lib/module/tsconfig.json +23 -23
  400. package/lib/typescript/src/WeatherLayerManager.d.ts.map +1 -1
  401. package/package.json +72 -72
  402. package/src/AguaceroContext.js +3 -3
  403. package/src/GridRenderLayer.js +215 -215
  404. package/src/GridRenderLayerNativeComponent.ts +15 -15
  405. package/src/MapManager.js +218 -218
  406. package/src/MapRegistry.js +34 -34
  407. package/src/StyleApplicator.js +240 -240
  408. package/src/WeatherLayerManager.js +1163 -1207
@@ -0,0 +1,1159 @@
1
+ import Foundation
2
+ import MapboxMaps
3
+ import Metal
4
+ import libzstd
5
+ import simd
6
+
7
+ // MARK: - Swift-only wrapper for CustomLayerHost conformance
8
+ @objc internal final class GridRenderLayerHost: NSObject, CustomLayerHost {
9
+ weak var layer: GridRenderLayer?
10
+
11
+ init(layer: GridRenderLayer) {
12
+ self.layer = layer
13
+ super.init()
14
+ }
15
+
16
+ func renderingWillStart(_ metalDevice: MTLDevice, colorPixelFormat: UInt, depthStencilPixelFormat: UInt) {
17
+ layer?.internalRenderingWillStart(metalDevice, colorPixelFormat: colorPixelFormat, depthStencilPixelFormat: depthStencilPixelFormat)
18
+ }
19
+
20
+ func render(_ parameters: CustomLayerRenderParameters, mtlCommandBuffer: MTLCommandBuffer, mtlRenderPassDescriptor: MTLRenderPassDescriptor) {
21
+ layer?.internalRender(parameters, mtlCommandBuffer: mtlCommandBuffer, mtlRenderPassDescriptor: mtlRenderPassDescriptor)
22
+ }
23
+
24
+ func renderingWillEnd() {
25
+ layer?.internalRenderingWillEnd()
26
+ }
27
+ }
28
+
29
+ @objc(GridRenderLayer)
30
+ public class GridRenderLayer: NSObject {
31
+
32
+ // MARK: - Properties
33
+
34
+ public var id: String
35
+ @objc internal var hostWrapper: GridRenderLayerHost!
36
+
37
+ // Metal objects
38
+ private var device: MTLDevice!
39
+ private var commandQueue: MTLCommandQueue!
40
+ private var pipelineState: MTLRenderPipelineState!
41
+ private var vertexBuffer: MTLBuffer?
42
+ private var indexBuffer: MTLBuffer?
43
+ private var dataTexture: MTLTexture?
44
+ private var colormapTexture: MTLTexture?
45
+ private var dataSamplerState: MTLSamplerState!
46
+ private var colormapSamplerState: MTLSamplerState!
47
+ private var isDataSamplerLinear: Bool = false
48
+
49
+ private var pendingColormapUpdate: String?
50
+ private var pendingDataUpdate: (data: String, nx: NSNumber, ny: NSNumber, scale: NSNumber, offset: NSNumber, missing: NSNumber, scaleType: String)?
51
+ private var pendingGeometryUpdate: (corners: [String: Any], gridDef: [String: Any])?
52
+
53
+ // Layer state
54
+ private var indexCount: Int = 0
55
+ private var uniforms = FragmentUniforms(
56
+ opacity: 1.0,
57
+ dataRange: SIMD2<Float>(0.0, 1.0),
58
+ scale: 1.0,
59
+ offset: 0.0,
60
+ missingQuantized: 127.0,
61
+ textureSize: SIMD2<Float>(0.0, 0.0),
62
+ smoothing: 1,
63
+ scaleType: 0,
64
+ isPtype: 0,
65
+ isMRMS: 0
66
+ )
67
+ private var isVisible = false
68
+ private var pendingActiveFrameKey: String?
69
+ private var lastRequestedCacheKey: String?
70
+ private let inspectorCache = InspectorDataCache.shared
71
+ private struct FrameMetadata {
72
+ let scale: Float
73
+ let offset: Float
74
+ let missing: Float
75
+ let scaleType: Int
76
+ let nx: Float
77
+ let ny: Float
78
+ let filePath: String
79
+ let originalScale: Float
80
+ let originalOffset: Float
81
+ }
82
+ private var frameCache: [String: FrameMetadata] = [:]
83
+ private let frameCacheQueue = DispatchQueue(label: "com.aguacero.frame-cache-queue")
84
+ private let frameProcessingQueue = DispatchQueue(label: "com.aguacero.frame-processing", qos: .userInitiated, attributes: .concurrent)
85
+ private let semaphore = DispatchSemaphore(value: 8)
86
+
87
+ private struct VertexInfo {
88
+ var mercX: Float
89
+ var mercY: Float
90
+ var texU: Float
91
+ var texV: Float
92
+ var index: UInt16
93
+ }
94
+
95
+ // MARK: - Performance Helper
96
+ private func logPerf(_ msg: String) {
97
+ var taskInfo = mach_task_basic_info()
98
+ var count = mach_msg_type_number_t(MemoryLayout<mach_task_basic_info>.size)/4
99
+ let kerr: kern_return_t = withUnsafeMutablePointer(to: &taskInfo) {
100
+ $0.withMemoryRebound(to: integer_t.self, capacity: 1) {
101
+ task_info(mach_task_self_, task_flavor_t(MACH_TASK_BASIC_INFO), $0, &count)
102
+ }
103
+ }
104
+ let mem = (kerr == KERN_SUCCESS) ? Float(taskInfo.resident_size) / 1024.0 / 1024.0 : 0
105
+ print("⚡️ [PERF] [GridRenderLayer] \(msg) | RAM: \(String(format: "%.2f", mem)) MB")
106
+ }
107
+
108
+ @objc
109
+ public init(id: String) {
110
+ self.id = id
111
+ super.init()
112
+ self.hostWrapper = GridRenderLayerHost(layer: self)
113
+ }
114
+
115
+ @objc public func getHostWrapper() -> Any {
116
+ return self.hostWrapper as Any
117
+ }
118
+
119
+ // MARK: - Public Methods (called from Manager)
120
+
121
+ @objc public func setOpacity(value: Float) {
122
+ self.uniforms.opacity = value
123
+ NotificationCenter.default.post(name: NSNotification.Name("TriggerMapRepaint"), object: nil)
124
+ }
125
+
126
+ @objc public func setDataRange(value: [NSNumber]) {
127
+ self.uniforms.dataRange = SIMD2<Float>(value[0].floatValue, value[1].floatValue)
128
+ NotificationCenter.default.post(name: NSNotification.Name("TriggerMapRepaint"), object: nil)
129
+ }
130
+
131
+ @objc public func setSmoothing(value: Bool) {
132
+ self.uniforms.smoothing = value ? 1 : 0
133
+ NotificationCenter.default.post(name: NSNotification.Name("TriggerMapRepaint"), object: nil)
134
+ }
135
+
136
+ @objc(setIsMRMSWithIsMRMS:)
137
+ public func setIsMRMS(isMRMS: Bool) {
138
+ self.uniforms.isMRMS = isMRMS ? 1 : 0
139
+ NotificationCenter.default.post(name: NSNotification.Name("TriggerMapRepaint"), object: nil)
140
+ }
141
+
142
+ // ADD THIS METHOD
143
+ @objc(setVariableWithVariable:)
144
+ public func setVariable(variable: String) {
145
+ let isPtypeVar = (variable == "ptypeRefl" || variable == "ptypeRate")
146
+ self.uniforms.isPtype = isPtypeVar ? 1 : 0
147
+ NotificationCenter.default.post(name: NSNotification.Name("TriggerMapRepaint"), object: nil)
148
+ }
149
+
150
+ @objc public func clear() {
151
+ self.isVisible = false
152
+ self.inspectorCache.clear()
153
+ }
154
+
155
+ @objc public func updateDataParameters(scale: NSNumber, offset: NSNumber, missing: NSNumber, scaleType: NSNumber) { // ADD scaleType parameter
156
+ // Update both the inspector cache AND the rendering uniforms
157
+ self.uniforms.scale = scale.floatValue
158
+ self.uniforms.offset = offset.floatValue
159
+ self.uniforms.missingQuantized = missing.floatValue
160
+ self.uniforms.scaleType = Int32(scaleType.intValue) // ADD THIS
161
+
162
+ inspectorCache.update(
163
+ data: nil,
164
+ nx: inspectorCache.nx,
165
+ ny: inspectorCache.ny,
166
+ scale: scale.floatValue,
167
+ offset: offset.floatValue,
168
+ missing: missing.floatValue,
169
+ scaleType: scaleType.intValue
170
+ )
171
+ }
172
+
173
+ @objc public func updateColormapTexture(colormapAsBase64: String) {
174
+ guard let device = self.device else {
175
+ pendingColormapUpdate = colormapAsBase64
176
+ return
177
+ }
178
+ guard let data = Data(base64Encoded: colormapAsBase64) else { return }
179
+ let textureDescriptor = MTLTextureDescriptor()
180
+ textureDescriptor.pixelFormat = .rgba8Unorm
181
+ textureDescriptor.width = 256
182
+ textureDescriptor.height = 1
183
+ textureDescriptor.usage = .shaderRead
184
+ guard let texture = device.makeTexture(descriptor: textureDescriptor) else { return }
185
+ texture.replace(
186
+ region: MTLRegionMake2D(0, 0, 256, 1),
187
+ mipmapLevel: 0,
188
+ withBytes: (data as NSData).bytes,
189
+ bytesPerRow: 256 * 4
190
+ )
191
+ self.colormapTexture = texture
192
+ }
193
+
194
+ @objc(clearGpuCache)
195
+ public func clearGpuCache() {
196
+ print("ℹ️ [GridRenderLayer] clearGpuCache called")
197
+ frameProcessingQueue.async { [weak self] in
198
+ guard let self = self else { return }
199
+ self.frameCacheQueue.async {
200
+ self.frameCache.removeAll()
201
+ }
202
+ }
203
+ }
204
+
205
+ private func reconstructAndTransformInPlace(data: inout Data) {
206
+ let count = data.count
207
+ guard count > 0 else { return }
208
+
209
+ data.withUnsafeMutableBytes { rawBuffer in
210
+ guard let baseAddress = rawBuffer.baseAddress else { return }
211
+ let int8Ptr = baseAddress.assumingMemoryBound(to: Int8.self)
212
+ let uint8Ptr = baseAddress.assumingMemoryBound(to: UInt8.self)
213
+
214
+ // --- PHASE 1: Parallel local prefix sums ---
215
+ // Each thread independently prefix-sums its own chunk.
216
+ // At the end of this phase, each chunk is correct RELATIVE to its own start,
217
+ // but incorrect in absolute terms (missing the sum of all prior chunks).
218
+
219
+ let threadCount = min(ProcessInfo.processInfo.activeProcessorCount, 8)
220
+ let chunkSize = (count + threadCount - 1) / threadCount
221
+
222
+ // Stores the final value of each chunk after its local prefix sum.
223
+ // This is the "carry" we need to propagate forward.
224
+ var chunkEndValues = [Int8](repeating: 0, count: threadCount)
225
+
226
+ DispatchQueue.concurrentPerform(iterations: threadCount) { t in
227
+ let start = t * chunkSize
228
+ let end = min(start + chunkSize, count)
229
+ guard start < end else { return }
230
+
231
+ // Local prefix sum within this chunk only
232
+ for i in (start + 1)..<end {
233
+ int8Ptr[i] = int8Ptr[i] &+ int8Ptr[i - 1]
234
+ }
235
+ chunkEndValues[t] = int8Ptr[end - 1]
236
+ }
237
+
238
+ // --- PHASE 2: Sequential fixup of chunk offsets ---
239
+ // Compute the running offset that needs to be added to each chunk.
240
+ // This must be sequential since each offset depends on the previous.
241
+ var offsets = [Int8](repeating: 0, count: threadCount)
242
+ // Chunk 0 needs no offset (it's already correct from index 0)
243
+ for t in 1..<threadCount {
244
+ offsets[t] = offsets[t - 1] &+ chunkEndValues[t - 1]
245
+ }
246
+
247
+ // --- PHASE 3: Parallel offset application + XOR transform ---
248
+ // Apply the offset correction AND the +128 transform in one pass.
249
+ // XOR with 0x80 is equivalent to adding 128 mod 256.
250
+
251
+ DispatchQueue.concurrentPerform(iterations: threadCount) { t in
252
+ let start = t * chunkSize
253
+ let end = min(start + chunkSize, count)
254
+ guard start < end else { return }
255
+
256
+ let offset = offsets[t]
257
+
258
+ if offset == 0 {
259
+ // Chunk 0: no offset needed, just XOR transform
260
+ // Process 8 bytes at a time using UInt64
261
+ let wordStart = start
262
+ let wordCount = (end - start) / 8
263
+ let uint64Ptr = baseAddress.assumingMemoryBound(to: UInt64.self)
264
+ let wordOffset = wordStart / 8
265
+
266
+ for i in 0..<wordCount {
267
+ uint64Ptr[wordOffset + i] ^= 0x8080808080808080
268
+ }
269
+ // Remaining bytes
270
+ for i in (wordStart + wordCount * 8)..<end {
271
+ uint8Ptr[i] ^= 0x80
272
+ }
273
+ } else {
274
+ // Chunks 1+: add offset correction, then XOR transform
275
+ // Note: we have to do byte-by-byte here because the offset
276
+ // applies additively in Int8 space before the UInt8 XOR
277
+ for i in start..<end {
278
+ let corrected = int8Ptr[i] &+ offset
279
+ uint8Ptr[i] = UInt8(bitPattern: corrected) ^ 0x80
280
+ }
281
+ }
282
+ }
283
+ }
284
+ }
285
+
286
+ private func processRawData(fileData: Data) -> Data? {
287
+ let start = CFAbsoluteTimeGetCurrent()
288
+
289
+ // 1. Decompress
290
+ // This allocates the only buffer we will use.
291
+ let t1 = CFAbsoluteTimeGetCurrent()
292
+ guard var workingData = self.decompressZstd(data: fileData) else {
293
+ print("❌ [GridRenderLayer] Failed to decompress zstd data")
294
+ return nil
295
+ }
296
+ let t1_diff = (CFAbsoluteTimeGetCurrent() - t1) * 1000
297
+
298
+ // 2. Reconstruct AND Transform (In-Place)
299
+ // No new memory allocation here.
300
+ let t2 = CFAbsoluteTimeGetCurrent()
301
+ self.reconstructAndTransformInPlace(data: &workingData)
302
+ let t2_diff = (CFAbsoluteTimeGetCurrent() - t2) * 1000
303
+
304
+ // 3. (Legacy Timer Placeholder to match logs)
305
+ // Since we combined them, this is effectively instant now
306
+ let t3_diff = 0.0
307
+
308
+ let total = (CFAbsoluteTimeGetCurrent() - start) * 1000
309
+
310
+ // Log CPU transformation metrics
311
+ // Expect Recon+Trans to drop from ~1000ms to ~10-20ms
312
+ logPerf("PROCESS RAW: Total \(String(format: "%.1f", total))ms (Zstd: \(String(format: "%.1f", t1_diff))ms, Recon+Trans: \(String(format: "%.1f", t2_diff))ms)")
313
+
314
+ return workingData
315
+ }
316
+
317
+ private func createTextureFromBytes(bytes: Data, nx: Int, ny: Int) -> MTLTexture? {
318
+ guard let device = self.device else { return nil }
319
+ let textureDescriptor = MTLTextureDescriptor()
320
+ textureDescriptor.pixelFormat = .r8Unorm
321
+ textureDescriptor.width = nx
322
+ textureDescriptor.height = ny
323
+ textureDescriptor.usage = .shaderRead
324
+
325
+ guard let texture = device.makeTexture(descriptor: textureDescriptor) else { return nil }
326
+ texture.replace(
327
+ region: MTLRegionMake2D(0, 0, nx, ny),
328
+ mipmapLevel: 0,
329
+ withBytes: (bytes as NSData).bytes,
330
+ bytesPerRow: nx
331
+ )
332
+ return texture
333
+ }
334
+
335
+ private func updateInspectorCache(filePath: String, reconstructedData: Data?, nx: Int, ny: Int, scale: Float, offset: Float, missing: Float, scaleType: Int) {
336
+ self.inspectorCache.updateWithFilePath(
337
+ filePath: filePath,
338
+ nx: nx,
339
+ ny: ny,
340
+ scale: scale,
341
+ offset: offset,
342
+ missing: missing,
343
+ scaleType: scaleType
344
+ )
345
+ }
346
+
347
+ @objc(setActiveFrameWithCacheKey:)
348
+ public func setActiveFrame(cacheKey: String) {
349
+ logPerf("setActiveFrame requested: \(cacheKey)")
350
+ setActiveFrameInternal(cacheKey: cacheKey, isExternalRequest: true)
351
+ }
352
+
353
+ private func setActiveFrameInternal(cacheKey: String, isExternalRequest: Bool) {
354
+ if isExternalRequest {
355
+ lastRequestedCacheKey = cacheKey
356
+ } else {
357
+ if lastRequestedCacheKey != cacheKey { return }
358
+ }
359
+
360
+ var frameResult: FrameMetadata?
361
+ frameCacheQueue.sync {
362
+ frameResult = frameCache[cacheKey]
363
+ }
364
+
365
+ if let frame = frameResult {
366
+ frameProcessingQueue.async { [weak self] in
367
+ guard let self = self else { return }
368
+ if self.lastRequestedCacheKey != cacheKey { return }
369
+
370
+ // ALWAYS load from disk. It is fast enough now (20ms).
371
+ // No caching needed.
372
+ let diskStart = CFAbsoluteTimeGetCurrent()
373
+ guard let fileData = try? Data(contentsOf: URL(fileURLWithPath: frame.filePath)) else {
374
+ print("❌ [GridRenderLayer] Failed to load file: \(frame.filePath)")
375
+ return
376
+ }
377
+
378
+ // processRawData is now optimized (in-place) and takes ~20ms
379
+ guard let finalTextureBytes = self.processRawData(fileData: fileData) else {
380
+ print("❌ [GridRenderLayer] Failed to process data for: \(cacheKey)")
381
+ return
382
+ }
383
+
384
+ // Final check before jumping to main thread
385
+ if self.lastRequestedCacheKey != cacheKey { return }
386
+
387
+ DispatchQueue.main.async { [weak self] in
388
+ // ... (Keep existing Main Thread texture upload logic) ...
389
+ guard let self = self else { return }
390
+
391
+ if self.lastRequestedCacheKey != cacheKey { return }
392
+
393
+ let nx = Int(frame.nx)
394
+ let ny = Int(frame.ny)
395
+
396
+ if let existingTexture = self.dataTexture,
397
+ existingTexture.width == nx,
398
+ existingTexture.height == ny {
399
+ existingTexture.replace(
400
+ region: MTLRegionMake2D(0, 0, nx, ny),
401
+ mipmapLevel: 0,
402
+ withBytes: (finalTextureBytes as NSData).bytes,
403
+ bytesPerRow: nx
404
+ )
405
+ } else {
406
+ guard let texture = self.createTextureFromBytes(bytes: finalTextureBytes, nx: nx, ny: ny) else { return }
407
+ self.dataTexture = texture
408
+ }
409
+
410
+ self.uniforms.scale = frame.scale
411
+ self.uniforms.offset = frame.offset
412
+ self.uniforms.missingQuantized = frame.missing
413
+ self.uniforms.textureSize = SIMD2<Float>(frame.nx, frame.ny)
414
+ self.uniforms.scaleType = Int32(frame.scaleType)
415
+
416
+ self.isVisible = true
417
+ self.pendingActiveFrameKey = nil
418
+ NotificationCenter.default.post(name: NSNotification.Name("TriggerMapRepaint"), object: nil)
419
+
420
+ // Update inspector in background
421
+ self.frameProcessingQueue.async { [weak self] in
422
+ self?.updateInspectorCache(
423
+ filePath: frame.filePath,
424
+ reconstructedData: finalTextureBytes, // Pass the data we already processed!
425
+ nx: nx,
426
+ ny: ny,
427
+ scale: frame.scale,
428
+ offset: frame.offset,
429
+ missing: frame.missing,
430
+ scaleType: frame.scaleType
431
+ )
432
+ }
433
+ }
434
+ }
435
+ } else {
436
+ if isExternalRequest {
437
+ self.pendingActiveFrameKey = cacheKey
438
+ }
439
+ }
440
+ }
441
+
442
+ @objc(primeGpuCacheWithFrameInfo:)
443
+ public func primeGpuCache(frameInfo: [String: [String: Any]]) {
444
+ // logPerf("primeGpuCache called with \(frameInfo.count) items")
445
+
446
+ // We do NOT need the frameProcessingQueue here anymore because we are just storing metadata.
447
+ // Doing this synchronously on the caller thread (which is a background thread from Manager) is fine and much faster.
448
+
449
+ self.frameCacheQueue.async { [weak self] in
450
+ guard let self = self else { return }
451
+
452
+ for (cacheKey, info) in frameInfo {
453
+ if self.frameCache[cacheKey] != nil { continue }
454
+
455
+ guard let filePath = info["filePath"] as? String,
456
+ let nx = info["nx"] as? NSNumber,
457
+ let ny = info["ny"] as? NSNumber,
458
+ let scale = info["scale"] as? NSNumber,
459
+ let offset = info["offset"] as? NSNumber,
460
+ let missing = info["missing"] as? NSNumber,
461
+ let scaleTypeStr = info["scaleType"] as? String,
462
+ let originalScale = info["originalScale"] as? NSNumber,
463
+ let originalOffset = info["originalOffset"] as? NSNumber
464
+ else { continue }
465
+
466
+ let metadata = FrameMetadata(
467
+ scale: scale.floatValue,
468
+ offset: offset.floatValue,
469
+ missing: missing.floatValue,
470
+ scaleType: (scaleTypeStr == "sqrt") ? 1 : 0,
471
+ nx: nx.floatValue,
472
+ ny: ny.floatValue,
473
+ filePath: filePath,
474
+ originalScale: originalScale.floatValue,
475
+ originalOffset: originalOffset.floatValue
476
+ // processedData: nil <--- REMOVED
477
+ )
478
+
479
+ self.frameCache[cacheKey] = metadata
480
+ }
481
+ }
482
+ }
483
+
484
+ @objc public func updateDataTexture(data: String, nx: NSNumber, ny: NSNumber, scale: NSNumber, offset: NSNumber, missing: NSNumber, scaleType: String) {
485
+ let filePath = data
486
+ logPerf("updateDataTexture called for \(filePath)")
487
+
488
+ frameProcessingQueue.async { [weak self] in
489
+ guard let self = self else { return }
490
+
491
+ guard let fileData = try? Data(contentsOf: URL(fileURLWithPath: filePath)),
492
+ let finalTextureBytes = self.processRawData(fileData: fileData)
493
+ else {
494
+ print("❌ [GridRenderLayer] FAST LANE: Failed to process initial frame data.")
495
+ return
496
+ }
497
+
498
+ DispatchQueue.main.async { [weak self] in
499
+ guard let self = self else { return }
500
+
501
+ let nxInt = nx.intValue
502
+ let nyInt = ny.intValue
503
+
504
+ // REUSE TEXTURE if dimensions match
505
+ if let existingTexture = self.dataTexture,
506
+ existingTexture.width == nxInt,
507
+ existingTexture.height == nyInt {
508
+ existingTexture.replace(
509
+ region: MTLRegionMake2D(0, 0, nxInt, nyInt),
510
+ mipmapLevel: 0,
511
+ withBytes: (finalTextureBytes as NSData).bytes,
512
+ bytesPerRow: nxInt
513
+ )
514
+ } else {
515
+ // Create new texture only if needed
516
+ guard let texture = self.createTextureFromBytes(bytes: finalTextureBytes, nx: nxInt, ny: nyInt) else {
517
+ print("❌ [GridRenderLayer] FAST LANE: Failed to create texture")
518
+ return
519
+ }
520
+ self.dataTexture = texture
521
+ }
522
+
523
+ self.uniforms.scale = scale.floatValue
524
+ self.uniforms.offset = offset.floatValue
525
+ self.uniforms.missingQuantized = missing.floatValue
526
+ self.uniforms.scaleType = Int32((scaleType == "sqrt") ? 1 : 0)
527
+ self.uniforms.textureSize = SIMD2<Float>(nx.floatValue, ny.floatValue)
528
+
529
+ self.isVisible = true
530
+ NotificationCenter.default.post(name: NSNotification.Name("TriggerMapRepaint"), object: nil)
531
+
532
+ self.updateInspectorCache(
533
+ filePath: filePath,
534
+ reconstructedData: nil,
535
+ nx: nx.intValue,
536
+ ny: ny.intValue,
537
+ scale: scale.floatValue,
538
+ offset: offset.floatValue,
539
+ missing: missing.floatValue,
540
+ scaleType: (scaleType == "sqrt") ? 1 : 0
541
+ )
542
+ }
543
+ }
544
+ }
545
+
546
+ @objc public func updateGeometry(corners: [String: Any], gridDef: [String: Any]) {
547
+ guard self.device != nil else {
548
+ print("⚠️ [GridRenderLayer] Device not ready yet, storing geometry for later")
549
+ pendingGeometryUpdate = (corners: corners, gridDef: gridDef)
550
+ return
551
+ }
552
+
553
+ DispatchQueue.global(qos: .userInitiated).async {
554
+
555
+ var vertices: [Float] = []
556
+ var indices: [UInt16] = []
557
+
558
+ self.generateGeometryData(gridDef: gridDef, vertices: &vertices, indices: &indices)
559
+
560
+ if vertices.isEmpty || indices.isEmpty {
561
+ print("❌ [GridRenderLayer] No geometry generated")
562
+ return
563
+ }
564
+
565
+ self.indexCount = indices.count
566
+
567
+ DispatchQueue.main.async {
568
+ self.vertexBuffer = self.device.makeBuffer(bytes: vertices, length: vertices.count * MemoryLayout<Float>.size, options: [])
569
+ self.indexBuffer = self.device.makeBuffer(bytes: indices, length: indices.count * MemoryLayout<UInt16>.size, options: [])
570
+
571
+ NotificationCenter.default.post(name: NSNotification.Name("TriggerMapRepaint"), object: nil)
572
+ }
573
+ }
574
+ }
575
+
576
+ private func decompressZstd(data: Data) -> Data? {
577
+ let decompressedSize = data.withUnsafeBytes { ptr in
578
+ ZSTD_getFrameContentSize(ptr.baseAddress, data.count)
579
+ }
580
+
581
+ guard Int64(bitPattern: decompressedSize) > 0 else {
582
+ print("❌ [GridRenderLayer] Could not determine decompressed size")
583
+ return nil
584
+ }
585
+
586
+ var decompressedData = Data(count: Int(decompressedSize))
587
+
588
+ let result = decompressedData.withUnsafeMutableBytes { decompressedPtr -> Int in
589
+ data.withUnsafeBytes { compressedPtr -> Int in
590
+ let returnValue = ZSTD_decompress(
591
+ decompressedPtr.baseAddress,
592
+ Int(decompressedSize),
593
+ compressedPtr.baseAddress,
594
+ data.count
595
+ )
596
+ return Int(returnValue)
597
+ }
598
+ }
599
+
600
+ guard result > 0 && result == decompressedData.count else {
601
+ if result > 0 {
602
+ let size_t_result = size_t(result)
603
+ if let errorName = ZSTD_getErrorName(size_t_result) {
604
+ let errorString = String(cString: errorName)
605
+ print("❌ [GridRenderLayer] Zstd decompression failed: \(errorString)")
606
+ }
607
+ }
608
+ return nil
609
+ }
610
+ return decompressedData
611
+ }
612
+
613
+ private func isLCCType(gridDef: [String: Any]) -> Bool {
614
+ if let type = gridDef["type"] as? String {
615
+ return type == "lambert_conformal_conic"
616
+ }
617
+ return false
618
+ }
619
+
620
+ private func generateLCCGeometry(gridDef: [String: Any], vertices: inout [Float], indices: inout [UInt16]) {
621
+ guard let gridParams = gridDef["grid_params"] as? [String: Any],
622
+ let projParams = gridDef["proj_params"] as? [String: Any],
623
+ let nx = gridParams["nx"] as? Int,
624
+ let ny = gridParams["ny"] as? Int,
625
+ let dx = gridParams["dx"] as? Double,
626
+ let dy = gridParams["dy"] as? Double,
627
+ let x_origin = gridParams["x_origin"] as? Double,
628
+ let y_origin = gridParams["y_origin"] as? Double else {
629
+ return
630
+ }
631
+
632
+ let subdivisions = 60
633
+ let TILE_SIZE: Double = 512.0
634
+
635
+ let x_min = x_origin
636
+ let y_max = y_origin
637
+ let x_max = x_origin + Double(nx - 1) * dx
638
+ let y_min = y_origin + Double(ny - 1) * dy
639
+
640
+ var vertexGrid: [[VertexInfo?]] = Array(repeating: Array(repeating: nil, count: subdivisions + 1), count: subdivisions + 1)
641
+ var validVertexCount: UInt16 = 0
642
+
643
+ // Generate vertices
644
+ for row in 0...subdivisions {
645
+ for col in 0...subdivisions {
646
+ let t_x = Double(col) / Double(subdivisions)
647
+ let t_y = Double(row) / Double(subdivisions)
648
+
649
+ let proj_x = x_min + t_x * (x_max - x_min)
650
+ let proj_y = y_max + t_y * (y_min - y_max)
651
+
652
+ // Convert LCC projection coordinates to lat/lon
653
+ if let (lon, lat) = lccToLonLat(i: proj_x, j: proj_y, gridDef: gridDef) {
654
+ // Convert lat/lon to Mercator
655
+ let mercX_normalized = (lon + 180.0) / 360.0
656
+ let clampedLat = max(-85.05112878, min(85.05112878, lat))
657
+ let sinLatitude = sin(clampedLat * .pi / 180.0)
658
+ let mercY_normalized = 0.5 - log((1 + sinLatitude) / (1 - sinLatitude)) / (4 * .pi)
659
+
660
+ let mercX = mercX_normalized * TILE_SIZE
661
+ let mercY = mercY_normalized * TILE_SIZE
662
+
663
+ // Check for invalid values
664
+ if !mercX.isFinite || !mercY.isFinite {
665
+ vertexGrid[row][col] = nil
666
+ continue
667
+ }
668
+
669
+ let tex_u = Float(t_x)
670
+ let tex_v = Float(t_y)
671
+
672
+ let vInfo = VertexInfo(
673
+ mercX: Float(mercX),
674
+ mercY: Float(mercY),
675
+ texU: tex_u,
676
+ texV: tex_v,
677
+ index: validVertexCount
678
+ )
679
+
680
+ vertexGrid[row][col] = vInfo
681
+
682
+ vertices.append(Float(mercX))
683
+ vertices.append(Float(mercY))
684
+ vertices.append(tex_u)
685
+ vertices.append(tex_v)
686
+
687
+ validVertexCount += 1
688
+ } else {
689
+ vertexGrid[row][col] = nil
690
+ }
691
+ }
692
+ }
693
+
694
+ if vertices.isEmpty {
695
+ print("❌ [LCC Geometry] No valid vertices generated")
696
+ return
697
+ }
698
+
699
+ // Generate indices
700
+ for row in 0..<subdivisions {
701
+ for col in 0..<subdivisions {
702
+ guard let topLeft = vertexGrid[row][col],
703
+ let topRight = vertexGrid[row][col + 1],
704
+ let bottomLeft = vertexGrid[row + 1][col],
705
+ let bottomRight = vertexGrid[row + 1][col + 1] else {
706
+ continue
707
+ }
708
+
709
+ indices.append(topLeft.index)
710
+ indices.append(bottomLeft.index)
711
+ indices.append(topRight.index)
712
+
713
+ indices.append(topRight.index)
714
+ indices.append(bottomLeft.index)
715
+ indices.append(bottomRight.index)
716
+ }
717
+ }
718
+ }
719
+
720
+ private func lccToLonLat(i: Double, j: Double, gridDef: [String: Any]) -> (lon: Double, lat: Double)? {
721
+ guard let projParams = gridDef["proj_params"] as? [String: Any],
722
+ let lat_0 = (projParams["lat_0"] as? NSNumber)?.doubleValue,
723
+ let lon_0 = (projParams["lon_0"] as? NSNumber)?.doubleValue,
724
+ let lat_1 = (projParams["lat_1"] as? NSNumber)?.doubleValue,
725
+ let lat_2 = (projParams["lat_2"] as? NSNumber)?.doubleValue,
726
+ let r_earth = (projParams["R"] as? NSNumber)?.doubleValue else {
727
+ print("❌ [LCC Geometry] Failed to extract LCC parameters.")
728
+ return nil
729
+ }
730
+
731
+ let π = Double.pi
732
+ let toRad = π / 180.0
733
+ let toDeg = 180.0 / π
734
+
735
+ let lat1_rad = lat_1 * toRad
736
+ let lat2_rad = lat_2 * toRad
737
+ let lat0_rad = lat_0 * toRad
738
+ let lon0_rad = lon_0 * toRad
739
+
740
+ let n: Double
741
+ if abs(lat_1 - lat_2) < 1e-10 {
742
+ n = sin(lat1_rad)
743
+ } else {
744
+ n = log(cos(lat1_rad) / cos(lat2_rad)) / log(tan(π/4.0 + lat2_rad/2.0) / tan(π/4.0 + lat1_rad/2.0))
745
+ }
746
+
747
+ let F = cos(lat1_rad) * pow(tan(π/4.0 + lat1_rad/2.0), n) / n
748
+ let rho_0 = r_earth * F * pow(tan(π/4.0 + lat0_rad/2.0), -n)
749
+
750
+ let x = i
751
+ let y = j
752
+
753
+ let rho = sqrt(x * x + (rho_0 - y) * (rho_0 - y))
754
+ if rho < 1e-10 {
755
+ return (lon: lon_0, lat: lat_0)
756
+ }
757
+
758
+ let theta = atan2(x, rho_0 - y)
759
+
760
+ let lon = lon0_rad + theta / n
761
+ let lat = 2.0 * atan(pow(r_earth * F / rho, 1.0 / n)) - π/2.0
762
+
763
+ let lonDeg = lon * toDeg
764
+ let latDeg = lat * toDeg
765
+
766
+ if !lonDeg.isFinite || !latDeg.isFinite {
767
+ return nil
768
+ }
769
+
770
+ return (lon: lonDeg, lat: latDeg)
771
+ }
772
+
773
+ private func generateGeometryData(gridDef: [String: Any], vertices: inout [Float], indices: inout [UInt16]) {
774
+ guard let gridParams = gridDef["grid_params"] as? [String: Any] else {
775
+ print("❌ [generateGeometryData] No grid_params found")
776
+ return
777
+ }
778
+
779
+ // Check grid type
780
+ let isGFS = isGFSType(gridParams: gridParams)
781
+ let isLCC = isLCCType(gridDef: gridDef)
782
+
783
+ if isGFS {
784
+ // GFS path remains unchanged
785
+ let subdivisions = 120
786
+ let verticesPerRow = (subdivisions * 3) + 1
787
+ let TILE_SIZE: Double = 512.0
788
+
789
+ for row in 0...subdivisions {
790
+ for col in 0...(subdivisions * 3) {
791
+ let v_interp = Float(row) / Float(subdivisions)
792
+ let u_interp = Float(col) / Float(subdivisions)
793
+ let lon = -540.0 + Double(u_interp) * 1080.0
794
+ let lat = -90.0 + Double(v_interp) * 180.0
795
+
796
+ let merc = lonLatToMercator(lon: lon, lat: lat, tileSize: TILE_SIZE)
797
+ vertices.append(contentsOf: [merc.x, merc.y])
798
+
799
+ let tex_u = Float((lon + 180.0) / 360.0)
800
+ let tex_v = 1.0 - v_interp
801
+ vertices.append(contentsOf: [tex_u, tex_v])
802
+ }
803
+ }
804
+
805
+ for row in 0..<subdivisions {
806
+ for col in 0..<(subdivisions * 3) {
807
+ let tl = UInt16(row * verticesPerRow + col)
808
+ let tr = tl + 1
809
+ let bl = UInt16((row + 1) * verticesPerRow + col)
810
+ let br = bl + 1
811
+ indices.append(contentsOf: [tl, bl, tr, tr, bl, br])
812
+ }
813
+ }
814
+ return
815
+ }
816
+
817
+ if isLCC {
818
+ generateLCCGeometry(gridDef: gridDef, vertices: &vertices, indices: &indices)
819
+ return
820
+ }
821
+
822
+ let nx = gridParams["nx"] as? Int ?? 0
823
+ let ny = gridParams["ny"] as? Int ?? 0
824
+ let lon_first = gridParams["lon_first"] as? Double ?? 0.0
825
+ let lat_first = gridParams["lat_first"] as? Double ?? 90.0
826
+ let dx = gridParams["dx_degrees"] as? Double ?? 0.0
827
+ let dy = gridParams["dy_degrees"] as? Double ?? 0.0
828
+ let lon_last = gridParams["lon_last"] as? Double ?? (lon_first + Double(nx - 1) * dx)
829
+ let lat_last = gridParams["lat_last"] as? Double ?? (lat_first + Double(ny - 1) * dy)
830
+
831
+ let lat_span = lat_last - lat_first
832
+ let isSouthToNorth = lat_span > 0
833
+
834
+ // Check if this is ECMWF and normalize longitudes
835
+ let isECMWF = isECMWFType(gridParams: gridParams)
836
+ var data_lon_first_180 = lon_first
837
+ var data_lon_last_180 = lon_last
838
+
839
+ if isECMWF {
840
+ // Convert ECMWF's 180 to -180 range to -180 to 180
841
+ data_lon_first_180 = lon_first >= 180 ? lon_first - 360 : lon_first
842
+ data_lon_last_180 = lon_last >= 180 ? lon_last - 360 : lon_last
843
+ } else {
844
+ // For GFS and other models
845
+ data_lon_first_180 = lon_first > 180 ? lon_first - 360 : lon_first
846
+ data_lon_last_180 = lon_last > 180 ? lon_last - 360 : lon_last
847
+ }
848
+
849
+ let data_lon_range = data_lon_last_180 - data_lon_first_180
850
+
851
+ let subdivisions_x = 120
852
+ let subdivisions_y = 60
853
+ let verticesPerRow = subdivisions_x + 1
854
+ let TILE_SIZE: Double = 512.0
855
+
856
+ let worldCopies = (data_lon_range > 300) ? [-1, 0, 1] : [0]
857
+
858
+ for world_copy in worldCopies {
859
+ let vertexStartIndex = UInt16(vertices.count / 4)
860
+ let lon_offset = Double(world_copy) * 360.0
861
+
862
+ for row in 0...subdivisions_y {
863
+ for col in 0...subdivisions_x {
864
+ let v_interp = Float(row) / Float(subdivisions_y)
865
+ let u_interp = Float(col) / Float(subdivisions_x)
866
+
867
+ let vertex_lon = data_lon_first_180 + (Double(u_interp) * data_lon_range)
868
+ let vertex_lat = lat_first + (Double(v_interp) * lat_span)
869
+
870
+ let mercX_normalized = ((vertex_lon + lon_offset) + 180.0) / 360.0
871
+ let clampedLat = max(-85.05112878, min(85.05112878, vertex_lat))
872
+ let sinLatitude = sin(clampedLat * .pi / 180.0)
873
+ let mercY_normalized = 0.5 - log((1 + sinLatitude) / (1 - sinLatitude)) / (4 * .pi)
874
+ let mercX = mercX_normalized * TILE_SIZE
875
+ let mercY = mercY_normalized * TILE_SIZE
876
+
877
+ vertices.append(contentsOf: [Float(mercX), Float(mercY)])
878
+
879
+ let tex_u = u_interp
880
+ let tex_v = isSouthToNorth ? (1.0 - v_interp) : v_interp
881
+
882
+ vertices.append(contentsOf: [tex_u, tex_v])
883
+ }
884
+ }
885
+
886
+ for row in 0..<UInt16(subdivisions_y) {
887
+ for col in 0..<UInt16(subdivisions_x) {
888
+ let tl = vertexStartIndex + row * UInt16(verticesPerRow) + col
889
+ let tr = tl + 1
890
+ let bl = vertexStartIndex + (row + 1) * UInt16(verticesPerRow) + col
891
+ let br = bl + 1
892
+
893
+ if isSouthToNorth {
894
+ indices.append(contentsOf: [tl, bl, tr, tr, bl, br])
895
+ } else {
896
+ indices.append(contentsOf: [tl, tr, bl, bl, tr, br])
897
+ }
898
+ }
899
+ }
900
+ }
901
+ }
902
+
903
+ private func isGFSType(gridParams: [String: Any]) -> Bool {
904
+ return (gridParams["lon_first"] as? Double) == 0.0 &&
905
+ abs((gridParams["lat_first"] as? Double) ?? -1) == 90.0
906
+ }
907
+
908
+ private func isECMWFType(gridParams: [String: Any]) -> Bool {
909
+ return (gridParams["lon_first"] as? Double) == 180.0 &&
910
+ (gridParams["lat_first"] as? Double) == 90.0
911
+ }
912
+
913
+ private func lonLatToMercator(lon: Double, lat: Double, tileSize: Double) -> (x: Float, y: Float) {
914
+ let mercX_normalized = (lon + 180.0) / 360.0
915
+ let clampedLat = max(-85.05112878, min(85.05112878, lat))
916
+ let sinLatitude = sin(clampedLat * .pi / 180.0)
917
+ let mercY_normalized = 0.5 - log((1.0 + sinLatitude) / (1.0 - sinLatitude)) / (4.0 * .pi)
918
+
919
+ return (x: Float(mercX_normalized * tileSize), y: Float(mercY_normalized * tileSize))
920
+ }
921
+
922
+ // MARK: - Internal methods for CustomLayerHost (called by wrapper)
923
+
924
+ internal func internalRenderingWillStart(_ metalDevice: MTLDevice, colorPixelFormat: UInt, depthStencilPixelFormat: UInt) {
925
+ self.device = metalDevice
926
+ self.commandQueue = metalDevice.makeCommandQueue()
927
+
928
+ let bundle = Bundle(for: GridRenderLayer.self)
929
+
930
+ // Determine if we're running on simulator or device
931
+ #if targetEnvironment(simulator)
932
+ let metallibName = "Shaders-simulator"
933
+ #else
934
+ let metallibName = "Shaders-device"
935
+ #endif
936
+
937
+ // Try to load pre-compiled metallib for the current platform
938
+ var defaultLibrary: MTLLibrary?
939
+
940
+ // 1. Look in the main bundle level
941
+ if let metallibUrl = bundle.url(forResource: metallibName, withExtension: "metallib") {
942
+ print("ℹ️ [GridRenderLayer] Found pre-compiled shaders at: \(metallibUrl.lastPathComponent)")
943
+ defaultLibrary = try? metalDevice.makeLibrary(URL: metallibUrl)
944
+ }
945
+
946
+ // 2. Fall back to compiled-shaders subdirectory
947
+ if defaultLibrary == nil {
948
+ if let metallibUrl = bundle.url(forResource: metallibName, withExtension: "metallib", subdirectory: "compiled-shaders") {
949
+ print("ℹ️ [GridRenderLayer] Found pre-compiled shaders in subdirectory: \(metallibUrl.lastPathComponent)")
950
+ defaultLibrary = try? metalDevice.makeLibrary(URL: metallibUrl)
951
+ }
952
+ }
953
+
954
+ // 3. Fall back to compiling from .metal source (for development with npm link)
955
+ if defaultLibrary == nil {
956
+ if let metalUrl = bundle.url(forResource: "Shaders", withExtension: "metal") {
957
+ print("⚠️ [GridRenderLayer] Pre-compiled shaders not found. Compiling from source: \(metalUrl.lastPathComponent)")
958
+ if let source = try? String(contentsOf: metalUrl),
959
+ let library = try? metalDevice.makeLibrary(source: source, options: nil) {
960
+ defaultLibrary = library
961
+ }
962
+ }
963
+ }
964
+
965
+ // Neither worked
966
+ if defaultLibrary == nil {
967
+ print("❌ [GridRenderLayer] Could not find or compile Metal shaders")
968
+ print(" Bundle path: \(bundle.bundlePath)")
969
+ return
970
+ }
971
+
972
+ guard let library = defaultLibrary else {
973
+ print("❌ [GridRenderLayer] Failed to create Metal library")
974
+ return
975
+ }
976
+
977
+ let vertexFunction = library.makeFunction(name: "vertex_main")
978
+ let fragmentFunction = library.makeFunction(name: "fragment_main")
979
+
980
+ // Set up vertex descriptor
981
+ let vertexDescriptor = MTLVertexDescriptor()
982
+ vertexDescriptor.attributes[0].format = .float2 // position (x, y)
983
+ vertexDescriptor.attributes[0].offset = 0
984
+ vertexDescriptor.attributes[0].bufferIndex = 0
985
+
986
+ vertexDescriptor.attributes[1].format = .float2 // texCoord (u, v)
987
+ vertexDescriptor.attributes[1].offset = MemoryLayout<Float>.size * 2
988
+ vertexDescriptor.attributes[1].bufferIndex = 0
989
+
990
+ vertexDescriptor.layouts[0].stride = MemoryLayout<Float>.size * 4 // 2 floats for pos + 2 for texCoord
991
+ vertexDescriptor.layouts[0].stepFunction = .perVertex
992
+
993
+ let pipelineDescriptor = MTLRenderPipelineDescriptor()
994
+ pipelineDescriptor.vertexDescriptor = vertexDescriptor
995
+ pipelineDescriptor.vertexFunction = vertexFunction
996
+ pipelineDescriptor.fragmentFunction = fragmentFunction
997
+
998
+ pipelineDescriptor.colorAttachments[0].pixelFormat = MTLPixelFormat(rawValue: colorPixelFormat) ?? .bgra8Unorm
999
+ pipelineDescriptor.depthAttachmentPixelFormat = MTLPixelFormat(rawValue: depthStencilPixelFormat) ?? .depth32Float_stencil8
1000
+ pipelineDescriptor.stencilAttachmentPixelFormat = MTLPixelFormat(rawValue: depthStencilPixelFormat) ?? .depth32Float_stencil8
1001
+
1002
+ pipelineDescriptor.colorAttachments[0].isBlendingEnabled = true
1003
+ pipelineDescriptor.colorAttachments[0].rgbBlendOperation = .add
1004
+ pipelineDescriptor.colorAttachments[0].alphaBlendOperation = .add
1005
+ pipelineDescriptor.colorAttachments[0].sourceRGBBlendFactor = .sourceAlpha
1006
+ pipelineDescriptor.colorAttachments[0].sourceAlphaBlendFactor = .sourceAlpha
1007
+ pipelineDescriptor.colorAttachments[0].destinationRGBBlendFactor = .oneMinusSourceAlpha
1008
+ pipelineDescriptor.colorAttachments[0].destinationAlphaBlendFactor = .oneMinusSourceAlpha
1009
+
1010
+ do {
1011
+ self.pipelineState = try metalDevice.makeRenderPipelineState(descriptor: pipelineDescriptor)
1012
+ } catch {
1013
+ print("❌ [GridRenderLayer] Failed to create pipeline state: \(error)")
1014
+ return
1015
+ }
1016
+
1017
+ let dataSamplerDesc = MTLSamplerDescriptor()
1018
+ dataSamplerDesc.minFilter = .nearest
1019
+ dataSamplerDesc.magFilter = .nearest
1020
+ self.dataSamplerState = metalDevice.makeSamplerState(descriptor: dataSamplerDesc)
1021
+
1022
+ let colormapSamplerDesc = MTLSamplerDescriptor()
1023
+ colormapSamplerDesc.minFilter = .nearest
1024
+ colormapSamplerDesc.magFilter = .nearest
1025
+ colormapSamplerDesc.sAddressMode = .clampToEdge
1026
+ self.colormapSamplerState = metalDevice.makeSamplerState(descriptor: colormapSamplerDesc)
1027
+
1028
+ // Process any pending updates that came in before Metal was ready
1029
+ if let pendingGeometry = pendingGeometryUpdate {
1030
+ updateGeometry(corners: pendingGeometry.corners, gridDef: pendingGeometry.gridDef)
1031
+ pendingGeometryUpdate = nil
1032
+ }
1033
+
1034
+ if let pendingColormap = pendingColormapUpdate {
1035
+ updateColormapTexture(colormapAsBase64: pendingColormap)
1036
+ pendingColormapUpdate = nil
1037
+ }
1038
+
1039
+ if let pendingData = pendingDataUpdate {
1040
+ updateDataTexture(data: pendingData.data, nx: pendingData.nx, ny: pendingData.ny,
1041
+ scale: pendingData.scale, offset: pendingData.offset,
1042
+ missing: pendingData.missing, scaleType: pendingData.scaleType)
1043
+ pendingDataUpdate = nil
1044
+ }
1045
+ }
1046
+ internal func internalRender(_ parameters: CustomLayerRenderParameters, mtlCommandBuffer: MTLCommandBuffer, mtlRenderPassDescriptor: MTLRenderPassDescriptor) {
1047
+ guard isVisible,
1048
+ let pipeline = pipelineState,
1049
+ let vertices = vertexBuffer,
1050
+ let indices = indexBuffer,
1051
+ let dataTex = dataTexture,
1052
+ let colormapTex = colormapTexture,
1053
+ indexCount > 0,
1054
+ let encoder = mtlCommandBuffer.makeRenderCommandEncoder(descriptor: mtlRenderPassDescriptor) else {
1055
+
1056
+ return
1057
+ }
1058
+
1059
+ let needsLinear = (uniforms.smoothing != 0)
1060
+ if isDataSamplerLinear != needsLinear {
1061
+ let samplerDesc = MTLSamplerDescriptor()
1062
+ samplerDesc.minFilter = needsLinear ? .linear : .nearest
1063
+ samplerDesc.magFilter = needsLinear ? .linear : .nearest
1064
+ dataSamplerState = device.makeSamplerState(descriptor: samplerDesc)
1065
+ isDataSamplerLinear = needsLinear
1066
+ }
1067
+
1068
+ // Apply zoom scale transformation
1069
+ let zoom = parameters.zoom
1070
+ let scale = Float(pow(2.0, zoom))
1071
+
1072
+ let matrixArray = parameters.projectionMatrix
1073
+ var floatArray = matrixArray.map { $0.floatValue }
1074
+
1075
+ floatArray[0] *= scale // X scale
1076
+ floatArray[1] *= scale // X rotation
1077
+ floatArray[2] *= scale // X Z-component
1078
+ floatArray[3] *= scale // X translation
1079
+ floatArray[4] *= scale // Y rotation
1080
+ floatArray[5] *= scale // Y scale
1081
+ floatArray[6] *= scale // Y Z-component
1082
+ floatArray[7] *= scale // Y translation
1083
+ floatArray[8] *= scale // Z X-component
1084
+ floatArray[9] *= scale // Z Y-component
1085
+ floatArray[10] *= scale // Z scale
1086
+ floatArray[11] *= scale // Z translation
1087
+
1088
+ let mvp = matrix_float4x4(
1089
+ SIMD4<Float>(floatArray[0], floatArray[1], floatArray[2], floatArray[3]),
1090
+ SIMD4<Float>(floatArray[4], floatArray[5], floatArray[6], floatArray[7]),
1091
+ SIMD4<Float>(floatArray[8], floatArray[9], floatArray[10], floatArray[11]),
1092
+ SIMD4<Float>(floatArray[12], floatArray[13], floatArray[14], floatArray[15])
1093
+ )
1094
+
1095
+ // Add depth state
1096
+ let depthStencilDescriptor = MTLDepthStencilDescriptor()
1097
+ depthStencilDescriptor.depthCompareFunction = .always
1098
+ depthStencilDescriptor.isDepthWriteEnabled = false
1099
+ let depthStencilState = device.makeDepthStencilState(descriptor: depthStencilDescriptor)
1100
+
1101
+ encoder.setRenderPipelineState(pipeline)
1102
+ encoder.setDepthStencilState(depthStencilState!)
1103
+ encoder.setVertexBuffer(vertices, offset: 0, index: 0)
1104
+ encoder.setVertexBytes([mvp], length: MemoryLayout<matrix_float4x4>.size, index: 1)
1105
+
1106
+ var mutableUniforms = uniforms
1107
+ encoder.setFragmentBytes(&mutableUniforms, length: MemoryLayout<FragmentUniforms>.stride, index: 0)
1108
+ encoder.setFragmentTexture(dataTex, index: 0)
1109
+ encoder.setFragmentTexture(colormapTex, index: 1)
1110
+ encoder.setFragmentSamplerState(dataSamplerState, index: 0)
1111
+ encoder.setFragmentSamplerState(colormapSamplerState, index: 1)
1112
+
1113
+ encoder.drawIndexedPrimitives(type: .triangle, indexCount: indexCount, indexType: .uint16, indexBuffer: indices, indexBufferOffset: 0)
1114
+
1115
+ encoder.endEncoding()
1116
+ }
1117
+
1118
+ deinit {
1119
+ print("🔴 [GridRenderLayer] deinit called for layer: \(id)")
1120
+
1121
+ // Clean up all resources
1122
+ frameCacheQueue.sync {
1123
+ frameCache.removeAll()
1124
+ }
1125
+ vertexBuffer = nil
1126
+ indexBuffer = nil
1127
+ dataTexture = nil
1128
+ colormapTexture = nil
1129
+ device = nil
1130
+ commandQueue = nil
1131
+ pipelineState = nil
1132
+ dataSamplerState = nil
1133
+ colormapSamplerState = nil
1134
+
1135
+ // Break the reference cycle
1136
+ hostWrapper = nil
1137
+ }
1138
+
1139
+ internal func internalRenderingWillEnd() {
1140
+ // DO NOT clear these here, otherwise the layer disappears during map transitions/resizing
1141
+ // vertexBuffer = nil
1142
+ // indexBuffer = nil
1143
+ // dataTexture = nil
1144
+ // colormapTexture = nil
1145
+ }
1146
+ }
1147
+
1148
+ extension GridRenderLayer {
1149
+ // Override to prevent KVC crashes during cleanup
1150
+ open override func value(forUndefinedKey key: String) -> Any? {
1151
+ print("⚠️ [GridRenderLayer] Attempted to access undefined key: \(key)")
1152
+ return nil
1153
+ }
1154
+
1155
+ open override func setValue(_ value: Any?, forUndefinedKey key: String) {
1156
+ print("⚠️ [GridRenderLayer] Attempted to set undefined key: \(key)")
1157
+ // Silently ignore instead of crashing
1158
+ }
1159
+ }