aboutsummaryrefslogtreecommitdiff
path: root/src/fb/chfb.cpp
blob: 71259aa4d00502091fb345e1846df9a549baea21 (plain) (blame)
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
#include "fb/chfb.h"
#include <algorithm>
#include <cstdint>
#include "math/vector.h"
#include "math/quat.h"
#include "o3d/vertex_data.h"

using namespace engine::fb;
using engine::math::Vector3, engine::math::Quaternion, engine::o3d::VertexData;

CharacterFrameBuffer::CharacterFrameBuffer(unsigned int w, unsigned int h) {
    resize(w, h);
}

void CharacterFrameBuffer::resize(unsigned int w, unsigned int h) {
    this->w = w;
    this->h = h;
    chars_vector.resize(w * h);
    clear();
}

void CharacterFrameBuffer::clear() {
    std::fill(chars_vector.begin(), chars_vector.end(), ' ');
}

// taken from https://stackoverflow.com/a/74186686
char brightness_chars[] = " `.-':_,^=;><+!rc*/z?sLTv)J7(|Fi{C}fI31tlu[neoZ5Yxjya]2ESwqkP6h9d4VpOGbUAKXHm8RD#$Bg0MNWQ%&@";
extern Quaternion camera_quat;

void CharacterFrameBuffer::draw_point(int x, int y, const Vector3& loc, const VertexData& vd, const Vector3& normal) {
    (void) loc;
    (void) vd;
    auto v = normal.rot(camera_quat.conjugate());
    float light = .1f + (v.z < 0.f ? 0.f : v.z) * .9f;
    std::uint32_t c = (int) (light * static_cast<float>(sizeof(brightness_chars) - 1));
    chars_vector[x + y * w] = brightness_chars[c];
}