var webview, dom = {}, rotInfo = {
idleTime: 3e3,
speed: .15,
pivot: [],
stopWhenZoom: !1
};
function getQueryVariable(e) {
for (var t = window.location.search.substring(1).split("&"), i = 0; i < t.length; i++) {
var s = t[i].split("=");
if (s[0] == e)
return s[1]
}
return !1
}
dom.addClass = function (e, t) {
if (void 0 === e.className)
e.className = t;
else if (e.className !== t) {
var i = e.className.split(/ +/);
-1 == i.indexOf(t) && (i.push(t),
e.className = i.join(" ").replace(/^\s+/, "").replace(/\s+$/, ""))
}
}
,
dom.removeClass = function (e, t) {
if (t)
if (void 0 === e.className)
;
else if (e.className === t)
e.removeAttribute("class");
else {
var i = e.className.split(/ +/)
, s = i.indexOf(t);
-1 != s && (i.splice(s, 1),
e.className = i.join(" "))
}
else
e.className = void 0
}
,
dom.hasClass = function (e, t) {
return new RegExp("(?:^|\\s+)" + t + "(?:\\s+|$)").test(e.className) || !1
}
,
dom.id = function (e, t) {
return (t = t || document).getElementById && t.getElementById(e) || document.getElementById(e)
}
,
dom.Tag = function (e, t) {
return (t = t || document).getElementsByTagName(e)
}
,
dom.cla = function (e, t) {
return (t = t || document).getElementsByClassName(e)
}
,
dom.ifVoid = function (e, t) {
return null == e ? t : e
}
,
dom.objToArray = function (e) {
if (e instanceof Array)
return e;
var t = [];
for (var i in e)
t.push(e[i]);
return t
}
;
var Clamp = function (e, t, i) {
return void 0 === t && (t = 0),
void 0 === i && (i = 1),
Math.min(i, Math.max(t, e))
}
, codeToCh = function (e) {
return unescape(e)
};
fdage = {},
function (I) {
"use strict";
function r(e, t, i) {
if (this.name = t.partName,
this.animatedProperties = [],
this.sceneObjectType = t.sceneObjectType,
this.skinningRigIndex = t.skinningRigIndex,
this.id = i,
this.mesh = this.skinningRig = 0,
this.materialIndex = this.lightIndex = this.meshIndex = -1,
this.emissiveProperty = this.offsetVProperty = this.offsetUProperty = this.material = 0,
this.debugMe = t.debugMe,
this.debugString = "",
this.hasTransform = !1,
this.modelPartIndex = t.modelPartIndex,
this.modelPartFPS = t.modelPartFPS,
this.modelPartScale = t.modelPartScale,
this.parentIndex = t.parentIndex,
this.totalFrames = t.totalFrames,
this.animationLength = 1 / this.modelPartFPS * this.totalFrames,
this.turnTableSpinOffset = this.turnTableSpin = this.spinProperty = this.dispersionProperty = this.lightIllumProperty = this.skyIllumProperty = this.opacityProperty = this.spotSharpnessProperty = this.spotAngleProperty = this.distanceProperty = this.brightnessProperty = this.blueProperty = this.greenProperty = this.redProperty = this.visibleProperty = 0,
t.animatedProperties) {
i = t.animatedProperties.length;
for (var s = 0; s < i; ++s) {
var n = t.animatedProperties[s]
, r = new a;
r.name = n.name,
this.animatedProperties.push(r),
"Red" != r.name || this.redProperty || (this.redProperty = r),
"Green" != r.name || this.greenProperty || (this.greenProperty = r),
"Blue" != r.name || this.blueProperty || (this.blueProperty = r),
"Brightness" != r.name || this.brightnessProperty || (this.brightnessProperty = r),
"Distance" != r.name || this.distanceProperty || (this.distanceProperty = r),
"Spot Angle" != r.name || this.spotAngleProperty || (this.spotAngleProperty = r),
"Spot Sharpness" != r.name || this.spotSharpnessProperty || (this.spotSharpnessProperty = r),
"Opacity" != r.name || this.opacityProperty || (this.opacityProperty = r),
"Sky Illumination" != r.name || this.skyIllumProperty || (this.skyIllumProperty = r),
"Light Illumination" != r.name || this.lightIllumProperty || (this.lightIllumProperty = r),
"Dispersion" != r.name || this.dispersionProperty || (this.dispersionProperty = r),
"Visible" != r.name || this.visibleProperty || (this.visibleProperty = r),
"Spin Rate" == r.name && (this.spinProperty = r),
"OffsetU" == r.name && (this.offsetUProperty = r),
"OffsetV" == r.name && (this.offsetVProperty = r),
"EmissiveIntensity" == r.name && (this.emissiveProperty = r)
}
}
this.keyframesSharedBufferUShorts = this.keyframesSharedBufferFloats = this.keyFramesByteStream = 0,
(e = e.get(t.file)) && (this.keyFramesByteStream = new u(e.data),
this.unPackKeyFrames()),
this.animatedLocalTransform = new o(this),
this.hasTransform = this.animatedLocalTransform.hasTranslation || this.animatedLocalTransform.hasRotation || this.animatedLocalTransform.hasScale,
this.cachedWorldTransform0 = S.identity(),
this.cachedWorldTransform1 = S.identity(),
this.cachedWorldTransform2 = S.identity(),
this.cachedWorldTransform3 = S.identity(),
this.cachedFrame3 = this.cachedFrame2 = this.cachedFrame1 = this.cachedFrame0 = -10,
this.cachedFrameUse3 = this.cachedFrameUse2 = this.cachedFrameUse1 = this.cachedFrameUse0 = 0,
this.useFixedLocalTransform = this.useFixedWorldTransform = !1
}
function a() {
this.currentValue = 0,
this.keyframeBufferStartIndexFloat = -1,
this.lastValue = this.interpolationOffsetUShort = this.frameIndexOffsetUShort = this.weighOutOffsetFloat = this.weighInOffsetFloat = this.valueOffsetFloat = this.indexUShortSkip = this.indexFloatSkip = this.interpolationType = this.bytesPerKeyFrame = this.keyframePackingType = 0,
this.lastFramePercent = -10,
this.enable = !0,
this.name = "NONE",
this.splineKF0 = new i(0, 0),
this.splineKF1 = new i(0, 0),
this.splineKF2 = new i(0, 0),
this.splineKF3 = new i(0, 0),
this.debugMe = !0,
this.debugString = "",
this.lastSearchIndex = 1,
this.savedSearchIndex = 0,
this.splineKF0.frameIndex = 0,
this.splineKF1.frameIndex = 1,
this.splineKF2.frameIndex = 2,
this.splineKF3.frameIndex = 3,
this.numKeyframes = 0
}
function o(e) {
var t = e.animatedProperties;
for (this.TX = this.TY = this.TZ = this.RX = this.RY = this.RZ = this.SX = this.SY = this.SZ = 0,
this.hostObject = e,
this.matrix = S.identity(),
this.cachedmatrix0 = S.identity(),
this.cachedmatrix1 = S.identity(),
this.cachedmatrix2 = S.identity(),
this.cachedmatrix3 = S.identity(),
this.cachedFrame3 = this.cachedFrame2 = this.cachedFrame1 = this.cachedFrame0 = -1,
this.cachedFrameUse3 = this.cachedFrameUse2 = this.cachedFrameUse1 = this.cachedFrameUse0 = 0,
this.debugString = "",
e = 0; e < t.length; e++) {
var i = t[e];
"Translation X" == i.name ? this.TX = i : "Translation Y" == i.name ? this.TY = i : "Translation Z" == i.name ? this.TZ = i : "Rotation X" == i.name ? this.RX = i : "Rotation Y" == i.name ? this.RY = i : "Rotation Z" == i.name ? this.RZ = i : "Scale X" == i.name ? this.SX = i : "Scale Y" == i.name ? this.SY = i : "Scale Z" == i.name && (this.SZ = i)
}
this.hasTranslation = this.TX && this.TY && this.TZ,
this.hasRotation = this.RX && this.RY && this.RZ,
this.hasScale = this.SX && this.SY && this.SZ,
this.lockTransform = !1
}
function c(e, t) {
if (this.originalFPS = 1,
this.name = t.name,
this.totalSeconds = t.length,
this.originalFPS = t.originalFPS,
this.totalFrames = t.totalFrames,
this.expectedNumAnimatedObjects = t.numAnimatedObjects,
this.animatedObjects = [],
this.sceneTransform = S.identity(),
this.debugString = "",
t.animatedObjects)
for (var i = t.animatedObjects.length, s = 0; s < i; ++s) {
var n = new r(e, t.animatedObjects[s], s);
this.animatedObjects.push(n),
this.debugString += n.debugString
}
this.meshObjects = [],
this.lightObjects = [],
this.materialObjects = [],
this.turnTableObjects = [],
this.cameraObjects = []
}
function h(e) {
for (this.files = [],
e = new u(e); !e.empty();) {
var t = {};
t.name = e.readCString(),
t.type = e.readCString();
var i = e.readUint32()
, s = e.readUint32()
, n = e.readUint32();
if (t.data = e.readBytes(s),
!(t.data.length < s)) {
if (1 & i && (t.data = this.decompress(t.data, n),
null === t.data))
continue;
this.files[t.name] = t
}
}
}
function l(e) {
this.digits = new Uint16Array(e || 0)
}
function d(e) {
for (var t = 0; t < e.length; ++t) {
var i = e[t].bounds;
if (void 0 === this.min)
this.min = [i.min[0], i.min[1], i.min[2]],
this.max = [i.max[0], i.max[1], i.max[2]];
else
for (var s = 0; s < 3; ++s)
this.min[s] = Math.min(i.min[s], this.min[s]),
this.max[s] = Math.max(i.max[s], this.max[s])
}
this.min = this.min ? this.min : [0, 0, 0],
this.max = this.max ? this.max : [0, 0, 0],
this.center = [.5 * (this.min[0] + this.max[0]), .5 * (this.min[1] + this.max[1]), .5 * (this.min[2] + this.max[2])],
this.radius = [this.max[0] - this.center[0], this.max[1] - this.center[1], this.max[2] - this.center[2]],
this.radiusDiagonal = Math.sqrt(this.radius[0] * this.radius[0] + this.radius[1] * this.radius[1] + this.radius[2] * this.radius[2])
}
function p(e) {
this.name = "none",
this.text = "default text",
this.title = "none",
this.debugString = this.imagePath = "",
this.controlRect = new s(e),
this.defaultAlpha = .5,
this.focusAlpha = 1,
this.updateAlphas = !0,
this.linkedBackground = this.backgroundOffsetY = this.backgroundOffsetX = this.edgePixelsY = this.edgePixelsX = this.backgroundBottomMiddle = this.backgroundBottomRight = this.backgroundBottomLeft = this.backgroundMiddleMiddle = this.backgroundMiddleRight = this.backgroundMiddleLeft = this.backgroundTopMiddle = this.backgroundTopRight = this.backgroundTopLeft = this.backgroundMiddle = this.backgroundRight = this.backgroundLeft = 0
}
function u(e) {
this.bytes = new Uint8Array(e)
}
function s(e) {
this.name = "none",
this.title = "frame",
this.yPercent = this.xPercent = 0,
this.heightPercent = this.widthPercent = 1,
this.debugString = "",
this.parentControlRect = 0,
this.childControlRects = [],
this.clicked = this.mouseDown = this.mouseOver = !1,
this.localMouseYPercent = this.localMouseXPercent = 0,
this.enabled = this.visible = !0,
this.opacity = 1,
this.guiScreen = e,
this.id = this.callBack = this.linkedControl = 0
}
r.prototype.setFixedWorldTransform = function (e) {
this.useFixedWorldTransform = !0,
S.copy(this.cachedWorldTransform0, e)
}
,
r.prototype.setFixedLocalTransform = function (e) {
this.useFixedLocalTransform = !0,
this.animatedLocalTransform.lockTransform = !0,
S.copy(this.animatedLocalTransform.cachedmatrix0, e)
}
,
r.prototype.getCachedWorldTransform = function (e) {
return this.useFixedWorldTransform ? 0 : e == this.cachedFrame0 ? this.cachedmatrix0 : e == this.cachedFrame1 ? this.cachedmatrix1 : e == this.cachedFrame2 ? this.cachedmatrix2 : e == this.cachedFrame3 ? this.cachedmatrix3 : 0
}
,
r.prototype.getFreeCachedWorldTransform = function (e) {
return this.useFixedWorldTransform ? 0 : (this.cachedFrameUse0--,
this.cachedFrameUse1--,
this.cachedFrameUse2--,
this.cachedFrameUse3--,
this.cachedFrameUse0 <= this.cachedFrameUse1 && this.cachedFrameUse0 <= this.cachedFrameUse2 && this.cachedFrameUse0 <= this.cachedFrameUse3 ? (this.cachedFrame0 = e,
this.cachedFrameUse0 = 0,
this.cachedWorldTransform0) : this.cachedFrameUse1 <= this.cachedFrameUse0 && this.cachedFrameUse1 <= this.cachedFrameUse2 && this.cachedFrameUse1 <= this.cachedFrameUse3 ? (this.cachedFrame1 = e,
this.cachedFrameUse1 = 0,
this.cachedWorldTransform1) : this.cachedFrameUse2 <= this.cachedFrameUse0 && this.cachedFrameUse2 <= this.cachedFrameUse1 && this.cachedFrameUse2 <= this.cachedFrameUse3 ? (this.cachedFrame2 = e,
this.cachedFrameUse2 = 0,
this.cachedWorldTransform2) : (this.cachedFrame3 = e,
this.cachedFrameUse3 = 0,
this.cachedWorldTransform3))
}
,
r.prototype.unPackKeyFrames = function () {
if (this.keyFramesByteStream) {
var e = new Float32Array(this.keyFramesByteStream.bytes.buffer)
, t = new Uint32Array(this.keyFramesByteStream.bytes.buffer)
, i = new Uint16Array(this.keyFramesByteStream.bytes.buffer)
, s = new Uint8Array(this.keyFramesByteStream.bytes.buffer);
this.keyframesSharedBufferFloats = e;
e = 0,
e = 1 + (t = (this.keyframesSharedBufferUShorts = t)[0]),
t = this.animatedProperties.length;
for (var n = 0; n < t; n++) {
var r = this.animatedProperties[n]
, a = 2 + 2 * n
, o = 2 * a;
r.keyframeBufferStartIndexFloat = e,
r.numKeyframes = i[a],
r.keyframePackingType = s[2 + o],
r.interpolationType = s[3 + o],
r.indexFloatSkip = 0,
(r.indexUShortSkip = 0) < r.numKeyframes && (0 == r.keyframePackingType ? (r.bytesPerKeyFrame = 16,
r.indexFloatSkip = 4,
r.indexUShortSkip = 8,
r.valueOffsetFloat = 0,
r.weighInOffsetFloat = 1,
r.weighOutOffsetFloat = 2,
r.frameIndexOffsetUShort = 6,
r.interpolationOffsetUShort = 7) : 1 == r.keyframePackingType ? (r.bytesPerKeyFrame = 8,
r.indexFloatSkip = 2,
r.indexUShortSkip = 4,
r.valueOffsetFloat = 0,
r.weighInOffsetFloat = 0,
r.weighOutOffsetFloat = 0,
r.frameIndexOffsetUShort = 2,
r.interpolationOffsetUShort = 3) : 2 == r.keyframePackingType && (r.bytesPerKeyFrame = 4,
r.indexFloatSkip = 1,
r.indexUShortSkip = 2,
r.valueOffsetFloat = 0,
r.weighInOffsetFloat = 0,
r.weighOutOffsetFloat = 0,
r.frameIndexOffsetUShort = 0,
r.interpolationOffsetUShort = 0)),
e += r.numKeyframes * r.indexFloatSkip
}
}
}
,
r.prototype.setupSkinningRig = function (e, t, i, s) {
var n = S.identity()
, r = S.identity()
, a = (a = i * (o = e.animatedObjects[t]).modelPartFPS) - Math.floor(a)
, o = (i = Math.floor(e.getObjectAnimationFramePercent(o, i))) + 1
, h = 1 - a
, l = s.skinningClusters.length;
if (0 < l)
for (var d = 0; d < l; d++) {
(c = s.skinningClusters[d]).solveClusterTransformAtFrame(e, t, i, n),
c.solveClusterTransformAtFrame(e, t, o, r);
for (var c = c.matrix, u = 0; u < 16; u++)
c[u] = n[u] * h + r[u] * a
}
}
,
r.prototype.evaluateLocalTransformAtFramePercent = function (e, t, i, s) {
if (this.useFixedLocalTransform)
S.copy(t, this.animatedLocalTransform.cachedmatrix0);
else {
var n = 0;
s && (n = this.animatedLocalTransform.getCachedTransform(e)),
n ? S.copy(t, n) : ((n = this.animatedLocalTransform.getFreeCachedTransform(e)) ? (this.animatedLocalTransform.evaluateMatrix(n, this.totalFrames, e, i),
S.copy(t, n)) : this.animatedLocalTransform.evaluateMatrix(t, this.totalFrames, e, i),
0 != this.turnTableSpin && (e = S.rotation(S.empty(), this.turnTableSpin, 1),
S.mul(t, t, e)))
}
}
,
r.prototype.hasAnimatedTransform = function () {
var e = this.animatedLocalTransform;
return !!(e.TX && 1 < e.TX.numKeyframes || e.TY && 1 < e.TY.numKeyframes || e.TZ && 1 < e.TZ.numKeyframes || e.RX && 1 < e.RX.numKeyframes || e.RY && 1 < e.RY.numKeyframes || e.RZ && 1 < e.RZ.numKeyframes || e.SX && 1 < e.SX.numKeyframes || e.SY && 1 < e.SY.numKeyframes || e.SZ && 1 < e.SZ.numKeyframes)
}
,
a.prototype.evaluateCurve = function (e, t) {
var i = this.splineKF1.frameIndex
, s = this.splineKF2.frameIndex
, n = this.splineKF1.value
, r = this.splineKF2.value
, a = i - (this.splineKF2.frameIndex - this.splineKF0.frameIndex)
, o = s - (this.splineKF1.frameIndex - this.splineKF3.frameIndex)
, h = n - (this.splineKF2.value - this.splineKF0.value) * this.splineKF1.weighOut
, l = r - (this.splineKF1.value - this.splineKF3.value) * this.splineKF2.weighIn;
return 3 == this.splineKF1.interpolation && (a = i - (this.splineKF2.frameIndex - this.splineKF1.frameIndex),
h = n - this.splineKF1.weighOut),
3 == this.splineKF2.interpolation && (o = s - (this.splineKF1.frameIndex - this.splineKF2.frameIndex),
l = r + this.splineKF2.weighIn),
a = (e - a) / (i - a),
i = (e - i) / (s - i),
s = (e - s) / (o - s),
((h * (1 - a) + n * a) * (1 - i) + (o = n * (1 - i) + r * i) * i) * (1 - i) + ((r * (1 - s) + l * s) * i + o * (1 - i)) * i
}
,
a.prototype.evaluate = function (e, t, i) {
if (!i)
return t;
if (0 == this.numKeyframes)
return this.lastValue = t;
if (1 == this.numKeyframes)
return this.lastValue = 2 == this.keyframePackingType ? i.keyframesSharedBufferFloats[this.keyframeBufferStartIndexFloat] : i.keyframesSharedBufferFloats[this.keyframeBufferStartIndexFloat + this.valueOffsetFloat];
if (this.lastFramePercent == e)
return this.lastValue;
var s = this.keyframeBufferStartIndexFloat
, n = 2 * this.keyframeBufferStartIndexFloat;
if (this.lastValue = t,
this.lastFramePercent = e,
2 == this.keyframePackingType) {
var r = e - (t = Math.floor(e));
return e >= this.numKeyframes && (t -= Math.floor(e / this.numKeyframes) * this.numKeyframes),
t >= this.numKeyframes ? this.lastValue = i.keyframesSharedBufferFloats[s + (this.numKeyframes - 1)] : t < 0 ? this.lastValue = i.keyframesSharedBufferFloats[s] : 0 == r ? this.lastValue = i.keyframesSharedBufferFloats[s + t] : (e = n = i.keyframesSharedBufferFloats[s + t],
++t >= this.numKeyframes && (t -= this.numKeyframes),
0 <= t && t < this.numKeyframes ? e = n * (1 - r) + i.keyframesSharedBufferFloats[s + t] * r : i.debugString += "
bad lerp frame " + t + " of " + this.numKeyframes,
this.lastValue = e)
}
var a = this.numKeyframes;
r = i.keyframesSharedBufferUShorts[n + this.frameIndexOffsetUShort];
if (e >= i.keyframesSharedBufferUShorts[n + (a - 1) * this.indexUShortSkip + this.frameIndexOffsetUShort])
return this.lastValue = i.keyframesSharedBufferFloats[s + (a - 1) * this.indexFloatSkip + this.valueOffsetFloat];
if (e < r)
return this.lastValue = i.keyframesSharedBufferFloats[s + this.valueOffsetFloat];
this.lastSearchIndex < this.numKeyframes && e > i.keyframesSharedBufferUShorts[n + this.lastSearchIndex * this.indexUShortSkip + this.frameIndexOffsetUShort] && (this.lastSearchIndex = 1);
for (var o = this.lastSearchIndex; o < a; o++) {
r = s + o * this.indexFloatSkip;
var h = s + (o - 1) * this.indexFloatSkip
, l = n + o * this.indexUShortSkip
, d = n + (o - 1) * this.indexUShortSkip;
if (e >= i.keyframesSharedBufferUShorts[d + this.frameIndexOffsetUShort] && e <= i.keyframesSharedBufferUShorts[l + this.frameIndexOffsetUShort]) {
this.lastSearchIndex = o;
var c = i.keyframesSharedBufferUShorts[d + this.interpolationOffsetUShort];
if (2 == c) {
this.lastValue = e = e >= i.keyframesSharedBufferUShorts[l + this.frameIndexOffsetUShort] ? i.keyframesSharedBufferFloats[r + this.valueOffsetFloat] : i.keyframesSharedBufferFloats[h + this.valueOffsetFloat];
break
}
if (0 == c) {
s = i.keyframesSharedBufferUShorts[d + this.frameIndexOffsetUShort],
t = i.keyframesSharedBufferFloats[h + this.valueOffsetFloat],
n = i.keyframesSharedBufferFloats[r + this.valueOffsetFloat],
r = (e - s) / (i.keyframesSharedBufferUShorts[l + this.frameIndexOffsetUShort] - s),
this.lastValue = e = t * (1 - r) + n * r;
break
}
if (1 == c || 3 == c) {
var u = c = !1
, f = 0
, m = i.keyframesSharedBufferFloats[h + this.valueOffsetFloat]
, p = i.keyframesSharedBufferFloats[r + this.valueOffsetFloat]
, g = 0
, v = 0
, x = (d = i.keyframesSharedBufferUShorts[d + this.frameIndexOffsetUShort],
l = i.keyframesSharedBufferUShorts[l + this.frameIndexOffsetUShort],
0)
, y = 1
, b = 1
, S = 1
, T = 1
, w = 1
, C = 1
, R = 1
, A = 1;
0 != this.weighInOffsetFloat && (b = i.keyframesSharedBufferFloats[h + this.weighInOffsetFloat],
S = i.keyframesSharedBufferFloats[r + this.weighInOffsetFloat],
C = i.keyframesSharedBufferFloats[h + this.weighOutOffsetFloat],
R = i.keyframesSharedBufferFloats[r + this.weighOutOffsetFloat]),
1 < o && (c = !0,
f = i.keyframesSharedBufferFloats[s + (o - 2) * this.indexFloatSkip + this.valueOffsetFloat],
v = i.keyframesSharedBufferUShorts[n + (o - 2) * this.indexUShortSkip + this.frameIndexOffsetUShort],
0 != this.weighInOffsetFloat && (y = i.keyframesSharedBufferFloats[s + (o - 2) * this.indexFloatSkip + this.weighInOffsetFloat],
w = i.keyframesSharedBufferFloats[s + (o - 2) * this.indexFloatSkip + this.weighOutOffsetFloat])),
o < a - 1 && (u = !0,
g = i.keyframesSharedBufferFloats[s + (o + 1) * this.indexFloatSkip + this.valueOffsetFloat],
x = i.keyframesSharedBufferUShorts[n + (o + 1) * this.indexUShortSkip + this.frameIndexOffsetUShort],
0 != this.weighInOffsetFloat && (T = i.keyframesSharedBufferFloats[s + (o + 1) * this.indexFloatSkip + this.weighInOffsetFloat],
A = i.keyframesSharedBufferFloats[s + (o + 1) * this.indexFloatSkip + this.weighOutOffsetFloat])),
c && u ? (this.splineKF0.value = f,
this.splineKF1.value = m,
this.splineKF2.value = p,
this.splineKF3.value = g,
this.splineKF0.frameIndex = v,
this.splineKF1.frameIndex = d,
this.splineKF2.frameIndex = l,
this.splineKF3.frameIndex = x,
this.splineKF0.weighIn = y,
this.splineKF0.weighOut = w,
this.splineKF1.weighIn = b,
this.splineKF1.weighOut = C,
this.splineKF2.weighIn = S,
this.splineKF2.weighOut = R,
this.splineKF3.weighIn = T,
this.splineKF3.weighOut = A) : (this.splineKF0.value = m,
this.splineKF1.value = m,
this.splineKF2.value = p,
this.splineKF3.value = p,
this.splineKF0.frameIndex = d,
this.splineKF1.frameIndex = d,
this.splineKF2.frameIndex = l,
this.splineKF3.frameIndex = l,
this.splineKF1.weighIn = b,
this.splineKF2.weighIn = S,
this.splineKF1.weighOut = C,
this.splineKF2.weighOut = R,
u ? (this.splineKF3.value = g,
this.splineKF3.frameIndex = x,
this.splineKF3.weighIn = T,
this.splineKF3.weighOut = A) : (this.splineKF3.frameIndex++,
this.splineKF3.value = this.splineKF1.value,
this.splineKF3.weighIn = 1,
this.splineKF3.weighOut = 1),
c ? (this.splineKF0.value = f,
this.splineKF0.frameIndex = v,
this.splineKF0.weighIn = y,
this.splineKF0.weighOut = w) : (this.splineKF0.value = this.splineKF2.value,
this.splineKF0.weighIn = 1,
this.splineKF0.weighOut = 1,
0 < this.splineKF0.frameIndex ? this.splineKF0.frameIndex-- : (this.splineKF1.frameIndex++,
this.splineKF2.frameIndex++,
this.splineKF3.frameIndex++,
e++))),
this.lastValue = e = this.evaluateCurve(e, t);
break
}
}
}
return this.lastValue
}
,
o.prototype.getTRSValue = function (e, t, i) {
return t ? (t.evaluate(e, i, this.hostObject),
"" != t.debugString && (this.debugString += t.debugString),
t.lastValue) : i
}
,
o.prototype.evaluateMatrix = function (e, t, i, s) {
if (this.lockTransform)
S.copy(e, this.cachedmatrix0);
else {
var n = 0
, r = t = 0;
n = r = t = 0,
n = r = t = 1;
this.hasRotation ? (n = this.getTRSValue(i, this.RX, 0),
t = this.getTRSValue(i, this.RY, 0),
r = this.getTRSValue(i, this.RZ, 0),
s ? (this.matrix = S.rotation(S.empty(), r, 2),
s = S.rotation(S.empty(), n, 0),
S.mul(s, s, this.matrix),
this.matrix = S.rotation(S.empty(), t, 1)) : (this.matrix = S.rotation(S.empty(), n, 0),
s = S.rotation(S.empty(), t, 1),
S.mul(s, s, this.matrix),
this.matrix = S.rotation(S.empty(), r, 2)),
S.mul(this.matrix, this.matrix, s)) : S.copy(this.matrix, S.identity()),
this.hasTranslation && (t = this.getTRSValue(i, this.TX, 0),
r = this.getTRSValue(i, this.TY, 0),
n = this.getTRSValue(i, this.TZ, 0),
this.matrix[12] = t,
this.matrix[13] = r,
this.matrix[14] = n),
this.hasScale && (t = this.getTRSValue(i, this.SX, 1),
r = this.getTRSValue(i, this.SY, 1),
n = this.getTRSValue(i, this.SZ, 1),
this.matrix[0] *= t,
this.matrix[4] *= r,
this.matrix[8] *= n,
this.matrix[1] *= t,
this.matrix[5] *= r,
this.matrix[9] *= n,
this.matrix[2] *= t,
this.matrix[6] *= r,
this.matrix[10] *= n,
this.matrix[3] *= t,
this.matrix[7] *= r,
this.matrix[11] *= n),
S.copy(e, this.matrix)
}
}
,
o.prototype.clearCachedTransforms = function () {
this.cachedFrame3 = this.cachedFrame2 = this.cachedFrame1 = this.cachedFrame0 = -1,
this.cachedFrameUse3 = this.cachedFrameUse2 = this.cachedFrameUse1 = this.cachedFrameUse0 = 0,
this.TX && (this.TX.lastFramePercent = -10),
this.TY && (this.TY.lastFramePercent = -10),
this.TZ && (this.TZ.lastFramePercent = -10),
this.RX && (this.RX.lastFramePercent = -10),
this.RY && (this.RY.lastFramePercent = -10),
this.RZ && (this.RZ.lastFramePercent = -10),
this.SX && (this.SX.lastFramePercent = -10),
this.SY && (this.SY.lastFramePercent = -10),
this.SZ && (this.SZ.lastFramePercent = -10),
this.lockTransform = !1
}
,
o.prototype.getCachedTransform = function (e) {
return this.lockTransform ? 0 : this.cachedFrame0 == e ? this.cachedmatrix0 : this.cachedFrame1 == e ? this.cachedmatrix1 : this.cachedFrame2 == e ? this.cachedmatrix2 : this.cachedFrame3 == e ? this.cachedmatrix3 : 0
}
,
o.prototype.getFreeCachedTransform = function (e) {
return this.lockTransform ? 0 : (this.cachedFrameUse0--,
this.cachedFrameUse1--,
this.cachedFrameUse2--,
this.cachedFrameUse3--,
this.cachedFrameUse0 <= this.cachedFrameUse1 && this.cachedFrameUse0 <= this.cachedFrameUse2 && this.cachedFrameUse0 <= this.cachedFrameUse3 || this.cachedFrame0 == e ? (this.cachedFrame0 = e,
this.cachedFrameUse0 = 0,
this.cachedmatrix0) : this.cachedFrameUse1 <= this.cachedFrameUse0 && this.cachedFrameUse1 <= this.cachedFrameUse2 && this.cachedFrameUse1 <= this.cachedFrameUse3 || this.cachedFrame1 == e ? (this.cachedFrame1 = e,
this.cachedFrameUse1 = 0,
this.cachedmatrix1) : this.cachedFrameUse2 <= this.cachedFrameUse0 && this.cachedFrameUse2 <= this.cachedFrameUse1 && this.cachedFrameUse2 <= this.cachedFrameUse3 || this.cachedFrame2 == e ? (this.cachedFrame2 = e,
this.cachedFrameUse2 = 0,
this.cachedmatrix2) : (this.cachedFrame3 = e,
this.cachedFrameUse3 = 0,
this.cachedmatrix3))
}
,
c.prototype.evaluateModelPartTransformAtFrame = function (e, t, i, s) {
S.copy(i, S.identity());
for (var n = 0; n < 100; n++) {
var r = this.animatedObjects[e];
if (e == r.parentIndex)
break;
if (r.useFixedWorldTransform) {
S.mul(i, r.cachedWorldTransform0, i);
break
}
var a = 0;
if (s && (a = r.getCachedWorldTransform(t)),
a) {
S.mul(i, a, i);
break
}
a = S.identity(),
r.evaluateLocalTransformAtFramePercent(t, a, !1, s),
S.mul(i, a, i),
e == r.parentIndex && (n = 100),
e = r.parentIndex
}
}
,
c.prototype.lerpModelPartTransform = function (e, t, i, s) {
var n = this.animatedObjects[e];
if (n.useFixedWorldTransform)
S.copy(i, n.cachedWorldTransform0);
else {
var r = (r = t * n.modelPartFPS) - Math.floor(r)
, a = Math.floor(this.getObjectAnimationFramePercent(n, t))
, o = a + 1
, h = t = 0;
for (s && (t = n.getCachedWorldTransform(a),
h = n.getCachedWorldTransform(o)),
t || ((t = n.getFreeCachedWorldTransform(a)) || (t = S.identity()),
this.evaluateModelPartTransformAtFrame(e, a, t, s)),
h || ((h = n.getFreeCachedWorldTransform(o)) || (h = S.identity()),
this.evaluateModelPartTransformAtFrame(e, o, h, s)),
e = 1 - r,
s = 0; s < 16; s++)
i[s] = t[s] * e + h[s] * r
}
}
,
c.prototype.getModelPartTransform = function (e, t, i, s) {
this.lerpModelPartTransform(e, t, i, s)
}
,
c.prototype.getAnimatedLocalTransform = function (e, t, i, s) {
e = this.animatedObjects[e];
var n = this.animatedObjects[e.parentIndex]
, r = n.modelPartIndex != n.id
, a = S.identity();
if (this.getModelPartTransform(e.modelPartIndex, t, a, s),
r) {
r = S.identity();
var o = S.identity();
this.getModelPartTransform(n.modelPartIndex, t, r, s),
S.invert(o, r),
S.mul(i, o, a),
i[12] *= e.modelPartScale,
i[13] *= e.modelPartScale,
i[14] *= e.modelPartScale
} else
S.copy(i, a)
}
,
c.prototype.isVisibleAtFramePercent = function (e, t) {
for (var i = e, s = 0, n = 0; n < 100; n++) {
if ((s = this.animatedObjects[i]).visibleProperty) {
if (s.visibleProperty.evaluate(t, 1, s),
"" != s.debugString || "" != s.visibleProperty.debugString)
return this.debugString += s.debugString,
this.debugString += s.visibleProperty.debugString,
!1;
if (0 == s.visibleProperty.lastValue)
return !1
}
i == s.parentIndex && (n = 100),
i = s.parentIndex
}
return !0
}
,
c.prototype.getWorldTransform = function (e, t, i, s, n) {
if ((e = this.animatedObjects[e]).useFixedWorldTransform)
S.copy(i, e.cachedWorldTransform0);
else {
var r = this.getObjectAnimationFramePercent(e, t)
, a = S.identity();
if (e.evaluateLocalTransformAtFramePercent(r, a, !0, n),
r = e.modelPartIndex != e.id) {
r = S.identity();
var o = S.identity();
S.copy(o, a),
this.getAnimatedLocalTransform(e.id, t, r),
S.mul(a, r, o)
}
if (S.copy(i, a),
e.parentIndex != e.id)
for (var h = e.parentIndex, l = 0; l < 100; l++)
e = this.animatedObjects[h],
r = this.getObjectAnimationFramePercent(e, t),
a = S.identity(),
e.evaluateLocalTransformAtFramePercent(r, a, !0, n),
(r = e.modelPartIndex != e.id) ? (r = S.identity(),
this.getAnimatedLocalTransform(e.id, t, r),
o = S.identity(),
S.mul(o, a, i),
S.mul(i, r, o)) : (o = S.identity(),
S.copy(o, i),
S.mul(i, a, o)),
h == e.parentIndex && (l = 100),
h = e.parentIndex;
i[12] *= s,
i[13] *= s,
i[14] *= s
}
}
,
c.prototype.hasParentInHierarchy = function (e, t) {
for (var i = e.parentIndex, s = 0; s < 100; s++) {
if ((e = this.animatedObjects[i]).id == t)
return !0;
i == e.parentIndex && (s = 100),
i = e.parentIndex
}
return !1
}
,
c.prototype.hasParentTypeInHierarchy = function (e, t) {
for (var i = e.parentIndex, s = 0; s < 100; s++) {
if ((e = this.animatedObjects[i]).sceneObjectType == t)
return !0;
i == e.parentIndex && (s = 100),
i = e.parentIndex
}
return !1
}
,
c.prototype.searchAnimationUpHierarchy = function (e) {
for (var t = e.id, i = 0; i < 100; i++) {
if ((e = this.animatedObjects[t]).animatedLocalTransform && (e.hasAnimatedTransform() || e.id != e.modelPartIndex && this.searchAnimationUpHierarchy(this.animatedObjects[e.modelPartIndex])))
return !0;
t == e.parentIndex && (i = 100),
t = e.parentIndex
}
return !1
}
,
c.prototype.hasAnimationInHierarchy = function (e) {
return !!(this.searchAnimationUpHierarchy(e) || e.id != e.modelPartIndex && this.searchAnimationUpHierarchy(this.animatedObjects[e.modelPartIndex]) || this.hasParentTypeInHierarchy(e, "TurnTableSO") || this.hasParentTypeInHierarchy(e, "CameraSO") || "CameraSO" == e.sceneObjectType)
}
,
c.prototype.getObjectAnimationFramePercent = function (e, t) {
if (0 == this.totalFrames || 0 == e.animationLength)
return 0;
var i = t / e.animationLength;
i = Math.floor(i);
return (i = (t -= e.animationLength * i) * e.modelPartFPS) >= e.totalFrames + 1 && (i = e.totalFrames),
i
}
,
h.prototype.get = function (e) {
return this.files[e]
}
,
h.prototype.extract = function (e) {
var t = this.files[e];
return delete this.files[e],
t
}
,
h.prototype.checkSignature = function (e) {
if (!e)
return !1;
var t = this.get(e.name + ".sig");
if (!t)
return !1;
if (!(t = JSON.parse(String.fromCharCode.apply(null, t.data))))
return !1;
for (var i = 5381, s = 0; s < e.data.length; ++s)
i = 33 * i + e.data[s] & 4294967295;
return (e = new l).setBytes([0, 233, 33, 170, 116, 86, 29, 195, 228, 46, 189, 3, 185, 31, 245, 19, 159, 105, 73, 190, 158, 80, 175, 38, 210, 116, 221, 229, 171, 134, 104, 144, 140, 5, 99, 255, 208, 78, 248, 215, 172, 44, 79, 83, 5, 244, 152, 19, 92, 137, 112, 10, 101, 142, 209, 100, 244, 92, 190, 125, 28, 0, 185, 54, 143, 247, 49, 37, 15, 254, 142, 180, 185, 232, 50, 219, 11, 186, 106, 116, 78, 212, 10, 105, 53, 26, 14, 181, 80, 47, 87, 213, 182, 19, 126, 151, 86, 109, 182, 224, 37, 135, 80, 59, 22, 93, 125, 68, 214, 106, 209, 152, 235, 157, 249, 245, 48, 76, 203, 0, 0, 95, 200, 246, 243, 229, 85, 79, 169], !0),
(s = new l).setBytes(t[0]),
s.powmod(65537, e).toInt32() == i
}
,
h.prototype.decompress = function (e, t) {
var i = new Uint8Array(t)
, s = 0
, n = new Uint32Array(4096)
, r = new Uint32Array(4096)
, a = 256
, o = e.length
, h = 0
, l = 1
, d = 0
, c = 1;
i[s++] = e[0];
for (var u = 1; !(o <= (c = u + (u >> 1)) + 1); u++) {
d = e[c + 1],
c = e[c];
if ((f = 1 & u ? d << 4 | c >> 4 : (15 & d) << 8 | c) < a)
if (f < 256)
d = s,
c = 1,
i[s++] = f;
else {
d = s,
c = r[f];
for (var f, m = (f = n[f]) + c; f < m;)
i[s++] = i[f++]
}
else {
if (f != a)
break;
for (d = s,
c = l + 1,
m = (f = h) + l; f < m;)
i[s++] = i[f++];
i[s++] = i[h]
}
n[a] = h,
r[a++] = l + 1,
h = d,
l = c,
a = 4096 <= a ? 256 : a
}
return s == t ? i : null
}
,
l.prototype.setBytes = function (e, t) {
var i = (e.length + 1) / 2 | 0;
if (this.digits = new Uint16Array(i),
t) {
var s = 0;
for (i = e.length - 1; 0 <= i; i -= 2)
this.digits[s++] = e[i] + (0 < i ? 256 * e[i - 1] : 0)
} else
for (s = 0; s < i; ++s)
this.digits[s] = e[2 * s] + 256 * e[2 * s + 1];
this.trim()
}
,
l.prototype.toInt32 = function () {
var e = 0;
return 0 < this.digits.length && (e = this.digits[0],
1 < this.digits.length && (e |= this.digits[1] << 16)),
e
}
,
l.prototype.lessThan = function (e) {
if (this.digits.length == e.digits.length)
for (var t = this.digits.length - 1; 0 <= t; --t) {
var i = this.digits[t]
, s = e.digits[t];
if (i != s)
return i < s
}
return this.digits.length < e.digits.length
}
,
l.prototype.shiftRight = function () {
for (var e = 0, t = this.digits, i = t.length - 1; 0 <= i; --i) {
var s = t[i];
t[i] = s >> 1 | e << 15,
e = s
}
this.trim()
}
,
l.prototype.shiftLeft = function (e) {
if (0 < e) {
for (var t = e / 16 | 0, i = 16 - (e %= 16), s = this.digits.length + t + 1, n = new l(s), r = 0; r < s; ++r)
n.digits[r] = 65535 & ((r < t || r >= this.digits.length + t ? 0 : this.digits[r - t]) << e | (r < 1 + t ? 0 : this.digits[r - t - 1]) >>> i);
return n.trim(),
n
}
return new l(this)
}
,
l.prototype.bitCount = function () {
var e = 0;
if (0 < this.digits.length) {
e = 16 * (this.digits.length - 1);
for (var t = this.digits[this.digits.length - 1]; t;)
t >>>= 1,
++e
}
return e
}
,
l.prototype.sub = function (e) {
var t = this.digits
, i = e.digits
, s = this.digits.length;
e = e.digits.length;
for (var n = 0, r = 0; r < s; ++r) {
var a, o = (o = t[r]) + ((n = o < (a = (a = r < e ? i[r] : 0) + n) ? 1 : 0) << 16);
t[r] = o - a & 65535
}
this.trim()
}
,
l.prototype.mul = function (e) {
for (var t = new l(this.digits.length + e.digits.length), i = t.digits, s = 0; s < this.digits.length; ++s)
for (var n = this.digits[s], r = 0; r < e.digits.length; ++r)
for (var a = n * e.digits[r], o = s + r; a;) {
var h = (65535 & a) + i[o];
i[o] = 65535 & h,
a >>>= 16,
a += h >>> 16,
++o
}
return t.trim(),
t
}
,
l.prototype.mod = function (e) {
if (this.digits.length <= 0 || e.digits.length <= 0)
return new l(0);
var t = new l(this.digits);
if (!this.lessThan(e)) {
for (var i = (i = new l(e.digits)).shiftLeft(t.bitCount() - i.bitCount()); !t.lessThan(e);)
i.lessThan(t) && t.sub(i),
i.shiftRight();
t.trim()
}
return t
}
,
l.prototype.powmod = function (e, t) {
for (var i = new l([1]), s = this.mod(t); e;)
1 & e && (i = i.mul(s).mod(t)),
e >>>= 1,
s = s.mul(s).mod(t);
return i
}
,
l.prototype.trim = function () {
for (var e = this.digits.length; 0 < e && 0 == this.digits[e - 1];)
--e;
e != this.digits.length && (this.digits = this.digits.subarray(0, e))
}
,
p.prototype.setBackground3x1 = function (e, t, i, s, n, r, a) {
this.backgroundOffsetX = t,
this.backgroundOffsetY = i,
this.edgePixelsX = a,
this.backgroundLeft = e.addImage(s),
this.backgroundMiddle = e.addImage(n),
this.backgroundRight = e.addImage(r),
this.backgroundLeft.linkedControl.style.zIndex = "0",
this.backgroundMiddle.linkedControl.style.zIndex = "0",
this.backgroundRight.linkedControl.style.zIndex = "0",
this.setOpacity(this.defaultAlpha)
}
,
p.prototype.setBackground3x3 = function (e, t, i, s, n, r, a, o, h, l, d, c, u, f) {
this.backgroundOffsetX = t,
this.backgroundOffsetY = i,
this.edgePixelsX = u,
this.edgePixelsY = f,
this.backgroundTopLeft = e.addImage(s),
this.backgroundMiddleLeft = e.addImage(a),
this.backgroundBottomLeft = e.addImage(l),
this.backgroundTopMiddle = e.addImage(n),
this.backgroundMiddleMiddle = e.addImage(o),
this.backgroundBottomMiddle = e.addImage(d),
this.backgroundTopRight = e.addImage(r),
this.backgroundMiddleRight = e.addImage(h),
this.backgroundBottomRight = e.addImage(c),
this.backgroundTopLeft.linkedControl.style.zIndex = "0",
this.backgroundTopRight.linkedControl.style.zIndex = "0",
this.backgroundTopMiddle.linkedControl.style.zIndex = "0",
this.backgroundMiddleLeft.linkedControl.style.zIndex = "0",
this.backgroundMiddleRight.linkedControl.style.zIndex = "0",
this.backgroundMiddleMiddle.linkedControl.style.zIndex = "0",
this.backgroundBottomLeft.linkedControl.style.zIndex = "0",
this.backgroundBottomRight.linkedControl.style.zIndex = "0",
this.backgroundBottomMiddle.linkedControl.style.zIndex = "0",
this.setOpacity(this.defaultAlpha)
}
,
p.prototype.alignBackground = function () {
var e = (n = (s = this.controlRect).guiScreen).left * (1 - s.getScreenXPercent())
, t = n.bottom * (1 - s.getScreenYPercent())
, i = n.width * s.getScreenWidthPercent()
, s = n.height * s.getScreenHeightPercent();
t += this.backgroundOffsetY,
e += this.backgroundOffsetX;
if (this.backgroundTopLeft && this.backgroundTopRight && this.backgroundTopMiddle && this.backgroundMiddleLeft && this.backgroundMiddleRight && this.backgroundMiddleMiddle && this.backgroundBottomLeft && this.backgroundBottomRight && this.backgroundBottomMiddle) {
var n = i - 2 * this.edgePixelsX
, r = s - 2 * this.edgePixelsY;
this.backgroundTopLeft.linkedControl.style.height = this.edgePixelsY + "px",
this.backgroundTopMiddle.linkedControl.style.height = this.edgePixelsY + "px",
this.backgroundTopRight.linkedControl.style.height = this.edgePixelsY + "px",
this.backgroundBottomLeft.linkedControl.style.height = this.edgePixelsY + "px",
this.backgroundBottomMiddle.linkedControl.style.height = this.edgePixelsY + "px",
this.backgroundBottomRight.linkedControl.style.height = this.edgePixelsY + "px",
this.backgroundMiddleLeft.linkedControl.style.height = r + "px",
this.backgroundMiddleMiddle.linkedControl.style.height = r + "px",
this.backgroundMiddleRight.linkedControl.style.height = r + "px",
this.backgroundTopLeft.linkedControl.style.width = this.edgePixelsX + "px",
this.backgroundBottomLeft.linkedControl.style.width = this.edgePixelsX + "px",
this.backgroundMiddleLeft.linkedControl.style.width = this.edgePixelsX + "px",
this.backgroundTopRight.linkedControl.style.width = this.edgePixelsX + "px",
this.backgroundBottomRight.linkedControl.style.width = this.edgePixelsX + "px",
this.backgroundMiddleRight.linkedControl.style.width = this.edgePixelsX + "px",
this.backgroundTopMiddle.linkedControl.style.width = n + "px",
this.backgroundBottomMiddle.linkedControl.style.width = n + "px",
this.backgroundMiddleMiddle.linkedControl.style.width = n + "px",
this.backgroundTopLeft.linkedControl.style.left = e + "px",
this.backgroundBottomLeft.linkedControl.style.left = e + "px",
this.backgroundMiddleLeft.linkedControl.style.left = e + "px",
e += this.edgePixelsX,
this.backgroundTopMiddle.linkedControl.style.left = e + "px",
this.backgroundBottomMiddle.linkedControl.style.left = e + "px",
this.backgroundMiddleMiddle.linkedControl.style.left = e + "px",
e += n,
this.backgroundTopRight.linkedControl.style.left = e + "px",
this.backgroundBottomRight.linkedControl.style.left = e + "px",
this.backgroundMiddleRight.linkedControl.style.left = e + "px",
this.backgroundBottomLeft.linkedControl.style.bottom = t + "px",
this.backgroundBottomMiddle.linkedControl.style.bottom = t + "px",
this.backgroundBottomRight.linkedControl.style.bottom = t + "px",
t += this.edgePixelsY,
this.backgroundMiddleLeft.linkedControl.style.bottom = t + "px",
this.backgroundMiddleRight.linkedControl.style.bottom = t + "px",
this.backgroundMiddleMiddle.linkedControl.style.bottom = t + "px",
t += r,
this.backgroundTopLeft.linkedControl.style.bottom = t + "px",
this.backgroundTopMiddle.linkedControl.style.bottom = t + "px",
this.backgroundTopRight.linkedControl.style.bottom = t + "px"
}
this.backgroundLeft && this.backgroundRight && this.backgroundMiddle && (i -= 2 * this.edgePixelsX,
this.backgroundLeft.linkedControl.style.bottom = t + "px",
this.backgroundMiddle.linkedControl.style.bottom = t + "px",
this.backgroundRight.linkedControl.style.bottom = t + "px",
this.backgroundLeft.linkedControl.style.height = s + "px",
this.backgroundMiddle.linkedControl.style.height = s + "px",
this.backgroundRight.linkedControl.style.height = s + "px",
this.backgroundLeft.linkedControl.style.width = this.edgePixelsX + "px",
this.backgroundMiddle.linkedControl.style.width = i + "px",
this.backgroundRight.linkedControl.style.width = this.edgePixelsX + "px",
this.backgroundLeft.linkedControl.style.left = e + "px",
e += this.edgePixelsX,
this.backgroundMiddle.linkedControl.style.left = e + "px",
this.backgroundRight.linkedControl.style.left = e + i + "px")
}
,
p.prototype.setOpacity = function (e) {
this.controlRect.linkedControl.style.opacity = e,
this.backgroundLeft && (this.backgroundLeft.linkedControl.style.opacity = e),
this.backgroundRight && (this.backgroundRight.linkedControl.style.opacity = e),
this.backgroundMiddle && (this.backgroundMiddle.linkedControl.style.opacity = e),
this.backgroundTopLeft && (this.backgroundTopLeft.linkedControl.style.opacity = e),
this.backgroundTopRight && (this.backgroundTopRight.linkedControl.style.opacity = e),
this.backgroundTopMiddle && (this.backgroundTopMiddle.linkedControl.style.opacity = e),
this.backgroundMiddleLeft && (this.backgroundMiddleLeft.linkedControl.style.opacity = e),
this.backgroundMiddleRight && (this.backgroundMiddleRight.linkedControl.style.opacity = e),
this.backgroundMiddleMiddle && (this.backgroundMiddleMiddle.linkedControl.style.opacity = e),
this.backgroundBottomLeft && (this.backgroundBottomLeft.linkedControl.style.opacity = e),
this.backgroundBottomRight && (this.backgroundBottomRight.linkedControl.style.opacity = e),
this.backgroundBottomMiddle && (this.backgroundBottomMiddle.linkedControl.style.opacity = e)
}
,
p.prototype.setBackgroundVisible = function (e) {
this.backgroundLeft && this.backgroundLeft.showControl(e),
this.backgroundRight && this.backgroundRight.showControl(e),
this.backgroundMiddle && this.backgroundMiddle.showControl(e),
this.backgroundTopLeft && this.backgroundTopLeft.showControl(e),
this.backgroundTopRight && this.backgroundTopRight.showControl(e),
this.backgroundTopMiddle && this.backgroundTopMiddle.showControl(e),
this.backgroundMiddleLeft && this.backgroundMiddleLeft.showControl(e),
this.backgroundMiddleRight && this.backgroundMiddleRight.showControl(e),
this.backgroundMiddleMiddle && this.backgroundMiddleMiddle.showControl(e),
this.backgroundBottomLeft && this.backgroundBottomLeft.showControl(e),
this.backgroundBottomRight && this.backgroundBottomRight.showControl(e),
this.backgroundBottomMiddle && this.backgroundBottomMiddle.showControl(e)
}
,
p.prototype.setVisible = function (e) {
this.controlRect.showControl(e),
this.setBackgroundVisible(e)
}
,
p.prototype.linkControl = function (e) {
(this.controlRect.linkedControl = e).onmouseover = function () {
this.updateAlphas && (this.setOpacity(this.focusAlpha),
this.controlRect.mouseOver = !0,
this.linkedBackground && this.linkedBackground.setOpacity(this.focusAlpha))
}
.bind(this),
e.onmouseout = function () {
this.updateAlphas && (this.setOpacity(this.defaultAlpha),
this.controlRect.mouseOver = !1,
this.linkedBackground && this.linkedBackground.setOpacity(this.defaultAlpha))
}
.bind(this)
}
,
u.prototype.empty = function () {
return this.bytes.length <= 0
}
,
u.prototype.readCString = function () {
for (var e = this.bytes, t = e.length, i = 0; i < t; ++i)
if (0 == e[i])
return e = String.fromCharCode.apply(null, this.bytes.subarray(0, i)),
this.bytes = this.bytes.subarray(i + 1),
e;
return null
}
,
u.prototype.asString = function () {
for (var e = "", t = 0; t < this.bytes.length; ++t)
e += String.fromCharCode(this.bytes[t]);
return e
}
,
u.prototype.readBytes = function (e) {
var t = this.bytes.subarray(0, e);
return this.bytes = this.bytes.subarray(e),
t
}
,
u.prototype.readUint32 = function () {
var e = this.bytes
, t = e[0] | e[1] << 8 | e[2] << 16 | e[3] << 24;
return this.bytes = e.subarray(4),
t
}
,
u.prototype.readUint8 = function () {
var e = this.bytes
, t = e[0];
return this.bytes = e.subarray(1),
t
}
,
u.prototype.readUint16 = function () {
var e = this.bytes
, t = e[0] | e[1] << 8;
return this.bytes = e.subarray(2),
t
}
,
u.prototype.readFloat32 = function () {
var e = new Uint8Array(this.bytes);
e = new Float32Array(e.buffer);
return this.bytes = this.bytes.subarray(4),
e[0]
}
,
u.prototype.seekUint32 = function (e) {
return (e = this.bytes.subarray(4 * e))[0] | e[1] << 8 | e[2] << 16 | e[3] << 24
}
,
u.prototype.seekFloat32 = function (e) {
return e = new Uint8Array(this.bytes.subarray(4 * e)),
new Float32Array(e.buffer)[0]
}
,
u.prototype.getMatrix = function (e) {
return new Float32Array(this.bytes.buffer, 64 * e, 16)
}
,
s.prototype.getScreenWidth = function () {
if (this.linkedControl)
return this.guiScreen.width * this.getScreenWidthPercent()
}
,
s.prototype.getScreenHeight = function () {
if (this.linkedControl)
return this.guiScreen.height * this.getScreenHeightPercent()
}
,
s.prototype.updateElement = function () {
var e = this.linkedControl;
if (e) {
var t = this.guiScreen.left * (1 - this.getScreenXPercent())
, i = this.guiScreen.bottom * (1 - this.getScreenYPercent())
, s = this.guiScreen.width * this.getScreenWidthPercent()
, n = this.guiScreen.height * this.getScreenHeightPercent();
e.style.left = t + "px",
e.style.bottom = i + "px",
e.style.width = s + "px",
e.style.height = n + "px"
}
}
,
s.prototype.updateElement = function () {
var e = this.linkedControl;
if (e) {
var t = this.guiScreen.left * (1 - this.getScreenXPercent())
, i = this.guiScreen.bottom * (1 - this.getScreenYPercent())
, s = this.guiScreen.width * this.getScreenWidthPercent()
, n = this.guiScreen.height * this.getScreenHeightPercent();
e.style.left = t + "px",
e.style.bottom = i + "px",
e.style.width = s + "px",
e.style.height = n + "px"
}
}
,
s.prototype.updateChildElements = function () {
this.updateElement();
for (var e = 0; e < this.childControlRects.length; e++)
this.childControlRects[e].updateChildElements()
}
,
s.prototype.set = function (e, t, i, s) {
this.xPercent = e,
this.yPercent = t,
this.widthPercent = i,
this.heightPercent = s
}
,
s.prototype.linkControl = function (e) {
(this.linkedControl = e).onmouseover = function () {
this.mouseOver = !0
}
.bind(this),
e.onmouseout = function () {
this.mouseOver = !1
}
.bind(this),
e.onmousedown = function () {
this.mouseDown = !0
}
.bind(this),
e.onmouseup = function () {
this.mouseDown = !1
}
.bind(this),
e.onclick = function () {
this.callBack && this.callBack(this),
this.clicked = !0
}
.bind(this)
}
,
s.prototype.showControl = function (e) {
this.visible = e,
this.linkedControl && (this.linkedControl.style.display = e ? "block" : "none")
}
,
s.prototype.setOpacity = function (e) {
this.opacity = e,
this.linkedControl && (this.linkedControl.style.opacity = e)
}
,
s.prototype.hasChildControlRect = function (e) {
for (var t = 0; t < this.childControlRects.length; t++)
if (this.childControlRects[t] == e)
return !0;
return !1
}
,
s.prototype.registerChildControlRect = function (e) {
this.hasChildControlRect(e) || (this.childControlRects.push(e),
e.parentControlRect = this)
}
,
s.prototype.getScreenWidthPercent = function () {
var e = this.widthPercent;
return this.parentControlRect && (e *= this.parentControlRect.getScreenWidthPercent()),
e
}
,
s.prototype.getScreenHeightPercent = function () {
var e = this.heightPercent;
return this.parentControlRect && (e *= this.parentControlRect.getScreenHeightPercent()),
e
}
,
s.prototype.getScreenXPercent = function () {
var e = this.xPercent;
return this.parentControlRect && (e *= this.parentControlRect.getScreenWidthPercent(),
e += this.parentControlRect.getScreenXPercent()),
e
}
,
s.prototype.getScreenYPercent = function () {
var e = this.yPercent;
return this.parentControlRect && (e *= this.parentControlRect.getScreenHeightPercent(),
e += this.parentControlRect.getScreenYPercent()),
e
}
;
function n(e, t, i, s) {
var n = !1
, r = e + (-1 == e.indexOf("?") ? "?" : "&") + "thumb=1"
, a = function (e) {
return (e = new h(e).extract("thumbnail.jpg")) ? N.parseFile(e, t, s) : n ? i && i() : (n = !0,
C.fetchBinaryIncremental(r, a, i, 394240)),
0
};
C.fetchBinaryIncremental(r, a, i, 65536)
}
function f(e, t) {
this.desc = t,
this.gl = e,
this.iblShader = e.shaderCache.fromURLs("fogvert.glsl", "fogfrag.glsl", ["#define FOG_IBL"]);
var i = ["#define FOG_DIR"];
this.dirShader = e.shaderCache.fromURLs("fogvert.glsl", "fogfrag.glsl", i),
i.push("#define FOG_SHADOWS"),
this.dirShaderShadow = e.shaderCache.fromURLs("fogvert.glsl", "fogfrag.glsl", i),
i = ["#define FOG_SPOT"],
this.spotShader = e.shaderCache.fromURLs("fogvert.glsl", "fogfrag.glsl", i),
i.push("#define FOG_SHADOWS"),
this.spotShaderShadow = e.shaderCache.fromURLs("fogvert.glsl", "fogfrag.glsl", i),
i = ["#define FOG_OMNI"],
this.omniShaderShadow = this.omniShader = e.shaderCache.fromURLs("fogvert.glsl", "fogfrag.glsl", i),
this.fullscreenTriangle = e.createBuffer(),
e.bindBuffer(e.ARRAY_BUFFER, this.fullscreenTriangle),
i = new Float32Array([0, 0, 2, 0, 0, 2]),
e.bufferData(e.ARRAY_BUFFER, i, e.STATIC_DRAW),
e.bindBuffer(e.ARRAY_BUFFER, null)
}
function m(e, t) {
this.gl = e,
this.fbo = e.createFramebuffer(),
e.bindFramebuffer(e.FRAMEBUFFER, this.fbo),
t && (this.width = t.width,
this.height = t.height,
t.color0 && (this.color0 = t.color0,
e.framebufferTexture2D(e.FRAMEBUFFER, e.COLOR_ATTACHMENT0, e.TEXTURE_2D, this.color0.id, 0),
this.width = t.color0.desc.width,
this.height = t.color0.desc.height),
t.depth ? (this.depth = t.depth,
e.framebufferTexture2D(e.FRAMEBUFFER, e.DEPTH_ATTACHMENT, e.TEXTURE_2D, this.depth.id, 0)) : (this.depthBuffer = t.depthBuffer,
t.createDepth && !this.depthBuffer && (this.depthBuffer = m.createDepthBuffer(e, this.width, this.height)),
this.depthBuffer && (e.bindRenderbuffer(e.RENDERBUFFER, this.depthBuffer),
e.framebufferRenderbuffer(e.FRAMEBUFFER, e.DEPTH_ATTACHMENT, e.RENDERBUFFER, this.depthBuffer),
e.bindRenderbuffer(e.RENDERBUFFER, null)))),
this.valid = t && t.ignoreStatus || e.checkFramebufferStatus(e.FRAMEBUFFER) == e.FRAMEBUFFER_COMPLETE,
e.bindFramebuffer(e.FRAMEBUFFER, null)
}
(I = void 0 === I ? {} : I).embed = function (e, t) {
var i, s = (t = function (e) {
if (e = e || {},
document.location.search)
for (var t = document.location.search.substring(1).split("&"), i = 0; i < t.length; ++i) {
var s = t[i].split("=");
e[s[0]] = s[1]
}
return t = function (e) {
if (0 | e)
return !0;
for (var t = "true True TRUE yes Yes YES".split(" "), i = 0; i < t.length; ++i)
if (e === t[i])
return !0;
return !1
}
,
e.width = e.width || 800,
e.height = e.height || 600,
e.autoStart = t(e.autoStart),
e.pagePreset = t(e.pagePreset),
e.fullFrame = t(e.fullFrame) || t(e.bare),
e.fullFrame = !e.pagePreset && e.fullFrame,
e
}(t)).thumbnailURL;
if (t.pagePreset) {
i = new W(t.width, t.height, e, !!s),
document.body.style.backgroundColor = "#d7e4da";
var n = document.createElement("div");
n.style.position = "relative",
n.style.backgroundColor = "#e4e7e4",
n.style.width = t.width + 12 + "px",
n.style.height = t.height + 6 + 16 + "px",
n.style.margin = "auto",
n.style.boxShadow = "3px 5px 12px 0px grey",
document.body.appendChild(n);
var r = document.createElement("div");
if (r.style.position = "relative",
r.style.left = "6px",
r.style.top = "6px",
n.appendChild(r),
r.appendChild(i.domRoot),
!i.mobile) {
n.style.resize = "both",
n.style.overflow = "hidden";
var a = [n.style.width, n.style.height]
, o = function () {
g.active() ? n.style.resize = "none" : (n.style.resize = "both",
a[0] == n.style.width && a[1] == n.style.height || (a[0] = n.style.width,
a[1] = n.style.height,
i.resize(n.clientWidth - 12, n.clientHeight - 6 - 16))),
window.setTimeout(o, 100)
};
o()
}
} else
i = new W(t.fullFrame ? window.innerWidth : t.width, t.fullFrame ? window.innerHeight : t.height, e, !!s),
document.body.appendChild(i.domRoot),
t.fullFrame && (i.domRoot.style.position = "absolute",
i.domRoot.style.left = i.domRoot.style.top = 0,
window.addEventListener("resize", function () {
g.active() || i.resize(this.document.body.clientWidth, this.document.body.clientHeight)
}));
return (webview = i).ui.setThumbnailURL(s),
t.autoStart && i.loadScene(),
i
}
,
I.fetchThumbnail = n,
f.prototype.draw = function (e, t) {
var i = this.gl
, s = e.view
, n = s.projectionMatrix
, r = S.empty();
S.mul(r, s.viewMatrix, s.projectionMatrix),
S.invert(r, s.viewProjectionMatrix),
r = [n[10] + n[11], -n[14], -2 * n[11]],
n = [-2 / n[0], -2 / n[5], (1 - n[8]) / n[0], (1 - n[9]) / n[5]],
i.enable(i.BLEND),
i.blendFunc(i.ONE, i.ONE_MINUS_SRC_ALPHA);
for (var a = 0; a < e.lights.count + 1; ++a) {
var o, h = a - 1, l = h < e.lights.shadowCount;
(o = 0 == a ? this.iblShader : 0 < e.lights.spot[3 * h] ? l ? this.spotShaderShadow : this.spotShader : 0 < e.lights.getLightPos(h)[3] ? this.omniShader : l ? this.dirShaderShadow : this.dirShader).bind();
var d = o.params;
if (i.uniform3fv(d.uDepthToZ, r),
i.uniform4fv(d.uUnproject, n),
i.uniformMatrix4fv(d.uInvViewMatrix, !1, s.transform),
i.uniform1f(d.uFogInvDistance, 1 / this.desc.distance),
i.uniform1f(d.uFogOpacity, this.desc.opacity * (1 - e.stripData.activeFade())),
i.uniform1f(d.uFogDispersion, 1 - this.desc.dispersion),
(u = [0, 0, 0])[this.desc.type] = 1,
i.uniform3fv(d.uFogType, u),
i.uniform3fv(d.uFogColor, this.desc.color),
i.uniform1f(d.uFogIllum, 0 == a ? this.desc.skyIllum : this.desc.lightIllum),
i.uniformMatrix4fv(d.uLightMatrix, !1, e.lights.invMatrix),
0 == a) {
for (h = new Float32Array(e.sky.diffuseCoefficients),
l = 4; l < 16; ++l)
h[l] *= 1 - this.desc.dispersion;
for (l = 16; l < 36; ++l)
h[l] *= 1 - this.desc.dispersion * this.desc.dispersion;
i.uniform4fv(d.uFogLightSphere, h)
} else {
var c = e.lights.getLightPos(h)
, u = (c = S.mul4(V.empty(), e.lights.invMatrix, c[0], c[1], c[2], c[3]),
e.lights.getLightDir(h));
u = S.mulVec(V.empty(), e.lights.invMatrix, u[0], u[1], u[2]);
i.uniform4fv(d.uLightPosition, c),
i.uniform3fv(d.uLightColor, e.lights.getColor(h));
c = .01745329251 * e.lights.spot[3 * h];
var f = Math.cos(.5 * c);
i.uniform4fv(d.uSpotParams, [-u[0], -u[1], -u[2], 0 < c ? f * f : 0]),
i.uniform4fv(d.uLightAttenuation, [e.lights.parameters[3 * h + 0], e.lights.parameters[3 * h + 1], e.lights.parameters[3 * h + 2], f]),
l && (l = S.mul(S.empty(), e.lights.finalTransformBuffer.subarray(16 * h), e.lights.matrix),
i.uniformMatrix4fv(d.uShadowProj, !1, l),
e.shadow.depthTextures[h].bind(o.samplers.uShadowMap),
h = 0,
1 < e.postRender.sampleCount && (h = e.postRender.currentSample() / e.postRender.sampleCount),
i.uniform1f(d.uDitherOffset, h),
i.uniform3fv(d.uAABBMin, e.bounds.min),
i.uniform3fv(d.uAABBMax, e.bounds.max),
h = V.lerp(V.empty(), e.bounds.min, e.bounds.max, .5),
l = V.distance(h, e.bounds.min),
i.uniform4f(d.uCylinder, h[0], h[1], h[2], l * l))
}
t.bind(o.samplers.tDepth),
o = o.attribs.vCoord,
i.bindBuffer(i.ARRAY_BUFFER, this.fullscreenTriangle),
i.enableVertexAttribArray(o),
i.vertexAttribPointer(o, 2, i.FLOAT, !1, 0, 0),
i.drawArrays(i.TRIANGLES, 0, 3),
i.disableVertexAttribArray(o),
i.bindBuffer(i.ARRAY_BUFFER, null)
}
i.disable(i.BLEND)
}
,
f.prototype.complete = function () {
return this.iblShader.complete() && this.dirShader.complete() && this.dirShaderShadow.complete() && this.spotShader.complete() && this.spotShaderShadow.complete() && this.omniShader.complete() && this.omniShaderShadow.complete()
}
,
m.createDepthBuffer = function (e, t, i) {
var s = e.createRenderbuffer();
return e.bindRenderbuffer(e.RENDERBUFFER, s),
e.renderbufferStorage(e.RENDERBUFFER, e.DEPTH_COMPONENT16, t, i),
e.bindRenderbuffer(e.RENDERBUFFER, null),
s
}
,
m.prototype.bind = function () {
this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, this.fbo),
this.gl.viewport(0, 0, this.width, this.height)
}
,
m.bindNone = function (e) {
e.bindFramebuffer(e.FRAMEBUFFER, null)
}
;
var g = {
support: function () {
return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled)
},
begin: function (e, t) {
var i = e.requestFullscreen || e.webkitRequestFullScreen || e.mozRequestFullScreen || e.msRequestFullscreen;
if (i) {
var s = function () {
g.active() || (document.removeEventListener("fullscreenchange", s),
document.removeEventListener("webkitfullscreenchange", s),
document.removeEventListener("mozfullscreenchange", s),
document.removeEventListener("MSFullscreenChange", s)),
t && t()
};
document.addEventListener("fullscreenchange", s),
document.addEventListener("webkitfullscreenchange", s),
document.addEventListener("mozfullscreenchange", s),
document.addEventListener("MSFullscreenChange", s),
i.bind(e)()
}
},
end: function () {
var e = document.exitFullscreen || document.webkitExitFullscreen || document.mozCancelFullScreen || document.msExitFullscreen;
e && e.bind(document)()
},
active: function () {
return !!(document.fullscreenElement || document.webkitIsFullScreen || document.mozFullScreenElement || document.msFullscreenElement)
}
};
function v(e) {
this.debugString = "GUIRegion",
this.name = "Default",
this.controlRect = new s(e),
this.yPercent = this.xPercent = 0,
this.heightPercent = this.widthPercent = 1,
this.guiScreen = e
}
function t(e) {
this.init = !1,
this.ui = e,
this.bottom = this.left = this.height = this.width = 0,
this.clicked = this.mouseDown = !1,
this.playbackControls = 0,
e = 1,
window.devicePixelRatio && (2 < window.devicePixelRatio ? e = 4 : 1 < window.devicePixelRatio && (e = 2)),
this.imageSetNumber = e
}
function e(e) {
this.onTap = [],
this.onSingleTap = [],
this.onDoubleTap = [],
this.onDrag = [],
this.onZoom = [],
this.onPan = [],
this.onPan2 = [],
this.onAnything = [],
this.mouseDownCount = 0,
this.macHax = 0 <= navigator.platform.toUpperCase().indexOf("MAC"),
e && this.attach(e)
}
function i(e, t) {
e && t ? (this.frameIndex = t.frameIndex,
this.value = t.value,
this.interpolation = t.interpolation,
this.weighIn = t.weighIn,
this.weighOut = t.weighOut) : (this.interpolation = this.value = this.frameIndex = 0,
this.weighOut = this.weighIn = 1)
}
function x(e, t) {
for (var i in this.rotation = this.shadowCount = this.count = 0,
this.positions = [],
this.directions = [],
this.matrixWeights = [],
this.matrix = S.identity(),
this.invMatrix = S.identity(),
this.defaultmatrix = S.identity(),
this.defaultviewmatrix = S.identity(),
e)
this[i] = e[i];
this.count = this.positions.length / 4,
this.count = Math.min(6, this.count),
this.shadowCount = Math.min(3, this.shadowCount),
this.positions = new Float32Array(this.positions),
this.positionBuffer = new Float32Array(this.positions),
this.directions = new Float32Array(this.directions),
this.directionBuffer = new Float32Array(this.directions),
this.colors = new Float32Array(this.colors),
this.colorsBuffer = new Float32Array(this.colors),
this.modelViewBuffer = new Float32Array(16 * this.shadowCount),
this.projectionBuffer = new Float32Array(16 * this.shadowCount),
this.finalTransformBuffer = new Float32Array(16 * this.shadowCount),
this.inverseTransformBuffer = new Float32Array(16 * this.shadowCount),
this.shadowTexelPadProjections = new Float32Array(4 * this.shadowCount),
this.shadowsNeedUpdate = new Uint8Array(this.shadowCount);
for (var s = 0; s < this.shadowsNeedUpdate.length; ++s)
this.shadowsNeedUpdate[s] = 1;
for (S.rotation(this.matrix, this.rotation, 1),
S.transpose(this.invMatrix, this.matrix),
S.copy(this.defaultmatrix, this.matrix),
S.copy(this.defaultviewmatrix, t.viewMatrix),
s = 0; s < this.count; ++s) {
i = this.positions.subarray(4 * s, 4 * s + 4);
var n = this.directions.subarray(3 * s, 3 * s + 3);
1 == this.matrixWeights[s] ? (S.mul4(i, this.matrix, i[0], i[1], i[2], i[3]),
S.mulVec(n, this.matrix, n[0], n[1], n[2])) : 2 == this.matrixWeights[s] && (S.mul4(i, t.viewMatrix, i[0], i[1], i[2], i[3]),
S.mulVec(n, t.viewMatrix, n[0], n[1], n[2]))
}
}
function y(e) {
this.name = "none",
this.text = "default text",
this.title = "none",
this.debugString = this.imagePath = "",
this.controlRect = new s(e),
this.textEntries = [],
this.textOffsetsX = [],
this.textOffsetsY = [],
this.buttons = [],
this.listBoxEntryHeight = 20,
this.selectedItemText = "",
this.selectedIndex = -1,
this.localPixelsY = 0,
this.localPixelsX = 100,
this.labelPixelDrop = 0,
this.labelPixelInset = 10,
this.labelTextHeight = 16,
this.closed = !1,
this.defaultButtonText = this.spacerMiddle = this.spacerRight = this.spacerLeft = this.spacerControl = 0,
this.listBoxButtons = [],
this.listBoxRegion = new v(e),
this.guiScreen = e,
this.lastMouseOverIndex = -1,
this.selectionChangedCallback = 0,
this.debugString = ""
}
function b(e, t, i) {
this.gl = e,
this.name = i.name;
var s = {
mipmap: !0,
aniso: e.hints.mobile ? 0 : 4,
clamp: !!i.textureWrapClamp,
mirror: !!i.textureWrapMirror
}
, n = {
mipmap: s.mipmap,
clamp: s.clamp,
mirror: s.mirror,
nofilter: i.textureFilterNearest || !1
};
if (n.nofilter || (n.aniso = e.hints.mobile ? 2 : 4),
this.textures = {
albedo: e.textureCache.fromFilesMergeAlpha(t.get(i.albedoTex), t.get(i.alphaTex), n),
reflectivity: e.textureCache.fromFilesMergeAlpha(t.get(i.reflectivityTex), t.get(i.glossTex), s),
normal: e.textureCache.fromFile(t.get(i.normalTex), s),
extras: e.textureCache.fromFilesMergeAlpha(t.get(i.extrasTex), t.get(i.extrasTexA), s)
},
this.extrasTexCoordRanges = {},
i.extrasTexCoordRanges)
for (var r in i.extrasTexCoordRanges)
this.extrasTexCoordRanges[r] = new Float32Array(i.extrasTexCoordRanges[r].scaleBias);
this.textures.extras || ((t = new U(e, {
width: 1,
height: 1
})).loadArray(new Uint8Array([255, 255, 255, 255])),
this.textures.extras = t);
var a = i.blendTint || [1, 1, 1];
t = {
none: function () {
e.disable(e.BLEND)
},
alpha: function () {
e.enable(e.BLEND),
e.blendFuncSeparate(e.SRC_ALPHA, e.ONE_MINUS_SRC_ALPHA, e.ONE_MINUS_DST_ALPHA, e.ONE)
},
add: function () {
e.enable(e.BLEND),
e.blendColor(a[0], a[1], a[2], 1),
e.blendFunc(e.ONE, e.CONSTANT_COLOR)
}
},
this.blend = t[i.blend] || t.none,
this.alphaTest = i.alphaTest || 0,
this.usesBlending = this.blend !== t.none,
this.usesRefraction = !!i.refraction,
this.shadowAlphaTest = this.alphaTest,
this.shadowAlphaTest <= 0 && this.blend === t.alpha && (this.shadowAlphaTest = .5),
this.castShadows = this.blend !== t.add,
this.horizonOcclude = i.horizonOcclude || 0,
this.fresnel = new Float32Array(i.fresnel ? i.fresnel : [1, 1, 1]),
this.emissiveIntensity = i.emissiveIntensity || 1,
n = !(s = []),
0 < i.lightCount && s.push("#define LIGHT_COUNT " + i.lightCount),
0 < i.shadowCount && (r = Math.min(i.lightCount, i.shadowCount),
this.usesRefraction && e.limits.textureCount <= 8 && (r = 2 < r ? 2 : r),
s.push("#define SHADOW_COUNT " + r)),
0 < i.alphaTest && s.push("#define ALPHA_TEST"),
this.blend === t.alpha ? s.push("#define TRANSPARENCY_DITHER") : this.blend === t.none && s.push("#define NOBLEND"),
e.hints.mobile && s.push("#define MOBILE"),
e.ext.textureDepth && s.push("#define SHADOW_NATIVE_DEPTH"),
r = function (e) {
return 1 / (2 / 3 * 3.1415962 * (e * e + e + 1))
}
,
i.useSkin && (s.push("#define SKIN"),
this.skinParams = i.skinParams || {
subdermisColor: [1, 1, 1],
transColor: [1, 0, 0, 1],
fresnelColor: [.2, .2, .2, .5],
fresnelOcc: 1,
fresnelGlossMask: 1,
transSky: .5,
shadowBlur: .5,
normalSmooth: .5,
transScatter: 0,
transDepth: 0,
millimeterScale: 1
},
this.extrasTexCoordRanges.subdermisTex || s.push("#define SKIN_NO_SUBDERMIS_TEX"),
this.extrasTexCoordRanges.translucencyTex || s.push("#define SKIN_NO_TRANSLUCENCY_TEX"),
this.extrasTexCoordRanges.fuzzTex || s.push("#define SKIN_NO_FUZZ_TEX"),
void 0 === this.skinParams.version && (this.skinParams.version = 1),
2 == this.skinParams.version ? (s.push("#define SKIN_VERSION_2"),
this.skinParams.shadowBlur *= 4,
this.skinParams.shadowBlur = Math.min(this.skinParams.shadowBlur, 40),
this.skinParams.transIntegral = r(.5 * this.skinParams.transScatter),
this.skinParams.fresnelIntegral = 1 / 3.14159 * (1 - .5 * this.skinParams.fresnelColor[3]),
this.skinParams.transSky = 0) : (s.push("#define SKIN_VERSION_1"),
this.skinParams.shadowBlur = 8 * Math.min(this.skinParams.shadowBlur, 1),
this.skinParams.transDepth = 0,
this.skinParams.transScatter = this.skinParams.transColor[3],
this.skinParams.transIntegral = 1 / 3.14159 * (1 - .5 * this.skinParams.transScatter),
this.skinParams.fresnelIntegral = 1 / 3.14159 * (1 - .5 * this.skinParams.fresnelColor[3]),
this.skinParams.transSky *= 1.25,
this.skinParams.transIntegral *= 1.25)),
i.aniso && (s.push("#define ANISO"),
this.anisoParams = i.anisoParams || {
strength: 1,
tangent: [1, 0, 0],
integral: .5
},
this.extrasTexCoordRanges.anisoTex || s.push("#define ANISO_NO_DIR_TEX")),
i.microfiber && (s.push("#define MICROFIBER"),
this.microfiberParams = i.microfiberParams || {
fresnelColor: [.2, .2, .2, .5],
fresnelOcc: 1,
fresnelGlossMask: 1
},
this.microfiberParams.fresnelIntegral = 1 / 3.14159 * (1 - .5 * this.microfiberParams.fresnelColor[3]),
this.extrasTexCoordRanges.fuzzTex || s.push("#define MICROFIBER_NO_FUZZ_TEX")),
i.refraction && (s.push("#define REFRACTION"),
this.refractionParams = i.refractionParams || {
distantBackground: !1,
tint: [1, 1, 1],
useAlbedoTint: !1,
IOR: 1.5
},
this.extrasTexCoordRanges.refractionMaskTex || s.push("#define REFRACTION_NO_MASK_TEX")),
i.vertexColor && (s.push("#define VERTEX_COLOR"),
i.vertexColorsRGB && s.push("#define VERTEX_COLOR_SRGB"),
i.vertexColorAlpha && s.push("#define VERTEX_COLOR_ALPHA")),
this.horizonSmoothing = i.horizonSmoothing || 0,
0 < this.horizonSmoothing && s.push("#define HORIZON_SMOOTHING"),
i.unlitDiffuse && s.push("#define DIFFUSE_UNLIT"),
this.extrasTexCoordRanges.emissiveTex && (s.push("#define EMISSIVE"),
i.emissiveSecondaryUV && (s.push("#define EMISSIVE_SECONDARY_UV"),
n = !0)),
this.extrasTexCoordRanges.aoTex && (s.push("#define AMBIENT_OCCLUSION"),
i.aoSecondaryUV && (s.push("#define AMBIENT_OCCLUSION_SECONDARY_UV"),
n = !0)),
i.tangentOrthogonalize && s.push("#define TSPACE_ORTHOGONALIZE"),
i.tangentNormalize && s.push("#define TSPACE_RENORMALIZE"),
i.tangentGenerateBitangent && s.push("#define TSPACE_COMPUTE_BITANGENT"),
n && s.push("#define TEXCOORD_SECONDARY"),
this.vOffset = this.uOffset = 0,
s.push("#define UV_OFFSET "),
this.shader = e.shaderCache.fromURLs("matvert.glsl", "matfrag.glsl", s),
s.push("#define STRIPVIEW"),
this.stripShader = e.shaderCache.fromURLs("matvert.glsl", "matfrag.glsl", s),
this.wireShader = e.shaderCache.fromURLs("wirevert.glsl", "wirefrag.glsl"),
this.blend === t.alpha && (this.prepassShader = e.shaderCache.fromURLs("alphaprepassvert.glsl", "alphaprepassfrag.glsl"))
}
v.prototype.addImageElement = function (e, t) {
var i = this.guiScreen.ui.menuCluster.contents
, s = document.createElement("input");
e.linkControl(s),
this.guiScreen.updateElement(e),
s.type = "image",
s.src = I.dataLocale + t,
s.style.position = "absolute",
s.style.border = "none",
s.style.outline = "0px",
s.style.zIndex = "1",
s.title = t,
s.style.opacity = e.opacity;
var n = new XMLHttpRequest;
return n.open("HEAD", s.src, !0),
n.onload = function (e) {
e.appendChild(this)
}
.bind(s, i),
n.send(),
s
}
,
v.prototype.addImage = function (e) {
var t = new s(this.guiScreen);
return this.addImageElement(t, e),
t
}
,
v.prototype.addTextButton = function (e, t, i, s, n, r) {
var a = new p(this.guiScreen);
return a.name = "none",
a.text = e,
a.controlRect.set(t, i, s, n),
a.controlRect.opacity = r,
this.controlRect.registerChildControlRect(a.controlRect),
t = this.guiScreen.ui.menuCluster.contents,
(i = document.createElement("text")).style.color = "white",
i.style.fontFamily = "Arial",
i.style.fontSize = I.largeUI ? "14px" : "12px",
i.style.textShadow = "2px 2px 3px #000000",
t.appendChild(i),
a.controlRect.linkControl(i),
this.guiScreen.updateElement(a.controlRect),
i.type = "text",
i.name = "text",
i.style.position = "absolute",
i.style.border = "none",
i.style.outline = "0px",
i.style.zIndex = "2",
i.innerHTML = e,
i.style.opacity = a.controlRect.opacity,
a.linkControl(i),
a
}
,
t.prototype.setSize = function (e, t) {
this.width = e,
this.height = t,
this.left = -e,
this.bottom = -t,
this.playbackControls && this.playbackControls.resize(this)
}
,
t.prototype.setupActiveView = function (e) {
this.init || (this.init = !0,
(this.ui = e).viewer.scene.sceneAnimator && (this.playbackControls = new R(this),
this.playbackControls.resize(this)))
}
,
t.prototype.updateElement = function (e) {
var t = e.linkedControl;
if (t) {
var i = this.left * (1 - e.getScreenXPercent())
, s = this.bottom * (1 - e.getScreenYPercent())
, n = this.width * e.getScreenWidthPercent();
e = this.height * e.getScreenHeightPercent(),
t.style.left = i + "px",
t.style.bottom = s + "px",
t.style.width = n + "px",
t.style.height = e + "px"
}
}
,
e.prototype.attach = function (e) {
this.element = e;
var m = function (e) {
for (var t = 0; t < this.onAnything.length; ++t)
this.onAnything[t]();
e.preventDefault()
}
.bind(this);
this.mouseStates = [{
pressed: !1,
position: [0, 0],
downPosition: [0, 0]
}, {
pressed: !1,
position: [0, 0],
downPosition: [0, 0]
}, {
pressed: !1,
position: [0, 0],
downPosition: [0, 0]
}],
this.lastTapPos = [0, 0],
e = function (e) {
if (e.target === this.element) {
this.mouseDownCount++;
var t = this.mouseStates[e.button];
if (t) {
t.pressed = !0;
var i = this.element.getBoundingClientRect();
t.position[0] = t.downPosition[0] = e.clientX - i.left,
t.position[1] = t.downPosition[1] = e.clientY - i.top,
m(e)
}
}
}
.bind(this),
this.element.addEventListener("mousedown", e),
e = function (e) {
var t = this.mouseStates[e.button];
if (t) {
var i = this.element.getBoundingClientRect()
, s = e.clientX - i.left;
i = e.clientY - i.top;
if (t.pressed = !1,
t.position[0] = s,
t.position[1] = i,
0 == e.button && e.target == this.element && Math.abs(t.position[0] - t.downPosition[0]) + Math.abs(t.position[1] - t.downPosition[1]) < 10) {
for (var n = 0; n < this.onTap.length; ++n)
this.onTap[n](s, i);
if (this.needSingleClick = !0,
window.setTimeout(function (e, t) {
if (this.needSingleClick) {
for (var i = 0; i < this.onSingleTap.length; ++i)
this.onSingleTap[i](e, t);
this.needSingleClick = !1
}
}
.bind(this, s, i), 301),
t = !1,
void 0 !== this.doubleClickTimer && (n = Math.abs(s - this.lastTapPos[0]) + Math.abs(i - this.lastTapPos[1]) < 8,
Date.now() - this.doubleClickTimer < 300 && n))
for (t = !0,
this.needSingleClick = !1,
n = 0; n < this.onDoubleTap.length; ++n)
this.onDoubleTap[n](s, i);
this.doubleClickTimer = Date.now(),
t && (this.doubleClickTimer = -1e9),
this.lastTapPos[0] = s,
this.lastTapPos[1] = i
}
}
m(e)
}
.bind(this),
this.element.addEventListener("mouseup", e),
e = function (e) {
for (var t = !1, i = this.element.getBoundingClientRect(), s = 0; s < 3; ++s) {
var n = this.mouseStates[s];
if (n.pressed) {
webview.stopRotate();
t = e.clientX - i.left;
var r = e.clientY - i.top
, a = t - n.position[0]
, o = r - n.position[1];
if (n.position[0] = t,
n.position[1] = r,
2 == s && e.altKey)
for (n = 0; n < this.onZoom.length; ++n)
this.onZoom[n](2 * o);
else if (1 <= s || e.ctrlKey)
for (n = 0; n < this.onPan.length; ++n)
this.onPan[n](a, o);
else if (0 == s)
if (e.shiftKey)
for (n = 0; n < this.onPan2.length; ++n)
this.onPan2[n](a, o);
else
for (n = 0; n < this.onDrag.length; ++n)
this.onDrag[n](t, r, a, o);
t = !0
}
}
t && m(e)
}
.bind(this),
this.element.addEventListener("mousemove", e),
e = function (e) {
var t = 0;
e.deltaY ? (t = -.4 * e.deltaY,
1 == e.deltaMode ? t *= 16 : 2 == e.deltaMode && (t *= this.element.clientHeight)) : e.wheelDelta ? t = this.macHax && 120 == Math.abs(e.wheelDelta) ? .08 * e.wheelDelta : .4 * e.wheelDelta : e.detail && (t = -10 * e.detail);
for (var i = 0; i < this.onZoom.length; ++i)
this.onZoom[i](t);
m(e)
}
.bind(this),
this.element.addEventListener("mousewheel", e),
this.element.addEventListener("DOMMouseScroll", e),
this.element.addEventListener("wheel", e),
e = function (e) {
for (var t = 0; t < this.mouseStates.length; ++t)
this.mouseStates[t].pressed = !1;
e.preventDefault()
}
.bind(this),
this.element.addEventListener("mouseleave", e),
this.element.addEventListener("contextmenu", function (e) {
e.preventDefault()
}),
this.touches = {},
this.tapPossible = !1,
this.touchCountFloor = 0,
e = function (e) {
for (var t = this.element.getBoundingClientRect(), i = !1, s = 0; s < e.changedTouches.length; ++s)
if (e.target === this.element) {
var n = e.changedTouches[s];
(i = {
x: n.clientX - t.left,
y: n.clientY - t.top
}).startX = i.x,
i.startY = i.y,
this.touches[n.identifier] = i,
i = !0
}
for (this.tapPossible = 1 == e.touches.length,
n = t = 0; n < this.touches.length; ++n)
t++;
t > this.touchCountFloor && (this.touchCountFloor = t),
i && m(e)
}
.bind(this),
this.element.addEventListener("touchstart", e),
e = function (e) {
for (var t = !1, i = 0; i < e.changedTouches.length; ++i) {
var s = e.changedTouches[i]
, n = this.touches[s.identifier];
if (n) {
if (this.tapPossible) {
var r = this.element.getBoundingClientRect();
t = s.clientX - r.left,
r = s.clientY - r.top;
if (Math.max(Math.abs(t - n.startX), Math.abs(r - n.startY)) < 24) {
for (i = 0; i < this.onTap.length; ++i)
this.onTap[i](t, r);
if (this.needSingleTap = !0,
window.setTimeout(function (e, t) {
if (this.needSingleTap) {
for (var i = 0; i < this.onSingleTap.length; ++i)
this.onSingleTap[i](e, t);
this.needSingleTap = !1
}
}
.bind(this, t, r), 501),
n = !1,
void 0 !== this.doubleTapTimer) {
var a = Math.max(Math.abs(t - this.lastTapPos[0]), Math.abs(r - this.lastTapPos[1])) < 24
, o = Date.now() - this.doubleTapTimer < 500;
if (a && o)
for (n = !0,
i = 0; i < this.onDoubleTap.length; ++i)
this.onDoubleTap[i](t, r)
}
this.doubleTapTimer = Date.now(),
n && (this.doubleTapTimer = -1e9),
this.lastTapPos[0] = t,
this.lastTapPos[1] = r
}
this.tapPossible = !1
}
delete this.touches[s.identifier],
t = !0
}
}
for (s = i = 0; s < this.touches.length; ++s)
i++;
i <= 0 && (this.touchCountFloor = 0),
t && m(e)
}
.bind(this),
this.element.addEventListener("touchend", e),
this.element.addEventListener("touchcancel", e),
this.element.addEventListener("touchleave", e),
e = function (e) {
webview.stopRotate();
for (var t = [], i = 0; i < e.touches.length; ++i)
e.touches[i].target === this.element && t.push(e.touches[i]);
var s = this.element.getBoundingClientRect();
if (1 == t.length && this.touchCountFloor <= 1) {
var n = t[0]
, r = this.touches[n.identifier];
if (r) {
var a = n.clientX - s.left
, o = (n = n.clientY - s.top,
s = a - r.x,
n - r.y);
for (r.x = a,
r.y = n,
i = 0; i < this.onDrag.length; ++i)
this.onDrag[i](a, n, s, o, e.shiftKey)
}
} else if (2 == t.length && this.touchCountFloor <= 2) {
if (o = t[0],
i = this.touches[o.identifier],
n = t[1],
r = this.touches[n.identifier],
i && r) {
a = o.clientX - s.left,
o = o.clientY - s.top;
var h = n.clientX - s.left
, l = n.clientY - s.top
, d = Math.sqrt((a - h) * (a - h) + (o - l) * (o - l))
, c = Math.sqrt((i.x - r.x) * (i.x - r.x) + (i.y - r.y) * (i.y - r.y))
, u = Math.abs(d - c)
, f = (s = (a - i.x + h - r.x) / 2,
n = (o - i.y + l - r.y) / 2,
Math.sqrt(s * s + n * n));
if (i.x = a,
i.y = o,
r.x = h,
r.y = l,
0 < u)
for (r = u / (u + f),
i = 0; i < this.onZoom.length; ++i)
this.onZoom[i](2 * (d - c) * r);
if (0 < f)
for (r = f / (u + f),
i = 0; i < this.onDrag.length; ++i)
this.onPan[i](s * r, n * r)
}
} else if (3 <= t.length) {
for (i = c = d = h = o = 0; i < t.length; ++i)
n = t[i],
r = this.touches[n.identifier],
d += a = n.clientX - s.left,
c += n = n.clientY - s.top,
r && (o += r.x,
h += r.y,
r.x = a,
r.y = n);
for (o /= t.length,
h /= t.length,
d /= t.length,
c /= t.length,
i = 0; i < this.onPan2.length; ++i)
this.onPan2[i](d - o, c - h)
}
0 < t.length && m(e)
}
.bind(this),
this.element.addEventListener("touchmove", e)
}
,
x.prototype.getLightPos = function (e) {
return this.positionBuffer.subarray(4 * e, 4 * e + 4)
}
,
x.prototype.setLightDistance = function (e, t) {
t <= 0 && (t = 1e-5),
this.parameters[3 * e + 2] = 1 / t
}
,
x.prototype.setLightSpotAngle = function (e, t) {
t <= 0 && (t = 1e-6),
this.spot[3 * e] = t;
var i = Math.sin(3.1415926 / 180 * t / 2);
this.spot[3 * e + 2] = 1 / (i * i) * this.spot[3 * e + 1]
}
,
x.prototype.setLightSpotSharpness = function (e, t) {
this.spot[3 * e + 1] = t,
this.setLightSpotAngle(this.spot[3 * e])
}
,
x.prototype.setLightPos = function (e, t) {
this.positions[4 * e + 0] = t[0],
this.positions[4 * e + 1] = t[1],
this.positions[4 * e + 2] = t[2];
var i = this.positions.subarray(4 * e, 4 * e + 4);
1 == this.matrixWeights[e] ? S.mul4(i, this.defaultmatrix, t[0], t[1], t[2], i[3]) : 2 == this.matrixWeights[e] && S.mul4(i, this.defaultviewmatrix, t[0], t[1], t[2], i[3])
}
,
x.prototype.setLightDir = function (e, t) {
this.directions[3 * e + 0] = t[0],
this.directions[3 * e + 1] = t[1],
this.directions[3 * e + 2] = t[2];
var i = this.directions.subarray(3 * e, 3 * e + 3);
1 == this.matrixWeights[e] ? S.mulVec(i, this.defaultmatrix, t[0], t[1], t[2]) : 2 == this.matrixWeights[e] && S.mulVec(i, this.defaultviewmatrix, t[0], t[1], t[2])
}
,
x.prototype.getLightColor = function (e) {
return this.colors.subarray(3 * e, 3 * e + 3)
}
,
x.prototype.setLightColor = function (e, t) {
this.colors[3 * e + 0] = t[0],
this.colors[3 * e + 1] = t[1],
this.colors[3 * e + 2] = t[2]
}
,
x.prototype.getLightDir = function (e) {
return this.directionBuffer.subarray(3 * e, 3 * e + 3)
}
,
x.prototype.getColor = function (e) {
return e *= 3,
[this.colors[e], this.colors[e + 1], this.colors[e + 2]]
}
,
x.prototype.update = function (e, t) {
var i = new S.type(this.matrix);
S.rotation(this.matrix, this.rotation, 1),
S.transpose(this.invMatrix, this.matrix);
for (var s = 0; s < this.count; ++s) {
var n = this.positions.subarray(4 * s, 4 * s + 4)
, r = this.directions.subarray(3 * s, 3 * s + 3)
, a = this.getLightPos(s)
, o = this.getLightDir(s);
1 == this.matrixWeights[s] ? (a[0] = n[0],
a[1] = n[1],
a[2] = n[2],
a[3] = n[3],
o[0] = r[0],
o[1] = r[1],
o[2] = r[2]) : 2 == this.matrixWeights[s] ? (S.mul4(a, e.transform, n[0], n[1], n[2], n[3]),
S.mulVec(o, e.transform, r[0], r[1], r[2]),
S.mul4(a, this.matrix, a[0], a[1], a[2], a[3]),
S.mulVec(o, this.matrix, o[0], o[1], o[2])) : (S.mul4(a, this.matrix, n[0], n[1], n[2], n[3]),
S.mulVec(o, this.matrix, r[0], r[1], r[2])),
V.normalize(o, o)
}
r = new Float32Array(this.finalTransformBuffer),
a = S.empty(),
o = S.empty();
var h = S.empty()
, l = V.empty()
, d = V.empty()
, c = V.empty()
, u = V.empty()
, f = (n = V.empty(),
[])
, m = []
, p = S.create(.5, 0, 0, .5, 0, .5, 0, .5, 0, 0, .5, .5, 0, 0, 0, 1);
for (s = 0; s < this.count; ++s) {
for (l = this.getLightPos(s),
d = this.getLightDir(s),
.99 < Math.abs(d[1]) ? V.set(c, 1, 0, 0) : V.set(c, 0, 1, 0),
V.cross(u, c, d),
V.normalize(u, u),
V.cross(c, d, u),
V.normalize(c, c),
S.set(a, u[0], u[1], u[2], -V.dot(u, l), c[0], c[1], c[2], -V.dot(c, l), d[0], d[1], d[2], -V.dot(d, l), 0, 0, 0, 1),
l = 0; l < 8; ++l)
n[0] = 1 & l ? t.max[0] : t.min[0],
n[1] = 2 & l ? t.max[1] : t.min[1],
n[2] = 4 & l ? t.max[2] : t.min[2],
S.mulPoint(n, this.matrix, 1.005 * n[0], 1.005 * n[1], 1.005 * n[2]),
S.mulPoint(n, a, n[0], n[1], n[2]),
0 == l ? (f[0] = m[0] = n[0],
f[1] = m[1] = n[1],
f[2] = m[2] = n[2]) : (f[0] = Math.min(f[0], n[0]),
f[1] = Math.min(f[1], n[1]),
f[2] = Math.min(f[2], n[2]),
m[0] = Math.max(m[0], n[0]),
m[1] = Math.max(m[1], n[1]),
m[2] = Math.max(m[2], n[2]));
l = -f[2],
d = -m[2];
var g = this.spot[3 * s];
0 < g ? (l = Math.min(l, 1 / this.parameters[3 * s + 2]),
d = Math.max(.04 * l, d),
S.perspective(o, g, 1, d, l),
s < this.shadowCount && (l = 2 * -Math.tan(.00872664625 * g),
this.shadowTexelPadProjections[4 * s + 0] = this.modelViewBuffer[16 * s + 2] * l,
this.shadowTexelPadProjections[4 * s + 1] = this.modelViewBuffer[16 * s + 6] * l,
this.shadowTexelPadProjections[4 * s + 2] = this.modelViewBuffer[16 * s + 10] * l,
this.shadowTexelPadProjections[4 * s + 3] = this.modelViewBuffer[16 * s + 14] * l)) : (S.ortho(o, f[0], m[0], f[1], m[1], d, l),
s < this.shadowCount && (this.shadowTexelPadProjections[4 * s + 0] = this.shadowTexelPadProjections[4 * s + 1] = this.shadowTexelPadProjections[4 * s + 2] = 0,
this.shadowTexelPadProjections[4 * s + 3] = Math.max(m[0] - f[0], m[1] - f[1]))),
S.mul(h, o, a),
S.mul(h, p, h),
S.copyToBuffer(this.modelViewBuffer, 16 * s, a),
S.copyToBuffer(this.projectionBuffer, 16 * s, o),
S.copyToBuffer(this.finalTransformBuffer, 16 * s, h),
S.invert(h, h),
S.copyToBuffer(this.inverseTransformBuffer, 16 * s, h)
}
for (n = !1,
s = 0; s < i.length; ++s)
if (i[s] != this.matrix[s]) {
n = !0;
break
}
for (s = 0; s < this.shadowCount; s++)
if (n && 1 == this.matrixWeights[s])
this.shadowsNeedUpdate[s] = 1;
else
for (i = 16 * s; i < 16 * s + 16; ++i)
if (r[i] != this.finalTransformBuffer[i]) {
this.shadowsNeedUpdate[s] = 1;
break
}
}
,
x.prototype.flagUpdateAnimatedLighting = function () {
for (var e = 0; e < this.shadowCount; e++)
this.shadowsNeedUpdate[e] = 1
}
,
y.prototype.linkControl = function (e) {
this.controlRect.linkControl(e)
}
,
y.prototype.spawnControl = function (e, t, i, s, n, r) {
var a = "backgroundTopLE" + (w = this.guiScreen.imageSetNumber) + "x.png"
, o = "backgroundTopM" + w + "x.png"
, h = "backgroundTopRE" + w + "x.png"
, l = "backgroundMiddleLE" + w + "x.png"
, d = "backgroundMiddleM" + w + "x.png"
, c = "backgroundMiddleRE" + w + "x.png"
, u = "backgroundBottomLE" + w + "x.png"
, f = "backgroundBottomM" + w + "x.png"
, m = "backgroundBottomRE" + w + "x.png"
, p = 3 * w
, g = "backgroundLE" + w + "x.png"
, v = "backgroundM" + w + "x.png"
, x = "backgroundRE" + w + "x.png"
, y = 2 * w
, b = "spacerLE" + w + "x.png"
, S = "spacerM" + w + "x.png"
, T = "spacerRE" + w + "x.png"
, w = 2 * w
, C = this.controlRect.guiScreen.width
, R = this.controlRect.guiScreen.height;
if (n) {
n = this.textEntries.length;
var A = i;
for (i = 0; i < n; i++) {
var k = 8 * (this.textEntries[i] ? this.textEntries[i].length : 0);
A < k && (A = k)
}
i = A + r
}
for (r = 1 / (n = this.textEntries.length + 1),
this.localPixelsX = i,
this.listBoxEntryHeight = s,
this.localPixelsY = (this.textEntries.length + 1) * this.listBoxEntryHeight,
i = 8 / this.localPixelsY,
s = 6 / this.localPixelsX,
A = 4 / this.localPixelsX,
k = r - i / 4,
this.labelTextHeight = I.largeUI ? 20 : 16,
this.labelPixelDrop = (this.listBoxEntryHeight - this.labelTextHeight) / 2,
this.listBoxRegion.controlRect.widthPercent = this.localPixelsX / C,
this.listBoxRegion.controlRect.heightPercent = this.localPixelsY / R,
this.listBoxRegion.controlRect.xPercent = e / C,
this.listBoxRegion.controlRect.yPercent = t / R,
this.openBackground = this.listBoxRegion.addTextButton("", 0, 0, 1, 1 + i, 1),
this.openBackground.setBackground3x3(this.listBoxRegion, 0, 0, a, o, h, l, d, c, u, f, m, p, p),
this.closedBackground = this.listBoxRegion.addTextButton("", 0, 0, 1, r, 1),
this.closedBackground.setBackground3x1(this.listBoxRegion, 0, 0, g, v, x, y),
e = this.labelPixelInset + this.textOffsetsX[0],
t = this.labelPixelDrop + this.textOffsetsY[0],
t /= this.localPixelsY,
e /= this.localPixelsX,
this.defaultButton = this.listBoxRegion.addTextButton("Selected", e, -t, 1, r, .5),
this.selectedIndex = 0,
this.defaultButton.controlRect.linkedControl.innerHTML = this.textEntries[this.selectedIndex],
this.defaultButton.linkedBackground = this.closedBackground,
this.spacerControl = this.listBoxRegion.addTextButton("", s, k, 1 - (s + A), i, 1),
this.spacerControl.defaultAlpha = 1,
this.spacerControl.setBackground3x1(this.listBoxRegion, 0, 0, b, S, T, w),
this.spacerControl.setVisible(!1),
this.spacerControl.linkedBackground = this.openBackground,
i = 1; i < n; i++)
e = this.labelPixelInset + this.textOffsetsX[i - 1],
t = this.labelPixelDrop + this.textOffsetsY[i - 1] - 4,
e /= this.localPixelsX,
t /= this.localPixelsY,
b = this.listBoxRegion.addTextButton(this.textEntries[i - 1], e, r * i - t, 1 - e, r, .5),
this.listBoxButtons.push(b),
b.linkedBackground = this.openBackground;
this.showList(!1),
this.setupCallbacks()
}
,
y.prototype.setControl = function (e, t, i, s, n, r) {
var a = this.controlRect.guiScreen.width
, o = this.controlRect.guiScreen.height;
if (n) {
n = this.textEntries.length;
for (var h = 0; h < n; h++) {
var l = 8 * (this.textEntries[h] ? this.textEntries[h].length : 0);
i < l && (i = l)
}
i += r
}
this.localPixelsX = i,
this.listBoxEntryHeight = s,
this.localPixelsY = (this.textEntries.length + 1) * this.listBoxEntryHeight,
this.listBoxRegion.controlRect.widthPercent = this.localPixelsX / a,
this.listBoxRegion.controlRect.heightPercent = this.localPixelsY / o,
this.listBoxRegion.controlRect.xPercent = e / a,
this.listBoxRegion.controlRect.yPercent = t / o,
this.listBoxRegion.controlRect.updateChildElements(),
this.spacerControl.alignBackground(),
this.openBackground.alignBackground(),
this.closedBackground.alignBackground()
}
,
y.prototype.addItem = function (e, t, i) {
this.textEntries.push(e),
this.textOffsetsX.push(t),
this.textOffsetsY.push(i)
}
,
y.prototype.showList = function (e) {
for (var t = this.listBoxButtons.length, i = 0; i < t; i++)
this.listBoxButtons[i].setVisible(e);
this.closed = !e,
this.spacerControl && this.spacerControl.setVisible(e),
this.openBackground && this.openBackground.setVisible(e),
this.closedBackground && this.closedBackground.setVisible(!e),
e ? (this.defaultButton.linkedBackground = this.openBackground,
this.openBackground.setOpacity(1),
this.closedBackground.setOpacity(.5)) : this.defaultButton.linkedBackground = this.closedBackground
}
,
y.prototype.selectItem = function (e) {
this.selectedItemText = this.textEntries[e],
this.selectedIndex = e,
this.defaultButton.controlRect.linkedControl.innerHTML = this.textEntries[this.selectedIndex],
e = (this.labelTextHeight - this.listBoxEntryHeight + 3) / this.localPixelsY,
this.defaultButton.controlRect.xPercent = (this.labelPixelInset + this.textOffsetsX[this.selectedIndex]) / this.localPixelsX,
this.defaultButton.controlRect.yPercent = e,
this.defaultButton.controlRect.updateElement()
}
,
y.prototype.setupCallbacks = function () {
var e = function (e) {
if (this.closed) {
var t = (t = this.closedBackground.controlRect.linkedControl).getBoundingClientRect()
, i = e.clientX - t.left;
e = e.clientY - t.top,
i /= t.width,
t = e / t.height,
0 <= i && i <= 1 && 0 <= t && t <= 1 ? this.closedBackground.setOpacity(1) : this.closedBackground.setOpacity(.5)
} else
t = (t = this.openBackground.controlRect.linkedControl).getBoundingClientRect(),
i = e.clientX - t.left,
e = e.clientY - t.top,
i /= t.width,
t = e / t.height,
0 <= i && i <= 1 && 0 <= t && t <= 1 ? this.openBackground.setOpacity(1) : this.openBackground.setOpacity(.5)
}
.bind(this);
this.defaultButton.controlRect.linkedControl.onclick = function () {
this.closed ? this.showList(!0) : (this.showList(this.closed),
this.closedBackground.setOpacity(1),
this.defaultButton.setOpacity(1))
}
.bind(this);
for (var t = function (e) {
this.selectItem(e.id),
this.showList(!1),
this.defaultButton.setOpacity(.5),
this.selectionChangedCallback && this.selectionChangedCallback(this)
}
.bind(this), i = function (e) {
e = this.listBoxButtons.length;
for (var t = 0; t < e; t++)
this.listBoxButtons[t].controlRect.mouseOver && (this.selectItem(t),
t = e,
this.selectionChangedCallback && this.selectionChangedCallback(this));
this.showList(!1)
}
.bind(this), s = this.listBoxButtons.length, n = 0; n < s; n++)
this.listBoxButtons[n].controlRect.callBack = t,
this.listBoxButtons[n].controlRect.id = n,
this.listBoxButtons[n].controlRect.linkedControl.addEventListener("mousemove", e);
this.guiScreen.ui.viewer.input.element.addEventListener("mousemove", e),
this.openBackground.controlRect.linkedControl.addEventListener("mousemove", e),
this.closedBackground.controlRect.linkedControl.addEventListener("mousemove", e),
this.guiScreen.ui.viewer.input.element.addEventListener("mousedown", i)
}
,
b.prototype.bind = function (e, t) {
if (!this.complete())
return !1;
var i, s = e.view, n = e.lights, r = e.sky, a = e.shadow, o = e.stripData.active() ? this.stripShader : this.shader, h = this.skinParams, l = this.anisoParams, d = this.microfiberParams, c = this.gl, u = o.params, f = this.textures, m = o.samplers;
o.bind(),
this.blend();
var p = t.mesh.displayMatrix
, g = S.mul(S.empty(), s.viewMatrix, p)
, v = S.mul(S.empty(), s.projectionMatrix, s.viewMatrix);
g = S.mul(S.empty(), s.projectionMatrix, g),
p = S.mul(S.empty(), n.matrix, p);
return c.uniformMatrix4fv(u.uModelViewProjectionMatrix, !1, g),
c.uniformMatrix4fv(u.uSkyMatrix, !1, p),
p = S.mulPoint(V.empty(), n.matrix, s.transform[12], s.transform[13], s.transform[14]),
c.uniform3f(u.uCameraPosition, p[0], p[1], p[2]),
c.uniform3fv(u.uFresnel, this.fresnel),
c.uniform1f(u.uAlphaTest, this.alphaTest),
c.uniform1f(u.uHorizonOcclude, this.horizonOcclude),
c.uniform1f(u.uHorizonSmoothing, this.horizonSmoothing),
c.uniform4fv(u.uDiffuseCoefficients, r.diffuseCoefficients),
0 < n.count && (c.uniform4fv(u.uLightPositions, n.positionBuffer),
c.uniform3fv(u.uLightDirections, n.directionBuffer),
c.uniform3fv(u.uLightColors, n.colors),
c.uniform3fv(u.uLightParams, n.parameters),
c.uniform3fv(u.uLightSpot, n.spot),
p = .392699 * e.postRender.currentSample(),
c.uniform2f(u.uShadowKernelRotation, .5 * Math.cos(p), .5 * Math.sin(p)),
0 < n.shadowCount && (p = a.depthTextures[0].desc.width,
c.uniform2f(u.uShadowMapSize, p, 1 / p),
c.uniformMatrix4fv(u.uShadowMatrices, !1, n.finalTransformBuffer),
c.uniformMatrix4fv(u.uInvShadowMatrices, !1, n.inverseTransformBuffer),
c.uniform4fv(u.uShadowTexelPadProjections, n.shadowTexelPadProjections),
a.bindDepthTexture(m.tDepth0, 0),
a.bindDepthTexture(m.tDepth1, 1),
a.bindDepthTexture(m.tDepth2, 2))),
h && (c.uniform3fv(u.uSubdermisColor, h.subdermisColor),
c.uniform4fv(u.uTransColor, h.transColor),
c.uniform1f(u.uTransScatter, h.transScatter),
c.uniform4fv(u.uFresnelColor, h.fresnelColor),
c.uniform1f(u.uFresnelOcc, h.fresnelOcc),
c.uniform1f(u.uFresnelGlossMask, h.fresnelGlossMask),
c.uniform1f(u.uFresnelIntegral, h.fresnelIntegral),
c.uniform1f(u.uTransIntegral, h.transIntegral),
c.uniform1f(u.uSkinTransDepth, h.transDepth),
c.uniform1f(u.uTransSky, h.transSky),
c.uniform1f(u.uSkinShadowBlur, h.shadowBlur),
c.uniform1f(u.uNormalSmooth, h.normalSmooth),
(i = this.extrasTexCoordRanges.subdermisTex) && c.uniform4fv(u.uTexRangeSubdermis, i),
(i = this.extrasTexCoordRanges.translucencyTex) && c.uniform4fv(u.uTexRangeTranslucency, i),
(i = this.extrasTexCoordRanges.fuzzTex) && c.uniform4fv(u.uTexRangeFuzz, i)),
d && (c.uniform4fv(u.uFresnelColor, d.fresnelColor),
c.uniform1f(u.uFresnelOcc, d.fresnelOcc),
c.uniform1f(u.uFresnelGlossMask, d.fresnelGlossMask),
c.uniform1f(u.uFresnelIntegral, d.fresnelIntegral),
(i = this.extrasTexCoordRanges.fuzzTex) && c.uniform4fv(u.uTexRangeFuzz, i)),
l && (c.uniform3fv(u.uAnisoTangent, l.tangent),
c.uniform1f(u.uAnisoStrength, l.strength),
c.uniform1f(u.uAnisoIntegral, l.integral),
(i = this.extrasTexCoordRanges.anisoTex) && c.uniform4fv(u.uTexRangeAniso, i)),
this.usesRefraction && (e.refractionSurface && e.refractionSurface.bind(m.tRefraction),
n = S.mul(S.empty(), v, n.invMatrix),
c.uniformMatrix4fv(u.uRefractionViewProjection, !1, n),
c.uniform1f(u.uRefractionRayDistance, this.refractionParams.distantBackground ? 1e10 : 4 * t.mesh.bounds.maxExtent),
c.uniform3fv(u.uRefractionTint, this.refractionParams.tint),
c.uniform1f(u.uRefractionAlbedoTint, this.refractionParams.useAlbedoTint ? 1 : 0),
c.uniform1f(u.uRefractionIOREntry, 1 / this.refractionParams.IOR),
(i = this.extrasTexCoordRanges.refractionMaskTex) && c.uniform4fv(u.uTexRangeRefraction, i)),
(i = this.extrasTexCoordRanges.emissiveTex) && (c.uniform4fv(u.uTexRangeEmissive, i),
c.uniform1f(u.uEmissiveScale, this.emissiveIntensity)),
(i = this.extrasTexCoordRanges.aoTex) && c.uniform4fv(u.uTexRangeAO, i),
f.albedo.bind(m.tAlbedo),
f.reflectivity.bind(m.tReflectivity),
f.normal.bind(m.tNormal),
f.extras.bind(m.tExtras),
r.specularTexture.bind(m.tSkySpecular),
o === this.stripShader && (c.uniform1fv(u.uStrips, e.stripData.strips),
c.uniform2f(u.uStripRes, 2 / s.size[0], 2 / s.size[1])),
c.uniform2f(u.uUVOffset, this.uOffset, this.vOffset),
!0
}
,
b.prototype.bindAlphaPrepass = function (e, t) {
if (!this.complete() || !this.prepassShader)
return !1;
var i = this.gl
, s = this.prepassShader.params
, n = this.prepassShader.samplers;
this.prepassShader.bind();
var r = S.mul(S.empty(), e.view.viewMatrix, t.mesh.displayMatrix);
r = S.mul(S.empty(), e.view.projectionMatrix, r);
return i.uniformMatrix4fv(s.uModelViewProjectionMatrix, !1, r),
i.uniform2f(s.uUVOffset, this.uOffset, this.vOffset),
this.textures.albedo.bind(n.tAlbedo),
!0
}
,
b.prototype.bindWire = function (e, t) {
if (!this.complete())
return !1;
var i = this.gl
, s = this.wireShader.params
, n = e.view;
i.enable(i.BLEND),
i.blendFunc(i.SRC_ALPHA, i.ONE_MINUS_SRC_ALPHA),
i.depthMask(!1),
this.wireShader.bind();
var r = S.mul(S.empty(), e.view.viewMatrix, t.mesh.displayMatrix);
r = S.mul(S.empty(), e.view.projectionMatrix, r);
return i.uniformMatrix4fv(s.uModelViewProjectionMatrix, !1, r),
i.uniform4f(s.uStripParams, 2 / n.size[0], 2 / n.size[1], e.stripData.strips[3], e.stripData.strips[4]),
!0
}
,
b.prototype.complete = function () {
return this.wireShader.complete() && this.shader.complete() && this.stripShader.complete() && (!this.prepassShader || this.prepassShader.complete()) && (!this.refractionShader || this.refractionShader.complete()) && this.textures.albedo.complete() && this.textures.reflectivity.complete() && this.textures.normal.complete()
}
;
var S = {
type: Float32Array,
create: function (e, t, i, s, n, r, a, o, h, l, d, c, u, f, m, p) {
var g = new S.type(16);
return g[0] = e,
g[4] = t,
g[8] = i,
g[12] = s,
g[1] = n,
g[5] = r,
g[9] = a,
g[13] = o,
g[2] = h,
g[6] = l,
g[10] = d,
g[14] = c,
g[3] = u,
g[7] = f,
g[11] = m,
g[15] = p,
g
},
empty: function () {
return new S.type(16)
},
identity: function () {
var e = new S.type(16);
return e[0] = 1,
e[4] = 0,
e[8] = 0,
e[12] = 0,
e[1] = 0,
e[5] = 1,
e[9] = 0,
e[13] = 0,
e[2] = 0,
e[6] = 0,
e[10] = 1,
e[14] = 0,
e[3] = 0,
e[7] = 0,
e[11] = 0,
e[15] = 1,
e
},
set: function (e, t, i, s, n, r, a, o, h, l, d, c, u, f, m, p, g) {
e[0] = t,
e[4] = i,
e[8] = s,
e[12] = n,
e[1] = r,
e[5] = a,
e[9] = o,
e[13] = h,
e[2] = l,
e[6] = d,
e[10] = c,
e[14] = u,
e[3] = f,
e[7] = m,
e[11] = p,
e[15] = g
},
translation: function (e, t, i, s) {
return S.set(e, 1, 0, 0, t, 0, 1, 0, i, 0, 0, 1, s, 0, 0, 0, 1),
e
},
rotation: function (e, t, i) {
e[0] = 1,
e[4] = 0,
e[8] = 0,
e[12] = 0,
e[1] = 0,
e[5] = 1,
e[9] = 0,
e[13] = 0,
e[2] = 0,
e[6] = 0,
e[10] = 1,
e[14] = 0,
e[3] = 0,
e[7] = 0,
e[11] = 0,
e[15] = 1;
var s = .0174532925 * t;
switch (t = Math.sin(s),
s = Math.cos(s),
i) {
case 0:
e[5] = s,
e[9] = -t,
e[6] = t,
e[10] = s;
break;
case 1:
e[0] = s,
e[8] = t,
e[2] = -t,
e[10] = s;
break;
case 2:
e[0] = s,
e[4] = -t,
e[1] = t,
e[5] = s
}
return e
},
mul: function (e, t, i) {
var s = t[0]
, n = t[1]
, r = t[2]
, a = t[3]
, o = t[4]
, h = t[5]
, l = t[6]
, d = t[7]
, c = t[8]
, u = t[9]
, f = t[10]
, m = t[11]
, p = t[12]
, g = t[13]
, v = t[14];
t = t[15];
var x = i[0]
, y = i[1]
, b = i[2]
, S = i[3];
return e[0] = x * s + y * o + b * c + S * p,
e[1] = x * n + y * h + b * u + S * g,
e[2] = x * r + y * l + b * f + S * v,
e[3] = x * a + y * d + b * m + S * t,
x = i[4],
y = i[5],
b = i[6],
S = i[7],
e[4] = x * s + y * o + b * c + S * p,
e[5] = x * n + y * h + b * u + S * g,
e[6] = x * r + y * l + b * f + S * v,
e[7] = x * a + y * d + b * m + S * t,
x = i[8],
y = i[9],
b = i[10],
S = i[11],
e[8] = x * s + y * o + b * c + S * p,
e[9] = x * n + y * h + b * u + S * g,
e[10] = x * r + y * l + b * f + S * v,
e[11] = x * a + y * d + b * m + S * t,
x = i[12],
y = i[13],
b = i[14],
S = i[15],
e[12] = x * s + y * o + b * c + S * p,
e[13] = x * n + y * h + b * u + S * g,
e[14] = x * r + y * l + b * f + S * v,
e[15] = x * a + y * d + b * m + S * t,
e
},
invert: function (e, t) {
var i = t[0]
, s = t[1]
, n = t[2]
, r = t[3]
, a = t[4]
, o = t[5]
, h = t[6]
, l = t[7]
, d = t[8]
, c = t[9]
, u = t[10]
, f = t[11]
, m = t[12]
, p = t[13]
, g = t[14]
, v = t[15]
, x = i * o - s * a
, y = i * h - n * a
, b = i * l - r * a
, S = s * h - n * o
, T = s * l - r * o
, w = n * l - r * h
, C = d * p - c * m
, R = d * g - u * m
, A = d * v - f * m
, k = c * g - u * p
, I = c * v - f * p
, P = u * v - f * g
, F = x * P - y * I + b * k + S * A - T * R + w * C;
return F ? (F = 1 / F,
e[0] = (o * P - h * I + l * k) * F,
e[1] = (n * I - s * P - r * k) * F,
e[2] = (p * w - g * T + v * S) * F,
e[3] = (u * T - c * w - f * S) * F,
e[4] = (h * A - a * P - l * R) * F,
e[5] = (i * P - n * A + r * R) * F,
e[6] = (g * b - m * w - v * y) * F,
e[7] = (d * w - u * b + f * y) * F,
e[8] = (a * I - o * A + l * C) * F,
e[9] = (s * A - i * I - r * C) * F,
e[10] = (m * T - p * b + v * x) * F,
e[11] = (c * b - d * T - f * x) * F,
e[12] = (o * R - a * k - h * C) * F,
e[13] = (i * k - s * R + n * C) * F,
e[14] = (p * y - m * S - g * x) * F,
e[15] = (d * S - c * y + u * x) * F,
e) : null
},
transpose: function (e, t) {
return e[0] = t[0],
e[4] = t[1],
e[8] = t[2],
e[12] = t[3],
e[1] = t[4],
e[5] = t[5],
e[9] = t[6],
e[13] = t[7],
e[2] = t[8],
e[6] = t[9],
e[10] = t[10],
e[14] = t[11],
e[3] = t[12],
e[7] = t[13],
e[11] = t[14],
e[15] = t[15],
e
},
mul4: function (e, t, i, s, n, r) {
return e[0] = t[0] * i + t[4] * s + t[8] * n + t[12] * r,
e[1] = t[1] * i + t[5] * s + t[9] * n + t[13] * r,
e[2] = t[2] * i + t[6] * s + t[10] * n + t[14] * r,
e[3] = t[3] * i + t[7] * s + t[11] * n + t[15] * r,
e
},
mulPoint: function (e, t, i, s, n) {
return e[0] = t[0] * i + t[4] * s + t[8] * n + t[12],
e[1] = t[1] * i + t[5] * s + t[9] * n + t[13],
e[2] = t[2] * i + t[6] * s + t[10] * n + t[14],
e
},
mulVec: function (e, t, i, s, n) {
return e[0] = t[0] * i + t[4] * s + t[8] * n,
e[1] = t[1] * i + t[5] * s + t[9] * n,
e[2] = t[2] * i + t[6] * s + t[10] * n,
e
},
perspective: function (e, t, i, s, n, r) {
return r = r || 0,
t = 1 / Math.tan(.00872664625 * t),
e[0] = t / i,
e[1] = e[2] = e[3] = 0,
e[5] = t,
e[4] = e[6] = e[7] = 0,
e[8] = e[9] = 0,
e[10] = (n + s) / (s - n) - 30518044e-12 * r,
e[11] = -1,
e[14] = 2 * n * s / (s - n),
e[12] = e[13] = e[15] = 0,
e
},
perspectiveInfinite: function (e, t, i, s, n) {
return n = n || 0,
t = 1 / Math.tan(.00872664625 * t),
e[0] = t / i,
e[1] = e[2] = e[3] = 0,
e[5] = t,
e[4] = e[6] = e[7] = 0,
e[8] = e[9] = 0,
e[10] = e[11] = -1 - 30518044e-12 * n,
e[14] = -2 * s,
e[12] = e[13] = e[15] = 0,
e
},
ortho: function (e, t, i, s, n, r, a, o) {
var h = 1 / (i - t)
, l = 1 / (n - s)
, d = 1 / (a - r);
return e[0] = h + h,
e[1] = e[2] = e[3] = 0,
e[5] = l + l,
e[4] = e[6] = e[7] = 0,
e[12] = -(i + t) * h,
e[13] = -(n + s) * l,
e[10] = -(d + d) - 30518044e-12 * (o || 0),
e[14] = -(a + r) * d,
e[8] = e[9] = e[11] = 0,
e[15] = 1,
e
},
lookAt: function (e, t, i, s) {
var n = e.subarray(0, 3)
, r = e.subarray(4, 7)
, a = e.subarray(8, 11);
V.sub(a, t, i),
V.cross(n, s, a),
V.normalize(a, a),
V.normalize(n, n),
V.cross(r, a, n),
S.set(e, n[0], n[1], n[2], -V.dot(n, t), r[0], r[1], r[2], -V.dot(r, t), a[0], a[1], a[2], -V.dot(a, t), 0, 0, 0, 1)
},
copy: function (e, t) {
for (var i = 0; i < 16; ++i)
e[i] = t[i]
},
copyToBuffer: function (e, t, i) {
for (var s = 0; s < 16; ++s)
e[t + s] = i[s]
}
};
function T(e, t, i) {
this.gl = e;
var s = (this.desc = t).isDynamicMesh;
this.numSubMeshes = this.dynamicVertexData = 0,
this.displayMatrix = S.identity(),
this.name = t.name,
this.modelMatrix = S.identity(),
this.origin = t.transform ? V.create(t.transform[12], t.transform[13], t.transform[14], 1) : V.create(0, 5, 0, 1),
this.stride = 32,
(this.vertexColor = t.vertexColor) && (this.stride += 4),
(this.secondaryTexCoord = t.secondaryTexCoord) && (this.stride += 8),
i = new u(i.data),
this.indexCount = t.indexCount,
this.indexTypeSize = t.indexTypeSize,
this.indexType = 4 == this.indexTypeSize ? e.UNSIGNED_INT : e.UNSIGNED_SHORT,
this.indexBuffer = e.createBuffer(),
e.bindBuffer(e.ELEMENT_ARRAY_BUFFER, this.indexBuffer);
var n = i.readBytes(this.indexCount * this.indexTypeSize);
e.bufferData(e.ELEMENT_ARRAY_BUFFER, n, e.STATIC_DRAW),
this.wireCount = t.wireCount,
this.wireBuffer = e.createBuffer(),
e.bindBuffer(e.ELEMENT_ARRAY_BUFFER, this.wireBuffer),
n = i.readBytes(this.wireCount * this.indexTypeSize),
e.bufferData(e.ELEMENT_ARRAY_BUFFER, n, e.STATIC_DRAW),
e.bindBuffer(e.ELEMENT_ARRAY_BUFFER, null),
this.vertexCount = t.vertexCount,
this.vertexBuffer = e.createBuffer(),
e.bindBuffer(e.ARRAY_BUFFER, this.vertexBuffer),
i = i.readBytes(this.vertexCount * this.stride),
s ? (this.dynamicVertexData = new Uint8Array(i),
e.bufferData(e.ARRAY_BUFFER, i, e.DYNAMIC_DRAW)) : e.bufferData(e.ARRAY_BUFFER, i, e.STATIC_DRAW),
e.bindBuffer(e.ARRAY_BUFFER, null),
this.bounds = void 0 === t.minBound || void 0 === t.maxBound ? {
min: V.create(-10, -10, -10, 1),
max: V.create(10, 10, -0, 1)
} : {
min: V.create(t.minBound[0], t.minBound[1], t.minBound[2], 1),
max: V.create(t.maxBound[0], t.maxBound[1], t.maxBound[2], 1)
},
this.bounds.maxExtent = Math.max(Math.max(t.maxBound[0] - t.minBound[0], t.maxBound[1] - t.minBound[1]), t.maxBound[2] - t.minBound[2]),
this.bounds.averageExtent = (t.maxBound[0] - t.minBound[0] + (t.maxBound[1] - t.minBound[1]) + (t.maxBound[2] - t.minBound[2])) / 3
}
function w(e, t, i) {
this.mesh = e,
this.gl = this.mesh.gl,
this.indexOffset = t.firstIndex * e.indexTypeSize,
this.indexCount = t.indexCount,
this.wireIndexOffset = t.firstWireIndex * e.indexTypeSize,
this.wireIndexCount = t.wireIndexCount,
this.material = i,
this.visible = !0
}
w.prototype.draw = function (e) {
var t = this.gl;
if (this.material.bind(e, this)) {
e = this.material.shader.attribs;
var i = this.mesh.stride;
this.mesh.desc.cullBackFaces ? (t.enable(t.CULL_FACE),
t.cullFace(t.BACK)) : t.disable(t.CULL_FACE),
t.bindBuffer(t.ELEMENT_ARRAY_BUFFER, this.mesh.indexBuffer),
t.bindBuffer(t.ARRAY_BUFFER, this.mesh.vertexBuffer),
t.enableVertexAttribArray(e.vPosition),
t.enableVertexAttribArray(e.vTexCoord),
t.enableVertexAttribArray(e.vTangent),
t.enableVertexAttribArray(e.vBitangent),
t.enableVertexAttribArray(e.vNormal);
var s = this.mesh.vertexColor && void 0 !== e.vColor;
s && t.enableVertexAttribArray(e.vColor);
var n = this.mesh.secondaryTexCoord && void 0 !== e.vTexCoord2;
n && t.enableVertexAttribArray(e.vTexCoord2);
var r = 0;
t.vertexAttribPointer(e.vPosition, 3, t.FLOAT, !1, i, r),
r += 12,
t.vertexAttribPointer(e.vTexCoord, 2, t.FLOAT, !1, i, r),
r += 8,
this.mesh.secondaryTexCoord && (n && t.vertexAttribPointer(e.vTexCoord2, 2, t.FLOAT, !1, i, r),
r += 8),
t.vertexAttribPointer(e.vTangent, 2, t.UNSIGNED_SHORT, !0, i, r),
r += 4,
t.vertexAttribPointer(e.vBitangent, 2, t.UNSIGNED_SHORT, !0, i, r),
r += 4,
t.vertexAttribPointer(e.vNormal, 2, t.UNSIGNED_SHORT, !0, i, r),
s && t.vertexAttribPointer(e.vColor, 4, t.UNSIGNED_BYTE, !0, i, r + 4),
t.drawElements(t.TRIANGLES, this.indexCount, this.mesh.indexType, this.indexOffset),
t.disableVertexAttribArray(e.vPosition),
t.disableVertexAttribArray(e.vTexCoord),
t.disableVertexAttribArray(e.vTangent),
t.disableVertexAttribArray(e.vBitangent),
t.disableVertexAttribArray(e.vNormal),
s && t.disableVertexAttribArray(e.vColor),
n && t.disableVertexAttribArray(e.vTexCoord2)
}
}
,
w.prototype.drawShadow = function (e) {
var t = this.gl;
this.mesh.desc.cullBackFaces ? (t.enable(t.CULL_FACE),
t.cullFace(t.BACK)) : t.disable(t.CULL_FACE),
t.bindBuffer(t.ELEMENT_ARRAY_BUFFER, this.mesh.indexBuffer),
t.bindBuffer(t.ARRAY_BUFFER, this.mesh.vertexBuffer),
t.enableVertexAttribArray(e),
t.vertexAttribPointer(e, 3, t.FLOAT, !1, this.mesh.stride, 0),
t.drawElements(t.TRIANGLES, this.indexCount, this.mesh.indexType, this.indexOffset),
t.disableVertexAttribArray(e)
}
,
w.prototype.drawAlphaShadow = function (e, t) {
var i = this.gl;
this.mesh.desc.cullBackFaces ? (i.enable(i.CULL_FACE),
i.cullFace(i.BACK)) : i.disable(i.CULL_FACE),
i.bindBuffer(i.ELEMENT_ARRAY_BUFFER, this.mesh.indexBuffer),
i.bindBuffer(i.ARRAY_BUFFER, this.mesh.vertexBuffer),
i.enableVertexAttribArray(e),
i.enableVertexAttribArray(t),
i.vertexAttribPointer(e, 3, i.FLOAT, !1, this.mesh.stride, 0),
i.vertexAttribPointer(t, 2, i.FLOAT, !1, this.mesh.stride, 12),
i.drawElements(i.TRIANGLES, this.indexCount, this.mesh.indexType, this.indexOffset),
i.disableVertexAttribArray(e),
i.disableVertexAttribArray(t)
}
,
w.prototype.drawAlphaPrepass = function (e) {
var t = this.gl;
if (this.material.bindAlphaPrepass(e, this)) {
e = this.material.prepassShader.attribs;
var i = this.mesh.stride;
this.mesh.desc.cullBackFaces ? (t.enable(t.CULL_FACE),
t.cullFace(t.BACK)) : t.disable(t.CULL_FACE),
t.bindBuffer(t.ELEMENT_ARRAY_BUFFER, this.mesh.indexBuffer),
t.bindBuffer(t.ARRAY_BUFFER, this.mesh.vertexBuffer),
t.enableVertexAttribArray(e.vPosition),
t.enableVertexAttribArray(e.vTexCoord),
t.vertexAttribPointer(e.vPosition, 3, t.FLOAT, !1, i, 0),
t.vertexAttribPointer(e.vTexCoord, 2, t.FLOAT, !1, i, 12),
t.drawElements(t.TRIANGLES, this.indexCount, this.mesh.indexType, this.indexOffset),
t.disableVertexAttribArray(e.vPosition),
t.disableVertexAttribArray(e.vTexCoord)
}
}
,
w.prototype.drawWire = function (e) {
var t = this.material.wireShader.attribs
, i = this.gl;
this.material.bindWire(e, this) && (i.enableVertexAttribArray(t.vPosition),
i.bindBuffer(i.ELEMENT_ARRAY_BUFFER, this.mesh.wireBuffer),
i.bindBuffer(i.ARRAY_BUFFER, this.mesh.vertexBuffer),
i.vertexAttribPointer(t.vPosition, 3, i.FLOAT, !1, this.mesh.stride, 0),
i.drawElements(i.LINES, this.wireIndexCount, this.mesh.indexType, this.wireIndexOffset),
i.disableVertexAttribArray(t.vPosition))
}
,
w.prototype.complete = function () {
return this.material.complete()
}
;
var C = {
fetchImage: function (e, t, i) {
var s = new Image;
s.crossOrigin = "Anonymous",
s.onload = function () {
0 < s.width && 0 < s.height ? t(s) : i && i()
}
,
i && (req.onerror = function () {
i()
}
),
s.src = e
},
fetchText: function (e, t, i, s) {
var n = new XMLHttpRequest;
n.open("GET", e, !0),
n.onload = function () {
200 == n.status ? t(n.responseText) : i && i()
}
,
i && (n.onerror = function () {
i()
}
),
s && (n.onprogress = function (e) {
s(e.loaded, e.total)
}
),
n.send()
},
fetchBinary: function (e, t, i, s) {
var n = new XMLHttpRequest;
n.open("GET", e, !0),
n.responseType = "arraybuffer",
n.onload = function () {
200 == n.status ? t(n.response) : i && i()
}
,
i && (n.onerror = function () {
i()
}
),
s && (n.onprogress = function (e) {
s(e.loaded, e.total)
}
),
n.send()
},
fetchBinaryIncremental: function (r, a, t, o) {
var i = new XMLHttpRequest;
i.open("HEAD", r, !0),
i.onload = function () {
if (200 == i.status) {
var e = i.getResponseHeader("Accept-Ranges");
if (e && "none" != e) {
var s = 0 | i.getResponseHeader("Content-Length")
, n = function (e, t) {
var i = new XMLHttpRequest;
i.open("GET", r, !0),
i.setRequestHeader("Range", "bytes=" + e + "-" + t),
i.responseType = "arraybuffer",
i.onload = function () {
(206 == i.status || 200 == i.status) && a(i.response) && t < s && n(e += o, t = (t += o) < s - 1 ? t : s - 1)
}
,
i.send()
};
n(0, o - 1)
} else
t && t()
} else
t && t()
}
,
t && (i.onerror = function () {
t()
}
),
i.send()
}
};
function R(e) {
this.debugString = "",
this.init = !1,
this.speedList = this.cameraList = this.animationList = this.playButton = this.timelineSlider = this.playbackRegion = this.previousFrameButton = this.nextFrameButton = this.pauseButton = this.playButton = 0,
this.visible = !1,
this.backgroundRegion = this.screenButton = 0,
this.guiScreen = e,
this.playbackRegion = new v(e),
this.idealSliderWidth = 650,
this.totalListBoxPixelsX = 0,
this.minWidth = 500,
this.compactMode = !1,
this.ui = e.ui;
var t = "animationpause" + e.imageSetNumber + "x.png"
, i = "animationplay" + e.imageSetNumber + "x.png"
, s = "timelineLE" + e.imageSetNumber + "x.png"
, n = "timelineM" + e.imageSetNumber + "x.png"
, r = "timelineRE" + e.imageSetNumber + "x.png"
, a = e.ui.viewer.scene.sceneAnimator.animations.length;
if (0 != a) {
var o = this.idealSliderWidth;
this.bottomOffset = 85,
this.centerOffset = 60;
var h, l = (h = e.width / 2 + this.centerOffset) - o / 2, d = l - 14 - 32, c = (h = h + o / 2) - d, u = 32 / e.height, f = this.bottomOffset / e.height, m = this.playbackRegion;
if (m.controlRect.widthPercent = c / e.width,
m.controlRect.heightPercent = u,
m.controlRect.xPercent = d / e.width,
m.controlRect.yPercent = f,
u = 32 / c,
this.pauseButton = new p(this.guiScreen),
this.pauseButton.controlRect.set(0, .125, u, .75),
this.pauseButton.controlRect.opacity = .5,
m.controlRect.registerChildControlRect(this.pauseButton.controlRect),
this.pauseButton.linkControl(m.addImageElement(this.pauseButton.controlRect, t)),
this.playButton = new p(this.guiScreen),
this.playButton.controlRect.set(0, .125, u, .75),
this.playButton.controlRect.opacity = .5,
m.controlRect.registerChildControlRect(this.playButton.controlRect),
this.playButton.linkControl(m.addImageElement(this.playButton.controlRect, i)),
t = o / c,
c = (l - d) / c,
this.timelineSlider = new z(this.guiScreen, m),
this.timelineSlider.controlRect.set(c, .03125, t, 1),
m.controlRect.registerChildControlRect(this.timelineSlider.controlRect),
this.timelineSlider.setBackground3x1(m, s, n, r),
this.pauseButton.controlRect.showControl(!e.ui.viewer.scene.sceneAnimator.paused),
this.playButton.controlRect.showControl(e.ui.viewer.scene.sceneAnimator.paused),
s = h + 14,
n = this.bottomOffset + 4,
r = e.ui.viewer.scene.sceneAnimator.animations[0].cameraObjects.length,
e.ui.viewer.scene.sceneAnimator.selectDefaultCamera(),
e.ui.viewer.scene.sceneAnimator.setViewFromSelectedCamera(),
this.maxListPixelsX = 0,
1 < r) {
for (this.cameraList = new y(e),
c = 0; c < r; c++)
this.cameraList.addItem(e.ui.viewer.scene.sceneAnimator.animations[0].cameraObjects[c].name, 0, 0);
this.cameraList.spawnControl(s, n, 10, 24, !0, 8),
this.cameraList.selectItem(e.ui.viewer.scene.sceneAnimator.selectedCameraIndex),
this.maxListPixelsX = this.cameraList.localPixelsX,
this.totalListBoxPixelsX += this.cameraList.localPixelsX + 14
}
if (1 < a) {
for (this.animationList = new y(e),
c = 0; c < a; c++)
this.animationList.addItem(e.ui.viewer.scene.sceneAnimator.animations[c].name, 0, 0);
this.animationList.spawnControl(s, n, 10, 24, !0, 8),
this.maxListPixelsX < this.animationList.localPixelsX && (this.maxListPixelsX = this.animationList.localPixelsX),
this.totalListBoxPixelsX += this.animationList.localPixelsX + 14,
this.animationList.selectItem(e.ui.viewer.scene.sceneAnimator.selectedAnimationIndex)
}
c = h - (s = d - 44 - 14) + this.totalListBoxPixelsX,
this.speedList = new y(e),
this.speedList.addItem("4.0x", 4, 0),
this.speedList.addItem("2.0x", 4, 0),
this.speedList.addItem("1.0x", 4, 0),
this.speedList.addItem("0.5x", 4, 0),
this.speedList.addItem("0.25x", -2, 0),
this.speedList.spawnControl(s, n, 44, 24, !1, 0),
this.speedList.selectItem(2),
c > e.width && (this.idealSliderWidth = e.width - (118 + (this.totalListBoxPixelsX + 14)) - this.centerOffset,
e = 0,
this.cameraList && e++,
this.animationList && e++,
1 == e && (this.idealSliderWidth += 56,
this.centerOffset -= 14),
2 == e && (this.idealSliderWidth += 63,
this.centerOffset -= 63)),
this.setupCallbacks()
}
}
function A(e, t, i) {
if (this.gl = e,
this.desc = t,
t = [],
0 != this.desc.sharpen && t.push("#define SHARPEN"),
(this.useBloom = 0 < this.desc.bloomColor[0] * this.desc.bloomColor[3] || 0 < this.desc.bloomColor[1] * this.desc.bloomColor[3] || 0 < this.desc.bloomColor[2] * this.desc.bloomColor[3]) && t.push("#define BLOOM"),
0 != this.desc.vignette[3] && t.push("#define VIGNETTE"),
1 == this.desc.saturation[0] * this.desc.saturation[3] && 1 == this.desc.saturation[1] * this.desc.saturation[3] && 1 == this.desc.saturation[2] * this.desc.saturation[3] || t.push("#define SATURATION"),
1 == this.desc.contrast[0] * this.desc.contrast[3] && 1 == this.desc.contrast[1] * this.desc.contrast[3] && 1 == this.desc.contrast[2] * this.desc.contrast[3] && 1 == this.desc.brightness[0] * this.desc.brightness[3] && 1 == this.desc.brightness[1] * this.desc.brightness[3] && 1 == this.desc.brightness[2] * this.desc.brightness[3] || t.push("#define CONTRAST"),
0 != this.desc.grain && t.push("#define GRAIN"),
1 == this.desc.toneMap ? t.push("#define REINHARD") : 2 == this.desc.toneMap && t.push("#define HEJL"),
this.desc.colorLUT && t.push("#define COLOR_LUT"),
this.sampleIndex = 0,
this.sampleCount = 1,
i && (this.sampleCount = 4,
this.sampleOffsets = [[-.5, -.5], [.5, -.5], [-.5, .5], [.5, .5]]),
this.aaShader = e.shaderCache.fromURLs("postvert.glsl", "postaa.glsl"),
this.shader = e.shaderCache.fromURLs("postvert.glsl", "postfrag.glsl", t),
this.plainShader = e.shaderCache.fromURLs("postvert.glsl", "postfrag.glsl", []),
this.fullscreenTriangle = e.createBuffer(),
e.bindBuffer(e.ARRAY_BUFFER, this.fullscreenTriangle),
i = new Float32Array([0, 0, 2, 0, 0, 2]),
e.bufferData(e.ARRAY_BUFFER, i, e.STATIC_DRAW),
e.bindBuffer(e.ARRAY_BUFFER, null),
this.useBloom) {
for (this.bloomTextures = [],
this.bloomTargets = [],
i = 0; i < 2; ++i)
t = {
width: 256,
height: 256,
clamp: !0
},
this.bloomTextures[i] = new U(e, t),
this.bloomTextures[i].loadArray(null, e.RGBA, e.ext.textureHalf && e.ext.textureHalfLinear ? e.ext.textureHalf.HALF_FLOAT_OES : e.UNSIGNED_BYTE),
this.bloomTargets[i] = new m(e, {
width: t.width,
height: t.height,
color0: this.bloomTextures[i]
});
for (this.bloomSamples = 64; this.bloomSamples + 16 >= e.limits.fragmentUniforms;)
this.bloomSamples /= 2;
this.bloomShader = e.shaderCache.fromURLs("postvert.glsl", "bloom.glsl", ["#define BLOOM_SAMPLES " + this.bloomSamples]),
this.shrinkShader = e.shaderCache.fromURLs("postvert.glsl", "bloomshrink.glsl")
}
for (e = new Uint8Array(16384),
i = 0; i < 16384; i++) {
t = 255 * Math.random();
var s = 255 * Math.random();
e[i] = .5 * (t + s)
}
this.noiseTexture = new U(this.gl, {
width: 128,
height: 128
}),
this.noiseTexture.loadArray(e, this.gl.LUMINANCE),
this.desc.colorLUT && (e = this.desc.colorLUT,
this.colorLUT = new U(this.gl, {
width: e.length / 3 | 0,
height: 1,
clamp: !0
}),
this.colorLUT.loadArray(new Uint8Array(e), this.gl.RGB)),
this.blackTexture = new U(this.gl, {
width: 1,
height: 1
}),
this.blackTexture.loadArray(new Uint8Array([0, 0, 0, 0])),
this.bloomResult = this.blackTexture
}
function k(e) {
this.gl = e,
this.name = "untitled",
this.meshes = [],
this.meshRenderables = [],
this.materials = {},
this.sky = this.view = null,
this.selectedPartIndex = 0,
this.soloPart = !1,
this.miscnotes = "",
this.nextView = null,
this.viewFade = 0,
this.refractionSurface = this.shadow = this.stripData = this.lights = null,
this.sceneAnimator = this.frameCounter = 0,
this.sceneLoaded = !1,
this.debugString = ""
}
function P(e, t, i) {
if (this.scene = e,
this.animations = [],
this.skinningRigs = [],
this.meshIDs = [],
this.lightIDs = [],
this.materialIDs = [],
this.views = [],
this.viewYawOffsets = [],
this.viewPitchOffsets = [],
this.cameraObjectIndices = [],
this.cameraChildrenIndices = [],
this.subMeshObjectIndices = [],
this.subMeshLiveIndices = [],
this.scene = e,
this.selectedCameraIndex = -1,
this.selectedAnimationIndex = 0,
this.debugString = "",
this.scenePlaybackSpeed = this.playbackSpeed = 1,
this.animationProgress = this.totalSeconds = 0,
this.paused = this.autoAdvanceNextAnimation = !1,
this.animateVisibility = this.drawAnimated = this.linkSceneObjects = this.loadSkinningRigs = this.animateMaterials = this.animateTurntables = this.enableSkinning = this.animateMeshes = this.animateLights = this.playAnimations = this.loadAnimations = !0,
this.showDebugInfo = !1,
this.loopCount = 0,
this.loopTurntables = this.lockPlayback = !1,
this.fogObjectIndex = -1,
this.unitScaleSkinnedMeshes = !0,
this.sceneScale = i.sceneScale,
this.defaultCameraGlobalIndex = i.selectedCamera,
this.selectedAnimationIndex = i.selectedAnimation,
this.autoPlayAnims = i.autoPlayAnims,
this.showPlayControls = i.showPlayControls,
i.scenePlaybackSpeed && (this.scenePlaybackSpeed = i.scenePlaybackSpeed,
0 == this.scenePlaybackSpeed && (this.scenePlaybackSpeed = 1)),
this.autoPlayAnims || (this.paused = !0),
this.loadAnimations) {
if (i.meshIDs)
for (var s = i.meshIDs.length, n = 0; n < s; ++n) {
var r = i.meshIDs[n].partIndex;
this.meshIDs.push(r)
}
if (i.lightIDs)
for (s = i.lightIDs.length,
n = 0; n < s; ++n)
r = (r = i.lightIDs[n]).partIndex,
this.lightIDs.push(r);
if (i.materialIDs)
for (s = i.materialIDs.length,
n = 0; n < s; ++n)
r = (r = i.materialIDs[n]).partIndex,
this.materialIDs.push(r);
if (this.numMatricesInTable = i.numMatrices,
r = new u((n = t.get("MatTable.bin")).data),
n || (this.numMatricesInTable = 0,
this.debugString += "
No mattable?"),
i.skinningRigs && this.loadSkinningRigs)
for (s = i.skinningRigs.length,
n = 0; n < s; ++n) {
"" == (a = new M(t, i.skinningRigs[n], r)).debugString ? this.skinningRigs.push(a) : (this.debugString += "
Error loading skinning rig " + n + " :" + a.debugString,
this.debugString += "
Skipping the rest",
n = s)
}
if (i.animations)
for (r = i.animations.length,
n = 0; n < r; ++n)
s = new c(t, i.animations[n]),
this.animations.push(s);
if (this.startMS = Date.now(),
r = this.animations.length,
this.linkSceneObjects && 0 != r) {
for (n = 0; n < r; n++)
for (s = (t = this.animations[n]).animatedObjects.length,
i = 0; i < s; i++)
"LightSO" == (a = t.animatedObjects[i]).sceneObjectType && (a.lightIndex = this.findLightIndexByPartIndex(i),
-1 != a.lightIndex ? t.lightObjects.push(a) : this.debugString += "
got light not in scene " + a.name),
"FogSO" == a.sceneObjectType && (this.fogObjectIndex = i),
"SubMeshSO" == a.sceneObjectType && 0 == n && (this.subMeshObjectIndices.push(i),
this.subMeshLiveIndices.push(-1)),
"Material" == a.sceneObjectType && (a.materialIndex = this.findMaterialIndexByPartIndex(i),
-1 == a.materialIndex ? this.debugString += "
can't find material index for object " + i : t.materialObjects.push(a)),
"TurnTableSO" == a.sceneObjectType && t.turnTableObjects.push(a),
"MeshSO" == a.sceneObjectType && (a.meshIndex = this.findMeshIndexByPartIndex(this.scene.meshes, i),
-1 == a.meshIndex ? (this.debugString += "
can't find mesh index for object " + i,
this.logObjectInfo(i, 0)) : (t.meshObjects.push(a),
a.mesh = this.scene.meshes[a.meshIndex],
-1 != a.skinningRigIndex && a.mesh && a.skinningRigIndex < this.skinningRigs.length && (a.skinningRig = this.skinningRigs[a.skinningRigIndex],
a.skinningRig.isRigidSkin || (a.mesh.dynamicVertexData ? a.skinningRig.useOriginalMeshVertices(a.mesh) : (this.debugString += "Skinning object - but mesh is not dynamic",
this.debugString += "
Rig index " + a.skinningRigIndex,
this.debugString += " not tagged as rigid"))))),
"CameraSO" == a.sceneObjectType && (a.modelPartIndex = a.id,
t.cameraObjects.push(a));
for (i = (t = this.animations[0]).cameraObjects.length,
n = 0; n < i; n++)
r = t.cameraObjects[n],
(s = this.scene.cameras[r.name]) ? (s = s.view) && (s = new H(s),
this.cameraObjectIndices.push(r.id),
this.views.push(s),
this.viewYawOffsets.push(0),
this.viewPitchOffsets.push(0)) : (this.debugString += "
no camDesc for " + r.name,
this.views.push(e.view));
for (e = this.scene.meshes.length,
r = this.subMeshObjectIndices.length,
n = s = 0; n < e; n++) {
var a = this.scene.meshes[n]
, o = !1;
for (i = 0; i < r; i++) {
var h = this.subMeshObjectIndices[i]
, l = t.animatedObjects[h]
, d = t.animatedObjects[l.parentIndex];
if (d.mesh || (this.debugString += "
submesh parent object has no mesh?",
this.debugString += "
obj.name " + l.name,
this.debugString += "
parent.name " + d.name,
this.debugString += "
submesh index " + i,
this.debugString += "
obj.index " + h),
d.mesh == a) {
for (o = 0; o < a.numSubMeshes; o++)
this.subMeshLiveIndices[i + (a.numSubMeshes - 1 - o)] = s,
s++;
i = r,
o = !0
}
}
o || (this.debugString += "
Missing submesh? - no matches for mesh " + n + " of " + e)
}
for (n = 0; n < r; n++)
-1 == this.subMeshLiveIndices[n] && (this.debugString += "
Missing mesh? Unused submesh " + n + " of " + r);
this.showDebugInfo = this.stopEverything = this.runDebugMode = !1,
this.selectDefaultCamera(),
this.findCameraChildren(),
this.findFixedTransforms(),
this.runDebugMode && (this.setAnimationProgress(0, !0),
"" != this.debugString ? this.stopEverything = !0 : this.checkDebug())
}
} else
this.debugString += "
Skip loading animation data"
}
function F(e) {
this.gl = e,
this.program = null,
this.params = {},
this.samplers = {},
this.attribs = {}
}
function O(e) {
this.gl = e,
this.cache = []
}
function E(e, t) {
if (this.gl = e,
this.shadowCount = t,
this.nativeDepth = !!e.ext.textureDepth,
this.desc = i,
i = this.nativeDepth ? ["#define SHADOW_NATIVE_DEPTH"] : [],
this.shaderSolid = e.shaderCache.fromURLs("shadowvert.glsl", "shadowfrag.glsl", i),
i.push("#define ALPHA_TEST 1"),
this.shaderAlphaTest = e.shaderCache.fromURLs("shadowvert.glsl", "shadowfrag.glsl", i),
this.depthTextures = [],
this.depthTargets = [],
0 < this.shadowCount) {
var i = {
width: 2048,
height: 2048,
clamp: !0,
mipmap: !1,
nofilter: !0
};
e.hints.mobile && (i.width = i.height = 1536);
var s, n, r = {
width: i.width,
height: i.height
};
n = this.nativeDepth ? (s = e.DEPTH_COMPONENT,
e.UNSIGNED_SHORT) : (r.depthBuffer = m.createDepthBuffer(e, i.width, i.height),
s = e.RGB,
e.UNSIGNED_BYTE);
for (var a = 0; a < this.shadowCount; ++a)
this.depthTextures[a] = new U(e, i),
this.depthTextures[a].loadArray(null, s, n),
this.nativeDepth ? r.depth = this.depthTextures[a] : r.color0 = this.depthTextures[a],
this.depthTargets[a] = new m(e, r)
}
}
function B(e, t, i, s) {
this.gl = e,
this.desc = t,
this.lightCount = s.count,
this.shadowCount = i.shadowCount,
(t = this.nativeDepth ? ["#define SHADOW_NATIVE_DEPTH"] : []).push("#define LIGHT_COUNT " + this.lightCount),
t.push("#define SHADOW_COUNT " + this.shadowCount),
e.hints.mobile && t.push("#define MOBILE"),
this.shader = e.shaderCache.fromURLs("shadowfloorvert.glsl", "shadowfloorfrag.glsl", t),
t = new Float32Array([-1, 0, -1, -1, 0, 1, 1, 0, 1, -1, 0, -1, 1, 0, 1, 1, 0, -1]),
this.quadGeom = e.createBuffer(),
e.bindBuffer(e.ARRAY_BUFFER, this.quadGeom),
e.bufferData(e.ARRAY_BUFFER, t, e.STATIC_DRAW),
e.bindBuffer(e.ARRAY_BUFFER, null)
}
function L() {
this.associateObjectIndex = this.linkObjectIndex = this.linkMode = 0,
this.vertexIndices = [],
this.vertexWeights = [],
this.matrix = S.identity(),
this.defaultAssociateWorldTransform = this.defaultClusterWorldTransform = this.defaultClusterBaseTransform = 0,
this.defaultClusterWorldTransformInvert = S.identity(),
this.defaultAssociateWorldTransformInvert = S.identity(),
this.debugString = ""
}
function M(e, t, i) {
if (this.debugString = "",
this.skinningClusters = [],
this.srcVFile = t.file,
e = e.get(this.srcVFile))
if (e.data) {
this.rigByteStream = new u(e.data),
e = new Uint32Array(this.rigByteStream.bytes.buffer, 0, this.rigByteStream.bytes.length / 4),
this.expectedNumClusters = e[0],
this.expectedNumVertices = e[1],
this.numClusterLinks = e[2],
this.originalObjectIndex = e[3],
this.isRigidSkin = e[4],
this.tangentMethod = e[5],
t = 6 + 7 * this.expectedNumClusters;
for (var s = 0; s < this.expectedNumClusters; s++) {
var n = new L;
this.skinningClusters.push(n);
var r = 6 + 7 * s;
n.linkMode = e[1 + r],
n.linkObjectIndex = e[2 + r],
n.associateObjectIndex = e[3 + r];
var a = e[5 + r];
n.defaultClusterWorldTransform = i.getMatrix(e[4 + r]),
n.defaultClusterBaseTransform = i.getMatrix(a),
S.invert(n.defaultClusterWorldTransformInvert, n.defaultClusterWorldTransform),
1 == n.linkMode && (n.defaultAssociateWorldTransform = i.getMatrix(e[6 + r]),
S.invert(n.defaultAssociateWorldTransformInvert, n.defaultAssociateWorldTransform))
}
e = (t = (i = 4 * t) + this.expectedNumVertices) + 2 * this.numClusterLinks,
t = new Uint8Array(this.rigByteStream.bytes.subarray(t)),
e = new Uint8Array(this.rigByteStream.bytes.subarray(e)),
this.linkMapCount = new Uint8Array(this.rigByteStream.bytes.buffer, i, this.expectedNumVertices),
this.linkMapClusterIndices = new Uint16Array(t.buffer),
this.linkMapWeights = new Float32Array(e.buffer)
} else
this.debugString += "
No data in " + this.srcVFile;
else
this.debugString += "
Error loading buffer for skinning rig " + this.srcVFile
}
function _(e, t, i) {
if (this.gl = e,
void 0 !== (s = t.extract("sky.dat") || t.extract("sky.png"))) {
this.specularTexture = new U(e, {
width: 256,
height: 2048,
clamp: !0
}),
t = s.data;
for (var s, n = (s = s.data.length) / 4, r = new Uint8Array(s), a = 0, o = 0; a < s; ++o)
r[a++] = t[o + 2 * n],
r[a++] = t[o + n],
r[a++] = t[o],
r[a++] = t[o + 3 * n];
this.specularTexture.loadArray(r)
}
if (this.diffuseCoefficients = new Float32Array(i.diffuseCoefficients),
this.backgroundMode = i.backgroundMode || 0,
this.backgroundBrightness = i.backgroundBrightness || 1,
this.backgroundColor = new Float32Array(i.backgroundColor),
1 <= this.backgroundMode)
if (this.backgroundShader = e.shaderCache.fromURLs("skyvert.glsl", 3 == this.backgroundMode ? "skySH.glsl" : "sky.glsl", ["#define SKYMODE " + this.backgroundMode]),
this.vertexBuffer = e.createBuffer(),
e.bindBuffer(e.ARRAY_BUFFER, this.vertexBuffer),
i = 1 / 256,
s = 2.8 * (t = .5 / 256),
n = .5 * t,
i = new Float32Array([0, 1, 0, .49609375 + i, .49609375 + i, 1, 0, 0, .9921875 + i, .49609375 + i, 0, 0, 1, .49609375 + i, .9921875 + i, -1, 0, 0, 0 + i, .49609375 + i, 0, 0, -1, .49609375 + i, 0 + i, 0, -1, 0, .9921875 + i, 0 + i, 0, -1, 0, .9921875 + i, .9921875 + i, 0, -1, 0, 0 + i, .9921875 + i, 0, -1, 0, 0 + i, 0 + i, s, 1 - s, -s, .5 + t, .5 - t, s, 1 - s, s, .5 + t, .5 + t, -s, 1 - s, s, .5 - t, .5 + t, -s, 1 - s, -s, .5 - t, .5 - t, -s, 0, -1 + s, .5 - t, 0 + i + t, s, 0, -1 + s, .5 + t, 0 + i + t, 1 - s, 0, -s, .9921875 + i - t, .5 - t, 1 - s, 0, s, .9921875 + i - t, .5 + t, s, 0, 1 - s, .5 + t, .9921875 + i - t, -s, 0, 1 - s, .5 - t, .9921875 + i - t, -1 + s, 0, s, 0 + i + t, .5 + t, -1 + s, 0, -s, 0 + i + t, .5 - t, 1, 0, 0, .9921875 + i - n, .49609375 + i, 0, 0, 1, .49609375 + i, .9921875 + i - n, -1, 0, 0, 0 + i + n, .49609375 + i, 0, 0, -1, .49609375 + i, 0 + i + n, 0, 1, 0, .49609375 + i - n, .49609375 + i, 0, 1, 0, .49609375 + i, .49609375 + i - n, 0, 1, 0, .49609375 + i + n, .49609375 + i, 0, 1, 0, .49609375 + i, .49609375 + i + n]),
e.bufferData(e.ARRAY_BUFFER, i, e.STATIC_DRAW),
e.bindBuffer(e.ARRAY_BUFFER, null),
this.indexBuffer = e.createBuffer(),
e.bindBuffer(e.ELEMENT_ARRAY_BUFFER, this.indexBuffer),
i = new Uint16Array([2, 1, 6, 3, 2, 7, 8, 4, 3, 4, 5, 1, 9, 14, 15, 17, 10, 16, 18, 19, 11, 20, 13, 12, 28, 12, 13, 13, 24, 28, 28, 24, 9, 9, 24, 14, 25, 9, 15, 25, 15, 21, 10, 25, 21, 10, 21, 16, 22, 26, 10, 22, 10, 17, 18, 11, 26, 22, 18, 26, 19, 23, 27, 19, 27, 11, 23, 20, 27, 27, 20, 12]),
this.skyIndexCount = i.length,
e.bufferData(e.ELEMENT_ARRAY_BUFFER, i, e.STATIC_DRAW),
e.bindBuffer(e.ELEMENT_ARRAY_BUFFER, null),
3 == this.backgroundMode)
for (this.backgroundCoefficients = new Float32Array(this.diffuseCoefficients),
a = 0; a < this.backgroundCoefficients.length; ++a)
this.backgroundCoefficients[a] *= this.backgroundBrightness;
else {
var h;
this.backgroundTexture = new U(e, {
width: 256,
height: 256,
clamp: !0
}),
i = !1,
e.ext.textureHalf && e.ext.textureHalfLinear && (this.backgroundTexture.loadArray(null, e.RGB, e.ext.textureHalf.HALF_FLOAT_OES),
i = (h = new m(e, {
color0: this.backgroundTexture
})).valid),
!i && e.ext.textureFloat && e.ext.textureFloatLinear && !e.hints.mobile && (this.backgroundTexture.loadArray(null, e.RGB, e.FLOAT),
i = (h = new m(e, {
color0: this.backgroundTexture
})).valid),
i || (this.backgroundTexture.loadArray(),
h = new m(e, {
color0: this.backgroundTexture
})),
h.bind(),
(h = new F(e)).build("precision highp float; varying vec2 tc; attribute vec4 p; void main(){ gl_Position=p; tc=vec2(0.5,0.5/8.0)*p.xy+vec2(0.5,6.5/8.0); }", "precision highp float; varying vec2 tc; uniform sampler2D tex; uniform float b; void main(){vec4 s=texture2D(tex,tc); gl_FragColor.xyz=s.xyz*(b*s.w);}"),
h.bind(),
e.uniform1f(h.params.b, 7 * Math.sqrt(this.backgroundBrightness)),
this.specularTexture.bind(h.samplers.tex),
i = e.createBuffer(),
e.bindBuffer(e.ARRAY_BUFFER, i),
i = new Float32Array([-1, -1, .5, 1, 3, -1, .5, 1, -1, 3, .5, 1]),
e.bufferData(e.ARRAY_BUFFER, i, e.STATIC_DRAW),
e.enableVertexAttribArray(h.attribs.p),
e.vertexAttribPointer(h.attribs.p, 4, e.FLOAT, !1, 0, 0),
e.drawArrays(e.TRIANGLES, 0, 3),
e.disableVertexAttribArray(h.attribs.p)
}
}
function D() {
this.STRIP_NONE = -2,
this.STRIP_MENU = -1,
this.stripCount = 5,
this.strips = [0, 0, 0, 0, 0],
this.labels = ["Normals", "Albedo", "Reflectivity", "Gloss", "Topology"],
this.stripSlant = .25,
this.selectedStrip = this.STRIP_NONE,
this.animationActive = !1,
this.timestamp = Date.now(),
this.update(!0)
}
function U(e, t) {
this.gl = e,
this.id = null,
this.type = e.TEXTURE_2D,
this.format = e.RGBA,
this.componentType = e.UNSIGNED_BYTE,
t = t || {},
this.desc = {
width: t.width || 1,
height: t.height || 1,
mipmap: t.mipmap,
clamp: t.clamp,
mirror: t.mirror,
aniso: t.aniso,
nofilter: t.nofilter
}
}
function N(e) {
this.gl = e,
this.cache = []
}
function z(e, t) {
this.name = "none",
this.debugString = "",
this.knobControlRect = new s(e),
this.controlRect = new s(e);
var i = document.createElement("div");
i.id = "sliderUI",
i.style.position = "absolute",
i.style.overflow = "hidden",
i.style["-moz-user-select"] = "none",
i.style["-khtml-user-select"] = "none",
i.style["-webkit-user-select"] = "none",
i.style["-ms-user-select"] = "none",
this.controlRect.linkedControl = i,
this.backgroundControl = 0,
this.controlRect.registerChildControlRect(this.knobControlRect),
this.knobControlRect.setOpacity(.65),
this.sliderPercent = this.pixelsY = this.pixelsX = 0,
this.draggingSlider = !1,
this.guiScreen = e,
t.addImageElement(this.knobControlRect, "animationknob" + e.imageSetNumber + "x.png")
}
function j(e) {
this.viewer = e,
this.stripData = e.stripData,
(e = this.container = document.createElement("div")).id = "fdageUI",
e.style.position = "absolute",
e.style.overflow = "hidden",
e.style["-moz-user-select"] = "none",
e.style["-khtml-user-select"] = "none",
e.style["-webkit-user-select"] = "none",
e.style["-ms-user-select"] = "none",
this.viewer.domRoot.appendChild(e),
this.guiScreen = new t(this)
}
R.prototype.resize = function (e) {
e.ui.viewer.scene.sceneAnimator.showPlayControls || (e.width = 1,
e.height = 1),
this.compactMode = e.width < this.minWidth;
var t = this.bottomOffset
, i = this.bottomOffset + 4
, s = 0;
this.cameraList && this.animationList ? s += 42 + this.cameraList.localPixelsX + this.animationList.localPixelsX : this.cameraList ? s += 28 + this.cameraList.localPixelsX : this.animationList && (s += 28 + this.animationList.localPixelsX);
var n = e.width - s - 72;
0 == s && (n -= 14);
var r = 116
, a = r + n + 14;
this.compactMode && (r = 58,
n += 44 + s,
0 < s && (t += 32),
s || (i += 32));
var o = (s = 32 / n) + 14 / n
, h = 1 - o
, l = this.playbackRegion;
l.controlRect.widthPercent = n / e.width,
l.controlRect.heightPercent = 32 / e.height,
l.controlRect.xPercent = r / e.width,
l.controlRect.yPercent = t / e.height,
this.pauseButton.controlRect.set(0, .125, s, .75),
this.playButton.controlRect.set(0, .125, s, .75),
this.timelineSlider.controlRect.set(o, .03125, h, 1),
this.timelineSlider.setSize(n - 46, 32),
l.controlRect.updateElement(),
l.controlRect.updateChildElements(),
this.speedList.setControl(58, i, 44, 24, !1),
this.cameraList && (this.cameraList.setControl(a, i, 10, 24, !0, 8),
a += this.cameraList.localPixelsX + 14),
this.animationList && this.animationList.setControl(a, i, 10, 24, !0, 8),
this.timelineSlider.backgroundControl.alignBackground()
}
,
R.prototype.setupCallbacks = function () {
var e = function (e) {
"0.01x" == this.speedList.selectedItemText && this.ui.viewer.scene.sceneAnimator.setPlaybackSpeed(.01),
"0.05x" == this.speedList.selectedItemText && this.ui.viewer.scene.sceneAnimator.setPlaybackSpeed(.05),
"0.25x" == this.speedList.selectedItemText && this.ui.viewer.scene.sceneAnimator.setPlaybackSpeed(.25),
"0.5x" == this.speedList.selectedItemText && this.ui.viewer.scene.sceneAnimator.setPlaybackSpeed(.5),
"1.0x" == this.speedList.selectedItemText && this.ui.viewer.scene.sceneAnimator.setPlaybackSpeed(1),
"2.0x" == this.speedList.selectedItemText && this.ui.viewer.scene.sceneAnimator.setPlaybackSpeed(2),
"4.0x" == this.speedList.selectedItemText && this.ui.viewer.scene.sceneAnimator.setPlaybackSpeed(4)
}
.bind(this)
, t = function (e) {
this.ui.viewer.scene.sceneAnimator.selectCamera(this.cameraList.selectedIndex),
this.ui.viewer.wake()
}
.bind(this)
, i = function (e) {
this.ui.viewer.scene.sceneAnimator.selectAnimation(this.animationList.selectedIndex),
this.ui.viewer.wake()
}
.bind(this);
this.speedList && (this.speedList.selectionChangedCallback = e),
this.cameraList && (this.cameraList.selectionChangedCallback = t),
this.animationList && (this.animationList.selectionChangedCallback = i),
this.playButton.controlRect.linkedControl.onclick = function () {
this.ui.viewer.scene.sceneAnimator.pause(!1),
this.playButton.controlRect.showControl(!1),
this.pauseButton.controlRect.showControl(!0),
this.ui.viewer.wake()
}
.bind(this),
this.pauseButton.controlRect.linkedControl.onclick = function () {
this.ui.viewer.scene.sceneAnimator.pause(!0),
this.playButton.controlRect.showControl(!0),
this.pauseButton.controlRect.showControl(!1)
}
.bind(this)
}
,
A.prototype.prepareBloom = function (e) {
if (this.useBloom && this.bloomShader.complete() && this.shrinkShader.complete()) {
this.shrinkShader.bind(),
this.bloomTargets[1].bind(),
e.bind(this.shrinkShader.samplers.tInput),
this.fillScreen(this.shrinkShader.attribs.vCoord),
this.bloomShader.bind();
var t = [];
this.bloomTargets[0].bind(),
this.bloomTextures[1].bind(this.bloomShader.samplers.tInput);
for (var i = 0, s = 0; s < this.bloomSamples; ++s) {
var n, r = 2 * s / (this.bloomSamples - 1) - 1;
n = 4 * r,
i += n = Math.exp(-.5 * n * n / 1) / 2.50662827463,
t[4 * s + 0] = r * this.desc.bloomSize,
t[4 * s + 1] = 0,
t[4 * s + 2] = n,
t[4 * s + 3] = 0
}
for (s = 0; s < this.bloomSamples; ++s)
t[4 * s + 2] /= i;
for (this.gl.uniform4fv(this.bloomShader.params.uKernel, t),
this.fillScreen(this.bloomShader.attribs.vCoord),
this.bloomTargets[1].bind(),
this.bloomTextures[0].bind(this.bloomShader.samplers.tInput),
s = 0; s < this.bloomSamples; ++s)
i = t[4 * s + 0],
i *= e.desc.width / e.desc.height,
t[4 * s + 0] = 0,
t[4 * s + 1] = i;
this.gl.uniform4fv(this.bloomShader.params.uKernel, t),
this.fillScreen(this.bloomShader.attribs.vCoord),
this.bloomResult = this.bloomTextures[1]
} else
this.bloomResult = this.blackTexture
}
,
A.prototype.computeParams = function (e, t) {
var i = this.desc
, s = {};
s.scale = [i.contrast[0] * i.contrast[3], i.contrast[1] * i.contrast[3], i.contrast[2] * i.contrast[3]],
s.bias = [i.bias[0] * i.bias[3], i.bias[1] * i.bias[3], i.bias[2] * i.bias[3]],
s.bias = [-s.bias[0] * s.scale[0] + s.bias[0], -s.bias[1] * s.scale[1] + s.bias[1], -s.bias[2] * s.scale[2] + s.bias[2]];
var n = [i.brightness[0] * i.brightness[3], i.brightness[1] * i.brightness[3], i.brightness[2] * i.brightness[3]];
s.scale = [s.scale[0] * n[0], s.scale[1] * n[1], s.scale[2] * n[2]],
s.bias = [s.bias[0] * n[0], s.bias[1] * n[1], s.bias[2] * n[2]],
s.saturation = [i.saturation[0] * i.saturation[3], i.saturation[1] * i.saturation[3], i.saturation[2] * i.saturation[3]],
s.bloomColor = [i.bloomColor[0] * i.bloomColor[3], i.bloomColor[1] * i.bloomColor[3], i.bloomColor[2] * i.bloomColor[3]],
s.sharpen = [i.sharpen, .25 * i.sharpen, i.sharpenLimit],
s.sharpenKernel = [1 / e, 0, 0, 1 / t],
n = t < e ? e : t,
s.vignetteAspect = [e / n, t / n, .5 * e / n, .5 * t / n],
s.vignette = [2 * (1 - i.vignette[0]) * i.vignette[3], 2 * (1 - i.vignette[1]) * i.vignette[3], 2 * (1 - i.vignette[2]) * i.vignette[3], i.vignetteCurve];
n = 1 / this.noiseTexture.desc.width;
var r = 1 / this.noiseTexture.desc.height
, a = 1 - i.grainSharpness;
return s.grainCoord = [n * e, r * t, .5 * a * n, .5 * a * r],
s.grainScaleBias = [2 * i.grain, -i.grain],
s
}
,
A.prototype.present = function (e, t, i, s) {
if (s || this.prepareBloom(e),
1 < this.sampleCount && this.allocAABuffer(t, i),
(s = s ? this.plainShader : this.shader).bind()) {
var n = this.gl
, r = s.samplers
, a = s.params
, o = this.computeParams(t, i);
if (e.bind(r.tInput),
this.bloomResult.bind(r.tBloom),
this.noiseTexture.bind(r.tGrain),
this.colorLUT && this.colorLUT.bind(r.tLUT),
n.uniform3fv(a.uScale, o.scale),
n.uniform3fv(a.uBias, o.bias),
n.uniform3fv(a.uSaturation, o.saturation),
n.uniform4fv(a.uSharpenKernel, o.sharpenKernel),
n.uniform3fv(a.uSharpness, o.sharpen),
n.uniform3fv(a.uBloomColor, o.bloomColor),
n.uniform4fv(a.uVignetteAspect, o.vignetteAspect),
n.uniform4fv(a.uVignette, o.vignette),
n.uniform4fv(a.uGrainCoord, o.grainCoord),
n.uniform2fv(a.uGrainScaleBias, o.grainScaleBias),
e = 1 < this.sampleCount && 0 <= this.sampleIndex) {
var h = 1 / (1 + this.sampleIndex);
this.sampleIndex += 1,
h < 1 && (n.enable(n.BLEND),
n.blendColor(h, h, h, h),
n.blendFunc(n.CONSTANT_ALPHA, n.ONE_MINUS_CONSTANT_ALPHA)),
this.aaTarget.bind()
} else
m.bindNone(n),
1 < this.sampleCount && (this.sampleIndex += 1);
n.viewport(0, 0, t, i),
this.fillScreen(s.attribs.vCoord),
e && (h < 1 && n.disable(n.BLEND),
m.bindNone(n),
this.aaShader.bind(),
this.aaBuffer.bind(this.aaShader.samplers.tInput),
this.fillScreen(this.aaShader.attribs.vCoord))
}
}
,
A.prototype.allocAABuffer = function (e, t) {
this.aaBuffer && this.aaBuffer.desc.width == e && this.aaBuffer.desc.height == t || (this.aaBuffer && this.aaBuffer.destroy(),
this.aaBuffer = new U(this.gl, {
width: e,
height: t,
clamp: !0
}),
this.aaBuffer.loadArray(),
this.aaTarget = new m(this.gl, {
color0: this.aaBuffer,
ignoreStatus: !0
}))
}
,
A.prototype.adjustProjectionForSupersampling = function (e) {
if (1 < this.sampleCount) {
var t = this.currentSample()
, i = this.sampleOffsets[t][0] / e.size[0];
t = this.sampleOffsets[t][1] / e.size[1],
i = S.translation(S.empty(), i, t, 0);
S.mul(e.projectionMatrix, i, e.projectionMatrix)
}
}
,
A.prototype.discardAAHistory = function () {
this.sampleIndex = -1
}
,
A.prototype.currentSample = function () {
return (this.sampleIndex < 0 ? 0 : this.sampleIndex) % this.sampleCount
}
,
A.prototype.fillScreen = function (e) {
var t = this.gl;
t.bindBuffer(t.ARRAY_BUFFER, this.fullscreenTriangle),
t.enableVertexAttribArray(e),
t.vertexAttribPointer(e, 2, t.FLOAT, !1, 0, 0),
t.drawArrays(t.TRIANGLES, 0, 3),
t.disableVertexAttribArray(e),
t.bindBuffer(t.ARRAY_BUFFER, null)
}
,
A.prototype.blitTexture = function (e) {
this.aaShader.bind(),
e.bind(this.aaShader.samplers.tInput),
this.fillScreen(this.aaShader.attribs.vCoord)
}
,
k.prototype.load = function (e) {
var t, i = this.gl, s = e.extract("scene.json");
if (void 0 === s)
return !1;
if (!e.checkSignature(s))
return !1;
if (null == (s = new u(s.data).asString()) || s.length <= 0)
return !1;
try {
t = JSON.parse(s)
} catch (e) {
return console.error(e),
!1
}
for (var n in this.metaData = t.metaData,
this.view = new H(t.mainCamera.view),
this.sky = new _(this.gl, e, t.sky),
this.lights = new x(t.lights, this.view),
this.materialsList = [],
this.materials = {},
t.materials) {
var r = t.materials[n];
r.lightCount = this.lights.count,
r.shadowCount = this.lights.shadowCount,
s = new b(this.gl, e, r),
this.materials[r.name] = s,
this.materialsList.push(s)
}
if (t.meshes)
for (r = 0; r < t.meshes.length; ++r) {
n = t.meshes[r],
n = new T(this.gl, n, e.extract(n.file)),
this.meshes.push(n);
for (var a = 0; a < n.desc.subMeshes.length; ++a) {
var o = n.desc.subMeshes[a];
(s = this.materials[o.material]) && (n.numSubMeshes++,
this.meshRenderables.push(new w(n, o, s)))
}
}
return this.bounds = new d(this.meshes),
this.postRender = new A(this.gl, t.mainCamera.post, !0),
this.shadow = new E(i, this.lights.shadowCount),
this.cameras = t.Cameras,
t.AnimData && (this.sceneAnimator = new P(this, e, t.AnimData)),
t.fog && (this.fog = new f(i, t.fog)),
t.shadowFloor && (this.shadowFloor = new B(i, t.shadowFloor, this.shadow, this.lights)),
this.sceneLoaded = !0
}
,
k.prototype.update = function () {
this.sceneAnimator && (this.frameCounter++,
this.lights.flagUpdateAnimatedLighting(),
this.sceneAnimator.drawAnimated && (1 == this.frameCounter ? this.sceneAnimator.resetPlayback() : this.sceneAnimator.updateAnimationPlayback())),
this.lights.update(this.view, this.bounds)
}
,
k.prototype.collectShadows = function (e) {
this.shadow.collect(this, e)
}
,
k.prototype.draw = function (e) {
var t = this.gl;
if (this.sceneLoaded) {
this.sky.setClearColor(),
t.clear(t.COLOR_BUFFER_BIT | t.DEPTH_BUFFER_BIT | t.STENCIL_BUFFER_BIT),
t.enable(t.DEPTH_TEST),
this.sky.draw(this),
this.shadowFloor && this.shadowFloor.draw(this);
for (var i = 0; i < this.meshRenderables.length; ++i)
this.meshRenderables[i].material.usesBlending || this.meshRenderables[i].material.usesRefraction || !this.meshRenderables[i].visible || this.meshRenderables[i].draw(this);
for (t.enable(t.POLYGON_OFFSET_FILL),
t.polygonOffset(1, 1),
t.colorMask(!1, !1, !1, !1),
i = 0; i < this.meshRenderables.length; ++i)
this.meshRenderables[i].drawAlphaPrepass(this);
for (t.colorMask(!0, !0, !0, !0),
t.disable(t.POLYGON_OFFSET_FILL),
t.depthFunc(t.LEQUAL),
t.depthMask(!1),
i = 0; i < this.meshRenderables.length; ++i)
this.meshRenderables[i].material.usesBlending && this.meshRenderables[i].visible && this.meshRenderables[i].draw(this);
t.disable(t.BLEND),
t.depthMask(!0),
t.depthFunc(t.LESS);
var s = !1;
for (i = 0; i < this.meshRenderables.length; ++i)
if (this.meshRenderables[i].material.usesRefraction) {
s = !0;
break
}
if (s)
for (this.refractionSurface && this.refractionSurface.desc.width == e.color0.desc.width && this.refractionSurface.desc.height == e.color0.desc.height || (this.refractionSurface = new U(t, e.color0.desc),
this.refractionSurface.loadArray(null, e.color0.format, e.color0.componentType),
this.refractionBuffer = new m(this.gl, {
color0: this.refractionSurface
})),
this.refractionBuffer.bind(),
this.postRender.blitTexture(e.color0),
e.bind(),
i = 0; i < this.meshRenderables.length; ++i)
this.meshRenderables[i].material.usesRefraction && this.meshRenderables[i].visible && this.meshRenderables[i].draw(this);
if (this.stripData.activeWireframe() && 0 < this.meshRenderables.length) {
for (i = 0; i < this.meshRenderables.length; ++i)
this.meshRenderables[i].visible && this.meshRenderables[i].drawWire(this);
t.depthMask(!0)
}
t.disable(t.BLEND)
}
}
,
k.prototype.drawSecondary = function (e) {
this.fog && this.fog.draw(this, e)
}
,
k.prototype.complete = function () {
if (!this.sky.complete() || !this.shadow.complete() || this.fog && !this.fog.complete() || this.shadowFloor && !this.shadowFloor.complete())
return !1;
for (var e = 0; e < this.meshRenderables.length; ++e)
if (!this.meshRenderables[e].complete())
return !1;
return !0
}
,
P.prototype.flagAllForDebugging = function () {
for (var e = this.animations.length, t = 0; t < e; t++)
for (var i = this.animations[t], s = i.animatedObjects.length, n = 0; n < s; n++)
i.animatedObjects[n].debugMe = !0
}
,
P.prototype.checkDebug = function () {
this.debugString = "
--------------------------------------Debug Info:",
this.debugString += "
this.selectedAnimationIndex :" + this.selectedAnimationIndex;
var e = this.animations[this.selectedAnimationIndex]
, t = e.animatedObjects.length;
this.debugString += "
numAnimatedObjects :" + t,
"" != e.debugString && (this.debugString += "
--------------------------------------------------Got animation bug info:",
this.debugString += e.debugString,
this.showDebugInfo = this.stopEverything = !0,
e.debugString = "");
for (var i = 0; i < t; i++) {
var s = e.animatedObjects[i];
"" == s.debugString && "" == s.animatedLocalTransform.debugString || (this.debugString += "
--------------------------------------------------Got object bug info:",
this.debugString += s.debugString,
this.debugString += s.animatedLocalTransform.debugString,
this.showDebugInfo = this.stopEverything = !0,
s.debugString = "",
s.animatedLocalTransform.debugString = ""),
s.skinningRig && "" != s.skinningRig.debugString && (this.debugString += "
--------------------------------------------------Got skin rig info:",
this.debugString += s.skinningRig.debugString,
s.skinningRig.debugString = "",
this.showDebugInfo = this.stopEverything = !0)
}
this.debugString += "
--------------------------------------Done Debug Info:"
}
,
P.prototype.logObjectInfo = function (e, t) {
var i = t * (o = this.animations[this.selectedAnimationIndex]).originalFPS;
if (e >= o.animatedObjects.length)
this.debugString += "object index " + e + " exceeds " + o.animatedObjects.length;
else {
var s = o.animatedObjects[e]
, n = o.animatedObjects[s.modelPartIndex]
, r = o.getObjectAnimationFramePercent(s, t)
, a = o.getObjectAnimationFramePercent(n, t);
this.debugString = "",
this.debugString += "
Object Name: " + s.name,
this.debugString += "
Object Type: " + s.sceneObjectType,
this.debugString += "
Object Index: " + s.id,
this.debugString += "
Part Index: " + s.modelPartIndex,
this.debugString += "
Part Scale: " + s.modelPartScale,
this.debugString += "
Mesh Index: " + s.meshIndex,
this.debugString += "
Light Index: " + s.lightIndex,
this.debugString += "
Deformer Index: " + s.skinningRigIndex,
this.debugString += "
Parent Index: " + s.parentIndex,
this.debugString += "
Scene time " + t,
this.debugString += "
Scene framepercent " + i,
this.debugString += "
Object looped framepercent " + r,
this.debugString += "
Model looped framepercent " + a,
this.debugString += "
Object Anim length " + s.animationLength,
this.debugString += "
Object Total frames " + s.totalFrames,
this.debugString += "
Object FPS " + s.modelPartFPS,
this.debugString += "
Model Part Anim length " + n.animationLength,
this.debugString += "
Model total frames " + n.totalFrames,
this.debugString += "
Model Part FPS " + n.modelPartFPS,
i = S.identity(),
o.getWorldTransform(s.id, t, i, this.sceneScale, !0),
this.debugString += s.debugString;
var o = i[0]
, h = (s = i[1],
n = i[2],
r = i[4],
a = i[5],
i[6])
, l = i[8]
, d = i[9];
i = i[10];
Math.sqrt(o * o + s * s + n * n),
Math.sqrt(r * r + a * a + h * h),
Math.sqrt(l * l + d * d + i * i)
}
}
,
P.prototype.resetPlayback = function () {
this.startMS = Date.now(),
this.animationProgress = this.totalSeconds = 0,
this.setAnimationProgress(0, !0)
}
,
P.prototype.pause = function (e) {
this.paused = e,
this.startMS = Date.now() - 1e3 * this.totalSeconds / (this.playbackSpeed * this.scenePlaybackSpeed)
}
,
P.prototype.setAnimationProgress = function (e, t) {
var i = this.animations[this.selectedAnimationIndex];
this.animationProgress = e,
this.totalSeconds = i.totalSeconds * this.animationProgress,
this.totalSeconds -= 1 / i.originalFPS,
this.totalSeconds < 0 && (this.totalSeconds = 0),
this.startMS = Date.now() - 1e3 * this.totalSeconds / (this.playbackSpeed * this.scenePlaybackSpeed),
t && this.updateScene()
}
,
P.prototype.setPlaybackSpeed = function (e) {
this.playbackSpeed = e,
this.startMS = Date.now() - 1e3 * this.totalSeconds / (this.playbackSpeed * this.scenePlaybackSpeed)
}
,
P.prototype.resetCustomView = function () {
0 <= this.selectedCameraIndex && this.selectedCameraIndex < this.views.length && (this.viewYawOffsets[this.selectedCameraIndex] = 0,
this.viewPitchOffsets[this.selectedCameraIndex] = 0,
this.scene.view.rotation[1] = this.views[this.selectedCameraIndex].rotation[1],
this.scene.view.rotation[0] = this.views[this.selectedCameraIndex].rotation[0],
this.setViewFromSelectedCamera())
}
,
P.prototype.updateUserCamera = function () {
if (this.clearCacheForCameraChildren(),
0 <= this.selectedCameraIndex && this.selectedCameraIndex < this.views.length && this.selectedAnimationIndex < this.animations.length) {
var e = this.cameraObjectIndices[this.selectedCameraIndex]
, t = this.animations[this.selectedAnimationIndex];
if (e < t.animatedObjects.length) {
var i = this.views[this.selectedCameraIndex]
, s = this.scene.view.rotation[1]
, n = this.scene.view.rotation[0]
, r = n - i.rotation[0];
this.viewYawOffsets[this.selectedCameraIndex] = s - i.rotation[1],
this.viewPitchOffsets[this.selectedCameraIndex] = r,
i = t.animatedObjects[e],
t.getObjectAnimationFramePercent(i, this.totalSeconds);
r = S.identity();
var a = S.identity();
i.useFixedWorldTransform = !1,
i.useFixedLocalTransform = !1,
i.animatedLocalTransform.lockTransform = !1,
i.animatedLocalTransform.clearCachedTransforms(),
i.cachedFrame0 = -1,
i.cachedFrame1 = -1,
i.cachedFrame2 = -1,
i.cachedFrame3 = -1,
i.cachedFrameUse0 = 0,
i.cachedFrameUse1 = 0,
i.cachedFrameUse2 = 0,
i.cachedFrameUse3 = 0,
t.getWorldTransform(e, this.totalSeconds, a, this.sceneScale, !1);
e = a[0];
var o = a[1]
, h = a[2]
, l = a[4]
, d = a[5]
, c = a[6]
, u = a[8]
, f = a[9]
, m = a[10];
e = Math.sqrt(e * e + o * o + h * h),
l = Math.sqrt(l * l + d * d + c * c),
d = Math.sqrt(u * u + f * f + m * m);
(c = -(this.scene.view.pivot[0] - a[12])) * u + (o = -(this.scene.view.pivot[1] - a[13])) * f + (a = -(this.scene.view.pivot[2] - a[14])) * m <= 0 && (s += 180),
s = S.rotation(S.empty(), s, 1),
n = S.rotation(S.empty(), n, 0),
S.mul(r, s, n),
n = Math.sqrt(c * c + o * o + a * a),
s = this.scene.view.pivot[1] + r[9] * n,
a = this.scene.view.pivot[2] + r[10] * n,
r[12] = this.scene.view.pivot[0] + r[8] * n,
r[13] = s,
r[14] = a,
n = S.identity(),
t.getWorldTransform(i.parentIndex, this.totalSeconds, n, this.sceneScale, !1),
t = S.identity(),
S.invert(t, n),
n = S.identity(),
S.mul(n, t, r),
n[12] /= this.sceneScale,
n[13] /= this.sceneScale,
n[14] /= this.sceneScale,
r[0] *= e,
r[1] *= e,
r[2] *= e,
r[4] *= l,
r[5] *= l,
r[6] *= l,
r[8] *= d,
r[9] *= d,
r[10] *= d,
i.setFixedWorldTransform(r),
i.setFixedLocalTransform(n)
}
}
}
,
P.prototype.setViewFromSelectedCamera = function () {
if (0 <= this.selectedCameraIndex && this.selectedCameraIndex < this.views.length) {
var e = this.views[this.selectedCameraIndex]
, t = this.scene.view
, i = this.viewYawOffsets[this.selectedCameraIndex]
, s = this.viewPitchOffsets[this.selectedCameraIndex];
t.pivot[0] = e.pivot[0],
t.pivot[1] = e.pivot[1],
t.pivot[2] = e.pivot[2],
t.rotation[0] = e.rotation[0] + s,
t.rotation[1] = e.rotation[1] + i,
t.radius = e.radius,
t.nearPlane = e.nearPlane,
t.fov = e.fov,
t.saveResetView(),
t.updateProjection(),
t.updateView()
}
}
,
P.prototype.selectDefaultCamera = function () {
if (-1 != this.defaultCameraGlobalIndex && 0 < this.animations.length)
for (var e = this.animations[0], t = e.cameraObjects.length, i = 0; i < t; i++)
if (e.cameraObjects[i].id == this.defaultCameraGlobalIndex)
return void (this.selectedCameraIndex = i);
this.selectedCameraIndex = 0
}
,
P.prototype.updateAnimationPlayback = function () {
if (!this.stopEverything || !this.runDebugMode) {
var e = this.animations[this.selectedAnimationIndex];
if (this.updateUserCamera(),
this.paused || !this.playAnimations)
this.startMS = 0 < this.playbackSpeed ? Date.now() - 1e3 * this.totalSeconds / (this.playbackSpeed * this.scenePlaybackSpeed) : Date.now() - 1e3 * this.totalSeconds,
this.refreshTransformsOnly(),
this.runDebugMode && this.checkDebug(),
(e = this.scene.view).saveResetView(),
e.updateProjection(),
e.updateView();
else {
this.lockPlayback && 0 < this.playbackSpeed && (this.startMS = Date.now() - 1e3 * this.totalSeconds / (this.playbackSpeed * this.scenePlaybackSpeed));
var t = (Date.now() - this.startMS) / 1e3 * this.playbackSpeed * this.scenePlaybackSpeed;
this.totalSeconds = (Date.now() - this.startMS) / 1e3 * this.playbackSpeed * this.scenePlaybackSpeed;
var i = (i = t / e.totalSeconds) - (t = Math.floor(i));
t != this.loopCount && (this.loopCount++,
this.loopTurntables && this.rolloverTurntables(),
this.autoAdvanceNextAnimation && (this.nextAnimation(),
this.resetPlayback())),
this.totalSeconds = e.totalSeconds * i,
this.animationProgress = this.totalSeconds / e.totalSeconds - Math.floor(this.totalSeconds / e.totalSeconds),
this.updateScene(),
this.runDebugMode && this.checkDebug()
}
}
}
,
P.prototype.updateScene = function () {
this.lastSceneFramePercent = this.totalSeconds * this.animations[this.selectedAnimationIndex].originalFPS,
0 != this.fogObjectIndex && this.updateFog(),
this.animateTurntables && this.updateTurntables(),
this.animateMeshes && this.poseMeshes(),
this.animateLights && this.updateLights(),
this.animateMaterials && this.updateMaterials(),
this.animateVisibility && this.updateVisibility()
}
,
P.prototype.findCameraChildren = function () {
for (var e = this.animations[0], t = e.animatedObjects.length, i = 0; i < t; i++)
e.hasParentTypeInHierarchy(e.animatedObjects[i], "CameraSO") && this.cameraChildrenIndices.push(i)
}
,
P.prototype.findFixedTransforms = function () {
for (var e = this.animations.length, t = 0; t < e; t++)
for (var i = this.animations[t], s = i.animatedObjects.length, n = 0; n < s; n++) {
var r = i.animatedObjects[n];
if (!r.useFixedWorldTransform && !i.hasAnimationInHierarchy(r))
if ("Material" == r.sceneObjectType)
r.setFixedWorldTransform(S.identity()),
r.setFixedLocalTransform(S.identity());
else {
var a = S.identity()
, o = S.identity();
i.hasParentTypeInHierarchy(r, "SceneRootSO") ? (i.getWorldTransform(r.id, 0, a, this.sceneScale, !1),
r.evaluateLocalTransformAtFramePercent(0, o, !0, !1)) : (i.evaluateModelPartTransformAtFrame(r.id, 0, a, !1),
r.evaluateLocalTransformAtFramePercent(0, o, !1, !1)),
r.setFixedWorldTransform(a),
r.setFixedLocalTransform(o)
}
}
}
,
P.prototype.clearCacheForCameraChildren = function () {
for (var e = this.animations[this.selectedAnimationIndex], t = this.cameraChildrenIndices.length, i = 0; i < t; i++) {
var s = e.animatedObjects[this.cameraChildrenIndices[i]];
s.useFixedWorldTransform = !1,
s.useFixedLocalTransform = !1,
s.cachedFrame0 = -10,
s.cachedFrame1 = -10,
s.cachedFrame2 = -10,
s.cachedFrame3 = -10,
s.cachedFrameUse0 = 0,
s.cachedFrameUse1 = 0,
s.cachedFrameUse2 = 0,
s.cachedFrameUse3 = 0,
s.animatedLocalTransform.clearCachedTransforms(),
s.animatedLocalTransform.lockTransform = !1
}
}
,
P.prototype.refreshTransformsOnly = function () {
for (var e = this.animations[this.selectedAnimationIndex], t = e.meshObjects.length, i = 0; i < t; i++) {
var s = e.meshObjects[i];
if (e.getWorldTransform(s.id, this.totalSeconds, s.mesh.displayMatrix, this.sceneScale, !0),
this.enableSkinning && s.skinningRig && this.unitScaleSkinnedMeshes && !s.skinningRig.isRigidSkin) {
var n = (s = s.mesh.displayMatrix)[0]
, r = s[1]
, a = s[2]
, o = s[4]
, h = s[5]
, l = s[6]
, d = s[8]
, c = s[9]
, u = s[10];
d = ((n = Math.sqrt(n * n + r * r + a * a)) + (o = Math.sqrt(o * o + h * h + l * l)) + (d = Math.sqrt(d * d + c * c + u * u))) / 2;
s[0] /= d,
s[1] /= d,
s[2] /= d,
s[4] /= d,
s[5] /= d,
s[6] /= d,
s[8] /= d,
s[9] /= d,
s[10] /= d
}
}
if (this.animateLights)
for (t = e.lightObjects.length,
i = 0; i < t; i++)
(s = e.lightObjects[i]).useFixedWorldTransform || (d = this.scene.lights.getLightPos(s.lightIndex),
c = this.scene.lights.getLightDir(s.lightIndex),
u = S.identity(),
e.getWorldTransform(s.id, this.totalSeconds, u, this.sceneScale, !0),
c[0] = u[8],
c[1] = u[9],
c[2] = u[10],
0 != d[3] && (d[0] = u[12],
d[1] = u[13],
d[2] = u[14],
this.scene.lights.setLightPos(s.lightIndex, d)),
this.scene.lights.setLightDir(s.lightIndex, c))
}
,
P.prototype.findMeshIndexByPartIndex = function (e, t) {
for (var i = 0; i < this.meshIDs.length; ++i)
if (t == this.meshIDs[i])
return i;
return -1
}
,
P.prototype.findLightIndexByPartIndex = function (e) {
for (var t = 0; t < this.lightIDs.length; t++)
if (e == this.lightIDs[t])
return t;
return -1
}
,
P.prototype.findMaterialIndexByPartIndex = function (e) {
for (var t = 0; t < this.materialIDs.length; t++)
if (e == this.materialIDs[t])
return t;
return -1
}
,
P.prototype.nextAnimation = function () {
this.selectedAnimationIndex++,
this.selectedAnimationIndex >= this.animations.length && (this.selectedAnimationIndex = 0)
}
,
P.prototype.selectAnimation = function (e) {
0 <= e && e < this.animations.length && (this.selectedAnimationIndex = e),
this.paused && this.setAnimationProgress(this.animationProgress, !0)
}
,
P.prototype.selectCamera = function (e) {
-1 != e && this.selectedCameraIndex != e && (this.selectedCameraIndex = e,
this.setViewFromSelectedCamera())
}
,
P.prototype.getAnimatedCamera = function () {
if (0 <= this.selectedCameraIndex && this.selectedAnimationIndex < this.animations.length) {
var e = this.animations[this.selectedAnimationIndex];
if (this.selectedCameraIndex < e.cameraObjects.length)
return e.cameraObjects[this.selectedCameraIndex]
}
}
,
P.prototype.poseMeshes = function () {
for (var e = this.animations[this.selectedAnimationIndex], t = e.meshObjects.length, i = 0; i < t; i++) {
var s = e.meshObjects[i];
if (this.enableSkinning && s.skinningRig)
if (s.skinningRig.isRigidSkin)
e.getWorldTransform(s.id, this.totalSeconds, s.mesh.displayMatrix, this.sceneScale, !0);
else {
s.setupSkinningRig(e, s.modelPartIndex, this.totalSeconds, s.skinningRig),
e.getWorldTransform(s.id, this.totalSeconds, s.mesh.displayMatrix, this.sceneScale, !0);
var n = s.modelPartScale * this.sceneScale;
if (this.unitScaleSkinnedMeshes) {
var r = s.mesh.displayMatrix
, a = r[0]
, o = r[1]
, h = r[2]
, l = r[4]
, d = r[5]
, c = r[6]
, u = r[8]
, f = r[9]
, m = r[10];
u = ((a = Math.sqrt(a * a + o * o + h * h)) + (l = Math.sqrt(l * l + d * d + c * c)) + (u = Math.sqrt(u * u + f * f + m * m))) / 2;
r[0] /= u,
r[1] /= u,
r[2] /= u,
r[4] /= u,
r[5] /= u,
r[6] /= u,
r[8] /= u,
r[9] /= u,
r[10] /= u,
n *= u
}
s.skinningRig.deformMesh(s.mesh, n)
}
else
e.getWorldTransform(s.id, this.totalSeconds, s.mesh.displayMatrix, this.sceneScale, !0)
}
}
,
P.prototype.updateLights = function () {
for (var e = this.animations[this.selectedAnimationIndex], t = this.totalSeconds * e.originalFPS, i = e.lightObjects.length, s = 0; s < i; s++) {
var n = e.lightObjects[s]
, r = this.scene.lights.getLightPos(n.lightIndex)
, a = this.scene.lights.getLightDir(n.lightIndex)
, o = this.scene.lights.getLightColor(n.lightIndex)
, h = S.identity()
, l = 1;
n.useFixedWorldTransform || e.getWorldTransform(n.id, this.totalSeconds, h, this.sceneScale, !0),
n.redProperty && (n.redProperty.evaluate(t, o[0], n),
o[0] = n.redProperty.lastValue),
n.greenProperty && (n.greenProperty.evaluate(t, o[1], n),
o[1] = n.greenProperty.lastValue),
n.blueProperty && (n.blueProperty.evaluate(t, o[2], n),
o[2] = n.blueProperty.lastValue),
n.brightnessProperty && (n.brightnessProperty.evaluate(t, l, n),
l = n.brightnessProperty.lastValue),
o[0] *= l,
o[1] *= l,
o[2] *= l,
0 != r[3] && (n.useFixedWorldTransform || (r[0] = h[12],
r[1] = h[13],
r[2] = h[14],
this.scene.lights.setLightPos(n.lightIndex, r)),
n.spotAngleProperty && 0 < this.scene.lights.spot[3 * n.lightIndex] && (r = 0,
n.spotAngleProperty.evaluate(t, r, n),
r = n.spotAngleProperty.lastValue,
this.scene.lights.setLightSpotAngle(n.lightIndex, r)),
n.spotSharpnessProperty && (r = 0,
n.spotSharpnessProperty.evaluate(t, r, n),
r = n.spotSharpnessProperty.lastValue,
this.scene.lights.setLightSpotSharpness(n.lightIndex, r)),
n.distanceProperty && (r = 1,
n.distanceProperty.evaluate(t, r, n),
r = n.distanceProperty.lastValue * this.sceneScale,
this.scene.lights.setLightDistance(n.lightIndex, r))),
n.useFixedWorldTransform || (a[0] = h[8],
a[1] = h[9],
a[2] = h[10],
this.scene.lights.setLightDir(n.lightIndex, a)),
this.scene.lights.setLightColor(n.lightIndex, o)
}
}
,
P.prototype.updateTurntables = function () {
for (var e = this.animations[this.selectedAnimationIndex], t = this.totalSeconds * e.originalFPS, i = e.turnTableObjects.length, s = 0; s < i; s++) {
var n = e.turnTableObjects[s];
n.spinProperty.evaluate(t, 0, n),
n.turnTableSpin = n.turnTableSpinOffset + n.spinProperty.lastValue * this.totalSeconds
}
}
,
P.prototype.rolloverTurntables = function () {
for (var e = this.animations[this.selectedAnimationIndex], t = e.turnTableObjects.length, i = 0; i < t; i++) {
var s = e.turnTableObjects[i];
s.turnTableSpinOffset = s.turnTableSpin
}
}
,
P.prototype.updateMaterials = function () {
for (var e = this.animations[this.selectedAnimationIndex], t = this.totalSeconds * e.originalFPS, i = e.materialObjects.length, s = 0; s < i; s++) {
var n = e.materialObjects[s];
n.offsetUProperty && (n.offsetUProperty.evaluate(t, 0, n),
this.scene.materialsList[n.materialIndex].uOffset = n.offsetUProperty.lastValue),
n.offsetVProperty && (n.offsetVProperty.evaluate(t, 0, n),
this.scene.materialsList[n.materialIndex].vOffset = n.offsetVProperty.lastValue),
n.emissiveProperty && 1 < n.emissiveProperty.numKeyframes && (n.emissiveProperty.evaluate(t, 0, n),
this.scene.materialsList[n.materialIndex].emissiveIntensity = n.emissiveProperty.lastValue)
}
}
,
P.prototype.updateFog = function () {
var e = this.animations[this.selectedAnimationIndex]
, t = this.totalSeconds * e.originalFPS;
0 <= this.fogObjectIndex && this.fogObjectIndex < e.animatedObjects.length && this.scene.fog && ((e = e.animatedObjects[this.fogObjectIndex]).redProperty && (this.scene.fog.desc.color[0] = e.redProperty.evaluate(t, this.scene.fog.desc.color[0], e)),
e.greenProperty && (this.scene.fog.desc.color[1] = e.greenProperty.evaluate(t, this.scene.fog.desc.color[1], e)),
e.blueProperty && (this.scene.fog.desc.color[2] = e.blueProperty.evaluate(t, this.scene.fog.desc.color[2], e)),
e.distanceProperty && (this.scene.fog.desc.distance = e.distanceProperty.evaluate(t, this.scene.fog.desc.distance, e)),
e.opacityProperty && (this.scene.fog.desc.opacity = e.opacityProperty.evaluate(t, this.scene.fog.desc.opacity, e)),
e.skyIllumProperty && (this.scene.fog.desc.skyIllum = e.skyIllumProperty.evaluate(t, this.scene.fog.desc.skyIllum, e)),
e.lightIllumProperty && (this.scene.fog.desc.lightIllum = e.lightIllumProperty.evaluate(t, this.scene.fog.desc.lightIllum, e)),
e.dispersionProperty && (this.scene.fog.desc.dispersion = e.dispersionProperty.evaluate(t, this.scene.fog.desc.dispersion, e)))
}
,
P.prototype.updateVisibility = function () {
for (var e = this.animations[this.selectedAnimationIndex], t = this.subMeshObjectIndices.length, i = 0; i < t; i++) {
if (-1 != (n = this.subMeshLiveIndices[i])) {
var s = this.subMeshObjectIndices[i]
, n = this.scene.meshRenderables[n]
, r = e.getObjectAnimationFramePercent(e.animatedObjects[s], this.totalSeconds);
n.visible = e.isVisibleAtFramePercent(s, r)
}
}
}
,
F.prototype.build = function (e, t) {
var i = this.gl;
this.program = i.createProgram(),
this.params = {},
this.samplers = {},
this.attribs = {};
var s = function (e) {
for (var t = "", i = e.indexOf("\n"), s = 0; -1 != i;)
t += ++s + ": ",
t += e.substring(0, i + 1),
i = (e = e.substring(i + 1, e.length)).indexOf("\n");
console.log(t)
}
, n = i.createShader(i.VERTEX_SHADER);
i.shaderSource(n, e),
i.compileShader(n),
i.getShaderParameter(n, i.COMPILE_STATUS) || (console.log(i.getShaderInfoLog(n)),
I.verboseErrors && s(e)),
i.attachShader(this.program, n),
n = i.createShader(i.FRAGMENT_SHADER),
i.shaderSource(n, t),
i.compileShader(n),
i.getShaderParameter(n, i.COMPILE_STATUS) || (console.log(i.getShaderInfoLog(n)),
I.verboseErrors && s(t)),
i.attachShader(this.program, n),
i.linkProgram(this.program),
i.getProgramParameter(this.program, i.LINK_STATUS) || console.log(i.getProgramInfoLog(this.program));
n = i.getProgramParameter(this.program, i.ACTIVE_UNIFORMS);
var r = 0;
for (s = 0; s < n; ++s) {
var a = i.getActiveUniform(this.program, s)
, o = a.name
, h = o.indexOf("[");
0 <= h && (o = o.substring(0, h)),
h = i.getUniformLocation(this.program, a.name),
a.type == i.SAMPLER_2D || a.type == i.SAMPLER_CUBE ? this.samplers[o] = {
location: h,
unit: r++
} : this.params[o] = h
}
for (n = i.getProgramParameter(this.program, i.ACTIVE_ATTRIBUTES),
s = 0; s < n; ++s)
r = i.getActiveAttrib(this.program, s),
this.attribs[r.name] = i.getAttribLocation(this.program, r.name)
}
,
F.prototype.bind = function () {
return !!this.program && (this.gl.useProgram(this.program),
!0)
}
,
F.prototype.complete = function () {
return !!this.program
}
,
O.prototype.fromURLs = function (e, t, i) {
var s = "";
if (i)
for (var n = 0; n < i.length; ++n)
s = i[n] + "\n" + s;
if (i = s + ":" + e + "|" + t,
void 0 !== (n = this.cache[i]))
return n;
function r() {
null != o && null != h && a.build(o, h)
}
var a = new F(this.gl)
, o = null
, h = null;
return this.fetch(e, function (e) {
o = s + e,
r()
}),
this.fetch(t, function (e) {
h = s + e,
r()
}),
this.cache[i] = a
}
,
O.prototype.fetch = function (e, t) {
void 0 !== G ? void 0 !== G[e] ? this.resolveIncludes(new String(G[e]), t) : t("") : C.fetchText("src/shader/" + e, function (e) {
this.resolveIncludes(e, t)
}
.bind(this), function () {
t("")
})
}
,
O.prototype.resolveIncludes = function (t, i) {
for (var r = [], a = !0, e = function (e, t, i, s, n) {
return a = !0,
r.push({
offset: n,
path: t.slice(1, t.length - 1)
}),
""
}; a;)
a = !1,
t = t.replace(/#include\s((<[^>]+>)|("[^"]+"))/, e);
if (0 < r.length) {
var s = r.length;
for (e = 0; e < r.length; ++e)
this.fetch(r[e].path, function (e) {
if (this.src = e,
--s <= 0) {
for (e = r.length - 1; 0 <= e; --e)
t = t.substring(0, r[e].offset) + r[e].src + t.substring(r[e].offset);
i(t)
}
}
.bind(r[e]))
} else
i(t)
}
,
E.prototype.bindDepthTexture = function (e, t) {
this.shadowCount > t && this.depthTextures[t].bind(e)
}
,
E.prototype.collect = function (e, t) {
for (var i = this.gl, s = e.lights, n = s.shadowCount, r = s.modelViewBuffer, a = s.projectionBuffer, o = s.matrix, h = 0 != e.sceneAnimator, l = S.empty(), d = !1, c = 0; c < n; ++c)
if (s.shadowsNeedUpdate[c]) {
d = !(s.shadowsNeedUpdate[c] = 0),
S.mul(l, r.subarray(16 * c, 16 * (c + 1)), o),
S.mul(l, a.subarray(16 * c, 16 * (c + 1)), l),
this.depthTargets[c].bind(),
i.clearColor(1, 1, 1, 1),
i.clear(i.COLOR_BUFFER_BIT | i.DEPTH_BUFFER_BIT);
var u = this.shaderSolid;
u.bind(),
i.uniformMatrix4fv(u.params.uViewProjection, !1, l),
i.uniformMatrix4fv(u.params.uMeshTransform, !1, S.identity());
for (var f = 0; f < e.meshRenderables.length; ++f) {
var m = e.meshRenderables[f]
, p = m.material;
!m.mesh.desc.castShadows || !p.castShadows || 0 < p.shadowAlphaTest || (h && i.uniformMatrix4fv(u.params.uMeshTransform, !1, m.mesh.displayMatrix),
m.drawShadow(u.attribs.vPosition))
}
for ((u = this.shaderAlphaTest).bind(),
i.uniformMatrix4fv(u.params.uViewProjection, !1, l),
i.uniformMatrix4fv(u.params.uMeshTransform, !1, S.identity()),
f = 0; f < e.meshRenderables.length; ++f)
p = (m = e.meshRenderables[f]).material,
m.mesh.desc.castShadows && p.castShadows && 0 < p.shadowAlphaTest && (p.textures.albedo.bind(u.samplers.tAlbedo),
h && (i.uniform2f(u.params.uUVOffset, p.uOffset, p.vOffset),
i.uniformMatrix4fv(u.params.uMeshTransform, !1, m.mesh.displayMatrix)),
m.drawAlphaShadow(u.attribs.vPosition, u.attribs.vTexCoord))
}
d && (t.bind(),
i.enable(i.CULL_FACE),
i.cullFace(i.BACK))
}
,
E.prototype.complete = function () {
return this.shaderSolid.complete() && this.shaderAlphaTest.complete()
}
,
B.prototype.draw = function (e) {
var t = e.view
, i = e.lights
, s = e.shadow
, n = this.gl
, r = this.shader.params
, a = this.shader.samplers;
this.shader.bind(),
t = S.mul(S.empty(), t.projectionMatrix, t.viewMatrix),
S.mul(t, t, this.desc.transform),
n.uniformMatrix4fv(r.uModelViewProjectionMatrix, !1, t),
t = S.mul(S.empty(), i.matrix, this.desc.transform),
n.uniformMatrix4fv(r.uModelSkyMatrix, !1, t),
0 < i.count && (n.uniform4fv(r.uLightPositions, i.positionBuffer),
n.uniform3fv(r.uLightDirections, i.directionBuffer),
n.uniform3fv(r.uLightColors, i.colors),
n.uniform3fv(r.uLightParams, i.parameters),
n.uniform3fv(r.uLightSpot, i.spot),
e = .392699 * e.postRender.currentSample(),
n.uniform2f(r.uShadowKernelRotation, .5 * Math.cos(e), .5 * Math.sin(e)),
0 < i.shadowCount && (e = s.depthTextures[0].desc.width,
n.uniform2f(r.uShadowMapSize, e, 1 / e),
n.uniformMatrix4fv(r.uShadowMatrices, !1, i.finalTransformBuffer),
n.uniformMatrix4fv(r.uInvShadowMatrices, !1, i.inverseTransformBuffer),
n.uniform4fv(r.uShadowTexelPadProjections, i.shadowTexelPadProjections),
s.bindDepthTexture(a.tDepth0, 0),
s.bindDepthTexture(a.tDepth1, 1),
s.bindDepthTexture(a.tDepth2, 2))),
n.uniform3f(r.uShadowCatcherParams, this.desc.simple ? 1 : 0, this.desc.alpha, this.desc.edgeFade),
n.depthMask(!1),
n.enable(n.BLEND),
n.blendFunc(n.ZERO, n.SRC_COLOR),
i = this.shader.attribs.vPosition,
n.bindBuffer(n.ARRAY_BUFFER, this.quadGeom),
n.enableVertexAttribArray(i),
n.vertexAttribPointer(i, 3, n.FLOAT, !1, 0, 0),
n.drawArrays(n.TRIANGLES, 0, 6),
n.disableVertexAttribArray(i),
n.bindBuffer(n.ARRAY_BUFFER, null),
n.disable(n.BLEND),
n.depthMask(!0)
}
,
B.prototype.complete = function () {
return this.shader.complete()
}
,
L.prototype.solveAdditiveClusterTransform = function (e, t, i) {
t = S.identity();
var s = S.identity()
, n = S.identity();
S.mul(t, e, this.defaultClusterBaseTransform),
S.mul(s, this.defaultAssociateWorldTransformInvert, t),
S.mul(n, this.defaultAssociateWorldTransformInvert, s),
S.mul(i, this.defaultClusterWorldTransformInvert, n)
}
,
L.prototype.solveSimpleClusterTransform = function (e, t, i) {
var s = S.identity()
, n = S.identity();
S.invert(n, t),
S.mul(s, n, e),
S.mul(i, s, this.defaultClusterBaseTransform)
}
,
L.prototype.solveClusterTransformAtFrame = function (e, t, i, s) {
if (1 == this.linkMode) {
var n = S.identity();
t = S.identity(),
e.evaluateModelPartTransformAtFrame(this.linkObjectIndex, i, n, !1),
e.evaluateModelPartTransformAtFrame(this.associateObjectIndex, i, t, !1),
this.solveAdditiveClusterTransform(n, t, s)
} else {
n = S.identity();
var r = S.identity();
e.evaluateModelPartTransformAtFrame(this.linkObjectIndex, i, n, !1),
e.evaluateModelPartTransformAtFrame(t, i, r, !1),
this.solveSimpleClusterTransform(n, r, s)
}
}
,
M.prototype.unpackUnitVectors = function (e, t, i, s) {
for (var n = 0; n < i; n++) {
var r = t[s * n]
, a = 32768 <= (o = t[s * n + 1]);
a && (o -= 32768);
var o, h = 1 - ((r = r / 32767.4 * 2 - 1) * r + (o = o / 32767.4 * 2 - 1) * o);
h = Math.sqrt(h),
h = isNaN(h) ? 0 : h;
a && (h = -h),
e[3 * n] = r,
e[3 * n + 1] = o,
e[3 * n + 2] = h
}
}
,
M.prototype.copyOriginalVertices = function (e) {
if (!this.unTransformedVertices)
if (this.unTransformedVertices = new Float32Array(3 * e.vertexCount),
this.unTransformedNormals = new Float32Array(3 * e.vertexCount),
this.unTransformedTangents = new Float32Array(3 * e.vertexCount),
this.unTransformedBiTangents = new Float32Array(3 * e.vertexCount),
this.skinVertexWeights = new Float32Array(e.vertexCount),
this.skinVertexTransform4x3 = new Float32Array(12),
e.dynamicVertexData) {
var t = new Float32Array(e.dynamicVertexData.buffer);
new Uint8Array(e.dynamicVertexData.buffer);
var i = s = 0
, s = s + 12 + 8;
e.secondaryTexCoord && (s += 8);
var n = s
, r = s += 4
, a = (s = s + 4,
e.stride / 2);
s = new Uint8Array(e.dynamicVertexData.subarray(s)),
s = new Uint16Array(s.buffer),
n = new Uint8Array(e.dynamicVertexData.subarray(n)),
n = new Uint16Array(n.buffer),
r = new Uint8Array(e.dynamicVertexData.subarray(r)),
r = new Uint16Array(r.buffer);
for (this.unpackUnitVectors(this.unTransformedNormals, s, e.vertexCount, a),
this.unpackUnitVectors(this.unTransformedTangents, n, e.vertexCount, a),
this.unpackUnitVectors(this.unTransformedBiTangents, r, e.vertexCount, a),
a = 0; a < e.vertexCount; a++)
r = (e.stride * a + i) / 4,
this.unTransformedVertices[3 * a] = t[r],
this.unTransformedVertices[3 * a + 1] = t[r + 1],
this.unTransformedVertices[3 * a + 2] = t[r + 2]
} else
this.debugString += "
Can't init skinning rig - mesh buffer is not dynamic - rigid is " + this.isRigidSkin
}
,
M.prototype.useOriginalMeshVertices = function (e) {
this.isRigidSkin ? this.debugString += "
useOriginalMeshVertices for rigid skin?" : this.copyOriginalVertices(e)
}
,
M.prototype.deformMeshVertices = function (e, t) {
if (0 != this.skinningClusters.length && this.unTransformedVertices) {
var i, s = e.stride / 4, n = new Float32Array(e.dynamicVertexData.buffer), r = new Uint16Array(e.dynamicVertexData.buffer);
new Uint8Array(e.dynamicVertexData.buffer),
i = 20,
e.secondaryTexCoord && (i += 8);
var a = i
, o = i += 4;
i += 4;
for (var h = this.unTransformedVertices.length / 3, l = 0, d = 0; d < h; ++d) {
var c = d
, u = (c * e.stride + a) / 2
, f = (c * e.stride + o) / 2
, m = (c * e.stride + i) / 2
, p = this.linkMapCount[c];
(k = this.skinVertexTransform4x3)[this.skinVertexWeights[c] = 0] = 0,
k[1] = 0,
k[2] = 0,
k[3] = 0,
k[4] = 0,
k[5] = 0,
k[6] = 0,
k[7] = 0,
k[8] = 0,
k[9] = 0,
k[10] = 0,
k[11] = 0;
var g = this.linkMapWeights[l];
if (1 == p && 1 == g) {
var v = this.linkMapClusterIndices[l]
, x = (v = this.skinningClusters[v]).matrix;
k[0] = x[0],
k[1] = x[1],
k[2] = x[2],
k[3] = x[4],
k[4] = x[5],
k[5] = x[6],
k[6] = x[8],
k[7] = x[9],
k[8] = x[10],
k[9] = x[12],
k[10] = x[13],
k[11] = x[14],
this.skinVertexWeights[c] = 1
} else
for (var y = this.skinVertexWeights[c] = 0; y < p; y++)
g = this.linkMapWeights[l + y],
(v = this.linkMapClusterIndices[l + y]) < this.skinningClusters.length && (x = (v = this.skinningClusters[v]).matrix,
k[0] += g * x[0],
k[1] += g * x[1],
k[2] += g * x[2],
k[3] += g * x[4],
k[4] += g * x[5],
k[5] += g * x[6],
k[6] += g * x[8],
k[7] += g * x[9],
k[8] += g * x[10],
k[9] += g * x[12],
k[10] += g * x[13],
k[11] += g * x[14],
this.skinVertexWeights[c] += g,
1 == v.linkMode && (this.skinVertexWeights[c] = 1));
if (l += this.linkMapCount[d],
0 < this.skinVertexWeights[c]) {
var b = this.unTransformedVertices[3 * d + 0]
, S = this.unTransformedVertices[3 * d + 1]
, T = this.unTransformedVertices[3 * d + 2]
, w = this.unTransformedNormals[3 * d + 0]
, C = this.unTransformedNormals[3 * d + 1]
, R = this.unTransformedNormals[3 * d + 2]
, A = (v = this.unTransformedTangents[3 * d + 0],
x = this.unTransformedTangents[3 * d + 1],
this.unTransformedTangents[3 * d + 2])
, k = (p = this.unTransformedBiTangents[3 * d + 0],
this.unTransformedBiTangents[3 * d + 1])
, I = (g = this.unTransformedBiTangents[3 * d + 2],
y = this.skinVertexTransform4x3,
1);
0 < this.skinVertexWeights[c] && (I = 1 / this.skinVertexWeights[c]),
n[s * d] = I * (b * y[0] + S * y[3] + T * y[6] + y[9]) * t,
n[s * d + 1] = I * (b * y[1] + S * y[4] + T * y[7] + y[10]) * t,
n[s * d + 2] = I * (b * y[2] + S * y[5] + T * y[8] + y[11]) * t,
b = w * y[0] + C * y[3] + R * y[6],
c = w * y[1] + C * y[4] + R * y[7],
w = w * y[2] + C * y[5] + R * y[8],
C = v * y[0] + x * y[3] + A * y[6],
R = v * y[1] + x * y[4] + A * y[7],
v = v * y[2] + x * y[5] + A * y[8],
x = p * y[0] + k * y[3] + g * y[6],
A = p * y[1] + k * y[4] + g * y[7],
p = p * y[2] + k * y[5] + g * y[8],
c /= k = Math.sqrt(b * b + c * c + w * w),
w /= k,
k = 32767.4 * ((b /= k) / 2 + .5),
g = 32767.4 * (c / 2 + .5),
w < 0 && (g += 32768),
r[m] = Math.floor(k),
r[1 + m] = Math.floor(g),
R /= k = Math.sqrt(C * C + R * R + v * v),
v /= k,
k = 32767.4 * ((C /= k) / 2 + .5),
g = 32767.4 * (R / 2 + .5),
v < 0 && (g += 32768),
r[u] = Math.floor(k),
r[1 + u] = Math.floor(g),
A /= k = Math.sqrt(x * x + A * A + p * p),
p /= k,
k = 32767.4 * ((x /= k) / 2 + .5),
g = 32767.4 * (A / 2 + .5),
p < 0 && (g += 32768),
r[f] = Math.floor(k),
r[1 + f] = Math.floor(g)
} else
b = this.unTransformedVertices[3 * d + 0],
S = this.unTransformedVertices[3 * d + 1],
T = this.unTransformedVertices[3 * d + 2],
n[s * d] = b * t,
n[s * d + 1] = S * t,
n[s * d + 2] = T * t
}
}
}
,
M.prototype.deformMesh = function (e, t) {
if (0 != this.skinningClusters.length && !this.isRigidSkin) {
this.deformMeshVertices(e, t);
var i = e.gl;
i.bindBuffer(i.ARRAY_BUFFER, e.vertexBuffer),
i.bufferData(i.ARRAY_BUFFER, e.dynamicVertexData, i.DYNAMIC_DRAW),
i.bindBuffer(i.ARRAY_BUFFER, null)
}
}
,
_.prototype.setClearColor = function () {
if (I.transparentBackground)
this.gl.clearColor(0, 0, 0, 0);
else if (this.backgroundMode < 1) {
var e = this.backgroundColor;
this.gl.clearColor(e[0], e[1], e[2], 1)
} else
this.gl.clearColor(.0582, .06772, .07805, 1)
}
,
_.prototype.draw = function (e) {
if (this.backgroundMode < 1 || I.transparentBackground)
return !1;
if (this.complete()) {
var t = this.gl
, i = this.backgroundShader
, s = e.view
, n = e.lights.invMatrix;
i.bind(),
t.uniformMatrix4fv(i.params.uInverseSkyMatrix, !1, n),
t.uniformMatrix4fv(i.params.uViewProjection, !1, s.viewProjectionMatrix),
3 == this.backgroundMode ? t.uniform4fv(i.params.uSkyCoefficients, this.backgroundCoefficients) : this.backgroundTexture.bind(i.samplers.tSkyTexture),
e = .07 + .94 * (1 - e.stripData.activeFade()),
t.uniform1f(i.params.uAlpha, e),
t.bindBuffer(t.ARRAY_BUFFER, this.vertexBuffer),
t.enableVertexAttribArray(i.attribs.vPosition),
t.vertexAttribPointer(i.attribs.vPosition, 3, t.FLOAT, !1, 20, 0),
t.enableVertexAttribArray(i.attribs.vTexCoord),
t.vertexAttribPointer(i.attribs.vTexCoord, 2, t.FLOAT, !1, 20, 12),
t.bindBuffer(t.ELEMENT_ARRAY_BUFFER, this.indexBuffer),
e < 1 && (t.enable(t.BLEND),
t.blendFunc(t.SRC_ALPHA, t.ONE_MINUS_SRC_ALPHA)),
t.depthMask(!1),
t.disable(t.DEPTH_TEST),
t.drawElements(t.TRIANGLES, this.skyIndexCount, t.UNSIGNED_SHORT, 0),
t.enable(t.DEPTH_TEST),
t.depthMask(!0),
e < 1 && t.disable(t.BLEND),
t.disableVertexAttribArray(i.attribs.vPosition),
t.disableVertexAttribArray(i.attribs.vTexCoord)
}
}
,
_.prototype.complete = function () {
return !(this.backgroundShader && !this.backgroundShader.complete()) && this.specularTexture.complete()
}
,
D.expDecay = function (e, t) {
return Math.exp(-.69314718 / e * t)
}
,
D.prototype.update = function (e) {
var t = .001 * (Date.now() - this.timestamp);
this.timestamp = Date.now();
for (var i = !1, s = 0; s < this.stripCount; ++s) {
var n = this.selectedStrip == this.STRIP_MENU ? .3 * (s + 1) - .9 : this.selectedStrip < 0 || s < this.selectedStrip ? -2 : 2;
if (e)
this.strips[s] = n;
else {
var r = (r = n - this.strips[s]) * D.expDecay(.05, t);
this.animationActive && (this.strips[s] = n - r),
i = i || .001 < Math.abs(r)
}
}
this.animationActive = i
}
,
D.prototype.active = function () {
return this.selectedStrip >= this.STRIP_MENU
}
,
D.prototype.activeFade = function () {
var e;
return (e = 1 < (e = (this.strips[this.stripCount - 1] - -2) / (.3 * this.stripCount - .9 - -2)) ? 1 : e) < 0 ? 0 : e
}
,
D.prototype.activeWireframe = function () {
return this.active() && .01 < Math.abs(this.strips[4] - this.strips[3])
}
,
D.prototype.toggleMenu = function () {
this.selectedStrip = this.selectedStrip == this.STRIP_MENU ? this.STRIP_NONE : this.STRIP_MENU
}
,
D.prototype.selectStrip = function (e, t) {
if (this.selectedStrip == this.STRIP_MENU) {
var i = e + t * this.stripSlant;
this.selectedStrip = this.STRIP_NONE;
for (var s = 0; s < this.stripCount; ++s)
if (i < this.strips[s]) {
this.selectedStrip = s;
break
}
} else
this.selectedStrip = this.STRIP_MENU
}
,
U.prototype.loadImage = function (e, t) {
var i = this.gl;
e && e.width && e.height && (this.desc.width = e.width,
this.desc.height = e.height),
this.id = i.createTexture(),
i.bindTexture(this.type, this.id),
this.format = t || i.RGBA,
this.componentType = i.UNSIGNED_BYTE,
i.pixelStorei(i.UNPACK_FLIP_Y_WEBGL, !0),
i.texImage2D(this.type, 0, this.format, this.format, this.componentType, e),
this.setParams(),
i.bindTexture(this.type, null)
}
,
U.prototype.loadArray = function (e, t, i) {
var s = this.gl;
this.id = s.createTexture(),
s.bindTexture(this.type, this.id),
this.format = t || s.RGBA,
this.componentType = i || s.UNSIGNED_BYTE,
s.pixelStorei(s.UNPACK_FLIP_Y_WEBGL, !0),
s.texImage2D(this.type, 0, this.format, this.desc.width, this.desc.height, 0, this.format, this.componentType, e || null),
this.setParams(),
s.bindTexture(this.type, null)
}
,
U.prototype.setParams = function () {
var e = this.gl
, t = function (e) {
return 0 < e && 0 == (e & e - 1)
};
t(this.desc.width) && t(this.desc.height) || (this.desc.clamp = !0,
this.desc.mipmap = !1),
t = !this.desc.nofilter,
this.desc.mipmap ? (e.generateMipmap(this.type),
e.texParameteri(this.type, e.TEXTURE_MIN_FILTER, t ? e.LINEAR_MIPMAP_LINEAR : e.NEAREST_MIPMAP_NEAREST)) : e.texParameteri(this.type, e.TEXTURE_MIN_FILTER, t ? e.LINEAR : e.NEAREST),
e.texParameteri(this.type, e.TEXTURE_MAG_FILTER, t ? e.LINEAR : e.NEAREST),
(this.desc.clamp || this.desc.mirror) && (t = this.desc.clamp ? e.CLAMP_TO_EDGE : e.MIRRORED_REPEAT,
e.texParameteri(this.type, e.TEXTURE_WRAP_S, t),
e.texParameteri(this.type, e.TEXTURE_WRAP_T, t)),
this.desc.aniso && e.ext.textureAniso && e.texParameteri(this.type, e.ext.textureAniso.TEXTURE_MAX_ANISOTROPY_EXT, this.desc.aniso)
}
,
U.prototype.rebuildMips = function () {
this.desc.mipmap && (this.gl.bindTexture(this.type, this.id),
this.gl.generateMipmap(this.type))
}
,
U.prototype.copyColorBuffer = function () {
this.gl.bindTexture(this.type, this.id),
this.gl.copyTexSubImage2D(this.type, 0, 0, 0, 0, 0, this.desc.width, this.desc.height)
}
,
U.prototype.bind = function (e) {
if (e) {
var t = this.gl;
t.uniform1i(e.location, e.unit),
t.activeTexture(t.TEXTURE0 + e.unit),
t.bindTexture(this.type, this.id)
}
}
,
U.prototype.destroy = function () {
this.gl.deleteTexture(this.id),
this.id = null
}
,
U.prototype.complete = function () {
return !!this.id
}
,
N.prototype.fromURL = function (e, t) {
var i = this.cache[e];
if (void 0 !== i)
return i;
var s = new U(this.gl, t);
return C.fetchImage(e, function (e) {
s.loadImage(e)
}),
this.cache[e] = s
}
,
N.prototype.fromFile = function (e, t) {
if (!e)
return null;
var i = this.cache[e.name];
if (void 0 !== i)
return i;
var s = new U(this.gl, t);
return this.cache[e.name] = s,
N.parseFile(e, function (e) {
s.loadImage(e),
N.closeImage(e)
}),
s
}
,
N.prototype.fromFilesMergeAlpha = function (e, t, i) {
if (!t)
return this.fromFile(e, i);
var s = e.name + "|" + t.name
, n = this.cache[s];
if (void 0 !== n)
return n;
var r = this.gl;
this.blitShader || (this.blitShader = new F(this.gl),
this.blitShader.build("precision highp float; varying vec2 c; attribute vec2 pos; void main(){ gl_Position.xy = 2.0*pos-vec2(1.0); gl_Position.zw = vec2(0.5,1.0); c=pos; }", "precision highp float; varying vec2 c; uniform sampler2D tTex; void main(){ gl_FragColor=texture2D(tTex,c).rgbr; }"),
this.mergeVerts = r.createBuffer(),
r.bindBuffer(r.ARRAY_BUFFER, this.mergeVerts),
n = new Float32Array([0, 0, 2, 0, 0, 2]),
r.bufferData(r.ARRAY_BUFFER, n, r.STATIC_DRAW),
r.bindBuffer(r.ARRAY_BUFFER, null));
var a = function (e) {
this.blitShader.bind(),
e.bind(this.blitShader.samplers.tTex),
r.bindBuffer(r.ARRAY_BUFFER, this.mergeVerts),
r.enableVertexAttribArray(this.blitShader.attribs.pos),
r.vertexAttribPointer(this.blitShader.attribs.pos, 2, r.FLOAT, !1, 0, 0),
r.drawArrays(r.TRIANGLES, 0, 3),
r.disableVertexAttribArray(this.blitShader.attribs.pos),
r.bindBuffer(r.ARRAY_BUFFER, null)
}
.bind(this)
, o = new U(this.gl, i);
this.cache[s] = o;
var h = 0
, l = 0
, d = function () {
if (h && l) {
var e, t;
if (t = l.width * l.height > h.width * h.height ? (e = l.width,
l.height) : (e = h.width,
h.height),
o.desc.width = e,
o.desc.height = t,
e <= r.limits.viewportSizes[0] && t <= r.limits.viewportSizes[1]) {
var i = {
clamp: !0
};
h.width == e && h.height == t ? (o.loadImage(h, r.RGBA),
e = new m(r, {
color0: o,
ignoreStatus: !0
}),
N.closeImage(h)) : ((t = new U(r, i)).loadImage(h, r.RGB),
N.closeImage(h),
o.loadArray(null),
(e = new m(r, {
color0: o,
ignoreStatus: !0
})).bind(),
a(t),
t.destroy()),
(t = new U(r, i)).loadImage(l, r.RGB),
N.closeImage(l),
e.bind(),
r.colorMask(!1, !1, !1, !0),
a(t),
r.colorMask(!0, !0, !0, !0),
t.destroy(),
m.bindNone(r),
o.rebuildMips()
} else {
(i = document.createElement("canvas")).width = e,
i.height = t;
var s = i.getContext("2d");
for (s.drawImage(h, 0, 0),
N.closeImage(h),
i = s.getImageData(0, 0, e, t),
i = new Uint8Array(i.data.buffer, i.data.byteOffset, i.data.length),
s.drawImage(l, 0, 0),
N.closeImage(l),
s = s.getImageData(0, 0, e, t).data,
e = e * t * 4,
t = 0; t < e; t += 4)
i[t + 3] = s[t];
o.loadArray(i)
}
N.closeImage(l)
}
}
.bind(this);
return N.parseFile(e, function (e) {
h = e,
d()
}),
N.parseFile(t, function (e) {
l = e,
d()
}),
o
}
,
N.parseFile = function (e, t, i) {
var s = i || new Image;
if ("undefined" != typeof URL && void 0 !== URL.createObjectURL) {
e = new Blob([e.data], {
type: e.type
});
var n = URL.createObjectURL(e);
s.onload = function () {
URL.revokeObjectURL(n),
t && t(s)
}
,
s.src = n
} else {
e = new Blob([e.data], {
type: e.type
});
var r = new FileReader;
r.onload = function (e) {
s.src = r.result
}
,
s.onload = function () {
t && t(s)
}
,
r.readAsDataURL(e)
}
}
,
N.closeImage = function (e) {
e && 256 < e.width * e.height && (e.onload = null,
e.onerror = null,
e.src = "data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs%3D")
}
,
z.prototype.setBackground3x1 = function (e, t, i, s) {
var n = 8 / this.controlRect.getScreenHeight();
this.backgroundControl = e.addTextButton("", 0, (1 - n) / 2, 1, n, 1),
this.backgroundControl.defaultAlpha = 1,
this.backgroundControl.setBackground3x1(e, 0, 0, t, i, s, 4),
this.backgroundControl.controlRect.xPercent = this.controlRect.xPercent,
this.backgroundControl.controlRect.widthPercent = this.controlRect.widthPercent,
this.controlRect.linkedControl.style.zIndex = "3",
this.setupCallbacks()
}
,
z.prototype.setSize = function (e, t) {
this.pixelsX = e;
var i = 24 / (this.pixelsY = t);
this.knobWidthPercent = 24 / e,
this.knobControlRect.xPercent = .5 - this.knobWidthPercent / 2,
this.knobControlRect.yPercent = (1 - i) / 2 + -1 / t,
this.knobControlRect.widthPercent = this.knobWidthPercent,
this.knobControlRect.heightPercent = i,
this.controlRect.updateElement(),
this.backgroundControl.controlRect.xPercent = this.controlRect.xPercent,
this.backgroundControl.controlRect.widthPercent = this.controlRect.widthPercent,
this.backgroundControl.controlRect.updateElement()
}
,
z.prototype.setSliderPercent = function (e) {
e < 0 && (e = 0),
1 < e && (e = 1),
this.sliderPercent = e,
this.knobControlRect.xPercent = e - this.knobWidthPercent / 2,
this.knobControlRect.updateElement()
}
,
z.prototype.setupCallbacks = function () {
var e = function (e) {
if (this.draggingSlider) {
var t = this.backgroundControl.controlRect.linkedControl.getBoundingClientRect();
this.setSliderPercent((e.clientX - t.left) / t.width),
this.guiScreen.ui.viewer.scene.sceneAnimator.setAnimationProgress(this.sliderPercent, !0),
this.guiScreen.ui.viewer.scene.sceneAnimator.paused && (this.guiScreen.ui.viewer.scene.postRender.discardAAHistory(),
this.guiScreen.ui.viewer.reDrawScene())
}
}
.bind(this)
, t = function (e) {
this.draggingSlider = !0;
var t = this.backgroundControl.controlRect.linkedControl.getBoundingClientRect();
this.setSliderPercent((e.clientX - t.left) / t.width),
this.guiScreen.ui.viewer.scene.sceneAnimator.setAnimationProgress(this.sliderPercent, !0),
this.guiScreen.ui.viewer.scene.sceneAnimator.lockPlayback = !0,
this.guiScreen.ui.viewer.scene.sceneAnimator.paused && (this.guiScreen.ui.viewer.scene.postRender.discardAAHistory(),
this.guiScreen.ui.viewer.reDrawScene())
}
.bind(this)
, i = function (e) {
this.draggingSlider = !1,
this.guiScreen.ui.viewer.scene.sceneAnimator.lockPlayback = !1
}
.bind(this);
this.guiScreen.ui.viewer.input.element.addEventListener("mousemove", e),
this.guiScreen.ui.viewer.input.element.addEventListener("mouseup", i),
this.backgroundControl.controlRect.linkedControl.addEventListener("mousemove", e),
this.backgroundControl.controlRect.linkedControl.addEventListener("mousedown", t),
this.backgroundControl.controlRect.linkedControl.addEventListener("mouseup", i),
this.controlRect.linkedControl.addEventListener("mouseup", i)
}
,
j.prototype.setSize = function (e, t) {
this.container.width = 0 | e,
this.container.height = 0 | t,
this.container.style.width = e + "px",
this.container.style.height = t + "px",
this.guiScreen.setSize(this.container.width, this.container.height)
}
,
j.prototype.clearView = function () {
for (; this.container.hasChildNodes();)
this.container.removeChild(this.container.childNodes[0]);
delete this.progressBar,
delete this.thumbnail,
delete this.fadeThumbnail,
delete this.playButton,
delete this.helpOverlay
}
,
j.prototype.bindInput = function (i) {
i.onSingleTap.push(function (e, t) {
this.stripData.selectedStrip != this.stripData.STRIP_NONE && (e = 2 / i.element.clientWidth * e - 1,
t = 1 - 2 / i.element.clientHeight * t,
this.stripData.selectStrip(e, t),
this.stripData.selectedStrip == this.stripData.STRIP_MENU && this.helpOverlay.active && this.helpOverlay.toggle(),
this.refreshUI(),
this.viewer.wake())
}
.bind(this))
}
,
j.sanitize = function (e) {
return e ? e.replace(/<|>|\(|\)|$|%|=/g, "") : e
}
,
j.sanitizeURL = function (e) {
return e ? 0 == e.indexOf("http://") || 0 == e.indexOf("https://") || 0 == e.indexOf("ftp://") ? encodeURI(e) : "http://" + encodeURI(e) : e
}
,
j.prototype.showFailure = function (e, t) {
this.container.innerHTML = "";
var i = document.createElement("canvas")
, s = this.container.width / this.container.height;
i.width = 100,
i.height = i.height * s | 0,
i.style.position = "absolute",
i.style["z-index"] = "0",
i.style.width = i.style.height = "100%";
var n = i.getContext("2d")
, r = n.fillStyle = n.createRadialGradient(i.width / 2, i.height / 2, (i.width + i.height) / 2, i.width / 2, i.height / 2, 0);
r.addColorStop(0, "rgb(0,0,0)"),
r.addColorStop(1, "rgb(35,60,80)"),
n.fillStyle = r,
n.fillRect(0, 0, i.width, i.height),
this.container.appendChild(i);
var a = document.createElement("div");
dom.addClass(a, "error"),
a.style["background-image"] = "url(images/errorBG.png)";
var o = '
转换模型时出错
错误信息: ' + (e || "文件无效(ERROR)请检查您所上传的文件以确定其稳定性") + '
您可以联系我们的客服、或点击视频教程获取更详细的上传解说
4Dweb将全程为您提供最优质的模型展示