Compile fix.

This commit is contained in:
Relintai 2020-01-20 15:10:30 +01:00
parent 531599dd1d
commit 7e8cbc1fb5
5 changed files with 97 additions and 123 deletions

View File

@ -1,10 +1,21 @@
#include "mesh_simplifier.h" #include "mesh_simplifier.h"
#include "../voxel_mesher.h"
//Mesh Simplification //Mesh Simplification
//Mesh Simplification //Mesh Simplification
//Ported from https://github.com/Whinarn/UnityMeshSimplifier //Ported from https://github.com/Whinarn/UnityMeshSimplifier
//Original license: MIT License Copyright (c) 2017 Mattias Edlund //Original license: MIT License Copyright (c) 2017 Mattias Edlund
void MeshSimplifier::initialize_mesh_simplify() { void MeshSimplifier::initialize(Ref<VoxelMesher> mesher) {
_mesher = mesher;
_vertices = mesher->get_vertices();
_normals = mesher->get_normals();
_colors = mesher->get_colors();
_uvs = mesher->get_uvs();
_uv2s = mesher->get_uv2s();
_indices = mesher->get_indices();
if ((_indices.size() % 3) != 0) if ((_indices.size() % 3) != 0)
ERR_FAIL_MSG("The index array length must be a multiple of 3 in order to represent triangles."); ERR_FAIL_MSG("The index array length must be a multiple of 3 in order to represent triangles.");
@ -18,6 +29,10 @@ void MeshSimplifier::initialize_mesh_simplify() {
int v2 = _indices[offset + 2]; int v2 = _indices[offset + 2];
_mu_triangles[i] = MUTriangle(v0, v1, v2, 0); _mu_triangles[i] = MUTriangle(v0, v1, v2, 0);
} }
for (int i = 0; i < _vertices.size(); ++i) {
_mu_vertices.append(MUVertex(_vertices[i]));
}
} }
//private ResizableArray<Triangle> triangles = null; //private ResizableArray<Triangle> triangles = null;
@ -359,9 +374,6 @@ void MeshSimplifier::CompactMesh() {
_mu_vertices[i].tcount = 0; _mu_vertices[i].tcount = 0;
} }
//int lastSubMeshIndex = -1;
//subMeshOffsets = new int[subMeshCount];
for (int i = 0; i < _mu_triangles.size(); i++) { for (int i = 0; i < _mu_triangles.size(); i++) {
MUTriangle triangle = _mu_triangles[i]; MUTriangle triangle = _mu_triangles[i];
@ -370,9 +382,7 @@ void MeshSimplifier::CompactMesh() {
int iDest = triangle.va0; int iDest = triangle.va0;
int iSrc = triangle.v0; int iSrc = triangle.v0;
_mu_vertices[iDest].p = _mu_vertices[iSrc].p; _mu_vertices[iDest].p = _mu_vertices[iSrc].p;
if (vertBoneWeights != null) {
vertBoneWeights[iDest] = vertBoneWeights[iSrc];
}
triangle.v0 = triangle.va0; triangle.v0 = triangle.va0;
} }
@ -380,9 +390,7 @@ void MeshSimplifier::CompactMesh() {
int iDest = triangle.va1; int iDest = triangle.va1;
int iSrc = triangle.v1; int iSrc = triangle.v1;
_mu_vertices[iDest].p = _mu_vertices[iSrc].p; _mu_vertices[iDest].p = _mu_vertices[iSrc].p;
if (vertBoneWeights != null) {
vertBoneWeights[iDest] = vertBoneWeights[iSrc];
}
triangle.v1 = triangle.va1; triangle.v1 = triangle.va1;
} }
@ -390,80 +398,40 @@ void MeshSimplifier::CompactMesh() {
int iDest = triangle.va2; int iDest = triangle.va2;
int iSrc = triangle.v2; int iSrc = triangle.v2;
_mu_vertices[iDest].p = _mu_vertices[iSrc].p; _mu_vertices[iDest].p = _mu_vertices[iSrc].p;
if (vertBoneWeights != null) {
vertBoneWeights[iDest] = vertBoneWeights[iSrc];
}
triangle.v2 = triangle.va2; triangle.v2 = triangle.va2;
} }
int newTriangleIndex = dst++; int newTriangleIndex = ++dst;
_mu_triangles[newTriangleIndex] = triangle; _mu_triangles[newTriangleIndex] = triangle;
_mu_vertices[triangle.v0].tcount = 1; _mu_vertices[triangle.v0].tcount = 1;
_mu_vertices[triangle.v1].tcount = 1; _mu_vertices[triangle.v1].tcount = 1;
_mu_vertices[triangle.v2].tcount = 1; _mu_vertices[triangle.v2].tcount = 1;
//if (triangle.subMeshIndex > lastSubMeshIndex) {
// for (int j = lastSubMeshIndex + 1; j < triangle.subMeshIndex; j++) {
// subMeshOffsets[j] = newTriangleIndex;
// }
// subMeshOffsets[triangle.subMeshIndex] = newTriangleIndex;
// lastSubMeshIndex = triangle.subMeshIndex;
//}
} }
} }
//triangleCount = dst;
//for (int i = lastSubMeshIndex + 1; i < subMeshCount; i++) {
// subMeshOffsets[i] = triangleCount;
//}
_mu_triangles.resize(dst); _mu_triangles.resize(dst);
dst = 0; dst = 0;
for (int i = 0; i < vertexCount; i++) { for (int i = 0; i < _mu_vertices.size(); i++) {
var vert = vertices[i]; MUVertex vert = _mu_vertices[i];
if (vert.tcount > 0) { if (vert.tcount > 0) {
vert.tstart = dst; vert.tstart = dst;
vertices[i] = vert; _mu_vertices[i] = vert;
if (dst != i) { if (dst != i) {
vertices[dst].p = vert.p; _mu_vertices[dst].p = vert.p;
if (vertNormals != null) vertNormals[dst] = vertNormals[i];
if (vertTangents != null) vertTangents[dst] = vertTangents[i];
if (vertUV2D != null) {
for (int j = 0; j < UVChannelCount; j++) {
var vertUV = vertUV2D[j];
if (vertUV != null) {
vertUV[dst] = vertUV[i];
}
}
}
if (vertUV3D != null) {
for (int j = 0; j < UVChannelCount; j++) {
var vertUV = vertUV3D[j];
if (vertUV != null) {
vertUV[dst] = vertUV[i];
}
}
}
if (vertUV4D != null) {
for (int j = 0; j < UVChannelCount; j++) {
var vertUV = vertUV4D[j];
if (vertUV != null) {
vertUV[dst] = vertUV[i];
}
}
}
if (vertColors != null) vertColors[dst] = vertColors[i];
if (vertBoneWeights != null) vertBoneWeights[dst] = vertBoneWeights[i];
if (blendShapes != null) { if (_normals.size() > 0) _normals[dst] = _normals[i];
for (int shapeIndex = 0; shapeIndex < this.blendShapes.Length; shapeIndex++) {
blendShapes[shapeIndex].MoveVertexElement(dst, i); if (_colors.size() > 0) _colors.set(dst, _colors[i]);
} if (_uvs.size() > 0) _uvs.set(dst, _uvs[i]);
} if (_uv2s.size() > 0) _uv2s.set(dst, _uv2s[i]);
if (_indices.size() > 0) _indices.set(dst, _indices[i]);
} }
++dst; ++dst;
} }
} }
@ -477,20 +445,12 @@ void MeshSimplifier::CompactMesh() {
} }
//vertexCount = dst; //vertexCount = dst;
this.vertices.Resize(dst); _vertices.resize(dst);
if (vertNormals != null) this.vertNormals.Resize(vertexCount, true); if (_normals.size() > 0) _normals.resize(dst);
if (vertTangents != null) this.vertTangents.Resize(vertexCount, true); if (_colors.size() > 0) _colors.resize(dst);
if (vertUV2D != null) this.vertUV2D.Resize(vertexCount, true); if (_uvs.size() > 0) _uvs.resize(dst);
if (vertUV3D != null) this.vertUV3D.Resize(vertexCount, true); if (_uv2s.size() > 0) _uv2s.resize(dst);
if (vertUV4D != null) this.vertUV4D.Resize(vertexCount, true); if (_indices.size() > 0) _indices.resize(dst);
if (vertColors != null) this.vertColors.Resize(vertexCount, true);
if (vertBoneWeights != null) this.vertBoneWeights.Resize(vertexCount, true);
if (blendShapes != null) {
for (int i = 0; i < this.blendShapes.Length; i++) {
blendShapes[i].Resize(vertexCount, false);
}
}
} }
bool MeshSimplifier::AreUVsTheSame(int channel, int indexA, int indexB) { bool MeshSimplifier::AreUVsTheSame(int channel, int indexA, int indexB) {
@ -581,8 +541,10 @@ int MeshSimplifier::RemoveVertexPass(int startTrisCount, int targetTrisCount, do
if (tcount <= _mu_vertices[i0].tcount) { if (tcount <= _mu_vertices[i0].tcount) {
// save ram // save ram
if (tcount > 0) { if (tcount > 0) {
var refsArr = refs.Data; int dests = _mu_vertices[i0].tstart;
Array.Copy(refsArr, tstart, refsArr, _mu_vertices[i0].tstart, tcount); for (int v = 0; v < tcount; ++v) {
_mu_refs[v + tstart] = _mu_refs[v + dests];
}
} }
} else { } else {
// append // append
@ -736,32 +698,28 @@ Vector3 MeshSimplifier::CalculateBarycentricCoords(Vector3 const &point, Vector3
} }
void MeshSimplifier::InterpolateVertexAttributes(int dst, int i0, int i1, int i2, Vector3 &barycentricCoord) { void MeshSimplifier::InterpolateVertexAttributes(int dst, int i0, int i1, int i2, Vector3 &barycentricCoord) {
if (vertNormals != null) { if (_normals.size() > 0) {
vertNormals[dst] = Vector3.Normalize((vertNormals[i0] * barycentricCoord.x) + (vertNormals[i1] * barycentricCoord.y) + (vertNormals[i2] * barycentricCoord.z)); _normals[dst] = (_normals[i0] * barycentricCoord.x) + (_normals[i1] * barycentricCoord.y) + (_normals[i2] * barycentricCoord.z).normalized();
} }
if (vertTangents != null) { if (_uvs.size() > 0) {
vertTangents[dst] = NormalizeTangent((vertTangents[i0] * barycentricCoord.x) + (vertTangents[i1] * barycentricCoord.y) + (vertTangents[i2] * barycentricCoord.z)); _uvs[dst] = (_uvs[i0] * barycentricCoord.x) + (_uvs[i1] * barycentricCoord.y) + (_uvs[i2] * barycentricCoord.z);
} }
if (vertUV2D != null) { if (_uv2s.size() > 0) {
for (int i = 0; i < UVChannelCount; i++) { _uv2s[dst] = (_uv2s[i0] * barycentricCoord.x) + (_uv2s[i1] * barycentricCoord.y) + (_uv2s[i2] * barycentricCoord.z);
var vertUV = vertUV2D[i];
if (vertUV != null) {
vertUV[dst] = (vertUV[i0] * barycentricCoord.x) + (vertUV[i1] * barycentricCoord.y) + (vertUV[i2] * barycentricCoord.z);
}
}
} }
if (vertColors != null) { if (_colors.size() > 0) {
vertColors[dst] = (vertColors[i0] * barycentricCoord.x) + (vertColors[i1] * barycentricCoord.y) + (vertColors[i2] * barycentricCoord.z); _colors[dst] = (_colors[i0] * barycentricCoord.x) + (_colors[i1] * barycentricCoord.y) + (_colors[i2] * barycentricCoord.z);
} }
if (blendShapes != null) {
for (int i = 0; i < blendShapes.Length; i++) {
blendShapes[i].InterpolateVertexAttributes(dst, i0, i1, i2, barycentricCoord);
}
}
// TODO: How do we interpolate the bone weights? Do we have to?
} }
MeshSimplifier::MeshSimplifier() {
maxIterationCount = 100;
agressiveness = 7.0;
enableSmartLink = true;
preserveBorderEdges = false;
preserveUVSeamEdges = false;
preserveUVFoldoverEdges = false;
}

View File

@ -4,10 +4,14 @@
#include "mesh_utils.h" #include "mesh_utils.h"
#include "core/pool_vector.h" #include "core/pool_vector.h"
#include "core/resource.h"
class VoxelMesher;
class MeshSimplifier { class MeshSimplifier {
void initialize_mesh_simplify(); public:
void initialize(Ref<VoxelMesher> mesher);
void SimplifyMesh(float quality); void SimplifyMesh(float quality);
void SimplifyMeshLossless(); void SimplifyMeshLossless();
void UpdateMesh(int iteration); void UpdateMesh(int iteration);
@ -26,10 +30,22 @@ class MeshSimplifier {
return (val1 < val2 ? (val1 < val3 ? val1 : val3) : (val2 < val3 ? val2 : val3)); return (val1 < val2 ? (val1 < val3 ? val1 : val3) : (val2 < val3 ? val2 : val3));
} }
MeshSimplifier();
private:
PoolVector<Vector3> _vertices;
PoolVector<Vector3> _normals;
PoolVector<Color> _colors;
PoolVector<Vector2> _uvs;
PoolVector<Vector2> _uv2s;
PoolVector<int> _indices;
PoolVector<MUTriangle> _mu_triangles; PoolVector<MUTriangle> _mu_triangles;
PoolVector<MUVertex> _mu_vertices; PoolVector<MUVertex> _mu_vertices;
PoolVector<MURef> _mu_refs; PoolVector<MURef> _mu_refs;
Ref<VoxelMesher> _mesher;
double vertexLinkDistanceSqr = std::numeric_limits<double>::epsilon(); double vertexLinkDistanceSqr = std::numeric_limits<double>::epsilon();
int maxIterationCount; int maxIterationCount;
double agressiveness; double agressiveness;

View File

@ -353,6 +353,15 @@ struct MUVertex {
bool uvSeamEdge; bool uvSeamEdge;
bool uvFoldoverEdge; bool uvFoldoverEdge;
MUVertex(float x, float y, float z) {
p = Vector3(x, y, z);
tstart = 0;
tcount = 0;
borderEdge = true;
uvSeamEdge = false;
uvFoldoverEdge = false;
}
MUVertex(Vector3 point) { MUVertex(Vector3 point) {
p = point; p = point;
tstart = 0; tstart = 0;

View File

@ -537,7 +537,7 @@ PoolVector<Vector3> VoxelMesher::get_vertices() {
return _vertices; return _vertices;
} }
void VoxelMesher::set_vertices(PoolVector<Vector3> values) { void VoxelMesher::set_vertices(const PoolVector<Vector3> &values) {
_vertices = values; _vertices = values;
} }
@ -561,7 +561,7 @@ PoolVector<Vector3> VoxelMesher::get_normals() {
return _normals; return _normals;
} }
void VoxelMesher::set_normals(PoolVector<Vector3> values) { void VoxelMesher::set_normals(const PoolVector<Vector3> &values) {
_normals = values; _normals = values;
} }
@ -585,7 +585,7 @@ PoolVector<Color> VoxelMesher::get_colors() {
return _colors; return _colors;
} }
void VoxelMesher::set_colors(PoolVector<Color> values) { void VoxelMesher::set_colors(const PoolVector<Color> &values) {
_colors = values; _colors = values;
} }
@ -609,7 +609,7 @@ PoolVector<Vector2> VoxelMesher::get_uvs() {
return _uvs; return _uvs;
} }
void VoxelMesher::set_uvs(PoolVector<Vector2> values) { void VoxelMesher::set_uvs(const PoolVector<Vector2> &values) {
_uvs = values; _uvs = values;
} }
@ -633,7 +633,7 @@ PoolVector<Vector2> VoxelMesher::get_uv2s() {
return _uv2s; return _uv2s;
} }
void VoxelMesher::set_uv2s(PoolVector<Vector2> values) { void VoxelMesher::set_uv2s(const PoolVector<Vector2> &values) {
_uv2s = values; _uv2s = values;
} }
@ -657,7 +657,7 @@ PoolVector<int> VoxelMesher::get_indices() {
return _indices; return _indices;
} }
void VoxelMesher::set_indices(PoolVector<int> values) { void VoxelMesher::set_indices(const PoolVector<int> values) {
_indices = values; _indices = values;
} }
@ -695,13 +695,6 @@ VoxelMesher::VoxelMesher() {
_uv_margin = Rect2(0, 0, 1, 1); _uv_margin = Rect2(0, 0, 1, 1);
_surface_tool.instance(); _surface_tool.instance();
maxIterationCount = 100;
agressiveness = 7.0;
enableSmartLink = true;
preserveBorderEdges = false;
preserveUVSeamEdges = false;
preserveUVFoldoverEdges = false;
} }
VoxelMesher::~VoxelMesher() { VoxelMesher::~VoxelMesher() {

View File

@ -17,8 +17,6 @@
#include "scene/resources/mesh.h" #include "scene/resources/mesh.h"
#include "scene/resources/surface_tool.h" #include "scene/resources/surface_tool.h"
#include "mesh_utils.h"
#include "../../mesh_data_resource/mesh_data_resource.h" #include "../../mesh_data_resource/mesh_data_resource.h"
#include "../library/voxelman_library.h" #include "../library/voxelman_library.h"
@ -79,42 +77,42 @@ public:
void build_mesh(RID mesh); void build_mesh(RID mesh);
PoolVector<Vector3> get_vertices(); PoolVector<Vector3> get_vertices();
void set_vertices(PoolVector<Vector3> values); void set_vertices(const PoolVector<Vector3> &values);
int get_vertex_count(); int get_vertex_count();
Vector3 get_vertex(int idx); Vector3 get_vertex(int idx);
void remove_vertex(int idx); void remove_vertex(int idx);
void add_vertex(Vector3 vertex); void add_vertex(Vector3 vertex);
PoolVector<Vector3> get_normals(); PoolVector<Vector3> get_normals();
void set_normals(PoolVector<Vector3> values); void set_normals(const PoolVector<Vector3> &values);
int get_normal_count(); int get_normal_count();
Vector3 get_normal(int idx); Vector3 get_normal(int idx);
void remove_normal(int idx); void remove_normal(int idx);
void add_normal(Vector3 normal); void add_normal(Vector3 normal);
PoolVector<Color> get_colors(); PoolVector<Color> get_colors();
void set_colors(PoolVector<Color> values); void set_colors(const PoolVector<Color> &values);
int get_color_count(); int get_color_count();
Color get_color(int idx); Color get_color(int idx);
void remove_color(int idx); void remove_color(int idx);
void add_color(Color color); void add_color(Color color);
PoolVector<Vector2> get_uvs(); PoolVector<Vector2> get_uvs();
void set_uvs(PoolVector<Vector2> values); void set_uvs(const PoolVector<Vector2> &values);
int get_uv_count(); int get_uv_count();
Vector2 get_uv(int idx); Vector2 get_uv(int idx);
void remove_uv(int idx); void remove_uv(int idx);
void add_uv(Vector2 vector); void add_uv(Vector2 vector);
PoolVector<Vector2> get_uv2s(); PoolVector<Vector2> get_uv2s();
void set_uv2s(PoolVector<Vector2> values); void set_uv2s(const PoolVector<Vector2> &values);
int get_uv2_count(); int get_uv2_count();
Vector2 get_uv2(int idx); Vector2 get_uv2(int idx);
void remove_uv2(int idx); void remove_uv2(int idx);
void add_uv2(Vector2 vector); void add_uv2(Vector2 vector);
PoolVector<int> get_indices(); PoolVector<int> get_indices();
void set_indices(PoolVector<int> values); void set_indices(const PoolVector<int> values);
int get_indices_count(); int get_indices_count();
int get_indice(int idx); int get_indice(int idx);
void remove_indices(int idx); void remove_indices(int idx);