DepthBasicMaterial.js 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  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. uUseOrthographicCamera:{ type: "b", value: false },
  11. nearPlane: { type: 'f', value: 0.1 },
  12. farPlane: { type: 'f', value: 10000 },
  13. depthTexture: { type: 't', value: null },
  14. opacity: { type: 'f', value: 1 },
  15. map: { type: 't', value: o.map },
  16. baseColor: {type:'v3', value: o.color ? new THREE.Color(o.color) : new THREE.Color("#ffffff")},
  17. backColor: {type:'v3', value: o.backColor ? new THREE.Color(o.backColor) : new THREE.Color("#ddd")},
  18. clipDistance : { type: 'f', value: o.clipDistance || 4 }, //消失距离
  19. occlusionDistance : { type: 'f', value: o.occlusionDistance || 1 }, //变为backColor距离
  20. maxClipFactor : { type: 'f', value: o.maxClipFactor || 1 }, //0-1
  21. maxOcclusionFactor : { type: 'f', value: o.maxOcclusionFactor || 1 }, //0-1
  22. //-------add:-----
  23. replaceColor : {type:'v3', value: o.replaceColor ? new THREE.Color(o.replaceColor) : null},
  24. beReplacedRed : {type:'f', value: o.beReplacedRed},
  25. mapScale: { type: 'f', value: o.mapScale || 1 }, //0-1
  26. }
  27. super({
  28. uniforms,
  29. vertexShader: Shaders['depthBasic.vs'],
  30. fragmentShader: Shaders['depthBasic.fs'],
  31. depthWrite: false,
  32. depthTest: false,
  33. transparent: o.transparent == void 0 ? true : o.transparent,
  34. side: o.side || 0 /* THREE.DoubleSide */,
  35. })
  36. this.events = {
  37. setSize:(e)=>{//如果出现横条状的异常,往往是viewportOffset出错 //地图不需要
  38. if(!this.realUseDepth || !e.viewport)return
  39. let viewport = e.viewport
  40. let viewportOffset = viewport.offset || new THREE.Vector2()
  41. this.uniforms.resolution.value.copy(viewport.resolution2) //2023.6.12突然发现ratio>1的用resolution不对,得用2才对。但是之前明明记得不是这样
  42. this.uniforms.viewportOffset.value.copy(viewportOffset)
  43. },
  44. render:(e)=>{//before render 如果有大于两个viewport的话,不同viewport用不同的depthTex
  45. this.updateDepthParams(e)
  46. },
  47. /* cameraChange:(e)=>{
  48. if(e.changeInfo.projectionChanged){//resize时也会触发。虽然保守起见的话加上resize比较好//所以当时为何不用resize
  49. //console.log('projectionChanged')
  50. this.events.setSize(e)
  51. }
  52. } */
  53. }
  54. if(o.mapColorReplace){
  55. this.defines.mapColorReplace = ''
  56. }
  57. //-----其他----
  58. this.autoDepthTest = o.autoDepthTest
  59. if(o.opacity != void 0){
  60. this.opacity = o.opacity
  61. }
  62. this.useDepth = o.useDepth
  63. this.map = o.map
  64. }
  65. get useDepth(){
  66. return this.useDepth_
  67. }
  68. set useDepth(value){
  69. value = value && Features.EXT_DEPTH.isSupported() //如果不支持 EXT_DEPTH 的话会失效
  70. if(this.useDepth_ != value){
  71. this.setRealDepth(value)
  72. this.useDepth_ = value
  73. if(value){
  74. viewer.addEventListener("render.begin", this.events.render)
  75. //viewer.addEventListener('camera_changed', this.events.cameraChange)
  76. viewer.addEventListener('resize', this.events.setSize)
  77. this.updateDepthParams()
  78. }else{
  79. viewer.removeEventListener("render.begin", this.events.render)
  80. viewer.removeEventListener('resize', this.events.setSize)
  81. }
  82. }
  83. }
  84. setRealDepth(useDepth, viewport){//确实使用到depthTex
  85. if(this.realUseDepth != useDepth){
  86. if(useDepth ){
  87. this.defines.useDepth = ''
  88. }else{
  89. delete this.defines.useDepth
  90. }
  91. this.realUseDepth = useDepth
  92. if(this.autoDepthTest)this.depthWrite = this.depthTest = !useDepth //如果useDepth = false,使用原始的depthTest
  93. this.needsUpdate = true
  94. if(!viewport)viewport = viewer.mainViewport //暂时这么设置
  95. useDepth && this.events.setSize({viewport})
  96. }
  97. }
  98. get map(){
  99. return this.uniforms.map.value
  100. }
  101. set map(map){
  102. this.uniforms.map.value = map;
  103. if(map){
  104. this.defines.use_map = ''
  105. }else{
  106. delete this.defines.use_map
  107. }
  108. }
  109. get opacity(){
  110. return this.uniforms.opacity.value
  111. }
  112. set opacity(o){
  113. this.uniforms && (this.uniforms.opacity.value = o)
  114. }
  115. get color(){
  116. return this.uniforms.baseColor.value
  117. }
  118. set color(c){
  119. this.uniforms && (this.uniforms.baseColor.value.set(c))
  120. }
  121. /* dispose(){
  122. super.dispose()
  123. viewer.depthBasic
  124. } */
  125. copy(source){
  126. super.copy(source)
  127. this.useDepth = source.useDepth
  128. this.map = source.map
  129. return this
  130. }
  131. updateDepthParams(e={}){//主要用于点云遮住mesh
  132. var viewport = e.viewport || viewer.mainViewport;
  133. var camera = viewport.camera;
  134. /* let hasDepth = this.useDepth &&
  135. (Potree.settings.pointEnableRT || Potree.settings.displayMode == 'showPanos' || viewer.useEDL)
  136. */
  137. //深度图不准确
  138. let hasDepth = this.useDepth && Potree.settings.displayMode == 'showPointCloud' &&
  139. (Potree.settings.pointEnableRT || viewer.useEDL)
  140. this.setRealDepth(hasDepth, viewport)
  141. if(hasDepth){
  142. this.uniforms.depthTexture.value = viewer.getPRenderer().getRtEDL(viewport).depthTexture //其实只赋值一次就行
  143. this.uniforms.nearPlane.value = camera.near;
  144. this.uniforms.farPlane.value = camera.far;
  145. }
  146. this.uniforms.uUseOrthographicCamera.value = !camera.isPerspectiveCamera
  147. }
  148. }