summaryrefslogtreecommitdiffstats
path: root/scene/resources/immediate_mesh.cpp
diff options
context:
space:
mode:
authorRémi Verschelde <rverschelde@gmail.com>2023-10-05 22:48:55 +0200
committerRémi Verschelde <rverschelde@gmail.com>2023-10-05 22:48:55 +0200
commitf02695cc046d8b360ded35609b4cbc12a44f6d1d (patch)
tree2ff830912284eeb21026bce2b9419b3996f5a3ea /scene/resources/immediate_mesh.cpp
parent7ee2eb5c924d369b529005c73271e739fd208fb7 (diff)
parent51ed3aef63c0fdfc7666c004cc6d94dd15322d81 (diff)
downloadredot-engine-f02695cc046d8b360ded35609b4cbc12a44f6d1d.tar.gz
Merge pull request #81138 from clayjohn/attribute-compression
Vertex and attribute compression
Diffstat (limited to 'scene/resources/immediate_mesh.cpp')
-rw-r--r--scene/resources/immediate_mesh.cpp16
1 files changed, 8 insertions, 8 deletions
diff --git a/scene/resources/immediate_mesh.cpp b/scene/resources/immediate_mesh.cpp
index 48d609da97..dbc74d7c87 100644
--- a/scene/resources/immediate_mesh.cpp
+++ b/scene/resources/immediate_mesh.cpp
@@ -149,7 +149,7 @@ void ImmediateMesh::surface_end() {
ERR_FAIL_COND_MSG(!surface_active, "Not creating any surface. Use surface_begin() to do it.");
ERR_FAIL_COND_MSG(!vertices.size(), "No vertices were added, surface can't be created.");
- uint32_t format = ARRAY_FORMAT_VERTEX;
+ uint64_t format = ARRAY_FORMAT_VERTEX | ARRAY_FLAG_FORMAT_CURRENT_VERSION;
uint32_t vertex_stride = 0;
if (active_surface_data.vertex_2d) {
@@ -158,18 +158,18 @@ void ImmediateMesh::surface_end() {
} else {
vertex_stride = sizeof(float) * 3;
}
-
+ uint32_t normal_tangent_stride = 0;
uint32_t normal_offset = 0;
if (uses_normals) {
format |= ARRAY_FORMAT_NORMAL;
- normal_offset = vertex_stride;
- vertex_stride += sizeof(uint32_t);
+ normal_offset = vertex_stride * vertices.size();
+ normal_tangent_stride += sizeof(uint32_t);
}
uint32_t tangent_offset = 0;
if (uses_tangents) {
format |= ARRAY_FORMAT_TANGENT;
- tangent_offset += vertex_stride;
- vertex_stride += sizeof(uint32_t);
+ tangent_offset = vertex_stride * vertices.size() + normal_tangent_stride;
+ normal_tangent_stride += sizeof(uint32_t);
}
AABB aabb;
@@ -192,7 +192,7 @@ void ImmediateMesh::surface_end() {
}
}
if (uses_normals) {
- uint32_t *normal = (uint32_t *)&surface_vertex_ptr[i * vertex_stride + normal_offset];
+ uint32_t *normal = (uint32_t *)&surface_vertex_ptr[i * normal_tangent_stride + normal_offset];
Vector2 n = normals[i].octahedron_encode();
@@ -203,7 +203,7 @@ void ImmediateMesh::surface_end() {
*normal = value;
}
if (uses_tangents) {
- uint32_t *tangent = (uint32_t *)&surface_vertex_ptr[i * vertex_stride + tangent_offset];
+ uint32_t *tangent = (uint32_t *)&surface_vertex_ptr[i * normal_tangent_stride + tangent_offset];
Vector2 t = tangents[i].normal.octahedron_tangent_encode(tangents[i].d);
uint32_t value = 0;
value |= (uint16_t)CLAMP(t.x * 65535, 0, 65535);