diff --git a/include/test.h b/include/test.h index aa4a777..46c64d2 100644 --- a/include/test.h +++ b/include/test.h @@ -5,6 +5,7 @@ extern "C" { #endif void load(); + void draw_hud(); void draw(); void update(float lx, float ly, float rx, float ry, float tl, float tr, int up, int down, int left, int right); diff --git a/main.lua b/main.lua index 4f7a2d7..6436a95 100644 --- a/main.lua +++ b/main.lua @@ -7,6 +7,7 @@ function init() ffi.cdef[[ void load(); void draw(); +void draw_hud(); void update(float lx, float ly, float rx, float ry, float tl, float tr, int up, int down, int left, int right); ]] @@ -33,6 +34,7 @@ end local draw = function() test.draw() + test.draw_hud() end function love.run() diff --git a/src/font.cpp b/src/font.cpp index 6eb2adf..949be10 100644 --- a/src/font.cpp +++ b/src/font.cpp @@ -133,20 +133,17 @@ namespace font { int i = 0; while (s[i] != 0) { - char c = s[i]; - if (c <= 0x20 || c > 0x7f) - continue; + char c = s[i++]; + if (!(c <= 0x20 || c > 0x7f)) { + XMFLOAT4X4 transform = glyph_transform(font, x, y); + glUniformMatrix4fv(location.uniform.transform, 1, GL_FALSE, (float *)&transform); + XMFLOAT2 glyph = glyph_coordinate(font, c); + glUniform2fv(location.uniform.glyph, 1, (float *)&glyph); - XMFLOAT4X4 transform = glyph_transform(font, x, y); - glUniformMatrix4fv(location.uniform.transform, 1, GL_FALSE, (float *)&transform); - XMFLOAT2 glyph = glyph_coordinate(font, c); - glUniform2fv(location.uniform.glyph, 1, (float *)&glyph); - - glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_BYTE, (void *)0); + glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_BYTE, (void *)0); + } x += font.desc->glyph_width; - - i += 1; } } } diff --git a/src/test.cpp b/src/test.cpp index ab334f4..b526dcc 100644 --- a/src/test.cpp +++ b/src/test.cpp @@ -241,8 +241,10 @@ extern "C" { struct view_state { XMVECTOR up; XMVECTOR eye; + XMVECTOR forward; XMVECTOR direction; float fov; + float pitch; }; view_state view_state; @@ -260,9 +262,11 @@ void load() view_state.up = XMVectorSet(0.0f, 0.0f, 1.0f, 0.0f); view_state.eye = XMVectorSet(0, 0, 0, 1); - view_state.direction = XMVectorSet(1, 0, 0, 0); + view_state.forward = XMVectorSet(1, 0, 0, 0); + view_state.direction = view_state.forward; + view_state.pitch = 0.0; - view_state.fov = 1.0; + view_state.fov = 1.5; //load_texture_shader_storage(); @@ -279,18 +283,30 @@ void load() ter_8x16 = font::load_font(font::ter_8x16); } +float _ry = 0.0; + void update(float lx, float ly, float rx, float ry, float tl, float tr, int up, int down, int left, int right) { //view_state.yaw += rx; XMMATRIX mrz = XMMatrixRotationZ(rx * -0.035); - XMMATRIX mry = XMMatrixRotationY(ry * -0.035); - view_state.direction = XMVector3Transform(view_state.direction, mrz * mry); - XMVECTOR normal = XMVector3Cross(view_state.direction, view_state.up); - view_state.eye += view_state.direction * -ly + normal * lx + view_state.up * (tl - tr); + view_state.forward = XMVector3Transform(view_state.forward, mrz); + XMVECTOR normal = XMVector3NormalizeEst(XMVector3Cross(view_state.forward, view_state.up)); - view_state.fov += 0.01 * up + -0.01 * down; + view_state.pitch += ry * -0.035; + if (view_state.pitch > 1.5f) view_state.pitch = 1.5f; + if (view_state.pitch < -1.5f) view_state.pitch = -1.5f; + + XMMATRIX mrn = XMMatrixRotationAxis(normal, view_state.pitch); + view_state.direction = XMVector3Transform(view_state.forward, mrn); + + view_state.eye += view_state.forward * -ly + normal * lx + view_state.up * (tl - tr); + + float new_fov = view_state.fov + 0.01 * up + -0.01 * down; + if (new_fov > 0.00001f) { + view_state.fov = new_fov; + } } static inline int popcount(int x) @@ -298,6 +314,29 @@ static inline int popcount(int x) return __builtin_popcount(x); } +void asdf(char * const buf, char const * const label, char const * const format, float value) +{ + const int label_length = strlen(label); + memcpy(buf, label, label_length); + int len = snprintf(&buf[label_length], 511 - label_length, format, value); + buf[label_length + len] = 0; +} + +void draw_hud() +{ + char buf[512]; + + float y = 10.0f; + + asdf(buf, "fov: ", "%.3f", view_state.fov); + font::draw_string(ter_8x16, buf, 10, y); + y += ter_8x16.desc->glyph_height; + + asdf(buf, "pitch: ", "%.9f", view_state.pitch); + font::draw_string(ter_8x16, buf, 10, y); + y += ter_8x16.desc->glyph_height; +} + void draw() { XMVECTOR at = XMVectorAdd(view_state.eye, view_state.direction); @@ -368,6 +407,4 @@ void draw() glDrawElementsInstancedBaseInstance(GL_TRIANGLES, element_count, GL_UNSIGNED_BYTE, indices, instance_count, base_instance); } } - - font::draw_string(ter_8x16, "test", 10, 10); }