feat: add generic render segment model
Some checks failed
validate-scripts / validate-scripts (push) Has been cancelled

This commit is contained in:
tei
2026-09-25 13:55:19 +09:00
parent 8fbb892a12
commit 016fd1fff6
29 changed files with 1409 additions and 162 deletions

View File

@@ -70,6 +70,12 @@ class WeatherRuntimeBridgeModule(private val context: ReactApplicationContext) :
@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 setRenderSegmentPlanJson(reactTag: Double, planJson: String, promise: Promise) = withMap(reactTag, promise) { map ->
promise.resolve(if (map.setRenderSegmentPlan(planJson)) "ACCEPTED" else "REJECTED")
}
@ReactMethod override fun getRenderSegmentDiagnosticsJson(reactTag: Double, promise: Promise) = withMap(reactTag, promise) { map ->
promise.resolve(map.renderSegmentDiagnostics)
}
@ReactMethod override fun getRetainedUnderlayDiagnostics(reactTag: Double, promise: Promise) = withMap(reactTag, promise) { map ->
val value = map.retainedUnderlayDiagnostics
promise.resolve(Arguments.createMap().apply {

View File

@@ -169,6 +169,16 @@ RCT_EXPORT_MODULE(WeatherRuntimeBridge)
resolve([map setContinuousLayerRangeFromLayerIdentifier:startLayerId toLayerIdentifier:endLayerId] ? @"ACCEPTED" : @"REJECTED");
}];
}
- (void)setRenderSegmentPlanJson:(double)reactTag planJson:(NSString *)planJson resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
[self withMapForTag:reactTag requireRuntime:NO resolve:resolve reject:reject action:^(MLNMapView *map, MLNParticleFieldRuntime *runtime) {
resolve([map setRenderSegmentPlanJSON:planJson] ? @"ACCEPTED" : @"REJECTED");
}];
}
- (void)getRenderSegmentDiagnosticsJson:(double)reactTag resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
[self withMapForTag:reactTag requireRuntime:NO resolve:resolve reject:reject action:^(MLNMapView *map, MLNParticleFieldRuntime *runtime) {
resolve(map.renderSegmentDiagnosticsJSON);
}];
}
- (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;

View File

@@ -27,6 +27,8 @@ export interface Spec extends TurboModule {
getState(reactTag: number): Promise<RuntimeSnapshot>;
setRetainedUnderlayEnabled(reactTag: number, enabled: boolean): Promise<CommandResult>;
setContinuousLayerRange(reactTag: number, startLayerId: string, endLayerId: string): Promise<CommandResult>;
setRenderSegmentPlanJson(reactTag: number, planJson: string): Promise<CommandResult>;
getRenderSegmentDiagnosticsJson(reactTag: number): Promise<string>;
getRetainedUnderlayDiagnostics(reactTag: number): Promise<RetainedUnderlaySnapshot>;
clearWindFields(reactTag: number): Promise<CommandResult>;
submitWindField(reactTag: number, metadataJson: string, payloadFileUri: string): Promise<FieldSubmitResult>;

View File

@@ -1,5 +1,5 @@
import { getNativeFieldRuntimeBridge } from "./NativeWeatherRuntimeBridge";
import type { CommandResult, RetainedUnderlayDiagnostics } from "./types";
import type { CommandResult, RenderSegmentDiagnostics, RenderSegmentPlan, RetainedUnderlayDiagnostics } from "./types";
function nativeBridge() {
const bridge = getNativeFieldRuntimeBridge();
@@ -19,4 +19,9 @@ export const RendererRuntime = {
},
getRetainedUnderlayDiagnostics: (reactTag: number): Promise<RetainedUnderlayDiagnostics> =>
nativeBridge().getRetainedUnderlayDiagnostics(reactTag),
setRenderSegmentPlan: (reactTag: number, plan: RenderSegmentPlan): Promise<CommandResult> => {
return nativeBridge().setRenderSegmentPlanJson(reactTag, JSON.stringify(plan));
},
getRenderSegmentDiagnostics: async (reactTag: number): Promise<RenderSegmentDiagnostics> =>
JSON.parse(await nativeBridge().getRenderSegmentDiagnosticsJson(reactTag)) as RenderSegmentDiagnostics,
} as const;

View File

@@ -16,6 +16,13 @@ export type {
ResolvedFieldProfileContractInput,
RuntimeSnapshot,
RetainedUnderlayDiagnostics,
RenderSegmentDefinition,
RenderSegmentDiagnostics,
RenderSegmentLayerDiagnostics,
RenderSegmentPlan,
RenderSegmentStrategy,
RetainedRenderSegmentDiagnostics,
ContinuousRenderSegmentDiagnostics,
RuntimeState,
TargetFps,
} from "./types";

View File

@@ -62,3 +62,78 @@ export type RetainedUnderlayDiagnostics = Readonly<{
fastPathMiss: number;
fullCpuFrame: number;
}>;
export type RenderSegmentStrategy = "RETAINED" | "CONTINUOUS";
export type RenderSegmentDefinition = Readonly<{
strategy: RenderSegmentStrategy;
startLayerId?: string;
}>;
export type RenderSegmentPlan = Readonly<{
schemaVersion: 1;
segments: readonly RenderSegmentDefinition[];
}>;
export type RenderSegmentLayerDiagnostics = Readonly<{
layerIndex: number;
layerId: string;
layerType: string;
visible: boolean;
sourceId: string | null;
sourceLayer: string | null;
}>;
export type RetainedRenderSegmentDiagnostics = Readonly<{
segmentIndex: number;
strategy: "RETAINED";
configuredStartLayerId: string | null;
beginIndex: number;
endExclusive: number;
resolvedStartLayerId: string | null;
resolvedEndLayerId: string | null;
layerCount: number;
layers: readonly RenderSegmentLayerDiagnostics[];
cache: Readonly<{
cacheState: string;
contentRevision: number;
build: number;
reuse: number;
invalidation: number;
lastInvalidationReason: string;
textureCreate: number;
compositeCreate: number;
resourceRelease: number;
}>;
}>;
export type ContinuousRenderSegmentDiagnostics = Readonly<{
segmentIndex: number;
strategy: "CONTINUOUS";
configuredStartLayerId: string | null;
beginIndex: number;
endExclusive: number;
resolvedStartLayerId: string | null;
resolvedEndLayerId: string | null;
layerCount: number;
layers: readonly RenderSegmentLayerDiagnostics[];
cache: null;
}>;
export type RenderSegmentDiagnostics = Readonly<{
schemaVersion: 1;
enabled: boolean;
configured: boolean;
valid: boolean;
configSource: "explicit-render-segment-plan" | "continuous-range-compat" | "unconfigured/legacy";
configRevision: number;
topologyRevision: number;
styleLayerCount: number;
segmentCount: number;
retainedSegmentCount: number;
continuousSegmentCount: number;
coverageComplete: boolean;
fallback: boolean;
lastReason: string;
fastPathEligible: boolean;
fastPathActive: boolean;
fastPathFallbackReason: string;
fastPathHit: number;
fastPathMiss: number;
fullCpuFrame: number;
styleLayers: readonly RenderSegmentLayerDiagnostics[];
segments: readonly (RetainedRenderSegmentDiagnostics | ContinuousRenderSegmentDiagnostics)[];
}>;