From 81bc116c4db70ddda1d2297c87fde9f7eed2d2c2 Mon Sep 17 00:00:00 2001
From: dsehnal <david.sehnal@gmail.com>
Date: Thu, 8 Apr 2021 09:49:35 +0200
Subject: [PATCH] TextureImage.filter

---
 src/examples/basic-wrapper/custom-theme.ts | 1 +
 src/mol-geo/geometry/color-data.ts         | 4 ++--
 src/mol-gl/renderable/schema.ts            | 2 +-
 src/mol-gl/renderable/util.ts              | 2 ++
 src/mol-gl/webgl/texture.ts                | 3 +++
 src/mol-theme/color.ts                     | 2 ++
 6 files changed, 11 insertions(+), 3 deletions(-)

diff --git a/src/examples/basic-wrapper/custom-theme.ts b/src/examples/basic-wrapper/custom-theme.ts
index 583e1a774..b229de3f2 100644
--- a/src/examples/basic-wrapper/custom-theme.ts
+++ b/src/examples/basic-wrapper/custom-theme.ts
@@ -24,6 +24,7 @@ export function CustomColorTheme(
             return ((t * scale) | 0) as Color;
         },
         palette: {
+            filter: 'nearest',
             colors: [
                 ColorNames.red,
                 ColorNames.pink,
diff --git a/src/mol-geo/geometry/color-data.ts b/src/mol-geo/geometry/color-data.ts
index 63aab0939..5c8c3c0bf 100644
--- a/src/mol-geo/geometry/color-data.ts
+++ b/src/mol-geo/geometry/color-data.ts
@@ -159,7 +159,7 @@ function createVertexInstanceColor(locationIt: LocationIterator, color: Location
 function updatePaletteTexture(palette: ColorTheme.Palette, cell: ValueCell<TextureImage<Uint8Array>>) {
     let isSynced = true;
     const texture = cell.ref.value;
-    if (palette.colors.length !== texture.width) {
+    if (palette.colors.length !== texture.width || texture.filter !== palette.filter) {
         isSynced = false;
     } else {
         const data = texture.array;
@@ -184,5 +184,5 @@ function updatePaletteTexture(palette: ColorTheme.Palette, cell: ValueCell<Textu
         array[o++] = b;
     }
 
-    ValueCell.update(cell, { array, height: 1, width: palette.colors.length });
+    ValueCell.update(cell, { array, height: 1, width: palette.colors.length, filter: palette.filter });
 }
\ No newline at end of file
diff --git a/src/mol-gl/renderable/schema.ts b/src/mol-gl/renderable/schema.ts
index 89d2d2b14..8f0b00b72 100644
--- a/src/mol-gl/renderable/schema.ts
+++ b/src/mol-gl/renderable/schema.ts
@@ -185,7 +185,7 @@ export const ColorSchema = {
     uColor: UniformSpec('v3', 'material'),
     uColorTexDim: UniformSpec('v2'),
     tColor: TextureSpec('image-uint8', 'rgb', 'ubyte', 'nearest'),
-    tPalette: TextureSpec('image-uint8', 'rgb', 'ubyte', 'linear'),
+    tPalette: TextureSpec('image-uint8', 'rgb', 'ubyte', 'nearest'),
     dColorType: DefineSpec('string', ['uniform', 'attribute', 'instance', 'group', 'groupInstance', 'vertex', 'vertexInstance']),
     dUsePalette: DefineSpec('boolean'),
 } as const;
diff --git a/src/mol-gl/renderable/util.ts b/src/mol-gl/renderable/util.ts
index fb4caa06c..c732f4ca0 100644
--- a/src/mol-gl/renderable/util.ts
+++ b/src/mol-gl/renderable/util.ts
@@ -7,6 +7,7 @@
 import { Sphere3D } from '../../mol-math/geometry';
 import { Vec3, Mat4 } from '../../mol-math/linear-algebra';
 import { BoundaryHelper } from '../../mol-math/geometry/boundary-helper';
+import { TextureFilter } from '../webgl/texture';
 
 export function calculateTextureInfo (n: number, itemSize: number) {
     n = Math.max(n, 2); // observed issues with 1 pixel textures
@@ -22,6 +23,7 @@ export interface TextureImage<T extends Uint8Array | Float32Array | Int32Array>
     readonly width: number
     readonly height: number
     readonly flipY?: boolean
+    readonly filter?: TextureFilter
 }
 
 export interface TextureVolume<T extends Uint8Array | Float32Array> {
diff --git a/src/mol-gl/webgl/texture.ts b/src/mol-gl/webgl/texture.ts
index 7220f6751..042d931bd 100644
--- a/src/mol-gl/webgl/texture.ts
+++ b/src/mol-gl/webgl/texture.ts
@@ -283,6 +283,9 @@ export function createTexture(gl: GLRenderingContext, extensions: WebGLExtension
             gl.bindTexture(gl.TEXTURE_2D, texture);
             gl.texImage2D(gl.TEXTURE_2D, 0, internalFormat, format, type, data);
         } else if (isTexture2d(data, target, gl)) {
+            const _filter = data.filter ? getFilter(gl, data.filter) : filter;
+            gl.texParameteri(target, gl.TEXTURE_MAG_FILTER, _filter);
+            gl.texParameteri(target, gl.TEXTURE_MIN_FILTER, _filter);
             gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, !!data.flipY);
             if (sub) {
                 gl.texSubImage2D(target, 0, 0, 0, data.width, data.height, format, type, data.array);
diff --git a/src/mol-theme/color.ts b/src/mol-theme/color.ts
index 6ca6ee7af..82515bbee 100644
--- a/src/mol-theme/color.ts
+++ b/src/mol-theme/color.ts
@@ -35,6 +35,7 @@ import { OperatorHklColorThemeProvider } from './color/operator-hkl';
 import { PartialChargeColorThemeProvider } from './color/partial-charge';
 import { AtomIdColorThemeProvider } from './color/atom-id';
 import { EntityIdColorThemeProvider } from './color/entity-id';
+import { TextureFilter } from '../mol-gl/webgl/texture';
 
 export type LocationColor = (location: Location, isSecondary: boolean) => Color
 
@@ -62,6 +63,7 @@ namespace ColorTheme {
     }
 
     export interface Palette {
+        filter?: TextureFilter,
         colors: Color[]
     }
 
-- 
GitLab