Fix some unnecessary memory allocation slowness in cycles mesh export.

This commit is contained in:
Brecht Van Lommel
2013-07-14 12:51:41 +00:00
parent ce6cfeca40
commit cad3406c81
3 changed files with 40 additions and 13 deletions

View File

@@ -212,13 +212,27 @@ static void mikk_compute_tangents(BL::Mesh b_mesh, BL::MeshTextureFaceLayer b_la
static void create_mesh(Scene *scene, Mesh *mesh, BL::Mesh b_mesh, const vector<uint>& used_shaders) static void create_mesh(Scene *scene, Mesh *mesh, BL::Mesh b_mesh, const vector<uint>& used_shaders)
{ {
/* create vertices */ /* count vertices and faces */
int numverts = b_mesh.vertices.length();
int numfaces = b_mesh.tessfaces.length();
int numtris = 0;
BL::Mesh::vertices_iterator v; BL::Mesh::vertices_iterator v;
BL::Mesh::tessfaces_iterator f;
for(b_mesh.vertices.begin(v); v != b_mesh.vertices.end(); ++v) for(b_mesh.tessfaces.begin(f); f != b_mesh.tessfaces.end(); ++f) {
mesh->verts.push_back(get_float3(v->co())); int4 vi = get_int4(f->vertices_raw());
numtris += (vi[3] == 0)? 1: 2;
}
/* reserve memory */
mesh->reserve(numverts, numtris, 0, 0);
/* create vertex coordinates and normals */
int i = 0;
for(b_mesh.vertices.begin(v); v != b_mesh.vertices.end(); ++v, ++i)
mesh->verts[i] = get_float3(v->co());
/* create vertex normals */
Attribute *attr_N = mesh->attributes.add(ATTR_STD_VERTEX_NORMAL); Attribute *attr_N = mesh->attributes.add(ATTR_STD_VERTEX_NORMAL);
float3 *N = attr_N->data_float3(); float3 *N = attr_N->data_float3();
@@ -226,10 +240,10 @@ static void create_mesh(Scene *scene, Mesh *mesh, BL::Mesh b_mesh, const vector<
*N = get_float3(v->normal()); *N = get_float3(v->normal());
/* create faces */ /* create faces */
BL::Mesh::tessfaces_iterator f; vector<int> nverts(numfaces);
vector<int> nverts; int fi = 0, ti = 0;
for(b_mesh.tessfaces.begin(f); f != b_mesh.tessfaces.end(); ++f) { for(b_mesh.tessfaces.begin(f); f != b_mesh.tessfaces.end(); ++f, ++fi) {
int4 vi = get_int4(f->vertices_raw()); int4 vi = get_int4(f->vertices_raw());
int n = (vi[3] == 0)? 3: 4; int n = (vi[3] == 0)? 3: 4;
int mi = clamp(f->material_index(), 0, used_shaders.size()-1); int mi = clamp(f->material_index(), 0, used_shaders.size()-1);
@@ -239,18 +253,18 @@ static void create_mesh(Scene *scene, Mesh *mesh, BL::Mesh b_mesh, const vector<
if(n == 4) { if(n == 4) {
if(len_squared(cross(mesh->verts[vi[1]] - mesh->verts[vi[0]], mesh->verts[vi[2]] - mesh->verts[vi[0]])) == 0.0f || if(len_squared(cross(mesh->verts[vi[1]] - mesh->verts[vi[0]], mesh->verts[vi[2]] - mesh->verts[vi[0]])) == 0.0f ||
len_squared(cross(mesh->verts[vi[2]] - mesh->verts[vi[0]], mesh->verts[vi[3]] - mesh->verts[vi[0]])) == 0.0f) { len_squared(cross(mesh->verts[vi[2]] - mesh->verts[vi[0]], mesh->verts[vi[3]] - mesh->verts[vi[0]])) == 0.0f) {
mesh->add_triangle(vi[0], vi[1], vi[3], shader, smooth); mesh->set_triangle(ti++, vi[0], vi[1], vi[3], shader, smooth);
mesh->add_triangle(vi[2], vi[3], vi[1], shader, smooth); mesh->set_triangle(ti++, vi[2], vi[3], vi[1], shader, smooth);
} }
else { else {
mesh->add_triangle(vi[0], vi[1], vi[2], shader, smooth); mesh->set_triangle(ti++, vi[0], vi[1], vi[2], shader, smooth);
mesh->add_triangle(vi[0], vi[2], vi[3], shader, smooth); mesh->set_triangle(ti++, vi[0], vi[2], vi[3], shader, smooth);
} }
} }
else else
mesh->add_triangle(vi[0], vi[1], vi[2], shader, smooth); mesh->set_triangle(ti++, vi[0], vi[1], vi[2], shader, smooth);
nverts.push_back(n); nverts[fi] = n;
} }
/* create vertex color attributes */ /* create vertex color attributes */

View File

@@ -98,6 +98,18 @@ void Mesh::clear()
transform_normal = transform_identity(); transform_normal = transform_identity();
} }
void Mesh::set_triangle(int i, int v0, int v1, int v2, int shader_, bool smooth_)
{
Triangle tri;
tri.v[0] = v0;
tri.v[1] = v1;
tri.v[2] = v2;
triangles[i] = tri;
shader[i] = shader_;
smooth[i] = smooth_;
}
void Mesh::add_triangle(int v0, int v1, int v2, int shader_, bool smooth_) void Mesh::add_triangle(int v0, int v1, int v2, int shader_, bool smooth_)
{ {
Triangle tri; Triangle tri;

View File

@@ -110,6 +110,7 @@ public:
void reserve(int numverts, int numfaces, int numcurves, int numcurvekeys); void reserve(int numverts, int numfaces, int numcurves, int numcurvekeys);
void clear(); void clear();
void set_triangle(int i, int v0, int v1, int v2, int shader, bool smooth);
void add_triangle(int v0, int v1, int v2, int shader, bool smooth); void add_triangle(int v0, int v1, int v2, int shader, bool smooth);
void add_curve_key(float3 loc, float radius); void add_curve_key(float3 loc, float radius);
void add_curve(int first_key, int num_keys, int shader); void add_curve(int first_key, int num_keys, int shader);