Skip to content
Merged
4 changes: 4 additions & 0 deletions editor/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,8 @@
import { AnimationResizer } from './js/AnimationResizer.js';
import { Animation } from './js/Animation.js';

import { TextGeometry } from 'three/addons/geometries/TextGeometry.js';

window.URL = window.URL || window.webkitURL;
window.BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder;

Expand All @@ -82,6 +84,8 @@
window.editor = editor; // Expose editor to Console
window.THREE = THREE; // Expose THREE to APP Scripts and Console

THREE.ObjectLoader.registerGeometry( 'TextGeometry', TextGeometry );

const viewport = new Viewport( editor );
document.body.appendChild( viewport.dom );

Expand Down
40 changes: 40 additions & 0 deletions editor/js/Menubar.Add.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@ import { UIPanel, UIRow } from './libs/ui.js';

import { AddObjectCommand } from './commands/AddObjectCommand.js';

import { FontLoader } from 'three/addons/loaders/FontLoader.js';
import { TextGeometry } from 'three/addons/geometries/TextGeometry.js';

function MenubarAdd( editor ) {

const strings = editor.strings;
Expand Down Expand Up @@ -267,6 +270,43 @@ function MenubarAdd( editor ) {
} );
meshSubmenu.add( option );

// Mesh / Text

option = new UIRow();
option.setClass( 'option' );
option.setTextContent( strings.getKey( 'menubar/add/text' ) );
option.onClick( function () {

const loader = new FontLoader();
loader.load( '../examples/fonts/helvetiker_bold.typeface.json', function ( font ) {

const text = 'THREE.JS';

const geometry = new TextGeometry( text, {
text: text,
font,
size: 1,
depth: 0.5,
curveSegments: 4,

bevelEnabled: false,
bevelThickness: 0.1,
bevelSize: 0.01,
bevelOffset: 0,
bevelSegments: 3

} );

const mesh = new THREE.Mesh( geometry, new THREE.MeshStandardMaterial() );
mesh.name = 'Text';

editor.execute( new AddObjectCommand( editor, mesh ) );

} );

} );
meshSubmenu.add( option );

// Mesh / Torus

option = new UIRow();
Expand Down
136 changes: 136 additions & 0 deletions editor/js/Sidebar.Geometry.TextGeometry.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
import { TextGeometry } from 'three/addons/geometries/TextGeometry.js';

import { UIDiv, UIRow, UIText, UINumber, UIInteger, UIInput, UICheckbox } from './libs/ui.js';

import { SetGeometryCommand } from './commands/SetGeometryCommand.js';

