Cleaning Up blumen_lumen user space code
This commit is contained in:
parent
874925a5fe
commit
c4769bd53c
|
@ -82,6 +82,17 @@ internal void OpenColorPicker(app_state* State, v4* Address);
|
||||||
|
|
||||||
#include "engine/assembly/foldhaus_assembly.cpp"
|
#include "engine/assembly/foldhaus_assembly.cpp"
|
||||||
|
|
||||||
|
internal assembly*
|
||||||
|
LoadAssembly(gs_const_string Path, app_state* State, context Context)
|
||||||
|
{
|
||||||
|
return LoadAssembly(&State->Assemblies,
|
||||||
|
&State->LedSystem,
|
||||||
|
State->Transient,
|
||||||
|
Context,
|
||||||
|
Path,
|
||||||
|
State->GlobalLog);
|
||||||
|
}
|
||||||
|
|
||||||
#include "engine/user_space.cpp"
|
#include "engine/user_space.cpp"
|
||||||
|
|
||||||
#include "patterns/blumen_patterns.h"
|
#include "patterns/blumen_patterns.h"
|
||||||
|
|
|
@ -57,16 +57,25 @@ DEBUG_SentMotorCommand(motor_packet Packet, gs_thread_context Ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
DEBUG_ReceivedMotorPositions(motor_packet Packet, gs_thread_context Ctx)
|
DEBUG_ReceivedMotorPositions(motor_packet NewPos,
|
||||||
|
motor_packet LastPos,
|
||||||
|
gs_thread_context Ctx)
|
||||||
{
|
{
|
||||||
gs_string Str = PushStringF(Ctx.Transient, 256, "Motor Status Received\nCurrent Positions: %d %d %d\n",
|
bool PosChanged = (LastPos.FlowerPositions[0] != NewPos.FlowerPositions[0] ||
|
||||||
Packet.FlowerPositions[0],
|
LastPos.FlowerPositions[1] != NewPos.FlowerPositions[1] ||
|
||||||
Packet.FlowerPositions[1],
|
LastPos.FlowerPositions[2] != NewPos.FlowerPositions[2]);
|
||||||
Packet.FlowerPositions[2]);
|
|
||||||
DEBUG_AppendText(Str, Ctx);
|
|
||||||
|
|
||||||
NullTerminate(&Str);
|
if (PosChanged)
|
||||||
OutputDebugStringA(Str.Str);
|
{
|
||||||
|
gs_string Str = PushStringF(Ctx.Transient, 256, "Motor Status Received\nCurrent Positions: %d %d %d\n",
|
||||||
|
NewPos.FlowerPositions[0],
|
||||||
|
NewPos.FlowerPositions[1],
|
||||||
|
NewPos.FlowerPositions[2]);
|
||||||
|
DEBUG_AppendText(Str, Ctx);
|
||||||
|
|
||||||
|
NullTerminate(&Str);
|
||||||
|
OutputDebugStringA(Str.Str);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// KB(1) is just bigger than any packet we send. Good for now
|
// KB(1) is just bigger than any packet we send. Good for now
|
||||||
|
@ -261,34 +270,27 @@ BlumenLumen_CustomInit(app_state* State, context Context)
|
||||||
BLState->MicListenThread = CreateThread(Context.ThreadManager, BlumenLumen_MicListenJob, (u8*)&BLState->MicListenJobData);
|
BLState->MicListenThread = CreateThread(Context.ThreadManager, BlumenLumen_MicListenJob, (u8*)&BLState->MicListenJobData);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if 0
|
assembly* Flower0 = LoadAssembly(Flower0AssemblyPath, State, Context);
|
||||||
gs_const_string SculpturePath = ConstString("data/test_blumen.fold");
|
assembly* Flower1 = LoadAssembly(Flower1AssemblyPath, State, Context);
|
||||||
LoadAssembly(&State->Assemblies, &State->LedSystem, State->Transient, Context, SculpturePath, State->GlobalLog);
|
assembly* Flower2 = LoadAssembly(Flower2AssemblyPath, State, Context);
|
||||||
#else
|
|
||||||
gs_const_string SculpturePath0 = ConstString("data/ss_blumen_one.fold");
|
|
||||||
gs_const_string SculpturePath1 = ConstString("data/ss_blumen_two.fold");
|
|
||||||
gs_const_string SculpturePath2 = ConstString("data/ss_blumen_three.fold");
|
|
||||||
assembly* Flower0 = LoadAssembly(&State->Assemblies, &State->LedSystem, State->Transient, Context, SculpturePath0, State->GlobalLog);
|
|
||||||
assembly* Flower1 = LoadAssembly(&State->Assemblies, &State->LedSystem, State->Transient, Context, SculpturePath1, State->GlobalLog);
|
|
||||||
assembly* Flower2 = LoadAssembly(&State->Assemblies, &State->LedSystem, State->Transient, Context, SculpturePath2, State->GlobalLog);
|
|
||||||
|
|
||||||
BLState->AssemblyNameToClearCoreMapCount = 3;
|
BLState->AssemblyNameToClearCoreMapCount = 3;
|
||||||
BLState->AssemblyNameToClearCore_Names = PushArray(&State->Permanent,
|
BLState->AssemblyNameToClearCore_Names = PushArray(&State->Permanent,
|
||||||
u64,
|
u64,
|
||||||
BLState->AssemblyNameToClearCoreMapCount);
|
BLState->AssemblyNameToClearCoreMapCount);
|
||||||
BLState->AssemblyNameToClearCore_Names[0] = HashDJB2ToU32(StringExpand(Flower0->Name));
|
BLState->AssemblyNameToClearCore_Names[0] = HashDJB2ToU64(Flower0->Name);
|
||||||
BLState->AssemblyNameToClearCore_Names[1] = HashDJB2ToU32(StringExpand(Flower1->Name));
|
BLState->AssemblyNameToClearCore_Names[1] = HashDJB2ToU64(Flower1->Name);
|
||||||
BLState->AssemblyNameToClearCore_Names[2] = HashDJB2ToU32(StringExpand(Flower2->Name));
|
BLState->AssemblyNameToClearCore_Names[2] = HashDJB2ToU64(Flower2->Name);
|
||||||
#endif
|
|
||||||
|
|
||||||
{
|
gs_file_handler FileHandler = Context.ThreadContext.FileHandler;
|
||||||
gs_file ColorPhraseCSVFile = ReadEntireFile(Context.ThreadContext.FileHandler, ConstString("data/flower_codes.tsv"));
|
gs_file ColorPhraseCSVFile = ReadEntireFile(FileHandler, PhraseMapCSVPath);
|
||||||
gs_const_string ColorPhraseMapStr = ConstString((char*)ColorPhraseCSVFile.Memory,
|
gs_const_string ColorPhraseMapStr = DataToString(ColorPhraseCSVFile.Data);
|
||||||
ColorPhraseCSVFile.Size);
|
gscsv_sheet ColorPhraseSheet = CSV_Parse(ColorPhraseMapStr,
|
||||||
gscsv_sheet ColorPhraseSheet = CSV_Parse(ColorPhraseMapStr, { '\t' }, State->Transient);
|
{ PhraseMapCSVSeparator },
|
||||||
|
State->Transient);
|
||||||
BLState->PhraseHueMap = PhraseHueMap_GenFromCSV(ColorPhraseSheet, &State->Permanent);
|
|
||||||
}
|
BLState->PhraseHueMap = PhraseHueMap_GenFromCSV(ColorPhraseSheet,
|
||||||
|
&State->Permanent);
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
{ // Animation PLAYGROUND
|
{ // Animation PLAYGROUND
|
||||||
|
@ -343,19 +345,6 @@ BlumenLumen_CustomUpdate(gs_data UserData, app_state* State, context* Context)
|
||||||
bool SendMotorCommand = false;
|
bool SendMotorCommand = false;
|
||||||
blumen_packet MotorCommand = {};
|
blumen_packet MotorCommand = {};
|
||||||
|
|
||||||
#if 0
|
|
||||||
MotorTimeElapsed += Context->DeltaTime;
|
|
||||||
BLState->TimeElapsed += Context->DeltaTime;
|
|
||||||
|
|
||||||
if (BLState->TimeElapsed > 5)
|
|
||||||
{
|
|
||||||
u32 NextIndex = ++BLState->CurrAnim % 3;
|
|
||||||
animation_handle Next = BLState->AnimHandles[NextIndex];
|
|
||||||
AnimationFadeGroup_FadeTo(&State->AnimationSystem.ActiveFadeGroup, Next, 5);
|
|
||||||
BLState->TimeElapsed = 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
while (MessageQueue_CanRead(BLState->IncomingMsgQueue))
|
while (MessageQueue_CanRead(BLState->IncomingMsgQueue))
|
||||||
{
|
{
|
||||||
gs_data PacketData = MessageQueue_Read(&BLState->IncomingMsgQueue);
|
gs_data PacketData = MessageQueue_Read(&BLState->IncomingMsgQueue);
|
||||||
|
@ -406,12 +395,7 @@ BlumenLumen_CustomUpdate(gs_data UserData, app_state* State, context* Context)
|
||||||
T[1] << 0);
|
T[1] << 0);
|
||||||
|
|
||||||
motor_packet LastPos = BLState->LastKnownMotorState;
|
motor_packet LastPos = BLState->LastKnownMotorState;
|
||||||
if (LastPos.FlowerPositions[0] != Motor.Pos.FlowerPositions[0] ||
|
DEBUG_ReceivedMotorPositions(LastPos, Motor.Pos, Context->ThreadContext);
|
||||||
LastPos.FlowerPositions[1] != Motor.Pos.FlowerPositions[1] ||
|
|
||||||
LastPos.FlowerPositions[2] != Motor.Pos.FlowerPositions[2])
|
|
||||||
{
|
|
||||||
DEBUG_ReceivedMotorPositions(Motor.Pos, Context->ThreadContext);
|
|
||||||
}
|
|
||||||
BLState->LastKnownMotorState = Motor.Pos;
|
BLState->LastKnownMotorState = Motor.Pos;
|
||||||
|
|
||||||
}break;
|
}break;
|
||||||
|
@ -429,7 +413,8 @@ BlumenLumen_CustomUpdate(gs_data UserData, app_state* State, context* Context)
|
||||||
BLState->BrightnessPercent = 1.f;
|
BLState->BrightnessPercent = 1.f;
|
||||||
}
|
}
|
||||||
|
|
||||||
gs_string TempStr = PushStringF(State->Transient, 256, "\nTemperature: %d\n",
|
gs_string TempStr = PushStringF(State->Transient, 256,
|
||||||
|
"\nTemperature: %d\n",
|
||||||
Temp.Temperature);
|
Temp.Temperature);
|
||||||
NullTerminate(&TempStr);
|
NullTerminate(&TempStr);
|
||||||
OutputDebugStringA(TempStr.Str);
|
OutputDebugStringA(TempStr.Str);
|
||||||
|
@ -441,10 +426,8 @@ BlumenLumen_CustomUpdate(gs_data UserData, app_state* State, context* Context)
|
||||||
|
|
||||||
|
|
||||||
// Open / Close the Motor
|
// Open / Close the Motor
|
||||||
|
|
||||||
if (MessageQueue_CanWrite(BLState->OutgoingMsgQueue))
|
if (MessageQueue_CanWrite(BLState->OutgoingMsgQueue))
|
||||||
{
|
{
|
||||||
#if 1
|
|
||||||
for (u32 i = 0; i < MotorOpenTimesCount; i++)
|
for (u32 i = 0; i < MotorOpenTimesCount; i++)
|
||||||
{
|
{
|
||||||
time_range Range = MotorOpenTimes[i];
|
time_range Range = MotorOpenTimes[i];
|
||||||
|
@ -487,7 +470,6 @@ BlumenLumen_CustomUpdate(gs_data UserData, app_state* State, context* Context)
|
||||||
MotorCommand = Packet;
|
MotorCommand = Packet;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
if (SendMotorCommand)
|
if (SendMotorCommand)
|
||||||
{
|
{
|
||||||
|
@ -497,8 +479,6 @@ BlumenLumen_CustomUpdate(gs_data UserData, app_state* State, context* Context)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Dim the leds based on temp data
|
// Dim the leds based on temp data
|
||||||
#define DIM_LED_BRIGHTNESS 1
|
|
||||||
#if DIM_LED_BRIGHTNESS
|
|
||||||
for (u32 i = 0; i < State->LedSystem.BuffersCount; i++)
|
for (u32 i = 0; i < State->LedSystem.BuffersCount; i++)
|
||||||
{
|
{
|
||||||
led_buffer Buffer = State->LedSystem.Buffers[i];
|
led_buffer Buffer = State->LedSystem.Buffers[i];
|
||||||
|
@ -517,11 +497,6 @@ BlumenLumen_CustomUpdate(gs_data UserData, app_state* State, context* Context)
|
||||||
motor_packet CurrMotorPos = BLState->LastKnownMotorState;
|
motor_packet CurrMotorPos = BLState->LastKnownMotorState;
|
||||||
for (u32 a = 0; a < State->Assemblies.Count; a++)
|
for (u32 a = 0; a < State->Assemblies.Count; a++)
|
||||||
{
|
{
|
||||||
// TODO(PS): make sure to align which assembly goes with which
|
|
||||||
// flower index
|
|
||||||
bool FlowerIsOpen = BLState->LastKnownMotorState.FlowerPositions[a] == 2;
|
|
||||||
//if (!FlowerIsOpen) continue;
|
|
||||||
|
|
||||||
assembly Assembly = State->Assemblies.Values[a];
|
assembly Assembly = State->Assemblies.Values[a];
|
||||||
u64 AssemblyCCIndex = GetCCIndex(Assembly, BLState);
|
u64 AssemblyCCIndex = GetCCIndex(Assembly, BLState);
|
||||||
|
|
||||||
|
@ -547,7 +522,6 @@ BlumenLumen_CustomUpdate(gs_data UserData, app_state* State, context* Context)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
// Send Status Packet
|
// Send Status Packet
|
||||||
{
|
{
|
||||||
|
|
|
@ -128,53 +128,6 @@ SystemTimeIsInTimeRange(system_time SysTime, time_range Range)
|
||||||
return Result;
|
return Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
global time_range MotorOpenTimes[] = {
|
|
||||||
{ 00, 30, 00, 40 },
|
|
||||||
{ 00, 50, 01, 00 },
|
|
||||||
{ 01, 10, 01, 20 },
|
|
||||||
{ 01, 30, 01, 40 },
|
|
||||||
{ 01, 50, 02, 00 },
|
|
||||||
{ 02, 10, 02, 20 },
|
|
||||||
{ 02, 30, 02, 40 },
|
|
||||||
{ 02, 50, 03, 00 },
|
|
||||||
{ 03, 10, 03, 20 },
|
|
||||||
{ 03, 30, 03, 40 },
|
|
||||||
{ 03, 50, 04, 00 },
|
|
||||||
{ 04, 10, 04, 20 },
|
|
||||||
{ 04, 30, 04, 40 },
|
|
||||||
{ 04, 50, 05, 00 },
|
|
||||||
{ 05, 10, 05, 20 },
|
|
||||||
{ 05, 30, 05, 40 },
|
|
||||||
{ 05, 50, 06, 00 },
|
|
||||||
{ 06, 10, 06, 20 },
|
|
||||||
{ 06, 30, 06, 40 },
|
|
||||||
{ 06, 50, 07, 00 },
|
|
||||||
{ 07, 10, 07, 20 },
|
|
||||||
{ 07, 30, 07, 40 },
|
|
||||||
{ 07, 50, 8, 00 },
|
|
||||||
{ 8, 10, 8, 20 },
|
|
||||||
{ 8, 30, 8, 40 },
|
|
||||||
{ 8, 50, 9, 00 },
|
|
||||||
{ 9, 10, 9, 20 },
|
|
||||||
{ 9, 30, 9, 40 },
|
|
||||||
{ 9, 50, 10, 00 },
|
|
||||||
{ 10, 10, 10, 20 },
|
|
||||||
{ 10, 30, 10, 40 },
|
|
||||||
{ 10, 50, 11, 00 },
|
|
||||||
{ 11, 10, 11, 20 },
|
|
||||||
{ 11, 30, 11, 40 },
|
|
||||||
{ 11, 50, 12, 00 },
|
|
||||||
{ 12, 10, 12, 20 },
|
|
||||||
{ 12, 30, 12, 40 },
|
|
||||||
{ 12, 50, 13, 00 },
|
|
||||||
{ 13, 10, 13, 20 },
|
|
||||||
{ 13, 30, 13, 40 },
|
|
||||||
{ 13, 50, 14, 00 },
|
|
||||||
{ 14, 10, 14, 20 },
|
|
||||||
{ 14, 30, 14, 40 },
|
|
||||||
{ 14, 50, 15, 00 },
|
|
||||||
};
|
|
||||||
global u32 MotorOpenTimesCount = sizeof(MotorOpenTimes) / sizeof(MotorOpenTimes[0]);;
|
|
||||||
|
|
||||||
struct phrase_string_to_anim_file
|
struct phrase_string_to_anim_file
|
||||||
{
|
{
|
||||||
|
@ -193,6 +146,8 @@ phrase_string_to_anim_file PhraseToAnimMap[] = {
|
||||||
};
|
};
|
||||||
u32 PhraseToAnimMapCount = sizeof(PhraseToAnimMap) / sizeof(PhraseToAnimMap[0]);
|
u32 PhraseToAnimMapCount = sizeof(PhraseToAnimMap) / sizeof(PhraseToAnimMap[0]);
|
||||||
|
|
||||||
|
#include "blumen_lumen_settings.h"
|
||||||
|
|
||||||
struct blumen_lumen_state
|
struct blumen_lumen_state
|
||||||
{
|
{
|
||||||
bool Running;
|
bool Running;
|
||||||
|
|
|
@ -0,0 +1,61 @@
|
||||||
|
/* date = March 27th 2021 2:50 pm */
|
||||||
|
|
||||||
|
#ifndef BLUMEN_LUMEN_SETTINGS_H
|
||||||
|
#define BLUMEN_LUMEN_SETTINGS_H
|
||||||
|
|
||||||
|
gs_const_string Flower0AssemblyPath = ConstString("data/ss_blumen_one.fold");
|
||||||
|
gs_const_string Flower1AssemblyPath = ConstString("data/ss_blumen_two.fold");
|
||||||
|
gs_const_string Flower2AssemblyPath = ConstString("data/ss_blumen_three.fold");
|
||||||
|
|
||||||
|
gs_const_string PhraseMapCSVPath = ConstString("data/flower_codes.tsv");
|
||||||
|
char PhraseMapCSVSeparator = '\t';
|
||||||
|
|
||||||
|
global time_range MotorOpenTimes[] = {
|
||||||
|
{ 00, 30, 00, 40 },
|
||||||
|
{ 00, 50, 01, 00 },
|
||||||
|
{ 01, 10, 01, 20 },
|
||||||
|
{ 01, 30, 01, 40 },
|
||||||
|
{ 01, 50, 02, 00 },
|
||||||
|
{ 02, 10, 02, 20 },
|
||||||
|
{ 02, 30, 02, 40 },
|
||||||
|
{ 02, 50, 03, 00 },
|
||||||
|
{ 03, 10, 03, 20 },
|
||||||
|
{ 03, 30, 03, 40 },
|
||||||
|
{ 03, 50, 04, 00 },
|
||||||
|
{ 04, 10, 04, 20 },
|
||||||
|
{ 04, 30, 04, 40 },
|
||||||
|
{ 04, 50, 05, 00 },
|
||||||
|
{ 05, 10, 05, 20 },
|
||||||
|
{ 05, 30, 05, 40 },
|
||||||
|
{ 05, 50, 06, 00 },
|
||||||
|
{ 06, 10, 06, 20 },
|
||||||
|
{ 06, 30, 06, 40 },
|
||||||
|
{ 06, 50, 07, 00 },
|
||||||
|
{ 07, 10, 07, 20 },
|
||||||
|
{ 07, 30, 07, 40 },
|
||||||
|
{ 07, 50, 8, 00 },
|
||||||
|
{ 8, 10, 8, 20 },
|
||||||
|
{ 8, 30, 8, 40 },
|
||||||
|
{ 8, 50, 9, 00 },
|
||||||
|
{ 9, 10, 9, 20 },
|
||||||
|
{ 9, 30, 9, 40 },
|
||||||
|
{ 9, 50, 10, 00 },
|
||||||
|
{ 10, 10, 10, 20 },
|
||||||
|
{ 10, 30, 10, 40 },
|
||||||
|
{ 10, 50, 11, 00 },
|
||||||
|
{ 11, 10, 11, 20 },
|
||||||
|
{ 11, 30, 11, 40 },
|
||||||
|
{ 11, 50, 12, 00 },
|
||||||
|
{ 12, 10, 12, 20 },
|
||||||
|
{ 12, 30, 12, 40 },
|
||||||
|
{ 12, 50, 13, 00 },
|
||||||
|
{ 13, 10, 13, 20 },
|
||||||
|
{ 13, 30, 13, 40 },
|
||||||
|
{ 13, 50, 14, 00 },
|
||||||
|
{ 14, 10, 14, 20 },
|
||||||
|
{ 14, 30, 14, 40 },
|
||||||
|
{ 14, 50, 15, 00 },
|
||||||
|
};
|
||||||
|
global u32 MotorOpenTimesCount = CArrayLength(MotorOpenTimes);
|
||||||
|
|
||||||
|
#endif //BLUMEN_LUMEN_SETTINGS_H
|
|
@ -1390,6 +1390,13 @@ internal gs_data StringToData(gs_string String)
|
||||||
{
|
{
|
||||||
return StringToData(String.ConstString);
|
return StringToData(String.ConstString);
|
||||||
}
|
}
|
||||||
|
internal gs_const_string DataToString(gs_data Data)
|
||||||
|
{
|
||||||
|
gs_const_string Result = {};
|
||||||
|
Result.Str = (char*)Data.Memory;
|
||||||
|
Result.Length = Data.Size;
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
|
||||||
internal bool IsSlash(char C) { return ((C == '/') || (C == '\\')); }
|
internal bool IsSlash(char C) { return ((C == '/') || (C == '\\')); }
|
||||||
internal bool IsUpper(char C) { return(('A' <= C) && (C <= 'Z')); }
|
internal bool IsUpper(char C) { return(('A' <= C) && (C <= 'Z')); }
|
||||||
|
@ -3783,6 +3790,16 @@ HashDJB2ToU32(u32 Length, char* String)
|
||||||
}
|
}
|
||||||
return Hash;
|
return Hash;
|
||||||
}
|
}
|
||||||
|
internal u32
|
||||||
|
HashDJB2ToU32(gs_const_string Str)
|
||||||
|
{
|
||||||
|
return HashDJB2ToU32(StringExpand(Str));
|
||||||
|
}
|
||||||
|
internal u32
|
||||||
|
HashDJB2ToU32(gs_string Str)
|
||||||
|
{
|
||||||
|
return HashDJB2ToU32(StringExpand(Str));
|
||||||
|
}
|
||||||
|
|
||||||
internal u64
|
internal u64
|
||||||
HashDJB2ToU64(char* String)
|
HashDJB2ToU64(char* String)
|
||||||
|
@ -3805,6 +3822,16 @@ HashDJB2ToU64(u32 Length, char* String)
|
||||||
}
|
}
|
||||||
return Hash;
|
return Hash;
|
||||||
}
|
}
|
||||||
|
internal u64
|
||||||
|
HashDJB2ToU64(gs_const_string Str)
|
||||||
|
{
|
||||||
|
return HashDJB2ToU64(StringExpand(Str));
|
||||||
|
}
|
||||||
|
internal u64
|
||||||
|
HashDJB2ToU64(gs_string Str)
|
||||||
|
{
|
||||||
|
return HashDJB2ToU64(StringExpand(Str));
|
||||||
|
}
|
||||||
|
|
||||||
///////////////////////////
|
///////////////////////////
|
||||||
//
|
//
|
||||||
|
|
|
@ -273,6 +273,8 @@ Glue(gs_AssertFail_, __LINE__) = 1 / (int)(!!(c)), \
|
||||||
#define IsPowerOfTwo(x) (((x) & ((x) - 1)) == 0)
|
#define IsPowerOfTwo(x) (((x) & ((x) - 1)) == 0)
|
||||||
#define IsOdd(x) (((x) & 1) != 0)
|
#define IsOdd(x) (((x) & 1) != 0)
|
||||||
|
|
||||||
|
#define CArrayLength(arr) (sizeof(arr) / (sizeof(arr[0])))
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
ZeroMemory_(u8* Memory, u64 Size)
|
ZeroMemory_(u8* Memory, u64 Size)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue