react-planner
Version:
react-planner is a React Component for plans design. Draw a 2D floorplan and navigate it in 3D mode.
155 lines (120 loc) • 4.23 kB
JSX
import * as Three from 'three';
import React from 'react';
const cubeMaterial = new Three.MeshLambertMaterial({color: 0x65696c});
let textureLoader = new Three.TextureLoader();
let frontTexture1 = textureLoader.load(require('./hiroosTexture.jpg'));
let newWidth = 175;
let newDepth = 85;
let newHeight = 195;
function makeObjectMaxLOD(newWidth,newHeight,newDepth){
let rack = new Three.Mesh();
let frontTexture, backTexture;
// if((Math.floor(Math.random()*10)+1) % 2 === 0) {
// backTexture = backTexture1;
frontTexture = frontTexture1;
// }
// else {
// backTexture = backTexture2;
// frontTexture= frontTexture2;
// }
//base
let cubeGeometryBase = new Three.BoxGeometry(newWidth,newHeight,newDepth);
let p1 = new Three.Mesh(cubeGeometryBase,cubeMaterial);
p1.position.set(0,1,0);
rack.add(p1);
let planeGeometryFront = new Three.PlaneGeometry(newWidth,newHeight);
let planeMaterialFront = new Three.MeshLambertMaterial({map:frontTexture});
let front = new Three.Mesh(planeGeometryFront,planeMaterialFront);
front.position.set(0,1,newDepth/1.95);
rack.add(front);
// let planeGeometryBack = new Three.PlaneGeometry(newWidth,newHeight);
// let planeMaterialBack = new Three.MeshLambertMaterial({map:backTexture});
//
// let back = new Three.Mesh(planeGeometryBack,planeMaterialBack);
// back.position.set(0,1,-newDepth/1.95);
// back.rotation.y+=Math.PI;
// rack.add(back);
return rack
}
function makeObjectMinLOD(newWidth,newHeight,newDepth){
let rack = new Three.Mesh();
//base
let cubeGeometryBase = new Three.BoxGeometry(newWidth,newHeight,newDepth);
let p1 = new Three.Mesh(cubeGeometryBase,cubeMaterial);
p1.position.set(0,1,0);
rack.add(p1);
return rack
}
export default {
name: "hiroos",
prototype: "items",
info: {
tag: ['furnishings', 'metal'],
title: "hiroos",
description: "hiroos",
image: require('./hiroos.png')
},
properties: {
patternColor: {
label: "pattern colori",
type: "color",
defaultValue: "#f5f4f4"
},
altitude: {
label: "altitude",
type: "length-measure",
defaultValue: {
length: 0,
unit: 'cm'
}
}
},
render2D: function (element, layer, scene) {
let fillValue = element.selected ? "#99c3fb" : element.properties.get('patternColor');
let angle = element.rotation + 90;
let textRotation = 0;
if (Math.sin(angle * Math.PI / 180) < 0) {
textRotation = 180;
}
return (
<g transform={`translate(${-newWidth / 2},${-newDepth / 2})`}>
<rect key="1" x="0" y="0" width={newWidth} height={newDepth}
style={{stroke: element.selected ? '#0096fd' : '#000', strokeWidth: "2px", fill: fillValue}}/>
<text key="2" x="0" y="0"
transform={`translate(${newWidth / 2}, ${newDepth / 2}) scale(1,-1) rotate(${textRotation})`}
style={{textAnchor: "middle", fontSize: "11px"}}>
{element.get('name')}
</text>
</g>
)
},
render3D: function (element, layer, scene) {
let newAltitude = element.properties.get('altitude').get('length');
/**************** LOD max ***********************/
let rackMaxLOD=new Three.Object3D();
let objectMaxLOD = makeObjectMaxLOD(newWidth,newHeight,newDepth);
rackMaxLOD.add(objectMaxLOD.clone());
rackMaxLOD.rotation.y=Math.PI;
rackMaxLOD.position.y+= newHeight/2 + newAltitude;
/**************** LOD min ***********************/
let rackMinLOD=new Three.Object3D();
let objectMinLOD = makeObjectMinLOD(newWidth,newHeight,newDepth);
rackMinLOD.add(objectMinLOD.clone());
rackMinLOD.rotation.y=Math.PI;
rackMinLOD.position.y+= newHeight/2 + newAltitude;
/*** add all Level of Detail ***/
let lod = new Three.LOD();
lod.addLevel(rackMaxLOD, 100);
lod.addLevel(rackMinLOD, 1800);
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);
}
};