| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346 | <template>  <div>    <object3d ref="block3d" name="Project" :obj="building" :position="building_position"/>    <object3d ref="top" :obj="top_mesh" :position="top_position"/>    <object3d ref="floor" :obj="floor_mesh" :position="floor_position"/>    <!-- <light :obj="light" :position="building_position" /> -->    <mesh ref="label3d" name="Label" :position="label_position">      <geometry type="Plane" :args="[label_size.x, label_size.y]" />      <material type="MeshLambert" :options="label_opts">        <texture :options="label_texture_opts" />      </material>    </mesh>    <div v-if="isOpened">      <ContentBlock        v-for="item in data.visibles"        :key="item.id"        :prtPosition="position"        :prtSize="size"        type="visible"        :data="item"        />      <ContentBlock        v-for="item in data.contexts"        :key="item.id"        :prtPosition="position"        :prtSize="size"        type="context"        :data="item"        />      <ContentBlock        v-for="item in data.processes"        :key="item.id"        :prtPosition="position"        :prtSize="size"        type="process"        :data="item"        />      <ContentBlock        v-for="item in data.concepts"        :key="item.id"        :prtPosition="position"        :prtSize="size"        type="concept"        :data="item"        />    </div>  </div></template><script>import * as THREE from 'three'// import { toCSG, fromCSG } from 'three-csg'import { ThreeBSP } from 'three-js-csg-es6'import mixins from 'components/mixins'import ContentBlock from 'components/objects/ContentBlock'// import BgVertex from 'assets/glsl/BgVertex'// import BuildingFragment from 'assets/glsl/BuildingFragment'export default {  name: 'Project',  components: {    ContentBlock  },  mixins: [mixins],  // props: { size: Object, texture: String, position: Object, color: Number },  props: { data: Object, len: Number, index: Number },  data () {    console.log('Project data() : data', this.data)    // get size and positions from project store    let size = { ...this.data.size }    let position = { ...this.data.position }    // http://learningthreejs.com/blog/2011/12/10/constructive-solid-geometry-with-csg-js/    // console.log('ThreeBSP', ThreeBSP)    let wallW = 0.001    let backGeom = new THREE.BoxGeometry(size.x, size.y, wallW)    let backMesh = new THREE.Mesh(backGeom)    backMesh.position.z = -0.5 * size.z    let backBSP = new ThreeBSP(backMesh)    // dig windows on face and back    let winW = 2 + Math.random() * 2    let winH = 4 + Math.random() * 4    let margin = 2    let nbrWinX = 0    let paddingX = 0    let a = 0    // removing windows until padding is enough    while (paddingX < 0.4) {      nbrWinX = Math.floor((size.x - 2 * margin) / winW) - a      paddingX = (size.x - 2 * margin - winW * nbrWinX) / (nbrWinX - 1)      a++    }    // console.log('paddingX', paddingX)    let nbrWinY = 0    let paddingY = 0    a = 0    // removing windows until padding is enough    while (paddingY < 0.4) {      nbrWinY = Math.floor((size.y - 2 * margin) / winH) - a      paddingY = (size.y - 2 * margin - winH * nbrWinY) / (nbrWinY - 1)      a++    }    let winGeom = new THREE.BoxGeometry(winW, winH, wallW)    let winMesh, winBSP    for (var i = 0; i < nbrWinX; i++) {      for (var j = 0; j < nbrWinY; j++) {        // back        winMesh = new THREE.Mesh(winGeom)        winMesh.position.z = -0.5 * size.z        winMesh.position.x = -0.5 * size.x + margin + winW * 0.5 + i * (winW + paddingX)        winMesh.position.y = 0.5 * size.y - margin - winH * 0.5 - j * (winH + paddingY)        winBSP = new ThreeBSP(winMesh)        backBSP = backBSP.subtract(winBSP)      }    }    // let abovewWaterH = position.y + size.y / 2    // let underWaterHThd = (-1 * position.y - size.y / 2) / 3    // let levelH = 4    // let levelGeom = new THREE.BoxGeometry(size.x, levelH, wallW)    // let levelMesh, levelBSP    // for (var l = 0; l < 2; l++) {    //   levelMesh = new THREE.Mesh(levelGeom)    //   levelMesh.position.z = -0.5 * size.z    //   levelMesh.position.y = 0.5 * size.y - abovewWaterH - underWaterHThd - underWaterHThd * l + levelH * 0.5    //   levelBSP = new ThreeBSP(levelMesh)    //   backBSP = backBSP.union(levelBSP)    // }    backMesh = backBSP.toMesh()    let faceMesh = backMesh.clone()    faceMesh.position.z = 0.5 * size.z    let faceBSP = new ThreeBSP(faceMesh)    let rightGeom = new THREE.BoxGeometry(wallW, size.y, size.z)    let rightMesh = new THREE.Mesh(rightGeom)    rightMesh.position.x = 0.5 * size.x    // rightMesh.position.z = 0.5 * size.z    let rightBSP = new ThreeBSP(rightMesh)    // WE MAY NO NEED TO DIG WINDOWS ON SIDE WALLS    // // dig windows on right    // let nbrWinZ = Math.floor((size.z - 2 * margin) / winW)    // let paddingZ = (size.z - 2 * margin - winW * nbrWinZ) / (nbrWinX - 1)    // winGeom = new THREE.BoxGeometry(wallW, winH, winW)    // for (i = 0; i < nbrWinZ; i++) {    //   for (j = 0; j < nbrWinY; j++) {    //     // right    //     winMesh = new THREE.Mesh(winGeom)    //     winMesh.position.x = 0.5 * size.x    //     winMesh.position.z = -0.5 * size.z + margin + winW * 0.5 + i * (winW + paddingZ)    //     winMesh.position.y = 0.5 * size.y - margin - winH * 0.5 - j * (winH + paddingY)    //     winBSP = new ThreeBSP(winMesh)    //     rightBSP = rightBSP.subtract(winBSP)    //   }    // }    // rightMesh = rightBSP.toMesh()    let leftMesh = rightMesh.clone()    leftMesh.position.x = -0.5 * size.x    // leftMesh.position.z = 0.5 * size.z    let leftBSP = new ThreeBSP(leftMesh)    //    // let topGeom = new THREE.BoxGeometry(size.x, wallW, size.z)    // let topMesh = new THREE.Mesh(topGeom)    // // topMesh.position.y = -0.5 * size.y    // // let topBSP = new ThreeBSP(topMesh)    //    // let floorGeom = new THREE.BoxGeometry(size.x, wallW, size.z)    // let floorMesh = new THREE.Mesh(floorGeom)    // // floorMesh.position.y = 0.5 * size.y    // // let floorBSP = new ThreeBSP(floorMesh)    let buildingBSP = backBSP.union(rightBSP)    buildingBSP = buildingBSP.union(faceBSP)    buildingBSP = buildingBSP.union(leftBSP)    // buildingBSP = buildingBSP.union(topBSP)    // buildingBSP = buildingBSP.union(floorBSP)    // convert back to three.js mesh    let building = buildingBSP.toMesh()    console.log('building.faces', building)    // create a custom shaderMaterial to had gradian colors    // var uniforms = THREE.UniformsUtils.merge([    //   THREE.UniformsLib['lights'],    //   {    //     'topColor': { value: new THREE.Color(0xffffff) },    //     'groundColor': { value: new THREE.Color(0xbcd6e4) },    //     'bottomColor': { value: new THREE.Color(0x07223b) },    //     // 'bottomColor': { value: new THREE.Color(0x000000) },    //     // 'groundColor': { value: new THREE.Color(0xff0000) },    //     // 'bottomColor': { value: new THREE.Color(0x00ff00) },    //     lightIntensity: { type: 'f', value: 1.0 }    //   }    // ])    // var buildingMat = new THREE.ShaderMaterial({    //   uniforms: uniforms,    //   vertexShader: BgVertex,    //   fragmentShader: BuildingFragment,    //   side: THREE.DoubleSide,    //   lights: true    // })    // building.material = buildingMat    // create a classical material for building    // let topColor = `hsla(201, 100%, 95%, 1)`    let hTop = Math.round(195 + Math.random() * 10)    let sTop = Math.round(100)    let lTop = Math.round(95)    let hFloor = Math.round(205 + Math.random() * 10)    let sFloor = Math.round(40 + Math.random() * 20)    let lFloor = Math.round(5 + Math.random() * 15)    let topColor = `hsla(${hTop}, ${sTop}%, ${lTop}%, 1)`    let bottomColor = `hsla(${hFloor}, ${sFloor}%, ${lFloor}%, 1)`    let gradientTexture = new THREE.CanvasTexture(this.createGradientCanvas(topColor, bottomColor))    let materialOpts = {      color: 0xffffff,      side: THREE.DoubleSide,      shininess: 30,      map: gradientTexture      // wireframe: true,      // transparent: true,      // opacity: 0.6      // renderOrder: 0    }    building.material = new THREE.MeshPhongMaterial(materialOpts)    // building.castShadow = true    // building.receiveShadow = true    // let buildingGeom = fromCSG(boxCSG)    // buildingGeom.computeVertexNormals()    // result    // let subtractCSG = boxMeshCSG.subtract(holeMeshCSG)    // let building = fromCSG(boxMeshCSG) // converting CSG back into ThreeJS object    //    let buildingPos = { ...position }    buildingPos.z -= 0.5 * size.z    // let light = new THREE.PointLight(0xfcfcf9, 1)    // var sun = new THREE.DirectionalLight(0xfcfcf9, 2)    // sun.position.set(-150, 200, 110)    let topGeom = new THREE.BoxGeometry(size.x, wallW, size.z)    let topOpts = {      color: new THREE.Color(`hsl(${hTop}, ${sTop}%, ${lTop}%)`),      // side: THREE.DoubleSide,      shininess: 30    }    let topMat = new THREE.MeshPhongMaterial(topOpts)    let topMesh = new THREE.Mesh(topGeom, topMat)    let topPosition = { ...position }    topPosition.y += 0.5 * size.y    let floorGeom = new THREE.BoxGeometry(size.x, wallW, size.z)    let floorOpts = {      color: new THREE.Color(`hsl(${hFloor}, ${sFloor}%, ${lFloor}%)`),      // side: THREE.DoubleSide,      shininess: 10    }    let floorMat = new THREE.MeshPhongMaterial(floorOpts)    let floorMesh = new THREE.Mesh(floorGeom, floorMat)    let floorPosition = { ...position }    floorPosition.y -= 0.5 * size.y    return {      block3d: null,      // block_opts: materialOpts,      label3d: null,      label_opts: {        side: THREE.DoubleSide,        // wireframe: false,        transparent: true        // opacity: 0.6        // renderOrder: 0      },      // size and positions are defined in store project      size: size,      position: position,      // geometry: geometry,      // light: light,      building: building,      building_position: buildingPos,      top_mesh: topMesh,      top_position: topPosition,      floor_mesh: floorMesh,      floor_position: floorPosition,      label_position: { x: 0, y: 0, z: 0 },      color: 0xffffff,      label_canvas: null,      label_size: null,      isOpened: false    }  },  computed: {    label_texture_opts () {      return {        canvas: this.label_canvas,        minFilter: THREE.LinearFilter,        wrapS: THREE.ClampToEdgeWrapping,        wrapT: THREE.ClampToEdgeWrapping      }    }  },  created () {    console.log('Project created: data', this, this.data)    this.label_canvas = this.createLabelCanvas(this.data.Titre.replace(/ /g, '\n').toUpperCase(), 48, 21, '#000000', '#ffffff')    this.label_position.x = this.position.x - this.size.x / 2 + this.label_size.x / 2 + 1    this.label_position.y = this.position.y + this.size.y / 2 - this.label_size.y / 2 - 1    this.label_position.z = this.position.z + this.size.z / 2 + 0.5    // console.log('this.label_canvas', this.label_canvas)  },  mounted () {    console.log('project mounted', this)    // record self references    this.block3d = this.$refs.block3d.curObj    // this.block3d.castShadow = true    // this.block3d.receiveShadow = true    this.block3d.userData = {      vnode: this    }    this.label3d = this.$refs.label3d.curObj    // light    // console.log('project mounted', this.$env3d)    // var light = new THREE.AmbientLight(0xbf1a1a) // soft white light    // this.$env3d.scene.add(light)  }  // ,  // methods: {  //  // }}</script>
 |