package Ġass imp Ċ Ċ import Ġass imp . Ai Post Process Steps Ġas ĠP ps Ċ import Ġass imp . Ai Shading Mode Ġas ĠSm Ċ Ċ object ĠOpt imize Mes hes Ġ: ĠBase Process (){ ĊĠĠĠ Ġprivate Ġval ĠNot Set Ġ= Ġ 0 xffffffff ĊĠĠĠ Ġprivate Ġval ĠDead B eef Ġ= Ġ 0 xde ad beef ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Scene Ġ: ĠA i Scene ĊĠĠĠ Ġprivate Ġvar Ġpts Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġmax Vert s Ġ= ĠNot Set ĊĠĠĠ Ġprivate Ġvar Ġmax Faces Ġ= ĠNot Set ĊĠĠĠ Ġvar Ġmeshes Ġ= ĠArrayList < Mesh Info >() ĊĠĠĠ Ġvar Ġoutput Ġ= ĠArrayList < Ai Mesh >() ĊĠĠĠ Ġprivate Ġvar Ġmerge _ list Ġ= ĠArrayList < Ai Mesh >() ĊĊĠĠĠ Ġoverride Ġfun ĠisActive ( flags : ĠInt ) Ġ: ĠBoolean { ĊĠĠĠĠĠĠĠ Ġif ( flags Ġhas ĠP ps . Optimize Mes hes ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpts Ġ= Ġflags Ġhas ĠP ps . Sort By P Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax Vert s Ġ= Ġwhen ( flags Ġhas ĠP ps . Split Large Mes hes ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> ĠDead B eef ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġ-> Ġmax Vert s ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġexecute ( scene : ĠA i Scene ){ ĊĠĠĠĠĠĠĠ Ġval Ġold Num Ġ= Ġscene . num Mes hes ĊĠĠĠĠĠĠĠ Ġif Ġ( old Num Ġ<= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug (" Skipping ĠOpt imize Mes hes Process ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlogger . debug (" Optimize Mes hes Process Ġbegin ") ĊĊĠĠĠĠĠĠĠ Ġm Scene Ġ= Ġscene ĊĊĠĠĠĠĠĠĠ Ġfind Inst anced Mes hes ( m Scene . root Node ) ĊĠĠĠĠĠĠĠ Ġif ( Ġmax Vert s Ġ== ĠDead B eef Ġ) Ġ/* Ġundo Ġthe Ġmagic Ġhack Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax Vert s Ġ= ĠNot Set ĊĊĠĠĠĠĠĠĠ Ġvar Ġn Ġ: ĠLong Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġm Scene . num Mes hes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmeshes [ i ]. vertex _ format Ġ= ĠProcess Helper . get Mesh V Format Unique ( m Scene . meshes [ i ]) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( meshes [ i ]. instance _ cnt Ġ> Ġ 1 Ġ&& Ġmeshes [ i ]. output _ id Ġ== ĠNot Set Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeshes [ i ]. output _ id Ġ= Ġn ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . add ( m Scene . meshes [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprocess Node ( m Scene . root Node ) ĊĠĠĠĠĠĠĠ Ġif Ġ( output . size Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Optimize Mes hes : ĠNo Ġmeshes Ġremaining ; Ġthere 's Ġdefinitely Ġsomething Ġwrong ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmeshes Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠ Ġassert ( output . size Ġ<= Ġold Num ) ĊĊĠĠĠĠĠĠĠ Ġm Scene . num Mes hes Ġ= Ġoutput . size ĊĠĠĠĠĠĠĠ ĠSystem . arraycopy ( output , 0 , m Scene . meshes , 0 , output . size ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( output . size Ġ!= Ġold Num ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Optimize Mes hes Process Ġfinished . ĠInput Ġmeshes : Ġ% d , ĠOutput Ġmeshes : Ġ% d ", old Num , m Scene . num Mes hes ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug ( Ġ" Optimize Mes hes Process Ġfinished " Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsetup Properties ( imp : ĠImport er ){ ĊĠĠĠĠĠĠĠ Ġif ( max Vert s Ġ== ĠDead B eef ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTODO () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// max Faces Ġ= Ġimp . getProperty Integer ( AI _ CONFIG _ PP _ SL M _ TRI ANGLE _ LIMIT , AI _ SL M _ DEFAULT _ MAX _ TRI ANG LES ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// max Vert s Ġ= Ġimp . getProperty Integer ( AI _ CONFIG _ PP _ SL M _ VERTEX _ LIMIT , AI _ SL M _ DEFAULT _ MAX _ VERT ICES ); ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfind Inst anced Mes hes Ġ( p Node : ĠA i Node ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġfor ( i Ġin Ġ 0 Ġuntil Ġp Node . num Mes hes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ++ meshes [ Ġp Node . meshes [ Ġi Ġ] Ġ]. instance _ cnt ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor ( i Ġin Ġ 0 Ġuntil Ġp Node . num Children ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfind Inst anced Mes hes ( Ġp Node . children [ Ġi Ġ] Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġprocess Node ( p Node : ĠA i Node ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġp Node . num Mes hes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġim Ġ= Ġp Node . meshes [ i ] ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( meshes [ im ]. instance _ cnt Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġim Ġ= Ġmeshes [ im ]. output _ id . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmerge _ list Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġvert s Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfaces Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFind Ġmeshes Ġto Ġmerge Ġwith Ġus ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġa Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile ( a Ġ< Ġp Node . num Mes hes ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġam Ġ= Ġp Node . meshes [ a ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( meshes [ am ]. instance _ cnt Ġ== Ġ 1 Ġ&& Ġcan Join ( im , am , verts , faces )) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmerge _ list . add ( m Scene . meshes [ am ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvert s Ġ+= Ġm Scene . meshes [ am ]. num Vertices ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfaces Ġ+= Ġm Scene . meshes [ am ]. num Faces ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp Node . meshes [ a ] Ġ= Ġp Node . meshes [ p Node . num Mes hes Ġ- Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-- p Node . num Mes hes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-- a ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ++ a ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġand Ġmerge Ġall Ġmeshes Ġwhich Ġwe Ġfound , Ġreplace Ġthe Ġold Ġones ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( merge _ list . size Ġ!= Ġ 0 Ġ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmerge _ list . add ( m Scene . meshes [ im ]) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġout Ġ= ĠArrayList < Ai Mesh >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠScene Combin er . merge Mes hes ( out , 0 , merge _ list , 0 , merge _ list . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( o Mesh Ġin Ġout ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . add ( o Mesh ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . add ( m Scene . meshes [ im ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġim Ġ= Ġoutput . size Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġfor ( i Ġin Ġ 0 Ġuntil Ġp Node . num Children ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Node ( Ġp Node . children [ Ġi Ġ] Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcan Join ( a Ġ: ĠInt , Ġb Ġ: ĠInt , Ġvert s : ĠInt , Ġfaces : ĠInt Ġ) Ġ: ĠBoolean ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( meshes [ a ]. vertex _ format Ġ!= Ġmeshes [ b ]. vertex _ format ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġvar Ġma Ġ= Ġm Scene . meshes [ a ] ĊĠĠĠĠĠĠĠ Ġvar Ġmb Ġ= Ġm Scene . meshes [ b ] ĊĊĠĠĠĠĠĠĠ Ġif Ġ(( Not Set Ġ!= Ġmax Vert s Ġ&& Ġvert s + mb . num Vertices Ġ> Ġmax Vert s ) Ġ|| Ġ( Not Set Ġ!= Ġmax Faces Ġ&& Ġfaces + mb . num Faces ĠĠĠ Ġ> Ġmax Faces )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠNever Ġmerge Ġun skin ned Ġmeshes Ġwith Ġskin ned Ġmeshes ĊĠĠĠĠĠĠĠ Ġif Ġ( ma . material Index Ġ!= Ġmb . material Index Ġ|| Ġma . has B ones Ġ!= Ġmb . has B ones ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ// ĠNever Ġmerge Ġmeshes Ġwith Ġdifferent Ġkinds Ġof Ġprimitives Ġif ĠSort By P Type Ġdid Ġalready ĊĠĠĠĠĠĠĠ Ġ// Ġdo Ġits Ġwork . ĠWe Ġwould Ġdestroy Ġeverything Ġagain Ġ... ĊĠĠĠĠĠĠĠ Ġif Ġ( pts Ġ&& Ġma . primitive Types Ġ!= Ġmb . primitive Types ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġboth Ġmeshes Ġare Ġskin ned , Ġcheck Ġwhether Ġwe Ġhave Ġmany Ġbones Ġdefined Ġin Ġboth Ġmeshes . ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġyes , Ġwe Ġcan Ġjoin Ġthem . ĊĠĠĠĠĠĠĠ Ġif Ġ( ma . has B ones ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġclass ĠMesh Info { ĊĠĠĠĠĠĠĠ Ġ//! ĠNumber Ġof Ġtimes Ġthis Ġmesh Ġis Ġreferenced ĊĠĠĠĠĠĠĠ Ġvar Ġinstance _ cnt Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ//! ĠVertex Ġformat Ġid ĊĠĠĠĠĠĠĠ Ġvar Ġvertex _ format Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ//! ĠOutput ĠID ĊĠĠĠĠĠĠĠ Ġvar Ġoutput _ id Ġ= Ġ 0 xffffffff ĊĠĠĠ Ġ} ĊĊĊ Ċ }