91 lines
3.4 KiB
JavaScript
91 lines
3.4 KiB
JavaScript
'use strict';
|
|
|
|
var Extensions = require('../../extensions/Extensions.js');
|
|
var Matrix = require('../../maths/matrix/Matrix.js');
|
|
var buildInstructions = require('./utils/buildInstructions.js');
|
|
var clearList = require('./utils/clearList.js');
|
|
var collectRenderGroups = require('./utils/collectRenderGroups.js');
|
|
var executeInstructions = require('./utils/executeInstructions.js');
|
|
var updateRenderGroupTransforms = require('./utils/updateRenderGroupTransforms.js');
|
|
var validateRenderables = require('./utils/validateRenderables.js');
|
|
|
|
"use strict";
|
|
const tempMatrix = new Matrix.Matrix();
|
|
class RenderGroupSystem {
|
|
constructor(renderer) {
|
|
this._renderer = renderer;
|
|
}
|
|
render({ container, transform }) {
|
|
container.isRenderGroup = true;
|
|
const parent = container.parent;
|
|
const renderGroupParent = container.renderGroup.renderGroupParent;
|
|
container.parent = null;
|
|
container.renderGroup.renderGroupParent = null;
|
|
const renderer = this._renderer;
|
|
const renderGroups = collectRenderGroups.collectRenderGroups(container.renderGroup, []);
|
|
let originalLocalTransform = tempMatrix;
|
|
if (transform) {
|
|
originalLocalTransform = originalLocalTransform.copyFrom(container.renderGroup.localTransform);
|
|
container.renderGroup.localTransform.copyFrom(transform);
|
|
}
|
|
const renderPipes = renderer.renderPipes;
|
|
for (let i = 0; i < renderGroups.length; i++) {
|
|
const renderGroup = renderGroups[i];
|
|
renderGroup.runOnRender();
|
|
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;
|
|
buildInstructions.buildInstructions(renderGroup, renderer);
|
|
} else {
|
|
updateRenderables(renderGroup);
|
|
}
|
|
renderGroup.childrenRenderablesToUpdate.index = 0;
|
|
renderer.renderPipes.batch.upload(renderGroup.instructionSet);
|
|
}
|
|
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;
|
|
}
|
|
}
|
|
/** @ignore */
|
|
RenderGroupSystem.extension = {
|
|
type: [
|
|
Extensions.ExtensionType.WebGLSystem,
|
|
Extensions.ExtensionType.WebGPUSystem,
|
|
Extensions.ExtensionType.CanvasSystem
|
|
],
|
|
name: "renderGroup"
|
|
};
|
|
function 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);
|
|
}
|
|
|
|
exports.RenderGroupSystem = RenderGroupSystem;
|
|
//# sourceMappingURL=RenderGroupSystem.js.map
|