You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-10 13:00:37 +00:00
Reduce unnecessary COW on Vector by make writing explicit
This commit makes operator[] on Vector const and adds a write proxy to it. From now on writes to Vectors need to happen through the .write proxy. So for instance: Vector<int> vec; vec.push_back(10); std::cout << vec[0] << std::endl; vec.write[0] = 20; Failing to use the .write proxy will cause a compilation error. In addition COWable datatypes can now embed a CowData pointer to their data. This means that String, CharString, and VMap no longer use or derive from Vector. _ALWAYS_INLINE_ and _FORCE_INLINE_ are now equivalent for debug and non-debug builds. This is a lot faster for Vector in the editor and while running tests. The reason why this difference used to exist is because force-inlined methods used to give a bad debugging experience. After extensive testing with modern compilers this is no longer the case.
This commit is contained in:
@@ -120,7 +120,7 @@ Error MeshDataTool::create_from_surface(const Ref<ArrayMesh> &p_mesh, int p_surf
|
||||
v.bones.push_back(bo[i * 4 + 3]);
|
||||
}
|
||||
|
||||
vertices[i] = v;
|
||||
vertices.write[i] = v;
|
||||
}
|
||||
|
||||
PoolVector<int> indices;
|
||||
@@ -143,7 +143,7 @@ Error MeshDataTool::create_from_surface(const Ref<ArrayMesh> &p_mesh, int p_surf
|
||||
|
||||
for (int i = 0; i < icount; i += 3) {
|
||||
|
||||
Vertex *v[3] = { &vertices[r[i + 0]], &vertices[r[i + 1]], &vertices[r[i + 2]] };
|
||||
Vertex *v[3] = { &vertices.write[r[i + 0]], &vertices.write[r[i + 1]], &vertices.write[r[i + 2]] };
|
||||
|
||||
int fidx = faces.size();
|
||||
Face face;
|
||||
@@ -169,7 +169,7 @@ Error MeshDataTool::create_from_surface(const Ref<ArrayMesh> &p_mesh, int p_surf
|
||||
edges.push_back(e);
|
||||
}
|
||||
|
||||
edges[face.edges[j]].faces.push_back(fidx);
|
||||
edges.write[face.edges[j]].faces.push_back(fidx);
|
||||
v[j]->faces.push_back(fidx);
|
||||
v[j]->edges.push_back(face.edges[j]);
|
||||
}
|
||||
@@ -247,7 +247,7 @@ Error MeshDataTool::commit_to_surface(const Ref<ArrayMesh> &p_mesh) {
|
||||
|
||||
for (int i = 0; i < vcount; i++) {
|
||||
|
||||
Vertex &vtx = vertices[i];
|
||||
const Vertex &vtx = vertices[i];
|
||||
|
||||
vr[i] = vtx.vertex;
|
||||
if (nr.ptr())
|
||||
@@ -344,7 +344,7 @@ Vector3 MeshDataTool::get_vertex(int p_idx) const {
|
||||
void MeshDataTool::set_vertex(int p_idx, const Vector3 &p_vertex) {
|
||||
|
||||
ERR_FAIL_INDEX(p_idx, vertices.size());
|
||||
vertices[p_idx].vertex = p_vertex;
|
||||
vertices.write[p_idx].vertex = p_vertex;
|
||||
}
|
||||
|
||||
Vector3 MeshDataTool::get_vertex_normal(int p_idx) const {
|
||||
@@ -355,7 +355,7 @@ Vector3 MeshDataTool::get_vertex_normal(int p_idx) const {
|
||||
void MeshDataTool::set_vertex_normal(int p_idx, const Vector3 &p_normal) {
|
||||
|
||||
ERR_FAIL_INDEX(p_idx, vertices.size());
|
||||
vertices[p_idx].normal = p_normal;
|
||||
vertices.write[p_idx].normal = p_normal;
|
||||
format |= Mesh::ARRAY_FORMAT_NORMAL;
|
||||
}
|
||||
|
||||
@@ -367,7 +367,7 @@ Plane MeshDataTool::get_vertex_tangent(int p_idx) const {
|
||||
void MeshDataTool::set_vertex_tangent(int p_idx, const Plane &p_tangent) {
|
||||
|
||||
ERR_FAIL_INDEX(p_idx, vertices.size());
|
||||
vertices[p_idx].tangent = p_tangent;
|
||||
vertices.write[p_idx].tangent = p_tangent;
|
||||
format |= Mesh::ARRAY_FORMAT_TANGENT;
|
||||
}
|
||||
|
||||
@@ -379,7 +379,7 @@ Vector2 MeshDataTool::get_vertex_uv(int p_idx) const {
|
||||
void MeshDataTool::set_vertex_uv(int p_idx, const Vector2 &p_uv) {
|
||||
|
||||
ERR_FAIL_INDEX(p_idx, vertices.size());
|
||||
vertices[p_idx].uv = p_uv;
|
||||
vertices.write[p_idx].uv = p_uv;
|
||||
format |= Mesh::ARRAY_FORMAT_TEX_UV;
|
||||
}
|
||||
|
||||
@@ -391,7 +391,7 @@ Vector2 MeshDataTool::get_vertex_uv2(int p_idx) const {
|
||||
void MeshDataTool::set_vertex_uv2(int p_idx, const Vector2 &p_uv2) {
|
||||
|
||||
ERR_FAIL_INDEX(p_idx, vertices.size());
|
||||
vertices[p_idx].uv2 = p_uv2;
|
||||
vertices.write[p_idx].uv2 = p_uv2;
|
||||
format |= Mesh::ARRAY_FORMAT_TEX_UV2;
|
||||
}
|
||||
|
||||
@@ -403,7 +403,7 @@ Color MeshDataTool::get_vertex_color(int p_idx) const {
|
||||
void MeshDataTool::set_vertex_color(int p_idx, const Color &p_color) {
|
||||
|
||||
ERR_FAIL_INDEX(p_idx, vertices.size());
|
||||
vertices[p_idx].color = p_color;
|
||||
vertices.write[p_idx].color = p_color;
|
||||
format |= Mesh::ARRAY_FORMAT_COLOR;
|
||||
}
|
||||
|
||||
@@ -415,7 +415,7 @@ Vector<int> MeshDataTool::get_vertex_bones(int p_idx) const {
|
||||
void MeshDataTool::set_vertex_bones(int p_idx, const Vector<int> &p_bones) {
|
||||
|
||||
ERR_FAIL_INDEX(p_idx, vertices.size());
|
||||
vertices[p_idx].bones = p_bones;
|
||||
vertices.write[p_idx].bones = p_bones;
|
||||
format |= Mesh::ARRAY_FORMAT_BONES;
|
||||
}
|
||||
|
||||
@@ -426,7 +426,7 @@ Vector<float> MeshDataTool::get_vertex_weights(int p_idx) const {
|
||||
}
|
||||
void MeshDataTool::set_vertex_weights(int p_idx, const Vector<float> &p_weights) {
|
||||
ERR_FAIL_INDEX(p_idx, vertices.size());
|
||||
vertices[p_idx].weights = p_weights;
|
||||
vertices.write[p_idx].weights = p_weights;
|
||||
format |= Mesh::ARRAY_FORMAT_WEIGHTS;
|
||||
}
|
||||
|
||||
@@ -439,7 +439,7 @@ Variant MeshDataTool::get_vertex_meta(int p_idx) const {
|
||||
void MeshDataTool::set_vertex_meta(int p_idx, const Variant &p_meta) {
|
||||
|
||||
ERR_FAIL_INDEX(p_idx, vertices.size());
|
||||
vertices[p_idx].meta = p_meta;
|
||||
vertices.write[p_idx].meta = p_meta;
|
||||
}
|
||||
|
||||
Vector<int> MeshDataTool::get_vertex_edges(int p_idx) const {
|
||||
@@ -472,7 +472,7 @@ Variant MeshDataTool::get_edge_meta(int p_idx) const {
|
||||
void MeshDataTool::set_edge_meta(int p_idx, const Variant &p_meta) {
|
||||
|
||||
ERR_FAIL_INDEX(p_idx, edges.size());
|
||||
edges[p_idx].meta = p_meta;
|
||||
edges.write[p_idx].meta = p_meta;
|
||||
}
|
||||
|
||||
int MeshDataTool::get_face_vertex(int p_face, int p_vertex) const {
|
||||
@@ -495,7 +495,7 @@ Variant MeshDataTool::get_face_meta(int p_face) const {
|
||||
void MeshDataTool::set_face_meta(int p_face, const Variant &p_meta) {
|
||||
|
||||
ERR_FAIL_INDEX(p_face, faces.size());
|
||||
faces[p_face].meta = p_meta;
|
||||
faces.write[p_face].meta = p_meta;
|
||||
}
|
||||
|
||||
Vector3 MeshDataTool::get_face_normal(int p_face) const {
|
||||
|
||||
Reference in New Issue
Block a user