# pragma region License
/*
License ( OLC - 3 )
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
Copyright 2024 Joshua Sigona < sigonasr2 @ gmail . com >
Redistribution and use in source and binary forms , with or without modification ,
are permitted provided that the following conditions are met :
1. Redistributions or derivations of source code must retain the above copyright
notice , this list of conditions and the following disclaimer .
2. Redistributions or derivative works in binary form must reproduce the above
copyright notice . This list of conditions and the following disclaimer must be
reproduced in the documentation and / or other materials provided with the distribution .
3. Neither the name of the copyright holder nor the names of its contributors may
be used to endorse or promote products derived from this software without specific
prior written permission .
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS " AS IS " AND ANY
EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED . IN NO EVENT
SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT , INDIRECT ,
INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES ( INCLUDING , BUT NOT LIMITED
TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ; LOSS OF USE , DATA , OR PROFITS ; OR
BUSINESS INTERRUPTION ) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY , WHETHER IN
CONTRACT , STRICT LIABILITY , OR TORT ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE .
Portions of this software are copyright © 2024 The FreeType
Project ( www . freetype . org ) . Please see LICENSE_FT . txt for more information .
All rights reserved .
*/
# pragma endregion
# pragma once
# include <stdlib.h>
# include "olcUTIL_Geometry2D.h"
# include "olcPGEX_TTF.h"
# include <random>
namespace olc : : util {
//Returns 0-range (as a float).
float random ( float range ) ;
//Returns a random float value min(inclusive) to max(exclusive).
const float random_range ( const float min , const float max ) ;
//Returns 0-32767 (as an int).
int random ( ) ;
//Returns a normalized vector pointing from posFrom towards posTo.
vf2d pointTo ( vf2d posFrom , vf2d posTo ) ;
//Returns the angle (in radians) pointing from posFrom towards posTo.
float angleTo ( vf2d posFrom , vf2d posTo ) ;
float degToRad ( float deg ) ;
float radToDeg ( float rad ) ;
float lerp ( float n1 , float n2 , double t ) ;
std : : string PixelToHTMLColorCode ( const Pixel & col ) ;
std : : string timerStr ( float time ) ;
std : : string WrapText ( PixelGameEngine * pge , std : : string str , int width , bool proportional , vd2d scale ) ;
std : : u32string WrapText ( PixelGameEngine * pge , std : : u32string str , int width , Font & font , vd2d scale ) ;
float angle_difference ( float angle_1 , float angle_2 ) ;
std : : string GetHash ( std : : string file ) ;
const float distance ( const vf2d & point1 , const vf2d & point2 ) ;
//Modifies angle argument directly to turn towards said direction. rate is in radians, please multiply by fElapsedTime if you intend to use this per frame.
void turn_towards_direction ( float & angle , float target , float rate ) ;
}
template < class TL , class TR >
constexpr auto circ_add (
const TL & lhs ,
const TR & rhs ,
const decltype ( lhs + rhs ) rmin = 0 ,
const decltype ( lhs + rhs ) rmax = 360 )
{
auto c = lhs + rhs ;
auto range = rmax - rmin ;
while ( c > = rmax ) c - = range ;
while ( c < rmin ) c + = range ;
return c ;
}
//Converts unit distances to pixels. (Every 100 units = 24 pixels)
long double operator " " _Pixels ( long double unitDist ) ;