[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [55928] trunk/blender/intern/cycles: Fix 34764: cycles issue rendering instanced mesh with NaN coordinates.
Brecht Van Lommel
brechtvanlommel at pandora.be
Tue Apr 9 22:48:54 CEST 2013
Revision: 55928
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=55928
Author: blendix
Date: 2013-04-09 20:48:53 +0000 (Tue, 09 Apr 2013)
Log Message:
-----------
Fix 34764: cycles issue rendering instanced mesh with NaN coordinates.
Modified Paths:
--------------
trunk/blender/intern/cycles/render/mesh.cpp
trunk/blender/intern/cycles/util/util_boundbox.h
Modified: trunk/blender/intern/cycles/render/mesh.cpp
===================================================================
--- trunk/blender/intern/cycles/render/mesh.cpp 2013-04-09 18:58:01 UTC (rev 55927)
+++ trunk/blender/intern/cycles/render/mesh.cpp 2013-04-09 20:48:53 UTC (rev 55928)
@@ -135,15 +135,29 @@
size_t verts_size = verts.size();
size_t curve_keys_size = curve_keys.size();
- for(size_t i = 0; i < verts_size; i++)
- bnds.grow(verts[i]);
+ if(verts_size + curve_keys_size > 0) {
+ for(size_t i = 0; i < verts_size; i++)
+ bnds.grow(verts[i]);
- for(size_t i = 0; i < curve_keys_size; i++)
- bnds.grow(curve_keys[i].co, curve_keys[i].radius);
+ for(size_t i = 0; i < curve_keys_size; i++)
+ bnds.grow(curve_keys[i].co, curve_keys[i].radius);
- /* happens mostly on empty meshes */
- if(!bnds.valid())
+ if(!bnds.valid()) {
+ bnds = BoundBox::empty;
+
+ /* skip nan or inf coordinates */
+ for(size_t i = 0; i < verts_size; i++)
+ bnds.grow_safe(verts[i]);
+
+ for(size_t i = 0; i < curve_keys_size; i++)
+ bnds.grow_safe(curve_keys[i].co, curve_keys[i].radius);
+ }
+ }
+
+ if(!bnds.valid()) {
+ /* empty mesh */
bnds.grow(make_float3(0.0f, 0.0f, 0.0f));
+ }
bounds = bnds;
}
Modified: trunk/blender/intern/cycles/util/util_boundbox.h
===================================================================
--- trunk/blender/intern/cycles/util/util_boundbox.h 2013-04-09 18:58:01 UTC (rev 55927)
+++ trunk/blender/intern/cycles/util/util_boundbox.h 2013-04-09 20:48:53 UTC (rev 55928)
@@ -80,6 +80,31 @@
grow(bbox.max);
}
+ __forceinline void grow_safe(const float3& pt)
+ {
+ /* the order of arguments to min is such that if pt is nan, it will not
+ * influence the resulting bounding box */
+ if(isfinite(pt.x) && isfinite(pt.y) && isfinite(pt.z)) {
+ min = ccl::min(pt, min);
+ max = ccl::max(pt, max);
+ }
+ }
+
+ __forceinline void grow_safe(const float3& pt, float border)
+ {
+ if(isfinite(pt.x) && isfinite(pt.y) && isfinite(pt.z) && isfinite(border)) {
+ float3 shift = {border, border, border, 0.0f};
+ min = ccl::min(pt - shift, min);
+ max = ccl::max(pt + shift, max);
+ }
+ }
+
+ __forceinline void grow_safe(const BoundBox& bbox)
+ {
+ grow_safe(bbox.min);
+ grow_safe(bbox.max);
+ }
+
__forceinline void intersect(const BoundBox& bbox)
{
min = ccl::max(min, bbox.min);
@@ -120,7 +145,7 @@
{
return max - min;
}
-
+
__forceinline bool valid() const
{
return (min.x <= max.x) && (min.y <= max.y) && (min.z <= max.z) &&
More information about the Bf-blender-cvs
mailing list