#pragma once #include #include #include #include namespace mbgl { class AsyncRequest; namespace style { // A Source-owned, preloaded validation candidate. Production runtimes can use // updateRuntimeFieldWindow() directly with an already decoded snapshot instead. struct RasterArrayRuntimeFieldDescriptor { std::string fixtureID; std::string metadataURL; std::string fieldURL; }; enum class RasterArrayRuntimeFieldUpdateResult : uint8_t { Applied, Noop, RejectedNotLoaded, RejectedInvalidSnapshot, RejectedIncompatibleSnapshot, RejectedNonMonotonicGeneration, RejectedCandidateNotReady, RejectedNoCandidate, }; class RasterArraySource final : public Source { public: RasterArraySource(std::string id, std::string fixtureID, std::string metadataURL, std::string fieldURL, std::string nextFixtureID = {}, std::string nextMetadataURL = {}, std::string nextFieldURL = {}, std::vector runtimeFields = {}); ~RasterArraySource() override; class Impl; const Impl& impl() const; void loadDescription(FileSource&) override; // Advances the authoritative Source time window from T0/T1 to T1/newT1. // The caller transfers an immutable, already decoded Field snapshot; the // renderer observes the resulting Source change and owns GPU reuse/upload. RasterArrayRuntimeFieldUpdateResult updateRuntimeFieldWindow(particle::ParticleFieldSnapshot newT1); // Validation convenience: advance using the next Source-owned preloaded // candidate. Android supplies no T0/T1 state and no GPU resource here. RasterArrayRuntimeFieldUpdateResult advanceRuntimeFieldWindow(); // Validation convenience: resubmit the current T1 through the formal // update API. This must return Noop without changing the Source window. RasterArrayRuntimeFieldUpdateResult repeatRuntimeFieldWindow(); bool supportsLayerType(const LayerTypeInfo*) const override; mapbox::base::WeakPtr makeWeakPtr() override { return weakFactory.makeWeakPtr(); } protected: Mutable createMutable() const noexcept override; private: struct RuntimeFieldCandidate { RasterArrayRuntimeFieldDescriptor descriptor; std::unique_ptr metadataRequest; std::unique_ptr fieldRequest; std::optional metadata; std::optional> fieldBytes; std::optional snapshot; }; void tryLoad(); void tryLoadRuntimeField(size_t); RasterArrayRuntimeFieldUpdateResult rejectRuntimeFieldUpdate(RasterArrayRuntimeFieldUpdateResult, const std::string& reason) const; std::unique_ptr metadataRequest; std::unique_ptr fieldRequest; std::unique_ptr nextMetadataRequest; std::unique_ptr nextFieldRequest; std::optional metadata; std::optional> fieldBytes; std::optional nextMetadata; std::optional> nextFieldBytes; std::vector runtimeFields; size_t nextRuntimeField = 0; uint64_t runtimeUpdateSequence = 0; mapbox::base::WeakPtrFactory weakFactory{this}; }; template <> inline bool Source::is() const { return getType() == SourceType::RasterArray; } } // namespace style } // namespace mbgl