@aguacerowx/react-native 0.0.20 → 0.0.21

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 (529) hide show
  1. package/README.md +126 -126
  2. package/aguacerowx-react-native.podspec +53 -53
  3. package/android/build/.transforms/42e9b8fa82d77a1c205db5bf0d0ed519/results.bin +1 -0
  4. package/android/build/.transforms/42e9b8fa82d77a1c205db5bf0d0ed519/transformed/classes/classes_dex/classes.dex +0 -0
  5. package/android/build/.transforms/c8ab78b63f2cc835ac936d58e29a17ab/results.bin +1 -0
  6. package/android/build/.transforms/c8ab78b63f2cc835ac936d58e29a17ab/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/aguacerowx/reactnative/AguaceroPackage.dex +0 -0
  7. package/android/build/.transforms/c8ab78b63f2cc835ac936d58e29a17ab/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/aguacerowx/reactnative/BuildConfig.dex +0 -0
  8. package/android/build/.transforms/c8ab78b63f2cc835ac936d58e29a17ab/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/aguacerowx/reactnative/GridRenderLayer$VertexInfo.dex +0 -0
  9. package/android/build/.transforms/c8ab78b63f2cc835ac936d58e29a17ab/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/aguacerowx/reactnative/GridRenderLayer.dex +0 -0
  10. package/android/build/.transforms/c8ab78b63f2cc835ac936d58e29a17ab/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/aguacerowx/reactnative/GridRenderLayerView.dex +0 -0
  11. package/android/build/.transforms/c8ab78b63f2cc835ac936d58e29a17ab/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/aguacerowx/reactnative/GridRenderManager.dex +0 -0
  12. package/android/build/.transforms/c8ab78b63f2cc835ac936d58e29a17ab/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/aguacerowx/reactnative/InspectorModule.dex +0 -0
  13. package/android/build/.transforms/c8ab78b63f2cc835ac936d58e29a17ab/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/aguacerowx/reactnative/ShaderUtils.dex +0 -0
  14. package/android/build/.transforms/c8ab78b63f2cc835ac936d58e29a17ab/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/aguacerowx/reactnative/WeatherFrameProcessorModule.dex +0 -0
  15. package/android/build/.transforms/c8ab78b63f2cc835ac936d58e29a17ab/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/facebook/react/viewmanagers/GridRenderLayerManagerDelegate.dex +0 -0
  16. package/android/build/.transforms/c8ab78b63f2cc835ac936d58e29a17ab/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/facebook/react/viewmanagers/GridRenderLayerManagerInterface.dex +0 -0
  17. package/android/build/.transforms/c8ab78b63f2cc835ac936d58e29a17ab/transformed/bundleLibRuntimeToDirDebug/desugar_graph.bin +0 -0
  18. package/android/build/generated/source/buildConfig/debug/com/aguacerowx/reactnative/BuildConfig.java +10 -0
  19. package/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/GridRenderLayerManagerDelegate.java +43 -0
  20. package/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/GridRenderLayerManagerInterface.java +22 -0
  21. package/android/build/generated/source/codegen/jni/AguaceroWxReactNativeSpec-generated.cpp +22 -0
  22. package/android/build/generated/source/codegen/jni/AguaceroWxReactNativeSpec.h +24 -0
  23. package/android/build/generated/source/codegen/jni/CMakeLists.txt +28 -0
  24. package/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/AguaceroWxReactNativeSpecJSI-generated.cpp +17 -0
  25. package/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/AguaceroWxReactNativeSpecJSI.h +19 -0
  26. package/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/ComponentDescriptors.cpp +22 -0
  27. package/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/ComponentDescriptors.h +24 -0
  28. package/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/EventEmitters.cpp +16 -0
  29. package/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/EventEmitters.h +23 -0
  30. package/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/Props.cpp +62 -0
  31. package/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/Props.h +40 -0
  32. package/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/ShadowNodes.cpp +17 -0
  33. package/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/ShadowNodes.h +32 -0
  34. package/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/States.cpp +16 -0
  35. package/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/States.h +20 -0
  36. package/android/build/generated/source/codegen/schema.json +1 -0
  37. package/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml +8 -0
  38. package/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json +18 -0
  39. package/android/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties +6 -0
  40. package/android/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json +1 -0
  41. package/android/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar +0 -0
  42. package/android/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar +0 -0
  43. package/android/build/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt +4 -0
  44. package/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/raw_debug_fragment_shader.glsl.flat +0 -0
  45. package/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/raw_debug_vertex_shader.glsl.flat +0 -0
  46. package/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/raw_fragment_shader.glsl.flat +0 -0
  47. package/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/raw_vertex_shader.glsl.flat +0 -0
  48. package/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +5 -0
  49. package/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml +2 -0
  50. package/android/build/intermediates/incremental/mergeDebugAssets/merger.xml +2 -0
  51. package/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml +2 -0
  52. package/android/build/intermediates/incremental/mergeDebugShaders/merger.xml +2 -0
  53. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/AguaceroPackage.class +0 -0
  54. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/BuildConfig.class +0 -0
  55. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/GridRenderLayer$VertexInfo.class +0 -0
  56. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/GridRenderLayer.class +0 -0
  57. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/GridRenderLayerView.class +0 -0
  58. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/GridRenderManager.class +0 -0
  59. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/InspectorModule.class +0 -0
  60. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/ShaderUtils.class +0 -0
  61. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/WeatherFrameProcessorModule.class +0 -0
  62. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/facebook/react/viewmanagers/GridRenderLayerManagerDelegate.class +0 -0
  63. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/facebook/react/viewmanagers/GridRenderLayerManagerInterface.class +0 -0
  64. package/android/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt +6 -0
  65. package/android/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt +8 -0
  66. package/android/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml +8 -0
  67. package/android/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json +1 -0
  68. package/android/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt +1 -0
  69. package/android/build/intermediates/packaged_res/debug/packageDebugResources/raw/debug_fragment_shader.glsl +13 -0
  70. package/android/build/intermediates/packaged_res/debug/packageDebugResources/raw/debug_vertex_shader.glsl +13 -0
  71. package/android/build/intermediates/packaged_res/debug/packageDebugResources/raw/fragment_shader.glsl +152 -0
  72. package/android/build/intermediates/packaged_res/debug/packageDebugResources/raw/vertex_shader.glsl +20 -0
  73. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/AguaceroPackage.class +0 -0
  74. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/BuildConfig.class +0 -0
  75. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/GridRenderLayer$VertexInfo.class +0 -0
  76. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/GridRenderLayer.class +0 -0
  77. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/GridRenderLayerView.class +0 -0
  78. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/GridRenderManager.class +0 -0
  79. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/InspectorModule.class +0 -0
  80. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/ShaderUtils.class +0 -0
  81. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/WeatherFrameProcessorModule.class +0 -0
  82. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/facebook/react/viewmanagers/GridRenderLayerManagerDelegate.class +0 -0
  83. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/facebook/react/viewmanagers/GridRenderLayerManagerInterface.class +0 -0
  84. package/android/build/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar +0 -0
  85. package/android/build/intermediates/symbol_list_with_package_name/debug/generateDebugRFile/package-aware-r.txt +5 -0
  86. package/android/build/outputs/logs/manifest-merger-debug-report.txt +17 -0
  87. package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/GridRenderLayer$VertexInfo.class.uniqueId0 +0 -0
  88. package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/GridRenderLayer.class.uniqueId1 +0 -0
  89. package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/GridRenderLayerView.class.uniqueId2 +0 -0
  90. package/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin +0 -0
  91. package/android/build.gradle +107 -107
  92. package/android/src/main/AndroidManifest.xml +6 -6
  93. package/android/src/main/java/com/aguacerowx/reactnative/AguaceroPackage.java +33 -33
  94. package/android/src/main/java/com/aguacerowx/reactnative/GridRenderLayer.java +657 -627
  95. package/android/src/main/java/com/aguacerowx/reactnative/GridRenderLayerView.java +304 -304
  96. package/android/src/main/java/com/aguacerowx/reactnative/GridRenderManager.java +125 -125
  97. package/android/src/main/java/com/aguacerowx/reactnative/InspectorModule.java +71 -71
  98. package/android/src/main/java/com/aguacerowx/reactnative/ShaderUtils.java +106 -106
  99. package/android/src/main/java/com/aguacerowx/reactnative/WeatherFrameProcessorModule.java +151 -151
  100. package/android/src/main/res/raw/debug_fragment_shader.glsl +12 -12
  101. package/android/src/main/res/raw/debug_vertex_shader.glsl +12 -12
  102. package/android/src/main/res/raw/fragment_shader.glsl +151 -151
  103. package/android/src/main/res/raw/vertex_shader.glsl +19 -19
  104. package/index.js +2 -2
  105. package/ios/AguaceroPackage.m +18 -18
  106. package/ios/FragmentUniforms.swift +14 -13
  107. package/ios/GridRenderLayer.swift +995 -983
  108. package/ios/GridRenderLayerBridge.swift +29 -29
  109. package/ios/GridRenderLayerManager.mm +157 -145
  110. package/ios/GridRenderLayerView.h +16 -22
  111. package/ios/GridRenderLayerView.m +205 -199
  112. package/ios/InspectorDataCache.swift +65 -65
  113. package/ios/InspectorModule.m +9 -9
  114. package/ios/InspectorModule.swift +63 -63
  115. package/ios/Shaders.metal +178 -130
  116. package/ios/WeatherFrameProcessorModule.m +15 -15
  117. package/ios/WeatherFrameProcessorModule.swift +103 -103
  118. package/ios/compiled-shaders/Shaders-device.metallib +0 -0
  119. package/ios/compiled-shaders/Shaders-simulator.metallib +0 -0
  120. package/lib/commonjs/README.md +126 -126
  121. package/lib/commonjs/aguacerowx-react-native.podspec +53 -53
  122. package/lib/commonjs/android/build/generated/source/buildConfig/debug/com/aguacerowx/reactnative/BuildConfig.java +10 -0
  123. package/lib/commonjs/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/GridRenderLayerManagerDelegate.java +43 -0
  124. package/lib/commonjs/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/GridRenderLayerManagerInterface.java +22 -0
  125. package/lib/commonjs/android/build/generated/source/codegen/jni/AguaceroWxReactNativeSpec-generated.cpp +22 -0
  126. package/lib/commonjs/android/build/generated/source/codegen/jni/AguaceroWxReactNativeSpec.h +24 -0
  127. package/lib/commonjs/android/build/generated/source/codegen/jni/CMakeLists.txt +28 -0
  128. package/lib/commonjs/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/AguaceroWxReactNativeSpecJSI-generated.cpp +17 -0
  129. package/lib/commonjs/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/AguaceroWxReactNativeSpecJSI.h +19 -0
  130. package/lib/commonjs/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/ComponentDescriptors.cpp +22 -0
  131. package/lib/commonjs/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/ComponentDescriptors.h +24 -0
  132. package/lib/commonjs/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/EventEmitters.cpp +16 -0
  133. package/lib/commonjs/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/EventEmitters.h +23 -0
  134. package/lib/commonjs/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/Props.cpp +62 -0
  135. package/lib/commonjs/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/Props.h +40 -0
  136. package/lib/commonjs/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/ShadowNodes.cpp +17 -0
  137. package/lib/commonjs/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/ShadowNodes.h +32 -0
  138. package/lib/commonjs/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/States.cpp +16 -0
  139. package/lib/commonjs/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/States.h +20 -0
  140. package/lib/commonjs/android/build/generated/source/codegen/schema.json +1 -0
  141. package/lib/commonjs/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml +8 -0
  142. package/lib/commonjs/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json +18 -0
  143. package/lib/commonjs/android/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties +6 -0
  144. package/lib/commonjs/android/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json +1 -0
  145. package/lib/commonjs/android/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar +0 -0
  146. package/lib/commonjs/android/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar +0 -0
  147. package/lib/commonjs/android/build/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt +4 -0
  148. package/lib/commonjs/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/raw_debug_fragment_shader.glsl.flat +0 -0
  149. package/lib/commonjs/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/raw_debug_vertex_shader.glsl.flat +0 -0
  150. package/lib/commonjs/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/raw_fragment_shader.glsl.flat +0 -0
  151. package/lib/commonjs/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/raw_vertex_shader.glsl.flat +0 -0
  152. package/lib/commonjs/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +5 -0
  153. package/lib/commonjs/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml +2 -0
  154. package/lib/commonjs/android/build/intermediates/incremental/mergeDebugAssets/merger.xml +2 -0
  155. package/lib/commonjs/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml +2 -0
  156. package/lib/commonjs/android/build/intermediates/incremental/mergeDebugShaders/merger.xml +2 -0
  157. package/lib/commonjs/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/AguaceroPackage.class +0 -0
  158. package/lib/commonjs/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/BuildConfig.class +0 -0
  159. package/lib/commonjs/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/GridRenderLayer$VertexInfo.class +0 -0
  160. package/lib/commonjs/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/GridRenderLayer.class +0 -0
  161. package/lib/commonjs/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/GridRenderLayerView.class +0 -0
  162. package/lib/commonjs/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/GridRenderManager.class +0 -0
  163. package/lib/commonjs/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/InspectorModule.class +0 -0
  164. package/lib/commonjs/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/ShaderUtils.class +0 -0
  165. package/lib/commonjs/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/WeatherFrameProcessorModule.class +0 -0
  166. package/lib/commonjs/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/facebook/react/viewmanagers/GridRenderLayerManagerDelegate.class +0 -0
  167. package/lib/commonjs/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/facebook/react/viewmanagers/GridRenderLayerManagerInterface.class +0 -0
  168. package/lib/commonjs/android/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt +6 -0
  169. package/lib/commonjs/android/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt +8 -0
  170. package/lib/commonjs/android/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml +8 -0
  171. package/lib/commonjs/android/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json +1 -0
  172. package/lib/commonjs/android/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt +1 -0
  173. package/lib/commonjs/android/build/intermediates/packaged_res/debug/packageDebugResources/raw/debug_fragment_shader.glsl +13 -0
  174. package/lib/commonjs/android/build/intermediates/packaged_res/debug/packageDebugResources/raw/debug_vertex_shader.glsl +13 -0
  175. package/lib/commonjs/android/build/intermediates/packaged_res/debug/packageDebugResources/raw/fragment_shader.glsl +152 -0
  176. package/lib/commonjs/android/build/intermediates/packaged_res/debug/packageDebugResources/raw/vertex_shader.glsl +20 -0
  177. package/lib/commonjs/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/AguaceroPackage.class +0 -0
  178. package/lib/commonjs/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/BuildConfig.class +0 -0
  179. package/lib/commonjs/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/GridRenderLayer$VertexInfo.class +0 -0
  180. package/lib/commonjs/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/GridRenderLayer.class +0 -0
  181. package/lib/commonjs/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/GridRenderLayerView.class +0 -0
  182. package/lib/commonjs/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/GridRenderManager.class +0 -0
  183. package/lib/commonjs/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/InspectorModule.class +0 -0
  184. package/lib/commonjs/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/ShaderUtils.class +0 -0
  185. package/lib/commonjs/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/WeatherFrameProcessorModule.class +0 -0
  186. package/lib/commonjs/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/facebook/react/viewmanagers/GridRenderLayerManagerDelegate.class +0 -0
  187. package/lib/commonjs/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/facebook/react/viewmanagers/GridRenderLayerManagerInterface.class +0 -0
  188. package/lib/commonjs/android/build/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar +0 -0
  189. package/lib/commonjs/android/build/intermediates/symbol_list_with_package_name/debug/generateDebugRFile/package-aware-r.txt +5 -0
  190. package/lib/commonjs/android/build/outputs/logs/manifest-merger-debug-report.txt +17 -0
  191. package/lib/commonjs/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/GridRenderLayer$VertexInfo.class.uniqueId0 +0 -0
  192. package/lib/commonjs/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/GridRenderLayer.class.uniqueId1 +0 -0
  193. package/lib/commonjs/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/GridRenderLayerView.class.uniqueId2 +0 -0
  194. package/lib/commonjs/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin +0 -0
  195. package/lib/commonjs/android/build.gradle +107 -107
  196. package/lib/commonjs/android/src/main/AndroidManifest.xml +6 -6
  197. package/lib/commonjs/android/src/main/java/com/aguacerowx/reactnative/AguaceroPackage.java +33 -33
  198. package/lib/commonjs/android/src/main/java/com/aguacerowx/reactnative/GridRenderLayer.java +657 -627
  199. package/lib/commonjs/android/src/main/java/com/aguacerowx/reactnative/GridRenderLayerView.java +304 -304
  200. package/lib/commonjs/android/src/main/java/com/aguacerowx/reactnative/GridRenderManager.java +125 -125
  201. package/lib/commonjs/android/src/main/java/com/aguacerowx/reactnative/InspectorModule.java +71 -71
  202. package/lib/commonjs/android/src/main/java/com/aguacerowx/reactnative/ShaderUtils.java +106 -106
  203. package/lib/commonjs/android/src/main/java/com/aguacerowx/reactnative/WeatherFrameProcessorModule.java +151 -151
  204. package/lib/commonjs/android/src/main/res/raw/debug_fragment_shader.glsl +12 -12
  205. package/lib/commonjs/android/src/main/res/raw/debug_vertex_shader.glsl +12 -12
  206. package/lib/commonjs/android/src/main/res/raw/fragment_shader.glsl +151 -151
  207. package/lib/commonjs/android/src/main/res/raw/vertex_shader.glsl +19 -19
  208. package/lib/commonjs/babel.config.js.map +1 -1
  209. package/lib/commonjs/index.js.map +1 -1
  210. package/lib/commonjs/ios/AguaceroPackage.m +18 -18
  211. package/lib/commonjs/ios/FragmentUniforms.swift +14 -13
  212. package/lib/commonjs/ios/GridRenderLayer.swift +995 -983
  213. package/lib/commonjs/ios/GridRenderLayerBridge.swift +29 -29
  214. package/lib/commonjs/ios/GridRenderLayerManager.mm +157 -145
  215. package/lib/commonjs/ios/GridRenderLayerView.h +16 -22
  216. package/lib/commonjs/ios/GridRenderLayerView.m +205 -199
  217. package/lib/commonjs/ios/InspectorDataCache.swift +65 -65
  218. package/lib/commonjs/ios/InspectorModule.m +9 -9
  219. package/lib/commonjs/ios/InspectorModule.swift +63 -63
  220. package/lib/commonjs/ios/Shaders.metal +178 -130
  221. package/lib/commonjs/ios/WeatherFrameProcessorModule.m +15 -15
  222. package/lib/commonjs/ios/WeatherFrameProcessorModule.swift +103 -103
  223. package/lib/commonjs/ios/compiled-shaders/Shaders-device.metallib +0 -0
  224. package/lib/commonjs/ios/compiled-shaders/Shaders-simulator.metallib +0 -0
  225. package/lib/commonjs/package.json +72 -72
  226. package/lib/commonjs/react-native-builder-bob.config.js.map +1 -1
  227. package/lib/commonjs/scripts/compile-shaders.js +62 -0
  228. package/lib/commonjs/scripts/compile-shaders.js.map +1 -0
  229. package/lib/commonjs/scripts/compile-shaders.sh +38 -26
  230. package/lib/commonjs/src/AguaceroContext.js.map +1 -1
  231. package/lib/commonjs/src/GridRenderLayer.js.map +1 -1
  232. package/lib/commonjs/src/GridRenderLayerNativeComponent.js.map +1 -1
  233. package/lib/commonjs/src/MapManager.js.map +1 -1
  234. package/lib/commonjs/src/MapRegistry.js.map +1 -1
  235. package/lib/commonjs/src/StyleApplicator.js +6 -6
  236. package/lib/commonjs/src/StyleApplicator.js.map +1 -1
  237. package/lib/commonjs/src/WeatherLayerManager.js +21 -16
  238. package/lib/commonjs/src/WeatherLayerManager.js.map +1 -1
  239. package/lib/commonjs/tsconfig.json +23 -23
  240. package/lib/module/README.md +126 -126
  241. package/lib/module/aguacerowx-react-native.podspec +53 -53
  242. package/lib/module/android/build/generated/source/buildConfig/debug/com/aguacerowx/reactnative/BuildConfig.java +10 -0
  243. package/lib/module/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/GridRenderLayerManagerDelegate.java +43 -0
  244. package/lib/module/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/GridRenderLayerManagerInterface.java +22 -0
  245. package/lib/module/android/build/generated/source/codegen/jni/AguaceroWxReactNativeSpec-generated.cpp +22 -0
  246. package/lib/module/android/build/generated/source/codegen/jni/AguaceroWxReactNativeSpec.h +24 -0
  247. package/lib/module/android/build/generated/source/codegen/jni/CMakeLists.txt +28 -0
  248. package/lib/module/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/AguaceroWxReactNativeSpecJSI-generated.cpp +17 -0
  249. package/lib/module/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/AguaceroWxReactNativeSpecJSI.h +19 -0
  250. package/lib/module/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/ComponentDescriptors.cpp +22 -0
  251. package/lib/module/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/ComponentDescriptors.h +24 -0
  252. package/lib/module/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/EventEmitters.cpp +16 -0
  253. package/lib/module/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/EventEmitters.h +23 -0
  254. package/lib/module/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/Props.cpp +62 -0
  255. package/lib/module/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/Props.h +40 -0
  256. package/lib/module/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/ShadowNodes.cpp +17 -0
  257. package/lib/module/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/ShadowNodes.h +32 -0
  258. package/lib/module/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/States.cpp +16 -0
  259. package/lib/module/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/States.h +20 -0
  260. package/lib/module/android/build/generated/source/codegen/schema.json +1 -0
  261. package/lib/module/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml +8 -0
  262. package/lib/module/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json +18 -0
  263. package/lib/module/android/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties +6 -0
  264. package/lib/module/android/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json +1 -0
  265. package/lib/module/android/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar +0 -0
  266. package/lib/module/android/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar +0 -0
  267. package/lib/module/android/build/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt +4 -0
  268. package/lib/module/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/raw_debug_fragment_shader.glsl.flat +0 -0
  269. package/lib/module/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/raw_debug_vertex_shader.glsl.flat +0 -0
  270. package/lib/module/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/raw_fragment_shader.glsl.flat +0 -0
  271. package/lib/module/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/raw_vertex_shader.glsl.flat +0 -0
  272. package/lib/module/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +5 -0
  273. package/lib/module/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml +2 -0
  274. package/lib/module/android/build/intermediates/incremental/mergeDebugAssets/merger.xml +2 -0
  275. package/lib/module/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml +2 -0
  276. package/lib/module/android/build/intermediates/incremental/mergeDebugShaders/merger.xml +2 -0
  277. package/lib/module/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/AguaceroPackage.class +0 -0
  278. package/lib/module/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/BuildConfig.class +0 -0
  279. package/lib/module/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/GridRenderLayer$VertexInfo.class +0 -0
  280. package/lib/module/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/GridRenderLayer.class +0 -0
  281. package/lib/module/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/GridRenderLayerView.class +0 -0
  282. package/lib/module/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/GridRenderManager.class +0 -0
  283. package/lib/module/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/InspectorModule.class +0 -0
  284. package/lib/module/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/ShaderUtils.class +0 -0
  285. package/lib/module/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/WeatherFrameProcessorModule.class +0 -0
  286. package/lib/module/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/facebook/react/viewmanagers/GridRenderLayerManagerDelegate.class +0 -0
  287. package/lib/module/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/facebook/react/viewmanagers/GridRenderLayerManagerInterface.class +0 -0
  288. package/lib/module/android/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt +6 -0
  289. package/lib/module/android/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt +8 -0
  290. package/lib/module/android/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml +8 -0
  291. package/lib/module/android/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json +1 -0
  292. package/lib/module/android/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt +1 -0
  293. package/lib/module/android/build/intermediates/packaged_res/debug/packageDebugResources/raw/debug_fragment_shader.glsl +13 -0
  294. package/lib/module/android/build/intermediates/packaged_res/debug/packageDebugResources/raw/debug_vertex_shader.glsl +13 -0
  295. package/lib/module/android/build/intermediates/packaged_res/debug/packageDebugResources/raw/fragment_shader.glsl +152 -0
  296. package/lib/module/android/build/intermediates/packaged_res/debug/packageDebugResources/raw/vertex_shader.glsl +20 -0
  297. package/lib/module/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/AguaceroPackage.class +0 -0
  298. package/lib/module/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/BuildConfig.class +0 -0
  299. package/lib/module/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/GridRenderLayer$VertexInfo.class +0 -0
  300. package/lib/module/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/GridRenderLayer.class +0 -0
  301. package/lib/module/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/GridRenderLayerView.class +0 -0
  302. package/lib/module/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/GridRenderManager.class +0 -0
  303. package/lib/module/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/InspectorModule.class +0 -0
  304. package/lib/module/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/ShaderUtils.class +0 -0
  305. package/lib/module/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/WeatherFrameProcessorModule.class +0 -0
  306. package/lib/module/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/facebook/react/viewmanagers/GridRenderLayerManagerDelegate.class +0 -0
  307. package/lib/module/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/facebook/react/viewmanagers/GridRenderLayerManagerInterface.class +0 -0
  308. package/lib/module/android/build/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar +0 -0
  309. package/lib/module/android/build/intermediates/symbol_list_with_package_name/debug/generateDebugRFile/package-aware-r.txt +5 -0
  310. package/lib/module/android/build/outputs/logs/manifest-merger-debug-report.txt +17 -0
  311. package/lib/module/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/GridRenderLayer$VertexInfo.class.uniqueId0 +0 -0
  312. package/lib/module/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/GridRenderLayer.class.uniqueId1 +0 -0
  313. package/lib/module/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/GridRenderLayerView.class.uniqueId2 +0 -0
  314. package/lib/module/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin +0 -0
  315. package/lib/module/android/build.gradle +107 -107
  316. package/lib/module/android/src/main/AndroidManifest.xml +6 -6
  317. package/lib/module/android/src/main/java/com/aguacerowx/reactnative/AguaceroPackage.java +33 -33
  318. package/lib/module/android/src/main/java/com/aguacerowx/reactnative/GridRenderLayer.java +657 -627
  319. package/lib/module/android/src/main/java/com/aguacerowx/reactnative/GridRenderLayerView.java +304 -304
  320. package/lib/module/android/src/main/java/com/aguacerowx/reactnative/GridRenderManager.java +125 -125
  321. package/lib/module/android/src/main/java/com/aguacerowx/reactnative/InspectorModule.java +71 -71
  322. package/lib/module/android/src/main/java/com/aguacerowx/reactnative/ShaderUtils.java +106 -106
  323. package/lib/module/android/src/main/java/com/aguacerowx/reactnative/WeatherFrameProcessorModule.java +151 -151
  324. package/lib/module/android/src/main/res/raw/debug_fragment_shader.glsl +12 -12
  325. package/lib/module/android/src/main/res/raw/debug_vertex_shader.glsl +12 -12
  326. package/lib/module/android/src/main/res/raw/fragment_shader.glsl +151 -151
  327. package/lib/module/android/src/main/res/raw/vertex_shader.glsl +19 -19
  328. package/lib/module/babel.config.js.map +1 -1
  329. package/lib/module/index.js.map +1 -1
  330. package/lib/module/ios/AguaceroPackage.m +18 -18
  331. package/lib/module/ios/FragmentUniforms.swift +14 -13
  332. package/lib/module/ios/GridRenderLayer.swift +995 -983
  333. package/lib/module/ios/GridRenderLayerBridge.swift +29 -29
  334. package/lib/module/ios/GridRenderLayerManager.mm +157 -145
  335. package/lib/module/ios/GridRenderLayerView.h +16 -22
  336. package/lib/module/ios/GridRenderLayerView.m +205 -199
  337. package/lib/module/ios/InspectorDataCache.swift +65 -65
  338. package/lib/module/ios/InspectorModule.m +9 -9
  339. package/lib/module/ios/InspectorModule.swift +63 -63
  340. package/lib/module/ios/Shaders.metal +178 -130
  341. package/lib/module/ios/WeatherFrameProcessorModule.m +15 -15
  342. package/lib/module/ios/WeatherFrameProcessorModule.swift +103 -103
  343. package/lib/module/ios/compiled-shaders/Shaders-device.metallib +0 -0
  344. package/lib/module/ios/compiled-shaders/Shaders-simulator.metallib +0 -0
  345. package/lib/module/lib/commonjs/README.md +126 -126
  346. package/lib/module/lib/commonjs/aguacerowx-react-native.podspec +53 -53
  347. package/lib/module/lib/commonjs/android/build.gradle +107 -107
  348. package/lib/module/lib/commonjs/android/src/main/AndroidManifest.xml +6 -6
  349. package/lib/module/lib/commonjs/babel.config.js.map +1 -1
  350. package/lib/module/lib/commonjs/index.js.map +1 -1
  351. package/lib/module/lib/commonjs/ios/AguaceroPackage.m +18 -18
  352. package/lib/module/lib/commonjs/ios/FragmentUniforms.swift +14 -13
  353. package/lib/module/lib/commonjs/ios/GridRenderLayer.swift +995 -983
  354. package/lib/module/lib/commonjs/ios/GridRenderLayerBridge.swift +29 -29
  355. package/lib/module/lib/commonjs/ios/GridRenderLayerManager.mm +157 -145
  356. package/lib/module/lib/commonjs/ios/GridRenderLayerView.h +16 -22
  357. package/lib/module/lib/commonjs/ios/GridRenderLayerView.m +205 -199
  358. package/lib/module/lib/commonjs/ios/InspectorDataCache.swift +65 -65
  359. package/lib/module/lib/commonjs/ios/InspectorModule.m +9 -9
  360. package/lib/module/lib/commonjs/ios/InspectorModule.swift +63 -63
  361. package/lib/module/lib/commonjs/ios/Shaders.metal +178 -130
  362. package/lib/module/lib/commonjs/ios/WeatherFrameProcessorModule.m +15 -15
  363. package/lib/module/lib/commonjs/ios/WeatherFrameProcessorModule.swift +103 -103
  364. package/lib/module/lib/commonjs/ios/compiled-shaders/Shaders-device.metallib +0 -0
  365. package/lib/module/lib/commonjs/ios/compiled-shaders/Shaders-simulator.metallib +0 -0
  366. package/lib/module/lib/commonjs/package.json +72 -72
  367. package/lib/module/lib/commonjs/react-native-builder-bob.config.js.map +1 -1
  368. package/lib/module/lib/commonjs/scripts/compile-shaders.js +62 -0
  369. package/lib/module/lib/commonjs/scripts/compile-shaders.js.map +1 -0
  370. package/lib/module/lib/commonjs/scripts/compile-shaders.sh +38 -26
  371. package/lib/module/lib/commonjs/src/AguaceroContext.js.map +1 -1
  372. package/lib/module/lib/commonjs/src/GridRenderLayer.js.map +1 -1
  373. package/lib/module/lib/commonjs/src/GridRenderLayerNativeComponent.js.map +1 -1
  374. package/lib/module/lib/commonjs/src/MapManager.js.map +1 -1
  375. package/lib/module/lib/commonjs/src/MapRegistry.js.map +1 -1
  376. package/lib/module/lib/commonjs/src/StyleApplicator.js +6 -6
  377. package/lib/module/lib/commonjs/src/StyleApplicator.js.map +1 -1
  378. package/lib/module/lib/commonjs/src/WeatherLayerManager.js +21 -16
  379. package/lib/module/lib/commonjs/src/WeatherLayerManager.js.map +1 -1
  380. package/lib/module/lib/commonjs/tsconfig.json +23 -23
  381. package/lib/module/package.json +72 -72
  382. package/lib/module/react-native-builder-bob.config.js.map +1 -1
  383. package/lib/module/scripts/compile-shaders.js +60 -0
  384. package/lib/module/scripts/compile-shaders.js.map +1 -0
  385. package/lib/module/scripts/compile-shaders.sh +38 -26
  386. package/lib/module/src/AguaceroContext.js.map +1 -1
  387. package/lib/module/src/GridRenderLayer.js.map +1 -1
  388. package/lib/module/src/GridRenderLayerNativeComponent.js.map +1 -1
  389. package/lib/module/src/MapManager.js.map +1 -1
  390. package/lib/module/src/MapRegistry.js.map +1 -1
  391. package/lib/module/src/StyleApplicator.js +6 -6
  392. package/lib/module/src/StyleApplicator.js.map +1 -1
  393. package/lib/module/src/WeatherLayerManager.js +21 -16
  394. package/lib/module/src/WeatherLayerManager.js.map +1 -1
  395. package/lib/module/tsconfig.json +23 -23
  396. package/lib/typescript/scripts/compile-shaders.d.ts +3 -0
  397. package/lib/typescript/scripts/compile-shaders.d.ts.map +1 -0
  398. package/lib/typescript/src/WeatherLayerManager.d.ts.map +1 -1
  399. package/package.json +72 -72
  400. package/src/AguaceroContext.js +3 -3
  401. package/src/GridRenderLayer.js +217 -217
  402. package/src/GridRenderLayerNativeComponent.ts +15 -15
  403. package/src/MapManager.js +155 -155
  404. package/src/MapRegistry.js +34 -34
  405. package/src/StyleApplicator.js +240 -240
  406. package/src/WeatherLayerManager.js +891 -879
  407. package/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/dist/AguaceroCore.js +0 -1063
  408. package/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/dist/AguaceroCore.js.map +0 -1
  409. package/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/dist/coordinate_configs.js +0 -381
  410. package/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/dist/coordinate_configs.js.map +0 -1
  411. package/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/dist/default-colormaps.js +0 -1256
  412. package/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/dist/default-colormaps.js.map +0 -1
  413. package/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/dist/dictionaries.js +0 -4041
  414. package/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/dist/dictionaries.js.map +0 -1
  415. package/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/dist/events.js +0 -38
  416. package/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/dist/events.js.map +0 -1
  417. package/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/dist/fill-layer-worker.js +0 -30
  418. package/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/dist/fill-layer-worker.js.map +0 -1
  419. package/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/dist/getBundleId.js +0 -27
  420. package/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/dist/getBundleId.js.map +0 -1
  421. package/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/dist/index.js +0 -41
  422. package/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/dist/index.js.map +0 -1
  423. package/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/dist/map-styles.js +0 -301
  424. package/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/dist/map-styles.js.map +0 -1
  425. package/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/dist/unitConversions.js +0 -126
  426. package/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/dist/unitConversions.js.map +0 -1
  427. package/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/package.json +0 -48
  428. package/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/src/AguaceroCore.js +0 -1055
  429. package/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/src/AguaceroCore.js.map +0 -1
  430. package/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/src/coordinate_configs.js +0 -381
  431. package/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/src/coordinate_configs.js.map +0 -1
  432. package/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/src/default-colormaps.js +0 -1256
  433. package/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/src/default-colormaps.js.map +0 -1
  434. package/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/src/dictionaries.js +0 -4041
  435. package/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/src/dictionaries.js.map +0 -1
  436. package/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/src/events.js +0 -38
  437. package/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/src/events.js.map +0 -1
  438. package/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/src/fill-layer-worker.js +0 -30
  439. package/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/src/fill-layer-worker.js.map +0 -1
  440. package/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/src/getBundleId.js +0 -27
  441. package/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/src/getBundleId.js.map +0 -1
  442. package/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/src/index.js +0 -41
  443. package/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/src/index.js.map +0 -1
  444. package/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/src/map-styles.js +0 -301
  445. package/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/src/map-styles.js.map +0 -1
  446. package/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/src/unitConversions.js +0 -126
  447. package/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/src/unitConversions.js.map +0 -1
  448. package/lib/module/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/dist/AguaceroCore.js +0 -1063
  449. package/lib/module/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/dist/AguaceroCore.js.map +0 -1
  450. package/lib/module/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/dist/coordinate_configs.js +0 -381
  451. package/lib/module/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/dist/coordinate_configs.js.map +0 -1
  452. package/lib/module/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/dist/default-colormaps.js +0 -1256
  453. package/lib/module/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/dist/default-colormaps.js.map +0 -1
  454. package/lib/module/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/dist/dictionaries.js +0 -4041
  455. package/lib/module/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/dist/dictionaries.js.map +0 -1
  456. package/lib/module/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/dist/events.js +0 -38
  457. package/lib/module/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/dist/events.js.map +0 -1
  458. package/lib/module/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/dist/fill-layer-worker.js +0 -30
  459. package/lib/module/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/dist/fill-layer-worker.js.map +0 -1
  460. package/lib/module/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/dist/getBundleId.js +0 -27
  461. package/lib/module/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/dist/getBundleId.js.map +0 -1
  462. package/lib/module/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/dist/index.js +0 -41
  463. package/lib/module/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/dist/index.js.map +0 -1
  464. package/lib/module/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/dist/map-styles.js +0 -301
  465. package/lib/module/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/dist/map-styles.js.map +0 -1
  466. package/lib/module/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/dist/unitConversions.js +0 -126
  467. package/lib/module/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/dist/unitConversions.js.map +0 -1
  468. package/lib/module/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/package.json +0 -48
  469. package/lib/module/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/src/AguaceroCore.js +0 -1059
  470. package/lib/module/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/src/AguaceroCore.js.map +0 -1
  471. package/lib/module/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/src/coordinate_configs.js +0 -381
  472. package/lib/module/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/src/coordinate_configs.js.map +0 -1
  473. package/lib/module/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/src/default-colormaps.js +0 -1256
  474. package/lib/module/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/src/default-colormaps.js.map +0 -1
  475. package/lib/module/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/src/dictionaries.js +0 -4041
  476. package/lib/module/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/src/dictionaries.js.map +0 -1
  477. package/lib/module/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/src/events.js +0 -38
  478. package/lib/module/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/src/events.js.map +0 -1
  479. package/lib/module/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/src/fill-layer-worker.js +0 -30
  480. package/lib/module/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/src/fill-layer-worker.js.map +0 -1
  481. package/lib/module/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/src/getBundleId.js +0 -27
  482. package/lib/module/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/src/getBundleId.js.map +0 -1
  483. package/lib/module/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/src/index.js +0 -41
  484. package/lib/module/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/src/index.js.map +0 -1
  485. package/lib/module/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/src/map-styles.js +0 -301
  486. package/lib/module/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/src/map-styles.js.map +0 -1
  487. package/lib/module/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/src/unitConversions.js +0 -126
  488. package/lib/module/lib/commonjs/node_modules/@aguacerowx/javascript-sdk/src/unitConversions.js.map +0 -1
  489. package/lib/module/node_modules/@aguacerowx/javascript-sdk/dist/AguaceroCore.js +0 -1063
  490. package/lib/module/node_modules/@aguacerowx/javascript-sdk/dist/AguaceroCore.js.map +0 -1
  491. package/lib/module/node_modules/@aguacerowx/javascript-sdk/dist/coordinate_configs.js +0 -381
  492. package/lib/module/node_modules/@aguacerowx/javascript-sdk/dist/coordinate_configs.js.map +0 -1
  493. package/lib/module/node_modules/@aguacerowx/javascript-sdk/dist/default-colormaps.js +0 -1256
  494. package/lib/module/node_modules/@aguacerowx/javascript-sdk/dist/default-colormaps.js.map +0 -1
  495. package/lib/module/node_modules/@aguacerowx/javascript-sdk/dist/dictionaries.js +0 -4041
  496. package/lib/module/node_modules/@aguacerowx/javascript-sdk/dist/dictionaries.js.map +0 -1
  497. package/lib/module/node_modules/@aguacerowx/javascript-sdk/dist/events.js +0 -38
  498. package/lib/module/node_modules/@aguacerowx/javascript-sdk/dist/events.js.map +0 -1
  499. package/lib/module/node_modules/@aguacerowx/javascript-sdk/dist/fill-layer-worker.js +0 -30
  500. package/lib/module/node_modules/@aguacerowx/javascript-sdk/dist/fill-layer-worker.js.map +0 -1
  501. package/lib/module/node_modules/@aguacerowx/javascript-sdk/dist/getBundleId.js +0 -27
  502. package/lib/module/node_modules/@aguacerowx/javascript-sdk/dist/getBundleId.js.map +0 -1
  503. package/lib/module/node_modules/@aguacerowx/javascript-sdk/dist/index.js +0 -41
  504. package/lib/module/node_modules/@aguacerowx/javascript-sdk/dist/index.js.map +0 -1
  505. package/lib/module/node_modules/@aguacerowx/javascript-sdk/dist/map-styles.js +0 -301
  506. package/lib/module/node_modules/@aguacerowx/javascript-sdk/dist/map-styles.js.map +0 -1
  507. package/lib/module/node_modules/@aguacerowx/javascript-sdk/dist/unitConversions.js +0 -126
  508. package/lib/module/node_modules/@aguacerowx/javascript-sdk/dist/unitConversions.js.map +0 -1
  509. package/lib/module/node_modules/@aguacerowx/javascript-sdk/package.json +0 -48
  510. package/lib/module/node_modules/@aguacerowx/javascript-sdk/src/AguaceroCore.js +0 -1047
  511. package/lib/module/node_modules/@aguacerowx/javascript-sdk/src/AguaceroCore.js.map +0 -1
  512. package/lib/module/node_modules/@aguacerowx/javascript-sdk/src/coordinate_configs.js +0 -375
  513. package/lib/module/node_modules/@aguacerowx/javascript-sdk/src/coordinate_configs.js.map +0 -1
  514. package/lib/module/node_modules/@aguacerowx/javascript-sdk/src/default-colormaps.js +0 -1250
  515. package/lib/module/node_modules/@aguacerowx/javascript-sdk/src/default-colormaps.js.map +0 -1
  516. package/lib/module/node_modules/@aguacerowx/javascript-sdk/src/dictionaries.js +0 -4035
  517. package/lib/module/node_modules/@aguacerowx/javascript-sdk/src/dictionaries.js.map +0 -1
  518. package/lib/module/node_modules/@aguacerowx/javascript-sdk/src/events.js +0 -31
  519. package/lib/module/node_modules/@aguacerowx/javascript-sdk/src/events.js.map +0 -1
  520. package/lib/module/node_modules/@aguacerowx/javascript-sdk/src/fill-layer-worker.js +0 -29
  521. package/lib/module/node_modules/@aguacerowx/javascript-sdk/src/fill-layer-worker.js.map +0 -1
  522. package/lib/module/node_modules/@aguacerowx/javascript-sdk/src/getBundleId.js +0 -21
  523. package/lib/module/node_modules/@aguacerowx/javascript-sdk/src/getBundleId.js.map +0 -1
  524. package/lib/module/node_modules/@aguacerowx/javascript-sdk/src/index.js +0 -12
  525. package/lib/module/node_modules/@aguacerowx/javascript-sdk/src/index.js.map +0 -1
  526. package/lib/module/node_modules/@aguacerowx/javascript-sdk/src/map-styles.js +0 -295
  527. package/lib/module/node_modules/@aguacerowx/javascript-sdk/src/map-styles.js.map +0 -1
  528. package/lib/module/node_modules/@aguacerowx/javascript-sdk/src/unitConversions.js +0 -119
  529. package/lib/module/node_modules/@aguacerowx/javascript-sdk/src/unitConversions.js.map +0 -1
