UNPKG

io3fix

Version:

toolkit for interior apps

583 lines (511 loc) 18 kB
'use strict'; // dependencies import getSchema from './common/get-schema.js' import getMaterial from './common/get-material.js' import updateSchema from './common/update-schema.js' import generateNormals from '../../../utils/data3d/buffer/get-normals' import generateUvs from '../../../utils/data3d/buffer/get-uvs' import cloneDeep from 'lodash/cloneDeep' export default { schema: getSchema('closet'), init: function () {}, updateSchema: updateSchema, update: function (oldData) { var this_ = this var data = this_.data // remove old mesh this.remove() // get defaults and this.attributes = cloneDeep(data) // get meshes and materials from el3d modules var meshes = this.generateMeshes3d() // clean up empty meshes to prevent errors var meshKeys = Object.keys(meshes) meshKeys.forEach(key => { if (!meshes[key].positions || !meshes[key].positions.length) { // console.warn('no vertices for mesh', key) delete meshes[key] } }) // setup materials // defaults var materials = { closet: 'cabinet_paint_white' } // check for adapted materials var materialKeys = Object.keys(data).filter(function(key) { return key.indexOf('material_') > -1 }) // add materials to instance materialKeys.forEach(function(key) { var mesh = key.replace('material_', '') materials[mesh] = data[key] }) // fetch materials from mat library Object.keys(materials).forEach(mat => { materials[mat] = getMaterial(materials[mat]) }) // construct data3d object var data3d = { meshes: meshes, materials: materials } // create new one this_.mesh = new THREE.Object3D() this_.data3dView = new io3d.aFrame.three.Data3dView({parent: this_.mesh}) // update view this_.data3dView.set(data3d) this_.el.setObject3D('mesh', this_.mesh) // emit event this_.el.emit('mesh-updated'); }, remove: function () { if (this.data3dView) { this.data3dView.destroy() this.data3dView = null } if (this.mesh) { this.el.removeObject3D('mesh') this.mesh = null } }, generateMeshes3d: function () { var a = this.attributes var step = 0, elementNum = Math.round(a.l/0.6), elementLength = a.l/elementNum, handlePos = elementLength*0.8, //handleWidth = a.handleWidth+ a.doorWidth, handleDistance = 0.05, offsetY = -0.01, // internals closetVertices = [], cvPos = 0 //CLOSET DOORS // FRONT VIEW VERTICES // // A------------C // |E\I------G\K| // | | | | // | |M\Q-O\S | | // | || | | | // | |N\R-P\T | | // |F\J------H\L| // B------------D var aX = step, aY = a.h + offsetY, aZ = a.w, bY = 0, cX = step+elementLength, eX = step+a.doorWidth/2, eY = a.h-a.doorWidth, fY = a.baseboard, gX = step+elementLength-a.doorWidth/2, iZ = a.w+a.doorWidth, mX = step+handlePos, mY = 1+a.handleHeight/2, nY = 1-a.handleHeight/2, oX = step+handlePos+a.handleLength, qZ = a.w+a.doorWidth+ a.handleWidth for(var c = 0; c<elementNum; c++){ if(c % 2 == 1 || c===elementNum-1 ){ handlePos = handleDistance + a.handleLength/2 } else{ handlePos = elementLength-handleDistance- a.handleLength/2 } aX = step cX = step+elementLength eX = step+ a.doorWidth/2 gX = step+elementLength- a.doorWidth/2 mX = step+handlePos- a.handleLength/2 oX = step+handlePos+ a.handleLength/2 // DOOR FRAME //A closetVertices[cvPos] = closetVertices[cvPos+9] = aX closetVertices[cvPos+1] = closetVertices[cvPos+10] = aY closetVertices[cvPos+2] = closetVertices[cvPos+11] = aZ //B closetVertices[cvPos+3] = aX closetVertices[cvPos+4] = bY closetVertices[cvPos+5] = aZ //F closetVertices[cvPos+6] = closetVertices[cvPos+12] = eX closetVertices[cvPos+7] = closetVertices[cvPos+13] = fY closetVertices[cvPos+8] = closetVertices[cvPos+14] = aZ //E closetVertices[cvPos+15] = eX closetVertices[cvPos+16] = eY closetVertices[cvPos+17] = aZ cvPos = cvPos+18 //F closetVertices[cvPos] = closetVertices[cvPos+9] = eX closetVertices[cvPos+1] = closetVertices[cvPos+10] = fY closetVertices[cvPos+2] = closetVertices[cvPos+11] = aZ //B closetVertices[cvPos+3] = aX closetVertices[cvPos+4] = bY closetVertices[cvPos+5] = aZ //D closetVertices[cvPos+6] = closetVertices[cvPos+12] = cX closetVertices[cvPos+7] = closetVertices[cvPos+13] = bY closetVertices[cvPos+8] = closetVertices[cvPos+14] = aZ //H closetVertices[cvPos+15] = gX closetVertices[cvPos+16] = fY closetVertices[cvPos+17] = aZ cvPos = cvPos+18 //G closetVertices[cvPos] = closetVertices[cvPos+9] = gX closetVertices[cvPos+1] = closetVertices[cvPos+10] = eY closetVertices[cvPos+2] = closetVertices[cvPos+11] = aZ //H closetVertices[cvPos+3] = gX closetVertices[cvPos+4] = fY closetVertices[cvPos+5] = aZ //D closetVertices[cvPos+6] = closetVertices[cvPos+12] = cX closetVertices[cvPos+7] = closetVertices[cvPos+13] = bY closetVertices[cvPos+8] = closetVertices[cvPos+14] = aZ //C closetVertices[cvPos+15] = cX closetVertices[cvPos+16] = aY closetVertices[cvPos+17] = aZ cvPos = cvPos+18 //A closetVertices[cvPos] = closetVertices[cvPos+9] = aX closetVertices[cvPos+1] = closetVertices[cvPos+10] = aY closetVertices[cvPos+2] = closetVertices[cvPos+11] = aZ //E closetVertices[cvPos+3] = eX closetVertices[cvPos+4] = eY closetVertices[cvPos+5] = aZ //G closetVertices[cvPos+6] = closetVertices[cvPos+12] = gX closetVertices[cvPos+7] = closetVertices[cvPos+13] = eY closetVertices[cvPos+8] = closetVertices[cvPos+14] = aZ //C closetVertices[cvPos+15] = cX closetVertices[cvPos+16] = aY closetVertices[cvPos+17] = aZ cvPos = cvPos+18 // DOOR LEAF //E closetVertices[cvPos] = closetVertices[cvPos+9] = eX closetVertices[cvPos+1] = closetVertices[cvPos+10] = eY closetVertices[cvPos+2] = closetVertices[cvPos+11] = aZ //F closetVertices[cvPos+3] = eX closetVertices[cvPos+4] = fY closetVertices[cvPos+5] = aZ //J closetVertices[cvPos+6] = closetVertices[cvPos+12] = eX closetVertices[cvPos+7] = closetVertices[cvPos+13] = fY closetVertices[cvPos+8] = closetVertices[cvPos+14] = iZ //I closetVertices[cvPos+15] = eX closetVertices[cvPos+16] = eY closetVertices[cvPos+17] = iZ cvPos = cvPos+18 //J closetVertices[cvPos] = closetVertices[cvPos+9] = eX closetVertices[cvPos+1] = closetVertices[cvPos+10] = fY closetVertices[cvPos+2] = closetVertices[cvPos+11] = iZ //F closetVertices[cvPos+3] = eX closetVertices[cvPos+4] = fY closetVertices[cvPos+5] = aZ //H closetVertices[cvPos+6] = closetVertices[cvPos+12] = gX closetVertices[cvPos+7] = closetVertices[cvPos+13] = fY closetVertices[cvPos+8] = closetVertices[cvPos+14] = aZ //L closetVertices[cvPos+15] = gX closetVertices[cvPos+16] = fY closetVertices[cvPos+17] = iZ cvPos = cvPos+18 //K closetVertices[cvPos] = closetVertices[cvPos+9] = gX closetVertices[cvPos+1] = closetVertices[cvPos+10] = eY closetVertices[cvPos+2] = closetVertices[cvPos+11] = iZ //L closetVertices[cvPos+3] = gX closetVertices[cvPos+4] = fY closetVertices[cvPos+5] = iZ //H closetVertices[cvPos+6] = closetVertices[cvPos+12] = gX closetVertices[cvPos+7] = closetVertices[cvPos+13] = fY closetVertices[cvPos+8] = closetVertices[cvPos+14] = aZ //G closetVertices[cvPos+15] = gX closetVertices[cvPos+16] = eY closetVertices[cvPos+17] = aZ cvPos = cvPos+18 //E closetVertices[cvPos] = closetVertices[cvPos+9] = eX closetVertices[cvPos+1] = closetVertices[cvPos+10] = eY closetVertices[cvPos+2] = closetVertices[cvPos+11] = aZ //I closetVertices[cvPos+3] = eX closetVertices[cvPos+4] = eY closetVertices[cvPos+5] = iZ //K closetVertices[cvPos+6] = closetVertices[cvPos+12] = gX closetVertices[cvPos+7] = closetVertices[cvPos+13] = eY closetVertices[cvPos+8] = closetVertices[cvPos+14] = iZ //G closetVertices[cvPos+15] = gX closetVertices[cvPos+16] = eY closetVertices[cvPos+17] = aZ cvPos = cvPos+18 //I closetVertices[cvPos] = closetVertices[cvPos+9] = eX closetVertices[cvPos+1] = closetVertices[cvPos+10] = eY closetVertices[cvPos+2] = closetVertices[cvPos+11] = iZ //J closetVertices[cvPos+3] = eX closetVertices[cvPos+4] = fY closetVertices[cvPos+5] = iZ //N closetVertices[cvPos+6] = closetVertices[cvPos+12] = mX closetVertices[cvPos+7] = closetVertices[cvPos+13] = nY closetVertices[cvPos+8] = closetVertices[cvPos+14] = iZ //M closetVertices[cvPos+15] = mX closetVertices[cvPos+16] = mY closetVertices[cvPos+17] = iZ cvPos = cvPos+18 //N closetVertices[cvPos] = closetVertices[cvPos+9] = mX closetVertices[cvPos+1] = closetVertices[cvPos+10] = nY closetVertices[cvPos+2] = closetVertices[cvPos+11] = iZ //J closetVertices[cvPos+3] = eX closetVertices[cvPos+4] = fY closetVertices[cvPos+5] = iZ //L closetVertices[cvPos+6] = closetVertices[cvPos+12] = gX closetVertices[cvPos+7] = closetVertices[cvPos+13] = fY closetVertices[cvPos+8] = closetVertices[cvPos+14] = iZ //P closetVertices[cvPos+15] = oX closetVertices[cvPos+16] = nY closetVertices[cvPos+17] = iZ cvPos = cvPos+18 //O closetVertices[cvPos] = closetVertices[cvPos+9] = oX closetVertices[cvPos+1] = closetVertices[cvPos+10] = mY closetVertices[cvPos+2] = closetVertices[cvPos+11] = iZ //P closetVertices[cvPos+3] = oX closetVertices[cvPos+4] = nY closetVertices[cvPos+5] = iZ //L closetVertices[cvPos+6] = closetVertices[cvPos+12] = gX closetVertices[cvPos+7] = closetVertices[cvPos+13] = fY closetVertices[cvPos+8] = closetVertices[cvPos+14] = iZ //K closetVertices[cvPos+15] = gX closetVertices[cvPos+16] = eY closetVertices[cvPos+17] = iZ cvPos = cvPos+18 //I closetVertices[cvPos] = closetVertices[cvPos+9] = eX closetVertices[cvPos+1] = closetVertices[cvPos+10] = eY closetVertices[cvPos+2] = closetVertices[cvPos+11] = iZ //M closetVertices[cvPos+3] = mX closetVertices[cvPos+4] = mY closetVertices[cvPos+5] = iZ //O closetVertices[cvPos+6] = closetVertices[cvPos+12] = oX closetVertices[cvPos+7] = closetVertices[cvPos+13] = mY closetVertices[cvPos+8] = closetVertices[cvPos+14] = iZ //K closetVertices[cvPos+15] = gX closetVertices[cvPos+16] = eY closetVertices[cvPos+17] = iZ cvPos = cvPos+18 // HANDLE if (a.handleWidth >0 ) { // HANDLE SIDES //M closetVertices[cvPos] = closetVertices[cvPos + 9] = mX closetVertices[cvPos + 1] = closetVertices[cvPos + 10] = mY closetVertices[cvPos + 2] = closetVertices[cvPos + 11] = iZ //N closetVertices[cvPos + 3] = mX closetVertices[cvPos + 4] = nY closetVertices[cvPos + 5] = iZ //R closetVertices[cvPos + 6] = closetVertices[cvPos + 12] = mX closetVertices[cvPos + 7] = closetVertices[cvPos + 13] = nY closetVertices[cvPos + 8] = closetVertices[cvPos + 14] = qZ //Q closetVertices[cvPos + 15] = mX closetVertices[cvPos + 16] = mY closetVertices[cvPos + 17] = qZ cvPos = cvPos + 18 //R closetVertices[cvPos] = closetVertices[cvPos + 9] = mX closetVertices[cvPos + 1] = closetVertices[cvPos + 10] = nY closetVertices[cvPos + 2] = closetVertices[cvPos + 11] = qZ //N closetVertices[cvPos + 3] = mX closetVertices[cvPos + 4] = nY closetVertices[cvPos + 5] = iZ //P closetVertices[cvPos + 6] = closetVertices[cvPos + 12] = oX closetVertices[cvPos + 7] = closetVertices[cvPos + 13] = nY closetVertices[cvPos + 8] = closetVertices[cvPos + 14] = iZ //T closetVertices[cvPos + 15] = oX closetVertices[cvPos + 16] = nY closetVertices[cvPos + 17] = qZ cvPos = cvPos + 18 //S closetVertices[cvPos] = closetVertices[cvPos + 9] = oX closetVertices[cvPos + 1] = closetVertices[cvPos + 10] = mY closetVertices[cvPos + 2] = closetVertices[cvPos + 11] = qZ //T closetVertices[cvPos + 3] = oX closetVertices[cvPos + 4] = nY closetVertices[cvPos + 5] = qZ //P closetVertices[cvPos + 6] = closetVertices[cvPos + 12] = oX closetVertices[cvPos + 7] = closetVertices[cvPos + 13] = nY closetVertices[cvPos + 8] = closetVertices[cvPos + 14] = iZ //O closetVertices[cvPos + 15] = oX closetVertices[cvPos + 16] = mY closetVertices[cvPos + 17] = iZ cvPos = cvPos + 18 //M closetVertices[cvPos] = closetVertices[cvPos + 9] = mX closetVertices[cvPos + 1] = closetVertices[cvPos + 10] = mY closetVertices[cvPos + 2] = closetVertices[cvPos + 11] = iZ //Q closetVertices[cvPos + 3] = mX closetVertices[cvPos + 4] = mY closetVertices[cvPos + 5] = qZ //S closetVertices[cvPos + 6] = closetVertices[cvPos + 12] = oX closetVertices[cvPos + 7] = closetVertices[cvPos + 13] = mY closetVertices[cvPos + 8] = closetVertices[cvPos + 14] = qZ //O closetVertices[cvPos + 15] = oX closetVertices[cvPos + 16] = mY closetVertices[cvPos + 17] = iZ cvPos = cvPos + 18 } // HANDLE FRONT //Q closetVertices[cvPos] = closetVertices[cvPos+9] = mX closetVertices[cvPos+1] = closetVertices[cvPos+10] = mY closetVertices[cvPos+2] = closetVertices[cvPos+11] = qZ //R closetVertices[cvPos+3] = mX closetVertices[cvPos+4] = nY closetVertices[cvPos+5] = qZ //T closetVertices[cvPos+6] = closetVertices[cvPos+12] = oX closetVertices[cvPos+7] = closetVertices[cvPos+13] = nY closetVertices[cvPos+8] = closetVertices[cvPos+14] = qZ //S closetVertices[cvPos+15] = oX closetVertices[cvPos+16] = mY closetVertices[cvPos+17] = qZ cvPos = cvPos+18 step += elementLength; } //CLOSET BOX // FRONT VIEW VERTICES // // A/E---C/G // | | // | | // | | // B/F---D/H aX = 0 aY = a.h + offsetY aZ = a.w bY = 0 cX = a.l var eZ = 0 //E closetVertices[cvPos] = closetVertices[cvPos+9] = aX closetVertices[cvPos+1] = closetVertices[cvPos+10] = aY closetVertices[cvPos+2] = closetVertices[cvPos+11] = eZ //F closetVertices[cvPos+3] = aX closetVertices[cvPos+4] = bY closetVertices[cvPos+5] = eZ //B closetVertices[cvPos+6] = closetVertices[cvPos+12] = aX closetVertices[cvPos+7] = closetVertices[cvPos+13] = bY closetVertices[cvPos+8] = closetVertices[cvPos+14] = aZ //A closetVertices[cvPos+15] = aX closetVertices[cvPos+16] = aY closetVertices[cvPos+17] = aZ cvPos = cvPos+18 //E closetVertices[cvPos] = closetVertices[cvPos+9] = aX closetVertices[cvPos+1] = closetVertices[cvPos+10] = aY closetVertices[cvPos+2] = closetVertices[cvPos+11] = eZ //A closetVertices[cvPos+3] = aX closetVertices[cvPos+4] = aY closetVertices[cvPos+5] = aZ //C closetVertices[cvPos+6] = closetVertices[cvPos+12] = cX closetVertices[cvPos+7] = closetVertices[cvPos+13] = aY closetVertices[cvPos+8] = closetVertices[cvPos+14] = aZ //G closetVertices[cvPos+15] = cX closetVertices[cvPos+16] = aY closetVertices[cvPos+17] = eZ cvPos = cvPos+18 //C closetVertices[cvPos] = closetVertices[cvPos+9] = cX closetVertices[cvPos+1] = closetVertices[cvPos+10] = aY closetVertices[cvPos+2] = closetVertices[cvPos+11] = aZ //D closetVertices[cvPos+3] = cX closetVertices[cvPos+4] = bY closetVertices[cvPos+5] = aZ //H closetVertices[cvPos+6] = closetVertices[cvPos+12] = cX closetVertices[cvPos+7] = closetVertices[cvPos+13] = bY closetVertices[cvPos+8] = closetVertices[cvPos+14] = eZ //G closetVertices[cvPos+15] = cX closetVertices[cvPos+16] = aY closetVertices[cvPos+17] = eZ cvPos = cvPos+18 //G closetVertices[cvPos] = closetVertices[cvPos+9] = cX closetVertices[cvPos+1] = closetVertices[cvPos+10] = aY closetVertices[cvPos+2] = closetVertices[cvPos+11] = eZ //H closetVertices[cvPos+3] = cX closetVertices[cvPos+4] = bY closetVertices[cvPos+5] = eZ //F closetVertices[cvPos+6] = closetVertices[cvPos+12] = aX closetVertices[cvPos+7] = closetVertices[cvPos+13] = bY closetVertices[cvPos+8] = closetVertices[cvPos+14] = eZ //E closetVertices[cvPos+15] = aX closetVertices[cvPos+16] = aY closetVertices[cvPos+17] = eZ return { closet: { positions: new Float32Array(closetVertices), normals: generateNormals.flat(closetVertices), uvs: generateUvs.architectural(closetVertices), material: 'closet' } } } }