diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2016-05-29 12:16:27 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2016-05-29 21:30:16 +0300 |
commit | 7cd18dda7d5d952829e6024ee9798ce77a1dede0 (patch) | |
tree | f50b87376361742fcac0bcadb4a03cf5d92fc91a /intern/cycles | |
parent | e1003c2ead9d46c0f2330a90a76c29f2e827e1f8 (diff) |
Fix debug mode assert in subd code after recent refactoring.
Diffstat (limited to 'intern/cycles')
-rw-r--r-- | intern/cycles/app/cycles_xml.cpp | 5 | ||||
-rw-r--r-- | intern/cycles/subd/subd_dice.cpp | 10 |
2 files changed, 13 insertions, 2 deletions
diff --git a/intern/cycles/app/cycles_xml.cpp b/intern/cycles/app/cycles_xml.cpp index 896a4906161..f501a01e14b 100644 --- a/intern/cycles/app/cycles_xml.cpp +++ b/intern/cycles/app/cycles_xml.cpp @@ -876,6 +876,11 @@ static void xml_read_mesh(const XMLReadState& state, pugi::xml_node node) /* create vertices */ mesh->verts = P; + size_t num_triangles = 0; + for(size_t i = 0; i < nverts.size(); i++) + num_triangles += nverts[i]-2; + mesh->reserve_mesh(mesh->verts.size(), num_triangles); + /* create triangles */ int index_offset = 0; diff --git a/intern/cycles/subd/subd_dice.cpp b/intern/cycles/subd/subd_dice.cpp index daf0f63d695..9542ac48eda 100644 --- a/intern/cycles/subd/subd_dice.cpp +++ b/intern/cycles/subd/subd_dice.cpp @@ -48,7 +48,7 @@ void EdgeDice::reserve(int num_verts, int num_tris) vert_offset = mesh->verts.size(); tri_offset = mesh->triangles.size(); - mesh->resize_mesh(vert_offset + num_verts, tri_offset + num_tris); + mesh->resize_mesh(vert_offset + num_verts, tri_offset); Attribute *attr_vN = mesh->attributes.add(ATTR_STD_VERTEX_NORMAL); @@ -80,7 +80,13 @@ int EdgeDice::add_vert(Patch *patch, float2 uv) void EdgeDice::add_triangle(Patch *patch, int v0, int v1, int v2) { - params.mesh->add_triangle(v0, v1, v2, params.shader, params.smooth, false); + Mesh *mesh = params.mesh; + + /* todo: optimize so we can reserve in advance, this is like push_back_slow() */ + if(mesh->triangles.size() == mesh->triangles.capacity()) + mesh->reserve_mesh(mesh->verts.size(), size_t(max(mesh->triangles.size() + 1, 1) * 1.2)); + + mesh->add_triangle(v0, v1, v2, params.shader, params.smooth, false); if(params.ptex) { Attribute *attr_ptex_face_id = params.mesh->attributes.add(ATTR_STD_PTEX_FACE_ID); |