package Ġcom . code vik ing . kx g . gl Ċ Ċ import Ġcom . code vik ing . kx g . K xg Context Ċ import Ġcom . code vik ing . kx g . Texture Ċ import Ġcom . code vik ing . kx g . Texture Data Ċ import Ġcom . code vik ing . kx g . Texture Props Ċ import Ġcom . code vik ing . kx g . util . Disposable Ċ import Ġcom . code vik ing . kx g . util . UniqueId Ċ import Ġcom . code vik ing . kx g . util . log E Ċ import Ġcom . code vik ing . kx g . util . log W Ċ Ċ class ĠFrame buffer ( val Ġwidth : ĠInt , Ġval Ġheight : ĠInt ) Ġ: ĠDis posable Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġfb Id Ġ= ĠUnique Id . next Id () ĊĊĠĠĠ Ġvar Ġfb Resource : ĠFrame buffer Resource ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġvar Ġcolor Attachment : ĠTexture ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġvar Ġdepth Attachment : ĠTexture ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġfun Ġwith Color (): ĠFrame buffer Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( color Attachment Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Attachment Ġ= ĠF b Color Tex Data . color Tex ( width , Ġheight , Ġfb Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwith Depth (): ĠFrame buffer Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( depth Attachment Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdepth Attachment Ġ= ĠF b Depth Tex Data . depth Tex ( width , Ġheight , Ġfb Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdispose ( ctx : ĠK xg Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfb Resource ?. delete ( ctx ) ĊĠĠĠĠĠĠĠ Ġcolor Attachment ?. dispose ( ctx ) ĊĠĠĠĠĠĠĠ Ġdepth Attachment ?. dispose ( ctx ) ĊĊĠĠĠĠĠĠĠ Ġfb Resource Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġcolor Attachment Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġdepth Attachment Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbind ( ctx : ĠK xg Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfb Ġ= Ġfb Resource Ġ?: ĠFrame buffer Resource . create ( width , Ġheight , Ġctx ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfb Resource Ġ= Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Attachment Ġ= Ġthis @ Framebuffer . color Attachment ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdepth Attachment Ġ= Ġthis @ Framebuffer . depth Attachment ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfb . bind ( ctx ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġun bind ( ctx : ĠK xg Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfb Resource ?. unbind ( ctx ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠFrame buffer Resource Ġprivate Ġconstructor ( gl Ref : ĠAny , Ġval Ġwidth : ĠInt , Ġval Ġheight : ĠInt , Ġctx : ĠK xg Context ) Ġ: ĊĠĠĠĠĠĠĠ ĠGl Resource ( gl Ref , ĠType . FRAMEBUFFER , Ġctx ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġcreate ( width : ĠInt , Ġheight : ĠInt , Ġctx : ĠK xg Context ): ĠFrame buffer Resource Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFrame buffer Resource ( gl Create Framebuffer (), Ġwidth , Ġheight , Ġctx ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġfb Id Ġ= ĠUnique Id . next Id () ĊĊĠĠĠ Ġvar Ġcolor Attachment : ĠTexture ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġdepth Attachment : ĠTexture ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġis Fb Complete Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun Ġdelete ( ctx : ĠK xg Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġgl Delete Framebuffer ( this ) ĊĠĠĠĠĠĠĠ Ġsuper . delete ( ctx ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbind ( ctx : ĠK xg Context ) Ġ{ ĊĠĠĠĠĠĠĠ ĠglBind Framebuffer ( GL _ FRAMEBUFFER , Ġthis ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Fb Complete ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Fb Complete Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolor Ġ= Ġcolor Attachment ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( color Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . texture Mgr . bind Texture ( color , Ġctx ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgl Framebuffer Texture 2 D ( GL _ FRAMEBUFFER , ĠGL _ COLOR _ ATTACHMENT 0 , ĠGL _ TEXTURE _ 2 D , Ġcolor . res !! , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgl Draw Buffer ( GL _ NONE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgl Read Buffer ( GL _ NONE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdepth Ġ= Ġdepth Attachment ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( depth Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . texture Mgr . bind Texture ( depth , Ġctx ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgl Framebuffer Texture 2 D ( GL _ FRAMEBUFFER , ĠGL _ DEPTH _ ATTACHMENT , ĠGL _ TEXTURE _ 2 D , Ġdepth . res !! , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfb Status Ġ= Ġgl Check Framebuffer Status ( GL _ FRAMEBUFFER ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fb Status Ġ!= ĠGL _ FRAMEBUFFER _ COMPLETE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfix me : ĠImprove Ġdepth Ġrendering Ġperformance Ġon ĠOpenGL ĠES Ġ 2 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCurrently Ġdepth Ġrenderer Ġexpects Ġthat Ġthere Ġis Ġno Ġcolor Ġattachment Ġat Ġthe Ġdepth Ġframebuffer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthis Ġway Ġregular Ġshaders Ġcan Ġbe Ġused Ġduring Ġdepth Ġrendering Ġwithout Ġbig Ġperformance Ġimpact : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwithout Ġcolor Ġattachment Ġall Ġexpensive Ġfragment Ġshader Ġoperations Ġare Ġskipped . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠHowever Ġnot Ġevery Ġimplementation Ġsupports Ġhaving Ġonly Ġa Ġdepth Ġattachment , Ġso Ġwe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġneed Ġto Ġspecify Ġa Ġcolor Ġattachment Ġwhich Ġmakes Ġdepth Ġrendering Ġvery Ġexpensive ... ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( color Attachment Ġ== Ġnull Ġ&& Ġdepth Attachment Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Attachment Ġ= ĠF b Color Tex Data . color Tex ( width , Ġheight , Ġfb Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . texture Mgr . bind Texture ( color Attachment !! , Ġctx ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgl Framebuffer Texture 2 D ( GL _ FRAMEBUFFER , ĠGL _ COLOR _ ATTACHMENT 0 , ĠGL _ TEXTURE _ 2 D , Ġcolor Attachment !!. res !! , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgl Draw Buffer ( GL _ FRONT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgl Read Buffer ( GL _ FRONT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfb Status Ġ= Ġgl Check Framebuffer Status ( GL _ FRAMEBUFFER ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog W Ġ{ Ġ" Depth - framebuffer Ġis Ġincomplete Ġwithout Ġan Ġcolor Ġattachment , Ġadding Ġone Ġ( m akes Ġshadow Ġrendering Ġslow )" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fb Status Ġ!= ĠGL _ FRAMEBUFFER _ COMPLETE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog E Ġ{ Ġ" Framebuffer Ġis Ġincomplete , Ġstatus : Ġ$ fb Status , Ġhas - color : Ġ${ color Attachment Ġ!= Ġnull }, Ġhas - depth : Ġ${ depth Attachment Ġ!= Ġnull }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġctx . push Attributes () ĊĠĠĠĠĠĠĠ Ġctx . viewport Ġ= ĠK xg Context . Viewport ( 0 , Ġ 0 , Ġwidth , Ġheight ) ĊĠĠĠĠĠĠĠ Ġctx . apply Attributes () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġun bind ( ctx : ĠK xg Context ) Ġ{ ĊĠĠĠĠĠĠĠ ĠglBind Framebuffer ( GL _ FRAMEBUFFER , Ġnull ) ĊĠĠĠĠĠĠĠ Ġctx . pop Attributes () ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠF b Color Tex Data ( width : ĠInt , Ġheight : ĠInt ) Ġ: ĠTexture Data () Ġ{ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . is Available Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġthis . width Ġ= Ġwidth ĊĠĠĠĠĠĠĠ Ġthis . height Ġ= Ġheight ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonLoad ( texture : ĠTexture , Ġctx : ĠK xg Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġsets Ġup Ġthe Ġcolor Ġattachment Ġtexture ĊĠĠĠĠĠĠĠ Ġgl TexImage 2 D ( GL _ TEXTURE _ 2 D , Ġ 0 , ĠGL _ RGBA , Ġwidth , Ġheight , Ġ 0 , ĠGL _ RGBA , ĠGL _ UNSIGNED _ BYTE , Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġcolor Tex ( size X : ĠInt , Ġsize Y : ĠInt , Ġfb Id : ĠLong ): ĠTexture Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolor Props Ġ= ĠTexture Props (" framebuffer -$ fb Id - color ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGL _ LINEAR , ĠGL _ LINEAR , ĠGL _ CLAMP _ TO _ EDGE , ĠGL _ CLAMP _ TO _ EDGE , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠTexture ( color Props ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF b Color Tex Data ( size X , Ġsize Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠF b Depth Tex Data ( width : ĠInt , Ġheight : ĠInt ) Ġ: ĠTexture Data () Ġ{ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . is Available Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġthis . width Ġ= Ġwidth ĊĠĠĠĠĠĠĠ Ġthis . height Ġ= Ġheight ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonLoad ( texture : ĠTexture , Ġctx : ĠK xg Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġmake Ġsure Ġcorrect Ġfilter Ġmethod Ġis Ġset Ġ( GLES Ġonly Ġsupports ĠGL _ NE ARE ST Ġfor Ġdepth Ġtextures ) ĊĠĠĠĠĠĠĠ Ġgl TexParameter i ( GL _ TEXTURE _ 2 D , ĠGL _ TEXTURE _ MIN _ FILTER , Ġctx . gl Capabilities . depth Filter Method ) ĊĠĠĠĠĠĠĠ Ġgl TexParameter i ( GL _ TEXTURE _ 2 D , ĠGL _ TEXTURE _ MAG _ FILTER , Ġctx . gl Capabilities . depth Filter Method ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġsets Ġup Ġthe Ġdepth Ġattachment Ġtexture ĊĠĠĠĠĠĠĠ Ġgl TexImage 2 D ( GL _ TEXTURE _ 2 D , Ġ 0 , Ġctx . gl Capabilities . depth Component Int Format , Ġwidth , Ġheight , Ġ 0 , ĠGL _ DEPTH _ COMPONENT , ĠGL _ UNSIGNED _ INT , Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġdepth Tex ( size X : ĠInt , Ġsize Y : ĠInt , Ġfb Id : ĠLong ): ĠTexture Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdepth Props Ġ= ĠTexture Props (" framebuffer -$ fb Id - depth ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGL _ NE ARE ST , ĠGL _ NE ARE ST , ĠGL _ CLAMP _ TO _ EDGE , ĠGL _ CLAMP _ TO _ EDGE , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠTexture ( depth Props ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF b Depth Tex Data ( size X , Ġsize Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }