Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //:==========================================================://
- //|AUTHOR: John Mark Isaac Madison |//
- //|EMAIL:: HeavyMetalCookies[ at ][ letterAfter_f-mail ].com |//
- //|THIS_FILE_ON_PASTE_BIN[ https://pastebin.com/VvTNDiyi ] |//
- //|YOUTUBE_CODE_OVERVIEW[ youtube.com/watch?v=vkkkeS4t2EU ] |//
- //:==========================================================://
- //: GOAL/SUMMARY: ://
- //: 1: When viewport "#2" (rec_vp2) is snapped onto ://
- //: viewport "C", the fragment shader code will ://
- //: render at a "1:1" scale with zero translation. ://
- //: ://
- //: 2: As viewport "#2" is resized, it performs a ://
- //: sub-sample of the shader code input coordinates. ://
- //: ://
- //: 2.1: If rec_vp2 is: ://
- //: A: Same size as rec_vpc ://
- //: B: Different location than vpc ://
- //: You have a PAN. ://
- //: ://
- //: 2.2: If rec_vp2 is: ://
- //: A: Different size than rec_vpc ://
- //: B: Same exact centerpoint as rec_vpc ://
- //: You have a ZOOM into the CENTER. ://
- //: ://
- //: 2.3: If rec_vp2 is: ://
- //: A: Different size then rec_vpc ://
- //: B: Different centerpoint than rec_vpc ://
- //: You have a PAN + ZOOM. ://
- //:==========================================================://
- //|//////////////////////////////////////////////////////////|//
- //| GIVENS: |//
- //| 1: vpc is always snapped 100% to opengl |//
- //| context and thus can represent the |//
- //| gl_FragCoord set of points. |//
- //| |//
- //| 2: vp2 is a SOURCE viewport like vp1 (not pictured). |//
- //| Except the source it samples is vpc's datapoints. |//
- //| |//
- //| The smaller vp2 is relative to vpc, the more |//
- //| "zoomed in" you are on the gl_FragCoord(s). |//
- //| |//
- //| SOLVE: |//
- //| 1: EASY: Fill vpc with grey pixels if gl_FragCoord |//
- //| is NOT within vp0. |//
- //| |//
- //| 2: HARD: For each pixel inside of vp0, |//
- //| map to vp2's data. |//
- //| ( vp2's data is a sub-sample of vpc's ) |//
- //| ( normalized screen coordinates. ) |//
- //| |//
- //| |//
- //| SUMMARY: |//
- //| INPUT: [ glFragCoord.x , glFragCoord.y ] |//
- //| OUT: [ vpc_n_o.x , vpc_n_o.y ] |//
- //|//////////////////////////////////////////////////////////|//
- //[//////////////////////////////////////////////////]//
- //[ ]//
- //[ DIAGRAM_NAME[ SC[ DIA_VPC_TO_VP2_NORMALIZED ] ] ]//
- //[ CODE_EXAMPLE[ SC[ COD_VPC_TO_VP2_NORMALIZED ] ] ]//
- //[ ]//
- //| |//
- //| ############################################# |//
- //| ## ## |//
- //| ## VP2/vp2: ViewPort2: (ZOOMER_SOURCE) ## |//
- //| ## VPC/vpc: ViewPortC: (CANVAS/CLIENT) ## |//
- //| ## VP0/vp0: ViewPort0: (DESTINATION ) ## |//
- //| ## ## |//
- //| ## vp2: 0% zoomed when covering vpc 100%. ## |//
- //| ## CHANGES TO VP0 POSITION: ## |//
- //| ## Should not alter image in VP0. ## |//
- //| ## CHANGES TO VP0 SIZE: ## |//
- //| ## Should squash+stretch the image ## |//
- //| ## but NOT expand or contract the ## |//
- //| ## upper+lower bounds of the data ## |//
- //| ## set being rendered to VP0. ## |//
- //| ## ## |//
- //| ############################################# |//
- //[ ]//
- //[ DIAGRAM_NAME[ SC[ DIA_VPC_TO_VP2_NORMALIZED ] ] ]//
- //[ CODE_EXAMPLE[ SC[ COD_VPC_TO_VP2_NORMALIZED ] ] ]//
- //[ PASTE____BIN[ https://pastebin.com/VvTNDiyi ] ] ]//
- //[ ]//
- //+ |<----------- EXAMPLE_SPAN==(11)----------->| -+//
- //+ |<------------- gl_FragCoord(s) ----------->| -+//
- //+ |<------------------ vpc ------------------>| -+//
- //+ | (rec_vpc) | -+//
- //+ | | -+//
- //+ | |<-------------- vp0 -------------->| | -+//
- //+ | | (rec_vp0) | | -+//
- //+ | | | | -+//
- //+ | | | | -+//
- //[ +---+---=---=---=---=---=---=---=---=---+---+ -]//
- //[ | 0 | 1 2 3 | 4 5 . 6 | 7 . 8 . 9 |10 | 0]//
- //[ +---+---=---=---=---=---=---=---=---=---+---+ -]//
- //[ | 1 | . . . . | | 1]//
- //[ * * . . . . * * -]//
- //[ | 2 | . . . . | | 2]//
- //[ * * . . . . * * -]//
- //[ | 3 | . . . . | | 3]//
- //[ * - * . . . . * - * -]//
- //[ | 4 | . . . . | | 4]//
- //[ * *...................+-----------+...*...* -]//
- //[ | 5 | | | |0.5| 5]//
- //[ * *...................| |...*...* -]//
- //[ | 6 | | vp2 | |0.6| 6]//
- //[ * - *...................| (rec_vp2) |...* - * -]//
- //[ | 7 | | | |0.7| 7]//
- //[ * *...................+-----------+...*...* -]//
- //[ | 8 | . . . . | | 8]//
- //[ * * . . . . * * -]//
- //[ | 9 | . . . . | | 9]//
- //[ +---+---=---=---=---=---=---=---=---=---+---+ -]//
- //[ |10 | | |0.6|0.7|0.8| | | 10]//
- //[ +---+---=---=---=---=---=---=---=---=---+---+ -]//
- //+ | | +//
- //+ | | +//
- //+ +---+---+---+---+---+---+---+---+---+ +//
- //+ |0.6| |.65| |0.7| |.75| |0.8| +//
- //+ +-----------------------------------+ +//
- //+ | | +//
- //+ |<----------- vpc_n_o.x ----------->| +//
- //+ |( Output gl_FragCoord(s) mapped )| +//
- //+ |( onto rec_vp0 )| +//
- //[ ]//
- //[//////////////////////////////////////////////////]//
- //: Q: WHAT IS WRONG WITH FORMULA BELOW?
- //:
- //: [ rec_vp0 / vp0_m_i ]TO[ rec_vp2 / vp2_m_o ]
- //:--------------------------------------------------://
- //:.................|<---- rec_vp0.wid - 1 ---->|
- //: vp0_m_i.x / ( rec_vp0.x_1 - rec_vp0.x_0 )
- //: === vp2_m_o.x / ( rec_vp2.x_1 - rec_vp2.x_0 )
- //:.................|<---- rec_vp2.wid - 1 ---->|
- //:--------------------------------------------------://
- //:
- //:
- //: A: vp0_m_i & vp2_m_0 values need to be offset
- //: so they fit within range: 0 -to- (wid-1)
- //:
- //:
- //:--------------------------------------------------://
- //: ( vp0_m_i.x - rec_vp0.x_0 ) <-- On__Range
- //: / ( rec_vp0.x_1 - rec_vp0.x_0 ) <-- The_Range
- //: |<---- rec_vp0.wid - 1 ---->|
- //: ===
- //: |<---- rec_vp2.wid - 1 ---->|
- //: ( vp2_m_o.x - rec_vp2.x_0 ) <-- On__Range
- //: / ( rec_vp2.x_1 - rec_vp2.x_0 ) <-- The_Range
- //:--------------------------------------------------://
- //: ://
- //: Q: Solve formula above for vp2_m_0.x ://
- //: A: Answer below: ://
- //: ://
- //: vp2_m_o.x =( ( vp0_m_i.x - rec_vp0.x_0 ) ://
- //: / ( rec_vp0.x_1 - rec_vp0.x_0 ) ://
- //: * ( rec_vp2.x_1 - rec_vp2.x_0 ) ://
- //: ) + rec_vp2.x_0 ;;;;;;;;;;;;;;; ://
- //: ://
- //: Lets re-name: ://
- //: [vp2] to [OUT] for Output. ://
- //: [vp0] to [INN] for Input . ://
- //: ://
- //: OUT_m_o.x =( ( INN_m_i.x - rec_INN.x_0 ) ://
- //: / ( rec_INN.x_1 - rec_INN.x_0 ) ://
- //: * ( rec_OUT.x_1 - rec_OUT.x_0 ) ://
- //: ) + rec_OUT.x_0 ;;;;;;;;;;;;;;; ://
- //: ://
- //: When converting coordinate from 1 viewport ://
- //: to another, we can replace "INN" with the ://
- //: input viewport name and "OUT" with the output ://
- //: viewport name. The viewports in this example ://
- //: are named: ://
- //: ://
- //: [ vpc , vp0 , vp2 ] ://
- //: ://
- //:--------------------------------------------------://
- document.title = ( "[V2M.JS]" );
- //:Fake cast because I will need it in GLSL code.
- function float( any_num ){
- return( any_num );
- };;
- function DEBUG_BOUNDS_CHECK(
- cxy_inn
- , rec_inn //:AKA[ rec_bou / bounds_rectangle ]
- ){
- if( cxy_inn.x >= rec_inn.x_0 //:LEF : GTE
- && cxy_inn.x <= rec_inn.x_1 //:RIG : LTE
- && cxy_inn.y >= rec_inn.y_0 //:TOP : GTE
- && cxy_inn.y <= rec_inn.y_1 //:BOT : LTE
- ){
- //:Okay. Do nothing.
- }else{
- var err_msg =( "[OUT_OF_BOUNDS]" );
- console.log( err_msg );
- throw( err_msg );
- };;
- };;
- var gl_FragCoord = Object.seal({ x: 0 , y: 0});
- var EXAMPLE_SPAN = ( 11 );
- //:Coordinates:
- //:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC://
- var vp0_m_o = Object.seal({ x: 0 , y: 0});
- var vp0_m_i = Object.seal({ x: 0 , y: 0});
- var vp2_m_o = Object.seal({ x: 0 , y: 0});
- var vp2_m_i = Object.seal({ x: 0 , y: 0});
- var vpc_m_o = Object.seal({ x: 0 , y: 0});
- var vpc_m_i = Object.seal({ x: 0 , y: 0});
- var vpc_mi2 = Object.seal({ x: 0 , y: 0});
- var vpc_n_o = Object.seal({ x: 0 , y: 0});
- var vpc_n_i = Object.seal({ x: 0 , y: 0});
- //: tbs_noc: My "NOrmalized Coordinate" to execute
- //: GLSL shader code on. AKA: transformed
- //: gl_FragCoord.
- var tbs_noc = Object.seal({ x: 0 , y: 0});
- //:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC://
- //:R:Rectangles:
- //:RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR://
- var rec_vpc =(Object.freeze({
- x_0 : 0 //:TOP_LEF: (inclusive)
- ,y_0 : 0 //:TOP_LEF: (inclusive)
- ,x_1 : 10 //:BOT_RIG: (inclusive)
- ,y_1 : 10 //:BOT_RIG: (inclusive)
- }));;
- var rec_vp0 = (Object.freeze({
- x_0 : 1 //:TOP_LEF: (inclusive)
- ,y_0 : 1 //:TOP_LEF: (inclusive)
- ,x_1 : 9 //:BOT_RIG: (inclusive)
- ,y_1 : 9 //:BOT_RIG: (inclusive)
- }));;
- var rec_vp2 = (Object.freeze({
- x_0 : 6 //:TOP_LEF: (inclusive)
- ,y_0 : 5 //:TOP_LEF: (inclusive)
- ,x_1 : 8 //:BOT_RIG: (inclusive)
- ,y_1 : 7 //:BOT_RIG: (inclusive)
- }));;
- //:RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR://
- for( gl_FragCoord.y = 0
- ;gl_FragCoord.y < EXAMPLE_SPAN
- ;gl_FragCoord.y++
- ){
- for( gl_FragCoord.x = 0
- ;gl_FragCoord.x < EXAMPLE_SPAN
- ;gl_FragCoord.x++
- ){
- //:vpc is always snapped to entire [ client/canvas ]
- //:so we can make this assumption:
- vpc_m_i.x = float( gl_FragCoord.x );//:Maverick_Input:X
- vpc_m_i.y = float( gl_FragCoord.y );//:Maverick_Input:Y
- //:IS[ vpc_m_i ]OUTSIDE_OF[ rec_vp0 ]? SC[ PT_IN_VP ]://
- if( vpc_m_i.x < rec_vp0.x_0 //:LEF ( -X- )[ LT ]:////://
- || vpc_m_i.x > rec_vp0.x_1 //:RIG ( +X+ )[ GT ]:////://
- || vpc_m_i.y < rec_vp0.y_0 //:TOP ( -Y- )[ LT ]:////://
- || vpc_m_i.y > rec_vp0.y_1 //:BOT ( +Y+ )[ GT ]:////://
- ){ //:NOT:inside_the_rectangle[ rec_vp0 ]:////://////://
- //://////:OUT_OF_BOUNDS_OF_REC[ rec_vp0 ]:////://////://
- //:HERE: Make output pixel color some type of
- //: solid color that will letterbox/outline
- //: rec_vp0 when we draw all pixels on rec_vpc.
- }else{ //:INSIDE_THE_RECTANGLE[ rec_vp0 ]:////://////://
- //|¯¯ ¯¯ ¯¯ ¯¯ ¯¯ ¯¯ ¯¯ ¯¯¯¯ ¯¯ ¯¯ ¯¯ ¯¯ ¯¯ ¯¯ ¯¯|//
- //|VARIABLES_BELOW: |//
- //|- - - - - - - - - - - -- - - - - - - - - - - -|//
- //| vp0_m_o : Viewport[ 0 ][ Maverik ][ Output ] |//
- //| vp0_m_i : Viewport[ 0 ][ Maverik ][ Input ] |//
- //| vp2_m_o : Viewport[ 2 ][ Maverik ][ Output ] |//
- //| vp2_m_i : Viewport[ 2 ][ Maverik ][ Input ] |//
- //| vpc_m_o : Viewport[ c ][ Maverik ][ Output ] |//
- //| vpc_m_i : Viewport[ c ][ Maverik ][ Input ] |//
- //| vpc_n_o : Viewport[ c ][ Normali ][ Output ] |//
- //| vpc_n_i : Viewport[ c ][ Normali ][ Input ] |//
- //|__ __ __ __ __ __ __ ____ __ __ __ __ __ __ __|//
- //|//////////////////////////////////////////////|//
- //| [ rec_vpc / vpc_m_i ]TO[ rec_vp0 / vp0_m_i ] |//
- //[>>>>> " Because rec_vp0 is sub region "<<<<<]//
- //[>>>>> " of rec_vpc all we need is a "<<<<<]//
- //[>>>>> " simple assignment. "<<<<<]//
- vp0_m_o.x = vpc_m_i.x;
- vp0_m_o.y = vpc_m_i.y;
- //|//////////////////////////////////////////////|//
- //:Output_Becomes_Input
- vp0_m_i.x = vp0_m_o.x;
- vp0_m_i.y = vp0_m_o.y;
- //:----------------------------------------------://
- //: [ rec_vp0 / vp0_m_i ]TO[ rec_vp2 / vp2_m_o ]
- //: INN: vp0 ( rec_vp0 & vp0_m_i )
- //: OUT: vp2 ( rec_vp2 & vp2_m_o )
- //:----------------------------------------------://
- vp2_m_o.x =( ( vp0_m_i.x - rec_vp0.x_0 )
- / ( rec_vp0.x_1 - rec_vp0.x_0 )
- * ( rec_vp2.x_1 - rec_vp2.x_0 )
- ) + rec_vp2.x_0 ;;;;;;;;;;;;;;;
- vp2_m_o.y =( ( vp0_m_i.y - rec_vp0.y_0 )
- / ( rec_vp0.y_1 - rec_vp0.y_0 )
- * ( rec_vp2.y_1 - rec_vp2.y_0 )
- ) + rec_vp2.y_0 ;;;;;;;;;;;;;;;
- //:----------------------------------------------://
- DEBUG_BOUNDS_CHECK( vp2_m_o, rec_vp2 );
- //: Output_Becomes_Input:
- vp2_m_i.x = vp2_m_o.x;
- vp2_m_i.y = vp2_m_o.y;
- //:----------------------------------------------://
- //: YES. we are using rec_vpc AGAIN!
- //: The formula is just an assignment, because
- //: vp2 is a sub-sample of vpc.
- //:
- //: [ rec_vp2 / vp2_m_i ]TO[ rec_vpc / vpc_m_o ]
- //: INN: vp2 ( rec_vp2 & vp2_m_i )
- //: OUT: vpc ( rec_vpc / vpc_m_o )
- //:----------------------------------------------://
- vpc_m_o.x =( vp2_m_i.x );
- vpc_m_o.y =( vp2_m_i.y );
- //:----------------------------------------------://
- DEBUG_BOUNDS_CHECK( vpc_m_o, rec_vpc );
- //: Output_Becomes_Input:
- //: We already used[ vpc_m_i ]so we will call
- //: this variable [ vpc_mi2 ]to avoid problems.
- vpc_mi2.x = vpc_m_o.x;
- vpc_mi2.y = vpc_m_o.y;
- //: [ rec_vpc / vpc_m_i ]TO[ rec_vpc / vpc_n_o ]
- //: Formula is simpler this time because we only
- //: want the percentage_along_path on the sides
- //: of rec_vpc.
- //:----------------------------------------------://
- vpc_n_o.x =(( vpc_mi2.x - rec_vpc.x_0 )
- /( rec_vpc.x_1- rec_vpc.x_0 ));;
- vpc_n_o.y =(( vpc_mi2.y - rec_vpc.y_0 )
- /( rec_vpc.y_1- rec_vpc.y_0 ));;
- //:----------------------------------------------://
- //: Output_Becomes_Input:
- vpc_n_i.x = vpc_n_o.x;
- vpc_n_i.y = vpc_n_o.y;
- //:These normalized coordinates represent
- //:rec_vpc coordinates after rec_vp2 has
- //:ZOOMED and PANNED over rec_vpc.
- tbs_noc.x = vpc_n_i.x;
- tbs_noc.y = vpc_n_i.y;
- //:L:Log:Log_The_Results:(BELOW):----------------://
- //:LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL://
- var x = tbs_noc.x;
- var y = tbs_noc.y;
- console.log("[x,y]:[" + x +"]["+ y + "]");
- //:If all the math is correct, the coordinates
- //:should be within the bounds of the diagram.
- if( tbs_noc.x < 0.6 || tbs_noc.x > 0.8
- || tbs_noc.y < 0.5 || tbs_noc.y > 0.7
- ){
- var err_msg =("[YOUR_MATH_IS_WRONG]");
- console.log( err_msg );
- throw( err_msg );
- };;
- //:LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL://
- };; //:///////////////////////////////:SC[ PT_IN_VP ]://
- };;};;//:NEXT[ frag_coord ]
Add Comment
Please, Sign In to add comment