mirror of
https://github.com/troisjs/trois.git
synced 2024-11-24 04:12:02 +08:00
text
This commit is contained in:
parent
04890fc2fb
commit
86c51ef9bd
85
src/meshes/Text.ts
Normal file
85
src/meshes/Text.ts
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
import { defineComponent, watch } from 'vue'
|
||||||
|
import { Font, FontLoader, TextGeometry } from 'three'
|
||||||
|
import Mesh, { MeshSetupInterface } from './Mesh'
|
||||||
|
import { object3DSetup } from '../core/Object3D'
|
||||||
|
|
||||||
|
interface TextSetupInterface extends MeshSetupInterface {
|
||||||
|
geometry?: TextGeometry
|
||||||
|
font?: Font
|
||||||
|
}
|
||||||
|
|
||||||
|
const props = {
|
||||||
|
text: { type: String, required: true, default: 'Text' },
|
||||||
|
fontSrc: { type: String, required: true },
|
||||||
|
size: { type: Number, default: 80 },
|
||||||
|
height: { type: Number, default: 5 },
|
||||||
|
depth: { type: Number, default: 1 },
|
||||||
|
curveSegments: { type: Number, default: 12 },
|
||||||
|
bevelEnabled: { type: Boolean, default: false },
|
||||||
|
bevelThickness: { type: Number, default: 10 },
|
||||||
|
bevelSize: { type: Number, default: 8 },
|
||||||
|
bevelOffset: { type: Number, default: 0 },
|
||||||
|
bevelSegments: { type: Number, default: 5 },
|
||||||
|
align: { type: [Boolean, String], default: false },
|
||||||
|
}
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
extends: Mesh,
|
||||||
|
props,
|
||||||
|
setup(): TextSetupInterface {
|
||||||
|
return object3DSetup()
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
if (!this.fontSrc) {
|
||||||
|
console.error('Missing required prop: "font-src"')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// if (!this.text) {
|
||||||
|
// console.error('Missing required prop: "text"')
|
||||||
|
// return
|
||||||
|
// }
|
||||||
|
|
||||||
|
// add watchers
|
||||||
|
const watchProps = [
|
||||||
|
'text', 'size', 'height', 'curveSegments',
|
||||||
|
'bevelEnabled', 'bevelThickness', 'bevelSize', 'bevelOffset', 'bevelSegments',
|
||||||
|
'align',
|
||||||
|
]
|
||||||
|
watchProps.forEach(p => {
|
||||||
|
// @ts-ignore
|
||||||
|
watch(() => this[p], () => {
|
||||||
|
if (this.font) this.refreshGeometry()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
const loader = new FontLoader()
|
||||||
|
this.loading = true
|
||||||
|
loader.load(this.fontSrc, (font) => {
|
||||||
|
this.loading = false
|
||||||
|
this.font = font
|
||||||
|
this.createGeometry()
|
||||||
|
this.initMesh()
|
||||||
|
})
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
createGeometry() {
|
||||||
|
this.geometry = new TextGeometry(this.text, {
|
||||||
|
// @ts-ignore
|
||||||
|
font: this.font,
|
||||||
|
size: this.size,
|
||||||
|
height: this.height,
|
||||||
|
depth: this.depth,
|
||||||
|
curveSegments: this.curveSegments,
|
||||||
|
bevelEnabled: this.bevelEnabled,
|
||||||
|
bevelThickness: this.bevelThickness,
|
||||||
|
bevelSize: this.bevelSize,
|
||||||
|
bevelOffset: this.bevelOffset,
|
||||||
|
bevelSegments: this.bevelSegments,
|
||||||
|
})
|
||||||
|
|
||||||
|
if (this.align === 'center') {
|
||||||
|
this.geometry.center()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
Loading…
Reference in New Issue
Block a user