Project.vue 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. <template>
  2. <div>
  3. <object3d ref="block3d" name="Project" :obj="building" :position="building_position"/>
  4. <mesh ref="label3d" name="Label" :position="label_position">
  5. <geometry type="Plane" :args="[label_size.x, label_size.y]" />
  6. <material type="MeshLambert" :options="label_opts">
  7. <texture :options="label_texture_opts" />
  8. </material>
  9. </mesh>
  10. <div v-if="isOpened">
  11. <ContentBlock
  12. v-for="item in data.visibles"
  13. :key="item.id"
  14. :prtPosition="position"
  15. :prtSize="size"
  16. type="visible"
  17. :data="item"
  18. />
  19. <ContentBlock
  20. v-for="item in data.contexts"
  21. :key="item.id"
  22. :prtPosition="position"
  23. :prtSize="size"
  24. type="context"
  25. :data="item"
  26. />
  27. <ContentBlock
  28. v-for="item in data.processes"
  29. :key="item.id"
  30. :prtPosition="position"
  31. :prtSize="size"
  32. type="process"
  33. :data="item"
  34. />
  35. </div>
  36. </div>
  37. </template>
  38. <script>
  39. import * as THREE from 'three'
  40. // import { toCSG, fromCSG } from 'three-csg'
  41. import { ThreeBSP } from 'three-js-csg-es6'
  42. import mixins from 'components/mixins'
  43. import ContentBlock from 'components/objects/ContentBlock'
  44. export default {
  45. name: 'Project',
  46. components: {
  47. ContentBlock
  48. },
  49. mixins: [mixins],
  50. // props: { size: Object, texture: String, position: Object, color: Number },
  51. props: { data: Object, len: Number, index: Number },
  52. data () {
  53. console.log('Project data() : data', this.data)
  54. // get size and positions from project store
  55. let size = { ...this.data.size }
  56. let position = { ...this.data.position }
  57. let materialOpts = {
  58. color: 0xffffff,
  59. side: THREE.DoubleSide
  60. // wireframe: true,
  61. // transparent: true,
  62. // opacity: 0.6
  63. // renderOrder: 0
  64. }
  65. let material = new THREE.MeshLambertMaterial(materialOpts)
  66. // http://learningthreejs.com/blog/2011/12/10/constructive-solid-geometry-with-csg-js/
  67. console.log('ThreeBSP', ThreeBSP)
  68. let wallW = 0.001
  69. let backGeom = new THREE.BoxGeometry(size.x, size.y, wallW)
  70. let backMesh = new THREE.Mesh(backGeom)
  71. backMesh.position.z = -0.5 * size.z
  72. let backBSP = new ThreeBSP(backMesh)
  73. let rightGeom = new THREE.BoxGeometry(wallW, size.y, size.z)
  74. let rightMesh = new THREE.Mesh(rightGeom)
  75. rightMesh.position.x = 0.5 * size.x
  76. // rightMesh.position.z = 0.5 * size.z
  77. let rightBSP = new ThreeBSP(rightMesh)
  78. let faceGeom = new THREE.BoxGeometry(size.x, size.y, wallW)
  79. let faceMesh = new THREE.Mesh(faceGeom)
  80. faceMesh.position.z = 0.5 * size.z
  81. let faceBSP = new ThreeBSP(faceMesh)
  82. let leftGeom = new THREE.BoxGeometry(wallW, size.y, size.z)
  83. let leftMesh = new THREE.Mesh(leftGeom)
  84. leftMesh.position.x = -0.5 * size.x
  85. // leftMesh.position.z = 0.5 * size.z
  86. let leftBSP = new ThreeBSP(leftMesh)
  87. let buildingBSP = backBSP.union(rightBSP)
  88. buildingBSP = buildingBSP.union(faceBSP)
  89. buildingBSP = buildingBSP.union(leftBSP)
  90. let holeGeom = new THREE.BoxGeometry(1000, 5, 5)
  91. let holeMesh = new THREE.Mesh(holeGeom)
  92. holeMesh.position.y = 50
  93. let holeBSP = new ThreeBSP(holeMesh)
  94. buildingBSP = buildingBSP.subtract(holeBSP)
  95. let building = buildingBSP.toMesh()
  96. building.material = material
  97. // building.geometry.computeVertexNormals()
  98. // let buildingGeom = fromCSG(boxCSG)
  99. // buildingGeom.computeVertexNormals()
  100. // result
  101. // let subtractCSG = boxMeshCSG.subtract(holeMeshCSG)
  102. // let building = fromCSG(boxMeshCSG) // converting CSG back into ThreeJS object
  103. //
  104. let buildingPos = { ...position }
  105. buildingPos.z -= 0.5 * size.z
  106. // building.castShadow = true
  107. // building.receiveShadow = true
  108. return {
  109. block3d: null,
  110. // block_opts: materialOpts,
  111. label3d: null,
  112. label_opts: {
  113. side: THREE.DoubleSide,
  114. // wireframe: false,
  115. transparent: true
  116. // opacity: 0.6
  117. // renderOrder: 0
  118. },
  119. // size and positions are defined in store project
  120. size: size,
  121. position: position,
  122. // geometry: geometry,
  123. building: building,
  124. building_position: buildingPos,
  125. label_position: { x: 0, y: 0, z: 0 },
  126. color: 0xffffff,
  127. label_canvas: null,
  128. label_size: null,
  129. isOpened: false
  130. }
  131. },
  132. computed: {
  133. label_texture_opts () {
  134. return {
  135. canvas: this.label_canvas,
  136. minFilter: THREE.LinearFilter,
  137. wrapS: THREE.ClampToEdgeWrapping,
  138. wrapT: THREE.ClampToEdgeWrapping
  139. }
  140. }
  141. },
  142. created () {
  143. console.log('Project created: data', this, this.data)
  144. this.label_canvas = this.createLabelCanvas(this.data.Titre.replace(/ /g, '\n').toUpperCase(), 48, 21, '#000000')
  145. this.label_position.x = this.position.x - this.size.x / 2 + this.label_size.x / 2 + 1
  146. this.label_position.y = this.position.y + this.size.y / 2 - this.label_size.y / 2 - 1
  147. this.label_position.z = this.position.z + this.size.z / 2 + 0.5
  148. // console.log('this.label_canvas', this.label_canvas)
  149. },
  150. mounted () {
  151. console.log('project mounted', this)
  152. // record self references
  153. this.block3d = this.$refs.block3d.curObj
  154. this.block3d.userData = {
  155. vnode: this
  156. }
  157. this.label3d = this.$refs.label3d.curObj
  158. // light
  159. // console.log('project mounted', this.$env3d)
  160. // var light = new THREE.AmbientLight(0xbf1a1a) // soft white light
  161. // this.$env3d.scene.add(light)
  162. }
  163. // ,
  164. // methods: {
  165. //
  166. // }
  167. }
  168. </script>