117            float m[4][4] = { 0 };
 
 
  123            bool LoadOBJFile(std::string sFilename, 
bool bHasTexture = 
false);
 
 
  204            void SetProjection(
float fFovDegrees, 
float fAspectRatio, 
float fNear, 
float fFar, 
float fLeft, 
float fTop, 
float fWidth, 
float fHeight);
 
  211            uint32_t 
Render(std::vector<olc::GFX3D::triangle> &triangles, uint32_t flags, 
int nOffset, 
int nCount);
 
 
  252            int x2, 
int y2, 
float u2, 
float v2, 
float w2,
 
  253            int x3, 
int y3, 
float u3, 
float v3, 
float w3, 
olc::Sprite* spr);
 
  256             int x2, 
int y2, 
float u2, 
float v2, 
float w2, 
olc::Pixel c2,
 
  257             int x3, 
int y3, 
float u3, 
float v3, 
float w3, 
olc::Pixel c3,
 
  265        static float* m_DepthBuffer;
 
 
  272#ifdef OLC_PGEX_GRAPHICS3D 
  273#undef OLC_PGEX_GRAPHICS3D 
  285        v.
x = i.
x * m.
m[0][0] + i.
y * m.
m[1][0] + i.
z * m.
m[2][0] + i.
w * m.
m[3][0];
 
  286        v.y = i.
x * m.
m[0][1] + i.
y * m.
m[1][1] + i.
z * m.
m[2][1] + i.
w * m.
m[3][1];
 
  287        v.z = i.
x * m.
m[0][2] + i.
y * m.
m[1][2] + i.
z * m.
m[2][2] + i.
w * m.
m[3][2];
 
  288        v.w = i.
x * m.
m[0][3] + i.
y * m.
m[1][3] + i.
z * m.
m[2][3] + i.
w * m.
m[3][3];
 
  295        matrix.
m[0][0] = 1.0f;
 
  296        matrix.
m[1][1] = 1.0f;
 
  297        matrix.
m[2][2] = 1.0f;
 
  298        matrix.
m[3][3] = 1.0f;
 
  305        matrix.
m[0][0] = 1.0f;
 
  306        matrix.
m[1][1] = cosf(fAngleRad);
 
  307        matrix.
m[1][2] = sinf(fAngleRad);
 
  308        matrix.
m[2][1] = -sinf(fAngleRad);
 
  309        matrix.
m[2][2] = cosf(fAngleRad);
 
  310        matrix.
m[3][3] = 1.0f;
 
  317        matrix.
m[0][0] = cosf(fAngleRad);
 
  318        matrix.
m[0][2] = sinf(fAngleRad);
 
  319        matrix.
m[2][0] = -sinf(fAngleRad);
 
  320        matrix.
m[1][1] = 1.0f;
 
  321        matrix.
m[2][2] = cosf(fAngleRad);
 
  322        matrix.
m[3][3] = 1.0f;
 
  329        matrix.
m[0][0] = cosf(fAngleRad);
 
  330        matrix.
m[0][1] = sinf(fAngleRad);
 
  331        matrix.
m[1][0] = -sinf(fAngleRad);
 
  332        matrix.
m[1][1] = cosf(fAngleRad);
 
  333        matrix.
m[2][2] = 1.0f;
 
  334        matrix.
m[3][3] = 1.0f;
 
  344        matrix.
m[3][3] = 1.0f;
 
  351        matrix.
m[0][0] = 1.0f;
 
  352        matrix.
m[1][1] = 1.0f;
 
  353        matrix.
m[2][2] = 1.0f;
 
  354        matrix.
m[3][3] = 1.0f;
 
  363        float fFovRad = 1.0f / tanf(fFovDegrees * 0.5f / 180.0f * 3.14159f);
 
  365        matrix.
m[0][0] = fAspectRatio * fFovRad;
 
  366        matrix.
m[1][1] = fFovRad;
 
  367        matrix.
m[2][2] = fFar / (fFar - fNear);
 
  368        matrix.
m[3][2] = (-fFar * fNear) / (fFar - fNear);
 
  369        matrix.
m[2][3] = 1.0f;
 
  370        matrix.
m[3][3] = 0.0f;
 
  377        for (
int c = 0; c < 4; c++)
 
  378            for (
int r = 0; r < 4; r++)
 
  379                matrix.
m[r][c] = m1.
m[r][0] * m2.
m[0][c] + m1.
m[r][1] * m2.
m[1][c] + m1.
m[r][2] * m2.
m[2][c] + m1.
m[r][3] * m2.
m[3][c];
 
  387        newForward = Vec_Normalise(newForward);
 
  392        newUp = Vec_Normalise(newUp);
 
  399        matrix.
m[0][0] = newRight.
x;    matrix.
m[0][1] = newRight.
y;    matrix.
m[0][2] = newRight.
z;    matrix.
m[0][3] = 0.0f;
 
  400        matrix.
m[1][0] = newUp.
x;       matrix.
m[1][1] = newUp.
y;       matrix.
m[1][2] = newUp.
z;       matrix.
m[1][3] = 0.0f;
 
  401        matrix.
m[2][0] = newForward.
x;  matrix.
m[2][1] = newForward.
y;  matrix.
m[2][2] = newForward.
z;  matrix.
m[2][3] = 0.0f;
 
  402        matrix.
m[3][0] = pos.
x;         matrix.
m[3][1] = pos.
y;         matrix.
m[3][2] = pos.
z;         matrix.
m[3][3] = 1.0f;
 
  410        matrix.
m[0][0] = m.
m[0][0]; matrix.
m[0][1] = m.
m[1][0]; matrix.
m[0][2] = m.
m[2][0]; matrix.
m[0][3] = 0.0f;
 
  411        matrix.
m[1][0] = m.
m[0][1]; matrix.
m[1][1] = m.
m[1][1]; matrix.
m[1][2] = m.
m[2][1]; matrix.
m[1][3] = 0.0f;
 
  412        matrix.
m[2][0] = m.
m[0][2]; matrix.
m[2][1] = m.
m[1][2]; matrix.
m[2][2] = m.
m[2][2]; matrix.
m[2][3] = 0.0f;
 
  413        matrix.
m[3][0] = -(m.
m[3][0] * matrix.
m[0][0] + m.
m[3][1] * matrix.
m[1][0] + m.
m[3][2] * matrix.
m[2][0]);
 
  414        matrix.
m[3][1] = -(m.
m[3][0] * matrix.
m[0][1] + m.
m[3][1] * matrix.
m[1][1] + m.
m[3][2] * matrix.
m[2][1]);
 
  415        matrix.
m[3][2] = -(m.
m[3][0] * matrix.
m[0][2] + m.
m[3][1] * matrix.
m[1][2] + m.
m[3][2] * matrix.
m[2][2]);
 
  416        matrix.
m[3][3] = 1.0f;
 
  427        matInv.
m[0][0] =  m.
m[1][1] * m.
m[2][2] * m.
m[3][3] - m.
m[1][1] * m.
m[2][3] * m.
m[3][2] - m.
m[2][1] * m.
m[1][2] * m.
m[3][3] + m.
m[2][1] * m.
m[1][3] * m.
m[3][2] + m.
m[3][1] * m.
m[1][2] * m.
m[2][3] - m.
m[3][1] * m.
m[1][3] * m.
m[2][2];
 
  428        matInv.m[1][0] = -m.
