@awayfl/avm1
Version:
Virtual machine for executing AS1 and AS2 code
139 lines (138 loc) • 6.13 kB
JavaScript
import { __extends } from "tslib";
import { BitmapImage2D } from '@awayjs/stage';
import { Timeline, MovieClip, Sprite, DisplayObjectContainer, Billboard, TextField, DefaultSceneGraphFactory, MorphSprite, FrameScriptManager } from '@awayjs/scene';
import { MethodMaterial } from '@awayjs/materials';
import { getAVM1Object } from './lib/AVM1Utils';
import { Graphics } from '@awayjs/graphics';
var AVM1SceneGraphFactory = /** @class */ (function (_super) {
__extends(AVM1SceneGraphFactory, _super);
function AVM1SceneGraphFactory(avm1Context) {
var _this = _super.call(this) || this;
_this.imageStore = {};
_this.avm1Context = avm1Context;
AVM1SceneGraphFactory._instance = _this;
return _this;
}
Object.defineProperty(AVM1SceneGraphFactory, "instance", {
get: function () {
if (!AVM1SceneGraphFactory._instance) {
console.log('Error. A instance of AVM1SceneGraphFactory must be created manually \
before accessing the singleton AVM1SceneGraphFactory._instance');
//AVM1SceneGraphFactory._instance=new AVM1SceneGraphFactory();
}
return AVM1SceneGraphFactory._instance;
},
enumerable: false,
configurable: true
});
AVM1SceneGraphFactory.prototype.createSprite = function (prefab) {
if (prefab === void 0) { prefab = null; }
return new Sprite();
};
AVM1SceneGraphFactory.prototype.createDisplayObjectContainer = function () {
return new DisplayObjectContainer();
};
AVM1SceneGraphFactory.prototype.createMovieClip = function (timeline, symbol) {
if (timeline === void 0) { timeline = null; }
if (symbol === void 0) { symbol = null; }
var awayMovieClip = new MovieClip(timeline || new Timeline(this));
getAVM1Object(awayMovieClip, this.avm1Context);
awayMovieClip._symbol = symbol;
return awayMovieClip;
};
AVM1SceneGraphFactory.prototype.createTextField = function () {
var awayTextfield = new TextField();
awayTextfield.multiline = true;
awayTextfield.wordWrap = true;
getAVM1Object(awayTextfield, this.avm1Context);
return awayTextfield;
};
AVM1SceneGraphFactory.prototype.createBillboard = function (material) {
return null; //new Billboard();
};
AVM1SceneGraphFactory.prototype.createImage2D = function (width, height, transparent, fillColor, powerOfTwo) {
if (transparent === void 0) { transparent = true; }
if (fillColor === void 0) { fillColor = null; }
if (powerOfTwo === void 0) { powerOfTwo = true; }
return new BitmapImage2D(width, height, transparent, fillColor, powerOfTwo);
};
AVM1SceneGraphFactory.prototype.createFrameScripts = function (scripts, frameIdx, objName, objID) {
objName = objName.replace(/[^\w]/g, '');
var outputFrameScripts = [];
for (var i = 0; i < scripts.length; i++) {
var script = scripts[i];
script.data = this.avm1Context.actionsDataFactory.createActionsData(script, 'script_' + name + '_' + objID + '_frame_' + frameIdx + '_idx_' + i);
outputFrameScripts[outputFrameScripts.length] = script;
}
if (outputFrameScripts.length) {
outputFrameScripts.sort(this.compareAVM1FrameScripts);
}
return outputFrameScripts;
};
/**
* Get a instance for a given SymbolID and assign a sessionID to it.
* This is used by timeline to create children
*
* @param symbolID
* @param sessionID
*/
AVM1SceneGraphFactory.prototype.createChildInstanceForTimeline = function (timeline, symbolID, sessionID) {
// if this was called we might have new constructors from timeline to process
FrameScriptManager.invalidAS3Constructors = true;
var asset = this.awaySymbols[symbolID];
var clone;
if (asset.isAsset(Graphics)) {
clone = Sprite.getNewSprite(asset.clone()); //TODO: remove this clone() without the mem leak
clone.mouseEnabled = false;
}
else if (asset.isAsset(Sprite)) {
clone = Sprite.getNewSprite(asset.graphics);
clone.mouseEnabled = false;
}
else if (asset.isAsset(MorphSprite)) {
clone = MorphSprite.getNewMorphSprite(asset.graphics.clone());
clone.mouseEnabled = false;
}
else if (asset.isAsset(BitmapImage2D)) {
// enable blending for symbols, because if you place image directly on stage
// it not enable blend mode
var m = new MethodMaterial(asset);
m.alphaBlending = asset.transparent;
clone = Billboard.getNewBillboard(m);
clone.mouseEnabled = false;
}
else {
clone = asset.adapter.clone(false).adaptee;
}
var placeObjectTag = timeline.placeObjectTagsForSessionIDs[sessionID];
if (placeObjectTag
&& (placeObjectTag.variableName
|| (placeObjectTag.events && placeObjectTag.events.length > 0))) {
clone.adapter.placeObjectTag = placeObjectTag;
clone.adapter.initEvents = placeObjectTag;
}
clone._sessionID = sessionID;
return clone;
};
// this is used for ordering AVM1 Framescripts into correct order
AVM1SceneGraphFactory.prototype.compareAVM1FrameScripts = function (a, b) {
if (!a.precedence) {
return !b.precedence ? 0 : -1;
}
else if (!b.precedence) {
return 1;
}
var i = 0;
while (i < a.precedence.length && i < b.precedence.length && a.precedence[i] === b.precedence[i]) {
i++;
}
if (i >= a.precedence.length) {
return a.precedence.length === b.precedence.length ? 0 : -1;
}
else {
return i >= b.precedence.length ? 1 : a.precedence[i] - b.precedence[i];
}
};
return AVM1SceneGraphFactory;
}(DefaultSceneGraphFactory));
export { AVM1SceneGraphFactory };