Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@gmail.com>2014-03-29 16:03:46 +0400
committerBrecht Van Lommel <brechtvanlommel@gmail.com>2014-03-29 16:03:46 +0400
commit24ad7e0bea77d942267344990d22e931610c3d07 (patch)
tree5fe78f862e08bfb9e26e1d29cea2c2e403718df1 /intern/cycles/render/attribute.cpp
parent41d1675053b457370e70be137fd8105b9cd1890b (diff)
Cycles code refactor: add support for motion vertex attributes.
Diffstat (limited to 'intern/cycles/render/attribute.cpp')
-rw-r--r--intern/cycles/render/attribute.cpp31
1 files changed, 21 insertions, 10 deletions
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);
}
}