上回我们已经可以在屏幕上画出点了,现在我们开始画直线和三角形。
基础数据结构
我们先准备一些数据结构,如二维向量和三维向量,方便后面使用。
template <class t> struct Vec2 {
union {
struct { t u, v; };
struct { t x, y; };
t raw[2];
};
Vec2() : u(0), v(0) {}
Vec2(t _u, t _v) : u(_u), v(_v) {}
inline Vec2<t> operator +(const Vec2<t>& V) const { return Vec2<t>(u + V.u, v + V.v); }
inline Vec2<t> operator -(const Vec2<t>& V) const { return Vec2<t>(u - V.u, v - V.v); }
inline Vec2<t> operator *(float f) const { return Vec2<t>(u * f, v * f); }
t& operator[](const size_t i) { assert(i < 2); return i <= 0 ? x : y; }
const t& operator[](const size_t i) const { assert(i < 2); return i <= 0 ? x : y; }
};
template <class t> struct Vec3 {
union {
struct { t x, y, z; };
struct { t r, g, b; };
struct { t ivert, iuv, inorm; };
t raw[3];
};
Vec3() : x(0), y(0), z(0) {}
Vec3(t _x, t _y, t _z) : x(_x), y(_y), z(_z) {}
inline Vec3<t> operator ^(const Vec3<t>& v) const { return Vec3<t>(y * v.z - z * v.y, z * v.x - x * v.z, x * v.y - y * v.x); }
inline Vec3<t> operator +(const Vec3<t>& v