feat: add continuous retained render ranges
Some checks failed
validate-scripts / validate-scripts (push) Has been cancelled

This commit is contained in:
tei
2026-09-24 11:46:19 +09:00
parent b29e564944
commit a9eaec6b65
25 changed files with 857 additions and 120 deletions

View File

@@ -67,6 +67,9 @@ class WeatherRuntimeBridgeModule(private val context: ReactApplicationContext) :
map.setRetainedUnderlayEnabled(enabled)
promise.resolve("ACCEPTED")
}
@ReactMethod override fun setContinuousLayerRange(reactTag: Double, startLayerId: String, endLayerId: String, promise: Promise) = withMap(reactTag, promise) { map ->
promise.resolve(if (map.setContinuousLayerRange(startLayerId, endLayerId)) "ACCEPTED" else "REJECTED")
}
@ReactMethod override fun getRetainedUnderlayDiagnostics(reactTag: Double, promise: Promise) = withMap(reactTag, promise) { map ->
val value = map.retainedUnderlayDiagnostics
promise.resolve(Arguments.createMap().apply {
@@ -76,6 +79,21 @@ class WeatherRuntimeBridgeModule(private val context: ReactApplicationContext) :
putDouble("fallback", value.fallback.toDouble())
putDouble("invalidation", value.invalidation.toDouble())
putString("lastReason", value.lastReason)
putBoolean("rangeConfigured", value.rangeConfigured)
putBoolean("rangeValid", value.rangeValid)
putString("startLayerId", value.startLayerId)
putString("endLayerId", value.endLayerId)
putInt("startIndex", value.startIndex)
putInt("endIndex", value.endIndex)
putBoolean("bottomPresent", value.bottomPresent)
putDouble("bottomBuild", value.bottomBuild.toDouble())
putDouble("bottomReuse", value.bottomReuse.toDouble())
putDouble("bottomInvalidation", value.bottomInvalidation.toDouble())
putBoolean("topPresent", value.topPresent)
putDouble("topBuild", value.topBuild.toDouble())
putDouble("topReuse", value.topReuse.toDouble())
putDouble("topInvalidation", value.topInvalidation.toDouble())
putBoolean("fallback", value.fallback)
})
}
@ReactMethod override fun clearWindFields(reactTag: Double, promise: Promise) = command(reactTag, promise) { it.clearWindFields() }

View File

@@ -164,12 +164,23 @@ RCT_EXPORT_MODULE(WeatherRuntimeBridge)
resolve(@"ACCEPTED");
}];
}
- (void)setContinuousLayerRange:(double)reactTag startLayerId:(NSString *)startLayerId endLayerId:(NSString *)endLayerId resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
[self withMapForTag:reactTag requireRuntime:NO resolve:resolve reject:reject action:^(MLNMapView *map, MLNParticleFieldRuntime *runtime) {
resolve([map setContinuousLayerRangeFromLayerIdentifier:startLayerId toLayerIdentifier:endLayerId] ? @"ACCEPTED" : @"REJECTED");
}];
}
- (void)getRetainedUnderlayDiagnostics:(double)reactTag resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
[self withMapForTag:reactTag requireRuntime:NO resolve:resolve reject:reject action:^(MLNMapView *map, MLNParticleFieldRuntime *runtime) {
MLNRetainedUnderlayDiagnostics *value = map.retainedUnderlayDiagnostics;
resolve(@{ @"enabled": @(value.enabled), @"build": @(value.build), @"reuse": @(value.reuse),
@"fallback": @(value.fallback), @"invalidation": @(value.invalidation),
@"lastReason": value.lastReason });
@"lastReason": value.lastReason, @"rangeConfigured": @(value.rangeConfigured),
@"rangeValid": @(value.rangeValid), @"startLayerId": value.startLayerId,
@"endLayerId": value.endLayerId, @"startIndex": @(value.startIndex), @"endIndex": @(value.endIndex),
@"bottomPresent": @(value.bottomPresent), @"bottomBuild": @(value.bottomBuild),
@"bottomReuse": @(value.bottomReuse), @"bottomInvalidation": @(value.bottomInvalidation),
@"topPresent": @(value.topPresent), @"topBuild": @(value.topBuild),
@"topReuse": @(value.topReuse), @"topInvalidation": @(value.topInvalidation) });
}];
}

