package Ġorg . val ky ri ens k ies . core . collision Ċ Ċ import Ġorg . j om l . Vector 3 dc Ċ import Ġkotlin . math . abs Ċ Ċ /** Ċ Ġ* ĠA Ġbasic Ġimplementation Ġof Ġ[ Convex Polygon Collider ] Ġusing Ġthe ĠSepar ating ĠAxis ĠThe orem Ġalgorithm . Ċ Ġ*/ Ċ object ĠS AT Convex Polygon Collider Ġ: ĠConv ex Polygon Collider Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġcheck If Coll iding ( ĊĠĠĠĠĠĠĠ Ġfirst Polygon : ĠConv ex Polygon c , ĊĠĠĠĠĠĠĠ Ġsecond Polygon : ĠConv ex Polygon c , ĊĠĠĠĠĠĠĠ Ġfirst Polygon Velocity : ĠVector 3 dc , ĊĠĠĠĠĠĠĠ Ġnormals : ĠIterator < Vector 3 dc >, ĊĠĠĠĠĠĠĠ Ġcollision Result : ĠCollision Result , ĊĠĠĠĠĠĠĠ Ġtemp 1 : ĠCollision Range , ĊĠĠĠĠĠĠĠ Ġtemp 2 : ĠCollision Range , ĊĠĠĠĠĠĠĠ Ġforced Response Normal : ĠVector 3 dc ? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġmin Collision Depth Ġ= ĠDouble . MAX _ VALUE ĊĠĠĠĠĠĠĠ Ġcollision Result ._ coll iding Ġ= Ġtrue Ġ// ĠInit ially Ġassume Ġthat Ġpoly gons Ġare Ġcol li ded ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( normal Ġin Ġnormals ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCalculate Ġthe Ġoverlapping Ġrange Ġof Ġthe Ġprojection Ġof Ġboth Ġpoly gons Ġalong Ġthe Ġ[ normal ] Ġaxis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrange Overlap Response Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompute Collision Response Al ong Normal ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Polygon , Ġsecond Polygon , Ġfirst Polygon Velocity , Ġnormal , Ġtemp 1 , Ġtemp 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( abs ( range Overlap Response ) Ġ< Ġ 1 . 0 e - 6 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPoly gons Ġare Ġseparated Ġalong Ġ[ normal ], Ġtherefore Ġthey Ġare ĠNOT Ġcoll iding ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollision Result ._ coll iding Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( forced Response Normal Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdot Product Ġ= Ġforced Response Normal . dot ( normal ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( abs ( dot Product ) Ġ< Ġ 1 e - 6 ) Ġcontinue Ġ// ĠSkip ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodified Range Overlap Response Ġ= Ġrange Overlap Response Ġ/ Ġdot Product ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPoly gons Ġare Ġcoll iding Ġalong Ġthis Ġaxis , Ġdoesn 't Ġguarantee Ġif Ġthe Ġpoly gons Ġare Ġcoll iding Ġor Ġnot ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcollision Depth Ġ= Ġabs ( modified Range Overlap Response ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( collision Depth Ġ< Ġmin Collision Depth ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin Collision Depth Ġ= Ġcollision Depth ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollision Result ._ collision Axis . set ( forced Response Normal ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollision Result ._ pen e tration Offset Ġ= Ġmodified Range Overlap Response ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPoly gons Ġare Ġcoll iding Ġalong Ġthis Ġaxis , Ġdoesn 't Ġguarantee Ġif Ġthe Ġpoly gons Ġare Ġcoll iding Ġor Ġnot ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcollision Depth Ġ= Ġabs ( range Overlap Response ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( collision Depth Ġ< Ġmin Collision Depth ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin Collision Depth Ġ= Ġcollision Depth ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollision Result ._ collision Axis . set ( normal ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollision Result ._ pen e tration Offset Ġ= Ġrange Overlap Response ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( min Collision Depth Ġ== ĠDouble . MAX _ VALUE ) Ġcollision Result ._ coll iding Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcompute Collision Response Al ong Normal ( ĊĠĠĠĠĠĠĠ Ġfirst Polygon : ĠConv ex Polygon c , ĊĠĠĠĠĠĠĠ Ġsecond Polygon : ĠConv ex Polygon c , ĊĠĠĠĠĠĠĠ Ġfirst Polygon Velocity : ĠVector 3 dc , ĊĠĠĠĠĠĠĠ Ġnormal : ĠVector 3 dc , ĊĠĠĠĠĠĠĠ Ġtemp 1 : ĠCollision Range , ĊĠĠĠĠĠĠĠ Ġtemp 2 : ĠCollision Range ĊĠĠĠ Ġ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġif Ġthe Ġpoly gons Ġare Ġseparated Ġalong Ġthe Ġ[ normal ] Ġaxis ĊĠĠĠĠĠĠĠ Ġval Ġfirst Collision Range : ĠCollision Range c Ġ= Ġfirst Polygon . get Projection Al ong Axis ( normal , Ġtemp 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġsecond Collision Range : ĠCollision Range c Ġ= Ġsecond Polygon . get Projection Al ong Axis ( normal , Ġtemp 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġfirst Range Velocity Al ong Normal Ġ= Ġfirst Polygon Velocity . dot ( normal ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠCollision Range c . compute Collision Response ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Collision Range , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsecond Collision Range , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Range Velocity Al ong Normal ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