diff --git a/editor/index.html b/editor/index.html
index d084e2717ec004..8998d9bdca1a1b 100644
--- a/editor/index.html
+++ b/editor/index.html
@@ -127,6 +127,7 @@
+
diff --git a/editor/js/Menubar.Add.js b/editor/js/Menubar.Add.js
index 56e65d63cae503..3667e5b77a60c7 100644
--- a/editor/js/Menubar.Add.js
+++ b/editor/js/Menubar.Add.js
@@ -86,6 +86,22 @@ Menubar.Add = function ( editor ) {
} );
options.add( option );
+ // Ring
+
+ var option = new UI.Row();
+ option.setClass( 'option' );
+ option.setTextContent( strings.getKey( 'menubar/add/ring' ) );
+ option.onClick( function () {
+
+ var geometry = new THREE.RingBufferGeometry( 0.5, 1, 8, 1, 0, Math.PI * 2 );
+ var mesh = new THREE.Mesh( geometry, new THREE.MeshStandardMaterial() );
+ mesh.name = 'Ring';
+
+ editor.execute( new AddObjectCommand( mesh ) );
+
+ } );
+ options.add( option );
+
// Cylinder
var option = new UI.Row();
diff --git a/editor/js/Sidebar.Geometry.RingGeometry.js b/editor/js/Sidebar.Geometry.RingGeometry.js
new file mode 100644
index 00000000000000..28fda19ce446f0
--- /dev/null
+++ b/editor/js/Sidebar.Geometry.RingGeometry.js
@@ -0,0 +1,95 @@
+/**
+ * @author Temdog007 / http://github.com/Temdog007
+ */
+
+Sidebar.Geometry.RingGeometry = function ( editor, object ) {
+
+ var strings = editor.strings;
+
+ var signals = editor.signals;
+
+ var container = new UI.Row();
+
+ var geometry = object.geometry;
+ var parameters = geometry.parameters;
+
+ // innerRadius
+
+ var innerRadiusRow = new UI.Row();
+ var innerRadius = new UI.Number( parameters.innerRadius ).onChange( update );
+
+ innerRadiusRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/ring_geometry/innerRadius' ) ).setWidth( '90px' ) );
+ innerRadiusRow.add( innerRadius );
+
+ container.add( innerRadiusRow );
+
+ // outerRadius
+
+ var outerRadiusRow = new UI.Row();
+ var outerRadius = new UI.Number( parameters.outerRadius ).onChange( update );
+
+ outerRadiusRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/ring_geometry/outerRadius' ) ).setWidth( '90px' ) );
+ outerRadiusRow.add( outerRadius );
+
+ container.add( outerRadiusRow );
+
+ // thetaSegments
+
+ var thetaSegmentsRow = new UI.Row();
+ var thetaSegments = new UI.Integer( parameters.thetaSegments ).setRange( 3, Infinity ).onChange( update );
+
+ thetaSegmentsRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/ring_geometry/thetaSegments' ) ).setWidth( '90px' ) );
+ thetaSegmentsRow.add( thetaSegments );
+
+ container.add( thetaSegmentsRow );
+
+ // phiSegments
+
+ var phiSegmentsRow = new UI.Row();
+ var phiSegments = new UI.Integer( parameters.phiSegments ).setRange( 3, Infinity ).onChange( update );
+
+ phiSegmentsRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/ring_geometry/phiSegments' ) ).setWidth( '90px' ) );
+ phiSegmentsRow.add( phiSegments );
+
+ container.add( phiSegmentsRow );
+
+ // thetaStart
+
+ var thetaStartRow = new UI.Row();
+ var thetaStart = new UI.Number( parameters.thetaStart * THREE.Math.RAD2DEG ).setStep( 10 ).onChange( update );
+
+ thetaStartRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/ring_geometry/thetastart' ) ).setWidth( '90px' ) );
+ thetaStartRow.add( thetaStart );
+
+ container.add( thetaStartRow );
+
+ // thetaLength
+
+ var thetaLengthRow = new UI.Row();
+ var thetaLength = new UI.Number( parameters.thetaLength * THREE.Math.RAD2DEG ).setStep( 10 ).onChange( update );
+
+ thetaLengthRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/ring_geometry/thetalength' ) ).setWidth( '90px' ) );
+ thetaLengthRow.add( thetaLength );
+
+ container.add( thetaLengthRow );
+
+ //
+
+ function update() {
+
+ editor.execute( new SetGeometryCommand( object, new THREE[ geometry.type ](
+ innerRadius.getValue(),
+ outerRadius.getValue(),
+ thetaSegments.getValue(),
+ phiSegments.getValue(),
+ thetaStart.getValue() * THREE.Math.DEG2RAD,
+ thetaLength.getValue() * THREE.Math.DEG2RAD
+ ) ) );
+
+ }
+
+ return container;
+
+};
+
+Sidebar.Geometry.RingBufferGeometry = Sidebar.Geometry.RingGeometry;
diff --git a/editor/js/Strings.js b/editor/js/Strings.js
index 43b8342b1f5f6a..d118235557d067 100644
--- a/editor/js/Strings.js
+++ b/editor/js/Strings.js
@@ -38,6 +38,7 @@ var Strings = function ( config ) {
'menubar/add/box': 'Box',
'menubar/add/circle': 'Circle',
'menubar/add/cylinder': 'Cylinder',
+ 'menubar/add/ring': 'Ring',
'menubar/add/sphere': 'Sphere',
'menubar/add/icosahedron': 'Icosahedron',
'menubar/add/torus': 'Torus',
@@ -142,6 +143,13 @@ var Strings = function ( config ) {
'sidebar/geometry/plane_geometry/widthsegments': 'Width segments',
'sidebar/geometry/plane_geometry/heightsegments': 'Height segments',
+ 'sidebar/geometry/ring_geometry/innerRadius': 'Inner Radius',
+ 'sidebar/geometry/ring_geometry/outerRadius': 'Outer Radius',
+ 'sidebar/geometry/ring_geometry/thetaSegments': 'Theta Segments',
+ 'sidebar/geometry/ring_geometry/phiSegments': 'Phi Segments',
+ 'sidebar/geometry/ring_geometry/thetastart': 'Theta start',
+ 'sidebar/geometry/ring_geometry/thetalength': 'Theta length',
+
'sidebar/geometry/sphere_geometry/radius': 'Radius',
'sidebar/geometry/sphere_geometry/widthsegments': 'Width segments',
'sidebar/geometry/sphere_geometry/heightsegments': 'Height segments',