Cycles: Fix wrong render result in certain configuration of render layer's surface/hair
There were some synchronization missing in cases when only one of those settings was disabled. Also added a render test for such configurations now.
This commit is contained in:
@@ -621,7 +621,13 @@ Mesh *BlenderSync::sync_mesh(BL::Object b_ob, bool object_updated, bool hide_tri
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* test if we need to sync */
|
/* test if we need to sync */
|
||||||
bool use_mesh_geometry = render_layer.use_surfaces || render_layer.use_hair;
|
int requested_geometry_flags = Mesh::GEOMETRY_NONE;
|
||||||
|
if(render_layer.use_surfaces) {
|
||||||
|
requested_geometry_flags |= Mesh::GEOMETRY_TRIANGLES;
|
||||||
|
}
|
||||||
|
if(render_layer.use_hair) {
|
||||||
|
requested_geometry_flags |= Mesh::GEOMETRY_CURVES;
|
||||||
|
}
|
||||||
Mesh *mesh;
|
Mesh *mesh;
|
||||||
|
|
||||||
if(!mesh_map.sync(&mesh, key)) {
|
if(!mesh_map.sync(&mesh, key)) {
|
||||||
@@ -630,7 +636,7 @@ Mesh *BlenderSync::sync_mesh(BL::Object b_ob, bool object_updated, bool hide_tri
|
|||||||
/* test if shaders changed, these can be object level so mesh
|
/* test if shaders changed, these can be object level so mesh
|
||||||
* does not get tagged for recalc */
|
* does not get tagged for recalc */
|
||||||
else if(mesh->used_shaders != used_shaders);
|
else if(mesh->used_shaders != used_shaders);
|
||||||
else if(use_mesh_geometry != mesh->geometry_synced);
|
else if(requested_geometry_flags != mesh->geometry_flags);
|
||||||
else {
|
else {
|
||||||
/* even if not tagged for recalc, we may need to sync anyway
|
/* even if not tagged for recalc, we may need to sync anyway
|
||||||
* because the shader needs different mesh attributes */
|
* because the shader needs different mesh attributes */
|
||||||
@@ -664,7 +670,7 @@ Mesh *BlenderSync::sync_mesh(BL::Object b_ob, bool object_updated, bool hide_tri
|
|||||||
mesh->used_shaders = used_shaders;
|
mesh->used_shaders = used_shaders;
|
||||||
mesh->name = ustring(b_ob_data.name().c_str());
|
mesh->name = ustring(b_ob_data.name().c_str());
|
||||||
|
|
||||||
if(use_mesh_geometry) {
|
if(requested_geometry_flags != Mesh::GEOMETRY_NONE) {
|
||||||
/* mesh objects does have special handle in the dependency graph,
|
/* mesh objects does have special handle in the dependency graph,
|
||||||
* they're ensured to have properly updated.
|
* they're ensured to have properly updated.
|
||||||
*
|
*
|
||||||
@@ -697,8 +703,8 @@ Mesh *BlenderSync::sync_mesh(BL::Object b_ob, bool object_updated, bool hide_tri
|
|||||||
/* free derived mesh */
|
/* free derived mesh */
|
||||||
b_data.meshes.remove(b_mesh);
|
b_data.meshes.remove(b_mesh);
|
||||||
}
|
}
|
||||||
mesh->geometry_synced = true;
|
|
||||||
}
|
}
|
||||||
|
mesh->geometry_flags = requested_geometry_flags;
|
||||||
|
|
||||||
/* displacement method */
|
/* displacement method */
|
||||||
if(cmesh.data) {
|
if(cmesh.data) {
|
||||||
|
@@ -135,7 +135,7 @@ void Mesh::clear()
|
|||||||
transform_applied = false;
|
transform_applied = false;
|
||||||
transform_negative_scaled = false;
|
transform_negative_scaled = false;
|
||||||
transform_normal = transform_identity();
|
transform_normal = transform_identity();
|
||||||
geometry_synced = false;
|
geometry_flags = GEOMETRY_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
int Mesh::split_vertex(int vertex)
|
int Mesh::split_vertex(int vertex)
|
||||||
|
@@ -71,8 +71,13 @@ public:
|
|||||||
ustring name;
|
ustring name;
|
||||||
|
|
||||||
/* Mesh Data */
|
/* Mesh Data */
|
||||||
bool geometry_synced; /* used to distinguish meshes with no verts
|
enum GeometryFlags {
|
||||||
and meshed for which geometry is not created */
|
GEOMETRY_NONE = 0,
|
||||||
|
GEOMETRY_TRIANGLES = (1 << 0),
|
||||||
|
GEOMETRY_CURVES = (1 << 1),
|
||||||
|
};
|
||||||
|
int geometry_flags; /* used to distinguish meshes with no verts
|
||||||
|
and meshed for which geometry is not created */
|
||||||
|
|
||||||
vector<float3> verts;
|
vector<float3> verts;
|
||||||
vector<Triangle> triangles;
|
vector<Triangle> triangles;
|
||||||
|
@@ -395,6 +395,12 @@ if(WITH_CYCLES)
|
|||||||
-testdir "${TEST_SRC_DIR}/cycles/ctests/reports"
|
-testdir "${TEST_SRC_DIR}/cycles/ctests/reports"
|
||||||
-idiff "${OPENIMAGEIO_IDIFF}"
|
-idiff "${OPENIMAGEIO_IDIFF}"
|
||||||
)
|
)
|
||||||
|
add_test(cycles_render_test
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/cycles_render_tests.py
|
||||||
|
-blender "${TEST_BLENDER_EXE_BARE}"
|
||||||
|
-testdir "${TEST_SRC_DIR}/cycles/ctests/render"
|
||||||
|
-idiff "${OPENIMAGEIO_IDIFF}"
|
||||||
|
)
|
||||||
add_test(cycles_shaders_test
|
add_test(cycles_shaders_test
|
||||||
${CMAKE_CURRENT_LIST_DIR}/cycles_render_tests.py
|
${CMAKE_CURRENT_LIST_DIR}/cycles_render_tests.py
|
||||||
-blender "${TEST_BLENDER_EXE_BARE}"
|
-blender "${TEST_BLENDER_EXE_BARE}"
|
||||||
|
Reference in New Issue
Block a user