the-world-engine
Version:
three.js based, unity like game engine for browser
143 lines (141 loc) • 5.08 kB
JavaScript
import { Transform } from "../../hierarchy_object/Transform";
import { CssRenderer } from "./CssRenderer";
export class CssHtmlElementRenderer extends CssRenderer {
tf=1;
if=1;
sf=false;
wa=null;
renderInitialize() {
this.wa?.call(this);
if (!this.htmlElement) this.element = null;
}
updateCenterOffset(t) {
if (!this.css3DObject) return;
let i;
let s;
if (this.sf) {
if (!this.css3DObject.element.parentElement) {
const t = this.css3DObject.element.style.display;
this.css3DObject.element.style.display = "";
const e = this.css3DObject.element.style.transform;
this.css3DObject.element.style.transform = "translateX(1000000px)";
document.body.appendChild(this.css3DObject.element);
i = this.css3DObject.element.offsetWidth * this.viewScale;
s = this.css3DObject.element.offsetHeight * this.viewScale;
this.css3DObject.element.style.display = t;
this.css3DObject.element.style.transform = e;
document.body.removeChild(this.css3DObject.element);
} else {
const t = this.css3DObject.element.style.display;
this.css3DObject.element.style.display = "";
i = this.css3DObject.element.offsetWidth * this.viewScale;
s = this.css3DObject.element.offsetHeight * this.viewScale;
this.css3DObject.element.style.display = t;
}
} else {
i = this.tf;
s = this.if;
}
this.css3DObject.position.set(i * this.centerOffset.x, s * this.centerOffset.y, 0);
if (t) {
Transform.updateRawObject3DWorldMatrixRecursively(this.css3DObject);
this.transform.enqueueRenderAttachedObject3D(this.css3DObject);
}
}
updateViewScale(t) {
if (!this.css3DObject) return;
const i = this.viewScale;
if (!this.sf) {
this.css3DObject.element.style.width = this.tf / this.viewScale + "px";
this.css3DObject.element.style.height = this.if / this.viewScale + "px";
this.css3DObject.scale.set(i, i, i);
} else {
this.css3DObject.scale.set(i, i, i);
this.updateCenterOffset(false);
}
if (t) {
Transform.updateRawObject3DWorldMatrixRecursively(this.css3DObject);
this.transform.enqueueRenderAttachedObject3D(this.css3DObject);
}
}
get element() {
return this.htmlElement;
}
set element(t) {
const i = this.htmlElement = t ?? document.createElement("div");
if (!this.readyToDraw) {
this.wa = () => this.ef(i);
return;
}
this.ef(i);
}
ef(t) {
if (this.sf) {
t.style.width = "auto";
t.style.height = "auto";
} else {
t.style.width = this.tf / this.viewScale + "px";
t.style.height = this.if / this.viewScale + "px";
}
const i = this.initializeBaseComponents(true);
Transform.updateRawObject3DWorldMatrixRecursively(i);
this.transform.enqueueRenderAttachedObject3D(i);
}
get elementWidth() {
if (this.sf) {
if (this.htmlElement) {
const t = this.htmlElement.style.display;
this.htmlElement.style.display = "";
const i = this.htmlElement.offsetWidth * this.viewScale;
this.htmlElement.style.display = t;
return i;
}
return 0;
}
return this.tf;
}
set elementWidth(t) {
if (this.sf) return;
this.tf = t;
if (this.htmlElement) {
this.htmlElement.style.width = t / this.viewScale + "px";
}
this.updateCenterOffset(true);
}
get elementHeight() {
if (this.sf) {
if (this.htmlElement) {
const t = this.htmlElement.style.display;
this.htmlElement.style.display = "";
const i = this.htmlElement.offsetHeight * this.viewScale;
this.htmlElement.style.display = t;
return i;
}
return 0;
}
return this.if;
}
set elementHeight(t) {
if (this.sf) return;
this.if = t;
if (this.htmlElement) {
this.htmlElement.style.height = t / this.viewScale + "px";
}
this.updateCenterOffset(true);
}
get autoSize() {
return this.sf;
}
set autoSize(t) {
this.sf = t;
if (this.htmlElement) {
if (t) {
this.htmlElement.style.width = "auto";
this.htmlElement.style.height = "auto";
} else {
this.htmlElement.style.width = this.tf / this.viewScale + "px";
this.htmlElement.style.height = this.if / this.viewScale + "px";
}
}
}
}