提交 7bce9073 编写于 作者: Skyeye云's avatar Skyeye云

新增光源

上级 8a876878
...@@ -8,6 +8,9 @@ layui.config({ ...@@ -8,6 +8,9 @@ layui.config({
winui.renderColor(); winui.renderColor();
var index = parent.layer.getFrameIndex(window.name); var index = parent.layer.getFrameIndex(window.name);
// 添加方向光光源
threeUtil.initDirectionalLight();
// 加入模型到场景 // 加入模型到场景
$("body").on("click", "#modeList .item", function(e){ $("body").on("click", "#modeList .item", function(e){
var url = $(this).attr("src"); var url = $(this).attr("src");
...@@ -19,22 +22,10 @@ layui.config({ ...@@ -19,22 +22,10 @@ layui.config({
matchingLanguage(); matchingLanguage();
//加入地板到场景 // 加入地板到场景
$("body").on("click", "#floorList .item", function(e){ $("body").on("click", "#floorList .item", function(e){
var url = $(this).attr("src"); var url = $(this).attr("src");
var loader = new THREE.TextureLoader(); threeUtil.initFloor(url);
//加载一个资源
var groundTexture = loader.load(url);
console.log(editor);
console.log(groundTexture);
groundTexture.wrapS = groundTexture.wrapT = THREE.RepeatWrapping;
groundTexture.repeat.set(5, 5);
//地基材料
var groundMaterial = new THREE.MeshLambertMaterial({ map: groundTexture });
var mesh = new THREE.Mesh(new THREE.PlaneBufferGeometry(30, 30), groundMaterial);
mesh.rotation.x = -Math.PI / 2;
mesh.receiveShadow = true;
editor.scene.add(mesh);
}); });
}); });
......
...@@ -10,16 +10,13 @@ function Config() { ...@@ -10,16 +10,13 @@ function Config() {
'project/title': '', 'project/title': '',
'project/editable': false, 'project/editable': false,
'project/vr': false, 'project/vr': false,
'project/renderer/antialias': true, 'project/renderer/antialias': true,
'project/renderer/shadows': true, 'project/renderer/shadows': true,
'project/renderer/shadowType': 1, // PCF 'project/renderer/shadowType': 1, // PCF
'project/renderer/physicallyCorrectLights': false, 'project/renderer/physicallyCorrectLights': false,
'project/renderer/toneMapping': 0, // NoToneMapping 'project/renderer/toneMapping': 0, // NoToneMapping
'project/renderer/toneMappingExposure': 1, 'project/renderer/toneMappingExposure': 1,
'settings/history': false, 'settings/history': false,
'settings/shortcuts/translate': 'w', 'settings/shortcuts/translate': 'w',
'settings/shortcuts/rotate': 'e', 'settings/shortcuts/rotate': 'e',
'settings/shortcuts/scale': 'r', 'settings/shortcuts/scale': 'r',
...@@ -28,49 +25,30 @@ function Config() { ...@@ -28,49 +25,30 @@ function Config() {
}; };
if ( window.localStorage[ name ] === undefined ) { if ( window.localStorage[ name ] === undefined ) {
window.localStorage[ name ] = JSON.stringify( storage ); window.localStorage[ name ] = JSON.stringify( storage );
} else { } else {
var data = JSON.parse( window.localStorage[ name ] ); var data = JSON.parse( window.localStorage[ name ] );
for ( var key in data ) { for ( var key in data ) {
storage[ key ] = data[ key ]; storage[ key ] = data[ key ];
} }
} }
return { return {
getKey: function ( key ) { getKey: function ( key ) {
return storage[ key ]; return storage[ key ];
}, },
setKey: function () { // key, value, key, value ... setKey: function () { // key, value, key, value ...
for ( var i = 0, l = arguments.length; i < l; i += 2 ) { for ( var i = 0, l = arguments.length; i < l; i += 2 ) {
storage[ arguments[ i ] ] = arguments[ i + 1 ]; storage[ arguments[ i ] ] = arguments[ i + 1 ];
} }
window.localStorage[ name ] = JSON.stringify( storage ); window.localStorage[ name ] = JSON.stringify( storage );
console.log( '[' + /\d\d\:\d\d\:\d\d/.exec( new Date() )[ 0 ] + ']', 'Saved config to LocalStorage.' ); console.log( '[' + /\d\d\:\d\d\:\d\d/.exec( new Date() )[ 0 ] + ']', 'Saved config to LocalStorage.' );
}, },
clear: function () { clear: function () {
delete window.localStorage[ name ]; delete window.localStorage[ name ];
} }
}; };
} }
......
...@@ -550,54 +550,34 @@ Editor.prototype = { ...@@ -550,54 +550,34 @@ Editor.prototype = {
}, },
selectById: function ( id ) { selectById: function ( id ) {
if ( id === this.camera.id ) { if ( id === this.camera.id ) {
this.select( this.camera ); this.select( this.camera );
return; return;
} }
this.select( this.scene.getObjectById( id ) ); this.select( this.scene.getObjectById( id ) );
}, },
selectByUuid: function ( uuid ) { selectByUuid: function ( uuid ) {
var scope = this; var scope = this;
this.scene.traverse( function ( child ) { this.scene.traverse( function ( child ) {
if ( child.uuid === uuid ) { if ( child.uuid === uuid ) {
scope.select( child ); scope.select( child );
} }
} ); } );
}, },
deselect: function () { deselect: function () {
this.select( null ); this.select( null );
}, },
focus: function ( object ) { focus: function ( object ) {
if ( object !== undefined ) { if ( object !== undefined ) {
this.signals.objectFocused.dispatch( object ); this.signals.objectFocused.dispatch( object );
} }
}, },
focusById: function ( id ) { focusById: function ( id ) {
this.focus( this.scene.getObjectById( id ) ); this.focus( this.scene.getObjectById( id ) );
}, },
clear: function () { clear: function () {
...@@ -626,58 +606,38 @@ Editor.prototype = { ...@@ -626,58 +606,38 @@ Editor.prototype = {
this.materials = {}; this.materials = {};
this.textures = {}; this.textures = {};
this.scripts = {}; this.scripts = {};
this.materialsRefCounter.clear(); this.materialsRefCounter.clear();
this.animations = {}; this.animations = {};
this.mixer.stopAllAction(); this.mixer.stopAllAction();
this.deselect(); this.deselect();
this.signals.editorCleared.dispatch(); this.signals.editorCleared.dispatch();
}, },
//
fromJSON: async function ( json ) { fromJSON: async function ( json ) {
var loader = new THREE.ObjectLoader(); var loader = new THREE.ObjectLoader();
var camera = await loader.parseAsync( json.camera ); var camera = await loader.parseAsync( json.camera );
this.camera.copy( camera ); this.camera.copy( camera );
this.signals.cameraResetted.dispatch(); this.signals.cameraResetted.dispatch();
this.history.fromJSON( json.history ); this.history.fromJSON( json.history );
this.scripts = json.scripts; this.scripts = json.scripts;
this.setScene( await loader.parseAsync( json.scene ) ); this.setScene( await loader.parseAsync( json.scene ) );
}, },
toJSON: function () { toJSON: function () {
// scripts clean up // scripts clean up
var scene = this.scene; var scene = this.scene;
var scripts = this.scripts; var scripts = this.scripts;
for ( var key in scripts ) { for ( var key in scripts ) {
var script = scripts[ key ]; var script = scripts[ key ];
if ( script.length === 0 || scene.getObjectByProperty( 'uuid', key ) === undefined ) { if ( script.length === 0 || scene.getObjectByProperty( 'uuid', key ) === undefined ) {
delete scripts[ key ]; delete scripts[ key ];
} }
} }
//
return { return {
metadata: {}, metadata: {},
project: { project: {
shadows: this.config.getKey( 'project/renderer/shadows' ), shadows: this.config.getKey( 'project/renderer/shadows' ),
...@@ -691,33 +651,23 @@ Editor.prototype = { ...@@ -691,33 +651,23 @@ Editor.prototype = {
scene: this.scene.toJSON(), scene: this.scene.toJSON(),
scripts: this.scripts, scripts: this.scripts,
history: this.history.toJSON() history: this.history.toJSON()
}; };
}, },
objectByUuid: function ( uuid ) { objectByUuid: function ( uuid ) {
return this.scene.getObjectByProperty( 'uuid', uuid, true ); return this.scene.getObjectByProperty( 'uuid', uuid, true );
}, },
execute: function ( cmd, optionalName ) { execute: function ( cmd, optionalName ) {
this.history.execute( cmd, optionalName ); this.history.execute( cmd, optionalName );
}, },
undo: function () { undo: function () {
this.history.undo(); this.history.undo();
}, },
redo: function () { redo: function () {
this.history.redo(); this.history.redo();
} }
}; };
......
...@@ -26,40 +26,23 @@ function Loader( editor ) { ...@@ -26,40 +26,23 @@ function Loader( editor ) {
}; };
this.loadFiles = function ( files, filesMap ) { this.loadFiles = function ( files, filesMap ) {
if ( files.length > 0 ) { if ( files.length > 0 ) {
var filesMap = filesMap || LoaderUtils.createFilesMap( files ); var filesMap = filesMap || LoaderUtils.createFilesMap( files );
var manager = new THREE.LoadingManager(); var manager = new THREE.LoadingManager();
manager.setURLModifier( function ( url ) { manager.setURLModifier( function ( url ) {
url = url.replace( /^(\.?\/)/, '' ); // remove './' url = url.replace( /^(\.?\/)/, '' ); // remove './'
var file = filesMap[ url ]; var file = filesMap[ url ];
if ( file ) { if ( file ) {
console.log( 'Loading', url ); console.log( 'Loading', url );
return URL.createObjectURL( file ); return URL.createObjectURL( file );
} }
return url; return url;
} ); } );
manager.addHandler( /\.tga$/i, new TGALoader() ); manager.addHandler( /\.tga$/i, new TGALoader() );
for ( var i = 0; i < files.length; i ++ ) { for ( var i = 0; i < files.length; i ++ ) {
scope.loadFile( files[ i ], manager ); scope.loadFile( files[ i ], manager );
} }
} }
}; };
this.loadFile = function ( file, manager ) { this.loadFile = function ( file, manager ) {
...@@ -78,28 +61,18 @@ function Loader( editor ) { ...@@ -78,28 +61,18 @@ function Loader( editor ) {
} ); } );
switch ( extension ) { switch ( extension ) {
case '3dm': case '3dm':
reader.addEventListener( 'load', async function ( event ) { reader.addEventListener( 'load', async function ( event ) {
var contents = event.target.result; var contents = event.target.result;
var { Rhino3dmLoader } = await import( '../../examples/jsm/loaders/3DMLoader.js' ); var { Rhino3dmLoader } = await import( '../../examples/jsm/loaders/3DMLoader.js' );
var loader = new Rhino3dmLoader(); var loader = new Rhino3dmLoader();
loader.setLibraryPath( '../examples/jsm/libs/rhino3dm/' ); loader.setLibraryPath( '../examples/jsm/libs/rhino3dm/' );
loader.parse( contents, function ( object ) { loader.parse( contents, function ( object ) {
editor.execute( new AddObjectCommand( editor, object ) ); editor.execute( new AddObjectCommand( editor, object ) );
} ); } );
}, false ); }, false );
reader.readAsArrayBuffer( file ); reader.readAsArrayBuffer( file );
break; break;
case '3ds': case '3ds':
reader.addEventListener( 'load', async function ( event ) { reader.addEventListener( 'load', async function ( event ) {
...@@ -149,23 +122,15 @@ function Loader( editor ) { ...@@ -149,23 +122,15 @@ function Loader( editor ) {
break; break;
case 'dae': case 'dae':
reader.addEventListener( 'load', async function ( event ) { reader.addEventListener( 'load', async function ( event ) {
var contents = event.target.result; var contents = event.target.result;
var { ColladaLoader } = await import( '../../examples/jsm/loaders/ColladaLoader.js' ); var { ColladaLoader } = await import( '../../examples/jsm/loaders/ColladaLoader.js' );
var loader = new ColladaLoader( manager ); var loader = new ColladaLoader( manager );
var collada = loader.parse( contents ); var collada = loader.parse( contents );
collada.scene.name = filename; collada.scene.name = filename;
editor.execute( new AddObjectCommand( editor, collada.scene ) ); editor.execute( new AddObjectCommand( editor, collada.scene ) );
}, false ); }, false );
reader.readAsText( file ); reader.readAsText( file );
break; break;
case 'drc': case 'drc':
...@@ -257,45 +222,28 @@ function Loader( editor ) { ...@@ -257,45 +222,28 @@ function Loader( editor ) {
break; break;
case 'gltf': case 'gltf':
reader.addEventListener( 'load', async function ( event ) { reader.addEventListener( 'load', async function ( event ) {
var contents = event.target.result; var contents = event.target.result;
var loader; var loader;
if ( isGLTF1( contents ) ) { if ( isGLTF1( contents ) ) {
alert( 'Import of glTF asset not possible. Only versions >= 2.0 are supported. Please try to upgrade the file to glTF 2.0 using glTF-Pipeline.' ); alert( 'Import of glTF asset not possible. Only versions >= 2.0 are supported. Please try to upgrade the file to glTF 2.0 using glTF-Pipeline.' );
} else { } else {
var { DRACOLoader } = await import( '../../examples/jsm/loaders/DRACOLoader.js' ); var { DRACOLoader } = await import( '../../examples/jsm/loaders/DRACOLoader.js' );
var { GLTFLoader } = await import( '../../examples/jsm/loaders/GLTFLoader.js' ); var { GLTFLoader } = await import( '../../examples/jsm/loaders/GLTFLoader.js' );
var dracoLoader = new DRACOLoader(); var dracoLoader = new DRACOLoader();
dracoLoader.setDecoderPath( '../examples/js/libs/draco/gltf/' ); dracoLoader.setDecoderPath( '../examples/js/libs/draco/gltf/' );
loader = new GLTFLoader( manager ); loader = new GLTFLoader( manager );
loader.setDRACOLoader( dracoLoader ); loader.setDRACOLoader( dracoLoader );
} }
loader.parse( contents, '', function ( result ) { loader.parse( contents, '', function ( result ) {
var scene = result.scene; var scene = result.scene;
scene.name = filename; scene.name = filename;
scene.animations.push( ...result.animations ); scene.animations.push( ...result.animations );
editor.execute( new AddObjectCommand( editor, scene ) ); editor.execute( new AddObjectCommand( editor, scene ) );
} ); } );
}, false ); }, false );
reader.readAsArrayBuffer( file ); reader.readAsArrayBuffer( file );
break; break;
case 'js': case 'js':
case 'json': case 'json':
......
...@@ -28,8 +28,6 @@ function Viewport( editor ) { ...@@ -28,8 +28,6 @@ function Viewport( editor ) {
container.add( new ViewportCamera( editor ) ); container.add( new ViewportCamera( editor ) );
container.add( new ViewportInfo( editor ) ); container.add( new ViewportInfo( editor ) );
//
var renderer = null; var renderer = null;
var pmremGenerator = null; var pmremGenerator = null;
...@@ -41,15 +39,15 @@ function Viewport( editor ) { ...@@ -41,15 +39,15 @@ function Viewport( editor ) {
var objects = []; var objects = [];
// helpers // helpers
var grid = new THREE.Group(); var grid = new THREE.Group();
// 网格为30*30
var grid1 = new THREE.GridHelper( 30, 30, 0x888888 ); var grid1 = new THREE.GridHelper(threeUtil.gridWidth, threeUtil.gridHeight, 0x888888);
grid1.material.color.setHex( 0x888888 ); grid1.material.color.setHex( 0x888888 );
grid1.material.vertexColors = false; grid1.material.vertexColors = false;
grid.add( grid1 ); grid.add( grid1 );
var grid2 = new THREE.GridHelper( 30, 6, 0x222222 ); // 将网格划分为6个大格子
var grid2 = new THREE.GridHelper(threeUtil.gridWidth, threeUtil.gridBigCell, 0x222222);
grid2.material.color.setHex( 0x222222 ); grid2.material.color.setHex( 0x222222 );
grid2.material.depthFunc = THREE.AlwaysDepth; grid2.material.depthFunc = THREE.AlwaysDepth;
grid2.material.vertexColors = false; grid2.material.vertexColors = false;
...@@ -58,8 +56,6 @@ function Viewport( editor ) { ...@@ -58,8 +56,6 @@ function Viewport( editor ) {
var viewHelper = new ViewHelper( camera, container ); var viewHelper = new ViewHelper( camera, container );
var vr = new VR( editor ); var vr = new VR( editor );
//
var box = new THREE.Box3(); var box = new THREE.Box3();
var selectionBox = new THREE.BoxHelper(); var selectionBox = new THREE.BoxHelper();
...@@ -74,83 +70,48 @@ function Viewport( editor ) { ...@@ -74,83 +70,48 @@ function Viewport( editor ) {
var transformControls = new TransformControls( camera, container.dom ); var transformControls = new TransformControls( camera, container.dom );
transformControls.addEventListener( 'change', function () { transformControls.addEventListener( 'change', function () {
var object = transformControls.object; var object = transformControls.object;
if ( object !== undefined ) { if ( object !== undefined ) {
selectionBox.setFromObject( object ); selectionBox.setFromObject( object );
var helper = editor.helpers[ object.id ]; var helper = editor.helpers[ object.id ];
if ( helper !== undefined && helper.isSkeletonHelper !== true ) { if ( helper !== undefined && helper.isSkeletonHelper !== true ) {
helper.update(); helper.update();
} }
signals.refreshSidebarObject3D.dispatch( object ); signals.refreshSidebarObject3D.dispatch( object );
} }
render(); render();
} ); } );
transformControls.addEventListener( 'mouseDown', function () {
transformControls.addEventListener( 'mouseDown', function () {
var object = transformControls.object; var object = transformControls.object;
objectPositionOnDown = object.position.clone(); objectPositionOnDown = object.position.clone();
objectRotationOnDown = object.rotation.clone(); objectRotationOnDown = object.rotation.clone();
objectScaleOnDown = object.scale.clone(); objectScaleOnDown = object.scale.clone();
controls.enabled = false; controls.enabled = false;
} ); } );
transformControls.addEventListener( 'mouseUp', function () {
transformControls.addEventListener( 'mouseUp', function () {
var object = transformControls.object; var object = transformControls.object;
if ( object !== undefined ) { if ( object !== undefined ) {
switch ( transformControls.getMode() ) { switch ( transformControls.getMode() ) {
case 'translate': case 'translate':
if ( ! objectPositionOnDown.equals( object.position ) ) { if ( ! objectPositionOnDown.equals( object.position ) ) {
editor.execute( new SetPositionCommand( editor, object, object.position, objectPositionOnDown ) ); editor.execute( new SetPositionCommand( editor, object, object.position, objectPositionOnDown ) );
} }
break; break;
case 'rotate': case 'rotate':
if ( ! objectRotationOnDown.equals( object.rotation ) ) { if ( ! objectRotationOnDown.equals( object.rotation ) ) {
editor.execute( new SetRotationCommand( editor, object, object.rotation, objectRotationOnDown ) ); editor.execute( new SetRotationCommand( editor, object, object.rotation, objectRotationOnDown ) );
} }
break; break;
case 'scale': case 'scale':
if ( ! objectScaleOnDown.equals( object.scale ) ) { if ( ! objectScaleOnDown.equals( object.scale ) ) {
editor.execute( new SetScaleCommand( editor, object, object.scale, objectScaleOnDown ) ); editor.execute( new SetScaleCommand( editor, object, object.scale, objectScaleOnDown ) );
} }
break; break;
} }
} }
controls.enabled = true; controls.enabled = true;
} ); } );
sceneHelpers.add( transformControls ); sceneHelpers.add( transformControls );
...@@ -163,20 +124,14 @@ function Viewport( editor ) { ...@@ -163,20 +124,14 @@ function Viewport( editor ) {
// events // events
function updateAspectRatio() { function updateAspectRatio() {
camera.aspect = container.dom.offsetWidth / container.dom.offsetHeight; camera.aspect = container.dom.offsetWidth / container.dom.offsetHeight;
camera.updateProjectionMatrix(); camera.updateProjectionMatrix();
} }
function getIntersects( point, objects ) { function getIntersects( point, objects ) {
mouse.set( ( point.x * 2 ) - 1, - ( point.y * 2 ) + 1 ); mouse.set( ( point.x * 2 ) - 1, - ( point.y * 2 ) + 1 );
raycaster.setFromCamera( mouse, camera ); raycaster.setFromCamera( mouse, camera );
return raycaster.intersectObjects( objects ); return raycaster.intersectObjects( objects );
} }
var onDownPosition = new THREE.Vector2(); var onDownPosition = new THREE.Vector2();
...@@ -184,107 +139,65 @@ function Viewport( editor ) { ...@@ -184,107 +139,65 @@ function Viewport( editor ) {
var onDoubleClickPosition = new THREE.Vector2(); var onDoubleClickPosition = new THREE.Vector2();
function getMousePosition( dom, x, y ) { function getMousePosition( dom, x, y ) {
var rect = dom.getBoundingClientRect(); var rect = dom.getBoundingClientRect();
return [ ( x - rect.left ) / rect.width, ( y - rect.top ) / rect.height ]; return [ ( x - rect.left ) / rect.width, ( y - rect.top ) / rect.height ];
} }
function handleClick() { function handleClick() {
if ( onDownPosition.distanceTo( onUpPosition ) === 0 ) { if ( onDownPosition.distanceTo( onUpPosition ) === 0 ) {
var intersects = getIntersects( onUpPosition, objects ); var intersects = getIntersects( onUpPosition, objects );
if ( intersects.length > 0 ) { if ( intersects.length > 0 ) {
var object = intersects[ 0 ].object; var object = intersects[ 0 ].object;
if ( object.userData.object !== undefined ) { if ( object.userData.object !== undefined ) {
// helper // helper
editor.select( object.userData.object ); editor.select( object.userData.object );
} else { } else {
editor.select( object ); editor.select( object );
} }
} else { } else {
editor.select( null ); editor.select( null );
} }
render(); render();
} }
} }
function onMouseDown( event ) { function onMouseDown( event ) {
// event.preventDefault(); // event.preventDefault();
var array = getMousePosition( container.dom, event.clientX, event.clientY ); var array = getMousePosition( container.dom, event.clientX, event.clientY );
onDownPosition.fromArray( array ); onDownPosition.fromArray( array );
document.addEventListener( 'mouseup', onMouseUp, false ); document.addEventListener( 'mouseup', onMouseUp, false );
} }
function onMouseUp( event ) { function onMouseUp( event ) {
var array = getMousePosition( container.dom, event.clientX, event.clientY ); var array = getMousePosition( container.dom, event.clientX, event.clientY );
onUpPosition.fromArray( array ); onUpPosition.fromArray( array );
handleClick(); handleClick();
document.removeEventListener( 'mouseup', onMouseUp, false ); document.removeEventListener( 'mouseup', onMouseUp, false );
} }
function onTouchStart( event ) { function onTouchStart( event ) {
var touch = event.changedTouches[ 0 ]; var touch = event.changedTouches[ 0 ];
var array = getMousePosition( container.dom, touch.clientX, touch.clientY ); var array = getMousePosition( container.dom, touch.clientX, touch.clientY );
onDownPosition.fromArray( array ); onDownPosition.fromArray( array );
document.addEventListener( 'touchend', onTouchEnd, false ); document.addEventListener( 'touchend', onTouchEnd, false );
} }
function onTouchEnd( event ) { function onTouchEnd( event ) {
var touch = event.changedTouches[ 0 ]; var touch = event.changedTouches[ 0 ];
var array = getMousePosition( container.dom, touch.clientX, touch.clientY ); var array = getMousePosition( container.dom, touch.clientX, touch.clientY );
onUpPosition.fromArray( array ); onUpPosition.fromArray( array );
handleClick(); handleClick();
document.removeEventListener( 'touchend', onTouchEnd, false ); document.removeEventListener( 'touchend', onTouchEnd, false );
} }
function onDoubleClick( event ) { function onDoubleClick( event ) {
var array = getMousePosition( container.dom, event.clientX, event.clientY ); var array = getMousePosition( container.dom, event.clientX, event.clientY );
onDoubleClickPosition.fromArray( array ); onDoubleClickPosition.fromArray( array );
var intersects = getIntersects( onDoubleClickPosition, objects ); var intersects = getIntersects( onDoubleClickPosition, objects );
if ( intersects.length > 0 ) { if ( intersects.length > 0 ) {
var intersect = intersects[ 0 ]; var intersect = intersects[ 0 ];
signals.objectFocused.dispatch( intersect.object ); signals.objectFocused.dispatch( intersect.object );
} }
} }
container.dom.addEventListener( 'mousedown', onMouseDown, false ); container.dom.addEventListener( 'mousedown', onMouseDown, false );
...@@ -331,295 +244,174 @@ function Viewport( editor ) { ...@@ -331,295 +244,174 @@ function Viewport( editor ) {
} ); } );
signals.rendererUpdated.add( function () { signals.rendererUpdated.add( function () {
scene.traverse( function ( child ) { scene.traverse( function ( child ) {
if ( child.material !== undefined ) { if ( child.material !== undefined ) {
child.material.needsUpdate = true; child.material.needsUpdate = true;
} }
} ); } );
render(); render();
} ); } );
// 创建渲染器
signals.rendererCreated.add( function ( newRenderer ) { signals.rendererCreated.add( function ( newRenderer ) {
if ( renderer !== null ) { if ( renderer !== null ) {
renderer.setAnimationLoop( null ); renderer.setAnimationLoop( null );
renderer.dispose(); renderer.dispose();
pmremGenerator.dispose(); pmremGenerator.dispose();
container.dom.removeChild( renderer.domElement ); container.dom.removeChild( renderer.domElement );
} }
renderer = newRenderer; renderer = newRenderer;
// 首先渲染器开启阴影
renderer.shadowMap.enabled = true;
renderer.setAnimationLoop( animate ); renderer.setAnimationLoop( animate );
renderer.setClearColor( 0xaaaaaa ); renderer.setClearColor( 0xaaaaaa );
if ( window.matchMedia ) { if ( window.matchMedia ) {
var mediaQuery = window.matchMedia( '(prefers-color-scheme: dark)' ); var mediaQuery = window.matchMedia( '(prefers-color-scheme: dark)' );
mediaQuery.addListener( function ( event ) { mediaQuery.addListener( function ( event ) {
renderer.setClearColor( event.matches ? 0x333333 : 0xaaaaaa ); renderer.setClearColor( event.matches ? 0x333333 : 0xaaaaaa );
updateGridColors( grid1, grid2, event.matches ? [ 0x222222, 0x888888 ] : [ 0x888888, 0x282828 ] ); updateGridColors( grid1, grid2, event.matches ? [ 0x222222, 0x888888 ] : [ 0x888888, 0x282828 ] );
render(); render();
} ); } );
renderer.setClearColor( mediaQuery.matches ? 0x333333 : 0xaaaaaa ); renderer.setClearColor( mediaQuery.matches ? 0x333333 : 0xaaaaaa );
updateGridColors( grid1, grid2, mediaQuery.matches ? [ 0x222222, 0x888888 ] : [ 0x888888, 0x282828 ] ); updateGridColors( grid1, grid2, mediaQuery.matches ? [ 0x222222, 0x888888 ] : [ 0x888888, 0x282828 ] );
} }
renderer.setPixelRatio( window.devicePixelRatio ); renderer.setPixelRatio( window.devicePixelRatio );
renderer.setSize( container.dom.offsetWidth, container.dom.offsetHeight ); renderer.setSize( container.dom.offsetWidth, container.dom.offsetHeight );
pmremGenerator = new THREE.PMREMGenerator( renderer ); pmremGenerator = new THREE.PMREMGenerator( renderer );
pmremGenerator.compileEquirectangularShader(); pmremGenerator.compileEquirectangularShader();
container.dom.appendChild( renderer.domElement ); container.dom.appendChild( renderer.domElement );
render(); render();
} ); } );
signals.sceneGraphChanged.add( function () { signals.sceneGraphChanged.add( function () {
render(); render();
} ); } );
signals.cameraChanged.add( function () { signals.cameraChanged.add( function () {
render(); render();
} ); } );
signals.objectSelected.add( function ( object ) { signals.objectSelected.add( function ( object ) {
selectionBox.visible = false; selectionBox.visible = false;
transformControls.detach(); transformControls.detach();
if ( object !== null && object !== scene && object !== camera ) { if ( object !== null && object !== scene && object !== camera ) {
box.setFromObject( object ); box.setFromObject( object );
if ( box.isEmpty() === false ) { if ( box.isEmpty() === false ) {
selectionBox.setFromObject( object ); selectionBox.setFromObject( object );
selectionBox.visible = true; selectionBox.visible = true;
} }
transformControls.attach( object ); transformControls.attach( object );
} }
render(); render();
} ); } );
signals.objectFocused.add( function ( object ) { signals.objectFocused.add( function ( object ) {
controls.focus( object ); controls.focus( object );
} ); } );
signals.geometryChanged.add( function ( object ) { signals.geometryChanged.add( function ( object ) {
if ( object !== undefined ) { if ( object !== undefined ) {
selectionBox.setFromObject( object ); selectionBox.setFromObject( object );
} }
render(); render();
} ); } );
signals.objectAdded.add( function ( object ) { signals.objectAdded.add( function ( object ) {
object.traverse( function ( child ) { object.traverse( function ( child ) {
objects.push( child ); objects.push( child );
} ); } );
} ); } );
signals.objectChanged.add( function ( object ) { signals.objectChanged.add( function ( object ) {
if ( editor.selected === object ) { if ( editor.selected === object ) {
selectionBox.setFromObject( object ); selectionBox.setFromObject( object );
} }
if ( object.isPerspectiveCamera ) { if ( object.isPerspectiveCamera ) {
object.updateProjectionMatrix(); object.updateProjectionMatrix();
} }
if ( editor.helpers[ object.id ] !== undefined ) { if ( editor.helpers[ object.id ] !== undefined ) {
editor.helpers[ object.id ].update(); editor.helpers[ object.id ].update();
} }
render(); render();
} ); } );
signals.objectRemoved.add( function ( object ) { signals.objectRemoved.add( function ( object ) {
controls.enabled = true; // see #14180 controls.enabled = true; // see #14180
if ( object === transformControls.object ) { if ( object === transformControls.object ) {
transformControls.detach(); transformControls.detach();
} }
object.traverse( function ( child ) { object.traverse( function ( child ) {
objects.splice( objects.indexOf( child ), 1 ); objects.splice( objects.indexOf( child ), 1 );
} ); } );
} ); } );
signals.helperAdded.add( function ( object ) { signals.helperAdded.add( function ( object ) {
var picker = object.getObjectByName( 'picker' ); var picker = object.getObjectByName( 'picker' );
if ( picker !== undefined ) { if ( picker !== undefined ) {
objects.push( picker ); objects.push( picker );
} }
} ); } );
signals.helperRemoved.add( function ( object ) { signals.helperRemoved.add( function ( object ) {
var picker = object.getObjectByName( 'picker' ); var picker = object.getObjectByName( 'picker' );
if ( picker !== undefined ) { if ( picker !== undefined ) {
objects.splice( objects.indexOf( picker ), 1 ); objects.splice( objects.indexOf( picker ), 1 );
} }
} ); } );
signals.materialChanged.add( function () { signals.materialChanged.add( function () {
render(); render();
} ); } );
signals.animationStopped.add( function () { signals.animationStopped.add( function () {
render(); render();
} ); } );
// background // background
signals.sceneBackgroundChanged.add( function ( backgroundType, backgroundColor, backgroundTexture, backgroundEquirectangularTexture ) { signals.sceneBackgroundChanged.add( function ( backgroundType, backgroundColor, backgroundTexture, backgroundEquirectangularTexture ) {
switch ( backgroundType ) { switch ( backgroundType ) {
case 'None': case 'None':
scene.background = null; scene.background = null;
break; break;
case 'Color': case 'Color':
scene.background = new THREE.Color( backgroundColor ); scene.background = new THREE.Color( backgroundColor );
break; break;
case 'Texture': case 'Texture':
if ( backgroundTexture ) { if ( backgroundTexture ) {
scene.background = backgroundTexture; scene.background = backgroundTexture;
} }
break; break;
case 'Equirectangular': case 'Equirectangular':
if ( backgroundEquirectangularTexture ) { if ( backgroundEquirectangularTexture ) {
backgroundEquirectangularTexture.mapping = THREE.EquirectangularReflectionMapping; backgroundEquirectangularTexture.mapping = THREE.EquirectangularReflectionMapping;
scene.background = backgroundEquirectangularTexture; scene.background = backgroundEquirectangularTexture;
} }
break; break;
} }
render(); render();
} ); } );
// environment // environment
signals.sceneEnvironmentChanged.add( function ( environmentType, environmentEquirectangularTexture ) { signals.sceneEnvironmentChanged.add( function ( environmentType, environmentEquirectangularTexture ) {
switch ( environmentType ) { switch ( environmentType ) {
case 'None': case 'None':
scene.environment = null; scene.environment = null;
break; break;
case 'Equirectangular': case 'Equirectangular':
scene.environment = null; scene.environment = null;
if ( environmentEquirectangularTexture ) { if ( environmentEquirectangularTexture ) {
scene.environment = pmremGenerator.fromEquirectangular( environmentEquirectangularTexture ).texture; scene.environment = pmremGenerator.fromEquirectangular( environmentEquirectangularTexture ).texture;
} }
break; break;
case 'ModelViewer': case 'ModelViewer':
scene.environment = pmremGenerator.fromScene( new RoomEnvironment(), 0.04 ).texture; scene.environment = pmremGenerator.fromScene( new RoomEnvironment(), 0.04 ).texture;
break; break;
} }
render(); render();
} ); } );
// fog // fog
signals.sceneFogChanged.add( function ( fogType, fogColor, fogNear, fogFar, fogDensity ) { signals.sceneFogChanged.add( function ( fogType, fogColor, fogNear, fogFar, fogDensity ) {
switch ( fogType ) { switch ( fogType ) {
case 'None': case 'None':
scene.fog = null; scene.fog = null;
break; break;
...@@ -631,15 +423,11 @@ function Viewport( editor ) { ...@@ -631,15 +423,11 @@ function Viewport( editor ) {
break; break;
} }
render(); render();
} ); } );
signals.sceneFogSettingsChanged.add( function ( fogType, fogColor, fogNear, fogFar, fogDensity ) { signals.sceneFogSettingsChanged.add( function ( fogType, fogColor, fogNear, fogFar, fogDensity ) {
switch ( fogType ) { switch ( fogType ) {
case 'Fog': case 'Fog':
scene.fog.color.setHex( fogColor ); scene.fog.color.setHex( fogColor );
scene.fog.near = fogNear; scene.fog.near = fogNear;
...@@ -649,136 +437,86 @@ function Viewport( editor ) { ...@@ -649,136 +437,86 @@ function Viewport( editor ) {
scene.fog.color.setHex( fogColor ); scene.fog.color.setHex( fogColor );
scene.fog.density = fogDensity; scene.fog.density = fogDensity;
break; break;
} }
render(); render();
} ); } );
signals.viewportCameraChanged.add( function () { signals.viewportCameraChanged.add( function () {
var viewportCamera = editor.viewportCamera; var viewportCamera = editor.viewportCamera;
if ( viewportCamera.isPerspectiveCamera ) { if ( viewportCamera.isPerspectiveCamera ) {
viewportCamera.aspect = editor.camera.aspect; viewportCamera.aspect = editor.camera.aspect;
viewportCamera.projectionMatrix.copy( editor.camera.projectionMatrix ); viewportCamera.projectionMatrix.copy( editor.camera.projectionMatrix );
} else if ( viewportCamera.isOrthographicCamera ) { } else if ( viewportCamera.isOrthographicCamera ) {
// TODO
} }
// disable EditorControls when setting a user camera // disable EditorControls when setting a user camera
controls.enabled = ( viewportCamera === editor.camera ); controls.enabled = ( viewportCamera === editor.camera );
render(); render();
} ); } );
signals.exitedVR.add( render ); signals.exitedVR.add( render );
//
signals.windowResize.add( function () { signals.windowResize.add( function () {
updateAspectRatio(); updateAspectRatio();
renderer.setSize( container.dom.offsetWidth, container.dom.offsetHeight ); renderer.setSize( container.dom.offsetWidth, container.dom.offsetHeight );
render(); render();
} ); } );
signals.showGridChanged.add( function ( showGrid ) { signals.showGridChanged.add( function ( showGrid ) {
grid.visible = showGrid; grid.visible = showGrid;
render(); render();
} ); } );
signals.showHelpersChanged.add( function ( showHelpers ) { signals.showHelpersChanged.add( function ( showHelpers ) {
showSceneHelpers = showHelpers; showSceneHelpers = showHelpers;
transformControls.enabled = showHelpers; transformControls.enabled = showHelpers;
render(); render();
} ); } );
signals.cameraResetted.add( updateAspectRatio ); signals.cameraResetted.add( updateAspectRatio );
// animations // animations
var clock = new THREE.Clock(); // only used for animations var clock = new THREE.Clock(); // only used for animations
function animate() { function animate() {
var mixer = editor.mixer; var mixer = editor.mixer;
var delta = clock.getDelta(); var delta = clock.getDelta();
var needsUpdate = false; var needsUpdate = false;
if ( mixer.stats.actions.inUse > 0 ) { if ( mixer.stats.actions.inUse > 0 ) {
mixer.update( delta ); mixer.update( delta );
needsUpdate = true; needsUpdate = true;
} }
if ( viewHelper.animating === true ) { if ( viewHelper.animating === true ) {
viewHelper.update( delta ); viewHelper.update( delta );
needsUpdate = true; needsUpdate = true;
} }
if ( vr.currentSession !== null ) { if ( vr.currentSession !== null ) {
needsUpdate = true; needsUpdate = true;
} }
if ( needsUpdate === true ) render(); if ( needsUpdate === true ) render();
} }
//
var startTime = 0; var startTime = 0;
var endTime = 0; var endTime = 0;
function render() { function render() {
startTime = performance.now(); startTime = performance.now();
// Adding/removing grid to scene so materials with depthWrite false // Adding/removing grid to scene so materials with depthWrite false
// don't render under the grid. // don't render under the grid.
scene.add( grid ); scene.add( grid );
renderer.setViewport( 0, 0, container.dom.offsetWidth, container.dom.offsetHeight ); renderer.setViewport( 0, 0, container.dom.offsetWidth, container.dom.offsetHeight );
renderer.render( scene, editor.viewportCamera ); renderer.render( scene, editor.viewportCamera );
scene.remove( grid ); scene.remove( grid );
if ( camera === editor.viewportCamera ) { if ( camera === editor.viewportCamera ) {
renderer.autoClear = false; renderer.autoClear = false;
if ( showSceneHelpers === true ) renderer.render( sceneHelpers, camera ); if ( showSceneHelpers === true ) renderer.render( sceneHelpers, camera );
if ( vr.currentSession === null ) viewHelper.render( renderer ); if ( vr.currentSession === null ) viewHelper.render( renderer );
renderer.autoClear = true; renderer.autoClear = true;
} }
endTime = performance.now(); endTime = performance.now();
editor.signals.sceneRendered.dispatch( endTime - startTime ); editor.signals.sceneRendered.dispatch( endTime - startTime );
} }
return container; return container;
} }
function updateGridColors( grid1, grid2, colors ) { function updateGridColors( grid1, grid2, colors ) {
......
...@@ -102,7 +102,6 @@ ...@@ -102,7 +102,6 @@
}; };
// //
var editor = new Editor(); var editor = new Editor();
window.editor = editor; // Expose editor to Console window.editor = editor; // Expose editor to Console
......
...@@ -30,6 +30,7 @@ var customerJS = { ...@@ -30,6 +30,7 @@ var customerJS = {
"adminAssistantUtil": "../../assets/lib/layui/customer/adminAssistantUtil.js", // 行政管理模块相关工具 "adminAssistantUtil": "../../assets/lib/layui/customer/adminAssistantUtil.js", // 行政管理模块相关工具
"codeDocUtil": "../../assets/lib/layui/customer/codeDocUtil.js", // 代码生成器相关工具类 "codeDocUtil": "../../assets/lib/layui/customer/codeDocUtil.js", // 代码生成器相关工具类
"organizationUtil": "../../assets/lib/layui/customer/organizationUtil.js", // 组织机构相关工具类 "organizationUtil": "../../assets/lib/layui/customer/organizationUtil.js", // 组织机构相关工具类
"threeUtil": "../../assets/lib/layui/customer/threeUtil.js", // 3D编辑器相关工具类
}; };
//系统基础信息 //系统基础信息
......
// 3D编辑器相关工具类
var threeUtil = {
// 编辑器网格数量
gridWidth: 30,
gridHeight: 30,
gridBigCell: 6,
/**
* 添加方向光光源
*/
initDirectionalLight: function () {
var directionalLight = new THREE.DirectionalLight(0xaaaaaa)
directionalLight.position.set(0, 200, 100)
directionalLight.name = "方向光";
// 开启阴影投射
directionalLight.castShadow = true;
editor.scene.add(directionalLight);
},
/**
* 添加地板
*
* @param url 地板文件路径
*/
initFloor: function (url) {
// 加载一个资源
var loader = new THREE.TextureLoader();
var groundTexture = loader.load(url);
groundTexture.wrapS = groundTexture.wrapT = THREE.RepeatWrapping;
groundTexture.repeat.set(threeUtil.gridWidth / threeUtil.gridBigCell, threeUtil.gridHeight / threeUtil.gridBigCell);
// 地基材料
var groundMaterial = new THREE.MeshLambertMaterial({ map: groundTexture });
var floor = new THREE.Mesh(new THREE.PlaneBufferGeometry(threeUtil.gridWidth, threeUtil.gridHeight), groundMaterial);
floor.rotation.x = -Math.PI / 2;
// 地板接受阴影开启
floor.receiveShadow = true;
floor.position.y = 0;
floor.name = "地板";
// 设置模型的每个部位都可以投影
floor.traverse(function (child) {
if (child.isMesh) {
child.castShadow = true
child.receiveShadow = true
}
})
editor.scene.add(floor);
}
};
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册