threepipe
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

GaussianSplatMaterialRaw.ts 2.2KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import {Camera, PerspectiveCamera, ShaderMaterial2, Vector2, WebGLRenderer} from 'threepipe'
  2. import {computeFocalLengths} from './util'
  3. import {gaussianSplatShaders} from '../shaders'
  4. export class GaussianSplatMaterialRaw extends ShaderMaterial2 {
  5. private _currentCamera?: PerspectiveCamera | Camera
  6. private _renderer?: WebGLRenderer
  7. readonly isGaussianSplatMaterialRaw = true
  8. public set minAlpha(value: number) {
  9. this.uniforms.minAlpha.value = value
  10. this.needsUpdate = true
  11. }
  12. constructor() {
  13. super({
  14. uniforms: {
  15. viewport: {value: new Vector2()},
  16. focal: {value: new Vector2()},
  17. minAlpha: {value: 0.02},
  18. },
  19. fragmentShader: `${gaussianSplatShaders.pars_frag}
  20. void main () {
  21. ${gaussianSplatShaders.main_frag}
  22. }`,
  23. vertexShader: `${gaussianSplatShaders.pars_vert}
  24. void main () {
  25. gl_Position = projectionMatrix * modelViewMatrix * vec4(center, 1);
  26. ${gaussianSplatShaders.main_vert}
  27. }`,
  28. depthTest: true,
  29. depthWrite: false,
  30. transparent: true,
  31. }, true)
  32. window.addEventListener('resize', this._refresh)
  33. }
  34. private _refresh = (): void => {
  35. if (!this._currentCamera) return
  36. const size = new Vector2()
  37. this._renderer?.getSize(size)
  38. const width = size.x
  39. const height = size.y
  40. const dpr = this._renderer?.getPixelRatio() || 1
  41. let fov = 75
  42. let aspect = width / height
  43. if (this._currentCamera instanceof PerspectiveCamera) {
  44. fov = this._currentCamera.fov
  45. aspect = this._currentCamera.aspect
  46. }
  47. this.uniforms.focal.value = computeFocalLengths(width, height, fov, aspect, dpr)
  48. this.uniforms.viewport.value = new Vector2(width * dpr, height * dpr)
  49. }
  50. dispose() {
  51. // todo: add again on added to mesh?
  52. window.removeEventListener('resize', this._refresh)
  53. return super.dispose()
  54. }
  55. update(camera: PerspectiveCamera | Camera, renderer: WebGLRenderer): void {
  56. this._renderer = renderer
  57. this._currentCamera = camera
  58. this._refresh()
  59. }
  60. }