From 24ad7e0bea77d942267344990d22e931610c3d07 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Sat, 29 Mar 2014 13:03:46 +0100 Subject: Cycles code refactor: add support for motion vertex attributes. --- intern/cycles/render/attribute.cpp | 31 +++++++++++++++++++++---------- intern/cycles/render/attribute.h | 10 ++++++---- intern/cycles/render/mesh.cpp | 15 +++++++++++---- intern/cycles/render/mesh.h | 2 ++ 4 files changed, 40 insertions(+), 18 deletions(-) (limited to 'intern/cycles/render') diff --git a/intern/cycles/render/attribute.cpp b/intern/cycles/render/attribute.cpp index 61b9cf2f3bc..bef3295d927 100644 --- a/intern/cycles/render/attribute.cpp +++ b/intern/cycles/render/attribute.cpp @@ -38,9 +38,14 @@ void Attribute::set(ustring name_, TypeDesc type_, AttributeElement element_) 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) @@ -80,7 +85,7 @@ size_t Attribute::data_sizeof() const 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; @@ -92,6 +97,9 @@ size_t Attribute::element_size(int numverts, int numtris, int numcurves, int num case ATTR_ELEMENT_VERTEX: size = numverts; break; + case ATTR_ELEMENT_VERTEX_MOTION: + size = numverts * (numsteps - 1); + break; case ATTR_ELEMENT_FACE: size = numtris; break; @@ -104,6 +112,9 @@ size_t Attribute::element_size(int numverts, int numtris, int numcurves, int num case ATTR_ELEMENT_CURVE_KEY: size = numkeys; break; + case ATTR_ELEMENT_CURVE_KEY_MOTION: + size = numkeys * (numsteps - 1); + break; default: size = 0; break; @@ -112,9 +123,9 @@ size_t Attribute::element_size(int numverts, int numtris, int numcurves, int num 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) @@ -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); @@ -202,9 +213,9 @@ Attribute *AttributeSet::add(ustring name, TypeDesc type, AttributeElement eleme /* this is weak .. */ 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) - 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; } @@ -343,9 +354,9 @@ void AttributeSet::reserve() { foreach(Attribute& attr, attributes) { 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) - 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); } } diff --git a/intern/cycles/render/attribute.h b/intern/cycles/render/attribute.h index 0b8905ae5a3..5160224f4e3 100644 --- a/intern/cycles/render/attribute.h +++ b/intern/cycles/render/attribute.h @@ -49,19 +49,21 @@ public: Attribute() {} 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 element_size(int numverts, int numfaces, int numcurves, int numkeys) const; - size_t buffer_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 numsteps, int numcurves, int numkeys) const; char *data() { return (buffer.size())? &buffer[0]: NULL; }; float3 *data_float3() { return (float3*)data(); } + float4 *data_float4() { return (float4*)data(); } float *data_float() { return (float*)data(); } Transform *data_transform() { return (Transform*)data(); } const char *data() const { return (buffer.size())? &buffer[0]: NULL; } 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 Transform *data_transform() const { return (const Transform*)data(); } @@ -86,7 +88,7 @@ public: 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; void remove(ustring name); diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp index 93f24886dc9..1c92eb584c1 100644 --- a/intern/cycles/render/mesh.cpp +++ b/intern/cycles/render/mesh.cpp @@ -46,6 +46,8 @@ Mesh::Mesh() displacement_method = DISPLACE_BUMP; bounds = BoundBox::empty; + motion_steps = 3; + bvh = NULL; tri_offset = 0; @@ -641,6 +643,7 @@ static void update_attribute_element_offset(Mesh *mesh, vector& attr_floa size_t size = mattr->element_size( mesh->verts.size(), mesh->triangles.size(), + mesh->motion_steps, mesh->curves.size(), mesh->curve_keys.size()); @@ -663,19 +666,21 @@ static void update_attribute_element_offset(Mesh *mesh, vector& attr_floa attr_float3[offset+k] = (&tfm->x)[k]; } else { - float3 *data = mattr->data_float3(); + float4 *data = mattr->data_float4(); offset = attr_float3.size(); attr_float3.resize(attr_float3.size() + size); 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 * a correction for that in here */ if(element == ATTR_ELEMENT_VERTEX) offset -= mesh->vert_offset; + else if(element == ATTR_ELEMENT_VERTEX_MOTION) + offset -= mesh->vert_offset; else if(element == ATTR_ELEMENT_FACE) offset -= mesh->tri_offset; else if(element == ATTR_ELEMENT_CORNER) @@ -684,6 +689,8 @@ static void update_attribute_element_offset(Mesh *mesh, vector& attr_floa offset -= mesh->curve_offset; else if(element == ATTR_ELEMENT_CURVE_KEY) offset -= mesh->curvekey_offset; + else if(element == ATTR_ELEMENT_CURVE_KEY_MOTION) + offset -= mesh->curvekey_offset; } else { /* attribute not found */ @@ -750,8 +757,8 @@ void MeshManager::device_update_attributes(Device *device, DeviceScene *dscene, /* create attribute lookup maps */ if(scene->shader_manager->use_osl()) 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; diff --git a/intern/cycles/render/mesh.h b/intern/cycles/render/mesh.h index 281a8f0645e..9c59aca4c72 100644 --- a/intern/cycles/render/mesh.h +++ b/intern/cycles/render/mesh.h @@ -90,6 +90,8 @@ public: Transform transform_normal; DisplacementMethod displacement_method; + uint motion_steps; + /* Update Flags */ bool need_update; bool need_update_rebuild; -- cgit v1.2.3