89 lines
3.2 KiB
JavaScript
89 lines
3.2 KiB
JavaScript
import { ExtensionType } from '../../extensions/Extensions.mjs';
|
|
import { Matrix } from '../../maths/matrix/Matrix.mjs';
|
|
import { buildInstructions } from './utils/buildInstructions.mjs';
|
|
import { clearList } from './utils/clearList.mjs';
|
|
import { collectRenderGroups } from './utils/collectRenderGroups.mjs';
|
|
import { executeInstructions } from './utils/executeInstructions.mjs';
|
|
import { updateRenderGroupTransforms } from './utils/updateRenderGroupTransforms.mjs';
|
|
import { validateRenderables } from './utils/validateRenderables.mjs';
|
|
|
|
"use strict";
|
|
const tempMatrix = new 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(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(renderGroup, renderPipes);
|
|
} else {
|
|
clearList(renderGroup.childrenRenderablesToUpdate.list, 0);
|
|
}
|
|
updateRenderGroupTransforms(renderGroup);
|
|
if (renderGroup.structureDidChange) {
|
|
renderGroup.structureDidChange = false;
|
|
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(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: [
|
|
ExtensionType.WebGLSystem,
|
|
ExtensionType.WebGPUSystem,
|
|
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(list, index);
|
|
}
|
|
|
|
export { RenderGroupSystem };
|
|
//# sourceMappingURL=RenderGroupSystem.mjs.map
|