m[1][0] * m.
m[2][2] * m.
m[3][3] + m.
m[1][0] * m.
m[2][3] * m.
m[3][2] + m.
m[2][0] * m.
m[1][2] * m.
m[3][3] - m.
m[2][0] * m.
m[1][3] * m.
m[3][2] - m.
m[3][0] * m.
m[1][2] * m.
m[2][3] + m.
m[3][0] * m.
m[1][3] * m.
m[2][2];
 
  429        matInv.m[2][0] =  m.
m[1][0] * m.
m[2][1] * m.
m[3][3] - m.
m[1][0] * m.
m[2][3] * m.
m[3][1] - m.
m[2][0] * m.
m[1][1] * m.
m[3][3] + m.
m[2][0] * m.
m[1][3] * m.
m[3][1] + m.
m[3][0] * m.
m[1][1] * m.
m[2][3] - m.
m[3][0] * m.
m[1][3] * m.
m[2][1];
 
  430        matInv.m[3][0] = -m.
m[1][0] * m.
m[2][1] * m.
m[3][2] + m.
m[1][0] * m.
m[2][2] * m.
m[3][1] + m.
m[2][0] * m.
m[1][1] * m.
m[3][2] - m.
m[2][0] * m.
m[1][2] * m.
m[3][1] - m.
m[3][0] * m.
m[1][1] * m.
m[2][2] + m.
m[3][0] * m.
m[1][2] * m.
m[2][1];
 
  431        matInv.m[0][1] = -m.
m[0][1] * m.
m[2][2] * m.
m[3][3] + m.
m[0][1] * m.
m[2][3] * m.
m[3][2] + m.
m[2][1] * m.
m[0][2] * m.
m[3][3] - m.
m[2][1] * m.
m[0][3] * m.
m[3][2] - m.
m[3][1] * m.
m[0][2] * m.
m[2][3] + m.
m[3][1] * m.
m[0][3] * m.
m[2][2];
 
  432        matInv.m[1][1] =  m.
m[0][0] * m.
m[2][2] * m.
m[3][3] - m.
m[0][0] * m.
m[2][3] * m.
m[3][2] - m.
m[2][0] * m.
m[0][2] * m.
m[3][3] + m.
m[2][0] * m.
m[0][3] * m.
m[3][2] + m.
m[3][0] * m.
m[0][2] * m.
m[2][3] - m.
m[3][0] * m.
m[0][3] * m.
m[2][2];
 
  433        matInv.m[2][1] = -m.
m[0][0] * m.
m[2][1] * m.
m[3][3] + m.
m[0][0] * m.
m[2][3] * m.
m[3][1] + m.
m[2][0] * m.
m[0][1] * m.
m[3][3] - m.
m[2][0] * m.
m[0][3] * m.
m[3][1] - m.
m[3][0] * m.
m[0][1] * m.
m[2][3] + m.
m[3][0] * m.
m[0][3] * m.
m[2][1];
 
  434        matInv.m[3][1] =  m.
m[0][0] * m.
m[2][1] * m.
m[3][2] - m.
m[0][0] * m.
m[2][2] * m.
m[3][1] - m.
m[2][0] * m.
m[0][1] * m.
m[3][2] + m.
m[2][0] * m.
m[0][2] * m.
m[3][1] + m.
m[3][0] * m.
m[0][1] * m.
m[2][2] - m.
m[3][0] * m.
m[0][2] * m.
m[2][1];
 
  435        matInv.m[0][2] =  m.
m[0][1] * m.
m[1][2] * m.
m[3][3] - m.
m[0][1] * m.
m[1][3] * m.
m[3][2] - m.
m[1][1] * m.
m[0][2] * m.
m[3][3] + m.
m[1][1] * m.
m[0][3] * m.
m[3][2] + m.
m[3][1] * m.
m[0][2] * m.
m[1][3] - m.
m[3][1] * m.
m[0][3] * m.
m[1][2];
 
  436        matInv.m[1][2] = -m.
m[0][0] * m.
m[1][2] * m.
m[3][3] + m.
m[0][0] * m.
m[1][3] * m.
m[3][2] + m.
m[1][0] * m.
m[0][2] * m.
m[3][3] - m.
m[1][0] * m.
m[0][3] * m.
m[3][2] - m.
m[3][0] * m.
m[0][2] * m.
m[1][3] + m.
m[3][0] * m.
m[0][3] * m.
m[1][2];
 
  437        matInv.m[2][2] =  m.
m[0][0] * m.
m[1][1] * m.
m[3][3] - m.
m[0][0] * m.
m[1][3] * m.
m[3][1] - m.
m[1][0] * m.
m[0][1] * m.
m[3][3] + m.
m[1][0] * m.
m[0][3] * m.
m[3][1] + m.
m[3][0] * m.
m[0][1] * m.
m[1][3] - m.
m[3][0] * m.
m[0][3] * m.
m[1][1];
 
  438        matInv.m[3][2] = -m.
m[0][0] * m.
m[1][1] * m.
m[3][2] + m.
m[0][0] * m.
m[1][2] * m.
m[3][1] + m.
m[1][0] * m.
m[0][1] * m.
m[3][2] - m.
m[1][0] * m.
m[0][2] * m.
m[3][1] - m.
m[3][0] * m.
m[0][1] * m.
m[1][2] + m.
m[3][0] * m.
m[0][2] * m.
m[1][1];
 
  439        matInv.m[0][3] = -m.
m[0][1] * m.
m[1][2] * m.
m[2][3] + m.
m[0][1] * m.
m[1][3] * m.
m[2][2] + m.
m[1][1] * m.
m[0][2] * m.
m[2][3] - m.
m[1][1] * m.
m[0][3] * m.
m[2][2] - m.
m[2][1] * m.
m[0][2] * m.
m[1][3] + m.
m[2][1] * m.
m[0][3] * m.
m[1][2];
 
  440        matInv.m[1][3] =  m.
m[0][0] * m.
m[1][2] * m.
m[2][3] - m.
m[0][0] * m.
m[1][3] * m.
m[2][2] - m.
m[1][0] * m.
m[0][2] * m.
m[2][3] + m.
m[1][0] * m.
m[0][3] * m.
m[2][2] + m.
m[2][0] * m.
m[0][2] * m.
m[1][3] - m.
m[2][0] * m.
m[0][3] * m.
m[1][2];
 
  441        matInv.m[2][3] = -m.
m[0][0] * m.
m[1][1] * m.
m[2][3] + m.
m[0][0] * m.
m[1][3] * m.
m[2][1] + m.
m[1][0] * m.
m[0][1] * m.
m[2][3] - m.
m[1][0] * m.
m[0][3] * m.
m[2][1] - m.
m[2][0] * m.
m[0][1] * m.
m[1][3] + m.
m[2][0] * m.
m[0][3] * m.
m[1][1];
 
  442        matInv.m[3][3] =  m.
