openfl
Version:
A fast, productive library for 2D cross-platform development.
435 lines (418 loc) • 19.4 kB
JavaScript
// Class: openfl.display._internal.Context3DTilemap
var $global = typeof window != "undefined" ? window : typeof global != "undefined" ? global : typeof self != "undefined" ? self : this
$global.Object.defineProperty(exports, "__esModule", {value: true});
var __map_reserved = {};
// Imports
var $hxClasses = require("./../../../hxClasses_stub").default;
var $hxEnums = require("./../../../hxEnums_stub").default;
var $import = require("./../../../import_stub").default;
function openfl_geom_Rectangle() {return require("./../../../openfl/geom/Rectangle");}
function openfl_geom_Matrix() {return require("./../../../openfl/geom/Matrix");}
function openfl_geom_ColorTransform() {return require("./../../../openfl/geom/ColorTransform");}
function Std() {return require("./../../../Std");}
function openfl_display__$internal_Context3DBitmap() {return require("./../../../openfl/display/_internal/Context3DBitmap");}
function openfl_display__$internal_Context3DDisplayObject() {return require("./../../../openfl/display/_internal/Context3DDisplayObject");}
function openfl_display__$internal_Context3DBuffer() {return require("./../../../openfl/display/_internal/Context3DBuffer");}
function openfl_display__$internal_Context3DElementType() {return require("./../../../openfl/display/_internal/Context3DElementType");}
// Constructor
var Context3DTilemap = function(){}
// Meta
Context3DTilemap.__name__ = "openfl.display._internal.Context3DTilemap";
Context3DTilemap.__isInterface__ = false;
Context3DTilemap.prototype = {
};
Context3DTilemap.prototype.__class__ = Context3DTilemap.prototype.constructor = $hxClasses["openfl.display._internal.Context3DTilemap"] = Context3DTilemap;
// Init
// Statics
Context3DTilemap.buildBuffer = function(tilemap,renderer) {
if(!tilemap.__renderable || tilemap.__group.__tiles.length == 0 || tilemap.__worldAlpha <= 0) {
tilemap.__group.__dirty = false;
return;
}
Context3DTilemap.numTiles = 0;
Context3DTilemap.vertexBufferData = tilemap.__buffer != null ? tilemap.__buffer.vertexBufferData : null;
Context3DTilemap.vertexDataPosition = 0;
var rect = (openfl_geom_Rectangle().default).__pool.get();
var matrix = (openfl_geom_Matrix().default).__pool.get();
var parentTransform = (openfl_geom_Matrix().default).__pool.get();
Context3DTilemap.dataPerVertex = 4;
if(tilemap.tileAlphaEnabled) {
Context3DTilemap.dataPerVertex++;
}
if(tilemap.tileColorTransformEnabled) {
Context3DTilemap.dataPerVertex += 8;
}
Context3DTilemap.buildBufferTileContainer(tilemap,tilemap.__group,renderer,parentTransform,tilemap.__tileset,tilemap.tileAlphaEnabled,tilemap.__worldAlpha,tilemap.tileColorTransformEnabled,tilemap.__worldColorTransform,null,rect,matrix);
tilemap.__buffer.flushVertexBufferData();
(openfl_geom_Rectangle().default).__pool.release(rect);
(openfl_geom_Matrix().default).__pool.release(matrix);
(openfl_geom_Matrix().default).__pool.release(parentTransform);
}
Context3DTilemap.buildBufferTileContainer = function(tilemap,group,renderer,parentTransform,defaultTileset,alphaEnabled,worldAlpha,colorTransformEnabled,defaultColorTransform,cacheBitmapData,rect,matrix,isTopLevel) {
if(isTopLevel == null) {
isTopLevel = true;
}
var tileTransform = (openfl_geom_Matrix().default).__pool.get();
var roundPixels = renderer.__roundPixels;
var tiles = group.__tiles;
var length = group.__length;
if(isTopLevel) {
Context3DTilemap.resizeBuffer(tilemap,Context3DTilemap.numTiles + Context3DTilemap.getRecursiveLength(group));
}
var tileset;
var alpha;
var visible;
var colorTransform = null;
var id;
var tileData;
var tileRect;
var bitmapData;
var tileWidth;
var tileHeight;
var uvX;
var uvY;
var uvHeight;
var uvWidth;
var vertexOffset;
var x;
var y;
var x2;
var y2;
var x3;
var y3;
var x4;
var y4;
var alphaPosition = 4;
var ctPosition = alphaEnabled ? 5 : 4;
var _g = 0;
while(_g < tiles.length) {
var tile = tiles[_g];
++_g;
tileTransform.setTo(1,0,0,1,-tile.get_originX(),-tile.get_originY());
tileTransform.concat(tile.get_matrix());
tileTransform.concat(parentTransform);
if(roundPixels) {
tileTransform.tx = Math.round(tileTransform.tx);
tileTransform.ty = Math.round(tileTransform.ty);
}
tileset = tile.get_tileset() != null ? tile.get_tileset() : defaultTileset;
alpha = tile.get_alpha() * worldAlpha;
visible = tile.get_visible();
tile.__dirty = false;
if(!visible || alpha <= 0) {
continue;
}
if(colorTransformEnabled) {
if(tile.get_colorTransform() != null) {
if(defaultColorTransform == null) {
colorTransform = tile.get_colorTransform();
} else {
if(Context3DTilemap.cacheColorTransform == null) {
Context3DTilemap.cacheColorTransform = new (openfl_geom_ColorTransform().default)();
}
colorTransform = Context3DTilemap.cacheColorTransform;
colorTransform.redMultiplier = defaultColorTransform.redMultiplier * tile.get_colorTransform().redMultiplier;
colorTransform.greenMultiplier = defaultColorTransform.greenMultiplier * tile.get_colorTransform().greenMultiplier;
colorTransform.blueMultiplier = defaultColorTransform.blueMultiplier * tile.get_colorTransform().blueMultiplier;
colorTransform.alphaMultiplier = defaultColorTransform.alphaMultiplier * tile.get_colorTransform().alphaMultiplier;
colorTransform.redOffset = defaultColorTransform.redOffset + tile.get_colorTransform().redOffset;
colorTransform.greenOffset = defaultColorTransform.greenOffset + tile.get_colorTransform().greenOffset;
colorTransform.blueOffset = defaultColorTransform.blueOffset + tile.get_colorTransform().blueOffset;
colorTransform.alphaOffset = defaultColorTransform.alphaOffset + tile.get_colorTransform().alphaOffset;
}
} else {
colorTransform = defaultColorTransform;
}
}
if(!alphaEnabled) {
alpha = 1;
}
if(tile.__length > 0) {
Context3DTilemap.buildBufferTileContainer(tilemap,tile,renderer,tileTransform,tileset,alphaEnabled,alpha,colorTransformEnabled,colorTransform,cacheBitmapData,rect,matrix,false);
} else {
if(tileset == null) {
continue;
}
id = tile.get_id();
bitmapData = tileset.__bitmapData;
if(bitmapData == null) {
continue;
}
if(id == -1) {
tileRect = tile.__rect;
if(tileRect == null || tileRect.width <= 0 || tileRect.height <= 0) {
continue;
}
uvX = tileRect.x / bitmapData.width;
uvY = tileRect.y / bitmapData.height;
uvWidth = tileRect.get_right() / bitmapData.width;
uvHeight = tileRect.get_bottom() / bitmapData.height;
} else {
tileData = tileset.__data[id];
if(tileData == null) {
continue;
}
rect.setTo(tileData.x,tileData.y,tileData.width,tileData.height);
tileRect = rect;
uvX = tileData.__uvX;
uvY = tileData.__uvY;
uvWidth = tileData.__uvWidth;
uvHeight = tileData.__uvHeight;
}
tileWidth = tileRect.width;
tileHeight = tileRect.height;
x = tileTransform.__transformX(0,0);
y = tileTransform.__transformY(0,0);
x2 = tileTransform.__transformX(tileWidth,0);
y2 = tileTransform.__transformY(tileWidth,0);
x3 = tileTransform.__transformX(0,tileHeight);
y3 = tileTransform.__transformY(0,tileHeight);
x4 = tileTransform.__transformX(tileWidth,tileHeight);
y4 = tileTransform.__transformY(tileWidth,tileHeight);
vertexOffset = Context3DTilemap.vertexDataPosition;
Context3DTilemap.vertexBufferData[vertexOffset] = x;
Context3DTilemap.vertexBufferData[vertexOffset + 1] = y;
Context3DTilemap.vertexBufferData[vertexOffset + 2] = uvX;
Context3DTilemap.vertexBufferData[vertexOffset + 3] = uvY;
Context3DTilemap.vertexBufferData[vertexOffset + Context3DTilemap.dataPerVertex] = x2;
Context3DTilemap.vertexBufferData[vertexOffset + Context3DTilemap.dataPerVertex + 1] = y2;
Context3DTilemap.vertexBufferData[vertexOffset + Context3DTilemap.dataPerVertex + 2] = uvWidth;
Context3DTilemap.vertexBufferData[vertexOffset + Context3DTilemap.dataPerVertex + 3] = uvY;
Context3DTilemap.vertexBufferData[vertexOffset + Context3DTilemap.dataPerVertex * 2] = x3;
Context3DTilemap.vertexBufferData[vertexOffset + Context3DTilemap.dataPerVertex * 2 + 1] = y3;
Context3DTilemap.vertexBufferData[vertexOffset + Context3DTilemap.dataPerVertex * 2 + 2] = uvX;
Context3DTilemap.vertexBufferData[vertexOffset + Context3DTilemap.dataPerVertex * 2 + 3] = uvHeight;
Context3DTilemap.vertexBufferData[vertexOffset + Context3DTilemap.dataPerVertex * 3] = x4;
Context3DTilemap.vertexBufferData[vertexOffset + Context3DTilemap.dataPerVertex * 3 + 1] = y4;
Context3DTilemap.vertexBufferData[vertexOffset + Context3DTilemap.dataPerVertex * 3 + 2] = uvWidth;
Context3DTilemap.vertexBufferData[vertexOffset + Context3DTilemap.dataPerVertex * 3 + 3] = uvHeight;
if(alphaEnabled) {
Context3DTilemap.vertexBufferData[vertexOffset + Context3DTilemap.dataPerVertex * 0 + alphaPosition] = alpha;
Context3DTilemap.vertexBufferData[vertexOffset + Context3DTilemap.dataPerVertex + alphaPosition] = alpha;
Context3DTilemap.vertexBufferData[vertexOffset + Context3DTilemap.dataPerVertex * 2 + alphaPosition] = alpha;
Context3DTilemap.vertexBufferData[vertexOffset + Context3DTilemap.dataPerVertex * 3 + alphaPosition] = alpha;
}
if(colorTransformEnabled) {
if(colorTransform != null) {
var _g1 = 0;
while(_g1 < 4) {
var i = _g1++;
Context3DTilemap.vertexBufferData[vertexOffset + Context3DTilemap.dataPerVertex * i + ctPosition] = colorTransform.redMultiplier;
Context3DTilemap.vertexBufferData[vertexOffset + Context3DTilemap.dataPerVertex * i + ctPosition + 1] = colorTransform.greenMultiplier;
Context3DTilemap.vertexBufferData[vertexOffset + Context3DTilemap.dataPerVertex * i + ctPosition + 2] = colorTransform.blueMultiplier;
Context3DTilemap.vertexBufferData[vertexOffset + Context3DTilemap.dataPerVertex * i + ctPosition + 3] = colorTransform.alphaMultiplier;
Context3DTilemap.vertexBufferData[vertexOffset + Context3DTilemap.dataPerVertex * i + ctPosition + 4] = colorTransform.redOffset;
Context3DTilemap.vertexBufferData[vertexOffset + Context3DTilemap.dataPerVertex * i + ctPosition + 5] = colorTransform.greenOffset;
Context3DTilemap.vertexBufferData[vertexOffset + Context3DTilemap.dataPerVertex * i + ctPosition + 6] = colorTransform.blueOffset;
Context3DTilemap.vertexBufferData[vertexOffset + Context3DTilemap.dataPerVertex * i + ctPosition + 7] = colorTransform.alphaOffset;
}
} else {
var _g2 = 0;
while(_g2 < 4) {
var i1 = _g2++;
Context3DTilemap.vertexBufferData[vertexOffset + Context3DTilemap.dataPerVertex * i1 + ctPosition] = 1;
Context3DTilemap.vertexBufferData[vertexOffset + Context3DTilemap.dataPerVertex * i1 + ctPosition + 1] = 1;
Context3DTilemap.vertexBufferData[vertexOffset + Context3DTilemap.dataPerVertex * i1 + ctPosition + 2] = 1;
Context3DTilemap.vertexBufferData[vertexOffset + Context3DTilemap.dataPerVertex * i1 + ctPosition + 3] = 1;
Context3DTilemap.vertexBufferData[vertexOffset + Context3DTilemap.dataPerVertex * i1 + ctPosition + 4] = 0;
Context3DTilemap.vertexBufferData[vertexOffset + Context3DTilemap.dataPerVertex * i1 + ctPosition + 5] = 0;
Context3DTilemap.vertexBufferData[vertexOffset + Context3DTilemap.dataPerVertex * i1 + ctPosition + 6] = 0;
Context3DTilemap.vertexBufferData[vertexOffset + Context3DTilemap.dataPerVertex * i1 + ctPosition + 7] = 0;
}
}
}
Context3DTilemap.vertexDataPosition += Context3DTilemap.dataPerVertex * 4;
}
}
group.__dirty = false;
(openfl_geom_Matrix().default).__pool.release(tileTransform);
}
Context3DTilemap.flush = function(tilemap,renderer,blendMode) {
if(Context3DTilemap.currentShader == null) {
Context3DTilemap.currentShader = renderer.__defaultDisplayShader;
}
if(Context3DTilemap.bufferPosition > Context3DTilemap.lastFlushedPosition && Context3DTilemap.currentBitmapData != null && Context3DTilemap.currentShader != null) {
var shader = renderer.__initDisplayShader(Context3DTilemap.currentShader);
renderer.setShader(shader);
renderer.applyBitmapData(Context3DTilemap.currentBitmapData,tilemap.smoothing);
renderer.applyMatrix(renderer.__getMatrix(tilemap.__renderTransform,"auto"));
if(tilemap.tileAlphaEnabled) {
renderer.useAlphaArray();
} else {
renderer.applyAlpha(tilemap.__worldAlpha);
}
if(tilemap.tileBlendModeEnabled) {
renderer.__setBlendMode(blendMode);
}
if(tilemap.tileColorTransformEnabled) {
renderer.applyHasColorTransform(true);
renderer.useColorTransformArray();
} else {
renderer.applyColorTransform(tilemap.__worldColorTransform);
}
renderer.updateShader();
var vertexBuffer = tilemap.__buffer.vertexBuffer;
var vertexBufferPosition = Context3DTilemap.lastFlushedPosition * Context3DTilemap.dataPerVertex * 4;
var length = Context3DTilemap.bufferPosition - Context3DTilemap.lastFlushedPosition;
while(Context3DTilemap.lastFlushedPosition < Context3DTilemap.bufferPosition) {
length = (Std().default).int(Math.min(Context3DTilemap.bufferPosition - Context3DTilemap.lastFlushedPosition,Context3DTilemap.context.__quadIndexBufferElements));
if(length <= 0) {
break;
}
if(shader.__position != null) {
Context3DTilemap.context.setVertexBufferAt(shader.__position.index,vertexBuffer,vertexBufferPosition,"float2");
}
if(shader.__textureCoord != null) {
Context3DTilemap.context.setVertexBufferAt(shader.__textureCoord.index,vertexBuffer,vertexBufferPosition + 2,"float2");
}
if(tilemap.tileAlphaEnabled) {
if(shader.__alpha != null) {
Context3DTilemap.context.setVertexBufferAt(shader.__alpha.index,vertexBuffer,vertexBufferPosition + 4,"float1");
}
}
if(tilemap.tileColorTransformEnabled) {
var position = tilemap.tileAlphaEnabled ? 5 : 4;
if(shader.__colorMultiplier != null) {
Context3DTilemap.context.setVertexBufferAt(shader.__colorMultiplier.index,vertexBuffer,vertexBufferPosition + position,"float4");
}
if(shader.__colorOffset != null) {
Context3DTilemap.context.setVertexBufferAt(shader.__colorOffset.index,vertexBuffer,vertexBufferPosition + position + 4,"float4");
}
}
Context3DTilemap.context.drawTriangles(Context3DTilemap.context.__quadIndexBuffer,0,length * 2);
Context3DTilemap.lastFlushedPosition += length;
}
renderer.__clearShader();
}
Context3DTilemap.lastUsedBitmapData = Context3DTilemap.currentBitmapData;
Context3DTilemap.lastUsedShader = Context3DTilemap.currentShader;
}
Context3DTilemap.getRecursiveLength = function(tileContainer) {
var tiles = tileContainer.__tiles;
var totalLength = 0;
var _g = 0;
while(_g < tiles.length) {
var tile = tiles[_g];
++_g;
if(tile.__length > 0) {
totalLength += Context3DTilemap.getRecursiveLength(tile);
} else {
++totalLength;
}
}
return totalLength;
}
Context3DTilemap.render = function(tilemap,renderer) {
if(!tilemap.__renderable || tilemap.__worldAlpha <= 0) {
return;
}
Context3DTilemap.context = renderer.__context3D;
Context3DTilemap.buildBuffer(tilemap,renderer);
if(Context3DTilemap.numTiles == 0) {
return;
}
Context3DTilemap.bufferPosition = 0;
Context3DTilemap.lastFlushedPosition = 0;
Context3DTilemap.lastUsedBitmapData = null;
Context3DTilemap.lastUsedShader = null;
Context3DTilemap.currentBitmapData = null;
Context3DTilemap.currentShader = null;
Context3DTilemap.currentBlendMode = tilemap.__worldBlendMode;
if(!tilemap.tileBlendModeEnabled) {
renderer.__setBlendMode(Context3DTilemap.currentBlendMode);
}
renderer.__pushMaskObject(tilemap);
var rect = (openfl_geom_Rectangle().default).__pool.get();
rect.setTo(0,0,tilemap.__width,tilemap.__height);
renderer.__pushMaskRect(rect,tilemap.__renderTransform);
Context3DTilemap.renderTileContainer(tilemap,renderer,tilemap.__group,tilemap.__worldShader,tilemap.__tileset,tilemap.__worldAlpha,tilemap.tileBlendModeEnabled,Context3DTilemap.currentBlendMode,null);
Context3DTilemap.flush(tilemap,renderer,Context3DTilemap.currentBlendMode);
renderer.__popMaskRect();
renderer.__popMaskObject(tilemap);
(openfl_geom_Rectangle().default).__pool.release(rect);
}
Context3DTilemap.renderDrawable = function(tilemap,renderer) {
renderer.__updateCacheBitmap(tilemap,false);
if(tilemap.__cacheBitmap != null && !tilemap.__isCacheBitmapRender) {
(openfl_display__$internal_Context3DBitmap().default).render(tilemap.__cacheBitmap,renderer);
} else {
(openfl_display__$internal_Context3DDisplayObject().default).render(tilemap,renderer);
Context3DTilemap.render(tilemap,renderer);
}
renderer.__renderEvent(tilemap);
}
Context3DTilemap.renderDrawableMask = function(tilemap,renderer) {
(openfl_display__$internal_Context3DDisplayObject().default).renderMask(tilemap,renderer);
Context3DTilemap.renderMask(tilemap,renderer);
}
Context3DTilemap.renderTileContainer = function(tilemap,renderer,group,defaultShader,defaultTileset,worldAlpha,blendModeEnabled,defaultBlendMode,cacheBitmapData) {
var tiles = group.__tiles;
var tileset;
var alpha;
var visible;
var blendMode = null;
var id;
var tileData;
var tileRect;
var shader;
var bitmapData;
var _g = 0;
while(_g < tiles.length) {
var tile = tiles[_g];
++_g;
tileset = tile.get_tileset() != null ? tile.get_tileset() : defaultTileset;
alpha = tile.get_alpha() * worldAlpha;
visible = tile.get_visible();
if(!visible || alpha <= 0) {
continue;
}
shader = tile.get_shader() != null ? tile.get_shader() : defaultShader;
if(blendModeEnabled) {
blendMode = tile.__blendMode != null ? tile.__blendMode : defaultBlendMode;
}
if(tile.__length > 0) {
Context3DTilemap.renderTileContainer(tilemap,renderer,tile,shader,tileset,alpha,blendModeEnabled,blendMode,cacheBitmapData);
} else {
if(tileset == null) {
continue;
}
id = tile.get_id();
bitmapData = tileset.__bitmapData;
if(bitmapData == null) {
continue;
}
if(id == -1) {
tileRect = tile.__rect;
if(tileRect == null || tileRect.width <= 0 || tileRect.height <= 0) {
continue;
}
} else {
tileData = tileset.__data[id];
if(tileData == null) {
continue;
}
}
if(shader != Context3DTilemap.currentShader || bitmapData != Context3DTilemap.currentBitmapData && Context3DTilemap.currentBitmapData != null || Context3DTilemap.currentBlendMode != blendMode) {
Context3DTilemap.flush(tilemap,renderer,Context3DTilemap.currentBlendMode);
}
Context3DTilemap.currentBitmapData = bitmapData;
Context3DTilemap.currentShader = shader;
Context3DTilemap.currentBlendMode = blendMode;
Context3DTilemap.bufferPosition++;
}
}
}
Context3DTilemap.renderMask = function(tilemap,renderer) {
}
Context3DTilemap.resizeBuffer = function(tilemap,count) {
Context3DTilemap.numTiles = count;
if(tilemap.__buffer == null) {
tilemap.__buffer = new (openfl_display__$internal_Context3DBuffer().default)(Context3DTilemap.context,(openfl_display__$internal_Context3DElementType().default).QUADS,Context3DTilemap.numTiles,Context3DTilemap.dataPerVertex);
} else {
tilemap.__buffer.resize(Context3DTilemap.numTiles,Context3DTilemap.dataPerVertex);
}
Context3DTilemap.vertexBufferData = tilemap.__buffer.vertexBufferData;
}
Context3DTilemap.__meta__ = { obj : { SuppressWarnings : ["checkstyle:FieldDocComment"]}}
// Export
exports.default = Context3DTilemap;