threepipe
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

GLTFObject3DExtrasExtension.ts 3.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import type {GLTF, GLTFLoaderPlugin, GLTFParser} from 'three/examples/jsm/loaders/GLTFLoader'
  2. import type {Object3D} from 'three'
  3. import type {GLTFExporterPlugin, GLTFWriter} from 'three/examples/jsm/exporters/GLTFExporter'
  4. export class GLTFObject3DExtrasExtension {
  5. static readonly WebGiObject3DExtrasExtension = 'WEBGI_object3d_extras'
  6. /**
  7. * Also {@link Export}
  8. * @param _
  9. */
  10. static Import = (_: GLTFParser): GLTFLoaderPlugin =>({
  11. name: '__' + this.WebGiObject3DExtrasExtension, // __ is prefix so that the extension is added to userdata, and we can process later in afterRoot
  12. afterRoot: async(result: GLTF) => {
  13. const scenes = result.scenes || (result.scene ? [result.scene] : [])
  14. scenes.forEach(s=>{
  15. s.traverse((o: any)=>{
  16. if (!o.isObject3D) return
  17. const ext = o.userData?.gltfExtensions?.[this.WebGiObject3DExtrasExtension]
  18. if (!ext) {
  19. if (o.isLight && !o.isAmbientLight) o.castShadow = true
  20. return
  21. }
  22. const hasShadowDef = ext.castShadow !== undefined || ext.receiveShadow !== undefined
  23. if (ext.castShadow !== undefined) o.castShadow = ext.castShadow
  24. if (ext.receiveShadow !== undefined) o.receiveShadow = ext.receiveShadow
  25. if (ext.visible !== undefined) o.visible = ext.visible
  26. if (ext.frustumCulled !== undefined) o.frustumCulled = ext.frustumCulled
  27. if (ext.renderOrder !== undefined) o.renderOrder = ext.renderOrder
  28. // if (ext.userData !== undefined) o.userData = ext.userData
  29. if (ext.layers !== undefined) o.layers.mask = ext.layers
  30. if (hasShadowDef) {
  31. o.userData.__keepShadowDef = true
  32. }
  33. delete o.userData.gltfExtensions[this.WebGiObject3DExtrasExtension]
  34. })
  35. })
  36. },
  37. })
  38. /**
  39. * Also {@link Import}
  40. * @param w
  41. * @constructor
  42. */
  43. static Export = (w: GLTFWriter): GLTFExporterPlugin => ({
  44. writeNode: (object: Object3D, nodeDef: any)=>{
  45. if (!object?.isObject3D) return
  46. if (!nodeDef.extensions) nodeDef.extensions = {}
  47. const dat: any = {}
  48. // non-default stuff from ObjectLoader.js
  49. if (object.castShadow !== undefined) dat.castShadow = object.castShadow
  50. if (object.receiveShadow !== undefined) dat.receiveShadow = object.receiveShadow
  51. if (object.visible === false) dat.visible = false
  52. if (object.frustumCulled === false) dat.frustumCulled = false
  53. if (object.renderOrder !== 0) dat.renderOrder = object.renderOrder
  54. if (object.layers.mask !== 1) dat.layers = object.layers.mask
  55. if (object.matrixAutoUpdate === false) dat.matrixAutoUpdate = false
  56. if (Object.keys(dat).length > 0) {
  57. nodeDef.extensions[this.WebGiObject3DExtrasExtension] = dat
  58. w.extensionsUsed[this.WebGiObject3DExtrasExtension] = true
  59. }
  60. },
  61. })
  62. }