m[0][0] * m.
m[1][1] * m.
m[2][2] - m.
m[0][0] * m.
m[1][2] * m.
m[2][1] - m.
m[1][0] * m.
m[0][1] * m.
m[2][2] + m.
m[1][0] * m.
m[0][2] * m.
m[2][1] + m.
m[2][0] * m.
m[0][1] * m.
m[1][2] - m.
m[2][0] * m.
m[0][2] * m.
m[1][1];
 
  444        det = m.
m[0][0] * matInv.m[0][0] + m.
m[0][1] * matInv.m[1][0] + m.
m[0][2] * matInv.m[2][0] + m.
m[0][3] * matInv.m[3][0];
 
  449        for (
int i = 0; i < 4; i++)
 
  450            for (
int j = 0; j < 4; j++)
 
  451                matInv.m[i][j] *= (
float)det;
 
  458        return { v1.
x + v2.
x, v1.
y + v2.
y, v1.
z + v2.
z };
 
  463        return { v1.
x - v2.
x, v1.
y - v2.
y, v1.
z - v2.
z };
 
  468        return { v1.
x * k, v1.
y * k, v1.
z * k };
 
  473        return { v1.
x / k, v1.
y / k, v1.
z / k };
 
  478        return v1.
x*v2.
x + v1.
y*v2.
y + v1.
z * v2.
z;
 
  483        return sqrtf(Vec_DotProduct(v, v));
 
  488        float l = Vec_Length(v);
 
  489        return { v.
x / l, v.
y / l, v.
z / l };
 
  495        v.
x = v1.
y * v2.
z - v1.
z * v2.
y;
 
  496        v.y = v1.
z * v2.
x - v1.
x * v2.
z;
 
  497        v.z = v1.
x * v2.
y - v1.
y * v2.
x;
 
  503        plane_n = Vec_Normalise(plane_n);
 
  504        float plane_d = -Vec_DotProduct(plane_n, plane_p);
 
  505        float ad = Vec_DotProduct(lineStart, plane_n);
 
  506        float bd = Vec_DotProduct(lineEnd, plane_n);
 
  507        t = (-plane_d - ad) / (bd - ad);
 
  510        return Vec_Add(lineStart, lineToIntersect);
 
  517        plane_n = Math::Vec_Normalise(plane_n);
 
  519        out_tri1.t[0] = in_tri.t[0];
 
  520        out_tri2.t[0] = in_tri.t[0];
 
  521        out_tri1.t[1] = in_tri.t[1];
 
  522        out_tri2.t[1] = in_tri.t[1];
 
  523        out_tri1.t[2] = in_tri.t[2];
 
  524        out_tri2.t[2] = in_tri.t[2];
 
  527        auto dist = [&](vec3d &p)
 
  529            vec3d n = Math::Vec_Normalise(p);
 
  530            return (plane_n.x * p.x + plane_n.y * p.y + plane_n.z * p.z - Math::Vec_DotProduct(plane_n, plane_p));
 
  535        vec3d* inside_points[3];  
int nInsidePointCount = 0;
 
  536        vec3d* outside_points[3]; 
int nOutsidePointCount = 0;
 
  537        vec2d* inside_tex[3]; 
int nInsideTexCount = 0;
 
  538        vec2d* outside_tex[3]; 
int nOutsideTexCount = 0;
 
  542        float d0 = dist(in_tri.p[0]);
 
  543        float d1 = dist(in_tri.p[1]);
 
  544        float d2 = dist(in_tri.p[2]);
 
  546        if (d0 >= 0) { inside_points[nInsidePointCount++] = &in_tri.p[0]; inside_tex[nInsideTexCount++] = &in_tri.t[0]; }
 
  548            outside_points[nOutsidePointCount++] = &in_tri.p[0]; outside_tex[nOutsideTexCount++] = &in_tri.t[0];
 
  551            inside_points[nInsidePointCount++] = &in_tri.p[1]; inside_tex[nInsideTexCount++] = &in_tri.t[1];
 
  554            outside_points[nOutsidePointCount++] = &in_tri.p[1];  outside_tex[nOutsideTexCount++] = &in_tri.t[1];
 
  557            inside_points[nInsidePointCount++] = &in_tri.p[2]; inside_tex[nInsideTexCount++] = &in_tri.t[2];
 
  560            outside_points[nOutsidePointCount++] = &in_tri.p[2];  outside_tex[nOutsideTexCount++] = &in_tri.t[2];
 
  567        if (nInsidePointCount == 0)
 
  575        if (nInsidePointCount == 3)
 
  584        if (nInsidePointCount == 1 && nOutsidePointCount == 2)
 
  590            out_tri1.col[0] = in_tri.col[0];
 
  591            out_tri1.col[1] = in_tri.col[1];
 
  592            out_tri1.col[2] = in_tri.col[2];
 
  595            out_tri1.p[0] = *inside_points[0];
 
  596            out_tri1.t[0] = *inside_tex[0];
 
  601            out_tri1.p[1] = Math::Vec_IntersectPlane(plane_p, plane_n, *inside_points[0], *outside_points[0], t);
 
  602            out_tri1.t[1].x = t * (outside_tex[0]->x - inside_tex[0]->x) + inside_tex[0]->x;
 
  603            out_tri1.t[1].y = t * (outside_tex[0]->y - inside_tex[0]->y) + inside_tex[0]->y;
 
  604            out_tri1.t[1].z = t * (outside_tex[0]->z - inside_tex[0]->z) + inside_tex[0]->z;
 
  606            out_tri1.p[2] = Math::Vec_IntersectPlane(plane_p, plane_n, *inside_points[0], *outside_points[1], t);
 
  607            out_tri1.t[2].x = t * (outside_tex[1]->x - inside_tex[0]->x) + inside_tex[0]->x;
 
  608            out_tri1.t[2].y = t * (outside_tex[1]->y - inside_tex[0]->y) + inside_tex[0]->y;
 
  609            out_tri1.t[2].z = t * (outside_tex[1]->z - inside_tex[0]->z) + inside_tex[0]->z;
 
  614        if (nInsidePointCount == 2 && nOutsidePointCount == 1)
 
  621            out_tri1.col[0] = in_tri.col[0];
 
  622            out_tri2.col[0] = in_tri.col[0];
 
  623            out_tri1.col[1] = in_tri.col[1];
 
  624            out_tri2.col[1] = in_tri.col[1];
 
  625            out_tri1.col[2] = in_tri.col[2];
 
  626            out_tri2.col[2] = in_tri.col[2];
 
  631            out_tri1.p[0] = *inside_points[0];          
 
  632            out_tri1.t[0] = *inside_tex[0];
 
  634            out_tri1.p[1] = *inside_points[1];
 
  635            out_tri1.t[1] = *inside_tex[1];
 
  638            out_tri1.p[2] = Math::Vec_IntersectPlane(plane_p, plane_n, *inside_points[0], *outside_points[0], t);
 
  639            out_tri1.t[2].x = t * (outside_tex[0]->x - inside_tex[0]->x) + inside_tex[0]->x;
 
  640            out_tri1.t[2].y = t * (outside_tex[0]->y - inside_tex[0]->y) + inside_tex[0]->y;
 
  641            out_tri1.t[2].z = t * (outside_tex[0]->z - inside_tex[0]->z) + inside_tex[0]->z;
 
  646            out_tri2.p[1] = *inside_points[1];
 
  647            out_tri2.t[1] = *inside_tex[1];
 
  648            out_tri2.p[0] = out_tri1.p[2];
 
  649            out_tri2.t[0] = out_tri1.t[2];
 
  650            out_tri2.p[2] = Math::Vec_IntersectPlane(plane_p, plane_n, *inside_points[1], *outside_points[0], t);
 
  651            out_tri2.t[2].x = t * (outside_tex[0]->x - inside_tex[1]->x) + inside_tex[1]->x;
 
  652            out_tri2.t[2].y = t * (outside_tex[0]->y - inside_tex[1]->y) + inside_tex[1]->y;
 
  653            out_tri2.t[2].z = t * (outside_tex[0]->z - inside_tex[1]->z) + inside_tex[1]->z;
 
  662        pge->
