Browse Source

simple model matrix injector

Alexander Rose 7 years ago
parent
commit
8cf68aeb1a
1 changed files with 57 additions and 0 deletions
  1. 57 0
      src/mol-gl/model.ts

+ 57 - 0
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