diff options
author | Bastien Montagne <montagne29@wanadoo.fr> | 2014-04-13 14:51:06 +0400 |
---|---|---|
committer | Bastien Montagne <montagne29@wanadoo.fr> | 2014-04-13 14:51:13 +0400 |
commit | e29698d3cdeb57b4a765d9c3c7ce2a3bb37606fb (patch) | |
tree | 2137956ccc06095765311a5df94c5ea49eb6ec46 /intern/cycles/render | |
parent | 776f8d5a6fa00403e6c46887fbb19956edbd4f05 (diff) |
Split Normals I (5/5): Add support of split normals to Cycles.
Idea and code by Brecht, many thanks!
Reviewers: brecht
Reviewed By: brecht
CC: campbellbarton, dingto
Differential Revision: https://developer.blender.org/D369
Diffstat (limited to 'intern/cycles/render')
-rw-r--r-- | intern/cycles/render/attribute.cpp | 8 | ||||
-rw-r--r-- | intern/cycles/render/attribute.h | 1 | ||||
-rw-r--r-- | intern/cycles/render/mesh.cpp | 16 | ||||
-rw-r--r-- | intern/cycles/render/mesh.h | 1 |
4 files changed, 26 insertions, 0 deletions
diff --git a/intern/cycles/render/attribute.cpp b/intern/cycles/render/attribute.cpp index ce232e90ffc..14805b6f11a 100644 --- a/intern/cycles/render/attribute.cpp +++ b/intern/cycles/render/attribute.cpp @@ -96,6 +96,14 @@ void Attribute::add(const VoxelAttribute& f) buffer.push_back(data[i]); } +void Attribute::add(const char *data) +{ + size_t size = data_sizeof(); + + for(size_t i = 0; i < size; i++) + buffer.push_back(data[i]); +} + size_t Attribute::data_sizeof() const { if(element == ATTR_ELEMENT_VOXEL) diff --git a/intern/cycles/render/attribute.h b/intern/cycles/render/attribute.h index 3dc7b7f7401..9fc32db8444 100644 --- a/intern/cycles/render/attribute.h +++ b/intern/cycles/render/attribute.h @@ -82,6 +82,7 @@ public: void add(const float3& f); void add(const Transform& f); void add(const VoxelAttribute& f); + void add(const char *data); static bool same_storage(TypeDesc a, TypeDesc b); static const char *standard_name(AttributeStandard std); diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp index 2ae15e09efb..ddcc42a9ae9 100644 --- a/intern/cycles/render/mesh.cpp +++ b/intern/cycles/render/mesh.cpp @@ -134,6 +134,22 @@ void Mesh::clear() transform_normal = transform_identity(); } +int Mesh::split_vertex(int vertex) +{ + /* copy vertex location and vertex attributes */ + verts.push_back(verts[vertex]); + + foreach(Attribute& attr, attributes.attributes) { + if(attr.element == ATTR_ELEMENT_VERTEX) { + vector<char> tmp(attr.data_sizeof()); + memcpy(&tmp[0], attr.data() + tmp.size()*vertex, tmp.size()); + attr.add(&tmp[0]); + } + } + + return verts.size() - 1; +} + void Mesh::set_triangle(int i, 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 eec20acd3a9..247e3dd555e 100644 --- a/intern/cycles/render/mesh.h +++ b/intern/cycles/render/mesh.h @@ -114,6 +114,7 @@ public: 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); + int split_vertex(int vertex); void compute_bounds(); void add_face_normals(); |