FillTriangle((int32_t)tri.
p[0].
x, (int32_t)tri.
p[0].
y, (int32_t)tri.
p[1].
x, (int32_t)tri.
p[1].
y, (int32_t)tri.
p[2].
x, (int32_t)tri.
p[2].
y, tri.
col[0]);
 
  667        pge->
DrawTriangle((int32_t)tri.
p[0].
x, (int32_t)tri.
p[0].
y, (int32_t)tri.
p[1].
x, (int32_t)tri.
p[1].
y, (int32_t)tri.
p[2].
x, (int32_t)tri.
p[2].
y, col);
 
  671        int x2, 
int y2, 
float u2, 
float v2, 
float w2,
 
  672        int x3, 
int y3, 
float u3, 
float v3, 
float w3, 
olc::Sprite* spr)
 
  714        float tex_u, tex_v, tex_w;
 
  716        float dax_step = 0, dbx_step = 0,
 
  717            du1_step = 0, dv1_step = 0,
 
  718            du2_step = 0, dv2_step = 0,
 
  719            dw1_step = 0, dw2_step = 0;
 
  721        if (dy1) dax_step = dx1 / (float)abs(dy1);
 
  722        if (dy2) dbx_step = dx2 / (float)abs(dy2);
 
  724        if (dy1) du1_step = du1 / (float)abs(dy1);
 
  725        if (dy1) dv1_step = dv1 / (float)abs(dy1);
 
  726        if (dy1) dw1_step = dw1 / (float)abs(dy1);
 
  728        if (dy2) du2_step = du2 / (float)abs(dy2);
 
  729        if (dy2) dv2_step = dv2 / (float)abs(dy2);
 
  730        if (dy2) dw2_step = dw2 / (float)abs(dy2);
 
  734            for (
int i = y1; i <= y2; i++)
 
  736                int ax = int(x1 + (
float)(i - y1) * dax_step);
 
  737                int bx = int(x1 + (
float)(i - y1) * dbx_step);
 
  739                float tex_su = u1 + (float)(i - y1) * du1_step;
 
  740                float tex_sv = v1 + (float)(i - y1) * dv1_step;
 
  741                float tex_sw = w1 + (float)(i - y1) * dw1_step;
 
  743                float tex_eu = u1 + (float)(i - y1) * du2_step;
 
  744                float tex_ev = v1 + (float)(i - y1) * dv2_step;
 
  745                float tex_ew = w1 + (float)(i - y1) * dw2_step;
 
  750                    std::swap(tex_su, tex_eu);
 
  751                    std::swap(tex_sv, tex_ev);
 
  752                    std::swap(tex_sw, tex_ew);
 
  759                float tstep = 1.0f / ((float)(bx - ax));
 
  762                for (
int j = ax; j < bx; j++)
 
  764                    tex_u = (1.0f - t) * tex_su + t * tex_eu;
 
  765                    tex_v = (1.0f - t) * tex_sv + t * tex_ev;
 
  766                    tex_w = (1.0f - t) * tex_sw + t * tex_ew;
 
  772                        if(
pge->
Draw(j, i, spr != 
nullptr ? spr->
Sample(tex_u / tex_w, tex_v / tex_w) : olc::GREY))
 
  787        if (dy1) dax_step = dx1 / (float)abs(dy1);
 
  788        if (dy2) dbx_step = dx2 / (float)abs(dy2);
 
  790        du1_step = 0, dv1_step = 0;
 
  791        if (dy1) du1_step = du1 / (float)abs(dy1);
 
  792        if (dy1) dv1_step = dv1 / (float)abs(dy1);
 
  793        if (dy1) dw1_step = dw1 / (float)abs(dy1);
 
  797            for (
int i = y2; i <= y3; i++)
 
  799                int ax = int(x2 + (
float)(i - y2) * dax_step);
 
  800                int bx = int(x1 + (
float)(i - y1) * dbx_step);
 
  802                float tex_su = u2 + (float)(i - y2) * du1_step;
 
  803                float tex_sv = v2 + (float)(i - y2) * dv1_step;
 
  804                float tex_sw = w2 + (float)(i - y2) * dw1_step;
 
  806                float tex_eu = u1 + (float)(i - y1) * du2_step;
 
  807                float tex_ev = v1 + (float)(i - y1) * dv2_step;
 
  808                float tex_ew = w1 + (float)(i - y1) * dw2_step;
 
  813                    std::swap(tex_su, tex_eu);
 
  814                    std::swap(tex_sv, tex_ev);
 
  815                    std::swap(tex_sw, tex_ew);
 
  822                float tstep = 1.0f / ((float)(bx - ax));
 
  825                for (
int j = ax; j < bx; j++)
 
  827                    tex_u = (1.0f - t) * tex_su + t * tex_eu;
 
  828                    tex_v = (1.0f - t) * tex_sv + t * tex_ev;
 
  829                    tex_w = (1.0f - t) * tex_sw + t * tex_ew;
 
  836                        if(
pge->
Draw(j, i, spr != 
nullptr ? spr->
Sample(tex_u / tex_w, tex_v / tex_w) : olc::GREY))
 
  851    float* GFX3D::m_DepthBuffer = 
nullptr;
 
  866        std::ifstream f(sFilename);
 
  867        if (!f.is_open()) 
