mirror of
https://github.com/FMS-Cat/condition.git
synced 2025-08-25 14:30:46 +02:00
dev: better RTInspector
This commit is contained in:
@@ -2,8 +2,14 @@ import { Entity } from '../heck/Entity';
|
||||
import { RenderTarget } from '../heck/RenderTarget';
|
||||
import { BufferRenderTarget } from '../heck/BufferRenderTarget';
|
||||
import { RTINSPECTOR_CAPTURE_INDEX, RTINSPECTOR_CAPTURE_NAME, RTINSPECTOR_MULTIPLE } from '../config-hot';
|
||||
import { gl } from '../globals/canvas';
|
||||
import quadVert from '../shaders/quad.vert';
|
||||
import inspectorFrag from '../shaders/inspector.frag';
|
||||
import { canvas, gl } from '../globals/canvas';
|
||||
import { Blit } from '../heck/components/Blit';
|
||||
import { Material } from '../heck/Material';
|
||||
import { dummyRenderTarget } from '../globals/dummyRenderTarget';
|
||||
import { quadGeometry } from '../globals/quadGeometry';
|
||||
import { Quad } from '../heck/components/Quad';
|
||||
|
||||
export interface RTInspectorOptions {
|
||||
target: RenderTarget;
|
||||
@@ -12,7 +18,8 @@ export interface RTInspectorOptions {
|
||||
export class RTInspector extends Entity {
|
||||
public entitySingle: Entity;
|
||||
public entityMultiple: Entity;
|
||||
public blitSingle: Blit;
|
||||
public materialSingle: Material;
|
||||
public quadSingle: Quad;
|
||||
public blitsMultiple: Blit[];
|
||||
|
||||
public constructor( options: RTInspectorOptions ) {
|
||||
@@ -22,12 +29,28 @@ export class RTInspector extends Entity {
|
||||
this.entitySingle = new Entity();
|
||||
this.children.push( this.entitySingle );
|
||||
|
||||
this.blitSingle = new Blit( {
|
||||
dst: options.target,
|
||||
name: process.env.DEV && 'RTInspector/blitSingle',
|
||||
this.materialSingle = new Material(
|
||||
quadVert,
|
||||
inspectorFrag,
|
||||
{ initOptions: { target: dummyRenderTarget, geometry: quadGeometry } },
|
||||
);
|
||||
|
||||
this.quadSingle = new Quad( {
|
||||
target: options.target,
|
||||
material: this.materialSingle,
|
||||
name: `RTInspector/quadSingle`,
|
||||
ignoreBreakpoints: true,
|
||||
} );
|
||||
this.entitySingle.components.push( this.blitSingle );
|
||||
this.entitySingle.components.push( this.quadSingle );
|
||||
|
||||
// -- mouse listener ---------------------------------------------------------------------------
|
||||
canvas.addEventListener( 'mousemove', ( { offsetX, offsetY } ) => {
|
||||
const rect = canvas.getBoundingClientRect();
|
||||
const x = offsetX / rect.width;
|
||||
const y = 1.0 - offsetY / rect.height;
|
||||
|
||||
this.materialSingle.addUniform( 'mouse', '2f', x, y );
|
||||
} );
|
||||
|
||||
// -- multiple ---------------------------------------------------------------------------------
|
||||
this.entityMultiple = new Entity();
|
||||
@@ -106,8 +129,9 @@ export class RTInspector extends Entity {
|
||||
return;
|
||||
}
|
||||
|
||||
this.blitSingle.src = target;
|
||||
this.blitSingle.attachment = attachment;
|
||||
const texture = target.getTexture( attachment );
|
||||
this.materialSingle.addUniformTexture( 'sampler0', texture );
|
||||
|
||||
this.entitySingle.active = true;
|
||||
} else {
|
||||
// fallback to not render it
|
||||
|
122
src/shaders/inspector.frag
Normal file
122
src/shaders/inspector.frag
Normal file
@@ -0,0 +1,122 @@
|
||||
#version 300 es
|
||||
|
||||
precision highp float;
|
||||
|
||||
const float RADIUS = 40.0;
|
||||
const vec3 CIRCLE_COLOR = vec3( 1.0, 1.0, 1.0 );
|
||||
|
||||
in vec2 vUv;
|
||||
|
||||
out vec4 fragColor;
|
||||
|
||||
uniform vec2 resolution;
|
||||
uniform vec2 mouse;
|
||||
uniform sampler2D sampler0;
|
||||
|
||||
bool print( in vec2 _coord, float _in ) {
|
||||
vec2 coord = _coord;
|
||||
|
||||
// vertical restriction
|
||||
if ( coord.y <= 0.0 || 5.0 <= coord.y ) { return false; }
|
||||
|
||||
// dot
|
||||
if ( 0.0 < coord.x && coord.x < 2.0 ) {
|
||||
return coord.x < 1.0 && coord.y < 1.0;
|
||||
}
|
||||
|
||||
// padded by dot
|
||||
if ( 2.0 < coord.x ) { coord.x -= 2.0; }
|
||||
|
||||
// determine digit
|
||||
float ci = floor( coord.x / 5.0 ) + 1.0;
|
||||
|
||||
// too low / too high
|
||||
if ( 4.0 < ci ) { return false; }
|
||||
if ( ci < -4.0 ) { return false; }
|
||||
|
||||
// x of char
|
||||
float cfx = floor( mod( coord.x, 5.0 ) );
|
||||
|
||||
// width is 4
|
||||
if ( 4.0 == cfx ) { return false; }
|
||||
|
||||
// y of char
|
||||
float cfy = floor( coord.y );
|
||||
|
||||
// bit of char
|
||||
float cf = cfx + 4.0 * cfy;
|
||||
|
||||
// determine char
|
||||
float num = 0.0;
|
||||
if ( 0.0 < ci ) {
|
||||
float n = abs( _in );
|
||||
for ( int i = 0; i < 6; i ++ ) {
|
||||
if ( ci < float( i ) ) { break; }
|
||||
|
||||
num = mod( floor( n ), 10.0 );
|
||||
n -= num;
|
||||
n *= 10.0;
|
||||
}
|
||||
} else {
|
||||
float n = abs( _in );
|
||||
for ( int i = 0; i < 6; i ++ ) {
|
||||
if ( -ci < float( i ) ) { break; }
|
||||
|
||||
if ( ci != 0.0 && n < 1.0 ) {
|
||||
// minus
|
||||
return float( i ) == -ci && _in < 0.0 && cfy == 2.0 && 0.0 < cfx;
|
||||
}
|
||||
num = mod( floor( n ), 10.0 );
|
||||
n -= num;
|
||||
n /= 10.0;
|
||||
}
|
||||
}
|
||||
|
||||
bool a;
|
||||
a = 1.0 == mod( floor( (
|
||||
num == 0.0 ? 432534.0 :
|
||||
num == 1.0 ? 410692.0 :
|
||||
num == 2.0 ? 493087.0 :
|
||||
num == 3.0 ? 493191.0 :
|
||||
num == 4.0 ? 630408.0 :
|
||||
num == 5.0 ? 989063.0 :
|
||||
num == 6.0 ? 399254.0 :
|
||||
num == 7.0 ? 1016898.0 :
|
||||
num == 8.0 ? 431766.0 :
|
||||
433798.0
|
||||
) / pow( 2.0, cf ) ), 2.0 );
|
||||
|
||||
return a ? true : false;
|
||||
}
|
||||
|
||||
void main() {
|
||||
vec2 uv = vUv;
|
||||
vec2 coord = vUv * resolution;
|
||||
|
||||
vec2 center = floor( mouse * resolution + vec2( 1.0, 0.7 ) * RADIUS );
|
||||
float circle = length( coord.xy - center ) - RADIUS;
|
||||
|
||||
vec4 col = texture( sampler0, uv );
|
||||
vec4 mcol = texture( sampler0, mouse );
|
||||
float mcolb = dot( mcol.rgb, vec3( 0.299, 0.587, 0.114 ) );
|
||||
vec4 bcol = vec4( vec3( step( mcolb, 0.5 ) ), 1.0 );
|
||||
|
||||
col = mix(
|
||||
col,
|
||||
mix(
|
||||
bcol,
|
||||
mcol,
|
||||
smoothstep( 1.0, 0.0, circle + 5.0 )
|
||||
),
|
||||
smoothstep( 1.0, 0.0, circle )
|
||||
);
|
||||
|
||||
if ( circle < 0.0 ) {
|
||||
col = print( coord.xy - center - vec2( 0.0, 8.0 ), mcol.x ) ? bcol : col;
|
||||
col = print( coord.xy - center - vec2( 0.0, 0.0 ), mcol.y ) ? bcol : col;
|
||||
col = print( coord.xy - center - vec2( 0.0, -8.0 ), mcol.z ) ? bcol : col;
|
||||
col = print( coord.xy - center - vec2( 0.0, -16.0 ), mcol.w ) ? bcol : col;
|
||||
}
|
||||
|
||||
fragColor = col;
|
||||
}
|
Reference in New Issue
Block a user