draw level

This commit is contained in:
Zack Buhman 2025-12-04 12:19:16 -06:00
parent 315512da12
commit edf47747f9
27 changed files with 3046 additions and 45 deletions

View File

@ -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)

View File

@ -0,0 +1,19 @@
#pragma once
#include <stdint.h>
#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

View File

@ -0,0 +1,19 @@
#pragma once
#include <stdint.h>
#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

View File

@ -0,0 +1,5 @@
#pragma once
#define PI (3.14159274101257324219f)
#define PI_2 (PI * 2.0f)
#define I_PI_2 (1.0f / (PI_2))

View File

@ -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>;

26
include/math/mat.hpp Normal file
View File

@ -0,0 +1,26 @@
#pragma once
template <int R, int C, typename T>
struct mat;
template <int R, int C, typename T>
inline constexpr typename mat<R, C, T>::col_type
col(mat<R, C, T> const& m, int c)
{
typename mat<R, C, T>::col_type v;
for (int r = 0; r < R; r++) {
v[r] = m[r][c];
}
return v;
}
template <int R, typename T>
inline constexpr vec<3, T>
col(mat<R, 4, T> const& m, int c)
{
vec<3, T> v;
for (int r = 0; r < 3; r++) {
v[r] = m[r][c];
}
return v;
}

112
include/math/mat2x2.hpp Normal file
View File

@ -0,0 +1,112 @@
#pragma once
#include <utility>
#include "vec2.hpp"
#include "mat.hpp"
//
// mat2x2
//
template <typename T>
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<typename T>
inline constexpr mat<2, 2, T>::mat()
: value{std::move(row_type(1, 0)),
std::move(row_type(0, 1))}
{ }
template<typename T>
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 <typename T>
inline constexpr typename mat<2, 2, T>::row_type &
mat<2, 2, T>::operator[](int i)
{
return value[i];
}
template <typename T>
inline constexpr typename mat<2, 2, T>::row_type const &
mat<2, 2, T>::operator[](int i) const
{
return value[i];
}
template<typename T>
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<typename T>
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<typename T>
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<typename T>
inline constexpr float determinant(mat<2, 2, T> const& a)
{
return a[0][0] * a[1][1] - a[0][1] * a[1][0];
}

201
include/math/mat3x3.hpp Normal file
View File

@ -0,0 +1,201 @@
#pragma once
#include <utility>
#include "vec3.hpp"
#include "mat.hpp"
//
// mat3x3
//
template <typename T>
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<typename T>
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<typename T>
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 <typename T>
inline constexpr typename mat<3, 3, T>::row_type &
mat<3, 3, T>::operator[](int i)
{
return value[i];
}
template <typename T>
inline constexpr typename mat<3, 3, T>::row_type const &
mat<3, 3, T>::operator[](int i) const
{
return value[i];
}
template<typename T>
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<typename T>
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<typename T>
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<typename T>
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<typename T>
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<typename T>
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<typename T>
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<typename T>
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<typename T>
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<typename T>
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;
}

247
include/math/mat4x4.hpp Normal file
View File

@ -0,0 +1,247 @@
#pragma once
#include <utility>
#include "vec4.hpp"
#include "mat.hpp"
//
// mat4x4
//
template <typename T>
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<typename T>
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<typename T>
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 <typename T>
inline constexpr typename mat<4, 4, T>::row_type &
mat<4, 4, T>::operator[](int i)
{
return value[i];
}
template <typename T>
inline constexpr typename mat<4, 4, T>::row_type const &
mat<4, 4, T>::operator[](int i) const
{
return value[i];
}
template<typename T>
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<typename T>
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<typename T>
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<typename T>
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<typename T>
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<typename T>
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<typename T>
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<typename T>
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<typename T>
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<typename T>
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<typename T>
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<typename T>
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);
}

167
include/math/transform.hpp Normal file
View File

@ -0,0 +1,167 @@
#pragma once
#include "vec.hpp"
#include "mat.hpp"
template<typename T>
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 <typename T>
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 <typename T>
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 <typename T>
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 <typename T>
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 <typename T>
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 <typename T>
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 <typename T>
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 <typename T>
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 <typename T>
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 <typename T>
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 <typename T>
inline constexpr T inverse_length(vec<3, T> v)
{
float f = dot(v, v);
return 1.0f / sqrt(f);
}
template <typename T>
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
};
}