return false;
 
  870        std::vector<vec3d> verts;
 
  871        std::vector<vec3d> norms;
 
  872        std::vector<vec2d> texs;
 
  877            f.getline(line, 128);
 
  889                    s >> junk >> junk >> v.x >> v.y;
 
  894                else if (line[1] == 
'n')
 
  897                    s >> junk >> junk >> v.x >> v.y >> v.z;                                     
 
  903                    s >> junk >> v.x >> v.y >> v.z;
 
  924                    std::string tokens[9];
 
  925                    int nTokenCount = -1;
 
  929                        if (c == 
' ' || c == 
'/')
 
  931                            if (tokens[nTokenCount].size() > 0)
 
  937                            tokens[nTokenCount].append(1, c);
 
  940                    tokens[nTokenCount].pop_back();
 
  943                    if (!texs.empty()) stride++;
 
  944                    if (!norms.empty()) stride++;
 
  949                            verts[stoi(tokens[0 * stride]) - 1], 
 
  950                            verts[stoi(tokens[1 * stride]) - 1], 
 
  951                            verts[stoi(tokens[2 * stride]) - 1],
 
  952                            texs[stoi(tokens[0 * stride + 1]) - 1], 
 
  953                            texs[stoi(tokens[1 * stride + 1]) - 1], 
 
  954                            texs[stoi(tokens[2 * stride + 1]) - 1], 
 
  960                            verts[stoi(tokens[0 * stride]) - 1], 
 
  961                            verts[stoi(tokens[1 * stride]) - 1], 
 
  962                            verts[stoi(tokens[2 * stride]) - 1], 
 
  981    void GFX3D::PipeLine::SetProjection(
float fFovDegrees, 
float fAspectRatio, 
float fNear, 
float fFar, 
float fLeft, 
float fTop, 
float fWidth, 
float fHeight)
 
  998        matWorld = transform;
 
 1003        sprTexture = texture;
 
 1017            lights[nSlot].type = nType;
 
 1018            lights[nSlot].pos = pos;
 
 1019            lights[nSlot].dir = dir;
 
 1020            lights[nSlot].col = col;
 
 1021            lights[nSlot].param = fParam;
 
 1027        return Render(triangles, flags, 0, triangles.size());
 
 1052        vec3d vOffsetView = { 1,1,0 };
 
 1056        t1.
x *= 0.5f * fViewW;
 
 1057        t1.
y *= 0.5f * fViewH;
 
 1058        t2.
x *= 0.5f * fViewW;
 
 1059        t2.
y *= 0.5f * fViewH;
 
 1061        vOffsetView = { fViewX,fViewY,0 };
 
 1065        pge->
DrawLine((int32_t)t1.
x, (int32_t)t1.
y, (int32_t)t2.
x, (int32_t)t2.
y, col);
 
 1093        vec3d vOffsetView = { 1,1,0 };
 
 1097        t1.
x *= 0.5f * fViewW;
 
 1098        t1.
y *= 0.5f * fViewH;
 
 1099        t2.
x *= 0.5f * fViewW;
 
 1100        t2.
y *= 0.5f * fViewH;
 
 1102        vOffsetView = { fViewX,fViewY,0 };
 
 1111    uint32_t 
GFX3D::PipeLine::Render(std::vector<olc::GFX3D::triangle> &triangles, uint32_t flags, 
int nOffset, 
int nCount)
 
 1118        std::vector<GFX3D::triangle> vecTrianglesToRaster;
 
 1120        int nTriangleDrawnCount = 0;
 
 1127        for(
int tx = nOffset; tx < nOffset+nCount; tx++)
 
 1129            GFX3D::triangle &tri = triangles[tx];
 
 1130            GFX3D::triangle triTransformed;
 
 1133            triTransformed.t[0] = { tri.t[0].x, tri.t[0].y, tri.t[0].z };
 
 1134            triTransformed.t[1] = { tri.t[1].x, tri.t[1].y, tri.t[1].z };
 
 1135            triTransformed.t[2] = { tri.t[2].x, tri.t[2].y, tri.t[2].z }; 
 
 1138            triTransformed.col[0] = tri.col[0];
 
 1139            triTransformed.col[1] = tri.col[1];
 
 1140            triTransformed.col[2] = tri.col[2];
 
 1148            GFX3D::vec3d normal, line1, line2;
 
 1163                uint32_t nLightSources = 0;
 
 1164                float nLightR = 0, nLightG = 0, nLightB = 0;
 
 1166                for (
int i = 0; i < 4; i++)
 
 1168                    switch (lights[i].type)
 
 1173                        ambient_clamp = lights[i].col;                      
 
 1185                            light = std::max(light, 0.0f);
 
 1186                            nLightR += light * (lights[i].col.r/255.0f);
 
 1187                            nLightG += light * (lights[i].col.g/255.0f);
 
 1188                            nLightB += light * (lights[i].col.b/255.0f);
 
 1200                nLightR = std::max(nLightR, ambient_clamp.
r / 255.0f);
 
 1201                nLightG = std::max(nLightG, ambient_clamp.
g / 255.0f);
 
 1202                nLightB = std::max(nLightB, ambient_clamp.
b / 255.0f);
 
 1204                triTransformed.col[0] = 
olc::Pixel(uint8_t(nLightR * triTransformed.col[0].r), uint8_t(nLightG * triTransformed.col[0].g), uint8_t(nLightB * triTransformed.col[0].b));
 
 1205                triTransformed.col[1] = 
olc::Pixel(uint8_t(nLightR * triTransformed.col[1].r), uint8_t(nLightG * triTransformed.col[1].g), uint8_t(nLightB * triTransformed.col[1].b));
 
 1206                triTransformed.col[2] = 
olc::Pixel(uint8_t(nLightR * triTransformed.col[2].r), uint8_t(nLightG * triTransformed.col[2].g), uint8_t(nLightB * triTransformed.col[2].b));
 
 1222            int nClippedTriangles = 0;
 
 1223            GFX3D::triangle clipped[2];
 
 1227            for (
int n = 0; n < nClippedTriangles; n++)
 
 1229                triangle triProjected = clipped[n];
 
 1237                triProjected.p[0].x = triProjected.p[0].x / triProjected.p[0].w;
 
 1238                triProjected.p[1].x = triProjected.p[1].x / triProjected.p[1].w;
 
 1239                triProjected.p[2].x = triProjected.p[2].x / triProjected.p[2].w;
 
 1241                triProjected.p[0].y = triProjected.p[0].y / triProjected.p[0].w;
 
 1242                triProjected.p[1].y = triProjected.p[1].y / triProjected.p[1].w;
 
 1243                triProjected.p[2].y = triProjected.p[2].y / triProjected.p[2].w;
 
 1245                triProjected.p[0].z = triProjected.p[0].z / triProjected.p[0].w;
 
 1246                triProjected.p[1].z = triProjected.p[1].z / triProjected.p[1].w;
 
 1247                triProjected.p[2].z = triProjected.p[2].z / triProjected.p[2].w;
 
 1250                triProjected.t[0].x = triProjected.t[0].x / triProjected.p[0].w;
 
 1251                triProjected.t[1].x = triProjected.t[1].x / triProjected.p[1].w;
 
 1252                triProjected.t[2].x = triProjected.t[2].x / triProjected.p[2].w;
 
 1254                triProjected.t[0].y = triProjected.t[0].y / triProjected.p[0].w;
 
 1255                triProjected.t[1].y = triProjected.t[1].y / triProjected.p[1].w;
 
 1256                triProjected.t[2].y = triProjected.t[2].y / triProjected.p[2].w;
 
 1258                triProjected.t[0].z = 1.0f / triProjected.p[0].w;
 
 1259                triProjected.t[1].z = 1.0f / triProjected.p[1].w;
 
 1260                triProjected.t[2].z = 1.0f / triProjected.p[2].w;
 
 1266                GFX3D::triangle sclipped[2];
 
 1267                std::list<GFX3D::triangle> listTriangles;
 
 1271                listTriangles.push_back(triProjected);
 
 1272                int nNewTriangles = 1;
 
 1274                for (
int p = 0; p < 4; p++)
 
 1277                    while (nNewTriangles > 0)
 
 1280                        triangle test = listTriangles.front();
 
 1281                        listTriangles.pop_front();
 
 1301                        for (
int w = 0; w < nTrisToAdd; w++)
 
 1302                            listTriangles.push_back(sclipped[w]);
 
 1304                    nNewTriangles = listTriangles.size();
 
 1307                for (
auto &triRaster : listTriangles)
 
 1316                    vec3d vOffsetView = { 1,1,0 };
 
 1317                    triRaster.p[0] = 
