[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [58234] trunk/blender/intern/cycles: Fix some unnecessary memory allocation slowness in cycles mesh export.

Brecht Van Lommel brechtvanlommel at pandora.be
Sun Jul 14 14:51:42 CEST 2013


Revision: 58234
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58234
Author:   blendix
Date:     2013-07-14 12:51:41 +0000 (Sun, 14 Jul 2013)
Log Message:
-----------
Fix some unnecessary memory allocation slowness in cycles mesh export.

Modified Paths:
--------------
    trunk/blender/intern/cycles/blender/blender_mesh.cpp
    trunk/blender/intern/cycles/render/mesh.cpp
    trunk/blender/intern/cycles/render/mesh.h

Modified: trunk/blender/intern/cycles/blender/blender_mesh.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_mesh.cpp	2013-07-14 12:30:05 UTC (rev 58233)
+++ trunk/blender/intern/cycles/blender/blender_mesh.cpp	2013-07-14 12:51:41 UTC (rev 58234)
@@ -212,13 +212,27 @@
 
 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::tessfaces_iterator f;
 
-	for(b_mesh.vertices.begin(v); v != b_mesh.vertices.end(); ++v)
-		mesh->verts.push_back(get_float3(v->co()));
+	for(b_mesh.tessfaces.begin(f); f != b_mesh.tessfaces.end(); ++f) {
+		int4 vi = get_int4(f->vertices_raw());
+		numtris += (vi[3] == 0)? 1: 2;
+	}
 
-	/* create vertex normals */
+	/* 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());
+
 	Attribute *attr_N = mesh->attributes.add(ATTR_STD_VERTEX_NORMAL);
 	float3 *N = attr_N->data_float3();
 
@@ -226,10 +240,10 @@
 		*N = get_float3(v->normal());
 
 	/* create faces */
-	BL::Mesh::tessfaces_iterator f;
-	vector<int> nverts;
+	vector<int> nverts(numfaces);
+	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());
 		int n = (vi[3] == 0)? 3: 4;
 		int mi = clamp(f->material_index(), 0, used_shaders.size()-1);
@@ -239,18 +253,18 @@
 		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 ||
 				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->add_triangle(vi[2], vi[3], vi[1], shader, smooth);
+				mesh->set_triangle(ti++, vi[0], vi[1], vi[3], shader, smooth);
+				mesh->set_triangle(ti++, vi[2], vi[3], vi[1], shader, smooth);
 			}
 			else {
-				mesh->add_triangle(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[1], vi[2], shader, smooth);
+				mesh->set_triangle(ti++, vi[0], vi[2], vi[3], shader, smooth);
 			}
 		}
 		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 */

Modified: trunk/blender/intern/cycles/render/mesh.cpp
===================================================================
--- trunk/blender/intern/cycles/render/mesh.cpp	2013-07-14 12:30:05 UTC (rev 58233)
+++ trunk/blender/intern/cycles/render/mesh.cpp	2013-07-14 12:51:41 UTC (rev 58234)
@@ -98,6 +98,18 @@
 	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_)
 {
 	Triangle tri;

Modified: trunk/blender/intern/cycles/render/mesh.h
===================================================================
--- trunk/blender/intern/cycles/render/mesh.h	2013-07-14 12:30:05 UTC (rev 58233)
+++ trunk/blender/intern/cycles/render/mesh.h	2013-07-14 12:51:41 UTC (rev 58234)
@@ -110,6 +110,7 @@
 
 	void reserve(int numverts, int numfaces, int numcurves, int numcurvekeys);
 	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_curve_key(float3 loc, float radius);
 	void add_curve(int first_key, int num_keys, int shader);




More information about the Bf-blender-cvs mailing list