hpg-r3f-model-scene
Version:
Pretty Footer react component used in ant.design
198 lines (193 loc) • 7.82 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.KTX2Loader = void 0;
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper"));
var _three = require("three");
var _ktxParse = require("three/examples/jsm/libs/ktx-parse.module");
var _BasisTextureLoader = require("./BasisTextureLoader");
var _zstddec = require("three/examples/jsm/libs/zstddec.module");
/**
* Loader for KTX 2.0 GPU Texture containers.
*
* KTX 2.0 is a container format for various GPU texture formats. The loader
* supports Basis Universal GPU textures, which can be quickly transcoded to
* a wide variety of GPU texture compression formats. While KTX 2.0 also allows
* other hardware-specific formats, this loader does not yet parse them.
*
* This loader parses the KTX 2.0 container and then relies on
* THREE.BasisTextureLoader to complete the transcoding process.
*
* References:
* - KTX: http://github.khronos.org/KTX-Specification/
* - DFD: https://www.khronos.org/registry/DataFormat/specs/1.3/dataformat.1.3.html#basicdescriptor
*/
var KTX2Loader = /*#__PURE__*/function (_CompressedTextureLoa) {
(0, _inherits2.default)(KTX2Loader, _CompressedTextureLoa);
var _super = (0, _createSuper2.default)(KTX2Loader);
function KTX2Loader(manager) {
var _this;
(0, _classCallCheck2.default)(this, KTX2Loader);
_this = _super.call(this, manager);
_this.basisLoader = new _BasisTextureLoader.BasisTextureLoader(manager);
_this.zstd = new _zstddec.ZSTDDecoder();
_this.zstd.init();
if (typeof MSC_TRANSCODER !== 'undefined') {
console.warn('THREE.KTX2Loader: Please update to latest "basis_transcoder".' + ' "msc_basis_transcoder" is no longer supported in three.js r125+.');
}
return _this;
}
(0, _createClass2.default)(KTX2Loader, [{
key: "setTranscoderPath",
value: function setTranscoderPath(path) {
this.basisLoader.setTranscoderPath(path);
return this;
}
}, {
key: "setWorkerLimit",
value: function setWorkerLimit(path) {
this.basisLoader.setWorkerLimit(path);
return this;
}
}, {
key: "detectSupport",
value: function detectSupport(renderer) {
this.basisLoader.detectSupport(renderer);
return this;
}
}, {
key: "dispose",
value: function dispose() {
this.basisLoader.dispose();
return this;
}
}, {
key: "load",
value: function load(url, onLoad, onProgress, onError) {
var scope = this;
var texture = new _three.CompressedTexture();
var bufferPending = new Promise(function (resolve, reject) {
new _three.FileLoader(scope.manager).setPath(scope.path).setResponseType('arraybuffer').load(url, resolve, onProgress, reject);
});
bufferPending.then(function (buffer) {
scope.parse(buffer, function (_texture) {
texture.copy(_texture);
texture.needsUpdate = true;
if (onLoad) onLoad(texture);
}, onError);
}).catch(onError);
return texture;
}
}, {
key: "parse",
value: function parse(buffer, onLoad, onError) {
var scope = this;
var ktx = (0, _ktxParse.read)(new Uint8Array(buffer));
if (ktx.pixelDepth > 0) {
throw new Error('THREE.KTX2Loader: Only 2D textures are currently supported.');
}
if (ktx.layerCount > 1) {
throw new Error('THREE.KTX2Loader: Array textures are not currently supported.');
}
if (ktx.faceCount > 1) {
throw new Error('THREE.KTX2Loader: Cube textures are not currently supported.');
}
var dfd = KTX2Utils.getBasicDFD(ktx);
KTX2Utils.createLevels(ktx, this.zstd).then(function (levels) {
var basisFormat = dfd.colorModel === _ktxParse.KTX2Model.UASTC ? _BasisTextureLoader.BasisTextureLoader.BasisFormat.UASTC_4x4 : _BasisTextureLoader.BasisTextureLoader.BasisFormat.ETC1S;
var parseConfig = {
levels: levels,
width: ktx.pixelWidth,
height: ktx.pixelHeight,
basisFormat: basisFormat,
hasAlpha: KTX2Utils.getAlpha(ktx)
};
if (basisFormat === _BasisTextureLoader.BasisTextureLoader.BasisFormat.ETC1S) {
parseConfig.globalData = ktx.globalData;
}
return scope.basisLoader.parseInternalAsync(parseConfig);
}).then(function (texture) {
texture.encoding = dfd.transferFunction === _ktxParse.KTX2Transfer.SRGB ? _three.sRGBEncoding : _three.LinearEncoding;
texture.premultiplyAlpha = KTX2Utils.getPremultiplyAlpha(ktx);
onLoad(texture);
}).catch(onError);
return this;
}
}]);
return KTX2Loader;
}(_three.CompressedTextureLoader);
exports.KTX2Loader = KTX2Loader;
var KTX2Utils = {
createLevels: function () {
var _createLevels = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(ktx, zstd) {
var levels, width, height, levelIndex, levelWidth, levelHeight, levelData;
return _regenerator.default.wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
if (!(ktx.supercompressionScheme === _ktxParse.KTX2SupercompressionScheme.ZSTD)) {
_context.next = 3;
break;
}
_context.next = 3;
return zstd.init();
case 3:
levels = [];
width = ktx.pixelWidth;
height = ktx.pixelHeight;
for (levelIndex = 0; levelIndex < ktx.levels.length; levelIndex++) {
levelWidth = Math.max(1, Math.floor(width / Math.pow(2, levelIndex)));
levelHeight = Math.max(1, Math.floor(height / Math.pow(2, levelIndex)));
levelData = ktx.levels[levelIndex].levelData;
if (ktx.supercompressionScheme === _ktxParse.KTX2SupercompressionScheme.ZSTD) {
levelData = zstd.decode(levelData, ktx.levels[levelIndex].uncompressedByteLength);
}
levels.push({
index: levelIndex,
width: levelWidth,
height: levelHeight,
data: levelData
});
}
return _context.abrupt("return", levels);
case 8:
case "end":
return _context.stop();
}
}, _callee);
}));
function createLevels(_x, _x2) {
return _createLevels.apply(this, arguments);
}
return createLevels;
}(),
getBasicDFD: function getBasicDFD(ktx) {
// Basic Data Format Descriptor Block is always the first DFD.
return ktx.dataFormatDescriptor[0];
},
getAlpha: function getAlpha(ktx) {
var dfd = this.getBasicDFD(ktx);
// UASTC
if (dfd.colorModel === _ktxParse.KTX2Model.UASTC) {
if ((dfd.samples[0].channelID & 0xf) === _ktxParse.KTX2ChannelUASTC.RGBA) {
return true;
}
return false;
}
// ETC1S
if (dfd.samples.length === 2 && (dfd.samples[1].channelID & 0xf) === _ktxParse.KTX2ChannelETC1S.AAA) {
return true;
}
return false;
},
getPremultiplyAlpha: function getPremultiplyAlpha(ktx) {
var dfd = this.getBasicDFD(ktx);
return !!(dfd.flags & _ktxParse.KTX2Flags.ALPHA_PREMULTIPLIED);
}
};