Math::Vec_Add(triRaster.p[0], vOffsetView);
 
 1318                    triRaster.p[1] = 
Math::Vec_Add(triRaster.p[1], vOffsetView);
 
 1319                    triRaster.p[2] = 
Math::Vec_Add(triRaster.p[2], vOffsetView);
 
 1320                    triRaster.p[0].x *= 0.5f * fViewW;
 
 1321                    triRaster.p[0].y *= 0.5f * fViewH;
 
 1322                    triRaster.p[1].x *= 0.5f * fViewW;
 
 1323                    triRaster.p[1].y *= 0.5f * fViewH;
 
 1324                    triRaster.p[2].x *= 0.5f * fViewW;
 
 1325                    triRaster.p[2].y *= 0.5f * fViewH;
 
 1326                    vOffsetView = { fViewX,fViewY,0 };
 
 1327                    triRaster.p[0] = 
Math::Vec_Add(triRaster.p[0], vOffsetView);
 
 1328                    triRaster.p[1] = 
Math::Vec_Add(triRaster.p[1], vOffsetView);
 
 1329                    triRaster.p[2] = 
Math::Vec_Add(triRaster.p[2], vOffsetView);
 
 1356                            (
int)triRaster.p[0].x,(
int)triRaster.p[0].y, triRaster.t[0].x, triRaster.t[0].y, triRaster.t[0].z, triRaster.col[0],
 
 1357                            (
int)triRaster.p[1].x,(
int)triRaster.p[1].y, triRaster.t[1].x, triRaster.t[1].y, triRaster.t[1].z, triRaster.col[1],
 
 1358                            (
int)triRaster.p[2].x,(
int)triRaster.p[2].y, triRaster.t[2].x, triRaster.t[2].y, triRaster.t[2].z, triRaster.col[2],
 
 1366                    nTriangleDrawnCount++;
 
 1371        return nTriangleDrawnCount;
 
 1375                               int x2, 
int y2, 
float u2, 
float v2, 
float w2, 
olc::Pixel c2,
 
 1376                               int x3, 
int y3, 
float u3, 
float v3, 
float w3, 
olc::Pixel c3,
 
 1383            std::swap(y1, y2); std::swap(x1, x2); std::swap(u1, u2); std::swap(v1, v2); std::swap(w1, w2); std::swap(c1, c2);
 
 1388            std::swap(y1, y3); std::swap(x1, x3); std::swap(u1, u3); std::swap(v1, v3); std::swap(w1, w3); std::swap(c1, c3);
 
 1393            std::swap(y2, y3); std::swap(x2, x3); std::swap(u2, u3); std::swap(v2, v3); std::swap(w2, w3); std::swap(c2, c3);
 
 1398        float dv1 = v2 - v1;
 
 1399        float du1 = u2 - u1;
 
 1400        float dw1 = w2 - w1;
 
 1401        int dcr1 = c2.
r - c1.
r;
 
 1402        int dcg1 = c2.
g - c1.
g;
 
 1403        int dcb1 = c2.
b - c1.
b;
 
 1404        int dca1 = c2.
a - c1.
a;
 
 1408        float dv2 = v3 - v1;
 
 1409        float du2 = u3 - u1;
 
 1410        float dw2 = w3 - w1;
 
 1411        int dcr2 = c3.
r - c1.
r;
 
 1412        int dcg2 = c3.
g - c1.
g;
 
 1413        int dcb2 = c3.
b - c1.
b;
 
 1414        int dca2 = c3.
a - c1.
a;
 
 1416        float tex_u, tex_v, tex_w;
 
 1417        float col_r, col_g, col_b, col_a;
 
 1419        float dax_step = 0, dbx_step = 0,
 
 1420            du1_step = 0, dv1_step = 0,
 
 1421            du2_step = 0, dv2_step = 0,
 
 1422            dw1_step = 0, dw2_step = 0,
 
 1423            dcr1_step = 0, dcr2_step = 0,
 
 1424            dcg1_step = 0, dcg2_step = 0,
 
 1425            dcb1_step = 0, dcb2_step = 0,
 
 1426            dca1_step = 0, dca2_step = 0;
 
 1428        if (dy1) dax_step = dx1 / (float)abs(dy1);
 
 1429        if (dy2) dbx_step = dx2 / (float)abs(dy2);
 
 1431        if (dy1) du1_step = du1 / (float)abs(dy1);
 
 1432        if (dy1) dv1_step = dv1 / (float)abs(dy1);
 
 1433        if (dy1) dw1_step = dw1 / (float)abs(dy1);
 
 1435        if (dy2) du2_step = du2 / (float)abs(dy2);
 
 1436        if (dy2) dv2_step = dv2 / (float)abs(dy2);
 
 1437        if (dy2) dw2_step = dw2 / (float)abs(dy2);
 
 1439        if (dy1) dcr1_step = dcr1 / (float)abs(dy1);
 
 1440        if (dy1) dcg1_step = dcg1 / (float)abs(dy1);
 
 1441        if (dy1) dcb1_step = dcb1 / (float)abs(dy1);
 
 1442        if (dy1) dca1_step = dca1 / (float)abs(dy1);
 
 1444        if (dy2) dcr2_step = dcr2 / (float)abs(dy2);
 
 1445        if (dy2) dcg2_step = dcg2 / (float)abs(dy2);
 
 1446        if (dy2) dcb2_step = dcb2 / (float)abs(dy2);
 
 1447        if (dy2) dca2_step = dca2 / (float)abs(dy2);
 
 1449        float pixel_r = 0.0f;
 
 1450        float pixel_g = 0.0f;
 
 1451        float pixel_b = 0.0f;
 
 1452        float pixel_a = 1.0f;
 
 1456            for (
int i = y1; i <= y2; i++)
 
 1458                int ax = int(x1 + (
float)(i - y1) * dax_step);
 
 1459                int bx = int(x1 + (
float)(i - y1) * dbx_step);
 
 1461                float tex_su = u1 + (float)(i - y1) * du1_step;
 
 1462                float tex_sv = v1 + (float)(i - y1) * dv1_step;
 
 1463                float tex_sw = w1 + (float)(i - y1) * dw1_step;
 
 1465                float tex_eu = u1 + (float)(i - y1) * du2_step;
 
 1466                float tex_ev = v1 + (float)(i - y1) * dv2_step;
 
 1467                float tex_ew = w1 + (float)(i - y1) * dw2_step;
 
 1469                float col_sr = c1.
r + (float)(i - y1) * dcr1_step;
 
 1470                float col_sg = c1.
g + (float)(i - y1) * dcg1_step;
 
 1471                float col_sb = c1.
b + (float)(i - y1) * dcb1_step;
 
 1472                float col_sa = c1.
a + (float)(i - y1) * dca1_step;
 
 1474                float col_er = c1.
