Skip to content

Commit

Permalink
Support device lost (#1374)
Browse files Browse the repository at this point in the history
* feat: support device lost and restore
  • Loading branch information
GuoLei1990 authored Mar 15, 2023
1 parent 2e63d63 commit 00a0b16
Show file tree
Hide file tree
Showing 85 changed files with 2,189 additions and 1,058 deletions.
44 changes: 18 additions & 26 deletions packages/core/src/2d/atlas/FontAtlas.ts
Original file line number Diff line number Diff line change
@@ -1,45 +1,25 @@
import { RefObject } from "../../asset/RefObject";
import { Vector2 } from "@oasis-engine/math";
import { ReferResource } from "../../asset/ReferResource";
import { Engine } from "../../Engine";
import { Texture2D } from "../../texture/Texture2D";
import { CharInfo } from "../text/CharInfo";

/**
* @internal
* Font Atlas.
*/
export class FontAtlas extends RefObject {
private _charInfoMap: Record<number, CharInfo> = {};
private _texture: Texture2D;
export class FontAtlas extends ReferResource {
texture: Texture2D;

_charInfoMap: Record<number, CharInfo> = {};
private _space: number = 1;
private _curX: number = 1;
private _curY: number = 1;
private _nextY: number = 1;

get texture(): Texture2D {
return this._texture;
}

set texture(value: Texture2D) {
this._texture = value;
}

/**
* Constructor a FontAtlas.
* @param engine - Engine to which the FontAtlas belongs
*/
constructor(engine: Engine) {
super(engine);
}

/**
* @override
*/
_onDestroy(): void {
this._texture.destroy();
this._texture = null;
this._charInfoMap = {};
}

uploadCharTexture(charInfo: CharInfo): boolean {
const { w: width, h: height, data } = charInfo;
const { _space: space, texture } = this;
Expand All @@ -64,6 +44,7 @@ export class FontAtlas extends RefObject {
}

if (width > 0 && height > 0 && data) {
charInfo.bufferOffset = new Vector2(this._curX, this._curY);
texture.setPixelBuffer(data, 0, this._curX, this._curY, width, height);
texture.generateMipmaps();
}
Expand Down Expand Up @@ -97,4 +78,15 @@ export class FontAtlas extends RefObject {
getCharInfo(char: string): CharInfo {
return this._charInfoMap[char.charCodeAt(0)];
}

/**
* @override
* @internal
*/
protected _onDestroy(): void {
super._onDestroy();
this.texture.destroy();
this.texture = null;
this._charInfoMap = {};
}
}
8 changes: 5 additions & 3 deletions packages/core/src/2d/atlas/SpriteAtlas.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import { RefObject } from "../../asset/RefObject";
import { ReferResource } from "../../asset/ReferResource";
import { Engine } from "../../Engine";
import { Sprite } from "../sprite/Sprite";

/**
* Sprite Atlas.
*/
export class SpriteAtlas extends RefObject {
export class SpriteAtlas extends ReferResource {
private _sprites: Sprite[] = new Array<Sprite>();
private _spriteNamesToIndex: Record<string, number> = {};

Expand Down Expand Up @@ -67,8 +67,10 @@ export class SpriteAtlas extends RefObject {

/**
* @override
* @internal
*/
_onDestroy(): void {
protected _onDestroy(): void {
super._onDestroy();
this._sprites = null;
this._spriteNamesToIndex = null;
}
Expand Down
12 changes: 6 additions & 6 deletions packages/core/src/2d/sprite/Sprite.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { BoundingBox, MathUtil, Rect, Vector2, Vector4 } from "@oasis-engine/math";
import { RefObject } from "../../asset/RefObject";
import { ReferResource } from "../../asset/ReferResource";
import { Engine } from "../../Engine";
import { Texture2D } from "../../texture/Texture2D";
import { UpdateFlagManager } from "../../UpdateFlagManager";
Expand All @@ -8,7 +8,7 @@ import { SpriteModifyFlags } from "../enums/SpriteModifyFlags";
/**
* 2D sprite.
*/
export class Sprite extends RefObject {
export class Sprite extends ReferResource {
/** The name of sprite. */
name: string;

Expand Down Expand Up @@ -240,11 +240,11 @@ export class Sprite extends RefObject {

/**
* @override
* @internal
*/
_onDestroy(): void {
if (this._texture) {
this._texture = null;
}
protected _onDestroy(): void {
super._onDestroy();
this._texture = null;
}

private _calDefaultSize(): void {
Expand Down
22 changes: 11 additions & 11 deletions packages/core/src/2d/sprite/SpriteMask.ts
Original file line number Diff line number Diff line change
Expand Up @@ -156,17 +156,6 @@ export class SpriteMask extends Renderer implements ICustomClone {
this._onSpriteChange = this._onSpriteChange.bind(this);
}

/**
* @override
* @inheritdoc
*/
_onDestroy(): void {
this._sprite?._updateFlagManager.removeListener(this._onSpriteChange);
this._sprite = null;
this._verticesData = null;
super._onDestroy();
}

/**
* @internal
*/
Expand Down Expand Up @@ -218,6 +207,17 @@ export class SpriteMask extends Renderer implements ICustomClone {
this._maskElement = renderElement;
}

/**
* @override
* @inheritdoc
*/
protected _onDestroy(): void {
super._onDestroy();
this._sprite?._updateFlagManager.removeListener(this._onSpriteChange);
this._sprite = null;
this._verticesData = null;
}

@ignoreClone
private _onSpriteChange(type: SpriteModifyFlags): void {
switch (type) {
Expand Down
25 changes: 13 additions & 12 deletions packages/core/src/2d/sprite/SpriteRenderer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -218,18 +218,6 @@ export class SpriteRenderer extends Renderer implements ICustomClone {
target.sprite = this._sprite;
}

/**
* @internal
*/
_onDestroy(): void {
this._sprite?._updateFlagManager.removeListener(this._onSpriteChange);
this._color = null;
this._sprite = null;
this._assembler = null;
this._verticesData = null;
super._onDestroy();
}

/**
* @override
*/
Expand Down Expand Up @@ -278,6 +266,19 @@ export class SpriteRenderer extends Renderer implements ICustomClone {
context.camera._renderPipeline.pushRenderData(context, renderData);
}

/**
* @override
* @internal
*/
protected _onDestroy(): void {
super._onDestroy();
this._sprite?._updateFlagManager.removeListener(this._onSpriteChange);
this._color = null;
this._sprite = null;
this._assembler = null;
this._verticesData = null;
}

private _updateStencilState(): void {
// Update stencil.
const material = this.getInstanceMaterial();
Expand Down
2 changes: 2 additions & 0 deletions packages/core/src/2d/text/CharInfo.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { Vector2 } from "@oasis-engine/math";
* @internal
*/
export interface CharInfo {
char: string;
x: number;
y: number;
w: number;
Expand All @@ -16,4 +17,5 @@ export interface CharInfo {
index: number;
data?: Uint8Array;
uvs: Vector2[];
bufferOffset?: Vector2;
}
8 changes: 5 additions & 3 deletions packages/core/src/2d/text/Font.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import { RefObject } from "../../asset/RefObject";
import { ReferResource } from "../../asset/ReferResource";
import { Engine } from "../../Engine";
import { FontStyle } from "../enums/FontStyle";
import { SubFont } from "./SubFont";

/**
* Font.
*/
export class Font extends RefObject {
export class Font extends ReferResource {
/**
* Create a system font.
* @param engine - Engine to which the font belongs
Expand Down Expand Up @@ -59,8 +59,10 @@ export class Font extends RefObject {

/**
* @override
* @internal
*/
_onDestroy(): void {
protected _onDestroy(): void {
super._onDestroy();
const subFontMap = this._subFontMap;
for (let k in subFontMap) {
subFontMap[k].destroy();
Expand Down
31 changes: 31 additions & 0 deletions packages/core/src/2d/text/SubFont.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
import { AssetPromise } from "../../asset/AssetPromise";
import { ContentRestorer } from "../../asset/ContentRestorer";
import { Engine } from "../../Engine";
import { Texture2D } from "../../texture";
import { FontAtlas } from "../atlas/FontAtlas";
import { CharInfo } from "./CharInfo";
import { TextUtils } from "./TextUtils";

/**
* @internal
*/
export class SubFont {
nativeFontString: string;

private _engine: Engine;
private _fontAtlases: FontAtlas[] = [];
private _lastIndex: number = -1;
Expand Down Expand Up @@ -91,6 +96,32 @@ export class SubFont {
const texture = new Texture2D(engine, 256, 256);
fontAtlas.texture = texture;
this._fontAtlases.push(fontAtlas);

const nativeFontString = this.nativeFontString;

engine.resourceManager.addContentRestorer(
new (class extends ContentRestorer<FontAtlas> {
constructor() {
super(fontAtlas);
}
restoreContent(): void | AssetPromise<FontAtlas> {
const { resource } = this;
const charInfoMap = resource._charInfoMap;
const texture = resource.texture;
for (let k in charInfoMap) {
const charInfo = charInfoMap[k];
const data = TextUtils.measureChar(charInfo.char, nativeFontString).data;

if (charInfo.w > 0 && charInfo.h > 0 && data) {
const { bufferOffset } = charInfo;
texture.setPixelBuffer(data, 0, bufferOffset.x, bufferOffset.y, charInfo.w, charInfo.h);
}
texture.generateMipmaps();
}
}
})()
);

return fontAtlas;
}
}
17 changes: 9 additions & 8 deletions packages/core/src/2d/text/TextRenderer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -132,8 +132,8 @@ export class TextRenderer extends Renderer implements ICustomClone {
set font(value: Font) {
const lastFont = this._font;
if (lastFont !== value) {
lastFont && lastFont._addRefCount(-1);
value && value._addRefCount(1);
lastFont && lastFont._addReferCount(-1);
value && value._addReferCount(1);
this._font = value;
this._setDirtyFlagTrue(DirtyFlag.Font);
}
Expand Down Expand Up @@ -287,14 +287,15 @@ export class TextRenderer extends Renderer implements ICustomClone {
_init(): void {
const { engine } = this;
this._font = engine._textDefaultFont;
this._font._addRefCount(1);
this._font._addReferCount(1);
this.setMaterial(engine._spriteDefaultMaterial);
}

/**
* @internal
*/
_onDestroy(): void {
protected _onDestroy(): void {
super._onDestroy();
// Clear render data.
const charRenderDatas = this._charRenderDatas;
for (let i = 0, n = charRenderDatas.length; i < n; ++i) {
Expand All @@ -303,12 +304,10 @@ export class TextRenderer extends Renderer implements ICustomClone {
charRenderDatas.length = 0;

if (this._font) {
this._font._addRefCount(-1);
this._font._addReferCount(-1);
this._font = null;
}
this._subFont && (this._subFont = null);

super._onDestroy();
}

/**
Expand Down Expand Up @@ -431,7 +430,9 @@ export class TextRenderer extends Renderer implements ICustomClone {
}

private _resetSubFont(): void {
this._subFont = this._font._getSubFont(this.fontSize, this.fontStyle);
const font = this._font;
this._subFont = font._getSubFont(this.fontSize, this.fontStyle);
this._subFont.nativeFontString = TextUtils.getNativeFontString(font.name, this.fontSize, this.fontStyle);
}

private _updatePosition(): void {
Expand Down
Loading

0 comments on commit 00a0b16

Please sign in to comment.