lingo3d
Version:
Lingo3D is a React/Vue 3d game development framework that ships with a complete visual editor
79 lines • 3.2 kB
JavaScript
import { WebGLRenderTarget, NearestFilter, RGBAFormat, LinearEncoding, Scene, Color } from "three";
import { idRenderCheckMap, idRenderCheckModelMap } from "../collections/idCollections";
import { renderCheckExcludeSet } from "../collections/renderCheckExcludeSet";
import { whiteColor } from "../display/utils/reusables";
import scene from "../engine/scene";
import getOcclusionMaterial from "../memo/getOcclusionMaterial";
import { cameraRenderedPtr } from "../pointers/cameraRenderedPtr";
import { rendererPtr } from "../pointers/rendererPtr";
import throttle from "./utils/throttle";
const SIZE = 100;
const renderTarget = new WebGLRenderTarget(SIZE, SIZE, {
minFilter: NearestFilter,
magFilter: NearestFilter,
format: RGBAFormat,
encoding: LinearEncoding
});
const processItem = (object) => {
const { id, material, geometry } = object;
if (renderCheckExcludeSet.has(object) || object.type === "Sprite")
return;
const renderMaterial = getOcclusionMaterial(object);
if (object.type === "Sprite") {
renderMaterial.uniforms.rotation = {
value: material.rotation
};
renderMaterial.uniforms.center = { value: object.center };
}
renderMaterial.uniforms.objectId.value = [
((id >> 24) & 255) / 255,
((id >> 16) & 255) / 255,
((id >> 8) & 255) / 255,
(id & 255) / 255
];
renderMaterial.uniformsNeedUpdate = true;
rendererPtr[0].renderBufferDirect(cameraRenderedPtr[0], emptyScene, geometry, renderMaterial, object, null);
};
const emptyScene = new Scene();
emptyScene.onAfterRender = () => {
const renderList = rendererPtr[0].renderLists.get(scene, 0);
for (const item of renderList.opaque)
processItem(item.object);
for (const item of renderList.transmissive)
processItem(item.object);
for (const item of renderList.transparent)
processItem(item.object);
};
const pixelBuffer = new Uint8Array(4 * SIZE * SIZE);
const currClearColor = new Color();
const idSet = new Set();
const renderedSet = new Set();
export default throttle(() => {
const renderer = rendererPtr[0];
const currRenderTarget = renderer.getRenderTarget();
const currAlpha = renderer.getClearAlpha();
renderer.getClearColor(currClearColor);
renderer.setRenderTarget(renderTarget);
renderer.setClearColor(whiteColor);
renderer.clear();
renderer.render(emptyScene, cameraRenderedPtr[0]);
renderer.readRenderTargetPixels(renderTarget, 0, 0, SIZE, SIZE, pixelBuffer);
renderer.setRenderTarget(currRenderTarget);
renderer.setClearColor(currClearColor, currAlpha);
idSet.clear();
const iMax = SIZE * SIZE * 4;
for (let i = 0; i < iMax; i += 4)
idSet.add((pixelBuffer[i] << 24) +
(pixelBuffer[i + 1] << 16) +
(pixelBuffer[i + 2] << 8) +
pixelBuffer[i + 3]);
renderedSet.clear();
for (const id of idSet) {
const manager = idRenderCheckMap.get(id);
manager && renderedSet.add(manager);
const model = idRenderCheckModelMap.get(id);
model && renderedSet.add(model);
}
return renderedSet;
}, 200);
//# sourceMappingURL=getRendered.js.map