r + (float)(i - y1) * dcr2_step;
 
 1475                float col_eg = c1.
g + (float)(i - y1) * dcg2_step;
 
 1476                float col_eb = c1.
b + (float)(i - y1) * dcb2_step;
 
 1477                float col_ea = c1.
a + (float)(i - y1) * dca2_step;
 
 1482                    std::swap(tex_su, tex_eu);
 
 1483                    std::swap(tex_sv, tex_ev);
 
 1484                    std::swap(tex_sw, tex_ew);
 
 1485                    std::swap(col_sr, col_er);
 
 1486                    std::swap(col_sg, col_eg);
 
 1487                    std::swap(col_sb, col_eb);
 
 1488                    std::swap(col_sa, col_ea);
 
 1499                float tstep = 1.0f / ((float)(bx - ax));
 
 1502                for (
int j = ax; j < bx; j++)
 
 1504                    tex_u = (1.0f - t) * tex_su + t * tex_eu;
 
 1505                    tex_v = (1.0f - t) * tex_sv + t * tex_ev;
 
 1506                    tex_w = (1.0f - t) * tex_sw + t * tex_ew;
 
 1507                    col_r = (1.0f - t) * col_sr + t * col_er;
 
 1508                    col_g = (1.0f - t) * col_sg + t * col_eg;
 
 1509                    col_b = (1.0f - t) * col_sb + t * col_eb;
 
 1510                    col_a = (1.0f - t) * col_sa + t * col_ea;
 
 1522                            pixel_r *= sample.
r / 255.0f;
 
 1523                            pixel_g *= sample.
g / 255.0f;
 
 1524                            pixel_b *= sample.
b / 255.0f;
 
 1525                            pixel_a *= sample.
a / 255.0f;
 
 1532                            if (
pge->
Draw(j, i, 
olc::Pixel(uint8_t(pixel_r * 1.0f), uint8_t(pixel_g * 1.0f), uint8_t(pixel_b * 1.0f), uint8_t(pixel_a * 1.0f))))
 
 1537                        pge->
Draw(j, i, 
olc::Pixel(uint8_t(pixel_r * 1.0f), uint8_t(pixel_g * 1.0f), uint8_t(pixel_b * 1.0f), uint8_t(pixel_a * 1.0f)));
 
 1555        if (dy1) dax_step = dx1 / (float)abs(dy1);
 
 1556        if (dy2) dbx_step = dx2 / (float)abs(dy2);
 
 1558        du1_step = 0; dv1_step = 0;
 
 1559        if (dy1) du1_step = du1 / (float)abs(dy1);
 
 1560        if (dy1) dv1_step = dv1 / (float)abs(dy1);
 
 1561        if (dy1) dw1_step = dw1 / (float)abs(dy1);
 
 1563        dcr1_step = 0; dcg1_step = 0; dcb1_step = 0; dca1_step = 0;
 
 1564        if (dy1) dcr1_step = dcr1 / (float)abs(dy1);
 
 1565        if (dy1) dcg1_step = dcg1 / (float)abs(dy1);
 
 1566        if (dy1) dcb1_step = dcb1 / (float)abs(dy1);
 
 1567        if (dy1) dca1_step = dca1 / (float)abs(dy1);
 
 1571            for (
int i = y2; i <= y3; i++)
 
 1573                int ax = int(x2 + (
float)(i - y2) * dax_step);
 
 1574                int bx = int(x1 + (
float)(i - y1) * dbx_step);
 
 1576                float tex_su = u2 + (float)(i - y2) * du1_step;
 
 1577                float tex_sv = v2 + (float)(i - y2) * dv1_step;
 
 1578                float tex_sw = w2 + (float)(i - y2) * dw1_step;
 
 1580                float tex_eu = u1 + (float)(i - y1) * du2_step;
 
 1581                float tex_ev = v1 + (float)(i - y1) * dv2_step;
 
 1582                float tex_ew = w1 + (float)(i - y1) * dw2_step;
 
 1584                float col_sr = c2.
r + (float)(i - y2) * dcr1_step;
 
 1585                float col_sg = c2.
g + (float)(i - y2) * dcg1_step;
 
 1586                float col_sb = c2.
b + (float)(i - y2) * dcb1_step;
 
 1587                float col_sa = c2.
a + (float)(i - y2) * dca1_step;
 
 1589                float col_er = c1.
r + (float)(i - y1) * dcr2_step;
 
 1590                float col_eg = c1.
g + (float)(i - y1) * dcg2_step;
 
 1591                float col_eb = c1.
b + (float)(i - y1) * dcb2_step;
 
 1592                float col_ea = c1.
a + (float)(i - y1) * dca2_step;
 
 1597                    std::swap(tex_su, tex_eu);
 
 1598                    std::swap(tex_sv, tex_ev);
 
 1599                    std::swap(tex_sw, tex_ew);
 
 1600                    std::swap(col_sr, col_er);
 
 1601                    std::swap(col_sg, col_eg);
 
 1602                    std::swap(col_sb, col_eb);
 
 1603                    std::swap(col_sa, col_ea);
 
 1614                float tstep = 1.0f / ((float)(bx - ax));
 
 1617                for (
int j = ax; j < bx; j++)
 
 1619                    tex_u = (1.0f - t) * tex_su + t * tex_eu;
 
 1620                    tex_v = (1.0f - t) * tex_sv + t * tex_ev;
 
 1621                    tex_w = (1.0f - t) * tex_sw + t * tex_ew;
 
 1622                    col_r = (1.0f - t) * col_sr + t * col_er;
 
 1623                    col_g = (1.0f - t) * col_sg + t * col_eg;
 
 1624                    col_b = (1.0f - t) * col_sb + t * col_eb;
 
 1625                    col_a = (1.0f - t) * col_sa + t * col_ea;
 
 1637                            pixel_r *= sample.
r / 255.0f;
 
 1638                            pixel_g *= sample.
g / 255.0f;
 
 1639                            pixel_b *= sample.
b / 255.0f;
 
 1640                            pixel_a *= sample.
a / 255.0f;
 
 1647                            if (
pge->
Draw(j, i, 
olc::Pixel(uint8_t(pixel_r * 1.0f), uint8_t(pixel_g * 1.0f), uint8_t(pixel_b * 1.0f), uint8_t(pixel_a * 1.0f))))
 
 1652                        pge->
Draw(j, i, 
olc::Pixel(uint8_t(pixel_r * 1.0f), uint8_t(pixel_g * 1.0f), uint8_t(pixel_b * 1.0f), uint8_t(pixel_a * 1.0f)));
 
