equirectangularCapture.js 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import { ReflectionProbe } from "../Probes/reflectionProbe.js";
  2. import { RenderTargetTexture } from "../Materials/Textures/renderTargetTexture.js";
  3. import { CustomProceduralTexture } from "../Materials/Textures/Procedurals/customProceduralTexture.js";
  4. import { DumpTools } from "./dumpTools.js";
  5. import "../Shaders/equirectangularPanorama.fragment.js";
  6. /**
  7. * @param scene This refers to the scene which would be rendered in the given equirectangular capture
  8. * @param options This refers to the options for a given equirectangular capture
  9. * @returns the requested capture's pixel-data or auto downloads the file if options.filename is specified
  10. */
  11. export async function captureEquirectangularFromScene(scene, options) {
  12. const probe = options.probe ?? new ReflectionProbe("tempProbe", options.size, scene);
  13. const wasProbeProvided = !!options.probe;
  14. if (!wasProbeProvided) {
  15. if (options.position) {
  16. probe.position = options.position.clone();
  17. }
  18. else if (scene.activeCamera) {
  19. probe.position = scene.activeCamera.position.clone();
  20. }
  21. }
  22. const meshesToConsider = options.meshesFilter ? scene.meshes.filter(options.meshesFilter) : scene.meshes;
  23. probe.renderList?.push(...meshesToConsider);
  24. probe.refreshRate = RenderTargetTexture.REFRESHRATE_RENDER_ONCE;
  25. probe.cubeTexture.render();
  26. const dumpTexture = new CustomProceduralTexture("tempProceduralTexture", "equirectangularPanorama", { width: options.size * 2, height: options.size }, scene);
  27. dumpTexture.setTexture("cubeMap", probe.cubeTexture);
  28. return new Promise((resolve, reject) => {
  29. dumpTexture.onGeneratedObservable.addOnce(() => {
  30. const pixelDataPromise = dumpTexture.readPixels();
  31. if (!pixelDataPromise) {
  32. reject(new Error("No Pixel Data found on procedural texture"));
  33. dumpTexture.dispose();
  34. if (!wasProbeProvided) {
  35. probe.dispose();
  36. }
  37. return;
  38. }
  39. pixelDataPromise.then((pixelData) => {
  40. dumpTexture.dispose();
  41. if (!wasProbeProvided) {
  42. probe.dispose();
  43. }
  44. if (options.filename) {
  45. DumpTools.DumpData(options.size * 2, options.size, pixelData, undefined, "image/png", options.filename);
  46. resolve(null);
  47. }
  48. else {
  49. resolve(pixelData);
  50. }
  51. });
  52. });
  53. });
  54. }
  55. //# sourceMappingURL=equirectangularCapture.js.map