View File

@@ -9,12 +9,18 @@ type FieldSubmitResult = "REJECTED_SOURCE_MODE" | "REJECTED_ADAPTER" | "REJECTED
type EncodedFieldSubmitResult = "ACCEPTED_INSERTED" | "ACCEPTED_REPLACED_REVISION" | "DUPLICATE" | "REJECTED_DECODE" | "REJECTED_CONTRACT" | "REJECTED_INVALID_FIELD_KEY" | "REJECTED_IDENTITY_CONFLICT" | "REJECTED_STALE_REVISION" | "REJECTED_INCOMPATIBLE" | "REJECTED_CAPACITY";
type ColorStop = { speedMps: number; red: number; green: number; blue: number; alpha: number };
type RuntimeSnapshot = { state: RuntimeState; playbackState: PlaybackState; targetFps: TargetFps; disposed: boolean };
type RetainedUnderlaySnapshot = { enabled: boolean; build: number; reuse: number; fallback: number; invalidation: number; lastReason: string };
type RetainedUnderlaySnapshot = {
enabled: boolean; build: number; reuse: number; fallback: number; invalidation: number; lastReason: string;
rangeConfigured: boolean; rangeValid: boolean; startLayerId: string; endLayerId: string;
startIndex: number; endIndex: number; bottomPresent: boolean; bottomBuild: number; bottomReuse: number;
bottomInvalidation: number; topPresent: boolean; topBuild: number; topReuse: number; topInvalidation: number;
};
export interface Spec extends TurboModule {
attach(reactTag: number): Promise<RuntimeSnapshot>;
detach(reactTag: number): Promise<void>;
getState(reactTag: number): Promise<RuntimeSnapshot>;
setRetainedUnderlayEnabled(reactTag: number, enabled: boolean): Promise<CommandResult>;
setContinuousLayerRange(reactTag: number, startLayerId: string, endLayerId: string): Promise<CommandResult>;
getRetainedUnderlayDiagnostics(reactTag: number): Promise<RetainedUnderlaySnapshot>;
clearWindFields(reactTag: number): Promise<CommandResult>;
submitWindField(reactTag: number, metadataJson: string, payloadFileUri: string): Promise<FieldSubmitResult>;

View File

@@ -13,6 +13,10 @@ function nativeBridge() {
export const RendererRuntime = {
setRetainedUnderlayEnabled: (reactTag: number, enabled: boolean): Promise<CommandResult> =>
nativeBridge().setRetainedUnderlayEnabled(reactTag, enabled),
setContinuousLayerRange: (reactTag: number, startLayerId: string, endLayerId: string): Promise<CommandResult> => {
if (startLayerId.length === 0 || endLayerId.length === 0) return Promise.resolve("REJECTED");
return nativeBridge().setContinuousLayerRange(reactTag, startLayerId, endLayerId);
},
getRetainedUnderlayDiagnostics: (reactTag: number): Promise<RetainedUnderlayDiagnostics> =>
nativeBridge().getRetainedUnderlayDiagnostics(reactTag),
} as const;

View File

@@ -28,4 +28,18 @@ export type RetainedUnderlayDiagnostics = Readonly<{
fallback: number;
invalidation: number;
lastReason: string;
rangeConfigured: boolean;
rangeValid: boolean;
startLayerId: string;
endLayerId: string;
startIndex: number;
endIndex: number;
bottomPresent: boolean;
bottomBuild: number;
bottomReuse: number;
bottomInvalidation: number;
topPresent: boolean;
topBuild: number;
topReuse: number;
topInvalidation: number;
}>;