From df843e80ae32fc2f2117c33cda4ee8f22bab765d Mon Sep 17 00:00:00 2001 From: AZhan Date: Tue, 31 Aug 2021 17:16:50 +0800 Subject: [PATCH] feat:SpriteAtlas Adaptation Editor Workflow (#461) * feat:SpriteAtlas Adaptation Editor Workflow --- packages/core/src/2d/atlas/types.ts | 2 + packages/core/src/2d/sprite/Sprite.ts | 2 + packages/loader/src/SpriteAtlasLoader.ts | 12 ++-- .../src/scene-loader/ResourceManager.ts | 2 + .../resources/SpriteAtlasResource.ts | 61 +++++++++++++++++++ .../scene-loader/resources/SpriteResource.ts | 27 ++++---- 6 files changed, 89 insertions(+), 17 deletions(-) create mode 100644 packages/loader/src/scene-loader/resources/SpriteAtlasResource.ts diff --git a/packages/core/src/2d/atlas/types.ts b/packages/core/src/2d/atlas/types.ts index dfa73ed238..39c511622c 100644 --- a/packages/core/src/2d/atlas/types.ts +++ b/packages/core/src/2d/atlas/types.ts @@ -21,6 +21,8 @@ export interface AtlasConfig { * The original data type of each sprite. */ export interface AtlasSprite { + /** @internal temp solution. */ + id: number; /** The name the sprite. */ name: string; /** Whether to rotate 90 degrees clockwise. */ diff --git a/packages/core/src/2d/sprite/Sprite.ts b/packages/core/src/2d/sprite/Sprite.ts index 2274657d96..caf8f87a9d 100644 --- a/packages/core/src/2d/sprite/Sprite.ts +++ b/packages/core/src/2d/sprite/Sprite.ts @@ -20,6 +20,8 @@ export class Sprite extends RefObject { _bounds: BoundingBox = new BoundingBox(); /** @internal */ _triangles: number[]; + /** @internal temp solution. */ + _assetID: number; private _pixelsPerUnit: number; private _texture: Texture2D = null; diff --git a/packages/loader/src/SpriteAtlasLoader.ts b/packages/loader/src/SpriteAtlasLoader.ts index e6cc0d395c..b42812d415 100644 --- a/packages/loader/src/SpriteAtlasLoader.ts +++ b/packages/loader/src/SpriteAtlasLoader.ts @@ -33,12 +33,12 @@ class SpriteAtlasLoader extends Loader { ) ).then((imgs) => { const { engine } = resourceManager; - // Generate a SpriteAtlas object + // Generate a SpriteAtlas object. const tempRect = new Rect(); const tempVect2 = new Vector2(); const spriteAtlas = new SpriteAtlas(engine); for (let i = 0; i < atlasItemsLen; i++) { - // Generate Texture2D according to configuration + // Generate Texture2D according to configuration. const originalImg = imgs[i]; const { width, height } = originalImg; const texture = new Texture2D(engine, width, height, format); @@ -51,7 +51,7 @@ class SpriteAtlasLoader extends Loader { const sourceHeightReciprocal = 1.0 / height; for (let j = sprites.length - 1; j >= 0; j--) { const atlasSprite = sprites[j]; - const { region, pivot, atlasRegionOffset, atlasRegion } = atlasSprite; + const { region, pivot, atlasRegionOffset, atlasRegion, id } = atlasSprite; const sprite = new Sprite( engine, texture, @@ -84,7 +84,11 @@ class SpriteAtlasLoader extends Loader { offsetBottom * originalHReciprocal ); } - /** @ts-ignore */ + if (id !== undefined) { + // @ts-ignore + sprite._assetID = id; + } + // @ts-ignore spriteAtlas._addSprite(sprite); } } diff --git a/packages/loader/src/scene-loader/ResourceManager.ts b/packages/loader/src/scene-loader/ResourceManager.ts index bb088d4225..fa80f78da5 100644 --- a/packages/loader/src/scene-loader/ResourceManager.ts +++ b/packages/loader/src/scene-loader/ResourceManager.ts @@ -16,6 +16,7 @@ import { AnimatorControllerResource, AnimationClipResource } from "./resources"; +import { SpriteAtlasResource } from "./resources/SpriteAtlasResource"; import { AssetConfig } from "./types"; export const RESOURCE_CLASS = { @@ -30,6 +31,7 @@ export const RESOURCE_CLASS = { BlinnPhongMaterial: BlinnPhongMaterialResource, base: BaseResource, sprite: SpriteResource, + SpriteAtlas: SpriteAtlasResource, animatorController: AnimatorControllerResource, animationClip: AnimationClipResource }; diff --git a/packages/loader/src/scene-loader/resources/SpriteAtlasResource.ts b/packages/loader/src/scene-loader/resources/SpriteAtlasResource.ts new file mode 100644 index 0000000000..10e04b4079 --- /dev/null +++ b/packages/loader/src/scene-loader/resources/SpriteAtlasResource.ts @@ -0,0 +1,61 @@ +import { AssetType, ResourceManager, SpriteAtlas } from "@oasis-engine/core"; +import { AssetConfig } from "../types"; +import { getAllGetters } from "../utils"; +import { SchemaResource } from "./SchemaResource"; +import { SpriteResource } from "./SpriteResource"; + +export class SpriteAtlasResource extends SchemaResource { + static defaultAtlas: SpriteAtlas; + + load(resourceManager: ResourceManager, assetConfig: AssetConfig): Promise { + return new Promise((resolve) => { + this.setMeta(); + if (assetConfig.source) { + resourceManager + .load({ + url: assetConfig.source, + type: AssetType.SpriteAtlas + }) + .then((spriteAtlas) => { + this._resource = spriteAtlas; + const { sprites } = spriteAtlas; + const schemaResourceManager = this.resourceManager; + for (let index = sprites.length - 1; index >= 0; index--) { + const sprite = sprites[index]; + const spriteResource = new SpriteResource(schemaResourceManager, sprite); + // @ts-ignore + const assetID = sprite._assetID; + // @ts-ignore + schemaResourceManager.maxId = Math.max(assetID, schemaResourceManager.maxId); + // @ts-ignore + schemaResourceManager.resourceMap[assetID] = spriteResource; + // @ts-ignore + schemaResourceManager.resourceIdMap.set(spriteResource, "" + assetID); + } + resolve(this); + }); + } else { + if (!SpriteAtlasResource.defaultAtlas) { + SpriteAtlasResource.defaultAtlas = new SpriteAtlas(resourceManager.engine); + } + this._resource = SpriteAtlasResource.defaultAtlas; + resolve(this); + } + }); + } + + setMeta() { + if (this.resource) { + this.meta.name = this.resource.name; + } + } + + getProps() { + const result = {}; + const props = getAllGetters(this.resource); + props.forEach((prop) => (result[prop] = this.resource[prop])); + return result; + } + + update() {} +} diff --git a/packages/loader/src/scene-loader/resources/SpriteResource.ts b/packages/loader/src/scene-loader/resources/SpriteResource.ts index eb0a3596e9..915f5216a9 100644 --- a/packages/loader/src/scene-loader/resources/SpriteResource.ts +++ b/packages/loader/src/scene-loader/resources/SpriteResource.ts @@ -127,21 +127,22 @@ export class SpriteResource extends SchemaResource { bind() { const resource = this._resource; - Object.keys(this.configProps).forEach((attr) => { - const value = this.configProps[attr]; - if (isAsset(value)) { - const textureResource = this.resourceManager.get(value.id); - if (textureResource && textureResource instanceof TextureResource) { - resource[attr] = textureResource.resource; - this._attachedResources.push(textureResource); + this.configProps && + Object.keys(this.configProps).forEach((attr) => { + const value = this.configProps[attr]; + if (isAsset(value)) { + const textureResource = this.resourceManager.get(value.id); + if (textureResource && textureResource instanceof TextureResource) { + resource[attr] = textureResource.resource; + this._attachedResources.push(textureResource); + } else { + resource[attr] = null; + Logger.warn(`SpriteResource: ${this.meta.name} can't find asset "${attr}", which id is: ${value.id}`); + } } else { - resource[attr] = null; - Logger.warn(`SpriteResource: ${this.meta.name} can't find asset "${attr}", which id is: ${value.id}`); + resource[attr] = value; } - } else { - resource[attr] = value; - } - }); + }); } }