function GeometryParametersPanel( editor, object ) {

const strings = editor.strings;

const container = new UIDiv();

const geometry = object.geometry;
const parameters = geometry.parameters.options;

// text

const textRow = new UIRow();
const text = new UIInput().setValue( parameters.text ).onChange( update );

textRow.add( new UIText( strings.getKey( 'sidebar/geometry/text_geometry/text' ) ).setClass( 'Label' ) );
textRow.add( text );

container.add( textRow );

// size

const sizeRow = new UIRow();
const size = new UINumber().setPrecision( 3 ).setValue( parameters.size ).onChange( update );

sizeRow.add( new UIText( strings.getKey( 'sidebar/geometry/text_geometry/size' ) ).setClass( 'Label' ) );
sizeRow.add( size );

container.add( sizeRow );

// depth

const depthRow = new UIRow();
const depth = new UINumber().setPrecision( 3 ).setValue( parameters.depth ).onChange( update );

depthRow.add( new UIText( strings.getKey( 'sidebar/geometry/text_geometry/depth' ) ).setClass( 'Label' ) );
depthRow.add( depth );

container.add( depthRow );

// curveSegments

const curveSegmentsRow = new UIRow();
const curveSegments = new UIInteger( parameters.curveSegments ).setRange( 1, Infinity ).onChange( update );

curveSegmentsRow.add( new UIText( strings.getKey( 'sidebar/geometry/text_geometry/curveseg' ) ).setClass( 'Label' ) );
curveSegmentsRow.add( curveSegments );

container.add( curveSegmentsRow );

// bevelEnabled

const bevelEnabledRow = new UIRow();
const bevelEnabled = new UICheckbox( parameters.bevelEnabled ).onChange( update );

bevelEnabledRow.add( new UIText( strings.getKey( 'sidebar/geometry/text_geometry/bevelenabled' ) ).setClass( 'Label' ) );
bevelEnabledRow.add( bevelEnabled );

container.add( bevelEnabledRow );

// bevelThickness

const bevelThicknessRow = new UIRow();
const bevelThickness = new UINumber( parameters.bevelThickness ).setPrecision( 3 ).setRange( 0, Infinity ).onChange( update );

bevelThicknessRow.add( new UIText( strings.getKey( 'sidebar/geometry/text_geometry/bevelthickness' ) ).setClass( 'Label' ) );
bevelThicknessRow.add( bevelThickness );

container.add( bevelThicknessRow );

// bevelSize

const bevelSizeRow = new UIRow();
const bevelSize = new UINumber( parameters.bevelSize ).setRange( 0, Infinity ).onChange( update );

bevelSizeRow.add( new UIText( strings.getKey( 'sidebar/geometry/text_geometry/bevelsize' ) ).setClass( 'Label' ) );
bevelSizeRow.add( bevelSize );

container.add( bevelSizeRow );

// bevelOffset

const bevelOffsetRow = new UIRow();
const bevelOffset = new UINumber( parameters.bevelOffset ).setRange( 0, Infinity ).onChange( update );

bevelOffsetRow.add( new UIText( strings.getKey( 'sidebar/geometry/text_geometry/bevelOffset' ) ).setClass( 'Label' ) );
bevelOffsetRow.add( bevelOffset );

container.add( bevelOffsetRow );


// bevelSegments

const bevelSegmentsRow = new UIRow();
const bevelSegments = new UIInteger( parameters.bevelSegments ).setRange( 0, Infinity ).onChange( update );

bevelSegmentsRow.add( new UIText( strings.getKey( 'sidebar/geometry/text_geometry/bevelseg' ) ).setClass( 'Label' ) );
bevelSegmentsRow.add( bevelSegments );

container.add( bevelSegmentsRow );

function update() {

const options = {

text: text.getValue(),
font: parameters.font,

size: size.getValue(),
depth: depth.getValue(),
curveSegments: curveSegments.getValue(),

bevelEnabled: bevelEnabled.getValue(),
bevelThickness: bevelThickness.getValue(),
bevelSize: bevelSize.getValue(),
bevelOffset: bevelOffset.getValue(),
bevelSegments: bevelSegments.getValue()

};

const geometry = new TextGeometry( options.text, options );

editor.execute( new SetGeometryCommand( editor, object, geometry ) );

}

return container;

}

