diff --git a/src/mol-gl/model.ts b/src/mol-gl/model.ts new file mode 100644 index 0000000000000000000000000000000000000000..8aaed7823053a5c123ca8ca8e3e1ba9b9bb7cc43 --- /dev/null +++ b/src/mol-gl/model.ts @@ -0,0 +1,57 @@ +/** + * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info. + * + * @author Alexander Rose <alexander.rose@weirdbyte.de> + */ + +import REGL = require('regl'); +import { Mat4, Quat, Vec3 } from 'mol-math/linear-algebra' +import { defaults } from 'mol-util'; + +const tmpMat4 = Mat4() + +type ModelProps = { + rotation?: Quat, + position?: Vec3, + scale?: Vec3 +} + +function createModel(regl: REGL.Regl, props: ModelProps = {}) { + const transform = Mat4.identity() + + const rotation = defaults(props.rotation, Quat.identity()) + const position = defaults(props.position, Vec3.zero()) + const scale = defaults(props.scale, Vec3.create(1, 1, 1)) + + const draw = regl({ + context: { transform, rotation, position, scale }, + + uniforms: { + model(ctx: REGL.DefaultContext, props: any = {}) { + const model = Mat4.identity() + + if ('rotation' in props) Quat.copy(rotation, props.rotation) + if ('position' in props) Vec3.copy(position, props.position) + if ('scale' in props) Vec3.copy(scale, props.scale) + + Mat4.translate(model, model, position) + Mat4.mul(model, model, Mat4.fromQuat(tmpMat4, rotation)) + Mat4.scale(model, model, scale) + + if ('transform' in props) Mat4.mul(model, props.transform, model) + Mat4.copy(transform, model) + + return model + } + } + }) + + return Object.assign(draw, { + get transform() { return transform }, + get position() { return position }, + get rotation() { return rotation }, + get scale() { return scale }, + }) +} + +export default createModel \ No newline at end of file