first person camera
This commit is contained in:
parent
a0e922975a
commit
c987c0330b
@ -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);
|
||||
|
||||
2
main.lua
2
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()
|
||||
|
||||
@ -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);
|
||||
|
||||
glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_BYTE, (void *)0);
|
||||
}
|
||||
|
||||
x += font.desc->glyph_width;
|
||||
|
||||
i += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
55
src/test.cpp
55
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);
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user