Cycles code refactor: add support for motion vertex attributes.

This commit is contained in:
Brecht Van Lommel 2014-03-29 13:03:46 +01:00
parent 41d1675053
commit 24ad7e0bea
7 changed files with 47 additions and 23 deletions

@ -28,7 +28,7 @@ ccl_device float curve_attribute_float(KernelGlobals *kg, const ShaderData *sd,
return kernel_tex_fetch(__attributes_float, offset + sd->prim); return kernel_tex_fetch(__attributes_float, offset + sd->prim);
} }
else if(elem == ATTR_ELEMENT_CURVE_KEY) { else if(elem == ATTR_ELEMENT_CURVE_KEY || elem == ATTR_ELEMENT_CURVE_KEY_MOTION) {
float4 curvedata = kernel_tex_fetch(__curves, sd->prim); float4 curvedata = kernel_tex_fetch(__curves, sd->prim);
int k0 = __float_as_int(curvedata.x) + sd->segment; int k0 = __float_as_int(curvedata.x) + sd->segment;
int k1 = k0 + 1; int k1 = k0 + 1;
@ -67,7 +67,7 @@ ccl_device float3 curve_attribute_float3(KernelGlobals *kg, const ShaderData *sd
return float4_to_float3(kernel_tex_fetch(__attributes_float3, offset + sd->prim)); return float4_to_float3(kernel_tex_fetch(__attributes_float3, offset + sd->prim));
} }
else if(elem == ATTR_ELEMENT_CURVE_KEY) { else if(elem == ATTR_ELEMENT_CURVE_KEY || elem == ATTR_ELEMENT_CURVE_KEY_MOTION) {
float4 curvedata = kernel_tex_fetch(__curves, sd->prim); float4 curvedata = kernel_tex_fetch(__curves, sd->prim);
int k0 = __float_as_int(curvedata.x) + sd->segment; int k0 = __float_as_int(curvedata.x) + sd->segment;
int k1 = k0 + 1; int k1 = k0 + 1;

@ -176,7 +176,7 @@ ccl_device float triangle_attribute_float(KernelGlobals *kg, const ShaderData *s
return kernel_tex_fetch(__attributes_float, offset + sd->prim); return kernel_tex_fetch(__attributes_float, offset + sd->prim);
} }
else if(elem == ATTR_ELEMENT_VERTEX) { else if(elem == ATTR_ELEMENT_VERTEX || elem == ATTR_ELEMENT_VERTEX_MOTION) {
float3 tri_vindex = float4_to_float3(kernel_tex_fetch(__tri_vindex, sd->prim)); float3 tri_vindex = float4_to_float3(kernel_tex_fetch(__tri_vindex, sd->prim));
float f0 = kernel_tex_fetch(__attributes_float, offset + __float_as_int(tri_vindex.x)); float f0 = kernel_tex_fetch(__attributes_float, offset + __float_as_int(tri_vindex.x));
@ -219,7 +219,7 @@ ccl_device float3 triangle_attribute_float3(KernelGlobals *kg, const ShaderData
return float4_to_float3(kernel_tex_fetch(__attributes_float3, offset + sd->prim)); return float4_to_float3(kernel_tex_fetch(__attributes_float3, offset + sd->prim));
} }
else if(elem == ATTR_ELEMENT_VERTEX) { else if(elem == ATTR_ELEMENT_VERTEX || elem == ATTR_ELEMENT_VERTEX_MOTION) {
float3 tri_vindex = float4_to_float3(kernel_tex_fetch(__tri_vindex, sd->prim)); float3 tri_vindex = float4_to_float3(kernel_tex_fetch(__tri_vindex, sd->prim));
float3 f0 = float4_to_float3(kernel_tex_fetch(__attributes_float3, offset + __float_as_int(tri_vindex.x))); float3 f0 = float4_to_float3(kernel_tex_fetch(__attributes_float3, offset + __float_as_int(tri_vindex.x)));

@ -434,9 +434,11 @@ typedef enum AttributeElement {
ATTR_ELEMENT_MESH, ATTR_ELEMENT_MESH,
ATTR_ELEMENT_FACE, ATTR_ELEMENT_FACE,
ATTR_ELEMENT_VERTEX, ATTR_ELEMENT_VERTEX,
ATTR_ELEMENT_VERTEX_MOTION,
ATTR_ELEMENT_CORNER, ATTR_ELEMENT_CORNER,
ATTR_ELEMENT_CURVE, ATTR_ELEMENT_CURVE,
ATTR_ELEMENT_CURVE_KEY ATTR_ELEMENT_CURVE_KEY,
ATTR_ELEMENT_CURVE_KEY_MOTION
} AttributeElement; } AttributeElement;
typedef enum AttributeStandard { typedef enum AttributeStandard {

@ -38,9 +38,14 @@ void Attribute::set(ustring name_, TypeDesc type_, AttributeElement element_)
type == TypeDesc::TypeNormal || type == TypeDesc::TypeMatrix); type == TypeDesc::TypeNormal || type == TypeDesc::TypeMatrix);
} }
void Attribute::reserve(int numverts, int numtris, int numcurves, int numkeys) void Attribute::reserve(int numverts, int numtris, int numsteps, int numcurves, int numkeys, bool resize)
{ {
buffer.resize(buffer_size(numverts, numtris, numcurves, numkeys), 0); if (resize) {
buffer.resize(buffer_size(numverts, numtris, numsteps, numcurves, numkeys), 0);
}
else {
buffer.reserve(buffer_size(numverts, numtris, numsteps, numcurves, numkeys));
}
} }
void Attribute::add(const float& f) void Attribute::add(const float& f)
@ -80,7 +85,7 @@ size_t Attribute::data_sizeof() const
return sizeof(float3); return sizeof(float3);
} }
size_t Attribute::element_size(int numverts, int numtris, int numcurves, int numkeys) const size_t Attribute::element_size(int numverts, int numtris, int numsteps, int numcurves, int numkeys) const
{ {
size_t size; size_t size;
@ -92,6 +97,9 @@ size_t Attribute::element_size(int numverts, int numtris, int numcurves, int num
case ATTR_ELEMENT_VERTEX: case ATTR_ELEMENT_VERTEX:
size = numverts; size = numverts;
break; break;
case ATTR_ELEMENT_VERTEX_MOTION:
size = numverts * (numsteps - 1);
break;
case ATTR_ELEMENT_FACE: case ATTR_ELEMENT_FACE:
size = numtris; size = numtris;
break; break;
@ -104,6 +112,9 @@ size_t Attribute::element_size(int numverts, int numtris, int numcurves, int num
case ATTR_ELEMENT_CURVE_KEY: case ATTR_ELEMENT_CURVE_KEY:
size = numkeys; size = numkeys;
break; break;
case ATTR_ELEMENT_CURVE_KEY_MOTION:
size = numkeys * (numsteps - 1);
break;
default: default:
size = 0; size = 0;
break; break;
@ -112,9 +123,9 @@ size_t Attribute::element_size(int numverts, int numtris, int numcurves, int num
return size; return size;
} }
size_t Attribute::buffer_size(int numverts, int numtris, int numcurves, int numkeys) const size_t Attribute::buffer_size(int numverts, int numtris, int numsteps, int numcurves, int numkeys) const
{ {
return element_size(numverts, numtris, numcurves, numkeys)*data_sizeof(); return element_size(numverts, numtris, numsteps, numcurves, numkeys)*data_sizeof();
} }
bool Attribute::same_storage(TypeDesc a, TypeDesc b) bool Attribute::same_storage(TypeDesc a, TypeDesc b)
@ -182,7 +193,7 @@ AttributeSet::~AttributeSet()
{ {
} }
Attribute *AttributeSet::add(ustring name, TypeDesc type, AttributeElement element) Attribute *AttributeSet::add(ustring name, TypeDesc type, AttributeElement element, bool resize)
{ {
Attribute *attr = find(name); Attribute *attr = find(name);
@ -202,9 +213,9 @@ Attribute *AttributeSet::add(ustring name, TypeDesc type, AttributeElement eleme
/* this is weak .. */ /* this is weak .. */
if(triangle_mesh) if(triangle_mesh)
attr->reserve(triangle_mesh->verts.size(), triangle_mesh->triangles.size(), 0, 0); attr->reserve(triangle_mesh->verts.size(), triangle_mesh->triangles.size(), triangle_mesh->motion_steps, 0, 0, resize);
if(curve_mesh) if(curve_mesh)
attr->reserve(0, 0, curve_mesh->curves.size(), curve_mesh->curve_keys.size()); attr->reserve(0, 0, curve_mesh->motion_steps, curve_mesh->curves.size(), curve_mesh->curve_keys.size(), resize);
return attr; return attr;
} }
@ -343,9 +354,9 @@ void AttributeSet::reserve()
{ {
foreach(Attribute& attr, attributes) { foreach(Attribute& attr, attributes) {
if(triangle_mesh) if(triangle_mesh)
attr.reserve(triangle_mesh->verts.size(), triangle_mesh->triangles.size(), 0, 0); attr.reserve(triangle_mesh->verts.size(), triangle_mesh->triangles.size(), triangle_mesh->motion_steps, 0, 0, true);
if(curve_mesh) if(curve_mesh)
attr.reserve(0, 0, curve_mesh->curves.size(), curve_mesh->curve_keys.size()); attr.reserve(0, 0, 0, curve_mesh->curves.size(), curve_mesh->curve_keys.size(), true);
} }
} }

@ -49,19 +49,21 @@ public:
Attribute() {} Attribute() {}
void set(ustring name, TypeDesc type, AttributeElement element); void set(ustring name, TypeDesc type, AttributeElement element);
void reserve(int numverts, int numfaces, int numcurves, int numkeys); void reserve(int numverts, int numfaces, int numsteps, int numcurves, int numkeys, bool resize);
size_t data_sizeof() const; size_t data_sizeof() const;
size_t element_size(int numverts, int numfaces, int numcurves, int numkeys) const; size_t element_size(int numverts, int numfaces, int numsteps, int numcurves, int numkeys) const;
size_t buffer_size(int numverts, int numfaces, int numcurves, int numkeys) const; size_t buffer_size(int numverts, int numfaces, int numsteps, int numcurves, int numkeys) const;
char *data() { return (buffer.size())? &buffer[0]: NULL; }; char *data() { return (buffer.size())? &buffer[0]: NULL; };
float3 *data_float3() { return (float3*)data(); } float3 *data_float3() { return (float3*)data(); }
float4 *data_float4() { return (float4*)data(); }
float *data_float() { return (float*)data(); } float *data_float() { return (float*)data(); }
Transform *data_transform() { return (Transform*)data(); } Transform *data_transform() { return (Transform*)data(); }
const char *data() const { return (buffer.size())? &buffer[0]: NULL; } const char *data() const { return (buffer.size())? &buffer[0]: NULL; }
const float3 *data_float3() const { return (const float3*)data(); } const float3 *data_float3() const { return (const float3*)data(); }
const float4 *data_float4() const { return (const float4*)data(); }
const float *data_float() const { return (const float*)data(); } const float *data_float() const { return (const float*)data(); }
const Transform *data_transform() const { return (const Transform*)data(); } const Transform *data_transform() const { return (const Transform*)data(); }
@ -86,7 +88,7 @@ public:
AttributeSet(); AttributeSet();
~AttributeSet(); ~AttributeSet();
Attribute *add(ustring name, TypeDesc type, AttributeElement element); Attribute *add(ustring name, TypeDesc type, AttributeElement element, bool resize = true);
Attribute *find(ustring name) const; Attribute *find(ustring name) const;
void remove(ustring name); void remove(ustring name);

@ -46,6 +46,8 @@ Mesh::Mesh()
displacement_method = DISPLACE_BUMP; displacement_method = DISPLACE_BUMP;
bounds = BoundBox::empty; bounds = BoundBox::empty;
motion_steps = 3;
bvh = NULL; bvh = NULL;
tri_offset = 0; tri_offset = 0;
@ -641,6 +643,7 @@ static void update_attribute_element_offset(Mesh *mesh, vector<float>& attr_floa
size_t size = mattr->element_size( size_t size = mattr->element_size(
mesh->verts.size(), mesh->verts.size(),
mesh->triangles.size(), mesh->triangles.size(),
mesh->motion_steps,
mesh->curves.size(), mesh->curves.size(),
mesh->curve_keys.size()); mesh->curve_keys.size());
@ -663,19 +666,21 @@ static void update_attribute_element_offset(Mesh *mesh, vector<float>& attr_floa
attr_float3[offset+k] = (&tfm->x)[k]; attr_float3[offset+k] = (&tfm->x)[k];
} }
else { else {
float3 *data = mattr->data_float3(); float4 *data = mattr->data_float4();
offset = attr_float3.size(); offset = attr_float3.size();
attr_float3.resize(attr_float3.size() + size); attr_float3.resize(attr_float3.size() + size);
for(size_t k = 0; k < size; k++) for(size_t k = 0; k < size; k++)
attr_float3[offset+k] = float3_to_float4(data[k]); attr_float3[offset+k] = data[k];
} }
/* mesh vertex/curve index is global, not per object, so we sneak /* mesh vertex/curve index is global, not per object, so we sneak
* a correction for that in here */ * a correction for that in here */
if(element == ATTR_ELEMENT_VERTEX) if(element == ATTR_ELEMENT_VERTEX)
offset -= mesh->vert_offset; offset -= mesh->vert_offset;
else if(element == ATTR_ELEMENT_VERTEX_MOTION)
offset -= mesh->vert_offset;
else if(element == ATTR_ELEMENT_FACE) else if(element == ATTR_ELEMENT_FACE)
offset -= mesh->tri_offset; offset -= mesh->tri_offset;
else if(element == ATTR_ELEMENT_CORNER) else if(element == ATTR_ELEMENT_CORNER)
@ -684,6 +689,8 @@ static void update_attribute_element_offset(Mesh *mesh, vector<float>& attr_floa
offset -= mesh->curve_offset; offset -= mesh->curve_offset;
else if(element == ATTR_ELEMENT_CURVE_KEY) else if(element == ATTR_ELEMENT_CURVE_KEY)
offset -= mesh->curvekey_offset; offset -= mesh->curvekey_offset;
else if(element == ATTR_ELEMENT_CURVE_KEY_MOTION)
offset -= mesh->curvekey_offset;
} }
else { else {
/* attribute not found */ /* attribute not found */
@ -750,7 +757,7 @@ void MeshManager::device_update_attributes(Device *device, DeviceScene *dscene,
/* create attribute lookup maps */ /* create attribute lookup maps */
if(scene->shader_manager->use_osl()) if(scene->shader_manager->use_osl())
update_osl_attributes(device, scene, mesh_attributes); update_osl_attributes(device, scene, mesh_attributes);
else
update_svm_attributes(device, dscene, scene, mesh_attributes); update_svm_attributes(device, dscene, scene, mesh_attributes);
if(progress.get_cancel()) return; if(progress.get_cancel()) return;

@ -90,6 +90,8 @@ public:
Transform transform_normal; Transform transform_normal;
DisplacementMethod displacement_method; DisplacementMethod displacement_method;
uint motion_steps;
/* Update Flags */ /* Update Flags */
bool need_update; bool need_update;
bool need_update_rebuild; bool need_update_rebuild;