Cycles code refactor: add support for motion vertex attributes.
authorBrecht Van Lommel <brechtvanlommel@gmail.com>
Sat, 29 Mar 2014 12:03:46 +0000 (13:03 +0100)
committerBrecht Van Lommel <brechtvanlommel@gmail.com>
Sat, 29 Mar 2014 12:03:46 +0000 (13:03 +0100)
intern/cycles/kernel/geom/geom_curve.h
intern/cycles/kernel/geom/geom_triangle.h
intern/cycles/kernel/kernel_types.h
intern/cycles/render/attribute.cpp
intern/cycles/render/attribute.h
intern/cycles/render/mesh.cpp
intern/cycles/render/mesh.h

index 2daeb59c0aeede4a0594e670bf717653203e25c3..ec9081a6c75082e423daf339ff2dba9f87ad79f1 100644 (file)
@@ -28,7 +28,7 @@ ccl_device float curve_attribute_float(KernelGlobals *kg, const ShaderData *sd,
 
                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);
                int k0 = __float_as_int(curvedata.x) + sd->segment;
                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));
        }
-       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);
                int k0 = __float_as_int(curvedata.x) + sd->segment;
                int k1 = k0 + 1;
index 6eaa077584bc3ebc4673479c0252620932ae4ea5..1bdc76445f9e17664793e094b735adbe10ead1b9 100644 (file)
@@ -176,7 +176,7 @@ ccl_device float triangle_attribute_float(KernelGlobals *kg, const ShaderData *s
 
                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));
 
                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));
        }
-       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 f0 = float4_to_float3(kernel_tex_fetch(__attributes_float3, offset + __float_as_int(tri_vindex.x)));
index 67029d9fb7789e0b2995bbb23a048a012710e7b3..70fafdfec9229a2aefceb5ef557bb09c83c41d39 100644 (file)
@@ -434,9 +434,11 @@ typedef enum AttributeElement {
        ATTR_ELEMENT_MESH,
        ATTR_ELEMENT_FACE,
        ATTR_ELEMENT_VERTEX,
+       ATTR_ELEMENT_VERTEX_MOTION,
        ATTR_ELEMENT_CORNER,
        ATTR_ELEMENT_CURVE,
-       ATTR_ELEMENT_CURVE_KEY
+       ATTR_ELEMENT_CURVE_KEY,
+       ATTR_ELEMENT_CURVE_KEY_MOTION
 } AttributeElement;
 
 typedef enum AttributeStandard {
index 61b9cf2f3bc25ae9e1a17ba2410d03835ca342c1..bef3295d927a85cdf7ffec36ec7056ac7fe0db16 100644 (file)
@@ -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);
        }
 }
 
index 0b8905ae5a320bce2057dbe65724df63ee720437..5160224f4e3e9e9d10966d63e8a33500810ac98b 100644 (file)
@@ -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);
 
index 93f24886dc9aa2b633e0a20e4056a34f272f81eb..1c92eb584c1e6c5a5afbd4033391a217db4a3fdd 100644 (file)
@@ -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<float>& 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<float>& 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<float>& 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;
 
index 281a8f0645eb0740ce2361240f651023e0ea80c8..9c59aca4c728dab12b8f9d47b459e5eb5a2cbebf 100644 (file)
@@ -90,6 +90,8 @@ public:
        Transform transform_normal;
        DisplacementMethod displacement_method;
 
+       uint motion_steps;
+
        /* Update Flags */
        bool need_update;
        bool need_update_rebuild;