提交 2d05e450 编写于 作者: M Mr.doob

Editor: Reworking scripting.

上级 1bd90693
......@@ -77,7 +77,6 @@
<script src="js/Sidebar.Geometry.TorusKnotGeometry.js"></script>
<script src="js/Sidebar.Material.js"></script>
<script src="js/Sidebar.Script.js"></script>
<script src="js/Sidebar.Script.Editor.js"></script>
<script src="js/Toolbar.js"></script>
<script src="js/Viewport.js"></script>
<script src="js/Viewport.Info.js"></script>
......
......@@ -49,6 +49,9 @@ var Editor = function () {
helperRemoved: new SIGNALS.Signal(),
materialChanged: new SIGNALS.Signal(),
scriptChanged: new SIGNALS.Signal(),
fogTypeChanged: new SIGNALS.Signal(),
fogColorChanged: new SIGNALS.Signal(),
fogParametersChanged: new SIGNALS.Signal(),
......@@ -384,7 +387,7 @@ Editor.prototype = {
this.camera.aspect = camera.aspect;
this.camera.near = camera.near;
this.camera.far = camera.far;
this.setScene( loader.parse( json.scene ) );
this.scripts = json.scripts;
......
/**
* @author mrdoob / http://mrdoob.com/
*/
Sidebar.Script.Editor = function ( editor ) {
var signals = editor.signals;
var timeout;
var scriptSource = new UI.TextArea( 'javascript' ).setWidth( '240px' ).setHeight( '180px' ).setFontSize( '12px' );
scriptSource.onKeyUp( function () {
clearTimeout( timeout );
timeout = setTimeout( function () {
var object = editor.selected;
var source = scriptSource.getValue();
try {
var script = new Function( 'scene', 'time', source ).bind( object.clone() );
script( new THREE.Scene(), 0 );
scriptSource.dom.classList.add( 'success' );
scriptSource.dom.classList.remove( 'fail' );
} catch ( error ) {
scriptSource.dom.classList.remove( 'success' );
scriptSource.dom.classList.add( 'fail' );
return;
}
editor.scripts[ object.uuid ] = source;
editor.signals.objectChanged.dispatch( object );
}, 500 );
} );
signals.objectSelected.add( function ( object ) {
if ( object !== null ) {
var script = editor.scripts[ object.uuid ];
if ( script !== undefined ) {
scriptSource.setValue( script );
} else {
scriptSource.setValue( '' );
}
}
} );
return scriptSource;
}
......@@ -18,15 +18,67 @@ Sidebar.Script = function ( editor ) {
container.addStatic( new UI.Text( 'Script' ).setTextTransform( 'uppercase' ) );
container.add( new UI.Break() );
var source = new Sidebar.Script.Editor( editor );
container.add( source );
var scripts = new UI.Panel();
container.add( scripts );
//
var scriptEvent = new UI.Select();
scriptEvent.setOptions( {
'init': 'init',
'keydown': 'keydown',
'keyup': 'keyup',
'update': 'update'
} );
container.add( scriptEvent );
var addButton = new UI.Button( 'Add' );
addButton.onClick( function () {
var script = new UI.ScriptEditor();
script.onChange( function () {
signals.scriptChanged.dispatch();
} );
scripts.add( script );
} );
container.add( addButton );
// signals
signals.objectSelected.add( function ( object ) {
scripts.clear();
if ( object !== null ) {
container.setDisplay( 'block' );
var sources = editor.scripts[ object.uuid ];
if ( sources !== undefined ) {
for ( var i = 0; i < sources.length; i ++ ) {
var source = sources[ i ];
var script = new UI.ScriptEditor();
script.setValue( source );
script.onChange( function () {
signals.scriptChanged.dispatch();
} );
scripts.add( script );
}
}
} else {
container.setDisplay( 'none' );
......@@ -35,6 +87,22 @@ Sidebar.Script = function ( editor ) {
} );
signals.scriptChanged.add( function () {
var array = [];
var object = editor.selected;
for ( var i = 0; i < scripts.children.length; i ++ ) {
var script = scripts.children[ i ];
array.push( script.getValue() );
}
editor.scripts[ object.uuid ] = array;
} );
return container;
}
};
......@@ -13,7 +13,7 @@ var Sidebar = function ( editor ) {
container.add( new Sidebar.Geometry( editor ) );
container.add( new Sidebar.Material( editor ) );
container.add( new Sidebar.Animation( editor ) );
// container.add( new Sidebar.Script( editor ) );
container.add( new Sidebar.Script( editor ) );
return container;
......
......@@ -12,7 +12,7 @@ var APP = {
var scripts = {
update: []
};
this.dom = undefined;
this.load = function ( json ) {
......@@ -28,14 +28,15 @@ var APP = {
for ( var uuid in json.scripts ) {
var source = json.scripts[ uuid ];
var object = scene.getObjectByProperty( 'uuid', uuid, true );
var sources = json.scripts[ uuid ];
var script = ( new Function( 'scene', 'time', source ).bind( object ) )();
for ( var i = 0; i < sources.length; i ++ ) {
if ( script.update !== undefined ) {
var source = sources[ i ];
scripts.update.push( script.update );
var script = ( new Function( 'scene', 'time', source ).bind( object ) );
scripts.update.push( script );
}
......
/* BASICS */
.CodeMirror {
/* Set height, width, borders, and global font properties here */
font-family: monospace;
height: 300px;
}
.CodeMirror-scroll {
/* Set scrolling behaviour here */
overflow: auto;
}
/* PADDING */
.CodeMirror-lines {
padding: 4px 0; /* Vertical padding around content */
}
.CodeMirror pre {
padding: 0 4px; /* Horizontal padding of content */
}
.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
background-color: white; /* The little square between H and V scrollbars */
}
/* GUTTER */
.CodeMirror-gutters {
border-right: 1px solid #ddd;
background-color: #f7f7f7;
white-space: nowrap;
}
.CodeMirror-linenumbers {}
.CodeMirror-linenumber {
padding: 0 3px 0 5px;
min-width: 20px;
text-align: right;
color: #999;
-moz-box-sizing: content-box;
box-sizing: content-box;
}
.CodeMirror-guttermarker { color: black; }
.CodeMirror-guttermarker-subtle { color: #999; }
/* CURSOR */
.CodeMirror div.CodeMirror-cursor {
border-left: 1px solid black;
}
/* Shown when moving in bi-directional text */
.CodeMirror div.CodeMirror-secondarycursor {
border-left: 1px solid silver;
}
.CodeMirror.cm-keymap-fat-cursor div.CodeMirror-cursor {
width: auto;
border: 0;
background: #7e7;
}
.cm-animate-fat-cursor {
width: auto;
border: 0;
-webkit-animation: blink 1.06s steps(1) infinite;
-moz-animation: blink 1.06s steps(1) infinite;
animation: blink 1.06s steps(1) infinite;
}
@-moz-keyframes blink {
0% { background: #7e7; }
50% { background: none; }
100% { background: #7e7; }
}
@-webkit-keyframes blink {
0% { background: #7e7; }
50% { background: none; }
100% { background: #7e7; }
}
@keyframes blink {
0% { background: #7e7; }
50% { background: none; }
100% { background: #7e7; }
}
/* Can style cursor different in overwrite (non-insert) mode */
div.CodeMirror-overwrite div.CodeMirror-cursor {}
.cm-tab { display: inline-block; }
.CodeMirror-ruler {
border-left: 1px solid #ccc;
position: absolute;
}
/* DEFAULT THEME */
.cm-s-default .cm-keyword {color: #708;}
.cm-s-default .cm-atom {color: #219;}
.cm-s-default .cm-number {color: #164;}
.cm-s-default .cm-def {color: #00f;}
.cm-s-default .cm-variable,
.cm-s-default .cm-punctuation,
.cm-s-default .cm-property,
.cm-s-default .cm-operator {}
.cm-s-default .cm-variable-2 {color: #05a;}
.cm-s-default .cm-variable-3 {color: #085;}
.cm-s-default .cm-comment {color: #a50;}
.cm-s-default .cm-string {color: #a11;}
.cm-s-default .cm-string-2 {color: #f50;}
.cm-s-default .cm-meta {color: #555;}
.cm-s-default .cm-qualifier {color: #555;}
.cm-s-default .cm-builtin {color: #30a;}
.cm-s-default .cm-bracket {color: #997;}
.cm-s-default .cm-tag {color: #170;}
.cm-s-default .cm-attribute {color: #00c;}
.cm-s-default .cm-header {color: blue;}
.cm-s-default .cm-quote {color: #090;}
.cm-s-default .cm-hr {color: #999;}
.cm-s-default .cm-link {color: #00c;}
.cm-negative {color: #d44;}
.cm-positive {color: #292;}
.cm-header, .cm-strong {font-weight: bold;}
.cm-em {font-style: italic;}
.cm-link {text-decoration: underline;}
.cm-s-default .cm-error {color: #f00;}
.cm-invalidchar {color: #f00;}
/* Default styles for common addons */
div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}
div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); }
.CodeMirror-activeline-background {background: #e8f2ff;}
/* STOP */
/* The rest of this file contains styles related to the mechanics of
the editor. You probably shouldn't touch them. */
.CodeMirror {
line-height: 1;
position: relative;
overflow: hidden;
background: white;
color: black;
}
.CodeMirror-scroll {
/* 30px is the magic margin used to hide the element's real scrollbars */
/* See overflow: hidden in .CodeMirror */
margin-bottom: -30px; margin-right: -30px;
padding-bottom: 30px;
height: 100%;
outline: none; /* Prevent dragging from highlighting the element */
position: relative;
-moz-box-sizing: content-box;
box-sizing: content-box;
}
.CodeMirror-sizer {
position: relative;
border-right: 30px solid transparent;
-moz-box-sizing: content-box;
box-sizing: content-box;
}
/* The fake, visible scrollbars. Used to force redraw during scrolling
before actuall scrolling happens, thus preventing shaking and
flickering artifacts. */
.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
position: absolute;
z-index: 6;
display: none;
}
.CodeMirror-vscrollbar {
right: 0; top: 0;
overflow-x: hidden;
overflow-y: scroll;
}
.CodeMirror-hscrollbar {
bottom: 0; left: 0;
overflow-y: hidden;
overflow-x: scroll;
}
.CodeMirror-scrollbar-filler {
right: 0; bottom: 0;
}
.CodeMirror-gutter-filler {
left: 0; bottom: 0;
}
.CodeMirror-gutters {
position: absolute; left: 0; top: 0;
padding-bottom: 30px;
z-index: 3;
}
.CodeMirror-gutter {
white-space: normal;
height: 100%;
-moz-box-sizing: content-box;
box-sizing: content-box;
padding-bottom: 30px;
margin-bottom: -32px;
display: inline-block;
/* Hack to make IE7 behave */
*zoom:1;
*display:inline;
}
.CodeMirror-gutter-elt {
position: absolute;
cursor: default;
z-index: 4;
}
.CodeMirror-lines {
cursor: text;
}
.CodeMirror pre {
/* Reset some styles that the rest of the page might have set */
-moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;
border-width: 0;
background: transparent;
font-family: inherit;
font-size: inherit;
margin: 0;
white-space: pre;
word-wrap: normal;
line-height: inherit;
color: inherit;
z-index: 2;
position: relative;
overflow: visible;
}
.CodeMirror-wrap pre {
word-wrap: break-word;
white-space: pre-wrap;
word-break: normal;
}
.CodeMirror-linebackground {
position: absolute;
left: 0; right: 0; top: 0; bottom: 0;
z-index: 0;
}
.CodeMirror-linewidget {
position: relative;
z-index: 2;
overflow: auto;
}
.CodeMirror-widget {}
.CodeMirror-wrap .CodeMirror-scroll {
overflow-x: hidden;
}
.CodeMirror-measure {
position: absolute;
width: 100%;
height: 0;
overflow: hidden;
visibility: hidden;
}
.CodeMirror-measure pre { position: static; }
.CodeMirror div.CodeMirror-cursor {
position: absolute;
border-right: none;
width: 0;
}
div.CodeMirror-cursors {
visibility: hidden;
position: relative;
z-index: 1;
}
.CodeMirror-focused div.CodeMirror-cursors {
visibility: visible;
}
.CodeMirror-selected { background: #d9d9d9; }
.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }
.CodeMirror-crosshair { cursor: crosshair; }
.cm-searching {
background: #ffa;
background: rgba(255, 255, 0, .4);
}
/* IE7 hack to prevent it from returning funny offsetTops on the spans */
.CodeMirror span { *vertical-align: text-bottom; }
/* Used to force a border model for a node */
.cm-force-border { padding-right: .1px; }
@media print {
/* Hide the cursor when printing */
.CodeMirror div.CodeMirror-cursors {
visibility: hidden;
}
}
此差异已折叠。
此差异已折叠。
......@@ -2,73 +2,78 @@
* @author mrdoob / http://mrdoob.com/
*/
UI.CodeEditor = function ( mode ) {
UI.ScriptEditor = function () {
UI.Element.call( this );
UI.Panel.call( this );
var scope = this;
var dom = document.createElement( 'div' );
dom.className = 'CodeEditor';
var timeout;
var editor = CodeMirror( dom, { mode: mode, indentWithTabs: true, lineWrapping: true, matchBrackets: true } );
editor.onKeyUp( 'keyup', function () {
var textarea = new UI.TextArea();
textarea.setWidth( '240px' );
textarea.setHeight( '100px' );
textarea.onKeyUp( function () {
if ( scope.onKeyUpCallback !== undefined ) {
clearTimeout( timeout );
scope.onKeyUpCallback();
timeout = setTimeout( function () {
}
var object = editor.selected;
var source = scope.getValue();
});
try {
this.dom = dom;
this.editor = editor;
var script = new Function( 'scene', 'time', source ).bind( object.clone() );
script( new THREE.Scene(), 0 );
return this;
textarea.dom.classList.add( 'success' );
textarea.dom.classList.remove( 'fail' );
};
} catch ( error ) {
UI.CodeEditor.prototype = Object.create( UI.Element.prototype );
UI.CodeEditor.prototype.constructor = UI.CodeEditor;
textarea.dom.classList.remove( 'success' );
textarea.dom.classList.add( 'fail' );
UI.CodeEditor.prototype.setWidth = function ( value ) {
return;
UI.Element.prototype.setWidth.call( this, value );
}
this.editor.setSize( this.dom.style.width, this.dom.style.height );
if ( scope.onChangeCallback !== undefined ) {
return this;
scope.onChangeCallback();
};
}
UI.CodeEditor.prototype.setHeight = function ( value ) {
}, 500 );
UI.Element.prototype.setHeight.call( this, value );
} );
this.add( textarea );
this.editor.setSize( this.dom.style.width, this.dom.style.height );
return this;
this.textarea = textarea;
};
UI.CodeEditor.prototype.getValue = function () {
UI.ScriptEditor.prototype = Object.create( UI.Panel.prototype );
UI.ScriptEditor.prototype.constructor = UI.ScriptEditor;
UI.ScriptEditor.prototype.getValue = function () {
return this.editor.getValue();
return this.textarea.getValue();
};
UI.CodeEditor.prototype.setValue = function ( value ) {
UI.ScriptEditor.prototype.setValue = function ( value ) {
this.editor.setValue( value );
this.textarea.setValue( value );
return this;
};
UI.CodeEditor.prototype.onKeyUp = function ( callback ) {
UI.ScriptEditor.prototype.onChange = function ( callback ) {
this.onKeyUpCallback = callback;
this.onChangeCallback = callback;
return this;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册