export { GeometryParametersPanel };
72 changes: 72 additions & 0 deletions editor/js/Strings.js
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ function Strings( config ) {
'menubar/add/mesh/icosahedron': 'بیست وجهی',
'menubar/add/mesh/octahedron': 'هشت وجهی',
'menubar/add/mesh/tetrahedron': 'چهار وجهی',
'menubar/add/text': 'Text',
'menubar/add/mesh/torus': 'توروس (دونات)',
'menubar/add/mesh/tube': 'لوله',
'menubar/add/mesh/torusknot': 'torusknot',
Expand Down Expand Up @@ -242,6 +243,17 @@ function Strings( config ) {
'sidebar/geometry/ring_geometry/thetastart': 'شروع تتا',
'sidebar/geometry/ring_geometry/thetalength': 'طول تتا',

'sidebar/geometry/text_geometry/text': 'Text',
'sidebar/geometry/text_geometry/size': 'Font size',
'sidebar/geometry/text_geometry/depth': 'Extrude depth',
'sidebar/geometry/text_geometry/scale': 'Scale',
'sidebar/geometry/text_geometry/curveseg': 'Curve segments',
'sidebar/geometry/text_geometry/bevelenabled': 'Bevel enabled',
'sidebar/geometry/text_geometry/bevelthickness': 'Bevel thickness',
'sidebar/geometry/text_geometry/bevelsize': 'Bevel size',
'sidebar/geometry/text_geometry/bevelOffset': 'Bevel offset',
'sidebar/geometry/text_geometry/bevelseg': 'Bevel segments',

'sidebar/geometry/shape_geometry/curveSegments': 'بخش های منحنی',
'sidebar/geometry/shape_geometry/extrude': 'اکسترود کردن',

Expand Down Expand Up @@ -490,6 +502,7 @@ function Strings( config ) {
'menubar/add/mesh/icosahedron': 'Icosahedron',
'menubar/add/mesh/octahedron': 'Octahedron',
'menubar/add/mesh/tetrahedron': 'Tetrahedron',
'menubar/add/text': 'Text',
'menubar/add/mesh/torus': 'Torus',
'menubar/add/mesh/tube': 'Tube',
'menubar/add/mesh/torusknot': 'TorusKnot',
Expand Down Expand Up @@ -659,6 +672,17 @@ function Strings( config ) {
'sidebar/geometry/ring_geometry/thetastart': 'Theta start',
'sidebar/geometry/ring_geometry/thetalength': 'Theta length',

'sidebar/geometry/text_geometry/text': 'Text',
'sidebar/geometry/text_geometry/size': 'Font size',
'sidebar/geometry/text_geometry/depth': 'Extrude depth',
'sidebar/geometry/text_geometry/scale': 'Scale',
'sidebar/geometry/text_geometry/curveseg': 'Curve segments',
'sidebar/geometry/text_geometry/bevelenabled': 'Bevel enabled',
'sidebar/geometry/text_geometry/bevelthickness': 'Bevel thickness',
'sidebar/geometry/text_geometry/bevelsize': 'Bevel size',
'sidebar/geometry/text_geometry/bevelOffset': 'Bevel offset',
'sidebar/geometry/text_geometry/bevelseg': 'Bevel segments',

'sidebar/geometry/shape_geometry/curveSegments': 'Curve Segments',
'sidebar/geometry/shape_geometry/extrude': 'Extrude',

Expand Down Expand Up @@ -908,6 +932,7 @@ function Strings( config ) {
'menubar/add/mesh/icosahedron': 'Icosaèdre',
'menubar/add/mesh/octahedron': 'Octaèdre',
'menubar/add/mesh/tetrahedron': 'Tétraèdre',
'menubar/add/text': 'Text',
'menubar/add/mesh/torus': 'Torus',
'menubar/add/mesh/tube': 'Tube',
'menubar/add/mesh/torusknot': 'Noeud Torus',
Expand Down Expand Up @@ -1077,6 +1102,17 @@ function Strings( config ) {
'sidebar/geometry/ring_geometry/thetastart': 'Début Thêta',
'sidebar/geometry/ring_geometry/thetalength': 'Longueur Thêta',

'sidebar/geometry/text_geometry/text': 'Text',
'sidebar/geometry/text_geometry/size': 'Font size',
'sidebar/geometry/text_geometry/depth': 'Extrude depth',
'sidebar/geometry/text_geometry/scale': 'Scale',
'sidebar/geometry/text_geometry/curveseg': 'Curve segments',
'sidebar/geometry/text_geometry/bevelenabled': 'Bevel enabled',
'sidebar/geometry/text_geometry/bevelthickness': 'Bevel thickness',
'sidebar/geometry/text_geometry/bevelsize': 'Bevel size',
'sidebar/geometry/text_geometry/bevelOffset': 'Bevel offset',
'sidebar/geometry/text_geometry/bevelseg': 'Bevel segments',

'sidebar/geometry/shape_geometry/curveSegments': 'Segments de courbe',
'sidebar/geometry/shape_geometry/extrude': 'Extruder',

Expand Down Expand Up @@ -1326,6 +1362,7 @@ function Strings( config ) {
'menubar/add/mesh/icosahedron': '二十面体',
'menubar/add/mesh/octahedron': '八面体',
'menubar/add/mesh/tetrahedron': '四面体',
'menubar/add/text': 'Text',
'menubar/add/mesh/torus': '圆环体',
'menubar/add/mesh/torusknot': '环面纽结体',
'menubar/add/mesh/tube': '管',
Expand Down Expand Up @@ -1495,6 +1532,17 @@ function Strings( config ) {
'sidebar/geometry/ring_geometry/thetastart': '弧度起点',
'sidebar/geometry/ring_geometry/thetalength': '弧度长度',

'sidebar/geometry/text_geometry/text': 'Text',
'sidebar/geometry/text_geometry/size': 'Font size',
'sidebar/geometry/text_geometry/depth': 'Extrude depth',
'sidebar/geometry/text_geometry/scale': 'Scale',
'sidebar/geometry/text_geometry/curveseg': 'Curve segments',
'sidebar/geometry/text_geometry/bevelenabled': 'Bevel enabled',
'sidebar/geometry/text_geometry/bevelthickness': 'Bevel thickness',
'sidebar/geometry/text_geometry/bevelsize': 'Bevel size',
'sidebar/geometry/text_geometry/bevelOffset': 'Bevel offset',
'sidebar/geometry/text_geometry/bevelseg': 'Bevel segments',

'sidebar/geometry/shape_geometry/curveSegments': '曲线段',
'sidebar/geometry/shape_geometry/extrude': '拉伸',

Expand Down Expand Up @@ -1744,6 +1792,7 @@ function Strings( config ) {
'menubar/add/mesh/icosahedron': '二十面体',
'menubar/add/mesh/octahedron': '八面体',
'menubar/add/mesh/tetrahedron': '四面体',
'menubar/add/text': 'Text',
'menubar/add/mesh/torus': 'トーラス',
'menubar/add/mesh/tube': 'チューブ',
'menubar/add/mesh/torusknot': 'ノットトーラス',
Expand Down Expand Up @@ -1913,6 +1962,17 @@ function Strings( config ) {
'sidebar/geometry/ring_geometry/thetastart': '開始角度',
'sidebar/geometry/ring_geometry/thetalength': '角度の大きさ',

'sidebar/geometry/text_geometry/text': 'Text',
'sidebar/geometry/text_geometry/size': 'Font size',
'sidebar/geometry/text_geometry/depth': 'Extrude depth',
'sidebar/geometry/text_geometry/scale': 'Scale',
'sidebar/geometry/text_geometry/curveseg': 'Curve segments',
'sidebar/geometry/text_geometry/bevelenabled': 'Bevel enabled',
'sidebar/geometry/text_geometry/bevelthickness': 'Bevel thickness',
'sidebar/geometry/text_geometry/bevelsize': 'Bevel size',
'sidebar/geometry/text_geometry/bevelOffset': 'Bevel offset',
'sidebar/geometry/text_geometry/bevelseg': 'Bevel segments',

'sidebar/geometry/shape_geometry/curveSegments': '分割数',
'sidebar/geometry/shape_geometry/extrude': '押し出し',

Expand Down Expand Up @@ -2161,6 +2221,7 @@ function Strings( config ) {
'menubar/add/mesh/icosahedron': '이십면체',
'menubar/add/mesh/octahedron': '팔면체',
'menubar/add/mesh/tetrahedron': '사면체',
'menubar/add/text': 'Text',
'menubar/add/mesh/torus': '토러스',
'menubar/add/mesh/tube': '튜브',
'menubar/add/mesh/torusknot': '토러스 매듭',
Expand Down Expand Up @@ -2330,6 +2391,17 @@ function Strings( config ) {
'sidebar/geometry/ring_geometry/thetastart': '시작 각도',
'sidebar/geometry/ring_geometry/thetalength': '각도 길이',

'sidebar/geometry/text_geometry/text': 'Text',
'sidebar/geometry/text_geometry/size': 'Font size',
'sidebar/geometry/text_geometry/depth': 'Extrude depth',
'sidebar/geometry/text_geometry/scale': 'Scale',
'sidebar/geometry/text_geometry/curveseg': 'Curve segments',
'sidebar/geometry/text_geometry/bevelenabled': 'Bevel enabled',
'sidebar/geometry/text_geometry/bevelthickness': 'Bevel thickness',
'sidebar/geometry/text_geometry/bevelsize': 'Bevel size',
'sidebar/geometry/text_geometry/bevelOffset': 'Bevel offset',
'sidebar/geometry/text_geometry/bevelseg': 'Bevel segments',

'sidebar/geometry/shape_geometry/curveSegments': '곡선 분할 수',
'sidebar/geometry/shape_geometry/extrude': '압출',

Expand Down
18 changes: 18 additions & 0 deletions examples/jsm/geometries/TextGeometry.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ import {
ExtrudeGeometry
} from 'three';

import { Font } from '../loaders/FontLoader.js';

/**
* A class for generating text as a single geometry. It is constructed by providing a string of text, and a set of
* parameters consisting of a loaded font and extrude settings.
Expand Down Expand Up @@ -60,6 +62,22 @@ class TextGeometry extends ExtrudeGeometry {

}

toJSON() {

const data = super.toJSON();
return data;

}

static fromJSON( data ) {

const options = data.options;

options.font = new Font( options.font.data );
return new TextGeometry( options.text, options );

}

}

/**
Expand Down
Loading