[Bf-blender-cvs] [6bbcb66] temp-cycles-microdisplacement: Sync patches from Blender to Cycles
Mai Lavelle
noreply at git.blender.org
Thu Jun 9 12:11:29 CEST 2016
Commit: 6bbcb661e8e6c672c353aa9d27193753bf10c5fe
Author: Mai Lavelle
Date: Tue Jun 7 23:41:05 2016 -0400
Branches: temp-cycles-microdisplacement
https://developer.blender.org/rB6bbcb661e8e6c672c353aa9d27193753bf10c5fe
Sync patches from Blender to Cycles
===================================================================
M intern/cycles/blender/blender_mesh.cpp
M intern/cycles/render/mesh.cpp
M intern/cycles/render/mesh.h
===================================================================
diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp
index 80db511..f6764a8 100644
--- a/intern/cycles/blender/blender_mesh.cpp
+++ b/intern/cycles/blender/blender_mesh.cpp
@@ -532,12 +532,14 @@ static void attr_create_pointiness(Scene *scene,
static void create_mesh(Scene *scene,
Mesh *mesh,
BL::Mesh& b_mesh,
- const vector<Shader*>& used_shaders)
+ const vector<Shader*>& used_shaders,
+ bool subdivision=false)
{
/* count vertices and faces */
int numverts = b_mesh.vertices.length();
int numfaces = b_mesh.tessfaces.length();
int numtris = 0;
+ int numpatches = 0;
bool use_loop_normals = b_mesh.use_auto_smooth();
BL::Mesh::vertices_iterator v;
@@ -545,11 +547,15 @@ static void create_mesh(Scene *scene,
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;
+ if(!subdivision)
+ numtris += (vi[3] == 0)? 1: 2;
+ else
+ numpatches++;
}
/* allocate memory */
mesh->reserve_mesh(numverts, numtris);
+ mesh->reserve_patches(numpatches);
/* create vertex coordinates and normals */
for(b_mesh.vertices.begin(v); v != b_mesh.vertices.end(); ++v)
@@ -611,24 +617,33 @@ static void create_mesh(Scene *scene,
}
}
- /* create triangles */
- if(n == 4) {
- if(is_zero(cross(mesh->verts[vi[1]] - mesh->verts[vi[0]], mesh->verts[vi[2]] - mesh->verts[vi[0]])) ||
- is_zero(cross(mesh->verts[vi[2]] - mesh->verts[vi[0]], mesh->verts[vi[3]] - mesh->verts[vi[0]])))
- {
- // TODO(mai): order here is probably wrong
- mesh->add_triangle(vi[0], vi[1], vi[3], shader, smooth, true);
- mesh->add_triangle(vi[2], vi[3], vi[1], shader, smooth, true);
- face_flags[fi] |= FACE_FLAG_DIVIDE_24;
- }
- else {
- mesh->add_triangle(vi[0], vi[1], vi[2], shader, smooth, true);
- mesh->add_triangle(vi[0], vi[2], vi[3], shader, smooth, true);
- face_flags[fi] |= FACE_FLAG_DIVIDE_13;
+ if(!subdivision) {
+ /* create triangles */
+ if(n == 4) {
+ if(is_zero(cross(mesh->verts[vi[1]] - mesh->verts[vi[0]], mesh->verts[vi[2]] - mesh->verts[vi[0]])) ||
+ is_zero(cross(mesh->verts[vi[2]] - mesh->verts[vi[0]], mesh->verts[vi[3]] - mesh->verts[vi[0]])))
+ {
+ // TODO(mai): order here is probably wrong
+ mesh->add_triangle(vi[0], vi[1], vi[3], shader, smooth, true);
+ mesh->add_triangle(vi[2], vi[3], vi[1], shader, smooth, true);
+ face_flags[fi] |= FACE_FLAG_DIVIDE_24;
+ }
+ else {
+ mesh->add_triangle(vi[0], vi[1], vi[2], shader, smooth, true);
+ mesh->add_triangle(vi[0], vi[2], vi[3], shader, smooth, true);
+ face_flags[fi] |= FACE_FLAG_DIVIDE_13;
+ }
}
+ else
+ mesh->add_triangle(vi[0], vi[1], vi[2], shader, smooth, false);
+ }
+ else {
+ /* create patches */
+ if(n == 4)
+ mesh->add_patch(vi[0], vi[1], vi[2], vi[3], shader, smooth);
+ else
+ mesh->add_patch(vi[0], vi[1], vi[2], shader, smooth);
}
- else
- mesh->add_triangle(vi[0], vi[1], vi[2], shader, smooth, false);
nverts[fi] = n;
}
@@ -662,8 +677,7 @@ static void create_subd_mesh(Scene *scene,
float dicing_rate,
int max_subdivisions)
{
- Mesh basemesh;
- create_mesh(scene, &basemesh, b_mesh, used_shaders);
+ create_mesh(scene, mesh, b_mesh, used_shaders, true);
SubdParams sdparams(mesh, 0, true, false);
sdparams.dicing_rate = max(0.1f, RNA_float_get(cmesh, "dicing_rate") * dicing_rate);
@@ -675,7 +689,7 @@ static void create_subd_mesh(Scene *scene,
/* tesselate */
DiagSplit dsplit(sdparams);
- basemesh.tessellate(&dsplit);
+ mesh->tessellate(&dsplit);
}
/* Sync */
@@ -788,7 +802,7 @@ Mesh *BlenderSync::sync_mesh(BL::Object& b_ob,
create_subd_mesh(scene, mesh, b_ob, b_mesh, &cmesh, used_shaders,
dicing_rate, max_subdivisions);
else
- create_mesh(scene, mesh, b_mesh, used_shaders);
+ create_mesh(scene, mesh, b_mesh, used_shaders, false);
create_mesh_volume_attributes(scene, b_ob, mesh, b_scene.frame_current());
}
diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp
index 1fc1599..4c33545 100644
--- a/intern/cycles/render/mesh.cpp
+++ b/intern/cycles/render/mesh.cpp
@@ -73,6 +73,17 @@ void Mesh::Curve::bounds_grow(const int k, const float3 *curve_keys, const float
bounds.grow(upper, mr);
}
+/* Patch */
+
+float3 Mesh::Patch::normal(const float3 *verts) const
+{
+ float3 v0 = verts[v[0]];
+ float3 v1 = verts[v[1]];
+ float3 v2 = verts[v[2]];
+
+ return safe_normalize(cross(v1 - v0, v2 - v0));
+}
+
/* Mesh */
NODE_DEFINE(Mesh)
@@ -1507,37 +1518,34 @@ bool Mesh::need_attribute(Scene * /*scene*/, ustring name)
void Mesh::tessellate(DiagSplit *split)
{
- int num_faces = num_triangles();
-
- add_face_normals();
- add_vertex_normals();
-
- Attribute *attr_fN = attributes.find(ATTR_STD_FACE_NORMAL);
- float3 *fN = attr_fN->data_float3();
+ int num_faces = patches.size();
+ /* make a copy of the vertex normals as subd code will write into them */
+ std::vector<float3> vN(verts.size());
Attribute *attr_vN = attributes.find(ATTR_STD_VERTEX_NORMAL);
- float3 *vN = attr_vN->data_float3();
+ memcpy(&vN[0], attr_vN->data_float3(), sizeof(float3)*vN.size());
for(int f = 0; f < num_faces; f++) {
- if(!forms_quad[f]) {
+ if(!patches[f].is_quad()) {
/* triangle */
LinearTrianglePatch patch;
- Triangle triangle = get_triangle(f);
+ Patch p = patches[f];
float3 *hull = patch.hull;
float3 *normals = patch.normals;
for(int i = 0; i < 3; i++) {
- hull[i] = verts[triangle.v[i]];
+ hull[i] = verts[p.v[i]];
}
- if(smooth[f]) {
+ if(p.smooth) {
for(int i = 0; i < 3; i++) {
- normals[i] = vN[triangle.v[i]];
+ normals[i] = vN[p.v[i]];
}
}
else {
+ float3 N = p.normal(&verts[0]);
for(int i = 0; i < 3; i++) {
- normals[i] = fN[f];
+ normals[i] = N;
}
}
@@ -1546,34 +1554,31 @@ void Mesh::tessellate(DiagSplit *split)
else {
/* quad */
LinearQuadPatch patch;
- Triangle triangle0 = get_triangle(f);
- Triangle triangle1 = get_triangle(f+1);
+ Patch p = patches[f];
float3 *hull = patch.hull;
float3 *normals = patch.normals;
- hull[0] = verts[triangle0.v[0]];
- hull[1] = verts[triangle0.v[1]];
- hull[3] = verts[triangle0.v[2]];
- hull[2] = verts[triangle1.v[2]];
+ for(int i = 0; i < 4; i++) {
+ hull[i] = verts[p.v[i]];
+ }
- if(smooth[f]) {
- normals[0] = vN[triangle0.v[0]];
- normals[1] = vN[triangle0.v[1]];
- normals[3] = vN[triangle0.v[2]];
- normals[2] = vN[triangle1.v[2]];
+ if(p.smooth) {
+ for(int i = 0; i < 4; i++) {
+ normals[i] = vN[p.v[i]];
+ }
}
else {
+ float3 N = p.normal(&verts[0]);
for(int i = 0; i < 4; i++) {
- normals[i] = fN[f];
+ normals[i] = N;
}
}
- split->split_quad(&patch);
+ swap(hull[2], hull[3]);
+ swap(normals[2], normals[3]);
- // consume second triangle in quad
- f++;
+ split->split_quad(&patch);
}
-
}
}
diff --git a/intern/cycles/render/mesh.h b/intern/cycles/render/mesh.h
index a1ad3c3..b8ea02c 100644
--- a/intern/cycles/render/mesh.h
+++ b/intern/cycles/render/mesh.h
@@ -96,6 +96,7 @@ public:
bool smooth;
bool is_quad() { return v[3] >= 0; }
+ float3 normal(const float3 *verts) const;
};
/* Displacement */
More information about the Bf-blender-cvs
mailing list