21#ifndef _TGX_RENDERER3D_H_
22#define _TGX_RENDERER3D_H_
51 extern const uint16_t UNIT_CUBE_FACES[6*4];
52 extern const uint16_t UNIT_CUBE_FACES_NORMALS[6 * 4];
115 template<
typename color_t, Shader LOADED_SHADERS = TGX_SHADER_MASK_ALL,
typename ZBUFFER_t =
float,
int MAX_DIRECTIONAL_LIGHTS = 1,
int MAX_SPOT_LIGHTS = 0>
122 static_assert(is_color<color_t>::value,
"color_t must be one of the color types defined in color.h");
123 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");
124 static_assert(MAX_DIRECTIONAL_LIGHTS >= 1,
"MAX_DIRECTIONAL_LIGHTS must be at least 1");
125 static_assert(MAX_SPOT_LIGHTS >= 0,
"MAX_SPOT_LIGHTS must be non-negative");
128 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)));
129 static constexpr int EXPLICIT_TEXTURE_MODE = (TGX_SHADER_HAS_TEXTURING_ENABLED(LOADED_SHADERS));
132 static constexpr Shader ENABLED_SHADERS = LOADED_SHADERS | (ENABLE_TEXTURING ? DEFAULT_TEXTURE_MODE :
SHADER_NOTEXTURE);
134 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");
135 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");
136 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");
137 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");
138 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");
139 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");
310 void setOrtho(
float left,
float right,
float bottom,
float top,
float zNear,
float zFar);
329 void setFrustum(
float left,
float right,
float bottom,
float top,
float zNear,
float zFar);
523 void setLookAt(
float eyeX,
float eyeY,
float eyeZ,
float centerX,
float centerY,
float centerZ,
float upX,
float upY,
float upZ);
896 void setMaterial(
RGBf color,
float ambiantStrength,
float diffuseStrength,
float specularStrength,
int specularExponent);
974 const fVec3 * N1 =
nullptr,
const fVec3 * N2 =
nullptr,
const fVec3 * N3 =
nullptr,
975 const fVec2 * T1 =
nullptr,
const fVec2 * T2 =
nullptr,
const fVec2 * T3 =
nullptr,
992 const RGBf & col1,
const RGBf & col2,
const RGBf & col3,
993 const fVec3 * N1 =
nullptr,
const fVec3 * N2 =
nullptr,
const fVec3 * N3 =
nullptr);
1015 const uint16_t * ind_vertices,
const fVec3 * vertices,
1016 const uint16_t * ind_normals =
nullptr,
const fVec3* normals =
nullptr,
1017 const uint16_t * ind_texture =
nullptr,
const fVec2* textures =
nullptr,
1044 const uint16_t* ind_vertices,
const fVec3* vertices,
1045 const uint16_t* ind_normals =
nullptr,
const fVec3* normals =
nullptr,
1046 const uint16_t* ind_texture =
nullptr,
const fVec2* textures =
nullptr,
1067 const fVec3 * N1 =
nullptr,
const fVec3 * N2 =
nullptr,
const fVec3 * N3 =
nullptr,
const fVec3 * N4 =
nullptr,
1068 const fVec2 * T1 =
nullptr,
const fVec2 * T2 =
nullptr,
const fVec2 * T3 =
nullptr,
const fVec2 * T4 =
nullptr,
1089 const RGBf & col1,
const RGBf & col2,
const RGBf & col3,
const RGBf & col4,
1090 const fVec3 * N1 =
nullptr,
const fVec3 * N2 =
nullptr,
const fVec3 * N3 =
nullptr,
const fVec3 * N4 =
nullptr);
1116 const uint16_t * ind_vertices,
const fVec3 * vertices,
1117 const uint16_t * ind_normals =
nullptr,
const fVec3* normals =
nullptr,
1118 const uint16_t * ind_texture =
nullptr,
const fVec2* textures =
nullptr,
1306 float rot_angle_y = 0.0f,
1307 float reference_height = 0.0f,
1308 float skybox_radius = 32768.0f,
1309 Shader texture_quality = SHADER_TEXTURE_NEAREST,
1310 Shader texture_mode = SHADER_TEXTURE_CLAMP
1326 float rot_angle_y = 0.0f,
1327 float reference_height = 0.0f,
1328 float skybox_radius = 32768.0f,
1329 Shader texture_quality = SHADER_TEXTURE_NEAREST,
1330 Shader texture_mode = SHADER_TEXTURE_CLAMP
1600 void drawWireFrameLines(
int nb_lines,
const uint16_t* ind_vertices,
const fVec3* vertices,
float thickness, color_t color,
float opacity);
1838 void drawWireFrameQuads(
int nb_quads,
const uint16_t* ind_vertices,
const fVec3* vertices,
float thickness, color_t color,
float opacity);
2067 void drawPixels(
int nb_pixels,
const fVec3* pos_list,
const int* colors_ind,
const color_t* colors,
const int* opacities_ind,
const float* opacities);
2130 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);
2156 TGX_INLINE
float _clipbound_xy()
const
2158 return (256 + 3*((MAXVIEWPORTDIMENSION * 256) / ((_lx > _ly) ? _lx : _ly))) / 1024.0f;
2164 TGX_INLINE
bool _validDraw()
const
2166 return ((_lx > 0) && (_ly > 0) && (_uni.im !=
nullptr) && (_uni.im->isValid()));
2171 TGX_NOINLINE
void _recompute_wa_wb();
2178 TGX_NOINLINE
void _rectifyShaderOrtho();
2181 TGX_NOINLINE
void _rectifyShaderZbuffer();
2184 TGX_NOINLINE
void _rectifyShaderShading(Shader new_shaders);
2187 TGX_NOINLINE
void _rectifyShaderTextureMode();
2190 TGX_NOINLINE
void _rectifyShaderTextureWrapping();
2193 TGX_NOINLINE
void _rectifyShaderTextureQuality();
2202 void _drawTriangleClipped(
const int RASTER_TYPE,
2203 const fVec4* Q0,
const fVec4* Q1,
const fVec4* Q2,
2204 const fVec3* N0,
const fVec3* N1,
const fVec3* N2,
2205 const fVec2* T0,
const fVec2* T1,
const fVec2* T2,
2206 const RGBf& Vcol0,
const RGBf& Vcol1,
const RGBf& Vcol2);
2210 void _drawTriangleClippedSub(
const int RASTER_TYPE,
const int plane,
2211 const RasterizerVec4& P1,
const RasterizerVec4& P2,
const RasterizerVec4& P3);
2215 void _drawTriangle(
const int RASTER_TYPE,
2216 const fVec3* P0,
const fVec3* P1,
const fVec3* P2,
2217 const fVec3* N0,
const fVec3* N1,
const fVec3* N2,
2218 const fVec2* T0,
const fVec2* T1,
const fVec2* T2,
2219 const RGBf& Vcol0,
const RGBf& Vcol1,
const RGBf& Vcol2);
2223 void _drawTriangleStrip(
const int RASTER_TYPE,
int nb_indices,
2224 const uint16_t* ind_vertices,
const fVec3* vertices,
2225 const uint16_t* ind_normals,
const fVec3* normals,
2226 const uint16_t* ind_texture,
const fVec2* textures);
2230 void _drawQuad(
const int RASTER_TYPE,
2231 const fVec3* P0,
const fVec3* P1,
const fVec3* P2,
const fVec3* P3,
2232 const fVec3* N0,
const fVec3* N1,
const fVec3* N2,
const fVec3* N3,
2233 const fVec2* T0,
const fVec2* T1,
const fVec2* T2,
const fVec2* T3,
2234 const RGBf& Vcol0,
const RGBf& Vcol1,
const RGBf& Vcol2,
const RGBf& Vcol3);
2237 template<
bool TEXTURE_BILINEAR,
bool TEXTURE_WRAP>
2238 void _rasterizeSkyBoxTriangle(
const RasterizerVec4& V0,
const RasterizerVec4& V1,
const RasterizerVec4& V2);
2241 void _rasterizeSkyBoxTriangle(
const RasterizerVec4& V0,
const RasterizerVec4& V1,
const RasterizerVec4& V2,
2242 Shader texture_quality, Shader texture_mode);
2245 void _drawSkyBoxTriangleClippedSub(
const int plane,
2246 const RasterizerVec4& P1,
const RasterizerVec4& P2,
const RasterizerVec4& P3,
2247 Shader texture_quality, Shader texture_mode);
2250 void _drawSkyBoxTriangleClipped(
2251 const fVec4* Q0,
const fVec4* Q1,
const fVec4* Q2,
2252 const fVec2* T0,
const fVec2* T1,
const fVec2* T2,
2253 Shader texture_quality, Shader texture_mode);
2256 void _drawSkyBoxQuad(
2257 const fVec4* P0,
const fVec4* P1,
const fVec4* P2,
const fVec4* P3,
2258 const fVec2* T0,
const fVec2* T1,
const fVec2* T2,
const fVec2* T3,
2259 Shader texture_quality, Shader texture_mode);
2262 void _drawSkyBoxFace(
const fVec4 skybox_vertices[8],
const uint16_t* face,
const fVec2 texture_coords[4],
const Image<color_t>* texture,
2263 Shader texture_quality, Shader texture_mode);
2267 void _drawMesh(
const int RASTER_TYPE,
const Mesh3D<color_t>* mesh);
2270 void _drawMesh(
const int RASTER_TYPE,
const Mesh3Dv2<color_t>* mesh,
bool use_mesh_material);
2273 TGX_INLINE
inline bool _discardMeshlet16b(
const fVec3& sphere_center,
float sphere_radius,
const fVec3& cone_dir,
float cone_cos)
const
2275 if (cone_cos <= -1.0f)
return false;
2277 const fVec4 D = _r_modelViewM.
mult0(cone_dir);
2278 const float dd = D.
x * D.x + D.y * D.y + D.z * D.z;
2279 if (dd <= 1.0e-20f)
return false;
2290 const fVec3 anchor = sphere_center - (cone_dir * sphere_radius);
2292 dot = -(D.x * A.x + D.y * A.y + D.z * A.z);
2293 const float aa = A.
x * A.x + A.y * A.y + A.z * A.z;
2294 if (aa <= 1.0e-20f)
return false;
2298 const float c2len2 = cone_cos * cone_cos * len2;
2299 const float dot2 = dot * dot;
2300 return (cone_cos >= 0.0f) ? ((dot < 0.0f) || (dot2 < c2len2))
2301 : ((dot < 0.0f) && (dot2 > c2len2));
2310 inline void _drawWireFrameLineFast(iVec2 P0, iVec2 P1, color_t color);
2312 template<
bool CHECK_NEIGHBOR>
inline void _drawWireFrameLineAAFast(
const fVec2& P0,
const fVec2& P1, color_t color, int32_t op);
2314 template<
int MODE>
void _drawWireFrameMesh(
const Mesh3D<color_t>* mesh,
bool draw_chained_meshes, color_t color,
float opacity,
float thickness);
2316 template<
int MODE>
void _drawWireFrameMesh(
const Mesh3Dv2<color_t>* mesh, color_t color,
float opacity,
float thickness);
2318 template<
int MODE>
void _drawWireFrameLine(
const fVec3& P1,
const fVec3& P2, color_t color,
float opacity,
float thickness);
2320 template<
int MODE>
void _drawWireFrameLines(
int nb_lines,
const uint16_t* ind_vertices,
const fVec3* vertices, color_t color,
float opacity,
float thickness);
2322 template<
int MODE>
void _drawWireFrameTriangle(
const fVec3& P1,
const fVec3& P2,
const fVec3& P3, color_t color,
float opacity,
float thickness);
2324 template<
int MODE>
void _drawWireFrameTriangles(
int nb_triangles,
const uint16_t* ind_vertices,
const fVec3* vertices, color_t color,
float opacity,
float thickness);
2326 template<
int MODE>
void _drawWireFrameTriangleStrip(
int nb_indices,
const uint16_t* ind_vertices,
const fVec3* vertices, color_t color,
float opacity,
float thickness);
2328 template<
int MODE>
void _drawWireFrameQuad(
const fVec3& P1,
const fVec3& P2,
const fVec3& P3,
const fVec3& P4, color_t color,
float opacity,
float thickness);
2330 template<
int MODE>
void _drawWireFrameQuads(
int nb_quads,
const uint16_t* ind_vertices,
const fVec3* vertices, color_t color,
float opacity,
float thickness);
2340 template<
bool USE_BLENDING>
void _drawPixel(
const fVec3& pos, color_t color,
float opacity);
2343 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);
2346 template<
bool USE_BLENDING>
void _drawDot(
const fVec3& pos,
int r, color_t color,
float opacity);
2349 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);
2353 template<
bool CHECKRANGE,
bool USE_BLENDING> TGX_INLINE
inline void drawPixelZbuf(
int x,
int y, color_t color,
float opacity,
float z)
2355 if (CHECKRANGE && ((x < 0) || (x >= _uni.im->lx()) || (y < 0) || (y >= _uni.im->ly())))
return;
2356 ZBUFFER_t& W = _uni.zbuf[x + _uni.im->lx() * y];
2357 const ZBUFFER_t aa = (std::is_same<ZBUFFER_t, uint16_t>::value) ? ((ZBUFFER_t)(z * _uni.wa + _uni.wb)) : ((ZBUFFER_t)z);
2361 if (USE_BLENDING) _uni.im->template drawPixel<false>({ x, y }, color, opacity);
else _uni.im->template drawPixel<false>({ x, y }, color);
2366 template<
bool CHECKRANGE,
bool USE_BLENDING> TGX_INLINE
inline void drawHLineZbuf(
int x,
int y,
int w, color_t color,
float opacity,
float z)
2370 const int lx = _uni.im->lx();
2371 const int ly = _uni.im->ly();
2372 if ((y < 0) || (y >= ly) || (x >= lx))
return;
2373 if (x < 0) { w += x; x = 0; }
2374 if (x + w > lx) { w = lx - x; }
2377 while(w--) drawPixelZbuf<CHECKRANGE, USE_BLENDING>(x++, y, color, opacity, z);
2381 template<
bool CHECKRANGE,
bool USE_BLENDING>
void _drawCircleZbuf(
int xm,
int ym,
int r, color_t color,
float opacity,
float z);
2387 float _unitSphereScreenDiameter();
2390 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);
2400 TGX_INLINE
inline void _clip(
int & fl,
const fVec4 & P,
float bx,
float Bx,
float by,
float By)
2402 if (P.x >= bx) { fl &= (~(1)); }
2403 if (P.x <= Bx) { fl &= (~(2)); }
2404 if (P.y >= by) { fl &= (~(4)); }
2405 if (P.y <= By) { fl &= (~(8)); }
2406 if ((P.z >= -1.0f)&&(P.w > 0)) { fl &= (~(16)); }
2407 if (P.z <= +1.0f) { fl &= (~(32)); }
2412 TGX_INLINE
inline void _clip(
int & fl,
const fVec3 & P,
float bx,
float Bx,
float by,
float By,
const fMat4 & M)
2414 fVec4 S = M.mult1(P);
2416 return _clip(fl, S, bx, Bx, by, By);
2422 bool _discardBox(
const fBox3 & bb,
const fMat4 & M)
2424 if ((bb.minX == 0) && (bb.maxX == 0) && (bb.minY == 0) && (bb.maxY == 0) && (bb.minZ == 0) && (bb.maxZ == 0))
2427 const float bx = (_ox - 1) * _ilx - 1.0f;
2428 const float Bx = (_ox + _uni.im->width() + 1) * _ilx - 1.0f;
2429 const float by = (_oy - 1) * _ily - 1.0f;
2430 const float By = (_oy + _uni.im->height() + 1) * _ily - 1.0f;
2433 _clip(fl,
fVec3(bb.minX, bb.minY, bb.minZ), bx, Bx, by, By, M);
2434 if (fl == 0)
return false;
2435 _clip(fl,
fVec3(bb.minX, bb.minY, bb.maxZ), bx, Bx, by, By, M);
2436 if (fl == 0)
return false;
2437 _clip(fl,
fVec3(bb.minX, bb.maxY, bb.minZ), bx, Bx, by, By, M);
2438 if (fl == 0)
return false;
2439 _clip(fl,
fVec3(bb.minX, bb.maxY, bb.maxZ), bx, Bx, by, By, M);
2440 if (fl == 0)
return false;
2441 _clip(fl,
fVec3(bb.maxX, bb.minY, bb.minZ), bx, Bx, by, By, M);
2442 if (fl == 0)
return false;
2443 _clip(fl,
fVec3(bb.maxX, bb.minY, bb.maxZ), bx, Bx, by, By, M);
2444 if (fl == 0)
return false;
2445 _clip(fl,
fVec3(bb.maxX, bb.maxY, bb.minZ), bx, Bx, by, By, M);
2446 if (fl == 0)
return false;
2447 _clip(fl,
fVec3(bb.maxX, bb.maxY, bb.maxZ), bx, Bx, by, By, M);
2448 if (fl == 0)
return false;
2455 bool _discardTriangle(
const fVec4 & P1,
const fVec4 & P2,
const fVec4 & P3)
2457 const float bx = (_ox - 1) * _ilx - 1.0f;
2458 const float Bx = (_ox + _uni.im->width() + 1) * _ilx - 1.0f;
2459 const float by = (_oy - 1) * _ily - 1.0f;
2460 const float By = (_oy + _uni.im->height() + 1) * _ily - 1.0f;
2463 _clip(fl, P1, bx, Bx, by, By);
2464 if (fl == 0)
return false;
2465 _clip(fl, P2, bx, Bx, by, By);
2466 if (fl == 0)
return false;
2467 _clip(fl, P3, bx, Bx, by, By);
2468 if (fl == 0)
return false;
2474 bool _clip2(
float clipboundXY,
const fVec3 & P,
const fMat4 & M)
2476 fVec4 S = M.mult1(P);
2480 if (S.w <= 0) S.z = -2;
2482 return ((S.x <= -clipboundXY) || (S.x >= clipboundXY)
2483 || (S.y <= -clipboundXY) || (S.y >= clipboundXY)
2484 || (S.z <= -1) || (S.z >= 1));
2489 bool _clipTestNeeded(
float clipboundXY,
const fBox3 & bb,
const fMat4 & M)
2491 return (_clip2(clipboundXY,
fVec3(bb.minX, bb.minY, bb.minZ), M)
2492 || _clip2(clipboundXY,
fVec3(bb.minX, bb.minY, bb.maxZ), M)
2493 || _clip2(clipboundXY,
fVec3(bb.minX, bb.maxY, bb.minZ), M)
2494 || _clip2(clipboundXY,
fVec3(bb.minX, bb.maxY, bb.maxZ), M)
2495 || _clip2(clipboundXY,
fVec3(bb.maxX, bb.minY, bb.minZ), M)
2496 || _clip2(clipboundXY,
fVec3(bb.maxX, bb.minY, bb.maxZ), M)
2497 || _clip2(clipboundXY,
fVec3(bb.maxX, bb.maxY, bb.minZ), M)
2498 || _clip2(clipboundXY,
fVec3(bb.maxX, bb.maxY, bb.maxZ), M));
2503 bool _wireFrameAANeighborCheckNeeded(
const fBox3& bb,
const fMat4& proj_modelview)
2505 if ((_uni.im ==
nullptr) || (_uni.im->lx() <= 2) || (_uni.im->ly() <= 2))
return true;
2507 const float bx = (_ox + 1.0f) * _ilx - 1.0f;
2508 const float Bx = (_ox + (float)(_uni.im->lx() - 2)) * _ilx - 1.0f;
2509 const float by = (_oy + 1.0f) * _ily - 1.0f;
2510 const float By = (_oy + (float)(_uni.im->ly() - 2)) * _ily - 1.0f;
2512 const fVec3 C[8] = {
2513 fVec3(bb.minX, bb.minY, bb.minZ),
2514 fVec3(bb.minX, bb.minY, bb.maxZ),
2515 fVec3(bb.minX, bb.maxY, bb.minZ),
2516 fVec3(bb.minX, bb.maxY, bb.maxZ),
2517 fVec3(bb.maxX, bb.minY, bb.minZ),
2518 fVec3(bb.maxX, bb.minY, bb.maxZ),
2519 fVec3(bb.maxX, bb.maxY, bb.minZ),
2520 fVec3(bb.maxX, bb.maxY, bb.maxZ)
2523 for (
int i = 0; i < 8; i++)
2525 fVec4 P = proj_modelview.mult1(C[i]);
2528 if (P.w <= 0)
return true;
2531 if ((P.z < -1.0f) || (P.z > 1.0f))
return true;
2532 if ((P.x < bx) || (P.x > Bx) || (P.y < by) || (P.y > By))
return true;
2538#if TGX_MESHLET_SPHERE_CLIP
2540 TGX_INLINE
inline void _meshletClipPlanes(
float clipboundXY,
const fMat4& M, fVec4* planes,
float* plane_norms)
const
2542 const float cx = clipboundXY;
2543 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]);
2544 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]);
2545 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]);
2546 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]);
2547 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]);
2548 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]);
2549 for (
int i = 0; i < 6; i++)
2551 const fVec4& P = planes[i];
2552 plane_norms[i] = sqrtf(P.x * P.x + P.y * P.y + P.z * P.z);
2558 TGX_INLINE
inline int _meshletSphereClip(
const fVec3& center,
float radius,
const fVec4* planes,
const float* plane_norms)
const
2560 bool intersects =
false;
2561 for (
int i = 0; i < 6; i++)
2563 const fVec4& P = planes[i];
2564 const float d = P.
x * center.x + P.y * center.y + P.z * center.z + P.w;
2565 const float r = radius * plane_norms[i];
2566 if (d < -r)
return -1;
2567 if (d < r) intersects =
true;
2569 return intersects ? 1 : 0;
2590 return (CP.
x * P.
x) + (CP.
y * P.
y) + (CP.
z * P.
z) + (CP.
w * P.
w) + off;
2603 inline float _cpfactor(
const tgx::fVec4& CP,
const float sdistA,
const float sdistB)
2605 return sdistA / (sdistA - sdistB);
2610 void _triangleClip1in(
int shader,
tgx::fVec4 CP,
2611 float cp1,
float cp2,
float cp3,
2612 const RasterizerVec4& P1,
const RasterizerVec4& P2,
const RasterizerVec4& P3,
2613 RasterizerVec4& nP1, RasterizerVec4& nP2, RasterizerVec4& nP3, RasterizerVec4& nP4);
2617 void _triangleClip2in(
int shader,
tgx::fVec4 CP,
2618 float cp1,
float cp2,
float cp3,
2619 const RasterizerVec4& P1,
const RasterizerVec4& P2,
const RasterizerVec4& P3,
2620 RasterizerVec4& nP1, RasterizerVec4& nP2, RasterizerVec4& nP3, RasterizerVec4& nP4);
2623 int _triangleClip(
int shader,
tgx::fVec4 CP,
float off,
2624 const RasterizerVec4 & P1,
const RasterizerVec4 & P2,
const RasterizerVec4 & P3,
2625 RasterizerVec4 & nP1, RasterizerVec4 & nP2, RasterizerVec4 & nP3, RasterizerVec4 & nP4);
2633 static const int _POWTABSIZE = 32;
2636 float _fastpowtab[_POWTABSIZE];
2639 TGX_INLINE
inline void _precomputeSpecularTable(
int exponent)
2641 if (_currentpow == exponent)
return;
2642 _precomputeSpecularTable2(exponent);
2645 TGX_NOINLINE
void _precomputeSpecularTable2(
int exponent);
2649 TGX_INLINE
inline float _powSpecular(
float x)
const
2651 const float indf = (_powmax - x) * _POWTABSIZE;
2652 const int indi =
max(0,(
int)indf);
2653 return (indi >= (_POWTABSIZE - 1)) ? 0.0f : (_fastpowtab[indi] + (indf - indi) * (_fastpowtab[indi + 1] - _fastpowtab[indi]));;
2660 TGX_INLINE
inline void _updateDirectionalLightTransform(
int index)
2662 _r_light[index] = _viewM.
mult0(_light[index]);
2663 _r_light[index] = -_r_light[index];
2665 _r_light_inorm[index] = _r_light[index] * _r_inorm;
2666 _r_H[index] =
fVec3(0, 0, 1);
2667 _r_H[index] += _r_light[index];
2669 _r_H_inorm[index] = _r_H[index] * _r_inorm;
2674 TGX_INLINE
inline void _updateActiveDirectionalLightInorms()
2676 for (
int i = 0; i < _directionalLightCount; i++)
2678 _r_light_inorm[i] = _r_light[i] * _r_inorm;
2679 _r_H_inorm[i] = _r_H[i] * _r_inorm;
2685 TGX_INLINE
inline void _updateActiveDirectionalLightTransforms()
2687 for (
int i = 0; i < _directionalLightCount; i++)
2689 _updateDirectionalLightTransform(i);
2695 TGX_INLINE
inline void _setRuntimeMaterialLighting(
float ambiantStrength,
float diffuseStrength,
float specularStrength)
2697 _r_ambiantColor = _ambiantColor * ambiantStrength;
2698 for (
int i = 0; i < _directionalLightCount; i++)
2700 _r_diffuseColor[i] = _diffuseColor[i] * diffuseStrength;
2701 _r_specularColor[i] = _specularColor[i] * specularStrength;
2707 TGX_INLINE
inline void _updateDirectionalLightColor(
int index)
2709 _r_diffuseColor[index] = _diffuseColor[index] * _diffuseStrength;
2710 _r_specularColor[index] = _specularColor[index] * _specularStrength;
2719 template<
bool TEXTURE> TGX_INLINE
inline RGBf _shadeVertex(
const float icu,
const fVec3 & N)
const
2721 RGBf col = _r_ambiantColor;
2722 if constexpr (MAX_DIRECTIONAL_LIGHTS == 1)
2724 col += _r_diffuseColor[0] *
max(icu *
dotProduct(N, _r_light_inorm[0]), 0.0f);
2725 col += _r_specularColor[0] * _powSpecular(icu *
dotProduct(N, _r_H_inorm[0]));
2729 for (
int i = 0; i < _directionalLightCount; i++)
2731 col += _r_diffuseColor[i] *
max(icu *
dotProduct(N, _r_light_inorm[i]), 0.0f);
2732 col += _r_specularColor[i] * _powSpecular(icu *
dotProduct(N, _r_H_inorm[i]));
2735 if (!(TEXTURE)) col *= _r_objectColor;
2742 TGX_INLINE
inline RGBf _shadeVertex(
const float icu,
const fVec3 & N,
const RGBf & color)
const
2744 RGBf col = _r_ambiantColor;
2745 if constexpr (MAX_DIRECTIONAL_LIGHTS == 1)
2747 col += _r_diffuseColor[0] *
max(icu *
dotProduct(N, _r_light_inorm[0]), 0.0f);
2748 col += _r_specularColor[0] * _powSpecular(icu *
dotProduct(N, _r_H_inorm[0]));
2752 for (
int i = 0; i < _directionalLightCount; i++)
2754 col += _r_diffuseColor[i] *
max(icu *
dotProduct(N, _r_light_inorm[i]), 0.0f);
2755 col += _r_specularColor[i] * _powSpecular(icu *
dotProduct(N, _r_H_inorm[i]));
2766 template<
bool TEXTURE> TGX_INLINE
inline RGBf _shadeFace(
const float icu,
const fVec3 & N)
const
2768 RGBf col = _r_ambiantColor;
2769 if constexpr (MAX_DIRECTIONAL_LIGHTS == 1)
2771 col += _r_diffuseColor[0] *
max(icu *
dotProduct(N, _r_light[0]), 0.0f);
2772 col += _r_specularColor[0] * _powSpecular(icu *
dotProduct(N, _r_H[0]));
2776 for (
int i = 0; i < _directionalLightCount; i++)
2778 col += _r_diffuseColor[i] *
max(icu *
dotProduct(N, _r_light[i]), 0.0f);
2779 col += _r_specularColor[i] * _powSpecular(icu *
dotProduct(N, _r_H[i]));
2782 if (!(TEXTURE)) col *= _r_objectColor;
2789 TGX_INLINE
inline void _setFlatOrUnlitFaceColor(
int raster_type,
bool texture, fVec3& faceN,
float cu)
2791 if constexpr (TGX_SHADER_HAS_UNLIT(ENABLED_SHADERS))
2793 if (TGX_SHADER_HAS_UNLIT(raster_type))
2795 _uni.facecolor = texture ? RGBf(1.0f, 1.0f, 1.0f) : _r_objectColor;
2800 const float icu = ((cu > 0) ? -1.0f : 1.0f);
2801 faceN.normalize_fast();
2803 _uni.facecolor = _shadeFace<true>(icu, faceN);
2805 _uni.facecolor = _shadeFace<false>(icu, faceN);
2825 RasterizerParams<color_t, color_t,ZBUFFER_t> _uni;
2831 int _texture_wrap_mode;
2832 int _texture_quality;
2838 fVec3 _light[MAX_DIRECTIONAL_LIGHTS];
2840 RGBf _diffuseColor[MAX_DIRECTIONAL_LIGHTS];
2841 RGBf _specularColor[MAX_DIRECTIONAL_LIGHTS];
2842 int _directionalLightCount;
2851 float _ambiantStrength;
2852 float _diffuseStrength;
2853 float _specularStrength;
2854 int _specularExponent;
2858 fMat4 _r_modelViewM;
2861 fVec3 _r_light[MAX_DIRECTIONAL_LIGHTS];
2862 fVec3 _r_light_inorm[MAX_DIRECTIONAL_LIGHTS];
2863 fVec3 _r_H[MAX_DIRECTIONAL_LIGHTS];
2864 fVec3 _r_H_inorm[MAX_DIRECTIONAL_LIGHTS];
2865 RGBf _r_ambiantColor;
2866 RGBf _r_diffuseColor[MAX_DIRECTIONAL_LIGHTS];
2867 RGBf _r_specularColor[MAX_DIRECTIONAL_LIGHTS];
2868 RGBf _r_objectColor;
2874 struct ExtVec4 :
public RasterizerVec4
2893#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
3D triangle rasterizer function.
#define TGX_RASTERIZE_SUBPIXEL_BITS
Sub-pixel precision bits.
Definition: Rasterizer.h:46
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:117
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 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 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 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 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 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 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 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 setImage(Image< color_t > *im)
Set the image that will be drawn onto.
void drawWireFrameCube()
Draw the wireframe cube [0,1]^3 (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].
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 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].
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 setOffset(int ox, int oy)
Set the offset of the image relative to the viewport.
void drawMesh(const Mesh3D< color_t > *mesh, bool use_mesh_material=true, bool draw_chained_meshes=true)
Draw a Mesh3D object.
void drawWireFrameTrianglesAA(int nb_triangles, const uint16_t *ind_vertices, const fVec3 *vertices)
Draw wireframe triangles [antialiased] with the current material color.
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 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 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 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 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:671
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 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 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
TGX_INLINE void clamp()
Clamp all color channel to [0.0f,1.0f].
Definition: Color.h:2645
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