react-jsc3d
Version:
React port of JSC3D software 3D mesh renderer
204 lines (162 loc) • 7.29 kB
JavaScript
;
exports.__esModule = true;
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _propTypes = require('prop-types');
var _propTypes2 = _interopRequireDefault(_propTypes);
var _jsc3d = require('../lib/jsc3d.js');
var _jsc3d2 = _interopRequireDefault(_jsc3d);
require('./Jsc3dViewer.css');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var JSC3D_PROPS = ['SceneUrl', 'InitRotationX', 'InitRotationY', 'InitRotationZ', 'ModelColor', 'BackgroundColor1', 'BackgroundColor2', 'BackgroundImageUrl', 'Background', 'RenderMode', 'Definition', 'FaceCulling', 'MipMapping', 'CreaseAngle', 'SphereMapUrl', 'ProgressBar', 'Renderer', 'LocalBuffers'];
function lowerFirst(str) {
return str.substr(0, 1).toLowerCase() + str.substr(1);
}
var dimensionPropType = _propTypes2.default.oneOfType([_propTypes2.default.number, _propTypes2.default.oneOf(['auto'])]);
var MIN = -180;
var MAX = 180;
function degreesPropType(props, propName, componentName) {
if (props[propName] < MIN || props[propName] > MAX) {
return new Error(propName + ' invalid on ' + componentName);
}
}
function colorPropType(props, propName, componentName) {
var val = props[propName];
if (!val.match || !val.match(/^#[a-f]{6}$/i)) {
return new Error(propName + ' invalid on ' + componentName);
}
}
var Jsc3dViewer = function (_Component) {
_inherits(Jsc3dViewer, _Component);
function Jsc3dViewer() {
_classCallCheck(this, Jsc3dViewer);
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
var _this = _possibleConstructorReturn(this, _Component.call.apply(_Component, [this].concat(args)));
_this.viewer = null;
return _this;
}
Jsc3dViewer.prototype._setProps = function _setProps(props) {
// Assign all props
for (var _iterator = JSC3D_PROPS, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
var _ref;
if (_isArray) {
if (_i >= _iterator.length) break;
_ref = _iterator[_i++];
} else {
_i = _iterator.next();
if (_i.done) break;
_ref = _i.value;
}
var paramName = _ref;
var propName = lowerFirst(paramName);
if (propName in props) {
var value = Jsc3dViewer.transformValue(props[propName]);
this.viewer.setParameter(paramName, value);
}
}
// Ensure it fills max height if auto is specified
var _wrapper = this.wrapper,
clientWidth = _wrapper.clientWidth,
clientHeight = _wrapper.clientHeight;
var height = props.height,
width = props.width,
mouse = props.mouse;
this.canvas.height = height === 'auto' ? clientHeight : height;
this.canvas.width = width === 'auto' ? clientWidth : width;
if (mouse === false) {
this.viewer.enableDefaultInputHandler(false);
} else {
this.viewer.setMouseUsage(mouse);
this.viewer.enableDefaultInputHandler(true);
}
};
Jsc3dViewer.transformValue = function transformValue(value) {
if (value === true) {
return 'on';
} else if (value === false) {
return 'off';
} else {
return value;
}
};
Jsc3dViewer.prototype.componentDidMount = function componentDidMount() {
this.viewer = new _jsc3d2.default.Viewer(this.canvas);
this._setProps(this.props);
this.viewer.init();
};
Jsc3dViewer.prototype.shouldComponentUpdate = function shouldComponentUpdate(nextProps, nextState) {
// Set new props
this._setProps(nextProps);
if (nextProps.sceneUrl !== this.props.sceneUrl) {
// Entirely new URL, should re-init
this.viewer.init();
}
return false;
};
Jsc3dViewer.prototype.componentWillUnmount = function componentWillUnmount() {
// TODO
};
Jsc3dViewer.prototype.render = function render() {
var _this2 = this;
var style = {};
return _react2.default.createElement(
'div',
{ className: 'Jsc3dViewer', ref: function ref(div) {
_this2.wrapper = div;
} },
_react2.default.createElement('canvas', {
ref: function ref(canvas) {
_this2.canvas = canvas;
},
style: style })
);
};
return Jsc3dViewer;
}(_react.Component);
Jsc3dViewer.propTypes = process.env.NODE_ENV !== "production" ? {
sceneUrl: _propTypes2.default.string.isRequired,
height: dimensionPropType,
width: dimensionPropType,
initRotationX: degreesPropType,
initRotationY: degreesPropType,
initRotationZ: degreesPropType,
modelColor: colorPropType,
backgroundColor1: colorPropType,
backgroundColor2: colorPropType,
backgroundImageUrl: _propTypes2.default.string,
background: _propTypes2.default.bool,
renderMode: _propTypes2.default.oneOf(['point', 'wireframe', 'flat', 'smooth', 'texture', 'textureflat', 'texturesmooth']),
definition: _propTypes2.default.oneOf(['low', 'high', 'standard']),
faceCulling: _propTypes2.default.bool,
mipMapping: _propTypes2.default.bool,
creaseAngle: _propTypes2.default.number,
sphereMapUrl: _propTypes2.default.string,
progressBar: _propTypes2.default.bool,
renderer: _propTypes2.default.oneOf(['webgl', '']),
localBuffers: _propTypes2.default.oneOf(['release', 'retain']),
mouse: _propTypes2.default.oneOf([false, 'rotate', 'zoom', 'pan'])
} : {};
Jsc3dViewer.defaultProps = {
height: 'auto',
width: 'auto',
initRotationX: 45,
initRotationY: -45,
initRotationZ: -135,
background: false,
modelColor: '#ffffff',
backgroundColor1: '#ffffff',
backgroundColor2: '#ffffff',
backgroundImageUrl: '',
progressBar: false,
renderMode: 'flat',
renderer: 'webgl',
definition: 'high',
mouse: 'rotate'
};
exports.default = Jsc3dViewer;
module.exports = exports['default'];