make the imgui window not be focused by default and put math_graphics into a namespace
This commit is contained in:
parent
a872bede2c
commit
095f94b098
@ -2,6 +2,7 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <SDL3/SDL.h>
|
#include <SDL3/SDL.h>
|
||||||
#include <imgui.h>
|
#include <imgui.h>
|
||||||
|
#include <imgui_internal.h>
|
||||||
#include <imgui_impl_sdl3.h>
|
#include <imgui_impl_sdl3.h>
|
||||||
#include <imgui_impl_sdlgpu3.h>
|
#include <imgui_impl_sdlgpu3.h>
|
||||||
|
|
||||||
@ -14,6 +15,8 @@
|
|||||||
#include "../assets/shader/basic_vertex_shader.h"
|
#include "../assets/shader/basic_vertex_shader.h"
|
||||||
#include "../assets/shader/basic_pixel_shader.h"
|
#include "../assets/shader/basic_pixel_shader.h"
|
||||||
|
|
||||||
|
using namespace M;
|
||||||
|
|
||||||
SDL_GPUDevice *device;
|
SDL_GPUDevice *device;
|
||||||
SDL_Window *window;
|
SDL_Window *window;
|
||||||
|
|
||||||
@ -750,6 +753,7 @@ int main(int argc, char **argv) {
|
|||||||
ImGui_ImplSDLGPU3_Init(&imgui_init_info);
|
ImGui_ImplSDLGPU3_Init(&imgui_init_info);
|
||||||
|
|
||||||
bool show_demo_window = true;
|
bool show_demo_window = true;
|
||||||
|
bool first_frame = true;
|
||||||
|
|
||||||
// MSG Message;
|
// MSG Message;
|
||||||
while (Running) {
|
while (Running) {
|
||||||
@ -760,6 +764,11 @@ int main(int argc, char **argv) {
|
|||||||
if (show_demo_window)
|
if (show_demo_window)
|
||||||
ImGui::ShowDemoWindow(&show_demo_window);
|
ImGui::ShowDemoWindow(&show_demo_window);
|
||||||
|
|
||||||
|
if (first_frame) {
|
||||||
|
ImGui::SetWindowFocus(NULL);
|
||||||
|
first_frame = false;
|
||||||
|
}
|
||||||
|
|
||||||
SDL_GPUCommandBuffer *command_buffer = SDL_AcquireGPUCommandBuffer(device);
|
SDL_GPUCommandBuffer *command_buffer = SDL_AcquireGPUCommandBuffer(device);
|
||||||
if (!command_buffer) {
|
if (!command_buffer) {
|
||||||
log_error("Failed to acquire gpu command buffer (%s). Exiting.", SDL_GetError());
|
log_error("Failed to acquire gpu command buffer (%s). Exiting.", SDL_GetError());
|
||||||
|
|||||||
@ -11,82 +11,83 @@
|
|||||||
#undef min
|
#undef min
|
||||||
#undef max
|
#undef max
|
||||||
|
|
||||||
//clamp
|
namespace M {
|
||||||
constexpr inline float clamp(float min, float a, float max) {
|
//clamp
|
||||||
|
constexpr inline float clamp(float min, float a, float max) {
|
||||||
float result = a;
|
float result = a;
|
||||||
if (a < min)
|
if (a < min)
|
||||||
result = min;
|
result = min;
|
||||||
if (a > max)
|
if (a > max)
|
||||||
result = max;
|
result = max;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
//clamp für 0-1 Bereich (Grafik)
|
//clamp für 0-1 Bereich (Grafik)
|
||||||
constexpr inline float clamp01(float a) {
|
constexpr inline float clamp01(float a) {
|
||||||
return clamp(0, a, 1);
|
return clamp(0, a, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
//clamp für Integer
|
//clamp für Integer
|
||||||
constexpr inline int64_t clamp(int64_t min, int64_t a, int64_t max) {
|
constexpr inline int64_t clamp(int64_t min, int64_t a, int64_t max) {
|
||||||
int64_t result = a;
|
int64_t result = a;
|
||||||
if (a < min)
|
if (a < min)
|
||||||
result = min;
|
result = min;
|
||||||
if (a > max)
|
if (a > max)
|
||||||
result = max;
|
result = max;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
//wurzelberechnung
|
//wurzelberechnung
|
||||||
inline float square_root(float a) {
|
inline float square_root(float a) {
|
||||||
return _mm_cvtss_f32(_mm_sqrt_ss(_mm_set_ss(a)));
|
return _mm_cvtss_f32(_mm_sqrt_ss(_mm_set_ss(a)));
|
||||||
}
|
}
|
||||||
|
|
||||||
inline float reciprocal_square_root(float a) {
|
inline float reciprocal_square_root(float a) {
|
||||||
return _mm_cvtss_f32(_mm_rsqrt_ss(_mm_set_ss(a)));
|
return _mm_cvtss_f32(_mm_rsqrt_ss(_mm_set_ss(a)));
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr inline float min(float a, float b) {
|
constexpr inline float min(float a, float b) {
|
||||||
return a < b ? a : b;
|
return a < b ? a : b;
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr inline float max(float a, float b) {
|
constexpr inline float max(float a, float b) {
|
||||||
return a > b ? a : b;
|
return a > b ? a : b;
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr inline double min(double a, double b) {
|
constexpr inline double min(double a, double b) {
|
||||||
return a < b ? a : b;
|
return a < b ? a : b;
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr inline double max(double a, double b) {
|
constexpr inline double max(double a, double b) {
|
||||||
return a > b ? a : b;
|
return a > b ? a : b;
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr inline int64_t min(int64_t a, int64_t b) {
|
constexpr inline int64_t min(int64_t a, int64_t b) {
|
||||||
return a < b ? a : b;
|
return a < b ? a : b;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr inline T min(T a, T b) {
|
constexpr inline T min(T a, T b) {
|
||||||
return a < b ? a : b;
|
return a < b ? a : b;
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr float lerp(float a, float b, float t) {
|
constexpr float lerp(float a, float b, float t) {
|
||||||
return (1.0f - t) * a + t * b;
|
return (1.0f - t) * a + t * b;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline float ilerp(float a, float b, float v) {
|
inline float ilerp(float a, float b, float v) {
|
||||||
return (v - a) / (b - a);
|
return (v - a) / (b - a);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline float remap(float in_a, float in_b, float out_a, float out_b, float v) {
|
inline float remap(float in_a, float in_b, float out_a, float out_b, float v) {
|
||||||
float t = ilerp(in_a, in_b, v);
|
float t = ilerp(in_a, in_b, v);
|
||||||
return lerp(out_a, out_b, t);
|
return lerp(out_a, out_b, t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------
|
//-----------------------------------------------
|
||||||
//Vektorberechnung 2-dim
|
//Vektorberechnung 2-dim
|
||||||
union V2 {
|
union V2 {
|
||||||
struct {
|
struct {
|
||||||
float x;
|
float x;
|
||||||
float y;
|
float y;
|
||||||
@ -110,191 +111,191 @@ union V2 {
|
|||||||
assert(index < 2);
|
assert(index < 2);
|
||||||
return E[index];
|
return E[index];
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
//Negation von 2-dim Vektor
|
//Negation von 2-dim Vektor
|
||||||
inline V2 operator -(V2 a) {
|
inline V2 operator -(V2 a) {
|
||||||
return {
|
return {
|
||||||
-a.x,
|
-a.x,
|
||||||
-a.y
|
-a.y
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
//Addition 2er 2-dim Vektoren
|
//Addition 2er 2-dim Vektoren
|
||||||
inline V2 operator +(V2 a, V2 b) {
|
inline V2 operator +(V2 a, V2 b) {
|
||||||
return {
|
return {
|
||||||
a.x + b.x,
|
a.x + b.x,
|
||||||
a.y + b.y
|
a.y + b.y
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
//Vektor Addition
|
//Vektor Addition
|
||||||
inline V2 operator +=(V2& a, V2 b) {
|
inline V2 operator +=(V2& a, V2 b) {
|
||||||
return a = a + b;
|
return a = a + b;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Subtraktion 2er 2-dim Vektoren
|
//Subtraktion 2er 2-dim Vektoren
|
||||||
inline V2 operator -(V2 a, V2 b) {
|
inline V2 operator -(V2 a, V2 b) {
|
||||||
return {
|
return {
|
||||||
a.x - b.x,
|
a.x - b.x,
|
||||||
a.y - b.y
|
a.y - b.y
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
//Vektor Subtraktion
|
//Vektor Subtraktion
|
||||||
inline V2 operator -=(V2& a, V2 b) {
|
inline V2 operator -=(V2& a, V2 b) {
|
||||||
return a = a - b;
|
return a = a - b;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Skalarmultiplikation -> erst Skalar, dann Vektor
|
//Skalarmultiplikation -> erst Skalar, dann Vektor
|
||||||
inline V2 operator *(float a, V2 b) {
|
inline V2 operator *(float a, V2 b) {
|
||||||
return {
|
return {
|
||||||
a * b.x,
|
a * b.x,
|
||||||
a * b.y
|
a * b.y
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
//Skalarmultiplikation -> erst Vektor, dann Skalar
|
//Skalarmultiplikation -> erst Vektor, dann Skalar
|
||||||
inline V2 operator *(V2 a, float b) {
|
inline V2 operator *(V2 a, float b) {
|
||||||
return {
|
return {
|
||||||
a.x * b,
|
a.x * b,
|
||||||
a.y * b
|
a.y * b
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
//Skalarmultiplikation -> mit V2 Pointer
|
//Skalarmultiplikation -> mit V2 Pointer
|
||||||
inline V2 &operator *= (V2 &a, float b) {
|
inline V2 &operator *= (V2 &a, float b) {
|
||||||
a = a * b;
|
a = a * b;
|
||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Division mit einem Skalar Oo -> Skalar geteilt durch Vektor
|
//Division mit einem Skalar Oo -> Skalar geteilt durch Vektor
|
||||||
inline V2 operator /(float a, V2 b) {
|
inline V2 operator /(float a, V2 b) {
|
||||||
return {
|
return {
|
||||||
a / b.x,
|
a / b.x,
|
||||||
a / b.y
|
a / b.y
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
//Division mit einem Skalar Oo -> Vektor geteilt durch Skalar
|
//Division mit einem Skalar Oo -> Vektor geteilt durch Skalar
|
||||||
inline V2 operator /(V2 a, float b) {
|
inline V2 operator /(V2 a, float b) {
|
||||||
return {
|
return {
|
||||||
a.x / b,
|
a.x / b,
|
||||||
a.y / b
|
a.y / b
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
//Division mit einem Skalar -> 2 Vektoren
|
//Division mit einem Skalar -> 2 Vektoren
|
||||||
inline V2 operator /(V2 a, V2 b) {
|
inline V2 operator /(V2 a, V2 b) {
|
||||||
return {
|
return {
|
||||||
a.x / b.x,
|
a.x / b.x,
|
||||||
a.y / b.y
|
a.y / b.y
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
//Division mit einem Skalar -> mit V2 Pointer
|
//Division mit einem Skalar -> mit V2 Pointer
|
||||||
inline V2 &operator /= (V2 &a, float b) {
|
inline V2 &operator /= (V2 &a, float b) {
|
||||||
a = a / b;
|
a = a / b;
|
||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Skalarprodukt
|
//Skalarprodukt
|
||||||
inline float dot(V2 a, V2 b) {
|
inline float dot(V2 a, V2 b) {
|
||||||
return a.x * b.x + a.y * b.y;
|
return a.x * b.x + a.y * b.y;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Hadamard-Produkt
|
//Hadamard-Produkt
|
||||||
inline V2 hadamard(V2 a, V2 b) {
|
inline V2 hadamard(V2 a, V2 b) {
|
||||||
return {
|
return {
|
||||||
a.x * b.x,
|
a.x * b.x,
|
||||||
a.y * b.y
|
a.y * b.y
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
//Betrag des Vektors quadrieren
|
//Betrag des Vektors quadrieren
|
||||||
inline float length_squared(V2 a) {
|
inline float length_squared(V2 a) {
|
||||||
return dot(a, a);
|
return dot(a, a);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Betrag eines Vektors
|
//Betrag eines Vektors
|
||||||
inline float length(V2 a) {
|
inline float length(V2 a) {
|
||||||
return square_root(length_squared(a));
|
return square_root(length_squared(a));
|
||||||
}
|
}
|
||||||
|
|
||||||
//Reziproke der Länge
|
//Reziproke der Länge
|
||||||
inline float reciprocal_length(V2 a) {
|
inline float reciprocal_length(V2 a) {
|
||||||
return reciprocal_square_root(length_squared(a));
|
return reciprocal_square_root(length_squared(a));
|
||||||
}
|
}
|
||||||
|
|
||||||
//Einheitsvektor
|
//Einheitsvektor
|
||||||
inline V2 normalize(V2 a) {
|
inline V2 normalize(V2 a) {
|
||||||
return a * reciprocal_length(a);
|
return a * reciprocal_length(a);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Vektor der 90
|
//Vektor der 90
|
||||||
inline V2 perp(V2 a) {
|
inline V2 perp(V2 a) {
|
||||||
return {
|
return {
|
||||||
-a.y,
|
-a.y,
|
||||||
a.x
|
a.x
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
//clamp für 2-dim Vektor
|
//clamp für 2-dim Vektor
|
||||||
inline V2 clamp01(V2 a) {
|
inline V2 clamp01(V2 a) {
|
||||||
return {
|
return {
|
||||||
clamp01(a.x),
|
clamp01(a.x),
|
||||||
clamp01(a.y)
|
clamp01(a.y)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
//Vektor mit den kleinsten Werten 2er Vektoren
|
//Vektor mit den kleinsten Werten 2er Vektoren
|
||||||
inline V2 min(V2 a, V2 b) {
|
inline V2 min(V2 a, V2 b) {
|
||||||
return {
|
return {
|
||||||
min(a.x, b.x),
|
min(a.x, b.x),
|
||||||
min(a.y, b.y),
|
min(a.y, b.y),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
//Vektor mit den groessten Werten 2er Vektoren
|
//Vektor mit den groessten Werten 2er Vektoren
|
||||||
inline V2 max(V2 a, V2 b) {
|
inline V2 max(V2 a, V2 b) {
|
||||||
return {
|
return {
|
||||||
max(a.x, b.x),
|
max(a.x, b.x),
|
||||||
max(a.y, b.y),
|
max(a.y, b.y),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
//kleinster Vektor Wert
|
//kleinster Vektor Wert
|
||||||
inline float min(V2 a) {
|
inline float min(V2 a) {
|
||||||
return min(a.x, a.y);
|
return min(a.x, a.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
//groesster Vektor Wert
|
//groesster Vektor Wert
|
||||||
inline float max(V2 a) {
|
inline float max(V2 a) {
|
||||||
return max(a.x, a.y);
|
return max(a.x, a.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Lerp mit 2 Vektoren
|
//Lerp mit 2 Vektoren
|
||||||
inline V2 lerp(V2 a, V2 b, V2 t) {
|
inline V2 lerp(V2 a, V2 b, V2 t) {
|
||||||
return V2{
|
return V2{
|
||||||
lerp(a.x, b.x, t.x),
|
lerp(a.x, b.x, t.x),
|
||||||
lerp(a.y, b.y, t.y),
|
lerp(a.y, b.y, t.y),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
inline V2 ilerp(V2 a, V2 b, V2 v) {
|
inline V2 ilerp(V2 a, V2 b, V2 v) {
|
||||||
return (v - a) / (b - a);
|
return (v - a) / (b - a);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
inline V2 remap(V2 in_a, V2 in_b, V2 out_a, V2 out_b, V2 v) {
|
inline V2 remap(V2 in_a, V2 in_b, V2 out_a, V2 out_b, V2 v) {
|
||||||
V2 t = ilerp(in_a, in_b, v);
|
V2 t = ilerp(in_a, in_b, v);
|
||||||
return lerp(out_a, out_b, t);
|
return lerp(out_a, out_b, t);
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------
|
//-----------------------------------------------
|
||||||
//Vektorberechnung 3-dim
|
//Vektorberechnung 3-dim
|
||||||
union V3 {
|
union V3 {
|
||||||
struct {
|
struct {
|
||||||
float x;
|
float x;
|
||||||
float y;
|
float y;
|
||||||
@ -335,117 +336,117 @@ union V3 {
|
|||||||
assert(index < 3);
|
assert(index < 3);
|
||||||
return E[index];
|
return E[index];
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
//Negation von 2-dim Vektor
|
//Negation von 2-dim Vektor
|
||||||
inline V3 operator -(V3 a) {
|
inline V3 operator -(V3 a) {
|
||||||
return {
|
return {
|
||||||
-a.x,
|
-a.x,
|
||||||
-a.y,
|
-a.y,
|
||||||
-a.z
|
-a.z
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
//Addition 2er 2-dim Vektoren
|
//Addition 2er 2-dim Vektoren
|
||||||
inline V3 operator +(V3 a, V3 b) {
|
inline V3 operator +(V3 a, V3 b) {
|
||||||
return {
|
return {
|
||||||
a.x + b.x,
|
a.x + b.x,
|
||||||
a.y + b.y,
|
a.y + b.y,
|
||||||
a.z + b.z
|
a.z + b.z
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
//Subtraktion 2er 2-dim Vektoren
|
//Subtraktion 2er 2-dim Vektoren
|
||||||
inline V3 operator -(V3 a, V3 b) {
|
inline V3 operator -(V3 a, V3 b) {
|
||||||
return {
|
return {
|
||||||
a.x - b.x,
|
a.x - b.x,
|
||||||
a.y - b.y,
|
a.y - b.y,
|
||||||
a.z - b.z
|
a.z - b.z
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
//Skalarmultiplikation -> erst Skalar, dann Vektor
|
//Skalarmultiplikation -> erst Skalar, dann Vektor
|
||||||
inline V3 operator *(float a, V3 b) {
|
inline V3 operator *(float a, V3 b) {
|
||||||
return {
|
return {
|
||||||
a * b.x,
|
a * b.x,
|
||||||
a * b.y,
|
a * b.y,
|
||||||
a * b.z
|
a * b.z
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//Skalarmultiplikation -> erst Vektor, dann Skalar
|
//Skalarmultiplikation -> erst Vektor, dann Skalar
|
||||||
inline V3 operator *(V3 a, float b) {
|
inline V3 operator *(V3 a, float b) {
|
||||||
return {
|
return {
|
||||||
a.x * b,
|
a.x * b,
|
||||||
a.y * b,
|
a.y * b,
|
||||||
a.z * b
|
a.z * b
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//Division mit nem Skalar Oo -> Skalar geteilt durch Vektor
|
//Division mit nem Skalar Oo -> Skalar geteilt durch Vektor
|
||||||
inline V3 operator /(float a, V3 b) {
|
inline V3 operator /(float a, V3 b) {
|
||||||
return {
|
return {
|
||||||
a / b.x,
|
a / b.x,
|
||||||
a / b.y,
|
a / b.y,
|
||||||
a / b.z
|
a / b.z
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
//Division mit nem Skalar Oo -> Vektor geteilt durch Skalar
|
//Division mit nem Skalar Oo -> Vektor geteilt durch Skalar
|
||||||
inline V3 operator /(V3 a, float b) {
|
inline V3 operator /(V3 a, float b) {
|
||||||
return {
|
return {
|
||||||
a.x / b,
|
a.x / b,
|
||||||
a.y / b,
|
a.y / b,
|
||||||
a.z / b
|
a.z / b
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
//Skalarprodukt
|
//Skalarprodukt
|
||||||
inline float dot(V3 a, V3 b) {
|
inline float dot(V3 a, V3 b) {
|
||||||
return a.x * b.x + a.y * b.y + a.z * b.z;
|
return a.x * b.x + a.y * b.y + a.z * b.z;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Hadamard-Produkt
|
//Hadamard-Produkt
|
||||||
inline V3 hadamard(V3 a, V3 b) {
|
inline V3 hadamard(V3 a, V3 b) {
|
||||||
return {
|
return {
|
||||||
a.x * b.x,
|
a.x * b.x,
|
||||||
a.y * b.y,
|
a.y * b.y,
|
||||||
a.z * b.z
|
a.z * b.z
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
//Kreuzprodukt
|
//Kreuzprodukt
|
||||||
inline V3 cross(V3 a, V3 b) {
|
inline V3 cross(V3 a, V3 b) {
|
||||||
return {
|
return {
|
||||||
a.y * b.z - a.z * b.y,
|
a.y * b.z - a.z * b.y,
|
||||||
a.z * b.x - a.x * b.z,
|
a.z * b.x - a.x * b.z,
|
||||||
a.x * b.y - a.y * b.x
|
a.x * b.y - a.y * b.x
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
//Betrag des Vektors quadrieren
|
//Betrag des Vektors quadrieren
|
||||||
inline float length_squared(V3 a) {
|
inline float length_squared(V3 a) {
|
||||||
return dot(a, a);
|
return dot(a, a);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Betrag eines Vektors
|
//Betrag eines Vektors
|
||||||
inline float length(V3 a) {
|
inline float length(V3 a) {
|
||||||
return square_root(length_squared(a));
|
return square_root(length_squared(a));
|
||||||
}
|
}
|
||||||
|
|
||||||
//Reziproke der Länge
|
//Reziproke der Länge
|
||||||
inline float reciprocal_length(V3 a) {
|
inline float reciprocal_length(V3 a) {
|
||||||
return reciprocal_square_root(length_squared(a));
|
return reciprocal_square_root(length_squared(a));
|
||||||
}
|
}
|
||||||
|
|
||||||
//Einheitsvektor
|
//Einheitsvektor
|
||||||
inline V3 normalize(V3 a) {
|
inline V3 normalize(V3 a) {
|
||||||
return a * reciprocal_length(a);
|
return a * reciprocal_length(a);
|
||||||
}
|
}
|
||||||
|
|
||||||
union V4 {
|
union V4 {
|
||||||
struct {
|
struct {
|
||||||
float x;
|
float x;
|
||||||
float y;
|
float y;
|
||||||
@ -501,18 +502,18 @@ union V4 {
|
|||||||
assert(index < 4);
|
assert(index < 4);
|
||||||
return E[index];
|
return E[index];
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------
|
//-----------------------------------------------
|
||||||
//2x2 Matrix
|
//2x2 Matrix
|
||||||
|
|
||||||
//M2x2 m;
|
//M2x2 m;
|
||||||
//m.E[0][1]
|
//m.E[0][1]
|
||||||
//m.V[1]
|
//m.V[1]
|
||||||
|
|
||||||
//m[1][0]
|
//m[1][0]
|
||||||
union M2x2 {
|
union M2x2 {
|
||||||
struct {
|
struct {
|
||||||
float x1; float x2;
|
float x1; float x2;
|
||||||
float y1; float y2;
|
float y1; float y2;
|
||||||
@ -530,84 +531,84 @@ union M2x2 {
|
|||||||
assert(index < 2);
|
assert(index < 2);
|
||||||
return V[index];
|
return V[index];
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
//Matrix negieren
|
//Matrix negieren
|
||||||
inline M2x2 operator -(M2x2 a){
|
inline M2x2 operator -(M2x2 a){
|
||||||
return {
|
return {
|
||||||
-a[0][0], -a[0][1],
|
-a[0][0], -a[0][1],
|
||||||
-a[1][0], -a[1][1]
|
-a[1][0], -a[1][1]
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
//Matrix Addition
|
//Matrix Addition
|
||||||
inline M2x2 operator +(M2x2 a, M2x2 b) {
|
inline M2x2 operator +(M2x2 a, M2x2 b) {
|
||||||
return {
|
return {
|
||||||
a[0][0] + b[0][0], a[0][1] + b[0][1],
|
a[0][0] + b[0][0], a[0][1] + b[0][1],
|
||||||
a[1][0] + b[1][0], a[1][1] + b[1][1]
|
a[1][0] + b[1][0], a[1][1] + b[1][1]
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
//Matrix Subtraktion
|
//Matrix Subtraktion
|
||||||
inline M2x2 operator -(M2x2 a, M2x2 b) {
|
inline M2x2 operator -(M2x2 a, M2x2 b) {
|
||||||
return {
|
return {
|
||||||
a[0][0] - b[0][0], a[0][1] - b[0][1],
|
a[0][0] - b[0][0], a[0][1] - b[0][1],
|
||||||
a[1][0] - b[1][0], a[1][1] - b[1][1]
|
a[1][0] - b[1][0], a[1][1] - b[1][1]
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
//Matrix Skalarmultiplikation
|
//Matrix Skalarmultiplikation
|
||||||
inline M2x2 operator *(M2x2 a, float b) {
|
inline M2x2 operator *(M2x2 a, float b) {
|
||||||
return {
|
return {
|
||||||
a[0][0] * b, a[0][1] * b,
|
a[0][0] * b, a[0][1] * b,
|
||||||
a[1][0] * b, a[1][1] * b
|
a[1][0] * b, a[1][1] * b
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
//Matrix Skalarmultiplikation
|
//Matrix Skalarmultiplikation
|
||||||
inline M2x2 operator *(float a, M2x2 b) {
|
inline M2x2 operator *(float a, M2x2 b) {
|
||||||
return {
|
return {
|
||||||
a * b[0][0], a * b[0][1],
|
a * b[0][0], a * b[0][1],
|
||||||
a * b[1][0], a * b[1][1]
|
a * b[1][0], a * b[1][1]
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
//Matrix Multiplikation
|
//Matrix Multiplikation
|
||||||
inline M2x2 operator *(M2x2 a, M2x2 b) {
|
inline M2x2 operator *(M2x2 a, M2x2 b) {
|
||||||
return {
|
return {
|
||||||
a[0][0] * b[0][0] + a[0][1] * b[1][0], a[0][0] * b[0][1] + a[0][1] * b[1][1],
|
a[0][0] * b[0][0] + a[0][1] * b[1][0], a[0][0] * b[0][1] + a[0][1] * b[1][1],
|
||||||
a[1][0] * b[0][0] + a[1][1] * b[1][0], a[1][0] * b[0][1] + a[1][1] * b[1][1]
|
a[1][0] * b[0][0] + a[1][1] * b[1][0], a[1][0] * b[0][1] + a[1][1] * b[1][1]
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
//Matrix * Vektor
|
//Matrix * Vektor
|
||||||
inline V2 operator *(M2x2 a, V2 b) {
|
inline V2 operator *(M2x2 a, V2 b) {
|
||||||
return {
|
return {
|
||||||
a[0][0] * b[0] + a[0][1] * b[1],
|
a[0][0] * b[0] + a[0][1] * b[1],
|
||||||
a[1][0] * b[0] + a[1][1] * b[1],
|
a[1][0] * b[0] + a[1][1] * b[1],
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
//Matrix Transponieren
|
//Matrix Transponieren
|
||||||
inline M2x2 transpose(M2x2 a) {
|
inline M2x2 transpose(M2x2 a) {
|
||||||
return {
|
return {
|
||||||
a[0][0], a[1][0],
|
a[0][0], a[1][0],
|
||||||
a[0][1], a[1][1]
|
a[0][1], a[1][1]
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
//Einheitsmatrix (oder Identitätsmatrix)
|
//Einheitsmatrix (oder Identitätsmatrix)
|
||||||
constexpr inline M2x2 identityM2x2() {
|
constexpr inline M2x2 identityM2x2() {
|
||||||
return {
|
return {
|
||||||
1.0f, 0.0f,
|
1.0f, 0.0f,
|
||||||
0.0f, 1.0f
|
0.0f, 1.0f
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------
|
//-----------------------------------------------
|
||||||
//3x3 Matrix
|
//3x3 Matrix
|
||||||
union M3x3 {
|
union M3x3 {
|
||||||
struct {
|
struct {
|
||||||
float x1; float x2; float x3;
|
float x1; float x2; float x3;
|
||||||
float y1; float y2; float y3;
|
float y1; float y2; float y3;
|
||||||
@ -628,145 +629,146 @@ union M3x3 {
|
|||||||
return V[index];
|
return V[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
//Matrix negieren
|
//Matrix negieren
|
||||||
inline M3x3 operator -(M3x3 a) {
|
inline M3x3 operator -(M3x3 a) {
|
||||||
return {
|
return {
|
||||||
-a[0][0], -a[0][1], -a[0][1],
|
-a[0][0], -a[0][1], -a[0][1],
|
||||||
-a[1][0], -a[1][1], -a[1][2],
|
-a[1][0], -a[1][1], -a[1][2],
|
||||||
-a[2][0], -a[2][1], -a[2][2]
|
-a[2][0], -a[2][1], -a[2][2]
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
//Matrix Addition
|
//Matrix Addition
|
||||||
inline M3x3 operator +(M3x3 a, M3x3 b) {
|
inline M3x3 operator +(M3x3 a, M3x3 b) {
|
||||||
return {
|
return {
|
||||||
a[0][0] + b[0][0], a[0][1] + b[0][1], a[0][2] + b[0][2],
|
a[0][0] + b[0][0], a[0][1] + b[0][1], a[0][2] + b[0][2],
|
||||||
a[1][0] + b[1][0], a[1][1] + b[1][1], a[1][2] + b[1][2],
|
a[1][0] + b[1][0], a[1][1] + b[1][1], a[1][2] + b[1][2],
|
||||||
a[2][0] + b[2][0], a[2][1] + b[2][1], a[2][2] + b[2][2]
|
a[2][0] + b[2][0], a[2][1] + b[2][1], a[2][2] + b[2][2]
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
//Matrix Subtraktion
|
//Matrix Subtraktion
|
||||||
inline M3x3 operator -(M3x3 a, M3x3 b) {
|
inline M3x3 operator -(M3x3 a, M3x3 b) {
|
||||||
return {
|
return {
|
||||||
a[0][0] - b[0][0], a[0][1] - b[0][1], a[0][2] - b[0][2],
|
a[0][0] - b[0][0], a[0][1] - b[0][1], a[0][2] - b[0][2],
|
||||||
a[1][0] - b[1][0], a[1][1] - b[1][1], a[1][2] - b[1][2],
|
a[1][0] - b[1][0], a[1][1] - b[1][1], a[1][2] - b[1][2],
|
||||||
a[2][0] - b[2][0], a[2][1] - b[2][1], a[2][2] - b[2][2]
|
a[2][0] - b[2][0], a[2][1] - b[2][1], a[2][2] - b[2][2]
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
//Matrix Skalarmultiplikation
|
//Matrix Skalarmultiplikation
|
||||||
inline M3x3 operator *(M3x3 a, float b) {
|
inline M3x3 operator *(M3x3 a, float b) {
|
||||||
return {
|
return {
|
||||||
a[0][0] * b, a[0][1] * b, a[0][2] * b,
|
a[0][0] * b, a[0][1] * b, a[0][2] * b,
|
||||||
a[1][0] * b, a[1][1] * b, a[1][2] * b,
|
a[1][0] * b, a[1][1] * b, a[1][2] * b,
|
||||||
a[2][0] * b, a[2][1] * b, a[2][2] * b
|
a[2][0] * b, a[2][1] * b, a[2][2] * b
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
//Matrix Skalarmultiplikation
|
//Matrix Skalarmultiplikation
|
||||||
inline M3x3 operator *(float a, M3x3 b) {
|
inline M3x3 operator *(float a, M3x3 b) {
|
||||||
return {
|
return {
|
||||||
a * b[0][0], a * b[0][1], a * b[0][2],
|
a * b[0][0], a * b[0][1], a * b[0][2],
|
||||||
a * b[1][0], a * b[1][1], a * b[1][2],
|
a * b[1][0], a * b[1][1], a * b[1][2],
|
||||||
a * b[2][0], a * b[2][1], a * b[2][2]
|
a * b[2][0], a * b[2][1], a * b[2][2]
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
//Matrix Multiplikation
|
//Matrix Multiplikation
|
||||||
inline M3x3 operator *(M3x3 a, M3x3 b) {
|
inline M3x3 operator *(M3x3 a, M3x3 b) {
|
||||||
return {
|
return {
|
||||||
a[0][0] * b[0][0] + a[0][1] * b[1][0] + a[0][2] * b[2][0], a[0][0] * b[0][1] + a[0][1] * b[1][1] + a[0][2] * b[2][1], a[0][0] * b[0][2] + a[0][1] * b[1][2] + a[0][2] * b[2][2],
|
a[0][0] * b[0][0] + a[0][1] * b[1][0] + a[0][2] * b[2][0], a[0][0] * b[0][1] + a[0][1] * b[1][1] + a[0][2] * b[2][1], a[0][0] * b[0][2] + a[0][1] * b[1][2] + a[0][2] * b[2][2],
|
||||||
a[1][0] * b[0][0] + a[1][1] * b[1][0] + a[1][2] * b[2][0], a[1][0] * b[0][1] + a[1][1] * b[1][1] + a[1][2] * b[2][1], a[1][0] * b[0][2] + a[1][1] * b[1][2] + a[0][2] * b[2][2],
|
a[1][0] * b[0][0] + a[1][1] * b[1][0] + a[1][2] * b[2][0], a[1][0] * b[0][1] + a[1][1] * b[1][1] + a[1][2] * b[2][1], a[1][0] * b[0][2] + a[1][1] * b[1][2] + a[0][2] * b[2][2],
|
||||||
a[2][0] * b[0][0] + a[2][1] * b[1][0] + a[2][2] * b[2][0], a[2][0] * b[0][1] + a[2][1] * b[1][1] + a[2][2] * b[2][1], a[2][0] * b[0][2] + a[2][1] * b[1][2] + a[0][2] * b[2][2]
|
a[2][0] * b[0][0] + a[2][1] * b[1][0] + a[2][2] * b[2][0], a[2][0] * b[0][1] + a[2][1] * b[1][1] + a[2][2] * b[2][1], a[2][0] * b[0][2] + a[2][1] * b[1][2] + a[0][2] * b[2][2]
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
//Matrix * V2
|
//Matrix * V2
|
||||||
inline V2 operator *(M3x3 a, V2 b) {
|
inline V2 operator *(M3x3 a, V2 b) {
|
||||||
return {
|
return {
|
||||||
b.x * a[0][0] + b.y * a[0][1] + 1.0f * a[0][2],
|
b.x * a[0][0] + b.y * a[0][1] + 1.0f * a[0][2],
|
||||||
b.x * a[1][0] + b.y * a[1][1] + 1.0f * a[1][2],
|
b.x * a[1][0] + b.y * a[1][1] + 1.0f * a[1][2],
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
//Matrix * V3
|
//Matrix * V3
|
||||||
inline V3 operator *(M3x3 a, V3 b) {
|
inline V3 operator *(M3x3 a, V3 b) {
|
||||||
return {
|
return {
|
||||||
b.x * a[0][0] + b.y * a[0][1] + b.z * a[0][2],
|
b.x * a[0][0] + b.y * a[0][1] + b.z * a[0][2],
|
||||||
b.x * a[1][0] + b.y * a[1][1] + b.z * a[1][2],
|
b.x * a[1][0] + b.y * a[1][1] + b.z * a[1][2],
|
||||||
b.x * a[2][0] + b.y * a[2][1] + b.z * a[2][2]
|
b.x * a[2][0] + b.y * a[2][1] + b.z * a[2][2]
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//Matrix transponieren
|
//Matrix transponieren
|
||||||
inline M3x3 transpose(M3x3 a) {
|
inline M3x3 transpose(M3x3 a) {
|
||||||
return {
|
return {
|
||||||
a[0][0], a[1][0], a[2][0],
|
a[0][0], a[1][0], a[2][0],
|
||||||
a[0][1], a[1][1], a[2][1],
|
a[0][1], a[1][1], a[2][1],
|
||||||
a[0][2], a[1][2], a[2][2]
|
a[0][2], a[1][2], a[2][2]
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
//Einheitsmatrix (oder Identitätsmatrix)
|
//Einheitsmatrix (oder Identitätsmatrix)
|
||||||
inline M3x3 identityM3x3() {
|
inline M3x3 identityM3x3() {
|
||||||
return {
|
return {
|
||||||
1.0f, 0.0f, 0.0f,
|
1.0f, 0.0f, 0.0f,
|
||||||
0.0f, 1.0f, 0.0f,
|
0.0f, 1.0f, 0.0f,
|
||||||
0.0f, 0.0f, 1.0f
|
0.0f, 0.0f, 1.0f
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------
|
//-----------------------------------------------
|
||||||
//m128i
|
//m128i
|
||||||
struct m128i {
|
struct m128i {
|
||||||
__m128i val;
|
__m128i val;
|
||||||
};
|
};
|
||||||
|
|
||||||
inline __m128i operator &(m128i a, m128i b) {
|
inline __m128i operator &(m128i a, m128i b) {
|
||||||
return _mm_and_si128(a.val, b.val);
|
return _mm_and_si128(a.val, b.val);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline __m128i operator |(m128i a, m128i b) {
|
inline __m128i operator |(m128i a, m128i b) {
|
||||||
return _mm_or_si128(a.val, b.val);
|
return _mm_or_si128(a.val, b.val);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline __m128i operator >>(m128i a, int b) {
|
inline __m128i operator >>(m128i a, int b) {
|
||||||
return _mm_srli_epi32(a.val, b);
|
return _mm_srli_epi32(a.val, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline __m128i operator <<(m128i a, int b) {
|
inline __m128i operator <<(m128i a, int b) {
|
||||||
return _mm_slli_epi32(a.val, b);
|
return _mm_slli_epi32(a.val, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------
|
//-----------------------------------------------
|
||||||
//m128
|
//m128
|
||||||
struct m128 {
|
struct m128 {
|
||||||
__m128 val;
|
__m128 val;
|
||||||
};
|
};
|
||||||
|
|
||||||
inline __m128 operator +(m128 a, m128 b) {
|
inline __m128 operator +(m128 a, m128 b) {
|
||||||
return _mm_mul_ps(a.val, b.val);
|
return _mm_mul_ps(a.val, b.val);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline __m128 operator *(m128 a, m128 b) {
|
inline __m128 operator *(m128 a, m128 b) {
|
||||||
return _mm_mul_ps(a.val, b.val);
|
return _mm_mul_ps(a.val, b.val);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline __m128 operator *(float a, m128 b) {
|
inline __m128 operator *(float a, m128 b) {
|
||||||
return _mm_mul_ps(_mm_set1_ps(a), b.val);
|
return _mm_mul_ps(_mm_set1_ps(a), b.val);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline __m128 square_root(__m128 a) {
|
inline __m128 square_root(__m128 a) {
|
||||||
return _mm_sqrt_ps(a);
|
return _mm_sqrt_ps(a);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline __m128 operator /(m128 a, m128 b) {
|
inline __m128 operator /(m128 a, m128 b) {
|
||||||
return _mm_div_ps(a.val, b.val);
|
return _mm_div_ps(a.val, b.val);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user