pixi.js
Version:
<p align="center"> <a href="https://pixijs.com" target="_blank" rel="noopener noreferrer"> <img height="150" src="https://files.pixijs.download/branding/pixijs-logo-transparent-dark.svg?v=1" alt="PixiJS logo"> </a> </p> <br/> <p align="center">
154 lines (150 loc) • 6.08 kB
JavaScript
;
var Extensions = require('../../extensions/Extensions.js');
var Matrix = require('../../maths/matrix/Matrix.js');
var TexturePool = require('../../rendering/renderers/shared/texture/TexturePool.js');
var Bounds = require('./bounds/Bounds.js');
var clearList = require('./utils/clearList.js');
var executeInstructions = require('./utils/executeInstructions.js');
var updateRenderGroupTransforms = require('./utils/updateRenderGroupTransforms.js');
var validateRenderables = require('./utils/validateRenderables.js');
;
const tempMatrix = new Matrix.Matrix();
class RenderGroupSystem {
constructor(renderer) {
this._renderer = renderer;
}
render({ container, transform }) {
const parent = container.parent;
const renderGroupParent = container.renderGroup.renderGroupParent;
container.parent = null;
container.renderGroup.renderGroupParent = null;
const renderer = this._renderer;
let originalLocalTransform = tempMatrix;
if (transform) {
originalLocalTransform = originalLocalTransform.copyFrom(container.renderGroup.localTransform);
container.renderGroup.localTransform.copyFrom(transform);
}
const renderPipes = renderer.renderPipes;
this._updateCachedRenderGroups(container.renderGroup, null);
this._updateRenderGroups(container.renderGroup);
renderer.globalUniforms.start({
worldTransformMatrix: transform ? container.renderGroup.localTransform : container.renderGroup.worldTransform,
worldColor: container.renderGroup.worldColorAlpha
});
executeInstructions.executeInstructions(container.renderGroup, renderPipes);
if (renderPipes.uniformBatch) {
renderPipes.uniformBatch.renderEnd();
}
if (transform) {
container.renderGroup.localTransform.copyFrom(originalLocalTransform);
}
container.parent = parent;
container.renderGroup.renderGroupParent = renderGroupParent;
}
destroy() {
this._renderer = null;
}
_updateCachedRenderGroups(renderGroup, closestCacheAsTexture) {
if (renderGroup.isCachedAsTexture) {
if (!renderGroup.updateCacheTexture)
return;
closestCacheAsTexture = renderGroup;
}
renderGroup._parentCacheAsTextureRenderGroup = closestCacheAsTexture;
for (let i = renderGroup.renderGroupChildren.length - 1; i >= 0; i--) {
this._updateCachedRenderGroups(renderGroup.renderGroupChildren[i], closestCacheAsTexture);
}
renderGroup.invalidateMatrices();
if (renderGroup.isCachedAsTexture) {
if (renderGroup.textureNeedsUpdate) {
const bounds = renderGroup.root.getLocalBounds();
bounds.ceil();
const lastTexture = renderGroup.texture;
if (renderGroup.texture) {
TexturePool.TexturePool.returnTexture(renderGroup.texture);
}
const renderer = this._renderer;
const resolution = renderGroup.textureOptions.resolution || renderer.view.resolution;
const antialias = renderGroup.textureOptions.antialias ?? renderer.view.antialias;
renderGroup.texture = TexturePool.TexturePool.getOptimalTexture(
bounds.width,
bounds.height,
resolution,
antialias
);
renderGroup._textureBounds || (renderGroup._textureBounds = new Bounds.Bounds());
renderGroup._textureBounds.copyFrom(bounds);
if (lastTexture !== renderGroup.texture) {
if (renderGroup.renderGroupParent) {
renderGroup.renderGroupParent.structureDidChange = true;
}
}
}
} else if (renderGroup.texture) {
TexturePool.TexturePool.returnTexture(renderGroup.texture);
renderGroup.texture = null;
}
}
_updateRenderGroups(renderGroup) {
const renderer = this._renderer;
const renderPipes = renderer.renderPipes;
renderGroup.runOnRender(renderer);
renderGroup.instructionSet.renderPipes = renderPipes;
if (!renderGroup.structureDidChange) {
validateRenderables.validateRenderables(renderGroup, renderPipes);
} else {
clearList.clearList(renderGroup.childrenRenderablesToUpdate.list, 0);
}
updateRenderGroupTransforms.updateRenderGroupTransforms(renderGroup);
if (renderGroup.structureDidChange) {
renderGroup.structureDidChange = false;
this._buildInstructions(renderGroup, renderer);
} else {
this._updateRenderables(renderGroup);
}
renderGroup.childrenRenderablesToUpdate.index = 0;
renderer.renderPipes.batch.upload(renderGroup.instructionSet);
if (renderGroup.isCachedAsTexture && !renderGroup.textureNeedsUpdate)
return;
for (let i = 0; i < renderGroup.renderGroupChildren.length; i++) {
this._updateRenderGroups(renderGroup.renderGroupChildren[i]);
}
}
_updateRenderables(renderGroup) {
const { list, index } = renderGroup.childrenRenderablesToUpdate;
for (let i = 0; i < index; i++) {
const container = list[i];
if (container.didViewUpdate) {
renderGroup.updateRenderable(container);
}
}
clearList.clearList(list, index);
}
_buildInstructions(renderGroup, rendererOrPipes) {
const root = renderGroup.root;
const instructionSet = renderGroup.instructionSet;
instructionSet.reset();
const renderer = rendererOrPipes.renderPipes ? rendererOrPipes : rendererOrPipes.batch.renderer;
const renderPipes = renderer.renderPipes;
renderPipes.batch.buildStart(instructionSet);
renderPipes.blendMode.buildStart();
renderPipes.colorMask.buildStart();
if (root.sortableChildren) {
root.sortChildren();
}
root.collectRenderablesWithEffects(instructionSet, renderer, null);
renderPipes.batch.buildEnd(instructionSet);
renderPipes.blendMode.buildEnd(instructionSet);
}
}
/** @ignore */
RenderGroupSystem.extension = {
type: [
Extensions.ExtensionType.WebGLSystem,
Extensions.ExtensionType.WebGPUSystem,
Extensions.ExtensionType.CanvasSystem
],
name: "renderGroup"
};
exports.RenderGroupSystem = RenderGroupSystem;
//# sourceMappingURL=RenderGroupSystem.js.map