2024-10-28 15:57:39 +01:00
|
|
|
// Luanti
|
|
|
|
// SPDX-License-Identifier: LGPL-2.1-or-later
|
|
|
|
// Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com>
|
2011-12-03 08:40:32 +01:00
|
|
|
|
2017-08-17 22:19:39 +02:00
|
|
|
#pragma once
|
2011-12-03 08:40:32 +01:00
|
|
|
|
2025-01-04 12:39:34 +01:00
|
|
|
#include "SColor.h"
|
2023-08-24 10:50:47 +02:00
|
|
|
#include "SMaterialLayer.h"
|
2014-10-15 04:13:53 +02:00
|
|
|
#include "nodedef.h"
|
2011-12-03 08:40:32 +01:00
|
|
|
|
2025-01-04 12:39:34 +01:00
|
|
|
namespace irr {
|
|
|
|
namespace scene {
|
|
|
|
class IAnimatedMesh;
|
|
|
|
class IMesh;
|
|
|
|
class IMeshBuffer;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
using namespace irr;
|
|
|
|
|
2017-01-12 15:46:30 +01:00
|
|
|
/*!
|
|
|
|
* Applies shading to a color based on the surface's
|
|
|
|
* normal vector.
|
|
|
|
*/
|
2024-09-10 20:29:02 +02:00
|
|
|
void applyFacesShading(video::SColor &color, const v3f normal);
|
2017-01-12 15:46:30 +01:00
|
|
|
|
2011-12-03 08:40:32 +01:00
|
|
|
/*
|
|
|
|
Create a new cube mesh.
|
|
|
|
Vertices are at (+-scale.X/2, +-scale.Y/2, +-scale.Z/2).
|
|
|
|
|
|
|
|
The resulting mesh has 6 materials (up, down, right, left, back, front)
|
|
|
|
which must be defined by the caller.
|
|
|
|
*/
|
|
|
|
scene::IAnimatedMesh* createCubeMesh(v3f scale);
|
|
|
|
|
|
|
|
/*
|
|
|
|
Multiplies each vertex coordinate by the specified scaling factors
|
|
|
|
(componentwise vector multiplication).
|
|
|
|
*/
|
|
|
|
void scaleMesh(scene::IMesh *mesh, v3f scale);
|
|
|
|
|
2012-01-12 06:10:39 +01:00
|
|
|
/*
|
|
|
|
Translate each vertex coordinate by the specified vector.
|
|
|
|
*/
|
|
|
|
void translateMesh(scene::IMesh *mesh, v3f vec);
|
|
|
|
|
2017-06-01 23:18:55 +02:00
|
|
|
/*!
|
|
|
|
* Sets a constant color for all vertices in the mesh buffer.
|
|
|
|
*/
|
2024-09-10 20:29:02 +02:00
|
|
|
void setMeshBufferColor(scene::IMeshBuffer *buf, const video::SColor color);
|
2017-06-01 23:18:55 +02:00
|
|
|
|
2011-12-03 08:40:32 +01:00
|
|
|
/*
|
|
|
|
Set a constant color for all vertices in the mesh
|
|
|
|
*/
|
2024-09-10 20:29:02 +02:00
|
|
|
void setMeshColor(scene::IMesh *mesh, const video::SColor color);
|
2011-12-03 08:40:32 +01:00
|
|
|
|
2017-06-01 23:18:55 +02:00
|
|
|
/*!
|
|
|
|
* Overwrites the color of a mesh buffer.
|
|
|
|
* The color is darkened based on the normal vector of the vertices.
|
|
|
|
*/
|
2017-01-12 15:46:30 +01:00
|
|
|
void colorizeMeshBuffer(scene::IMeshBuffer *buf, const video::SColor *buffercolor);
|
2015-07-21 23:56:41 +02:00
|
|
|
|
2011-12-03 08:40:32 +01:00
|
|
|
/*
|
|
|
|
Set the color of all vertices in the mesh.
|
|
|
|
For each vertex, determine the largest absolute entry in
|
|
|
|
the normal vector, and choose one of colorX, colorY or
|
|
|
|
colorZ accordingly.
|
|
|
|
*/
|
|
|
|
void setMeshColorByNormalXYZ(scene::IMesh *mesh,
|
|
|
|
const video::SColor &colorX,
|
|
|
|
const video::SColor &colorY,
|
|
|
|
const video::SColor &colorZ);
|
2016-02-21 06:50:41 +01:00
|
|
|
|
|
|
|
void setMeshColorByNormal(scene::IMesh *mesh, const v3f &normal,
|
|
|
|
const video::SColor &color);
|
|
|
|
|
2014-10-15 04:13:53 +02:00
|
|
|
/*
|
|
|
|
Rotate the mesh by 6d facedir value.
|
|
|
|
Method only for meshnodes, not suitable for entities.
|
|
|
|
*/
|
2024-12-07 12:59:40 +01:00
|
|
|
void rotateMeshBy6dFacedir(scene::IMesh *mesh, u8 facedir);
|
2014-10-15 04:13:53 +02:00
|
|
|
|
2014-11-21 08:41:21 +01:00
|
|
|
/*
|
|
|
|
Rotate the mesh around the axis and given angle in degrees.
|
|
|
|
*/
|
|
|
|
void rotateMeshXYby (scene::IMesh *mesh, f64 degrees);
|
|
|
|
void rotateMeshXZby (scene::IMesh *mesh, f64 degrees);
|
2017-08-17 22:19:39 +02:00
|
|
|
void rotateMeshYZby (scene::IMesh *mesh, f64 degrees);
|
2017-04-21 15:34:59 +02:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Clone the mesh buffer.
|
2017-04-22 00:55:07 +02:00
|
|
|
* The returned pointer should be dropped.
|
2017-04-21 15:34:59 +02:00
|
|
|
*/
|
|
|
|
scene::IMeshBuffer* cloneMeshBuffer(scene::IMeshBuffer *mesh_buffer);
|
2017-08-17 22:19:39 +02:00
|
|
|
|
Fix handling of skinned meshes for nodes
Second try after the revert in 8a28339 due to an unexpected regression.
- Rigidly animated models (e.g. the glTF frog node) were not working correctly,
since cloning the mesh ignored the transformation matrices.
Note that scaling the mesh needs to occur *after* transforming the vertices.
- Visual scale did not apply to skinned models,
as resetting the animation overwrote scaled vertex data with static positions & normals.
For backwards compatibility, we now apply a 10x scale to static, non-glTF models.
We now do scale static meshes, as the bug that caused meshes not to be scaled was limited to skeletally animated meshes,
hence we ought not to reproduce it for skinned meshes that do not take advantage of skeletal animations (e.g. current MTG doors).
However, glTF models (e.g. Wuzzy's eyeballs) up until recently were always affected due to technical reasons
(using skeletal animation for rigid animation).
Thus, to preserve behavior, we:
1. Do not apply 10x scale to glTF models.
2. Apply 10x scale to obj models.
3. Apply 10x scale to static x or b3d models, but not to animated ones.
See also: #16141
2025-05-20 18:37:33 +02:00
|
|
|
/// Clone a mesh. For an animated mesh, this will clone the static pose.
|
|
|
|
scene::SMesh* cloneStaticMesh(scene::IMesh *src_mesh);
|
2014-10-15 04:13:53 +02:00
|
|
|
|
|
|
|
/*
|
2017-01-12 15:46:30 +01:00
|
|
|
Convert nodeboxes to mesh. Each tile goes into a different buffer.
|
2016-02-07 04:08:43 +01:00
|
|
|
boxes - set of nodeboxes to be converted into cuboids
|
|
|
|
uv_coords[24] - table of texture uv coords for each cuboid face
|
2016-02-11 04:57:01 +01:00
|
|
|
expand - factor by which cuboids will be resized
|
2014-10-15 04:13:53 +02:00
|
|
|
*/
|
2016-02-07 04:08:43 +01:00
|
|
|
scene::IMesh* convertNodeboxesToMesh(const std::vector<aabb3f> &boxes,
|
2016-02-11 04:57:01 +01:00
|
|
|
const f32 *uv_coords = NULL, float expand = 0);
|
2014-10-15 04:13:53 +02:00
|
|
|
|
|
|
|
/*
|
|
|
|
Update bounding box for a mesh.
|
|
|
|
*/
|
|
|
|
void recalculateBoundingBox(scene::IMesh *src_mesh);
|
2011-12-03 08:40:32 +01:00
|
|
|
|
2020-06-07 19:14:00 +03:00
|
|
|
/*
|
|
|
|
Check if mesh has valid normals and return true if it does.
|
|
|
|
We assume normal to be valid when it's 0 < length < Inf. and not NaN
|
|
|
|
*/
|
|
|
|
bool checkMeshNormals(scene::IMesh *mesh);
|
2023-08-24 10:50:47 +02:00
|
|
|
|
|
|
|
/*
|
|
|
|
Set the MinFilter, MagFilter and AnisotropicFilter properties of a texture
|
|
|
|
layer according to the three relevant boolean values found in the Minetest
|
|
|
|
settings.
|
2024-08-16 11:53:31 +02:00
|
|
|
*/
|
2023-08-24 10:50:47 +02:00
|
|
|
void setMaterialFilters(video::SMaterialLayer &tex, bool bilinear, bool trilinear, bool anisotropic);
|