@ -194,7 +194,7 @@
Author
~ ~ ~ ~ ~ ~
David Barr , aka javidx9 , © OneLoneCoder 2018 , 2019 , 2020 , 2021
David Barr , aka javidx9 , © OneLoneCoder 2018 , 2019 , 2020 , 2021
*/
# pragma endregion
@ -1306,13 +1306,9 @@ namespace olc
{
if ( x > = 0 & & x < width & & y > = 0 & & y < height )
return pColData [ y * width + x ] ;
else
return Pixel ( 0 , 0 , 0 , 0 ) ;
}
else
{
return pColData [ abs ( y % height ) * width + abs ( x % width ) ] ;
return Pixel ( 0 , 0 , 0 , 0 ) ;
}
return pColData [ abs ( y % height ) * width + abs ( x % width ) ] ;
}
bool Sprite : : SetPixel ( int32_t x , int32_t y , Pixel p )
@ -1322,8 +1318,7 @@ namespace olc
pColData [ y * width + x ] = p ;
return true ;
}
else
return false ;
return false ;
}
Pixel Sprite : : Sample ( float x , float y ) const
@ -1438,12 +1433,9 @@ namespace olc
pDecal = std : : make_unique < olc : : Decal > ( pSprite . get ( ) , filter , clamp ) ;
return olc : : rcode : : OK ;
}
else
{
pSprite . release ( ) ;
pSprite = nullptr ;
return olc : : rcode : : NO_FILE ;
}
pSprite . release ( ) ;
pSprite = nullptr ;
return olc : : rcode : : NO_FILE ;
}
olc : : Decal * Renderable : : Decal ( ) const
@ -1764,16 +1756,14 @@ namespace olc
{
if ( pDrawTarget )
return pDrawTarget - > width ;
else
return 0 ;
return 0 ;
}
int32_t PixelGameEngine : : GetDrawTargetHeight ( ) const
{
if ( pDrawTarget )
return pDrawTarget - > height ;
else
return 0 ;
return 0 ;
}
uint32_t PixelGameEngine : : GetFPS ( ) const
@ -1830,9 +1820,7 @@ namespace olc
if ( ! pDrawTarget ) return false ;
if ( nPixelMode = = Pixel : : NORMAL )
{
return pDrawTarget - > SetPixel ( x , y , p ) ;
}
if ( nPixelMode = = Pixel : : MASK )
{
@ -1852,9 +1840,7 @@ namespace olc
}
if ( nPixelMode = = Pixel : : CUSTOM )
{
return pDrawTarget - > SetPixel ( x , y , funcPixelMode ( x , y , p , pDrawTarget - > GetPixel ( x , y ) ) ) ;
}
return false ;
}
@ -1952,33 +1938,34 @@ namespace olc
if ( radius > 0 )
{
int x0 = 0 ;
int y0 = radius ;
int d = 3 - 2 * radius ;
Draw ( x , y , p ) ;
return ;
}
while ( y0 > = x0 ) // only formulate 1/8 of circle
{
// Draw even octants
if ( mask & 0x01 ) Draw ( x + x0 , y - y0 , p ) ; // Q6 - upper right right
if ( mask & 0x04 ) Draw ( x + y0 , y + x0 , p ) ; // Q4 - lower lower right
if ( mask & 0x10 ) Draw ( x - x0 , y + y0 , p ) ; // Q2 - lower left left
if ( mask & 0x40 ) Draw ( x - y0 , y - x0 , p ) ; // Q0 - upper upper left
if ( x0 ! = 0 & & x0 ! = y0 )
{
if ( mask & 0x02 ) Draw ( x + y0 , y - x0 , p ) ; // Q7 - upper upper right
if ( mask & 0x08 ) Draw ( x + x0 , y + y0 , p ) ; // Q5 - lower right right
if ( mask & 0x20 ) Draw ( x - y0 , y + x0 , p ) ; // Q3 - lower lower left
if ( mask & 0x80 ) Draw ( x - x0 , y - y0 , p ) ; // Q1 - upper left left
}
int x0 = 0 ;
int y0 = radius ;
int d = 3 - 2 * radius ;
if ( d < 0 )
d + = 4 * x0 + + + 6 ;
else
d + = 4 * ( x0 + + - y0 - - ) + 10 ;
while ( y0 > = x0 ) // only formulate 1/8 of circle
{
// Draw even octants
if ( mask & 0x01 ) Draw ( x + x0 , y - y0 , p ) ; // Q6 - upper right right
if ( mask & 0x04 ) Draw ( x + y0 , y + x0 , p ) ; // Q4 - lower lower right
if ( mask & 0x10 ) Draw ( x - x0 , y + y0 , p ) ; // Q2 - lower left left
if ( mask & 0x40 ) Draw ( x - y0 , y - x0 , p ) ; // Q0 - upper upper left
if ( x0 ! = 0 & & x0 ! = y0 )
{
if ( mask & 0x02 ) Draw ( x + y0 , y - x0 , p ) ; // Q7 - upper upper right
if ( mask & 0x08 ) Draw ( x + x0 , y + y0 , p ) ; // Q5 - lower right right
if ( mask & 0x20 ) Draw ( x - y0 , y + x0 , p ) ; // Q3 - lower lower left
if ( mask & 0x80 ) Draw ( x - x0 , y - y0 , p ) ; // Q1 - upper left left
}
if ( d < 0 )
d + = 4 * x0 + + + 6 ;
else
d + = 4 * ( x0 + + - y0 - - ) + 10 ;
}
else
Draw ( x , y , p ) ;
}
void PixelGameEngine : : FillCircle ( const olc : : vi2d & pos , int32_t radius , Pixel p )
@ -1991,36 +1978,37 @@ namespace olc
if ( radius > 0 )
{
int x0 = 0 ;
int y0 = radius ;
int d = 3 - 2 * radius ;
Draw ( x , y , p ) ;
return ;
}
auto drawline = [ & ] ( int sx , int ex , int y )
{
for ( int x = sx ; x < = ex ; x + + )
Draw ( x , y , p ) ;
} ;
int x0 = 0 ;
int y0 = radius ;
int d = 3 - 2 * radius ;
while ( y0 > = x0 )
{
drawline ( x - y0 , x + y0 , y - x0 ) ;
if ( x0 > 0 ) drawline ( x - y0 , x + y0 , y + x0 ) ;
auto drawline = [ & ] ( int sx , int ex , int y )
{
for ( int x = sx ; x < = ex ; x + + )
Draw ( x , y , p ) ;
} ;
if ( d < 0 )
d + = 4 * x0 + + + 6 ;
else
while ( y0 > = x0 )
{
drawline ( x - y0 , x + y0 , y - x0 ) ;
if ( x0 > 0 ) drawline ( x - y0 , x + y0 , y + x0 ) ;
if ( d < 0 )
d + = 4 * x0 + + + 6 ;
else
{
if ( x0 ! = y0 )
{
if ( x0 ! = y0 )
{
drawline ( x - x0 , x + x0 , y - y0 ) ;
drawline ( x - x0 , x + x0 , y + y0 ) ;
}
d + = 4 * ( x0 + + - y0 - - ) + 10 ;
drawline ( x - x0 , x + x0 , y - y0 ) ;
drawline ( x - x0 , x + x0 , y + y0 ) ;
}
d + = 4 * ( x0 + + - y0 - - ) + 10 ;
}
}
else
Draw ( x , y , p ) ;
}
void PixelGameEngine : : DrawRect ( const olc : : vi2d & pos , const olc : : vi2d & size , Pixel p )
@ -2552,22 +2540,22 @@ namespace olc
di . uv = { { 0.0f , 0.0f } , { 0.0f , 1.0f } , { 1.0f , 1.0f } , { 1.0f , 0.0f } } ;
olc : : vf2d center ;
float rd = ( ( pos [ 2 ] . x - pos [ 0 ] . x ) * ( pos [ 3 ] . y - pos [ 1 ] . y ) - ( pos [ 3 ] . x - pos [ 1 ] . x ) * ( pos [ 2 ] . y - pos [ 0 ] . y ) ) ;
if ( rd ! = 0 )
if ( rd = = 0 ) return ;
rd = 1.0f / rd ;
float rn = ( ( pos [ 3 ] . x - pos [ 1 ] . x ) * ( pos [ 0 ] . y - pos [ 1 ] . y ) - ( pos [ 3 ] . y - pos [ 1 ] . y ) * ( pos [ 0 ] . x - pos [ 1 ] . x ) ) * rd ;
float sn = ( ( pos [ 2 ] . x - pos [ 0 ] . x ) * ( pos [ 0 ] . y - pos [ 1 ] . y ) - ( pos [ 2 ] . y - pos [ 0 ] . y ) * ( pos [ 0 ] . x - pos [ 1 ] . x ) ) * rd ;
if ( ! ( rn < 0.f | | rn > 1.f | | sn < 0.f | | sn > 1.f ) ) center = pos [ 0 ] + rn * ( pos [ 2 ] - pos [ 0 ] ) ;
float d [ 4 ] ; for ( int i = 0 ; i < 4 ; i + + ) d [ i ] = ( pos [ i ] - center ) . mag ( ) ;
for ( int i = 0 ; i < 4 ; i + + )
{
rd = 1.0f / rd ;
float rn = ( ( pos [ 3 ] . x - pos [ 1 ] . x ) * ( pos [ 0 ] . y - pos [ 1 ] . y ) - ( pos [ 3 ] . y - pos [ 1 ] . y ) * ( pos [ 0 ] . x - pos [ 1 ] . x ) ) * rd ;
float sn = ( ( pos [ 2 ] . x - pos [ 0 ] . x ) * ( pos [ 0 ] . y - pos [ 1 ] . y ) - ( pos [ 2 ] . y - pos [ 0 ] . y ) * ( pos [ 0 ] . x - pos [ 1 ] . x ) ) * rd ;
if ( ! ( rn < 0.f | | rn > 1.f | | sn < 0.f | | sn > 1.f ) ) center = pos [ 0 ] + rn * ( pos [ 2 ] - pos [ 0 ] ) ;
float d [ 4 ] ; for ( int i = 0 ; i < 4 ; i + + ) d [ i ] = ( pos [ i ] - center ) . mag ( ) ;
for ( int i = 0 ; i < 4 ; i + + )
{
float q = d [ i ] = = 0.0f ? 1.0f : ( d [ i ] + d [ ( i + 2 ) & 3 ] ) / d [ ( i + 2 ) & 3 ] ;
di . uv [ i ] * = q ; di . w [ i ] * = q ;
di . pos [ i ] = { ( pos [ i ] . x * vInvScreenSize . x ) * 2.0f - 1.0f , ( ( pos [ i ] . y * vInvScreenSize . y ) * 2.0f - 1.0f ) * - 1.0f } ;
}
di . mode = nDecalMode ;
vLayers [ nTargetLayer ] . vecDecalInstance . push_back ( di ) ;
float q = d [ i ] = = 0.0f ? 1.0f : ( d [ i ] + d [ ( i + 2 ) & 3 ] ) / d [ ( i + 2 ) & 3 ] ;
di . uv [ i ] * = q ; di . w [ i ] * = q ;
di . pos [ i ] = { ( pos [ i ] . x * vInvScreenSize . x ) * 2.0f - 1.0f , ( ( pos [ i ] . y * vInvScreenSize . y ) * 2.0f - 1.0f ) * - 1.0f } ;
}
di . mode = nDecalMode ;
vLayers [ nTargetLayer ] . vecDecalInstance . push_back ( di ) ;
}
void PixelGameEngine : : DrawWarpedDecal ( olc : : Decal * decal , const std : : array < olc : : vf2d , 4 > & pos , const olc : : Pixel & tint )