29
include/math/vec.hpp Normal file
View File

@ -0,0 +1,29 @@
#pragma once
template <int L, typename T>
struct vec;
template <int L, typename T>
inline constexpr T magnitude(vec<L, T> const& v)
{
return sqrt(dot(v, v));
}
template <int L, typename T>
inline constexpr T magnitude_squared(vec<L, T> const& v)
{
return dot(v, v);
}
template <int L, typename T>
inline constexpr vec<L, T> normalize(vec<L, T> const& v)
{
T d = 1.0f / magnitude(v);
return v * d;
}
template <int L, typename T>
inline constexpr vec<3, T> reflect(vec<L, T> const& i, vec<L, T> const& n)
{
return i - dot(n, i) * n * static_cast<T>(2.0);
}

154
include/math/vec2.hpp Normal file
View File

@ -0,0 +1,154 @@
#pragma once
#include "vec.hpp"
//
// vec3
//
template <typename T>
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 <typename T>
inline constexpr vec<2, T>::vec()
: x(0), y(0)
{}
template <typename T>
inline constexpr vec<2, T>::vec(T scalar)
: x(scalar), y(scalar)
{}
template <typename T>
inline constexpr vec<2, T>::vec(T _x, T _y)
: x(_x), y(_y)
{}
template <typename T>
constexpr inline vec<2, T> vec<2, T>::operator-() const
{
return vec<2, T>(-x, -y);
}
template <typename T>
inline constexpr T & vec<2, T>::operator[](int i)
{
return val[i];
}
template <typename T>
inline constexpr T const& vec<2, T>::operator[](int i) const
{
return val[i];
}
template <typename T>
inline constexpr vec<2, T>& vec<2, T>::operator=(vec<2, T> const& v)
{
this->x = static_cast<T>(v.x);
this->y = static_cast<T>(v.y);
return *this;
}
template <typename T>
inline constexpr vec<2, T>& vec<2, T>::operator+=(vec<2, T> const& v)
{
*this = *this + vec<2, T>(v);
return *this;
}
template <typename T>
inline constexpr vec<2, T>& vec<2, T>::operator-=(vec<2, T> const& v)
{
*this = *this - vec<2, T>(v);
return *this;
}
template <typename T>
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 <typename T>
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 <typename T>
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 <typename T>
inline constexpr vec<2, T> operator*(vec<2, T> const& v1, T const& scalar)
{
return v1 * vec<2, T>(scalar);
}
template <typename T>
inline constexpr vec<2, T> operator*(T const& scalar, vec<2, T> const& v1)
{
return vec<2, T>(scalar) * v1;
}
template <typename T>
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 <typename T>
inline constexpr vec<2, T> operator/(vec<2, T> const& v1, T const& scalar)
{
return v1 / vec<2, T>(scalar);
}
template <typename T>
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 <typename T>
inline constexpr T cross(vec<2, T> const& v1, vec<2, T> const& v2)
{
return v1.x * v2.y - v2.x * v1.y;
}
template <typename T>
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 <typename T, typename U>
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));
}

171
include/math/vec3.hpp Normal file
View File

@ -0,0 +1,171 @@
#pragma once
#include "vec.hpp"
//
// vec3
//
template <typename T>
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 <typename T>
inline constexpr vec<3, T>::vec()
: x(0), y(0), z(0)
{}
template <typename T>
inline constexpr vec<3, T>::vec(T scalar)
: x(scalar), y(scalar), z(scalar)
{}
template <typename T>
inline constexpr vec<3, T>::vec(T _x, T _y, T _z)
: x(_x), y(_y), z(_z)
{}
template <typename T>
constexpr inline vec<3, T> vec<3, T>::operator-() const
{
return vec<3, T>(-x, -y, -z);
}
template <typename T>
inline constexpr T & vec<3, T>::operator[](int i)
{
return val[i];
}
template <typename T>
inline constexpr T const& vec<3, T>::operator[](int i) const
{
return val[i];
}
template <typename T>
inline constexpr vec<3, T>& vec<3, T>::operator=(vec<3, T> const& v)
{
this->x = static_cast<T>(v.x);
this->y = static_cast<T>(v.y);
this->z = static_cast<T>(v.z);
return *this;
}
template <typename T>
inline constexpr vec<3, T>& vec<3, T>::operator+=(vec<3, T> const& v)
{
*this = *this + vec<3, T>(v);
return *this;
}
template <typename T>
inline constexpr vec<3, T>& vec<3, T>::operator-=(vec<3, T> const& v)
{
*this = *this - vec<3, T>(v);
return *this;
}
template <typename T>
inline constexpr vec<3, T>& vec<3, T>::operator*=(T const& scalar)
{
*this = *this * scalar;
return *this;
}
template <typename T>
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 <typename T>
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 <typename T>
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 <typename T>
inline constexpr vec<3, T> operator*(vec<3, T> const& v1, T const& scalar)
{
return v1 * vec<3, T>(scalar);
}
template <typename T>
inline constexpr vec<3, T> operator*(T const& scalar, vec<3, T> const& v1)
{
return vec<3, T>(scalar) * v1;
}
template <typename T>
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 <typename T>
inline constexpr vec<3, T> operator/(vec<3, T> const& v1, T const& scalar)
{
return v1 / vec<3, T>(scalar);
}
template <typename T>
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 <typename T>
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 <typename T>
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 <typename T, typename U>
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));
}

