Fix debug mode assert in subd code after recent refactoring.
authorBrecht Van Lommel <brechtvanlommel@gmail.com>
Sun, 29 May 2016 09:16:27 +0000 (11:16 +0200)
committerBrecht Van Lommel <brechtvanlommel@gmail.com>
Sun, 29 May 2016 18:30:16 +0000 (20:30 +0200)
intern/cycles/app/cycles_xml.cpp
intern/cycles/subd/subd_dice.cpp

index 896a4906161a4a790ce22a914c20d8961a0043c4..f501a01e14b7fc2fa0ef21474a5fad6eca960aa0 100644 (file)
@@ -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;
 
index daf0f63d6950d2735178df463ba40743c12bb93f..9542ac48edab10552cf01d8c15f9a49302e9834f 100644 (file)
@@ -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);