#pragma once #include #include namespace glm { typedef vec<3, long long> lvec3; typedef vec<4, long long> lvec4; } typedef glm::vec3 camera_pos; typedef glm::lvec3 voxel_pos; typedef glm::ivec3 chunk_pos; typedef glm::vec<3, ushort> chunk_voxel_pos; namespace glm { ivec3 inline iround(const vec3& p) { return ivec3(std::round(p.x), std::round(p.y), std::round(p.z)); } int inline length2(const ivec3& a) { return a.x * a.x + a.y * a.y + a.z * a.z; } ivec3 inline diff(const ivec3& a, const ivec3& b) { return glm::abs(glm::abs(a) - glm::abs(b)); } uint inline rem(long long value, uint m) { return value < 0 ? ((value+1) % (long long)m) + m - 1 : value % (long long)m; } int inline div(long long value, uint m) { return value < 0 ? ((value+1) / (long long)m) - 1 : value / (long long)m; } chunk_voxel_pos inline modulo(const voxel_pos& value, const chunk_voxel_pos& m) { return chunk_voxel_pos(rem(value.x, m.x), rem(value.y, m.y), rem(value.z, m.z)); } chunk_pos inline divide(const voxel_pos &value, const chunk_voxel_pos &m) { return chunk_pos(div(value.x, m.x), div(value.y, m.y), div(value.z, m.z)); } }