io3fix
Version:
toolkit for interior apps
1,370 lines (1,188 loc) • 75.7 kB
JavaScript
'use strict';
// dependencies
import Promise from 'bluebird'
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 loadData3d from '../../../utils/data3d/load'
import cloneDeep from 'lodash/cloneDeep'
export default {
schema: getSchema('kitchen'),
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)
// setup materials
// defaults
this_.materials = {
kitchen: 'cabinet_paint_white',
counter: 'counter_granite_black',
tab: 'chrome',
oven: 'oven_miele_60-60',
cooktop: 'cooktop_westinghouse_60',
microwave: 'microwave_samsung',
chrome: 'chrome',
black_metal: {
"specularCoef": 24,
"colorDiffuse": [0.02, 0.02, 0.02],
"colorSpecular": [0.7, 0.7, 0.7]
}
}
// get meshes and materials
// promised base because it loads external meshes
this.generateMeshes3d()
.then(function(meshes) {
// clean up empty meshes to prevent errors
var meshKeys = Object.keys(meshes)
meshKeys.forEach(function(key) {
if (!meshes[key].positions || !meshes[key].positions.length) {
// console.warn('no vertices for mesh', key)
delete meshes[key]
}
})
// 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_', '')
this_.materials[mesh] = data[key]
})
// fetch materials from mat library
Object.keys(this_.materials).forEach(function(mat) {
this_.materials[mat] = getMaterial(this_.materials[mat])
})
// construct data3d object
var data3d = {
meshes: meshes,
materials: this_.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
// external meshes
var externalMeshes = {
singleSink: 'https://storage.3d.io/535e624259ee6b0200000484/170429-0355-60hukz/bf4e4a56-ed95-4b58-a214-4b1a0a84ae0e.gz.data3d.buffer',
doubleSink: 'https://storage.3d.io/535e624259ee6b0200000484/170429-2156-7ufbnv/df481313-8fb4-48da-bc28-0369b08a2c6a.gz.data3d.buffer',
gas60: 'https://storage.3d.io/535e624259ee6b0200000484/170428-2318-1ayck9/ece0ead0-d27f-4cf9-b137-2021f25ad4ee.gz.data3d.buffer',
gas90: 'https://storage.3d.io/535e624259ee6b0200000484/170429-0114-jxswhr/523bb9dc-0103-4c93-aba8-ad0882123550.gz.data3d.buffer',
fridge: 'https://storage.3d.io/535e624259ee6b0200000484/170429-1020-5zimgz/4cec6215-9d5c-4f38-b714-e62fdab6d892.gz.data3d.buffer'
}
// internals
var
fridgeHeight = 1.95,
sinkWidth = 0.47,
barCounter = 0.25,
sink = a.sinkType !== 'none',
oven = a.ovenType !== 'none',
cooktop = a.cooktopType !== 'none',
microwave = a.microwave,
largeCooktop = cooktop && a.cooktopType.slice(-2) === '90',
cabinetType = a.cabinetType
// config
var
ovenDistance = 0.02,
extractorHeight = 0.04,
extractorPyramid = largeCooktop ? 0.18 : 0.12,
extractorBottom = a.wallCabinetHeight + 0.1,
extractorWidth = 0.50,
microwaveHeight = 0.33,
ovenHeight = largeCooktop && a.ovenPos === a.cooktopPos ? 0.48 : 0.6,
offsetY = -0.01,
minWallCabinet = 0.3,
cabinetSegments = [
[a.baseBoard, 0.7, 1.9, a.h + offsetY], // 0 High Cabinet
[a.baseBoard, 0.7, 1.30, 1.9, a.h + offsetY], // 1 High Cabinet Oven
[a.baseBoard, 0.4, 0.7, a.counterHeight - a.counterThickness], // 2 Base Cabinet 3 Drawers
[a.baseBoard, 0.7, a.counterHeight - a.counterThickness], // 3 Base Cabinet 2 Drawers
[a.baseBoard, a.counterHeight - a.counterThickness - ovenHeight, a.counterHeight - a.counterThickness], // 4 Base Cabinet Oven
[a.wallCabinetHeight, a.h + offsetY], // 5 Wall Cabinet
[a.wallCabinetHeight, a.wallCabinetHeight + microwaveHeight, a.h + offsetY] , // 6 Wall Cabinet Microwave
[a.baseBoard + fridgeHeight, a.h + offsetY], // 7 High Cabinet Fridge
[a.baseBoard, 0.7, 1.9 - microwaveHeight, 1.9, a.h + offsetY], // 8 High Cabinet Microwave
[a.baseBoard, 0.7, 1.30, 1.9, 1.9 + microwaveHeight, a.h + offsetY], // 9 High Cabinet Oven Microwave
],
elementLength = a.elementLength,
i,
elementNum, elements = []
///////////////////
// INPUT VALIDATION
///////////////////
// prevent invalid input
if (a.highCabinetLeft < 0) a.highCabinetLeft = 0
if (a.highCabinetRight < 0) a.highCabinetRight = 0
if (a.fridgePos <= 0) a.fridgePos = 1
// validate and adapt materials
if (a.ovenPos === a.cooktopPos && typeof this.materials.oven === 'string') {
if (largeCooktop && this.materials.oven.indexOf('_60') > -1) this.materials['oven'] = 'oven_miele_90-48'
if (!largeCooktop && this.materials.oven.indexOf('_90') > -1) this.materials['oven'] = 'oven_miele_60-60'
}
if (typeof this.materials.cooktop === 'string') {
if (largeCooktop && this.materials.cooktop.indexOf('_60') > -1) this.materials['cooktop'] = 'cooktop_westinghouse_90'
if (!largeCooktop && this.materials.cooktop.indexOf('_90') > -1) this.materials['cooktop'] = 'cooktop_westinghouse_60'
}
// prevent bar counter with high cabinets
if ((a.highCabinetLeft || a.highCabinetRight) && a.barCounter) a.barCounter = false
// prevent integrated extractor when there is no wall cabinet
if (!a.wallCabinet && a.extractorType === 'integrated') a.extractorType = 'box'
elementNum = getElCount(a).elementNum
var remainder = getElCount(a).remainder
// check if fridge fits
if (a.fridge && a.highCabinetLeft < a.fridgePos + 1) {
console.log(elementNum - a.highCabinetRight - 1)
if (a.fridgePos < elementNum - a.highCabinetRight - 1 ) a.highCabinetLeft = a.fridgePos + 1
else a.fridgePos = a.highCabinetLeft - 1
}
// convert 90 cooktop to 60 if is space is too small
if (cooktop && a.cooktopPos >= elementNum - a.highCabinetRight && a.cooktopType.slice(-2) === '90') {
console.log('Large cooktop does not fit')
a.cooktopType = a.cooktopType.substring(0, a.cooktopType.length - 2) + '60'
elementNum = getElCount(a).elementNum
remainder = getElCount(a).remainder
}
elements = updatePositions(a, {elementNum: elementNum, remainder: remainder})
// validate positions
var
cLeft = a.highCabinetLeft,
cRight = elementNum - a.highCabinetRight,
baseCabinets = cRight - cLeft - (remainder > 0 ? 1 : 0),
openPositions = []
for (i = cLeft; i < cRight; i++) {
if ((!cooktop || i !== a.cooktopPos - 1) && (!sink || i !== a.sinkPos - 1) && elements[i] >= elementLength) openPositions.push(i)
}
if (!baseCabinets) {
a.sinkType = 'none'
a.cooktopType = 'none'
}
if (a.highCabinetLeft && a.highCabinetRight + a.highCabinetLeft > elementNum) a.highCabinetLeft -= 1
else if (a.highCabinetRight * elementLength > a.l) a.highCabinetRight -= 1
// try to place out of scope elements
if (openPositions.length > 0) {
if (cooktop && a.cooktopPos <= cLeft) a.cooktopPos = openPositions[0] + 1
if (cooktop && a.cooktopPos > cRight) a.cooktopPos = openPositions[openPositions.length - 1] + 1
if (sink && a.sinkPos <= cLeft) a.sinkPos = openPositions[0] + 1
if (sink && a.sinkPos > cRight) a.sinkPos = openPositions[openPositions.length - 1] + 1
}
if (oven && a.ovenType === 'double' && a.ovenPos > cLeft && a.ovenPos < cRight) a.ovenType = 'single'
if (oven && sink && a.ovenPos === a.sinkPos) a.ovenPos -= 1
if (oven && a.ovenPos <= 0) a.ovenPos = cLeft + 1
if (oven && a.ovenPos > elementNum) a.ovenPos = cRight - 1
// prevent placement in small cabinet
if (cooktop && elements[a.cooktopPos - 1] < elementLength) a.cooktopPos -= 1
if (sink && elements[a.sinkPos - 1] < elementLength) a.sinkPos -= 1
if (sink && a.sinkType === 'double' && elements[a.sinkPos] < elementLength) a.sinkType = 'single'
if (oven && elements[a.ovenPos - 1] < elementLength) {
if (a.highCabinetRight > 0) a.ovenPos += 1
else a.ovenPos -=1
}
if (microwave && elements[a.microwavePos - 1] < elementLength) a.microwavePos -= 1
// prevent collision
if (sink && a.sinkType === 'double' && cooktop && a.sinkPos + 1 === a.cooktopPos) a.sinkType = 'single'
if (sink && cooktop && a.sinkPos === a.cooktopPos && openPositions.length > 0) {
if (openPositions.length > 1 && openPositions[openPositions.length - 1] + 1 === a.sinkPos) a.sinkPos = openPositions[0] + 1
else a.sinkPos = openPositions[openPositions.length - 1] + 1
}
// deactivate elements
if (sink && cooktop && a.sinkPos === a.cooktopPos) a.sinkType = 'none'
if (a.sinkPos <= cLeft || a.sinkPos > cRight) a.sinkType = 'none'
if (a.cooktopType <= cLeft || a.cooktopType > cRight) a.cooktopType = 'none'
elements = updatePositions(a, {elementNum: elementNum, remainder: remainder})
// get x coordinate for element index
function getElementPos(pos) {
var l = 0
for (var i = 0; i < pos - 1; i++) { l += elements[i] }
return l
}
sink = a.sinkType !== 'none'
oven = a.ovenType !== 'none'
cooktop = a.cooktopType !== 'none'
var
sinkLength = a.sinkType === 'single' ? 0.54 : 1.16,
sinkOffset = a.sinkType === 'single' ? 0.03 : 0.02,
extractor = a.extractorType !== 'none',
xCursor = 0, xCursorRight = 0,
baseCabinetNum = elementNum - a.highCabinetLeft - a.highCabinetRight,
// internals
k = 0,
kitchenVertices = [],
kvPos = 0,
counterVertices = [],
cvPos = 0,
extractorVertices = [],
evPos = 0,
ovenVertices = [],
ovPos = 0,
ovenUvs = [],
ovUvPos = 0,
cooktopVertices = [],
cooktopUvs = [],
mwVertices = [],
mwUvs = [],
aX,aY,aZ,bY,cX,eX,eY,eZ,fY,gX,iX, iY, iZ, jY, jZ, kX, mX, mY, mZ, nY, nZ, oX, qZ
///////////////////
// GEOMETRY FUNCTIONS
//////////////////
function cabinetDoor(params) {
///////////////////
// CABINET DOORS
//////////////////
var minCabinet = 0.1
var minCabinetFrame = 0.15
var isFlat = cabinetType === 'flat'
// FRONT VIEW VERTICES
//
// A----------C I----------K
// |E\I----G\K| | M------O |
// | | | | | | Q S | |
// | | | | | | R T | |
// |F\J----H\L| | N------P |
// B----------D J----------L
// U----------V
// __
// style 1 _| \__
//
// _ __
// style 2 |_/
var outerZOffset = cabinetType === 'style1' ? 0.01 : cabinetType === 'style2' ? -0.01 : a.doorWidth
var outerOffset = cabinetType === 'style1' ? 0.04 : cabinetType === 'style2' ? 0.005 : 0
var innerZOffset = cabinetType === 'style1' ? -0.01 : cabinetType === 'style2' ? 0.02 : 0
var innerOffset = cabinetType === 'style1' ? 0.015 : cabinetType === 'style2' ? 0.03 : 0
aX = params.aX
aY = params.aY
aZ = params.aZ
bY = params.bY
cX = params.cX
eY = aY - a.doorWidth / 2
iZ = aZ + outerZOffset
fY = bY + a.doorWidth / 2
// prevent messed up polygons
if (aY <= bY || cX <= aX ) return
mX = eX + outerOffset
mY = eY - outerOffset
nY = fY + outerOffset
oX = gX - outerOffset
var qX = mX + innerOffset
var qY = mY - innerOffset
qZ = iZ + innerZOffset
var rY = nY + innerOffset
var sX = oX - innerOffset
// ADD BASEBOARD FOR LOWEST TILE
if (params.i === 0) {
//B
kitchenVertices[kvPos] = kitchenVertices[kvPos + 9] = aX
kitchenVertices[kvPos + 1] = kitchenVertices[kvPos + 10] = a.baseBoard
kitchenVertices[kvPos + 2] = kitchenVertices[kvPos + 11] = aZ
//U
kitchenVertices[kvPos + 3] = aX
kitchenVertices[kvPos + 4] = 0
kitchenVertices[kvPos + 5] = aZ
//V
kitchenVertices[kvPos + 6] = kitchenVertices[kvPos + 12] = cX
kitchenVertices[kvPos + 7] = kitchenVertices[kvPos + 13] = 0
kitchenVertices[kvPos + 8] = kitchenVertices[kvPos + 14] = aZ
//D
kitchenVertices[kvPos + 15] = cX
kitchenVertices[kvPos + 16] = a.baseBoard
kitchenVertices[kvPos + 17] = aZ
kvPos = kvPos + 18
}
// if the gap is too small we'll put a simple placeholder
if (cX - aX < minCabinet || aY - bY < minCabinet) {
// PLACE HOLDER
//A
kitchenVertices[kvPos] = kitchenVertices[kvPos + 9] = aX
kitchenVertices[kvPos + 1] = kitchenVertices[kvPos + 10] = aY
kitchenVertices[kvPos + 2] = kitchenVertices[kvPos + 11] = aZ
//B
kitchenVertices[kvPos + 3] = aX
kitchenVertices[kvPos + 4] = bY
kitchenVertices[kvPos + 5] = aZ
//D
kitchenVertices[kvPos + 6] = kitchenVertices[kvPos + 12] = cX
kitchenVertices[kvPos + 7] = kitchenVertices[kvPos + 13] = bY
kitchenVertices[kvPos + 8] = kitchenVertices[kvPos + 14] = aZ
//C
kitchenVertices[kvPos + 15] = cX
kitchenVertices[kvPos + 16] = aY
kitchenVertices[kvPos + 17] = aZ
kvPos = kvPos + 18
return
}
var showMicroWave = false, showOven = false
if ( microwave && c + 1 === a.microwavePos ) {
if (params.k === 6 && params.i === 0) showMicroWave = true
else if (params.k === 8 && params.i === 2) showMicroWave = true
else if (params.k === 9 && params.i === 3) showMicroWave = true
}
if ( oven && c + 1 === a.ovenPos ) {
if (params.k === 1 && (params.i === 1 || (params.i === 2 && a.ovenType === 'double'))) showOven = true
else if (params.k === 4 || params.k === 9) {
if (params.i === 1 || (params.i === 2 && a.ovenType === 'double')) showOven = true
}
}
// if (oven && c + 1 === a.ovenPos && a.ovenType === 'double') console.log('double oven', params.k, params.i, a.ovenType)
// if (showMicroWave) console.log('showMicroWav', params.k, params.i)
// if (showOven) console.log('showOven', params.k, params.i, a.ovenType)
// DOOR FRAME
//A
kitchenVertices[kvPos] = kitchenVertices[kvPos + 9] = aX
kitchenVertices[kvPos + 1] = kitchenVertices[kvPos + 10] = aY
kitchenVertices[kvPos + 2] = kitchenVertices[kvPos + 11] = aZ
//B
kitchenVertices[kvPos + 3] = aX
kitchenVertices[kvPos + 4] = bY
kitchenVertices[kvPos + 5] = aZ
//F
kitchenVertices[kvPos + 6] = kitchenVertices[kvPos + 12] = eX
kitchenVertices[kvPos + 7] = kitchenVertices[kvPos + 13] = fY
kitchenVertices[kvPos + 8] = kitchenVertices[kvPos + 14] = aZ
//E
kitchenVertices[kvPos + 15] = eX
kitchenVertices[kvPos + 16] = eY
kitchenVertices[kvPos + 17] = aZ
kvPos = kvPos + 18
//F
kitchenVertices[kvPos] = kitchenVertices[kvPos + 9] = eX
kitchenVertices[kvPos + 1] = kitchenVertices[kvPos + 10] = fY
kitchenVertices[kvPos + 2] = kitchenVertices[kvPos + 11] = aZ
//B
kitchenVertices[kvPos + 3] = aX
kitchenVertices[kvPos + 4] = bY
kitchenVertices[kvPos + 5] = aZ
//D
kitchenVertices[kvPos + 6] = kitchenVertices[kvPos + 12] = cX
kitchenVertices[kvPos + 7] = kitchenVertices[kvPos + 13] = bY
kitchenVertices[kvPos + 8] = kitchenVertices[kvPos + 14] = aZ
//H
kitchenVertices[kvPos + 15] = gX
kitchenVertices[kvPos + 16] = fY
kitchenVertices[kvPos + 17] = aZ
kvPos = kvPos + 18
//G
kitchenVertices[kvPos] = kitchenVertices[kvPos + 9] = gX
kitchenVertices[kvPos + 1] = kitchenVertices[kvPos + 10] = eY
kitchenVertices[kvPos + 2] = kitchenVertices[kvPos + 11] = aZ
//H
kitchenVertices[kvPos + 3] = gX
kitchenVertices[kvPos + 4] = fY
kitchenVertices[kvPos + 5] = aZ
//D
kitchenVertices[kvPos + 6] = kitchenVertices[kvPos + 12] = cX
kitchenVertices[kvPos + 7] = kitchenVertices[kvPos + 13] = bY
kitchenVertices[kvPos + 8] = kitchenVertices[kvPos + 14] = aZ
//C
kitchenVertices[kvPos + 15] = cX
kitchenVertices[kvPos + 16] = aY
kitchenVertices[kvPos + 17] = aZ
kvPos = kvPos + 18
//A
kitchenVertices[kvPos] = kitchenVertices[kvPos + 9] = aX
kitchenVertices[kvPos + 1] = kitchenVertices[kvPos + 10] = aY
kitchenVertices[kvPos + 2] = kitchenVertices[kvPos + 11] = aZ
//E
kitchenVertices[kvPos + 3] = eX
kitchenVertices[kvPos + 4] = eY
kitchenVertices[kvPos + 5] = aZ
//G
kitchenVertices[kvPos + 6] = kitchenVertices[kvPos + 12] = gX
kitchenVertices[kvPos + 7] = kitchenVertices[kvPos + 13] = eY
kitchenVertices[kvPos + 8] = kitchenVertices[kvPos + 14] = aZ
//C
kitchenVertices[kvPos + 15] = cX
kitchenVertices[kvPos + 16] = aY
kitchenVertices[kvPos + 17] = aZ
kvPos = kvPos + 18
// DOOR LEAF SIDES
//E
kitchenVertices[kvPos] = kitchenVertices[kvPos + 9] = eX
kitchenVertices[kvPos + 1] = kitchenVertices[kvPos + 10] = eY
kitchenVertices[kvPos + 2] = kitchenVertices[kvPos + 11] = aZ
//F
kitchenVertices[kvPos + 3] = eX
kitchenVertices[kvPos + 4] = fY
kitchenVertices[kvPos + 5] = aZ
//J
kitchenVertices[kvPos + 6] = kitchenVertices[kvPos + 12] = eX
kitchenVertices[kvPos + 7] = kitchenVertices[kvPos + 13] = fY
kitchenVertices[kvPos + 8] = kitchenVertices[kvPos + 14] = iZ
//I
kitchenVertices[kvPos + 15] = eX
kitchenVertices[kvPos + 16] = eY
kitchenVertices[kvPos + 17] = iZ
kvPos = kvPos + 18
//J
kitchenVertices[kvPos] = kitchenVertices[kvPos + 9] = eX
kitchenVertices[kvPos + 1] = kitchenVertices[kvPos + 10] = fY
kitchenVertices[kvPos + 2] = kitchenVertices[kvPos + 11] = iZ
//F
kitchenVertices[kvPos + 3] = eX
kitchenVertices[kvPos + 4] = fY
kitchenVertices[kvPos + 5] = aZ
//H
kitchenVertices[kvPos + 6] = kitchenVertices[kvPos + 12] = gX
kitchenVertices[kvPos + 7] = kitchenVertices[kvPos + 13] = fY
kitchenVertices[kvPos + 8] = kitchenVertices[kvPos + 14] = aZ
//L
kitchenVertices[kvPos + 15] = gX
kitchenVertices[kvPos + 16] = fY
kitchenVertices[kvPos + 17] = iZ
kvPos = kvPos + 18
//K
kitchenVertices[kvPos] = kitchenVertices[kvPos + 9] = gX
kitchenVertices[kvPos + 1] = kitchenVertices[kvPos + 10] = eY
kitchenVertices[kvPos + 2] = kitchenVertices[kvPos + 11] = iZ
//L
kitchenVertices[kvPos + 3] = gX
kitchenVertices[kvPos + 4] = fY
kitchenVertices[kvPos + 5] = iZ
//H
kitchenVertices[kvPos + 6] = kitchenVertices[kvPos + 12] = gX
kitchenVertices[kvPos + 7] = kitchenVertices[kvPos + 13] = fY
kitchenVertices[kvPos + 8] = kitchenVertices[kvPos + 14] = aZ
//G
kitchenVertices[kvPos + 15] = gX
kitchenVertices[kvPos + 16] = eY
kitchenVertices[kvPos + 17] = aZ
kvPos = kvPos + 18
//E
kitchenVertices[kvPos] = kitchenVertices[kvPos + 9] = eX
kitchenVertices[kvPos + 1] = kitchenVertices[kvPos + 10] = eY
kitchenVertices[kvPos + 2] = kitchenVertices[kvPos + 11] = aZ
//I
kitchenVertices[kvPos + 3] = eX
kitchenVertices[kvPos + 4] = eY
kitchenVertices[kvPos + 5] = iZ
//K
kitchenVertices[kvPos + 6] = kitchenVertices[kvPos + 12] = gX
kitchenVertices[kvPos + 7] = kitchenVertices[kvPos + 13] = eY
kitchenVertices[kvPos + 8] = kitchenVertices[kvPos + 14] = iZ
//G
kitchenVertices[kvPos + 15] = gX
kitchenVertices[kvPos + 16] = eY
kitchenVertices[kvPos + 17] = aZ
kvPos = kvPos + 18
// DOOR LEAF FRONT
if ( showOven ) {
// oven front
//I
ovenVertices[ovPos] = ovenVertices[ovPos + 9] = eX
ovenVertices[ovPos + 1] = ovenVertices[ovPos + 10] = eY
ovenVertices[ovPos + 2] = ovenVertices[ovPos + 11] = iZ
//J
ovenVertices[ovPos + 3] = eX
ovenVertices[ovPos + 4] = fY
ovenVertices[ovPos + 5] = iZ
//L
ovenVertices[ovPos + 6] = ovenVertices[ovPos + 12] = gX
ovenVertices[ovPos + 7] = ovenVertices[ovPos + 13] = fY
ovenVertices[ovPos + 8] = ovenVertices[ovPos + 14] = iZ
//K
ovenVertices[ovPos + 15] = gX
ovenVertices[ovPos + 16] = eY
ovenVertices[ovPos + 17] = iZ
ovPos = ovPos + 18
//I
ovenUvs [ovUvPos] = ovenUvs [ovUvPos + 6] = 0
ovenUvs [ovUvPos + 1] = ovenUvs [ovUvPos + 7] = 1
//J
ovenUvs [ovUvPos + 2] = 0
ovenUvs [ovUvPos + 3] = 0 //0.5
//L
ovenUvs [ovUvPos + 4] = ovenUvs [ovUvPos + 8] = 1
ovenUvs [ovUvPos + 5] = ovenUvs [ovUvPos + 9] = 0 //0.5
//K
ovenUvs [ovUvPos + 10] = 1
ovenUvs [ovUvPos + 11] = 1
ovUvPos = ovUvPos + 12
//kvPos = kvPos+18
} else if ( showMicroWave ) {
// microwave front
//I
mwVertices[0] = mwVertices[9] = eX
mwVertices[1] = mwVertices[10] = eY
mwVertices[2] = mwVertices[11] = iZ
//J
mwVertices[3] = eX
mwVertices[4] = fY
mwVertices[5] = iZ
//L
mwVertices[6] = mwVertices[12] = gX
mwVertices[7] = mwVertices[13] = fY
mwVertices[8] = mwVertices[14] = iZ
//K
mwVertices[15] = gX
mwVertices[16] = eY
mwVertices[17] = iZ
mwUvs = [0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1]
//kvPos = kvPos+18
} else {
// regular front
if (isFlat || cX - aX <= minCabinetFrame || aY - bY <= minCabinetFrame ){
//I
kitchenVertices[kvPos] = kitchenVertices[kvPos + 9] = eX
kitchenVertices[kvPos + 1] = kitchenVertices[kvPos + 10] = eY
kitchenVertices[kvPos + 2] = kitchenVertices[kvPos + 11] = iZ
//J
kitchenVertices[kvPos + 3] = eX
kitchenVertices[kvPos + 4] = fY
kitchenVertices[kvPos + 5] = iZ
//L
kitchenVertices[kvPos + 6] = kitchenVertices[kvPos + 12] = gX
kitchenVertices[kvPos + 7] = kitchenVertices[kvPos + 13] = fY
kitchenVertices[kvPos + 8] = kitchenVertices[kvPos + 14] = iZ
//K
kitchenVertices[kvPos + 15] = gX
kitchenVertices[kvPos + 16] = eY
kitchenVertices[kvPos + 17] = iZ
kvPos = kvPos + 18
} else {
// front facing ring
//I
kitchenVertices[kvPos] = kitchenVertices[kvPos + 9] = eX
kitchenVertices[kvPos + 1] = kitchenVertices[kvPos + 10] = eY
kitchenVertices[kvPos + 2] = kitchenVertices[kvPos + 11] = iZ
//J
kitchenVertices[kvPos + 3] = eX
kitchenVertices[kvPos + 4] = fY
kitchenVertices[kvPos + 5] = iZ
//N
kitchenVertices[kvPos + 6] = kitchenVertices[kvPos + 12] = mX
kitchenVertices[kvPos + 7] = kitchenVertices[kvPos + 13] = nY
kitchenVertices[kvPos + 8] = kitchenVertices[kvPos + 14] = iZ
//M
kitchenVertices[kvPos + 15] = mX
kitchenVertices[kvPos + 16] = mY
kitchenVertices[kvPos + 17] = iZ
kvPos = kvPos + 18
//N
kitchenVertices[kvPos] = kitchenVertices[kvPos + 9] = mX
kitchenVertices[kvPos + 1] = kitchenVertices[kvPos + 10] = nY
kitchenVertices[kvPos + 2] = kitchenVertices[kvPos + 11] = iZ
//J
kitchenVertices[kvPos + 3] = eX
kitchenVertices[kvPos + 4] = fY
kitchenVertices[kvPos + 5] = iZ
//L
kitchenVertices[kvPos + 6] = kitchenVertices[kvPos + 12] = gX
kitchenVertices[kvPos + 7] = kitchenVertices[kvPos + 13] = fY
kitchenVertices[kvPos + 8] = kitchenVertices[kvPos + 14] = iZ
//P
kitchenVertices[kvPos + 15] = oX
kitchenVertices[kvPos + 16] = nY
kitchenVertices[kvPos + 17] = iZ
kvPos = kvPos + 18
//O
kitchenVertices[kvPos] = kitchenVertices[kvPos + 9] = oX
kitchenVertices[kvPos + 1] = kitchenVertices[kvPos + 10] = mY
kitchenVertices[kvPos + 2] = kitchenVertices[kvPos + 11] = iZ
//P
kitchenVertices[kvPos + 3] = oX
kitchenVertices[kvPos + 4] = nY
kitchenVertices[kvPos + 5] = iZ
//L
kitchenVertices[kvPos + 6] = kitchenVertices[kvPos + 12] = gX
kitchenVertices[kvPos + 7] = kitchenVertices[kvPos + 13] = fY
kitchenVertices[kvPos + 8] = kitchenVertices[kvPos + 14] = iZ
//K
kitchenVertices[kvPos + 15] = gX
kitchenVertices[kvPos + 16] = eY
kitchenVertices[kvPos + 17] = iZ
kvPos = kvPos + 18
//I
kitchenVertices[kvPos] = kitchenVertices[kvPos + 9] = eX
kitchenVertices[kvPos + 1] = kitchenVertices[kvPos + 10] = eY
kitchenVertices[kvPos + 2] = kitchenVertices[kvPos + 11] = iZ
//M
kitchenVertices[kvPos + 3] = mX
kitchenVertices[kvPos + 4] = mY
kitchenVertices[kvPos + 5] = iZ
//O
kitchenVertices[kvPos + 6] = kitchenVertices[kvPos + 12] = oX
kitchenVertices[kvPos + 7] = kitchenVertices[kvPos + 13] = mY
kitchenVertices[kvPos + 8] = kitchenVertices[kvPos + 14] = iZ
//K
kitchenVertices[kvPos + 15] = gX
kitchenVertices[kvPos + 16] = eY
kitchenVertices[kvPos + 17] = iZ
kvPos = kvPos + 18
// inner facing ring
//M
kitchenVertices[kvPos] = kitchenVertices[kvPos + 9] = mX
kitchenVertices[kvPos + 1] = kitchenVertices[kvPos + 10] = mY
kitchenVertices[kvPos + 2] = kitchenVertices[kvPos + 11] = iZ
//N
kitchenVertices[kvPos + 3] = mX
kitchenVertices[kvPos + 4] = nY
kitchenVertices[kvPos + 5] = iZ
//R
kitchenVertices[kvPos + 6] = kitchenVertices[kvPos + 12] = qX
kitchenVertices[kvPos + 7] = kitchenVertices[kvPos + 13] = rY
kitchenVertices[kvPos + 8] = kitchenVertices[kvPos + 14] = qZ
//Q
kitchenVertices[kvPos + 15] = qX
kitchenVertices[kvPos + 16] = qY
kitchenVertices[kvPos + 17] = qZ
kvPos = kvPos + 18
//R
kitchenVertices[kvPos] = kitchenVertices[kvPos + 9] = qX
kitchenVertices[kvPos + 1] = kitchenVertices[kvPos + 10] = rY
kitchenVertices[kvPos + 2] = kitchenVertices[kvPos + 11] = qZ
//N
kitchenVertices[kvPos + 3] = mX
kitchenVertices[kvPos + 4] = nY
kitchenVertices[kvPos + 5] = iZ
//P
kitchenVertices[kvPos + 6] = kitchenVertices[kvPos + 12] = oX
kitchenVertices[kvPos + 7] = kitchenVertices[kvPos + 13] = nY
kitchenVertices[kvPos + 8] = kitchenVertices[kvPos + 14] = iZ
//T
kitchenVertices[kvPos + 15] = sX
kitchenVertices[kvPos + 16] = rY
kitchenVertices[kvPos + 17] = qZ
kvPos = kvPos + 18
//S
kitchenVertices[kvPos] = kitchenVertices[kvPos + 9] = sX
kitchenVertices[kvPos + 1] = kitchenVertices[kvPos + 10] = qY
kitchenVertices[kvPos + 2] = kitchenVertices[kvPos + 11] = qZ
//T
kitchenVertices[kvPos + 3] = sX
kitchenVertices[kvPos + 4] = rY
kitchenVertices[kvPos + 5] = qZ
//P
kitchenVertices[kvPos + 6] = kitchenVertices[kvPos + 12] = oX
kitchenVertices[kvPos + 7] = kitchenVertices[kvPos + 13] = nY
kitchenVertices[kvPos + 8] = kitchenVertices[kvPos + 14] = iZ
//O
kitchenVertices[kvPos + 15] = oX
kitchenVertices[kvPos + 16] = mY
kitchenVertices[kvPos + 17] = iZ
kvPos = kvPos + 18
//M
kitchenVertices[kvPos] = kitchenVertices[kvPos + 9] = mX
kitchenVertices[kvPos + 1] = kitchenVertices[kvPos + 10] = mY
kitchenVertices[kvPos + 2] = kitchenVertices[kvPos + 11] = iZ
//Q
kitchenVertices[kvPos + 3] = qX
kitchenVertices[kvPos + 4] = qY
kitchenVertices[kvPos + 5] = qZ
//S
kitchenVertices[kvPos + 6] = kitchenVertices[kvPos + 12] = sX
kitchenVertices[kvPos + 7] = kitchenVertices[kvPos + 13] = qY
kitchenVertices[kvPos + 8] = kitchenVertices[kvPos + 14] = qZ
//O
kitchenVertices[kvPos + 15] = oX
kitchenVertices[kvPos + 16] = mY
kitchenVertices[kvPos + 17] = iZ
kvPos = kvPos + 18
// inner face
//Q
kitchenVertices[kvPos] = kitchenVertices[kvPos + 9] = qX
kitchenVertices[kvPos + 1] = kitchenVertices[kvPos + 10] = qY
kitchenVertices[kvPos + 2] = kitchenVertices[kvPos + 11] = qZ
//R
kitchenVertices[kvPos + 3] = qX
kitchenVertices[kvPos + 4] = rY
kitchenVertices[kvPos + 5] = qZ
//T
kitchenVertices[kvPos + 6] = kitchenVertices[kvPos + 12] = sX
kitchenVertices[kvPos + 7] = kitchenVertices[kvPos + 13] = rY
kitchenVertices[kvPos + 8] = kitchenVertices[kvPos + 14] = qZ
//S
kitchenVertices[kvPos + 15] = sX
kitchenVertices[kvPos + 16] = qY
kitchenVertices[kvPos + 17] = qZ
kvPos = kvPos + 18
}
}
}
function genExtractor () {
// EXTRACTOR
// E------G
// /| /|
// A------C |
// | F----|-H
// |/ |/
// B------D
var
isIntegrated = a.extractorType === 'integrated',
aX = getElementPos(a.cooktopPos) + (a.wallCabinet && !isIntegrated ? 0.05 : 0 ),
aY = extractorBottom + extractorHeight,
aZ = a.wallCabinet && isIntegrated ? extractorWidth : a.w - 0.6 + extractorWidth,
cX = getElementPos(a.cooktopPos + 1) - (a.wallCabinet && !isIntegrated ? 0.05 : 0 ),
eZ = a.wallCabinet && isIntegrated ? a.wallCabinetWidth : a.w - 0.6,
bY = extractorBottom // a.wallCabinetHeight
// front
// A
extractorVertices[evPos] = extractorVertices[evPos + 9] = aX
extractorVertices[evPos + 1] = extractorVertices[evPos + 10] = aY
extractorVertices[evPos + 2] = extractorVertices[evPos + 11] = aZ
//B
extractorVertices[evPos + 3] = aX
extractorVertices[evPos + 4] = bY
extractorVertices[evPos + 5] = aZ
//D
extractorVertices[evPos + 6] = extractorVertices[evPos + 12] = cX
extractorVertices[evPos + 7] = extractorVertices[evPos + 13] = bY
extractorVertices[evPos + 8] = extractorVertices[evPos + 14] = aZ
//C
extractorVertices[evPos + 15] = cX
extractorVertices[evPos + 16] = aY
extractorVertices[evPos + 17] = aZ
evPos = evPos + 18
if (a.wallCabinet && isIntegrated) {
// top
// E
extractorVertices[evPos] = extractorVertices[evPos + 9] = aX
extractorVertices[evPos + 1] = extractorVertices[evPos + 10] = aY
extractorVertices[evPos + 2] = extractorVertices[evPos + 11] = eZ
//A
extractorVertices[evPos + 3] = aX
extractorVertices[evPos + 4] = aY
extractorVertices[evPos + 5] = aZ
//C
extractorVertices[evPos + 6] = extractorVertices[evPos + 12] = cX
extractorVertices[evPos + 7] = extractorVertices[evPos + 13] = aY
extractorVertices[evPos + 8] = extractorVertices[evPos + 14] = aZ
//G
extractorVertices[evPos + 15] = cX
extractorVertices[evPos + 16] = aY
extractorVertices[evPos + 17] = eZ
evPos = evPos + 18
}
// left
// E
extractorVertices[evPos] = extractorVertices[evPos + 9] = aX
extractorVertices[evPos + 1] = extractorVertices[evPos + 10] = aY
extractorVertices[evPos + 2] = extractorVertices[evPos + 11] = eZ
//F
extractorVertices[evPos + 3] = aX
extractorVertices[evPos + 4] = bY
extractorVertices[evPos + 5] = eZ
//B
extractorVertices[evPos + 6] = extractorVertices[evPos + 12] = aX
extractorVertices[evPos + 7] = extractorVertices[evPos + 13] = bY
extractorVertices[evPos + 8] = extractorVertices[evPos + 14] = aZ
//A
extractorVertices[evPos + 15] = aX
extractorVertices[evPos + 16] = aY
extractorVertices[evPos + 17] = aZ
evPos = evPos + 18
// right
//C
extractorVertices[evPos] = extractorVertices[evPos + 9] = cX
extractorVertices[evPos + 1] = extractorVertices[evPos + 10] = aY
extractorVertices[evPos + 2] = extractorVertices[evPos + 11] = aZ
//D
extractorVertices[evPos + 3] = cX
extractorVertices[evPos + 4] = bY
extractorVertices[evPos + 5] = aZ
//H
extractorVertices[evPos + 6] = extractorVertices[evPos + 12] = cX
extractorVertices[evPos + 7] = extractorVertices[evPos + 13] = bY
extractorVertices[evPos + 8] = extractorVertices[evPos + 14] = eZ
//G
extractorVertices[evPos + 15] = cX
extractorVertices[evPos + 16] = aY
extractorVertices[evPos + 17] = eZ
evPos = evPos + 18
// bottom
//B
extractorVertices[evPos] = extractorVertices[evPos + 9] = aX
extractorVertices[evPos + 1] = extractorVertices[evPos + 10] = bY
extractorVertices[evPos + 2] = extractorVertices[evPos + 11] = aZ
//F
extractorVertices[evPos + 3] = aX
extractorVertices[evPos + 4] = bY
extractorVertices[evPos + 5] = eZ
//H
extractorVertices[evPos + 6] = extractorVertices[evPos + 12] = cX
extractorVertices[evPos + 7] = extractorVertices[evPos + 13] = bY
extractorVertices[evPos + 8] = extractorVertices[evPos + 14] = eZ
//D
extractorVertices[evPos + 15] = cX
extractorVertices[evPos + 16] = bY
extractorVertices[evPos + 17] = aZ
evPos = evPos + 18
// back
//G
extractorVertices[evPos] = extractorVertices[evPos + 9] = cX
extractorVertices[evPos + 1] = extractorVertices[evPos + 10] = aY
extractorVertices[evPos + 2] = extractorVertices[evPos + 11] = eZ
//H
extractorVertices[evPos + 3] = cX
extractorVertices[evPos + 4] = bY
extractorVertices[evPos + 5] = eZ
//F
extractorVertices[evPos + 6] = extractorVertices[evPos + 12] = aX
extractorVertices[evPos + 7] = extractorVertices[evPos + 13] = bY
extractorVertices[evPos + 8] = extractorVertices[evPos + 14] = eZ
//E
extractorVertices[evPos + 15] = aX
extractorVertices[evPos + 16] = aY
extractorVertices[evPos + 17] = eZ
evPos = evPos + 18
if (!a.wallCabinet || a.extractorType !== 'integrated') {
var centerVent = (a.w >= 0.7 && !a.wallCabinet) || a.barCounter
iX = aX + (cX - aX) / 2 - 0.12
iY = a.h + offsetY
iZ = centerVent ? a.w - 0.25 : a.w - 0.4
jY = aY + (a.extractorType === 'pyramid' ? extractorPyramid : 0)
kX = iX + 0.24
mZ = centerVent ? a.w - 0.45 : a.w - 0.6
// EXTRACTOR ROOF TOP
// E-N--P--G
// | J--L |
// | |
// A-------C
// LEFT
// E
extractorVertices[evPos] = extractorVertices[evPos + 9] = aX
extractorVertices[evPos + 1] = extractorVertices[evPos + 10] = aY
extractorVertices[evPos + 2] = extractorVertices[evPos + 11] = eZ
// A
extractorVertices[evPos + 3] = aX
extractorVertices[evPos + 4] = aY
extractorVertices[evPos + 5] = aZ
//J
extractorVertices[evPos + 6] = extractorVertices[evPos + 12] = iX
extractorVertices[evPos + 7] = extractorVertices[evPos + 13] = jY
extractorVertices[evPos + 8] = extractorVertices[evPos + 14] = iZ
//N
extractorVertices[evPos + 15] = iX
extractorVertices[evPos + 16] = jY
extractorVertices[evPos + 17] = mZ
evPos = evPos + 18
// FRONT
// J
extractorVertices[evPos] = extractorVertices[evPos + 9] = iX
extractorVertices[evPos + 1] = extractorVertices[evPos + 10] = jY
extractorVertices[evPos + 2] = extractorVertices[evPos + 11] = iZ
// A
extractorVertices[evPos + 3] = aX
extractorVertices[evPos + 4] = aY
extractorVertices[evPos + 5] = aZ
// C
extractorVertices[evPos + 6] = extractorVertices[evPos + 12] = cX
extractorVertices[evPos + 7] = extractorVertices[evPos + 13] = aY
extractorVertices[evPos + 8] = extractorVertices[evPos + 14] = aZ
// L
extractorVertices[evPos + 15] = kX
extractorVertices[evPos + 16] = jY
extractorVertices[evPos + 17] = iZ
evPos = evPos + 18
// RIGHT
// P
extractorVertices[evPos] = extractorVertices[evPos + 9] = kX
extractorVertices[evPos + 1] = extractorVertices[evPos + 10] = jY
extractorVertices[evPos + 2] = extractorVertices[evPos + 11] = mZ
// L
extractorVertices[evPos + 3] = kX
extractorVertices[evPos + 4] = jY
extractorVertices[evPos + 5] = iZ
// C
extractorVertices[evPos + 6] = extractorVertices[evPos + 12] = cX
extractorVertices[evPos + 7] = extractorVertices[evPos + 13] = aY
extractorVertices[evPos + 8] = extractorVertices[evPos + 14] = aZ
// G
extractorVertices[evPos + 15] = cX
extractorVertices[evPos + 16] = aY
extractorVertices[evPos + 17] = eZ
evPos = evPos + 18
if (a.extractorType === 'pyramid' || a.w > 0.6 || a.barCounter ) {
// BACK
// E
extractorVertices[evPos] = extractorVertices[evPos + 9] = aX
extractorVertices[evPos + 1] = extractorVertices[evPos + 10] = aY
extractorVertices[evPos + 2] = extractorVertices[evPos + 11] = eZ
// N
extractorVertices[evPos + 3] = iX
extractorVertices[evPos + 4] = jY
extractorVertices[evPos + 5] = mZ
// P
extractorVertices[evPos + 6] = extractorVertices[evPos + 12] = kX
extractorVertices[evPos + 7] = extractorVertices[evPos + 13] = jY
extractorVertices[evPos + 8] = extractorVertices[evPos + 14] = mZ
// G
extractorVertices[evPos + 15] = cX
extractorVertices[evPos + 16] = aY
extractorVertices[evPos + 17] = eZ
evPos = evPos + 18
}
// ventilation
// M------O
// /| /|
// I------K |
// | N----|-P
// |/ |/
// J------L
// front
// A
extractorVertices[evPos] = extractorVertices[evPos + 9] = iX
extractorVertices[evPos + 1] = extractorVertices[evPos + 10] = iY
extractorVertices[evPos + 2] = extractorVertices[evPos + 11] = iZ
//B
extractorVertices[evPos + 3] = iX
extractorVertices[evPos + 4] = jY
extractorVertices[evPos + 5] = iZ
//D
extractorVertices[evPos + 6] = extractorVertices[evPos + 12] = kX
extractorVertices[evPos + 7] = extractorVertices[evPos + 13] = jY
extractorVertices[evPos + 8] = extractorVertices[evPos + 14] = iZ
//C
extractorVertices[evPos + 15] = kX
extractorVertices[evPos + 16] = iY
extractorVertices[evPos + 17] = iZ
evPos = evPos + 18
// top
// E
extractorVertices[evPos] = extractorVertices[evPos + 9] = iX
extractorVertices[evPos + 1] = extractorVertices[evPos + 10] = iY
extractorVertices[evPos + 2] = extractorVertices[evPos + 11] = mZ
//A
extractorVertices[evPos + 3] = iX
extractorVertices[evPos + 4] = iY
extractorVertices[evPos + 5] = iZ
//C
extractorVertices[evPos + 6] = extractorVertices[evPos + 12] = kX
extractorVertices[evPos + 7] = extractorVertices[evPos + 13] = iY
extractorVertices[evPos + 8] = extractorVertices[evPos + 14] = iZ
//G
extractorVertices[evPos + 15] = kX
extractorVertices[evPos + 16] = iY
extractorVertices[evPos + 17] = mZ
evPos = evPos + 18
// left
// E
extractorVertices[evPos] = extractorVertices[evPos + 9] = iX
extractorVertices[evPos + 1] = extractorVertices[evPos + 10] = iY
extractorVertices[evPos + 2] = extractorVertices[evPos + 11] = mZ
//F
extractorVertices[evPos + 3] = iX
extractorVertices[evPos + 4] = jY
extractorVertices[evPos + 5] = mZ
//B
extractorVertices[evPos + 6] = extractorVertices[evPos + 12] = iX
extractorVertices[evPos + 7] = extractorVertices[evPos + 13] = jY
extractorVertices[evPos + 8] = extractorVertices[evPos + 14] = iZ
//A
extractorVertices[evPos + 15] = iX
extractorVertices[evPos + 16] = iY
extractorVertices[evPos + 17] = iZ
evPos = evPos + 18
// right
//C
extractorVertices[evPos] = extractorVertices[evPos + 9] = kX
extractorVertices[evPos + 1] = extractorVertices[evPos + 10] = iY
extractorVertices[evPos + 2] = extractorVertices[evPos + 11] = iZ
//D
extractorVertices[evPos + 3] = kX
extractorVertices[evPos + 4] = jY
extractorVertices[evPos + 5] = iZ
//H
extractorVertices[evPos + 6] = extractorVertices[evPos + 12] = kX
extractorVertices[evPos + 7] = extractorVertices[evPos + 13] = jY
extractorVertices[evPos + 8] = extractorVertices[evPos + 14] = mZ
//G
extractorVertices[evPos + 15] = kX
extractorVertices[evPos + 16] = iY
extractorVertices[evPos + 17] = mZ
evPos = evPos + 18
// back
//O
extractorVertices[evPos] = extractorVertices[evPos + 9] = kX
extractorVertices[evPos + 1] = extractorVertices[evPos + 10] = iY
extractorVertices[evPos + 2] = extractorVertices[evPos + 11] = mZ
//P
extractorVertices[evPos + 3] = kX
extractorVertices[evPos + 4] = jY
extractorVertices[evPos + 5] = mZ
//N
extractorVertices[evPos + 6] = extractorVertices[evPos + 12] = iX
extractorVertices[evPos + 7] = extractorVertices[evPos + 13] = jY
extractorVertices[evPos + 8] = extractorVertices[evPos + 14] = mZ
//M
extractorVertices[evPos + 15] = iX
extractorVertices[evPos + 16] = iY
extractorVertices[evPos + 17] = mZ
evPos = evPos + 18
}
// reset variables
aZ = a.w
eZ = aZ
iZ = a.w + a.doorWidth
}
function genCabinetBox(aX, aY, aZ, bY, cX, eZ, id) {
///////////////////
// CABINET BOXES
//////////////////
// FRONT VIEW VERTICES
//
// E------G
// /| /|
// A------C |
// | F----|-H
// |/ |/
// B------D
if (id !== 1){
// TOP
//E
kitchenVertices[kvPos] = kitchenVertices[kvPos + 9] = aX
kitchenVertices[kvPos + 1] = kitchenVertices[kvPos + 10] = aY
kitchenVertices[kvPos + 2] = kitchenVertices[kvPos + 11] = eZ
//A
kitchenVertices[kvPos + 3] = aX
kitchenVertices[kvPos + 4] = aY
kitchenVertices[kvPos + 5] = aZ
//C
kitchenVertices[kvPos + 6] = kitchenVertices[kvPos + 12] = cX
kitchenVertices[kvPos + 7] = kitchenVertices[kvPos + 13] = aY
kitchenVertices[kvPos + 8] = kitchenVertices[kvPos + 14] = aZ
//G
kitchenVertices[kvPos + 15] = cX
kitchenVertices[kvPos + 16] = aY
kitchenVertices[kvPos + 17] = eZ
kvPos = kvPos + 18
}
// SIDES
//E
kitchenVertices[kvPos] = kitchenVertices[kvPos + 9] = aX
kitchenVertices[kvPos + 1] = kitchenVertices[kvPos + 10] = aY
kitchenVertices[kvPos + 2] = kitchenVertices[kvPos + 11] = eZ
//F
kitchenVertices[kvPos + 3] = aX
kitchenVertices[kvPos + 4] = bY
kitchenVertices[kvPos + 5] = eZ
//B
kitchenVertices[kvPos + 6] = kitchenVertices[kvPos + 12] = aX
kitchenVertices[kvPos + 7] = kitchenVertices[kvPos + 13] = bY
kitchenVertices[kvPos + 8] = kitchenVertices[kvPos + 14] = aZ
//A
kitchenVertices[kvPos + 15] = aX
kitchenVertices[kvPos + 16] = aY
kitchenVertices[kvPos + 17] = aZ
kvPos = kvPos + 18
// LEFT
//E
kitchenVertices[kvPos] = kitchenVertices[kvPos + 9] = aX
kitchenVertices[kvPos + 1] = kitchenVertices[kvPos + 10] = aY
kitchenVertices[kvPos + 2] = kitchenVertices[kvPos + 11] = eZ
//F
kitchenVertices[kvPos + 3] = aX
kitchenVertices[kvPos + 4] = bY
kitchenVertices[kvPos + 5] = eZ
//B
kitchenVertices[kvPos + 6] = kitchenVertices[kvPos + 12] = aX
kitchenVertices[kvPos + 7] = kitchenVertices[kvPos + 13] = bY
kitchenVertices[kvPos + 8] = kitchenVertices[kvPos + 14] = aZ
//A
kitchenVertices[kvPos + 15] = aX
kitchenVertices[kvPos + 16] = aY
kitchenVertices[kvPos + 17] = aZ
kvPos = kvPos + 18
// RIGHT
//C
kitchenVertices[kvPos] = kitchenVertices[kvPos + 9] = cX
kitchenVertices[kvPos + 1] = kitchenVertices[kvPos + 10] = aY
kitchenVertices[kvPos + 2] = kitchenVertices[kvPos + 11] = aZ
//D
kitchenVertices[kvPos + 3] = cX
kitchenVertices[kvPos + 4] = bY
kitchenVertices[kvPos + 5] = aZ
//H
kitchenVertices[kvPos + 6] = kitchenVertices[kvPos + 12] = cX
kitchenVertices[kvPos + 7] = kitchenVertices[kvPos + 13] = bY
kitchenVertices[kvPos + 8] = kitchenVertices[kvPos + 14] = eZ
//G
kitchenVertices[kvPos + 15] = cX
kitchenVertices[kvPos + 16] = aY
kitchenVertices[kvPos + 17] = eZ
kvPos = kvPos + 18
// BACK
//G
kitchenVertices[kvPos] = kitchenVertices[kvPos + 9] = cX
kitchenVertices[kvPos + 1] = kitchenVertices[kvPos + 10] = aY
kitchenVertices[kvPos + 2] = kitchenVertices[kvPos + 11] = eZ
//H
kitchenVertices[kvPos + 3] = cX
kitchenVertices[kvPos + 4] = bY
kitchenVertices[kvPos + 5] = eZ
//F
kitchenVertices[kvPos + 6] = kitchenVertices[kvPos + 12] = aX
kitchenVertices[kvPos + 7] = kitchenVertices[kvPos + 13] = bY
kitchenVertices[kvPos + 8] = kitchenVertices[kvPos + 14] = eZ
//E
kitchenVertices[kvPos + 15] = aX
kitchenVertices[kvPos + 16] = aY
kitchenVertices[kvPos + 17] = eZ
kvPos = kvPos + 18
if (id === 2){
// BOTTOM
//B
kitchenVertices[kvPos] = kitchenVertices[kvPos + 9] = aX
kitchenVertices[kvPos + 1] = kitchenVertices[kvPos + 10] = bY
kitchenVertices[kvPos + 2] = kitchenVertices[kvPos + 11] = aZ
//F
kitchenVertices[kvPos + 3] = aX
kitchenVertices[kvPos + 4] = bY
kitchenVertices[kvPos + 5] = eZ
//H
kitchenVertices[kvPos + 6] = kitchenVertices[kvPos + 12] = cX
kitchenVertices[kvPos + 7] = kitchenVertices[kvPos + 13] = bY
kitchenVertices[kvPos + 8] = kitchenVertices[kvPos + 14] = eZ
//D
kitchenVertices[kvPos + 15] = cX
kitchenVertices[kvPos + 16] = bY
kitchenVertices[kvPos + 17] = aZ
kvPos = kvPos + 18
}
}
var baseCabinetCursor = getElementPos(a.highCabinetLeft + 1)
aX = xCursor
aY = a.counterHeight - a.counterThickness
aZ = a.w
bY = 0
cX = xCursor + elements[0]
eX = xCursor + a.doorWidth / 2
eY = aY - a.doorWidth
eZ = aZ
fY = a.baseBoard
gX = cX - a.doorWidth / 2
iZ = a.w + a.doorWidth
///////////////////
// CABINET DOORS
//////////////////
for (var c = 0; c < elementNum; c++) {
aX = xCursor
cX = xCursor + elements[c]
eX = xCursor + a.doorWidth / 2
gX = xCursor + elements[c] - a.doorWidth / 2
var isSink = (c === a.sinkPos - 1 || (c === a.sinkPos && a.sinkType === 'double')) && sink
// Get CabinetSegments depending on configuration
if (c