UNPKG

react-planner

Version:

react-planner is a React Component for plans design. Draw a 2D floorplan and navigate it in 3D mode.

240 lines (185 loc) 7.6 kB
import * as Three from 'three'; import React from 'react'; const WIDTH = 50; const DEPTH = 50; const HEIGHT = 50; const textureLoader = new Three.TextureLoader(); const power = textureLoader.load(require("./power.jpg" )); const black = textureLoader.load(require("./black.jpg" )); const white = textureLoader.load(require("./white.jpg" )); const keyboard = textureLoader.load(require("./keyboard.jpg" )); const blackMaterial = new Three.MeshLambertMaterial( { map:black} ); const objectMaxLOD = makeObjectMaxLOD(); const objectMinLOD = makeObjectMinLOD(); function makeObjectMaxLOD() { let monitorPC = new Three.Mesh(); let cubeGeometryBase = new Three.BoxGeometry(0.04,0.42,0.06); let whiteMaterial = new Three.MeshLambertMaterial({map:white}); let edge_p0 = new Three.Mesh(cubeGeometryBase,whiteMaterial); edge_p0.position.set(0,0.79,0); edge_p0.rotation.x=Math.PI/2; monitorPC.add(edge_p0); let cubeGeometryBase2 = new Three.BoxGeometry(0.04,0.42,0.06); let edge_p1 = new Three.Mesh(cubeGeometryBase2,whiteMaterial); edge_p1.position.set(0,0.43,0); edge_p1.rotation.x=Math.PI/2; monitorPC.add(edge_p1); let cubeGeometryBase3 = new Three.BoxGeometry(0.04,0.42,0.04); let edge_p3 = new Three.Mesh(cubeGeometryBase3,whiteMaterial); edge_p3.position.set(0,0.61,0.21); monitorPC.add(edge_p3); let cubeGeometryBase4 = new Three.BoxGeometry(0.04,0.42,0.04); let edge_p4 = new Three.Mesh(cubeGeometryBase4,whiteMaterial); edge_p4.position.set(0,0.61,-0.21); monitorPC.add(edge_p4); let cubeGeometryBase5 = new Three.BoxGeometry(0.4,0.40,0.05); let back = new Three.Mesh(cubeGeometryBase5,blackMaterial); back.position.set(-0.02,0.61,0); back.rotation.y=Math.PI/2; monitorPC.add(back); let powerGeometry = new Three.BoxGeometry(0.01,0.02,0.02); let powerMaterial = new Three.MeshLambertMaterial({map:power}); let powerButton = new Three.Mesh(powerGeometry,powerMaterial); powerButton.position.set(0.0155,0.43,0); monitorPC.add(powerButton); let cylinderGeometry1 = new Three.CylinderGeometry(0.02,0.02,0.06,32,32); let base_p1 = new Three.Mesh(cylinderGeometry1,blackMaterial); base_p1.position.set(0,0.38,0); monitorPC.add(base_p1); let geometry = new Three.CylinderGeometry(0.1,0.1,0.02,32,32); let material = new Three.MeshLambertMaterial( { map:black} ); let base_p2 = new Three.Mesh( geometry, material ); base_p2.scale.set(0.8,1,1); base_p2.position.set(0,0.36,0); monitorPC.add(base_p2); //keyboard let cubeGeometryBase8 = new Three.BoxGeometry(0.4,0.02,0.2); let boxMaterials = [ new Three.MeshBasicMaterial({color:0x000000}), new Three.MeshBasicMaterial({color:0x000000}), new Three.MeshLambertMaterial({map:keyboard}), new Three.MeshBasicMaterial({color:0x000000}), new Three.MeshBasicMaterial({color:0x000000}), new Three.MeshBasicMaterial({color:0x000000}) ]; let keyboardMesh = new Three.Mesh(cubeGeometryBase8,boxMaterials); keyboardMesh.position.set(0.3,0.36,0); keyboardMesh.rotation.y=Math.PI/2; monitorPC.add(keyboardMesh); return monitorPC; } function makeObjectMinLOD() { let monitorPC = new Three.Mesh(); let cubeGeometryBase = new Three.BoxGeometry(0.04,0.42,0.06); let whiteMaterial = new Three.MeshLambertMaterial({map:white}); let edge_p0 = new Three.Mesh(cubeGeometryBase,whiteMaterial); edge_p0.position.set(0,0.79,0); edge_p0.rotation.x=Math.PI/2; monitorPC.add(edge_p0); let cubeGeometryBase2 = new Three.BoxGeometry(0.04,0.42,0.06); let edge_p1 = new Three.Mesh(cubeGeometryBase2,whiteMaterial); edge_p1.position.set(0,0.43,0); edge_p1.rotation.x=Math.PI/2; monitorPC.add(edge_p1); let cubeGeometryBase3 = new Three.BoxGeometry(0.04,0.42,0.04); let edge_p3 = new Three.Mesh(cubeGeometryBase3,whiteMaterial); edge_p3.position.set(0,0.61,0.21); monitorPC.add(edge_p3); let cubeGeometryBase4 = new Three.BoxGeometry(0.04,0.42,0.04); let edge_p4 = new Three.Mesh(cubeGeometryBase4,whiteMaterial); edge_p4.position.set(0,0.61,-0.21); monitorPC.add(edge_p4); let cubeGeometryBase5 = new Three.BoxGeometry(0.4,0.40,0.05); let blackMaterial = new Three.MeshLambertMaterial( { map:black} ); let back = new Three.Mesh(cubeGeometryBase5,blackMaterial); back.position.set(-0.02,0.61,0); back.rotation.y=Math.PI/2; monitorPC.add(back); let cylinderGeometry1 = new Three.CylinderGeometry(0.02,0.02,0.06,8,8); let base_p1 = new Three.Mesh(cylinderGeometry1,blackMaterial); base_p1.position.set(0,0.38,0); monitorPC.add(base_p1); let geometry = new Three.CylinderGeometry(0.1,0.1,0.02,8,8); let base_p2 = new Three.Mesh( geometry, blackMaterial ); base_p2.scale.set(0.8,1,1); base_p2.position.set(0,0.36,0); monitorPC.add(base_p2); //keyboard let cubeGeometryBase8 = new Three.BoxGeometry(0.4,0.02,0.2); let keyboardMesh = new Three.Mesh(cubeGeometryBase8,blackMaterial); keyboardMesh.position.set(0.3,0.36,0); keyboardMesh.rotation.y=Math.PI/2; monitorPC.add(keyboardMesh); return monitorPC; } export default { name: "monitor_pc", prototype: "items", info: { tag: ['furnishings'], title: "pc monitor", description: "pc monitor", image: require('./monitorPC.png') }, properties: { altitude: { label: "altitude", type: "length-measure", defaultValue: { length: 100, unit: 'cm' } } }, render2D: function (element, layer, scene) { let angle = element.rotation + 90; let textRotation = 0; if (Math.sin(angle * Math.PI / 180) < 0) { textRotation = 180; } return ( <g transform={`translate(${-WIDTH / 2},${-DEPTH})`}> <rect key="1" x="0" y="0" width={WIDTH} height={DEPTH} style={{stroke: element.selected ? '#0096fd' : '#000', strokeWidth: "2px", fill: "#84e1ce"}}/> <text key="2" x="0" y="0" transform={`translate(${WIDTH / 2}, ${DEPTH / 2}) scale(1,-1) rotate(${textRotation})`} style= {{textAnchor: "middle", fontSize: "10px"}}> {element.type} </text> </g> ) }, render3D: function (element, layer, scene) { let newAltitude = element.properties.get('altitude').get('length'); /**************** LOD max ***********************/ let monitorPC_MaxLOD=new Three.Object3D(); monitorPC_MaxLOD.add(objectMaxLOD.clone()); let aa = new Three.Box3().setFromObject(monitorPC_MaxLOD); let deltaX = Math.abs(aa.max.x - aa.min.x); let deltaY = Math.abs(aa.max.y - aa.min.y); let deltaZ = Math.abs(aa.max.z - aa.min.z); monitorPC_MaxLOD.rotation.y+=-Math.PI/2; monitorPC_MaxLOD.position.y+= -HEIGHT * .75 + newAltitude; monitorPC_MaxLOD.scale.set(WIDTH / deltaZ, HEIGHT / deltaY, DEPTH / deltaX); /**************** LOD min ***********************/ let monitorPC_MinLOD=new Three.Object3D(); monitorPC_MinLOD.add(objectMinLOD.clone()); monitorPC_MinLOD.rotation.y+=-Math.PI/2; monitorPC_MinLOD.position.y+= -HEIGHT * .75 + newAltitude; monitorPC_MinLOD.scale.set(WIDTH / deltaZ, HEIGHT / deltaY, DEPTH / deltaX); /*** add all Level of Detail ***/ let lod = new Three.LOD(); lod.addLevel(monitorPC_MaxLOD, 300); lod.addLevel(monitorPC_MinLOD, 700); lod.updateMatrix(); lod.matrixAutoUpdate = false; if (element.selected) { let bbox = new Three.BoxHelper(lod, 0x99c3fb); bbox.material.linewidth = 5; bbox.renderOrder = 1000; bbox.material.depthTest = false; lod.add(bbox); } return Promise.resolve(lod); } };