summaryrefslogtreecommitdiff
path: root/site/public/assets/demo/cloud/src/index.js
diff options
context:
space:
mode:
authorAdam Harvey <adam@ahprojects.com>2019-06-05 10:44:12 -0500
committerAdam Harvey <adam@ahprojects.com>2019-06-05 10:44:12 -0500
commitb3ed0f95eb94a4e7cb5e137bb8196db8c36aa50d (patch)
tree8eb5ce503f805bbd58c4565cd845ac196b1a30dd /site/public/assets/demo/cloud/src/index.js
parent7919ecc1a760f611efbe1283096482a8ec99efef (diff)
fix?
Diffstat (limited to 'site/public/assets/demo/cloud/src/index.js')
-rw-r--r--site/public/assets/demo/cloud/src/index.js78
1 files changed, 78 insertions, 0 deletions
diff --git a/site/public/assets/demo/cloud/src/index.js b/site/public/assets/demo/cloud/src/index.js
new file mode 100644
index 00000000..270891d5
--- /dev/null
+++ b/site/public/assets/demo/cloud/src/index.js
@@ -0,0 +1,78 @@
+import {
+ Math as THREE_Math,
+ Sprite,
+ SpriteMaterial,
+} from 'three';
+import TextTexture from 'three.texttexture';
+
+import getOptimalFontSize from './getOptimalFontSize';
+
+export default class extends Sprite {
+ constructor({
+ textSize = 1,
+ redrawInterval = 1,
+ minFontSize = 0,
+ maxFontSize = Infinity,
+ material = {},
+ texture = {},
+ } = {}) {
+ super(new SpriteMaterial({
+ ...material,
+ map: new TextTexture(texture),
+ }));
+ this.textSize = textSize;
+ this.redrawInterval = redrawInterval;
+ this.minFontSize = minFontSize;
+ this.maxFontSize = maxFontSize;
+ this.lastRedraw = 0;
+ }
+
+ get isTextSprite() {
+ return true;
+ }
+
+ onBeforeRender(renderer, scene, camera) {
+ this.redraw(renderer, camera);
+ }
+
+ updateScale() {
+ this.scale
+ .set(this.material.map.imageAspect, 1, 1)
+ .multiplyScalar(this.textSize * this.material.map.imageHeight);
+ }
+
+ updateMatrix(...args) {
+ this.updateScale();
+ return super.updateMatrix(...args);
+ }
+
+ redraw(renderer, camera) {
+ if (this.lastRedraw + this.redrawInterval < Date.now()) {
+ if (this.redrawInterval) {
+ setTimeout(() => {
+ this.redrawNow(renderer, camera);
+ }, 1);
+ } else {
+ this.redrawNow(renderer, camera);
+ }
+ }
+ }
+
+ redrawNow(renderer, camera) {
+ this.updateScale();
+ this.material.map.autoRedraw = true;
+ this.material.map.fontSize = THREE_Math.clamp(
+ THREE_Math.ceilPowerOfTwo(
+ getOptimalFontSize(this, renderer, camera)
+ ),
+ this.minFontSize,
+ this.maxFontSize,
+ );
+ this.lastRedraw = Date.now();
+ }
+
+ dispose() {
+ this.material.map.dispose();
+ this.material.dispose();
+ }
+}