Effector.ts 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import { Scene } from '../demo/lmm/core/Scene'
  2. import { Img2D } from '../demo/lmm/objects/Img2D'
  3. import { Vector2 } from '../demo/lmm/math/Vector2'
  4. import { ImagePromise } from '../demo/lmm/objects/ObjectUtils'
  5. /* 图案数据类型 */
  6. type Img2DType = {
  7. src?: string
  8. globalCompositeOperation: GlobalCompositeOperation
  9. }
  10. class Effector {
  11. scene = new Scene()
  12. onMounted(effectDom: HTMLDivElement) {
  13. const {
  14. scene: { canvas },
  15. } = this
  16. const { clientWidth: fx, clientHeight: fy } = effectDom
  17. effectDom.append(canvas)
  18. canvas.width = fx
  19. canvas.height = fy
  20. }
  21. onUnmounted() {
  22. this.scene.canvas.remove()
  23. }
  24. /* 添加图案 */
  25. addImgs(effectImg2DData: Img2DType[], resultCanvas: HTMLCanvasElement) {
  26. const {
  27. scene: {
  28. canvas: { width },
  29. },
  30. scene,
  31. } = this
  32. const pros: Promise<HTMLImageElement>[] = []
  33. effectImg2DData.forEach(({ src, globalCompositeOperation }, index) => {
  34. let image: HTMLImageElement | HTMLCanvasElement = new Image()
  35. if (src) {
  36. image.src = src
  37. pros.push(ImagePromise(image))
  38. } else {
  39. image = resultCanvas
  40. }
  41. scene.add(
  42. new Img2D({
  43. size: new Vector2(width),
  44. offset: new Vector2(-width / 2),
  45. index,
  46. image,
  47. style: { globalCompositeOperation },
  48. })
  49. )
  50. })
  51. /* 渲染 */
  52. Promise.all(pros).then(() => {
  53. scene.render()
  54. })
  55. }
  56. /* 渲染 */
  57. render() {
  58. this.scene.render()
  59. }
  60. }
  61. export { Effector }