164
include/math/vec4.hpp Normal file
View File

@ -0,0 +1,164 @@
#pragma once
#include "vec.hpp"
//
// vec4
//
template <typename T>
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 <typename T>
inline constexpr vec<4, T>::vec()
: x(0), y(0), z(0), w(0)
{}
template <typename T>
inline constexpr vec<4, T>::vec(T scalar)
: x(scalar), y(scalar), z(scalar), w(scalar)
{}
template <typename T>
inline constexpr vec<4, T>::vec(T _x, T _y, T _z, T _w)
: x(_x), y(_y), z(_z), w(_w)
{}
template <typename T>
inline constexpr vec<4, T>::vec(const vec<3, T>& v)
: x(v.x), y(v.y), z(v.z), w(1.f)
{}
template <typename T>
constexpr inline vec<4, T> vec<4, T>::operator-() const
{
return vec<4, T>(-x, -y, -z, -w);
}
template <typename T>
inline constexpr T & vec<4, T>::operator[](int i)
{
return val[i];
}
template <typename T>
inline constexpr T const& vec<4, T>::operator[](int i) const
{
return val[i];
}
template <typename T>
inline constexpr vec<4, T>& vec<4, T>::operator=(vec<4, T> const& v)
{
this->x = static_cast<T>(v.x);
this->y = static_cast<T>(v.y);
this->z = static_cast<T>(v.z);
this->w = static_cast<T>(v.w);
return *this;
}
template <typename T>
inline constexpr vec<4, T>& vec<4, T>::operator+=(vec<4, T> const& v)
{
*this = *this + vec<4, T>(v);
return *this;
}
template <typename T>
inline constexpr vec<4, T>& vec<4, T>::operator-=(vec<4, T> const& v)
{
*this = *this - vec<4, T>(v);
return *this;
}
template <typename T>
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 <typename T>
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 <typename T>
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 <typename T>
inline constexpr vec<4, T> operator*(vec<4, T> const& v1, T const& scalar)
{
return v1 * vec<4, T>(scalar);
}
template <typename T>
inline constexpr vec<4, T> operator*(T const& scalar, vec<4, T> const& v1)
{
return vec<4, T>(scalar) * v1;
}
template <typename T>
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 <typename T>
inline constexpr vec<4, T> operator/(vec<4, T> const& v1, T const& scalar)
{
return v1 / vec<4, T>(scalar);
}
template <typename T>
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 <typename T>
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 <typename T, typename U>
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));
}

808
include/model/brick.h Normal file
View File

@ -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]));

637
include/model/brick.obj Normal file
View File

@ -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

19
include/render.hpp Normal file
View File

@ -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

View File

@ -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

View File

@ -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

BIN
src/level/level1.data Normal file

Binary file not shown.

BIN
src/level/level1.data.pal Normal file

Binary file not shown.

BIN
src/level/level1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 629 B

View File

@ -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();

7
src/model.cpp Normal file
View File

@ -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)));
}

144
src/render.cpp Normal file
View File

@ -0,0 +1,144 @@
#include <math.h>
#include <stdio.h>
#include <assert.h>
#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);
}
}
}

View File

@ -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)

View File

@ -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;
}