DepthBasicMaterial.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. import * as THREE from "../../../libs/three.js/build/three.module.js";
  2. import {Shaders} from "../../../build/shaders/shaders.js";
  3. import {Features} from "../../Features.js";
  4. export default class DepthBasicMaterial extends THREE.ShaderMaterial{
  5. constructor(o={}){
  6. let {width, height} = viewer.renderer.getSize(new THREE.Vector2());
  7. let uniforms = {
  8. resolution: { type: 'v2', value: new THREE.Vector2(width, height ) },
  9. viewportOffset: { type: 'v2', value: new THREE.Vector2(0, 0 ) }, //left, top
  10. nearPlane: { type: 'f', value: 0.1 },
  11. farPlane: { type: 'f', value: 10000 },
  12. depthTexture: { type: 't', value: null },
  13. opacity: { type: 'f', value: 1 },
  14. map: { type: 't', value: o.map },
  15. baseColor: {type:'v3', value: o.color ? new THREE.Color(o.color) : new THREE.Color("#ffffff")},
  16. backColor: {type:'v3', value: o.backColor ? new THREE.Color(o.backColor) : new THREE.Color("#ddd")},
  17. clipDistance : { type: 'f', value:o.clipDistance || 4}, //消失距离
  18. occlusionDistance : { type: 'f', value: o.occlusionDistance || 1 }, //变为backColor距离
  19. maxClipFactor : { type: 'f', value: o.maxClipFactor || 1 }, //0-1
  20. }
  21. super({
  22. uniforms,
  23. vertexShader: Shaders['depthBasic.vs'],
  24. fragmentShader: Shaders['depthBasic.fs'],
  25. depthWrite: !1,
  26. depthTest: !1,
  27. transparent: o.transparent == void 0 ? true : o.transparent,
  28. side: o.side || 0 /* THREE.DoubleSide */,
  29. })
  30. this.events = {
  31. setSize:(e)=>{//如果出现横条状的异常,往往是viewportOffset出错 //地图不需要
  32. if(!this.useDepth || !e.viewport.camera.isPerspectiveCamera || !e.viewport)return
  33. let viewport = e.viewport
  34. let viewportOffset = viewport.offset || new THREE.Vector2()
  35. this.uniforms.resolution.value.copy(viewport.resolution)
  36. this.uniforms.viewportOffset.value.copy(viewportOffset)
  37. },
  38. render:(e)=>{//before render 如果有大于两个viewport的话,不同viewport用不同的depthTex
  39. this.updateDepthParams(e)
  40. },
  41. cameraChange:(e)=>{
  42. if(e.changeInfo.projectionChanged){//resize时也会触发。虽然保守起见的话加上resize比较好
  43. //console.log('projectionChanged')
  44. this.events.setSize(e)
  45. }
  46. }
  47. }
  48. //-----其他----
  49. if(o.opacity != void 0){
  50. this.opacity = o.opacity
  51. }
  52. this.useDepth = o.useDepth
  53. this.map = o.map
  54. }
  55. get useDepth(){
  56. return this.useDepth_
  57. }
  58. set useDepth(value){//如果不支持 EXT_DEPTH 的话会失效
  59. if(this.useDepth_ != value){
  60. if(value && Features.EXT_DEPTH.isSupported()){
  61. this.defines.useDepth = ''
  62. //viewer.addEventListener('resize', this.events.setSize)
  63. viewer.addEventListener("render.begin", this.events.render)
  64. viewer.addEventListener('camera_changed', this.events.cameraChange)
  65. this.events.setSize( {viewport:viewer.mainViewport} )
  66. this.updateDepthParams()
  67. }else{
  68. delete this.defines.useDepth
  69. //viewer.removeEventListener('resize', this.events.setSize)
  70. viewer.removeEventListener("render.begin", this.events.render)
  71. viewer.removeEventListener('camera_changed', this.events.cameraChange)
  72. }
  73. this.useDepth_ = value
  74. this.needsUpdate = true
  75. }
  76. }
  77. get map(){
  78. return this.uniforms.map.value
  79. }
  80. set map(map){
  81. this.uniforms.map.value = map;
  82. if(map){
  83. this.defines.use_map = ''
  84. }else{
  85. delete this.defines.use_map
  86. }
  87. }
  88. get opacity(){
  89. return this.uniforms.opacity.value
  90. }
  91. set opacity(o){
  92. this.uniforms && (this.uniforms.opacity.value = o)
  93. }
  94. get color(){
  95. return this.uniforms.baseColor.value
  96. }
  97. set color(c){
  98. this.uniforms && (this.uniforms.baseColor.value.set(c))
  99. }
  100. /* dispose(){
  101. super.dispose()
  102. viewer.depthBasic
  103. } */
  104. copy(source){
  105. super.copy(source)
  106. this.useDepth = source.useDepth
  107. this.map = source.map
  108. return this
  109. }
  110. updateDepthParams(e={}){//主要用于点云遮住mesh
  111. var viewport = e.viewport || viewer.mainViewport;
  112. var camera = viewport.camera;
  113. if(this.useDepth && camera.isPerspectiveCamera ){
  114. /* if(Potree.settings.displayMode == 'showPanos' && viewer.images360.currentPano.depthTex){
  115. this.uniforms.depthTexture.value = viewer.images360.currentPano.depthTex
  116. }else{ */
  117. this.uniforms.depthTexture.value = viewer.getPRenderer().getRtEDL(viewport).depthTexture //其实只赋值一次就行
  118. //}
  119. this.uniforms.nearPlane.value = camera.near;
  120. this.uniforms.farPlane.value = camera.far;
  121. }
  122. }
  123. }