Skip to content

Commit

Permalink
feat:SpriteAtlas Adaptation Editor Workflow (#461)
Browse files Browse the repository at this point in the history
* feat:SpriteAtlas Adaptation Editor Workflow
  • Loading branch information
cptbtptpbcptdtptp authored Aug 31, 2021
1 parent b1ff2ce commit df843e8
Show file tree
Hide file tree
Showing 6 changed files with 89 additions and 17 deletions.
2 changes: 2 additions & 0 deletions packages/core/src/2d/atlas/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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. */
Expand Down
2 changes: 2 additions & 0 deletions packages/core/src/2d/sprite/Sprite.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
12 changes: 8 additions & 4 deletions packages/loader/src/SpriteAtlasLoader.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,12 @@ class SpriteAtlasLoader extends Loader<SpriteAtlas> {
)
).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);
Expand All @@ -51,7 +51,7 @@ class SpriteAtlasLoader extends Loader<SpriteAtlas> {
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,
Expand Down Expand Up @@ -84,7 +84,11 @@ class SpriteAtlasLoader extends Loader<SpriteAtlas> {
offsetBottom * originalHReciprocal
);
}
/** @ts-ignore */
if (id !== undefined) {
// @ts-ignore
sprite._assetID = id;
}
// @ts-ignore
spriteAtlas._addSprite(sprite);
}
}
Expand Down
2 changes: 2 additions & 0 deletions packages/loader/src/scene-loader/ResourceManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import {
AnimatorControllerResource,
AnimationClipResource
} from "./resources";
import { SpriteAtlasResource } from "./resources/SpriteAtlasResource";
import { AssetConfig } from "./types";

export const RESOURCE_CLASS = {
Expand All @@ -30,6 +31,7 @@ export const RESOURCE_CLASS = {
BlinnPhongMaterial: BlinnPhongMaterialResource,
base: BaseResource,
sprite: SpriteResource,
SpriteAtlas: SpriteAtlasResource,
animatorController: AnimatorControllerResource,
animationClip: AnimationClipResource
};
Expand Down
61 changes: 61 additions & 0 deletions packages/loader/src/scene-loader/resources/SpriteAtlasResource.ts
Original file line number Diff line number Diff line change
@@ -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<SpriteAtlasResource> {
return new Promise((resolve) => {
this.setMeta();
if (assetConfig.source) {
resourceManager
.load<SpriteAtlas>({
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() {}
}
27 changes: 14 additions & 13 deletions packages/loader/src/scene-loader/resources/SpriteResource.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
});
});
}
}

Expand Down

0 comments on commit df843e8

Please sign in to comment.