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:1615
static PixelGameEngine * pge
Definition olcPixelGameEngine.h:1627
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:1047
Pixel Sample(float x, float y) const
Definition olcPixelGameEngine.h:593
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:924
uint8_t g
Definition olcPixelGameEngine.h:928
uint8_t a
Definition olcPixelGameEngine.h:928
uint8_t b
Definition olcPixelGameEngine.h:928
uint8_t r
Definition olcPixelGameEngine.h:928