[Bf-blender-cvs] [871b1f57958] cycles_embree: Cycles: Added support for BVH refitting/dynamic meshes with embree
Stefan Werner
noreply at git.blender.org
Sun Nov 26 23:11:16 CET 2017
Commit: 871b1f57958b64e2a54a152a659cde224b972dd3
Author: Stefan Werner
Date: Mon Jun 12 14:01:58 2017 +0200
Branches: cycles_embree
https://developer.blender.org/rB871b1f57958b64e2a54a152a659cde224b972dd3
Cycles: Added support for BVH refitting/dynamic meshes with embree
===================================================================
M intern/cycles/bvh/bvh_embree.cpp
M intern/cycles/bvh/bvh_embree.h
===================================================================
diff --git a/intern/cycles/bvh/bvh_embree.cpp b/intern/cycles/bvh/bvh_embree.cpp
index a2466722e66..047fc2cb4f3 100644
--- a/intern/cycles/bvh/bvh_embree.cpp
+++ b/intern/cycles/bvh/bvh_embree.cpp
@@ -35,7 +35,12 @@
#include "xmmintrin.h"
#include "pmmintrin.h"
-#define EMBREE_SHARED_MEM 1
+/* this doesn't work with refitting unforutnately
+ * #define EMBREE_SHARED_MEM 1
+ */
+
+/* this should eventually come from render settings. */
+//#define HAIR_CURVES
CCL_NAMESPACE_BEGIN
@@ -244,7 +249,7 @@ void BVHEmbree::build(Progress& progress, Stats *stats_)
scene = NULL;
}
- RTCSceneFlags flags = RTC_SCENE_STATIC|RTC_SCENE_INCOHERENT|RTC_SCENE_ROBUST;
+ RTCSceneFlags flags = RTC_SCENE_DYNAMIC|RTC_SCENE_COMPACT|RTC_SCENE_HIGH_QUALITY|RTC_SCENE_ROBUST;
if(params.use_spatial_split) {
flags = flags|RTC_SCENE_HIGH_QUALITY;
}
@@ -353,12 +358,10 @@ unsigned BVHEmbree::add_triangles(Mesh *mesh, int i)
{
const Attribute *attr_mP = NULL;
size_t num_motion_steps = 1;
- size_t t_mid = 0;
if(mesh->has_motion_blur()) {
attr_mP = mesh->attributes.find(ATTR_STD_MOTION_VERTEX_POSITION);
if(attr_mP) {
num_motion_steps = mesh->motion_steps;
- t_mid = (num_motion_steps - 1) / 2;
if(num_motion_steps > RTC_MAX_TIME_STEPS) {
assert(0);
num_motion_steps = RTC_MAX_TIME_STEPS;
@@ -369,14 +372,14 @@ unsigned BVHEmbree::add_triangles(Mesh *mesh, int i)
const size_t num_triangles = mesh->num_triangles();
const size_t num_verts = mesh->verts.size();
unsigned geom_id = rtcNewTriangleMesh2(scene,
- RTC_GEOMETRY_STATIC,
+ RTC_GEOMETRY_DEFORMABLE,
num_triangles,
num_verts,
num_motion_steps,
i*2);
#ifdef EMBREE_SHARED_MEM
- // embree and Cycles use the same memory layout, so we can conveniently use the rtcSetBuffer2 calls
+ /* embree and Cycles use the same memory layout, so we can conveniently use the rtcSetBuffer2 calls */
rtcSetBuffer2(scene, geom_id, RTC_INDEX_BUFFER, &mesh->triangles[0], 0, sizeof(int) * 3);
#else
void* raw_buffer = rtcMapBuffer(scene, geom_id, RTC_INDEX_BUFFER);
@@ -390,6 +393,41 @@ unsigned BVHEmbree::add_triangles(Mesh *mesh, int i)
rtcUnmapBuffer(scene, geom_id, RTC_INDEX_BUFFER);
#endif
+ update_tri_vertex_buffer(geom_id, mesh);
+
+ pack.prim_object.reserve(pack.prim_object.size() + num_triangles);
+ pack.prim_type.reserve(pack.prim_type.size() + num_triangles);
+ pack.prim_index.reserve(pack.prim_index.size() + num_triangles);
+ pack.prim_tri_index.reserve(pack.prim_index.size() + num_triangles);
+ for(size_t j = 0; j < num_triangles; j++) {
+ pack.prim_object.push_back_reserved(i);
+ pack.prim_type.push_back_reserved(num_motion_steps > 1 ? PRIMITIVE_MOTION_TRIANGLE : PRIMITIVE_TRIANGLE);
+ pack.prim_index.push_back_reserved(j);
+ pack.prim_tri_index.push_back_reserved(j);
+ }
+
+ return geom_id;
+}
+
+void BVHEmbree::update_tri_vertex_buffer(unsigned geom_id, const Mesh* mesh)
+{
+ const Attribute *attr_mP = NULL;
+ size_t num_motion_steps = 1;
+ int t_mid = 0;
+ if(mesh->has_motion_blur()) {
+ attr_mP = mesh->attributes.find(ATTR_STD_MOTION_VERTEX_POSITION);
+ if(attr_mP) {
+ num_motion_steps = mesh->motion_steps;
+ t_mid = (num_motion_steps - 1) / 2;
+ if(num_motion_steps > RTC_MAX_TIME_STEPS) {
+ assert(0);
+ num_motion_steps = RTC_MAX_TIME_STEPS;
+ }
+ }
+ }
+ const size_t num_verts = mesh->verts.size();
+
+
for(int t = 0; t < num_motion_steps; t++) {
RTCBufferType buffer_type = (RTCBufferType)(RTC_VERTEX_BUFFER+t);
const float3 *verts;
@@ -402,7 +440,7 @@ unsigned BVHEmbree::add_triangles(Mesh *mesh, int i)
#ifdef EMBREE_SHARED_MEM
rtcSetBuffer(scene, geom_id, buffer_type, verts, 0, sizeof(float3));
#else
- raw_buffer = rtcMapBuffer(scene, geom_id, buffer_type);
+ void *raw_buffer = rtcMapBuffer(scene, geom_id, buffer_type);
float *rtc_verts = (float*) raw_buffer;
for(size_t j = 0; j < num_verts; j++) {
rtc_verts[0] = verts[j].x;
@@ -414,23 +452,66 @@ unsigned BVHEmbree::add_triangles(Mesh *mesh, int i)
rtcUnmapBuffer(scene, geom_id, buffer_type);
#endif
}
+}
- pack.prim_object.reserve(pack.prim_object.size() + num_triangles);
- pack.prim_type.reserve(pack.prim_type.size() + num_triangles);
- pack.prim_index.reserve(pack.prim_index.size() + num_triangles);
- pack.prim_tri_index.reserve(pack.prim_index.size() + num_triangles);
- for(size_t j = 0; j < num_triangles; j++) {
- pack.prim_object.push_back_reserved(i);
- pack.prim_type.push_back_reserved(num_motion_steps > 1 ? PRIMITIVE_MOTION_TRIANGLE : PRIMITIVE_TRIANGLE);
- pack.prim_index.push_back_reserved(j);
- pack.prim_tri_index.push_back_reserved(j);
+void BVHEmbree::update_curve_vertex_buffer(unsigned geom_id, const Mesh* mesh)
+{
+ const Attribute *attr_mP = NULL;
+ size_t num_motion_steps = 1;
+ if(mesh->has_motion_blur()) {
+ attr_mP = mesh->curve_attributes.find(ATTR_STD_MOTION_VERTEX_POSITION);
+ if(attr_mP) {
+ num_motion_steps = mesh->motion_steps;
+ }
}
- return geom_id;
-}
+ const size_t num_keys = mesh->curve_keys.size();
-/* this should eventually come from render settings. */
-//#define HAIR_CURVES
+ /* Copy the CV data to embree */
+ int t_mid = (num_motion_steps - 1) / 2;
+ const float *curve_radius = &mesh->curve_radius[0];
+ for(int t = 0; t < num_motion_steps; t++) {
+ RTCBufferType buffer_type = (RTCBufferType)(RTC_VERTEX_BUFFER+t);
+ const float3 *verts;
+ if(t == t_mid) {
+ verts = &mesh->curve_keys[0];
+ } else {
+ int t_ = (t > t_mid) ? (t - 1) : t;
+ verts = &attr_mP->data_float3()[t_ * num_keys];
+ }
+
+#ifdef EMBREE_SHARED_MEM
+ if(t != t_mid) {
+ rtcSetBuffer(scene, geom_id, buffer_type, verts, 0, sizeof(float4));
+ } else
+#endif
+ {
+ void *raw_buffer = rtcMapBuffer(scene, geom_id, buffer_type);
+ float *rtc_verts = (float*) raw_buffer;
+#ifdef HAIR_CURVES
+ rtc_verts[0] = verts[0].x;
+ rtc_verts[1] = verts[0].y;
+ rtc_verts[2] = verts[0].z;
+ rtc_verts[3] = curve_radius[0];
+ rtc_verts += 4;
+#endif
+ for(size_t j = 0; j < num_keys; j++) {
+ rtc_verts[0] = verts[j].x;
+ rtc_verts[1] = verts[j].y;
+ rtc_verts[2] = verts[j].z;
+ rtc_verts[3] = curve_radius[j];
+ rtc_verts += 4;
+ }
+#ifdef HAIR_CURVES
+ rtc_verts[0] = verts[num_keys-1].x;
+ rtc_verts[1] = verts[num_keys-1].y;
+ rtc_verts[2] = verts[num_keys-1].z;
+ rtc_verts[3] = curve_radius[num_keys-1];
+#endif
+ rtcUnmapBuffer(scene, geom_id, buffer_type);
+ }
+ }
+}
unsigned BVHEmbree::add_curves(Mesh *mesh, int i)
{
@@ -460,7 +541,7 @@ unsigned BVHEmbree::add_curves(Mesh *mesh, int i)
#ifndef HAIR_CURVES /* line segments */
unsigned geom_id = rtcNewLineSegments2(scene,
- RTC_GEOMETRY_STATIC,
+ RTC_GEOMETRY_DEFORMABLE,
num_segments,
num_keys,
num_motion_steps,
@@ -488,8 +569,9 @@ unsigned BVHEmbree::add_curves(Mesh *mesh, int i)
rtcUnmapBuffer(scene, geom_id, RTC_INDEX_BUFFER);
#else
/* curve segments */
- unsigned geom_id = rtcNewBSplineHairGeometry2(scene,
- RTC_GEOMETRY_STATIC,
+ num_segments = num_segments / 2;
+ unsigned geom_id = rtcNewBezierHairGeometry2(scene,
+ RTC_GEOMETRY_DEFORMABLE,
num_segments,
num_keys + 2 * num_curves,
num_motion_steps,
@@ -502,7 +584,7 @@ unsigned BVHEmbree::add_curves(Mesh *mesh, int i)
size_t rtc_index = 0;
for(size_t j = 0; j < num_curves; j++) {
Mesh::Curve c = mesh->get_curve(j);
- for(size_t k = 0; k < c.num_segments(); k++) {
+ for(size_t k = 0; k < c.num_segments(); k+=3) {
rtc_indices[rtc_index] = c.first_key + k;
/* Cycles specific data */
@@ -516,49 +598,8 @@ unsigned BVHEmbree::add_curves(Mesh *mesh, int i)
}
rtcUnmapBuffer(scene, geom_id, RTC_INDEX_BUFFER);
#endif
- /* Copy the CV data to embree */
- int t_mid = (num_motion_steps - 1) / 2;
- const float *curve_radius = &mesh->curve_radius[0];
- for(int t = 0; t < num_motion_steps; t++) {
- RTCBufferType buffer_type = (RTCBufferType)(RTC_VERTEX_BUFFER+t);
- const float3 *verts;
- if(t == t_mid) {
- verts = &mesh->curve_keys[0];
- } else {
- int t_ = (t > t_mid) ? (t - 1) : t;
- verts = &attr_mP->data_float3()[t_ * num_keys];
- }
-#ifdef EMBREE_SHARED_MEM
- if(t != t_mid) {
- rtcSetBuffer(scene, geom_id, buffer_type, verts, 0, sizeof(float4));
- } else {
-#endif
- raw_buffer = rtcMapBuffer(scene, geom_id, buffer_type);
- float *rtc_verts = (float*) raw_buffer;
-#ifdef HAIR_CURVES
- rtc_verts[0] = verts[0].x;
- rtc_verts[1] = verts[0].y;
- rtc_verts[2] = verts[0].z;
- rtc_verts[3] = curve_radius[0];
- rtc_verts += 4;
-#endif
- for(size_t j = 0; j < num_keys; j++) {
- rtc_verts[0] = verts[j].x;
- rtc_verts[1] = verts[j].y;
- rtc_verts[2] = verts[j].z;
- rtc_verts[3] = curve_radius[j];
- rtc_verts += 4;
- }
-#ifdef HAIR_CURVES
- rtc_verts[0] = verts[num_keys-1].x;
- rtc_verts[1] = verts[num_keys-1].y;
- rtc_verts[2] = verts[num_keys-1].z;
- rtc_verts[3] = curve_radius[num_keys-1];
-#endif
- rtcUnmapBuffer(scene, geom_id, buffer_type);
- }
- }
+ update_curve_vertex_buffer(geom_id, mesh);
return geom_id;
}
@@ -701,16 +742,23 @@ void BVHEmbree::pack_nodes(const BVHNode *root)
void BVHEmbree::refit_nodes()
{
-#if 0
unsigned geom_id = 0;
+
foreach(Object *ob, objects) {
- void *raw_buffer = rtcMapBuffer(scene, geom_id, RTC_VERTEX_BUFFER);
- float *rtc_verts = (float*) raw_buffer;
- rtcUnmapBuffer(scene, geom_id, RTC_VERTEX_BUFFER);
- rtcUpdate(scene, geom_id);
- geom_id++;
+ if(!params.top_level || (ob->is_traceable() && !ob->mesh->is_instanced())) {
+ if(params.primitive_mask & PRIMITIVE_ALL_TRIANGLE && ob->mesh->num_triangles() > 0) {
+ update_tri_vertex_buffer(geom_id, ob->mesh);
+ rtcUpdate(scene, geom_id);
+ }
+
+ if(params.primitive_mask & PRIMITIVE_ALL_CURVE && ob->mesh->num_curves() > 0) {
+ update_curve_vertex_buffer(geom_id+1, ob->mesh);
+ rtcUpdate(scene, geom_id+1);
+ }
+ }
+ geom_id += 2;
}
-#endif
+ rtcCommit(scene);
}
CCL_NAMESPACE_END
diff --git a/intern/cycles/bvh/bvh_embree.h b/intern/cycles/bvh/bvh_embree.h
index d4443f33ecc..5d26bb9ecee 100644
--- a/intern/cycles/bvh/bvh_embree.h
+++ b/intern/cycles/bv
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list