io3fix
Version:
toolkit for interior apps
672 lines (560 loc) • 24.5 kB
JavaScript
'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 cloneDeep from 'lodash/cloneDeep'
export default {
schema: getSchema('window'),
init: function () {
var this_ = this
// listen to wall parent for updated geometry
this.el.parentEl.addEventListener('wall-changed', this.updateFromWall)
// FIXME: check for parent initially - we need to wait till it is available
setTimeout(function() {
this_.updateFromWall()
}, 20)
},
updateFromWall: function(evt) {
// if we have no event yet we need to get the attributes directly
if (!evt) {
var wallAttributes = this.el.parentEl.getAttribute('io3d-wall')
if (wallAttributes) {
// let's make sure we deal with an object
if (typeof wallAttributes === 'string') wallAttributes = AFRAME.utils.styleParser.parse(wallAttributes)
this.wallWidth = wallAttributes.w
this.wallControlLine = wallAttributes.controlLine
}
} else {
this.wallWidth = evt.detail.w
this.wallControlLine = evt.detail.controlLine
}
this.update()
},
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()
// remove glass mesh if needed
var deleteGlass = data.hideGlass === 'true'
if (deleteGlass) delete meshes.glass
// 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 = {
frame: {
colorDiffuse: [0.85, 0.85, 0.85]
},
glass: 'glass'
}
// check for adapted materials
var materialKeys = Object.keys(data).filter(function(key) {
return key.indexOf('material_') > -1
})
// add materials to instance
var props = {}
materialKeys.forEach(function(key) {
props[key] = {
type: 'string'
}
var mesh = key.replace('material_', '')
materials[mesh] = data[key]
})
this_.extendSchema(props)
// 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 () {
this.el.parentEl.removeEventListener('wall-changed', this.updateFromWall)
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 wallWidth = a.w || 0.15
var wallControlLine = 'back'
// get parent wall attributes
if (this.wallWidth || this.wallControlLine) {
wallWidth = this.wallWidth
wallControlLine = this.wallControlLine
}
var wallBackPos = wallControlLine === 'front' ? -wallWidth : wallControlLine === 'center' ? -wallWidth / 2 : 0
var wallFrontPos = wallWidth + wallBackPos
var rowRatios = a.rowRatios
var columnRatios = a.columnRatios
var frameLength = a.frameLength
var frameWidth = a.frameWidth
var framePosition = a.side
// set frame position within wall
var frameBackPos, frameFrontPos
if (framePosition === 'front') frameBackPos = wallFrontPos - frameWidth
else if (framePosition === 'center') frameBackPos = wallBackPos + wallWidth / 2 - frameWidth / 2
else frameBackPos = wallBackPos
frameFrontPos = frameBackPos + frameWidth
// internals
// initial cursor positions (yCursor at the top, xCursor at the left)
var yCursor = a.h
var xCursor = 0
var evenFrameHeight = a.h - frameLength
var evenFrameLength = a.l - frameLength
var rLen = rowRatios.length
var cLen
var rowSegments = 0
var columnSegments = []
var frameFacesCount = rLen * 4 + 18
var glassFacesCount = 0
for (var r = 0; r < rLen; r++) {
rowSegments += rowRatios[ r ]
if (!columnRatios[ r ]) columnRatios[ r ] = [ 1 ]
columnSegments[ r ] = 0
cLen = columnRatios[ r ].length
frameFacesCount += (cLen - 1) * 4 + cLen * 8
glassFacesCount += cLen * 4
for (var c = 0; c < cLen; c++) {
columnSegments[ r ] += columnRatios[ r ][ c ]
}
}
var segmentLength
var segmentHeight = evenFrameHeight / rowSegments
var frameVertices = new Float32Array(frameFacesCount * 9)
var fvPos = 0
var glassVertices = new Float32Array(glassFacesCount * 9)
var gvPos = 0
// iterate
for (var r = 0; r < rLen; r++) {
cLen = columnRatios[ r ].length
segmentLength = evenFrameLength / columnSegments[ r ]
// horizontal bar quad
frameVertices[ fvPos ] = frameLength
frameVertices[ fvPos + 1 ] = yCursor
frameVertices[ fvPos + 2 ] = frameBackPos
frameVertices[ fvPos + 3 ] = evenFrameLength
frameVertices[ fvPos + 4 ] = yCursor - frameLength
frameVertices[ fvPos + 5 ] = frameBackPos
frameVertices[ fvPos + 6 ] = frameLength
frameVertices[ fvPos + 7 ] = yCursor - frameLength
frameVertices[ fvPos + 8 ] = frameBackPos
frameVertices[ fvPos + 9 ] = evenFrameLength
frameVertices[ fvPos + 10 ] = yCursor - frameLength
frameVertices[ fvPos + 11 ] = frameBackPos
frameVertices[ fvPos + 12 ] = frameLength
frameVertices[ fvPos + 13 ] = yCursor
frameVertices[ fvPos + 14 ] = frameBackPos
frameVertices[ fvPos + 15 ] = evenFrameLength
frameVertices[ fvPos + 16 ] = yCursor
frameVertices[ fvPos + 17 ] = frameBackPos
frameVertices[ fvPos + 18 ] = frameLength
frameVertices[ fvPos + 19 ] = yCursor
frameVertices[ fvPos + 20 ] = frameFrontPos
frameVertices[ fvPos + 21 ] = frameLength
frameVertices[ fvPos + 22 ] = yCursor - frameLength
frameVertices[ fvPos + 23 ] = frameFrontPos
frameVertices[ fvPos + 24 ] = evenFrameLength
frameVertices[ fvPos + 25 ] = yCursor - frameLength
frameVertices[ fvPos + 26 ] = frameFrontPos
frameVertices[ fvPos + 27 ] = evenFrameLength
frameVertices[ fvPos + 28 ] = yCursor - frameLength
frameVertices[ fvPos + 29 ] = frameFrontPos
frameVertices[ fvPos + 30 ] = evenFrameLength
frameVertices[ fvPos + 31 ] = yCursor
frameVertices[ fvPos + 32 ] = frameFrontPos
frameVertices[ fvPos + 33 ] = frameLength
frameVertices[ fvPos + 34 ] = yCursor
frameVertices[ fvPos + 35 ] = frameFrontPos
fvPos += 36
yCursor -= frameLength
// vertical bars
for (var c = 0; c < cLen - 1; c++) {
// move xCursor to the right
xCursor += segmentLength * columnRatios[ r ][ c ]
// vertical bar quad
frameVertices[ fvPos ] = xCursor
frameVertices[ fvPos + 1 ] = yCursor
frameVertices[ fvPos + 2 ] = frameBackPos
frameVertices[ fvPos + 3 ] = xCursor + frameLength
frameVertices[ fvPos + 4 ] = yCursor - segmentHeight * rowRatios[ r ] + frameLength
frameVertices[ fvPos + 5 ] = frameBackPos
frameVertices[ fvPos + 6 ] = xCursor
frameVertices[ fvPos + 7 ] = yCursor - segmentHeight * rowRatios[ r ] + frameLength
frameVertices[ fvPos + 8 ] = frameBackPos
frameVertices[ fvPos + 9 ] = xCursor + frameLength
frameVertices[ fvPos + 10 ] = yCursor - segmentHeight * rowRatios[ r ] + frameLength
frameVertices[ fvPos + 11 ] = frameBackPos
frameVertices[ fvPos + 12 ] = xCursor
frameVertices[ fvPos + 13 ] = yCursor
frameVertices[ fvPos + 14 ] = frameBackPos
frameVertices[ fvPos + 15 ] = xCursor + frameLength
frameVertices[ fvPos + 16 ] = yCursor
frameVertices[ fvPos + 17 ] = frameBackPos
frameVertices[ fvPos + 18 ] = xCursor
frameVertices[ fvPos + 19 ] = yCursor
frameVertices[ fvPos + 20 ] = frameFrontPos
frameVertices[ fvPos + 21 ] = xCursor
frameVertices[ fvPos + 22 ] = yCursor - segmentHeight * rowRatios[ r ] + frameLength
frameVertices[ fvPos + 23 ] = frameFrontPos
frameVertices[ fvPos + 24 ] = xCursor + frameLength
frameVertices[ fvPos + 25 ] = yCursor - segmentHeight * rowRatios[ r ] + frameLength
frameVertices[ fvPos + 26 ] = frameFrontPos
frameVertices[ fvPos + 27 ] = xCursor + frameLength
frameVertices[ fvPos + 28 ] = yCursor - segmentHeight * rowRatios[ r ] + frameLength
frameVertices[ fvPos + 29 ] = frameFrontPos
frameVertices[ fvPos + 30 ] = xCursor + frameLength
frameVertices[ fvPos + 31 ] = yCursor
frameVertices[ fvPos + 32 ] = frameFrontPos
frameVertices[ fvPos + 33 ] = xCursor
frameVertices[ fvPos + 34 ] = yCursor
frameVertices[ fvPos + 35 ] = frameFrontPos
fvPos += 36
}
// glass & extrusions
xCursor = 0
for (var c = 0; c < cLen; c++) {
// glass quad
glassVertices[ gvPos ] = xCursor + frameLength
glassVertices[ gvPos + 1 ] = yCursor
glassVertices[ gvPos + 2 ] = frameBackPos
glassVertices[ gvPos + 3 ] = xCursor + frameLength
glassVertices[ gvPos + 4 ] = yCursor - segmentHeight * rowRatios[ r ] + frameLength
glassVertices[ gvPos + 5 ] = frameBackPos
glassVertices[ gvPos + 6 ] = xCursor + segmentLength * columnRatios[ r ][ c ]
glassVertices[ gvPos + 7 ] = yCursor - segmentHeight * rowRatios[ r ] + frameLength
glassVertices[ gvPos + 8 ] = frameBackPos
glassVertices[ gvPos + 9 ] = xCursor + segmentLength * columnRatios[ r ][ c ]
glassVertices[ gvPos + 10 ] = yCursor - segmentHeight * rowRatios[ r ] + frameLength
glassVertices[ gvPos + 11 ] = frameBackPos
glassVertices[ gvPos + 12 ] = xCursor + segmentLength * columnRatios[ r ][ c ]
glassVertices[ gvPos + 13 ] = yCursor
glassVertices[ gvPos + 14 ] = frameBackPos
glassVertices[ gvPos + 15 ] = xCursor + frameLength
glassVertices[ gvPos + 16 ] = yCursor
glassVertices[ gvPos + 17 ] = frameBackPos
gvPos += 18
glassVertices[ gvPos ] = xCursor + frameLength
glassVertices[ gvPos + 1 ] = yCursor
glassVertices[ gvPos + 2 ] = frameBackPos
glassVertices[ gvPos + 3 ] = xCursor + segmentLength * columnRatios[ r ][ c ]
glassVertices[ gvPos + 4 ] = yCursor - segmentHeight * rowRatios[ r ] + frameLength
glassVertices[ gvPos + 5 ] = frameBackPos
glassVertices[ gvPos + 6 ] = xCursor + frameLength
glassVertices[ gvPos + 7 ] = yCursor - segmentHeight * rowRatios[ r ] + frameLength
glassVertices[ gvPos + 8 ] = frameBackPos
glassVertices[ gvPos + 9 ] = xCursor + segmentLength * columnRatios[ r ][ c ]
glassVertices[ gvPos + 10 ] = yCursor - segmentHeight * rowRatios[ r ] + frameLength
glassVertices[ gvPos + 11 ] = frameBackPos
glassVertices[ gvPos + 12 ] = xCursor + frameLength
glassVertices[ gvPos + 13 ] = yCursor
glassVertices[ gvPos + 14 ] = frameBackPos
glassVertices[ gvPos + 15 ] = xCursor + segmentLength * columnRatios[ r ][ c ]
glassVertices[ gvPos + 16 ] = yCursor
glassVertices[ gvPos + 17 ] = frameBackPos
gvPos += 18
// left side extrusion
frameVertices[ fvPos ] = xCursor + frameLength
frameVertices[ fvPos + 1 ] = yCursor
frameVertices[ fvPos + 2 ] = frameBackPos
frameVertices[ fvPos + 3 ] = xCursor + frameLength
frameVertices[ fvPos + 4 ] = yCursor - segmentHeight * rowRatios[ r ] + frameLength
frameVertices[ fvPos + 5 ] = frameFrontPos
frameVertices[ fvPos + 6 ] = xCursor + frameLength
frameVertices[ fvPos + 7 ] = yCursor - segmentHeight * rowRatios[ r ] + frameLength
frameVertices[ fvPos + 8 ] = frameBackPos
frameVertices[ fvPos + 9 ] = xCursor + frameLength
frameVertices[ fvPos + 10 ] = yCursor
frameVertices[ fvPos + 11 ] = frameBackPos
frameVertices[ fvPos + 12 ] = xCursor + frameLength
frameVertices[ fvPos + 13 ] = yCursor
frameVertices[ fvPos + 14 ] = frameFrontPos
frameVertices[ fvPos + 15 ] = xCursor + frameLength
frameVertices[ fvPos + 16 ] = yCursor - segmentHeight * rowRatios[ r ] + frameLength
frameVertices[ fvPos + 17 ] = frameFrontPos
fvPos += 18
// bottom side extrusion
frameVertices[ fvPos ] = xCursor + frameLength
frameVertices[ fvPos + 1 ] = yCursor - segmentHeight * rowRatios[ r ] + frameLength
frameVertices[ fvPos + 2 ] = frameBackPos
frameVertices[ fvPos + 3 ] = xCursor + segmentLength * columnRatios[ r ][ c ]
frameVertices[ fvPos + 4 ] = yCursor - segmentHeight * rowRatios[ r ] + frameLength
frameVertices[ fvPos + 5 ] = frameFrontPos
frameVertices[ fvPos + 6 ] = xCursor + segmentLength * columnRatios[ r ][ c ]
frameVertices[ fvPos + 7 ] = yCursor - segmentHeight * rowRatios[ r ] + frameLength
frameVertices[ fvPos + 8 ] = frameBackPos
frameVertices[ fvPos + 9 ] = xCursor + frameLength
frameVertices[ fvPos + 10 ] = yCursor - segmentHeight * rowRatios[ r ] + frameLength
frameVertices[ fvPos + 11 ] = frameBackPos
frameVertices[ fvPos + 12 ] = xCursor + frameLength
frameVertices[ fvPos + 13 ] = yCursor - segmentHeight * rowRatios[ r ] + frameLength
frameVertices[ fvPos + 14 ] = frameFrontPos
frameVertices[ fvPos + 15 ] = xCursor + segmentLength * columnRatios[ r ][ c ]
frameVertices[ fvPos + 16 ] = yCursor - segmentHeight * rowRatios[ r ] + frameLength
frameVertices[ fvPos + 17 ] = frameFrontPos
fvPos += 18
// top side extrusion
frameVertices[ fvPos ] = xCursor + frameLength
frameVertices[ fvPos + 1 ] = yCursor
frameVertices[ fvPos + 2 ] = frameBackPos
frameVertices[ fvPos + 3 ] = xCursor + segmentLength * columnRatios[ r ][ c ]
frameVertices[ fvPos + 4 ] = yCursor
frameVertices[ fvPos + 5 ] = frameBackPos
frameVertices[ fvPos + 6 ] = xCursor + segmentLength * columnRatios[ r ][ c ]
frameVertices[ fvPos + 7 ] = yCursor
frameVertices[ fvPos + 8 ] = frameFrontPos
frameVertices[ fvPos + 9 ] = xCursor + frameLength
frameVertices[ fvPos + 10 ] = yCursor
frameVertices[ fvPos + 11 ] = frameBackPos
frameVertices[ fvPos + 12 ] = xCursor + segmentLength * columnRatios[ r ][ c ]
frameVertices[ fvPos + 13 ] = yCursor
frameVertices[ fvPos + 14 ] = frameFrontPos
frameVertices[ fvPos + 15 ] = xCursor + frameLength
frameVertices[ fvPos + 16 ] = yCursor
frameVertices[ fvPos + 17 ] = frameFrontPos
fvPos += 18
// move xCursor to the right
xCursor += segmentLength * columnRatios[ r ][ c ]
// right side extrusion
frameVertices[ fvPos ] = xCursor
frameVertices[ fvPos + 1 ] = yCursor
frameVertices[ fvPos + 2 ] = frameBackPos
frameVertices[ fvPos + 3 ] = xCursor
frameVertices[ fvPos + 4 ] = yCursor - segmentHeight * rowRatios[ r ] + frameLength
frameVertices[ fvPos + 5 ] = frameBackPos
frameVertices[ fvPos + 6 ] = xCursor
frameVertices[ fvPos + 7 ] = yCursor - segmentHeight * rowRatios[ r ] + frameLength
frameVertices[ fvPos + 8 ] = frameFrontPos
frameVertices[ fvPos + 9 ] = xCursor
frameVertices[ fvPos + 10 ] = yCursor
frameVertices[ fvPos + 11 ] = frameBackPos
frameVertices[ fvPos + 12 ] = xCursor
frameVertices[ fvPos + 13 ] = yCursor - segmentHeight * rowRatios[ r ] + frameLength
frameVertices[ fvPos + 14 ] = frameFrontPos
frameVertices[ fvPos + 15 ] = xCursor
frameVertices[ fvPos + 16 ] = yCursor
frameVertices[ fvPos + 17 ] = frameFrontPos
fvPos += 18
}
// reset xCursor, move yCursor downwards
xCursor = 0
yCursor -= segmentHeight * rowRatios[ r ] - frameLength
}
// add last horizontal frame bar quad
frameVertices[ fvPos ] = frameLength
frameVertices[ fvPos + 1 ] = yCursor
frameVertices[ fvPos + 2 ] = frameBackPos
frameVertices[ fvPos + 3 ] = evenFrameLength
frameVertices[ fvPos + 4 ] = yCursor - frameLength
frameVertices[ fvPos + 5 ] = frameBackPos
frameVertices[ fvPos + 6 ] = frameLength
frameVertices[ fvPos + 7 ] = yCursor - frameLength
frameVertices[ fvPos + 8 ] = frameBackPos
frameVertices[ fvPos + 9 ] = evenFrameLength
frameVertices[ fvPos + 10 ] = yCursor - frameLength
frameVertices[ fvPos + 11 ] = frameBackPos
frameVertices[ fvPos + 12 ] = frameLength
frameVertices[ fvPos + 13 ] = yCursor
frameVertices[ fvPos + 14 ] = frameBackPos
frameVertices[ fvPos + 15 ] = evenFrameLength
frameVertices[ fvPos + 16 ] = yCursor
frameVertices[ fvPos + 17 ] = frameBackPos
frameVertices[ fvPos + 18 ] = frameLength
frameVertices[ fvPos + 19 ] = yCursor
frameVertices[ fvPos + 20 ] = frameFrontPos
frameVertices[ fvPos + 21 ] = frameLength
frameVertices[ fvPos + 22 ] = yCursor - frameLength
frameVertices[ fvPos + 23 ] = frameFrontPos
frameVertices[ fvPos + 24 ] = evenFrameLength
frameVertices[ fvPos + 25 ] = yCursor - frameLength
frameVertices[ fvPos + 26 ] = frameFrontPos
frameVertices[ fvPos + 27 ] = evenFrameLength
frameVertices[ fvPos + 28 ] = yCursor - frameLength
frameVertices[ fvPos + 29 ] = frameFrontPos
frameVertices[ fvPos + 30 ] = evenFrameLength
frameVertices[ fvPos + 31 ] = yCursor
frameVertices[ fvPos + 32 ] = frameFrontPos
frameVertices[ fvPos + 33 ] = frameLength
frameVertices[ fvPos + 34 ] = yCursor
frameVertices[ fvPos + 35 ] = frameFrontPos
fvPos += 36
// add left frame side quad
frameVertices[ fvPos ] = 0
frameVertices[ fvPos + 1 ] = a.h
frameVertices[ fvPos + 2 ] = frameBackPos
frameVertices[ fvPos + 3 ] = frameLength
frameVertices[ fvPos + 4 ] = 0
frameVertices[ fvPos + 5 ] = frameBackPos
frameVertices[ fvPos + 6 ] = 0
frameVertices[ fvPos + 7 ] = 0
frameVertices[ fvPos + 8 ] = frameBackPos
frameVertices[ fvPos + 9 ] = frameLength
frameVertices[ fvPos + 10 ] = 0
frameVertices[ fvPos + 11 ] = frameBackPos
frameVertices[ fvPos + 12 ] = 0
frameVertices[ fvPos + 13 ] = a.h
frameVertices[ fvPos + 14 ] = frameBackPos
frameVertices[ fvPos + 15 ] = frameLength
frameVertices[ fvPos + 16 ] = a.h
frameVertices[ fvPos + 17 ] = frameBackPos
frameVertices[ fvPos + 18 ] = 0
frameVertices[ fvPos + 19 ] = a.h
frameVertices[ fvPos + 20 ] = frameFrontPos
frameVertices[ fvPos + 21 ] = 0
frameVertices[ fvPos + 22 ] = 0
frameVertices[ fvPos + 23 ] = frameFrontPos
frameVertices[ fvPos + 24 ] = frameLength
frameVertices[ fvPos + 25 ] = 0
frameVertices[ fvPos + 26 ] = frameFrontPos
frameVertices[ fvPos + 27 ] = frameLength
frameVertices[ fvPos + 28 ] = 0
frameVertices[ fvPos + 29 ] = frameFrontPos
frameVertices[ fvPos + 30 ] = frameLength
frameVertices[ fvPos + 31 ] = a.h
frameVertices[ fvPos + 32 ] = frameFrontPos
frameVertices[ fvPos + 33 ] = 0
frameVertices[ fvPos + 34 ] = a.h
frameVertices[ fvPos + 35 ] = frameFrontPos
fvPos += 36
// add right frame side quad
frameVertices[ fvPos ] = evenFrameLength
frameVertices[ fvPos + 1 ] = a.h
frameVertices[ fvPos + 2 ] = frameBackPos
frameVertices[ fvPos + 3 ] = a.l
frameVertices[ fvPos + 4 ] = 0
frameVertices[ fvPos + 5 ] = frameBackPos
frameVertices[ fvPos + 6 ] = evenFrameLength
frameVertices[ fvPos + 7 ] = 0
frameVertices[ fvPos + 8 ] = frameBackPos
frameVertices[ fvPos + 9 ] = a.l
frameVertices[ fvPos + 10 ] = 0
frameVertices[ fvPos + 11 ] = frameBackPos
frameVertices[ fvPos + 12 ] = evenFrameLength
frameVertices[ fvPos + 13 ] = a.h
frameVertices[ fvPos + 14 ] = frameBackPos
frameVertices[ fvPos + 15 ] = a.l
frameVertices[ fvPos + 16 ] = a.h
frameVertices[ fvPos + 17 ] = frameBackPos
frameVertices[ fvPos + 18 ] = evenFrameLength
frameVertices[ fvPos + 19 ] = a.h
frameVertices[ fvPos + 20 ] = frameFrontPos
frameVertices[ fvPos + 21 ] = evenFrameLength
frameVertices[ fvPos + 22 ] = 0
frameVertices[ fvPos + 23 ] = frameFrontPos
frameVertices[ fvPos + 24 ] = a.l
frameVertices[ fvPos + 25 ] = 0
frameVertices[ fvPos + 26 ] = frameFrontPos
frameVertices[ fvPos + 27 ] = a.l
frameVertices[ fvPos + 28 ] = 0
frameVertices[ fvPos + 29 ] = frameFrontPos
frameVertices[ fvPos + 30 ] = a.l
frameVertices[ fvPos + 31 ] = a.h
frameVertices[ fvPos + 32 ] = frameFrontPos
frameVertices[ fvPos + 33 ] = evenFrameLength
frameVertices[ fvPos + 34 ] = a.h
frameVertices[ fvPos + 35 ] = frameFrontPos
fvPos += 36
// add right outer side squad
frameVertices[ fvPos ] = a.l
frameVertices[ fvPos + 1 ] = a.h
frameVertices[ fvPos + 2 ] = frameBackPos
frameVertices[ fvPos + 3 ] = a.l
frameVertices[ fvPos + 4 ] = 0
frameVertices[ fvPos + 5 ] = frameFrontPos
frameVertices[ fvPos + 6 ] = a.l
frameVertices[ fvPos + 7 ] = 0
frameVertices[ fvPos + 8 ] = frameBackPos
frameVertices[ fvPos + 9 ] = a.l
frameVertices[ fvPos + 10 ] = a.h
frameVertices[ fvPos + 11 ] = frameBackPos
frameVertices[ fvPos + 12 ] = a.l
frameVertices[ fvPos + 13 ] = a.h
frameVertices[ fvPos + 14 ] = frameFrontPos
frameVertices[ fvPos + 15 ] = a.l
frameVertices[ fvPos + 16 ] = 0
frameVertices[ fvPos + 17 ] = frameFrontPos
fvPos += 18
// add right outer side squad
frameVertices[ fvPos ] = 0
frameVertices[ fvPos + 1 ] = a.h
frameVertices[ fvPos + 2 ] = frameBackPos
frameVertices[ fvPos + 3 ] = 0
frameVertices[ fvPos + 4 ] = 0
frameVertices[ fvPos + 5 ] = frameBackPos
frameVertices[ fvPos + 6 ] = 0
frameVertices[ fvPos + 7 ] = 0
frameVertices[ fvPos + 8 ] = frameFrontPos
frameVertices[ fvPos + 9 ] = 0
frameVertices[ fvPos + 10 ] = a.h
frameVertices[ fvPos + 11 ] = frameBackPos
frameVertices[ fvPos + 12 ] = 0
frameVertices[ fvPos + 13 ] = 0
frameVertices[ fvPos + 14 ] = frameFrontPos
frameVertices[ fvPos + 15 ] = 0
frameVertices[ fvPos + 16 ] = a.h
frameVertices[ fvPos + 17 ] = frameFrontPos
fvPos += 18
// add top outer side squad
frameVertices[ fvPos ] = 0
frameVertices[ fvPos + 1 ] = a.h
frameVertices[ fvPos + 2 ] = frameBackPos
frameVertices[ fvPos + 3 ] = a.l
frameVertices[ fvPos + 4 ] = a.h
frameVertices[ fvPos + 5 ] = frameFrontPos
frameVertices[ fvPos + 6 ] = a.l
frameVertices[ fvPos + 7 ] = a.h
frameVertices[ fvPos + 8 ] = frameBackPos
frameVertices[ fvPos + 9 ] = a.l
frameVertices[ fvPos + 10 ] = a.h
frameVertices[ fvPos + 11 ] = frameFrontPos
frameVertices[ fvPos + 12 ] = 0
frameVertices[ fvPos + 13 ] = a.h
frameVertices[ fvPos + 14 ] = frameBackPos
frameVertices[ fvPos + 15 ] = 0
frameVertices[ fvPos + 16 ] = a.h
frameVertices[ fvPos + 17 ] = frameFrontPos
// return meshes
return {
frame: {
positions: frameVertices,
normals: generateNormals.flat(frameVertices),
material: 'frame'
},
glass: {
positions: glassVertices,
normals: generateNormals.flat(glassVertices),
material: 'glass'
}
}
}
}