Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/intern
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2013-07-14 16:51:41 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2013-07-14 16:51:41 +0400
commitcad3406c812bf2b2c8d2994a68db0e9a68071268 (patch)
treed9efe606514e6def8ef60ae0421b34eaf654147f /intern
parentce6cfeca408213a83e0e4c9bb1d7e00c42ea52d8 (diff)
Fix some unnecessary memory allocation slowness in cycles mesh export.
Diffstat (limited to 'intern')
-rw-r--r--intern/cycles/blender/blender_mesh.cpp40
-rw-r--r--intern/cycles/render/mesh.cpp12
-rw-r--r--intern/cycles/render/mesh.h1
3 files changed, 40 insertions, 13 deletions
diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp
index 90278f215c0..9fa9e126756 100644
--- a/intern/cycles/blender/blender_mesh.cpp
+++ b/intern/cycles/blender/blender_mesh.cpp
@@ -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)
{
- /* 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;
+ }
+
+ /* 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);
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());
/* 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 @@ static void create_mesh(Scene *scene, Mesh *mesh, BL::Mesh b_mesh, const vector<
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 */
diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp
index 4a2a64bb0f3..77d4a5fe7d2 100644
--- a/intern/cycles/render/mesh.cpp
+++ b/intern/cycles/render/mesh.cpp
@@ -98,6 +98,18 @@ void Mesh::clear()
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;
diff --git a/intern/cycles/render/mesh.h b/intern/cycles/render/mesh.h
index b74c41f6453..a7703f7cabc 100644
--- a/intern/cycles/render/mesh.h
+++ b/intern/cycles/render/mesh.h
@@ -110,6 +110,7 @@ public:
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);