Added cwasm_vectors.c and cwasm_matrices.c. Vectors API is completely finished, Matrices API is partially finished. Added Clamp(value, min, max) macro to cwasm.h. Fixed types on jsGl functions that take vectors or matrices (and Arena*).

This commit is contained in:
2025-09-02 00:15:03 -07:00
parent b62f0d279b
commit 1a9775d670
7 changed files with 1072 additions and 45 deletions

View File

@@ -51,8 +51,71 @@
"MAYBE_END_EXTERN_C", "MAYBE_END_EXTERN_C",
"MAYBE_EXTERN_C", "MAYBE_EXTERN_C",
"MAYBE_START_EXTERN_C", "MAYBE_START_EXTERN_C",
"Mat2_Identity",
"Mat2_Identity_Const",
"Mat2_Zero",
"Mat2_Zero_Const",
"Mat3_Identity",
"Mat3_Identity_Const",
"Mat3_Zero",
"Mat3_Zero_Const",
"Mat4_Identity",
"Mat4_Identity_Const",
"Mat4_Zero",
"Mat4_Zero_Const",
"SCRATCH_ARENAS_SIZE", "SCRATCH_ARENAS_SIZE",
"START_EXTERN_C", "START_EXTERN_C",
"V2_Down",
"V2_Half",
"V2_Left",
"V2_One",
"V2_Right",
"V2_Up",
"V2_Zero",
"V2_Zero_Const",
"V2i_Down",
"V2i_Left",
"V2i_One",
"V2i_Right",
"V2i_Up",
"V2i_Zero",
"V2i_Zero_Const",
"V2u_One",
"V2u_Unit",
"V2u_Zero",
"V2u_Zero_Const",
"V3_Backward",
"V3_Down",
"V3_Forward",
"V3_Half",
"V3_Left",
"V3_One",
"V3_Right",
"V3_Up",
"V3_Zero",
"V3_Zero_Const",
"V3i_Backward",
"V3i_Down",
"V3i_Forward",
"V3i_Left",
"V3i_One",
"V3i_Right",
"V3i_Up",
"V3i_Zero",
"V3i_Zero_Const",
"V3u_One",
"V3u_Zero",
"V3u_Zero_Const",
"V4_Half",
"V4_One",
"V4_Zero",
"V4_Zero_Const",
"V4i_One",
"V4i_Zero",
"V4i_Zero_Const",
"V4u_One",
"V4u_Zero",
"V4u_Zero_Const",
"WASM_MEMORY_MAX_NUM_PAGES", "WASM_MEMORY_MAX_NUM_PAGES",
"WASM_MEMORY_MAX_SIZE", "WASM_MEMORY_MAX_SIZE",
"WASM_MEMORY_PAGE_SIZE", "WASM_MEMORY_PAGE_SIZE",
@@ -66,7 +129,20 @@
"#define AllocStruct(type, arenaPntr)", "#define AllocStruct(type, arenaPntr)",
"#define ArrayCount(array)", "#define ArrayCount(array)",
"#define Assert(condition)", "#define Assert(condition)",
"#define Clamp(value, min, max)",
"#define IsAlignedTo(pntr, alignment)", "#define IsAlignedTo(pntr, alignment)",
"#define NewMat2_Const(R0C0, R0C1, R1C0, R1C1)",
"#define NewMat3_Const(R0C0, R0C1, R0C2, R1C0, R1C1, R1C2, R2C0, R2C1, R2C2)",
"#define NewMat4_Const(R0C0, R0C1, R0C2, R0C3, R1C0, R1C1, R1C2, R1C3, R2C0, R2C1, R2C2, R2C3, R3C0, R3C1, R3C2, R3C3)",
"#define NewV2_Const(x, y)",
"#define NewV2i_Const(x, y)",
"#define NewV2u_Const(x, y)",
"#define NewV3_Const(x, y, z)",
"#define NewV3i_Const(x, y, z)",
"#define NewV3u_Const(x, y, z)",
"#define NewV4_Const(x, y, z, w)",
"#define NewV4i_Const(x, y, z, w)",
"#define NewV4u_Const(x, y, z, w)",
"#define NotNull(expression)", "#define NotNull(expression)",
"#define PrintLine_D(formatStrNt, ...)", "#define PrintLine_D(formatStrNt, ...)",
"#define PrintLine_E(formatStrNt, ...)", "#define PrintLine_E(formatStrNt, ...)",
@@ -103,9 +179,9 @@
"bool jsGlGetParameterBool(GlEnum parameter)", "bool jsGlGetParameterBool(GlEnum parameter)",
"bool jsGlGetProgramParameterBool(GlId programId, GlEnum parameter)", "bool jsGlGetProgramParameterBool(GlId programId, GlEnum parameter)",
"bool jsGlGetShaderParameterBool(GlId shaderId, GlEnum parameter)", "bool jsGlGetShaderParameterBool(GlId shaderId, GlEnum parameter)",
"char* jsGlGetParameterString(void* arenaPntr, GlEnum parameter)", "char* jsGlGetParameterString(Arena* arenaPntr, GlEnum parameter)",
"char* jsGlGetProgramInfoLog(void* arenaPntr, GlId programId)", "char* jsGlGetProgramInfoLog(Arena* arenaPntr, GlId programId)",
"char* jsGlGetShaderInfoLog(void* arenaPntr, GlId shaderId)", "char* jsGlGetShaderInfoLog(Arena* arenaPntr, GlId shaderId)",
"float jsGlGetParameterFloat(GlEnum parameter)", "float jsGlGetParameterFloat(GlEnum parameter)",
"inline void* ReallocMem(Arena* arena, void* oldPntr, u32 oldSize, u32 newSize)", "inline void* ReallocMem(Arena* arena, void* oldPntr, u32 oldSize, u32 newSize)",
"inline void* ReallocMemUnaligned(Arena* arena, void* oldPntr, u32 oldSize, u32 newSize)", "inline void* ReallocMemUnaligned(Arena* arena, void* oldPntr, u32 oldSize, u32 newSize)",
@@ -113,6 +189,252 @@
"int jsGlGetParameterInt(GlEnum parameter)", "int jsGlGetParameterInt(GlEnum parameter)",
"int jsGlGetProgramParameterInt(GlId programId, GlEnum parameter)", "int jsGlGetProgramParameterInt(GlId programId, GlEnum parameter)",
"int jsGlGetShaderParameterInt(GlId shaderId, GlEnum parameter)", "int jsGlGetShaderParameterInt(GlId shaderId, GlEnum parameter)",
"mat4 MulMat4(mat4 left, mat4 right)",
"static inline bool AreEqualMat2(mat2 left, mat2 right)",
"static inline bool AreEqualMat3(mat3 left, mat3 right)",
"static inline bool AreEqualMat4(mat4 left, mat4 right)",
"static inline bool AreEqualV2(v2 left, v2 right)",
"static inline bool AreEqualV2i(v2i left, v2i right)",
"static inline bool AreEqualV2u(v2u left, v2u right)",
"static inline bool AreEqualV3(v3 left, v3 right)",
"static inline bool AreEqualV3i(v3i left, v3i right)",
"static inline bool AreEqualV3u(v3u left, v3u right)",
"static inline bool AreEqualV4(v4 left, v4 right)",
"static inline bool AreEqualV4i(v4i left, v4i right)",
"static inline bool AreEqualV4u(v4u left, v4u right)",
"static inline i32 DotV2i(v2i left, v2i right)",
"static inline i32 DotV3i(v3i left, v3i right)",
"static inline i32 DotV4i(v4i left, v4i right)",
"static inline i32 LengthSquaredV2i(v2i vector)",
"static inline i32 LengthSquaredV3i(v3i vector)",
"static inline i32 LengthSquaredV4i(v4i vector)",
"static inline mat2 MakeScaleMat2(r32 scaleX, r32 scaleY)",
"static inline mat2 MakeScaleMat2V(v2 scale)",
"static inline mat2 NewMat2(r32 r0c0, r32 r0c1, r32 r1c0, r32 r1c1)",
"static inline mat3 MakeScaleMat3(r32 scaleX, r32 scaleY, r32 scaleZ)",
"static inline mat3 MakeScaleMat3V(v3 scale)",
"static inline mat3 MakeTranslateMat3(r32 translateX, r32 translateY)",
"static inline mat3 MakeTranslateMat3V(v2 translate)",
"static inline mat3 MakeTranslateXMat3(r32 translateX)",
"static inline mat3 MakeTranslateYMat3(r32 translateY)",
"static inline mat3 NewMat3(r32 r0c0, r32 r0c1, r32 r0c2, r32 r1c0, r32 r1c1, r32 r1c2, r32 r2c0, r32 r2c1, r32 r2c2)",
"static inline mat4 MakeRotateXMat4(r32 angleX)",
"static inline mat4 MakeRotateYMat4(r32 angleY)",
"static inline mat4 MakeRotateZMat4(r32 angleZ)",
"static inline mat4 MakeScaleMat4(r32 scaleX, r32 scaleY, r32 scaleZ)",
"static inline mat4 MakeScaleMat4V(v3 scale)",
"static inline mat4 MakeTranslateMat4(r32 translateX, r32 translateY, r32 translateZ)",
"static inline mat4 MakeTranslateMat4V(v3 translate)",
"static inline mat4 MakeTranslateXMat4(r32 translateX)",
"static inline mat4 MakeTranslateYMat4(r32 translateY)",
"static inline mat4 MakeTranslateZMat4(r32 translateZ)",
"static inline mat4 NewMat4(r32 r0c0, r32 r0c1, r32 r0c2, r32 r0c3, r32 r1c0, r32 r1c1, r32 r1c2, r32 r1c3, r32 r2c0, r32 r2c1, r32 r2c2, r32 r2c3, r32 r3c0, r32 r3c1, r32 r3c2, r32 r3c3)",
"static inline r32 DotV2(v2 left, v2 right)",
"static inline r32 DotV3(v3 left, v3 right)",
"static inline r32 DotV4(v4 left, v4 right)",
"static inline r32 LengthSquaredV2(v2 vector)",
"static inline r32 LengthSquaredV3(v3 vector)",
"static inline r32 LengthSquaredV4(v4 vector)",
"static inline r32 LengthV2(v2 vector)",
"static inline r32 LengthV3(v3 vector)",
"static inline r32 LengthV4(v4 vector)",
"static inline u32 DotV2u(v2u left, v2u right)",
"static inline u32 DotV3u(v3u left, v3u right)",
"static inline u32 DotV4u(v4u left, v4u right)",
"static inline u32 LengthSquaredV2u(v2u vector)",
"static inline u32 LengthSquaredV3u(v3u vector)",
"static inline u32 LengthSquaredV4u(v4u vector)",
"static inline v2 FillV2(r32 value)",
"static inline v2 NewV2( r32 x, r32 y)",
"static inline v2 AbsV2(v2 vector)",
"static inline v2 AddV2(v2 left, v2 right)",
"static inline v2 CeilV2(v2 vector)",
"static inline v2 ClampV2(v2 vector, v2 min, v2 max)",
"static inline v2 DivV2(v2 left, v2 right)",
"static inline v2 FloorV2(v2 vector)",
"static inline v2 LerpV2(v2 start, v2 end, r32 amount)",
"static inline v2 MaxV2(v2 left, v2 right)",
"static inline v2 MinV2(v2 left, v2 right)",
"static inline v2 MulV2(v2 left, v2 right)",
"static inline v2 NormalizeV2(v2 vector)",
"static inline v2 RotateV2(v2 vector, r32 angle)",
"static inline v2 RoundV2(v2 vector)",
"static inline v2 ScaleV2(v2 left, r32 right)",
"static inline v2 ShrinkV2(v2 left, r32 right)",
"static inline v2 SubV2(v2 left, v2 right)",
"static inline v2 ToV2From3(v3 vector)",
"static inline v2 ToV2From3XZ(v3 vector)",
"static inline v2 ToV2From3YZ(v3 vector)",
"static inline v2 ToV2Fromi(v2i vector)",
"static inline v2 ToV2Fromu(v2u vector)",
"static inline v2i AbsV2i(v2 vector)",
"static inline v2i AddV2i(v2i left, v2i right)",
"static inline v2i CeilV2i(v2 vector)",
"static inline v2i ClampV2i(v2i vector, v2i min, v2i max)",
"static inline v2i DivV2i(v2i left, v2i right)",
"static inline v2i FillV2i(i32 value)",
"static inline v2i FloorV2i(v2 vector)",
"static inline v2i MaxV2i(v2i left, v2i right)",
"static inline v2i MinV2i(v2i left, v2i right)",
"static inline v2i MulV2i(v2i left, v2i right)",
"static inline v2i NewV2i(i32 x, i32 y)",
"static inline v2i RoundV2i(v2 vector)",
"static inline v2i ScaleV2i(v2i left, i32 right)",
"static inline v2i ShrinkV2i(v2i left, i32 right)",
"static inline v2i SubV2i(v2i left, v2i right)",
"static inline v2i ToV2iFrom3(v3i vector)",
"static inline v2i ToV2iFrom3XZ(v3i vector)",
"static inline v2i ToV2iFrom3YZ(v3i vector)",
"static inline v2i ToV2iFromf(v2 vector)",
"static inline v2i ToV2iFromu(v2u vector)",
"static inline v2u AbsV2u(v2 vector)",
"static inline v2u AddV2u(v2u left, v2u right)",
"static inline v2u CeilV2u(v2 vector)",
"static inline v2u ClampV2u(v2u vector, v2u min, v2u max)",
"static inline v2u DivV2u(v2u left, v2u right)",
"static inline v2u FillV2u(u32 value)",
"static inline v2u FloorV2u(v2 vector)",
"static inline v2u MaxV2u(v2u left, v2u right)",
"static inline v2u MinV2u(v2u left, v2u right)",
"static inline v2u MulV2u(v2u left, v2u right)",
"static inline v2u NewV2u(u32 x, u32 y)",
"static inline v2u RoundV2u(v2 vector)",
"static inline v2u ScaleV2u(v2u left, u32 right)",
"static inline v2u ShrinkV2u(v2u left, u32 right)",
"static inline v2u SubV2u(v2u left, v2u right)",
"static inline v2u ToV2uFrom3(v3u vector)",
"static inline v2u ToV2uFrom3XZ(v3u vector)",
"static inline v2u ToV2uFrom3YZ(v3u vector)",
"static inline v2u ToV2uFromf(v2 vector)",
"static inline v2u ToV2uFromi(v2i vector)",
"static inline v3 FillV3(r32 value)",
"static inline v3 NewV3( r32 x, r32 y, r32 z)",
"static inline v3 AbsV3(v3 vector)",
"static inline v3 AddV3(v3 left, v3 right)",
"static inline v3 CeilV3(v3 vector)",
"static inline v3 ClampV3(v3 vector, v3 min, v3 max)",
"static inline v3 CrossV3(v3 left, v3 right)",
"static inline v3 DivV3(v3 left, v3 right)",
"static inline v3 FloorV3(v3 vector)",
"static inline v3 LerpV3(v3 start, v3 end, r32 amount)",
"static inline v3 MaxV3(v3 left, v3 right)",
"static inline v3 MinV3(v3 left, v3 right)",
"static inline v3 MulV3(v3 left, v3 right)",
"static inline v3 NormalizeV3(v3 vector)",
"static inline v3 RoundV3(v3 vector)",
"static inline v3 ScaleV3(v3 left, r32 right)",
"static inline v3 ShrinkV3(v3 left, r32 right)",
"static inline v3 SubV3(v3 left, v3 right)",
"static inline v3 ToV3From2(v2 vector, r32 z)",
"static inline v3 ToV3From4(v4 vector)",
"static inline v3 ToV3FromAngles(r32 facingDirection, r32 rotationUpDown, r32 radius)",
"static inline v3 ToV3Fromi(v3i vector)",
"static inline v3 ToV3Fromu(v3u vector)",
"static inline v3i AbsV3i(v3 vector)",
"static inline v3i AddV3i(v3i left, v3i right)",
"static inline v3i CeilV3i(v3 vector)",
"static inline v3i ClampV3i(v3i vector, v3i min, v3i max)",
"static inline v3i CrossV3i(v3i left, v3i right)",
"static inline v3i DivV3i(v3i left, v3i right)",
"static inline v3i FillV3i(i32 value)",
"static inline v3i FloorV3i(v3 vector)",
"static inline v3i MaxV3i(v3i left, v3i right)",
"static inline v3i MinV3i(v3i left, v3i right)",
"static inline v3i MulV3i(v3i left, v3i right)",
"static inline v3i NewV3i(i32 x, i32 y, i32 z)",
"static inline v3i RoundV3i(v3 vector)",
"static inline v3i ScaleV3i(v3i left, i32 right)",
"static inline v3i ShrinkV3i(v3i left, i32 right)",
"static inline v3i SubV3i(v3i left, v3i right)",
"static inline v3i ToV3iFrom2(v2i vector, i32 z)",
"static inline v3i ToV3iFrom4(v4i vector)",
"static inline v3i ToV3iFromf(v3 vector)",
"static inline v3i ToV3iFromu(v3u vector)",
"static inline v3u AbsV3u(v3 vector)",
"static inline v3u AddV3u(v3u left, v3u right)",
"static inline v3u CeilV3u(v3 vector)",
"static inline v3u ClampV3u(v3u vector, v3u min, v3u max)",
"static inline v3u CrossV3u(v3u left, v3u right)",
"static inline v3u DivV3u(v3u left, v3u right)",
"static inline v3u FillV3u(u32 value)",
"static inline v3u FloorV3u(v3 vector)",
"static inline v3u MaxV3u(v3u left, v3u right)",
"static inline v3u MinV3u(v3u left, v3u right)",
"static inline v3u MulV3u(v3u left, v3u right)",
"static inline v3u NewV3u(u32 x, u32 y, u32 z)",
"static inline v3u RoundV3u(v3 vector)",
"static inline v3u ScaleV3u(v3u left, u32 right)",
"static inline v3u ShrinkV3u(v3u left, u32 right)",
"static inline v3u SubV3u(v3u left, v3u right)",
"static inline v3u ToV3uFrom2(v2u vector, u32 z)",
"static inline v3u ToV3uFrom4(v4u vector)",
"static inline v3u ToV3uFromf(v3 vector)",
"static inline v3u ToV3uFromi(v3i vector)",
"static inline v4 FillV4(r32 value)",
"static inline v4 NewV4( r32 x, r32 y, r32 z, r32 w)",
"static inline v4 AbsV4(v4 vector)",
"static inline v4 AddV4(v4 left, v4 right)",
"static inline v4 CeilV4(v4 vector)",
"static inline v4 ClampV4(v4 vector, v4 min, v4 max)",
"static inline v4 DivV4(v4 left, v4 right)",
"static inline v4 FloorV4(v4 vector)",
"static inline v4 LerpV4(v4 start, v4 end, r32 amount)",
"static inline v4 MaxV4(v4 left, v4 right)",
"static inline v4 MinV4(v4 left, v4 right)",
"static inline v4 MulV4(v4 left, v4 right)",
"static inline v4 NormalizeV4(v4 vector)",
"static inline v4 RoundV4(v4 vector)",
"static inline v4 ScaleV4(v4 left, r32 right)",
"static inline v4 ShrinkV4(v4 left, r32 right)",
"static inline v4 SubV4(v4 left, v4 right)",
"static inline v4 ToV4From2(v2 vector, r32 z, r32 w)",
"static inline v4 ToV4From3(v3 vector, r32 w)",
"static inline v4 ToV4Fromi(v4i vector)",
"static inline v4 ToV4Fromu(v4u vector)",
"static inline v4i AbsV4i(v4 vector)",
"static inline v4i AddV4i(v4i left, v4i right)",
"static inline v4i CeilV4i(v4 vector)",
"static inline v4i ClampV4i(v4i vector, v4i min, v4i max)",
"static inline v4i DivV4i(v4i left, v4i right)",
"static inline v4i FillV4i(i32 value)",
"static inline v4i FloorV4i(v4 vector)",
"static inline v4i MaxV4i(v4i left, v4i right)",
"static inline v4i MinV4i(v4i left, v4i right)",
"static inline v4i MulV4i(v4i left, v4i right)",
"static inline v4i NewV4i(i32 x, i32 y, i32 z, i32 w)",
"static inline v4i RoundV4i(v4 vector)",
"static inline v4i ScaleV4i(v4i left, i32 right)",
"static inline v4i ShrinkV4i(v4i left, i32 right)",
"static inline v4i SubV4i(v4i left, v4i right)",
"static inline v4i ToV4iFrom2(v2i vector, i32 z, i32 w)",
"static inline v4i ToV4iFrom3(v3i vector, i32 w)",
"static inline v4i ToV4iFromf(v4 vector)",
"static inline v4i ToV4iFromu(v4u vector)",
"static inline v4u AbsV4u(v4 vector)",
"static inline v4u AddV4u(v4u left, v4u right)",
"static inline v4u CeilV4u(v4 vector)",
"static inline v4u ClampV4u(v4u vector, v4u min, v4u max)",
"static inline v4u DivV4u(v4u left, v4u right)",
"static inline v4u FillV4u(u32 value)",
"static inline v4u FloorV4u(v4 vector)",
"static inline v4u MaxV4u(v4u left, v4u right)",
"static inline v4u MinV4u(v4u left, v4u right)",
"static inline v4u MulV4u(v4u left, v4u right)",
"static inline v4u NewV4u(u32 x, u32 y, u32 z, u32 w)",
"static inline v4u RoundV4u(v4 vector)",
"static inline v4u ScaleV4u(v4u left, u32 right)",
"static inline v4u ShrinkV4u(v4u left, u32 right)",
"static inline v4u SubV4u(v4u left, v4u right)",
"static inline v4u ToV4uFrom2(v2u vector, u32 z, u32 w)",
"static inline v4u ToV4uFrom3(v3u vector, u32 w)",
"static inline v4u ToV4uFromf(v4 vector)",
"static inline v4u ToV4uFromi(v4i vector)",
"static inline void AlignV2(v2* vectorPntr, r32 alignScale)",
"static inline void AlignV2ToV2(v2* vectorPntr, v2 alignScale)",
"static inline void AlignV3(v3* vectorPntr, r32 alignScale)",
"static inline void AlignV3ToV3(v3* vectorPntr, v3 alignScale)",
"static inline void AlignV4(v4* vectorPntr, r32 alignScale)",
"static inline void AlignV4ToV4(v4* vectorPntr, v4 alignScale)",
"void InitGlobalArenas(u32 scratchArenasSize)", "void InitGlobalArenas(u32 scratchArenasSize)",
"void ResetToArenaMark(ArenaMark arenaMark)", "void ResetToArenaMark(ArenaMark arenaMark)",
"void ResetToMark(Arena* arena, u32 mark)", "void ResetToMark(Arena* arena, u32 mark)",
@@ -148,20 +470,20 @@
"void jsGlUniform1i(GlId locationId, int value)", "void jsGlUniform1i(GlId locationId, int value)",
"void jsGlUniform1iv(GlId locationId, int valuesCount, const int* valuesPntr)", "void jsGlUniform1iv(GlId locationId, int valuesCount, const int* valuesPntr)",
"void jsGlUniform2f(int location, r32 value0, r32 value1)", "void jsGlUniform2f(int location, r32 value0, r32 value1)",
"void jsGlUniform2fv(GlId locationId, int valuesCount, const r32* valuesPntr)", "void jsGlUniform2fv(GlId locationId, int valuesCount, const v2* valuesPntr)",
"void jsGlUniform2i(GlId locationId, int value0, int value1)", "void jsGlUniform2i(GlId locationId, int value0, int value1)",
"void jsGlUniform2iv(GlId locationId, int valuesCount, const int* valuesPntr)", "void jsGlUniform2iv(GlId locationId, int valuesCount, const v2i* valuesPntr)",
"void jsGlUniform3f(int location, r32 value0, r32 value1, r32 value2)", "void jsGlUniform3f(int location, r32 value0, r32 value1, r32 value2)",
"void jsGlUniform3fv(GlId locationId, int valuesCount, const r32* valuesPntr)", "void jsGlUniform3fv(GlId locationId, int valuesCount, const v3* valuesPntr)",
"void jsGlUniform3i(GlId locationId, int value0, int value1, int value2)", "void jsGlUniform3i(GlId locationId, int value0, int value1, int value2)",
"void jsGlUniform3iv(GlId locationId, int valuesCount, const int* valuesPntr)", "void jsGlUniform3iv(GlId locationId, int valuesCount, const v3i* valuesPntr)",
"void jsGlUniform4f(int location, r32 value0, r32 value1, r32 value2, r32 value3)", "void jsGlUniform4f(int location, r32 value0, r32 value1, r32 value2, r32 value3)",
"void jsGlUniform4fv(GlId locationId, int valuesCount, const r32* valuesPntr)", "void jsGlUniform4fv(GlId locationId, int valuesCount, const v4* valuesPntr)",
"void jsGlUniform4i(GlId locationId, int value0, int value1, int value2, int value3)", "void jsGlUniform4i(GlId locationId, int value0, int value1, int value2, int value3)",
"void jsGlUniform4iv(GlId locationId, int valuesCount, const int* valuesPntr)", "void jsGlUniform4iv(GlId locationId, int valuesCount, const v4i* valuesPntr)",
"void jsGlUniformMatrix2fv(GlId locationId, const r32* valuesPntr)", "void jsGlUniformMatrix2fv(GlId locationId, const mat2* valuesPntr)",
"void jsGlUniformMatrix3fv(GlId locationId, const r32* valuesPntr)", "void jsGlUniformMatrix3fv(GlId locationId, const mat3* valuesPntr)",
"void jsGlUniformMatrix4fv(GlId locationId, const r32* valuesPntr)", "void jsGlUniformMatrix4fv(GlId locationId, const mat4* valuesPntr)",
"void jsGlUseProgram(GlId programId)", "void jsGlUseProgram(GlId programId)",
"void jsGlVertexAttribPointer(GlEnum attribLocation, int componentCount, GlEnum componentType, bool normalized, int stride, int offset)", "void jsGlVertexAttribPointer(GlEnum attribLocation, int componentCount, GlEnum componentType, bool normalized, int stride, int offset)",
"void* AllocMemUnaligned(Arena* arena, u32 numBytes)", "void* AllocMemUnaligned(Arena* arena, u32 numBytes)",
@@ -176,6 +498,27 @@
"ArenaFlag", "ArenaFlag",
"ArenaMark", "ArenaMark",
"DbgLevel", "DbgLevel",
"Vec2I32",
"Vec2R32",
"Vec2U32",
"Vec3I32",
"Vec3R32",
"Vec3U32",
"Vec4I32",
"Vec4R32",
"Vec4U32",
"mat2",
"mat3",
"mat4",
"v2",
"v2i",
"v2u",
"v3",
"v3i",
"v3u",
"v4",
"v4i",
"v4u",
], ],
}, },
} }

