From 3a68f977ac85be392e515a7da1be1b61353e7a4a Mon Sep 17 00:00:00 2001
From: Alexander Rose <alex.rose@rcsb.org>
Date: Thu, 10 Jan 2019 17:08:46 -0800
Subject: [PATCH] shader refactoring: size assignment, matrix-scale, transpose

---
 src/mol-gl/shader/chunks/assign-size.glsl     | 11 +++++++
 src/mol-gl/shader/chunks/common.glsl          | 32 ++++++++++++++++++-
 .../shader/chunks/size-vert-params.glsl       |  8 +++++
 src/mol-gl/shader/mesh.vert                   |  1 -
 src/mol-gl/shader/points.vert                 | 24 ++------------
 src/mol-gl/shader/utils/matrix-scale.glsl     | 12 +++++++
 src/mol-gl/shader/utils/transpose.glsl        | 26 ---------------
 7 files changed, 64 insertions(+), 50 deletions(-)
 create mode 100644 src/mol-gl/shader/chunks/assign-size.glsl
 create mode 100644 src/mol-gl/shader/chunks/size-vert-params.glsl
 create mode 100644 src/mol-gl/shader/utils/matrix-scale.glsl
 delete mode 100644 src/mol-gl/shader/utils/transpose.glsl

diff --git a/src/mol-gl/shader/chunks/assign-size.glsl b/src/mol-gl/shader/chunks/assign-size.glsl
new file mode 100644
index 000000000..e40ee951b
--- /dev/null
+++ b/src/mol-gl/shader/chunks/assign-size.glsl
@@ -0,0 +1,11 @@
+#if defined(dSizeType_uniform)
+    float size = uSize;
+#elif defined(dSizeType_attribute)
+    float size = aSize;
+#elif defined(dSizeType_instance)
+    float size = readFromTexture(tSize, aInstance, uSizeTexDim).r;
+#elif defined(dSizeType_group)
+    float size = readFromTexture(tSize, aGroup, uSizeTexDim).r;
+#elif defined(dSizeType_groupInstance)
+    float size = readFromTexture(tSize, aInstance * float(uGroupCount) + aGroup, uSizeTexDim).r;
+#endif
\ No newline at end of file
diff --git a/src/mol-gl/shader/chunks/common.glsl b/src/mol-gl/shader/chunks/common.glsl
index cea7b801c..df1d23ec5 100644
--- a/src/mol-gl/shader/chunks/common.glsl
+++ b/src/mol-gl/shader/chunks/common.glsl
@@ -1,2 +1,32 @@
 float intDiv(float a, float b) { return float(int(a) / int(b)); }
-float intMod(float a, float b) { return a - b * float(int(a) / int(b)); }
\ No newline at end of file
+float intMod(float a, float b) { return a - b * float(int(a) / int(b)); }
+
+#if __VERSION__ != 300
+    float transpose(const in float m) {
+        return m;
+    }
+
+    mat2 transpose(const in mat2 m) {
+        return mat2(
+            m[0][0], m[1][0],
+            m[0][1], m[1][1]
+        );
+    }
+
+    mat3 transpose(const in mat3 m) {
+        return mat3(
+            m[0][0], m[1][0], m[2][0],
+            m[0][1], m[1][1], m[2][1],
+            m[0][2], m[1][2], m[2][2]
+        );
+    }
+
+    mat4 transpose(const in mat4 m) {
+        return mat4(
+            m[0][0], m[1][0], m[2][0], m[3][0],
+            m[0][1], m[1][1], m[2][1], m[3][1],
+            m[0][2], m[1][2], m[2][2], m[3][2],
+            m[0][3], m[1][3], m[2][3], m[3][3]
+        );
+    }
+#endif
\ No newline at end of file
diff --git a/src/mol-gl/shader/chunks/size-vert-params.glsl b/src/mol-gl/shader/chunks/size-vert-params.glsl
new file mode 100644
index 000000000..763815b67
--- /dev/null
+++ b/src/mol-gl/shader/chunks/size-vert-params.glsl
@@ -0,0 +1,8 @@
+#if defined(dSizeType_uniform)
+    uniform float uSize;
+#elif defined(dSizeType_attribute)
+    attribute float aSize;
+#elif defined(dSizeType_instance) || defined(dSizeType_group) || defined(dSizeType_groupInstance)
+    uniform vec2 uSizeTexDim;
+    uniform sampler2D tSize;
+#endif
\ No newline at end of file
diff --git a/src/mol-gl/shader/mesh.vert b/src/mol-gl/shader/mesh.vert
index b3f1a9430..02a93045c 100644
--- a/src/mol-gl/shader/mesh.vert
+++ b/src/mol-gl/shader/mesh.vert
@@ -21,7 +21,6 @@ attribute float aGroup;
 #endif
 
 #pragma glslify: inverse = require(./utils/inverse.glsl)
-#pragma glslify: transpose = require(./utils/transpose.glsl)
 
 void main(){
     #pragma glslify: import('./chunks/assign-color-varying.glsl')
diff --git a/src/mol-gl/shader/points.vert b/src/mol-gl/shader/points.vert
index 5340044c2..2504f1733 100644
--- a/src/mol-gl/shader/points.vert
+++ b/src/mol-gl/shader/points.vert
@@ -9,20 +9,11 @@ precision highp int;
 
 #pragma glslify: import('./chunks/common-vert-params.glsl')
 #pragma glslify: import('./chunks/color-vert-params.glsl')
+#pragma glslify: import('./chunks/size-vert-params.glsl')
 
 uniform float uPixelRatio;
 uniform float uViewportHeight;
 
-#if defined(dSizeType_uniform)
-    uniform float uSize;
-#elif defined(dSizeType_attribute)
-    attribute float aSize;
-#elif defined(dSizeType_instance) || defined(dSizeType_group) || defined(dSizeType_groupInstance)
-    varying vec4 vSize;
-    uniform vec2 uSizeTexDim;
-    uniform sampler2D tSize;
-#endif
-
 attribute vec3 aPosition;
 attribute mat4 aTransform;
 attribute float aInstance;
@@ -31,18 +22,7 @@ attribute float aGroup;
 void main(){
     #pragma glslify: import('./chunks/assign-color-varying.glsl')
     #pragma glslify: import('./chunks/assign-position.glsl')
-
-    #if defined(dSizeType_uniform)
-        float size = uSize;
-    #elif defined(dSizeType_attribute)
-        float size = aSize;
-    #elif defined(dSizeType_instance)
-        float size = readFromTexture(tSize, aInstance, uSizeTexDim).r;
-    #elif defined(dSizeType_group)
-        float size = readFromTexture(tSize, aGroup, uSizeTexDim).r;
-    #elif defined(dSizeType_groupInstance)
-        float size = readFromTexture(tSize, aInstance * float(uGroupCount) + aGroup, uSizeTexDim).r;
-    #endif
+    #pragma glslify: import('./chunks/assign-size.glsl')
 
     #ifdef dPointSizeAttenuation
         gl_PointSize = size * uPixelRatio * ((uViewportHeight / 2.0) / -mvPosition.z) * 5.0;
diff --git a/src/mol-gl/shader/utils/matrix-scale.glsl b/src/mol-gl/shader/utils/matrix-scale.glsl
new file mode 100644
index 000000000..ee47bab5b
--- /dev/null
+++ b/src/mol-gl/shader/utils/matrix-scale.glsl
@@ -0,0 +1,12 @@
+/**
+ * Copyright (c) 2019 mol* contributors, licensed under MIT, See LICENSE file for more info.
+ *
+ * @author Alexander Rose <alexander.rose@weirdbyte.de>
+ */
+
+float matrixScale(in mat4 m){
+    vec4 r = m[0];
+    return sqrt(r[0] * r[0] + r[1] * r[1] + r[2] * r[2]);
+}
+
+#pragma glslify: export(matrixScale)
\ No newline at end of file
diff --git a/src/mol-gl/shader/utils/transpose.glsl b/src/mol-gl/shader/utils/transpose.glsl
deleted file mode 100644
index 5a2a3b714..000000000
--- a/src/mol-gl/shader/utils/transpose.glsl
+++ /dev/null
@@ -1,26 +0,0 @@
-// (c) 2014 Mikola Lysenko. MIT License
-// https://github.com/glslify/glsl-transpose
-
-float transpose(const in float m) {
-  return m;
-}
-
-mat2 transpose(const in mat2 m) {
-  return mat2(m[0][0], m[1][0],
-              m[0][1], m[1][1]);
-}
-
-mat3 transpose(const in mat3 m) {
-  return mat3(m[0][0], m[1][0], m[2][0],
-              m[0][1], m[1][1], m[2][1],
-              m[0][2], m[1][2], m[2][2]);
-}
-
-mat4 transpose(const in mat4 m) {
-  return mat4(m[0][0], m[1][0], m[2][0], m[3][0],
-              m[0][1], m[1][1], m[2][1], m[3][1],
-              m[0][2], m[1][2], m[2][2], m[3][2],
-              m[0][3], m[1][3], m[2][3], m[3][3]);
-}
-
-#pragma glslify: export(transpose)
\ No newline at end of file
-- 
GitLab