Cycles: Make primitive split code easier for re-use by reference splitting function
authorSergey Sharybin <sergey.vfx@gmail.com>
Fri, 21 Aug 2015 17:40:14 +0000 (19:40 +0200)
committerSergey Sharybin <sergey.vfx@gmail.com>
Mon, 24 Aug 2015 07:46:40 +0000 (09:46 +0200)
intern/cycles/bvh/bvh_split.cpp
intern/cycles/bvh/bvh_split.h

index 2e14eee..7d29f84 100644 (file)
@@ -243,14 +243,14 @@ void BVHSpatialSplit::split(BVHBuild *builder, BVHRange& left, BVHRange& right,
        right = BVHRange(right_bounds, right_start, right_end - right_start);
 }
 
-void BVHSpatialSplit::split_triangle_reference(const BVHReference& ref,
-                                               const Mesh *mesh,
+void BVHSpatialSplit::split_triangle_primitive(const Mesh *mesh,
+                                               int prim_index,
                                                int dim,
                                                float pos,
                                                BoundBox& left_bounds,
                                                BoundBox& right_bounds)
 {
-       const int *inds = mesh->triangles[ref.prim_index()].v;
+       const int *inds = mesh->triangles[prim_index].v;
        const float3 *verts = &mesh->verts[0];
        const float3 *v1 = &verts[inds[2]];
 
@@ -277,15 +277,16 @@ void BVHSpatialSplit::split_triangle_reference(const BVHReference& ref,
        }
 }
 
-void BVHSpatialSplit::split_curve_reference(const BVHReference& ref,
-                                            const Mesh *mesh,
+void BVHSpatialSplit::split_curve_primitive(const Mesh *mesh,
+                                            int prim_index,
+                                            int segment_index,
                                             int dim,
                                             float pos,
                                             BoundBox& left_bounds,
                                             BoundBox& right_bounds)
 {
        /* curve split: NOTE - Currently ignores curve width and needs to be fixed.*/
-       const int k0 = mesh->curves[ref.prim_index()].first_key + PRIMITIVE_UNPACK_SEGMENT(ref.prim_type());
+       const int k0 = mesh->curves[prim_index].first_key + segment_index;
        const int k1 = k0 + 1;
        const float4 key0 = mesh->curve_keys[k0];
        const float4 key1 = mesh->curve_keys[k1];
@@ -316,6 +317,37 @@ void BVHSpatialSplit::split_curve_reference(const BVHReference& ref,
        }
 }
 
+void BVHSpatialSplit::split_triangle_reference(const BVHReference& ref,
+                                               const Mesh *mesh,
+                                               int dim,
+                                               float pos,
+                                               BoundBox& left_bounds,
+                                               BoundBox& right_bounds)
+{
+       split_triangle_primitive(mesh,
+                                ref.prim_index(),
+                                dim,
+                                pos,
+                                left_bounds,
+                                right_bounds);
+}
+
+void BVHSpatialSplit::split_curve_reference(const BVHReference& ref,
+                                            const Mesh *mesh,
+                                            int dim,
+                                            float pos,
+                                            BoundBox& left_bounds,
+                                            BoundBox& right_bounds)
+{
+       split_curve_primitive(mesh,
+                             ref.prim_index(),
+                             PRIMITIVE_UNPACK_SEGMENT(ref.prim_type()),
+                             dim,
+                             pos,
+                             left_bounds,
+                             right_bounds);
+}
+
 void BVHSpatialSplit::split_reference(BVHBuild *builder,
                                       BVHReference& left,
                                       BVHReference& right,
index 1b550d1..f9bed5f 100644 (file)
@@ -63,6 +63,20 @@ public:
                             float pos);
 
 protected:
+       void split_triangle_primitive(const Mesh *mesh,
+                                     int prim_index,
+                                     int dim,
+                                     float pos,
+                                     BoundBox& left_bounds,
+                                     BoundBox& right_bounds);
+       void split_curve_primitive(const Mesh *mesh,
+                                  int prim_index,
+                                  int segment_index,
+                                  int dim,
+                                  float pos,
+                                  BoundBox& left_bounds,
+                                  BoundBox& right_bounds);
+
        void split_triangle_reference(const BVHReference& ref,
                                      const Mesh *mesh,
                                      int dim,