View File

@@ -10,12 +10,14 @@ Description:
#include "std/src/std_main.c" #include "std/src/std_main.c"
#include "cwasm_debug.c"
#include "cwasm_vectors.c"
#include "cwasm_matrices.c"
#include "cwasm_arena.c"
#include "cwasm_webgl_js_imports.h" #include "cwasm_webgl_js_imports.h"
#include "cwasm_webgl_constants.h" #include "cwasm_webgl_constants.h"
#include "cwasm_arena.c"
#include "cwasm_debug.c"
void InitializeCWasm(u32 scratchArenasSize) void InitializeCWasm(u32 scratchArenasSize)
{ {
InitGlobalArenas(scratchArenasSize); InitGlobalArenas(scratchArenasSize);

View File

@@ -131,6 +131,8 @@ Description:
#endif #endif
#define NotNull(expression) Assert((expression) != nullptr) #define NotNull(expression) Assert((expression) != nullptr)
#define Clamp(value, min, max) (((value) < (min)) ? (min) : (((value) > (max)) ? (max) : (value)))
//Actual Value of Pi: 3.1415926535897932384626433832795... //Actual Value of Pi: 3.1415926535897932384626433832795...
#define Pi64 3.14159265358979311599796346854 //accurate to 15 digits #define Pi64 3.14159265358979311599796346854 //accurate to 15 digits
#define Pi32 3.1415927410125732421875f //accurate to 6 digits #define Pi32 3.1415927410125732421875f //accurate to 6 digits

246
cwasm_matrices.c Normal file
View File

@@ -0,0 +1,246 @@
/*
File: cwasm_matrices.c
Author: Taylor Robbins
Date: 09\01\2025
Description:
** Holds matrix structs (mat2, mat3, and mat4) which hold NxN r32 components
*/
//NOTE: These structures are in row-major order in memory because that's the order WebGL expects them in when we call something like gl.uniformMatrix4fv
typedef union Matrix2x2 Matrix2x2;
union Matrix2x2
{
r32 Values[4];
struct { v2 Row[2]; };
struct
{
r32 r0c0, r0c1;
r32 r1c0, r1c1;
};
};
typedef union Matrix3x3 Matrix3x3;
union Matrix3x3
{
r32 Values[9];
struct { v3 Row[3]; };
struct
{
r32 r0c0, r0c1, r0c2;
r32 r1c0, r1c1, r1c2;
r32 r2c0, r2c1, r2c2;
};
};
typedef union Matrix4x4 Matrix4x4;
union Matrix4x4
{
r32 Values[16];
struct { v4 Row[4]; };
struct
{
r32 r0c0, r0c1, r0c2, r0c3;
r32 r1c0, r1c1, r1c2, r1c3;
r32 r2c0, r2c1, r2c2, r2c3;
r32 r3c0, r3c1, r3c2, r3c3;
};
};
typedef Matrix2x2 mat2;
typedef Matrix3x3 mat3;
typedef Matrix4x4 mat4;
static inline mat2 NewMat2(r32 r0c0, r32 r0c1, r32 r1c0, r32 r1c1)
{
mat2 result;
result.r0c0 = r0c0; result.r0c1 = r0c1;
result.r1c0 = r1c0; result.r1c1 = r1c1;
return result;
}
static inline mat3 NewMat3(r32 r0c0, r32 r0c1, r32 r0c2, r32 r1c0, r32 r1c1, r32 r1c2, r32 r2c0, r32 r2c1, r32 r2c2)
{
mat3 result;
result.r0c0 = r0c0; result.r0c1 = r0c1; result.r0c2 = r0c2;
result.r1c0 = r1c0; result.r1c1 = r1c1; result.r1c2 = r1c2;
result.r2c0 = r2c0; result.r2c1 = r2c1; result.r2c2 = r2c2;
return result;
}
static inline mat4 NewMat4(r32 r0c0, r32 r0c1, r32 r0c2, r32 r0c3, r32 r1c0, r32 r1c1, r32 r1c2, r32 r1c3, r32 r2c0, r32 r2c1, r32 r2c2, r32 r2c3, r32 r3c0, r32 r3c1, r32 r3c2, r32 r3c3)
{
mat4 result;
result.r0c0 = r0c0; result.r0c1 = r0c1; result.r0c2 = r0c2; result.r0c3 = r0c3;
result.r1c0 = r1c0; result.r1c1 = r1c1; result.r1c2 = r1c2; result.r1c3 = r1c3;
result.r2c0 = r2c0; result.r2c1 = r2c1; result.r2c2 = r2c2; result.r2c3 = r2c3;
result.r3c0 = r3c0; result.r3c1 = r3c1; result.r3c2 = r3c2; result.r3c3 = r3c3;
return result;
}
#define NewMat2_Const(R0C0, R0C1, R1C0, R1C1) { .r0c0=(R0C0), .r0c1=(R0C1), .r1c0=(R1C0), .r1c1=(R1C1) }
#define NewMat3_Const(R0C0, R0C1, R0C2, R1C0, R1C1, R1C2, R2C0, R2C1, R2C2) { .r0c0=(R0C0), .r0c1=(R0C1), .r0c2=(R0C2), .r1c0=(R1C0), .r1c1=(R1C1), .r1c2=(R1C2), .r2c0=(R2C0), .r2c1=(R2C1), .r2c2=(R2C2) }
#define NewMat4_Const(R0C0, R0C1, R0C2, R0C3, R1C0, R1C1, R1C2, R1C3, R2C0, R2C1, R2C2, R2C3, R3C0, R3C1, R3C2, R3C3) { .r0c0=(R0C0), .r0c1=(R0C1), .r0c2=(R0C2), .r0c3=(R0C3), .r1c0=(R1C0), .r1c1=(R1C1), .r1c2=(R1C2), .r1c3=(R1C3), .r2c0=(R2C0), .r2c1=(R2C1), .r2c2=(R2C2), .r2c3=(R2C3), .r3c0=(R3C0), .r3c1=(R3C1), .r3c2=(R3C2), .r3c3=(R3C3) }
#define Mat2_Zero NewMat2(0,0, 0,0)
#define Mat2_Zero_Const NewMat2_Const(0,0, 0,0)
#define Mat2_Identity NewMat2(1,0, 0,1)
#define Mat2_Identity_Const NewMat2_Const(1,0, 0,1)
#define Mat3_Zero NewMat3(0,0,0, 0,0,0, 0,0,0)
#define Mat3_Zero_Const NewMat3_Const(0,0,0, 0,0,0, 0,0,0)
#define Mat3_Identity NewMat3(1,0,0, 0,1,0, 0,0,1)
#define Mat3_Identity_Const NewMat3_Const(1,0,0, 0,1,0, 0,0,1)
#define Mat4_Zero NewMat4(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0)
#define Mat4_Zero_Const NewMat4_Const(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0)
#define Mat4_Identity NewMat4(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1)
#define Mat4_Identity_Const NewMat4_Const(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1)
static inline bool AreEqualMat2(mat2 left, mat2 right) { return (left.r0c0==right.r0c0 && left.r0c1==right.r0c1 && left.r1c0==right.r1c0 && left.r1c1==right.r1c1); }
static inline bool AreEqualMat3(mat3 left, mat3 right) { return (left.r0c0==right.r0c0 && left.r0c1==right.r0c1 && left.r0c2==right.r0c2 && left.r1c0==right.r1c0 && left.r1c1==right.r1c1 && left.r1c2==right.r1c2 && left.r2c0==right.r2c0 && left.r2c1==right.r2c1 && left.r2c2==right.r2c2); }
static inline bool AreEqualMat4(mat4 left, mat4 right) { return (left.r0c0==right.r0c0 && left.r0c1==right.r0c1 && left.r0c2==right.r0c2 && left.r0c3==right.r0c3 && left.r1c0==right.r1c0 && left.r1c1==right.r1c1 && left.r1c2==right.r1c2 && left.r1c3==right.r1c3 && left.r2c0==right.r2c0 && left.r2c1==right.r2c1 && left.r2c2==right.r2c2 && left.r2c3==right.r2c3 && left.r3c0==right.r3c0 && left.r3c1==right.r3c1 && left.r3c2==right.r3c2 && left.r3c3==right.r3c3); }
//TODO: AddMatX
//TODO: SubMatX
//TODO: MulMat2 and MulMat3
static inline mat4 MulMat4(mat4 left, mat4 right)
{
mat4 result = NewMat4_Const(
left.r0c0*right.r0c0 + left.r0c1*right.r1c0 + left.r0c2*right.r2c0 + left.r0c3*right.r3c0, //r0c0
left.r0c0*right.r0c1 + left.r0c1*right.r1c1 + left.r0c2*right.r2c1 + left.r0c3*right.r3c1, //r0c1
left.r0c0*right.r0c2 + left.r0c1*right.r1c2 + left.r0c2*right.r2c2 + left.r0c3*right.r3c2, //r0c2
left.r0c0*right.r0c3 + left.r0c1*right.r1c3 + left.r0c2*right.r2c3 + left.r0c3*right.r3c3, //r0c3
left.r1c0*right.r0c0 + left.r1c1*right.r1c0 + left.r1c2*right.r2c0 + left.r1c3*right.r3c0, //r1c0
left.r1c0*right.r0c1 + left.r1c1*right.r1c1 + left.r1c2*right.r2c1 + left.r1c3*right.r3c1, //r1c1
left.r1c0*right.r0c2 + left.r1c1*right.r1c2 + left.r1c2*right.r2c2 + left.r1c3*right.r3c2, //r1c2
left.r1c0*right.r0c3 + left.r1c1*right.r1c3 + left.r1c2*right.r2c3 + left.r1c3*right.r3c3, //r1c3
left.r2c0*right.r0c0 + left.r2c1*right.r1c0 + left.r2c2*right.r2c0 + left.r2c3*right.r3c0, //r2c0
left.r2c0*right.r0c1 + left.r2c1*right.r1c1 + left.r2c2*right.r2c1 + left.r2c3*right.r3c1, //r2c1
left.r2c0*right.r0c2 + left.r2c1*right.r1c2 + left.r2c2*right.r2c2 + left.r2c3*right.r3c2, //r2c2
left.r2c0*right.r0c3 + left.r2c1*right.r1c3 + left.r2c2*right.r2c3 + left.r2c3*right.r3c3, //r2c3
left.r3c0*right.r0c0 + left.r3c1*right.r1c0 + left.r3c2*right.r2c0 + left.r3c3*right.r3c0, //r3c0
left.r3c0*right.r0c1 + left.r3c1*right.r1c1 + left.r3c2*right.r2c1 + left.r3c3*right.r3c1, //r3c1
left.r3c0*right.r0c2 + left.r3c1*right.r1c2 + left.r3c2*right.r2c2 + left.r3c3*right.r3c2, //r3c2
left.r3c0*right.r0c3 + left.r3c1*right.r1c3 + left.r3c2*right.r2c3 + left.r3c3*right.r3c3 //r3c3
);
return result;
}
//TODO: DivMatX
//TODO: MulMatXAndVX
//TODO: TransformMatX
//TODO: TransposeMatX
//TODO: DeterminantMatX
//TODO: CofactorMatX?
//TODO: AdjointMatX?
//TODO: InverseMatX?
//TODO: LinearCombineVXMatX?
static inline mat2 MakeScaleMat2(r32 scaleX, r32 scaleY)
{
mat2 result = NewMat2_Const(
scaleX, 0.0f,
0.0f, scaleY
);
return result;
}
static inline mat3 MakeScaleMat3(r32 scaleX, r32 scaleY, r32 scaleZ)
{
mat3 result = NewMat3_Const(
scaleX, 0.0f, 0.0f,
0.0f, scaleY, 0.0f,
0.0f, 0.0f, scaleZ
);
return result;
}
static inline mat4 MakeScaleMat4(r32 scaleX, r32 scaleY, r32 scaleZ)
{
mat4 result = NewMat4_Const(
scaleX, 0.0f, 0.0f, 0.0f,
0.0f, scaleY, 0.0f, 0.0f,
0.0f, 0.0f, scaleZ, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f
);
return result;
}
static inline mat2 MakeScaleMat2V(v2 scale) { return MakeScaleMat2(scale.X, scale.Y); }
static inline mat3 MakeScaleMat3V(v3 scale) { return MakeScaleMat3(scale.X, scale.Y, scale.Z); }
static inline mat4 MakeScaleMat4V(v3 scale) { return MakeScaleMat4(scale.X, scale.Y, scale.Z); }
static inline mat3 MakeTranslateMat3(r32 translateX, r32 translateY)
{
mat3 result = NewMat3_Const(
1.0f, 0.0f, translateX,
0.0f, 1.0f, translateY,
0.0f, 0.0f, 1.0f
);
return result;
}
static inline mat3 MakeTranslateMat3V(v2 translate) { return MakeTranslateMat3(translate.X, translate.Y); }
static inline mat3 MakeTranslateXMat3(r32 translateX) { return MakeTranslateMat3(translateX, 0.0f); }
static inline mat3 MakeTranslateYMat3(r32 translateY) { return MakeTranslateMat3(0.0f, translateY); }
static inline mat4 MakeTranslateMat4(r32 translateX, r32 translateY, r32 translateZ)
{
mat4 result = NewMat4_Const(
1.0f, 0.0f, 0.0f, translateX,
0.0f, 1.0f, 0.0f, translateY,
0.0f, 0.0f, 1.0f, translateZ,
0.0f, 0.0f, 0.0f, 1.0f
);
return result;
}
static inline mat4 MakeTranslateMat4V(v3 translate) { return MakeTranslateMat4(translate.X, translate.Y, translate.Z); }
static inline mat4 MakeTranslateXMat4(r32 translateX) { return MakeTranslateMat4(translateX, 0.0f, 0.0f); }
static inline mat4 MakeTranslateYMat4(r32 translateY) { return MakeTranslateMat4(0.0f, translateY, 0.0f); }
static inline mat4 MakeTranslateZMat4(r32 translateZ) { return MakeTranslateMat4(0.0f, 0.0f, translateZ); }
//TODO: MakeRotateMat2
//TODO: MakeRotateXMat3, MakeRotateYMat3 and MakeRotateZMat3
static inline mat4 MakeRotateXMat4(r32 angleX)
{
r32 s = sinf(angleX);
r32 c = cosf(angleX);
mat4 result = NewMat4_Const(
1.0f, 0.0f, 0.0f, 0.0f,
0.0f, c, -s, 0.0f,
0.0f, s, c, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f
);
return result;
}
static inline mat4 MakeRotateYMat4(r32 angleY)
{
r32 s = sinf(angleY);
r32 c = cosf(angleY);
mat4 result = NewMat4_Const(
c, 0.0f, -s, 0.0f,
0.0f, 0.0f, 0.0f, 0.0f,
s, 0.0f, c, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f
);
return result;
}
static inline mat4 MakeRotateZMat4(r32 angleZ)
{
r32 s = sinf(angleZ);
r32 c = cosf(angleZ);
mat4 result = NewMat4_Const(
c, -s, 0.0f, 0.0f,
s, c, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f
);
return result;
}
//TODO: MakeOrthographicMatX?
//TODO: MakePerspectiveMatX?
//TODO: MakeLookAtMatX?
// static inline mat4 Make2DTransformMat4(v2 position, v2 scale, v2 origin, r32 rotation)
// {
// }

433
cwasm_vectors.c Normal file
View File

@@ -0,0 +1,433 @@
/*
File: cwasm_vectors.c
Author: Taylor Robbins
Date: 09\01\2025
Description:
** Holds vector structs (v2, v3, v4, v2i, etc.) which hold N [2,3,4] components of some type [r32,i32,u32]
*/
typedef union Vec2R32 Vec2R32;
union Vec2R32
{
r32 Values[2];
struct { r32 X, Y; };
struct { r32 U, V; };
struct { r32 Min, Max; };
struct { r32 Width, Height; };
};
typedef union Vec3R32 Vec3R32;
union Vec3R32
{
r32 Values[3];
struct { r32 X, Y, Z; };
struct { r32 U, V, W; };
struct { r32 Width, Height, Depth; };
};
typedef union Vec4R32 Vec4R32;
union Vec4R32
{
r32 Values[4];
struct { r32 X, Y, Z, W; };
struct { r32 Width, Height, Depth, Unused1; };
};
typedef union Vec2I32 Vec2I32;
union Vec2I32
{
i32 Values[2];
struct { i32 X, Y; };
struct { i32 U, V; };
struct { i32 Min, Max; };
struct { i32 Width, Height; };
};
typedef union Vec3I32 Vec3I32;
union Vec3I32
{
i32 Values[3];
struct { i32 X, Y, Z; };
struct { i32 U, V, W; };
struct { i32 Width, Height, Depth; };
};
typedef union Vec4I32 Vec4I32;
union Vec4I32
{
i32 Values[4];
struct { i32 X, Y, Z, W; };
struct { i32 Width, Height, Depth, Unused1; };
};
typedef union Vec2U32 Vec2U32;
union Vec2U32
{
u32 Values[2];
struct { u32 X, Y; };
struct { u32 U, V; };
struct { u32 Min, Max; };
struct { u32 Width, Height; };
};
typedef union Vec3U32 Vec3U32;
union Vec3U32
{
u32 Values[3];
struct { u32 X, Y, Z; };
struct { u32 U, V, W; };
struct { u32 Width, Height, Depth; };
};
typedef union Vec4U32 Vec4U32;
union Vec4U32
{
u32 Values[4];
struct { u32 X, Y, Z, W; };
struct { u32 Width, Height, Depth, Unused1; };
};
typedef Vec2R32 v2;
typedef Vec3R32 v3;
typedef Vec4R32 v4;
typedef Vec2I32 v2i;
typedef Vec3I32 v3i;
typedef Vec4I32 v4i;
typedef Vec2U32 v2u;
typedef Vec3U32 v3u;
typedef Vec4U32 v4u;
static inline v2 NewV2( r32 x, r32 y) { v2 result; result.X = x; result.Y = y; return result; }
static inline v2i NewV2i(i32 x, i32 y) { v2i result; result.X = x; result.Y = y; return result; }
static inline v2u NewV2u(u32 x, u32 y) { v2u result; result.X = x; result.Y = y; return result; }
static inline v3 NewV3( r32 x, r32 y, r32 z) { v3 result; result.X = x; result.Y = y; result.Z = z; return result; }
static inline v3i NewV3i(i32 x, i32 y, i32 z) { v3i result; result.X = x; result.Y = y; result.Z = z; return result; }
static inline v3u NewV3u(u32 x, u32 y, u32 z) { v3u result; result.X = x; result.Y = y; result.Z = z; return result; }
static inline v4 NewV4( r32 x, r32 y, r32 z, r32 w) { v4 result; result.X = x; result.Y = y; result.Z = z; result.W = w; return result; }
static inline v4i NewV4i(i32 x, i32 y, i32 z, i32 w) { v4i result; result.X = x; result.Y = y; result.Z = z; result.W = w; return result; }
static inline v4u NewV4u(u32 x, u32 y, u32 z, u32 w) { v4u result; result.X = x; result.Y = y; result.Z = z; result.W = w; return result; }
static inline v2 FillV2(r32 value) { v2 result; result.X = value; result.Y = value; return result; }
static inline v2i FillV2i(i32 value) { v2i result; result.X = value; result.Y = value; return result; }
static inline v2u FillV2u(u32 value) { v2u result; result.X = value; result.Y = value; return result; }
static inline v3 FillV3(r32 value) { v3 result; result.X = value; result.Y = value; result.Z = value; return result; }
static inline v3i FillV3i(i32 value) { v3i result; result.X = value; result.Y = value; result.Z = value; return result; }
static inline v3u FillV3u(u32 value) { v3u result; result.X = value; result.Y = value; result.Z = value; return result; }
static inline v4 FillV4(r32 value) { v4 result; result.X = value; result.Y = value; result.Z = value; result.W = value; return result; }
static inline v4i FillV4i(i32 value) { v4i result; result.X = value; result.Y = value; result.Z = value; result.W = value; return result; }
static inline v4u FillV4u(u32 value) { v4u result; result.X = value; result.Y = value; result.Z = value; result.W = value; return result; }
#define NewV2_Const(x, y) { .X=(x), .Y=(y) }
#define NewV2i_Const(x, y) { .X=(x), .Y=(y) }
#define NewV2u_Const(x, y) { .X=(x), .Y=(y) }
#define NewV3_Const(x, y, z) { .X=(x), .Y=(y), .Z=(z) }
#define NewV3i_Const(x, y, z) { .X=(x), .Y=(y), .Z=(z) }
#define NewV3u_Const(x, y, z) { .X=(x), .Y=(y), .Z=(z) }
#define NewV4_Const(x, y, z, w) { .X=(x), .Y=(y), .Z=(z), .W=(w) }
#define NewV4i_Const(x, y, z, w) { .X=(x), .Y=(y), .Z=(z), .W=(w) }
#define NewV4u_Const(x, y, z, w) { .X=(x), .Y=(y), .Z=(z), .W=(w) }
#define V2_Zero NewV2(0.0f, 0.0f)
#define V2_Zero_Const NewV2_Const(0.0f, 0.0f)
#define V2_One NewV2(1.0f, 1.0f)
#define V2_Half NewV2(0.5f, 0.5f)
#define V2_Left NewV2(-1.0f, 0.0f)
#define V2_Right NewV2( 1.0f, 0.0f)
#define V2_Up NewV2( 0.0f,-1.0f)
#define V2_Down NewV2( 0.0f, 1.0f)
#define V2i_Zero NewV2i(0, 0)
#define V2i_Zero_Const NewV2i_Const(0, 0)
#define V2i_One NewV2i(1, 1)
#define V2i_Left NewV2i(-1, 0)
#define V2i_Right NewV2i( 1, 0)
#define V2i_Up NewV2i( 0,-1)
#define V2i_Down NewV2i( 0, 1)
#define V2u_Zero NewV2u(0, 0)
#define V2u_Zero_Const NewV2u_Const(0, 0)
#define V2u_One NewV2u(1, 1)
#define V2u_Unit NewV2u(0, 1)
#define V3_Zero NewV3(0.0f, 0.0f, 0.0f)
#define V3_Zero_Const NewV3_Const(0.0f, 0.0f, 0.0f)
#define V3_One NewV3(1.0f, 1.0f, 1.0f)
#define V3_Half NewV3(0.5f, 0.5f, 0.5f)
#define V3_Left NewV3(-1.0f, 0.0f, 0.0f)
#define V3_Right NewV3( 1.0f, 0.0f, 0.0f)
#define V3_Down NewV3( 0.0f,-1.0f, 0.0f)
#define V3_Up NewV3( 0.0f, 1.0f, 0.0f)
#define V3_Backward NewV3( 0.0f, 0.0f,-1.0f)
#define V3_Forward NewV3( 0.0f, 0.0f, 1.0f)
#define V3i_Zero NewV3i(0, 0, 0)
#define V3i_Zero_Const NewV3i_Const(0, 0, 0)
#define V3i_One NewV3i(1, 1, 1)
#define V3i_Left NewV3i(-1, 0, 0)
#define V3i_Right NewV3i( 1, 0, 0)
#define V3i_Down NewV3i( 0,-1, 0)
#define V3i_Up NewV3i( 0, 1, 0)
#define V3i_Backward NewV3i( 0, 0,-1)
#define V3i_Forward NewV3i( 0, 0, 1)
#define V3u_Zero NewV3u(0, 0, 0)
#define V3u_Zero_Const NewV3u_Const(0, 0, 0)
#define V3u_One NewV3u(1, 1, 1)
#define V4_Zero NewV4(0.0f, 0.0f, 0.0f, 0.0f)
#define V4_Zero_Const NewV4_Const(0.0f, 0.0f, 0.0f, 0.0f)
#define V4_One NewV4(1.0f, 1.0f, 1.0f, 1.0f)
#define V4_Half NewV4(0.5f, 0.5f, 0.5f, 0.5f)
#define V4i_Zero NewV4i(0, 0, 0, 0)
#define V4i_Zero_Const NewV4i_Const(0, 0, 0, 0)
#define V4i_One NewV4i(1, 1, 1, 1)
#define V4u_Zero NewV4u(0, 0, 0, 0)
#define V4u_Zero_Const NewV4u_Const(0, 0, 0, 0)
#define V4u_One NewV4u(1, 1, 1, 1)
static inline v2 ToV2Fromi(v2i vector) { v2 result; result.X = (r32)vector.X; result.Y = (r32)vector.Y; return result; }
static inline v2 ToV2Fromu(v2u vector) { v2 result; result.X = (r32)vector.X; result.Y = (r32)vector.Y; return result; }
static inline v2 ToV2From3(v3 vector) { v2 result; result.X = vector.X; result.Y = vector.Y; return result; }
static inline v2 ToV2From3XZ(v3 vector) { v2 result; result.X = vector.X; result.Y = vector.Z; return result; }
static inline v2 ToV2From3YZ(v3 vector) { v2 result; result.X = vector.Y; result.Y = vector.Z; return result; }
static inline v2i ToV2iFromf(v2 vector) { v2i result; result.X = (i32)vector.X; result.Y = (i32)vector.Y; return result; }
static inline v2i ToV2iFromu(v2u vector) { v2i result; result.X = (i32)vector.X; result.Y = (i32)vector.Y; return result; }
static inline v2i ToV2iFrom3(v3i vector) { v2i result; result.X = vector.X; result.Y = vector.Y; return result; }
static inline v2i ToV2iFrom3XZ(v3i vector) { v2i result; result.X = vector.X; result.Y = vector.Z; return result; }
static inline v2i ToV2iFrom3YZ(v3i vector) { v2i result; result.X = vector.Y; result.Y = vector.Z; return result; }
static inline v2u ToV2uFromf(v2 vector) { v2u result; result.X = (u32)vector.X; result.Y = (u32)vector.Y; return result; }
static inline v2u ToV2uFromi(v2i vector) { v2u result; result.X = (u32)vector.X; result.Y = (u32)vector.Y; return result; }
static inline v2u ToV2uFrom3(v3u vector) { v2u result; result.X = vector.X; result.Y = vector.Y; return result; }
static inline v2u ToV2uFrom3XZ(v3u vector) { v2u result; result.X = vector.X; result.Y = vector.Z; return result; }
static inline v2u ToV2uFrom3YZ(v3u vector) { v2u result; result.X = vector.Y; result.Y = vector.Z; return result; }
static inline v3 ToV3Fromi(v3i vector) { v3 result; result.X = (r32)vector.X; result.Y = (r32)vector.Y; result.Z = (r32)vector.Z; return result; }
static inline v3 ToV3Fromu(v3u vector) { v3 result; result.X = (r32)vector.X; result.Y = (r32)vector.Y; result.Z = (r32)vector.Z; return result; }
static inline v3 ToV3From2(v2 vector, r32 z) { v3 result; result.X = vector.X; result.Y = vector.Y; result.Z = z; return result; }
static inline v3 ToV3From4(v4 vector) { v3 result; result.X = vector.X; result.Y = vector.Y; result.Z = vector.Z; return result; }
static inline v3i ToV3iFromf(v3 vector) { v3i result; result.X = (i32)vector.X; result.Y = (i32)vector.Y; result.Z = (i32)vector.Z; return result; }
static inline v3i ToV3iFromu(v3u vector) { v3i result; result.X = (i32)vector.X; result.Y = (i32)vector.Y; result.Z = (i32)vector.Z; return result; }
static inline v3i ToV3iFrom2(v2i vector, i32 z) { v3i result; result.X = vector.X; result.Y = vector.Y; result.Z = z; return result; }
static inline v3i ToV3iFrom4(v4i vector) { v3i result; result.X = vector.X; result.Y = vector.Y; result.Z = vector.Z; return result; }
static inline v3u ToV3uFromf(v3 vector) { v3u result; result.X = (u32)vector.X; result.Y = (u32)vector.Y; result.Z = (u32)vector.Z; return result; }
static inline v3u ToV3uFromi(v3i vector) { v3u result; result.X = (u32)vector.X; result.Y = (u32)vector.Y; result.Z = (u32)vector.Z; return result; }
static inline v3u ToV3uFrom2(v2u vector, u32 z) { v3u result; result.X = vector.X; result.Y = vector.Y; result.Z = z; return result; }
static inline v3u ToV3uFrom4(v4u vector) { v3u result; result.X = vector.X; result.Y = vector.Y; result.Z = vector.Z; return result; }
static inline v4 ToV4Fromi(v4i vector) { v4 result; result.X = (r32)vector.X; result.Y = (r32)vector.Y; result.Z = (r32)vector.Z; result.W = (r32)vector.W; return result; }
static inline v4 ToV4Fromu(v4u vector) { v4 result; result.X = (r32)vector.X; result.Y = (r32)vector.Y; result.Z = (r32)vector.Z; result.W = (r32)vector.W; return result; }
static inline v4 ToV4From2(v2 vector, r32 z, r32 w) { v4 result; result.X = vector.X; result.Y = vector.Y; result.Z = z; result.W = w; return result; }
static inline v4 ToV4From3(v3 vector, r32 w) { v4 result; result.X = vector.X; result.Y = vector.Y; result.Z = vector.Z; result.W = w; return result; }
static inline v4i ToV4iFromf(v4 vector) { v4i result; result.X = (i32)vector.X; result.Y = (i32)vector.Y; result.Z = (i32)vector.Z; result.W = (i32)vector.W; return result; }
static inline v4i ToV4iFromu(v4u vector) { v4i result; result.X = (i32)vector.X; result.Y = (i32)vector.Y; result.Z = (i32)vector.Z; result.W = (i32)vector.W; return result; }
static inline v4i ToV4iFrom2(v2i vector, i32 z, i32 w) { v4i result; result.X = vector.X; result.Y = vector.Y; result.Z = z; result.W = w; return result; }
static inline v4i ToV4iFrom3(v3i vector, i32 w) { v4i result; result.X = vector.X; result.Y = vector.Y; result.Z = vector.Z; result.W = w; return result; }
static inline v4u ToV4uFromf(v4 vector) { v4u result; result.X = (u32)vector.X; result.Y = (u32)vector.Y; result.Z = (u32)vector.Z; result.W = (u32)vector.W; return result; }
static inline v4u ToV4uFromi(v4i vector) { v4u result; result.X = (u32)vector.X; result.Y = (u32)vector.Y; result.Z = (u32)vector.Z; result.W = (u32)vector.W; return result; }
static inline v4u ToV4uFrom2(v2u vector, u32 z, u32 w) { v4u result; result.X = vector.X; result.Y = vector.Y; result.Z = z; result.W = w; return result; }
static inline v4u ToV4uFrom3(v3u vector, u32 w) { v4u result; result.X = vector.X; result.Y = vector.Y; result.Z = vector.Z; result.W = w; return result; }
static inline v2 AddV2(v2 left, v2 right) { v2 result; result.X = left.X + right.X; result.Y = left.Y + right.Y; return result; }
static inline v2i AddV2i(v2i left, v2i right) { v2i result; result.X = left.X + right.X; result.Y = left.Y + right.Y; return result; }
static inline v2u AddV2u(v2u left, v2u right) { v2u result; result.X = left.X + right.X; result.Y = left.Y + right.Y; return result; }
static inline v3 AddV3(v3 left, v3 right) { v3 result; result.X = left.X + right.X; result.Y = left.Y + right.Y; result.Z = left.Z + right.Z; return result; }
static inline v3i AddV3i(v3i left, v3i right) { v3i result; result.X = left.X + right.X; result.Y = left.Y + right.Y; result.Z = left.Z + right.Z; return result; }
static inline v3u AddV3u(v3u left, v3u right) { v3u result; result.X = left.X + right.X; result.Y = left.Y + right.Y; result.Z = left.Z + right.Z; return result; }
static inline v4 AddV4(v4 left, v4 right) { v4 result; result.X = left.X + right.X; result.Y = left.Y + right.Y; result.Z = left.Z + right.Z; result.W = left.W + right.W; return result; }
static inline v4i AddV4i(v4i left, v4i right) { v4i result; result.X = left.X + right.X; result.Y = left.Y + right.Y; result.Z = left.Z + right.Z; result.W = left.W + right.W; return result; }
static inline v4u AddV4u(v4u left, v4u right) { v4u result; result.X = left.X + right.X; result.Y = left.Y + right.Y; result.Z = left.Z + right.Z; result.W = left.W + right.W; return result; }
static inline v2 SubV2(v2 left, v2 right) { v2 result; result.X = left.X - right.X; result.Y = left.Y - right.Y; return result; }
static inline v2i SubV2i(v2i left, v2i right) { v2i result; result.X = left.X - right.X; result.Y = left.Y - right.Y; return result; }
static inline v2u SubV2u(v2u left, v2u right) { v2u result; result.X = left.X - right.X; result.Y = left.Y - right.Y; return result; }
static inline v3 SubV3(v3 left, v3 right) { v3 result; result.X = left.X - right.X; result.Y = left.Y - right.Y; result.Z = left.Z - right.Z; return result; }
static inline v3i SubV3i(v3i left, v3i right) { v3i result; result.X = left.X - right.X; result.Y = left.Y - right.Y; result.Z = left.Z - right.Z; return result; }
static inline v3u SubV3u(v3u left, v3u right) { v3u result; result.X = left.X - right.X; result.Y = left.Y - right.Y; result.Z = left.Z - right.Z; return result; }
static inline v4 SubV4(v4 left, v4 right) { v4 result; result.X = left.X - right.X; result.Y = left.Y - right.Y; result.Z = left.Z - right.Z; result.W = left.W - right.W; return result; }
static inline v4i SubV4i(v4i left, v4i right) { v4i result; result.X = left.X - right.X; result.Y = left.Y - right.Y; result.Z = left.Z - right.Z; result.W = left.W - right.W; return result; }
static inline v4u SubV4u(v4u left, v4u right) { v4u result; result.X = left.X - right.X; result.Y = left.Y - right.Y; result.Z = left.Z - right.Z; result.W = left.W - right.W; return result; }
static inline v2 MulV2(v2 left, v2 right) { v2 result; result.X = left.X * right.X; result.Y = left.Y * right.Y; return result; }
static inline v2i MulV2i(v2i left, v2i right) { v2i result; result.X = left.X * right.X; result.Y = left.Y * right.Y; return result; }
static inline v2u MulV2u(v2u left, v2u right) { v2u result; result.X = left.X * right.X; result.Y = left.Y * right.Y; return result; }
static inline v3 MulV3(v3 left, v3 right) { v3 result; result.X = left.X * right.X; result.Y = left.Y * right.Y; result.Z = left.Z * right.Z; return result; }
static inline v3i MulV3i(v3i left, v3i right) { v3i result; result.X = left.X * right.X; result.Y = left.Y * right.Y; result.Z = left.Z * right.Z; return result; }
static inline v3u MulV3u(v3u left, v3u right) { v3u result; result.X = left.X * right.X; result.Y = left.Y * right.Y; result.Z = left.Z * right.Z; return result; }
static inline v4 MulV4(v4 left, v4 right) { v4 result; result.X = left.X * right.X; result.Y = left.Y * right.Y; result.Z = left.Z * right.Z; result.W = left.W * right.W; return result; }
static inline v4i MulV4i(v4i left, v4i right) { v4i result; result.X = left.X * right.X; result.Y = left.Y * right.Y; result.Z = left.Z * right.Z; result.W = left.W * right.W; return result; }
static inline v4u MulV4u(v4u left, v4u right) { v4u result; result.X = left.X * right.X; result.Y = left.Y * right.Y; result.Z = left.Z * right.Z; result.W = left.W * right.W; return result; }
static inline v2 DivV2(v2 left, v2 right) { v2 result; result.X = left.X / right.X; result.Y = left.Y / right.Y; return result; }
static inline v2i DivV2i(v2i left, v2i right) { v2i result; result.X = left.X / right.X; result.Y = left.Y / right.Y; return result; }
static inline v2u DivV2u(v2u left, v2u right) { v2u result; result.X = left.X / right.X; result.Y = left.Y / right.Y; return result; }
static inline v3 DivV3(v3 left, v3 right) { v3 result; result.X = left.X / right.X; result.Y = left.Y / right.Y; result.Z = left.Z / right.Z; return result; }
static inline v3i DivV3i(v3i left, v3i right) { v3i result; result.X = left.X / right.X; result.Y = left.Y / right.Y; result.Z = left.Z / right.Z; return result; }
static inline v3u DivV3u(v3u left, v3u right) { v3u result; result.X = left.X / right.X; result.Y = left.Y / right.Y; result.Z = left.Z / right.Z; return result; }
static inline v4 DivV4(v4 left, v4 right) { v4 result; result.X = left.X / right.X; result.Y = left.Y / right.Y; result.Z = left.Z / right.Z; result.W = left.W / right.W; return result; }
static inline v4i DivV4i(v4i left, v4i right) { v4i result; result.X = left.X / right.X; result.Y = left.Y / right.Y; result.Z = left.Z / right.Z; result.W = left.W / right.W; return result; }
static inline v4u DivV4u(v4u left, v4u right) { v4u result; result.X = left.X / right.X; result.Y = left.Y / right.Y; result.Z = left.Z / right.Z; result.W = left.W / right.W; return result; }
static inline v2 ScaleV2(v2 left, r32 right) { v2 result; result.X = left.X * right; result.Y = left.Y * right; return result; }
static inline v2i ScaleV2i(v2i left, i32 right) { v2i result; result.X = left.X * right; result.Y = left.Y * right; return result; }
static inline v2u ScaleV2u(v2u left, u32 right) { v2u result; result.X = left.X * right; result.Y = left.Y * right; return result; }
static inline v3 ScaleV3(v3 left, r32 right) { v3 result; result.X = left.X * right; result.Y = left.Y * right; result.Z = left.Z * right; return result; }
static inline v3i ScaleV3i(v3i left, i32 right) { v3i result; result.X = left.X * right; result.Y = left.Y * right; result.Z = left.Z * right; return result; }
static inline v3u ScaleV3u(v3u left, u32 right) { v3u result; result.X = left.X * right; result.Y = left.Y * right; result.Z = left.Z * right; return result; }
static inline v4 ScaleV4(v4 left, r32 right) { v4 result; result.X = left.X * right; result.Y = left.Y * right; result.Z = left.Z * right; result.W = left.W * right; return result; }
static inline v4i ScaleV4i(v4i left, i32 right) { v4i result; result.X = left.X * right; result.Y = left.Y * right; result.Z = left.Z * right; result.W = left.W * right; return result; }
static inline v4u ScaleV4u(v4u left, u32 right) { v4u result; result.X = left.X * right; result.Y = left.Y * right; result.Z = left.Z * right; result.W = left.W * right; return result; }
static inline v2 ShrinkV2(v2 left, r32 right) { v2 result; result.X = left.X / right; result.Y = left.Y / right; return result; }
static inline v2i ShrinkV2i(v2i left, i32 right) { v2i result; result.X = left.X / right; result.Y = left.Y / right; return result; }
static inline v2u ShrinkV2u(v2u left, u32 right) { v2u result; result.X = left.X / right; result.Y = left.Y / right; return result; }
static inline v3 ShrinkV3(v3 left, r32 right) { v3 result; result.X = left.X / right; result.Y = left.Y / right; result.Z = left.Z / right; return result; }
static inline v3i ShrinkV3i(v3i left, i32 right) { v3i result; result.X = left.X / right; result.Y = left.Y / right; result.Z = left.Z / right; return result; }
static inline v3u ShrinkV3u(v3u left, u32 right) { v3u result; result.X = left.X / right; result.Y = left.Y / right; result.Z = left.Z / right; return result; }
static inline v4 ShrinkV4(v4 left, r32 right) { v4 result; result.X = left.X / right; result.Y = left.Y / right; result.Z = left.Z / right; result.W = left.W / right; return result; }
static inline v4i ShrinkV4i(v4i left, i32 right) { v4i result; result.X = left.X / right; result.Y = left.Y / right; result.Z = left.Z / right; result.W = left.W / right; return result; }
static inline v4u ShrinkV4u(v4u left, u32 right) { v4u result; result.X = left.X / right; result.Y = left.Y / right; result.Z = left.Z / right; result.W = left.W / right; return result; }
static inline bool AreEqualV2(v2 left, v2 right) { return (left.X == right.X && left.Y == right.Y); }
static inline bool AreEqualV2i(v2i left, v2i right) { return (left.X == right.X && left.Y == right.Y); }
static inline bool AreEqualV2u(v2u left, v2u right) { return (left.X == right.X && left.Y == right.Y); }
static inline bool AreEqualV3(v3 left, v3 right) { return (left.X == right.X && left.Y == right.Y && left.Z == right.Z); }
static inline bool AreEqualV3i(v3i left, v3i right) { return (left.X == right.X && left.Y == right.Y && left.Z == right.Z); }
static inline bool AreEqualV3u(v3u left, v3u right) { return (left.X == right.X && left.Y == right.Y && left.Z == right.Z); }
static inline bool AreEqualV4(v4 left, v4 right) { return (left.X == right.X && left.Y == right.Y && left.Z == right.Z && left.W == right.W); }
static inline bool AreEqualV4i(v4i left, v4i right) { return (left.X == right.X && left.Y == right.Y && left.Z == right.Z && left.W == right.W); }
static inline bool AreEqualV4u(v4u left, v4u right) { return (left.X == right.X && left.Y == right.Y && left.Z == right.Z && left.W == right.W); }
static inline r32 DotV2(v2 left, v2 right) { return (left.X * right.X) + (left.Y * right.Y); }
static inline i32 DotV2i(v2i left, v2i right) { return (left.X * right.X) + (left.Y * right.Y); }
static inline u32 DotV2u(v2u left, v2u right) { return (left.X * right.X) + (left.Y * right.Y); }
static inline r32 DotV3(v3 left, v3 right) { return (left.X * right.X) + (left.Y * right.Y) + (left.Z * right.Z); }
static inline i32 DotV3i(v3i left, v3i right) { return (left.X * right.X) + (left.Y * right.Y) + (left.Z * right.Z); }
static inline u32 DotV3u(v3u left, v3u right) { return (left.X * right.X) + (left.Y * right.Y) + (left.Z * right.Z); }
static inline r32 DotV4(v4 left, v4 right) { return (left.X * right.X) + (left.Y * right.Y) + (left.Z * right.Z) + (left.W * right.W); }
static inline i32 DotV4i(v4i left, v4i right) { return (left.X * right.X) + (left.Y * right.Y) + (left.Z * right.Z) + (left.W * right.W); }
static inline u32 DotV4u(v4u left, v4u right) { return (left.X * right.X) + (left.Y * right.Y) + (left.Z * right.Z) + (left.W * right.W); }
static inline v3 CrossV3(v3 left, v3 right) { v3 result; result.X = (left.Y*right.Z - left.Z*right.Y); result.Y = (left.Z*right.X - left.X*right.Z); result.Z = (left.X*right.Y - left.Y*right.X); return result; }
static inline v3i CrossV3i(v3i left, v3i right) { v3i result; result.X = (left.Y*right.Z - left.Z*right.Y); result.Y = (left.Z*right.X - left.X*right.Z); result.Z = (left.X*right.Y - left.Y*right.X); return result; }
static inline v3u CrossV3u(v3u left, v3u right) { v3u result; result.X = (left.Y*right.Z - left.Z*right.Y); result.Y = (left.Z*right.X - left.X*right.Z); result.Z = (left.X*right.Y - left.Y*right.X); return result; }
static inline r32 LengthSquaredV2(v2 vector) { return DotV2(vector, vector); }
static inline i32 LengthSquaredV2i(v2i vector) { return DotV2i(vector, vector); }
static inline u32 LengthSquaredV2u(v2u vector) { return DotV2u(vector, vector); }
static inline r32 LengthSquaredV3(v3 vector) { return DotV3(vector, vector); }
static inline i32 LengthSquaredV3i(v3i vector) { return DotV3i(vector, vector); }
static inline u32 LengthSquaredV3u(v3u vector) { return DotV3u(vector, vector); }
static inline r32 LengthSquaredV4(v4 vector) { return DotV4(vector, vector); }
static inline i32 LengthSquaredV4i(v4i vector) { return DotV4i(vector, vector); }
static inline u32 LengthSquaredV4u(v4u vector) { return DotV4u(vector, vector); }
static inline r32 LengthV2(v2 vector) { return sqrtf(LengthSquaredV2(vector)); }
static inline r32 LengthV3(v3 vector) { return sqrtf(LengthSquaredV3(vector)); }
static inline r32 LengthV4(v4 vector) { return sqrtf(LengthSquaredV4(vector)); }
static inline v2 NormalizeV2(v2 vector) { return ShrinkV2(vector, LengthV2(vector)); }
static inline v3 NormalizeV3(v3 vector) { return ShrinkV3(vector, LengthV3(vector)); }
static inline v4 NormalizeV4(v4 vector) { return ShrinkV4(vector, LengthV4(vector)); }
static inline v2 LerpV2(v2 start, v2 end, r32 amount) { v2 result; result.X = start.X + (end.X - start.X)*amount; result.Y = start.Y + (end.Y - start.Y)*amount; return result; }
static inline v3 LerpV3(v3 start, v3 end, r32 amount) { v3 result; result.X = start.X + (end.X - start.X)*amount; result.Y = start.Y + (end.Y - start.Y)*amount; result.Z = start.Z + (end.Z - start.Z)*amount; return result; }
static inline v4 LerpV4(v4 start, v4 end, r32 amount) { v4 result; result.X = start.X + (end.X - start.X)*amount; result.Y = start.Y + (end.Y - start.Y)*amount; result.Z = start.Z + (end.Z - start.Z)*amount; result.W = start.W + (end.W - start.W)*amount; return result; }
static inline v2 ClampV2(v2 vector, v2 min, v2 max) { v2 result; result.X = Clamp(vector.X, min.X, max.X); result.Y = Clamp(vector.Y, min.Y, max.Y); return result; }
static inline v2i ClampV2i(v2i vector, v2i min, v2i max) { v2i result; result.X = Clamp(vector.X, min.X, max.X); result.Y = Clamp(vector.Y, min.Y, max.Y); return result; }
static inline v2u ClampV2u(v2u vector, v2u min, v2u max) { v2u result; result.X = Clamp(vector.X, min.X, max.X); result.Y = Clamp(vector.Y, min.Y, max.Y); return result; }
static inline v3 ClampV3(v3 vector, v3 min, v3 max) { v3 result; result.X = Clamp(vector.X, min.X, max.X); result.Y = Clamp(vector.Y, min.Y, max.Y); result.Z = Clamp(vector.Z, min.Z, max.Z); return result; }
static inline v3i ClampV3i(v3i vector, v3i min, v3i max) { v3i result; result.X = Clamp(vector.X, min.X, max.X); result.Y = Clamp(vector.Y, min.Y, max.Y); result.Z = Clamp(vector.Z, min.Z, max.Z); return result; }
static inline v3u ClampV3u(v3u vector, v3u min, v3u max) { v3u result; result.X = Clamp(vector.X, min.X, max.X); result.Y = Clamp(vector.Y, min.Y, max.Y); result.Z = Clamp(vector.Z, min.Z, max.Z); return result; }
static inline v4 ClampV4(v4 vector, v4 min, v4 max) { v4 result; result.X = Clamp(vector.X, min.X, max.X); result.Y = Clamp(vector.Y, min.Y, max.Y); result.Z = Clamp(vector.Z, min.Z, max.Z); result.W = Clamp(vector.W, min.W, max.W); return result; }
static inline v4i ClampV4i(v4i vector, v4i min, v4i max) { v4i result; result.X = Clamp(vector.X, min.X, max.X); result.Y = Clamp(vector.Y, min.Y, max.Y); result.Z = Clamp(vector.Z, min.Z, max.Z); result.W = Clamp(vector.W, min.W, max.W); return result; }
static inline v4u ClampV4u(v4u vector, v4u min, v4u max) { v4u result; result.X = Clamp(vector.X, min.X, max.X); result.Y = Clamp(vector.Y, min.Y, max.Y); result.Z = Clamp(vector.Z, min.Z, max.Z); result.W = Clamp(vector.W, min.W, max.W); return result; }
static inline v2 MaxV2(v2 left, v2 right) { v2 result; result.X = MAX(left.X, right.X); result.Y = MAX(left.Y, right.Y); return result; }
static inline v2i MaxV2i(v2i left, v2i right) { v2i result; result.X = MAX(left.X, right.X); result.Y = MAX(left.Y, right.Y); return result; }
static inline v2u MaxV2u(v2u left, v2u right) { v2u result; result.X = MAX(left.X, right.X); result.Y = MAX(left.Y, right.Y); return result; }
static inline v3 MaxV3(v3 left, v3 right) { v3 result; result.X = MAX(left.X, right.X); result.Y = MAX(left.Y, right.Y); result.Z = MAX(left.Z, right.Z); return result; }
static inline v3i MaxV3i(v3i left, v3i right) { v3i result; result.X = MAX(left.X, right.X); result.Y = MAX(left.Y, right.Y); result.Z = MAX(left.Z, right.Z); return result; }
static inline v3u MaxV3u(v3u left, v3u right) { v3u result; result.X = MAX(left.X, right.X); result.Y = MAX(left.Y, right.Y); result.Z = MAX(left.Z, right.Z); return result; }
static inline v4 MaxV4(v4 left, v4 right) { v4 result; result.X = MAX(left.X, right.X); result.Y = MAX(left.Y, right.Y); result.Z = MAX(left.Z, right.Z); result.W = MAX(left.W, right.W); return result; }
static inline v4i MaxV4i(v4i left, v4i right) { v4i result; result.X = MAX(left.X, right.X); result.Y = MAX(left.Y, right.Y); result.Z = MAX(left.Z, right.Z); result.W = MAX(left.W, right.W); return result; }
static inline v4u MaxV4u(v4u left, v4u right) { v4u result; result.X = MAX(left.X, right.X); result.Y = MAX(left.Y, right.Y); result.Z = MAX(left.Z, right.Z); result.W = MAX(left.W, right.W); return result; }
static inline v2 MinV2(v2 left, v2 right) { v2 result; result.X = MIN(left.X, right.X); result.Y = MIN(left.Y, right.Y); return result; }
static inline v2i MinV2i(v2i left, v2i right) { v2i result; result.X = MIN(left.X, right.X); result.Y = MIN(left.Y, right.Y); return result; }
static inline v2u MinV2u(v2u left, v2u right) { v2u result; result.X = MIN(left.X, right.X); result.Y = MIN(left.Y, right.Y); return result; }
static inline v3 MinV3(v3 left, v3 right) { v3 result; result.X = MIN(left.X, right.X); result.Y = MIN(left.Y, right.Y); result.Z = MIN(left.Z, right.Z); return result; }
static inline v3i MinV3i(v3i left, v3i right) { v3i result; result.X = MIN(left.X, right.X); result.Y = MIN(left.Y, right.Y); result.Z = MIN(left.Z, right.Z); return result; }
static inline v3u MinV3u(v3u left, v3u right) { v3u result; result.X = MIN(left.X, right.X); result.Y = MIN(left.Y, right.Y); result.Z = MIN(left.Z, right.Z); return result; }
static inline v4 MinV4(v4 left, v4 right) { v4 result; result.X = MIN(left.X, right.X); result.Y = MIN(left.Y, right.Y); result.Z = MIN(left.Z, right.Z); result.W = MIN(left.W, right.W); return result; }
static inline v4i MinV4i(v4i left, v4i right) { v4i result; result.X = MIN(left.X, right.X); result.Y = MIN(left.Y, right.Y); result.Z = MIN(left.Z, right.Z); result.W = MIN(left.W, right.W); return result; }
static inline v4u MinV4u(v4u left, v4u right) { v4u result; result.X = MIN(left.X, right.X); result.Y = MIN(left.Y, right.Y); result.Z = MIN(left.Z, right.Z); result.W = MIN(left.W, right.W); return result; }
static inline v2 FloorV2(v2 vector) { v2 result; result.X = floorf(vector.X); result.Y = floorf(vector.Y); return result; }
static inline v2i FloorV2i(v2 vector) { v2i result; result.X = (i32)floorf(vector.X); result.Y = (i32)floorf(vector.Y); return result; }
static inline v2u FloorV2u(v2 vector) { v2u result; result.X = (u32)floorf(vector.X); result.Y = (u32)floorf(vector.Y); return result; }
static inline v3 FloorV3(v3 vector) { v3 result; result.X = floorf(vector.X); result.Y = floorf(vector.Y); result.Z = floorf(vector.Z); return result; }
static inline v3i FloorV3i(v3 vector) { v3i result; result.X = (i32)floorf(vector.X); result.Y = (i32)floorf(vector.Y); result.Z = (i32)floorf(vector.Z); return result; }
static inline v3u FloorV3u(v3 vector) { v3u result; result.X = (u32)floorf(vector.X); result.Y = (u32)floorf(vector.Y); result.Z = (u32)floorf(vector.Z); return result; }
static inline v4 FloorV4(v4 vector) { v4 result; result.X = floorf(vector.X); result.Y = floorf(vector.Y); result.Z = floorf(vector.Z); result.W = floorf(vector.W); return result; }
static inline v4i FloorV4i(v4 vector) { v4i result; result.X = (i32)floorf(vector.X); result.Y = (i32)floorf(vector.Y); result.Z = (i32)floorf(vector.Z); result.W = (i32)floorf(vector.W); return result; }
static inline v4u FloorV4u(v4 vector) { v4u result; result.X = (u32)floorf(vector.X); result.Y = (u32)floorf(vector.Y); result.Z = (u32)floorf(vector.Z); result.W = (u32)floorf(vector.W); return result; }
static inline v2 CeilV2(v2 vector) { v2 result; result.X = ceilf(vector.X); result.Y = ceilf(vector.Y); return result; }
static inline v2i CeilV2i(v2 vector) { v2i result; result.X = (i32)ceilf(vector.X); result.Y = (i32)ceilf(vector.Y); return result; }
static inline v2u CeilV2u(v2 vector) { v2u result; result.X = (u32)ceilf(vector.X); result.Y = (u32)ceilf(vector.Y); return result; }
static inline v3 CeilV3(v3 vector) { v3 result; result.X = ceilf(vector.X); result.Y = ceilf(vector.Y); result.Z = ceilf(vector.Z); return result; }
static inline v3i CeilV3i(v3 vector) { v3i result; result.X = (i32)ceilf(vector.X); result.Y = (i32)ceilf(vector.Y); result.Z = (i32)ceilf(vector.Z); return result; }
static inline v3u CeilV3u(v3 vector) { v3u result; result.X = (u32)ceilf(vector.X); result.Y = (u32)ceilf(vector.Y); result.Z = (u32)ceilf(vector.Z); return result; }
static inline v4 CeilV4(v4 vector) { v4 result; result.X = ceilf(vector.X); result.Y = ceilf(vector.Y); result.Z = ceilf(vector.Z); result.W = ceilf(vector.W); return result; }
static inline v4i CeilV4i(v4 vector) { v4i result; result.X = (i32)ceilf(vector.X); result.Y = (i32)ceilf(vector.Y); result.Z = (i32)ceilf(vector.Z); result.W = (i32)ceilf(vector.W); return result; }
static inline v4u CeilV4u(v4 vector) { v4u result; result.X = (u32)ceilf(vector.X); result.Y = (u32)ceilf(vector.Y); result.Z = (u32)ceilf(vector.Z); result.W = (u32)ceilf(vector.W); return result; }
static inline v2 RoundV2(v2 vector) { v2 result; result.X = roundf(vector.X); result.Y = roundf(vector.Y); return result; }
static inline v2i RoundV2i(v2 vector) { v2i result; result.X = (i32)roundf(vector.X); result.Y = (i32)roundf(vector.Y); return result; }
static inline v2u RoundV2u(v2 vector) { v2u result; result.X = (u32)roundf(vector.X); result.Y = (u32)roundf(vector.Y); return result; }
static inline v3 RoundV3(v3 vector) { v3 result; result.X = roundf(vector.X); result.Y = roundf(vector.Y); result.Z = roundf(vector.Z); return result; }
static inline v3i RoundV3i(v3 vector) { v3i result; result.X = (i32)roundf(vector.X); result.Y = (i32)roundf(vector.Y); result.Z = (i32)roundf(vector.Z); return result; }
static inline v3u RoundV3u(v3 vector) { v3u result; result.X = (u32)roundf(vector.X); result.Y = (u32)roundf(vector.Y); result.Z = (u32)roundf(vector.Z); return result; }
static inline v4 RoundV4(v4 vector) { v4 result; result.X = roundf(vector.X); result.Y = roundf(vector.Y); result.Z = roundf(vector.Z); result.W = roundf(vector.W); return result; }
static inline v4i RoundV4i(v4 vector) { v4i result; result.X = (i32)roundf(vector.X); result.Y = (i32)roundf(vector.Y); result.Z = (i32)roundf(vector.Z); result.W = (i32)roundf(vector.W); return result; }
static inline v4u RoundV4u(v4 vector) { v4u result; result.X = (u32)roundf(vector.X); result.Y = (u32)roundf(vector.Y); result.Z = (u32)roundf(vector.Z); result.W = (u32)roundf(vector.W); return result; }
static inline v2 AbsV2(v2 vector) { v2 result; result.X = fabsf(vector.X); result.Y = fabsf(vector.Y); return result; }
static inline v2i AbsV2i(v2 vector) { v2i result; result.X = (i32)fabsf(vector.X); result.Y = (i32)fabsf(vector.Y); return result; }
static inline v2u AbsV2u(v2 vector) { v2u result; result.X = (u32)fabsf(vector.X); result.Y = (u32)fabsf(vector.Y); return result; }
static inline v3 AbsV3(v3 vector) { v3 result; result.X = fabsf(vector.X); result.Y = fabsf(vector.Y); result.Z = fabsf(vector.Z); return result; }
static inline v3i AbsV3i(v3 vector) { v3i result; result.X = (i32)fabsf(vector.X); result.Y = (i32)fabsf(vector.Y); result.Z = (i32)fabsf(vector.Z); return result; }
static inline v3u AbsV3u(v3 vector) { v3u result; result.X = (u32)fabsf(vector.X); result.Y = (u32)fabsf(vector.Y); result.Z = (u32)fabsf(vector.Z); return result; }
static inline v4 AbsV4(v4 vector) { v4 result; result.X = fabsf(vector.X); result.Y = fabsf(vector.Y); result.Z = fabsf(vector.Z); result.W = fabsf(vector.W); return result; }
static inline v4i AbsV4i(v4 vector) { v4i result; result.X = (i32)fabsf(vector.X); result.Y = (i32)fabsf(vector.Y); result.Z = (i32)fabsf(vector.Z); result.W = (i32)fabsf(vector.W); return result; }
static inline v4u AbsV4u(v4 vector) { v4u result; result.X = (u32)fabsf(vector.X); result.Y = (u32)fabsf(vector.Y); result.Z = (u32)fabsf(vector.Z); result.W = (u32)fabsf(vector.W); return result; }
static inline v2 PerpLeftV2(v2 vector) { v2 result; result.X = -vector.Y; result.Y = vector.X; return result; }
static inline v2 PerpRightV2(v2 vector) { v2 result; result.X = vector.Y; result.Y = -vector.X; return result; }
static inline v2i PerpLeftV2i(v2i vector) { v2i result; result.X = -vector.Y; result.Y = vector.X; return result; }
static inline v2i PerpRightV2i(v2i vector) { v2i result; result.X = vector.Y; result.Y = -vector.X; return result; }
static inline v2u PerpLeftV2u(v2u vector) { v2u result; result.X = -vector.Y; result.Y = vector.X; return result; }
static inline v2u PerpRightV2u(v2u vector) { v2u result; result.X = vector.Y; result.Y = -vector.X; return result; }
static inline v2 RotateV2(v2 vector, r32 angle) { v2 result; result.X = cosf(angle) * vector.X - sinf(angle) * vector.Y; result.Y = sinf(angle) * vector.X + cosf(angle) * vector.Y; return result; }
static inline r32 AngleBetweenV3(v3 left, v3 right) { return acosf(DotV3(left, right) / (LengthV3(left) * LengthV3(right))); }
static inline v3 ToV3FromAngles(r32 facingDirection, r32 rotationUpDown, r32 radius) { v3 result; r32 circleRadius = cosf(rotationUpDown) * radius; result.X = cosf(facingDirection) * circleRadius; result.Y = sinf(facingDirection) * circleRadius; result.Z = sinf(rotationUpDown) * radius; return result; }
static inline void AlignV2ToV2(v2* vectorPntr, v2 alignScale) { vectorPntr->X = (alignScale.X != 0) ? (roundf(vectorPntr->X * alignScale.X) / alignScale.X) : vectorPntr->X; vectorPntr->Y = (alignScale.Y != 0) ? (roundf(vectorPntr->Y * alignScale.Y) / alignScale.Y) : vectorPntr->Y; }
static inline void AlignV3ToV3(v3* vectorPntr, v3 alignScale) { vectorPntr->X = (alignScale.X != 0) ? (roundf(vectorPntr->X * alignScale.X) / alignScale.X) : vectorPntr->X; vectorPntr->Y = (alignScale.Y != 0) ? (roundf(vectorPntr->Y * alignScale.Y) / alignScale.Y) : vectorPntr->Y; vectorPntr->Z = (alignScale.Z != 0) ? (roundf(vectorPntr->Z * alignScale.Z) / alignScale.Z) : vectorPntr->Z; }
static inline void AlignV4ToV4(v4* vectorPntr, v4 alignScale) { vectorPntr->X = (alignScale.X != 0) ? (roundf(vectorPntr->X * alignScale.X) / alignScale.X) : vectorPntr->X; vectorPntr->Y = (alignScale.Y != 0) ? (roundf(vectorPntr->Y * alignScale.Y) / alignScale.Y) : vectorPntr->Y; vectorPntr->Z = (alignScale.Z != 0) ? (roundf(vectorPntr->Z * alignScale.Z) / alignScale.Z) : vectorPntr->Z; vectorPntr->W = (alignScale.W != 0) ? (roundf(vectorPntr->W * alignScale.W) / alignScale.W) : vectorPntr->W; }
static inline void AlignV2(v2* vectorPntr, r32 alignScale) { vectorPntr->X = (alignScale != 0) ? (roundf(vectorPntr->X * alignScale) / alignScale) : vectorPntr->X; vectorPntr->Y = (alignScale != 0) ? (roundf(vectorPntr->Y * alignScale) / alignScale) : vectorPntr->Y; }
static inline void AlignV3(v3* vectorPntr, r32 alignScale) { vectorPntr->X = (alignScale != 0) ? (roundf(vectorPntr->X * alignScale) / alignScale) : vectorPntr->X; vectorPntr->Y = (alignScale != 0) ? (roundf(vectorPntr->Y * alignScale) / alignScale) : vectorPntr->Y; vectorPntr->Z = (alignScale != 0) ? (roundf(vectorPntr->Z * alignScale) / alignScale) : vectorPntr->Z; }
static inline void AlignV4(v4* vectorPntr, r32 alignScale) { vectorPntr->X = (alignScale != 0) ? (roundf(vectorPntr->X * alignScale) / alignScale) : vectorPntr->X; vectorPntr->Y = (alignScale != 0) ? (roundf(vectorPntr->Y * alignScale) / alignScale) : vectorPntr->Y; vectorPntr->Z = (alignScale != 0) ? (roundf(vectorPntr->Z * alignScale) / alignScale) : vectorPntr->Z; vectorPntr->W = (alignScale != 0) ? (roundf(vectorPntr->W * alignScale) / alignScale) : vectorPntr->W; }

View File

@@ -15,7 +15,7 @@ MAYBE_EXTERN_C bool jsGlGetParameterBool(GlEnum parameter);
MAYBE_EXTERN_C GlEnum jsGlGetParameterEnum(GlEnum parameter); MAYBE_EXTERN_C GlEnum jsGlGetParameterEnum(GlEnum parameter);
MAYBE_EXTERN_C int jsGlGetParameterInt(GlEnum parameter); MAYBE_EXTERN_C int jsGlGetParameterInt(GlEnum parameter);
MAYBE_EXTERN_C float jsGlGetParameterFloat(GlEnum parameter); MAYBE_EXTERN_C float jsGlGetParameterFloat(GlEnum parameter);
MAYBE_EXTERN_C char* jsGlGetParameterString(void* arenaPntr, GlEnum parameter); MAYBE_EXTERN_C char* jsGlGetParameterString(Arena* arenaPntr, GlEnum parameter);
MAYBE_EXTERN_C void jsGlEnable(GlEnum capability); MAYBE_EXTERN_C void jsGlEnable(GlEnum capability);
MAYBE_EXTERN_C void jsGlDisable(GlEnum capability); MAYBE_EXTERN_C void jsGlDisable(GlEnum capability);
MAYBE_EXTERN_C void jsGlBlendFunc(GlEnum srcFactor, GlEnum dstFactor); MAYBE_EXTERN_C void jsGlBlendFunc(GlEnum srcFactor, GlEnum dstFactor);
@@ -44,12 +44,12 @@ MAYBE_EXTERN_C void jsGlShaderSource(GlId shaderId, int sourceLength, const char
MAYBE_EXTERN_C void jsGlCompileShader(GlId shaderId); MAYBE_EXTERN_C void jsGlCompileShader(GlId shaderId);
MAYBE_EXTERN_C bool jsGlGetShaderParameterBool(GlId shaderId, GlEnum parameter); MAYBE_EXTERN_C bool jsGlGetShaderParameterBool(GlId shaderId, GlEnum parameter);
MAYBE_EXTERN_C int jsGlGetShaderParameterInt(GlId shaderId, GlEnum parameter); MAYBE_EXTERN_C int jsGlGetShaderParameterInt(GlId shaderId, GlEnum parameter);
MAYBE_EXTERN_C char* jsGlGetShaderInfoLog(void* arenaPntr, GlId shaderId); MAYBE_EXTERN_C char* jsGlGetShaderInfoLog(Arena* arenaPntr, GlId shaderId);
MAYBE_EXTERN_C void jsGlDeleteProgram(GlId programId); MAYBE_EXTERN_C void jsGlDeleteProgram(GlId programId);
MAYBE_EXTERN_C GlId jsGlCreateProgram(); MAYBE_EXTERN_C GlId jsGlCreateProgram();
MAYBE_EXTERN_C void jsGlAttachShader(GlId programId, GlId shaderId); MAYBE_EXTERN_C void jsGlAttachShader(GlId programId, GlId shaderId);
MAYBE_EXTERN_C void jsGlLinkProgram(GlId programId); MAYBE_EXTERN_C void jsGlLinkProgram(GlId programId);
MAYBE_EXTERN_C char* jsGlGetProgramInfoLog(void* arenaPntr, GlId programId); MAYBE_EXTERN_C char* jsGlGetProgramInfoLog(Arena* arenaPntr, GlId programId);
MAYBE_EXTERN_C void jsGlUseProgram(GlId programId); MAYBE_EXTERN_C void jsGlUseProgram(GlId programId);
MAYBE_EXTERN_C bool jsGlGetProgramParameterBool(GlId programId, GlEnum parameter); MAYBE_EXTERN_C bool jsGlGetProgramParameterBool(GlId programId, GlEnum parameter);
MAYBE_EXTERN_C int jsGlGetProgramParameterInt(GlId programId, GlEnum parameter); MAYBE_EXTERN_C int jsGlGetProgramParameterInt(GlId programId, GlEnum parameter);
@@ -64,19 +64,19 @@ MAYBE_EXTERN_C void jsGlUniform2f(GlId locationId, r32 value0, r32 value1);
MAYBE_EXTERN_C void jsGlUniform3f(GlId locationId, r32 value0, r32 value1, r32 value2); MAYBE_EXTERN_C void jsGlUniform3f(GlId locationId, r32 value0, r32 value1, r32 value2);
MAYBE_EXTERN_C void jsGlUniform4f(GlId locationId, r32 value0, r32 value1, r32 value2, r32 value3); MAYBE_EXTERN_C void jsGlUniform4f(GlId locationId, r32 value0, r32 value1, r32 value2, r32 value3);
MAYBE_EXTERN_C void jsGlUniform1fv(GlId locationId, int valuesCount, const r32* valuesPntr); MAYBE_EXTERN_C void jsGlUniform1fv(GlId locationId, int valuesCount, const r32* valuesPntr);
MAYBE_EXTERN_C void jsGlUniform2fv(GlId locationId, int valuesCount, const r32* valuesPntr); //TODO: Change valuesPntr to v2* MAYBE_EXTERN_C void jsGlUniform2fv(GlId locationId, int valuesCount, const v2* valuesPntr);
MAYBE_EXTERN_C void jsGlUniform3fv(GlId locationId, int valuesCount, const r32* valuesPntr); //TODO: Change valuesPntr to v3* MAYBE_EXTERN_C void jsGlUniform3fv(GlId locationId, int valuesCount, const v3* valuesPntr);
MAYBE_EXTERN_C void jsGlUniform4fv(GlId locationId, int valuesCount, const r32* valuesPntr); //TODO: Change valuesPntr to v4* MAYBE_EXTERN_C void jsGlUniform4fv(GlId locationId, int valuesCount, const v4* valuesPntr);
MAYBE_EXTERN_C void jsGlUniform1i(GlId locationId, int value); MAYBE_EXTERN_C void jsGlUniform1i(GlId locationId, int value);
MAYBE_EXTERN_C void jsGlUniform2i(GlId locationId, int value0, int value1); MAYBE_EXTERN_C void jsGlUniform2i(GlId locationId, int value0, int value1);
MAYBE_EXTERN_C void jsGlUniform3i(GlId locationId, int value0, int value1, int value2); MAYBE_EXTERN_C void jsGlUniform3i(GlId locationId, int value0, int value1, int value2);
MAYBE_EXTERN_C void jsGlUniform4i(GlId locationId, int value0, int value1, int value2, int value3); MAYBE_EXTERN_C void jsGlUniform4i(GlId locationId, int value0, int value1, int value2, int value3);
MAYBE_EXTERN_C void jsGlUniform1iv(GlId locationId, int valuesCount, const int* valuesPntr); MAYBE_EXTERN_C void jsGlUniform1iv(GlId locationId, int valuesCount, const int* valuesPntr);
MAYBE_EXTERN_C void jsGlUniform2iv(GlId locationId, int valuesCount, const int* valuesPntr); //TODO: Change valuesPntr to v2i* MAYBE_EXTERN_C void jsGlUniform2iv(GlId locationId, int valuesCount, const v2i* valuesPntr);
MAYBE_EXTERN_C void jsGlUniform3iv(GlId locationId, int valuesCount, const int* valuesPntr); //TODO: Change valuesPntr to v3i* MAYBE_EXTERN_C void jsGlUniform3iv(GlId locationId, int valuesCount, const v3i* valuesPntr);
MAYBE_EXTERN_C void jsGlUniform4iv(GlId locationId, int valuesCount, const int* valuesPntr); //TODO: Change valuesPntr to v4i* MAYBE_EXTERN_C void jsGlUniform4iv(GlId locationId, int valuesCount, const v4i* valuesPntr);
MAYBE_EXTERN_C void jsGlUniformMatrix2fv(GlId locationId, const r32* valuesPntr); //TODO: Change valuesPntr to mat2* MAYBE_EXTERN_C void jsGlUniformMatrix2fv(GlId locationId, const mat2* valuesPntr);
MAYBE_EXTERN_C void jsGlUniformMatrix3fv(GlId locationId, const r32* valuesPntr); //TODO: Change valuesPntr to mat3* MAYBE_EXTERN_C void jsGlUniformMatrix3fv(GlId locationId, const mat3* valuesPntr);
MAYBE_EXTERN_C void jsGlUniformMatrix4fv(GlId locationId, const r32* valuesPntr); //TODO: Change valuesPntr to mat4* MAYBE_EXTERN_C void jsGlUniformMatrix4fv(GlId locationId, const mat4* valuesPntr);
#endif // _CWASM_WEBGL_JS_IMPORTS_H #endif // _CWASM_WEBGL_JS_IMPORTS_H

View File

@@ -187,8 +187,8 @@ WASM_EXPORT(App_Initialize) bool App_Initialize()
sizeof(testPixels), //dataLength sizeof(testPixels), //dataLength
&testPixels //dataPntr &testPixels //dataPntr
); );
jsGlTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); jsGlTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
jsGlTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); jsGlTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
jsGlTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); jsGlTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
jsGlTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); jsGlTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
jsGlGenerateMipmap(GL_TEXTURE_2D); jsGlGenerateMipmap(GL_TEXTURE_2D);
@@ -259,14 +259,9 @@ WASM_EXPORT(App_UpdateAndRender) bool App_UpdateAndRender(r64 programTimeR64)
jsGlActiveTexture(GL_TEXTURE0); jsGlActiveTexture(GL_TEXTURE0);
jsGlBindTexture(GL_TEXTURE_2D, app.testTexture); jsGlBindTexture(GL_TEXTURE_2D, app.testTexture);
r32 identityMatrix[] = { mat4 identityMatrix = Mat4_Identity;
1.0f, 0.0f, 0.0f, 0.0f, jsGlUniformMatrix4fv(app.viewMatrixLocation, &identityMatrix);
0.0f, 1.0f, 0.0f, 0.0f, jsGlUniformMatrix4fv(app.projMatrixLocation, &identityMatrix);
0.0f, 0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f,
};
jsGlUniformMatrix4fv(app.viewMatrixLocation, &identityMatrix[0]);
jsGlUniformMatrix4fv(app.projMatrixLocation, &identityMatrix[0]);
#if 0 #if 0
const u64 numTris = 75; const u64 numTris = 75;
@@ -295,17 +290,23 @@ WASM_EXPORT(App_UpdateAndRender) bool App_UpdateAndRender(r64 programTimeR64)
#endif #endif
{ {
r32 offsetX = 0.0f; r32 offsetX = -0.4f;
r32 offsetY = 0.0f; r32 offsetY = -0.4f;
r32 scaleX = 1.0f; r32 scaleX = 0.8f;
r32 scaleY = 1.0f; r32 scaleY = 0.8f;
r32 worldMatrix[] = { #if 1
mat4 worldMatrix = Mat4_Identity_Const;
worldMatrix = MulMat4(MakeScaleMat4(scaleX, scaleY, 1.0f), worldMatrix);
worldMatrix = MulMat4(MakeTranslateMat4(offsetX, offsetY, 0.0f), worldMatrix);
#else
mat4 worldMatrix = NewMat4_Const(
scaleX, 0.0f, 0.0f, offsetX, scaleX, 0.0f, 0.0f, offsetX,
0.0f, scaleY, 0.0f, offsetY, 0.0f, scaleY, 0.0f, offsetY,
0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f
}; );
jsGlUniformMatrix4fv(app.worldMatrixLocation, &worldMatrix[0]); #endif
jsGlUniformMatrix4fv(app.worldMatrixLocation, &worldMatrix);
jsGlDrawArrays(GL_TRIANGLES, 0, 6); jsGlDrawArrays(GL_TRIANGLES, 0, 6);
} }