@@ -1,628 +1,658 @@
1
- // packages/react-native/android/src/main/java/com/aguacerowx/reactnative/GridRenderLayer.java
2
-
3
- package com.aguacerowx.reactnative;
4
-
5
- import android.content.Context;
6
- import android.opengl.GLES20;
7
- import android.util.Log;
8
-
9
- import com.facebook.react.bridge.ReadableArray;
10
- import com.facebook.react.bridge.ReadableMap;
11
- import com.mapbox.maps.CustomLayerHost;
12
- import com.mapbox.maps.CustomLayerRenderParameters;
13
-
14
- import java.io.InputStream;
15
- import java.nio.ByteBuffer;
16
- import java.nio.ByteOrder;
17
- import java.nio.FloatBuffer;
18
- import java.nio.ShortBuffer;
19
- import java.util.ArrayList;
20
- import java.util.List;
21
- import java.util.Scanner;
22
-
23
- import java.io.File;
24
- import java.io.FileInputStream;
25
- import java.io.IOException;
26
- import com.github.luben.zstd.Zstd;
27
-
28
- public class GridRenderLayer implements CustomLayerHost {
29
- private final Context context;
30
- private final String TAG = "AguaceroWX";
31
- private int program;
32
-
33
- // Uniform and Attribute locations
34
- private int uMatrix, uDataTexture, uColormapTexture, uOpacity, uDataRange,
35
- uScale, uOffset, uMissingQuantized, uTextureSize, uConversionType, uSmoothing,
36
- uScaleType, uIsPtype;
37
- private int aPosition, aTexCoord;
38
-
39
- // GPU-side resource IDs
40
- private int dataTextureId = 0;
41
- private int colormapTextureId = 0;
42
- private int vboId = 0;
43
- private int iboId = 0;
44
- private int indexCount = 0;
45
-
46
- // Layer properties
47
- private float opacity = 1.0f;
48
- private float[] dataRange = new float[]{0.0f, 1.0f};
49
- private float scale = 1.0f;
50
- private float offset = 0.0f;
51
- private float missingQuantized = 127.0f;
52
- private int textureWidth = 0;
53
- private int textureHeight = 0;
54
- private int conversionType = 0;
55
- private boolean smoothingEnabled = true;
56
- private int scaleType = 0;
57
- private boolean isPtype = false; // ADDED
58
- private String currentVariable = "";
59
- private boolean textureParametersDirty = true;
60
- private volatile boolean isVisible = true;
61
-
62
- // Pending data buffers for thread-safe uploads
63
- private final Object dataLock = new Object();
64
- private ByteBuffer pendingDataBuffer = null;
65
- private int pendingNx = 0, pendingNy = 0;
66
- private float pendingScale = 1.0f, pendingOffset = 0.0f, pendingMissing = 127.0f;
67
- private int pendingScaleType = 0;
68
- private ByteBuffer pendingColormapBuffer = null;
69
- private FloatBuffer pendingVertexBuffer = null;
70
- private ShortBuffer pendingIndexBuffer = null;
71
-
72
-
73
- public GridRenderLayer(Context context) {
74
- this.context = context;
75
- }
76
-
77
- private double getDouble(ReadableMap map, String key, double defaultValue) {
78
- return map.hasKey(key) ? map.getDouble(key) : defaultValue;
79
- }
80
-
81
- private String loadShaderSource(int resourceId) {
82
- InputStream inputStream = context.getResources().openRawResource(resourceId);
83
- return new Scanner(inputStream).useDelimiter("\\A").next();
84
- }
85
-
86
- private int createShader(int type, String source) {
87
- int shader = GLES20.glCreateShader(type);
88
- if (shader == 0) return 0;
89
- GLES20.glShaderSource(shader, source);
90
- GLES20.glCompileShader(shader);
91
- final int[] compileStatus = new int[1];
92
- GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compileStatus, 0);
93
- if (compileStatus[0] == 0) {
94
- Log.e(TAG, "Error compiling shader: " + GLES20.glGetShaderInfoLog(shader));
95
- GLES20.glDeleteShader(shader);
96
- return 0;
97
- }
98
- return shader;
99
- }
100
-
101
- @Override
102
- public void initialize() {
103
- String vertexSource = loadShaderSource(R.raw.vertex_shader);
104
- String fragmentSource = loadShaderSource(R.raw.fragment_shader);
105
- int vertexShader = createShader(GLES20.GL_VERTEX_SHADER, vertexSource);
106
- int fragmentShader = createShader(GLES20.GL_FRAGMENT_SHADER, fragmentSource);
107
-
108
- program = GLES20.glCreateProgram();
109
- GLES20.glAttachShader(program, vertexShader);
110
- GLES20.glAttachShader(program, fragmentShader);
111
- GLES20.glLinkProgram(program);
112
-
113
- uMatrix = GLES20.glGetUniformLocation(program, "u_matrix");
114
- uDataTexture = GLES20.glGetUniformLocation(program, "u_data_texture");
115
- uColormapTexture = GLES20.glGetUniformLocation(program, "u_colormap_texture");
116
- uOpacity = GLES20.glGetUniformLocation(program, "u_opacity");
117
- uDataRange = GLES20.glGetUniformLocation(program, "u_data_range");
118
- uScale = GLES20.glGetUniformLocation(program, "u_scale");
119
- uOffset = GLES20.glGetUniformLocation(program, "u_offset");
120
- uMissingQuantized = GLES20.glGetUniformLocation(program, "u_missing_quantized");
121
- uTextureSize = GLES20.glGetUniformLocation(program, "u_texture_size");
122
- uConversionType = GLES20.glGetUniformLocation(program, "u_conversion_type");
123
- uSmoothing = GLES20.glGetUniformLocation(program, "u_smoothing");
124
- uScaleType = GLES20.glGetUniformLocation(program, "u_scale_type");
125
- uIsPtype = GLES20.glGetUniformLocation(program, "u_is_ptype");
126
- aPosition = GLES20.glGetAttribLocation(program, "a_position");
127
- aTexCoord = GLES20.glGetAttribLocation(program, "a_texCoord");
128
- }
129
-
130
- public void setVariable(String variable) {
131
- if (variable == null) {
132
- this.currentVariable = "";
133
- } else {
134
- this.currentVariable = variable;
135
- }
136
- // MODIFICATION: Add detailed logging here
137
- this.isPtype = "ptypeRefl".equals(this.currentVariable) || "ptypeRate".equals(this.currentVariable);
138
- Log.d(TAG, "setVariable called. Variable: '" + this.currentVariable + "', isPtype set to: " + this.isPtype);
139
- }
140
-
141
-
142
- public void clearData() {
143
- this.isVisible = false;
144
- // Also clear any pending data to prevent a stale frame from rendering
145
- synchronized (dataLock) {
146
- pendingDataBuffer = null;
147
- }
148
- }
149
-
150
- @Override
151
- public void render(CustomLayerRenderParameters renderParameters) {
152
- if (program == 0 || !isVisible) return;
153
-
154
- synchronized (dataLock) {
155
- if (pendingVertexBuffer != null && pendingIndexBuffer != null) {
156
- this.indexCount = pendingIndexBuffer.capacity();
157
- if (vboId == 0) {
158
- int[] bufs = new int[2];
159
- GLES20.glGenBuffers(2, bufs, 0);
160
- vboId = bufs[0];
161
- iboId = bufs[1];
162
- }
163
- GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vboId);
164
- GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, pendingVertexBuffer.capacity() * 4, pendingVertexBuffer, GLES20.GL_STATIC_DRAW);
165
- GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, iboId);
166
- GLES20.glBufferData(GLES20.GL_ELEMENT_ARRAY_BUFFER, pendingIndexBuffer.capacity() * 2, pendingIndexBuffer, GLES20.GL_STATIC_DRAW);
167
- pendingVertexBuffer = null;
168
- pendingIndexBuffer = null;
169
- }
170
-
171
- if (pendingDataBuffer != null) {
172
- // --- FIX 2: LOGICAL FIX FOR TEXTURE RESIZING ---
173
- boolean dimensionsChanged = (pendingNx != this.textureWidth || pendingNy != this.textureHeight);
174
-
175
- this.textureWidth = pendingNx;
176
- this.textureHeight = pendingNy;
177
- this.scale = pendingScale;
178
- this.offset = pendingOffset;
179
- this.missingQuantized = pendingMissing;
180
- this.scaleType = pendingScaleType;
181
-
182
- if (dataTextureId == 0) {
183
- int[] t = new int[1];
184
- GLES20.glGenTextures(1, t, 0);
185
- dataTextureId = t[0];
186
- }
187
-
188
- GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, dataTextureId);
189
-
190
- if (dimensionsChanged || dataTextureId == 0) {
191
- int filter = smoothingEnabled ? GLES20.GL_LINEAR : GLES20.GL_NEAREST;
192
- GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, filter);
193
- GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, filter);
194
-
195
- GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
196
-
197
- GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
198
- GLES20.glPixelStorei(GLES20.GL_UNPACK_ALIGNMENT, 1);
199
-
200
- pendingDataBuffer.position(0);
201
- GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_ALPHA, pendingNx, pendingNy, 0, GLES20.GL_ALPHA, GLES20.GL_UNSIGNED_BYTE, pendingDataBuffer);
202
- } else {
203
- // Texture dimensions are the same, so just update its contents efficiently
204
- pendingDataBuffer.position(0);
205
- GLES20.glTexSubImage2D(GLES20.GL_TEXTURE_2D, 0, 0, 0, pendingNx, pendingNy, GLES20.GL_ALPHA, GLES20.GL_UNSIGNED_BYTE, pendingDataBuffer);
206
- }
207
- pendingDataBuffer = null;
208
- }
209
-
210
- if (pendingColormapBuffer != null) {
211
- if (colormapTextureId == 0) {
212
- int[] t = new int[1];
213
- GLES20.glGenTextures(1, t, 0);
214
- colormapTextureId = t[0];
215
- }
216
- GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, colormapTextureId);
217
- GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);
218
- GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST);
219
- GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
220
- pendingColormapBuffer.position(0);
221
- GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, 256, 1, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, pendingColormapBuffer);
222
- pendingColormapBuffer = null;
223
- }
224
- }
225
-
226
- double zoom = renderParameters.getZoom();
227
-
228
- if (vboId == 0 || iboId == 0 || indexCount == 0 || dataTextureId == 0 || colormapTextureId == 0) return;
229
-
230
- if (textureParametersDirty) {
231
- GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, dataTextureId);
232
- int filter = smoothingEnabled ? GLES20.GL_LINEAR : GLES20.GL_NEAREST;
233
- GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, filter);
234
- GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, filter);
235
- textureParametersDirty = false;
236
- }
237
-
238
- GLES20.glUseProgram(program);
239
-
240
- double scale = Math.pow(2.0, zoom);
241
-
242
- List<Double> matrix = renderParameters.getProjectionMatrix();
243
- float[] floatMatrix = new float[16];
244
- for (int i = 0; i < 16; i++) {
245
- floatMatrix[i] = matrix.get(i).floatValue();
246
- }
247
-
248
- floatMatrix[0] *= scale;
249
- floatMatrix[5] *= scale;
250
-
251
- GLES20.glUniformMatrix4fv(uMatrix, 1, false, floatMatrix, 0);
252
- GLES20.glUniform1f(uOpacity, opacity);
253
- GLES20.glUniform2fv(uDataRange, 1, dataRange, 0);
254
- GLES20.glUniform1f(uScale, this.scale);
255
- GLES20.glUniform1f(uOffset, offset);
256
- GLES20.glUniform1f(uMissingQuantized, missingQuantized);
257
- GLES20.glUniform2f(uTextureSize, (float) textureWidth, (float) textureHeight);
258
- GLES20.glUniform1i(uConversionType, conversionType);
259
- GLES20.glUniform1i(uSmoothing, smoothingEnabled ? 1 : 0);
260
- GLES20.glUniform1i(uScaleType, this.scaleType);
261
- GLES20.glUniform1i(uIsPtype, this.isPtype ? 1 : 0);
262
-
263
- GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
264
- GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, dataTextureId);
265
- GLES20.glUniform1i(uDataTexture, 0);
266
-
267
- GLES20.glActiveTexture(GLES20.GL_TEXTURE1);
268
- GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, colormapTextureId);
269
- GLES20.glUniform1i(uColormapTexture, 1);
270
-
271
- GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vboId);
272
- GLES20.glEnableVertexAttribArray(aPosition);
273
- GLES20.glVertexAttribPointer(aPosition, 2, GLES20.GL_FLOAT, false, 16, 0);
274
- GLES20.glEnableVertexAttribArray(aTexCoord);
275
- GLES20.glVertexAttribPointer(aTexCoord, 2, GLES20.GL_FLOAT, false, 16, 8);
276
- GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, iboId);
277
-
278
- GLES20.glEnable(GLES20.GL_BLEND);
279
- GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA);
280
- GLES20.glDisable(GLES20.GL_DEPTH_TEST);
281
-
282
- GLES20.glDrawElements(GLES20.GL_TRIANGLES, indexCount, GLES20.GL_UNSIGNED_SHORT, 0);
283
-
284
- GLES20.glDisableVertexAttribArray(aPosition);
285
- GLES20.glDisableVertexAttribArray(aTexCoord);
286
- GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
287
- GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, 0);
288
- }
289
-
290
- @Override
291
- public void deinitialize() {
292
- if (program != 0) { GLES20.glDeleteProgram(program); program = 0; }
293
- int[] texturesToDelete = {dataTextureId, colormapTextureId};
294
- GLES20.glDeleteTextures(2, texturesToDelete, 0);
295
- dataTextureId = 0; colormapTextureId = 0;
296
- int[] buffersToDelete = {vboId, iboId};
297
- GLES20.glDeleteBuffers(2, buffersToDelete, 0);
298
- vboId = 0; iboId = 0;
299
- }
300
-
301
- @Override
302
- public void contextLost() {
303
- program = 0; dataTextureId = 0; colormapTextureId = 0; vboId = 0; iboId = 0;
304
- }
305
-
306
- public void setOpacity(float opacity) { this.opacity = opacity; }
307
- public void setDataRange(float[] dataRange) { this.dataRange = dataRange; }
308
- public void setConversionType(int type) { this.conversionType = type; }
309
- public void setSmoothing(boolean enabled) {
310
- if (this.smoothingEnabled != enabled) {
311
- this.smoothingEnabled = enabled;
312
- this.textureParametersDirty = true;
313
- }
314
- }
315
-
316
- // Add this method to GridRenderLayer.java (around line 270)
317
- public void updateDataParameters(float scale, float offset, float missing) {
318
- synchronized (dataLock) {
319
- this.scale = scale;
320
- this.offset = offset;
321
- this.missingQuantized = missing;
322
- }
323
- }
324
-
325
- // This existing method is now used by both the old JS path and our new native path
326
- public void updateDataTexture(byte[] bytes, int nx, int ny, float scale, float offset, float missing, String scaleType) {
327
- ByteBuffer dataBuffer = ByteBuffer.allocateDirect(bytes.length);
328
- dataBuffer.put(bytes);
329
- dataBuffer.position(0);
330
- synchronized (dataLock) {
331
- this.pendingDataBuffer = dataBuffer;
332
- this.pendingNx = nx;
333
- this.pendingNy = ny;
334
- this.pendingScale = scale;
335
- this.pendingOffset = offset;
336
- this.pendingMissing = missing;
337
- this.pendingScaleType = "sqrt".equals(scaleType) ? 1 : 0;
338
- }
339
- // When new data is provided, ensure the layer is visible
340
- this.isVisible = true;
341
- }
342
-
343
- public void updateColormapTexture(ByteBuffer data) {
344
- synchronized (dataLock) { this.pendingColormapBuffer = data; }
345
- }
346
-
347
- private void generateLCCGeometry(ReadableMap gridDefMap, ArrayList<Float> vertices, ArrayList<Short> indices) {
348
- ReadableMap gridParams = gridDefMap.getMap("grid_params");
349
- ReadableMap projParams = gridDefMap.getMap("proj_params");
350
-
351
- if (gridParams == null || projParams == null) {
352
- Log.e(TAG, "Missing grid or projection parameters for LCC");
353
- return;
354
- }
355
-
356
- int nx = gridParams.getInt("nx");
357
- int ny = gridParams.getInt("ny");
358
- double dx = getDouble(gridParams, "dx", 0);
359
- double dy = getDouble(gridParams, "dy", 0);
360
- double x_origin = getDouble(gridParams, "x_origin", 0);
361
- double y_origin = getDouble(gridParams, "y_origin", 0);
362
-
363
- int subdivisions = 60;
364
- final double TILE_SIZE = 512.0;
365
-
366
- double x_min = x_origin;
367
- double y_max = y_origin;
368
- double x_max = x_origin + (nx - 1) * dx;
369
- double y_min = y_origin + (ny - 1) * dy;
370
-
371
- Object[][] vertexGrid = new Object[subdivisions + 1][subdivisions + 1];
372
- int validVertexCount = 0;
373
-
374
- for (int row = 0; row <= subdivisions; row++) {
375
- for (int col = 0; col <= subdivisions; col++) {
376
- double t_x = (double) col / subdivisions;
377
- double t_y = (double) row / subdivisions;
378
-
379
- double proj_x = x_min + t_x * (x_max - x_min);
380
- double proj_y = y_max + t_y * (y_min - y_max);
381
-
382
- double[] latLon = projectLCCToLatLon(proj_x, proj_y, projParams);
383
-
384
- if (latLon == null) {
385
- vertexGrid[row][col] = null;
386
- continue;
387
- }
388
-
389
- double lon = latLon[0];
390
- double lat = latLon[1];
391
-
392
- double mercX_normalized = (lon + 180.0) / 360.0;
393
- double clampedLat = Math.max(-85.05112878, Math.min(85.05112878, lat));
394
- double sinLatitude = Math.sin(Math.toRadians(clampedLat));
395
- double mercY_normalized = 0.5 - Math.log((1 + sinLatitude) / (1 - sinLatitude)) / (4 * Math.PI);
396
-
397
- double mercX = mercX_normalized * TILE_SIZE;
398
- double mercY = mercY_normalized * TILE_SIZE;
399
-
400
- if (!Double.isFinite(mercX) || !Double.isFinite(mercY)) {
401
- vertexGrid[row][col] = null;
402
- continue;
403
- }
404
-
405
- float tex_u = (float) t_x;
406
- float tex_v = (float) t_y;
407
-
408
- VertexInfo vInfo = new VertexInfo();
409
- vInfo.mercX = (float) mercX;
410
- vInfo.mercY = (float) mercY;
411
- vInfo.texU = tex_u;
412
- vInfo.texV = tex_v;
413
- vInfo.index = (short) validVertexCount;
414
-
415
- vertexGrid[row][col] = vInfo;
416
-
417
- vertices.add((float) mercX);
418
- vertices.add((float) mercY);
419
- vertices.add(tex_u);
420
- vertices.add(tex_v);
421
-
422
- validVertexCount++;
423
- }
424
- }
425
-
426
- if (vertices.isEmpty()) {
427
- Log.e(TAG, "No valid vertices generated for LCC grid");
428
- return;
429
- }
430
-
431
- for (int row = 0; row < subdivisions; row++) {
432
- for (int col = 0; col < subdivisions; col++) {
433
- VertexInfo topLeft = (VertexInfo) vertexGrid[row][col];
434
- VertexInfo topRight = (VertexInfo) vertexGrid[row][col + 1];
435
- VertexInfo bottomLeft = (VertexInfo) vertexGrid[row + 1][col];
436
- VertexInfo bottomRight = (VertexInfo) vertexGrid[row + 1][col + 1];
437
-
438
- if (topLeft != null && topRight != null && bottomLeft != null && bottomRight != null) {
439
- indices.add(topLeft.index);
440
- indices.add(bottomLeft.index);
441
- indices.add(topRight.index);
442
-
443
- indices.add(topRight.index);
444
- indices.add(bottomLeft.index);
445
- indices.add(bottomRight.index);
446
- }
447
- }
448
- }
449
- }
450
-
451
- private static class VertexInfo {
452
- float mercX, mercY, texU, texV;
453
- short index;
454
- }
455
-
456
- private double[] projectLCCToLatLon(double x, double y, ReadableMap projParams) {
457
- // TODO: Implement using proj4j library
458
- Log.w(TAG, "LCC projection conversion not yet implemented - add proj4j library");
459
- return null;
460
- }
461
-
462
- private boolean isLCCType(ReadableMap gridDefMap) {
463
- if (gridDefMap == null) return false;
464
- ReadableMap projParams = gridDefMap.getMap("proj_params");
465
- if (projParams == null) return false;
466
- return projParams.hasKey("proj") && "lcc".equals(projParams.getString("proj"));
467
- }
468
-
469
- public void updateGeometry(ReadableMap cornersMap, ReadableMap gridDefMap) {
470
- if (gridDefMap == null) return;
471
- ArrayList<Float> vertices = new ArrayList<>();
472
- ArrayList<Short> indices = new ArrayList<>();
473
- generateGeometryData(gridDefMap, vertices, indices);
474
- if (vertices.isEmpty() || indices.isEmpty()) {
475
- Log.e(TAG, "Generated geometry is empty, aborting GPU buffer update.");
476
- return;
477
- }
478
- FloatBuffer vb = ByteBuffer.allocateDirect(vertices.size() * 4).order(ByteOrder.nativeOrder()).asFloatBuffer();
479
- float[] vertexArray = new float[vertices.size()];
480
- for (int i = 0; i < vertices.size(); i++) vertexArray[i] = vertices.get(i);
481
- vb.put(vertexArray).position(0);
482
- ShortBuffer ib = ByteBuffer.allocateDirect(indices.size() * 2).order(ByteOrder.nativeOrder()).asShortBuffer();
483
- short[] indexArray = new short[indices.size()];
484
- for (int i = 0; i < indices.size(); i++) indexArray[i] = indices.get(i);
485
- ib.put(indexArray).position(0);
486
- synchronized (dataLock) {
487
- pendingVertexBuffer = vb;
488
- pendingIndexBuffer = ib;
489
- }
490
- }
491
-
492
- private boolean isGFSType(ReadableMap gridParams) {
493
- if (gridParams == null) return false;
494
- return getDouble(gridParams, "lon_first", -1) == 0.0 &&
495
- Math.abs(getDouble(gridParams, "lat_first", -1)) == 90.0;
496
- }
497
-
498
- private void generateGeometryData(ReadableMap gridDefMap, ArrayList<Float> vertices, ArrayList<Short> indices) {
499
- ReadableMap gridParams = gridDefMap.getMap("grid_params");
500
- if (gridParams == null) {
501
- Log.e(TAG, "❌ [Geometry] grid_params is null. Aborting mesh generation.");
502
- return;
503
- }
504
-
505
- // --- Path 1: Specialized GFS Global Grid Logic (Working Correctly) ---
506
- if (isGFSType(gridParams)) {
507
- // This proven logic remains unchanged.
508
- int subdivisions = 120;
509
- int verticesPerRow = (subdivisions * 3) + 1;
510
- final double TILE_SIZE = 512.0;
511
- for (int row = 0; row <= subdivisions; row++) {
512
- for (int col = 0; col <= subdivisions * 3; col++) {
513
- float v_interp = (float) row / subdivisions;
514
- float u_interp = (float) col / subdivisions;
515
- double lon = -540.0 + u_interp * 1080.0;
516
- double lat = -90.0 + v_interp * 180.0;
517
- double mercX_normalized = (lon + 180.0) / 360.0;
518
- double clampedLat = Math.max(-85.05112878, Math.min(85.05112878, lat));
519
- double sinLatitude = Math.sin(Math.toRadians(clampedLat));
520
- double mercY_normalized = 0.5 - Math.log((1 + sinLatitude) / (1 - sinLatitude)) / (4 * Math.PI);
521
- double mercX = mercX_normalized * TILE_SIZE;
522
- double mercY = mercY_normalized * TILE_SIZE;
523
- vertices.add((float) mercX);
524
- vertices.add((float) mercY);
525
- float tex_u = (float) ((lon + 180.0) / 360.0);
526
- float tex_v = 1.0f - v_interp;
527
- vertices.add(tex_u);
528
- vertices.add(tex_v);
529
- }
530
- }
531
- for (short row = 0; row < subdivisions; row++) {
532
- for (short col = 0; col < subdivisions * 3; col++) {
533
- short tl = (short) (row * verticesPerRow + col);
534
- short tr = (short) (tl + 1);
535
- short bl = (short) ((row + 1) * verticesPerRow + col);
536
- short br = (short) (bl + 1);
537
- indices.add(tl); indices.add(bl); indices.add(tr);
538
- indices.add(tr); indices.add(bl); indices.add(br);
539
- }
540
- }
541
- return;
542
- }
543
-
544
- // --- Path 2: LCC Grid Logic ---
545
- if (isLCCType(gridDefMap)) {
546
- generateLCCGeometry(gridDefMap, vertices, indices);
547
- return;
548
- }
549
-
550
- // Step 1: Extract grid parameters
551
- int nx = gridParams.getInt("nx");
552
- int ny = gridParams.getInt("ny");
553
- double lon_first = getDouble(gridParams, "lon_first", 0.0);
554
- double lat_first = getDouble(gridParams, "lat_first", 90.0);
555
- double dx = getDouble(gridParams, "dx_degrees", 0.0);
556
- double dy = getDouble(gridParams, "dy_degrees", 0.0);
557
- double lon_last = getDouble(gridParams, "lon_last", lon_first + (nx - 1) * dx);
558
- double lat_last = getDouble(gridParams, "lat_last", lat_first + (ny - 1) * dy);
559
- double lat_span = lat_last - lat_first;
560
- boolean isSouthToNorth = lat_span > 0;
561
-
562
- // Step 2: Normalize data longitudes to the -180 to +180 range for consistent placement.
563
- double data_lon_first_180 = lon_first > 180 ? lon_first - 360 : lon_first;
564
- double data_lon_last_180 = lon_last > 180 ? lon_last - 360 : lon_last;
565
- double data_lon_range = data_lon_last_180 - data_lon_first_180;
566
-
567
- // Step 3: Define mesh properties
568
- int subdivisions_x = 120; // Subdivisions for a single mesh instance
569
- int subdivisions_y = 60;
570
- int verticesPerMesh = (subdivisions_y + 1) * (subdivisions_x + 1);
571
- int verticesPerRow = subdivisions_x + 1;
572
- final double TILE_SIZE = 512.0;
573
-
574
- // Step 4: Generate three separate, non-connected meshes to prevent seam artifacts
575
- for (int world_copy = -1; world_copy <= 1; world_copy++) {
576
- short vertexStartIndex = (short) (vertices.size() / 4); // 4 floats per vertex (x,y,u,v)
577
- double lon_offset = world_copy * 360.0;
578
-
579
- // Generate vertices for this specific world copy
580
- for (int row = 0; row <= subdivisions_y; row++) {
581
- for (int col = 0; col <= subdivisions_x; col++) {
582
- float v_interp = (float) row / subdivisions_y;
583
- float u_interp = (float) col / subdivisions_x;
584
-
585
- // Vertex position is interpolated across the data's native bounds, then offset for the world copy
586
- double vertex_lon = data_lon_first_180 + (u_interp * data_lon_range);
587
- double vertex_lat = lat_first + (v_interp * lat_span);
588
-
589
- // Convert to map coordinates, adding the world copy offset
590
- double mercX_normalized = ((vertex_lon + lon_offset) + 180.0) / 360.0;
591
- double clampedLat = Math.max(-85.05112878, Math.min(85.05112878, vertex_lat));
592
- double sinLatitude = Math.sin(Math.toRadians(clampedLat));
593
- double mercY_normalized = 0.5 - Math.log((1 + sinLatitude) / (1 - sinLatitude)) / (4 * Math.PI);
594
- double mercX = mercX_normalized * TILE_SIZE;
595
- double mercY = mercY_normalized * TILE_SIZE;
596
-
597
- vertices.add((float) mercX);
598
- vertices.add((float) mercY);
599
-
600
- // Texture coordinates are always a clean 0.0 to 1.0 for each mesh instance
601
- float tex_u = u_interp;
602
- float tex_v = isSouthToNorth ? (1.0f - v_interp) : v_interp;
603
-
604
- vertices.add(tex_u);
605
- vertices.add(tex_v);
606
- }
607
- }
608
-
609
- // Generate indices for this specific world copy, offsetting by the starting index
610
- for (short row = 0; row < subdivisions_y; row++) {
611
- for (short col = 0; col < subdivisions_x; col++) {
612
- short tl = (short) (vertexStartIndex + row * verticesPerRow + col);
613
- short tr = (short) (tl + 1);
614
- short bl = (short) (vertexStartIndex + (row + 1) * verticesPerRow + col);
615
- short br = (short) (bl + 1);
616
-
617
- if (isSouthToNorth) {
618
- indices.add(tl); indices.add(bl); indices.add(tr);
619
- indices.add(tr); indices.add(bl); indices.add(br);
620
- } else { // North-to-South (MRMS)
621
- indices.add(tl); indices.add(tr); indices.add(bl);
622
- indices.add(bl); indices.add(tr); indices.add(br);
623
- }
624
- }
625
- }
626
- }
627
- }
1
+ // packages/react-native/android/src/main/java/com/aguacerowx/reactnative/GridRenderLayer.java
2
+
3
+ package com.aguacerowx.reactnative;
4
+
5
+ import android.content.Context;
6
+ import android.opengl.GLES20;
7
+ import android.util.Log;
8
+
9
+ import com.facebook.react.bridge.ReadableArray;
10
+ import com.facebook.react.bridge.ReadableMap;
11
+ import com.mapbox.maps.CustomLayerHost;
12
+ import com.mapbox.maps.CustomLayerRenderParameters;
13
+
14
+ import java.io.InputStream;
15
+ import java.nio.ByteBuffer;
16
+ import java.nio.ByteOrder;
17
+ import java.nio.FloatBuffer;
18
+ import java.nio.ShortBuffer;
19
+ import java.util.ArrayList;
20
+ import java.util.List;
21
+ import java.util.Scanner;
22
+
23
+ import java.io.File;
24
+ import java.io.FileInputStream;
25
+ import java.io.IOException;
26
+ import com.github.luben.zstd.Zstd;
27
+
28
+ public class GridRenderLayer implements CustomLayerHost {
29
+ private final Context context;
30
+ private final String TAG = "AguaceroWX";
31
+ private int program;
32
+
33
+ // Uniform and Attribute locations
34
+ private int uMatrix, uDataTexture, uColormapTexture, uOpacity, uDataRange,
35
+ uScale, uOffset, uMissingQuantized, uTextureSize, uConversionType, uSmoothing,
36
+ uScaleType, uIsPtype;
37
+ private int aPosition, aTexCoord;
38
+
39
+ // GPU-side resource IDs
40
+ private int dataTextureId = 0;
41
+ private int colormapTextureId = 0;
42
+ private int vboId = 0;
43
+ private int iboId = 0;
44
+ private int indexCount = 0;
45
+
46
+ // Layer properties
47
+ private float opacity = 1.0f;
48
+ private float[] dataRange = new float[]{0.0f, 1.0f};
49
+ private float scale = 1.0f;
50
+ private float offset = 0.0f;
51
+ private float missingQuantized = 127.0f;
52
+ private int textureWidth = 0;
53
+ private int textureHeight = 0;
54
+ private int conversionType = 0;
55
+ private boolean smoothingEnabled = true;
56
+ private int scaleType = 0;
57
+ private boolean isPtype = false; // ADDED
58
+ private String currentVariable = "";
59
+ private boolean textureParametersDirty = true;
60
+ private volatile boolean isVisible = true;
61
+
62
+ // Pending data buffers for thread-safe uploads
63
+ private final Object dataLock = new Object();
64
+ private ByteBuffer pendingDataBuffer = null;
65
+ private int pendingNx = 0, pendingNy = 0;
66
+ private float pendingScale = 1.0f, pendingOffset = 0.0f, pendingMissing = 127.0f;
67
+ private int pendingScaleType = 0;
68
+ private ByteBuffer pendingColormapBuffer = null;
69
+ private FloatBuffer pendingVertexBuffer = null;
70
+ private ShortBuffer pendingIndexBuffer = null;
71
+
72
+
73
+ public GridRenderLayer(Context context) {
74
+ this.context = context;
75
+ }
76
+
77
+ private double getDouble(ReadableMap map, String key, double defaultValue) {
78
+ return map.hasKey(key) ? map.getDouble(key) : defaultValue;
79
+ }
80
+
81
+ private String loadShaderSource(int resourceId) {
82
+ InputStream inputStream = context.getResources().openRawResource(resourceId);
83
+ return new Scanner(inputStream).useDelimiter("\\A").next();
84
+ }
85
+
86
+ private int createShader(int type, String source) {
87
+ int shader = GLES20.glCreateShader(type);
88
+ if (shader == 0) return 0;
89
+ GLES20.glShaderSource(shader, source);
90
+ GLES20.glCompileShader(shader);
91
+ final int[] compileStatus = new int[1];
92
+ GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compileStatus, 0);
93
+ if (compileStatus[0] == 0) {
94
+ Log.e(TAG, "Error compiling shader: " + GLES20.glGetShaderInfoLog(shader));
95
+ GLES20.glDeleteShader(shader);
96
+ return 0;
97
+ }
98
+ return shader;
99
+ }
100
+
101
+ @Override
102
+ public void initialize() {
103
+ String vertexSource = loadShaderSource(R.raw.vertex_shader);
104
+ String fragmentSource = loadShaderSource(R.raw.fragment_shader);
105
+ int vertexShader = createShader(GLES20.GL_VERTEX_SHADER, vertexSource);
106
+ int fragmentShader = createShader(GLES20.GL_FRAGMENT_SHADER, fragmentSource);
107
+
108
+ program = GLES20.glCreateProgram();
109
+ GLES20.glAttachShader(program, vertexShader);
110
+ GLES20.glAttachShader(program, fragmentShader);
111
+ GLES20.glLinkProgram(program);
112
+
113
+ uMatrix = GLES20.glGetUniformLocation(program, "u_matrix");
114
+ uDataTexture = GLES20.glGetUniformLocation(program, "u_data_texture");
115
+ uColormapTexture = GLES20.glGetUniformLocation(program, "u_colormap_texture");
116
+ uOpacity = GLES20.glGetUniformLocation(program, "u_opacity");
117
+ uDataRange = GLES20.glGetUniformLocation(program, "u_data_range");
118
+ uScale = GLES20.glGetUniformLocation(program, "u_scale");
119
+ uOffset = GLES20.glGetUniformLocation(program, "u_offset");
120
+ uMissingQuantized = GLES20.glGetUniformLocation(program, "u_missing_quantized");
121
+ uTextureSize = GLES20.glGetUniformLocation(program, "u_texture_size");
122
+ uConversionType = GLES20.glGetUniformLocation(program, "u_conversion_type");
123
+ uSmoothing = GLES20.glGetUniformLocation(program, "u_smoothing");
124
+ uScaleType = GLES20.glGetUniformLocation(program, "u_scale_type");
125
+ uIsPtype = GLES20.glGetUniformLocation(program, "u_is_ptype");
126
+ aPosition = GLES20.glGetAttribLocation(program, "a_position");
127
+ aTexCoord = GLES20.glGetAttribLocation(program, "a_texCoord");
128
+ }
129
+
130
+ public void setVariable(String variable) {
131
+ if (variable == null) {
132
+ this.currentVariable = "";
133
+ } else {
134
+ this.currentVariable = variable;
135
+ }
136
+ // MODIFICATION: Add detailed logging here
137
+ this.isPtype = "ptypeRefl".equals(this.currentVariable) || "ptypeRate".equals(this.currentVariable);
138
+ Log.d(TAG, "setVariable called. Variable: '" + this.currentVariable + "', isPtype set to: " + this.isPtype);
139
+ }
140
+
141
+
142
+ public void clearData() {
143
+ this.isVisible = false;
144
+ // Also clear any pending data to prevent a stale frame from rendering
145
+ synchronized (dataLock) {
146
+ pendingDataBuffer = null;
147
+ }
148
+ }
149
+
150
+ @Override
151
+ public void render(CustomLayerRenderParameters renderParameters) {
152
+ if (program == 0 || !isVisible) return;
153
+
154
+ synchronized (dataLock) {
155
+ if (pendingVertexBuffer != null && pendingIndexBuffer != null) {
156
+ this.indexCount = pendingIndexBuffer.capacity();
157
+ if (vboId == 0) {
158
+ int[] bufs = new int[2];
159
+ GLES20.glGenBuffers(2, bufs, 0);
160
+ vboId = bufs[0];
161
+ iboId = bufs[1];
162
+ }
163
+ GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vboId);
164
+ GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, pendingVertexBuffer.capacity() * 4, pendingVertexBuffer, GLES20.GL_STATIC_DRAW);
165
+ GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, iboId);
166
+ GLES20.glBufferData(GLES20.GL_ELEMENT_ARRAY_BUFFER, pendingIndexBuffer.capacity() * 2, pendingIndexBuffer, GLES20.GL_STATIC_DRAW);
167
+ pendingVertexBuffer = null;
168
+ pendingIndexBuffer = null;
169
+ }
170
+
171
+ if (pendingDataBuffer != null) {
172
+ // --- FIX 2: LOGICAL FIX FOR TEXTURE RESIZING ---
173
+ boolean dimensionsChanged = (pendingNx != this.textureWidth || pendingNy != this.textureHeight);
174
+
175
+ this.textureWidth = pendingNx;
176
+ this.textureHeight = pendingNy;
177
+ this.scale = pendingScale;
178
+ this.offset = pendingOffset;
179
+ this.missingQuantized = pendingMissing;
180
+ this.scaleType = pendingScaleType;
181
+
182
+ if (dataTextureId == 0) {
183
+ int[] t = new int[1];
184
+ GLES20.glGenTextures(1, t, 0);
185
+ dataTextureId = t[0];
186
+ }
187
+
188
+ GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, dataTextureId);
189
+
190
+ if (dimensionsChanged || dataTextureId == 0) {
191
+ int filter = smoothingEnabled ? GLES20.GL_LINEAR : GLES20.GL_NEAREST;
192
+ GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, filter);
193
+ GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, filter);
194
+
195
+ GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
196
+
197
+ GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
198
+ GLES20.glPixelStorei(GLES20.GL_UNPACK_ALIGNMENT, 1);
199
+
200
+ pendingDataBuffer.position(0);
201
+ GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_ALPHA, pendingNx, pendingNy, 0, GLES20.GL_ALPHA, GLES20.GL_UNSIGNED_BYTE, pendingDataBuffer);
202
+ } else {
203
+ // Texture dimensions are the same, so just update its contents efficiently
204
+ pendingDataBuffer.position(0);
205
+ GLES20.glTexSubImage2D(GLES20.GL_TEXTURE_2D, 0, 0, 0, pendingNx, pendingNy, GLES20.GL_ALPHA, GLES20.GL_UNSIGNED_BYTE, pendingDataBuffer);
206
+ }
207
+ pendingDataBuffer = null;
208
+ }
209
+
210
+ if (pendingColormapBuffer != null) {
211
+ if (colormapTextureId == 0) {
212
+ int[] t = new int[1];
213
+ GLES20.glGenTextures(1, t, 0);
214
+ colormapTextureId = t[0];
215
+ }
216
+ GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, colormapTextureId);
217
+ GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);
218
+ GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST);
219
+ GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
220
+ pendingColormapBuffer.position(0);
221
+ GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, 256, 1, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, pendingColormapBuffer);
222
+ pendingColormapBuffer = null;
223
+ }
224
+ }
225
+
226
+ double zoom = renderParameters.getZoom();
227
+
228
+ if (vboId == 0 || iboId == 0 || indexCount == 0 || dataTextureId == 0 || colormapTextureId == 0) return;
229
+
230
+ if (textureParametersDirty) {
231
+ GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, dataTextureId);
232
+ int filter = smoothingEnabled ? GLES20.GL_LINEAR : GLES20.GL_NEAREST;
233
+ GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, filter);
234
+ GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, filter);
235
+ textureParametersDirty = false;
236
+ }
237
+
238
+ GLES20.glUseProgram(program);
239
+
240
+ double scale = Math.pow(2.0, zoom);
241
+
242
+ List<Double> matrix = renderParameters.getProjectionMatrix();
243
+ float[] floatMatrix = new float[16];
244
+ for (int i = 0; i < 16; i++) {
245
+ floatMatrix[i] = matrix.get(i).floatValue();
246
+ }
247
+
248
+ floatMatrix[0] *= scale;
249
+ floatMatrix[1] *= scale;
250
+ floatMatrix[4] *= scale;
251
+ floatMatrix[5] *= scale;
252
+
253
+ GLES20.glUniformMatrix4fv(uMatrix, 1, false, floatMatrix, 0);
254
+ GLES20.glUniform1f(uOpacity, opacity);
255
+ GLES20.glUniform2fv(uDataRange, 1, dataRange, 0);
256
+ GLES20.glUniform1f(uScale, this.scale);
257
+ GLES20.glUniform1f(uOffset, offset);
258
+ GLES20.glUniform1f(uMissingQuantized, missingQuantized);
259
+ GLES20.glUniform2f(uTextureSize, (float) textureWidth, (float) textureHeight);
260
+ GLES20.glUniform1i(uConversionType, conversionType);
261
+ GLES20.glUniform1i(uSmoothing, smoothingEnabled ? 1 : 0);
262
+ GLES20.glUniform1i(uScaleType, this.scaleType);
263
+ GLES20.glUniform1i(uIsPtype, this.isPtype ? 1 : 0);
264
+
265
+ GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
266
+ GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, dataTextureId);
267
+ GLES20.glUniform1i(uDataTexture, 0);
268
+
269
+ GLES20.glActiveTexture(GLES20.GL_TEXTURE1);
270
+ GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, colormapTextureId);
271
+ GLES20.glUniform1i(uColormapTexture, 1);
272
+
273
+ GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vboId);
274
+ GLES20.glEnableVertexAttribArray(aPosition);
275
+ GLES20.glVertexAttribPointer(aPosition, 2, GLES20.GL_FLOAT, false, 16, 0);
276
+ GLES20.glEnableVertexAttribArray(aTexCoord);
277
+ GLES20.glVertexAttribPointer(aTexCoord, 2, GLES20.GL_FLOAT, false, 16, 8);
278
+ GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, iboId);
279
+
280
+ GLES20.glEnable(GLES20.GL_BLEND);
281
+ GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA);
282
+ GLES20.glDisable(GLES20.GL_DEPTH_TEST);
283
+
284
+ GLES20.glDrawElements(GLES20.GL_TRIANGLES, indexCount, GLES20.GL_UNSIGNED_SHORT, 0);
285
+
286
+ GLES20.glDisableVertexAttribArray(aPosition);
287
+ GLES20.glDisableVertexAttribArray(aTexCoord);
288
+ GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
289
+ GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, 0);
290
+ }
291
+
292
+ @Override
293
+ public void deinitialize() {
294
+ if (program != 0) { GLES20.glDeleteProgram(program); program = 0; }
295
+ int[] texturesToDelete = {dataTextureId, colormapTextureId};
296
+ GLES20.glDeleteTextures(2, texturesToDelete, 0);
297
+ dataTextureId = 0; colormapTextureId = 0;
298
+ int[] buffersToDelete = {vboId, iboId};
299
+ GLES20.glDeleteBuffers(2, buffersToDelete, 0);
300
+ vboId = 0; iboId = 0;
301
+ }
302
+
303
+ @Override
304
+ public void contextLost() {
305
+ program = 0; dataTextureId = 0; colormapTextureId = 0; vboId = 0; iboId = 0;
306
+ }
307
+
308
+ public void setOpacity(float opacity) { this.opacity = opacity; }
309
+ public void setDataRange(float[] dataRange) { this.dataRange = dataRange; }
310
+ public void setConversionType(int type) { this.conversionType = type; }
311
+ public void setSmoothing(boolean enabled) {
312
+ if (this.smoothingEnabled != enabled) {
313
+ this.smoothingEnabled = enabled;
314
+ this.textureParametersDirty = true;
315
+ }
316
+ }
317
+
318
+ // Add this method to GridRenderLayer.java (around line 270)
319
+ public void updateDataParameters(float scale, float offset, float missing) {
320
+ synchronized (dataLock) {
321
+ this.scale = scale;
322
+ this.offset = offset;
323
+ this.missingQuantized = missing;
324
+ }
325
+ }
326
+
327
+ // This existing method is now used by both the old JS path and our new native path
328
+ public void updateDataTexture(byte[] bytes, int nx, int ny, float scale, float offset, float missing, String scaleType) {
329
+ ByteBuffer dataBuffer = ByteBuffer.allocateDirect(bytes.length);
330
+ dataBuffer.put(bytes);
331
+ dataBuffer.position(0);
332
+ synchronized (dataLock) {
333
+ this.pendingDataBuffer = dataBuffer;
334
+ this.pendingNx = nx;
335
+ this.pendingNy = ny;
336
+ this.pendingScale = scale;
337
+ this.pendingOffset = offset;
338
+ this.pendingMissing = missing;
339
+ this.pendingScaleType = "sqrt".equals(scaleType) ? 1 : 0;
340
+ }
341
+ // When new data is provided, ensure the layer is visible
342
+ this.isVisible = true;
343
+ }
344
+
345
+ public void updateColormapTexture(ByteBuffer data) {
346
+ synchronized (dataLock) { this.pendingColormapBuffer = data; }
347
+ }
348
+
349
+ private void generateLCCGeometry(ReadableMap gridDefMap, ArrayList<Float> vertices, ArrayList<Short> indices) {
350
+ ReadableMap gridParams = gridDefMap.getMap("grid_params");
351
+ ReadableMap projParams = gridDefMap.getMap("proj_params");
352
+
353
+ if (gridParams == null || projParams == null) {
354
+ Log.e(TAG, "Missing grid or projection parameters for LCC");
355
+ return;
356
+ }
357
+
358
+ int nx = gridParams.getInt("nx");
359
+ int ny = gridParams.getInt("ny");
360
+ double dx = getDouble(gridParams, "dx", 0);
361
+ double dy = getDouble(gridParams, "dy", 0);
362
+ double x_origin = getDouble(gridParams, "x_origin", 0);
363
+ double y_origin = getDouble(gridParams, "y_origin", 0);
364
+
365
+ int subdivisions = 60;
366
+ final double TILE_SIZE = 512.0;
367
+
368
+ double x_min = x_origin;
369
+ double y_max = y_origin;
370
+ double x_max = x_origin + (nx - 1) * dx;
371
+ double y_min = y_origin + (ny - 1) * dy;
372
+
373
+ Object[][] vertexGrid = new Object[subdivisions + 1][subdivisions + 1];
374
+ int validVertexCount = 0;
375
+
376
+ for (int row = 0; row <= subdivisions; row++) {
377
+ for (int col = 0; col <= subdivisions; col++) {
378
+ double t_x = (double) col / subdivisions;
379
+ double t_y = (double) row / subdivisions;
380
+
381
+ double proj_x = x_min + t_x * (x_max - x_min);
382
+ double proj_y = y_max + t_y * (y_min - y_max);
383
+
384
+ double[] latLon = projectLCCToLatLon(proj_x, proj_y, projParams);
385
+
386
+ if (latLon == null) {
387
+ vertexGrid[row][col] = null;
388
+ continue;
389
+ }
390
+
391
+ double lon = latLon[0];
392
+ double lat = latLon[1];
393
+
394
+ double mercX_normalized = (lon + 180.0) / 360.0;
395
+ double clampedLat = Math.max(-85.05112878, Math.min(85.05112878, lat));
396
+ double sinLatitude = Math.sin(Math.toRadians(clampedLat));
397
+ double mercY_normalized = 0.5 - Math.log((1 + sinLatitude) / (1 - sinLatitude)) / (4 * Math.PI);
398
+
399
+ double mercX = mercX_normalized * TILE_SIZE;
400
+ double mercY = mercY_normalized * TILE_SIZE;
401
+
402
+ if (!Double.isFinite(mercX) || !Double.isFinite(mercY)) {
403
+ vertexGrid[row][col] = null;
404
+ continue;
405
+ }
406
+
407
+ float tex_u = (float) t_x;
408
+ float tex_v = (float) t_y;
409
+
410
+ VertexInfo vInfo = new VertexInfo();
411
+ vInfo.mercX = (float) mercX;
412
+ vInfo.mercY = (float) mercY;
413
+ vInfo.texU = tex_u;
414
+ vInfo.texV = tex_v;
415
+ vInfo.index = (short) validVertexCount;
416
+
417
+ vertexGrid[row][col] = vInfo;
418
+
419
+ vertices.add((float) mercX);
420
+ vertices.add((float) mercY);
421
+ vertices.add(tex_u);
422
+ vertices.add(tex_v);
423
+
424
+ validVertexCount++;
425
+ }
426
+ }
427
+
428
+ if (vertices.isEmpty()) {
429
+ Log.e(TAG, "No valid vertices generated for LCC grid");
430
+ return;
431
+ }
432
+
433
+ for (int row = 0; row < subdivisions; row++) {
434
+ for (int col = 0; col < subdivisions; col++) {
435
+ VertexInfo topLeft = (VertexInfo) vertexGrid[row][col];
436
+ VertexInfo topRight = (VertexInfo) vertexGrid[row][col + 1];
437
+ VertexInfo bottomLeft = (VertexInfo) vertexGrid[row + 1][col];
438
+ VertexInfo bottomRight = (VertexInfo) vertexGrid[row + 1][col + 1];
439
+
440
+ if (topLeft != null && topRight != null && bottomLeft != null && bottomRight != null) {
441
+ indices.add(topLeft.index);
442
+ indices.add(bottomLeft.index);
443
+ indices.add(topRight.index);
444
+
445
+ indices.add(topRight.index);
446
+ indices.add(bottomLeft.index);
447
+ indices.add(bottomRight.index);
448
+ }
449
+ }
450
+ }
451
+ }
452
+
453
+ private static class VertexInfo {
454
+ float mercX, mercY, texU, texV;
455
+ short index;
456
+ }
457
+
458
+ private double[] projectLCCToLatLon(double x, double y, ReadableMap projParams) {
459
+ try {
460
+ StringBuilder projString = new StringBuilder("+proj=lcc");
461
+
462
+ if (projParams.hasKey("lat_1")) projString.append(" +lat_1=").append(projParams.getDouble("lat_1"));
463
+ if (projParams.hasKey("lat_2")) projString.append(" +lat_2=").append(projParams.getDouble("lat_2"));
464
+ if (projParams.hasKey("lat_0")) projString.append(" +lat_0=").append(projParams.getDouble("lat_0"));
465
+ if (projParams.hasKey("lon_0")) projString.append(" +lon_0=").append(projParams.getDouble("lon_0"));
466
+ if (projParams.hasKey("x_0")) projString.append(" +x_0=").append(projParams.getDouble("x_0"));
467
+ if (projParams.hasKey("y_0")) projString.append(" +y_0=").append(projParams.getDouble("y_0"));
468
+ if (projParams.hasKey("ellps")) projString.append(" +ellps=").append(projParams.getString("ellps"));
469
+ if (projParams.hasKey("a")) projString.append(" +a=").append(projParams.getDouble("a"));
470
+ if (projParams.hasKey("b")) projString.append(" +b=").append(projParams.getDouble("b"));
471
+ projString.append(" +units=m +no_defs");
472
+
473
+ org.locationtech.proj4j.CRSFactory crsFactory = new org.locationtech.proj4j.CRSFactory();
474
+ org.locationtech.proj4j.CoordinateReferenceSystem srcCRS = crsFactory.createFromParameters("LCC", projString.toString());
475
+ org.locationtech.proj4j.CoordinateReferenceSystem dstCRS = crsFactory.createFromParameters("WGS84", "+proj=longlat +datum=WGS84 +no_defs");
476
+
477
+ org.locationtech.proj4j.CoordinateTransformFactory ctFactory = new org.locationtech.proj4j.CoordinateTransformFactory();
478
+ org.locationtech.proj4j.CoordinateTransform transform = ctFactory.createTransform(srcCRS, dstCRS);
479
+
480
+ org.locationtech.proj4j.ProjCoordinate srcCoord = new org.locationtech.proj4j.ProjCoordinate(x, y);
481
+ org.locationtech.proj4j.ProjCoordinate dstCoord = new org.locationtech.proj4j.ProjCoordinate();
482
+ transform.transform(srcCoord, dstCoord);
483
+
484
+ return new double[]{dstCoord.x, dstCoord.y};
485
+
486
+ } catch (Exception e) {
487
+ Log.e(TAG, "Error in LCC projection: " + e.getMessage());
488
+ return null;
489
+ }
490
+ }
491
+
492
+ private boolean isLCCType(ReadableMap gridDefMap) {
493
+ if (gridDefMap == null) return false;
494
+ ReadableMap projParams = gridDefMap.getMap("proj_params");
495
+ if (projParams == null) return false;
496
+ return projParams.hasKey("proj") && "lcc".equals(projParams.getString("proj"));
497
+ }
498
+
499
+ public void updateGeometry(ReadableMap cornersMap, ReadableMap gridDefMap) {
500
+ if (gridDefMap == null) return;
501
+ ArrayList<Float> vertices = new ArrayList<>();
502
+ ArrayList<Short> indices = new ArrayList<>();
503
+ generateGeometryData(gridDefMap, vertices, indices);
504
+ if (vertices.isEmpty() || indices.isEmpty()) {
505
+ Log.e(TAG, "Generated geometry is empty, aborting GPU buffer update.");
506
+ return;
507
+ }
508
+ FloatBuffer vb = ByteBuffer.allocateDirect(vertices.size() * 4).order(ByteOrder.nativeOrder()).asFloatBuffer();
509
+ float[] vertexArray = new float[vertices.size()];
510
+ for (int i = 0; i < vertices.size(); i++) vertexArray[i] = vertices.get(i);
511
+ vb.put(vertexArray).position(0);
512
+ ShortBuffer ib = ByteBuffer.allocateDirect(indices.size() * 2).order(ByteOrder.nativeOrder()).asShortBuffer();
513
+ short[] indexArray = new short[indices.size()];
514
+ for (int i = 0; i < indices.size(); i++) indexArray[i] = indices.get(i);
515
+ ib.put(indexArray).position(0);
516
+ synchronized (dataLock) {
517
+ pendingVertexBuffer = vb;
518
+ pendingIndexBuffer = ib;
519
+ }
520
+ }
521
+
522
+ private boolean isGFSType(ReadableMap gridParams) {
523
+ if (gridParams == null) return false;
524
+ return getDouble(gridParams, "lon_first", -1) == 0.0 &&
525
+ Math.abs(getDouble(gridParams, "lat_first", -1)) == 90.0;
526
+ }
527
+
528
+ private void generateGeometryData(ReadableMap gridDefMap, ArrayList<Float> vertices, ArrayList<Short> indices) {
529
+ ReadableMap gridParams = gridDefMap.getMap("grid_params");
530
+ if (gridParams == null) {
531
+ Log.e(TAG, "❌ [Geometry] grid_params is null. Aborting mesh generation.");
532
+ return;
533
+ }
534
+
535
+ // --- Path 1: Specialized GFS Global Grid Logic (Working Correctly) ---
536
+ if (isGFSType(gridParams)) {
537
+ // This proven logic remains unchanged.
538
+ int subdivisions = 120;
539
+ int verticesPerRow = (subdivisions * 3) + 1;
540
+ final double TILE_SIZE = 512.0;
541
+ for (int row = 0; row <= subdivisions; row++) {
542
+ for (int col = 0; col <= subdivisions * 3; col++) {
543
+ float v_interp = (float) row / subdivisions;
544
+ float u_interp = (float) col / subdivisions;
545
+ double lon = -540.0 + u_interp * 1080.0;
546
+ double lat = -90.0 + v_interp * 180.0;
547
+ double mercX_normalized = (lon + 180.0) / 360.0;
548
+ double clampedLat = Math.max(-85.05112878, Math.min(85.05112878, lat));
549
+ double sinLatitude = Math.sin(Math.toRadians(clampedLat));
550
+ double mercY_normalized = 0.5 - Math.log((1 + sinLatitude) / (1 - sinLatitude)) / (4 * Math.PI);
551
+ double mercX = mercX_normalized * TILE_SIZE;
552
+ double mercY = mercY_normalized * TILE_SIZE;
553
+ vertices.add((float) mercX);
554
+ vertices.add((float) mercY);
555
+ float tex_u = (float) ((lon + 180.0) / 360.0);
556
+ float tex_v = 1.0f - v_interp;
557
+ vertices.add(tex_u);
558
+ vertices.add(tex_v);
559
+ }
560
+ }
561
+ for (short row = 0; row < subdivisions; row++) {
562
+ for (short col = 0; col < subdivisions * 3; col++) {
563
+ short tl = (short) (row * verticesPerRow + col);
564
+ short tr = (short) (tl + 1);
565
+ short bl = (short) ((row + 1) * verticesPerRow + col);
566
+ short br = (short) (bl + 1);
567
+ indices.add(tl); indices.add(bl); indices.add(tr);
568
+ indices.add(tr); indices.add(bl); indices.add(br);
569
+ }
570
+ }
571
+ return;
572
+ }
573
+
574
+ // --- Path 2: LCC Grid Logic ---
575
+ if (isLCCType(gridDefMap)) {
576
+ generateLCCGeometry(gridDefMap, vertices, indices);
577
+ return;
578
+ }
579
+
580
+ // Step 1: Extract grid parameters
581
+ int nx = gridParams.getInt("nx");
582
+ int ny = gridParams.getInt("ny");
583
+ double lon_first = getDouble(gridParams, "lon_first", 0.0);
584
+ double lat_first = getDouble(gridParams, "lat_first", 90.0);
585
+ double dx = getDouble(gridParams, "dx_degrees", 0.0);
586
+ double dy = getDouble(gridParams, "dy_degrees", 0.0);
587
+ double lon_last = getDouble(gridParams, "lon_last", lon_first + (nx - 1) * dx);
588
+ double lat_last = getDouble(gridParams, "lat_last", lat_first + (ny - 1) * dy);
589
+ double lat_span = lat_last - lat_first;
590
+ boolean isSouthToNorth = lat_span > 0;
591
+
592
+ // Step 2: Normalize data longitudes to the -180 to +180 range for consistent placement.
593
+ double data_lon_first_180 = lon_first > 180 ? lon_first - 360 : lon_first;
594
+ double data_lon_last_180 = lon_last > 180 ? lon_last - 360 : lon_last;
595
+ double data_lon_range = data_lon_last_180 - data_lon_first_180;
596
+
597
+ // Step 3: Define mesh properties
598
+ int subdivisions_x = 120; // Subdivisions for a single mesh instance
599
+ int subdivisions_y = 60;
600
+ int verticesPerMesh = (subdivisions_y + 1) * (subdivisions_x + 1);
601
+ int verticesPerRow = subdivisions_x + 1;
602
+ final double TILE_SIZE = 512.0;
603
+
604
+ // Step 4: Generate three separate, non-connected meshes to prevent seam artifacts
605
+ for (int world_copy = -1; world_copy <= 1; world_copy++) {
606
+ short vertexStartIndex = (short) (vertices.size() / 4); // 4 floats per vertex (x,y,u,v)
607
+ double lon_offset = world_copy * 360.0;
608
+
609
+ // Generate vertices for this specific world copy
610
+ for (int row = 0; row <= subdivisions_y; row++) {
611
+ for (int col = 0; col <= subdivisions_x; col++) {
612
+ float v_interp = (float) row / subdivisions_y;
613
+ float u_interp = (float) col / subdivisions_x;
614
+
615
+ // Vertex position is interpolated across the data's native bounds, then offset for the world copy
616
+ double vertex_lon = data_lon_first_180 + (u_interp * data_lon_range);
617
+ double vertex_lat = lat_first + (v_interp * lat_span);
618
+
619
+ // Convert to map coordinates, adding the world copy offset
620
+ double mercX_normalized = ((vertex_lon + lon_offset) + 180.0) / 360.0;
621
+ double clampedLat = Math.max(-85.05112878, Math.min(85.05112878, vertex_lat));
622
+ double sinLatitude = Math.sin(Math.toRadians(clampedLat));
623
+ double mercY_normalized = 0.5 - Math.log((1 + sinLatitude) / (1 - sinLatitude)) / (4 * Math.PI);
624
+ double mercX = mercX_normalized * TILE_SIZE;
625
+ double mercY = mercY_normalized * TILE_SIZE;
626
+
627
+ vertices.add((float) mercX);
628
+ vertices.add((float) mercY);
629
+
630
+ // Texture coordinates are always a clean 0.0 to 1.0 for each mesh instance
631
+ float tex_u = u_interp;
632
+ float tex_v = isSouthToNorth ? (1.0f - v_interp) : v_interp;
633
+
634
+ vertices.add(tex_u);
635
+ vertices.add(tex_v);
636
+ }
637
+ }
638
+
639
+ // Generate indices for this specific world copy, offsetting by the starting index
640
+ for (short row = 0; row < subdivisions_y; row++) {
641
+ for (short col = 0; col < subdivisions_x; col++) {
642
+ short tl = (short) (vertexStartIndex + row * verticesPerRow + col);
643
+ short tr = (short) (tl + 1);
644
+ short bl = (short) (vertexStartIndex + (row + 1) * verticesPerRow + col);
645
+ short br = (short) (bl + 1);
646
+
647
+ if (isSouthToNorth) {
648
+ indices.add(tl); indices.add(bl); indices.add(tr);
649
+ indices.add(tr); indices.add(bl); indices.add(br);
650
+ } else { // North-to-South (MRMS)
651
+ indices.add(tl); indices.add(tr); indices.add(bl);
652
+ indices.add(bl); indices.add(tr); indices.add(br);
653
+ }
654
+ }
655
+ }
656
+ }
657
+ }
628
658
  }