Skip to content

Commit

Permalink
fix(loaders): fixes LoadingManager onLoad actually waiting for gain…
Browse files Browse the repository at this point in the history
…maps to be generated

Loaders delegated `LoadingManager` signalling to their internally used `FileLoader`s. This caused
`LoadingManager.onLoad` to fire before the gain maps were actually rendered and returned to the end
users. This is now fixed because loaders handle `manager` signalling themselves and wait until the
appropriate time before calling `manager.itemEnd`.
  • Loading branch information
daniele-pelagatti committed Nov 20, 2023
1 parent 587dc03 commit 77170f5
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 13 deletions.
29 changes: 22 additions & 7 deletions src/decode/loaders/GainMapLoader.ts
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,9 @@ export class GainMapLoader extends LoaderBase<[string, string, string]> {
await this.render(quadRenderer, gainMap, sdr, metadata)

if (typeof onLoad === 'function') onLoad(quadRenderer)

this.manager.itemEnd(sdrUrl)
this.manager.itemEnd(gainMapUrl)
this.manager.itemEnd(metadataUrl)
quadRenderer.dispose()
}
}
Expand All @@ -104,7 +106,11 @@ export class GainMapLoader extends LoaderBase<[string, string, string]> {
}
}

const sdrLoader = new FileLoader(this.manager)
this.manager.itemStart(sdrUrl)
this.manager.itemStart(gainMapUrl)
this.manager.itemStart(metadataUrl)

const sdrLoader = new FileLoader(this._internalLoadingManager)
sdrLoader.setResponseType('arraybuffer')
sdrLoader.setRequestHeader(this.requestHeader)
sdrLoader.setPath(this.path)
Expand All @@ -118,9 +124,12 @@ export class GainMapLoader extends LoaderBase<[string, string, string]> {
sdrLoaded = e.loaded
sdrTotal = e.total
progressHandler()
}, onError)
}, (error: unknown) => {
this.manager.itemError(sdrUrl)
if (typeof onError === 'function') onError(error)
})

const gainMapLoader = new FileLoader(this.manager)
const gainMapLoader = new FileLoader(this._internalLoadingManager)
gainMapLoader.setResponseType('arraybuffer')
gainMapLoader.setRequestHeader(this.requestHeader)
gainMapLoader.setPath(this.path)
Expand All @@ -134,9 +143,12 @@ export class GainMapLoader extends LoaderBase<[string, string, string]> {
gainMapLoaded = e.loaded
gainMapTotal = e.total
progressHandler()
}, onError)
}, (error: unknown) => {
this.manager.itemError(gainMapUrl)
if (typeof onError === 'function') onError(error)
})

const metadataLoader = new FileLoader(this.manager)
const metadataLoader = new FileLoader(this._internalLoadingManager)
// metadataLoader.setResponseType('json')
metadataLoader.setRequestHeader(this.requestHeader)
metadataLoader.setPath(this.path)
Expand All @@ -152,7 +164,10 @@ export class GainMapLoader extends LoaderBase<[string, string, string]> {
metadataLoaded = e.loaded
metadataTotal = e.total
progressHandler()
}, onError)
}, (error: unknown) => {
this.manager.itemError(metadataUrl)
if (typeof onError === 'function') onError(error)
})

return quadRenderer
}
Expand Down
11 changes: 8 additions & 3 deletions src/decode/loaders/HDRJPGLoader.ts
Original file line number Diff line number Diff line change
Expand Up @@ -66,11 +66,12 @@ export class HDRJPGLoader extends LoaderBase<string> {
public override load (url: string, onLoad?: (data: QuadRenderer<typeof HalfFloatType, GainMapDecoderMaterial>) => void, onProgress?: (event: ProgressEvent) => void, onError?: (err: unknown) => void): QuadRenderer<typeof HalfFloatType, GainMapDecoderMaterial> {
const quadRenderer = this.prepareQuadRenderer()

const loader = new FileLoader(this.manager)
const loader = new FileLoader(this._internalLoadingManager)
loader.setResponseType('arraybuffer')
loader.setRequestHeader(this.requestHeader)
loader.setPath(this.path)
loader.setWithCredentials(this.withCredentials)
this.manager.itemStart(url)
loader.load(url, async (jpeg) => {
if (typeof jpeg === 'string') throw new Error('Invalid buffer')

Expand All @@ -79,9 +80,13 @@ export class HDRJPGLoader extends LoaderBase<string> {
await this.render(quadRenderer, gainMapJPEG, sdrJPEG, metadata)

if (typeof onLoad === 'function') onLoad(quadRenderer)

this.manager.itemEnd(url)
quadRenderer.dispose()
}, onProgress, onError)
}, onProgress
, (error: unknown) => {
this.manager.itemError(url)
if (typeof onError === 'function') onError(error)
})

return quadRenderer
}
Expand Down
8 changes: 5 additions & 3 deletions src/decode/loaders/LoaderBase.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,15 +34,17 @@ const getImage = (blob: Blob) => {
}

export class LoaderBase<TUrl = string> extends Loader<QuadRenderer<typeof HalfFloatType, GainMapDecoderMaterial>, TUrl> {
private renderer: WebGLRenderer
private _renderer: WebGLRenderer
protected _internalLoadingManager: LoadingManager
/**
*
* @param renderer
* @param manager
*/
constructor (renderer: WebGLRenderer, manager?: LoadingManager) {
super(manager)
this.renderer = renderer
this._renderer = renderer
this._internalLoadingManager = new LoadingManager()
}

/**
Expand Down Expand Up @@ -70,7 +72,7 @@ export class LoaderBase<TUrl = string> extends Loader<QuadRenderer<typeof HalfFl
HalfFloatType,
LinearSRGBColorSpace,
material,
this.renderer
this._renderer
)
}

Expand Down

0 comments on commit 77170f5

Please sign in to comment.