Skip to content

Commit 0712135

Browse files
committed
Small optim for vertex streams
1 parent 55f7843 commit 0712135

File tree

4 files changed

+28
-11
lines changed

4 files changed

+28
-11
lines changed

yave/meshes/MeshData.cpp

+10-2
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,11 @@ MeshData::MeshData(MeshVertexStreams streams, core::Span<IndexedTriangle> triang
4747
}
4848

4949
void MeshData::add_sub_mesh(const MeshVertexStreams& streams, core::Span<IndexedTriangle> triangles) {
50+
add_sub_mesh(triangles, add_vertices_from_streams(streams));
51+
}
52+
53+
u32 MeshData::add_vertices_from_streams(const MeshVertexStreams& streams) {
5054
y_debug_assert(!streams.is_empty());
51-
y_debug_assert(!triangles.is_empty());
5255

5356
// AABB
5457
{
@@ -72,7 +75,12 @@ void MeshData::add_sub_mesh(const MeshVertexStreams& streams, core::Span<Indexed
7275
const u32 vertex_offset = u32(_vertex_streams.vertex_count());
7376
_vertex_streams = _vertex_streams.merged(streams);
7477

75-
// Triangles
78+
return vertex_offset;
79+
}
80+
81+
void MeshData::add_sub_mesh(core::Span<IndexedTriangle> triangles, u32 vertex_offset) {
82+
y_debug_assert(!triangles.is_empty());
83+
7684
const u32 first_triangle = u32(_triangles.size());
7785
_triangles.set_min_capacity(_triangles.size() + triangles.size());
7886
std::transform(triangles.begin(), triangles.end(), std::back_inserter(_triangles), [=](IndexedTriangle tri) {

yave/meshes/MeshData.h

+3
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@ class MeshData {
4949
void add_sub_mesh(core::Span<FullVertex> vertices, core::Span<IndexedTriangle> triangles);
5050
void add_sub_mesh(core::Span<PackedVertex> vertices, core::Span<IndexedTriangle> triangles);
5151

52+
u32 add_vertices_from_streams(const MeshVertexStreams& streams);
53+
void add_sub_mesh(core::Span<IndexedTriangle> triangles, u32 vertex_offset);
54+
5255
float radius() const;
5356
const AABB& aabb() const;
5457

yave/meshes/MeshVertexStreams.cpp

+10-5
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,14 @@ SOFTWARE.
2626
namespace yave {
2727

2828
MeshVertexStreams::MeshVertexStreams(usize vertices) : _vertex_count(vertices) {
29+
usize offset = 0;
2930
for(usize i = 0; i != stream_count; ++i) {
3031
const usize stream_elem_size = vertex_stream_element_size(VertexStreamType(i));
3132
const usize stream_byte_size = _vertex_count * stream_elem_size;
32-
_streams[i] = core::FixedArray<u8>(stream_byte_size);
33+
_stream_offsets[i] = offset;
34+
offset += stream_byte_size;
3335
}
36+
_storage = core::FixedArray<u8>(offset);
3437
}
3538

3639
MeshVertexStreams::MeshVertexStreams(core::Span<PackedVertex> vertices) : MeshVertexStreams(vertices.size()) {
@@ -47,8 +50,8 @@ MeshVertexStreams MeshVertexStreams::merged(const MeshVertexStreams& other) cons
4750
const usize stream_elem_size = vertex_stream_element_size(type);
4851

4952
const usize stream_total_size = vertex_count() * stream_elem_size;
50-
std::memcpy(str._streams[i].data(), data(type), stream_total_size);
51-
std::memcpy(str._streams[i].data() + stream_total_size, other.data(type), other.vertex_count() * stream_elem_size);
53+
std::memcpy(str.data(type), data(type), stream_total_size);
54+
std::memcpy(str.data(type) + stream_total_size, other.data(type), other.vertex_count() * stream_elem_size);
5255
}
5356

5457
return str;
@@ -98,11 +101,13 @@ bool MeshVertexStreams::has_stream(VertexStreamType type) const {
98101
}
99102

100103
u8* MeshVertexStreams::data(VertexStreamType type) {
101-
return _streams[usize(type)].data();
104+
const usize offset = _stream_offsets[usize(type)];
105+
return _storage.data() + offset;
102106
}
103107

104108
const u8* MeshVertexStreams::data(VertexStreamType type) const {
105-
return _streams[usize(type)].data();
109+
const usize offset = _stream_offsets[usize(type)];
110+
return _storage.data() + offset;
106111
}
107112

108113
}

yave/meshes/MeshVertexStreams.h

+5-4
Original file line numberDiff line numberDiff line change
@@ -107,21 +107,22 @@ class MeshVertexStreams {
107107
}
108108

109109
inline void* vertex_stream_data(VertexStreamType type, usize index) {
110-
return _streams[usize(type)].data() + index * vertex_stream_element_size(type);
110+
return data(type) + index * vertex_stream_element_size(type);
111111
}
112112

113113
inline const void* vertex_stream_data(VertexStreamType type, usize index) const {
114-
return _streams[usize(type)].data() + index * vertex_stream_element_size(type);
114+
return data(type) + index * vertex_stream_element_size(type);
115115
}
116116

117117

118-
y_reflect(MeshVertexStreams, _vertex_count, _streams);
118+
y_reflect(MeshVertexStreams, _vertex_count, _stream_offsets, _storage);
119119

120120
private:
121121
void set_vertex(usize index, PackedVertex vertex);
122122

123123
usize _vertex_count = 0;
124-
std::array<core::FixedArray<u8>, stream_count> _streams;
124+
std::array<usize, stream_count> _stream_offsets;
125+
core::FixedArray<u8> _storage;
125126

126127
};
127128

0 commit comments

Comments
 (0)