You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
earthquake_3d_viewer_front/three/editor/js/Sidebar.Project.Renderer.js

145 lines
4.4 KiB
JavaScript

import * as THREE from 'three';
import { UINumber, UIPanel, UIRow, UISelect, UIText } from './libs/ui.js';
import { UIBoolean } from './libs/ui.three.js';
function SidebarProjectRenderer( editor ) {
const config = editor.config;
const signals = editor.signals;
const strings = editor.strings;
let currentRenderer = null;
const container = new UIPanel();
container.setBorderTop( '0px' );
// Antialias
const antialiasRow = new UIRow();
container.add( antialiasRow );
antialiasRow.add( new UIText( strings.getKey( 'sidebar/project/antialias' ) ).setClass( 'Label' ) );
const antialiasBoolean = new UIBoolean( config.getKey( 'project/renderer/antialias' ) ).onChange( createRenderer );
antialiasRow.add( antialiasBoolean );
// Shadows
const shadowsRow = new UIRow();
container.add( shadowsRow );
shadowsRow.add( new UIText( strings.getKey( 'sidebar/project/shadows' ) ).setClass( 'Label' ) );
const shadowsBoolean = new UIBoolean( config.getKey( 'project/renderer/shadows' ) ).onChange( updateShadows );
shadowsRow.add( shadowsBoolean );
const shadowTypeSelect = new UISelect().setOptions( {
0: 'Basic',
1: 'PCF',
2: 'PCF Soft',
// 3: 'VSM'
} ).setWidth( '125px' ).onChange( updateShadows );
shadowTypeSelect.setValue( config.getKey( 'project/renderer/shadowType' ) );
shadowsRow.add( shadowTypeSelect );
function updateShadows() {
currentRenderer.shadowMap.enabled = shadowsBoolean.getValue();
currentRenderer.shadowMap.type = parseFloat( shadowTypeSelect.getValue() );
signals.rendererUpdated.dispatch();
}
// Tonemapping
const toneMappingRow = new UIRow();
container.add( toneMappingRow );
toneMappingRow.add( new UIText( strings.getKey( 'sidebar/project/toneMapping' ) ).setClass( 'Label' ) );
const toneMappingSelect = new UISelect().setOptions( {
0: 'No',
1: 'Linear',
2: 'Reinhard',
3: 'Cineon',
4: 'ACESFilmic',
6: 'AgX',
7: 'Neutral'
} ).setWidth( '120px' ).onChange( updateToneMapping );
toneMappingSelect.setValue( config.getKey( 'project/renderer/toneMapping' ) );
toneMappingRow.add( toneMappingSelect );
const toneMappingExposure = new UINumber( config.getKey( 'project/renderer/toneMappingExposure' ) );
toneMappingExposure.setDisplay( toneMappingSelect.getValue() === '0' ? 'none' : '' );
toneMappingExposure.setWidth( '30px' ).setMarginLeft( '10px' );
toneMappingExposure.setRange( 0, 10 );
toneMappingExposure.onChange( updateToneMapping );
toneMappingRow.add( toneMappingExposure );
function updateToneMapping() {
toneMappingExposure.setDisplay( toneMappingSelect.getValue() === '0' ? 'none' : '' );
currentRenderer.toneMapping = parseFloat( toneMappingSelect.getValue() );
currentRenderer.toneMappingExposure = toneMappingExposure.getValue();
signals.rendererUpdated.dispatch();
}
//
function createRenderer() {
currentRenderer = new THREE.WebGLRenderer( { antialias: antialiasBoolean.getValue() } );
currentRenderer.shadowMap.enabled = shadowsBoolean.getValue();
currentRenderer.shadowMap.type = parseFloat( shadowTypeSelect.getValue() );
currentRenderer.toneMapping = parseFloat( toneMappingSelect.getValue() );
currentRenderer.toneMappingExposure = toneMappingExposure.getValue();
signals.rendererCreated.dispatch( currentRenderer );
signals.rendererUpdated.dispatch();
}
createRenderer();
// Signals
signals.editorCleared.add( function () {
currentRenderer.shadowMap.enabled = true;
currentRenderer.shadowMap.type = THREE.PCFShadowMap;
currentRenderer.toneMapping = THREE.NoToneMapping;
currentRenderer.toneMappingExposure = 1;
shadowsBoolean.setValue( currentRenderer.shadowMap.enabled );
shadowTypeSelect.setValue( currentRenderer.shadowMap.type );
toneMappingSelect.setValue( currentRenderer.toneMapping );
toneMappingExposure.setValue( currentRenderer.toneMappingExposure );
toneMappingExposure.setDisplay( currentRenderer.toneMapping === 0 ? 'none' : '' );
signals.rendererUpdated.dispatch();
} );
signals.rendererUpdated.add( function () {
config.setKey(
'project/renderer/antialias', antialiasBoolean.getValue(),
'project/renderer/shadows', shadowsBoolean.getValue(),
'project/renderer/shadowType', parseFloat( shadowTypeSelect.getValue() ),
'project/renderer/toneMapping', parseFloat( toneMappingSelect.getValue() ),
'project/renderer/toneMappingExposure', toneMappingExposure.getValue()
);
} );
return container;
}
export { SidebarProjectRenderer };