37 lines
4.9 KiB
JavaScript
37 lines
4.9 KiB
JavaScript
// Illustrative furniture; the supplied drawings document room uses, not a furnishing design.
|
||
export function furnish(ctx,data){
|
||
const {THREE,planPoint,box,mesh,group}=ctx;const material=c=>new THREE.MeshStandardMaterial({color:c,roughness:.82});
|
||
const m={wood:material('#bea17b'),light:material('#dfceb1'),sage:material('#9eab9c'),fabric:material('#c5b8a5'),white:material('#efede4'),dark:material('#36413e'),water:material('#b8ced0'),metal:material('#9da6a3')};
|
||
for(const f of data.levels){
|
||
f.furnitureColliders=[];let parent=f.furniture,base=0;
|
||
function block(name,x,y,w,d,h,z,mat=m.wood){const [X,Z]=planPoint(x,y);return box(parent,name,X,base+z+h/2,Z,w,h,d,mat);}
|
||
function solid(x,y,w,d){const [X,Z]=planPoint(x,y);f.furnitureColliders.push({minX:X-w/2,maxX:X+w/2,minZ:Z-d/2,maxZ:Z+d/2});}
|
||
function oval(name,x,y,w,d,h,z,mat){const o=mesh(new THREE.SphereGeometry(1,16,8),mat,parent,name);const [X,Z]=planPoint(x,y);o.position.set(X,base+z+h/2,Z);o.scale.set(w/2,h/2,d/2);return o;}
|
||
function cabinet(x,y,w,d,h=.86){block('Skříňka',x,y,w,d,h,.04,m.sage);block('Pracovní deska',x,y,w+.035,d+.035,.045,h+.04,m.light);for(let a=x-w/2+.6;a<x+w/2;a+=.6)block('Spára',a,y,.009,d+.008,h-.08,.12,m.light);solid(x,y,w,d);}
|
||
function table(x,y,w,d,h=.75){block('Stůl – deska',x,y,w,d,.045,h-.045,m.light);for(const a of [-1,1])for(const b of [-1,1])block('Noha stolu',x+a*(w/2-.08),y+b*(d/2-.08),.05,.05,h-.06,.02);solid(x,y,w,d);}
|
||
function chair(x,y,turn=0){const g=group(parent,'Židle');const old=parent;parent=g;block('Sedák',x,y,.43,.43,.08,.43,m.fabric);block('Opěradlo',x,y+.18,.43,.07,.42,.48,m.fabric);for(const a of [-1,1])for(const b of [-1,1])block('Noha židle',x+a*.16,y+b*.16,.035,.035,.43,.01);parent=old;}
|
||
function bed(x,y,w,d=2.04){block('Postel – rám',x,y,w,d,.29,.08);block('Matrace',x,y,w-.05,d-.05,.20,.37,m.white);block('Čelo postele',x,y+d/2-.04,w,.08,.82,.08,m.light);block('Přikrývka',x,y-.2,w-.04,d-.5,.05,.59,m.sage);for(let i=0;i<(w>1.4?2:1);i++)oval('Polštář',x+(w>1.4?(i-.5)*.78:0),y+d/2-.32,.65,.4,.13,.59,m.white);solid(x,y,w,d);}
|
||
function sofa(x,y,w=2.2){block('Pohovka – sedák',x,y,w,.9,.37,.12,m.fabric);block('Opěradlo pohovky',x,y+.38,w,.17,.72,.12,m.sage);for(const a of [-1,1])block('Područka',x+a*(w/2-.08),y,.16,.92,.56,.12,m.sage);for(let a=x-w/2+.4;a<x+w/2-.15;a+=.65)block('Polštář sedáku',a,y-.03,.61,.65,.09,.49,m.white);solid(x,y,w,.92);}
|
||
function wc(x,y){oval('WC',x,y,.39,.65,.35,.17,m.white);oval('Sedátko',x,y,.39,.65,.04,.52,m.white);oval('Mísa',x,y-.02,.25,.39,.015,.56,m.water);solid(x,y,.39,.65);}
|
||
function basin(x,y,w=.65){cabinet(x,y,w,.48,.76);oval('Umyvadlo',x,y,w-.12,.36,.06,.85,m.white);oval('Mísa umyvadla',x,y,w-.25,.25,.012,.90,m.water);block('Baterie',x,y+.17,.025,.025,.22,.88,m.metal);}
|
||
function shower(x,y,w=.9,d=.9){block('Sprchová vanička',x,y,w,d,.055,.01,m.white);block('Sprchová tyč',x+w/2-.08,y,.025,.025,1.65,.45,m.metal);block('Sprchová hlavice',x+w/2-.16,y,.22,.22,.025,2.08,m.metal);}
|
||
function kitchen(x,y,w){cabinet(x,y,w,.62);block('Dřez',x-w/3,y,.55,.42,.015,.95,m.metal);block('Vnitřek dřezu',x-w/3,y,.45,.33,.014,.96,m.dark);block('Baterie dřezu',x-w/3,y-.22,.025,.025,.27,.96,m.metal);block('Varná deska',x+w/4,y,.55,.49,.02,.95,m.dark);for(const a of [-.13,.13])for(const b of [-.13,.13])oval('Varná zóna',x+w/4+a,y+b,.16,.16,.007,.975,m.metal);}
|
||
for(const r of f.rooms){parent=group(f.furniture,r.id+' · orientační vybavení');base=r.level;
|
||
switch(r.id){
|
||
case 'S.02':cabinet(9.5,.65,1.6,.48,1.6);cabinet(10.27,2,.5,1.5,1.6);break;
|
||
case '1.01':cabinet(7.85,.65,.6,.55,2.3);cabinet(9.2,.62,1.25,.45,.45);break;
|
||
case '1.04':wc(10.18,3.12);break;
|
||
case '1.05':shower(9.48,4.25,.88,.88);basin(9.55,5.38,.65);break;
|
||
case '1.06':bed(8.8,10.5,1.6);cabinet(9.65,7.1,.6,1.8,2.25);table(8.25,8.25,.95,.55);break;
|
||
case '1.07':bed(6.57,10.65,.95);table(5.5,7.94,1.25,.6);chair(5.6,8.7);cabinet(5.17,10.8,.65,1.4,2.15);break;
|
||
case '1.08':block('Koberec',2.55,9.7,2.7,2.3,.012,.01,m.white);sofa(2.55,10.75,2.65);table(2.55,9.5,1.15,.65,.42);cabinet(4.10,7.25,.42,1.5,.44);block('TV',4.18,7.25,.06,1.2,.78,.95,m.dark);break;
|
||
case '1.09':kitchen(2.6,1.36,3.25);cabinet(.82,2.14,.6,.85,1.95);table(2.3,4.6,1.6,.85);chair(1.8,3.87);chair(2.7,3.87);chair(1.8,5.35);chair(2.7,5.35);break;
|
||
case '2.03':kitchen(9.62,7.4,.6);cabinet(8.55,6.27,2,.6);table(8.0,8.05,1.5,.78);chair(7.5,8.72);chair(8.4,8.72);sofa(6.1,10.9,2.1);table(6.1,9.65,1.1,.6,.4);cabinet(9.63,10.5,.5,1.8,.48);block('TV',9.72,10.5,.07,1.3,.75,1,m.dark);break;
|
||
case '2.04':bed(2.35,9.75,1.6);cabinet(4.08,9.2,.58,1.7,1.85);table(2.4,5.85,1.4,.58);chair(2.5,6.6);break;
|
||
case '2.05':block('Vana',2.35,2.4,1.65,.76,.54,.04,m.white);oval('Vana – vnitřek',2.35,2.4,1.43,.58,.06,.58,m.water);solid(2.35,2.4,1.65,.76);basin(4.3,3.25,.65);wc(1.78,4.5);break;
|
||
case '2.06':table(8.8,1.5,1.2,.75);chair(8.4,2.15);chair(9.2,2.15);break;
|
||
}
|
||
}
|
||
}
|
||
}
|