|
@@ -7,22 +7,36 @@ Sidebar.Material = function ( editor ) {
|
|
|
var signals = editor.signals;
|
|
|
var currentObject;
|
|
|
|
|
|
- var container = new UI.CollapsiblePanel();
|
|
|
- container.setCollapsed( editor.config.getKey( 'ui/sidebar/material/collapsed' ) );
|
|
|
- container.onCollapsedChange( function ( boolean ) {
|
|
|
+ var container = new UI.Panel();
|
|
|
+ container.setBorderTop( '0' );
|
|
|
+ container.setPaddingTop( '20px' );
|
|
|
|
|
|
- editor.config.setKey( 'ui/sidebar/material/collapsed', boolean );
|
|
|
+ // type
|
|
|
|
|
|
- } );
|
|
|
- container.setDisplay( 'none' );
|
|
|
- container.dom.classList.add( 'Material' );
|
|
|
+ var materialClassRow = new UI.Row();
|
|
|
+ var materialClass = new UI.Select().setOptions( {
|
|
|
|
|
|
- container.addStatic( new UI.Text().setValue( 'MATERIAL' ) );
|
|
|
- container.add( new UI.Break() );
|
|
|
+ 'LineBasicMaterial': 'LineBasicMaterial',
|
|
|
+ 'LineDashedMaterial': 'LineDashedMaterial',
|
|
|
+ 'MeshBasicMaterial': 'MeshBasicMaterial',
|
|
|
+ 'MeshDepthMaterial': 'MeshDepthMaterial',
|
|
|
+ 'MeshNormalMaterial': 'MeshNormalMaterial',
|
|
|
+ 'MeshLambertMaterial': 'MeshLambertMaterial',
|
|
|
+ 'MeshPhongMaterial': 'MeshPhongMaterial',
|
|
|
+ 'MeshStandardMaterial': 'MeshStandardMaterial',
|
|
|
+ 'ShaderMaterial': 'ShaderMaterial',
|
|
|
+ 'SpriteMaterial': 'SpriteMaterial'
|
|
|
+
|
|
|
+ } ).setWidth( '150px' ).setFontSize( '12px' ).onChange( update );
|
|
|
+
|
|
|
+ materialClassRow.add( new UI.Text( 'Type' ).setWidth( '90px' ) );
|
|
|
+ materialClassRow.add( materialClass );
|
|
|
+
|
|
|
+ container.add( materialClassRow );
|
|
|
|
|
|
// uuid
|
|
|
|
|
|
- var materialUUIDRow = new UI.Panel();
|
|
|
+ var materialUUIDRow = new UI.Row();
|
|
|
var materialUUID = new UI.Input().setWidth( '115px' ).setFontSize( '12px' ).setDisabled( true );
|
|
|
var materialUUIDRenew = new UI.Button( '⟳' ).setMarginLeft( '7px' ).onClick( function () {
|
|
|
|
|
@@ -39,10 +53,10 @@ Sidebar.Material = function ( editor ) {
|
|
|
|
|
|
// name
|
|
|
|
|
|
- var materialNameRow = new UI.Panel();
|
|
|
+ var materialNameRow = new UI.Row();
|
|
|
var materialName = new UI.Input().setWidth( '150px' ).setFontSize( '12px' ).onChange( function () {
|
|
|
|
|
|
- editor.setMaterialName( editor.selected.material, materialName.getValue() );
|
|
|
+ editor.execute( new SetMaterialValueCommand( editor.selected, 'name', materialName.getValue() ) );
|
|
|
|
|
|
} );
|
|
|
|
|
@@ -51,38 +65,16 @@ Sidebar.Material = function ( editor ) {
|
|
|
|
|
|
container.add( materialNameRow );
|
|
|
|
|
|
- // class
|
|
|
-
|
|
|
- var materialClassRow = new UI.Panel();
|
|
|
- var materialClass = new UI.Select().setOptions( {
|
|
|
-
|
|
|
- 'LineBasicMaterial': 'LineBasicMaterial',
|
|
|
- 'LineDashedMaterial': 'LineDashedMaterial',
|
|
|
- 'MeshBasicMaterial': 'MeshBasicMaterial',
|
|
|
- 'MeshDepthMaterial': 'MeshDepthMaterial',
|
|
|
- 'MeshLambertMaterial': 'MeshLambertMaterial',
|
|
|
- 'MeshNormalMaterial': 'MeshNormalMaterial',
|
|
|
- 'MeshPhongMaterial': 'MeshPhongMaterial',
|
|
|
- 'ShaderMaterial': 'ShaderMaterial',
|
|
|
- 'SpriteMaterial': 'SpriteMaterial'
|
|
|
-
|
|
|
- } ).setWidth( '150px' ).setFontSize( '12px' ).onChange( update );
|
|
|
-
|
|
|
- materialClassRow.add( new UI.Text( 'Type' ).setWidth( '90px' ) );
|
|
|
- materialClassRow.add( materialClass );
|
|
|
-
|
|
|
- container.add( materialClassRow );
|
|
|
-
|
|
|
// program
|
|
|
|
|
|
- var materialProgramRow = new UI.Panel();
|
|
|
+ var materialProgramRow = new UI.Row();
|
|
|
materialProgramRow.add( new UI.Text( 'Program' ).setWidth( '90px' ) );
|
|
|
|
|
|
var materialProgramInfo = new UI.Button( 'Info' );
|
|
|
materialProgramInfo.setMarginLeft( '4px' );
|
|
|
materialProgramInfo.onClick( function () {
|
|
|
|
|
|
- signals.editScript.dispatch( currentObject.material, 'programInfo' );
|
|
|
+ signals.editScript.dispatch( currentObject, 'programInfo' );
|
|
|
|
|
|
} );
|
|
|
materialProgramRow.add( materialProgramInfo );
|
|
@@ -91,7 +83,7 @@ Sidebar.Material = function ( editor ) {
|
|
|
materialProgramVertex.setMarginLeft( '4px' );
|
|
|
materialProgramVertex.onClick( function () {
|
|
|
|
|
|
- signals.editScript.dispatch( currentObject.material, 'vertexShader' );
|
|
|
+ signals.editScript.dispatch( currentObject, 'vertexShader' );
|
|
|
|
|
|
} );
|
|
|
materialProgramRow.add( materialProgramVertex );
|
|
@@ -100,7 +92,7 @@ Sidebar.Material = function ( editor ) {
|
|
|
materialProgramFragment.setMarginLeft( '4px' );
|
|
|
materialProgramFragment.onClick( function () {
|
|
|
|
|
|
- signals.editScript.dispatch( currentObject.material, 'fragmentShader' );
|
|
|
+ signals.editScript.dispatch( currentObject, 'fragmentShader' );
|
|
|
|
|
|
} );
|
|
|
materialProgramRow.add( materialProgramFragment );
|
|
@@ -109,7 +101,7 @@ Sidebar.Material = function ( editor ) {
|
|
|
|
|
|
// color
|
|
|
|
|
|
- var materialColorRow = new UI.Panel();
|
|
|
+ var materialColorRow = new UI.Row();
|
|
|
var materialColor = new UI.Color().onChange( update );
|
|
|
|
|
|
materialColorRow.add( new UI.Text( 'Color' ).setWidth( '90px' ) );
|
|
@@ -117,9 +109,29 @@ Sidebar.Material = function ( editor ) {
|
|
|
|
|
|
container.add( materialColorRow );
|
|
|
|
|
|
+ // roughness
|
|
|
+
|
|
|
+ var materialRoughnessRow = new UI.Row();
|
|
|
+ var materialRoughness = new UI.Number( 0.5 ).setWidth( '60px' ).setRange( 0, 1 ).onChange( update );
|
|
|
+
|
|
|
+ materialRoughnessRow.add( new UI.Text( 'Roughness' ).setWidth( '90px' ) );
|
|
|
+ materialRoughnessRow.add( materialRoughness );
|
|
|
+
|
|
|
+ container.add( materialRoughnessRow );
|
|
|
+
|
|
|
+ // metalness
|
|
|
+
|
|
|
+ var materialMetalnessRow = new UI.Row();
|
|
|
+ var materialMetalness = new UI.Number( 0.5 ).setWidth( '60px' ).setRange( 0, 1 ).onChange( update );
|
|
|
+
|
|
|
+ materialMetalnessRow.add( new UI.Text( 'Metalness' ).setWidth( '90px' ) );
|
|
|
+ materialMetalnessRow.add( materialMetalness );
|
|
|
+
|
|
|
+ container.add( materialMetalnessRow );
|
|
|
+
|
|
|
// emissive
|
|
|
|
|
|
- var materialEmissiveRow = new UI.Panel();
|
|
|
+ var materialEmissiveRow = new UI.Row();
|
|
|
var materialEmissive = new UI.Color().setHexValue( 0x000000 ).onChange( update );
|
|
|
|
|
|
materialEmissiveRow.add( new UI.Text( 'Emissive' ).setWidth( '90px' ) );
|
|
@@ -129,7 +141,7 @@ Sidebar.Material = function ( editor ) {
|
|
|
|
|
|
// specular
|
|
|
|
|
|
- var materialSpecularRow = new UI.Panel();
|
|
|
+ var materialSpecularRow = new UI.Row();
|
|
|
var materialSpecular = new UI.Color().setHexValue( 0x111111 ).onChange( update );
|
|
|
|
|
|
materialSpecularRow.add( new UI.Text( 'Specular' ).setWidth( '90px' ) );
|
|
@@ -139,7 +151,7 @@ Sidebar.Material = function ( editor ) {
|
|
|
|
|
|
// shininess
|
|
|
|
|
|
- var materialShininessRow = new UI.Panel();
|
|
|
+ var materialShininessRow = new UI.Row();
|
|
|
var materialShininess = new UI.Number( 30 ).onChange( update );
|
|
|
|
|
|
materialShininessRow.add( new UI.Text( 'Shininess' ).setWidth( '90px' ) );
|
|
@@ -149,7 +161,7 @@ Sidebar.Material = function ( editor ) {
|
|
|
|
|
|
// vertex colors
|
|
|
|
|
|
- var materialVertexColorsRow = new UI.Panel();
|
|
|
+ var materialVertexColorsRow = new UI.Row();
|
|
|
var materialVertexColors = new UI.Select().setOptions( {
|
|
|
|
|
|
0: 'No',
|
|
@@ -165,7 +177,7 @@ Sidebar.Material = function ( editor ) {
|
|
|
|
|
|
// skinning
|
|
|
|
|
|
- var materialSkinningRow = new UI.Panel();
|
|
|
+ var materialSkinningRow = new UI.Row();
|
|
|
var materialSkinning = new UI.Checkbox( false ).onChange( update );
|
|
|
|
|
|
materialSkinningRow.add( new UI.Text( 'Skinning' ).setWidth( '90px' ) );
|
|
@@ -175,7 +187,7 @@ Sidebar.Material = function ( editor ) {
|
|
|
|
|
|
// map
|
|
|
|
|
|
- var materialMapRow = new UI.Panel();
|
|
|
+ var materialMapRow = new UI.Row();
|
|
|
var materialMapEnabled = new UI.Checkbox( false ).onChange( update );
|
|
|
var materialMap = new UI.Texture().onChange( update );
|
|
|
|
|
@@ -187,7 +199,7 @@ Sidebar.Material = function ( editor ) {
|
|
|
|
|
|
// alpha map
|
|
|
|
|
|
- var materialAlphaMapRow = new UI.Panel();
|
|
|
+ var materialAlphaMapRow = new UI.Row();
|
|
|
var materialAlphaMapEnabled = new UI.Checkbox( false ).onChange( update );
|
|
|
var materialAlphaMap = new UI.Texture().onChange( update );
|
|
|
|
|
@@ -199,7 +211,7 @@ Sidebar.Material = function ( editor ) {
|
|
|
|
|
|
// bump map
|
|
|
|
|
|
- var materialBumpMapRow = new UI.Panel();
|
|
|
+ var materialBumpMapRow = new UI.Row();
|
|
|
var materialBumpMapEnabled = new UI.Checkbox( false ).onChange( update );
|
|
|
var materialBumpMap = new UI.Texture().onChange( update );
|
|
|
var materialBumpScale = new UI.Number( 1 ).setWidth( '30px' ).onChange( update );
|
|
@@ -213,7 +225,7 @@ Sidebar.Material = function ( editor ) {
|
|
|
|
|
|
// normal map
|
|
|
|
|
|
- var materialNormalMapRow = new UI.Panel();
|
|
|
+ var materialNormalMapRow = new UI.Row();
|
|
|
var materialNormalMapEnabled = new UI.Checkbox( false ).onChange( update );
|
|
|
var materialNormalMap = new UI.Texture().onChange( update );
|
|
|
|
|
@@ -225,7 +237,7 @@ Sidebar.Material = function ( editor ) {
|
|
|
|
|
|
// displacement map
|
|
|
|
|
|
- var materialDisplacementMapRow = new UI.Panel();
|
|
|
+ var materialDisplacementMapRow = new UI.Row();
|
|
|
var materialDisplacementMapEnabled = new UI.Checkbox( false ).onChange( update );
|
|
|
var materialDisplacementMap = new UI.Texture().onChange( update );
|
|
|
var materialDisplacementScale = new UI.Number( 1 ).setWidth( '30px' ).onChange( update );
|
|
@@ -237,9 +249,33 @@ Sidebar.Material = function ( editor ) {
|
|
|
|
|
|
container.add( materialDisplacementMapRow );
|
|
|
|
|
|
+ // roughness map
|
|
|
+
|
|
|
+ var materialRoughnessMapRow = new UI.Row();
|
|
|
+ var materialRoughnessMapEnabled = new UI.Checkbox( false ).onChange( update );
|
|
|
+ var materialRoughnessMap = new UI.Texture().onChange( update );
|
|
|
+
|
|
|
+ materialRoughnessMapRow.add( new UI.Text( 'Rough. Map' ).setWidth( '90px' ) );
|
|
|
+ materialRoughnessMapRow.add( materialRoughnessMapEnabled );
|
|
|
+ materialRoughnessMapRow.add( materialRoughnessMap );
|
|
|
+
|
|
|
+ container.add( materialRoughnessMapRow );
|
|
|
+
|
|
|
+ // metalness map
|
|
|
+
|
|
|
+ var materialMetalnessMapRow = new UI.Row();
|
|
|
+ var materialMetalnessMapEnabled = new UI.Checkbox( false ).onChange( update );
|
|
|
+ var materialMetalnessMap = new UI.Texture().onChange( update );
|
|
|
+
|
|
|
+ materialMetalnessMapRow.add( new UI.Text( 'Metal. Map' ).setWidth( '90px' ) );
|
|
|
+ materialMetalnessMapRow.add( materialMetalnessMapEnabled );
|
|
|
+ materialMetalnessMapRow.add( materialMetalnessMap );
|
|
|
+
|
|
|
+ container.add( materialMetalnessMapRow );
|
|
|
+
|
|
|
// specular map
|
|
|
|
|
|
- var materialSpecularMapRow = new UI.Panel();
|
|
|
+ var materialSpecularMapRow = new UI.Row();
|
|
|
var materialSpecularMapEnabled = new UI.Checkbox( false ).onChange( update );
|
|
|
var materialSpecularMap = new UI.Texture().onChange( update );
|
|
|
|
|
@@ -251,7 +287,7 @@ Sidebar.Material = function ( editor ) {
|
|
|
|
|
|
// env map
|
|
|
|
|
|
- var materialEnvMapRow = new UI.Panel();
|
|
|
+ var materialEnvMapRow = new UI.Row();
|
|
|
var materialEnvMapEnabled = new UI.Checkbox( false ).onChange( update );
|
|
|
var materialEnvMap = new UI.Texture( THREE.SphericalReflectionMapping ).onChange( update );
|
|
|
var materialReflectivity = new UI.Number( 1 ).setWidth( '30px' ).onChange( update );
|
|
@@ -265,7 +301,7 @@ Sidebar.Material = function ( editor ) {
|
|
|
|
|
|
// light map
|
|
|
|
|
|
- var materialLightMapRow = new UI.Panel();
|
|
|
+ var materialLightMapRow = new UI.Row();
|
|
|
var materialLightMapEnabled = new UI.Checkbox( false ).onChange( update );
|
|
|
var materialLightMap = new UI.Texture().onChange( update );
|
|
|
|
|
@@ -277,7 +313,7 @@ Sidebar.Material = function ( editor ) {
|
|
|
|
|
|
// ambient occlusion map
|
|
|
|
|
|
- var materialAOMapRow = new UI.Panel();
|
|
|
+ var materialAOMapRow = new UI.Row();
|
|
|
var materialAOMapEnabled = new UI.Checkbox( false ).onChange( update );
|
|
|
var materialAOMap = new UI.Texture().onChange( update );
|
|
|
var materialAOScale = new UI.Number( 1 ).setRange( 0, 1 ).setWidth( '30px' ).onChange( update );
|
|
@@ -289,9 +325,21 @@ Sidebar.Material = function ( editor ) {
|
|
|
|
|
|
container.add( materialAOMapRow );
|
|
|
|
|
|
+ // emissive map
|
|
|
+
|
|
|
+ var materialEmissiveMapRow = new UI.Row();
|
|
|
+ var materialEmissiveMapEnabled = new UI.Checkbox( false ).onChange( update );
|
|
|
+ var materialEmissiveMap = new UI.Texture().onChange( update );
|
|
|
+
|
|
|
+ materialEmissiveMapRow.add( new UI.Text( 'Emissive Map' ).setWidth( '90px' ) );
|
|
|
+ materialEmissiveMapRow.add( materialEmissiveMapEnabled );
|
|
|
+ materialEmissiveMapRow.add( materialEmissiveMap );
|
|
|
+
|
|
|
+ container.add( materialEmissiveMapRow );
|
|
|
+
|
|
|
// side
|
|
|
|
|
|
- var materialSideRow = new UI.Panel();
|
|
|
+ var materialSideRow = new UI.Row();
|
|
|
var materialSide = new UI.Select().setOptions( {
|
|
|
|
|
|
0: 'Front',
|
|
@@ -307,7 +355,7 @@ Sidebar.Material = function ( editor ) {
|
|
|
|
|
|
// shading
|
|
|
|
|
|
- var materialShadingRow = new UI.Panel();
|
|
|
+ var materialShadingRow = new UI.Row();
|
|
|
var materialShading = new UI.Select().setOptions( {
|
|
|
|
|
|
0: 'No',
|
|
@@ -323,7 +371,7 @@ Sidebar.Material = function ( editor ) {
|
|
|
|
|
|
// blending
|
|
|
|
|
|
- var materialBlendingRow = new UI.Panel();
|
|
|
+ var materialBlendingRow = new UI.Row();
|
|
|
var materialBlending = new UI.Select().setOptions( {
|
|
|
|
|
|
0: 'No',
|
|
@@ -342,8 +390,8 @@ Sidebar.Material = function ( editor ) {
|
|
|
|
|
|
// opacity
|
|
|
|
|
|
- var materialOpacityRow = new UI.Panel();
|
|
|
- var materialOpacity = new UI.Number().setWidth( '60px' ).setRange( 0, 1 ).onChange( update );
|
|
|
+ var materialOpacityRow = new UI.Row();
|
|
|
+ var materialOpacity = new UI.Number( 1 ).setWidth( '60px' ).setRange( 0, 1 ).onChange( update );
|
|
|
|
|
|
materialOpacityRow.add( new UI.Text( 'Opacity' ).setWidth( '90px' ) );
|
|
|
materialOpacityRow.add( materialOpacity );
|
|
@@ -352,7 +400,7 @@ Sidebar.Material = function ( editor ) {
|
|
|
|
|
|
// transparent
|
|
|
|
|
|
- var materialTransparentRow = new UI.Panel();
|
|
|
+ var materialTransparentRow = new UI.Row();
|
|
|
var materialTransparent = new UI.Checkbox().setLeft( '100px' ).onChange( update );
|
|
|
|
|
|
materialTransparentRow.add( new UI.Text( 'Transparent' ).setWidth( '90px' ) );
|
|
@@ -362,7 +410,7 @@ Sidebar.Material = function ( editor ) {
|
|
|
|
|
|
// alpha test
|
|
|
|
|
|
- var materialAlphaTestRow = new UI.Panel();
|
|
|
+ var materialAlphaTestRow = new UI.Row();
|
|
|
var materialAlphaTest = new UI.Number().setWidth( '60px' ).setRange( 0, 1 ).onChange( update );
|
|
|
|
|
|
materialAlphaTestRow.add( new UI.Text( 'Alpha Test' ).setWidth( '90px' ) );
|
|
@@ -372,7 +420,7 @@ Sidebar.Material = function ( editor ) {
|
|
|
|
|
|
// wireframe
|
|
|
|
|
|
- var materialWireframeRow = new UI.Panel();
|
|
|
+ var materialWireframeRow = new UI.Row();
|
|
|
var materialWireframe = new UI.Checkbox( false ).onChange( update );
|
|
|
var materialWireframeLinewidth = new UI.Number( 1 ).setWidth( '60px' ).setRange( 0, 100 ).onChange( update );
|
|
|
|
|
@@ -400,9 +448,9 @@ Sidebar.Material = function ( editor ) {
|
|
|
|
|
|
if ( material ) {
|
|
|
|
|
|
- if ( material.uuid !== undefined ) {
|
|
|
+ if ( material.uuid !== undefined && material.uuid !== materialUUID.getValue() ) {
|
|
|
|
|
|
- material.uuid = materialUUID.getValue();
|
|
|
+ editor.execute( new SetMaterialValueCommand( currentObject, 'uuid', materialUUID.getValue() ) );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -410,7 +458,7 @@ Sidebar.Material = function ( editor ) {
|
|
|
|
|
|
material = new THREE[ materialClass.getValue() ]();
|
|
|
|
|
|
- object.material = material;
|
|
|
+ editor.execute( new SetMaterialCommand( currentObject, material ), 'New Material: ' + materialClass.getValue() );
|
|
|
// TODO Copy other references in the scene graph
|
|
|
// keeping name and UUID then.
|
|
|
// Also there should be means to create a unique
|
|
@@ -419,27 +467,39 @@ Sidebar.Material = function ( editor ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- if ( material.color !== undefined ) {
|
|
|
+ if ( material.color !== undefined && material.color.getHex() !== materialColor.getHexValue() ) {
|
|
|
+
|
|
|
+ editor.execute( new SetMaterialColorCommand( currentObject, 'color', materialColor.getHexValue() ) );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if ( material.roughness !== undefined && Math.abs( material.roughness - materialRoughness.getValue() ) >= 0.01 ) {
|
|
|
|
|
|
- material.color.setHex( materialColor.getHexValue() );
|
|
|
+ editor.execute( new SetMaterialValueCommand( currentObject, 'roughness', materialRoughness.getValue() ) );
|
|
|
|
|
|
}
|
|
|
|
|
|
- if ( material.emissive !== undefined ) {
|
|
|
+ if ( material.metalness !== undefined && Math.abs( material.metalness - materialMetalness.getValue() ) >= 0.01 ) {
|
|
|
|
|
|
- material.emissive.setHex( materialEmissive.getHexValue() );
|
|
|
+ editor.execute( new SetMaterialValueCommand( currentObject, 'metalness', materialMetalness.getValue() ) );
|
|
|
|
|
|
}
|
|
|
|
|
|
- if ( material.specular !== undefined ) {
|
|
|
+ if ( material.emissive !== undefined && material.emissive.getHex() !== materialEmissive.getHexValue() ) {
|
|
|
|
|
|
- material.specular.setHex( materialSpecular.getHexValue() );
|
|
|
+ editor.execute( new SetMaterialColorCommand( currentObject, 'emissive', materialEmissive.getHexValue() ) );
|
|
|
|
|
|
}
|
|
|
|
|
|
- if ( material.shininess !== undefined ) {
|
|
|
+ if ( material.specular !== undefined && material.specular.getHex() !== materialSpecular.getHexValue() ) {
|
|
|
|
|
|
- material.shininess = materialShininess.getValue();
|
|
|
+ editor.execute( new SetMaterialColorCommand( currentObject, 'specular', materialSpecular.getHexValue() ) );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if ( material.shininess !== undefined && Math.abs( material.shininess - materialShininess.getValue() ) >= 0.01 ) {
|
|
|
+
|
|
|
+ editor.execute( new SetMaterialValueCommand( currentObject, 'shininess', materialShininess.getValue() ) );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -449,16 +509,15 @@ Sidebar.Material = function ( editor ) {
|
|
|
|
|
|
if ( material.vertexColors !== vertexColors ) {
|
|
|
|
|
|
- material.vertexColors = vertexColors;
|
|
|
- material.needsUpdate = true;
|
|
|
+ editor.execute( new SetMaterialValueCommand( currentObject, 'vertexColors', vertexColors ) );
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
- if ( material.skinning !== undefined ) {
|
|
|
+ if ( material.skinning !== undefined && material.skinning !== materialSkinning.getValue() ) {
|
|
|
|
|
|
- material.skinning = materialSkinning.getValue();
|
|
|
+ editor.execute( new SetMaterialValueCommand( currentObject, 'skinning', materialSkinning.getValue() ) );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -468,8 +527,12 @@ Sidebar.Material = function ( editor ) {
|
|
|
|
|
|
if ( objectHasUvs ) {
|
|
|
|
|
|
- material.map = mapEnabled ? materialMap.getValue() : null;
|
|
|
- material.needsUpdate = true;
|
|
|
+ var map = mapEnabled ? materialMap.getValue() : null;
|
|
|
+ if ( material.map !== map ) {
|
|
|
+
|
|
|
+ editor.execute( new SetMaterialMapCommand( currentObject, 'map', map ) );
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
} else {
|
|
|
|
|
@@ -485,8 +548,12 @@ Sidebar.Material = function ( editor ) {
|
|
|
|
|
|
if ( objectHasUvs ) {
|
|
|
|
|
|
- material.alphaMap = mapEnabled ? materialAlphaMap.getValue() : null;
|
|
|
- material.needsUpdate = true;
|
|
|
+ var alphaMap = mapEnabled ? materialAlphaMap.getValue() : null;
|
|
|
+ if ( material.alphaMap !== alphaMap ) {
|
|
|
+
|
|
|
+ editor.execute( new SetMaterialMapCommand( currentObject, 'alphaMap', alphaMap ) );
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
} else {
|
|
|
|
|
@@ -502,9 +569,18 @@ Sidebar.Material = function ( editor ) {
|
|
|
|
|
|
if ( objectHasUvs ) {
|
|
|
|
|
|
- material.bumpMap = bumpMapEnabled ? materialBumpMap.getValue() : null;
|
|
|
- material.bumpScale = materialBumpScale.getValue();
|
|
|
- material.needsUpdate = true;
|
|
|
+ var bumpMap = bumpMapEnabled ? materialBumpMap.getValue() : null;
|
|
|
+ if ( material.bumpMap !== bumpMap ) {
|
|
|
+
|
|
|
+ editor.execute( new SetMaterialMapCommand( currentObject, 'bumpMap', bumpMap ) );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if ( material.bumpScale !== materialBumpScale.getValue() ) {
|
|
|
+
|
|
|
+ editor.execute( new SetMaterialValueCommand( currentObject, 'bumpScale', materialBumpScale.getValue() ) );
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
} else {
|
|
|
|
|
@@ -520,8 +596,12 @@ Sidebar.Material = function ( editor ) {
|
|
|
|
|
|
if ( objectHasUvs ) {
|
|
|
|
|
|
- material.normalMap = normalMapEnabled ? materialNormalMap.getValue() : null;
|
|
|
- material.needsUpdate = true;
|
|
|
+ var normalMap = normalMapEnabled ? materialNormalMap.getValue() : null;
|
|
|
+ if ( material.normalMap !== normalMap ) {
|
|
|
+
|
|
|
+ editor.execute( new SetMaterialMapCommand( currentObject, 'normalMap', normalMap ) );
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
} else {
|
|
|
|
|
@@ -537,9 +617,18 @@ Sidebar.Material = function ( editor ) {
|
|
|
|
|
|
if ( objectHasUvs ) {
|
|
|
|
|
|
- material.displacementMap = displacementMapEnabled ? materialDisplacementMap.getValue() : null;
|
|
|
- material.displacementScale = materialDisplacementScale.getValue();
|
|
|
- material.needsUpdate = true;
|
|
|
+ var displacementMap = displacementMapEnabled ? materialDisplacementMap.getValue() : null;
|
|
|
+ if ( material.displacementMap !== displacementMap ) {
|
|
|
+
|
|
|
+ editor.execute( new SetMaterialMapCommand( currentObject, 'displacementMap', displacementMap ) );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if ( material.displacementScale !== materialDisplacementScale.getValue() ) {
|
|
|
+
|
|
|
+ editor.execute( new SetMaterialValueCommand( currentObject, 'displacementScale', materialDisplacementScale.getValue() ) );
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
} else {
|
|
|
|
|
@@ -549,14 +638,72 @@ Sidebar.Material = function ( editor ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ if ( material.roughnessMap !== undefined ) {
|
|
|
+
|
|
|
+ var roughnessMapEnabled = materialRoughnessMapEnabled.getValue() === true;
|
|
|
+
|
|
|
+ if ( objectHasUvs ) {
|
|
|
+
|
|
|
+ var roughnessMap = roughnessMapEnabled ? materialRoughnessMap.getValue() : null;
|
|
|
+ if ( material.roughnessMap !== roughnessMap ) {
|
|
|
+
|
|
|
+ editor.execute( new SetMaterialMapCommand( currentObject, 'roughnessMap', roughnessMap ) );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if ( material.displacementScale !== materialDisplacementScale.getValue() ) {
|
|
|
+
|
|
|
+ editor.execute( new SetMaterialValueCommand( currentObject, 'displacementScale', materialDisplacementScale.getValue() ) );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ if ( roughnessMapEnabled ) textureWarning = true;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if ( material.metalnessMap !== undefined ) {
|
|
|
+
|
|
|
+ var metalnessMapEnabled = materialMetalnessMapEnabled.getValue() === true;
|
|
|
+
|
|
|
+ if ( objectHasUvs ) {
|
|
|
+
|
|
|
+ var metalnessMap = metalnessMapEnabled ? materialMetalnessMap.getValue() : null;
|
|
|
+ if ( material.metalnessMap !== metalnessMap ) {
|
|
|
+
|
|
|
+ editor.execute( new SetMaterialMapCommand( currentObject, 'metalnessMap', metalnessMap ) );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if ( material.displacementScale !== materialDisplacementScale.getValue() ) {
|
|
|
+
|
|
|
+ editor.execute( new SetMaterialValueCommand( currentObject, 'displacementScale', materialDisplacementScale.getValue() ) );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ if ( metalnessMapEnabled ) textureWarning = true;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
if ( material.specularMap !== undefined ) {
|
|
|
|
|
|
var specularMapEnabled = materialSpecularMapEnabled.getValue() === true;
|
|
|
|
|
|
if ( objectHasUvs ) {
|
|
|
|
|
|
- material.specularMap = specularMapEnabled ? materialSpecularMap.getValue() : null;
|
|
|
- material.needsUpdate = true;
|
|
|
+ var specularMap = specularMapEnabled ? materialSpecularMap.getValue() : null;
|
|
|
+ if ( material.specularMap !== specularMap ) {
|
|
|
+
|
|
|
+ editor.execute( new SetMaterialMapCommand( currentObject, 'specularMap', specularMap ) );
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
} else {
|
|
|
|
|
@@ -570,12 +717,21 @@ Sidebar.Material = function ( editor ) {
|
|
|
|
|
|
var envMapEnabled = materialEnvMapEnabled.getValue() === true;
|
|
|
|
|
|
- material.envMap = envMapEnabled ? materialEnvMap.getValue() : null;
|
|
|
- material.reflectivity = materialReflectivity.getValue();
|
|
|
- material.needsUpdate = true;
|
|
|
+ var envMap = envMapEnabled ? materialEnvMap.getValue() : null;
|
|
|
|
|
|
- }
|
|
|
+ if ( material.envMap !== envMap ) {
|
|
|
+
|
|
|
+ editor.execute( new SetMaterialMapCommand( currentObject, 'envMap', envMap ) );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if ( material.reflectivity !== materialReflectivity.getValue() ) {
|
|
|
|
|
|
+ editor.execute( new SetMaterialValueCommand( currentObject, 'reflectivity', materialReflectivity.getValue() ) );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
if ( material.lightMap !== undefined ) {
|
|
|
|
|
@@ -583,8 +739,12 @@ Sidebar.Material = function ( editor ) {
|
|
|
|
|
|
if ( objectHasUvs ) {
|
|
|
|
|
|
- material.lightMap = lightMapEnabled ? materialLightMap.getValue() : null;
|
|
|
- material.needsUpdate = true;
|
|
|
+ var lightMap = lightMapEnabled ? materialLightMap.getValue() : null;
|
|
|
+ if ( material.lightMap !== lightMap ) {
|
|
|
+
|
|
|
+ editor.execute( new SetMaterialMapCommand( currentObject, 'lightMap', lightMap ) );
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
} else {
|
|
|
|
|
@@ -600,9 +760,18 @@ Sidebar.Material = function ( editor ) {
|
|
|
|
|
|
if ( objectHasUvs ) {
|
|
|
|
|
|
- material.aoMap = aoMapEnabled ? materialAOMap.getValue() : null;
|
|
|
- material.aoMapIntensity = materialAOScale.getValue();
|
|
|
- material.needsUpdate = true;
|
|
|
+ var aoMap = aoMapEnabled ? materialAOMap.getValue() : null;
|
|
|
+ if ( material.aoMap !== aoMap ) {
|
|
|
+
|
|
|
+ editor.execute( new SetMaterialMapCommand( currentObject, 'aoMap', aoMap ) );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if ( material.aoMapIntensity !== materialAOScale.getValue() ) {
|
|
|
+
|
|
|
+ editor.execute( new SetMaterialValueCommand( currentObject, 'aoMapIntensity', materialAOScale.getValue() ) );
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
} else {
|
|
|
|
|
@@ -612,55 +781,92 @@ Sidebar.Material = function ( editor ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ if ( material.emissiveMap !== undefined ) {
|
|
|
+
|
|
|
+ var emissiveMapEnabled = materialEmissiveMapEnabled.getValue() === true;
|
|
|
+
|
|
|
+ if ( objectHasUvs ) {
|
|
|
+
|
|
|
+ var emissiveMap = emissiveMapEnabled ? materialEmissiveMap.getValue() : null;
|
|
|
+ if ( material.emissiveMap !== emissiveMap ) {
|
|
|
+
|
|
|
+ editor.execute( new SetMaterialMapCommand( currentObject, 'emissiveMap', emissiveMap ) );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ if ( emissiveMapEnabled ) textureWarning = true;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
if ( material.side !== undefined ) {
|
|
|
|
|
|
- material.side = parseInt( materialSide.getValue() );
|
|
|
+ var side = parseInt( materialSide.getValue() );
|
|
|
+ if ( material.side !== side ) {
|
|
|
+
|
|
|
+ editor.execute( new SetMaterialValueCommand( currentObject, 'side', side ) );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
}
|
|
|
|
|
|
if ( material.shading !== undefined ) {
|
|
|
|
|
|
- material.shading = parseInt( materialShading.getValue() );
|
|
|
+ var shading = parseInt( materialShading.getValue() );
|
|
|
+ if ( material.shading !== shading ) {
|
|
|
+
|
|
|
+ editor.execute( new SetMaterialValueCommand( currentObject, 'shading', shading ) );
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|
|
|
if ( material.blending !== undefined ) {
|
|
|
|
|
|
- material.blending = parseInt( materialBlending.getValue() );
|
|
|
+ var blending = parseInt( materialBlending.getValue() );
|
|
|
+ if ( material.blending !== blending ) {
|
|
|
+
|
|
|
+ editor.execute( new SetMaterialValueCommand( currentObject, 'blending', blending ) );
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|
|
|
- if ( material.opacity !== undefined ) {
|
|
|
+ if ( material.opacity !== undefined && Math.abs( material.opacity - materialOpacity.getValue() ) >= 0.01 ) {
|
|
|
|
|
|
- material.opacity = materialOpacity.getValue();
|
|
|
+ editor.execute( new SetMaterialValueCommand( currentObject, 'opacity', materialOpacity.getValue() ) );
|
|
|
|
|
|
}
|
|
|
|
|
|
- if ( material.transparent !== undefined ) {
|
|
|
+ if ( material.transparent !== undefined && material.transparent !== materialTransparent.getValue() ) {
|
|
|
|
|
|
- material.transparent = materialTransparent.getValue();
|
|
|
+ editor.execute( new SetMaterialValueCommand( currentObject, 'transparent', materialTransparent.getValue() ) );
|
|
|
|
|
|
}
|
|
|
|
|
|
- if ( material.alphaTest !== undefined ) {
|
|
|
+ if ( material.alphaTest !== undefined && Math.abs( material.alphaTest - materialAlphaTest.getValue() ) >= 0.01 ) {
|
|
|
|
|
|
- material.alphaTest = materialAlphaTest.getValue();
|
|
|
+ editor.execute( new SetMaterialValueCommand( currentObject, 'alphaTest', materialAlphaTest.getValue() ) );
|
|
|
|
|
|
}
|
|
|
|
|
|
- if ( material.wireframe !== undefined ) {
|
|
|
+ if ( material.wireframe !== undefined && material.wireframe !== materialWireframe.getValue() ) {
|
|
|
|
|
|
- material.wireframe = materialWireframe.getValue();
|
|
|
+ editor.execute( new SetMaterialValueCommand( currentObject, 'wireframe', materialWireframe.getValue() ) );
|
|
|
|
|
|
}
|
|
|
|
|
|
- if ( material.wireframeLinewidth !== undefined ) {
|
|
|
+ if ( material.wireframeLinewidth !== undefined && Math.abs( material.wireframeLinewidth - materialWireframeLinewidth.getValue() ) >= 0.01 ) {
|
|
|
|
|
|
- material.wireframeLinewidth = materialWireframeLinewidth.getValue();
|
|
|
+ editor.execute( new SetMaterialValueCommand( currentObject, 'wireframeLinewidth', materialWireframeLinewidth.getValue() ) );
|
|
|
|
|
|
}
|
|
|
|
|
|
- refreshUi(false);
|
|
|
+ refreshUI( false );
|
|
|
|
|
|
signals.materialChanged.dispatch( material );
|
|
|
|
|
@@ -672,7 +878,7 @@ Sidebar.Material = function ( editor ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- };
|
|
|
+ }
|
|
|
|
|
|
//
|
|
|
|
|
@@ -681,6 +887,8 @@ Sidebar.Material = function ( editor ) {
|
|
|
var properties = {
|
|
|
'name': materialNameRow,
|
|
|
'color': materialColorRow,
|
|
|
+ 'roughness': materialRoughnessRow,
|
|
|
+ 'metalness': materialMetalnessRow,
|
|
|
'emissive': materialEmissiveRow,
|
|
|
'specular': materialSpecularRow,
|
|
|
'shininess': materialShininessRow,
|
|
@@ -692,10 +900,13 @@ Sidebar.Material = function ( editor ) {
|
|
|
'bumpMap': materialBumpMapRow,
|
|
|
'normalMap': materialNormalMapRow,
|
|
|
'displacementMap': materialDisplacementMapRow,
|
|
|
+ 'roughnessMap': materialRoughnessMapRow,
|
|
|
+ 'metalnessMap': materialMetalnessMapRow,
|
|
|
'specularMap': materialSpecularMapRow,
|
|
|
'envMap': materialEnvMapRow,
|
|
|
'lightMap': materialLightMapRow,
|
|
|
'aoMap': materialAOMapRow,
|
|
|
+ 'emissiveMap': materialEmissiveMapRow,
|
|
|
'side': materialSideRow,
|
|
|
'shading': materialShadingRow,
|
|
|
'blending': materialBlendingRow,
|
|
@@ -713,10 +924,12 @@ Sidebar.Material = function ( editor ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- };
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
+ function refreshUI( resetTextureSelectors ) {
|
|
|
|
|
|
- function refreshUi( resetTextureSelectors ) {
|
|
|
+ if ( ! currentObject ) return;
|
|
|
|
|
|
var material = currentObject.material;
|
|
|
|
|
@@ -740,6 +953,18 @@ Sidebar.Material = function ( editor ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ if ( material.roughness !== undefined ) {
|
|
|
+
|
|
|
+ materialRoughness.setValue( material.roughness );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if ( material.metalness !== undefined ) {
|
|
|
+
|
|
|
+ materialMetalness.setValue( material.metalness );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
if ( material.emissive !== undefined ) {
|
|
|
|
|
|
materialEmissive.setHexValue( material.emissive.getHexString() );
|
|
@@ -834,6 +1059,30 @@ Sidebar.Material = function ( editor ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ if ( material.roughnessMap !== undefined ) {
|
|
|
+
|
|
|
+ materialRoughnessMapEnabled.setValue( material.roughnessMap !== null );
|
|
|
+
|
|
|
+ if ( material.roughnessMap !== null || resetTextureSelectors ) {
|
|
|
+
|
|
|
+ materialRoughnessMap.setValue( material.roughnessMap );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if ( material.metalnessMap !== undefined ) {
|
|
|
+
|
|
|
+ materialMetalnessMapEnabled.setValue( material.metalnessMap !== null );
|
|
|
+
|
|
|
+ if ( material.metalnessMap !== null || resetTextureSelectors ) {
|
|
|
+
|
|
|
+ materialMetalnessMap.setValue( material.metalnessMap );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
if ( material.specularMap !== undefined ) {
|
|
|
|
|
|
materialSpecularMapEnabled.setValue( material.specularMap !== null );
|
|
@@ -886,6 +1135,18 @@ Sidebar.Material = function ( editor ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ if ( material.emissiveMap !== undefined ) {
|
|
|
+
|
|
|
+ materialEmissiveMapEnabled.setValue( material.emissiveMap !== null );
|
|
|
+
|
|
|
+ if ( material.emissiveMap !== null || resetTextureSelectors ) {
|
|
|
+
|
|
|
+ materialEmissiveMap.setValue( material.emissiveMap );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
if ( material.side !== undefined ) {
|
|
|
|
|
|
materialSide.setValue( material.side );
|
|
@@ -947,7 +1208,7 @@ Sidebar.Material = function ( editor ) {
|
|
|
var objectChanged = object !== currentObject;
|
|
|
|
|
|
currentObject = object;
|
|
|
- refreshUi(objectChanged);
|
|
|
+ refreshUI( objectChanged );
|
|
|
container.setDisplay( '' );
|
|
|
|
|
|
} else {
|
|
@@ -959,6 +1220,12 @@ Sidebar.Material = function ( editor ) {
|
|
|
|
|
|
} );
|
|
|
|
|
|
+ signals.materialChanged.add( function () {
|
|
|
+
|
|
|
+ refreshUI();
|
|
|
+
|
|
|
+ } );
|
|
|
+
|
|
|
return container;
|
|
|
|
|
|
-}
|
|
|
+};
|