diff --git a/.vscode/settings.json b/.vscode/settings.json index 512f7cd..0e08f43 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -3,6 +3,14 @@ "*.rmd": "markdown", "xutility": "cpp", "initializer_list": "cpp", - "utility": "cpp" + "utility": "cpp", + "strings.h": "c", + "cracking_os.h": "c", + "cracking_compiler.h": "c", + "cracking_arch.h": "c", + "algorithm": "cpp", + "optional": "cpp", + "type_traits": "cpp", + "xtr1common": "cpp" } } \ No newline at end of file diff --git a/code/base.h b/code/base.h index a901809..2dbb959 100644 --- a/code/base.h +++ b/code/base.h @@ -1,15 +1,24 @@ +#ifdef INTELLISENSE_DIRECTIVES +#pragma once +#endif + // base outline // intended for "As-Is" library usage -#include "base/arch.h" -#include "base/compiler.h" -#include "base/cstd.h" +#include "base/cracking_arch.h" +#include "base/cracking_compiler.h" +#include "base/cracking_os.h" +#include "base/linkage.h" #include "base/macros.h" +#include "base/namespace.h" +#include "base/platform.h" MD_NS_BEGIN +#include "os.h" #include "base/base_types.h" #include "base/memory.h" #include "base/zpl_memory.h" +#include "base/strings.h" MD_NS_END diff --git a/code/base/base_types.h b/code/base/base_types.h index 5513969..3d727d6 100644 --- a/code/base/base_types.h +++ b/code/base/base_types.h @@ -1,49 +1,8 @@ #ifdef MD_INTELLISENSE_DIRECTIVES -#pragma once -#include "macros.h" +# pragma once +# include "macros.h" #endif -#pragma region Basic Types - -#define MD_U8_MIN 0u -#define MD_U8_MAX 0xffu -#define MD_I8_MIN ( -0x7f - 1 ) -#define MD_I8_MAX 0x7f - -#define MD_U16_MIN 0u -#define MD_U16_MAX 0xffffu -#define MD_I16_MIN ( -0x7fff - 1 ) -#define MD_I16_MAX 0x7fff - -#define MD_U32_MIN 0u -#define MD_U32_MAX 0xffffffffu -#define MD_I32_MIN ( -0x7fffffff - 1 ) -#define MD_I32_MAX 0x7fffffff - -#define MD_U64_MIN 0ull -#define MD_U64_MAX 0xffffffffffffffffull -#define MD_I64_MIN ( -0x7fffffffffffffffll - 1 ) -#define MD_I64_MAX 0x7fffffffffffffffll - -#if defined( MD_ARCH_32_BIT ) -# define MD_USIZE_MIN GEN_U32_MIN -# define MD_USIZE_MAX GEN_U32_MAX -# define MD_ISIZE_MIN GEN_S32_MIN -# define MD_ISIZE_MAX GEN_S32_MAX -#elif defined( MD_ARCH_64_BIT ) -# define MD_USIZE_MIN GEN_U64_MIN -# define MD_USIZE_MAX GEN_U64_MAX -# define MD_ISIZE_MIN GEN_I64_MIN -# define MD_ISIZE_MAX GEN_I64_MAX -#else -# error Unknown architecture size. This library only supports 32 bit and 64 bit architectures. -#endif - -#define MD_F32_MIN 1.17549435e-38f -#define MD_F32_MAX 3.40282347e+38f -#define MD_F64_MIN 2.2250738585072014e-308 -#define MD_F64_MAX 1.7976931348623157e+308 - #if defined( MD_COMPILER_MSVC ) # if _MSC_VER < 1300 typedef unsigned char U8; @@ -107,7 +66,7 @@ typedef unsigned __int64 UPTR; # else # define _W64 # endif -# endifk +# endif typedef _W64 signed int SPTR; typedef _W64 unsigned int UPTR; #else diff --git a/code/base/command_line.c b/code/base/command_line.c index 2c76158..6e09e8f 100644 --- a/code/base/command_line.c +++ b/code/base/command_line.c @@ -1,3 +1,8 @@ +#ifdef MD_INTELLISENSE_DIRECTIVES +#pragma once +#include "command_line.h" +#endif + // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) @@ -7,40 +12,40 @@ internal U64 cmd_line_hash_from_string(String8 string) { - U64 result = 5381; - for(U64 i = 0; i < string.size; i += 1) - { - result = ((result << 5) + result) + string.str[i]; - } - return result; + U64 result = 5381; + for(U64 i = 0; i < string.size; i += 1) + { + result = ((result << 5) + result) + string.str[i]; + } + return result; } internal CmdLineOpt ** cmd_line_slot_from_string(CmdLine *cmd_line, String8 string) { - CmdLineOpt **slot = 0; - if(cmd_line->option_table_size != 0) - { - U64 hash = cmd_line_hash_from_string(string); - U64 bucket = hash % cmd_line->option_table_size; - slot = &cmd_line->option_table[bucket]; - } - return slot; + CmdLineOpt **slot = 0; + if(cmd_line->option_table_size != 0) + { + U64 hash = cmd_line_hash_from_string(string); + U64 bucket = hash % cmd_line->option_table_size; + slot = &cmd_line->option_table[bucket]; + } + return slot; } internal CmdLineOpt * cmd_line_opt_from_slot(CmdLineOpt **slot, String8 string) { - CmdLineOpt *result = 0; - for(CmdLineOpt *var = *slot; var; var = var->hash_next) - { - if(str8_match(string, var->string, 0)) - { - result = var; - break; - } - } - return result; + CmdLineOpt *result = 0; + for(CmdLineOpt *var = *slot; var; var = var->hash_next) + { + if(str8_match(string, var->string, 0)) + { + result = var; + break; + } + } + return result; } internal void diff --git a/code/base/command_line.h b/code/base/command_line.h index d2ae34c..2053f7a 100644 --- a/code/base/command_line.h +++ b/code/base/command_line.h @@ -1,6 +1,5 @@ #ifdef MD_INTELLISENSE_DIRECTIVES #pragma once -#include "base_types.h" #include "strings.h" #endif @@ -24,34 +23,32 @@ struct CmdLineOpt typedef struct CmdLineOptList CmdLineOptList; struct CmdLineOptList { - U64 count; - CmdLineOpt *first; - CmdLineOpt *last; + U64 count; + CmdLineOpt* first; + CmdLineOpt* last; }; typedef struct CmdLine CmdLine; struct CmdLine { - String8 exe_name; + String8 exe_name; CmdLineOptList options; - String8List inputs; - U64 option_table_size; - CmdLineOpt **option_table; + String8List inputs; + U64 option_table_size; + CmdLineOpt** option_table; }; //////////////////////////////// //~ NOTE(rjf): Command Line Option Parsing -internal U64 cmd_line_hash_from_string(String8 string); -internal CmdLineOpt** cmd_line_slot_from_string(CmdLine *cmd_line, String8 string); -internal CmdLineOpt* cmd_line_opt_from_slot(CmdLineOpt **slot, String8 string); -internal void cmd_line_push_opt(CmdLineOptList *list, CmdLineOpt *var); -internal CmdLineOpt* cmd_line_insert_opt(Arena *arena, CmdLine *cmd_line, String8 string, String8List values); -internal CmdLine cmd_line_from_string_list(Arena *arena, String8List arguments); -internal CmdLineOpt* cmd_line_opt_from_string(CmdLine *cmd_line, String8 name); -internal String8List cmd_line_strings(CmdLine *cmd_line, String8 name); -internal String8 cmd_line_string(CmdLine *cmd_line, String8 name); -internal B32 cmd_line_has_flag(CmdLine *cmd_line, String8 name); -internal B32 cmd_line_has_argument(CmdLine *cmd_line, String8 name); - -#endif // BASE_COMMAND_LINE_H +internal U64 cmd_line_hash_from_string(String8 string); +internal CmdLineOpt** cmd_line_slot_from_string(CmdLine *cmd_line, String8 string); +internal CmdLineOpt* cmd_line_opt_from_slot (CmdLineOpt **slot, String8 string); +internal void cmd_line_push_opt (CmdLineOptList *list, CmdLineOpt *var); +internal CmdLineOpt* cmd_line_insert_opt (Arena *arena, CmdLine *cmd_line, String8 string, String8List values); +internal CmdLine cmd_line_from_string_list(Arena *arena, String8List arguments); +internal CmdLineOpt* cmd_line_opt_from_string (CmdLine *cmd_line, String8 name); +internal String8List cmd_line_strings (CmdLine *cmd_line, String8 name); +internal String8 cmd_line_string (CmdLine *cmd_line, String8 name); +internal B32 cmd_line_has_flag (CmdLine *cmd_line, String8 name); +internal B32 cmd_line_has_argument (CmdLine *cmd_line, String8 name); diff --git a/code/base/constants.h b/code/base/constants.h new file mode 100644 index 0000000..bcfeef3 --- /dev/null +++ b/code/base/constants.h @@ -0,0 +1,189 @@ +#ifdef MD_INTELLISENSE_DIRECTIVES +#pragma once +#include "linkage.h" +#endif + +//////////////////////////////// +//~ NOTE(allen): Constants + +#define MD_SIGN32 0x80000000; +#define MD_EXPONENT32 0x7F800000; +#define MD_MANTISSA32 0x007FFFFF; + +#define MD_BIG_GOLDEN32 1.61803398875f; +#define MD_SMALL_GOLDEN32 0.61803398875f; + +#define MD_PI32 3.1415926535897f; + +#define MD_MACHINE_EPSILON64 4.94065645841247e-324; + +#define MD_U8_MIN 0u +#define MD_U8_MAX 0xffu +#define MD_S8_MIN ( -0x7f - 1 ) +#define MD_S8_MAX 0x7f + +#define MD_U16_MIN 0u +#define MD_U16_MAX 0xffffu +#define MD_S16_MIN ( -0x7fff - 1 ) +#define MD_S16_MAX 0x7fff + +#define MD_U32_MIN 0u +#define MD_U32_MAX 0xffffffffu +#define MD_S32_MIN ( -0x7fffffff - 1 ) +#define MD_S32_MAX 0x7fffffff + +#define MD_U64_MIN 0ull +#define MD_U64_MAX 0xffffffffffffffffull +#define MD_S64_MIN ( -0x7fffffffffffffffll - 1 ) +#define MD_S64_MAX 0x7fffffffffffffffll + +#if defined( MD_ARCH_32_BIT ) +# define MD_USIZE_MIN MD_U32_MIN +# define MD_USIZE_MAX MD_U32_MAX +# define MD_ISIZE_MIN MD_S32_MIN +# define MD_ISIZE_MAX MD_S32_MAX +#elif defined( MD_ARCH_64_BIT ) +# define MD_USIZE_MIN MD_U64_MIN +# define MD_USIZE_MAX MD_U64_MAX +# define MD_ISIZE_MIN MD_S64_MIN +# define MD_ISIZE_MAX MD_S64_MAX +#else +# error Unknown architecture size. This library only supports 32 bit and 64 bit architectures. +#endif + +#define MD_F32_MIN 1.17549435e-38f +#define MD_F32_MAX 3.40282347e+38f +#define MD_F64_MIN 2.2250738585072014e-308 +#define MD_F64_MAX 1.7976931348623157e+308 + +#define MD_BITMASK1 0x00000001 +#define MD_BITMASK2 0x00000003 +#define MD_BITMASK3 0x00000007 +#define MD_BITMASK4 0x0000000f +#define MD_BITMASK5 0x0000001f +#define MD_BITMASK6 0x0000003f +#define MD_BITMASK7 0x0000007f +#define MD_BITMASK8 0x000000ff +#define MD_BITMASK9 0x000001ff +#define MD_BITMASK10 0x000003ff +#define MD_BITMASK11 0x000007ff +#define MD_BITMASK12 0x00000fff +#define MD_BITMASK13 0x00001fff +#define MD_BITMASK14 0x00003fff +#define MD_BITMASK15 0x00007fff +#define MD_BITMASK16 0x0000ffff +#define MD_BITMASK17 0x0001ffff +#define MD_BITMASK18 0x0003ffff +#define MD_BITMASK19 0x0007ffff +#define MD_BITMASK20 0x000fffff +#define MD_BITMASK21 0x001fffff +#define MD_BITMASK22 0x003fffff +#define MD_BITMASK23 0x007fffff +#define MD_BITMASK24 0x00ffffff +#define MD_BITMASK25 0x01ffffff +#define MD_BITMASK26 0x03ffffff +#define MD_BITMASK27 0x07ffffff +#define MD_BITMASK28 0x0fffffff +#define MD_BITMASK29 0x1fffffff +#define MD_BITMASK30 0x3fffffff +#define MD_BITMASK31 0x7fffffff +#define MD_BITMASK32 0xffffffff + +#define MD_BITMASK33 0x00000001ffffffffull +#define MD_BITMASK34 0x00000003ffffffffull +#define MD_BITMASK35 0x00000007ffffffffull +#define MD_BITMASK36 0x0000000fffffffffull +#define MD_BITMASK37 0x0000001fffffffffull +#define MD_BITMASK38 0x0000003fffffffffull +#define MD_BITMASK39 0x0000007fffffffffull +#define MD_BITMASK40 0x000000ffffffffffull +#define MD_BITMASK41 0x000001ffffffffffull +#define MD_BITMASK42 0x000003ffffffffffull +#define MD_BITMASK43 0x000007ffffffffffull +#define MD_BITMASK44 0x00000fffffffffffull +#define MD_BITMASK45 0x00001fffffffffffull +#define MD_BITMASK46 0x00003fffffffffffull +#define MD_BITMASK47 0x00007fffffffffffull +#define MD_BITMASK48 0x0000ffffffffffffull +#define MD_BITMASK49 0x0001ffffffffffffull +#define MD_BITMASK50 0x0003ffffffffffffull +#define MD_BITMASK51 0x0007ffffffffffffull +#define MD_BITMASK52 0x000fffffffffffffull +#define MD_BITMASK53 0x001fffffffffffffull +#define MD_BITMASK54 0x003fffffffffffffull +#define MD_BITMASK55 0x007fffffffffffffull +#define MD_BITMASK56 0x00ffffffffffffffull +#define MD_BITMASK57 0x01ffffffffffffffull +#define MD_BITMASK58 0x03ffffffffffffffull +#define MD_BITMASK59 0x07ffffffffffffffull +#define MD_BITMASK60 0x0fffffffffffffffull +#define MD_BITMASK61 0x1fffffffffffffffull +#define MD_BITMASK62 0x3fffffffffffffffull +#define MD_BITMASK63 0x7fffffffffffffffull +#define MD_BITMASK64 0xffffffffffffffffull + +#define MD_BIT1 (1 << 0) +#define MD_BIT2 (1 << 1) +#define MD_BIT3 (1 << 2) +#define MD_BIT4 (1 << 3) +#define MD_BIT5 (1 << 4) +#define MD_BIT6 (1 << 5) +#define MD_BIT7 (1 << 6) +#define MD_BIT8 (1 << 7) +#define MD_BIT9 (1 << 8) +#define MD_BIT10 (1 << 9) +#define MD_BIT11 (1 << 10) +#define MD_BIT12 (1 << 11) +#define MD_BIT13 (1 << 12) +#define MD_BIT14 (1 << 13) +#define MD_BIT15 (1 << 14) +#define MD_BIT16 (1 << 15) +#define MD_BIT17 (1 << 16) +#define MD_BIT18 (1 << 17) +#define MD_BIT19 (1 << 18) +#define MD_BIT20 (1 << 19) +#define MD_BIT21 (1 << 20) +#define MD_BIT22 (1 << 21) +#define MD_BIT23 (1 << 22) +#define MD_BIT24 (1 << 23) +#define MD_BIT25 (1 << 24) +#define MD_BIT26 (1 << 25) +#define MD_BIT27 (1 << 26) +#define MD_BIT28 (1 << 27) +#define MD_BIT29 (1 << 28) +#define MD_BIT30 (1 << 29) +#define MD_BIT31 (1 << 30) +#define MD_BIT32 (1 << 31) + +#define MD_BIT33 (1ull << 32) +#define MD_BIT34 (1ull << 33) +#define MD_BIT35 (1ull << 34) +#define MD_BIT36 (1ull << 35) +#define MD_BIT37 (1ull << 36) +#define MD_BIT38 (1ull << 37) +#define MD_BIT39 (1ull << 38) +#define MD_BIT40 (1ull << 39) +#define MD_BIT41 (1ull << 40) +#define MD_BIT42 (1ull << 41) +#define MD_BIT43 (1ull << 42) +#define MD_BIT44 (1ull << 43) +#define MD_BIT45 (1ull << 44) +#define MD_BIT46 (1ull << 45) +#define MD_BIT47 (1ull << 46) +#define MD_BIT48 (1ull << 47) +#define MD_BIT49 (1ull << 48) +#define MD_BIT50 (1ull << 49) +#define MD_BIT51 (1ull << 50) +#define MD_BIT52 (1ull << 51) +#define MD_BIT53 (1ull << 52) +#define MD_BIT54 (1ull << 53) +#define MD_BIT55 (1ull << 54) +#define MD_BIT56 (1ull << 55) +#define MD_BIT57 (1ull << 56) +#define MD_BIT58 (1ull << 57) +#define MD_BIT59 (1ull << 58) +#define MD_BIT60 (1ull << 59) +#define MD_BIT61 (1ull << 60) +#define MD_BIT62 (1ull << 61) +#define MD_BIT63 (1ull << 62) +#define MD_BIT64 (1ull << 63) diff --git a/code/base/cracking_compiler.h b/code/base/cracking_compiler.h index bfb6c23..c5c16a1 100644 --- a/code/base/cracking_compiler.h +++ b/code/base/cracking_compiler.h @@ -2,8 +2,6 @@ #pragma once #endif -#pragma region Platform Compiler - #if defined( _MSC_VER ) # pragma message("Detected MSVC") // # define MD_COMPILER_CLANG 0 @@ -61,5 +59,3 @@ #if MD_COMPILER_CPP #pragma message("MD: Detected CPP") #endif - -#pragma endregion Platform Compiler diff --git a/code/base/cracking_os.h b/code/base/cracking_os.h index 4e254b7..dea0464 100644 --- a/code/base/cracking_os.h +++ b/code/base/cracking_os.h @@ -2,8 +2,6 @@ #pragma once #endif -#pragma region Platform OS - #if defined( _WIN32 ) || defined( _WIN64 ) # ifndef MD_OS_WINDOWS # define MD_OS_WINDOWS 1 @@ -52,5 +50,3 @@ #else # error This operating system is not supported #endif - -#pragma endregion Platform OS diff --git a/code/base/linkage.h b/code/base/linkage.h new file mode 100644 index 0000000..e35ee04 --- /dev/null +++ b/code/base/linkage.h @@ -0,0 +1,38 @@ +#ifdef MD_INTELLISENSE_DIRECTIVES +# pragma once +# include "cracking_arch.h" +# include "cracking_compiler.h" +#endif + +#ifndef MD_API +#if MD_COMPILER_MSVC +# ifdef MD_DYN_LINK +# ifdef MD_DYN_EXPORT +# define MD_API __declspec(dllexport) +# else +# define MD_API __declspec(dllimport) +# endif +# else +# define MD_API // Empty for static builds +# endif +#else +# ifdef MD_DYN_LINK +# define MD_API __attribute__((visibility("default"))) +# else +# define MD_API // Empty for static builds +# endif +#endif +#endif // GEN_API + +#ifndef global // Global variables +# ifdef MD_DYN_EXPORT +# define global +# else +# define global static +# endif +#endif + +// Internal Linkage +#ifndef internal +#define internal static +#endif diff --git a/code/base/macros.h b/code/base/macros.h index cc5ac1e..d516e8a 100644 --- a/code/base/macros.h +++ b/code/base/macros.h @@ -3,38 +3,6 @@ #include "platform.h" #endif -#ifndef MD_API -#if MD_COMPILER_MSVC -# ifdef MD_DYN_LINK -# ifdef MD_DYN_EXPORT -# define MD_API __declspec(dllexport) -# else -# define MD_API __declspec(dllimport) -# endif -# else -# define MD_API // Empty for static builds -# endif -#else -# ifdef MD_DYN_LINK -# define MD_API __attribute__((visibility("default"))) -# else -# define MD_API // Empty for static builds -# endif -#endif -#endif // GEN_API - -#ifndef global // Global variables -# ifdef MD_DYN_EXPORT -# define global -# else -# define global static -# endif -#endif - -#ifndef internal -#define internal static -#endif - #ifndef local_persist #define local_persist static #endif @@ -57,6 +25,9 @@ #define likely(expr) expect(expr,1) #define unlikely(expr) expect(expr,0) +//////////////////////////////// +//~ erg: type casting + #if MD_COMPILER_CPP # ifndef ccast # define ccast( type, value ) ( const_cast< type >( (value) ) ) @@ -134,12 +105,12 @@ #endif #if MD_COMPILER_C -#ifndef static_assert -#undef static_assert - #if MD_COMPILER_C && __STDC_VERSION__ >= 201112L - #define static_assert(condition, message) _Static_assert(condition, message) - #else - #define static_assert(condition, message) typedef char static_assertion_##__LINE__[(condition)?1:-1] - #endif -#endif +# ifndef static_assert +# undef static_assert +# if MD_COMPILER_C && __STDC_VERSION__ >= 201112L +# define static_assert(condition, message) _Static_assert(condition, message) +# else +# define static_assert(condition, message) typedef char static_assertion_##__LINE__[(condition)?1:-1] +# endif +# endif #endif diff --git a/code/metagen/metagen_base/metagen_base_math.c b/code/base/math.c similarity index 100% rename from code/metagen/metagen_base/metagen_base_math.c rename to code/base/math.c diff --git a/code/base/math.h b/code/base/math.h index 2480d66..fcfe060 100644 --- a/code/base/math.h +++ b/code/base/math.h @@ -1,8 +1,210 @@ -#if MD_INTELLISENSE_DIRECTIVES +#ifdef MD_INTELLISENSE_DIRECTIVES #pragma once -#include "base_types.h" +#include "cracking_arch.h" +#include "cracking_compiler.h" +#include "cracking_os.h" +#include "linkage.h" +#include "macros.h" #endif +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Vector Types + +//- rjf: 2-vectors + +typedef union Vec2F32 Vec2F32; +union Vec2F32 +{ + struct + { + F32 x; + F32 y; + }; + F32 v[2]; +}; + +typedef union Vec2S64 Vec2S64; +union Vec2S64 +{ + struct + { + S64 x; + S64 y; + }; + S64 v[2]; +}; + +typedef union Vec2S32 Vec2S32; +union Vec2S32 +{ + struct + { + S32 x; + S32 y; + }; + S32 v[2]; +}; + +typedef union Vec2S16 Vec2S16; +union Vec2S16 +{ + struct + { + S16 x; + S16 y; + }; + S16 v[2]; +}; + +//- rjf: 3-vectors + +typedef union Vec3F32 Vec3F32; +union Vec3F32 +{ + struct + { + F32 x; + F32 y; + F32 z; + }; + struct + { + Vec2F32 xy; + F32 _z0; + }; + struct + { + F32 _x0; + Vec2F32 yz; + }; + F32 v[3]; +}; + +typedef union Vec3S32 Vec3S32; +union Vec3S32 +{ + struct + { + S32 x; + S32 y; + S32 z; + }; + struct + { + Vec2S32 xy; + S32 _z0; + }; + struct + { + S32 _x0; + Vec2S32 yz; + }; + S32 v[3]; +}; + +//- rjf: 4-vectors + +typedef union Vec4F32 Vec4F32; +union Vec4F32 +{ + struct + { + F32 x; + F32 y; + F32 z; + F32 w; + }; + struct + { + Vec2F32 xy; + Vec2F32 zw; + }; + struct + { + Vec3F32 xyz; + F32 _z0; + }; + struct + { + F32 _x0; + Vec3F32 yzw; + }; + F32 v[4]; +}; + +typedef union Vec4S32 Vec4S32; +union Vec4S32 +{ + struct + { + S32 x; + S32 y; + S32 z; + S32 w; + }; + struct + { + Vec2S32 xy; + Vec2S32 zw; + }; + struct + { + Vec3S32 xyz; + S32 _z0; + }; + struct + { + S32 _x0; + Vec3S32 yzw; + }; + S32 v[4]; +}; + +//////////////////////////////// +//~ rjf: Matrix Types + +typedef struct Mat3x3F32 Mat3x3F32; +struct Mat3x3F32 +{ + F32 v[3][3]; +}; + +typedef struct Mat4x4F32 Mat4x4F32; +struct Mat4x4F32 +{ + F32 v[4][4]; +}; + +//////////////////////////////// +//~ rjf: Range Types + +//- rjf: 1-range + +typedef union Rng1U32 Rng1U32; +union Rng1U32 +{ + struct + { + U32 min; + U32 max; + }; + U32 v[2]; +}; + +typedef union Rng1S32 Rng1S32; +union Rng1S32 +{ + struct + { + S32 min; + S32 max; + }; + S32 v[2]; +}; + typedef union Rng1U64 Rng1U64; union Rng1U64 { @@ -13,3 +215,441 @@ union Rng1U64 }; U64 v[2]; }; + +typedef union Rng1S64 Rng1S64; +union Rng1S64 +{ + struct + { + S64 min; + S64 max; + }; + S64 v[2]; +}; + +typedef union Rng1F32 Rng1F32; +union Rng1F32 +{ + struct + { + F32 min; + F32 max; + }; + F32 v[2]; +}; + +//- rjf: 2-range (rectangles) + +typedef union Rng2S16 Rng2S16; +union Rng2S16 +{ + struct + { + Vec2S16 min; + Vec2S16 max; + }; + struct + { + Vec2S16 p0; + Vec2S16 p1; + }; + struct + { + S16 x0; + S16 y0; + S16 x1; + S16 y1; + }; + Vec2S16 v[2]; +}; + +typedef union Rng2S32 Rng2S32; +union Rng2S32 +{ + struct + { + Vec2S32 min; + Vec2S32 max; + }; + struct + { + Vec2S32 p0; + Vec2S32 p1; + }; + struct + { + S32 x0; + S32 y0; + S32 x1; + S32 y1; + }; + Vec2S32 v[2]; +}; + +typedef union Rng2F32 Rng2F32; +union Rng2F32 +{ + struct + { + Vec2F32 min; + Vec2F32 max; + }; + struct + { + Vec2F32 p0; + Vec2F32 p1; + }; + struct + { + F32 x0; + F32 y0; + F32 x1; + F32 y1; + }; + Vec2F32 v[2]; +}; + +typedef union Rng2S64 Rng2S64; +union Rng2S64 +{ + struct + { + Vec2S64 min; + Vec2S64 max; + }; + struct + { + Vec2S64 p0; + Vec2S64 p1; + }; + struct + { + S64 x0; + S64 y0; + S64 x1; + S64 y1; + }; + Vec2S64 v[2]; +}; + +//////////////////////////////// +//~ rjf: List Types + +typedef struct Rng1S64Node Rng1S64Node; +struct Rng1S64Node +{ + Rng1S64Node *next; + Rng1S64 v; +}; + +typedef struct Rng1S64List Rng1S64List; +struct Rng1S64List +{ + Rng1S64Node *first; + Rng1S64Node *last; + U64 count; +}; + +typedef struct Rng1S64Array Rng1S64Array; +struct Rng1S64Array +{ + Rng1S64 *v; + U64 count; +}; + +//////////////////////////////// +//~ rjf: Scalar Ops + +#define abs_s64(v) (S64)llabs(v) + +#define sqrt_f32(v) sqrtf(v) +#define mod_f32(a, b) fmodf((a), (b)) +#define pow_f32(b, e) powf((b), (e)) +#define ceil_f32(v) ceilf(v) +#define floor_f32(v) floorf(v) +#define round_f32(v) roundf(v) +#define abs_f32(v) fabsf(v) +#define radians_from_turns_f32(v) ((v)*2*3.1415926535897f) +#define turns_from_radians_f32(v) ((v)/2*3.1415926535897f) +#define degrees_from_turns_f32(v) ((v)*360.f) +#define turns_from_degrees_f32(v) ((v)/360.f) +#define degrees_from_radians_f32(v) (degrees_from_turns_f32(turns_from_radians_f32(v))) +#define radians_from_degrees_f32(v) (radians_from_turns_f32(turns_from_degrees_f32(v))) +#define sin_f32(v) sinf(radians_from_turns_f32(v)) +#define cos_f32(v) cosf(radians_from_turns_f32(v)) +#define tan_f32(v) tanf(radians_from_turns_f32(v)) + +#define sqrt_f64(v) sqrt(v) +#define mod_f64(a, b) fmod((a), (b)) +#define pow_f64(b, e) pow((b), (e)) +#define ceil_f64(v) ceil(v) +#define floor_f64(v) floor(v) +#define round_f64(v) round(v) +#define abs_f64(v) fabs(v) +#define radians_from_turns_f64(v) ((v)*2*3.1415926535897) +#define turns_from_radians_f64(v) ((v)/2*3.1415926535897) +#define degrees_from_turns_f64(v) ((v)*360.0) +#define turns_from_degrees_f64(v) ((v)/360.0) +#define degrees_from_radians_f64(v) (degrees_from_turns_f64(turns_from_radians_f64(v))) +#define radians_from_degrees_f64(v) (radians_from_turns_f64(turns_from_degrees_f64(v))) +#define sin_f64(v) sin(radians_from_turns_f64(v)) +#define cos_f64(v) cos(radians_from_turns_f64(v)) +#define tan_f64(v) tan(radians_from_turns_f64(v)) + +internal F32 mix_1f32(F32 a, F32 b, F32 t); +internal F64 mix_1f64(F64 a, F64 b, F64 t); + +//////////////////////////////// +//~ rjf: Vector Ops + +#define v2f32(x, y) vec_2f32((x), (y)) +internal Vec2F32 vec_2f32(F32 x, F32 y); +internal Vec2F32 add_2f32(Vec2F32 a, Vec2F32 b); +internal Vec2F32 sub_2f32(Vec2F32 a, Vec2F32 b); +internal Vec2F32 mul_2f32(Vec2F32 a, Vec2F32 b); +internal Vec2F32 div_2f32(Vec2F32 a, Vec2F32 b); +internal Vec2F32 scale_2f32(Vec2F32 v, F32 s); +internal F32 dot_2f32(Vec2F32 a, Vec2F32 b); +internal F32 length_squared_2f32(Vec2F32 v); +internal F32 length_2f32(Vec2F32 v); +internal Vec2F32 normalize_2f32(Vec2F32 v); +internal Vec2F32 mix_2f32(Vec2F32 a, Vec2F32 b, F32 t); + +#define v2s64(x, y) vec_2s64((x), (y)) +internal Vec2S64 vec_2s64(S64 x, S64 y); +internal Vec2S64 add_2s64(Vec2S64 a, Vec2S64 b); +internal Vec2S64 sub_2s64(Vec2S64 a, Vec2S64 b); +internal Vec2S64 mul_2s64(Vec2S64 a, Vec2S64 b); +internal Vec2S64 div_2s64(Vec2S64 a, Vec2S64 b); +internal Vec2S64 scale_2s64(Vec2S64 v, S64 s); +internal S64 dot_2s64(Vec2S64 a, Vec2S64 b); +internal S64 length_squared_2s64(Vec2S64 v); +internal S64 length_2s64(Vec2S64 v); +internal Vec2S64 normalize_2s64(Vec2S64 v); +internal Vec2S64 mix_2s64(Vec2S64 a, Vec2S64 b, F32 t); + +#define v2s32(x, y) vec_2s32((x), (y)) +internal Vec2S32 vec_2s32(S32 x, S32 y); +internal Vec2S32 add_2s32(Vec2S32 a, Vec2S32 b); +internal Vec2S32 sub_2s32(Vec2S32 a, Vec2S32 b); +internal Vec2S32 mul_2s32(Vec2S32 a, Vec2S32 b); +internal Vec2S32 div_2s32(Vec2S32 a, Vec2S32 b); +internal Vec2S32 scale_2s32(Vec2S32 v, S32 s); +internal S32 dot_2s32(Vec2S32 a, Vec2S32 b); +internal S32 length_squared_2s32(Vec2S32 v); +internal S32 length_2s32(Vec2S32 v); +internal Vec2S32 normalize_2s32(Vec2S32 v); +internal Vec2S32 mix_2s32(Vec2S32 a, Vec2S32 b, F32 t); + +#define v2s16(x, y) vec_2s16((x), (y)) +internal Vec2S16 vec_2s16(S16 x, S16 y); +internal Vec2S16 add_2s16(Vec2S16 a, Vec2S16 b); +internal Vec2S16 sub_2s16(Vec2S16 a, Vec2S16 b); +internal Vec2S16 mul_2s16(Vec2S16 a, Vec2S16 b); +internal Vec2S16 div_2s16(Vec2S16 a, Vec2S16 b); +internal Vec2S16 scale_2s16(Vec2S16 v, S16 s); +internal S16 dot_2s16(Vec2S16 a, Vec2S16 b); +internal S16 length_squared_2s16(Vec2S16 v); +internal S16 length_2s16(Vec2S16 v); +internal Vec2S16 normalize_2s16(Vec2S16 v); +internal Vec2S16 mix_2s16(Vec2S16 a, Vec2S16 b, F32 t); + +#define v3f32(x, y, z) vec_3f32((x), (y), (z)) +internal Vec3F32 vec_3f32(F32 x, F32 y, F32 z); +internal Vec3F32 add_3f32(Vec3F32 a, Vec3F32 b); +internal Vec3F32 sub_3f32(Vec3F32 a, Vec3F32 b); +internal Vec3F32 mul_3f32(Vec3F32 a, Vec3F32 b); +internal Vec3F32 div_3f32(Vec3F32 a, Vec3F32 b); +internal Vec3F32 scale_3f32(Vec3F32 v, F32 s); +internal F32 dot_3f32(Vec3F32 a, Vec3F32 b); +internal F32 length_squared_3f32(Vec3F32 v); +internal F32 length_3f32(Vec3F32 v); +internal Vec3F32 normalize_3f32(Vec3F32 v); +internal Vec3F32 mix_3f32(Vec3F32 a, Vec3F32 b, F32 t); +internal Vec3F32 cross_3f32(Vec3F32 a, Vec3F32 b); + +#define v3s32(x, y, z) vec_3s32((x), (y), (z)) +internal Vec3S32 vec_3s32(S32 x, S32 y, S32 z); +internal Vec3S32 add_3s32(Vec3S32 a, Vec3S32 b); +internal Vec3S32 sub_3s32(Vec3S32 a, Vec3S32 b); +internal Vec3S32 mul_3s32(Vec3S32 a, Vec3S32 b); +internal Vec3S32 div_3s32(Vec3S32 a, Vec3S32 b); +internal Vec3S32 scale_3s32(Vec3S32 v, S32 s); +internal S32 dot_3s32(Vec3S32 a, Vec3S32 b); +internal S32 length_squared_3s32(Vec3S32 v); +internal S32 length_3s32(Vec3S32 v); +internal Vec3S32 normalize_3s32(Vec3S32 v); +internal Vec3S32 mix_3s32(Vec3S32 a, Vec3S32 b, F32 t); +internal Vec3S32 cross_3s32(Vec3S32 a, Vec3S32 b); + +#define v4f32(x, y, z, w) vec_4f32((x), (y), (z), (w)) +internal Vec4F32 vec_4f32(F32 x, F32 y, F32 z, F32 w); +internal Vec4F32 add_4f32(Vec4F32 a, Vec4F32 b); +internal Vec4F32 sub_4f32(Vec4F32 a, Vec4F32 b); +internal Vec4F32 mul_4f32(Vec4F32 a, Vec4F32 b); +internal Vec4F32 div_4f32(Vec4F32 a, Vec4F32 b); +internal Vec4F32 scale_4f32(Vec4F32 v, F32 s); +internal F32 dot_4f32(Vec4F32 a, Vec4F32 b); +internal F32 length_squared_4f32(Vec4F32 v); +internal F32 length_4f32(Vec4F32 v); +internal Vec4F32 normalize_4f32(Vec4F32 v); +internal Vec4F32 mix_4f32(Vec4F32 a, Vec4F32 b, F32 t); + +#define v4s32(x, y, z, w) vec_4s32((x), (y), (z), (w)) +internal Vec4S32 vec_4s32(S32 x, S32 y, S32 z, S32 w); +internal Vec4S32 add_4s32(Vec4S32 a, Vec4S32 b); +internal Vec4S32 sub_4s32(Vec4S32 a, Vec4S32 b); +internal Vec4S32 mul_4s32(Vec4S32 a, Vec4S32 b); +internal Vec4S32 div_4s32(Vec4S32 a, Vec4S32 b); +internal Vec4S32 scale_4s32(Vec4S32 v, S32 s); +internal S32 dot_4s32(Vec4S32 a, Vec4S32 b); +internal S32 length_squared_4s32(Vec4S32 v); +internal S32 length_4s32(Vec4S32 v); +internal Vec4S32 normalize_4s32(Vec4S32 v); +internal Vec4S32 mix_4s32(Vec4S32 a, Vec4S32 b, F32 t); + +//////////////////////////////// +//~ rjf: Matrix Ops + +internal Mat3x3F32 mat_3x3f32(F32 diagonal); +internal Mat3x3F32 make_translate_3x3f32(Vec2F32 delta); +internal Mat3x3F32 make_scale_3x3f32(Vec2F32 scale); +internal Mat3x3F32 mul_3x3f32(Mat3x3F32 a, Mat3x3F32 b); + +internal Mat4x4F32 mat_4x4f32(F32 diagonal); +internal Mat4x4F32 make_translate_4x4f32(Vec3F32 delta); +internal Mat4x4F32 make_scale_4x4f32(Vec3F32 scale); +internal Mat4x4F32 make_perspective_4x4f32(F32 fov, F32 aspect_ratio, F32 near_z, F32 far_z); +internal Mat4x4F32 make_orthographic_4x4f32(F32 left, F32 right, F32 bottom, F32 top, F32 near_z, F32 far_z); +internal Mat4x4F32 make_look_at_4x4f32(Vec3F32 eye, Vec3F32 center, Vec3F32 up); +internal Mat4x4F32 make_rotate_4x4f32(Vec3F32 axis, F32 turns); +internal Mat4x4F32 mul_4x4f32(Mat4x4F32 a, Mat4x4F32 b); +internal Mat4x4F32 scale_4x4f32(Mat4x4F32 m, F32 scale); +internal Mat4x4F32 inverse_4x4f32(Mat4x4F32 m); +internal Mat4x4F32 derotate_4x4f32(Mat4x4F32 mat); + +//////////////////////////////// +//~ rjf: Range Ops + +#define r1u32(min, max) rng_1u32((min), (max)) +internal Rng1U32 rng_1u32(U32 min, U32 max); +internal Rng1U32 shift_1u32(Rng1U32 r, U32 x); +internal Rng1U32 pad_1u32(Rng1U32 r, U32 x); +internal U32 center_1u32(Rng1U32 r); +internal B32 contains_1u32(Rng1U32 r, U32 x); +internal U32 dim_1u32(Rng1U32 r); +internal Rng1U32 union_1u32(Rng1U32 a, Rng1U32 b); +internal Rng1U32 intersect_1u32(Rng1U32 a, Rng1U32 b); +internal U32 clamp_1u32(Rng1U32 r, U32 v); + +#define r1s32(min, max) rng_1s32((min), (max)) +internal Rng1S32 rng_1s32(S32 min, S32 max); +internal Rng1S32 shift_1s32(Rng1S32 r, S32 x); +internal Rng1S32 pad_1s32(Rng1S32 r, S32 x); +internal S32 center_1s32(Rng1S32 r); +internal B32 contains_1s32(Rng1S32 r, S32 x); +internal S32 dim_1s32(Rng1S32 r); +internal Rng1S32 union_1s32(Rng1S32 a, Rng1S32 b); +internal Rng1S32 intersect_1s32(Rng1S32 a, Rng1S32 b); +internal S32 clamp_1s32(Rng1S32 r, S32 v); + +#define r1u64(min, max) rng_1u64((min), (max)) +internal Rng1U64 rng_1u64(U64 min, U64 max); +internal Rng1U64 shift_1u64(Rng1U64 r, U64 x); +internal Rng1U64 pad_1u64(Rng1U64 r, U64 x); +internal U64 center_1u64(Rng1U64 r); +internal B32 contains_1u64(Rng1U64 r, U64 x); +internal U64 dim_1u64(Rng1U64 r); +internal Rng1U64 union_1u64(Rng1U64 a, Rng1U64 b); +internal Rng1U64 intersect_1u64(Rng1U64 a, Rng1U64 b); +internal U64 clamp_1u64(Rng1U64 r, U64 v); + +#define r1s64(min, max) rng_1s64((min), (max)) +internal Rng1S64 rng_1s64(S64 min, S64 max); +internal Rng1S64 shift_1s64(Rng1S64 r, S64 x); +internal Rng1S64 pad_1s64(Rng1S64 r, S64 x); +internal S64 center_1s64(Rng1S64 r); +internal B32 contains_1s64(Rng1S64 r, S64 x); +internal S64 dim_1s64(Rng1S64 r); +internal Rng1S64 union_1s64(Rng1S64 a, Rng1S64 b); +internal Rng1S64 intersect_1s64(Rng1S64 a, Rng1S64 b); +internal S64 clamp_1s64(Rng1S64 r, S64 v); + +#define r1f32(min, max) rng_1f32((min), (max)) +internal Rng1F32 rng_1f32(F32 min, F32 max); +internal Rng1F32 shift_1f32(Rng1F32 r, F32 x); +internal Rng1F32 pad_1f32(Rng1F32 r, F32 x); +internal F32 center_1f32(Rng1F32 r); +internal B32 contains_1f32(Rng1F32 r, F32 x); +internal F32 dim_1f32(Rng1F32 r); +internal Rng1F32 union_1f32(Rng1F32 a, Rng1F32 b); +internal Rng1F32 intersect_1f32(Rng1F32 a, Rng1F32 b); +internal F32 clamp_1f32(Rng1F32 r, F32 v); + +#define r2s16(min, max) rng_2s16((min), (max)) +#define r2s16p(x, y, z, w) r2s16(v2s16((x), (y)), v2s16((z), (w))) +internal Rng2S16 rng_2s16(Vec2S16 min, Vec2S16 max); +internal Rng2S16 shift_2s16(Rng2S16 r, Vec2S16 x); +internal Rng2S16 pad_2s16(Rng2S16 r, S16 x); +internal Vec2S16 center_2s16(Rng2S16 r); +internal B32 contains_2s16(Rng2S16 r, Vec2S16 x); +internal Vec2S16 dim_2s16(Rng2S16 r); +internal Rng2S16 union_2s16(Rng2S16 a, Rng2S16 b); +internal Rng2S16 intersect_2s16(Rng2S16 a, Rng2S16 b); +internal Vec2S16 clamp_2s16(Rng2S16 r, Vec2S16 v); + +#define r2s32(min, max) rng_2s32((min), (max)) +#define r2s32p(x, y, z, w) r2s32(v2s32((x), (y)), v2s32((z), (w))) +internal Rng2S32 rng_2s32(Vec2S32 min, Vec2S32 max); +internal Rng2S32 shift_2s32(Rng2S32 r, Vec2S32 x); +internal Rng2S32 pad_2s32(Rng2S32 r, S32 x); +internal Vec2S32 center_2s32(Rng2S32 r); +internal B32 contains_2s32(Rng2S32 r, Vec2S32 x); +internal Vec2S32 dim_2s32(Rng2S32 r); +internal Rng2S32 union_2s32(Rng2S32 a, Rng2S32 b); +internal Rng2S32 intersect_2s32(Rng2S32 a, Rng2S32 b); +internal Vec2S32 clamp_2s32(Rng2S32 r, Vec2S32 v); + +#define r2s64(min, max) rng_2s64((min), (max)) +#define r2s64p(x, y, z, w) r2s64(v2s64((x), (y)), v2s64((z), (w))) +internal Rng2S64 rng_2s64(Vec2S64 min, Vec2S64 max); +internal Rng2S64 shift_2s64(Rng2S64 r, Vec2S64 x); +internal Rng2S64 pad_2s64(Rng2S64 r, S64 x); +internal Vec2S64 center_2s64(Rng2S64 r); +internal B32 contains_2s64(Rng2S64 r, Vec2S64 x); +internal Vec2S64 dim_2s64(Rng2S64 r); +internal Rng2S64 union_2s64(Rng2S64 a, Rng2S64 b); +internal Rng2S64 intersect_2s64(Rng2S64 a, Rng2S64 b); +internal Vec2S64 clamp_2s64(Rng2S64 r, Vec2S64 v); + +#define r2f32(min, max) rng_2f32((min), (max)) +#define r2f32p(x, y, z, w) r2f32(v2f32((x), (y)), v2f32((z), (w))) +internal Rng2F32 rng_2f32(Vec2F32 min, Vec2F32 max); +internal Rng2F32 shift_2f32(Rng2F32 r, Vec2F32 x); +internal Rng2F32 pad_2f32(Rng2F32 r, F32 x); +internal Vec2F32 center_2f32(Rng2F32 r); +internal B32 contains_2f32(Rng2F32 r, Vec2F32 x); +internal Vec2F32 dim_2f32(Rng2F32 r); +internal Rng2F32 union_2f32(Rng2F32 a, Rng2F32 b); +internal Rng2F32 intersect_2f32(Rng2F32 a, Rng2F32 b); +internal Vec2F32 clamp_2f32(Rng2F32 r, Vec2F32 v); + +//////////////////////////////// +//~ rjf: Miscellaneous Ops + +internal Vec3F32 hsv_from_rgb(Vec3F32 rgb); +internal Vec3F32 rgb_from_hsv(Vec3F32 hsv); +internal Vec4F32 hsva_from_rgba(Vec4F32 rgba); +internal Vec4F32 rgba_from_hsva(Vec4F32 hsva); +internal Vec4F32 rgba_from_u32(U32 hex); +internal U32 u32_from_rgba(Vec4F32 rgba); + +#define rgba_from_u32_lit_comp(h) { (((h)&0xff000000)>>24)/255.f, (((h)&0x00ff0000)>>16)/255.f, (((h)&0x0000ff00)>> 8)/255.f, (((h)&0x000000ff)>> 0)/255.f } + +//////////////////////////////// +//~ rjf: List Type Functions + +internal void rng1s64_list_push(Arena *arena, Rng1S64List *list, Rng1S64 rng); +internal Rng1S64Array rng1s64_array_from_list(Arena *arena, Rng1S64List *list); + +#endif // BASE_MATH_H diff --git a/code/base/memory.h b/code/base/memory.h index 411b574..c789883 100644 --- a/code/base/memory.h +++ b/code/base/memory.h @@ -100,8 +100,8 @@ # define assert(x) (void)(x) #endif -#define InvalidPath assert( ! "Invalid Path!") -#define NotImplemented assert( ! "Not Implemented!") +#define invalid_path assert( ! "Invalid Path!") +#define not_implemented assert( ! "Not Implemented!") #define no_op ((void)0) #define md_static_assert(C, ID) global U8 glue(ID, __LINE__)[ (C) ? 1 : -1 ] @@ -143,21 +143,36 @@ //~ rjf: Linked List Building Macros //- rjf: linked list macro helpers -#define Check``Nil(nil,p) ((p) == 0 || (p) == nil) -#define SetNil(nil,p) ((p) = nil) +#define check_nil(nil,p) ((p) == 0 || (p) == nil) +#define set_nil(nil,p) ((p) = nil) //- rjf: doubly-linked-lists -#define DLLInsert_NPZ(nil,f,l,p,n,next,prev) (CheckNil(nil,f) ? \ -((f) = (l) = (n), SetNil(nil,(n)->next), SetNil(nil,(n)->prev)) :\ -CheckNil(nil,p) ? \ -((n)->next = (f), (f)->prev = (n), (f) = (n), SetNil(nil,(n)->prev)) :\ -((p)==(l)) ? \ -((l)->next = (n), (n)->prev = (l), (l) = (n), SetNil(nil, (n)->next)) :\ -(((!CheckNil(nil,p) && CheckNil(nil,(p)->next)) ? (0) : ((p)->next->prev = (n))), ((n)->next = (p)->next), ((p)->next = (n)), ((n)->prev = (p)))) -#define DLLPushBack_NPZ(nil,f,l,n,next,prev) DLLInsert_NPZ(nil,f,l,l,n,next,prev) -#define DLLPushFront_NPZ(nil,f,l,n,next,prev) DLLInsert_NPZ(nil,l,f,f,n,prev,next) -#define DLLRemove_NPZ(nil,f,l,n,next,prev) (((n) == (f) ? (f) = (n)->next : (0)),\ -((n) == (l) ? (l) = (l)->prev : (0)),\ +#define dll_insert_npz(nil, f, l, p, n, next, prev) \ +(check_nil(nil, f) ? \ + ((f) = (l) = (n), set_nil(nil, (n)->next), set_nil(nil, (n)->prev)) \ +: CheckNil(nil,p) ? \ + ((n)->next = (f), (f)->prev = (n), (f) = (n), SetNil(nil,(n)->prev)) \ + : ((p) == (l)) ? \ + ((l)->next = (n), (n)->prev = (l), (l) = (n), SetNil(nil, (n)->next)) \ + : ( ((!CheckNil(nil, p) && CheckNil(nil, (p)->next) ) ? \ + (0) \ + : ((p)->next->prev = (n))), ((n)->next = (p)->next), ((p)->next = (n)), ((n)->prev = (p))) \ +) \ + +#define dll_push_back_npz(nil, f, l, n, next, prev) dll_insert_npz(nil, f, l, l, n, next, prev) +#define dll_push_front_npz(nil, f, l, n, next, prev) dll_insert_npz(nil, l, f, f, n, prev, next) +#define dll_remove_npz(nil,f,l,n,next,prev) \ +( \ + ( \ + (n) == (f) ? \ + (f) = (n)->next \ + : (0) \ + ), \ + ( \ + (n) == (l) ? \ + (l) = (l)->prev \ + : (0) \ + ), \ (CheckNil(nil,(n)->prev) ? (0) :\ ((n)->prev->next = (n)->next)),\ (CheckNil(nil,(n)->next) ? (0) :\ diff --git a/code/base/namespace.h b/code/base/namespace.h index 750117a..7c62bd4 100644 --- a/code/base/namespace.h +++ b/code/base/namespace.h @@ -1,3 +1,7 @@ +#ifdef MD_INTELLISENSE_DIRECTIVES +#pragma once +#include "cracking_arch.h" +#endif // C++ namespace support #if MD_DONT_USE_NAMESPACE || MD_COMPILER_C diff --git a/code/base/strings.c b/code/base/strings.c index c1f372a..ff5b621 100644 --- a/code/base/strings.c +++ b/code/base/strings.c @@ -9,11 +9,11 @@ //////////////////////////////// //~ rjf: Third Party Includes -#if !BUILD_SUPPLEMENTARY_UNIT -# define STB_SPRINTF_IMPLEMENTATION -# define STB_SPRINTF_STATIC -# include "third_party/stb/stb_sprintf.h" -#endif +// #if !BUILD_SUPPLEMENTARY_UNIT +// # define STB_SPRINTF_IMPLEMENTATION +// # define STB_SPRINTF_STATIC +// # include "third_party/stb/stb_sprintf.h" +// #endif //////////////////////////////// //~ NOTE(allen): String <-> Integer Tables diff --git a/code/base/strings.h b/code/base/strings.h index 5cfbc43..ef768b6 100644 --- a/code/base/strings.h +++ b/code/base/strings.h @@ -1,7 +1,12 @@ #ifdef MD_INTELLISENSE_DIRECTIVES #pragma once +#include "cracking_arch.h" +#include "cracking_compiler.h" +#include "cracking_os.h" #include "macros.h" +#include "linkage.h" #include "base_types.h" +#include "memory.h" #endif // Copyright (c) 2024 Epic Games Tools @@ -10,8 +15,8 @@ //////////////////////////////// //~ rjf: Third Party Includes -#define STB_SPRINTF_DECORATE(name) raddbg_##name -#include "third_party/stb/stb_sprintf.h" +// #define STB_SPRINTF_DECORATE(name) raddbg_##name +// #include "third_party/stb/stb_sprintf.h" //////////////////////////////// //~ rjf: String Types @@ -27,14 +32,14 @@ typedef struct String16 String16; struct String16 { U16 *str; - U64 size; + U64 size; }; typedef struct String32 String32; struct String32 { U32 *str; - U64 size; + U64 size; }; //////////////////////////////// @@ -44,14 +49,14 @@ typedef struct String8Node String8Node; struct String8Node { String8Node *next; - String8 string; + String8 string; }; typedef struct String8MetaNode String8MetaNode; struct String8MetaNode { String8MetaNode *next; - String8Node *node; + String8Node *node; }; typedef struct String8List String8List; @@ -67,7 +72,7 @@ typedef struct String8Array String8Array; struct String8Array { String8 *v; - U64 count; + U64 count; }; //////////////////////////////// @@ -76,29 +81,29 @@ struct String8Array typedef U32 StringMatchFlags; enum { - StringMatchFlag_CaseInsensitive = (1 << 0), - StringMatchFlag_RightSideSloppy = (1 << 1), - StringMatchFlag_SlashInsensitive = (1 << 2), + StringMatchFlag_CaseInsensitive = (1 << 0), + StringMatchFlag_RightSideSloppy = (1 << 1), + StringMatchFlag_SlashInsensitive = (1 << 2), }; typedef U32 StringSplitFlags; enum { - StringSplitFlag_KeepEmpties = (1 << 0), + StringSplitFlag_KeepEmpties = (1 << 0), }; typedef enum PathStyle { - PathStyle_Relative, - PathStyle_WindowsAbsolute, - PathStyle_UnixAbsolute, + PathStyle_Relative, + PathStyle_WindowsAbsolute, + PathStyle_UnixAbsolute, -#if OS_WINDOWS - PathStyle_SystemAbsolute = PathStyle_WindowsAbsolute -#elif OS_LINUX - PathStyle_SystemAbsolute = PathStyle_UnixAbsolute +#if MD_OS_WINDOWS + PathStyle_SystemAbsolute = PathStyle_WindowsAbsolute +#elif MD_OS_LINUX + PathStyle_SystemAbsolute = PathStyle_UnixAbsolute #else -# error "absolute path style is undefined for this OS" +# error "absolute path style is undefined for this OS" #endif } PathStyle; @@ -118,7 +123,7 @@ typedef struct String8TxtPtPair String8TxtPtPair; struct String8TxtPtPair { String8 string; - TxtPt pt; + TxtPt pt; }; //////////////////////////////// @@ -167,7 +172,7 @@ internal U8 char_to_correct_slash(U8 c); //////////////////////////////// //~ rjf: C-String Measurement -internal U64 cstring8_length(U8 *c); +internal U64 cstring8_length (U8 *c); internal U64 cstring16_length(U16 *c); internal U64 cstring32_length(U32 *c); @@ -178,9 +183,9 @@ internal U64 cstring32_length(U32 *c); #define str8_lit_comp(S) { (U8*)(S), sizeof(S) - 1, } #define str8_varg(S) (int)((S).size), ((S).str) -#define str8_array(S,C) str8((U8*)(S), sizeof(*(S))*(C)) +#define str8_array(S,C) str8((U8*)(S), sizeof(*(S)) * (C)) #define str8_array_fixed(S) str8((U8*)(S), sizeof(S)) -#define str8_struct(S) str8((U8*)(S), sizeof(*(S))) +#define str8_struct(S) str8((U8*)(S), sizeof(*(S))) internal String8 str8(U8 *str, U64 size); internal String8 str8_range(U8 *first, U8 *one_past_last); @@ -199,50 +204,50 @@ internal String8 str8_cstring_capped(void *cstr, void *cap); //////////////////////////////// //~ rjf: String Stylization -internal String8 upper_from_str8(Arena *arena, String8 string); -internal String8 lower_from_str8(Arena *arena, String8 string); +internal String8 upper_from_str8 (Arena *arena, String8 string); +internal String8 lower_from_str8 (Arena *arena, String8 string); internal String8 backslashed_from_str8(Arena *arena, String8 string); //////////////////////////////// //~ rjf: String Matching -internal B32 str8_match(String8 a, String8 b, StringMatchFlags flags); +internal B32 str8_match (String8 a, String8 b, StringMatchFlags flags); internal U64 str8_find_needle(String8 string, U64 start_pos, String8 needle, StringMatchFlags flags); -internal B32 str8_ends_with(String8 string, String8 end, StringMatchFlags flags); +internal B32 str8_ends_with (String8 string, String8 end, StringMatchFlags flags); //////////////////////////////// //~ rjf: String Slicing -internal String8 str8_substr(String8 str, Rng1U64 range); -internal String8 str8_prefix(String8 str, U64 size); -internal String8 str8_skip(String8 str, U64 amt); +internal String8 str8_substr (String8 str, Rng1U64 range); +internal String8 str8_prefix (String8 str, U64 size); +internal String8 str8_skip (String8 str, U64 amt); internal String8 str8_postfix(String8 str, U64 size); -internal String8 str8_chop(String8 str, U64 amt); +internal String8 str8_chop (String8 str, U64 amt); internal String8 str8_skip_chop_whitespace(String8 string); //////////////////////////////// //~ rjf: String Formatting & Copying -internal String8 push_str8_cat(Arena *arena, String8 s1, String8 s2); +internal String8 push_str8_cat (Arena *arena, String8 s1, String8 s2); internal String8 push_str8_copy(Arena *arena, String8 s); -internal String8 push_str8fv(Arena *arena, char *fmt, va_list args); -internal String8 push_str8f(Arena *arena, char *fmt, ...); +internal String8 push_str8fv (Arena *arena, char *fmt, va_list args); +internal String8 push_str8f (Arena *arena, char *fmt, ...); //////////////////////////////// //~ rjf: String <=> Integer Conversions //- rjf: string -> integer -internal S64 sign_from_str8(String8 string, String8 *string_tail); -internal B32 str8_is_integer(String8 string, U32 radix); -internal U64 u64_from_str8(String8 string, U32 radix); -internal S64 s64_from_str8(String8 string, U32 radix); +internal S64 sign_from_str8 (String8 string, String8 *string_tail); +internal B32 str8_is_integer (String8 string, U32 radix); +internal U64 u64_from_str8 (String8 string, U32 radix); +internal S64 s64_from_str8 (String8 string, U32 radix); internal B32 try_u64_from_str8_c_rules(String8 string, U64 *x); internal B32 try_s64_from_str8_c_rules(String8 string, S64 *x); //- rjf: integer -> string internal String8 str8_from_memory_size(Arena *arena, U64 z); -internal String8 str8_from_u64(Arena *arena, U64 u64, U32 radix, U8 min_digits, U8 digit_group_separator); -internal String8 str8_from_s64(Arena *arena, S64 s64, U32 radix, U8 min_digits, U8 digit_group_separator); +internal String8 str8_from_u64 (Arena *arena, U64 u64, U32 radix, U8 min_digits, U8 digit_group_separator); +internal String8 str8_from_s64 (Arena *arena, S64 s64, U32 radix, U8 min_digits, U8 digit_group_separator); //////////////////////////////// //~ rjf: String <=> Float Conversions @@ -252,65 +257,66 @@ internal F64 f64_from_str8(String8 string); //////////////////////////////// //~ rjf: String List Construction Functions -internal String8Node* str8_list_push_node(String8List *list, String8Node *node); -internal String8Node* str8_list_push_node_set_string(String8List *list, String8Node *node, String8 string); -internal String8Node* str8_list_push_node_front(String8List *list, String8Node *node); +internal String8Node* str8_list_push_node (String8List *list, String8Node *node); +internal String8Node* str8_list_push_node_set_string (String8List *list, String8Node *node, String8 string); +internal String8Node* str8_list_push_node_front (String8List *list, String8Node *node); internal String8Node* str8_list_push_node_front_set_string(String8List *list, String8Node *node, String8 string); -internal String8Node* str8_list_push(Arena *arena, String8List *list, String8 string); -internal String8Node* str8_list_push_front(Arena *arena, String8List *list, String8 string); -internal void str8_list_concat_in_place(String8List *list, String8List *to_push); -internal String8Node* str8_list_push_aligner(Arena *arena, String8List *list, U64 min, U64 align); -internal String8Node* str8_list_pushf(Arena *arena, String8List *list, char *fmt, ...); -internal String8Node* str8_list_push_frontf(Arena *arena, String8List *list, char *fmt, ...); -internal String8List str8_list_copy(Arena *arena, String8List *list); +internal String8Node* str8_list_push (Arena *arena, String8List *list, String8 string); +internal String8Node* str8_list_push_front (Arena *arena, String8List *list, String8 string); +internal void str8_list_concat_in_place (String8List *list, String8List *to_push); +internal String8Node* str8_list_push_aligner (Arena *arena, String8List *list, U64 min, U64 align); +internal String8Node* str8_list_pushf (Arena *arena, String8List *list, char *fmt, ...); +internal String8Node* str8_list_push_frontf (Arena *arena, String8List *list, char *fmt, ...); +internal String8List str8_list_copy (Arena *arena, String8List *list); + #define str8_list_first(list) ((list)->first ? (list)->first->string : str8_zero()) //////////////////////////////// //~ rjf: String Splitting & Joining -internal String8List str8_split(Arena *arena, String8 string, U8 *split_chars, U64 split_char_count, StringSplitFlags flags); -internal String8List str8_split_by_string_chars(Arena *arena, String8 string, String8 split_chars, StringSplitFlags flags); +internal String8List str8_split (Arena *arena, String8 string, U8 *split_chars, U64 split_char_count, StringSplitFlags flags); +internal String8List str8_split_by_string_chars (Arena *arena, String8 string, String8 split_chars, StringSplitFlags flags); internal String8List str8_list_split_by_string_chars(Arena *arena, String8List list, String8 split_chars, StringSplitFlags flags); -internal String8 str8_list_join(Arena *arena, String8List *list, StringJoin *optional_params); -internal void str8_list_from_flags(Arena *arena, String8List *list, U32 flags, String8 *flag_string_table, U32 flag_string_count); +internal String8 str8_list_join (Arena *arena, String8List *list, StringJoin *optional_params); +internal void str8_list_from_flags (Arena *arena, String8List *list, U32 flags, String8 *flag_string_table, U32 flag_string_count); //////////////////////////////// //~ rjf; String Arrays internal String8Array str8_array_from_list(Arena *arena, String8List *list); -internal String8Array str8_array_reserve(Arena *arena, U64 count); +internal String8Array str8_array_reserve (Arena *arena, U64 count); //////////////////////////////// //~ rjf: String Path Helpers internal String8 str8_chop_last_slash(String8 string); internal String8 str8_skip_last_slash(String8 string); -internal String8 str8_chop_last_dot(String8 string); -internal String8 str8_skip_last_dot(String8 string); +internal String8 str8_chop_last_dot (String8 string); +internal String8 str8_skip_last_dot (String8 string); -internal PathStyle path_style_from_str8(String8 string); -internal String8List str8_split_path(Arena *arena, String8 string); +internal PathStyle path_style_from_str8 (String8 string); +internal String8List str8_split_path (Arena *arena, String8 string); internal void str8_path_list_resolve_dots_in_place(String8List *path, PathStyle style); -internal String8 str8_path_list_join_by_style(Arena *arena, String8List *path, PathStyle style); +internal String8 str8_path_list_join_by_style (Arena *arena, String8List *path, PathStyle style); internal String8TxtPtPair str8_txt_pt_pair_from_string(String8 string); //////////////////////////////// //~ rjf: UTF-8 & UTF-16 Decoding/Encoding -internal UnicodeDecode utf8_decode(U8 *str, U64 max); -internal UnicodeDecode utf16_decode(U16 *str, U64 max); -internal U32 utf8_encode(U8 *str, U32 codepoint); -internal U32 utf16_encode(U16 *str, U32 codepoint); -internal U32 utf8_from_utf32_single(U8 *buffer, U32 character); +internal UnicodeDecode utf8_decode (U8* str, U64 max); +internal UnicodeDecode utf16_decode (U16* str, U64 max); +internal U32 utf8_encode (U8* str, U32 codepoint); +internal U32 utf16_encode (U16* str, U32 codepoint); +internal U32 utf8_from_utf32_single(U8* buffer, U32 character); //////////////////////////////// //~ rjf: Unicode String Conversions -internal String8 str8_from_16(Arena *arena, String16 in); -internal String16 str16_from_8(Arena *arena, String8 in); -internal String8 str8_from_32(Arena *arena, String32 in); -internal String32 str32_from_8(Arena *arena, String8 in); +internal String8 str8_from_16(Arena* arena, String16 in); +internal String16 str16_from_8(Arena* arena, String8 in); +internal String8 str8_from_32(Arena* arena, String32 in); +internal String32 str32_from_8(Arena* arena, String8 in); //////////////////////////////// //~ rjf: Basic Types & Space Enum -> String Conversions @@ -323,11 +329,11 @@ internal String8 string_from_architecture(Architecture arch); //////////////////////////////// //~ rjf: Time Types -> String -internal String8 string_from_week_day(WeekDay week_day); -internal String8 string_from_month(Month month); -internal String8 push_date_time_string(Arena *arena, DateTime *date_time); -internal String8 push_file_name_date_time_string(Arena *arena, DateTime *date_time); -internal String8 string_from_elapsed_time(Arena *arena, DateTime dt); +internal String8 string_from_week_day (WeekDay week_day); +internal String8 string_from_month (Month month); +internal String8 push_date_time_string (Arena* arena, DateTime* date_time); +internal String8 push_file_name_date_time_string(Arena* arena, DateTime* date_time); +internal String8 string_from_elapsed_time (Arena* arena, DateTime dt); //////////////////////////////// //~ rjf: Basic Text Indentation @@ -348,37 +354,38 @@ internal Vec4F32 rgba_from_hex_string_4f32(String8 hex_string); //////////////////////////////// //~ rjf: String Fuzzy Matching -internal FuzzyMatchRangeList fuzzy_match_find(Arena *arena, String8 needle, String8 haystack); +internal FuzzyMatchRangeList fuzzy_match_find (Arena *arena, String8 needle, String8 haystack); internal FuzzyMatchRangeList fuzzy_match_range_list_copy(Arena *arena, FuzzyMatchRangeList *src); //////////////////////////////// //~ NOTE(allen): Serialization Helpers -internal void str8_serial_begin(Arena *arena, String8List *srl); -internal String8 str8_serial_end(Arena *arena, String8List *srl); -internal void str8_serial_write_to_dst(String8List *srl, void *out); -internal U64 str8_serial_push_align(Arena *arena, String8List *srl, U64 align); -internal void * str8_serial_push_size(Arena *arena, String8List *srl, U64 size); -internal void * str8_serial_push_data(Arena *arena, String8List *srl, void *data, U64 size); +internal void str8_serial_begin (Arena *arena, String8List *srl); +internal String8 str8_serial_end (Arena *arena, String8List *srl); +internal void str8_serial_write_to_dst (String8List *srl, void *out); +internal U64 str8_serial_push_align (Arena *arena, String8List *srl, U64 align); +internal void * str8_serial_push_size (Arena *arena, String8List *srl, U64 size); +internal void * str8_serial_push_data (Arena *arena, String8List *srl, void *data, U64 size); internal void str8_serial_push_data_list(Arena *arena, String8List *srl, String8Node *first); -internal void str8_serial_push_u64(Arena *arena, String8List *srl, U64 x); -internal void str8_serial_push_u32(Arena *arena, String8List *srl, U32 x); -internal void str8_serial_push_u16(Arena *arena, String8List *srl, U16 x); -internal void str8_serial_push_u8(Arena *arena, String8List *srl, U8 x); -internal void str8_serial_push_cstr(Arena *arena, String8List *srl, String8 str); -internal void str8_serial_push_string(Arena *arena, String8List *srl, String8 str); +internal void str8_serial_push_u64 (Arena *arena, String8List *srl, U64 x); +internal void str8_serial_push_u32 (Arena *arena, String8List *srl, U32 x); +internal void str8_serial_push_u16 (Arena *arena, String8List *srl, U16 x); +internal void str8_serial_push_u8 (Arena *arena, String8List *srl, U8 x); +internal void str8_serial_push_cstr (Arena *arena, String8List *srl, String8 str); +internal void str8_serial_push_string (Arena *arena, String8List *srl, String8 str); -#define str8_serial_push_array(arena, srl, ptr, count) str8_serial_push_data(arena, srl, ptr, sizeof(*(ptr)) * (count)) +#define str8_serial_push_array(arena, srl, ptr, count) str8_serial_push_data (arena, srl, ptr, sizeof(*(ptr)) * (count)) #define str8_serial_push_struct(arena, srl, ptr) str8_serial_push_array(arena, srl, ptr, 1) //////////////////////////////// //~ rjf: Deserialization Helpers -internal U64 str8_deserial_read(String8 string, U64 off, void *read_dst, U64 read_size, U64 granularity); -internal U64 str8_deserial_find_first_match(String8 string, U64 off, U16 scan_val); -internal void * str8_deserial_get_raw_ptr(String8 string, U64 off, U64 size);internal U64 str8_deserial_read_cstr(String8 string, U64 off, String8 *cstr_out); +internal U64 str8_deserial_read (String8 string, U64 off, void *read_dst, U64 read_size, U64 granularity); +internal U64 str8_deserial_find_first_match (String8 string, U64 off, U16 scan_val); +internal void * str8_deserial_get_raw_ptr (String8 string, U64 off, U64 size); +internal U64 str8_deserial_read_cstr (String8 string, U64 off, String8 *cstr_out); internal U64 str8_deserial_read_windows_utf16_string16(String8 string, U64 off, String16 *str_out); -internal U64 str8_deserial_read_block(String8 string, U64 off, U64 size, String8 *block_out); +internal U64 str8_deserial_read_block (String8 string, U64 off, U64 size, String8 *block_out); #define str8_deserial_read_array(string, off, ptr, count) str8_deserial_read((string), (off), (ptr), sizeof(*(ptr)) * (count), sizeof( *(ptr))) #define str8_deserial_read_struct(string, off, ptr) str8_deserial_read((string), (off), (ptr), sizeof(*(ptr)), sizeof( *(ptr))) diff --git a/code/base/text.c b/code/base/text.c new file mode 100644 index 0000000..e69de29 diff --git a/code/base/text.h b/code/base/text.h new file mode 100644 index 0000000..e69de29 diff --git a/code/base/toolchain.c b/code/base/toolchain.c new file mode 100644 index 0000000..e69de29 diff --git a/code/base/zpl_memory.h b/code/base/zpl_memory.h index df6ca8e..b2372fe 100644 --- a/code/base/zpl_memory.h +++ b/code/base/zpl_memory.h @@ -1,6 +1,8 @@ #ifdef MD_INTELLISENSE_DIRECTIVES #pragma once #include "base_types.h" +#include "macros.h" +#include "linkage.h" #endif // This provides an alterntive memory strategy to HMH/Casey Muratori/RJF styled arenas diff --git a/code/metagen/metagen_base/metagen_base_math.h b/code/metagen/metagen_base/metagen_base_math.h deleted file mode 100644 index 3406e6a..0000000 --- a/code/metagen/metagen_base/metagen_base_math.h +++ /dev/null @@ -1,649 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef BASE_MATH_H -#define BASE_MATH_H - -//////////////////////////////// -//~ rjf: Vector Types - -//- rjf: 2-vectors - -typedef union Vec2F32 Vec2F32; -union Vec2F32 -{ - struct - { - F32 x; - F32 y; - }; - F32 v[2]; -}; - -typedef union Vec2S64 Vec2S64; -union Vec2S64 -{ - struct - { - S64 x; - S64 y; - }; - S64 v[2]; -}; - -typedef union Vec2S32 Vec2S32; -union Vec2S32 -{ - struct - { - S32 x; - S32 y; - }; - S32 v[2]; -}; - -typedef union Vec2S16 Vec2S16; -union Vec2S16 -{ - struct - { - S16 x; - S16 y; - }; - S16 v[2]; -}; - -//- rjf: 3-vectors - -typedef union Vec3F32 Vec3F32; -union Vec3F32 -{ - struct - { - F32 x; - F32 y; - F32 z; - }; - struct - { - Vec2F32 xy; - F32 _z0; - }; - struct - { - F32 _x0; - Vec2F32 yz; - }; - F32 v[3]; -}; - -typedef union Vec3S32 Vec3S32; -union Vec3S32 -{ - struct - { - S32 x; - S32 y; - S32 z; - }; - struct - { - Vec2S32 xy; - S32 _z0; - }; - struct - { - S32 _x0; - Vec2S32 yz; - }; - S32 v[3]; -}; - -//- rjf: 4-vectors - -typedef union Vec4F32 Vec4F32; -union Vec4F32 -{ - struct - { - F32 x; - F32 y; - F32 z; - F32 w; - }; - struct - { - Vec2F32 xy; - Vec2F32 zw; - }; - struct - { - Vec3F32 xyz; - F32 _z0; - }; - struct - { - F32 _x0; - Vec3F32 yzw; - }; - F32 v[4]; -}; - -typedef union Vec4S32 Vec4S32; -union Vec4S32 -{ - struct - { - S32 x; - S32 y; - S32 z; - S32 w; - }; - struct - { - Vec2S32 xy; - Vec2S32 zw; - }; - struct - { - Vec3S32 xyz; - S32 _z0; - }; - struct - { - S32 _x0; - Vec3S32 yzw; - }; - S32 v[4]; -}; - -//////////////////////////////// -//~ rjf: Matrix Types - -typedef struct Mat3x3F32 Mat3x3F32; -struct Mat3x3F32 -{ - F32 v[3][3]; -}; - -typedef struct Mat4x4F32 Mat4x4F32; -struct Mat4x4F32 -{ - F32 v[4][4]; -}; - -//////////////////////////////// -//~ rjf: Range Types - -//- rjf: 1-range - -typedef union Rng1U32 Rng1U32; -union Rng1U32 -{ - struct - { - U32 min; - U32 max; - }; - U32 v[2]; -}; - -typedef union Rng1S32 Rng1S32; -union Rng1S32 -{ - struct - { - S32 min; - S32 max; - }; - S32 v[2]; -}; - -typedef union Rng1U64 Rng1U64; -union Rng1U64 -{ - struct - { - U64 min; - U64 max; - }; - U64 v[2]; -}; - -typedef union Rng1S64 Rng1S64; -union Rng1S64 -{ - struct - { - S64 min; - S64 max; - }; - S64 v[2]; -}; - -typedef union Rng1F32 Rng1F32; -union Rng1F32 -{ - struct - { - F32 min; - F32 max; - }; - F32 v[2]; -}; - -//- rjf: 2-range (rectangles) - -typedef union Rng2S16 Rng2S16; -union Rng2S16 -{ - struct - { - Vec2S16 min; - Vec2S16 max; - }; - struct - { - Vec2S16 p0; - Vec2S16 p1; - }; - struct - { - S16 x0; - S16 y0; - S16 x1; - S16 y1; - }; - Vec2S16 v[2]; -}; - -typedef union Rng2S32 Rng2S32; -union Rng2S32 -{ - struct - { - Vec2S32 min; - Vec2S32 max; - }; - struct - { - Vec2S32 p0; - Vec2S32 p1; - }; - struct - { - S32 x0; - S32 y0; - S32 x1; - S32 y1; - }; - Vec2S32 v[2]; -}; - -typedef union Rng2F32 Rng2F32; -union Rng2F32 -{ - struct - { - Vec2F32 min; - Vec2F32 max; - }; - struct - { - Vec2F32 p0; - Vec2F32 p1; - }; - struct - { - F32 x0; - F32 y0; - F32 x1; - F32 y1; - }; - Vec2F32 v[2]; -}; - -typedef union Rng2S64 Rng2S64; -union Rng2S64 -{ - struct - { - Vec2S64 min; - Vec2S64 max; - }; - struct - { - Vec2S64 p0; - Vec2S64 p1; - }; - struct - { - S64 x0; - S64 y0; - S64 x1; - S64 y1; - }; - Vec2S64 v[2]; -}; - -//////////////////////////////// -//~ rjf: List Types - -typedef struct Rng1S64Node Rng1S64Node; -struct Rng1S64Node -{ - Rng1S64Node *next; - Rng1S64 v; -}; - -typedef struct Rng1S64List Rng1S64List; -struct Rng1S64List -{ - Rng1S64Node *first; - Rng1S64Node *last; - U64 count; -}; - -typedef struct Rng1S64Array Rng1S64Array; -struct Rng1S64Array -{ - Rng1S64 *v; - U64 count; -}; - -//////////////////////////////// -//~ rjf: Scalar Ops - -#define abs_s64(v) (S64)llabs(v) - -#define sqrt_f32(v) sqrtf(v) -#define mod_f32(a, b) fmodf((a), (b)) -#define pow_f32(b, e) powf((b), (e)) -#define ceil_f32(v) ceilf(v) -#define floor_f32(v) floorf(v) -#define round_f32(v) roundf(v) -#define abs_f32(v) fabsf(v) -#define radians_from_turns_f32(v) ((v)*2*3.1415926535897f) -#define turns_from_radians_f32(v) ((v)/2*3.1415926535897f) -#define degrees_from_turns_f32(v) ((v)*360.f) -#define turns_from_degrees_f32(v) ((v)/360.f) -#define degrees_from_radians_f32(v) (degrees_from_turns_f32(turns_from_radians_f32(v))) -#define radians_from_degrees_f32(v) (radians_from_turns_f32(turns_from_degrees_f32(v))) -#define sin_f32(v) sinf(radians_from_turns_f32(v)) -#define cos_f32(v) cosf(radians_from_turns_f32(v)) -#define tan_f32(v) tanf(radians_from_turns_f32(v)) - -#define sqrt_f64(v) sqrt(v) -#define mod_f64(a, b) fmod((a), (b)) -#define pow_f64(b, e) pow((b), (e)) -#define ceil_f64(v) ceil(v) -#define floor_f64(v) floor(v) -#define round_f64(v) round(v) -#define abs_f64(v) fabs(v) -#define radians_from_turns_f64(v) ((v)*2*3.1415926535897) -#define turns_from_radians_f64(v) ((v)/2*3.1415926535897) -#define degrees_from_turns_f64(v) ((v)*360.0) -#define turns_from_degrees_f64(v) ((v)/360.0) -#define degrees_from_radians_f64(v) (degrees_from_turns_f64(turns_from_radians_f64(v))) -#define radians_from_degrees_f64(v) (radians_from_turns_f64(turns_from_degrees_f64(v))) -#define sin_f64(v) sin(radians_from_turns_f64(v)) -#define cos_f64(v) cos(radians_from_turns_f64(v)) -#define tan_f64(v) tan(radians_from_turns_f64(v)) - -internal F32 mix_1f32(F32 a, F32 b, F32 t); -internal F64 mix_1f64(F64 a, F64 b, F64 t); - -//////////////////////////////// -//~ rjf: Vector Ops - -#define v2f32(x, y) vec_2f32((x), (y)) -internal Vec2F32 vec_2f32(F32 x, F32 y); -internal Vec2F32 add_2f32(Vec2F32 a, Vec2F32 b); -internal Vec2F32 sub_2f32(Vec2F32 a, Vec2F32 b); -internal Vec2F32 mul_2f32(Vec2F32 a, Vec2F32 b); -internal Vec2F32 div_2f32(Vec2F32 a, Vec2F32 b); -internal Vec2F32 scale_2f32(Vec2F32 v, F32 s); -internal F32 dot_2f32(Vec2F32 a, Vec2F32 b); -internal F32 length_squared_2f32(Vec2F32 v); -internal F32 length_2f32(Vec2F32 v); -internal Vec2F32 normalize_2f32(Vec2F32 v); -internal Vec2F32 mix_2f32(Vec2F32 a, Vec2F32 b, F32 t); - -#define v2s64(x, y) vec_2s64((x), (y)) -internal Vec2S64 vec_2s64(S64 x, S64 y); -internal Vec2S64 add_2s64(Vec2S64 a, Vec2S64 b); -internal Vec2S64 sub_2s64(Vec2S64 a, Vec2S64 b); -internal Vec2S64 mul_2s64(Vec2S64 a, Vec2S64 b); -internal Vec2S64 div_2s64(Vec2S64 a, Vec2S64 b); -internal Vec2S64 scale_2s64(Vec2S64 v, S64 s); -internal S64 dot_2s64(Vec2S64 a, Vec2S64 b); -internal S64 length_squared_2s64(Vec2S64 v); -internal S64 length_2s64(Vec2S64 v); -internal Vec2S64 normalize_2s64(Vec2S64 v); -internal Vec2S64 mix_2s64(Vec2S64 a, Vec2S64 b, F32 t); - -#define v2s32(x, y) vec_2s32((x), (y)) -internal Vec2S32 vec_2s32(S32 x, S32 y); -internal Vec2S32 add_2s32(Vec2S32 a, Vec2S32 b); -internal Vec2S32 sub_2s32(Vec2S32 a, Vec2S32 b); -internal Vec2S32 mul_2s32(Vec2S32 a, Vec2S32 b); -internal Vec2S32 div_2s32(Vec2S32 a, Vec2S32 b); -internal Vec2S32 scale_2s32(Vec2S32 v, S32 s); -internal S32 dot_2s32(Vec2S32 a, Vec2S32 b); -internal S32 length_squared_2s32(Vec2S32 v); -internal S32 length_2s32(Vec2S32 v); -internal Vec2S32 normalize_2s32(Vec2S32 v); -internal Vec2S32 mix_2s32(Vec2S32 a, Vec2S32 b, F32 t); - -#define v2s16(x, y) vec_2s16((x), (y)) -internal Vec2S16 vec_2s16(S16 x, S16 y); -internal Vec2S16 add_2s16(Vec2S16 a, Vec2S16 b); -internal Vec2S16 sub_2s16(Vec2S16 a, Vec2S16 b); -internal Vec2S16 mul_2s16(Vec2S16 a, Vec2S16 b); -internal Vec2S16 div_2s16(Vec2S16 a, Vec2S16 b); -internal Vec2S16 scale_2s16(Vec2S16 v, S16 s); -internal S16 dot_2s16(Vec2S16 a, Vec2S16 b); -internal S16 length_squared_2s16(Vec2S16 v); -internal S16 length_2s16(Vec2S16 v); -internal Vec2S16 normalize_2s16(Vec2S16 v); -internal Vec2S16 mix_2s16(Vec2S16 a, Vec2S16 b, F32 t); - -#define v3f32(x, y, z) vec_3f32((x), (y), (z)) -internal Vec3F32 vec_3f32(F32 x, F32 y, F32 z); -internal Vec3F32 add_3f32(Vec3F32 a, Vec3F32 b); -internal Vec3F32 sub_3f32(Vec3F32 a, Vec3F32 b); -internal Vec3F32 mul_3f32(Vec3F32 a, Vec3F32 b); -internal Vec3F32 div_3f32(Vec3F32 a, Vec3F32 b); -internal Vec3F32 scale_3f32(Vec3F32 v, F32 s); -internal F32 dot_3f32(Vec3F32 a, Vec3F32 b); -internal F32 length_squared_3f32(Vec3F32 v); -internal F32 length_3f32(Vec3F32 v); -internal Vec3F32 normalize_3f32(Vec3F32 v); -internal Vec3F32 mix_3f32(Vec3F32 a, Vec3F32 b, F32 t); -internal Vec3F32 cross_3f32(Vec3F32 a, Vec3F32 b); - -#define v3s32(x, y, z) vec_3s32((x), (y), (z)) -internal Vec3S32 vec_3s32(S32 x, S32 y, S32 z); -internal Vec3S32 add_3s32(Vec3S32 a, Vec3S32 b); -internal Vec3S32 sub_3s32(Vec3S32 a, Vec3S32 b); -internal Vec3S32 mul_3s32(Vec3S32 a, Vec3S32 b); -internal Vec3S32 div_3s32(Vec3S32 a, Vec3S32 b); -internal Vec3S32 scale_3s32(Vec3S32 v, S32 s); -internal S32 dot_3s32(Vec3S32 a, Vec3S32 b); -internal S32 length_squared_3s32(Vec3S32 v); -internal S32 length_3s32(Vec3S32 v); -internal Vec3S32 normalize_3s32(Vec3S32 v); -internal Vec3S32 mix_3s32(Vec3S32 a, Vec3S32 b, F32 t); -internal Vec3S32 cross_3s32(Vec3S32 a, Vec3S32 b); - -#define v4f32(x, y, z, w) vec_4f32((x), (y), (z), (w)) -internal Vec4F32 vec_4f32(F32 x, F32 y, F32 z, F32 w); -internal Vec4F32 add_4f32(Vec4F32 a, Vec4F32 b); -internal Vec4F32 sub_4f32(Vec4F32 a, Vec4F32 b); -internal Vec4F32 mul_4f32(Vec4F32 a, Vec4F32 b); -internal Vec4F32 div_4f32(Vec4F32 a, Vec4F32 b); -internal Vec4F32 scale_4f32(Vec4F32 v, F32 s); -internal F32 dot_4f32(Vec4F32 a, Vec4F32 b); -internal F32 length_squared_4f32(Vec4F32 v); -internal F32 length_4f32(Vec4F32 v); -internal Vec4F32 normalize_4f32(Vec4F32 v); -internal Vec4F32 mix_4f32(Vec4F32 a, Vec4F32 b, F32 t); - -#define v4s32(x, y, z, w) vec_4s32((x), (y), (z), (w)) -internal Vec4S32 vec_4s32(S32 x, S32 y, S32 z, S32 w); -internal Vec4S32 add_4s32(Vec4S32 a, Vec4S32 b); -internal Vec4S32 sub_4s32(Vec4S32 a, Vec4S32 b); -internal Vec4S32 mul_4s32(Vec4S32 a, Vec4S32 b); -internal Vec4S32 div_4s32(Vec4S32 a, Vec4S32 b); -internal Vec4S32 scale_4s32(Vec4S32 v, S32 s); -internal S32 dot_4s32(Vec4S32 a, Vec4S32 b); -internal S32 length_squared_4s32(Vec4S32 v); -internal S32 length_4s32(Vec4S32 v); -internal Vec4S32 normalize_4s32(Vec4S32 v); -internal Vec4S32 mix_4s32(Vec4S32 a, Vec4S32 b, F32 t); - -//////////////////////////////// -//~ rjf: Matrix Ops - -internal Mat3x3F32 mat_3x3f32(F32 diagonal); -internal Mat3x3F32 make_translate_3x3f32(Vec2F32 delta); -internal Mat3x3F32 make_scale_3x3f32(Vec2F32 scale); -internal Mat3x3F32 mul_3x3f32(Mat3x3F32 a, Mat3x3F32 b); - -internal Mat4x4F32 mat_4x4f32(F32 diagonal); -internal Mat4x4F32 make_translate_4x4f32(Vec3F32 delta); -internal Mat4x4F32 make_scale_4x4f32(Vec3F32 scale); -internal Mat4x4F32 make_perspective_4x4f32(F32 fov, F32 aspect_ratio, F32 near_z, F32 far_z); -internal Mat4x4F32 make_orthographic_4x4f32(F32 left, F32 right, F32 bottom, F32 top, F32 near_z, F32 far_z); -internal Mat4x4F32 make_look_at_4x4f32(Vec3F32 eye, Vec3F32 center, Vec3F32 up); -internal Mat4x4F32 make_rotate_4x4f32(Vec3F32 axis, F32 turns); -internal Mat4x4F32 mul_4x4f32(Mat4x4F32 a, Mat4x4F32 b); -internal Mat4x4F32 scale_4x4f32(Mat4x4F32 m, F32 scale); -internal Mat4x4F32 inverse_4x4f32(Mat4x4F32 m); -internal Mat4x4F32 derotate_4x4f32(Mat4x4F32 mat); - -//////////////////////////////// -//~ rjf: Range Ops - -#define r1u32(min, max) rng_1u32((min), (max)) -internal Rng1U32 rng_1u32(U32 min, U32 max); -internal Rng1U32 shift_1u32(Rng1U32 r, U32 x); -internal Rng1U32 pad_1u32(Rng1U32 r, U32 x); -internal U32 center_1u32(Rng1U32 r); -internal B32 contains_1u32(Rng1U32 r, U32 x); -internal U32 dim_1u32(Rng1U32 r); -internal Rng1U32 union_1u32(Rng1U32 a, Rng1U32 b); -internal Rng1U32 intersect_1u32(Rng1U32 a, Rng1U32 b); -internal U32 clamp_1u32(Rng1U32 r, U32 v); - -#define r1s32(min, max) rng_1s32((min), (max)) -internal Rng1S32 rng_1s32(S32 min, S32 max); -internal Rng1S32 shift_1s32(Rng1S32 r, S32 x); -internal Rng1S32 pad_1s32(Rng1S32 r, S32 x); -internal S32 center_1s32(Rng1S32 r); -internal B32 contains_1s32(Rng1S32 r, S32 x); -internal S32 dim_1s32(Rng1S32 r); -internal Rng1S32 union_1s32(Rng1S32 a, Rng1S32 b); -internal Rng1S32 intersect_1s32(Rng1S32 a, Rng1S32 b); -internal S32 clamp_1s32(Rng1S32 r, S32 v); - -#define r1u64(min, max) rng_1u64((min), (max)) -internal Rng1U64 rng_1u64(U64 min, U64 max); -internal Rng1U64 shift_1u64(Rng1U64 r, U64 x); -internal Rng1U64 pad_1u64(Rng1U64 r, U64 x); -internal U64 center_1u64(Rng1U64 r); -internal B32 contains_1u64(Rng1U64 r, U64 x); -internal U64 dim_1u64(Rng1U64 r); -internal Rng1U64 union_1u64(Rng1U64 a, Rng1U64 b); -internal Rng1U64 intersect_1u64(Rng1U64 a, Rng1U64 b); -internal U64 clamp_1u64(Rng1U64 r, U64 v); - -#define r1s64(min, max) rng_1s64((min), (max)) -internal Rng1S64 rng_1s64(S64 min, S64 max); -internal Rng1S64 shift_1s64(Rng1S64 r, S64 x); -internal Rng1S64 pad_1s64(Rng1S64 r, S64 x); -internal S64 center_1s64(Rng1S64 r); -internal B32 contains_1s64(Rng1S64 r, S64 x); -internal S64 dim_1s64(Rng1S64 r); -internal Rng1S64 union_1s64(Rng1S64 a, Rng1S64 b); -internal Rng1S64 intersect_1s64(Rng1S64 a, Rng1S64 b); -internal S64 clamp_1s64(Rng1S64 r, S64 v); - -#define r1f32(min, max) rng_1f32((min), (max)) -internal Rng1F32 rng_1f32(F32 min, F32 max); -internal Rng1F32 shift_1f32(Rng1F32 r, F32 x); -internal Rng1F32 pad_1f32(Rng1F32 r, F32 x); -internal F32 center_1f32(Rng1F32 r); -internal B32 contains_1f32(Rng1F32 r, F32 x); -internal F32 dim_1f32(Rng1F32 r); -internal Rng1F32 union_1f32(Rng1F32 a, Rng1F32 b); -internal Rng1F32 intersect_1f32(Rng1F32 a, Rng1F32 b); -internal F32 clamp_1f32(Rng1F32 r, F32 v); - -#define r2s16(min, max) rng_2s16((min), (max)) -#define r2s16p(x, y, z, w) r2s16(v2s16((x), (y)), v2s16((z), (w))) -internal Rng2S16 rng_2s16(Vec2S16 min, Vec2S16 max); -internal Rng2S16 shift_2s16(Rng2S16 r, Vec2S16 x); -internal Rng2S16 pad_2s16(Rng2S16 r, S16 x); -internal Vec2S16 center_2s16(Rng2S16 r); -internal B32 contains_2s16(Rng2S16 r, Vec2S16 x); -internal Vec2S16 dim_2s16(Rng2S16 r); -internal Rng2S16 union_2s16(Rng2S16 a, Rng2S16 b); -internal Rng2S16 intersect_2s16(Rng2S16 a, Rng2S16 b); -internal Vec2S16 clamp_2s16(Rng2S16 r, Vec2S16 v); - -#define r2s32(min, max) rng_2s32((min), (max)) -#define r2s32p(x, y, z, w) r2s32(v2s32((x), (y)), v2s32((z), (w))) -internal Rng2S32 rng_2s32(Vec2S32 min, Vec2S32 max); -internal Rng2S32 shift_2s32(Rng2S32 r, Vec2S32 x); -internal Rng2S32 pad_2s32(Rng2S32 r, S32 x); -internal Vec2S32 center_2s32(Rng2S32 r); -internal B32 contains_2s32(Rng2S32 r, Vec2S32 x); -internal Vec2S32 dim_2s32(Rng2S32 r); -internal Rng2S32 union_2s32(Rng2S32 a, Rng2S32 b); -internal Rng2S32 intersect_2s32(Rng2S32 a, Rng2S32 b); -internal Vec2S32 clamp_2s32(Rng2S32 r, Vec2S32 v); - -#define r2s64(min, max) rng_2s64((min), (max)) -#define r2s64p(x, y, z, w) r2s64(v2s64((x), (y)), v2s64((z), (w))) -internal Rng2S64 rng_2s64(Vec2S64 min, Vec2S64 max); -internal Rng2S64 shift_2s64(Rng2S64 r, Vec2S64 x); -internal Rng2S64 pad_2s64(Rng2S64 r, S64 x); -internal Vec2S64 center_2s64(Rng2S64 r); -internal B32 contains_2s64(Rng2S64 r, Vec2S64 x); -internal Vec2S64 dim_2s64(Rng2S64 r); -internal Rng2S64 union_2s64(Rng2S64 a, Rng2S64 b); -internal Rng2S64 intersect_2s64(Rng2S64 a, Rng2S64 b); -internal Vec2S64 clamp_2s64(Rng2S64 r, Vec2S64 v); - -#define r2f32(min, max) rng_2f32((min), (max)) -#define r2f32p(x, y, z, w) r2f32(v2f32((x), (y)), v2f32((z), (w))) -internal Rng2F32 rng_2f32(Vec2F32 min, Vec2F32 max); -internal Rng2F32 shift_2f32(Rng2F32 r, Vec2F32 x); -internal Rng2F32 pad_2f32(Rng2F32 r, F32 x); -internal Vec2F32 center_2f32(Rng2F32 r); -internal B32 contains_2f32(Rng2F32 r, Vec2F32 x); -internal Vec2F32 dim_2f32(Rng2F32 r); -internal Rng2F32 union_2f32(Rng2F32 a, Rng2F32 b); -internal Rng2F32 intersect_2f32(Rng2F32 a, Rng2F32 b); -internal Vec2F32 clamp_2f32(Rng2F32 r, Vec2F32 v); - -//////////////////////////////// -//~ rjf: Miscellaneous Ops - -internal Vec3F32 hsv_from_rgb(Vec3F32 rgb); -internal Vec3F32 rgb_from_hsv(Vec3F32 hsv); -internal Vec4F32 hsva_from_rgba(Vec4F32 rgba); -internal Vec4F32 rgba_from_hsva(Vec4F32 hsva); -internal Vec4F32 rgba_from_u32(U32 hex); -internal U32 u32_from_rgba(Vec4F32 rgba); - -#define rgba_from_u32_lit_comp(h) { (((h)&0xff000000)>>24)/255.f, (((h)&0x00ff0000)>>16)/255.f, (((h)&0x0000ff00)>> 8)/255.f, (((h)&0x000000ff)>> 0)/255.f } - -//////////////////////////////// -//~ rjf: List Type Functions - -internal void rng1s64_list_push(Arena *arena, Rng1S64List *list, Rng1S64 rng); -internal Rng1S64Array rng1s64_array_from_list(Arena *arena, Rng1S64List *list); - -#endif // BASE_MATH_H