summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/oa_hash_map.h4
-rw-r--r--doc/classes/MeshDataTool.xml57
-rw-r--r--doc/classes/TileSet.xml2
-rw-r--r--editor/plugins/tile_set_editor_plugin.cpp14
-rw-r--r--main/tests/test_oa_hash_map.cpp29
5 files changed, 100 insertions, 6 deletions
diff --git a/core/oa_hash_map.h b/core/oa_hash_map.h
index 3705762d6c..9840442519 100644
--- a/core/oa_hash_map.h
+++ b/core/oa_hash_map.h
@@ -125,7 +125,7 @@ private:
while (42) {
if (hashes[pos] == EMPTY_HASH) {
- _construct(pos, hash, p_key, p_value);
+ _construct(pos, hash, key, value);
return;
}
@@ -136,7 +136,7 @@ private:
if (hashes[pos] & DELETED_HASH_BIT) {
// we found a place where we can fit in!
- _construct(pos, hash, p_key, p_value);
+ _construct(pos, hash, key, value);
return;
}
diff --git a/doc/classes/MeshDataTool.xml b/doc/classes/MeshDataTool.xml
index 43d94004a8..5c3af3e2e1 100644
--- a/doc/classes/MeshDataTool.xml
+++ b/doc/classes/MeshDataTool.xml
@@ -1,8 +1,22 @@
<?xml version="1.0" encoding="UTF-8" ?>
<class name="MeshDataTool" inherits="Reference" category="Core" version="3.1">
<brief_description>
+ Helper tool to access and edit [Mesh] data.
</brief_description>
<description>
+ The MeshDataTool provides access to individual vertices in a [Mesh]. It allows users to read and edit vertex data of meshes. It also creates an array of faces and edges.
+ To use the MeshDataTool, load a mesh with [method create_from_surface]. When you are finished editing the data commit the data to a mesh with [method commit_to_surface].
+ Below is an example of how the MeshDataTool may be used.
+ [codeblock]
+ var mdt = MeshDataTool.new()
+ mdt.create_from_surface(mesh, 0)
+ for i in range(mdt.get_vertex_count()):
+ var vertex = mdt.get_vertex(i)
+ ...
+ mdt.set_vertex(i, vertex)
+ mesh.surface_remove(0)
+ mdt.commit_to_surface(mesh)
+ [/codeblock]
</description>
<tutorials>
</tutorials>
@@ -13,6 +27,7 @@
<return type="void">
</return>
<description>
+ Clears all data currently in MeshDataTool.
</description>
</method>
<method name="commit_to_surface">
@@ -21,6 +36,7 @@
<argument index="0" name="mesh" type="ArrayMesh">
</argument>
<description>
+ Adds a new surface to specified [Mesh] with edited data.
</description>
</method>
<method name="create_from_surface">
@@ -31,12 +47,15 @@
<argument index="1" name="surface" type="int">
</argument>
<description>
+ Uses specified surface of given [Mesh] to populate data for MeshDataTool.
+ Requires [Mesh] with primitive type [code]PRIMITIVE_TRIANGLES[/code].
</description>
</method>
<method name="get_edge_count" qualifiers="const">
<return type="int">
</return>
<description>
+ Returns the number of edges in this [Mesh].
</description>
</method>
<method name="get_edge_faces" qualifiers="const">
@@ -45,6 +64,7 @@
<argument index="0" name="idx" type="int">
</argument>
<description>
+ Returns array of faces that touch given edge.
</description>
</method>
<method name="get_edge_meta" qualifiers="const">
@@ -53,6 +73,7 @@
<argument index="0" name="idx" type="int">
</argument>
<description>
+ Returns meta information assigned to given edge.
</description>
</method>
<method name="get_edge_vertex" qualifiers="const">
@@ -63,12 +84,15 @@
<argument index="1" name="vertex" type="int">
</argument>
<description>
+ Returns index of specified vertex connected to given edge.
+ Vertex argument can only be 0 or 1 because edges are comprised of two vertices.
</description>
</method>
<method name="get_face_count" qualifiers="const">
<return type="int">
</return>
<description>
+ Returns the number of faces in this [Mesh].
</description>
</method>
<method name="get_face_edge" qualifiers="const">
@@ -79,6 +103,8 @@
<argument index="1" name="edge" type="int">
</argument>
<description>
+ Returns specified edge associated with given face.
+ Edge argument must 2 or less becuase a face only has three edges.
</description>
</method>
<method name="get_face_meta" qualifiers="const">
@@ -87,6 +113,7 @@
<argument index="0" name="idx" type="int">
</argument>
<description>
+ Returns meta data associated with given face.
</description>
</method>
<method name="get_face_normal" qualifiers="const">
@@ -95,6 +122,7 @@
<argument index="0" name="idx" type="int">
</argument>
<description>
+ Calculates and returns face normal of given face.
</description>
</method>
<method name="get_face_vertex" qualifiers="const">
@@ -105,18 +133,23 @@
<argument index="1" name="vertex" type="int">
</argument>
<description>
+ Returns specified vertex of given face.
+ Vertex argument must be 2 or less becuase faces contain three vertices.
</description>
</method>
<method name="get_format" qualifiers="const">
<return type="int">
</return>
<description>
+ Returns format of [Mesh]. Format is an integer made up of [Mesh] format flags combined together. For example, a mesh containing both vertices and normals would return a format of [code]3[/code] becuase [code]ARRAY_FORMAT_VERTEX[/code] is [code]1[/code] and [code]ARRAY_FORMAT_NORMAL[/code] is [code]2[/code].
+ For list of format flags see [ArrayMesh].
</description>
</method>
<method name="get_material" qualifiers="const">
<return type="Material">
</return>
<description>
+ Returns material assigned to the [Mesh].
</description>
</method>
<method name="get_vertex" qualifiers="const">
@@ -125,6 +158,7 @@
<argument index="0" name="idx" type="int">
</argument>
<description>
+ Returns the vertex at given index.
</description>
</method>
<method name="get_vertex_bones" qualifiers="const">
@@ -133,6 +167,7 @@
<argument index="0" name="idx" type="int">
</argument>
<description>
+ Returns the bones of the given vertex.
</description>
</method>
<method name="get_vertex_color" qualifiers="const">
@@ -141,12 +176,14 @@
<argument index="0" name="idx" type="int">
</argument>
<description>
+ Returns the color of the given vertex.
</description>
</method>
<method name="get_vertex_count" qualifiers="const">
<return type="int">
</return>
<description>
+ Returns the total number of vertices in [Mesh].
</description>
</method>
<method name="get_vertex_edges" qualifiers="const">
@@ -155,6 +192,7 @@
<argument index="0" name="idx" type="int">
</argument>
<description>
+ Returns array of edges that share given vertex.
</description>
</method>
<method name="get_vertex_faces" qualifiers="const">
@@ -163,6 +201,7 @@
<argument index="0" name="idx" type="int">
</argument>
<description>
+ Returns array of faces that share given vertex.
</description>
</method>
<method name="get_vertex_meta" qualifiers="const">
@@ -171,6 +210,7 @@
<argument index="0" name="idx" type="int">
</argument>
<description>
+ Returns meta data associated with given vertex.
</description>
</method>
<method name="get_vertex_normal" qualifiers="const">
@@ -179,6 +219,7 @@
<argument index="0" name="idx" type="int">
</argument>
<description>
+ Returns normal of given vertex.
</description>
</method>
<method name="get_vertex_tangent" qualifiers="const">
@@ -187,6 +228,7 @@
<argument index="0" name="idx" type="int">
</argument>
<description>
+ Returns tangent of given vertex.
</description>
</method>
<method name="get_vertex_uv" qualifiers="const">
@@ -195,6 +237,7 @@
<argument index="0" name="idx" type="int">
</argument>
<description>
+ Returns UV of given vertex.
</description>
</method>
<method name="get_vertex_uv2" qualifiers="const">
@@ -203,6 +246,7 @@
<argument index="0" name="idx" type="int">
</argument>
<description>
+ Returns UV2 of given vertex.
</description>
</method>
<method name="get_vertex_weights" qualifiers="const">
@@ -211,6 +255,7 @@
<argument index="0" name="idx" type="int">
</argument>
<description>
+ Returns bone weights of given vertex.
</description>
</method>
<method name="set_edge_meta">
@@ -221,6 +266,7 @@
<argument index="1" name="meta" type="Variant">
</argument>
<description>
+ Sets the meta data of given edge.
</description>
</method>
<method name="set_face_meta">
@@ -231,6 +277,7 @@
<argument index="1" name="meta" type="Variant">
</argument>
<description>
+ Sets the meta data of given face.
</description>
</method>
<method name="set_material">
@@ -239,6 +286,7 @@
<argument index="0" name="material" type="Material">
</argument>
<description>
+ Sets the material to be used by newly constructed [Mesh].
</description>
</method>
<method name="set_vertex">
@@ -249,6 +297,7 @@
<argument index="1" name="vertex" type="Vector3">
</argument>
<description>
+ Sets the position of given vertex.
</description>
</method>
<method name="set_vertex_bones">
@@ -259,6 +308,7 @@
<argument index="1" name="bones" type="PoolIntArray">
</argument>
<description>
+ Sets the bones of given vertex.
</description>
</method>
<method name="set_vertex_color">
@@ -269,6 +319,7 @@
<argument index="1" name="color" type="Color">
</argument>
<description>
+ Sets the color of given vertex.
</description>
</method>
<method name="set_vertex_meta">
@@ -279,6 +330,7 @@
<argument index="1" name="meta" type="Variant">
</argument>
<description>
+ Sets the meta data associated with given vertex.
</description>
</method>
<method name="set_vertex_normal">
@@ -289,6 +341,7 @@
<argument index="1" name="normal" type="Vector3">
</argument>
<description>
+ Sets the normal of given vertex.
</description>
</method>
<method name="set_vertex_tangent">
@@ -299,6 +352,7 @@
<argument index="1" name="tangent" type="Plane">
</argument>
<description>
+ Sets the tangent of given vertex.
</description>
</method>
<method name="set_vertex_uv">
@@ -309,6 +363,7 @@
<argument index="1" name="uv" type="Vector2">
</argument>
<description>
+ Sets the UV of given vertex.
</description>
</method>
<method name="set_vertex_uv2">
@@ -319,6 +374,7 @@
<argument index="1" name="uv2" type="Vector2">
</argument>
<description>
+ Sets the UV2 of given vertex.
</description>
</method>
<method name="set_vertex_weights">
@@ -329,6 +385,7 @@
<argument index="1" name="weights" type="PoolRealArray">
</argument>
<description>
+ Sets the bone weights of given vertex.
</description>
</method>
</methods>
diff --git a/doc/classes/TileSet.xml b/doc/classes/TileSet.xml
index 3f0d6317a6..ffd15e8d8b 100644
--- a/doc/classes/TileSet.xml
+++ b/doc/classes/TileSet.xml
@@ -268,7 +268,7 @@
<argument index="1" name="shape_id" type="int">
</argument>
<description>
- Returns the [Transform2D] of a tile's sahpe.
+ Returns the [Transform2D] of a tile's shape.
</description>
</method>
<method name="tile_get_shapes" qualifiers="const">
diff --git a/editor/plugins/tile_set_editor_plugin.cpp b/editor/plugins/tile_set_editor_plugin.cpp
index 3de2284cea..9988d82fb8 100644
--- a/editor/plugins/tile_set_editor_plugin.cpp
+++ b/editor/plugins/tile_set_editor_plugin.cpp
@@ -569,6 +569,10 @@ void TileSetEditor::_on_textures_added(const PoolStringArray &p_paths) {
int invalid_count = 0;
for (int i = 0; i < p_paths.size(); i++) {
Ref<Texture> t = Ref<Texture>(ResourceLoader::load(p_paths[i]));
+
+ ERR_EXPLAIN("'" + p_paths[i] + "' is not a valid texture.");
+ ERR_CONTINUE(!t.is_valid());
+
if (texture_map.has(t->get_rid())) {
invalid_count++;
} else {
@@ -577,9 +581,13 @@ void TileSetEditor::_on_textures_added(const PoolStringArray &p_paths) {
texture_list->set_item_metadata(texture_list->get_item_count() - 1, t->get_rid());
}
}
- update_texture_list_icon();
- texture_list->select(texture_list->get_item_count() - 1);
- _on_texture_list_selected(texture_list->get_item_count() - 1);
+
+ if (texture_list->get_item_count() > 0) {
+ update_texture_list_icon();
+ texture_list->select(texture_list->get_item_count() - 1);
+ _on_texture_list_selected(texture_list->get_item_count() - 1);
+ }
+
if (invalid_count > 0) {
err_dialog->set_text(vformat(TTR("%s file(s) were not added because was already on the list."), String::num(invalid_count, 0)));
err_dialog->popup_centered(Size2(300, 60));
diff --git a/main/tests/test_oa_hash_map.cpp b/main/tests/test_oa_hash_map.cpp
index 26e728d3aa..deaba285cf 100644
--- a/main/tests/test_oa_hash_map.cpp
+++ b/main/tests/test_oa_hash_map.cpp
@@ -92,6 +92,35 @@ MainLoop *test() {
}
}
+ // stress test / test for issue #22928
+ {
+ OAHashMap<int, int> map;
+ int dummy;
+ const int N = 1000;
+ uint32_t *keys = new uint32_t[N];
+
+ Math::seed(0);
+
+ // insert a couple of random keys (with a dummy value, which is ignored)
+ for (int i = 0; i < N; i++) {
+ keys[i] = Math::rand();
+ map.set(keys[i], dummy);
+
+ if (!map.lookup(keys[i], dummy))
+ OS::get_singleton()->print("could not find 0x%X despite it was just inserted!\n", unsigned(keys[i]));
+ }
+
+ // check whether the keys are still present
+ for (int i = 0; i < N; i++) {
+ if (!map.lookup(keys[i], dummy)) {
+ OS::get_singleton()->print("could not find 0x%X despite it has been inserted previously! (not checking the other keys, breaking...)\n", unsigned(keys[i]));
+ break;
+ }
+ }
+
+ delete[] keys;
+ }
+
return NULL;
}
} // namespace TestOAHashMap