generated from lks/eframe_template_android
Add LUT and turbo colormap
This commit is contained in:
parent
c2c0cf7585
commit
7f6d5069f8
@ -4,6 +4,7 @@ use std::sync::Arc;
|
|||||||
|
|
||||||
mod waterfall;
|
mod waterfall;
|
||||||
use waterfall::Waterfall;
|
use waterfall::Waterfall;
|
||||||
|
pub mod turbo_colormap;
|
||||||
|
|
||||||
/// We derive Deserialize/Serialize so we can persist app state on shutdown.
|
/// We derive Deserialize/Serialize so we can persist app state on shutdown.
|
||||||
pub struct TemplateApp {
|
pub struct TemplateApp {
|
||||||
|
|||||||
46
src/app/turbo_colormap.rs
Normal file
46
src/app/turbo_colormap.rs
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
// Copyright 2019 Google LLC.
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
// Author: Anton Mikhailov
|
||||||
|
|
||||||
|
// The look-up tables contains 256 entries. Each entry is a an sRGB triplet.
|
||||||
|
|
||||||
|
pub const TURBO_SRGB_BYTES: [u8; 256 * 3] = [
|
||||||
|
48, 18, 59, 50, 21, 67, 51, 24, 74, 52, 27, 81, 53, 30, 88, 54, 33, 95, 55, 36, 102, 56, 39,
|
||||||
|
109, 57, 42, 115, 58, 45, 121, 59, 47, 128, 60, 50, 134, 61, 53, 139, 62, 56, 145, 63, 59, 151,
|
||||||
|
63, 62, 156, 64, 64, 162, 65, 67, 167, 65, 70, 172, 66, 73, 177, 66, 75, 181, 67, 78, 186, 68,
|
||||||
|
81, 191, 68, 84, 195, 68, 86, 199, 69, 89, 203, 69, 92, 207, 69, 94, 211, 70, 97, 214, 70, 100,
|
||||||
|
218, 70, 102, 221, 70, 105, 224, 70, 107, 227, 71, 110, 230, 71, 113, 233, 71, 115, 235, 71,
|
||||||
|
118, 238, 71, 120, 240, 71, 123, 242, 70, 125, 244, 70, 128, 246, 70, 130, 248, 70, 133, 250,
|
||||||
|
70, 135, 251, 69, 138, 252, 69, 140, 253, 68, 143, 254, 67, 145, 254, 66, 148, 255, 65, 150,
|
||||||
|
255, 64, 153, 255, 62, 155, 254, 61, 158, 254, 59, 160, 253, 58, 163, 252, 56, 165, 251, 55,
|
||||||
|
168, 250, 53, 171, 248, 51, 173, 247, 49, 175, 245, 47, 178, 244, 46, 180, 242, 44, 183, 240,
|
||||||
|
42, 185, 238, 40, 188, 235, 39, 190, 233, 37, 192, 231, 35, 195, 228, 34, 197, 226, 32, 199,
|
||||||
|
223, 31, 201, 221, 30, 203, 218, 28, 205, 216, 27, 208, 213, 26, 210, 210, 26, 212, 208, 25,
|
||||||
|
213, 205, 24, 215, 202, 24, 217, 200, 24, 219, 197, 24, 221, 194, 24, 222, 192, 24, 224, 189,
|
||||||
|
25, 226, 187, 25, 227, 185, 26, 228, 182, 28, 230, 180, 29, 231, 178, 31, 233, 175, 32, 234,
|
||||||
|
172, 34, 235, 170, 37, 236, 167, 39, 238, 164, 42, 239, 161, 44, 240, 158, 47, 241, 155, 50,
|
||||||
|
242, 152, 53, 243, 148, 56, 244, 145, 60, 245, 142, 63, 246, 138, 67, 247, 135, 70, 248, 132,
|
||||||
|
74, 248, 128, 78, 249, 125, 82, 250, 122, 85, 250, 118, 89, 251, 115, 93, 252, 111, 97, 252,
|
||||||
|
108, 101, 253, 105, 105, 253, 102, 109, 254, 98, 113, 254, 95, 117, 254, 92, 121, 254, 89, 125,
|
||||||
|
255, 86, 128, 255, 83, 132, 255, 81, 136, 255, 78, 139, 255, 75, 143, 255, 73, 146, 255, 71,
|
||||||
|
150, 254, 68, 153, 254, 66, 156, 254, 64, 159, 253, 63, 161, 253, 61, 164, 252, 60, 167, 252,
|
||||||
|
58, 169, 251, 57, 172, 251, 56, 175, 250, 55, 177, 249, 54, 180, 248, 54, 183, 247, 53, 185,
|
||||||
|
246, 53, 188, 245, 52, 190, 244, 52, 193, 243, 52, 195, 241, 52, 198, 240, 52, 200, 239, 52,
|
||||||
|
203, 237, 52, 205, 236, 52, 208, 234, 52, 210, 233, 53, 212, 231, 53, 215, 229, 53, 217, 228,
|
||||||
|
54, 219, 226, 54, 221, 224, 55, 223, 223, 55, 225, 221, 55, 227, 219, 56, 229, 217, 56, 231,
|
||||||
|
215, 57, 233, 213, 57, 235, 211, 57, 236, 209, 58, 238, 207, 58, 239, 205, 58, 241, 203, 58,
|
||||||
|
242, 201, 58, 244, 199, 58, 245, 197, 58, 246, 195, 58, 247, 193, 58, 248, 190, 57, 249, 188,
|
||||||
|
57, 250, 186, 57, 251, 184, 56, 251, 182, 55, 252, 179, 54, 252, 177, 54, 253, 174, 53, 253,
|
||||||
|
172, 52, 254, 169, 51, 254, 167, 50, 254, 164, 49, 254, 161, 48, 254, 158, 47, 254, 155, 45,
|
||||||
|
254, 153, 44, 254, 150, 43, 254, 147, 42, 254, 144, 41, 253, 141, 39, 253, 138, 38, 252, 135,
|
||||||
|
37, 252, 132, 35, 251, 129, 34, 251, 126, 33, 250, 123, 31, 249, 120, 30, 249, 117, 29, 248,
|
||||||
|
114, 28, 247, 111, 26, 246, 108, 25, 245, 105, 24, 244, 102, 23, 243, 99, 21, 242, 96, 20, 241,
|
||||||
|
93, 19, 240, 91, 18, 239, 88, 17, 237, 85, 16, 236, 83, 15, 235, 80, 14, 234, 78, 13, 232, 75,
|
||||||
|
12, 231, 73, 12, 229, 71, 11, 228, 69, 10, 226, 67, 10, 225, 65, 9, 223, 63, 8, 221, 61, 8,
|
||||||
|
220, 59, 7, 218, 57, 7, 216, 55, 6, 214, 53, 6, 212, 51, 5, 210, 49, 5, 208, 47, 5, 206, 45, 4,
|
||||||
|
204, 43, 4, 202, 42, 4, 200, 40, 3, 197, 38, 3, 195, 37, 3, 193, 35, 2, 190, 33, 2, 188, 32, 2,
|
||||||
|
185, 30, 2, 183, 29, 2, 180, 27, 1, 178, 26, 1, 175, 24, 1, 172, 23, 1, 169, 22, 1, 167, 20, 1,
|
||||||
|
164, 19, 1, 161, 18, 1, 158, 16, 1, 155, 15, 1, 152, 14, 1, 149, 13, 1, 146, 11, 1, 142, 10, 1,
|
||||||
|
139, 9, 2, 136, 8, 2, 133, 7, 2, 129, 6, 2, 126, 5, 2, 122, 4, 3,
|
||||||
|
];
|
||||||
@ -1,5 +1,6 @@
|
|||||||
use eframe::glow::{self, PixelUnpackData};
|
use eframe::glow::{self, PixelUnpackData, TEXTURE0, TEXTURE1, UNSIGNED_BYTE};
|
||||||
use glow::HasContext as _;
|
use glow::HasContext as _;
|
||||||
|
use glow::{NEAREST, TEXTURE_1D, TEXTURE_2D, TEXTURE_MAG_FILTER, TEXTURE_MIN_FILTER};
|
||||||
use log;
|
use log;
|
||||||
use std::mem::{size_of, transmute};
|
use std::mem::{size_of, transmute};
|
||||||
|
|
||||||
@ -27,9 +28,12 @@ mod deadbeef_rand {
|
|||||||
}
|
}
|
||||||
use deadbeef_rand::rand;
|
use deadbeef_rand::rand;
|
||||||
|
|
||||||
|
use crate::app::turbo_colormap;
|
||||||
|
|
||||||
pub struct Waterfall {
|
pub struct Waterfall {
|
||||||
program: glow::Program,
|
program: glow::Program,
|
||||||
texture: glow::Texture,
|
texture: glow::Texture,
|
||||||
|
color_lut: glow::Texture,
|
||||||
vao: glow::VertexArray,
|
vao: glow::VertexArray,
|
||||||
vbo: glow::Buffer,
|
vbo: glow::Buffer,
|
||||||
ebo: glow::Buffer,
|
ebo: glow::Buffer,
|
||||||
@ -56,14 +60,24 @@ impl Waterfall {
|
|||||||
}
|
}
|
||||||
|
|
||||||
unsafe {
|
unsafe {
|
||||||
// Bind our texture
|
// Bind our texturs
|
||||||
|
gl.active_texture(TEXTURE1);
|
||||||
|
check_for_gl_errors(&gl, "Active texture 1");
|
||||||
|
gl.bind_texture(glow::TEXTURE_1D, Some(self.color_lut));
|
||||||
|
check_for_gl_errors(&gl, "bind lut");
|
||||||
|
|
||||||
|
gl.active_texture(TEXTURE0);
|
||||||
|
check_for_gl_errors(&gl, "Active texture 0");
|
||||||
gl.bind_texture(glow::TEXTURE_2D, Some(self.texture));
|
gl.bind_texture(glow::TEXTURE_2D, Some(self.texture));
|
||||||
|
check_for_gl_errors(&gl, "bind texture");
|
||||||
|
|
||||||
// Use our shader program
|
// Use our shader program
|
||||||
gl.use_program(Some(self.program));
|
gl.use_program(Some(self.program));
|
||||||
|
check_for_gl_errors(&gl, "use program");
|
||||||
|
|
||||||
// Bind our vertex array object
|
// Bind our vertex array object
|
||||||
gl.bind_vertex_array(Some(self.vao));
|
gl.bind_vertex_array(Some(self.vao));
|
||||||
|
check_for_gl_errors(&gl, "bind vao");
|
||||||
|
|
||||||
// Update texture
|
// Update texture
|
||||||
gl.tex_sub_image_2d(
|
gl.tex_sub_image_2d(
|
||||||
@ -77,11 +91,13 @@ impl Waterfall {
|
|||||||
glow::UNSIGNED_BYTE,
|
glow::UNSIGNED_BYTE,
|
||||||
PixelUnpackData::Slice(&new_data),
|
PixelUnpackData::Slice(&new_data),
|
||||||
);
|
);
|
||||||
|
check_for_gl_errors(&gl, "update texture");
|
||||||
self.offset = (self.offset + 1) % 300;
|
self.offset = (self.offset + 1) % 300;
|
||||||
|
|
||||||
if let Some(uniform) = gl.get_uniform_location(self.program, "offset") {
|
if let Some(uniform) = gl.get_uniform_location(self.program, "offset") {
|
||||||
gl.uniform_1_f32(Some(&uniform), self.offset as f32 / 300.0);
|
gl.uniform_1_f32(Some(&uniform), self.offset as f32 / 300.0);
|
||||||
}
|
}
|
||||||
|
check_for_gl_errors(&gl, "update uniform");
|
||||||
|
|
||||||
// Draw the elements
|
// Draw the elements
|
||||||
gl.draw_elements(glow::TRIANGLES, 6, glow::UNSIGNED_INT, 0);
|
gl.draw_elements(glow::TRIANGLES, 6, glow::UNSIGNED_INT, 0);
|
||||||
@ -171,16 +187,8 @@ impl Waterfall {
|
|||||||
|
|
||||||
gl.bind_texture(glow::TEXTURE_2D, Some(texture));
|
gl.bind_texture(glow::TEXTURE_2D, Some(texture));
|
||||||
|
|
||||||
gl.tex_parameter_i32(
|
gl.tex_parameter_i32(TEXTURE_2D, TEXTURE_MIN_FILTER, NEAREST as i32);
|
||||||
glow::TEXTURE_2D,
|
gl.tex_parameter_i32(TEXTURE_2D, TEXTURE_MAG_FILTER, NEAREST as i32);
|
||||||
glow::TEXTURE_MIN_FILTER,
|
|
||||||
glow::NEAREST as i32,
|
|
||||||
);
|
|
||||||
gl.tex_parameter_i32(
|
|
||||||
glow::TEXTURE_2D,
|
|
||||||
glow::TEXTURE_MAG_FILTER,
|
|
||||||
glow::NEAREST as i32,
|
|
||||||
);
|
|
||||||
check_for_gl_errors(&gl, "Set texture params");
|
check_for_gl_errors(&gl, "Set texture params");
|
||||||
|
|
||||||
//gl.tex_storage_2d(glow::TEXTURE_2D, 1, glow::R8, 300, 300);
|
//gl.tex_storage_2d(glow::TEXTURE_2D, 1, glow::R8, 300, 300);
|
||||||
@ -197,6 +205,25 @@ impl Waterfall {
|
|||||||
);
|
);
|
||||||
check_for_gl_errors(&gl, "Initializing Texture");
|
check_for_gl_errors(&gl, "Initializing Texture");
|
||||||
|
|
||||||
|
let color_lut = gl
|
||||||
|
.create_texture()
|
||||||
|
.expect("Waterfall: could not create LUT");
|
||||||
|
gl.bind_texture(TEXTURE_1D, Some(color_lut));
|
||||||
|
gl.tex_parameter_i32(TEXTURE_1D, TEXTURE_MIN_FILTER, NEAREST as i32);
|
||||||
|
gl.tex_parameter_i32(TEXTURE_1D, TEXTURE_MAG_FILTER, NEAREST as i32);
|
||||||
|
check_for_gl_errors(&gl, "Set LUT params");
|
||||||
|
gl.tex_image_1d(
|
||||||
|
TEXTURE_1D,
|
||||||
|
0,
|
||||||
|
glow::SRGB as i32,
|
||||||
|
256,
|
||||||
|
0,
|
||||||
|
glow::RGB,
|
||||||
|
UNSIGNED_BYTE,
|
||||||
|
Some(&turbo_colormap::TURBO_SRGB_BYTES),
|
||||||
|
);
|
||||||
|
check_for_gl_errors(&gl, "Initializing LUT");
|
||||||
|
|
||||||
let program = gl.create_program().expect("Cannot create program");
|
let program = gl.create_program().expect("Cannot create program");
|
||||||
|
|
||||||
let (vertex_shader_source, fragment_shader_source) = (
|
let (vertex_shader_source, fragment_shader_source) = (
|
||||||
@ -223,11 +250,13 @@ impl Waterfall {
|
|||||||
|
|
||||||
// texture sampler
|
// texture sampler
|
||||||
uniform sampler2D texture1;
|
uniform sampler2D texture1;
|
||||||
|
uniform sampler1D LUT;
|
||||||
uniform float offset;
|
uniform float offset;
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
FragColor = texture(texture1, vec2(TexCoord.x, TexCoord.y + offset));
|
float val = texture(texture1, vec2(TexCoord.x, TexCoord.y + offset)).x;
|
||||||
|
FragColor = texture(LUT, val);
|
||||||
}
|
}
|
||||||
"#,
|
"#,
|
||||||
);
|
);
|
||||||
@ -268,11 +297,16 @@ impl Waterfall {
|
|||||||
gl.detach_shader(program, shader);
|
gl.detach_shader(program, shader);
|
||||||
gl.delete_shader(shader);
|
gl.delete_shader(shader);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gl.use_program(Some(program));
|
||||||
|
gl.uniform_1_i32(gl.get_uniform_location(program, "texture1").as_ref(), 0);
|
||||||
|
gl.uniform_1_i32(gl.get_uniform_location(program, "LUT").as_ref(), 1);
|
||||||
check_for_gl_errors(&gl, "APP INIT");
|
check_for_gl_errors(&gl, "APP INIT");
|
||||||
|
|
||||||
Self {
|
Self {
|
||||||
program,
|
program,
|
||||||
texture,
|
texture,
|
||||||
|
color_lut,
|
||||||
vao,
|
vao,
|
||||||
vbo,
|
vbo,
|
||||||
ebo,
|
ebo,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user