/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 - 2 0 2 1 ĠAnt on ĠTr ush kov Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġapp . the le ma . shader . node Ċ Ċ import Ġapp . the le ma . g 3 d . IS c ene Ċ import Ġapp . the le ma . gl . IM esh Ċ import Ġapp . the le ma . math . Transform DataType Ċ import Ġapp . the le ma . json . I JsonObject Ċ import Ġapp . the le ma . math . MATH Ċ Ċ /** ĠFor Ġstatic , Ġmoving , Ġskin ned Ġobjects Ċ Ġ* Ġ@ author Ġz eg an styl Ġ*/ Ċ class ĠVertex Node ( ĊĠĠĠ Ġvar Ġmax B ones : ĠInt Ġ= Ġ 0 , ĊĊĠĠĠ Ġ/** ĠUse Ġ[ Transform DataType ] Ġ*/ ĊĠĠĠ Ġvar Ġworld Transform Type : ĠString Ġ= ĠTransform DataType . TR S , ĊĊĠĠĠ Ġvar Ġbones Sets Num : ĠInt Ġ= Ġ 1 Ċ ): ĠShader Node () Ġ{ ĊĠĠĠ Ġconstructor ( block : ĠVertex Node . () Ġ-> ĠUnit ): Ġthis () Ġ{ Ġblock ( this ) Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġcomponent Name : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ" Vertex Node " ĊĊĠĠĠ Ġvar Ġposition Name Ġ= Ġ" POSITION " ĊĠĠĠ Ġvar Ġnormal Name Ġ= Ġ" NORMAL " ĊĠĠĠ Ġvar Ġtangent Name Ġ= Ġ" T ANG ENT " ĊĠĠĠ Ġvar Ġbones Name Ġ= Ġ" JO INT S _" ĊĠĠĠ Ġvar Ġbone Weights Name Ġ= Ġ" WEIGHT S _" ĊĊĠĠĠ Ġval Ġposition Ġ= Ġoutput ( GLSL Vec 3 (" position ")) ĊĠĠĠ Ġval Ġnormal Ġ= Ġoutput ( GLSL Vec 3 (" normal ")) ĊĊĠĠĠ Ġ/** ĠT ang ent , Ġbit ang ent , Ġnormal Ġmatrix Ġ*/ ĊĠĠĠ Ġval Ġt bn Ġ= Ġoutput ( GLSL Mat 3 (" tb n ")) ĊĊĠĠĠ Ġprivate Ġval Ġu Bone Mat rices Name : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ" u Bone Mat rices $ uid " ĊĊĠĠĠ Ġprivate Ġval Ġu World Matrix : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ" u World Matrix $ uid " ĊĊĠĠĠ Ġprivate Ġval Ġhas B ones ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġmax B ones Ġ> Ġ 0 Ġ&& Ġbones Sets Num Ġ> Ġ 0 ĊĊĠĠĠ Ġval Ġuid : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ 0 ĊĊĠĠĠ Ġoverride Ġfun Ġread Json ( json : ĠI JsonObject ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . read Json ( json ) ĊĊĠĠĠĠĠĠĠ Ġposition Name Ġ= Ġjson . string (" a Position Name ", Ġ" POSITION ") ĊĠĠĠĠĠĠĠ Ġnormal Name Ġ= Ġjson . string (" a Normal Name ", Ġ" NORMAL ") ĊĠĠĠĠĠĠĠ Ġtangent Name Ġ= Ġjson . string (" a Tangent Name ", Ġ" T ANG ENT ") ĊĠĠĠĠĠĠĠ Ġbones Name Ġ= Ġjson . string (" a B ones Name ", Ġ" JO INT S _ ") ĊĠĠĠĠĠĠĠ Ġbone Weights Name Ġ= Ġjson . string (" a Bone Weights Name ", Ġ" WEIGHT S _ ") ĊĊĠĠĠĠĠĠĠ Ġmax B ones Ġ= Ġjson . int (" max B ones ", Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġbones Sets Num Ġ= Ġjson . int (" bones Sets Num ", Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġworld Transform Type Ġ= Ġwhen Ġ( json . string (" world Transform Type ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" trs " Ġ-> ĠTransform DataType . TR S ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" translation " Ġ-> ĠTransform DataType . Translation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" translation Scale " Ġ-> ĠTransform DataType . Translation Scale ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" translation Rotation " Ġ-> ĠTransform DataType . Translation Rotation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" translation Rotation Y " Ġ-> ĠTransform DataType . Translation Rotation Y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" translation Scale Pro portional " Ġ-> ĠTransform DataType . Translation Scale Pro portional ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠTransform DataType . None ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġwrite Json ( json : ĠI JsonObject ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . write Json ( json ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( position Name Ġ!= Ġ" POSITION ") Ġjson [" a Position Name "] Ġ= Ġposition Name ĊĠĠĠĠĠĠĠ Ġif Ġ( normal Name Ġ!= Ġ" NORMAL ") Ġjson [" a Normal Name "] Ġ= Ġnormal Name ĊĠĠĠĠĠĠĠ Ġif Ġ( tang ent Name Ġ!= Ġ" T ANG ENT ") Ġjson [" a Tangent Name "] Ġ= Ġtangent Name ĊĠĠĠĠĠĠĠ Ġif Ġ( bones Name Ġ!= Ġ" JO INT S _ ") Ġjson [" a B ones Name "] Ġ= Ġbones Name ĊĠĠĠĠĠĠĠ Ġif Ġ( bone Weights Name Ġ!= Ġ" WEIGHT S _ ") Ġjson [" a Bone Weights Name "] Ġ= Ġbone Weights Name ĊĊĠĠĠĠĠĠĠ Ġif Ġ( max B ones Ġ> Ġ 0 ) Ġjson [" max B ones "] Ġ= Ġmax B ones ĊĠĠĠĠĠĠĠ Ġif Ġ( bones Sets Num Ġ!= Ġ 1 ) Ġjson [" bones Sets Num "] Ġ= Ġbones Sets Num ĊĠĠĠĠĠĠĠ Ġif Ġ( world Transform Type Ġ!= ĠTransform DataType . None ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjson [" world Transform Type "] Ġ= Ġwhen Ġ( world Transform Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTransform DataType . TR S Ġ-> Ġ" trs " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTransform DataType . Translation Ġ-> Ġ" translation " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTransform DataType . Translation Scale Ġ-> Ġ" translation Scale " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTransform DataType . Translation Rotation Ġ-> Ġ" translation Rotation " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTransform DataType . Translation Rotation Y Ġ-> Ġ" translation Rotation Y " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTransform DataType . Translation Scale Pro portional Ġ-> Ġ" translation Scale Pro portional " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ" none " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset ( other : ĠVertex Node ): ĠVertex Node Ġ{ ĊĠĠĠĠĠĠĠ Ġmax B ones Ġ= Ġother . max B ones ĊĠĠĠĠĠĠĠ Ġworld Transform Type Ġ= Ġother . world Transform Type ĊĠĠĠĠĠĠĠ Ġbones Sets Num Ġ= Ġother . bones Sets Num ĊĠĠĠĠĠĠĠ Ġposition Name Ġ= Ġother . position Name ĊĠĠĠĠĠĠĠ Ġnormal Name Ġ= Ġother . normal Name ĊĠĠĠĠĠĠĠ Ġtangent Name Ġ= Ġother . tang ent Name ĊĠĠĠĠĠĠĠ Ġbones Name Ġ= Ġother . bones Name ĊĠĠĠĠĠĠĠ Ġbone Weights Name Ġ= Ġother . bone Weights Name ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbone In fluence Code ( component : ĠString , Ġbones Name : ĠString , Ġweights Name : ĠString , Ġsum Name : ĠString Ġ= Ġ" skin ning "): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" if Ġ($ weights Name .$ component Ġ> Ġ 0 . 0 ) Ġ$ sum Name Ġ+= Ġ$ weights Name .$ component Ġ* Ġ$ u Bone Mat rices Name [ int ($ bones Name .$ component )]; \ n " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġskin ning Set Code ( out : ĠStringBuilder , Ġbones Name : ĠString , Ġweights Name : ĠString , Ġsum Name : ĠString Ġ= Ġ" skin ning ") Ġ{ ĊĠĠĠĠĠĠĠ Ġout . append ( bone In fluence Code (" x ", Ġbones Name , Ġweights Name , Ġsum Name )) ĊĠĠĠĠĠĠĠ Ġout . append ( bone In fluence Code (" y ", Ġbones Name , Ġweights Name , Ġsum Name )) ĊĠĠĠĠĠĠĠ Ġout . append ( bone In fluence Code (" z ", Ġbones Name , Ġweights Name , Ġsum Name )) ĊĠĠĠĠĠĠĠ Ġout . append ( bone In fluence Code (" w ", Ġbones Name , Ġweights Name , Ġsum Name )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġprepare Shader Node ( mesh : ĠI Mesh , Ġscene : ĠI Scene ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . prepare Shader Node ( mesh , Ġscene ) ĊĊĠĠĠĠĠĠĠ Ġshader [ u World Matrix ] Ġ= Ġmesh . world Matrix Ġ?: ĠM ATH . Identity Mat 4 ĊĊĠĠĠĠĠĠĠ Ġval Ġarm ature Ġ= Ġmesh . arm ature ĊĠĠĠĠĠĠĠ Ġif Ġ( arm ature Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatrices Ġ= Ġarm ature . bone Mat rices ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( matrices . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshader . set Matrix 4 ( u Bone Mat rices Name , Ġmatrices , Ġlength Ġ= Ġmatrices . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmat 4 To Mat 3 ( mat 4 : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" mat 3 ($ mat 4 [ 0 ]. xyz , Ġ$ mat 4 [ 1 ]. xyz , Ġ$ mat 4 [ 2 ]. xyz );" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġexecution Vert ( out : ĠStringBuilder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( position . is Used ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpos Ġ= Ġ" pos $ uid " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . append (" vec 4 Ġ$ pos Ġ= Ġvec 4 ($ position Name , Ġ 1 . 0 );\ n ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġskin ning Name Ġ= Ġ" skin ning " ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has B ones ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa B ones Name Ġ= Ġbones Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa Bone Weights Name Ġ= Ġbone Weights Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġbones Sets Num ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// val Ġindex Ġ= Ġif Ġ( i Ġ== Ġ 0 ) Ġ"" Ġelse Ġ"$ i " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġi . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġskin ning Set Code ( out , Ġ"$ a B ones Name $ index ", Ġ"$ a Bone Weights Name $ index ", Ġskin ning Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . append ("$ pos Ġ= Ġ$ skin ning Name Ġ* Ġ$ pos ;\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( world Transform Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTransform DataType . TR S Ġ-> Ġout . append ("$ pos Ġ= Ġ$ u World Matrix Ġ* Ġ$ pos ;\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTransform DataType . Translation Ġ-> Ġout . append ("$ pos . xyz Ġ= Ġ$ pos . xyz Ġ+ Ġu Trans Vec 4 $ uid . xyz ;\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTransform DataType . Translation Scale Ġ-> Ġout . append ("$ pos . xyz Ġ= Ġ$ pos . xyz Ġ* Ġu Trans Vec 4 $ uid . w Ġ+ Ġu Trans Vec 4 $ uid . xyz ;\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTransform DataType . Translation Rotation Y Ġ-> Ġout . append ("$ pos . xyz Ġ= Ġrotate _ vertex _ position ( u Trans Vec 4 $ uid . xyz , Ġu Trans Vec 4 $ uid . w ) Ġ+ Ġu Trans Vec 4 $ uid . xyz ;\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . append ("${ position . ref } Ġ= Ġ$ pos . xyz ;\ n ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( normal . is Used Ġ|| Ġt bn . is Used ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa Tangent Name Ġ= Ġtangent Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa Normal Name Ġ= Ġnormal Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnormal Ref Ġ= Ġnormal . ref ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġt bn Ref Ġ= Ġt bn . ref ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has B ones ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// out . append ("${ normal . name } Ġ= Ġnormalize (( transpose ( inverse ( skin ning )) Ġ* Ġvec 4 ($ attribute Normal Name , Ġ 1 . 0 )). xyz );\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . append (" mat 3 Ġnormal Mat Ġ= Ġ${ mat 4 To Mat 3 ( skin ning Name )}; \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . append ("$ normal Ref Ġ= Ġnormalize ( normal Mat Ġ* Ġ$ a Normal Name );\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tb n . is Used ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . append (" vec 3 ĠT Ġ= Ġnormalize ( normal Mat Ġ* Ġ$ a Tangent Name . xyz );\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . append (" vec 3 ĠB Ġ= Ġcross (${ normal Ref }, ĠT ) Ġ* Ġ$ a Tangent Name . w ;\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . append ("$ tb n Ref Ġ= Ġmat 3 ( T , ĠB , Ġ${ normal Ref }); \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( world Transform Type Ġ== ĠTransform DataType . TR S ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . append (" mat 3 Ġnormal Mat Ġ= Ġ${ mat 4 To Mat 3 ( u World Matrix )}; \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . append ("$ normal Ref Ġ= Ġnormalize ( normal Mat Ġ* Ġ$ a Normal Name );\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tb n . is Used ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . append (" vec 3 ĠT Ġ= Ġnormalize ( normal Mat Ġ* Ġ$ a Tangent Name . xyz );\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . append (" vec 3 ĠB Ġ= Ġcross (${ normal Ref }, ĠT ) Ġ* Ġ$ a Tangent Name . w ;\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . append ("$ tb n Ref Ġ= Ġmat 3 ( T , ĠB , Ġ${ normal Ref }); \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . append ("$ normal Ref Ġ= Ġ$ a Normal Name ;\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tb n . is Used ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . append (" vec 3 ĠT Ġ= Ġ$ a Tangent Name . xyz ;\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . append (" vec 3 ĠB Ġ= Ġcross (${ normal Ref }, ĠT ) Ġ* Ġ$ a Tangent Name . w ;\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . append ("$ tb n Ref Ġ= Ġmat 3 ( T , ĠB , Ġ${ normal Ref }); \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdeclaration Frag ( out : ĠStringBuilder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( position . is Used ) Ġout . append ("$ var In Ġvec 3 Ġ${ position . ref }; \ n ") ĊĠĠĠĠĠĠĠ Ġif Ġ( normal . is Used ) Ġout . append ("$ var In Ġvec 3 Ġ${ normal . ref }; \ n ") ĊĠĠĠĠĠĠĠ Ġif Ġ( tb n . is Used ) Ġout . append ("$ var In Ġmat 3 Ġ${ tb n . ref }; \ n ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdeclaration Vert ( out : ĠStringBuilder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( position . is Used ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . append ("$ attribute Ġvec 3 Ġ$ position Name ;\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . append ("$ var Out Ġvec 3 Ġ${ position . ref }; \ n ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( world Transform Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTransform DataType . TR S Ġ-> Ġout . append (" uniform Ġmat 4 Ġ$ u World Matrix ;\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTransform DataType . Translation Ġ-> Ġout . append (" uniform Ġvec 4 Ġu Trans Vec 3 $ uid ;\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTransform DataType . Translation Scale Ġ-> Ġout . append (" uniform Ġvec 4 Ġu Trans Vec 4 $ uid ;\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTransform DataType . Translation Rotation Y Ġ-> Ġout . append (""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuniform Ġvec 4 Ġu Trans Vec 4 $ uid ; ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhttps :// www . ge eks 3 d . com / 2 0 1 4 1 2 0 1 / how - to - rotate - a - vertex - by - a - qu aternion - in - glsl / ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvec 3 Ġrotate _ vertex _ position ( vec 3 Ġposition , Ġfloat Ġangle ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfloat Ġhalf _ angle Ġ= Ġangle Ġ* Ġ 0 . 5 ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvec 4 Ġq Ġ= Ġvec 4 ( 0 . 0 , Ġsin ( half _ angle ), Ġ 0 . 0 , Ġcos ( half _ angle )); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvec 3 Ġv Ġ= Ġposition . xyz ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġv Ġ+ Ġ 2 . 0 Ġ* Ġcross ( q . xyz , Ġcross ( q . xyz , Ġv ) Ġ+ Ġq . w Ġ* Ġv ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has B ones ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . append (" uniform Ġmat 4 Ġ$ u Bone Mat rices Name [$ max B ones ]; \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . append (" mat 4 Ġskin ning Ġ= Ġmat 4 ( 0 . 0 );\ n ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġbones Sets Num ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . append ("$ attribute Ġvec 4 Ġ${ bones Name }$ i ;\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . append ("$ attribute Ġvec 4 Ġ${ bone Weights Name }$ i ;\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( normal . is Used Ġ|| Ġt bn . is Used ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . append ("$ attribute Ġvec 3 Ġ$ normal Name ;\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . append ("$ var Out Ġvec 3 Ġ${ normal . ref }; \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . append (" uniform Ġmat 3 Ġu Normal Matrix ;\ n ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tb n . is Used ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . append ("$ attribute Ġvec 4 Ġ$ tang ent Name ;\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . append ("$ var Out Ġmat 3 Ġ${ tb n . ref }; \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }