Skip to content

Commit 05d7384

Browse files
fix: env restore
1 parent 15710db commit 05d7384

12 files changed

+89
-52
lines changed

packages/core/src/asset/Loader.ts

-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { Engine, EngineConfiguration } from "../Engine";
22
import { AssetPromise } from "./AssetPromise";
33
import { LoadItem } from "./LoadItem";
4-
import { request, RequestConfig } from "./request";
54
import { ResourceManager } from "./ResourceManager";
65
/**
76
* Loader abstract class.

packages/core/src/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export type { EngineSettings } from "./EngineSettings";
2020
export type { EngineConfiguration } from "./Engine";
2121

2222
export { request } from "./asset/request";
23+
export type { RequestConfig } from "./asset/request";
2324
export { Loader } from "./asset/Loader";
2425
export { ContentRestorer } from "./asset/ContentRestorer";
2526
export { ResourceManager, resourceLoader } from "./asset/ResourceManager";

packages/loader/src/AudioLoader.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@ import {
33
AssetType,
44
AudioClip,
55
AudioManager,
6-
Loader,
76
LoadItem,
8-
resourceLoader,
9-
ResourceManager
7+
Loader,
8+
RequestConfig,
9+
ResourceManager,
10+
resourceLoader
1011
} from "@galacean/engine-core";
11-
import { RequestConfig } from "@galacean/engine-core/types/asset/request";
1212
@resourceLoader(AssetType.Audio, ["mp3", "ogg", "wav"])
1313
class AudioLoader extends Loader<AudioClip> {
1414
load(item: LoadItem, resourceManager: ResourceManager): AssetPromise<AudioClip> {

packages/loader/src/EnvLoader.ts

+61-27
Original file line numberDiff line numberDiff line change
@@ -2,51 +2,61 @@ import {
22
AmbientLight,
33
AssetPromise,
44
AssetType,
5+
ContentRestorer,
56
DiffuseMode,
6-
Loader,
7+
Engine,
78
LoadItem,
8-
resourceLoader,
9+
Loader,
10+
RequestConfig,
911
ResourceManager,
1012
TextureCube,
1113
TextureCubeFace,
12-
TextureFilterMode
14+
TextureFilterMode,
15+
request,
16+
resourceLoader
1317
} from "@galacean/engine-core";
1418
import { SphericalHarmonics3 } from "@galacean/engine-math";
1519

1620
@resourceLoader(AssetType.Env, ["env"])
1721
class EnvLoader extends Loader<AmbientLight> {
22+
/**
23+
* @internal
24+
*/
25+
static _setTextureByBuffer(engine: Engine, buffer: ArrayBuffer, texture?: TextureCube) {
26+
const shByteLength = 27 * 4;
27+
const size = new Uint16Array(buffer, shByteLength, 1)?.[0];
28+
texture ||= new TextureCube(engine, size);
29+
texture.filterMode = TextureFilterMode.Trilinear;
30+
const mipmapCount = texture.mipmapCount;
31+
let offset = shByteLength + 2;
32+
33+
for (let mipLevel = 0; mipLevel < mipmapCount; mipLevel++) {
34+
const mipSize = size >> mipLevel;
35+
36+
for (let face = 0; face < 6; face++) {
37+
const dataSize = mipSize * mipSize * 4;
38+
const data = new Uint8Array(buffer, offset, dataSize);
39+
offset += dataSize;
40+
texture.setPixelBuffer(TextureCubeFace.PositiveX + face, data, mipLevel);
41+
}
42+
}
43+
return texture;
44+
}
45+
1846
load(item: LoadItem, resourceManager: ResourceManager): AssetPromise<AmbientLight> {
1947
return new AssetPromise((resolve, reject) => {
48+
const requestConfig = { ...item, type: "arraybuffer" } as RequestConfig;
49+
const engine = resourceManager.engine;
2050
resourceManager
2151
// @ts-ignore
22-
._request<ArrayBuffer>(item.url, { ...item, type: "arraybuffer" })
52+
._request<ArrayBuffer>(item.url, requestConfig)
2353
.then((arraybuffer) => {
24-
const shArray = new Float32Array(arraybuffer, 0, 27);
25-
const shByteLength = 27 * 4;
26-
const size = new Uint16Array(arraybuffer, shByteLength, 1)?.[0];
27-
28-
const { engine } = resourceManager;
29-
const texture = new TextureCube(engine, size);
30-
texture.filterMode = TextureFilterMode.Trilinear;
31-
const mipmapCount = texture.mipmapCount;
32-
let offset = shByteLength + 2;
33-
34-
for (let mipLevel = 0; mipLevel < mipmapCount; mipLevel++) {
35-
const mipSize = size >> mipLevel;
36-
37-
for (let face = 0; face < 6; face++) {
38-
const dataSize = mipSize * mipSize * 4;
39-
const data = new Uint8Array(arraybuffer, offset, dataSize);
40-
offset += dataSize;
41-
texture.setPixelBuffer(TextureCubeFace.PositiveX + face, data, mipLevel);
42-
}
43-
}
44-
54+
const texture = EnvLoader._setTextureByBuffer(engine, arraybuffer);
55+
engine.resourceManager.addContentRestorer(new EnvContentRestorer(texture, item.url, requestConfig));
4556
const ambientLight = new AmbientLight(engine);
4657
const sh = new SphericalHarmonics3();
47-
4858
ambientLight.diffuseMode = DiffuseMode.SphericalHarmonics;
49-
sh.copyFromArray(shArray);
59+
sh.copyFromArray(new Float32Array(arraybuffer, 0, 27));
5060
ambientLight.diffuseSphericalHarmonics = sh;
5161
ambientLight.specularTexture = texture;
5262
ambientLight.specularTextureDecodeRGBM = true;
@@ -58,3 +68,27 @@ class EnvLoader extends Loader<AmbientLight> {
5868
});
5969
}
6070
}
71+
72+
/**
73+
* @internal
74+
*/
75+
class EnvContentRestorer extends ContentRestorer<TextureCube> {
76+
constructor(
77+
resource: TextureCube,
78+
public url: string,
79+
public requestConfig: RequestConfig
80+
) {
81+
super(resource);
82+
}
83+
84+
override restoreContent(): AssetPromise<TextureCube> {
85+
return new AssetPromise((resolve, reject) => {
86+
request<ArrayBuffer>(this.url, this.requestConfig)
87+
.then((buffer) => {
88+
EnvLoader._setTextureByBuffer(this.resource.engine, buffer, this.resource);
89+
resolve(this.resource);
90+
})
91+
.catch(reject);
92+
});
93+
}
94+
}

packages/loader/src/GLTFContentRestorer.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@ import {
44
Buffer,
55
ContentRestorer,
66
ModelMesh,
7-
request,
7+
RequestConfig,
88
Texture2D,
9-
TypedArray
9+
TypedArray,
10+
request
1011
} from "@galacean/engine-core";
11-
import { RequestConfig } from "@galacean/engine-core/types/asset/request";
1212
import { Vector2 } from "@galacean/engine-math";
1313
import { GLTFResource } from "./gltf/GLTFResource";
1414
import type { AccessorComponentType, IBufferView } from "./gltf/GLTFSchema";

packages/loader/src/HDRLoader.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@ import {
55
Engine,
66
LoadItem,
77
Loader,
8+
RequestConfig,
89
ResourceManager,
910
TextureCube,
1011
TextureCubeFace,
1112
request,
1213
resourceLoader
1314
} from "@galacean/engine-core";
14-
import { RequestConfig } from "@galacean/engine-core/types/asset/request";
1515
import { Color, Vector3 } from "@galacean/engine-math";
1616

1717
const PI = Math.PI;

packages/loader/src/Texture2DContentRestorer.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
import { AssetPromise, ContentRestorer, request, Texture2D } from "@galacean/engine-core";
2-
import { RequestConfig } from "@galacean/engine-core/types/asset/request";
1+
import { AssetPromise, ContentRestorer, RequestConfig, Texture2D, request } from "@galacean/engine-core";
32

43
/**
54
* @internal

packages/loader/src/Texture2DLoader.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
import {
22
AssetPromise,
33
AssetType,
4-
Loader,
54
LoadItem,
6-
resourceLoader,
5+
Loader,
6+
RequestConfig,
77
ResourceManager,
88
Texture2D,
99
TextureFilterMode,
1010
TextureFormat,
11-
TextureWrapMode
11+
TextureWrapMode,
12+
resourceLoader
1213
} from "@galacean/engine-core";
13-
import { RequestConfig } from "@galacean/engine-core/types/asset/request";
1414
import { Texture2DContentRestorer } from "./Texture2DContentRestorer";
1515

1616
@resourceLoader(AssetType.Texture2D, ["png", "jpg", "webp", "jpeg"])

packages/loader/src/TextureCubeContentRestorer.ts

+8-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
1-
import { AssetPromise, ContentRestorer, request, TextureCube, TextureCubeFace } from "@galacean/engine-core";
2-
import { RequestConfig } from "@galacean/engine-core/types/asset/request";
1+
import {
2+
AssetPromise,
3+
ContentRestorer,
4+
RequestConfig,
5+
TextureCube,
6+
TextureCubeFace,
7+
request
8+
} from "@galacean/engine-core";
39

410
/**
511
* @internal

packages/loader/src/TextureCubeLoader.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
import {
22
AssetPromise,
33
AssetType,
4-
Loader,
54
LoadItem,
6-
resourceLoader,
5+
Loader,
6+
RequestConfig,
77
ResourceManager,
88
TextureCube,
9-
TextureCubeFace
9+
TextureCubeFace,
10+
resourceLoader
1011
} from "@galacean/engine-core";
11-
import { RequestConfig } from "@galacean/engine-core/types/asset/request";
1212
import { TextureCubeContentRestorer } from "./TextureCubeContentRestorer";
1313

1414
@resourceLoader(AssetType.TextureCube, [""])

packages/loader/src/gltf/parser/GLTFBufferParser.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
import { request, Utils } from "@galacean/engine-core";
2-
import { RequestConfig } from "@galacean/engine-core/types/asset/request";
1+
import { RequestConfig, Utils } from "@galacean/engine-core";
32
import { BufferRequestInfo } from "../../GLTFContentRestorer";
43
import type { IBuffer } from "../GLTFSchema";
54
import { GLTFParser } from "./GLTFParser";

packages/loader/src/gltf/parser/GLTFSchemaParser.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
import { Utils, request } from "@galacean/engine-core";
2-
import { RequestConfig } from "@galacean/engine-core/types/asset/request";
1+
import { RequestConfig, Utils } from "@galacean/engine-core";
32
import { BufferRequestInfo } from "../../GLTFContentRestorer";
43
import { IGLTF } from "../GLTFSchema";
54
import { GLTFUtils } from "../GLTFUtils";

0 commit comments

Comments
 (0)