feat: establish android particle field rendering loop
Some checks failed
validate-scripts / validate-scripts (push) Has been cancelled

This commit is contained in:
OpenAI Codex
2026-08-31 10:41:12 +08:00
parent 1ec4470114
commit 0b076c6d52
25 changed files with 816 additions and 63 deletions

View File

@@ -21,15 +21,17 @@ class ParticleCoreLayerValidationActivity : AppCompatActivity() {
private var active = true
private var enabled = true
private var maskMode = MASK_GLOBAL
private var fixtureMode = FIXTURE_UNIFORM_EAST
override fun onCreate(savedInstanceState: Bundle?) {
active = savedInstanceState?.getBoolean(STATE_ACTIVE, true) ?: true
enabled = savedInstanceState?.getBoolean(STATE_ENABLED, true) ?: true
maskMode = savedInstanceState?.getInt(STATE_MASK_MODE, MASK_GLOBAL) ?: MASK_GLOBAL
fixtureMode = savedInstanceState?.getInt(STATE_FIXTURE_MODE, FIXTURE_UNIFORM_EAST) ?: FIXTURE_UNIFORM_EAST
super.onCreate(savedInstanceState)
Log.i(
TAG,
"ParticleValidation30_03: Activity state restored active=$active enabled=$enabled maskMode=$maskMode " +
"ParticleRender: Activity state restored active=$active enabled=$enabled maskMode=$maskMode fixtureMode=$fixtureMode " +
"recreated=${savedInstanceState != null}"
)
setContentView(R.layout.activity_particle_core_layer_validation)
@@ -69,6 +71,12 @@ class ParticleCoreLayerValidationActivity : AppCompatActivity() {
findViewById<Button>(R.id.validationOceanB).setOnClickListener {
if (this::maplibreMap.isInitialized) setValidationProperties(active = active, maskMode = MASK_OCEAN_B)
}
findViewById<Button>(R.id.validationUniformEast).setOnClickListener {
if (this::maplibreMap.isInitialized) setValidationProperties(active, maskMode, FIXTURE_UNIFORM_EAST)
}
findViewById<Button>(R.id.validationUniformNorth).setOnClickListener {
if (this::maplibreMap.isInitialized) setValidationProperties(active, maskMode, FIXTURE_UNIFORM_NORTH)
}
findViewById<Button>(R.id.validationDateline).setOnClickListener {
maplibreMap.cameraPosition = CameraPosition.Builder().target(LatLng(0.0, 179.0)).zoom(2.0).build()
Log.i(TAG, "ParticleValidation30_03: DATELINE preset center=0,179 zoom=2")
@@ -89,9 +97,10 @@ class ParticleCoreLayerValidationActivity : AppCompatActivity() {
}
}
private fun setValidationProperties(active: Boolean, maskMode: Int) {
private fun setValidationProperties(active: Boolean, maskMode: Int, fixtureMode: Int = this.fixtureMode) {
this.active = active
this.maskMode = maskMode
this.fixtureMode = fixtureMode
val layer = maplibreMap.style?.getLayer(PARTICLE_LAYER_ID)
if (layer == null || !enabled) {
loadValidationStyle(active, enabled)
@@ -99,10 +108,11 @@ class ParticleCoreLayerValidationActivity : AppCompatActivity() {
}
layer.setProperties(
PaintPropertyValue("particle-validation-active", active),
PaintPropertyValue("particle-validation-mask-mode", maskMode)
PaintPropertyValue("particle-validation-mask-mode", maskMode),
PaintPropertyValue("particle-fixture-mode", fixtureMode)
)
status.text = statusText()
Log.i(TAG, "ParticleValidation30_03: property update active=$active maskMode=$maskMode resourceReuseExpected=true")
Log.i(TAG, "ParticleRender: property update active=$active maskMode=$maskMode fixtureMode=$fixtureMode")
}
private fun statusText(): String = when {
@@ -116,7 +126,7 @@ class ParticleCoreLayerValidationActivity : AppCompatActivity() {
private fun validationStyle(active: Boolean, enabled: Boolean): String {
val particleLayer = if (enabled) {
"""{"id":"particle-validation-core","type":"particle-validation",
"paint":{"particle-validation-active":$active,"particle-validation-mask-mode":$maskMode}},"""
"paint":{"particle-validation-active":$active,"particle-validation-mask-mode":$maskMode,"particle-fixture-mode":$fixtureMode}},"""
} else {
""
}
@@ -153,6 +163,7 @@ class ParticleCoreLayerValidationActivity : AppCompatActivity() {
outState.putBoolean(STATE_ACTIVE, active)
outState.putBoolean(STATE_ENABLED, enabled)
outState.putInt(STATE_MASK_MODE, maskMode)
outState.putInt(STATE_FIXTURE_MODE, fixtureMode)
super.onSaveInstanceState(outState)
mapView.onSaveInstanceState(outState)
}
@@ -162,9 +173,12 @@ class ParticleCoreLayerValidationActivity : AppCompatActivity() {
private const val STATE_ACTIVE = "particle_validation.active"
private const val STATE_ENABLED = "particle_validation.enabled"
private const val STATE_MASK_MODE = "particle_validation.mask_mode"
private const val STATE_FIXTURE_MODE = "particle_validation.fixture_mode"
private const val PARTICLE_LAYER_ID = "particle-validation-core"
private const val MASK_GLOBAL = 0
private const val MASK_OCEAN_A = 1
private const val MASK_OCEAN_B = 2
private const val FIXTURE_UNIFORM_EAST = 0
private const val FIXTURE_UNIFORM_NORTH = 1
}
}

View File

@@ -24,6 +24,26 @@
android:text="@string/particle_validation_active_status"
android:textColor="@android:color/white" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/validationUniformEast"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/particle_validation_uniform_east" />
<Button
android:id="@+id/validationUniformNorth"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/particle_validation_uniform_north" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"

View File

@@ -22,8 +22,10 @@
<string name="particle_validation_ocean_b">OCEAN B</string>
<string name="particle_validation_dateline">DATELINE</string>
<string name="particle_validation_world_wrap">WORLD WRAP</string>
<string name="particle_validation_global_active_status">30-03 GLOBAL ACTIVE: current-frame Camera/world-wrap validation and GPU simulation.</string>
<string name="particle_validation_global_static_status">30-03 GLOBAL STATIC: simulation frozen; Camera redraw must keep the world mask aligned.</string>
<string name="particle_validation_ocean_a_status">30-03 OCEAN_ONLY_A: blue shared coastal-mask consumer.</string>
<string name="particle_validation_ocean_b_status">30-03 OCEAN_ONLY_B: green shared coastal-mask consumer.</string>
<string name="particle_validation_uniform_east">UNIFORM EAST</string>
<string name="particle_validation_uniform_north">UNIFORM NORTH</string>
<string name="particle_validation_global_active_status">40-01 GLOBAL ACTIVE: offline field simulation and current-frame composite.</string>
<string name="particle_validation_global_static_status">40-01 GLOBAL STATIC: zero-step bootstrap and frozen composite.</string>
<string name="particle_validation_ocean_a_status">40-01 OCEAN_ONLY_A: shared coastal-mask consumer.</string>
<string name="particle_validation_ocean_b_status">40-01 OCEAN_ONLY_B: shared coastal-mask consumer.</string>
</resources>