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
JavaScript
"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