21#ifndef _TGX_RENDERER3D_H_
22#define _TGX_RENDERER3D_H_
52 extern const uint16_t UNIT_CUBE_FACES[6*4];
53 extern const uint16_t UNIT_CUBE_FACES_NORMALS[6 * 4];
118 template<
typename color_t, Shader LOADED_SHADERS,
typename ZBUFFER_t = u
int16_t,
int MAX_DIRECTIONAL_LIGHTS = 1,
int MAX_SPOT_LIGHTS = 0>
125 static_assert(is_color<color_t>::value,
"color_t must be one of the color types defined in color.h");
126 static_assert((std::is_same<ZBUFFER_t, float>::value) || (std::is_same<ZBUFFER_t, uint16_t>::value),
"The Z-buffer type must be either float or uint16_t");
127 static_assert(MAX_DIRECTIONAL_LIGHTS >= 1,
"MAX_DIRECTIONAL_LIGHTS must be at least 1");
128 static_assert(MAX_SPOT_LIGHTS >= 0,
"MAX_SPOT_LIGHTS must be non-negative");
131 static constexpr int ENABLE_TEXTURING = (TGX_SHADER_HAS_ONE_FLAG(LOADED_SHADERS , (
SHADER_TEXTURE |
SHADER_TEXTURE_AFFINE | TGX_SHADER_MASK_TEXTURE_MODE | TGX_SHADER_MASK_TEXTURE_QUALITY)));
132 static constexpr int EXPLICIT_TEXTURE_MODE = (TGX_SHADER_HAS_TEXTURING_ENABLED(LOADED_SHADERS));
135 static constexpr Shader ENABLED_SHADERS = LOADED_SHADERS | (ENABLE_TEXTURING ? DEFAULT_TEXTURE_MODE :
SHADER_NOTEXTURE);
137 static_assert(TGX_SHADER_HAS_ONE_FLAG(ENABLED_SHADERS,TGX_SHADER_MASK_PROJECTION),
"At least one of the two shaders SHADER_PERSPECTIVE or SHADER_ORTHO must be enabled");
138 static_assert(TGX_SHADER_HAS_ONE_FLAG(ENABLED_SHADERS,TGX_SHADER_MASK_ZBUFFER),
"At least one of the two shaders SHADER_NOZBUFFER or SHADER_ZBUFFER must be enabled");
139 static_assert(TGX_SHADER_HAS_ONE_FLAG(ENABLED_SHADERS,TGX_SHADER_MASK_SHADING),
"At least one of the shaders SHADER_UNLIT, SHADER_FLAT or SHADER_GOURAUD must be enabled");
140 static_assert(TGX_SHADER_HAS_ONE_FLAG(ENABLED_SHADERS,TGX_SHADER_MASK_TEXTURE),
"At least one of the shaders SHADER_NOTEXTURE, SHADER_TEXTURE or SHADER_TEXTURE_AFFINE must be enabled");
141 static_assert((!TGX_SHADER_HAS_TEXTURING_ENABLED(ENABLED_SHADERS)) || (TGX_SHADER_HAS_ONE_FLAG(ENABLED_SHADERS,TGX_SHADER_MASK_TEXTURE_QUALITY)),
"When using texturing, at least one of the two shaders SHADER_TEXTURE_BILINEAR or SHADER_TEXTURE_NEAREST must be enabled");
142 static_assert((!TGX_SHADER_HAS_TEXTURING_ENABLED(ENABLED_SHADERS)) || (TGX_SHADER_HAS_ONE_FLAG(ENABLED_SHADERS, TGX_SHADER_MASK_TEXTURE_MODE)),
"When using texturing, at least one of the two shaders SHADER_TEXTURE_WRAP_POW2 or SHADER_TEXTURE_CLAMP must be enabled");
144 template<Shader SHADERS>
static constexpr Shader _validatedDrawCallShaders();
315 void setOrtho(
float left,
float right,
float bottom,
float top,
float zNear,
float zFar);
334 void setFrustum(
float left,
float right,
float bottom,
float top,
float zNear,
float zFar);
528 void setLookAt(
float eyeX,
float eyeY,
float eyeZ,
float centerX,
float centerY,
float centerZ,
float upX,
float upY,
float upZ);
816 const RGBf& diffuseColor,
817 const RGBf& specularColor =
RGBf(0.0f, 0.0f, 0.0f));
848 float range,
float outerAngleDeg,
849 const RGBf& diffuseColor,
850 const RGBf& specularColor =
RGBf(0.0f, 0.0f, 0.0f));
884 float range,
float outerAngleDeg,
float innerAngleDeg,
885 const RGBf& diffuseColor,
886 const RGBf& specularColor =
RGBf(0.0f, 0.0f, 0.0f));
1124 void setMaterial(
RGBf color,
float ambiantStrength,
float diffuseStrength,
float specularStrength,
int specularExponent);
1182 template<Shader SHADERS>
1210 template<Shader SHADERS>
1228 const fVec3 * N1 =
nullptr,
const fVec3 * N2 =
nullptr,
const fVec3 * N3 =
nullptr,
1229 const fVec2 * T1 =
nullptr,
const fVec2 * T2 =
nullptr,
const fVec2 * T3 =
nullptr,
1246 const RGBf & col1,
const RGBf & col2,
const RGBf & col3,
1247 const fVec3 * N1 =
nullptr,
const fVec3 * N2 =
nullptr,
const fVec3 * N3 =
nullptr);
1269 const uint16_t * ind_vertices,
const fVec3 * vertices,
1270 const uint16_t * ind_normals =
nullptr,
const fVec3* normals =
nullptr,
1271 const uint16_t * ind_texture =
nullptr,
const fVec2* textures =
nullptr,
1298 const uint16_t* ind_vertices,
const fVec3* vertices,
1299 const uint16_t* ind_normals =
nullptr,
const fVec3* normals =
nullptr,
1300 const uint16_t* ind_texture =
nullptr,
const fVec2* textures =
nullptr,
1321 const fVec3 * N1 =
nullptr,
const fVec3 * N2 =
nullptr,
const fVec3 * N3 =
nullptr,
const fVec3 * N4 =
nullptr,
1322 const fVec2 * T1 =
nullptr,
const fVec2 * T2 =
nullptr,
const fVec2 * T3 =
nullptr,
const fVec2 * T4 =
nullptr,
1343 const RGBf & col1,
const RGBf & col2,
const RGBf & col3,
const RGBf & col4,
1344 const fVec3 * N1 =
nullptr,
const fVec3 * N2 =
nullptr,
const fVec3 * N3 =
nullptr,
const fVec3 * N4 =
nullptr);
1370 const uint16_t * ind_vertices,
const fVec3 * vertices,
1371 const uint16_t * ind_normals =
nullptr,
const fVec3* normals =
nullptr,
1372 const uint16_t * ind_texture =
nullptr,
const fVec2* textures =
nullptr,
1560 float rot_angle_y = 0.0f,
1561 float reference_height = 0.0f,
1562 float skybox_radius = 32768.0f,
1563 Shader texture_quality = SHADER_TEXTURE_NEAREST,
1564 Shader texture_mode = SHADER_TEXTURE_CLAMP
1580 float rot_angle_y = 0.0f,
1581 float reference_height = 0.0f,
1582 float skybox_radius = 32768.0f,
1583 Shader texture_quality = SHADER_TEXTURE_NEAREST,
1584 Shader texture_mode = SHADER_TEXTURE_CLAMP
1673 void drawCylinder(
int nb_sectors,
bool bottom_cap =
true,
bool top_cap =
true);
1732 void drawTruncatedCone(
int nb_sectors,
float bottom_radius,
float top_radius,
bool bottom_cap =
true,
bool top_cap =
true);
1950 void drawWireFrameLines(
int nb_lines,
const uint16_t* ind_vertices,
const fVec3* vertices,
float thickness, color_t color,
float opacity);
2188 void drawWireFrameQuads(
int nb_quads,
const uint16_t* ind_vertices,
const fVec3* vertices,
float thickness, color_t color,
float opacity);
2379 void drawWireFrameCylinder(
int nb_sectors,
bool bottom_cap,
bool top_cap,
float thickness, color_t color,
float opacity);
2413 void drawWireFrameCone(
int nb_sectors,
bool bottom_cap,
float thickness, color_t color,
float opacity);
2454 void drawWireFrameTruncatedCone(
int nb_sectors,
float bottom_radius,
float top_radius,
bool bottom_cap,
bool top_cap,
float thickness, color_t color,
float opacity);
2527 void drawPixels(
int nb_pixels,
const fVec3* pos_list,
const int* colors_ind,
const color_t* colors,
const int* opacities_ind,
const float* opacities);
2590 void drawDots(
int nb_dots,
const fVec3* pos_list,
const int* radius_ind,
const int* radius,
const int* colors_ind,
const color_t* colors,
const int* opacities_ind,
const float* opacities);
2616 TGX_INLINE
float _clipbound_xy()
const
2618 return (256 + 3*((MAXVIEWPORTDIMENSION * 256) / ((_lx > _ly) ? _lx : _ly))) / 1024.0f;
2624 TGX_INLINE
bool _validDraw()
const
2626 return ((_lx > 0) && (_ly > 0) && (_uni.im !=
nullptr) && (_uni.im->isValid()));
2631 TGX_NOINLINE
void _recompute_wa_wb();
2638 TGX_NOINLINE
void _rectifyShaderOrtho();
2641 TGX_NOINLINE
void _rectifyShaderZbuffer();
2644 TGX_NOINLINE
void _rectifyShaderShading(Shader new_shaders);
2647 TGX_NOINLINE
void _rectifyShaderTextureMode();
2650 TGX_NOINLINE
void _rectifyShaderTextureWrapping();
2653 TGX_NOINLINE
void _rectifyShaderTextureQuality();
2662 template<Shader RASTERIZER_SHADERS = ENABLED_SHADERS>
2663 void _drawTriangleClipped(
const int RASTER_TYPE,
2664 const fVec4* Q0,
const fVec4* Q1,
const fVec4* Q2,
2665 const fVec3* N0,
const fVec3* N1,
const fVec3* N2,
2666 const fVec2* T0,
const fVec2* T1,
const fVec2* T2,
2667 const RGBf& Vcol0,
const RGBf& Vcol1,
const RGBf& Vcol2);
2671 template<Shader RASTERIZER_SHADERS = ENABLED_SHADERS>
2672 void _drawTriangleClippedSub(
const int RASTER_TYPE,
const int plane,
2673 const RasterizerVec4& P1,
const RasterizerVec4& P2,
const RasterizerVec4& P3);
2677 void _drawTriangle(
const int RASTER_TYPE,
2678 const fVec3* P0,
const fVec3* P1,
const fVec3* P2,
2679 const fVec3* N0,
const fVec3* N1,
const fVec3* N2,
2680 const fVec2* T0,
const fVec2* T1,
const fVec2* T2,
2681 const RGBf& Vcol0,
const RGBf& Vcol1,
const RGBf& Vcol2);
2685 void _drawTriangleStrip(
const int RASTER_TYPE,
int nb_indices,
2686 const uint16_t* ind_vertices,
const fVec3* vertices,
2687 const uint16_t* ind_normals,
const fVec3* normals,
2688 const uint16_t* ind_texture,
const fVec2* textures);
2692 void _drawQuad(
const int RASTER_TYPE,
2693 const fVec3* P0,
const fVec3* P1,
const fVec3* P2,
const fVec3* P3,
2694 const fVec3* N0,
const fVec3* N1,
const fVec3* N2,
const fVec3* N3,
2695 const fVec2* T0,
const fVec2* T1,
const fVec2* T2,
const fVec2* T3,
2696 const RGBf& Vcol0,
const RGBf& Vcol1,
const RGBf& Vcol2,
const RGBf& Vcol3);
2699 template<
bool TEXTURE_BILINEAR,
bool TEXTURE_WRAP>
2700 void _rasterizeSkyBoxTriangle(
const RasterizerVec4& V0,
const RasterizerVec4& V1,
const RasterizerVec4& V2);
2703 void _rasterizeSkyBoxTriangle(
const RasterizerVec4& V0,
const RasterizerVec4& V1,
const RasterizerVec4& V2,
2704 Shader texture_quality, Shader texture_mode);
2707 void _drawSkyBoxTriangleClippedSub(
const int plane,
2708 const RasterizerVec4& P1,
const RasterizerVec4& P2,
const RasterizerVec4& P3,
2709 Shader texture_quality, Shader texture_mode);
2712 void _drawSkyBoxTriangleClipped(
2713 const fVec4* Q0,
const fVec4* Q1,
const fVec4* Q2,
2714 const fVec2* T0,
const fVec2* T1,
const fVec2* T2,
2715 Shader texture_quality, Shader texture_mode);
2718 void _drawSkyBoxQuad(
2719 const fVec4* P0,
const fVec4* P1,
const fVec4* P2,
const fVec4* P3,
2720 const fVec2* T0,
const fVec2* T1,
const fVec2* T2,
const fVec2* T3,
2721 Shader texture_quality, Shader texture_mode);
2724 void _drawSkyBoxFace(
const fVec4 skybox_vertices[8],
const uint16_t* face,
const fVec2 texture_coords[4],
const Image<color_t>* texture,
2725 Shader texture_quality, Shader texture_mode);
2729 template<Shader RASTERIZER_SHADERS = ENABLED_SHADERS>
2730 void _drawMesh(
const int RASTER_TYPE,
const Mesh3D<color_t>* mesh);
2733 template<Shader RASTERIZER_SHADERS = ENABLED_SHADERS>
2734 void _drawMesh(
const int RASTER_TYPE,
const Mesh3Dv2<color_t>* mesh,
bool use_mesh_material);
2737 inline bool _discardMeshlet16b(
const fVec3& sphere_center,
float sphere_radius,
const fVec3& cone_dir,
float cone_cos)
const
2739 if (cone_cos <= -1.0f)
return false;
2741 const fVec4 D = _r_modelViewM.
mult0(cone_dir);
2742 const float dd = D.
x * D.x + D.y * D.y + D.z * D.z;
2743 if (dd <= 1.0e-20f)
return false;
2754 const fVec3 anchor = sphere_center - (cone_dir * sphere_radius);
2756 dot = -(D.x * A.x + D.y * A.y + D.z * A.z);
2757 const float aa = A.
x * A.x + A.y * A.y + A.z * A.z;
2758 if (aa <= 1.0e-20f)
return false;
2762 const float c2len2 = cone_cos * cone_cos * len2;
2763 const float dot2 = dot * dot;
2764 return (cone_cos >= 0.0f) ? ((dot < 0.0f) || (dot2 < c2len2))
2765 : ((dot < 0.0f) && (dot2 > c2len2));
2774 inline void _drawWireFrameLineFast(iVec2 P0, iVec2 P1, color_t color);
2776 template<
bool CHECK_NEIGHBOR>
inline void _drawWireFrameLineAAFast(
const fVec2& P0,
const fVec2& P1, color_t color, int32_t op);
2778 template<
int MODE>
void _drawWireFrameMesh(
const Mesh3D<color_t>* mesh,
bool draw_chained_meshes, color_t color,
float opacity,
float thickness);
2780 template<
int MODE>
void _drawWireFrameMesh(
const Mesh3Dv2<color_t>* mesh, color_t color,
float opacity,
float thickness);
2782 template<
int MODE>
void _drawWireFrameLine(
const fVec3& P1,
const fVec3& P2, color_t color,
float opacity,
float thickness);
2784 template<
int MODE>
void _drawWireFrameLines(
int nb_lines,
const uint16_t* ind_vertices,
const fVec3* vertices, color_t color,
float opacity,
float thickness);
2786 template<
int MODE>
void _drawWireFrameTriangle(
const fVec3& P1,
const fVec3& P2,
const fVec3& P3, color_t color,
float opacity,
float thickness);
2788 template<
int MODE>
void _drawWireFrameTriangles(
int nb_triangles,
const uint16_t* ind_vertices,
const fVec3* vertices, color_t color,
float opacity,
float thickness);
2790 template<
int MODE>
void _drawWireFrameTriangleStrip(
int nb_indices,
const uint16_t* ind_vertices,
const fVec3* vertices, color_t color,
float opacity,
float thickness);
2792 template<
int MODE>
void _drawWireFrameQuad(
const fVec3& P1,
const fVec3& P2,
const fVec3& P3,
const fVec3& P4, color_t color,
float opacity,
float thickness);
2794 template<
int MODE>
void _drawWireFrameQuads(
int nb_quads,
const uint16_t* ind_vertices,
const fVec3* vertices, color_t color,
float opacity,
float thickness);
2804 template<
bool USE_BLENDING>
void _drawPixel(
const fVec3& pos, color_t color,
float opacity);
2807 template<
bool USE_COLORS,
bool USE_BLENDING>
void _drawPixels(
int nb_pixels,
const fVec3* pos_list,
const int* colors_ind,
const color_t* colors,
const int* opacities_ind,
const float* opacities);
2810 template<
bool USE_BLENDING>
void _drawDot(
const fVec3& pos,
int r, color_t color,
float opacity);
2813 template<
bool USE_RADIUS,
bool USE_COLORS,
bool USE_BLENDING>
void _drawDots(
int nb_dots,
const fVec3* pos_list,
const int* radius_ind,
const int* radius,
const int* colors_ind,
const color_t* colors,
const int* opacities_ind,
const float* opacities);
2817 template<
bool CHECKRANGE,
bool USE_BLENDING> TGX_INLINE
inline void drawPixelZbuf(
int x,
int y, color_t color,
float opacity,
float z)
2819 if (CHECKRANGE && ((x < 0) || (x >= _uni.im->lx()) || (y < 0) || (y >= _uni.im->ly())))
return;
2820 ZBUFFER_t& W = _uni.zbuf[x + _uni.im->lx() * y];
2821 const ZBUFFER_t aa = (std::is_same<ZBUFFER_t, uint16_t>::value) ? ((ZBUFFER_t)(z * _uni.wa + _uni.wb)) : ((ZBUFFER_t)z);
2825 if (USE_BLENDING) _uni.im->template drawPixel<false>({ x, y }, color, opacity);
else _uni.im->template drawPixel<false>({ x, y }, color);
2830 template<
bool CHECKRANGE,
bool USE_BLENDING>
inline void drawHLineZbuf(
int x,
int y,
int w, color_t color,
float opacity,
float z)
2834 const int lx = _uni.im->lx();
2835 const int ly = _uni.im->ly();
2836 if ((y < 0) || (y >= ly) || (x >= lx))
return;
2837 if (x < 0) { w += x; x = 0; }
2838 if (x + w > lx) { w = lx - x; }
2841 while(w--) drawPixelZbuf<CHECKRANGE, USE_BLENDING>(x++, y, color, opacity, z);
2845 template<
bool CHECKRANGE,
bool USE_BLENDING>
void _drawCircleZbuf(
int xm,
int ym,
int r, color_t color,
float opacity,
float z);
2851 float _unitSphereScreenDiameter();
2854 template<
bool WIREFRAME,
int MODE>
void _drawSphere(
int nb_sectors,
int nb_stacks,
const Image<color_t>* texture,
float thickness, color_t color,
float opacity);
2856 void _drawTruncatedCone(
int nb_sectors,
float bottom_radius,
float top_radius,
const Image<color_t>* texture_side,
const Image<color_t>* texture_bottom,
const Image<color_t>* texture_top,
bool bottom_cap,
bool top_cap);
2858 template<
int MODE>
void _drawWireFrameTruncatedCone(
int nb_sectors,
float bottom_radius,
float top_radius,
bool bottom_cap,
bool top_cap,
float thickness, color_t color,
float opacity);
2862 void _drawTruncatedConeGouraudCachedTriangle(
const int cone_shader, ExtVec4& E0, fVec3& N0, ExtVec4& E1, fVec3& N1, ExtVec4& E2, fVec3& N2,
bool textured,
bool ortho,
float CLIPBOUND_XY,
bool cliptestneeded);
2864 void _drawTruncatedConeGouraudSideStrip(
const int cone_shader,
int nb_sectors,
float bottom_radius,
float top_radius,
const float* cosTheta,
const float* sinTheta,
float inv_side_normal,
float side_normal_y,
float dtx,
float CLIPBOUND_XY,
bool cliptestneeded);
2866 void _drawTruncatedConeGouraudConeFan(
const int cone_shader,
int nb_sectors,
bool top_apex,
float ring_radius,
const float* cosTheta,
const float* sinTheta,
float inv_side_normal,
float side_normal_y,
float dtx,
float CLIPBOUND_XY,
bool cliptestneeded);
2868 void _drawTruncatedConeGouraudCapFan(
const int cap_shader,
int nb_sectors,
bool top_cap,
float radius,
const float* cosTheta,
const float* sinTheta,
float CLIPBOUND_XY,
bool cliptestneeded);
2870#if TGX_DRAWSPHERE_USE_STRIP_BANDS
2871 void _drawSphereGouraudStripBand(
const int sphere_shader,
int nb_sectors,
const float* cosTheta,
const float* sinTheta,
float cosPhi,
float sinPhi,
float new_cosPhi,
float new_sinPhi,
float v,
float vv,
float dtx,
float CLIPBOUND_XY,
bool sphere_cliptestneeded);
2873 void _drawSphereGouraudCap(
const int sphere_shader,
int nb_sectors,
bool top_cap,
const float* cosTheta,
const float* sinTheta,
float ring_y,
float ring_radius,
float ring_v,
float dtx,
float CLIPBOUND_XY,
bool sphere_cliptestneeded);
2884 TGX_INLINE
inline void _clip(
int & fl,
const fVec4 & P,
float bx,
float Bx,
float by,
float By)
2886 if (P.x >= bx) { fl &= (~(1)); }
2887 if (P.x <= Bx) { fl &= (~(2)); }
2888 if (P.y >= by) { fl &= (~(4)); }
2889 if (P.y <= By) { fl &= (~(8)); }
2890 if ((P.z >= -1.0f)&&(P.w > 0)) { fl &= (~(16)); }
2891 if (P.z <= +1.0f) { fl &= (~(32)); }
2896 TGX_INLINE
inline void _clip(
int & fl,
const fVec3 & P,
float bx,
float Bx,
float by,
float By,
const fMat4 & M)
2898 fVec4 S = M.mult1(P);
2900 return _clip(fl, S, bx, Bx, by, By);
2906 inline bool _discardBox(
const fBox3 & bb,
const fMat4 & M)
2908 if ((bb.minX == 0) && (bb.maxX == 0) && (bb.minY == 0) && (bb.maxY == 0) && (bb.minZ == 0) && (bb.maxZ == 0))
2911 const float bx = (_ox - 1) * _ilx - 1.0f;
2912 const float Bx = (_ox + _uni.im->width() + 1) * _ilx - 1.0f;
2913 const float by = (_oy - 1) * _ily - 1.0f;
2914 const float By = (_oy + _uni.im->height() + 1) * _ily - 1.0f;
2917 _clip(fl,
fVec3(bb.minX, bb.minY, bb.minZ), bx, Bx, by, By, M);
2918 if (fl == 0)
return false;
2919 _clip(fl,
fVec3(bb.minX, bb.minY, bb.maxZ), bx, Bx, by, By, M);
2920 if (fl == 0)
return false;
2921 _clip(fl,
fVec3(bb.minX, bb.maxY, bb.minZ), bx, Bx, by, By, M);
2922 if (fl == 0)
return false;
2923 _clip(fl,
fVec3(bb.minX, bb.maxY, bb.maxZ), bx, Bx, by, By, M);
2924 if (fl == 0)
return false;
2925 _clip(fl,
fVec3(bb.maxX, bb.minY, bb.minZ), bx, Bx, by, By, M);
2926 if (fl == 0)
return false;
2927 _clip(fl,
fVec3(bb.maxX, bb.minY, bb.maxZ), bx, Bx, by, By, M);
2928 if (fl == 0)
return false;
2929 _clip(fl,
fVec3(bb.maxX, bb.maxY, bb.minZ), bx, Bx, by, By, M);
2930 if (fl == 0)
return false;
2931 _clip(fl,
fVec3(bb.maxX, bb.maxY, bb.maxZ), bx, Bx, by, By, M);
2932 if (fl == 0)
return false;
2939 inline bool _discardTriangle(
const fVec4 & P1,
const fVec4 & P2,
const fVec4 & P3)
2941 const float bx = (_ox - 1) * _ilx - 1.0f;
2942 const float Bx = (_ox + _uni.im->width() + 1) * _ilx - 1.0f;
2943 const float by = (_oy - 1) * _ily - 1.0f;
2944 const float By = (_oy + _uni.im->height() + 1) * _ily - 1.0f;
2947 _clip(fl, P1, bx, Bx, by, By);
2948 if (fl == 0)
return false;
2949 _clip(fl, P2, bx, Bx, by, By);
2950 if (fl == 0)
return false;
2951 _clip(fl, P3, bx, Bx, by, By);
2952 if (fl == 0)
return false;
2958 TGX_INLINE
bool _clip2(
float clipboundXY,
const fVec3 & P,
const fMat4 & M)
2960 fVec4 S = M.mult1(P);
2964 if (S.w <= 0) S.z = -2;
2966 return ((S.x <= -clipboundXY) || (S.x >= clipboundXY)
2967 || (S.y <= -clipboundXY) || (S.y >= clipboundXY)
2968 || (S.z <= -1) || (S.z >= 1));
2973 inline bool _clipTestNeeded(
float clipboundXY,
const fBox3 & bb,
const fMat4 & M)
2975 return (_clip2(clipboundXY,
fVec3(bb.minX, bb.minY, bb.minZ), M)
2976 || _clip2(clipboundXY,
fVec3(bb.minX, bb.minY, bb.maxZ), M)
2977 || _clip2(clipboundXY,
fVec3(bb.minX, bb.maxY, bb.minZ), M)
2978 || _clip2(clipboundXY,
fVec3(bb.minX, bb.maxY, bb.maxZ), M)
2979 || _clip2(clipboundXY,
fVec3(bb.maxX, bb.minY, bb.minZ), M)
2980 || _clip2(clipboundXY,
fVec3(bb.maxX, bb.minY, bb.maxZ), M)
2981 || _clip2(clipboundXY,
fVec3(bb.maxX, bb.maxY, bb.minZ), M)
2982 || _clip2(clipboundXY,
fVec3(bb.maxX, bb.maxY, bb.maxZ), M));
2987 inline bool _wireFrameAANeighborCheckNeeded(
const fBox3& bb,
const fMat4& proj_modelview)
2989 if ((_uni.im ==
nullptr) || (_uni.im->lx() <= 2) || (_uni.im->ly() <= 2))
return true;
2991 const float bx = (_ox + 1.0f) * _ilx - 1.0f;
2992 const float Bx = (_ox + (float)(_uni.im->lx() - 2)) * _ilx - 1.0f;
2993 const float by = (_oy + 1.0f) * _ily - 1.0f;
2994 const float By = (_oy + (float)(_uni.im->ly() - 2)) * _ily - 1.0f;
2996 const fVec3 C[8] = {
2997 fVec3(bb.minX, bb.minY, bb.minZ),
2998 fVec3(bb.minX, bb.minY, bb.maxZ),
2999 fVec3(bb.minX, bb.maxY, bb.minZ),
3000 fVec3(bb.minX, bb.maxY, bb.maxZ),
3001 fVec3(bb.maxX, bb.minY, bb.minZ),
3002 fVec3(bb.maxX, bb.minY, bb.maxZ),
3003 fVec3(bb.maxX, bb.maxY, bb.minZ),
3004 fVec3(bb.maxX, bb.maxY, bb.maxZ)
3007 for (
int i = 0; i < 8; i++)
3009 fVec4 P = proj_modelview.mult1(C[i]);
3012 if (P.w <= 0)
return true;
3015 if ((P.z < -1.0f) || (P.z > 1.0f))
return true;
3016 if ((P.x < bx) || (P.x > Bx) || (P.y < by) || (P.y > By))
return true;
3022#if TGX_MESHLET_SPHERE_CLIP
3024 inline void _meshletClipPlanes(
float clipboundXY,
const fMat4& M, fVec4* planes,
float* plane_norms)
const
3026 const float cx = clipboundXY;
3027 planes[0] =
fVec4(M.M[0] + cx * M.M[3], M.M[4] + cx * M.M[7], M.M[8] + cx * M.M[11], M.M[12] + cx * M.M[15]);
3028 planes[1] =
fVec4(-M.M[0] + cx * M.M[3], -M.M[4] + cx * M.M[7], -M.M[8] + cx * M.M[11], -M.M[12] + cx * M.M[15]);
3029 planes[2] =
fVec4(M.M[1] + cx * M.M[3], M.M[5] + cx * M.M[7], M.M[9] + cx * M.M[11], M.M[13] + cx * M.M[15]);
3030 planes[3] =
fVec4(-M.M[1] + cx * M.M[3], -M.M[5] + cx * M.M[7], -M.M[9] + cx * M.M[11], -M.M[13] + cx * M.M[15]);
3031 planes[4] =
fVec4(M.M[2] + M.M[3], M.M[6] + M.M[7], M.M[10] + M.M[11], M.M[14] + M.M[15]);
3032 planes[5] =
fVec4(-M.M[2] + M.M[3], -M.M[6] + M.M[7], -M.M[10] + M.M[11], -M.M[14] + M.M[15]);
3033 for (
int i = 0; i < 6; i++)
3035 const fVec4& P = planes[i];
3036 plane_norms[i] = sqrtf(P.x * P.x + P.y * P.y + P.z * P.z);
3042 inline int _meshletSphereClip(
const fVec3& center,
float radius,
const fVec4* planes,
const float* plane_norms)
const
3044 bool intersects =
false;
3045 for (
int i = 0; i < 6; i++)
3047 const fVec4& P = planes[i];
3048 const float d = P.
x * center.x + P.y * center.y + P.z * center.z + P.w;
3049 const float r = radius * plane_norms[i];
3050 if (d < -r)
return -1;
3051 if (d < r) intersects =
true;
3053 return intersects ? 1 : 0;
3074 return (CP.
x * P.
x) + (CP.
y * P.
y) + (CP.
z * P.
z) + (CP.
w * P.
w) + off;
3087 TGX_INLINE
inline float _cpfactor(
const tgx::fVec4& CP,
const float sdistA,
const float sdistB)
3089 return sdistA / (sdistA - sdistB);
3094 TGX_RENDERER3D_CLIP_NOINLINE
void _triangleClip1in(
int shader,
tgx::fVec4 CP,
3095 float cp1,
float cp2,
float cp3,
3096 const RasterizerVec4& P1,
const RasterizerVec4& P2,
const RasterizerVec4& P3,
3097 RasterizerVec4& nP1, RasterizerVec4& nP2, RasterizerVec4& nP3, RasterizerVec4& nP4);
3101 TGX_RENDERER3D_CLIP_NOINLINE
void _triangleClip2in(
int shader,
tgx::fVec4 CP,
3102 float cp1,
float cp2,
float cp3,
3103 const RasterizerVec4& P1,
const RasterizerVec4& P2,
const RasterizerVec4& P3,
3104 RasterizerVec4& nP1, RasterizerVec4& nP2, RasterizerVec4& nP3, RasterizerVec4& nP4);
3107 TGX_RENDERER3D_CLIP_NOINLINE
int _triangleClip(
int shader,
tgx::fVec4 CP,
float off,
3108 const RasterizerVec4 & P1,
const RasterizerVec4 & P2,
const RasterizerVec4 & P3,
3109 RasterizerVec4 & nP1, RasterizerVec4 & nP2, RasterizerVec4 & nP3, RasterizerVec4 & nP4);
3117 static const int _POWTABSIZE = 32;
3120 float _fastpowtab[_POWTABSIZE];
3123 TGX_INLINE
inline void _precomputeSpecularTable(
int exponent)
3125 if (_currentpow == exponent)
return;
3126 _precomputeSpecularTable2(exponent);
3129 TGX_NOINLINE
void _precomputeSpecularTable2(
int exponent);
3133 TGX_INLINE
inline float _powSpecular(
float x)
const
3135 const float indf = (_powmax - x) * _POWTABSIZE;
3136 const int indi =
max(0,(
int)indf);
3137 return (indi >= (_POWTABSIZE - 1)) ? 0.0f : (_fastpowtab[indi] + (indf - indi) * (_fastpowtab[indi + 1] - _fastpowtab[indi]));;
3144 inline void _updateDirectionalLightTransform(
int index)
3146 _r_light[index] = _viewM.
mult0(_light[index]);
3147 _r_light[index] = -_r_light[index];
3149 _r_light_inorm[index] = _r_light[index] * _r_inorm;
3150 _r_H[index] =
fVec3(0, 0, 1);
3151 _r_H[index] += _r_light[index];
3153 _r_H_inorm[index] = _r_H[index] * _r_inorm;
3158 inline void _updateActiveDirectionalLightInorms()
3160 for (
int i = 0; i < _directionalLightCount; i++)
3162 _r_light_inorm[i] = _r_light[i] * _r_inorm;
3163 _r_H_inorm[i] = _r_H[i] * _r_inorm;
3169 inline void _updateActiveDirectionalLightTransforms()
3171 for (
int i = 0; i < _directionalLightCount; i++)
3173 _updateDirectionalLightTransform(i);
3179 static TGX_INLINE
inline bool _spotLightColorIsBlack(
const RGBf& color)
3181 return ((color.R <= 0.0f) && (color.G <= 0.0f) && (color.B <= 0.0f));
3186 inline void _setSpotLightRangeValues(
int index,
float range)
3188 if constexpr (MAX_SPOT_LIGHTS > 0)
3190 if ((range > 0.0f) && (range < 1.0e15f))
3192 _spotLights.range2[index] = range * range;
3193 _spotLights.invRange2[index] = 1.0f / _spotLights.range2[index];
3197 _spotLights.range2[index] = 1.0e30f;
3198 _spotLights.invRange2[index] = 0.0f;
3205 inline void _setSpotLightConeValues(
int index,
float outerAngleDeg,
float innerAngleDeg)
3207 if constexpr (MAX_SPOT_LIGHTS > 0)
3209 if (outerAngleDeg >= 180.0f)
3211 _spotLights.flags[index] &= ~(Renderer3D_detail::SPOT_LIGHT_CONE_ENABLED | Renderer3D_detail::SPOT_LIGHT_SOFT_CONE);
3212 _spotLights.cosOuter[index] = -1.0f;
3213 _spotLights.invCosWidth[index] = 0.0f;
3217 const float outer =
clamp(outerAngleDeg, 0.0f, 180.0f);
3218 _spotLights.flags[index] |= Renderer3D_detail::SPOT_LIGHT_CONE_ENABLED;
3219 _spotLights.flags[index] &= ~Renderer3D_detail::SPOT_LIGHT_SOFT_CONE;
3222 _spotLights.invCosWidth[index] = 0.0f;
3224 if ((innerAngleDeg >= 0.0f) && (innerAngleDeg < outer))
3226 const float inner =
clamp(innerAngleDeg, 0.0f, outer);
3228 const float cosWidth = cosInner - _spotLights.cosOuter[index];
3229 if (cosWidth > 0.00001f)
3231 _spotLights.flags[index] |= Renderer3D_detail::SPOT_LIGHT_SOFT_CONE;
3232 _spotLights.invCosWidth[index] = 1.0f / cosWidth;
3240 inline void _updateSpotLightPositionTransform(
int index)
3242 if constexpr (MAX_SPOT_LIGHTS > 0)
3244 _spotLights.positionView[index] = _viewM.
mult1(_spotLights.position[index]);
3250 inline void _updateSpotLightDirectionTransform(
int index)
3252 if constexpr (MAX_SPOT_LIGHTS > 0)
3254 fVec3 D = _viewM.
mult0(_spotLights.direction[index]);
3257 _spotLights.directionView[index] = D;
3263 inline void _updateSpotLightTransform(
int index)
3265 if constexpr (MAX_SPOT_LIGHTS > 0)
3267 _updateSpotLightPositionTransform(index);
3268 _updateSpotLightDirectionTransform(index);
3274 inline void _updateActiveSpotLightTransforms()
3276 if constexpr (MAX_SPOT_LIGHTS > 0)
3278 for (
int i = 0; i < _spotLights.count; i++) { _updateSpotLightTransform(i); }
3284 inline void _updateActiveSpotLightFlags()
3286 if constexpr (MAX_SPOT_LIGHTS > 0)
3288 int globalFlags = 0;
3289 for (
int i = 0; i < _spotLights.count; i++)
3291 const int flags = _spotLights.flags[i];
3292 if (flags & Renderer3D_detail::SPOT_LIGHT_RUNTIME_SPECULAR_ENABLED) { globalFlags |= Renderer3D_detail::SPOT_LIGHT_GLOBAL_RUNTIME_SPECULAR; }
3293 if (flags & Renderer3D_detail::SPOT_LIGHT_CONE_ENABLED) { globalFlags |= Renderer3D_detail::SPOT_LIGHT_GLOBAL_ACTIVE_CONE; }
3295 _spotLights.globalFlags = globalFlags;
3301 inline void _updateSpotLightColor(
int index,
float diffuseStrength,
float specularStrength,
int specularExponent)
3303 if constexpr (MAX_SPOT_LIGHTS > 0)
3305 _spotLights.runtimeDiffuseColor[index] = _spotLights.diffuseColor[index] * diffuseStrength;
3306 _spotLights.runtimeSpecularColor[index] = _spotLights.specularColor[index] * specularStrength;
3307 if ((specularStrength > 0.0f) && (specularExponent > 0) && (!_spotLightColorIsBlack(_spotLights.specularColor[index])))
3309 _spotLights.flags[index] |= Renderer3D_detail::SPOT_LIGHT_RUNTIME_SPECULAR_ENABLED;
3313 _spotLights.flags[index] &= ~Renderer3D_detail::SPOT_LIGHT_RUNTIME_SPECULAR_ENABLED;
3320 inline void _updateActiveSpotLightColors(
float diffuseStrength,
float specularStrength,
int specularExponent)
3322 if constexpr (MAX_SPOT_LIGHTS > 0)
3324 for (
int i = 0; i < _spotLights.count; i++) { _updateSpotLightColor(i, diffuseStrength, specularStrength, specularExponent); }
3325 _updateActiveSpotLightFlags();
3331 inline void _setRuntimeMaterialLighting(
float ambiantStrength,
float diffuseStrength,
float specularStrength,
int specularExponent)
3333 _r_ambiantColor = _ambiantColor * ambiantStrength;
3334 for (
int i = 0; i < _directionalLightCount; i++)
3336 _r_diffuseColor[i] = _diffuseColor[i] * diffuseStrength;
3337 _r_specularColor[i] = _specularColor[i] * specularStrength;
3339 _updateActiveSpotLightColors(diffuseStrength, specularStrength, specularExponent);
3344 inline void _setRuntimeMaterialLighting(
float ambiantStrength,
float diffuseStrength,
float specularStrength)
3346 _setRuntimeMaterialLighting(ambiantStrength, diffuseStrength, specularStrength, _specularExponent);
3351 inline void _updateDirectionalLightColor(
int index)
3353 _r_diffuseColor[index] = _diffuseColor[index] * _diffuseStrength;
3354 _r_specularColor[index] = _specularColor[index] * _specularStrength;
3363 template<
bool TEXTURE> TGX_RENDERER3D_SHADING_INLINE
inline RGBf _shadeVertex(
const float icu,
const fVec3 & N,
const fVec4 & P)
const
3365 RGBf col = _r_ambiantColor;
3366 if constexpr (MAX_DIRECTIONAL_LIGHTS == 1)
3368 col += _r_diffuseColor[0] *
max(icu *
dotProduct(N, _r_light_inorm[0]), 0.0f);
3369 col += _r_specularColor[0] * _powSpecular(icu *
dotProduct(N, _r_H_inorm[0]));
3373 for (
int i = 0; i < _directionalLightCount; i++)
3375 col += _r_diffuseColor[i] *
max(icu *
dotProduct(N, _r_light_inorm[i]), 0.0f);
3376 col += _r_specularColor[i] * _powSpecular(icu *
dotProduct(N, _r_H_inorm[i]));
3379 if constexpr (MAX_SPOT_LIGHTS > 0)
3381 const float localNormalScale = icu * _r_inorm;
3382 const int spotGlobalFlags = _spotLights.globalFlags;
3383 const bool localSpecular = (spotGlobalFlags & Renderer3D_detail::SPOT_LIGHT_GLOBAL_RUNTIME_SPECULAR) != 0;
3384 const bool localCone = (spotGlobalFlags & Renderer3D_detail::SPOT_LIGHT_GLOBAL_ACTIVE_CONE) != 0;
3385 const fVec3 Pv(P.x, P.y, P.z);
3386 for (
int i = 0; i < _spotLights.count; i++)
3388 fVec3 L = _spotLights.positionView[i] - Pv;
3390 if ((d2 <= 1.0e-12f) || (d2 >= _spotLights.range2[i]))
continue;
3393 const float diffRaw = localNormalScale * ndotlRaw;
3394 if (diffRaw <= 0.0f)
continue;
3397 const float diff = diffRaw * invD;
3398 const float atten = 1.0f - d2 * _spotLights.invRange2[i];
3399 float lightFactor = atten * atten;
3404 flags = _spotLights.flags[i];
3405 if (flags & Renderer3D_detail::SPOT_LIGHT_CONE_ENABLED)
3407 const float cone = -
dotProduct(_spotLights.directionView[i], L) * invD;
3408 if (cone <= _spotLights.cosOuter[i])
continue;
3409 if (flags & Renderer3D_detail::SPOT_LIGHT_SOFT_CONE)
3411 float spot = (cone - _spotLights.cosOuter[i]) * _spotLights.invCosWidth[i];
3412 if (spot > 1.0f) spot = 1.0f;
3413 lightFactor *= spot * spot;
3418 col += _spotLights.runtimeDiffuseColor[i] * (diff * lightFactor);
3422 if (!localCone) flags = _spotLights.flags[i];
3423 if (flags & Renderer3D_detail::SPOT_LIGHT_RUNTIME_SPECULAR_ENABLED)
3425 const float specRaw = diff + (localNormalScale * N.z);
3428 const float h2 = 2.0f + (2.0f * L.z * invD);
3432 const float spec = _powSpecular(specRaw * invH);
3433 col += _spotLights.runtimeSpecularColor[i] * (spec * lightFactor);
3444 if (!(TEXTURE)) col *= _r_objectColor;
3451 TGX_RENDERER3D_SHADING_INLINE
inline RGBf _shadeVertex(
const float icu,
const fVec3 & N,
const fVec4 & P,
const RGBf & color)
const
3453 RGBf col = _r_ambiantColor;
3454 if constexpr (MAX_DIRECTIONAL_LIGHTS == 1)
3456 col += _r_diffuseColor[0] *
max(icu *
dotProduct(N, _r_light_inorm[0]), 0.0f);
3457 col += _r_specularColor[0] * _powSpecular(icu *
dotProduct(N, _r_H_inorm[0]));
3461 for (
int i = 0; i < _directionalLightCount; i++)
3463 col += _r_diffuseColor[i] *
max(icu *
dotProduct(N, _r_light_inorm[i]), 0.0f);
3464 col += _r_specularColor[i] * _powSpecular(icu *
dotProduct(N, _r_H_inorm[i]));
3467 if constexpr (MAX_SPOT_LIGHTS > 0)
3469 const float localNormalScale = icu * _r_inorm;
3470 const int spotGlobalFlags = _spotLights.globalFlags;
3471 const bool localSpecular = (spotGlobalFlags & Renderer3D_detail::SPOT_LIGHT_GLOBAL_RUNTIME_SPECULAR) != 0;
3472 const bool localCone = (spotGlobalFlags & Renderer3D_detail::SPOT_LIGHT_GLOBAL_ACTIVE_CONE) != 0;
3473 const fVec3 Pv(P.x, P.y, P.z);
3474 for (
int i = 0; i < _spotLights.count; i++)
3476 fVec3 L = _spotLights.positionView[i] - Pv;
3478 if ((d2 <= 1.0e-12f) || (d2 >= _spotLights.range2[i]))
continue;
3481 const float diffRaw = localNormalScale * ndotlRaw;
3482 if (diffRaw <= 0.0f)
continue;
3485 const float diff = diffRaw * invD;
3486 const float atten = 1.0f - d2 * _spotLights.invRange2[i];
3487 float lightFactor = atten * atten;
3492 flags = _spotLights.flags[i];
3493 if (flags & Renderer3D_detail::SPOT_LIGHT_CONE_ENABLED)
3495 const float cone = -
dotProduct(_spotLights.directionView[i], L) * invD;
3496 if (cone <= _spotLights.cosOuter[i])
continue;
3497 if (flags & Renderer3D_detail::SPOT_LIGHT_SOFT_CONE)
3499 float spot = (cone - _spotLights.cosOuter[i]) * _spotLights.invCosWidth[i];
3500 if (spot > 1.0f) spot = 1.0f;
3501 lightFactor *= spot * spot;
3506 col += _spotLights.runtimeDiffuseColor[i] * (diff * lightFactor);
3510 if (!localCone) flags = _spotLights.flags[i];
3511 if (flags & Renderer3D_detail::SPOT_LIGHT_RUNTIME_SPECULAR_ENABLED)
3513 const float specRaw = diff + (localNormalScale * N.z);
3516 const float h2 = 2.0f + (2.0f * L.z * invD);
3520 const float spec = _powSpecular(specRaw * invH);
3521 col += _spotLights.runtimeSpecularColor[i] * (spec * lightFactor);
3540 template<
bool TEXTURE> TGX_RENDERER3D_SHADING_INLINE
inline RGBf _shadeFace(
const float icu,
const fVec3 & N,
const fVec4 & P)
const
3542 RGBf col = _r_ambiantColor;
3543 if constexpr (MAX_DIRECTIONAL_LIGHTS == 1)
3545 col += _r_diffuseColor[0] *
max(icu *
dotProduct(N, _r_light[0]), 0.0f);
3546 col += _r_specularColor[0] * _powSpecular(icu *
dotProduct(N, _r_H[0]));
3550 for (
int i = 0; i < _directionalLightCount; i++)
3552 col += _r_diffuseColor[i] *
max(icu *
dotProduct(N, _r_light[i]), 0.0f);
3553 col += _r_specularColor[i] * _powSpecular(icu *
dotProduct(N, _r_H[i]));
3556 if constexpr (MAX_SPOT_LIGHTS > 0)
3558 const int spotGlobalFlags = _spotLights.globalFlags;
3559 const bool localSpecular = (spotGlobalFlags & Renderer3D_detail::SPOT_LIGHT_GLOBAL_RUNTIME_SPECULAR) != 0;
3560 const bool localCone = (spotGlobalFlags & Renderer3D_detail::SPOT_LIGHT_GLOBAL_ACTIVE_CONE) != 0;
3561 const fVec3 Pv(P.x, P.y, P.z);
3562 for (
int i = 0; i < _spotLights.count; i++)
3564 fVec3 L = _spotLights.positionView[i] - Pv;
3566 if ((d2 <= 1.0e-12f) || (d2 >= _spotLights.range2[i]))
continue;
3569 const float diffRaw = icu * ndotlRaw;
3570 if (diffRaw <= 0.0f)
continue;
3573 const float diff = diffRaw * invD;
3574 const float atten = 1.0f - d2 * _spotLights.invRange2[i];
3575 float lightFactor = atten * atten;
3580 flags = _spotLights.flags[i];
3581 if (flags & Renderer3D_detail::SPOT_LIGHT_CONE_ENABLED)
3583 const float cone = -
dotProduct(_spotLights.directionView[i], L) * invD;
3584 if (cone <= _spotLights.cosOuter[i])
continue;
3585 if (flags & Renderer3D_detail::SPOT_LIGHT_SOFT_CONE)
3587 float spot = (cone - _spotLights.cosOuter[i]) * _spotLights.invCosWidth[i];
3588 if (spot > 1.0f) spot = 1.0f;
3589 lightFactor *= spot * spot;
3594 col += _spotLights.runtimeDiffuseColor[i] * (diff * lightFactor);
3598 if (!localCone) flags = _spotLights.flags[i];
3599 if (flags & Renderer3D_detail::SPOT_LIGHT_RUNTIME_SPECULAR_ENABLED)
3601 const float specRaw = diff + (icu * N.z);
3604 const float h2 = 2.0f + (2.0f * L.z * invD);
3608 const float spec = _powSpecular(specRaw * invH);
3609 col += _spotLights.runtimeSpecularColor[i] * (spec * lightFactor);
3620 if (!(TEXTURE)) col *= _r_objectColor;
3627 TGX_RENDERER3D_SHADING_INLINE
inline void _setFlatOrUnlitFaceColor(
int raster_type,
bool texture, fVec3& faceN,
float cu,
3628 const fVec4& Q0,
const fVec4& Q1,
const fVec4& Q2)
3630 if constexpr (TGX_SHADER_HAS_UNLIT(ENABLED_SHADERS))
3632 if (TGX_SHADER_HAS_UNLIT(raster_type))
3634 _uni.facecolor = texture ? RGBf(1.0f, 1.0f, 1.0f) : _r_objectColor;
3639 const float icu = ((cu > 0) ? -1.0f : 1.0f);
3640 faceN.normalize_fast();
3641 if constexpr (MAX_SPOT_LIGHTS > 0)
3643 if (_spotLights.count > 0)
3645 const float oneThird = 1.0f / 3.0f;
3646 const fVec4 faceCenter((Q0.x + Q1.x + Q2.x) * oneThird,
3647 (Q0.y + Q1.y + Q2.y) * oneThird,
3648 (Q0.z + Q1.z + Q2.z) * oneThird,
3651 _uni.facecolor = _shadeFace<true>(icu, faceN, faceCenter);
3653 _uni.facecolor = _shadeFace<false>(icu, faceN, faceCenter);
3658 _uni.facecolor = _shadeFace<true>(icu, faceN, Q0);
3660 _uni.facecolor = _shadeFace<false>(icu, faceN, Q0);
3680 RasterizerParams<color_t, color_t,ZBUFFER_t> _uni;
3686 int _texture_wrap_mode;
3687 int _texture_quality;
3693 fVec3 _light[MAX_DIRECTIONAL_LIGHTS];
3695 RGBf _diffuseColor[MAX_DIRECTIONAL_LIGHTS];
3696 RGBf _specularColor[MAX_DIRECTIONAL_LIGHTS];
3697 int _directionalLightCount;
3705 float _ambiantStrength;
3706 float _diffuseStrength;
3707 float _specularStrength;
3708 int _specularExponent;
3712 fMat4 _r_modelViewM;
3715 fVec3 _r_light[MAX_DIRECTIONAL_LIGHTS];
3716 fVec3 _r_light_inorm[MAX_DIRECTIONAL_LIGHTS];
3717 fVec3 _r_H[MAX_DIRECTIONAL_LIGHTS];
3718 fVec3 _r_H_inorm[MAX_DIRECTIONAL_LIGHTS];
3719 RGBf _r_ambiantColor;
3720 RGBf _r_diffuseColor[MAX_DIRECTIONAL_LIGHTS];
3721 RGBf _r_specularColor[MAX_DIRECTIONAL_LIGHTS];
3722 RGBf _r_objectColor;
3724 Renderer3D_detail::SpotLightData<MAX_SPOT_LIGHTS> _spotLights;
3730 struct ExtVec4 :
public RasterizerVec4
3749#include "Renderer3D.inl"
Color classes [RGB565, RGB24, RGB32, RGB64, RGBf, HSV].
Mat4< float > fMat4
4x4 matrix with single (float) precision
Definition: Mat4.h:54
Compact meshlet-based 3D model mesh format with 16-bit quantization.
Utility/miscellaneous functions used throughout the library.
TGX_INLINE T max(T a, T b)
Don't know why but much faster than fmaxf() for floats.
Definition: Misc.h:153
TGX_INLINE float fast_invsqrt(float x)
Compute a fast approximation of the inverse square root of a float.
Definition: Misc.h:390
TGX_INLINE T clamp(T v, T vmin, T vmax)
Template clamp version.
Definition: Misc.h:157
TGX_INLINE float tgx_fast_cos_deg_clamped(float deg)
Fast cosine approximation for an angle expressed in degrees.
Definition: Misc.h:467
3D triangle rasterizer function.
#define TGX_RASTERIZE_SUBPIXEL_BITS
Sub-pixel precision bits.
Definition: Rasterizer.h:46
Optional Teensy 4.x helpers for placing selected Renderer3D template instantiations in flash memory.
Internal storage for Renderer3D local spot lights.
Shader
List of shaders available for 3D graphics.
Definition: ShaderParams.h:44
@ SHADER_NOTEXTURE
disable texture mapping
Definition: ShaderParams.h:59
@ SHADER_TEXTURE_AFFINE
enable affine (non perspective-correct) texture mapping
Definition: ShaderParams.h:61
@ SHADER_TEXTURE
enable perspective-correct texture mapping
Definition: ShaderParams.h:60
Triangle shader functions.
TGX_INLINE T dotProduct(const Vec2< T > &U, const Vec2< T > &V)
Return the dot product U.V between two vectors.
Definition: Vec2.h:554
Vec3< float > fVec3
Floating point valued 3D vector with single (float) precision.
Definition: Vec3.h:52
Vec4< float > fVec4
Floating point valued 4D vector with single (float) precision.
Definition: Vec4.h:54
Image class [MAIN CLASS FOR THE 2D API].
Definition: Image.h:145
Class for drawing 3D objects onto a Image [MAIN CLASS FOR THE 3D API].
Definition: Renderer3D.h:120
void drawQuads(int nb_quads, const uint16_t *ind_vertices, const fVec3 *vertices, const uint16_t *ind_normals=nullptr, const fVec3 *normals=nullptr, const uint16_t *ind_texture=nullptr, const fVec2 *textures=nullptr, const Image< color_t > *texture_image=nullptr)
Draw a collection of quads.
void drawAdaptativeSphere(float quality=1.0f)
Draw a unit radius sphere centered at the origin S(0,1) in model space.
void setTextureQuality(Shader quality)
Set the texturing quality.
void drawWireFrameSphereAA(int nb_sectors, int nb_stacks)
Draw a wireframe unit radius sphere [antialiased] with the current material color.
void drawPixels(int nb_pixels, const fVec3 *pos_list, const int *colors_ind, const color_t *colors, const int *opacities_ind, const float *opacities)
Draw a list of pixels at given positions in model space with different colors and opacities.
void drawWireFrameMesh(const Mesh3Dv2< color_t > *mesh)
Draw a Mesh3Dv2 object in wireframe [fast].
void drawWireFrameLines(int nb_lines, const uint16_t *ind_vertices, const fVec3 *vertices)
Draw a collection of wireframe line segments [fast].
void drawCone(int nb_sectors, const Image< color_t > *texture_side, const Image< color_t > *texture_bottom=nullptr, bool bottom_cap=true)
Draw a textured unit cone in model space.
void drawWireFrameTriangleAA(const fVec3 &P1, const fVec3 &P2, const fVec3 &P3)
Draw a wireframe triangle [antialiased] with the current material color.
void drawWireFrameLineAA(const fVec3 &P1, const fVec3 &P2)
Draw a wireframe line segment [antialiased] with the current material color.
void setSpotLight(int index, const fVec3 &position, const fVec3 &direction, float range, float outerAngleDeg, const RGBf &diffuseColor, const RGBf &specularColor=RGBf(0.0f, 0.0f, 0.0f))
Configure one spot light with a hard cone edge.
void setSpotLight(int index, const fVec3 &position, float range, const RGBf &diffuseColor, const RGBf &specularColor=RGBf(0.0f, 0.0f, 0.0f))
Configure one omnidirectional local light.
void drawCylinder(int nb_sectors, bool bottom_cap=true, bool top_cap=true)
Draw a unit cylinder in model space.
void setDirectionalLightAmbiant(const RGBf &color)
Set the global ambiant light shared by all directional lights.
void drawQuadWithVertexColor(const fVec3 &P1, const fVec3 &P2, const fVec3 &P3, const fVec3 &P4, const RGBf &col1, const RGBf &col2, const RGBf &col3, const RGBf &col4, const fVec3 *N1=nullptr, const fVec3 *N2=nullptr, const fVec3 *N3=nullptr, const fVec3 *N4=nullptr)
Draw a single quad with a given colors on each of its four vertices.
void setLookAt(const fVec3 eye, const fVec3 center, const fVec3 up)
Set the view matrix so that the camera is looking at a given direction.
void drawWireFrameAdaptativeSphere(float quality=1.0f)
Draw a wireframe unit radius sphere centered at the origin (in model space) [fast].
void setSpotLightPosition(int index, const fVec3 &position)
Set the position of one spot light.
void drawWireFrameCubeAA()
Draw the wireframe cube [0,1]^3 [antialiased] with the current material color.
void drawAdaptativeSphere(const Image< color_t > *texture, float quality=1.0f)
Draw a textured unit radius sphere centered at the origin S(0,1) in model space.
void drawWireFrameLine(const fVec3 &P1, const fVec3 &P2, float thickness, color_t color, float opacity)
Draw a wireframe line segment [adjustable thickness + AA].
void setDirectionalLight(int index, const fVec3 &direction, const RGBf &diffuseColor, const RGBf &specularColor)
Configure one directional light at once.
void drawWireFrameTriangle(const fVec3 &P1, const fVec3 &P2, const fVec3 &P3)
Draw a wireframe triangle [fast].
void setLightDiffuse(const RGBf &color)
Set the diffuse light color of the main directional light of the scene.
void setSpotLightRange(int index, float range)
Set the range of one spot light.
void drawTruncatedCone(int nb_sectors, float bottom_radius, float top_radius, bool bottom_cap=true, bool top_cap=true)
Draw a truncated cone in model space.
void drawCube(const Image< color_t > *texture_front, const Image< color_t > *texture_back, const Image< color_t > *texture_top, const Image< color_t > *texture_bottom, const Image< color_t > *texture_left, const Image< color_t > *texture_right)
draw a textured unit cube [-1,1]^3 (in model space)
void drawWireFrameMesh(const Mesh3D< color_t > *mesh, bool draw_chained_meshes=true)
Draw a mesh in wireframe [fast].
void setLightDirection(const fVec3 &direction)
Set the light source direction of the main directional light of the scene.
void drawMesh(const Mesh3D< color_t > *mesh, bool use_mesh_material=true, bool draw_chained_meshes=true)
Advanced version of drawMesh() restricted to the shader subset listed in SHADERS.
void setZbuffer(ZBUFFER_t *zbuffer)
Set the z-buffer.
void drawSkyBox(const fVec2 v_front_ABCD[4], const Image< color_t > *texture_front, const fVec2 v_back_EFGH[4], const Image< color_t > *texture_back, const fVec2 v_top_HADE[4], const Image< color_t > *texture_top, const fVec2 v_bottom_BGFC[4], const Image< color_t > *texture_bottom, const fVec2 v_left_HGBA[4], const Image< color_t > *texture_left, const fVec2 v_right_DCFE[4], const Image< color_t > *texture_right, float rot_angle_y=0.0f, float reference_height=0.0f, float skybox_radius=32768.0f, Shader texture_quality=SHADER_TEXTURE_NEAREST, Shader texture_mode=SHADER_TEXTURE_CLAMP)
Draw a textured sky-box around the current camera.
void drawPixels(int nb_pixels, const fVec3 *pos_list)
Draw a list of pixels at given positions in model space.
void drawWireFrameConeAA(int nb_sectors, bool bottom_cap=true)
Draw a wireframe unit cone in model space [antialiased].
void drawWireFrameTruncatedConeAA(int nb_sectors, float bottom_radius, float top_radius, bool bottom_cap=true, bool top_cap=true)
Draw a wireframe truncated cone in model space [antialiased].
void drawWireFrameMeshAA(const Mesh3Dv2< color_t > *mesh)
Draw a Mesh3Dv2 object in wireframe [antialiased] with the current material color.
TGX_NOINLINE Renderer3D(const iVec2 &viewportSize={0, 0}, Image< color_t > *im=nullptr, ZBUFFER_t *zbuffer=nullptr)
Constructor.
void setProjectionMatrix(const fMat4 &M)
Set the projection matrix.
void drawCube()
Draw the unit cube [-1,1]^3 in model space.
fMat4 getProjectionMatrix() const
Return the current projection matrix.
void drawWireFrameCube(float thickness, color_t color, float opacity)
Draw the wireframe cube [0,1]^3 (in model space) [adjustable thickness + AA].
void drawMesh(const Mesh3Dv2< color_t > *mesh, bool use_mesh_material=true)
Draw a Mesh3Dv2 object.
void drawMesh(const Mesh3Dv2< color_t > *mesh, bool use_mesh_material=true)
Advanced version of drawMesh() restricted to the shader subset listed in SHADERS.
void setDirectionalLightSpecular(int index, const RGBf &color)
Set the specular color of one directional light.
iVec2 modelToImage(fVec3 P)
Convert from model coordinates to the corresponding image pixel.
void setShaders(Shader shaders)
Set the shaders to use for subsequent drawing operations.
void drawPixel(const fVec3 &pos, color_t color, float opacity)
Draw a single pixel at a given position in model space.
iVec2 worldToImage(fVec3 P)
Convert from world coordinates to the corresponding image pixel.
void drawWireFrameQuad(const fVec3 &P1, const fVec3 &P2, const fVec3 &P3, const fVec3 &P4, float thickness, color_t color, float opacity)
Draw a wireframe quad [adjustable thickness + AA].
void setMaterialDiffuseStrength(float strenght=0.6f)
Set how much the object material reflects the diffuse light.
void drawWireFrameQuadsAA(int nb_quads, const uint16_t *ind_vertices, const fVec3 *vertices)
Draw wireframe quads [antialiased] with the current material color.
void setLightAmbiant(const RGBf &color)
Set the scene ambiant light color.
void drawWireFrameAdaptativeSphereAA(float quality=1.0f)
Draw an adaptive wireframe sphere [antialiased] with the current material color.
void setSpotLightDirection(int index, const fVec3 &direction)
Set the direction of one spot light.
void setImage(Image< color_t > *im)
Set the image that will be drawn onto.
void drawWireFrameCylinder(int nb_sectors, bool bottom_cap, bool top_cap, float thickness, color_t color, float opacity)
Draw a wireframe unit cylinder in model space [adjustable thickness + AA].
void drawWireFrameCube()
Draw the wireframe cube [0,1]^3 (in model space) [fast].
void drawWireFrameCone(int nb_sectors, bool bottom_cap=true)
Draw a wireframe unit cone in model space [fast].
void drawWireFrameCylinder(int nb_sectors, bool bottom_cap=true, bool top_cap=true)
Draw a wireframe unit cylinder in model space [fast].
void drawWireFrameTriangleStrip(int nb_indices, const uint16_t *ind_vertices, const fVec3 *vertices, float thickness, color_t color, float opacity)
Draw a triangle strip in wireframe [adjustable thickness + AA].
void drawWireFrameMesh(const Mesh3D< color_t > *mesh, bool draw_chained_meshes, float thickness, color_t color, float opacity)
Draw a mesh in wireframe [adjustable thickness + AA].
void setTextureWrappingMode(Shader wrap_mode)
Set the wrap mode when for texturing.
void setViewportSize(int lx, int ly)
Set the size of the viewport.
fMat4 getViewMatrix() const
Return the current view matrix.
void setDirectionalLightCount(int count)
Set the number of active directional lights.
void drawWireFrameTriangle(const fVec3 &P1, const fVec3 &P2, const fVec3 &P3, float thickness, color_t color, float opacity)
Draw a wireframe triangle [adjustable thickness + AA].
void setViewportSize(const iVec2 &viewport_dim)
Set the size of the viewport.
void setOrtho(float left, float right, float bottom, float top, float zNear, float zFar)
Set the projection matrix as an orthographic matrix.
void drawTriangleWithVertexColor(const fVec3 &P1, const fVec3 &P2, const fVec3 &P3, const RGBf &col1, const RGBf &col2, const RGBf &col3, const fVec3 *N1=nullptr, const fVec3 *N2=nullptr, const fVec3 *N3=nullptr)
Draw a single triangle with a given colors on each of its vertices.
void drawWireFrameLines(int nb_lines, const uint16_t *ind_vertices, const fVec3 *vertices, float thickness, color_t color, float opacity)
Draw a collection of wireframe line segments [adjustable thickness + AA].
void setSpotLightSpecular(int index, const RGBf &color=RGBf(0.0f, 0.0f, 0.0f))
Set the specular color of one spot light.
fMat4 getModelMatrix() const
Return the model transformation matrix.
void setMaterialSpecularStrength(float strenght=0.5f)
Set how much the object material reflects the specular light.
void drawSphere(int nb_sectors, int nb_stacks, const Image< color_t > *texture)
Draw a textured unit radius sphere centered at the origin S(0,1) in model space.
void setModelMatrix(const fMat4 &M)
Set the model transformation matrix.
void drawCylinder(int nb_sectors, const Image< color_t > *texture_side, const Image< color_t > *texture_bottom=nullptr, const Image< color_t > *texture_top=nullptr, bool bottom_cap=true, bool top_cap=true)
Draw a textured unit cylinder in model space.
void drawWireFrameMeshAA(const Mesh3D< color_t > *mesh, bool draw_chained_meshes=true)
Draw a mesh in wireframe [antialiased] with the current material color.
void drawSkyBox(const Image< color_t > *texture_front, const Image< color_t > *texture_back, const Image< color_t > *texture_top, const Image< color_t > *texture_bottom, const Image< color_t > *texture_left, const Image< color_t > *texture_right, float rot_angle_y=0.0f, float reference_height=0.0f, float skybox_radius=32768.0f, Shader texture_quality=SHADER_TEXTURE_NEAREST, Shader texture_mode=SHADER_TEXTURE_CLAMP)
Draw a textured sky-box using whole images for each face.
void drawDots(int nb_dots, const fVec3 *pos_list, const int *radius_ind, const int *radius, const int *colors_ind, const color_t *colors, const int *opacities_ind, const float *opacities)
Draw a list of dots/circles at given positions in model space.
void setFrustum(float left, float right, float bottom, float top, float zNear, float zFar)
Set the projection matrix as a perspective matrix.
void drawWireFrameSphere(int nb_sectors, int nb_stacks)
Draw a wireframe unit radius sphere centered at the origin (in model space) [fast].
static constexpr int maxSpotLightCount()
Return the compile-time spot-light capacity.
Definition: Renderer3D.h:789
void setOffset(const iVec2 &offset)
Set the offset of the image relative to the viewport.
void setPerspective(float fovy, float aspect, float zNear, float zFar)
Set the projection matrix as a perspective matrix.
void drawWireFrameLine(const fVec3 &P1, const fVec3 &P2)
Draw a wireframe line segment [fast].
void drawWireFrameQuad(const fVec3 &P1, const fVec3 &P2, const fVec3 &P3, const fVec3 &P4)
Draw a wireframe quad [fast].
void setSpotLightCone(int index, float outerAngleDeg, float innerAngleDeg=-1.0f)
Set the cone angles of one spot light.
void setOffset(int ox, int oy)
Set the offset of the image relative to the viewport.
void setSpotLightCount(int count)
Set the number of active spot lights.
void drawMesh(const Mesh3D< color_t > *mesh, bool use_mesh_material=true, bool draw_chained_meshes=true)
Draw a Mesh3D object.
void drawTruncatedCone(int nb_sectors, float bottom_radius, float top_radius, const Image< color_t > *texture_side, const Image< color_t > *texture_bottom=nullptr, const Image< color_t > *texture_top=nullptr, bool bottom_cap=true, bool top_cap=true)
Draw a textured truncated cone in model space.
int spotLightCount() const
Return the number of active spot lights.
void drawWireFrameTrianglesAA(int nb_triangles, const uint16_t *ind_vertices, const fVec3 *vertices)
Draw wireframe triangles [antialiased] with the current material color.
void setSpotLight(int index, const fVec3 &position, const fVec3 &direction, float range, float outerAngleDeg, float innerAngleDeg, const RGBf &diffuseColor, const RGBf &specularColor=RGBf(0.0f, 0.0f, 0.0f))
Configure one spot light with a soft cone edge.
void drawTriangle(const fVec3 &P1, const fVec3 &P2, const fVec3 &P3, const fVec3 *N1=nullptr, const fVec3 *N2=nullptr, const fVec3 *N3=nullptr, const fVec2 *T1=nullptr, const fVec2 *T2=nullptr, const fVec2 *T3=nullptr, const Image< color_t > *texture=nullptr)
Draw a single triangle.
void drawCube(const fVec2 v_front_ABCD[4], const Image< color_t > *texture_front, const fVec2 v_back_EFGH[4], const Image< color_t > *texture_back, const fVec2 v_top_HADE[4], const Image< color_t > *texture_top, const fVec2 v_bottom_BGFC[4], const Image< color_t > *texture_bottom, const fVec2 v_left_HGBA[4], const Image< color_t > *texture_left, const fVec2 v_right_DCFE[4], const Image< color_t > *texture_right)
Draw a textured unit cube [-1,1]^3 in model space.
void drawDot(const fVec3 &pos, int r, color_t color, float opacity)
Draw a dot/circle at a given position in model space.
void drawWireFrameTriangles(int nb_triangles, const uint16_t *ind_vertices, const fVec3 *vertices, float thickness, color_t color, float opacity)
Draw a collection of wireframe triangles [adjustable thickness + AA].
fVec4 modelToNDC(fVec3 P)
Convert from model coordinates to normalized device coordinates (NDC).
void drawQuad(const fVec3 &P1, const fVec3 &P2, const fVec3 &P3, const fVec3 &P4, const fVec3 *N1=nullptr, const fVec3 *N2=nullptr, const fVec3 *N3=nullptr, const fVec3 *N4=nullptr, const fVec2 *T1=nullptr, const fVec2 *T2=nullptr, const fVec2 *T3=nullptr, const fVec2 *T4=nullptr, const Image< color_t > *texture=nullptr)
Draw a single quad.
void drawWireFrameTruncatedCone(int nb_sectors, float bottom_radius, float top_radius, bool bottom_cap=true, bool top_cap=true)
Draw a wireframe truncated cone in model space [fast].
void usePerspectiveProjection()
Set projection mode to perspective (ie with z-divide).
void setMaterialAmbiantStrength(float strenght=0.1f)
Set how much the object material reflects the ambient light.
void setDirectionalLightDiffuse(int index, const RGBf &color)
Set the diffuse color of one directional light.
void setMaterialSpecularExponent(int exponent=16)
Set the object specular exponent.
void setModelPosScaleRot(const fVec3 ¢er=fVec3{ 0, 0, 0 }, const fVec3 &scale=fVec3(1, 1, 1), float rot_angle=0, const fVec3 &rot_dir=fVec3{ 0, 1, 0 })
Set the model transformation matrix to move an object to a given location, scale and rotation.
void setCulling(int w)
Set the face culling strategy.
void drawWireFrameTruncatedCone(int nb_sectors, float bottom_radius, float top_radius, bool bottom_cap, bool top_cap, float thickness, color_t color, float opacity)
Draw a wireframe truncated cone in model space [adjustable thickness + AA].
void drawWireFrameLinesAA(int nb_lines, const uint16_t *ind_vertices, const fVec3 *vertices)
Draw wireframe line segments [antialiased] with the current material color.
void useOrthographicProjection()
Set projection mode to orthographic (ie no z-divide).
void drawTriangleStrip(int nb_indices, const uint16_t *ind_vertices, const fVec3 *vertices, const uint16_t *ind_normals=nullptr, const fVec3 *normals=nullptr, const uint16_t *ind_texture=nullptr, const fVec2 *textures=nullptr, const Image< color_t > *texture_image=nullptr)
Draw a triangle strip.
void setDirectionalLightDirection(int index, const fVec3 &direction)
Set the direction of one directional light.
void setViewMatrix(const fMat4 &M)
Set the view transformation matrix.
void drawWireFrameTriangleStrip(int nb_indices, const uint16_t *ind_vertices, const fVec3 *vertices)
Draw a triangle strip in wireframe [fast].
void clearZbuffer()
Clear the Zbuffer.
void setMaterialColor(RGBf color)
Set the object material color.
fVec4 worldToNDC(fVec3 P)
Convert from world coordinates to normalized device coordinates (NDC).
void drawPixel(const fVec3 &pos)
Draw a single pixel at a given position in model space.
void drawWireFrameTriangleStripAA(int nb_indices, const uint16_t *ind_vertices, const fVec3 *vertices)
Draw a triangle strip in wireframe [antialiased] with the current material color.
void drawWireFrameCylinderAA(int nb_sectors, bool bottom_cap=true, bool top_cap=true)
Draw a wireframe unit cylinder in model space [antialiased].
void drawSphere(int nb_sectors, int nb_stacks)
Draw a unit radius sphere centered at the origin S(0,1) in model space.
void drawDot(const fVec3 &pos, int r)
Draw a dot/circle at a given position in model space.
void drawWireFrameQuads(int nb_quads, const uint16_t *ind_vertices, const fVec3 *vertices, float thickness, color_t color, float opacity)
Draw a collection of wireframe quads [adjustable thickness + AA].
void setSpotLightDiffuse(int index, const RGBf &color)
Set the diffuse color of one spot light.
void setLight(const fVec3 direction, const RGBf &ambiantColor, const RGBf &diffuseColor, const RGBf &specularColor)
Set all lighting parameters of the main directional light of the scene at once.
void drawWireFrameAdaptativeSphere(float quality, float thickness, color_t color, float opacity)
Draw a wireframe unit radius sphere centered at the origin (in model space) [adjustable thickness + A...
void setMaterial(RGBf color, float ambiantStrength, float diffuseStrength, float specularStrength, int specularExponent)
Set all the object material properties at once.
static constexpr int maxDirectionalLightCount()
Return the compile-time directional-light capacity.
Definition: Renderer3D.h:697
void setLookAt(float eyeX, float eyeY, float eyeZ, float centerX, float centerY, float centerZ, float upX, float upY, float upZ)
Set the view matrix so that the camera is looking at a given direction.
void setLightSpecular(const RGBf &color)
Set the specular light color of the main directional light of the scene.
void drawWireFrameQuads(int nb_quads, const uint16_t *ind_vertices, const fVec3 *vertices)
Draw a collection of wireframe quads [fast].
void drawCone(int nb_sectors, bool bottom_cap=true)
Draw a unit cone in model space.
void drawWireFrameTriangles(int nb_triangles, const uint16_t *ind_vertices, const fVec3 *vertices)
Draw a collection of wireframe triangles [fast].
void drawWireFrameSphere(int nb_sectors, int nb_stacks, float thickness, color_t color, float opacity)
Draw a wireframe unit radius sphere centered at the origin (in model space) [adjustable thickness + A...
int directionalLightCount() const
Return the number of active directional lights.
void drawWireFrameMesh(const Mesh3Dv2< color_t > *mesh, float thickness, color_t color, float opacity)
Draw a Mesh3Dv2 object in wireframe [adjustable thickness + AA].
void drawWireFrameQuadAA(const fVec3 &P1, const fVec3 &P2, const fVec3 &P3, const fVec3 &P4)
Draw a wireframe quad [antialiased] with the current material color.
void drawTriangles(int nb_triangles, const uint16_t *ind_vertices, const fVec3 *vertices, const uint16_t *ind_normals=nullptr, const fVec3 *normals=nullptr, const uint16_t *ind_texture=nullptr, const fVec2 *textures=nullptr, const Image< color_t > *texture_image=nullptr)
Draw a collection of triangles.
void drawWireFrameCone(int nb_sectors, bool bottom_cap, float thickness, color_t color, float opacity)
Draw a wireframe unit cone in model space [adjustable thickness + AA].
void drawDots(int nb_dots, const fVec3 *pos_list, const int radius)
Draw a list of dots/circles at given positions in model space.
TGX_INLINE Vec4< T > mult1(const Vec3< T > &V) const
Matrix-vector multiplication (last component of vector set to w = 1)
Definition: Mat4.h:578
TGX_INLINE Vec4< T > mult0(const Vec3< T > &V) const
Matrix-vector multiplication (last component of vector set to w = 0).
Definition: Mat4.h:557
3D mesh data structure.
Definition: Mesh3D.h:157
Compact meshlet-based 3D mesh data structure.
Definition: Mesh3Dv2.h:239
Color in R,G,B float format.
Definition: Color.h:2405
Generic 2D vector [specializations iVec2, fVec2, dVec2].
Definition: Vec2.h:64
T x
'x' coordinate (first dimension)
Definition: Vec2.h:72
T y
'y' coordinate (second dimension)
Definition: Vec2.h:73
T z
'z' coordinate (third dimension)
Definition: Vec3.h:83
void normalize()
Normalise the vector so that its norm is 1 (do nothing if the vector is 0).
Definition: Vec3.h:382
T w
'w' coordinate (fourth dimension)
Definition: Vec4.h:85
TGX_INLINE_ZDIVIDE void zdivide()
Performs the 'z-divide' operation.
Definition: Vec4.h:478