Definition olcPGEX_Graphics3D.h:148
static mat4x4 Mat_MultiplyMatrix(mat4x4 &m1, mat4x4 &m2)
static float Vec_Length(vec3d &v)
static float Vec_DotProduct(vec3d &v1, vec3d &v2)
static mat4x4 Mat_PointAt(vec3d &pos, vec3d &target, vec3d &up)
static mat4x4 Mat_MakeRotationY(float fAngleRad)
static vec3d Vec_Mul(vec3d &v1, float k)
static mat4x4 Mat_QuickInverse(mat4x4 &m)
static vec3d Vec_CrossProduct(vec3d &v1, vec3d &v2)
static mat4x4 Mat_Inverse(olc::GFX3D::mat4x4 &m)
static vec3d Vec_Normalise(vec3d &v)
static mat4x4 Mat_MakeRotationZ(float fAngleRad)
static mat4x4 Mat_MakeProjection(float fFovDegrees, float fAspectRatio, float fNear, float fFar)
static mat4x4 Mat_MakeTranslation(float x, float y, float z)
static vec3d Vec_Add(vec3d &v1, vec3d &v2)
static mat4x4 Mat_MakeRotationX(float fAngleRad)
static int Triangle_ClipAgainstPlane(vec3d plane_p, vec3d plane_n, triangle &in_tri, triangle &out_tri1, triangle &out_tri2)
static vec3d Vec_Div(vec3d &v1, float k)
static vec3d Vec_IntersectPlane(vec3d &plane_p, vec3d &plane_n, vec3d &lineStart, vec3d &lineEnd, float &t)
static mat4x4 Mat_MakeIdentity()
static mat4x4 Mat_MakeScale(float x, float y, float z)
static vec3d Vec_Sub(vec3d &v1, vec3d &v2)
static vec3d Mat_MultiplyVector(mat4x4 &m, vec3d &i)
Definition olcPGEX_Graphics3D.h:199
uint32_t Render(std::vector< olc::GFX3D::triangle > &triangles, uint32_t flags=RENDER_CULL_CW|RENDER_TEXTURED|RENDER_DEPTH)
void SetLightSource(uint32_t nSlot, uint32_t nType, olc::Pixel col, olc::GFX3D::vec3d pos, olc::GFX3D::vec3d dir={ 0.0f, 0.0f, 1.0f, 1.0f }, float fParam=0.0f)
uint32_t RenderLine(olc::GFX3D::vec3d &p1, olc::GFX3D::vec3d &p2, olc::Pixel col=olc::WHITE)
void SetTexture(olc::Sprite *texture)
void SetCamera(olc::GFX3D::vec3d &pos, olc::GFX3D::vec3d &lookat, olc::GFX3D::vec3d &up)
void SetTransform(olc::GFX3D::mat4x4 &transform)
void SetProjection(float fFovDegrees, float fAspectRatio, float fNear, float fFar, float fLeft, float fTop, float fWidth, float fHeight)
uint32_t Render(std::vector< olc::GFX3D::triangle > &triangles, uint32_t flags, int nOffset, int nCount)
uint32_t RenderCircleXZ(olc::GFX3D::vec3d &p1, float r, olc::Pixel col=olc::WHITE)
Definition olcPGEX_Graphics3D.h:89
LIGHTS
Definition olcPGEX_Graphics3D.h:190
@ LIGHT_POINT
Definition olcPGEX_Graphics3D.h:194
@ LIGHT_AMBIENT
Definition olcPGEX_Graphics3D.h:192
@ LIGHT_DISABLED
Definition olcPGEX_Graphics3D.h:191
@ LIGHT_DIRECTIONAL
Definition olcPGEX_Graphics3D.h:193
static void RasterTriangle(int x1, int y1, float u1, float v1, float w1, olc::Pixel c1, int x2, int y2, float u2, float v2, float w2, olc::Pixel c2, int x3, int y3, float u3, float v3, float w3, olc::Pixel c3, olc::Sprite *spr, uint32_t nFlags)
static void RenderScene()
RENDERFLAGS
Definition olcPGEX_Graphics3D.h:179
@ RENDER_CULL_CCW
Definition olcPGEX_Graphics3D.h:184
@ RENDER_WIRE
Definition olcPGEX_Graphics3D.h:180
@ RENDER_TEXTURED
Definition olcPGEX_Graphics3D.h:182
@ RENDER_FLAT
Definition olcPGEX_Graphics3D.h:181
@ RENDER_DEPTH
Definition olcPGEX_Graphics3D.h:185
@ RENDER_CULL_CW
Definition olcPGEX_Graphics3D.h:183
@ RENDER_LIGHTS
Definition olcPGEX_Graphics3D.h:186
static void ConfigureDisplay()
static void DrawTriangleFlat(olc::GFX3D::triangle &tri)
static void DrawTriangleWire(olc::GFX3D::triangle &tri, olc::Pixel col=olc::WHITE)
static void AddTriangleToScene(olc::GFX3D::triangle &tri)
static void TexturedTriangle(int x1, int y1, float u1, float v1, float w1, int x2, int y2, float u2, float v2, float w2, int x3, int y3, float u3, float v3, float w3, olc::Sprite *spr)
static void DrawTriangleTex(olc::GFX3D::triangle &tri, olc::Sprite *spr)
Definition olcPixelGameEngine.h:1685
static PixelGameEngine * pge
Definition olcPixelGameEngine.h:1697
void DrawLine(int32_t x1, int32_t y1, int32_t x2, int32_t y2, Pixel p=olc::WHITE, uint32_t pattern=0xFFFFFFFF)
void DrawTriangle(int32_t x1, int32_t y1, int32_t x2, int32_t y2, int32_t x3, int32_t y3, Pixel p=olc::WHITE)
void FillCircle(int32_t x, int32_t y, int32_t radius, Pixel p=olc::WHITE)
virtual bool Draw(int32_t x, int32_t y, Pixel p=olc::WHITE)
int32_t ScreenWidth() const
int32_t ScreenHeight() const
void FillTriangle(int32_t x1, int32_t y1, int32_t x2, int32_t y2, int32_t x3, int32_t y3, Pixel p=olc::WHITE)
Definition olcPixelGameEngine.h:1071
Pixel Sample(float x, float y) const
Definition olcPixelGameEngine.h:612
static const Pixel RED(255, 0, 0)
static const Pixel WHITE(255, 255, 255)
Definition olcPGEX_Graphics3D.h:116
float m[4][4]
Definition olcPGEX_Graphics3D.h:117
Definition olcPGEX_Graphics3D.h:121
std::vector< triangle > tris
Definition olcPGEX_Graphics3D.h:122
bool LoadOBJFile(std::string sFilename, bool bHasTexture=false)
Definition olcPGEX_Graphics3D.h:109
olc::Pixel col[3]
Definition olcPGEX_Graphics3D.h:112
vec2d t[3]
Definition olcPGEX_Graphics3D.h:111
vec3d p[3]
Definition olcPGEX_Graphics3D.h:110
Definition olcPGEX_Graphics3D.h:94
float z
Definition olcPGEX_Graphics3D.h:97
float x
Definition olcPGEX_Graphics3D.h:95
float y
Definition olcPGEX_Graphics3D.h:96
Definition olcPGEX_Graphics3D.h:101
float w
Definition olcPGEX_Graphics3D.h:105
float z
Definition olcPGEX_Graphics3D.h:104
float x
Definition olcPGEX_Graphics3D.h:102
float y
Definition olcPGEX_Graphics3D.h:103
Definition olcPixelGameEngine.h:948
uint8_t g
Definition olcPixelGameEngine.h:952
uint8_t a
Definition olcPixelGameEngine.h:952
uint8_t b
Definition olcPixelGameEngine.h:952
uint8_t r
Definition olcPixelGameEngine.h:952