UNPKG

gl-react-dom

Version:

DOM implementation of gl-react, an universal React library to write and compose WebGL shaders

260 lines (210 loc) 9.79 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _react = _interopRequireWildcard(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _invariant = _interopRequireDefault(require("invariant")); var _getContext = _interopRequireDefault(require("./getContext")); var _loseGL = _interopRequireDefault(require("./loseGL")); const _excluded = ["width", "height", "pixelRatio", "style", "debug", "version"]; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } const __DEV__ = process.env.NODE_ENV === "development"; /** * WebGL context initial options. */ const propTypes = { onContextCreate: _propTypes.default.func.isRequired, onContextFailure: _propTypes.default.func.isRequired, onContextLost: _propTypes.default.func.isRequired, onContextRestored: _propTypes.default.func.isRequired, webglContextAttributes: _propTypes.default.object, width: _propTypes.default.number.isRequired, height: _propTypes.default.number.isRequired, style: _propTypes.default.object, pixelRatio: _propTypes.default.number, version: _propTypes.default.string }; class ErrorDebug extends _react.Component { render() { const { error } = this.props; let title = String(error.rawError || error.message || error); let detail = String(error.longMessage || error.rawError || ""); const style = { width: "100%", height: "100%", position: "absolute", top: 0, left: 0, padding: "1em", background: "#a00", color: "#fff", fontSize: "12px", lineHeight: "1.2em", fontStyle: "normal", fontWeight: "normal", fontFamily: "monospace", overflow: "auto" }; const titleStyle = { fontWeight: "bold", marginBottom: "1em" }; const detailStyle = { whiteSpace: "pre" }; return /*#__PURE__*/_react.default.createElement("div", { style: style }, /*#__PURE__*/_react.default.createElement("div", { style: titleStyle }, title), /*#__PURE__*/_react.default.createElement("div", { style: detailStyle }, detail)); } } class GLViewDOM extends _react.Component { constructor(...args) { super(...args); _defineProperty(this, "state", { error: null }); _defineProperty(this, "webglContextAttributes", void 0); _defineProperty(this, "canvas", void 0); _defineProperty(this, "gl", void 0); _defineProperty(this, "_onContextLost", e => { e.preventDefault(); this.gl = null; this.props.onContextLost(); }); _defineProperty(this, "_onContextRestored", () => { this.gl = this._createContext(); this.props.onContextRestored(this.gl); }); _defineProperty(this, "onRef", ref => { this.canvas = ref; }); _defineProperty(this, "debugError", !__DEV__ ? null : error => { this.setState({ error }); }); _defineProperty(this, "afterDraw", !__DEV__ ? null : () => { if (this.state.error) { this.setState({ error: null }); } }); } componentDidMount() { const { onContextCreate, onContextFailure } = this.props; const gl = this._createContext(); if (gl) { this.gl = gl; onContextCreate(gl); const { canvas } = this; (0, _invariant.default)(canvas, "canvas is not settled in GLViewDOM#componentDidMount"); canvas.addEventListener("webglcontextlost", this._onContextLost); canvas.addEventListener("webglcontextrestored", this._onContextRestored); } else { onContextFailure(new Error("no-webgl-context")); } } componentWillUnmount() { if (this.gl) { (0, _loseGL.default)(this.gl); this.gl = null; } const { canvas } = this; if (canvas) { canvas.removeEventListener("webglcontextlost", this._onContextLost); canvas.removeEventListener("webglcontextrestored", this._onContextRestored); } } render() { const { error } = this.state; let _this$props = this.props, { width, height, pixelRatio, style, debug, version } = _this$props, rest = _objectWithoutProperties(_this$props, _excluded); if (!pixelRatio) pixelRatio = Number(typeof window === "object" && window.devicePixelRatio || 1); for (let k in propTypes) { if (rest.hasOwnProperty(k)) { delete rest[k]; } } return /*#__PURE__*/_react.default.createElement("span", { style: _objectSpread(_objectSpread({ position: "relative" }, style), {}, { display: "inline-block", width, height }) }, /*#__PURE__*/_react.default.createElement("canvas", _extends({ ref: this.onRef, style: { width, height }, width: width * pixelRatio, height: height * pixelRatio }, rest)), error ? /*#__PURE__*/_react.default.createElement(ErrorDebug, { error: error }) : null); } _createContext() { const { webglContextAttributes, debug, version } = this.props; const gl = (0, _getContext.default)(this.canvas, debug ? _objectSpread(_objectSpread({}, webglContextAttributes), {}, { preserveDrawingBuffer: true }) : webglContextAttributes, version || "auto"); this.webglContextAttributes = webglContextAttributes || {}; return gl; } captureAsDataURL(...args) { if (!this.webglContextAttributes.preserveDrawingBuffer) { console.warn("Surface#captureAsDataURL is likely to not work if you don't define webglContextAttributes={{ preserveDrawingBuffer: true }}"); } (0, _invariant.default)(this.canvas, "canvas is no longer available"); return this.canvas.toDataURL(...args); } captureAsBlob(...args) { if (!this.webglContextAttributes.preserveDrawingBuffer) { console.warn("Surface#captureAsBlob is likely to not work if you don't define webglContextAttributes={{ preserveDrawingBuffer: true }}"); } return Promise.resolve().then(() => new Promise((resolve, reject) => this.canvas ? this.canvas.toBlob(resolve, ...args) : reject(new Error("canvas is no longer available")))); } } exports.default = GLViewDOM; _defineProperty(GLViewDOM, "propTypes", propTypes); //# sourceMappingURL=GLViewDOM.js.map