diff --git a/Makefile b/Makefile index 5f778f1..af6ece1 100644 --- a/Makefile +++ b/Makefile @@ -13,6 +13,8 @@ CXXSTD += -std=gnu++23 CFLAGS += -Wall -Werror -Wfatal-errors CFLAGS += -Wno-error=unused-function CFLAGS += -Wno-error=unused-const-variable +CFLAGS += -Wno-error=unused-but-set-variable +CFLAGS += -Wno-error=unused-variable CFLAGS += -I$(MAKEFILE_PATH)/include LDFLAGS += -lm @@ -59,8 +61,8 @@ define BUILD_BINARY_H @echo 'extern uint32_t $(call as_obj_binary_p,$<)_end __asm("$(call as_obj_binary_p,$<)_end");' >> $@ @echo 'extern uint32_t $(call as_obj_binary_p,$<)_size __asm("$(call as_obj_binary_p,$<)_size");' >> $@ @echo '' >> $@ - @echo '#define $(call as_obj_binary,$<)_start ((void *)&$(call as_obj_binary_p,$<)_start)' >> $@ - @echo '#define $(call as_obj_binary,$<)_end ((void *)&$(call as_obj_binary_p,$<)_end)' >> $@ + @echo '#define $(call as_obj_binary,$<)_start ((const char *)&$(call as_obj_binary_p,$<)_start)' >> $@ + @echo '#define $(call as_obj_binary,$<)_end ((const char *)&$(call as_obj_binary_p,$<)_end)' >> $@ @echo '#define $(call as_obj_binary,$<)_size ($(call as_obj_binary,$<)_end - $(call as_obj_binary,$<)_start)' >> $@ @echo '' >> $@ @echo '#ifdef __cplusplus' >> $@ @@ -74,6 +76,18 @@ endef include/shader/%.glsl.h: src/shader/%.glsl $(BUILD_BINARY_H) +%.data.o: %.data + $(BUILD_BINARY_O) + +include/level/%.data.h: src/level/%.data + $(BUILD_BINARY_H) + +%.data.pal.o: %.data.pal + $(BUILD_BINARY_O) + +include/level/%.data.pal.h: src/level/%.data.pal + $(BUILD_BINARY_H) + clean: rm -f *.o *.d *.gch rm -f main @@ -88,7 +102,10 @@ MAIN_OBJS = \ src/main.o \ src/glad.o \ src/opengl.o \ + src/render.o \ $(patsubst %.glsl,%.glsl.o,$(wildcard src/shader/*.glsl)) \ + $(patsubst %.data,%.data.o,$(wildcard src/level/*.data)) \ + $(patsubst %.data.pal,%.data.pal.o,$(wildcard src/level/*.data.pal)) \ $(GLFW) main: $(MAIN_OBJS) diff --git a/include/level/level1.data.h b/include/level/level1.data.h new file mode 100644 index 0000000..526f991 --- /dev/null +++ b/include/level/level1.data.h @@ -0,0 +1,19 @@ +#pragma once + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern uint32_t _binary_src_level_level1_data_start __asm("_binary_src_level_level1_data_start"); +extern uint32_t _binary_src_level_level1_data_end __asm("_binary_src_level_level1_data_end"); +extern uint32_t _binary_src_level_level1_data_size __asm("_binary_src_level_level1_data_size"); + +#define src_level_level1_data_start ((const char *)&_binary_src_level_level1_data_start) +#define src_level_level1_data_end ((const char *)&_binary_src_level_level1_data_end) +#define src_level_level1_data_size (src_level_level1_data_end - src_level_level1_data_start) + +#ifdef __cplusplus +} +#endif diff --git a/include/level/level1.data.pal.h b/include/level/level1.data.pal.h new file mode 100644 index 0000000..be43ff9 --- /dev/null +++ b/include/level/level1.data.pal.h @@ -0,0 +1,19 @@ +#pragma once + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern uint32_t _binary_src_level_level1_data_pal_start __asm("_binary_src_level_level1_data_pal_start"); +extern uint32_t _binary_src_level_level1_data_pal_end __asm("_binary_src_level_level1_data_pal_end"); +extern uint32_t _binary_src_level_level1_data_pal_size __asm("_binary_src_level_level1_data_pal_size"); + +#define src_level_level1_data_pal_start ((const char *)&_binary_src_level_level1_data_pal_start) +#define src_level_level1_data_pal_end ((const char *)&_binary_src_level_level1_data_pal_end) +#define src_level_level1_data_pal_size (src_level_level1_data_pal_end - src_level_level1_data_pal_start) + +#ifdef __cplusplus +} +#endif diff --git a/include/math/constants.hpp b/include/math/constants.hpp new file mode 100644 index 0000000..59f4482 --- /dev/null +++ b/include/math/constants.hpp @@ -0,0 +1,5 @@ +#pragma once + +#define PI (3.14159274101257324219f) +#define PI_2 (PI * 2.0f) +#define I_PI_2 (1.0f / (PI_2)) diff --git a/include/math/float_types.hpp b/include/math/float_types.hpp new file mode 100644 index 0000000..e88b9bb --- /dev/null +++ b/include/math/float_types.hpp @@ -0,0 +1,15 @@ +#pragma once + +#include "vec2.hpp" +#include "vec3.hpp" +#include "vec4.hpp" +#include "mat2x2.hpp" +#include "mat3x3.hpp" +#include "mat4x4.hpp" + +using vec2 = vec<2, float>; +using vec3 = vec<3, float>; +using vec4 = vec<4, float>; +using mat2x2 = mat<2, 2, float>; +using mat3x3 = mat<3, 3, float>; +using mat4x4 = mat<4, 4, float>; diff --git a/include/math/mat.hpp b/include/math/mat.hpp new file mode 100644 index 0000000..3fbeaea --- /dev/null +++ b/include/math/mat.hpp @@ -0,0 +1,26 @@ +#pragma once + +template +struct mat; + +template +inline constexpr typename mat::col_type +col(mat const& m, int c) +{ + typename mat::col_type v; + for (int r = 0; r < R; r++) { + v[r] = m[r][c]; + } + return v; +} + +template +inline constexpr vec<3, T> +col(mat const& m, int c) +{ + vec<3, T> v; + for (int r = 0; r < 3; r++) { + v[r] = m[r][c]; + } + return v; +} diff --git a/include/math/mat2x2.hpp b/include/math/mat2x2.hpp new file mode 100644 index 0000000..8b8aec7 --- /dev/null +++ b/include/math/mat2x2.hpp @@ -0,0 +1,112 @@ +#pragma once + +#include +#include "vec2.hpp" +#include "mat.hpp" + +// +// mat2x2 +// + +template +struct mat<2, 2, T> +{ + typedef vec<2, T> row_type; + typedef vec<2, T> col_type; + +private: + row_type value[2]; + +public: + inline constexpr mat(); + + inline constexpr mat + ( + T const& a00, T const& a01, + T const& a10, T const& a11 + ); + + inline static constexpr int length() { return 4; } + + inline constexpr typename mat<2, 2, T>::row_type & + operator[](int i); + + inline constexpr typename mat<2, 2, T>::row_type const & + operator[](int i) const; + + void operator=(const mat<2, 2, T>&) = delete; + +}; + + +template +inline constexpr mat<2, 2, T>::mat() + : value{std::move(row_type(1, 0)), + std::move(row_type(0, 1))} +{ } + +template +inline constexpr mat<2, 2, T>::mat +( + T const& a00, T const& a01, + T const& a10, T const& a11 +) + : value{std::move(row_type(a00, a01)), + std::move(row_type(a10, a11))} +{ } + +template +inline constexpr typename mat<2, 2, T>::row_type & +mat<2, 2, T>::operator[](int i) +{ + return value[i]; +} + +template +inline constexpr typename mat<2, 2, T>::row_type const & +mat<2, 2, T>::operator[](int i) const +{ + return value[i]; +} + +template +inline constexpr mat<2, 2, T> operator*(mat<2, 2, T> const& m1, mat<2, 2, T> const& m2) +{ +#define c(i, j) ( \ + m1[i][0] * m2[0][j] \ + + m1[i][1] * m2[1][j]) + + return mat<2, 2, T>(c(0,0), c(0,1), + c(1,0), c(1,1)); +#undef c +} + +template +inline constexpr typename mat<2, 2, T>::row_type operator* +( + mat<2, 2, T> const& m, + typename mat<2, 2, T>::col_type const& v +) +{ +#define c(i) ( \ + m[i][0] * v[0] \ + + m[i][1] * v[1]) + + return typename mat<2, 2, T>::row_type(c(0), c(1)); +#undef c +} + +template +inline constexpr mat<2, 2, T> transpose(mat<2, 2, T> const& m) +{ + return mat<2, 2, T>( + m[0][0], m[1][0], + m[0][1], m[1][1] + ); +} + +template +inline constexpr float determinant(mat<2, 2, T> const& a) +{ + return a[0][0] * a[1][1] - a[0][1] * a[1][0]; +} diff --git a/include/math/mat3x3.hpp b/include/math/mat3x3.hpp new file mode 100644 index 0000000..3bd64d9 --- /dev/null +++ b/include/math/mat3x3.hpp @@ -0,0 +1,201 @@ +#pragma once + +#include +#include "vec3.hpp" +#include "mat.hpp" + +// +// mat3x3 +// + +template +struct mat<3, 3, T> +{ + typedef vec<3, T> row_type; + typedef vec<3, T> col_type; + +private: + row_type value[3]; + +public: + inline constexpr mat(); + + inline constexpr mat + ( + T const& a00, T const& a01, T const& a02, + T const& a10, T const& a11, T const& a12, + T const& a20, T const& a21, T const& a22 + ); + + inline static constexpr int length() { return 3; } + + inline constexpr typename mat<3, 3, T>::row_type & + operator[](int i); + + inline constexpr typename mat<3, 3, T>::row_type const & + operator[](int i) const; + + //void operator=(const mat<3, 3, T>&) = delete; + +}; + + +template +inline constexpr mat<3, 3, T>::mat() + : value{std::move(row_type(1, 0, 0)), + std::move(row_type(0, 1, 0)), + std::move(row_type(0, 0, 1))} +{ } + +template +inline constexpr mat<3, 3, T>::mat +( + T const& a00, T const& a01, T const& a02, + T const& a10, T const& a11, T const& a12, + T const& a20, T const& a21, T const& a22 +) + : value{std::move(row_type(a00, a01, a02)), + std::move(row_type(a10, a11, a12)), + std::move(row_type(a20, a21, a22))} +{ } + +template +inline constexpr typename mat<3, 3, T>::row_type & +mat<3, 3, T>::operator[](int i) +{ + return value[i]; +} + +template +inline constexpr typename mat<3, 3, T>::row_type const & +mat<3, 3, T>::operator[](int i) const +{ + return value[i]; +} + +template +inline constexpr mat<3, 3, T> operator+(mat<3, 3, T> const& m1, mat<3, 3, T> const& m2) +{ +#define c(i, j) ( m1[i][j] + m2[i][j] ) + + return mat<3, 3, T>(c(0,0), c(0,1), c(0,2), + c(1,0), c(1,1), c(1,2), + c(2,0), c(2,1), c(2,2)); +#undef c +} + +template +inline constexpr mat<3, 3, T> operator*(mat<3, 3, T> const& m1, mat<3, 3, T> const& m2) +{ +#define c(i, j) ( \ + m1[i][0] * m2[0][j] \ + + m1[i][1] * m2[1][j] \ + + m1[i][2] * m2[2][j] ) + + return mat<3, 3, T>(c(0,0), c(0,1), c(0,2), + c(1,0), c(1,1), c(1,2), + c(2,0), c(2,1), c(2,2)); +#undef c +} + +template +inline constexpr mat<3, 3, T> operator*(mat<3, 3, T> const& m1, float s) +{ +#define c(i, j) ( m1[i][j] * s ) + + return mat<3, 3, T>(c(0,0), c(0,1), c(0,2), + c(1,0), c(1,1), c(1,2), + c(2,0), c(2,1), c(2,2)); +#undef c +} + +template +inline constexpr typename mat<3, 3, T>::row_type operator* +( + mat<3, 3, T> const& m, + typename mat<3, 3, T>::col_type const& v +) +{ +#define c(i) ( \ + m[i][0] * v[0] \ + + m[i][1] * v[1] \ + + m[i][2] * v[2] ) + + return typename mat<3, 3, T>::row_type(c(0), c(1), c(2)); +#undef c +} + +template +inline constexpr mat<3, 3, T> transpose(mat<3, 3, T> const& m) +{ + return mat<3, 3, T>( + m[0][0], m[1][0], m[2][0], + m[0][1], m[1][1], m[2][1], + m[0][2], m[1][2], m[2][2] + ); +} + +template +inline constexpr mat<2, 2, T> submatrix(mat<3, 3, T> const& a, int r, int c) +{ + mat<2, 2, T> b; + int row2 = 0; + for (int row3 = 0; row3 < 3; row3++) { + if (row3 == r) continue; + int col2 = 0; + for (int col3 = 0; col3 < 3; col3++) { + if (col3 == c) continue; + b[row2][col2] = a[row3][col3]; + col2++; + } + row2++; + } + return b; +} + +template +inline constexpr float minor(mat<3, 3, T> const& a, int r, int c) +{ + mat<2, 2, T> s = submatrix(a, r, c); + float ret = determinant(s); + return ret; +} + +template +inline constexpr float cofactor(mat<3, 3, T> const& a, int r, int c) +{ + float m = minor(a, r, c); + if ((r + c) & 1) + return -m; + else + return m; +} + +template +inline constexpr float determinant(mat<3, 3, T> const& a) +{ + float f0 = cofactor(a, 0, 0); + float f1 = cofactor(a, 0, 1); + float f2 = cofactor(a, 0, 2); + return + a[0][0] * f0 + + a[0][1] * f1 + + a[0][2] * f2; +} + +template +inline constexpr mat<3, 3, T> inverse(mat<3, 3, T> const& a) +{ + mat<3, 3, T> m; + float idet = 1.0f / determinant(a); + m[0][0] = cofactor(a, 0, 0) * idet; + m[1][0] = cofactor(a, 0, 1) * idet; + m[2][0] = cofactor(a, 0, 2) * idet; + m[0][1] = cofactor(a, 1, 0) * idet; + m[1][1] = cofactor(a, 1, 1) * idet; + m[2][1] = cofactor(a, 1, 2) * idet; + m[0][2] = cofactor(a, 2, 0) * idet; + m[1][2] = cofactor(a, 2, 1) * idet; + m[2][2] = cofactor(a, 2, 2) * idet; + return m; +} diff --git a/include/math/mat4x4.hpp b/include/math/mat4x4.hpp new file mode 100644 index 0000000..bcddf1f --- /dev/null +++ b/include/math/mat4x4.hpp @@ -0,0 +1,247 @@ +#pragma once + +#include +#include "vec4.hpp" +#include "mat.hpp" + +// +// mat4x4 +// + +template +struct mat<4, 4, T> +{ + typedef vec<4, T> row_type; + typedef vec<4, T> col_type; + +private: + row_type value[4]; + +public: + inline constexpr mat(); + + inline constexpr mat + ( + T const& a00, T const& a01, T const& a02, T const& a03, + T const& a10, T const& a11, T const& a12, T const& a13, + T const& a20, T const& a21, T const& a22, T const& a23, + T const& a30, T const& a31, T const& a32, T const& a33 + ); + + inline static constexpr int length() { return 4; } + + inline constexpr typename mat<4, 4, T>::row_type & + operator[](int i); + + inline constexpr typename mat<4, 4, T>::row_type const & + operator[](int i) const; + + //void operator=(const mat<4, 4, T>&) = delete; + +}; + + +template +inline constexpr mat<4, 4, T>::mat() + : value{std::move(row_type(1, 0, 0, 0)), + std::move(row_type(0, 1, 0, 0)), + std::move(row_type(0, 0, 1, 0)), + std::move(row_type(0, 0, 0, 1))} +{ } + +template +inline constexpr mat<4, 4, T>::mat +( + T const& a00, T const& a01, T const& a02, T const& a03, + T const& a10, T const& a11, T const& a12, T const& a13, + T const& a20, T const& a21, T const& a22, T const& a23, + T const& a30, T const& a31, T const& a32, T const& a33 +) + : value{std::move(row_type(a00, a01, a02, a03)), + std::move(row_type(a10, a11, a12, a13)), + std::move(row_type(a20, a21, a22, a23)), + std::move(row_type(a30, a31, a32, a33))} +{ } + + +template +inline constexpr typename mat<4, 4, T>::row_type & +mat<4, 4, T>::operator[](int i) +{ + return value[i]; +} + +template +inline constexpr typename mat<4, 4, T>::row_type const & +mat<4, 4, T>::operator[](int i) const +{ + return value[i]; +} + +template +inline constexpr mat<4, 4, T> operator+(mat<4, 4, T> const& m1, mat<4, 4, T> const& m2) +{ +#define c(i, j) ( m1[i][j] + m2[i][j] ) + + return mat<4, 4, T>(c(0,0), c(0,1), c(0,2), c(0,3), + c(1,0), c(1,1), c(1,2), c(1,3), + c(2,0), c(2,1), c(2,2), c(2,3), + c(3,0), c(3,1), c(3,2), c(3,3)); +#undef c +} + +template +inline constexpr mat<4, 4, T> operator*(mat<4, 4, T> const& m1, mat<4, 4, T> const& m2) +{ +#define c(i, j) ( \ + m1[i][0] * m2[0][j] \ + + m1[i][1] * m2[1][j] \ + + m1[i][2] * m2[2][j] \ + + m1[i][3] * m2[3][j] ) + + return mat<4, 4, T>(c(0,0), c(0,1), c(0,2), c(0,3), + c(1,0), c(1,1), c(1,2), c(1,3), + c(2,0), c(2,1), c(2,2), c(2,3), + c(3,0), c(3,1), c(3,2), c(3,3)); +#undef c +} + +template +inline constexpr mat<4, 4, T> operator*(mat<4, 4, T> const& m1, float s) +{ +#define c(i, j) ( m1[i][j] * s ) + + return mat<4, 4, T>(c(0,0), c(0,1), c(0,2), c(0,3), + c(1,0), c(1,1), c(1,2), c(1,3), + c(2,0), c(2,1), c(2,2), c(2,3), + c(3,0), c(3,1), c(3,2), c(3,3)); +#undef c +} + +template +inline constexpr typename mat<4, 4, T>::row_type operator* +( + mat<4, 4, T> const& m, + typename mat<4, 4, T>::col_type const& v +) +{ +#define c(i) ( \ + m[i][0] * v[0] \ + + m[i][1] * v[1] \ + + m[i][2] * v[2] \ + + m[i][3] * v[3] ) + + return typename mat<4, 4, T>::row_type(c(0), c(1), c(2), c(3)); +#undef c +} + +template +inline constexpr vec<3, T> operator* +( + mat<4, 4, T> const& m, + vec<3, T> const& v +) +{ +#define c(i) ( \ + m[i][0] * v[0] \ + + m[i][1] * v[1] \ + + m[i][2] * v[2] \ + + m[i][3] ) + + return vec<3, T>(c(0), c(1), c(2)); +#undef c +} + +template +inline constexpr mat<4, 4, T> transpose(mat<4, 4, T> const& m) +{ + return mat<4, 4, T>( + m[0][0], m[1][0], m[2][0], m[3][0], + m[0][1], m[1][1], m[2][1], m[3][1], + m[0][2], m[1][2], m[2][2], m[3][2], + m[0][3], m[1][3], m[2][3], m[3][3] + ); +} + +template +inline constexpr mat<3, 3, T> submatrix(mat<4, 4, T> const& a, int r, int c) +{ + mat<3, 3, T> b; + int row3 = 0; + for (int row4 = 0; row4 < 4; row4++) { + if (row4 == r) continue; + int col3 = 0; + for (int col4 = 0; col4 < 4; col4++) { + if (col4 == c) continue; + b[row3][col3] = a[row4][col4]; + col3++; + } + row3++; + } + return b; +} + +template +inline constexpr float minor(mat<4, 4, T> const& a, int r, int c) +{ + mat<3, 3, T> s = submatrix(a, r, c); + float ret = determinant(s); + return ret; +} + +template +inline constexpr float cofactor(mat<4, 4, T> const& a, int r, int c) +{ + float m = minor(a, r, c); + if ((r + c) & 1) + return -m; + else + return m; +} + +template +inline constexpr float determinant(mat<4, 4, T> const& a) +{ + float f0 = cofactor(a, 0, 0); + float f1 = cofactor(a, 0, 1); + float f2 = cofactor(a, 0, 2); + float f3 = cofactor(a, 0, 3); + return + a[0][0] * f0 + + a[0][1] * f1 + + a[0][2] * f2 + + a[0][3] * f3; +} + +template +inline constexpr mat<4, 4, T> inverse(mat<4, 4, T> const& a) +{ + mat<4, 4, T> m; + float idet = 1.0f / determinant(a); + m[0][0] = cofactor(a, 0, 0) * idet; + m[1][0] = cofactor(a, 0, 1) * idet; + m[2][0] = cofactor(a, 0, 2) * idet; + m[3][0] = cofactor(a, 0, 3) * idet; + m[0][1] = cofactor(a, 1, 0) * idet; + m[1][1] = cofactor(a, 1, 1) * idet; + m[2][1] = cofactor(a, 1, 2) * idet; + m[3][1] = cofactor(a, 1, 3) * idet; + m[0][2] = cofactor(a, 2, 0) * idet; + m[1][2] = cofactor(a, 2, 1) * idet; + m[2][2] = cofactor(a, 2, 2) * idet; + m[3][2] = cofactor(a, 2, 3) * idet; + m[0][3] = cofactor(a, 3, 0) * idet; + m[1][3] = cofactor(a, 3, 1) * idet; + m[2][3] = cofactor(a, 3, 2) * idet; + m[3][3] = cofactor(a, 3, 3) * idet; + return m; +} + +template +inline constexpr mat<4, 4, T> identity() +{ + return mat<4, 4, T>(1.0f, 0.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, 0.0f, 1.0f); +} diff --git a/include/math/transform.hpp b/include/math/transform.hpp new file mode 100644 index 0000000..f36cba0 --- /dev/null +++ b/include/math/transform.hpp @@ -0,0 +1,167 @@ +#pragma once + +#include "vec.hpp" +#include "mat.hpp" + +template +inline constexpr mat<4, 4, T> translate(vec<3, T> t) +{ + return { + 1, 0, 0, t.x, + 0, 1, 0, t.y, + 0, 0, 1, t.z, + 0, 0, 0, 1 + }; +} + +template +inline constexpr mat<4, 4, T> scale(vec<3, T> s) +{ + return { + s.x, 0, 0, 0, + 0, s.y, 0, 0, + 0, 0, s.z, 0, + 0, 0, 0, 1 + }; +} + +template +inline constexpr mat<4, 4, T> scale(T s) +{ + return { + s, 0, 0, 0, + 0, s, 0, 0, + 0, 0, s, 0, + 0, 0, 0, 1 + }; +} + +template +inline constexpr mat<4, 4, T> rotate_x(T t) +{ + return { + 1, 0, 0, 0, + 0, cos(t), -sin(t), 0, + 0, sin(t), cos(t), 0, + 0, 0, 0, 1 + }; +} + +template +inline constexpr mat<4, 4, T> rotate_y(T t) +{ + return { + cos(t), 0, sin(t), 0, + 0, 1, 0, 0, + -sin(t), 0, cos(t), 0, + 0, 0, 0, 1 + }; +} + +template +inline constexpr mat<4, 4, T> rotate_z(T t) +{ + return { + cos(t), -sin(t), 0, 0, + sin(t), cos(t), 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + }; +} + +template +inline constexpr mat<4, 4, T> rotate_axis_angle(vec<3, T> u, T t) +{ + T st = sin(t); + T ct = cos(t); + T oct = 1.0 - ct; + + T xx = u.x * u.x; + T xy = u.x * u.y; + T xz = u.x * u.z; + T yy = u.y * u.y; + T yz = u.y * u.z; + T zz = u.z * u.z; + + return { + xx * oct + ct, xy * oct - u.z * st, xz * oct + u.y * st, 0, + xy * oct + u.z * st, yy * oct + ct, yz * oct - u.x * st, 0, + xz * oct - u.y * st, yz * oct + u.x * st, zz * oct + ct, 0, + 0, 0, 0, 0 + }; +} + +template +inline constexpr mat<4, 4, T> rotate_axis_angle(vec<4, T> u) +{ + return rotate_axis_angle({u.x, u.y, u.z}, u.w); +} + +template +inline constexpr mat<4, 4, T> rotate_quaternion(vec<4, T> r) +{ + T xx2 = 2 * r.x * r.x; + T xy2 = 2 * r.x * r.y; + T xz2 = 2 * r.x * r.z; + T xw2 = 2 * r.x * r.w; + T yy2 = 2 * r.y * r.y; + T yz2 = 2 * r.y * r.z; + T yw2 = 2 * r.y * r.w; + T zz2 = 2 * r.z * r.z; + T zw2 = 2 * r.z * r.w; + + return { + 1 - yy2 - zz2, xy2 - zw2, xz2 + yw2, 0, + xy2 + zw2, 1 - xx2 - zz2, yz2 - xw2, 0, + xz2 - yw2, yz2 + xw2, 1 - xx2 - yy2, 0, + 0, 0, 0, 1, + }; +} + +template +inline constexpr mat<4, 4, T> look_at(vec<3, T> eye, vec<3, T> center, vec<3, T> up) +{ + vec<3, T> z = normalize(eye - center); + vec<3, T> y = up; + vec<3, T> x = cross(y, z); + y = cross(z, x); + x = normalize(x); + y = normalize(y); + + mat<4, 4, T> mat = { + x.x, x.y, x.z, -dot(x, eye), + y.x, y.y, y.z, -dot(y, eye), + z.x, z.y, z.z, -dot(z, eye), + 0, 0, 0, 1, + }; + + return mat; +} + +template +inline constexpr vec<3, T> normal_multiply(mat<4, 4, T> m, vec<3, T> n) +{ + vec<4, T> n4 = m * (vec<4, T>){n.x, n.y, n.z, 0.0}; + return {n4.x, n4.y, n4.z}; +} + +template +inline constexpr T inverse_length(vec<3, T> v) +{ + float f = dot(v, v); + return 1.0f / sqrt(f); +} + +template +inline constexpr T screen_transform(T x, T y) +{ + T x2 = x / 2.0; + T y2 = y / 2.0; + + return { + y2, 0, 0, x2, + 0, y2, 0, y2, + 0, 0, 1, 0, + 0, 0, 0, 1 + }; +} diff --git a/include/math/vec.hpp b/include/math/vec.hpp new file mode 100644 index 0000000..83699a6 --- /dev/null +++ b/include/math/vec.hpp @@ -0,0 +1,29 @@ +#pragma once + +template +struct vec; + +template +inline constexpr T magnitude(vec const& v) +{ + return sqrt(dot(v, v)); +} + +template +inline constexpr T magnitude_squared(vec const& v) +{ + return dot(v, v); +} + +template +inline constexpr vec normalize(vec const& v) +{ + T d = 1.0f / magnitude(v); + return v * d; +} + +template +inline constexpr vec<3, T> reflect(vec const& i, vec const& n) +{ + return i - dot(n, i) * n * static_cast(2.0); +} diff --git a/include/math/vec2.hpp b/include/math/vec2.hpp new file mode 100644 index 0000000..b617964 --- /dev/null +++ b/include/math/vec2.hpp @@ -0,0 +1,154 @@ +#pragma once + +#include "vec.hpp" + +// +// vec3 +// + +template +struct vec<2, T> +{ + union { + T val[2]; + struct { T x, y; }; + struct { T u, v; }; + }; + + inline constexpr vec(); + inline constexpr vec(T scalar); + inline constexpr vec(T _x, T _y); + + constexpr inline vec<2, T> operator-() const; + inline constexpr T & operator[](int i); + inline constexpr T const& operator[](int i) const; + inline constexpr vec<2, T>& operator=(vec<2, T> const& v); + inline constexpr vec<2, T>& operator+=(vec<2, T> const& v); + inline constexpr vec<2, T>& operator-=(vec<2, T> const& v); +}; + +template +inline constexpr vec<2, T>::vec() + : x(0), y(0) +{} + +template +inline constexpr vec<2, T>::vec(T scalar) + : x(scalar), y(scalar) +{} + +template +inline constexpr vec<2, T>::vec(T _x, T _y) + : x(_x), y(_y) +{} + +template +constexpr inline vec<2, T> vec<2, T>::operator-() const +{ + return vec<2, T>(-x, -y); +} + +template +inline constexpr T & vec<2, T>::operator[](int i) +{ + return val[i]; +} + +template +inline constexpr T const& vec<2, T>::operator[](int i) const +{ + return val[i]; +} + +template +inline constexpr vec<2, T>& vec<2, T>::operator=(vec<2, T> const& v) +{ + this->x = static_cast(v.x); + this->y = static_cast(v.y); + return *this; +} + +template +inline constexpr vec<2, T>& vec<2, T>::operator+=(vec<2, T> const& v) +{ + *this = *this + vec<2, T>(v); + return *this; +} + +template +inline constexpr vec<2, T>& vec<2, T>::operator-=(vec<2, T> const& v) +{ + *this = *this - vec<2, T>(v); + return *this; +} + +template +inline constexpr vec<2, T> operator+(vec<2, T> const& v1, vec<2, T> const& v2) +{ + return vec<2, T>(v1.x + v2.x, + v1.y + v2.y); +} + +template +inline constexpr vec<2, T> operator-(vec<2, T> const& v1, vec<2, T> const& v2) +{ + return vec<2, T>(v1.x - v2.x, + v1.y - v2.y); +} + +template +inline constexpr vec<2, T> operator*(vec<2, T> const& v1, vec<2, T> const& v2) +{ + return vec<2, T>(v1.x * v2.x, + v1.y * v2.y); +} + +template +inline constexpr vec<2, T> operator*(vec<2, T> const& v1, T const& scalar) +{ + return v1 * vec<2, T>(scalar); +} + +template +inline constexpr vec<2, T> operator*(T const& scalar, vec<2, T> const& v1) +{ + return vec<2, T>(scalar) * v1; +} + +template +inline constexpr vec<2, T> operator/(vec<2, T> const& v1, vec<2, T> const& v2) +{ + return vec<2, T>(v1.x / v2.x, + v1.y / v2.y); +} + +template +inline constexpr vec<2, T> operator/(vec<2, T> const& v1, T const& scalar) +{ + return v1 / vec<2, T>(scalar); +} + +template +inline constexpr T dot(vec<2, T> const& v1, vec<2, T> const& v2) +{ + vec<2, T> tmp(v1 * v2); + return tmp.x + tmp.y; +} + +template +inline constexpr T cross(vec<2, T> const& v1, vec<2, T> const& v2) +{ + return v1.x * v2.y - v2.x * v1.y; +} + +template +inline constexpr vec<2, T> functor1(T (&func) (T const& x), vec<2, T> const& v) +{ + return vec<2, T>(func(v.x), func(v.y)); +} + +template +inline constexpr vec<2, U> functor1(U (&func) (T const& x), vec<2, T> const& v) +{ + return vec<2, U>(func(v.x), func(v.y)); +} diff --git a/include/math/vec3.hpp b/include/math/vec3.hpp new file mode 100644 index 0000000..38022de --- /dev/null +++ b/include/math/vec3.hpp @@ -0,0 +1,171 @@ +#pragma once + +#include "vec.hpp" + +// +// vec3 +// + +template +struct vec<3, T> +{ + union { + T val[3]; + struct { T x, y, z; }; + struct { T r, g, b; }; + }; + + inline constexpr vec(); + inline constexpr vec(T scalar); + inline constexpr vec(T _x, T _y, T _z); + + constexpr inline vec<3, T> operator-() const; + inline constexpr T & operator[](int i); + inline constexpr T const& operator[](int i) const; + inline constexpr vec<3, T>& operator=(vec<3, T> const& v); + inline constexpr vec<3, T>& operator+=(vec<3, T> const& v); + inline constexpr vec<3, T>& operator-=(vec<3, T> const& v); + inline constexpr vec<3, T>& operator*=(T const& scalar); +}; + +template +inline constexpr vec<3, T>::vec() + : x(0), y(0), z(0) +{} + +template +inline constexpr vec<3, T>::vec(T scalar) + : x(scalar), y(scalar), z(scalar) +{} + +template +inline constexpr vec<3, T>::vec(T _x, T _y, T _z) + : x(_x), y(_y), z(_z) +{} + +template +constexpr inline vec<3, T> vec<3, T>::operator-() const +{ + return vec<3, T>(-x, -y, -z); +} + +template +inline constexpr T & vec<3, T>::operator[](int i) +{ + return val[i]; +} + +template +inline constexpr T const& vec<3, T>::operator[](int i) const +{ + return val[i]; +} + +template +inline constexpr vec<3, T>& vec<3, T>::operator=(vec<3, T> const& v) +{ + this->x = static_cast(v.x); + this->y = static_cast(v.y); + this->z = static_cast(v.z); + return *this; +} + +template +inline constexpr vec<3, T>& vec<3, T>::operator+=(vec<3, T> const& v) +{ + *this = *this + vec<3, T>(v); + return *this; +} + +template +inline constexpr vec<3, T>& vec<3, T>::operator-=(vec<3, T> const& v) +{ + *this = *this - vec<3, T>(v); + return *this; +} + +template +inline constexpr vec<3, T>& vec<3, T>::operator*=(T const& scalar) +{ + *this = *this * scalar; + return *this; +} + +template +inline constexpr vec<3, T> operator+(vec<3, T> const& v1, vec<3, T> const& v2) +{ + return vec<3, T>(v1.x + v2.x, + v1.y + v2.y, + v1.z + v2.z); +} + +template +inline constexpr vec<3, T> operator-(vec<3, T> const& v1, vec<3, T> const& v2) +{ + return vec<3, T>(v1.x - v2.x, + v1.y - v2.y, + v1.z - v2.z); +} + +template +inline constexpr vec<3, T> operator*(vec<3, T> const& v1, vec<3, T> const& v2) +{ + return vec<3, T>(v1.x * v2.x, + v1.y * v2.y, + v1.z * v2.z); +} + +template +inline constexpr vec<3, T> operator*(vec<3, T> const& v1, T const& scalar) +{ + return v1 * vec<3, T>(scalar); +} + +template +inline constexpr vec<3, T> operator*(T const& scalar, vec<3, T> const& v1) +{ + return vec<3, T>(scalar) * v1; +} + +template +inline constexpr vec<3, T> operator/(vec<3, T> const& v1, vec<3, T> const& v2) +{ + return vec<3, T>(v1.x / v2.x, + v1.y / v2.y, + v1.z / v2.z); +} + +template +inline constexpr vec<3, T> operator/(vec<3, T> const& v1, T const& scalar) +{ + return v1 / vec<3, T>(scalar); +} + +template +inline constexpr T dot(vec<3, T> const& v1, vec<3, T> const& v2) +{ + return + v1.x * v2.x + + v1.y * v2.y + + v1.z * v2.z; +} + +template +inline constexpr vec<3, T> cross(vec<3, T> const& v1, vec<3, T> const& v2) +{ + return vec<3, T>(v1.y * v2.z - v2.y * v1.z, + v1.z * v2.x - v2.z * v1.x, + v1.x * v2.y - v2.x * v1.y); +} + +template +inline constexpr vec<3, T> functor1(T (&func) (T const& x), vec<3, T> const& v) +{ + return vec<3, T>(func(v.x), func(v.y), func(v.z)); +} + +template +inline constexpr vec<3, U> functor1(U (&func) (T const& x), vec<3, T> const& v) +{ + return vec<3, U>(func(v.x), func(v.y), func(v.z)); +} diff --git a/include/math/vec4.hpp b/include/math/vec4.hpp new file mode 100644 index 0000000..5f8bb52 --- /dev/null +++ b/include/math/vec4.hpp @@ -0,0 +1,164 @@ +#pragma once + +#include "vec.hpp" + +// +// vec4 +// + +template +struct vec<4, T> +{ + union { + T val[4]; + struct { T x, y, z, w; }; + struct { T a, r, g, b; }; + }; + + inline constexpr vec(); + inline constexpr vec(T scalar); + inline constexpr vec(T _x, T _y, T _z, T _w); + inline constexpr vec(const vec<3, T>& v); + + constexpr inline vec<4, T> operator-() const; + inline constexpr T & operator[](int i); + inline constexpr T const& operator[](int i) const; + inline constexpr vec<4, T>& operator=(vec<4, T> const& v); + inline constexpr vec<4, T>& operator+=(vec<4, T> const& v); + inline constexpr vec<4, T>& operator-=(vec<4, T> const& v); +}; + +template +inline constexpr vec<4, T>::vec() + : x(0), y(0), z(0), w(0) +{} + +template +inline constexpr vec<4, T>::vec(T scalar) + : x(scalar), y(scalar), z(scalar), w(scalar) +{} + +template +inline constexpr vec<4, T>::vec(T _x, T _y, T _z, T _w) + : x(_x), y(_y), z(_z), w(_w) +{} + +template +inline constexpr vec<4, T>::vec(const vec<3, T>& v) + : x(v.x), y(v.y), z(v.z), w(1.f) +{} + +template +constexpr inline vec<4, T> vec<4, T>::operator-() const +{ + return vec<4, T>(-x, -y, -z, -w); +} + +template +inline constexpr T & vec<4, T>::operator[](int i) +{ + return val[i]; +} + +template +inline constexpr T const& vec<4, T>::operator[](int i) const +{ + return val[i]; +} + +template +inline constexpr vec<4, T>& vec<4, T>::operator=(vec<4, T> const& v) +{ + this->x = static_cast(v.x); + this->y = static_cast(v.y); + this->z = static_cast(v.z); + this->w = static_cast(v.w); + return *this; +} + +template +inline constexpr vec<4, T>& vec<4, T>::operator+=(vec<4, T> const& v) +{ + *this = *this + vec<4, T>(v); + return *this; +} + +template +inline constexpr vec<4, T>& vec<4, T>::operator-=(vec<4, T> const& v) +{ + *this = *this - vec<4, T>(v); + return *this; +} + +template +inline constexpr vec<4, T> operator+(vec<4, T> const& v1, vec<4, T> const& v2) +{ + return vec<4, T>(v1.x + v2.x, + v1.y + v2.y, + v1.z + v2.z, + v1.w + v2.w); +} + +template +inline constexpr vec<4, T> operator-(vec<4, T> const& v1, vec<4, T> const& v2) +{ + return vec<4, T>(v1.x - v2.x, + v1.y - v2.y, + v1.z - v2.z, + v1.w - v2.w); +} + +template +inline constexpr vec<4, T> operator*(vec<4, T> const& v1, vec<4, T> const& v2) +{ + return vec<4, T>(v1.x * v2.x, + v1.y * v2.y, + v1.z * v2.z, + v1.w * v2.w); +} + +template +inline constexpr vec<4, T> operator*(vec<4, T> const& v1, T const& scalar) +{ + return v1 * vec<4, T>(scalar); +} + +template +inline constexpr vec<4, T> operator*(T const& scalar, vec<4, T> const& v1) +{ + return vec<4, T>(scalar) * v1; +} + +template +inline constexpr vec<4, T> operator/(vec<4, T> const& v1, vec<4, T> const& v2) +{ + return vec<4, T>(v1.x / v2.x, + v1.y / v2.y, + v1.z / v2.z, + v1.w / v2.w); +} + +template +inline constexpr vec<4, T> operator/(vec<4, T> const& v1, T const& scalar) +{ + return v1 / vec<4, T>(scalar); +} + +template +inline constexpr T dot(vec<4, T> const& v1, vec<4, T> const& v2) +{ + vec<4, T> tmp(v1 * v2); + return tmp.x + tmp.y + tmp.z + tmp.w; +} + +template +inline constexpr vec<4, T> functor1(T (&func) (T const& x), vec<4, T> const& v) +{ + return vec<4, T>(func(v.x), func(v.y), func(v.z), func(v.w)); +} + +template +inline constexpr vec<4, U> functor1(U (&func) (T const& x), vec<4, T> const& v) +{ + return vec<4, U>(func(v.x), func(v.y), func(v.z), func(v.w)); +} diff --git a/include/model/brick.h b/include/model/brick.h new file mode 100644 index 0000000..82913b7 --- /dev/null +++ b/include/model/brick.h @@ -0,0 +1,808 @@ +#pragma once + +const int brick_Cube_triangles[] = { + 0, 1, 2, + 3, 4, 5, + 6, 7, 8, + 9, 10, 11, + 12, 13, 14, + 15, 16, 17, + 18, 19, 20, + 21, 22, 23, + 24, 25, 26, + 27, 28, 29, + 30, 31, 32, + 33, 34, 35, + 36, 37, 38, + 39, 40, 41, + 42, 43, 44, + 45, 46, 47, + 48, 49, 50, + 51, 52, 53, + 54, 55, 56, + 57, 58, 59, + 60, 61, 62, + 63, 64, 65, + 66, 67, 68, + 69, 70, 71, + 72, 73, 74, + 75, 76, 77, + 78, 79, 80, + 81, 82, 83, + 84, 85, 86, + 87, 88, 89, + 90, 91, 92, + 93, 94, 95, + 96, 97, 98, + 99, 100, 101, + 102, 103, 104, + 105, 106, 107, + 108, 109, 110, + 111, 112, 113, + 114, 115, 116, + 117, 118, 119, + 120, 121, 122, + 123, 124, 125, + 126, 127, 128, + 129, 130, 131, + 132, 133, 134, + 135, 136, 137, + 138, 139, 140, + 141, 142, 143, + 144, 145, 146, + 147, 148, 149, + 150, 151, 152, + 153, 154, 155, + 156, 157, 158, + 159, 160, 161, + 162, 163, 164, + 165, 166, 167, + 168, 169, 170, + 171, 172, 173, + 174, 175, 176, + 177, 178, 179, + 180, 181, 182, + 183, 184, 185, + 186, 187, 188, + 189, 190, 191, + 192, 193, 194, + 195, 196, 197, + 198, 199, 200, + 201, 202, 203, + 204, 205, 206, + 207, 208, 209, + 210, 211, 212, + 213, 214, 215, + 216, 217, 218, + 219, 220, 221, + 222, 223, 224, + 225, 226, 227, + 228, 229, 230, + 231, 232, 233, + 234, 235, 236, + 237, 238, 239, + 240, 241, 242, + 243, 244, 245, + 246, 247, 248, + 249, 250, 251, + 252, 253, 254, + 255, 256, 257, + 258, 259, 260, + 261, 262, 263, + 264, 265, 266, + 267, 268, 269, + 270, 271, 272, + 273, 274, 275, + 276, 277, 278, + 279, 280, 281, + 282, 283, 284, + 285, 286, 287, + 288, 289, 290, + 291, 292, 293, + 294, 295, 296, + 297, 298, 299, + 300, 301, 302, + 303, 304, 305, + 306, 307, 308, + 309, 310, 311, + 312, 313, 314, + 315, 316, 317, + 2, 318, 319, + 319, 320, 321, + 321, 322, 323, + 323, 324, 0, + 0, 325, 326, + 326, 327, 1, + 1, 328, 329, + 329, 330, 2, + 2, 319, 321, + 321, 323, 0, + 0, 326, 1, + 1, 329, 2, + 2, 321, 0, + 331, 332, 333, + 334, 335, 336, + 337, 338, 339, + 12, 340, 13, + 341, 342, 343, + 344, 345, 346, + 347, 348, 349, + 350, 351, 352, + 353, 354, 355, + 356, 357, 358, + 359, 360, 361, + 362, 363, 364, + 365, 366, 367, + 368, 369, 370, + 371, 372, 373, + 374, 375, 376, + 377, 378, 379, + 380, 381, 382, + 383, 384, 385, + 386, 387, 388, + 389, 390, 391, + 392, 393, 394, + 395, 396, 397, + 398, 399, 400, + 401, 402, 403, + 404, 405, 406, + 407, 408, 409, + 410, 411, 412, + 99, 413, 100, + 102, 414, 103, + 105, 415, 106, + 108, 416, 109, + 111, 417, 112, + 114, 418, 115, + 117, 419, 118, + 120, 420, 121, + 123, 421, 124, + 126, 422, 127, + 129, 423, 130, + 132, 424, 133, + 425, 426, 427, + 428, 429, 430, + 141, 431, 142, + 432, 433, 434, + 435, 436, 437, + 438, 439, 440, + 441, 442, 443, + 156, 444, 157, + 159, 445, 160, + 446, 447, 448, + 165, 449, 166, + 450, 451, 452, + 453, 454, 455, + 456, 457, 458, + 459, 460, 461, + 462, 463, 464, + 465, 466, 467, + 468, 469, 470, + 471, 472, 473, + 474, 475, 476, + 477, 478, 479, + 480, 481, 482, + 483, 484, 485, + 486, 487, 488, + 489, 490, 491, + 492, 493, 494, + 495, 496, 497, + 498, 499, 500, + 501, 502, 503, + 504, 505, 506, + 507, 508, 509, + 510, 511, 512, + 513, 514, 515, + 516, 517, 518, + 519, 520, 521, + 522, 523, 524, + 525, 526, 527, + 528, 529, 530, + 531, 532, 533, + 534, 535, 536, + 537, 538, 539, + 540, 541, 542, + 543, 544, 545, + 546, 547, 548, + 549, 550, 551, + 552, 553, 554, + 555, 556, 557, + 558, 559, 560, + 279, 561, 280, + 282, 562, 283, + 285, 563, 286, + 288, 564, 289, + 291, 565, 292, + 294, 566, 295, + 297, 567, 298, + 300, 568, 301, + 303, 569, 304, + 306, 570, 307, + 309, 571, 310, + 312, 572, 313, + 573, 574, 575, +}; + +const int brick_Cube_triangles_length = (sizeof (brick_Cube_triangles)) / (sizeof (brick_Cube_triangles[0])); + +const float brick_vertices[] = { + -0.817802f, 0.000000f, -0.831219f, 0.044995f, 0.962648f, -0.0000f, -1.0000f, -0.0000f, + 0.831219f, 0.000000f, -0.803721f, 0.962429f, 0.947171f, -0.0000f, -1.0000f, -0.0000f, + 0.817802f, 0.000000f, 0.831219f, 0.955005f, 0.037352f, -0.0000f, -1.0000f, -0.0000f, + 0.653358f, 0.454219f, -0.400308f, 1.000000f, 0.967273f, 0.7923f, 0.5855f, -0.1715f, + 0.873530f, 0.050904f, -0.760079f, 1.000000f, 0.947586f, 0.7923f, 0.5855f, -0.1715f, + 0.864231f, 0.050306f, -0.805079f, 0.998435f, 0.975457f, 0.7923f, 0.5855f, -0.1715f, + 0.625297f, 0.458580f, 0.428311f, 0.977775f, 0.000000f, 0.5441f, 0.7184f, 0.4334f, + 0.864231f, 0.050306f, 0.805079f, 0.998435f, 0.024543f, 0.5441f, 0.7184f, 0.4334f, + 0.653358f, 0.454219f, 0.400308f, 1.000000f, 0.032727f, 0.5441f, 0.7184f, 0.4334f, + -0.593538f, 0.452916f, -0.447084f, 0.048994f, 1.000000f, -0.2348f, 0.7466f, -0.6225f, + -0.838522f, 0.049848f, -0.838097f, 0.019196f, 0.998032f, -0.2348f, 0.7466f, -0.6225f, + -0.625297f, 0.458580f, -0.428311f, 0.022225f, 1.000000f, -0.2348f, 0.7466f, -0.6225f, + 0.573413f, 0.500000f, 0.333413f, 0.947979f, 0.083234f, -0.0000f, 1.0000f, -0.0000f, + -0.573413f, 0.500000f, -0.333413f, 0.052021f, 0.916766f, -0.0000f, 1.0000f, -0.0000f, + -0.573413f, 0.500000f, 0.333413f, 0.052021f, 0.083234f, -0.0000f, 1.0000f, -0.0000f, + 0.653358f, 0.454219f, -0.400308f, 1.000000f, 0.967273f, 0.7282f, 0.6745f, -0.1215f, + 0.645925f, 0.469791f, -0.358414f, 1.000000f, 0.934301f, 0.7282f, 0.6745f, -0.1215f, + 0.670720f, 0.440923f, -0.370061f, 1.000000f, 0.924907f, 0.7282f, 0.6745f, -0.1215f, + 0.653358f, 0.454219f, -0.400308f, 1.000000f, 0.967273f, 0.5040f, 0.7407f, -0.4442f, + 0.617215f, 0.476518f, -0.404137f, 0.978658f, 1.000000f, 0.5040f, 0.7407f, -0.4442f, + 0.635801f, 0.474526f, -0.386369f, 1.000000f, 0.971374f, 0.5040f, 0.7407f, -0.4442f, + 0.587151f, 0.475900f, -0.414338f, 0.954276f, 1.000000f, 0.1743f, 0.8216f, -0.5427f, + 0.625297f, 0.458580f, -0.428311f, 0.977775f, 1.000000f, 0.1743f, 0.8216f, -0.5427f, + 0.593538f, 0.452916f, -0.447084f, 0.951006f, 1.000000f, 0.1743f, 0.8216f, -0.5427f, + 0.587151f, 0.475900f, -0.414338f, 0.954276f, 1.000000f, 0.0997f, 0.9314f, -0.3501f, + 0.612471f, 0.486997f, -0.377607f, 0.978493f, 0.972008f, 0.0997f, 0.9314f, -0.3501f, + 0.617215f, 0.476518f, -0.404137f, 0.978658f, 1.000000f, 0.0997f, 0.9314f, -0.3501f, + 0.610465f, 0.491320f, -0.345059f, 0.976926f, 0.931324f, 0.1837f, 0.9729f, -0.1406f, + 0.579800f, 0.493098f, -0.372820f, 0.952969f, 0.966026f, 0.1837f, 0.9729f, -0.1406f, + 0.573413f, 0.500000f, -0.333413f, 0.947979f, 0.916766f, 0.1837f, 0.9729f, -0.1406f, + 0.645925f, 0.469791f, -0.358414f, 1.000000f, 0.934301f, 0.4936f, 0.8655f, -0.0845f, + 0.612471f, 0.486997f, -0.377607f, 0.978493f, 0.972008f, 0.4936f, 0.8655f, -0.0845f, + 0.610465f, 0.491320f, -0.345059f, 0.976926f, 0.931324f, 0.4936f, 0.8655f, -0.0845f, + 0.635801f, 0.474526f, -0.386369f, 1.000000f, 0.971374f, 0.3667f, 0.8858f, -0.2843f, + 0.617215f, 0.476518f, -0.404137f, 0.978658f, 1.000000f, 0.3667f, 0.8858f, -0.2843f, + 0.612471f, 0.486997f, -0.377607f, 0.978493f, 0.972008f, 0.3667f, 0.8858f, -0.2843f, + -0.645925f, 0.469791f, -0.358414f, 0.000000f, 0.934302f, -0.7282f, 0.6745f, -0.1215f, + -0.653358f, 0.454219f, -0.400308f, 0.000000f, 0.967273f, -0.7282f, 0.6745f, -0.1215f, + -0.670720f, 0.440923f, -0.370061f, 0.000000f, 0.924907f, -0.7282f, 0.6745f, -0.1215f, + -0.645925f, 0.469791f, -0.358414f, 0.000000f, 0.934302f, -0.4658f, 0.8847f, -0.0188f, + -0.612471f, 0.486997f, -0.377607f, 0.021507f, 0.972008f, -0.4658f, 0.8847f, -0.0188f, + -0.635801f, 0.474526f, -0.386368f, 0.000000f, 0.971374f, -0.4658f, 0.8847f, -0.0188f, + -0.579800f, 0.493098f, -0.372820f, 0.047031f, 0.966026f, -0.1837f, 0.9729f, -0.1406f, + -0.610465f, 0.491320f, -0.345059f, 0.023074f, 0.931324f, -0.1837f, 0.9729f, -0.1406f, + -0.573413f, 0.500000f, -0.333413f, 0.052021f, 0.916766f, -0.1837f, 0.9729f, -0.1406f, + -0.587151f, 0.475900f, -0.414338f, 0.045724f, 1.000000f, -0.1197f, 0.9246f, -0.3618f, + -0.612471f, 0.486997f, -0.377607f, 0.021507f, 0.972008f, -0.1197f, 0.9246f, -0.3618f, + -0.579800f, 0.493098f, -0.372820f, 0.047031f, 0.966026f, -0.1197f, 0.9246f, -0.3618f, + -0.625297f, 0.458580f, -0.428311f, 0.022225f, 1.000000f, -0.1743f, 0.8216f, -0.5427f, + -0.587151f, 0.475900f, -0.414338f, 0.045724f, 1.000000f, -0.1743f, 0.8216f, -0.5427f, + -0.593538f, 0.452916f, -0.447084f, 0.048994f, 1.000000f, -0.1743f, 0.8216f, -0.5427f, + -0.653358f, 0.454219f, -0.400308f, 0.000000f, 0.967273f, -0.5124f, 0.7627f, -0.3947f, + -0.617215f, 0.476518f, -0.404137f, 0.021342f, 1.000000f, -0.5124f, 0.7627f, -0.3947f, + -0.625297f, 0.458580f, -0.428311f, 0.022225f, 1.000000f, -0.5124f, 0.7627f, -0.3947f, + -0.635801f, 0.474526f, -0.386368f, 0.000000f, 0.971374f, -0.3667f, 0.8858f, -0.2843f, + -0.612471f, 0.486997f, -0.377607f, 0.021507f, 0.972008f, -0.3667f, 0.8858f, -0.2843f, + -0.617215f, 0.476518f, -0.404137f, 0.021342f, 1.000000f, -0.3667f, 0.8858f, -0.2843f, + 0.645925f, 0.469791f, 0.358414f, 1.000000f, 0.065698f, 0.7282f, 0.6745f, 0.1215f, + 0.653358f, 0.454219f, 0.400308f, 1.000000f, 0.032727f, 0.7282f, 0.6745f, 0.1215f, + 0.670720f, 0.440923f, 0.370061f, 1.000000f, 0.075093f, 0.7282f, 0.6745f, 0.1215f, + 0.645925f, 0.469791f, 0.358414f, 1.000000f, 0.065698f, 0.4658f, 0.8847f, 0.0188f, + 0.612471f, 0.486997f, 0.377607f, 0.978493f, 0.027992f, 0.4658f, 0.8847f, 0.0188f, + 0.635801f, 0.474526f, 0.386368f, 1.000000f, 0.028626f, 0.4658f, 0.8847f, 0.0188f, + 0.579800f, 0.493098f, 0.372820f, 0.952969f, 0.033974f, 0.1837f, 0.9729f, 0.1406f, + 0.610465f, 0.491320f, 0.345059f, 0.976926f, 0.068676f, 0.1837f, 0.9729f, 0.1406f, + 0.573413f, 0.500000f, 0.333413f, 0.947979f, 0.083234f, 0.1837f, 0.9729f, 0.1406f, + 0.587151f, 0.475900f, 0.414338f, 0.954276f, 0.000000f, 0.1197f, 0.9246f, 0.3618f, + 0.612471f, 0.486997f, 0.377607f, 0.978493f, 0.027992f, 0.1197f, 0.9246f, 0.3618f, + 0.579800f, 0.493098f, 0.372820f, 0.952969f, 0.033974f, 0.1197f, 0.9246f, 0.3618f, + 0.625297f, 0.458580f, 0.428311f, 0.977775f, 0.000000f, 0.1743f, 0.8216f, 0.5427f, + 0.587151f, 0.475900f, 0.414338f, 0.954276f, 0.000000f, 0.1743f, 0.8216f, 0.5427f, + 0.593538f, 0.452916f, 0.447084f, 0.951006f, 0.000000f, 0.1743f, 0.8216f, 0.5427f, + 0.653358f, 0.454219f, 0.400308f, 1.000000f, 0.032727f, 0.5124f, 0.7627f, 0.3947f, + 0.617215f, 0.476518f, 0.404137f, 0.978658f, 0.000000f, 0.5124f, 0.7627f, 0.3947f, + 0.625297f, 0.458580f, 0.428311f, 0.977775f, 0.000000f, 0.5124f, 0.7627f, 0.3947f, + 0.635801f, 0.474526f, 0.386368f, 1.000000f, 0.028626f, 0.3667f, 0.8858f, 0.2843f, + 0.612471f, 0.486997f, 0.377607f, 0.978493f, 0.027992f, 0.3667f, 0.8858f, 0.2843f, + 0.617215f, 0.476518f, 0.404137f, 0.978658f, 0.000000f, 0.3667f, 0.8858f, 0.2843f, + -0.587151f, 0.475900f, 0.414338f, 0.045724f, 0.000000f, -0.1743f, 0.8216f, 0.5427f, + -0.625297f, 0.458580f, 0.428311f, 0.022225f, 0.000000f, -0.1743f, 0.8216f, 0.5427f, + -0.593538f, 0.452916f, 0.447084f, 0.048994f, 0.000000f, -0.1743f, 0.8216f, 0.5427f, + -0.587151f, 0.475900f, 0.414338f, 0.045724f, 0.000000f, -0.0997f, 0.9314f, 0.3501f, + -0.612471f, 0.486997f, 0.377607f, 0.021507f, 0.027992f, -0.0997f, 0.9314f, 0.3501f, + -0.617215f, 0.476518f, 0.404137f, 0.021342f, 0.000000f, -0.0997f, 0.9314f, 0.3501f, + -0.610465f, 0.491320f, 0.345059f, 0.023074f, 0.068676f, -0.1837f, 0.9729f, 0.1406f, + -0.579800f, 0.493098f, 0.372820f, 0.047031f, 0.033974f, -0.1837f, 0.9729f, 0.1406f, + -0.573413f, 0.500000f, 0.333413f, 0.052021f, 0.083234f, -0.1837f, 0.9729f, 0.1406f, + -0.645925f, 0.469791f, 0.358414f, 0.000000f, 0.065698f, -0.4936f, 0.8655f, 0.0845f, + -0.612471f, 0.486997f, 0.377607f, 0.021507f, 0.027992f, -0.4936f, 0.8655f, 0.0845f, + -0.610465f, 0.491320f, 0.345059f, 0.023074f, 0.068676f, -0.4936f, 0.8655f, 0.0845f, + -0.653358f, 0.454219f, 0.400308f, 0.000000f, 0.032727f, -0.7282f, 0.6745f, 0.1215f, + -0.645925f, 0.469791f, 0.358414f, 0.000000f, 0.065698f, -0.7282f, 0.6745f, 0.1215f, + -0.670720f, 0.440923f, 0.370061f, 0.000000f, 0.075093f, -0.7282f, 0.6745f, 0.1215f, + -0.653358f, 0.454219f, 0.400308f, 0.000000f, 0.032727f, -0.5040f, 0.7407f, 0.4442f, + -0.617215f, 0.476518f, 0.404137f, 0.021342f, 0.000000f, -0.5040f, 0.7407f, 0.4442f, + -0.635801f, 0.474526f, 0.386369f, 0.000000f, 0.028626f, -0.5040f, 0.7407f, 0.4442f, + -0.617215f, 0.476518f, 0.404137f, 0.021342f, 0.000000f, -0.3667f, 0.8858f, 0.2843f, + -0.612471f, 0.486997f, 0.377607f, 0.021507f, 0.027992f, -0.3667f, 0.8858f, 0.2843f, + -0.635801f, 0.474526f, 0.386369f, 0.000000f, 0.028626f, -0.3667f, 0.8858f, 0.2843f, + 0.670720f, 0.440923f, -0.370061f, 1.000000f, 0.924907f, 0.7586f, 0.6516f, -0.0000f, + 0.645925f, 0.469791f, 0.358414f, 1.000000f, 0.065698f, 0.7586f, 0.6516f, -0.0000f, + 0.670720f, 0.440923f, 0.370061f, 1.000000f, 0.075093f, 0.7586f, 0.6516f, -0.0000f, + 0.645925f, 0.469791f, -0.358414f, 1.000000f, 0.934301f, 0.5190f, 0.8548f, -0.0000f, + 0.610465f, 0.491320f, 0.345059f, 0.976926f, 0.068676f, 0.5190f, 0.8548f, -0.0000f, + 0.645925f, 0.469791f, 0.358414f, 1.000000f, 0.065698f, 0.5190f, 0.8548f, -0.0000f, + 0.610465f, 0.491320f, 0.345059f, 0.976926f, 0.068676f, 0.2281f, 0.9736f, -0.0000f, + 0.573413f, 0.500000f, -0.333413f, 0.947979f, 0.916766f, 0.2281f, 0.9736f, -0.0000f, + 0.573413f, 0.500000f, 0.333413f, 0.947979f, 0.083234f, 0.2281f, 0.9736f, -0.0000f, + 0.593538f, 0.452916f, 0.447084f, 0.951006f, 0.000000f, -0.0000f, 0.8185f, 0.5745f, + -0.587151f, 0.475900f, 0.414338f, 0.045724f, 0.000000f, -0.0000f, 0.8185f, 0.5745f, + -0.593538f, 0.452916f, 0.447084f, 0.048994f, 0.000000f, -0.0000f, 0.8185f, 0.5745f, + -0.587151f, 0.475900f, 0.414338f, 0.045724f, 0.000000f, -0.0000f, 0.9239f, 0.3827f, + 0.579800f, 0.493098f, 0.372820f, 0.952969f, 0.033974f, -0.0000f, 0.9239f, 0.3827f, + -0.579800f, 0.493098f, 0.372820f, 0.047031f, 0.033974f, -0.0000f, 0.9239f, 0.3827f, + 0.579800f, 0.493098f, 0.372820f, 0.952969f, 0.033974f, -0.0000f, 0.9850f, 0.1725f, + -0.573413f, 0.500000f, 0.333413f, 0.052021f, 0.083234f, -0.0000f, 0.9850f, 0.1725f, + -0.579800f, 0.493098f, 0.372820f, 0.047031f, 0.033974f, -0.0000f, 0.9850f, 0.1725f, + -0.670720f, 0.440923f, 0.370061f, 0.000000f, 0.075093f, -0.7586f, 0.6516f, -0.0000f, + -0.645925f, 0.469791f, -0.358414f, 0.000000f, 0.934302f, -0.7586f, 0.6516f, -0.0000f, + -0.670720f, 0.440923f, -0.370061f, 0.000000f, 0.924907f, -0.7586f, 0.6516f, -0.0000f, + -0.645925f, 0.469791f, 0.358414f, 0.000000f, 0.065698f, -0.5190f, 0.8548f, -0.0000f, + -0.610465f, 0.491320f, -0.345059f, 0.023074f, 0.931324f, -0.5190f, 0.8548f, -0.0000f, + -0.645925f, 0.469791f, -0.358414f, 0.000000f, 0.934302f, -0.5190f, 0.8548f, -0.0000f, + -0.610465f, 0.491320f, -0.345059f, 0.023074f, 0.931324f, -0.2281f, 0.9736f, -0.0000f, + -0.573413f, 0.500000f, 0.333413f, 0.052021f, 0.083234f, -0.2281f, 0.9736f, -0.0000f, + -0.573413f, 0.500000f, -0.333413f, 0.052021f, 0.916766f, -0.2281f, 0.9736f, -0.0000f, + -0.593538f, 0.452916f, -0.447084f, 0.048994f, 1.000000f, -0.0000f, 0.8185f, -0.5745f, + 0.587151f, 0.475900f, -0.414338f, 0.954276f, 1.000000f, -0.0000f, 0.8185f, -0.5745f, + 0.593538f, 0.452916f, -0.447084f, 0.951006f, 1.000000f, -0.0000f, 0.8185f, -0.5745f, + 0.587151f, 0.475900f, -0.414338f, 0.954276f, 1.000000f, -0.0000f, 0.9239f, -0.3827f, + -0.579800f, 0.493098f, -0.372820f, 0.047031f, 0.966026f, -0.0000f, 0.9239f, -0.3827f, + 0.579800f, 0.493098f, -0.372820f, 0.952969f, 0.966026f, -0.0000f, 0.9239f, -0.3827f, + -0.579800f, 0.493098f, -0.372820f, 0.047031f, 0.966026f, -0.0000f, 0.9850f, -0.1725f, + 0.573413f, 0.500000f, -0.333413f, 0.947979f, 0.916766f, -0.0000f, 0.9850f, -0.1725f, + 0.579800f, 0.493098f, -0.372820f, 0.952969f, 0.966026f, -0.0000f, 0.9850f, -0.1725f, + -0.864231f, 0.050306f, 0.805079f, 0.001565f, 0.024543f, -0.5441f, 0.7184f, 0.4334f, + -0.625297f, 0.458580f, 0.428311f, 0.022225f, 0.000000f, -0.5441f, 0.7184f, 0.4334f, + -0.653358f, 0.454219f, 0.400308f, 0.000000f, 0.032727f, -0.5441f, 0.7184f, 0.4334f, + -0.873530f, 0.050904f, 0.760079f, 0.000000f, 0.052414f, -0.7820f, 0.5943f, 0.1876f, + -0.653358f, 0.454219f, 0.400308f, 0.000000f, 0.032727f, -0.7820f, 0.5943f, 0.1876f, + -0.670720f, 0.440923f, 0.370061f, 0.000000f, 0.075093f, -0.7820f, 0.5943f, 0.1876f, + 0.593538f, 0.452916f, 0.447084f, 0.951006f, 0.000000f, -0.0000f, 0.7071f, 0.7071f, + -0.803194f, 0.049732f, 0.850268f, 0.040466f, 0.000000f, -0.0000f, 0.7071f, 0.7071f, + 0.803194f, 0.049732f, 0.850268f, 0.959534f, 0.000000f, -0.0000f, 0.7071f, 0.7071f, + -0.838522f, 0.049848f, 0.838097f, 0.019196f, 0.001968f, -0.2348f, 0.7466f, 0.6225f, + -0.593538f, 0.452916f, 0.447084f, 0.048994f, 0.000000f, -0.2348f, 0.7466f, 0.6225f, + -0.625297f, 0.458580f, 0.428311f, 0.022225f, 0.000000f, -0.2348f, 0.7466f, 0.6225f, + 0.593538f, 0.452916f, 0.447084f, 0.951006f, 0.000000f, 0.2348f, 0.7466f, 0.6225f, + 0.838522f, 0.049848f, 0.838097f, 0.980804f, 0.001968f, 0.2348f, 0.7466f, 0.6225f, + 0.625297f, 0.458580f, 0.428311f, 0.977775f, 0.000000f, 0.2348f, 0.7466f, 0.6225f, + -0.625297f, 0.458580f, -0.428311f, 0.022225f, 1.000000f, -0.5441f, 0.7184f, -0.4334f, + -0.864231f, 0.050306f, -0.805079f, 0.001565f, 0.975457f, -0.5441f, 0.7184f, -0.4334f, + -0.653358f, 0.454219f, -0.400308f, 0.000000f, 0.967273f, -0.5441f, 0.7184f, -0.4334f, + 0.653358f, 0.454219f, 0.400308f, 1.000000f, 0.032727f, 0.7820f, 0.5943f, 0.1876f, + 0.873530f, 0.050904f, 0.760079f, 1.000000f, 0.052414f, 0.7820f, 0.5943f, 0.1876f, + 0.670720f, 0.440923f, 0.370061f, 1.000000f, 0.075093f, 0.7820f, 0.5943f, 0.1876f, + -0.670720f, 0.440923f, -0.370061f, 0.000000f, 0.924907f, -0.8872f, 0.4614f, -0.0000f, + -0.873530f, 0.050904f, 0.760079f, 0.000000f, 0.052414f, -0.8872f, 0.4614f, -0.0000f, + -0.670720f, 0.440923f, 0.370061f, 0.000000f, 0.075093f, -0.8872f, 0.4614f, -0.0000f, + -0.593538f, 0.452916f, -0.447084f, 0.048994f, 1.000000f, -0.0000f, 0.7071f, -0.7071f, + 0.803194f, 0.049732f, -0.850268f, 0.959534f, 1.000000f, -0.0000f, 0.7071f, -0.7071f, + -0.803194f, 0.049732f, -0.850268f, 0.040466f, 1.000000f, -0.0000f, 0.7071f, -0.7071f, + -0.653358f, 0.454219f, -0.400308f, 0.000000f, 0.967273f, -0.7820f, 0.5943f, -0.1876f, + -0.873530f, 0.050904f, -0.760079f, 0.000000f, 0.947586f, -0.7820f, 0.5943f, -0.1876f, + -0.670720f, 0.440923f, -0.370061f, 0.000000f, 0.924907f, -0.7820f, 0.5943f, -0.1876f, + 0.670720f, 0.440923f, 0.370061f, 1.000000f, 0.075093f, 0.8872f, 0.4614f, -0.0000f, + 0.873530f, 0.050904f, -0.760079f, 1.000000f, 0.947586f, 0.8872f, 0.4614f, -0.0000f, + 0.670720f, 0.440923f, -0.370061f, 1.000000f, 0.924907f, 0.8872f, 0.4614f, -0.0000f, + 0.625297f, 0.458580f, -0.428311f, 0.977775f, 1.000000f, 0.5440f, 0.7184f, -0.4335f, + 0.864231f, 0.050306f, -0.805079f, 0.998435f, 0.975457f, 0.5440f, 0.7184f, -0.4335f, + 0.838522f, 0.049848f, -0.838097f, 0.980804f, 0.998032f, 0.5440f, 0.7184f, -0.4335f, + -0.831219f, 0.000000f, 0.803721f, 0.037571f, 0.052829f, -0.2201f, -0.9745f, 0.0444f, + -0.855035f, 0.006740f, 0.833636f, 0.023691f, 0.035704f, -0.2201f, -0.9745f, 0.0444f, + -0.862063f, 0.006820f, 0.800532f, 0.020471f, 0.054779f, -0.2201f, -0.9745f, 0.0444f, + -0.862063f, 0.006820f, 0.800532f, 0.020471f, 0.054779f, -0.8244f, -0.5402f, 0.1691f, + -0.868805f, 0.025153f, 0.826239f, 0.002578f, 0.022467f, -0.8244f, -0.5402f, 0.1691f, + -0.877550f, 0.025452f, 0.784558f, 0.000085f, 0.048821f, -0.8244f, -0.5402f, 0.1691f, + -0.877550f, 0.025452f, 0.784558f, 0.000085f, 0.048821f, -0.9224f, 0.3333f, 0.1950f, + -0.864231f, 0.050306f, 0.805079f, 0.001565f, 0.024543f, -0.9224f, 0.3333f, 0.1950f, + -0.873530f, 0.050904f, 0.760079f, 0.000000f, 0.052414f, -0.9224f, 0.3333f, 0.1950f, + -0.826613f, -0.000000f, 0.825289f, 0.040011f, 0.040618f, -0.1876f, -0.9714f, 0.1455f, + -0.840471f, 0.006678f, 0.852013f, 0.032047f, 0.025150f, -0.1876f, -0.9714f, 0.1455f, + -0.855035f, 0.006740f, 0.833636f, 0.023691f, 0.035704f, -0.1876f, -0.9714f, 0.1455f, + -0.855035f, 0.006740f, 0.833636f, 0.023691f, 0.035704f, -0.7452f, -0.3228f, 0.5835f, + -0.846012f, 0.024924f, 0.855217f, 0.019436f, 0.002175f, -0.7452f, -0.3228f, 0.5835f, + -0.868805f, 0.025153f, 0.826239f, 0.002578f, 0.022467f, -0.7452f, -0.3228f, 0.5835f, + -0.868805f, 0.025153f, 0.826239f, 0.002578f, 0.022467f, -0.6535f, 0.5533f, 0.5165f, + -0.838522f, 0.049848f, 0.838097f, 0.019196f, 0.001968f, -0.6535f, 0.5533f, 0.5165f, + -0.864231f, 0.050306f, 0.805079f, 0.001565f, 0.024543f, -0.6535f, 0.5533f, 0.5165f, + -0.823382f, -0.000000f, 0.829343f, 0.041831f, 0.038350f, -0.0776f, -0.9707f, 0.2274f, + -0.819963f, 0.006663f, 0.858947f, 0.043890f, 0.021812f, -0.0776f, -0.9707f, 0.2274f, + -0.840471f, 0.006678f, 0.852013f, 0.032047f, 0.025150f, -0.0776f, -0.9707f, 0.2274f, + -0.819963f, 0.006663f, 0.858947f, 0.043890f, 0.021812f, -0.3099f, -0.2550f, 0.9159f, + -0.846012f, 0.024924f, 0.855217f, 0.019436f, 0.002175f, -0.3099f, -0.2550f, 0.9159f, + -0.840471f, 0.006678f, 0.852013f, 0.032047f, 0.025150f, -0.3099f, -0.2550f, 0.9159f, + -0.814616f, 0.024866f, 0.865919f, 0.039098f, 0.000065f, -0.2575f, 0.5985f, 0.7586f, + -0.838522f, 0.049848f, 0.838097f, 0.019196f, 0.001968f, -0.2575f, 0.5985f, 0.7586f, + -0.846012f, 0.024924f, 0.855217f, 0.019436f, 0.002175f, -0.2575f, 0.5985f, 0.7586f, + 0.823382f, 0.000000f, 0.829343f, 0.958169f, 0.038350f, 0.0764f, -0.9708f, 0.2273f, + 0.819963f, 0.006663f, 0.858947f, 0.956110f, 0.021812f, 0.0764f, -0.9708f, 0.2273f, + 0.817802f, 0.000000f, 0.831219f, 0.955005f, 0.037352f, 0.0764f, -0.9708f, 0.2273f, + 0.819963f, 0.006663f, 0.858947f, 0.956110f, 0.021812f, 0.3121f, -0.2585f, 0.9142f, + 0.846012f, 0.024924f, 0.855217f, 0.980564f, 0.002175f, 0.3121f, -0.2585f, 0.9142f, + 0.814616f, 0.024866f, 0.865919f, 0.960902f, 0.000065f, 0.3121f, -0.2585f, 0.9142f, + 0.814616f, 0.024866f, 0.865919f, 0.960902f, 0.000065f, 0.2595f, 0.5970f, 0.7591f, + 0.838522f, 0.049848f, 0.838097f, 0.980804f, 0.001968f, 0.2595f, 0.5970f, 0.7591f, + 0.803194f, 0.049732f, 0.850268f, 0.959534f, 0.000000f, 0.2595f, 0.5970f, 0.7591f, + 0.826613f, 0.000000f, 0.825289f, 0.959989f, 0.040618f, 0.1846f, -0.9717f, 0.1471f, + 0.840471f, 0.006678f, 0.852013f, 0.967953f, 0.025150f, 0.1846f, -0.9717f, 0.1471f, + 0.823382f, 0.000000f, 0.829343f, 0.958169f, 0.038350f, 0.1846f, -0.9717f, 0.1471f, + 0.855035f, 0.006740f, 0.833636f, 0.976309f, 0.035704f, 0.7409f, -0.3280f, 0.5861f, + 0.846012f, 0.024924f, 0.855217f, 0.980564f, 0.002175f, 0.7409f, -0.3280f, 0.5861f, + 0.840471f, 0.006678f, 0.852013f, 0.967953f, 0.025150f, 0.7409f, -0.3280f, 0.5861f, + 0.868805f, 0.025153f, 0.826239f, 0.997422f, 0.022467f, 0.6532f, 0.5522f, 0.5181f, + 0.838522f, 0.049848f, 0.838097f, 0.980804f, 0.001968f, 0.6532f, 0.5522f, 0.5181f, + 0.846012f, 0.024924f, 0.855217f, 0.980564f, 0.002175f, 0.6532f, 0.5522f, 0.5181f, + 0.831219f, -0.000000f, 0.803721f, 0.962429f, 0.052829f, 0.2175f, -0.9749f, 0.0465f, + 0.855035f, 0.006740f, 0.833636f, 0.976309f, 0.035704f, 0.2175f, -0.9749f, 0.0465f, + 0.826613f, 0.000000f, 0.825289f, 0.959989f, 0.040618f, 0.2175f, -0.9749f, 0.0465f, + 0.862063f, 0.006820f, 0.800532f, 0.979529f, 0.054779f, 0.8208f, -0.5443f, 0.1729f, + 0.868805f, 0.025153f, 0.826239f, 0.997422f, 0.022467f, 0.8208f, -0.5443f, 0.1729f, + 0.855035f, 0.006740f, 0.833636f, 0.976309f, 0.035704f, 0.8208f, -0.5443f, 0.1729f, + 0.877550f, 0.025452f, 0.784558f, 0.999915f, 0.048821f, 0.9225f, 0.3326f, 0.1959f, + 0.864231f, 0.050306f, 0.805079f, 0.998435f, 0.024543f, 0.9225f, 0.3326f, 0.1959f, + 0.868805f, 0.025153f, 0.826239f, 0.997422f, 0.022467f, 0.9225f, 0.3326f, 0.1959f, + -0.823382f, 0.000000f, -0.829343f, 0.041831f, 0.961650f, -0.0764f, -0.9708f, -0.2273f, + -0.819963f, 0.006663f, -0.858947f, 0.043890f, 0.978188f, -0.0764f, -0.9708f, -0.2273f, + -0.817802f, 0.000000f, -0.831219f, 0.044995f, 0.962648f, -0.0764f, -0.9708f, -0.2273f, + -0.819963f, 0.006663f, -0.858947f, 0.043890f, 0.978188f, -0.3121f, -0.2585f, -0.9142f, + -0.846012f, 0.024924f, -0.855217f, 0.019436f, 0.997825f, -0.3121f, -0.2585f, -0.9142f, + -0.814616f, 0.024866f, -0.865919f, 0.039098f, 0.999935f, -0.3121f, -0.2585f, -0.9142f, + -0.814616f, 0.024866f, -0.865919f, 0.039098f, 0.999935f, -0.2595f, 0.5970f, -0.7591f, + -0.838522f, 0.049848f, -0.838097f, 0.019196f, 0.998032f, -0.2595f, 0.5970f, -0.7591f, + -0.803194f, 0.049732f, -0.850268f, 0.040466f, 1.000000f, -0.2595f, 0.5970f, -0.7591f, + -0.826613f, 0.000000f, -0.825289f, 0.040011f, 0.959383f, -0.1846f, -0.9717f, -0.1471f, + -0.840471f, 0.006678f, -0.852013f, 0.032047f, 0.974849f, -0.1846f, -0.9717f, -0.1471f, + -0.823382f, 0.000000f, -0.829343f, 0.041831f, 0.961650f, -0.1846f, -0.9717f, -0.1471f, + -0.855035f, 0.006740f, -0.833636f, 0.023691f, 0.964296f, -0.7409f, -0.3280f, -0.5861f, + -0.846012f, 0.024924f, -0.855217f, 0.019436f, 0.997825f, -0.7409f, -0.3280f, -0.5861f, + -0.840471f, 0.006678f, -0.852013f, 0.032047f, 0.974849f, -0.7409f, -0.3280f, -0.5861f, + -0.868805f, 0.025153f, -0.826239f, 0.002578f, 0.977533f, -0.6532f, 0.5522f, -0.5181f, + -0.838522f, 0.049848f, -0.838097f, 0.019196f, 0.998032f, -0.6532f, 0.5522f, -0.5181f, + -0.846012f, 0.024924f, -0.855217f, 0.019436f, 0.997825f, -0.6532f, 0.5522f, -0.5181f, + -0.831219f, -0.000000f, -0.803721f, 0.037571f, 0.947172f, -0.2175f, -0.9749f, -0.0465f, + -0.855035f, 0.006740f, -0.833636f, 0.023691f, 0.964296f, -0.2175f, -0.9749f, -0.0465f, + -0.826613f, 0.000000f, -0.825289f, 0.040011f, 0.959383f, -0.2175f, -0.9749f, -0.0465f, + -0.862063f, 0.006820f, -0.800532f, 0.020471f, 0.945221f, -0.8208f, -0.5443f, -0.1729f, + -0.868805f, 0.025153f, -0.826239f, 0.002578f, 0.977533f, -0.8208f, -0.5443f, -0.1729f, + -0.855035f, 0.006740f, -0.833636f, 0.023691f, 0.964296f, -0.8208f, -0.5443f, -0.1729f, + -0.877550f, 0.025452f, -0.784558f, 0.000085f, 0.951179f, -0.9225f, 0.3326f, -0.1959f, + -0.864231f, 0.050306f, -0.805079f, 0.001565f, 0.975457f, -0.9225f, 0.3326f, -0.1959f, + -0.868805f, 0.025153f, -0.826239f, 0.002578f, 0.977533f, -0.9225f, 0.3326f, -0.1959f, + 0.823382f, -0.000000f, -0.829343f, 0.958169f, 0.961650f, 0.0776f, -0.9707f, -0.2274f, + 0.819963f, 0.006663f, -0.858947f, 0.956110f, 0.978188f, 0.0776f, -0.9707f, -0.2274f, + 0.840471f, 0.006678f, -0.852013f, 0.967953f, 0.974850f, 0.0776f, -0.9707f, -0.2274f, + 0.819963f, 0.006663f, -0.858947f, 0.956110f, 0.978188f, 0.3099f, -0.2550f, -0.9159f, + 0.846012f, 0.024924f, -0.855217f, 0.980564f, 0.997825f, 0.3099f, -0.2550f, -0.9159f, + 0.840471f, 0.006678f, -0.852013f, 0.967953f, 0.974850f, 0.3099f, -0.2550f, -0.9159f, + 0.814616f, 0.024866f, -0.865919f, 0.960902f, 0.999935f, 0.2575f, 0.5985f, -0.7586f, + 0.838522f, 0.049848f, -0.838097f, 0.980804f, 0.998032f, 0.2575f, 0.5985f, -0.7586f, + 0.846012f, 0.024924f, -0.855217f, 0.980564f, 0.997825f, 0.2575f, 0.5985f, -0.7586f, + 0.826613f, -0.000000f, -0.825289f, 0.959989f, 0.959382f, 0.1876f, -0.9714f, -0.1455f, + 0.840471f, 0.006678f, -0.852013f, 0.967953f, 0.974850f, 0.1876f, -0.9714f, -0.1455f, + 0.855035f, 0.006740f, -0.833636f, 0.976309f, 0.964296f, 0.1876f, -0.9714f, -0.1455f, + 0.855035f, 0.006740f, -0.833636f, 0.976309f, 0.964296f, 0.7452f, -0.3228f, -0.5835f, + 0.846012f, 0.024924f, -0.855217f, 0.980564f, 0.997825f, 0.7452f, -0.3228f, -0.5835f, + 0.868805f, 0.025153f, -0.826239f, 0.997422f, 0.977533f, 0.7452f, -0.3228f, -0.5835f, + 0.868805f, 0.025153f, -0.826239f, 0.997422f, 0.977533f, 0.6535f, 0.5533f, -0.5165f, + 0.838522f, 0.049848f, -0.838097f, 0.980804f, 0.998032f, 0.6535f, 0.5533f, -0.5165f, + 0.864231f, 0.050306f, -0.805079f, 0.998435f, 0.975457f, 0.6535f, 0.5533f, -0.5165f, + 0.831219f, 0.000000f, -0.803721f, 0.962429f, 0.947171f, 0.2201f, -0.9745f, -0.0444f, + 0.855035f, 0.006740f, -0.833636f, 0.976309f, 0.964296f, 0.2201f, -0.9745f, -0.0444f, + 0.862063f, 0.006820f, -0.800532f, 0.979529f, 0.945221f, 0.2201f, -0.9745f, -0.0444f, + 0.862063f, 0.006820f, -0.800532f, 0.979529f, 0.945221f, 0.8244f, -0.5402f, -0.1691f, + 0.868805f, 0.025153f, -0.826239f, 0.997422f, 0.977533f, 0.8244f, -0.5402f, -0.1691f, + 0.877550f, 0.025452f, -0.784558f, 0.999915f, 0.951179f, 0.8244f, -0.5402f, -0.1691f, + 0.877550f, 0.025452f, -0.784558f, 0.999915f, 0.951179f, 0.9224f, 0.3333f, -0.1950f, + 0.864231f, 0.050306f, -0.805079f, 0.998435f, 0.975457f, 0.9224f, 0.3333f, -0.1950f, + 0.873530f, 0.050904f, -0.760079f, 1.000000f, 0.947586f, 0.9224f, 0.3333f, -0.1950f, + 0.831219f, 0.000000f, -0.803721f, 0.962429f, 0.947171f, 0.2159f, -0.9764f, -0.0000f, + 0.862063f, 0.006820f, 0.800532f, 0.979529f, 0.054779f, 0.2159f, -0.9764f, -0.0000f, + 0.831219f, -0.000000f, 0.803721f, 0.962429f, 0.052829f, 0.2159f, -0.9764f, -0.0000f, + 0.862063f, 0.006820f, -0.800532f, 0.979529f, 0.945221f, 0.7690f, -0.6392f, -0.0000f, + 0.877550f, 0.025452f, 0.784558f, 0.999915f, 0.048821f, 0.7690f, -0.6392f, -0.0000f, + 0.862063f, 0.006820f, 0.800532f, 0.979529f, 0.054779f, 0.7690f, -0.6392f, -0.0000f, + 0.877550f, 0.025452f, -0.784558f, 0.999915f, 0.951179f, 0.9878f, 0.1560f, -0.0000f, + 0.873530f, 0.050904f, 0.760079f, 1.000000f, 0.052414f, 0.9878f, 0.1560f, -0.0000f, + 0.877550f, 0.025452f, 0.784558f, 0.999915f, 0.048821f, 0.9878f, 0.1560f, -0.0000f, + -0.817802f, 0.000000f, -0.831219f, 0.044995f, 0.962648f, -0.0000f, -0.9723f, -0.2336f, + 0.819963f, 0.006663f, -0.858947f, 0.956110f, 0.978188f, -0.0000f, -0.9723f, -0.2336f, + 0.817802f, -0.000000f, -0.831219f, 0.955005f, 0.962648f, -0.0000f, -0.9723f, -0.2336f, + -0.819963f, 0.006663f, -0.858947f, 0.043890f, 0.978188f, -0.0000f, -0.3577f, -0.9338f, + 0.814616f, 0.024866f, -0.865919f, 0.960902f, 0.999935f, -0.0000f, -0.3577f, -0.9338f, + 0.819963f, 0.006663f, -0.858947f, 0.956110f, 0.978188f, -0.0000f, -0.3577f, -0.9338f, + -0.814616f, 0.024866f, -0.865919f, 0.039098f, 0.999935f, -0.0000f, 0.5327f, -0.8463f, + 0.803194f, 0.049732f, -0.850268f, 0.959534f, 1.000000f, -0.0000f, 0.5327f, -0.8463f, + 0.814616f, 0.024866f, -0.865919f, 0.960902f, 0.999935f, -0.0000f, 0.5327f, -0.8463f, + -0.831219f, 0.000000f, 0.803721f, 0.037571f, 0.052829f, -0.2159f, -0.9764f, -0.0000f, + -0.862063f, 0.006820f, -0.800532f, 0.020471f, 0.945221f, -0.2159f, -0.9764f, -0.0000f, + -0.831219f, -0.000000f, -0.803721f, 0.037571f, 0.947172f, -0.2159f, -0.9764f, -0.0000f, + -0.862063f, 0.006820f, 0.800532f, 0.020471f, 0.054779f, -0.7690f, -0.6392f, -0.0000f, + -0.877550f, 0.025452f, -0.784558f, 0.000085f, 0.951179f, -0.7690f, -0.6392f, -0.0000f, + -0.862063f, 0.006820f, -0.800532f, 0.020471f, 0.945221f, -0.7690f, -0.6392f, -0.0000f, + -0.877550f, 0.025452f, 0.784558f, 0.000085f, 0.048821f, -0.9878f, 0.1560f, -0.0000f, + -0.873530f, 0.050904f, -0.760079f, 0.000000f, 0.947586f, -0.9878f, 0.1560f, -0.0000f, + -0.877550f, 0.025452f, -0.784558f, 0.000085f, 0.951179f, -0.9878f, 0.1560f, -0.0000f, + 0.817802f, 0.000000f, 0.831219f, 0.955005f, 0.037352f, -0.0000f, -0.9723f, 0.2336f, + -0.819963f, 0.006663f, 0.858947f, 0.043890f, 0.021812f, -0.0000f, -0.9723f, 0.2336f, + -0.817802f, -0.000000f, 0.831219f, 0.044995f, 0.037352f, -0.0000f, -0.9723f, 0.2336f, + 0.819963f, 0.006663f, 0.858947f, 0.956110f, 0.021812f, -0.0000f, -0.3577f, 0.9338f, + -0.814616f, 0.024866f, 0.865919f, 0.039098f, 0.000065f, -0.0000f, -0.3577f, 0.9338f, + -0.819963f, 0.006663f, 0.858947f, 0.043890f, 0.021812f, -0.0000f, -0.3577f, 0.9338f, + 0.814616f, 0.024866f, 0.865919f, 0.960902f, 0.000065f, -0.0000f, 0.5327f, 0.8463f, + -0.803194f, 0.049732f, 0.850268f, 0.040466f, 0.000000f, -0.0000f, 0.5327f, 0.8463f, + -0.814616f, 0.024866f, 0.865919f, 0.039098f, 0.000065f, -0.0000f, 0.5327f, 0.8463f, + 0.593538f, 0.452916f, -0.447084f, 0.951006f, 1.000000f, 0.2154f, 0.7442f, -0.6322f, + 0.838522f, 0.049848f, -0.838097f, 0.980804f, 0.998032f, 0.2154f, 0.7442f, -0.6322f, + 0.803194f, 0.049732f, -0.850268f, 0.959534f, 1.000000f, 0.2154f, 0.7442f, -0.6322f, + -0.817802f, -0.000000f, 0.831219f, 0.044995f, 0.037352f, -0.0000f, -1.0000f, -0.0000f, + -0.823382f, -0.000000f, 0.829343f, 0.041831f, 0.038350f, -0.0000f, -1.0000f, -0.0000f, + -0.826613f, -0.000000f, 0.825289f, 0.040011f, 0.040618f, -0.0000f, -1.0000f, -0.0000f, + -0.831219f, 0.000000f, 0.803721f, 0.037571f, 0.052829f, -0.0000f, -1.0000f, -0.0000f, + -0.831219f, -0.000000f, -0.803721f, 0.037571f, 0.947172f, -0.0000f, -1.0000f, -0.0000f, + -0.826613f, 0.000000f, -0.825289f, 0.040011f, 0.959383f, -0.0000f, -1.0000f, -0.0000f, + -0.823382f, 0.000000f, -0.829343f, 0.041831f, 0.961650f, -0.0000f, -1.0000f, -0.0000f, + 0.817802f, -0.000000f, -0.831219f, 0.955005f, 0.962648f, -0.0000f, -1.0000f, -0.0000f, + 0.823382f, -0.000000f, -0.829343f, 0.958169f, 0.961650f, -0.0000f, -1.0000f, -0.0000f, + 0.826613f, -0.000000f, -0.825289f, 0.959989f, 0.959382f, -0.0000f, -1.0000f, -0.0000f, + 0.831219f, -0.000000f, 0.803721f, 0.962429f, 0.052829f, -0.0000f, -1.0000f, -0.0000f, + 0.826613f, 0.000000f, 0.825289f, 0.959989f, 0.040618f, -0.0000f, -1.0000f, -0.0000f, + 0.823382f, 0.000000f, 0.829343f, 0.958169f, 0.038350f, -0.0000f, -1.0000f, -0.0000f, + 0.653358f, 0.454219f, -0.400308f, 1.000000f, 0.967273f, 0.7820f, 0.5943f, -0.1876f, + 0.670720f, 0.440923f, -0.370061f, 1.000000f, 0.924907f, 0.7820f, 0.5943f, -0.1876f, + 0.873530f, 0.050904f, -0.760079f, 1.000000f, 0.947586f, 0.7820f, 0.5943f, -0.1876f, + 0.625297f, 0.458580f, 0.428311f, 0.977775f, 0.000000f, 0.5440f, 0.7184f, 0.4335f, + 0.838522f, 0.049848f, 0.838097f, 0.980804f, 0.001968f, 0.5440f, 0.7184f, 0.4335f, + 0.864231f, 0.050306f, 0.805079f, 0.998435f, 0.024543f, 0.5440f, 0.7184f, 0.4335f, + -0.593538f, 0.452916f, -0.447084f, 0.048994f, 1.000000f, -0.2154f, 0.7442f, -0.6322f, + -0.803194f, 0.049732f, -0.850268f, 0.040466f, 1.000000f, -0.2154f, 0.7442f, -0.6322f, + -0.838522f, 0.049848f, -0.838097f, 0.019196f, 0.998032f, -0.2154f, 0.7442f, -0.6322f, + 0.573413f, 0.500000f, -0.333413f, 0.947979f, 0.916766f, -0.0000f, 1.0000f, -0.0000f, + 0.653358f, 0.454219f, -0.400308f, 1.000000f, 0.967273f, 0.7016f, 0.6996f, -0.1356f, + 0.635801f, 0.474526f, -0.386369f, 1.000000f, 0.971374f, 0.7016f, 0.6996f, -0.1356f, + 0.645925f, 0.469791f, -0.358414f, 1.000000f, 0.934301f, 0.7016f, 0.6996f, -0.1356f, + 0.653358f, 0.454219f, -0.400308f, 1.000000f, 0.967273f, 0.5124f, 0.7627f, -0.3947f, + 0.625297f, 0.458580f, -0.428311f, 0.977775f, 1.000000f, 0.5124f, 0.7627f, -0.3947f, + 0.617215f, 0.476518f, -0.404137f, 0.978658f, 1.000000f, 0.5124f, 0.7627f, -0.3947f, + 0.587151f, 0.475900f, -0.414338f, 0.954276f, 1.000000f, 0.1698f, 0.8177f, -0.5500f, + 0.617215f, 0.476518f, -0.404137f, 0.978658f, 1.000000f, 0.1698f, 0.8177f, -0.5500f, + 0.625297f, 0.458580f, -0.428311f, 0.977775f, 1.000000f, 0.1698f, 0.8177f, -0.5500f, + 0.587151f, 0.475900f, -0.414338f, 0.954276f, 1.000000f, 0.1197f, 0.9246f, -0.3618f, + 0.579800f, 0.493098f, -0.372820f, 0.952969f, 0.966026f, 0.1197f, 0.9246f, -0.3618f, + 0.612471f, 0.486997f, -0.377607f, 0.978493f, 0.972008f, 0.1197f, 0.9246f, -0.3618f, + 0.610465f, 0.491320f, -0.345059f, 0.976926f, 0.931324f, 0.1653f, 0.9789f, -0.1198f, + 0.612471f, 0.486997f, -0.377607f, 0.978493f, 0.972008f, 0.1653f, 0.9789f, -0.1198f, + 0.579800f, 0.493098f, -0.372820f, 0.952969f, 0.966026f, 0.1653f, 0.9789f, -0.1198f, + 0.645925f, 0.469791f, -0.358414f, 1.000000f, 0.934301f, 0.4658f, 0.8847f, -0.0188f, + 0.635801f, 0.474526f, -0.386369f, 1.000000f, 0.971374f, 0.4658f, 0.8847f, -0.0188f, + 0.612471f, 0.486997f, -0.377607f, 0.978493f, 0.972008f, 0.4658f, 0.8847f, -0.0188f, + -0.645925f, 0.469791f, -0.358414f, 0.000000f, 0.934302f, -0.7016f, 0.6996f, -0.1356f, + -0.635801f, 0.474526f, -0.386368f, 0.000000f, 0.971374f, -0.7016f, 0.6996f, -0.1356f, + -0.653358f, 0.454219f, -0.400308f, 0.000000f, 0.967273f, -0.7016f, 0.6996f, -0.1356f, + -0.645925f, 0.469791f, -0.358414f, 0.000000f, 0.934302f, -0.4936f, 0.8655f, -0.0845f, + -0.610465f, 0.491320f, -0.345059f, 0.023074f, 0.931324f, -0.4936f, 0.8655f, -0.0845f, + -0.612471f, 0.486997f, -0.377607f, 0.021507f, 0.972008f, -0.4936f, 0.8655f, -0.0845f, + -0.579800f, 0.493098f, -0.372820f, 0.047031f, 0.966026f, -0.1653f, 0.9789f, -0.1198f, + -0.612471f, 0.486997f, -0.377607f, 0.021507f, 0.972008f, -0.1653f, 0.9789f, -0.1198f, + -0.610465f, 0.491320f, -0.345059f, 0.023074f, 0.931324f, -0.1653f, 0.9789f, -0.1198f, + -0.587151f, 0.475900f, -0.414338f, 0.045724f, 1.000000f, -0.0997f, 0.9314f, -0.3501f, + -0.617215f, 0.476518f, -0.404137f, 0.021342f, 1.000000f, -0.0997f, 0.9314f, -0.3501f, + -0.612471f, 0.486997f, -0.377607f, 0.021507f, 0.972008f, -0.0997f, 0.9314f, -0.3501f, + -0.625297f, 0.458580f, -0.428311f, 0.022225f, 1.000000f, -0.1698f, 0.8177f, -0.5500f, + -0.617215f, 0.476518f, -0.404137f, 0.021342f, 1.000000f, -0.1698f, 0.8177f, -0.5500f, + -0.587151f, 0.475900f, -0.414338f, 0.045724f, 1.000000f, -0.1698f, 0.8177f, -0.5500f, + -0.653358f, 0.454219f, -0.400308f, 0.000000f, 0.967273f, -0.5040f, 0.7407f, -0.4442f, + -0.635801f, 0.474526f, -0.386368f, 0.000000f, 0.971374f, -0.5040f, 0.7407f, -0.4442f, + -0.617215f, 0.476518f, -0.404137f, 0.021342f, 1.000000f, -0.5040f, 0.7407f, -0.4442f, + 0.645925f, 0.469791f, 0.358414f, 1.000000f, 0.065698f, 0.7016f, 0.6996f, 0.1356f, + 0.635801f, 0.474526f, 0.386368f, 1.000000f, 0.028626f, 0.7016f, 0.6996f, 0.1356f, + 0.653358f, 0.454219f, 0.400308f, 1.000000f, 0.032727f, 0.7016f, 0.6996f, 0.1356f, + 0.645925f, 0.469791f, 0.358414f, 1.000000f, 0.065698f, 0.4936f, 0.8655f, 0.0845f, + 0.610465f, 0.491320f, 0.345059f, 0.976926f, 0.068676f, 0.4936f, 0.8655f, 0.0845f, + 0.612471f, 0.486997f, 0.377607f, 0.978493f, 0.027992f, 0.4936f, 0.8655f, 0.0845f, + 0.579800f, 0.493098f, 0.372820f, 0.952969f, 0.033974f, 0.1653f, 0.9789f, 0.1198f, + 0.612471f, 0.486997f, 0.377607f, 0.978493f, 0.027992f, 0.1653f, 0.9789f, 0.1198f, + 0.610465f, 0.491320f, 0.345059f, 0.976926f, 0.068676f, 0.1653f, 0.9789f, 0.1198f, + 0.587151f, 0.475900f, 0.414338f, 0.954276f, 0.000000f, 0.0997f, 0.9314f, 0.3501f, + 0.617215f, 0.476518f, 0.404137f, 0.978658f, 0.000000f, 0.0997f, 0.9314f, 0.3501f, + 0.612471f, 0.486997f, 0.377607f, 0.978493f, 0.027992f, 0.0997f, 0.9314f, 0.3501f, + 0.625297f, 0.458580f, 0.428311f, 0.977775f, 0.000000f, 0.1698f, 0.8177f, 0.5500f, + 0.617215f, 0.476518f, 0.404137f, 0.978658f, 0.000000f, 0.1698f, 0.8177f, 0.5500f, + 0.587151f, 0.475900f, 0.414338f, 0.954276f, 0.000000f, 0.1698f, 0.8177f, 0.5500f, + 0.653358f, 0.454219f, 0.400308f, 1.000000f, 0.032727f, 0.5040f, 0.7407f, 0.4442f, + 0.635801f, 0.474526f, 0.386368f, 1.000000f, 0.028626f, 0.5040f, 0.7407f, 0.4442f, + 0.617215f, 0.476518f, 0.404137f, 0.978658f, 0.000000f, 0.5040f, 0.7407f, 0.4442f, + -0.587151f, 0.475900f, 0.414338f, 0.045724f, 0.000000f, -0.1698f, 0.8177f, 0.5500f, + -0.617215f, 0.476518f, 0.404137f, 0.021342f, 0.000000f, -0.1698f, 0.8177f, 0.5500f, + -0.625297f, 0.458580f, 0.428311f, 0.022225f, 0.000000f, -0.1698f, 0.8177f, 0.5500f, + -0.587151f, 0.475900f, 0.414338f, 0.045724f, 0.000000f, -0.1197f, 0.9246f, 0.3618f, + -0.579800f, 0.493098f, 0.372820f, 0.047031f, 0.033974f, -0.1197f, 0.9246f, 0.3618f, + -0.612471f, 0.486997f, 0.377607f, 0.021507f, 0.027992f, -0.1197f, 0.9246f, 0.3618f, + -0.610465f, 0.491320f, 0.345059f, 0.023074f, 0.068676f, -0.1653f, 0.9789f, 0.1198f, + -0.612471f, 0.486997f, 0.377607f, 0.021507f, 0.027992f, -0.1653f, 0.9789f, 0.1198f, + -0.579800f, 0.493098f, 0.372820f, 0.047031f, 0.033974f, -0.1653f, 0.9789f, 0.1198f, + -0.645925f, 0.469791f, 0.358414f, 0.000000f, 0.065698f, -0.4658f, 0.8847f, 0.0188f, + -0.635801f, 0.474526f, 0.386369f, 0.000000f, 0.028626f, -0.4658f, 0.8847f, 0.0188f, + -0.612471f, 0.486997f, 0.377607f, 0.021507f, 0.027992f, -0.4658f, 0.8847f, 0.0188f, + -0.653358f, 0.454219f, 0.400308f, 0.000000f, 0.032727f, -0.7016f, 0.6996f, 0.1356f, + -0.635801f, 0.474526f, 0.386369f, 0.000000f, 0.028626f, -0.7016f, 0.6996f, 0.1356f, + -0.645925f, 0.469791f, 0.358414f, 0.000000f, 0.065698f, -0.7016f, 0.6996f, 0.1356f, + -0.653358f, 0.454219f, 0.400308f, 0.000000f, 0.032727f, -0.5124f, 0.7627f, 0.3947f, + -0.625297f, 0.458580f, 0.428311f, 0.022225f, 0.000000f, -0.5124f, 0.7627f, 0.3947f, + -0.617215f, 0.476518f, 0.404137f, 0.021342f, 0.000000f, -0.5124f, 0.7627f, 0.3947f, + 0.645925f, 0.469791f, -0.358414f, 1.000000f, 0.934301f, 0.7586f, 0.6516f, -0.0000f, + 0.610465f, 0.491320f, -0.345059f, 0.976926f, 0.931324f, 0.5190f, 0.8548f, -0.0000f, + 0.610465f, 0.491320f, -0.345059f, 0.976926f, 0.931324f, 0.2281f, 0.9736f, -0.0000f, + 0.587151f, 0.475900f, 0.414338f, 0.954276f, 0.000000f, -0.0000f, 0.8185f, 0.5745f, + 0.587151f, 0.475900f, 0.414338f, 0.954276f, 0.000000f, -0.0000f, 0.9239f, 0.3827f, + 0.573413f, 0.500000f, 0.333413f, 0.947979f, 0.083234f, -0.0000f, 0.9850f, 0.1725f, + -0.645925f, 0.469791f, 0.358414f, 0.000000f, 0.065698f, -0.7586f, 0.6516f, -0.0000f, + -0.610465f, 0.491320f, 0.345059f, 0.023074f, 0.068676f, -0.5190f, 0.8548f, -0.0000f, + -0.610465f, 0.491320f, 0.345059f, 0.023074f, 0.068676f, -0.2281f, 0.9736f, -0.0000f, + -0.587151f, 0.475900f, -0.414338f, 0.045724f, 1.000000f, -0.0000f, 0.8185f, -0.5745f, + -0.587151f, 0.475900f, -0.414338f, 0.045724f, 1.000000f, -0.0000f, 0.9239f, -0.3827f, + -0.573413f, 0.500000f, -0.333413f, 0.052021f, 0.916766f, -0.0000f, 0.9850f, -0.1725f, + -0.864231f, 0.050306f, 0.805079f, 0.001565f, 0.024543f, -0.5440f, 0.7184f, 0.4335f, + -0.838522f, 0.049848f, 0.838097f, 0.019196f, 0.001968f, -0.5440f, 0.7184f, 0.4335f, + -0.625297f, 0.458580f, 0.428311f, 0.022225f, 0.000000f, -0.5440f, 0.7184f, 0.4335f, + -0.873530f, 0.050904f, 0.760079f, 0.000000f, 0.052414f, -0.7923f, 0.5855f, 0.1715f, + -0.864231f, 0.050306f, 0.805079f, 0.001565f, 0.024543f, -0.7923f, 0.5855f, 0.1715f, + -0.653358f, 0.454219f, 0.400308f, 0.000000f, 0.032727f, -0.7923f, 0.5855f, 0.1715f, + -0.593538f, 0.452916f, 0.447084f, 0.048994f, 0.000000f, -0.0000f, 0.7071f, 0.7071f, + -0.838522f, 0.049848f, 0.838097f, 0.019196f, 0.001968f, -0.2154f, 0.7442f, 0.6322f, + -0.803194f, 0.049732f, 0.850268f, 0.040466f, 0.000000f, -0.2154f, 0.7442f, 0.6322f, + -0.593538f, 0.452916f, 0.447084f, 0.048994f, 0.000000f, -0.2154f, 0.7442f, 0.6322f, + 0.593538f, 0.452916f, 0.447084f, 0.951006f, 0.000000f, 0.2154f, 0.7442f, 0.6322f, + 0.803194f, 0.049732f, 0.850268f, 0.959534f, 0.000000f, 0.2154f, 0.7442f, 0.6322f, + 0.838522f, 0.049848f, 0.838097f, 0.980804f, 0.001968f, 0.2154f, 0.7442f, 0.6322f, + -0.625297f, 0.458580f, -0.428311f, 0.022225f, 1.000000f, -0.5440f, 0.7184f, -0.4335f, + -0.838522f, 0.049848f, -0.838097f, 0.019196f, 0.998032f, -0.5440f, 0.7184f, -0.4335f, + -0.864231f, 0.050306f, -0.805079f, 0.001565f, 0.975457f, -0.5440f, 0.7184f, -0.4335f, + 0.653358f, 0.454219f, 0.400308f, 1.000000f, 0.032727f, 0.7923f, 0.5855f, 0.1715f, + 0.864231f, 0.050306f, 0.805079f, 0.998435f, 0.024543f, 0.7923f, 0.5855f, 0.1715f, + 0.873530f, 0.050904f, 0.760079f, 1.000000f, 0.052414f, 0.7923f, 0.5855f, 0.1715f, + -0.873530f, 0.050904f, -0.760079f, 0.000000f, 0.947586f, -0.8872f, 0.4614f, -0.0000f, + 0.593538f, 0.452916f, -0.447084f, 0.951006f, 1.000000f, -0.0000f, 0.7071f, -0.7071f, + -0.653358f, 0.454219f, -0.400308f, 0.000000f, 0.967273f, -0.7923f, 0.5855f, -0.1715f, + -0.864231f, 0.050306f, -0.805079f, 0.001565f, 0.975457f, -0.7923f, 0.5855f, -0.1715f, + -0.873530f, 0.050904f, -0.760079f, 0.000000f, 0.947586f, -0.7923f, 0.5855f, -0.1715f, + 0.873530f, 0.050904f, 0.760079f, 1.000000f, 0.052414f, 0.8872f, 0.4614f, -0.0000f, + 0.625297f, 0.458580f, -0.428311f, 0.977775f, 1.000000f, 0.5441f, 0.7184f, -0.4334f, + 0.653358f, 0.454219f, -0.400308f, 1.000000f, 0.967273f, 0.5441f, 0.7184f, -0.4334f, + 0.864231f, 0.050306f, -0.805079f, 0.998435f, 0.975457f, 0.5441f, 0.7184f, -0.4334f, + -0.831219f, 0.000000f, 0.803721f, 0.037571f, 0.052829f, -0.2175f, -0.9749f, 0.0465f, + -0.826613f, -0.000000f, 0.825289f, 0.040011f, 0.040618f, -0.2175f, -0.9749f, 0.0465f, + -0.855035f, 0.006740f, 0.833636f, 0.023691f, 0.035704f, -0.2175f, -0.9749f, 0.0465f, + -0.862063f, 0.006820f, 0.800532f, 0.020471f, 0.054779f, -0.8208f, -0.5443f, 0.1730f, + -0.855035f, 0.006740f, 0.833636f, 0.023691f, 0.035704f, -0.8208f, -0.5443f, 0.1730f, + -0.868805f, 0.025153f, 0.826239f, 0.002578f, 0.022467f, -0.8208f, -0.5443f, 0.1730f, + -0.877550f, 0.025452f, 0.784558f, 0.000085f, 0.048821f, -0.9225f, 0.3326f, 0.1959f, + -0.868805f, 0.025153f, 0.826239f, 0.002578f, 0.022467f, -0.9225f, 0.3326f, 0.1959f, + -0.864231f, 0.050306f, 0.805079f, 0.001565f, 0.024543f, -0.9225f, 0.3326f, 0.1959f, + -0.826613f, -0.000000f, 0.825289f, 0.040011f, 0.040618f, -0.1846f, -0.9717f, 0.1471f, + -0.823382f, -0.000000f, 0.829343f, 0.041831f, 0.038350f, -0.1846f, -0.9717f, 0.1471f, + -0.840471f, 0.006678f, 0.852013f, 0.032047f, 0.025150f, -0.1846f, -0.9717f, 0.1471f, + -0.855035f, 0.006740f, 0.833636f, 0.023691f, 0.035704f, -0.7409f, -0.3280f, 0.5861f, + -0.840471f, 0.006678f, 0.852013f, 0.032047f, 0.025150f, -0.7409f, -0.3280f, 0.5861f, + -0.846012f, 0.024924f, 0.855217f, 0.019436f, 0.002175f, -0.7409f, -0.3280f, 0.5861f, + -0.868805f, 0.025153f, 0.826239f, 0.002578f, 0.022467f, -0.6532f, 0.5522f, 0.5181f, + -0.846012f, 0.024924f, 0.855217f, 0.019436f, 0.002175f, -0.6532f, 0.5522f, 0.5181f, + -0.838522f, 0.049848f, 0.838097f, 0.019196f, 0.001968f, -0.6532f, 0.5522f, 0.5181f, + -0.823382f, -0.000000f, 0.829343f, 0.041831f, 0.038350f, -0.0764f, -0.9708f, 0.2273f, + -0.817802f, -0.000000f, 0.831219f, 0.044995f, 0.037352f, -0.0764f, -0.9708f, 0.2273f, + -0.819963f, 0.006663f, 0.858947f, 0.043890f, 0.021812f, -0.0764f, -0.9708f, 0.2273f, + -0.819963f, 0.006663f, 0.858947f, 0.043890f, 0.021812f, -0.3121f, -0.2585f, 0.9142f, + -0.814616f, 0.024866f, 0.865919f, 0.039098f, 0.000065f, -0.3121f, -0.2585f, 0.9142f, + -0.846012f, 0.024924f, 0.855217f, 0.019436f, 0.002175f, -0.3121f, -0.2585f, 0.9142f, + -0.814616f, 0.024866f, 0.865919f, 0.039098f, 0.000065f, -0.2595f, 0.5970f, 0.7591f, + -0.803194f, 0.049732f, 0.850268f, 0.040466f, 0.000000f, -0.2595f, 0.5970f, 0.7591f, + -0.838522f, 0.049848f, 0.838097f, 0.019196f, 0.001968f, -0.2595f, 0.5970f, 0.7591f, + 0.823382f, 0.000000f, 0.829343f, 0.958169f, 0.038350f, 0.0776f, -0.9707f, 0.2274f, + 0.840471f, 0.006678f, 0.852013f, 0.967953f, 0.025150f, 0.0776f, -0.9707f, 0.2274f, + 0.819963f, 0.006663f, 0.858947f, 0.956110f, 0.021812f, 0.0776f, -0.9707f, 0.2274f, + 0.819963f, 0.006663f, 0.858947f, 0.956110f, 0.021812f, 0.3099f, -0.2550f, 0.9159f, + 0.840471f, 0.006678f, 0.852013f, 0.967953f, 0.025150f, 0.3099f, -0.2550f, 0.9159f, + 0.846012f, 0.024924f, 0.855217f, 0.980564f, 0.002175f, 0.3099f, -0.2550f, 0.9159f, + 0.814616f, 0.024866f, 0.865919f, 0.960902f, 0.000065f, 0.2575f, 0.5985f, 0.7586f, + 0.846012f, 0.024924f, 0.855217f, 0.980564f, 0.002175f, 0.2575f, 0.5985f, 0.7586f, + 0.838522f, 0.049848f, 0.838097f, 0.980804f, 0.001968f, 0.2575f, 0.5985f, 0.7586f, + 0.826613f, 0.000000f, 0.825289f, 0.959989f, 0.040618f, 0.1876f, -0.9714f, 0.1455f, + 0.855035f, 0.006740f, 0.833636f, 0.976309f, 0.035704f, 0.1876f, -0.9714f, 0.1455f, + 0.840471f, 0.006678f, 0.852013f, 0.967953f, 0.025150f, 0.1876f, -0.9714f, 0.1455f, + 0.855035f, 0.006740f, 0.833636f, 0.976309f, 0.035704f, 0.7452f, -0.3228f, 0.5835f, + 0.868805f, 0.025153f, 0.826239f, 0.997422f, 0.022467f, 0.7452f, -0.3228f, 0.5835f, + 0.846012f, 0.024924f, 0.855217f, 0.980564f, 0.002175f, 0.7452f, -0.3228f, 0.5835f, + 0.868805f, 0.025153f, 0.826239f, 0.997422f, 0.022467f, 0.6535f, 0.5533f, 0.5165f, + 0.864231f, 0.050306f, 0.805079f, 0.998435f, 0.024543f, 0.6535f, 0.5533f, 0.5165f, + 0.838522f, 0.049848f, 0.838097f, 0.980804f, 0.001968f, 0.6535f, 0.5533f, 0.5165f, + 0.831219f, -0.000000f, 0.803721f, 0.962429f, 0.052829f, 0.2201f, -0.9745f, 0.0444f, + 0.862063f, 0.006820f, 0.800532f, 0.979529f, 0.054779f, 0.2201f, -0.9745f, 0.0444f, + 0.855035f, 0.006740f, 0.833636f, 0.976309f, 0.035704f, 0.2201f, -0.9745f, 0.0444f, + 0.862063f, 0.006820f, 0.800532f, 0.979529f, 0.054779f, 0.8244f, -0.5402f, 0.1691f, + 0.877550f, 0.025452f, 0.784558f, 0.999915f, 0.048821f, 0.8244f, -0.5402f, 0.1691f, + 0.868805f, 0.025153f, 0.826239f, 0.997422f, 0.022467f, 0.8244f, -0.5402f, 0.1691f, + 0.877550f, 0.025452f, 0.784558f, 0.999915f, 0.048821f, 0.9224f, 0.3333f, 0.1950f, + 0.873530f, 0.050904f, 0.760079f, 1.000000f, 0.052414f, 0.9224f, 0.3333f, 0.1950f, + 0.864231f, 0.050306f, 0.805079f, 0.998435f, 0.024543f, 0.9224f, 0.3333f, 0.1950f, + -0.823382f, 0.000000f, -0.829343f, 0.041831f, 0.961650f, -0.0776f, -0.9707f, -0.2274f, + -0.840471f, 0.006678f, -0.852013f, 0.032047f, 0.974849f, -0.0776f, -0.9707f, -0.2274f, + -0.819963f, 0.006663f, -0.858947f, 0.043890f, 0.978188f, -0.0776f, -0.9707f, -0.2274f, + -0.819963f, 0.006663f, -0.858947f, 0.043890f, 0.978188f, -0.3099f, -0.2550f, -0.9159f, + -0.840471f, 0.006678f, -0.852013f, 0.032047f, 0.974849f, -0.3099f, -0.2550f, -0.9159f, + -0.846012f, 0.024924f, -0.855217f, 0.019436f, 0.997825f, -0.3099f, -0.2550f, -0.9159f, + -0.814616f, 0.024866f, -0.865919f, 0.039098f, 0.999935f, -0.2575f, 0.5985f, -0.7586f, + -0.846012f, 0.024924f, -0.855217f, 0.019436f, 0.997825f, -0.2575f, 0.5985f, -0.7586f, + -0.838522f, 0.049848f, -0.838097f, 0.019196f, 0.998032f, -0.2575f, 0.5985f, -0.7586f, + -0.826613f, 0.000000f, -0.825289f, 0.040011f, 0.959383f, -0.1876f, -0.9714f, -0.1455f, + -0.855035f, 0.006740f, -0.833636f, 0.023691f, 0.964296f, -0.1876f, -0.9714f, -0.1455f, + -0.840471f, 0.006678f, -0.852013f, 0.032047f, 0.974849f, -0.1876f, -0.9714f, -0.1455f, + -0.855035f, 0.006740f, -0.833636f, 0.023691f, 0.964296f, -0.7452f, -0.3228f, -0.5835f, + -0.868805f, 0.025153f, -0.826239f, 0.002578f, 0.977533f, -0.7452f, -0.3228f, -0.5835f, + -0.846012f, 0.024924f, -0.855217f, 0.019436f, 0.997825f, -0.7452f, -0.3228f, -0.5835f, + -0.868805f, 0.025153f, -0.826239f, 0.002578f, 0.977533f, -0.6535f, 0.5533f, -0.5165f, + -0.864231f, 0.050306f, -0.805079f, 0.001565f, 0.975457f, -0.6535f, 0.5533f, -0.5165f, + -0.838522f, 0.049848f, -0.838097f, 0.019196f, 0.998032f, -0.6535f, 0.5533f, -0.5165f, + -0.831219f, -0.000000f, -0.803721f, 0.037571f, 0.947172f, -0.2201f, -0.9745f, -0.0444f, + -0.862063f, 0.006820f, -0.800532f, 0.020471f, 0.945221f, -0.2201f, -0.9745f, -0.0444f, + -0.855035f, 0.006740f, -0.833636f, 0.023691f, 0.964296f, -0.2201f, -0.9745f, -0.0444f, + -0.862063f, 0.006820f, -0.800532f, 0.020471f, 0.945221f, -0.8244f, -0.5402f, -0.1691f, + -0.877550f, 0.025452f, -0.784558f, 0.000085f, 0.951179f, -0.8244f, -0.5402f, -0.1691f, + -0.868805f, 0.025153f, -0.826239f, 0.002578f, 0.977533f, -0.8244f, -0.5402f, -0.1691f, + -0.877550f, 0.025452f, -0.784558f, 0.000085f, 0.951179f, -0.9224f, 0.3333f, -0.1950f, + -0.873530f, 0.050904f, -0.760079f, 0.000000f, 0.947586f, -0.9224f, 0.3333f, -0.1950f, + -0.864231f, 0.050306f, -0.805079f, 0.001565f, 0.975457f, -0.9224f, 0.3333f, -0.1950f, + 0.823382f, -0.000000f, -0.829343f, 0.958169f, 0.961650f, 0.0764f, -0.9708f, -0.2273f, + 0.817802f, -0.000000f, -0.831219f, 0.955005f, 0.962648f, 0.0764f, -0.9708f, -0.2273f, + 0.819963f, 0.006663f, -0.858947f, 0.956110f, 0.978188f, 0.0764f, -0.9708f, -0.2273f, + 0.819963f, 0.006663f, -0.858947f, 0.956110f, 0.978188f, 0.3121f, -0.2585f, -0.9142f, + 0.814616f, 0.024866f, -0.865919f, 0.960902f, 0.999935f, 0.3121f, -0.2585f, -0.9142f, + 0.846012f, 0.024924f, -0.855217f, 0.980564f, 0.997825f, 0.3121f, -0.2585f, -0.9142f, + 0.814616f, 0.024866f, -0.865919f, 0.960902f, 0.999935f, 0.2595f, 0.5970f, -0.7591f, + 0.803194f, 0.049732f, -0.850268f, 0.959534f, 1.000000f, 0.2595f, 0.5970f, -0.7591f, + 0.838522f, 0.049848f, -0.838097f, 0.980804f, 0.998032f, 0.2595f, 0.5970f, -0.7591f, + 0.826613f, -0.000000f, -0.825289f, 0.959989f, 0.959382f, 0.1846f, -0.9717f, -0.1471f, + 0.823382f, -0.000000f, -0.829343f, 0.958169f, 0.961650f, 0.1846f, -0.9717f, -0.1471f, + 0.840471f, 0.006678f, -0.852013f, 0.967953f, 0.974850f, 0.1846f, -0.9717f, -0.1471f, + 0.855035f, 0.006740f, -0.833636f, 0.976309f, 0.964296f, 0.7409f, -0.3280f, -0.5861f, + 0.840471f, 0.006678f, -0.852013f, 0.967953f, 0.974850f, 0.7409f, -0.3280f, -0.5861f, + 0.846012f, 0.024924f, -0.855217f, 0.980564f, 0.997825f, 0.7409f, -0.3280f, -0.5861f, + 0.868805f, 0.025153f, -0.826239f, 0.997422f, 0.977533f, 0.6532f, 0.5522f, -0.5181f, + 0.846012f, 0.024924f, -0.855217f, 0.980564f, 0.997825f, 0.6532f, 0.5522f, -0.5181f, + 0.838522f, 0.049848f, -0.838097f, 0.980804f, 0.998032f, 0.6532f, 0.5522f, -0.5181f, + 0.831219f, 0.000000f, -0.803721f, 0.962429f, 0.947171f, 0.2175f, -0.9749f, -0.0465f, + 0.826613f, -0.000000f, -0.825289f, 0.959989f, 0.959382f, 0.2175f, -0.9749f, -0.0465f, + 0.855035f, 0.006740f, -0.833636f, 0.976309f, 0.964296f, 0.2175f, -0.9749f, -0.0465f, + 0.862063f, 0.006820f, -0.800532f, 0.979529f, 0.945221f, 0.8208f, -0.5443f, -0.1730f, + 0.855035f, 0.006740f, -0.833636f, 0.976309f, 0.964296f, 0.8208f, -0.5443f, -0.1730f, + 0.868805f, 0.025153f, -0.826239f, 0.997422f, 0.977533f, 0.8208f, -0.5443f, -0.1730f, + 0.877550f, 0.025452f, -0.784558f, 0.999915f, 0.951179f, 0.9225f, 0.3326f, -0.1959f, + 0.868805f, 0.025153f, -0.826239f, 0.997422f, 0.977533f, 0.9225f, 0.3326f, -0.1959f, + 0.864231f, 0.050306f, -0.805079f, 0.998435f, 0.975457f, 0.9225f, 0.3326f, -0.1959f, + 0.862063f, 0.006820f, -0.800532f, 0.979529f, 0.945221f, 0.2159f, -0.9764f, -0.0000f, + 0.877550f, 0.025452f, -0.784558f, 0.999915f, 0.951179f, 0.7690f, -0.6392f, -0.0000f, + 0.873530f, 0.050904f, -0.760079f, 1.000000f, 0.947586f, 0.9878f, 0.1560f, -0.0000f, + -0.819963f, 0.006663f, -0.858947f, 0.043890f, 0.978188f, -0.0000f, -0.9723f, -0.2336f, + -0.814616f, 0.024866f, -0.865919f, 0.039098f, 0.999935f, -0.0000f, -0.3577f, -0.9338f, + -0.803194f, 0.049732f, -0.850268f, 0.040466f, 1.000000f, -0.0000f, 0.5327f, -0.8463f, + -0.862063f, 0.006820f, 0.800532f, 0.020471f, 0.054779f, -0.2159f, -0.9764f, -0.0000f, + -0.877550f, 0.025452f, 0.784558f, 0.000085f, 0.048821f, -0.7690f, -0.6392f, -0.0000f, + -0.873530f, 0.050904f, 0.760079f, 0.000000f, 0.052414f, -0.9878f, 0.1560f, -0.0000f, + 0.819963f, 0.006663f, 0.858947f, 0.956110f, 0.021812f, -0.0000f, -0.9723f, 0.2336f, + 0.814616f, 0.024866f, 0.865919f, 0.960902f, 0.000065f, -0.0000f, -0.3577f, 0.9338f, + 0.803194f, 0.049732f, 0.850268f, 0.959534f, 0.000000f, -0.0000f, 0.5327f, 0.8463f, + 0.593538f, 0.452916f, -0.447084f, 0.951006f, 1.000000f, 0.2348f, 0.7466f, -0.6225f, + 0.625297f, 0.458580f, -0.428311f, 0.977775f, 1.000000f, 0.2348f, 0.7466f, -0.6225f, + 0.838522f, 0.049848f, -0.838097f, 0.980804f, 0.998032f, 0.2348f, 0.7466f, -0.6225f, +}; + +const int brick_vertices_length = (sizeof (brick_vertices)) / (sizeof (brick_vertices[0])); + diff --git a/include/model/brick.obj b/include/model/brick.obj new file mode 100644 index 0000000..eb8245e --- /dev/null +++ b/include/model/brick.obj @@ -0,0 +1,637 @@ +# Blender 4.4.3 +# www.blender.org +mtllib brick.mtl +o Cube +v 0.670720 0.440923 -0.370061 +v 0.593538 0.452916 -0.447084 +v 0.573413 0.500000 -0.333413 +v 0.653358 0.454219 -0.400308 +v 0.645925 0.469791 -0.358414 +v 0.635801 0.474526 -0.386369 +v 0.587151 0.475900 -0.414338 +v 0.625297 0.458580 -0.428311 +v 0.617215 0.476518 -0.404137 +v 0.610465 0.491320 -0.345059 +v 0.579800 0.493098 -0.372820 +v 0.612471 0.486997 -0.377607 +v -0.670720 0.440923 -0.370061 +v -0.573413 0.500000 -0.333413 +v -0.593538 0.452916 -0.447084 +v -0.645925 0.469791 -0.358414 +v -0.653358 0.454219 -0.400308 +v -0.635801 0.474526 -0.386368 +v -0.579800 0.493098 -0.372820 +v -0.610465 0.491320 -0.345059 +v -0.612471 0.486997 -0.377607 +v -0.625297 0.458580 -0.428311 +v -0.587151 0.475900 -0.414338 +v -0.617215 0.476518 -0.404137 +v 0.670720 0.440923 0.370061 +v 0.573413 0.500000 0.333413 +v 0.593538 0.452916 0.447084 +v 0.645925 0.469791 0.358414 +v 0.653358 0.454219 0.400308 +v 0.635801 0.474526 0.386368 +v 0.579800 0.493098 0.372820 +v 0.610465 0.491320 0.345059 +v 0.612471 0.486997 0.377607 +v 0.625297 0.458580 0.428311 +v 0.587151 0.475900 0.414338 +v 0.617215 0.476518 0.404137 +v -0.593538 0.452916 0.447084 +v -0.573413 0.500000 0.333413 +v -0.670720 0.440923 0.370061 +v -0.587151 0.475900 0.414338 +v -0.625297 0.458580 0.428311 +v -0.617215 0.476518 0.404137 +v -0.610465 0.491320 0.345059 +v -0.579800 0.493098 0.372820 +v -0.612471 0.486997 0.377607 +v -0.653358 0.454219 0.400308 +v -0.645925 0.469791 0.358414 +v -0.635801 0.474526 0.386369 +v 0.817802 -0.000000 -0.831219 +v 0.803194 0.049732 -0.850268 +v 0.819963 0.006663 -0.858947 +v 0.814616 0.024866 -0.865919 +v 0.831219 0.000000 -0.803721 +v 0.873530 0.050904 -0.760079 +v 0.862063 0.006820 -0.800532 +v 0.877550 0.025452 -0.784558 +v 0.823382 -0.000000 -0.829343 +v 0.838522 0.049848 -0.838097 +v 0.840471 0.006678 -0.852013 +v 0.846012 0.024924 -0.855217 +v 0.826613 -0.000000 -0.825289 +v 0.864231 0.050306 -0.805079 +v 0.855035 0.006740 -0.833636 +v 0.868805 0.025153 -0.826239 +v -0.831219 -0.000000 -0.803721 +v -0.873530 0.050904 -0.760079 +v -0.862063 0.006820 -0.800532 +v -0.877550 0.025452 -0.784558 +v -0.817802 0.000000 -0.831219 +v -0.803194 0.049732 -0.850268 +v -0.819963 0.006663 -0.858947 +v -0.814616 0.024866 -0.865919 +v -0.826613 0.000000 -0.825289 +v -0.864231 0.050306 -0.805079 +v -0.855035 0.006740 -0.833636 +v -0.868805 0.025153 -0.826239 +v -0.823382 0.000000 -0.829343 +v -0.838522 0.049848 -0.838097 +v -0.840471 0.006678 -0.852013 +v -0.846012 0.024924 -0.855217 +v 0.831219 -0.000000 0.803721 +v 0.873530 0.050904 0.760079 +v 0.862063 0.006820 0.800532 +v 0.877550 0.025452 0.784558 +v 0.817802 0.000000 0.831219 +v 0.803194 0.049732 0.850268 +v 0.819963 0.006663 0.858947 +v 0.814616 0.024866 0.865919 +v 0.826613 0.000000 0.825289 +v 0.864231 0.050306 0.805079 +v 0.855035 0.006740 0.833636 +v 0.868805 0.025153 0.826239 +v 0.823382 0.000000 0.829343 +v 0.838522 0.049848 0.838097 +v 0.840471 0.006678 0.852013 +v 0.846012 0.024924 0.855217 +v -0.817802 -0.000000 0.831219 +v -0.803194 0.049732 0.850268 +v -0.819963 0.006663 0.858947 +v -0.814616 0.024866 0.865919 +v -0.831219 0.000000 0.803721 +v -0.873530 0.050904 0.760079 +v -0.862063 0.006820 0.800532 +v -0.877550 0.025452 0.784558 +v -0.823382 -0.000000 0.829343 +v -0.838522 0.049848 0.838097 +v -0.840471 0.006678 0.852013 +v -0.846012 0.024924 0.855217 +v -0.826613 -0.000000 0.825289 +v -0.864231 0.050306 0.805079 +v -0.855035 0.006740 0.833636 +v -0.868805 0.025153 0.826239 +vn -0.0000 -1.0000 -0.0000 +vn 0.7923 0.5855 -0.1715 +vn 0.5441 0.7184 0.4334 +vn -0.2348 0.7466 -0.6225 +vn -0.0000 1.0000 -0.0000 +vn 0.7282 0.6745 -0.1215 +vn 0.5040 0.7407 -0.4442 +vn 0.1743 0.8216 -0.5427 +vn 0.0997 0.9314 -0.3501 +vn 0.1837 0.9729 -0.1406 +vn 0.4936 0.8655 -0.0845 +vn 0.3667 0.8858 -0.2843 +vn -0.7282 0.6745 -0.1215 +vn -0.4658 0.8847 -0.0188 +vn -0.1837 0.9729 -0.1406 +vn -0.1197 0.9246 -0.3618 +vn -0.1743 0.8216 -0.5427 +vn -0.5124 0.7627 -0.3947 +vn -0.3667 0.8858 -0.2843 +vn 0.7282 0.6745 0.1215 +vn 0.4658 0.8847 0.0188 +vn 0.1837 0.9729 0.1406 +vn 0.1197 0.9246 0.3618 +vn 0.1743 0.8216 0.5427 +vn 0.5124 0.7627 0.3947 +vn 0.3667 0.8858 0.2843 +vn -0.1743 0.8216 0.5427 +vn -0.0997 0.9314 0.3501 +vn -0.1837 0.9729 0.1406 +vn -0.4936 0.8655 0.0845 +vn -0.7282 0.6745 0.1215 +vn -0.5040 0.7407 0.4442 +vn -0.3667 0.8858 0.2843 +vn 0.7586 0.6516 -0.0000 +vn 0.5190 0.8548 -0.0000 +vn 0.2281 0.9736 -0.0000 +vn -0.0000 0.8185 0.5745 +vn -0.0000 0.9239 0.3827 +vn -0.0000 0.9850 0.1725 +vn -0.7586 0.6516 -0.0000 +vn -0.5190 0.8548 -0.0000 +vn -0.2281 0.9736 -0.0000 +vn -0.0000 0.8185 -0.5745 +vn -0.0000 0.9239 -0.3827 +vn -0.0000 0.9850 -0.1725 +vn -0.5441 0.7184 0.4334 +vn -0.7820 0.5943 0.1876 +vn -0.0000 0.7071 0.7071 +vn -0.2348 0.7466 0.6225 +vn 0.2348 0.7466 0.6225 +vn -0.5441 0.7184 -0.4334 +vn 0.7820 0.5943 0.1876 +vn -0.8872 0.4614 -0.0000 +vn -0.0000 0.7071 -0.7071 +vn -0.7820 0.5943 -0.1876 +vn 0.8872 0.4614 -0.0000 +vn 0.5440 0.7184 -0.4335 +vn -0.2201 -0.9745 0.0444 +vn -0.8244 -0.5402 0.1691 +vn -0.9224 0.3333 0.1950 +vn -0.1876 -0.9714 0.1455 +vn -0.7452 -0.3228 0.5835 +vn -0.6535 0.5533 0.5165 +vn -0.0776 -0.9707 0.2274 +vn -0.3099 -0.2550 0.9159 +vn -0.2575 0.5985 0.7586 +vn 0.0764 -0.9708 0.2273 +vn 0.3121 -0.2585 0.9142 +vn 0.2595 0.5970 0.7591 +vn 0.1846 -0.9717 0.1471 +vn 0.7409 -0.3280 0.5861 +vn 0.6532 0.5522 0.5181 +vn 0.2175 -0.9749 0.0465 +vn 0.8208 -0.5443 0.1729 +vn 0.9225 0.3326 0.1959 +vn -0.0764 -0.9708 -0.2273 +vn -0.3121 -0.2585 -0.9142 +vn -0.2595 0.5970 -0.7591 +vn -0.1846 -0.9717 -0.1471 +vn -0.7409 -0.3280 -0.5861 +vn -0.6532 0.5522 -0.5181 +vn -0.2175 -0.9749 -0.0465 +vn -0.8208 -0.5443 -0.1729 +vn -0.9225 0.3326 -0.1959 +vn 0.0776 -0.9707 -0.2274 +vn 0.3099 -0.2550 -0.9159 +vn 0.2575 0.5985 -0.7586 +vn 0.1876 -0.9714 -0.1455 +vn 0.7452 -0.3228 -0.5835 +vn 0.6535 0.5533 -0.5165 +vn 0.2201 -0.9745 -0.0444 +vn 0.8244 -0.5402 -0.1691 +vn 0.9224 0.3333 -0.1950 +vn 0.2159 -0.9764 -0.0000 +vn 0.7690 -0.6392 -0.0000 +vn 0.9878 0.1560 -0.0000 +vn -0.0000 -0.9723 -0.2336 +vn -0.0000 -0.3577 -0.9338 +vn -0.0000 0.5327 -0.8463 +vn -0.2159 -0.9764 -0.0000 +vn -0.7690 -0.6392 -0.0000 +vn -0.9878 0.1560 -0.0000 +vn -0.0000 -0.9723 0.2336 +vn -0.0000 -0.3577 0.9338 +vn -0.0000 0.5327 0.8463 +vn 0.2154 0.7442 -0.6322 +vn 0.7820 0.5943 -0.1876 +vn 0.5440 0.7184 0.4335 +vn -0.2154 0.7442 -0.6322 +vn 0.7016 0.6996 -0.1356 +vn 0.5124 0.7627 -0.3947 +vn 0.1698 0.8177 -0.5500 +vn 0.1197 0.9246 -0.3618 +vn 0.1653 0.9789 -0.1198 +vn 0.4658 0.8847 -0.0188 +vn -0.7016 0.6996 -0.1356 +vn -0.4936 0.8655 -0.0845 +vn -0.1653 0.9789 -0.1198 +vn -0.0997 0.9314 -0.3501 +vn -0.1698 0.8177 -0.5500 +vn -0.5040 0.7407 -0.4442 +vn 0.7016 0.6996 0.1356 +vn 0.4936 0.8655 0.0845 +vn 0.1653 0.9789 0.1198 +vn 0.0997 0.9314 0.3501 +vn 0.1698 0.8177 0.5500 +vn 0.5040 0.7407 0.4442 +vn -0.1698 0.8177 0.5500 +vn -0.1197 0.9246 0.3618 +vn -0.1653 0.9789 0.1198 +vn -0.4658 0.8847 0.0188 +vn -0.7016 0.6996 0.1356 +vn -0.5124 0.7627 0.3947 +vn -0.5440 0.7184 0.4335 +vn -0.7923 0.5855 0.1715 +vn -0.2154 0.7442 0.6322 +vn 0.2154 0.7442 0.6322 +vn -0.5440 0.7184 -0.4335 +vn 0.7923 0.5855 0.1715 +vn -0.7923 0.5855 -0.1715 +vn 0.5441 0.7184 -0.4334 +vn -0.2175 -0.9749 0.0465 +vn -0.8208 -0.5443 0.1730 +vn -0.9225 0.3326 0.1959 +vn -0.1846 -0.9717 0.1471 +vn -0.7409 -0.3280 0.5861 +vn -0.6532 0.5522 0.5181 +vn -0.0764 -0.9708 0.2273 +vn -0.3121 -0.2585 0.9142 +vn -0.2595 0.5970 0.7591 +vn 0.0776 -0.9707 0.2274 +vn 0.3099 -0.2550 0.9159 +vn 0.2575 0.5985 0.7586 +vn 0.1876 -0.9714 0.1455 +vn 0.7452 -0.3228 0.5835 +vn 0.6535 0.5533 0.5165 +vn 0.2201 -0.9745 0.0444 +vn 0.8244 -0.5402 0.1691 +vn 0.9224 0.3333 0.1950 +vn -0.0776 -0.9707 -0.2274 +vn -0.3099 -0.2550 -0.9159 +vn -0.2575 0.5985 -0.7586 +vn -0.1876 -0.9714 -0.1455 +vn -0.7452 -0.3228 -0.5835 +vn -0.6535 0.5533 -0.5165 +vn -0.2201 -0.9745 -0.0444 +vn -0.8244 -0.5402 -0.1691 +vn -0.9224 0.3333 -0.1950 +vn 0.0764 -0.9708 -0.2273 +vn 0.3121 -0.2585 -0.9142 +vn 0.2595 0.5970 -0.7591 +vn 0.1846 -0.9717 -0.1471 +vn 0.7409 -0.3280 -0.5861 +vn 0.6532 0.5522 -0.5181 +vn 0.2175 -0.9749 -0.0465 +vn 0.8208 -0.5443 -0.1730 +vn 0.9225 0.3326 -0.1959 +vn 0.2348 0.7466 -0.6225 +vt 0.044995 0.962648 +vt 0.962429 0.947171 +vt 0.955005 0.037352 +vt 1.000000 0.967273 +vt 1.000000 0.947586 +vt 0.998435 0.975457 +vt 0.977775 0.000000 +vt 0.998435 0.024543 +vt 1.000000 0.032727 +vt 0.048994 1.000000 +vt 0.019196 0.998032 +vt 0.022225 1.000000 +vt 0.947979 0.083234 +vt 0.052021 0.916766 +vt 0.052021 0.083234 +vt 1.000000 0.934301 +vt 1.000000 0.924907 +vt 0.978658 1.000000 +vt 1.000000 0.971374 +vt 0.954276 1.000000 +vt 0.977775 1.000000 +vt 0.951006 1.000000 +vt 0.978493 0.972008 +vt 0.976926 0.931324 +vt 0.952969 0.966026 +vt 0.947979 0.916766 +vt 0.000000 0.934302 +vt 0.000000 0.967273 +vt 0.000000 0.924907 +vt 0.021507 0.972008 +vt 0.000000 0.971374 +vt 0.047031 0.966026 +vt 0.023074 0.931324 +vt 0.045724 1.000000 +vt 0.021342 1.000000 +vt 1.000000 0.065698 +vt 1.000000 0.075093 +vt 0.978493 0.027992 +vt 1.000000 0.028626 +vt 0.952969 0.033974 +vt 0.976926 0.068676 +vt 0.954276 0.000000 +vt 0.951006 0.000000 +vt 0.978658 0.000000 +vt 0.045724 0.000000 +vt 0.022225 0.000000 +vt 0.048994 0.000000 +vt 0.021507 0.027992 +vt 0.021342 0.000000 +vt 0.023074 0.068676 +vt 0.047031 0.033974 +vt 0.000000 0.065698 +vt 0.000000 0.032727 +vt 0.000000 0.075093 +vt 0.000000 0.028626 +vt 0.001565 0.024543 +vt 0.000000 0.052414 +vt 0.040466 0.000000 +vt 0.959534 0.000000 +vt 0.019196 0.001968 +vt 0.980804 0.001968 +vt 0.001565 0.975457 +vt 1.000000 0.052414 +vt 0.959534 1.000000 +vt 0.040466 1.000000 +vt 0.000000 0.947586 +vt 1.000000 0.947586 +vt 0.998435 0.975457 +vt 0.980804 0.998032 +vt 0.037571 0.052829 +vt 0.023691 0.035704 +vt 0.020471 0.054779 +vt 0.002578 0.022467 +vt 0.000085 0.048821 +vt 0.001565 0.024543 +vt 0.040011 0.040618 +vt 0.032047 0.025150 +vt 0.019436 0.002175 +vt 0.019196 0.001968 +vt 0.041831 0.038350 +vt 0.043890 0.021812 +vt 0.039098 0.000065 +vt 0.958169 0.038350 +vt 0.956110 0.021812 +vt 0.980564 0.002175 +vt 0.960902 0.000065 +vt 0.959989 0.040618 +vt 0.967953 0.025150 +vt 0.976309 0.035704 +vt 0.997422 0.022467 +vt 0.980804 0.001968 +vt 0.962429 0.052829 +vt 0.979529 0.054779 +vt 0.999915 0.048821 +vt 0.041831 0.961650 +vt 0.043890 0.978188 +vt 0.019436 0.997825 +vt 0.039098 0.999935 +vt 0.040011 0.959383 +vt 0.032047 0.974849 +vt 0.023691 0.964296 +vt 0.002578 0.977533 +vt 0.037571 0.947172 +vt 0.020471 0.945221 +vt 0.000085 0.951179 +vt 0.001565 0.975457 +vt 0.958169 0.961650 +vt 0.956110 0.978188 +vt 0.967953 0.974850 +vt 0.980564 0.997825 +vt 0.960902 0.999935 +vt 0.980804 0.998032 +vt 0.959989 0.959382 +vt 0.976309 0.964296 +vt 0.997422 0.977533 +vt 0.979529 0.945221 +vt 0.999915 0.951179 +vt 1.000000 0.052414 +vt 0.955005 0.962648 +vt 0.044995 0.037352 +vt 0.959534 1.000000 +vt 0.040466 0.000000 +s 0 +f 69/1/1 53/2/1 85/3/1 +f 4/4/2 54/5/2 62/6/2 +f 34/7/3 90/8/3 29/9/3 +f 15/10/4 78/11/4 22/12/4 +f 26/13/5 14/14/5 38/15/5 +f 4/4/6 5/16/6 1/17/6 +f 4/4/7 9/18/7 6/19/7 +f 7/20/8 8/21/8 2/22/8 +f 7/20/9 12/23/9 9/18/9 +f 10/24/10 11/25/10 3/26/10 +f 5/16/11 12/23/11 10/24/11 +f 6/19/12 9/18/12 12/23/12 +f 16/27/13 17/28/13 13/29/13 +f 16/27/14 21/30/14 18/31/14 +f 19/32/15 20/33/15 14/14/15 +f 23/34/16 21/30/16 19/32/16 +f 22/12/17 23/34/17 15/10/17 +f 17/28/18 24/35/18 22/12/18 +f 18/31/19 21/30/19 24/35/19 +f 28/36/20 29/9/20 25/37/20 +f 28/36/21 33/38/21 30/39/21 +f 31/40/22 32/41/22 26/13/22 +f 35/42/23 33/38/23 31/40/23 +f 34/7/24 35/42/24 27/43/24 +f 29/9/25 36/44/25 34/7/25 +f 30/39/26 33/38/26 36/44/26 +f 40/45/27 41/46/27 37/47/27 +f 40/45/28 45/48/28 42/49/28 +f 43/50/29 44/51/29 38/15/29 +f 47/52/30 45/48/30 43/50/30 +f 46/53/31 47/52/31 39/54/31 +f 46/53/32 42/49/32 48/55/32 +f 42/49/33 45/48/33 48/55/33 +f 1/17/34 28/36/34 25/37/34 +f 5/16/35 32/41/35 28/36/35 +f 32/41/36 3/26/36 26/13/36 +f 27/43/37 40/45/37 37/47/37 +f 40/45/38 31/40/38 44/51/38 +f 31/40/39 38/15/39 44/51/39 +f 39/54/40 16/27/40 13/29/40 +f 47/52/41 20/33/41 16/27/41 +f 20/33/42 38/15/42 14/14/42 +f 15/10/43 7/20/43 2/22/43 +f 7/20/44 19/32/44 11/25/44 +f 19/32/45 3/26/45 11/25/45 +f 110/56/46 41/46/46 46/53/46 +f 102/57/47 46/53/47 39/54/47 +f 27/43/48 98/58/48 86/59/48 +f 106/60/49 37/47/49 41/46/49 +f 27/43/50 94/61/50 34/7/50 +f 22/12/51 74/62/51 17/28/51 +f 29/9/52 82/63/52 25/37/52 +f 13/29/53 102/57/53 39/54/53 +f 15/10/54 50/64/54 70/65/54 +f 17/28/55 66/66/55 13/29/55 +f 25/37/56 54/67/56 1/17/56 +f 8/21/57 62/68/57 58/69/57 +f 101/70/58 111/71/58 103/72/58 +f 103/72/59 112/73/59 104/74/59 +f 104/74/60 110/75/60 102/57/60 +f 109/76/61 107/77/61 111/71/61 +f 111/71/62 108/78/62 112/73/62 +f 112/73/63 106/79/63 110/56/63 +f 105/80/64 99/81/64 107/77/64 +f 99/81/65 108/78/65 107/77/65 +f 100/82/66 106/60/66 108/78/66 +f 93/83/67 87/84/67 85/3/67 +f 87/84/68 96/85/68 88/86/68 +f 88/86/69 94/61/69 86/59/69 +f 89/87/70 95/88/70 93/83/70 +f 91/89/71 96/85/71 95/88/71 +f 92/90/72 94/91/72 96/85/72 +f 81/92/73 91/89/73 89/87/73 +f 83/93/74 92/90/74 91/89/74 +f 84/94/75 90/8/75 92/90/75 +f 77/95/76 71/96/76 69/1/76 +f 71/96/77 80/97/77 72/98/77 +f 72/98/78 78/11/78 70/65/78 +f 73/99/79 79/100/79 77/95/79 +f 75/101/80 80/97/80 79/100/80 +f 76/102/81 78/11/81 80/97/81 +f 65/103/82 75/101/82 73/99/82 +f 67/104/83 76/102/83 75/101/83 +f 68/105/84 74/106/84 76/102/84 +f 57/107/85 51/108/85 59/109/85 +f 51/108/86 60/110/86 59/109/86 +f 52/111/87 58/112/87 60/110/87 +f 61/113/88 59/109/88 63/114/88 +f 63/114/89 60/110/89 64/115/89 +f 64/115/90 58/69/90 62/68/90 +f 53/2/91 63/114/91 55/116/91 +f 55/116/92 64/115/92 56/117/92 +f 56/117/93 62/6/93 54/5/93 +f 53/2/94 83/93/94 81/92/94 +f 55/116/95 84/94/95 83/93/95 +f 56/117/96 82/118/96 84/94/96 +f 69/1/97 51/108/97 49/119/97 +f 71/96/98 52/111/98 51/108/98 +f 72/98/99 50/64/99 52/111/99 +f 101/70/100 67/104/100 65/103/100 +f 103/72/101 68/105/101 67/104/101 +f 104/74/102 66/66/102 68/105/102 +f 85/3/103 99/81/103 97/120/103 +f 87/84/104 100/82/104 99/81/104 +f 88/86/105 98/58/105 100/82/105 +f 2/22/106 58/112/106 50/121/106 +f 85/3/1 97/120/1 105/80/1 +f 105/80/1 109/76/1 101/70/1 +f 101/70/1 65/103/1 73/99/1 +f 73/99/1 77/95/1 69/1/1 +f 69/1/1 49/119/1 57/107/1 +f 57/107/1 61/113/1 53/2/1 +f 53/2/1 81/92/1 89/87/1 +f 89/87/1 93/83/1 85/3/1 +f 85/3/1 105/80/1 101/70/1 +f 101/70/1 73/99/1 69/1/1 +f 69/1/1 57/107/1 53/2/1 +f 53/2/1 89/87/1 85/3/1 +f 85/3/1 101/70/1 69/1/1 +f 4/4/107 1/17/107 54/5/107 +f 34/7/108 94/91/108 90/8/108 +f 15/10/109 70/65/109 78/11/109 +f 26/13/5 3/26/5 14/14/5 +f 4/4/110 6/19/110 5/16/110 +f 4/4/111 8/21/111 9/18/111 +f 7/20/112 9/18/112 8/21/112 +f 7/20/113 11/25/113 12/23/113 +f 10/24/114 12/23/114 11/25/114 +f 5/16/115 6/19/115 12/23/115 +f 16/27/116 18/31/116 17/28/116 +f 16/27/117 20/33/117 21/30/117 +f 19/32/118 21/30/118 20/33/118 +f 23/34/119 24/35/119 21/30/119 +f 22/12/120 24/35/120 23/34/120 +f 17/28/121 18/31/121 24/35/121 +f 28/36/122 30/39/122 29/9/122 +f 28/36/123 32/41/123 33/38/123 +f 31/40/124 33/38/124 32/41/124 +f 35/42/125 36/44/125 33/38/125 +f 34/7/126 36/44/126 35/42/126 +f 29/9/127 30/39/127 36/44/127 +f 40/45/128 42/49/128 41/46/128 +f 40/45/129 44/51/129 45/48/129 +f 43/50/130 45/48/130 44/51/130 +f 47/52/131 48/55/131 45/48/131 +f 46/53/132 48/55/132 47/52/132 +f 46/53/133 41/46/133 42/49/133 +f 1/17/34 5/16/34 28/36/34 +f 5/16/35 10/24/35 32/41/35 +f 32/41/36 10/24/36 3/26/36 +f 27/43/37 35/42/37 40/45/37 +f 40/45/38 35/42/38 31/40/38 +f 31/40/39 26/13/39 38/15/39 +f 39/54/40 47/52/40 16/27/40 +f 47/52/41 43/50/41 20/33/41 +f 20/33/42 43/50/42 38/15/42 +f 15/10/43 23/34/43 7/20/43 +f 7/20/44 23/34/44 19/32/44 +f 19/32/45 14/14/45 3/26/45 +f 110/56/134 106/79/134 41/46/134 +f 102/57/135 110/75/135 46/53/135 +f 27/43/48 37/47/48 98/58/48 +f 106/60/136 98/122/136 37/47/136 +f 27/43/137 86/59/137 94/61/137 +f 22/12/138 78/11/138 74/62/138 +f 29/9/139 90/8/139 82/63/139 +f 13/29/53 66/66/53 102/57/53 +f 15/10/54 2/22/54 50/64/54 +f 17/28/140 74/106/140 66/66/140 +f 25/37/56 82/118/56 54/67/56 +f 8/21/141 4/4/141 62/68/141 +f 101/70/142 109/76/142 111/71/142 +f 103/72/143 111/71/143 112/73/143 +f 104/74/144 112/73/144 110/75/144 +f 109/76/145 105/80/145 107/77/145 +f 111/71/146 107/77/146 108/78/146 +f 112/73/147 108/78/147 106/79/147 +f 105/80/148 97/120/148 99/81/148 +f 99/81/149 100/82/149 108/78/149 +f 100/82/150 98/122/150 106/60/150 +f 93/83/151 95/88/151 87/84/151 +f 87/84/152 95/88/152 96/85/152 +f 88/86/153 96/85/153 94/61/153 +f 89/87/154 91/89/154 95/88/154 +f 91/89/155 92/90/155 96/85/155 +f 92/90/156 90/8/156 94/91/156 +f 81/92/157 83/93/157 91/89/157 +f 83/93/158 84/94/158 92/90/158 +f 84/94/159 82/63/159 90/8/159 +f 77/95/160 79/100/160 71/96/160 +f 71/96/161 79/100/161 80/97/161 +f 72/98/162 80/97/162 78/11/162 +f 73/99/163 75/101/163 79/100/163 +f 75/101/164 76/102/164 80/97/164 +f 76/102/165 74/62/165 78/11/165 +f 65/103/166 67/104/166 75/101/166 +f 67/104/167 68/105/167 76/102/167 +f 68/105/168 66/66/168 74/106/168 +f 57/107/169 49/119/169 51/108/169 +f 51/108/170 52/111/170 60/110/170 +f 52/111/171 50/121/171 58/112/171 +f 61/113/172 57/107/172 59/109/172 +f 63/114/173 59/109/173 60/110/173 +f 64/115/174 60/110/174 58/69/174 +f 53/2/175 61/113/175 63/114/175 +f 55/116/176 63/114/176 64/115/176 +f 56/117/177 64/115/177 62/6/177 +f 53/2/94 55/116/94 83/93/94 +f 55/116/95 56/117/95 84/94/95 +f 56/117/96 54/67/96 82/118/96 +f 69/1/97 71/96/97 51/108/97 +f 71/96/98 72/98/98 52/111/98 +f 72/98/99 70/65/99 50/64/99 +f 101/70/100 103/72/100 67/104/100 +f 103/72/101 104/74/101 68/105/101 +f 104/74/102 102/57/102 66/66/102 +f 85/3/103 87/84/103 99/81/103 +f 87/84/104 88/86/104 100/82/104 +f 88/86/105 86/59/105 98/58/105 +f 2/22/178 8/21/178 58/112/178 diff --git a/include/render.hpp b/include/render.hpp new file mode 100644 index 0000000..5fe3981 --- /dev/null +++ b/include/render.hpp @@ -0,0 +1,19 @@ +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + + typedef unsigned int uint; + +void render(uint vtx, uint idx, + uint attrib_position, + uint attrib_normal, + uint uniform_trans, + uint uniform_normal_trans, + uint uniform_base_color, + uint uniform_light_pos, + int length); +#ifdef __cplusplus +} +#endif diff --git a/include/shader/vertex_color.fp.glsl.h b/include/shader/vertex_color.fp.glsl.h index 247d3d1..68dbdc2 100644 --- a/include/shader/vertex_color.fp.glsl.h +++ b/include/shader/vertex_color.fp.glsl.h @@ -10,8 +10,8 @@ extern uint32_t _binary_src_shader_vertex_color_fp_glsl_start __asm("_binary_src extern uint32_t _binary_src_shader_vertex_color_fp_glsl_end __asm("_binary_src_shader_vertex_color_fp_glsl_end"); extern uint32_t _binary_src_shader_vertex_color_fp_glsl_size __asm("_binary_src_shader_vertex_color_fp_glsl_size"); -#define src_shader_vertex_color_fp_glsl_start ((void *)&_binary_src_shader_vertex_color_fp_glsl_start) -#define src_shader_vertex_color_fp_glsl_end ((void *)&_binary_src_shader_vertex_color_fp_glsl_end) +#define src_shader_vertex_color_fp_glsl_start ((const char *)&_binary_src_shader_vertex_color_fp_glsl_start) +#define src_shader_vertex_color_fp_glsl_end ((const char *)&_binary_src_shader_vertex_color_fp_glsl_end) #define src_shader_vertex_color_fp_glsl_size (src_shader_vertex_color_fp_glsl_end - src_shader_vertex_color_fp_glsl_start) #ifdef __cplusplus diff --git a/include/shader/vertex_color.vp.glsl.h b/include/shader/vertex_color.vp.glsl.h index 5edd5b1..44bc649 100644 --- a/include/shader/vertex_color.vp.glsl.h +++ b/include/shader/vertex_color.vp.glsl.h @@ -10,8 +10,8 @@ extern uint32_t _binary_src_shader_vertex_color_vp_glsl_start __asm("_binary_src extern uint32_t _binary_src_shader_vertex_color_vp_glsl_end __asm("_binary_src_shader_vertex_color_vp_glsl_end"); extern uint32_t _binary_src_shader_vertex_color_vp_glsl_size __asm("_binary_src_shader_vertex_color_vp_glsl_size"); -#define src_shader_vertex_color_vp_glsl_start ((void *)&_binary_src_shader_vertex_color_vp_glsl_start) -#define src_shader_vertex_color_vp_glsl_end ((void *)&_binary_src_shader_vertex_color_vp_glsl_end) +#define src_shader_vertex_color_vp_glsl_start ((const char *)&_binary_src_shader_vertex_color_vp_glsl_start) +#define src_shader_vertex_color_vp_glsl_end ((const char *)&_binary_src_shader_vertex_color_vp_glsl_end) #define src_shader_vertex_color_vp_glsl_size (src_shader_vertex_color_vp_glsl_end - src_shader_vertex_color_vp_glsl_start) #ifdef __cplusplus diff --git a/src/level/level1.data b/src/level/level1.data new file mode 100644 index 0000000..80988d0 Binary files /dev/null and b/src/level/level1.data differ diff --git a/src/level/level1.data.pal b/src/level/level1.data.pal new file mode 100644 index 0000000..f1c971f Binary files /dev/null and b/src/level/level1.data.pal differ diff --git a/src/level/level1.png b/src/level/level1.png new file mode 100644 index 0000000..d8aee51 Binary files /dev/null and b/src/level/level1.png differ diff --git a/src/main.c b/src/main.c index 7c2bf92..3032e73 100644 --- a/src/main.c +++ b/src/main.c @@ -9,11 +9,12 @@ #include "shader/vertex_color.vp.glsl.h" #include "opengl.h" +#include "render.hpp" -static int vp_width = 800; -static int vp_height = 600; +#include "model/brick.h" -typedef unsigned int uint; +static int vp_width = 1200; +static int vp_height = 1200; void framebuffer_size_callback(GLFWwindow* window, int width, int height) { @@ -64,27 +65,31 @@ int main() // buffer initialization ////////////////////////////////////////////////////////////////////// + /* uint triangle_vertex_buffer = make_buffer(GL_ARRAY_BUFFER, triangle_vertex_buffer_data, (sizeof (triangle_vertex_buffer_data))); + */ - uint vertex_color_program = compile_shader(src_shader_vertex_color_vp_glsl_start, - src_shader_vertex_color_vp_glsl_size, - src_shader_vertex_color_fp_glsl_start, - src_shader_vertex_color_fp_glsl_size); - glUseProgram(vertex_color_program); - uint vertex_color_attrib_position = glGetAttribLocation(vertex_color_program, "position"); - uint vertex_color_attrib_color = glGetAttribLocation(vertex_color_program, "color"); + uint vtx = make_buffer(GL_ARRAY_BUFFER, brick_vertices, (sizeof (brick_vertices))); + uint idx = make_buffer(GL_ELEMENT_ARRAY_BUFFER, brick_Cube_triangles, (sizeof (brick_Cube_triangles))); + + uint program = compile_shader(src_shader_vertex_color_vp_glsl_start, + src_shader_vertex_color_vp_glsl_size, + src_shader_vertex_color_fp_glsl_start, + src_shader_vertex_color_fp_glsl_size); + glUseProgram(program); + uint attrib_position = glGetAttribLocation(program, "position"); + uint attrib_normal = glGetAttribLocation(program, "normal"); + uint uniform_trans = glGetUniformLocation(program, "trans"); + uint uniform_normal_trans = glGetUniformLocation(program, "normal_trans"); + uint uniform_base_color = glGetUniformLocation(program, "base_color"); + uint uniform_light_pos = glGetUniformLocation(program, "light_pos"); ////////////////////////////////////////////////////////////////////// // main loop ////////////////////////////////////////////////////////////////////// - fwrite(src_shader_vertex_color_fp_glsl_start, - src_shader_vertex_color_fp_glsl_size, - 1, - stdout); - const double frame_rate = 60.0; const double first_frame = glfwGetTime(); double last_frame = first_frame; @@ -93,26 +98,20 @@ int main() if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) glfwSetWindowShouldClose(window, true); - glBindBuffer(GL_ARRAY_BUFFER, triangle_vertex_buffer); - glVertexAttribPointer(vertex_color_attrib_position, - 3, - GL_FLOAT, - GL_FALSE, - (sizeof (float)) * 6, - (void*)0 - ); - glVertexAttribPointer(vertex_color_attrib_color, - 3, - GL_FLOAT, - GL_FALSE, - (sizeof (float)) * 6, - (void*)(3 * 4) - ); - glEnableVertexAttribArray(vertex_color_attrib_position); - glEnableVertexAttribArray(vertex_color_attrib_color); - + glEnable(GL_DEPTH_TEST); + glClearDepth(-1000.0f); + glDepthFunc(GL_GREATER); + glClearColor(0.1, 0.2, 0.3, 1.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - glDrawArrays(GL_TRIANGLES, 0, 3); + + render(vtx, idx, + attrib_position, + attrib_normal, + uniform_trans, + uniform_normal_trans, + uniform_base_color, + uniform_light_pos, + brick_Cube_triangles_length); glfwSwapBuffers(window); glfwPollEvents(); diff --git a/src/model.cpp b/src/model.cpp new file mode 100644 index 0000000..de85def --- /dev/null +++ b/src/model.cpp @@ -0,0 +1,7 @@ +#include "model/brick.h" + +void brick_model() +{ + make_buffer(GL_ARRAY_BUFFER, brick_vertices, (sizeof (brick_vertices))); + make_buffer(GL_ELEMENT_ARRAY_BUFFER, brick_Cube_triangles, (sizeof (brick_Cube_triangles))); +} diff --git a/src/render.cpp b/src/render.cpp new file mode 100644 index 0000000..04843a0 --- /dev/null +++ b/src/render.cpp @@ -0,0 +1,144 @@ +#include +#include +#include + +#include "glad/glad.h" + +#include "render.hpp" +#include "math/float_types.hpp" +#include "math/transform.hpp" + +#include "level/level1.data.h" +#include "level/level1.data.pal.h" + +#define PI 3.14159274101257324219f + +mat4x4 perspective(float low1, float high1, + float low2, float high2) +{ + float scale = (high2 - low2) / (high1 - low1); + + mat4x4 m1 = mat4x4(1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, -low1, + 0, 0, 0, 1 + ); + + mat4x4 m2 = mat4x4(1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 0, 1, + 0, 0, scale, low2 + ); + + mat4x4 m3 = m2 * m1; + + /* + mat4x4 m3 = mat4x4(1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 0, 1, + 0, 0, 1, 0 + ); + */ + + if (0) { + for (int i = 0; i < 4; i++) { + printf("% 2.3f % 2.3f % 2.3f % 2.3f \n", m3[i][0], m3[i][1], m3[i][2], m3[i][3]); + } + + vec4 v = vec4(5, 6, 0.5, 1); + vec4 vv = m3 * v; + printf("\n% 2.3f % 2.3f % 2.3f % 2.3f \n", vv[0], vv[1], vv[2], vv[3]); + exit(1); + } + + return m3; +} + +/* + levels are 13x28 + */ + +void render(uint vtx, uint idx, + uint attrib_position, + uint attrib_normal, + uint uniform_trans, + uint uniform_normal_trans, + uint uniform_base_color, + uint uniform_light_pos, + int length) +{ + static float theta = 0; + + theta += 0.01; + + glBindBuffer(GL_ARRAY_BUFFER, vtx); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, idx); + glVertexAttribPointer(attrib_position, + 3, + GL_FLOAT, + GL_FALSE, + (sizeof (float)) * 8, + (void*)(0 * 4) + ); + /* + glVertexAttribPointer(vertex_color_attrib_texture, + 2, + GL_FLOAT, + GL_FALSE, + (sizeof (float)) * 8, + (void*)(3 * 4) + ); + */ + glVertexAttribPointer(attrib_normal, + 3, + GL_FLOAT, + GL_FALSE, + (sizeof (float)) * 8, + (void*)(5 * 4) + ); + glEnableVertexAttribArray(attrib_position); + glEnableVertexAttribArray(attrib_normal); + + assert(src_level_level1_data_size == 13 * 28); + const uint8_t * level = (const uint8_t *)src_level_level1_data_start; + const uint8_t * pal = (const uint8_t *)src_level_level1_data_pal_start; + + for (int y = 0; y < 28; y++) { + for (int x = 0; x < 13; x++) { + char tile = level[y * 13 + x]; + if (tile == 0) + continue; + + const float cs = 1.0f / 255.0f; + vec3 base_color = vec3(((float)pal[tile * 3 + 0]) * cs, + ((float)pal[tile * 3 + 1]) * cs, + ((float)pal[tile * 3 + 2]) * cs); + + mat4x4 rx = rotate_x(PI / 2.0f); + //mat4x4 p = perspective(-1, 1, 0, 1); + mat4x4 s = scale(vec3(1.0f / 12.0f, + 1.0f / 27.0f, + 1.0f / 27.0f)); + + float px = ((float)x / 13.0) * 2.0 - 1.0 + 1.0f / 13.0f; + float py = ((float)y / 28.0) * -2.0 + 1.0 - 1.0f / 28.0f; + + mat4x4 t = translate(vec3(px, py, 0.0)); + + mat4x4 trans = t * rx * s; + + //mat3x3 normal_trans = transpose(inverse(submatrix(trans, 0, 0))); + mat3x3 normal_trans = submatrix(rx, 3, 3); + + vec3 light_pos = normalize(rotate_z(theta) * vec3(1, 1, 1)); + + glUniform4fv(uniform_trans, 4, &trans[0][0]); + glUniform3fv(uniform_normal_trans, 3, &normal_trans[0][0]); + glUniform3fv(uniform_base_color, 1, &base_color[0]); + glUniform3fv(uniform_light_pos, 1, &light_pos[0]); + + //glDrawArrays(GL_TRIANGLES, 0, 3); + glDrawElements(GL_TRIANGLES, length, GL_UNSIGNED_INT, 0); + } + } +} diff --git a/src/shader/vertex_color.fp.glsl b/src/shader/vertex_color.fp.glsl index 76aa9d5..b94cc6d 100644 --- a/src/shader/vertex_color.fp.glsl +++ b/src/shader/vertex_color.fp.glsl @@ -1,8 +1,24 @@ #version 120 -//varying vec3 color_out; +uniform vec3 base_color; +uniform vec3 light_pos; + +varying vec3 fp_position; +varying vec3 fp_normal; void main() { - gl_FragColor = gl_Color; + //vec3 color_normal = fp_normal * 0.5 + 0.5; + //vec3 light_pos = vec3(1, 1, 1); + + vec3 light_dir = normalize(light_pos - fp_position); + float diffuse = max(dot(fp_normal, light_dir), 0.0); + + vec3 color = (diffuse + 0.5) * base_color; + + gl_FragColor = vec4(color, 1.0); } +// normal +// x (0.0 left 1.0 right) +// y (0.0 bot 1.0 top) +// z (0.0 far 1.0 near) diff --git a/src/shader/vertex_color.vp.glsl b/src/shader/vertex_color.vp.glsl index 0b6c744..eae2754 100644 --- a/src/shader/vertex_color.vp.glsl +++ b/src/shader/vertex_color.vp.glsl @@ -1,10 +1,35 @@ #version 120 attribute vec3 position; -attribute vec3 color; +attribute vec3 normal; + +uniform vec4 trans[4]; +uniform vec3 normal_trans[3]; + +varying vec3 fp_normal; +varying vec3 fp_position; + +vec4 transform4(vec4 v) +{ + return vec4(dot(trans[0], v), + dot(trans[1], v), + dot(trans[2], v), + dot(trans[3], v)); +} + +vec3 transform3(vec3 v) +{ + return vec3(dot(normal_trans[0], v), + dot(normal_trans[1], v), + dot(normal_trans[2], v)); +} void main() { - gl_Position = vec4(position, 1); - gl_FrontColor = vec4(color, 1); + vec4 pos = transform4(vec4(position, 1)); + + fp_normal = normalize(transform3(normal)); + fp_position = pos.xyz; + + gl_Position = pos; }