You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-07 12:30:27 +00:00
This stops using FBXPropertyTable as a pointer.
The base object will inherit the property table, for every FBX object, if it doesn't exist it will be ignored. The previous code was dangerous and not simple to understand, this makes the code simpler and should result in no leaks with PropertyTable. Features/Fixes: Adds ability for multiple millions of polygons to be loaded. Fixes memory leaks with tokens Fixes memory leaks with property table Fixes loading some corrupt files Fixes meshes not having a unique name to the mesh node. Opens up loading for two more versions: 7100 and 7200, up to 2020. Preliminary support for Cinema4D files in parser now, before this was not possible it would cause memory corruption, which is gone now. FBXProperties not being pointers presented simpler challenges in the long run also, fixed a bunch of bugs.
This commit is contained in:
@@ -101,20 +101,6 @@ HashMap<int, Vector2> collect_uv(const Vector<VertexData<Vector2>> *p_data, Hash
|
||||
return collection;
|
||||
}
|
||||
|
||||
typedef int Vertex;
|
||||
typedef int SurfaceId;
|
||||
typedef int PolygonId;
|
||||
typedef int DataIndex;
|
||||
|
||||
struct SurfaceData {
|
||||
Ref<SurfaceTool> surface_tool;
|
||||
OrderedHashMap<Vertex, int> lookup_table; // proposed fix is to replace lookup_table[vertex_id] to give the position of the vertices_map[int] index.
|
||||
LocalVector<Vertex> vertices_map; // this must be ordered the same as insertion <-- slow to do find() operation.
|
||||
Ref<Material> material;
|
||||
HashMap<PolygonId, Vector<DataIndex>> surface_polygon_vertex;
|
||||
Array morphs;
|
||||
};
|
||||
|
||||
EditorSceneImporterMeshNode3D *FBXMeshData::create_fbx_mesh(const ImportState &state, const FBXDocParser::MeshGeometry *p_mesh_geometry, const FBXDocParser::Model *model, bool use_compression) {
|
||||
mesh_geometry = p_mesh_geometry;
|
||||
// todo: make this just use a uint64_t FBX ID this is a copy of our original materials unfortunately.
|
||||
@@ -307,11 +293,9 @@ EditorSceneImporterMeshNode3D *FBXMeshData::create_fbx_mesh(const ImportState &s
|
||||
// Triangulate the various polygons and add the indices.
|
||||
for (const PolygonId *polygon_id = surface->surface_polygon_vertex.next(nullptr); polygon_id != nullptr; polygon_id = surface->surface_polygon_vertex.next(polygon_id)) {
|
||||
const Vector<DataIndex> *indices = surface->surface_polygon_vertex.getptr(*polygon_id);
|
||||
|
||||
triangulate_polygon(
|
||||
surface->surface_tool,
|
||||
surface,
|
||||
*indices,
|
||||
surface->vertices_map,
|
||||
vertices);
|
||||
}
|
||||
}
|
||||
@@ -336,7 +320,7 @@ EditorSceneImporterMeshNode3D *FBXMeshData::create_fbx_mesh(const ImportState &s
|
||||
morph_st->begin(Mesh::PRIMITIVE_TRIANGLES);
|
||||
|
||||
for (unsigned int vi = 0; vi < surface->vertices_map.size(); vi += 1) {
|
||||
const Vertex vertex = surface->vertices_map[vi];
|
||||
const Vertex &vertex = surface->vertices_map[vi];
|
||||
add_vertex(
|
||||
state,
|
||||
morph_st,
|
||||
@@ -398,6 +382,9 @@ EditorSceneImporterMeshNode3D *FBXMeshData::create_fbx_mesh(const ImportState &s
|
||||
|
||||
EditorSceneImporterMeshNode3D *godot_mesh = memnew(EditorSceneImporterMeshNode3D);
|
||||
godot_mesh->set_mesh(mesh);
|
||||
const String name = ImportUtils::FBXNodeToName(model->Name());
|
||||
godot_mesh->set_name(name); // hurry up compiling >.<
|
||||
mesh->set_name("mesh3d-" + name);
|
||||
return godot_mesh;
|
||||
}
|
||||
|
||||
@@ -816,8 +803,10 @@ void FBXMeshData::add_vertex(
|
||||
p_surface_tool->add_vertex((p_vertices_position[p_vertex] + p_morph_value) * p_scale);
|
||||
}
|
||||
|
||||
void FBXMeshData::triangulate_polygon(Ref<SurfaceTool> st, Vector<int> p_polygon_vertex, const Vector<Vertex> p_surface_vertex_map, const std::vector<Vector3> &p_vertices) const {
|
||||
void FBXMeshData::triangulate_polygon(SurfaceData *surface, const Vector<int> &p_polygon_vertex, const std::vector<Vector3> &p_vertices) const {
|
||||
Ref<SurfaceTool> st(surface->surface_tool);
|
||||
const int polygon_vertex_count = p_polygon_vertex.size();
|
||||
//const Vector<Vertex>& p_surface_vertex_map
|
||||
if (polygon_vertex_count == 1) {
|
||||
// point to triangle
|
||||
st->add_index(p_polygon_vertex[0]);
|
||||
@@ -856,9 +845,9 @@ void FBXMeshData::triangulate_polygon(Ref<SurfaceTool> st, Vector<int> p_polygon
|
||||
is_simple_convex = true;
|
||||
Vector3 first_vec;
|
||||
for (int i = 0; i < polygon_vertex_count; i += 1) {
|
||||
const Vector3 p1 = p_vertices[p_surface_vertex_map[p_polygon_vertex[i]]];
|
||||
const Vector3 p2 = p_vertices[p_surface_vertex_map[p_polygon_vertex[(i + 1) % polygon_vertex_count]]];
|
||||
const Vector3 p3 = p_vertices[p_surface_vertex_map[p_polygon_vertex[(i + 2) % polygon_vertex_count]]];
|
||||
const Vector3 p1 = p_vertices[surface->vertices_map[p_polygon_vertex[i]]];
|
||||
const Vector3 p2 = p_vertices[surface->vertices_map[p_polygon_vertex[(i + 1) % polygon_vertex_count]]];
|
||||
const Vector3 p3 = p_vertices[surface->vertices_map[p_polygon_vertex[(i + 2) % polygon_vertex_count]]];
|
||||
|
||||
const Vector3 edge1 = p1 - p2;
|
||||
const Vector3 edge2 = p3 - p2;
|
||||
@@ -893,7 +882,7 @@ void FBXMeshData::triangulate_polygon(Ref<SurfaceTool> st, Vector<int> p_polygon
|
||||
|
||||
std::vector<Vector3> poly_vertices(polygon_vertex_count);
|
||||
for (int i = 0; i < polygon_vertex_count; i += 1) {
|
||||
poly_vertices[i] = p_vertices[p_surface_vertex_map[p_polygon_vertex[i]]];
|
||||
poly_vertices[i] = p_vertices[surface->vertices_map[p_polygon_vertex[i]]];
|
||||
}
|
||||
|
||||
const Vector3 poly_norm = get_poly_normal(poly_vertices);
|
||||
|
||||
Reference in New Issue
Block a user