Cycles: Add AttributeDescriptor
Adds a descriptor for attributes that can easily be passed around and extended to contain more data. Will be used for attributes on subdivision meshes. Reviewed By: brecht Differential Revision: https://developer.blender.org/D2110
This commit is contained in:
@@ -831,9 +831,9 @@ void MeshManager::update_osl_attributes(Device *device, Scene *scene, vector<Att
|
||||
OSLGlobals::Attribute osl_attr;
|
||||
|
||||
osl_attr.type = attr.type();
|
||||
osl_attr.elem = ATTR_ELEMENT_OBJECT;
|
||||
osl_attr.desc.element = ATTR_ELEMENT_OBJECT;
|
||||
osl_attr.value = attr;
|
||||
osl_attr.offset = 0;
|
||||
osl_attr.desc.offset = 0;
|
||||
|
||||
og->attribute_map[i*ATTR_PRIM_TYPES + ATTR_PRIM_TRIANGLE][attr.name()] = osl_attr;
|
||||
og->attribute_map[i*ATTR_PRIM_TYPES + ATTR_PRIM_CURVE][attr.name()] = osl_attr;
|
||||
@@ -853,9 +853,8 @@ void MeshManager::update_osl_attributes(Device *device, Scene *scene, vector<Att
|
||||
foreach(AttributeRequest& req, attributes.requests) {
|
||||
OSLGlobals::Attribute osl_attr;
|
||||
|
||||
if(req.triangle_element != ATTR_ELEMENT_NONE) {
|
||||
osl_attr.elem = req.triangle_element;
|
||||
osl_attr.offset = req.triangle_offset;
|
||||
if(req.triangle_desc.element != ATTR_ELEMENT_NONE) {
|
||||
osl_attr.desc = req.triangle_desc;
|
||||
|
||||
if(req.triangle_type == TypeDesc::TypeFloat)
|
||||
osl_attr.type = TypeDesc::TypeFloat;
|
||||
@@ -875,9 +874,8 @@ void MeshManager::update_osl_attributes(Device *device, Scene *scene, vector<Att
|
||||
}
|
||||
}
|
||||
|
||||
if(req.curve_element != ATTR_ELEMENT_NONE) {
|
||||
osl_attr.elem = req.curve_element;
|
||||
osl_attr.offset = req.curve_offset;
|
||||
if(req.curve_desc.element != ATTR_ELEMENT_NONE) {
|
||||
osl_attr.desc = req.curve_desc;
|
||||
|
||||
if(req.curve_type == TypeDesc::TypeFloat)
|
||||
osl_attr.type = TypeDesc::TypeFloat;
|
||||
@@ -897,9 +895,8 @@ void MeshManager::update_osl_attributes(Device *device, Scene *scene, vector<Att
|
||||
}
|
||||
}
|
||||
|
||||
if(req.subd_element != ATTR_ELEMENT_NONE) {
|
||||
osl_attr.elem = req.subd_element;
|
||||
osl_attr.offset = req.subd_offset;
|
||||
if(req.subd_desc.element != ATTR_ELEMENT_NONE) {
|
||||
osl_attr.desc = req.subd_desc;
|
||||
|
||||
if(req.subd_type == TypeDesc::TypeFloat)
|
||||
osl_attr.type = TypeDesc::TypeFloat;
|
||||
@@ -971,8 +968,8 @@ void MeshManager::update_svm_attributes(Device *device, DeviceScene *dscene, Sce
|
||||
|
||||
if(mesh->num_triangles()) {
|
||||
attr_map[index].x = id;
|
||||
attr_map[index].y = req.triangle_element;
|
||||
attr_map[index].z = as_uint(req.triangle_offset);
|
||||
attr_map[index].y = req.triangle_desc.element;
|
||||
attr_map[index].z = as_uint(req.triangle_desc.offset);
|
||||
|
||||
if(req.triangle_type == TypeDesc::TypeFloat)
|
||||
attr_map[index].w = NODE_ATTR_FLOAT;
|
||||
@@ -986,8 +983,8 @@ void MeshManager::update_svm_attributes(Device *device, DeviceScene *dscene, Sce
|
||||
|
||||
if(mesh->num_curves()) {
|
||||
attr_map[index].x = id;
|
||||
attr_map[index].y = req.curve_element;
|
||||
attr_map[index].z = as_uint(req.curve_offset);
|
||||
attr_map[index].y = req.curve_desc.element;
|
||||
attr_map[index].z = as_uint(req.curve_desc.offset);
|
||||
|
||||
if(req.curve_type == TypeDesc::TypeFloat)
|
||||
attr_map[index].w = NODE_ATTR_FLOAT;
|
||||
@@ -1001,8 +998,8 @@ void MeshManager::update_svm_attributes(Device *device, DeviceScene *dscene, Sce
|
||||
|
||||
if(mesh->subd_faces.size()) {
|
||||
attr_map[index].x = id;
|
||||
attr_map[index].y = req.subd_element;
|
||||
attr_map[index].z = as_uint(req.subd_offset);
|
||||
attr_map[index].y = req.subd_desc.element;
|
||||
attr_map[index].z = as_uint(req.subd_desc.offset);
|
||||
|
||||
if(req.subd_type == TypeDesc::TypeFloat)
|
||||
attr_map[index].w = NODE_ATTR_FLOAT;
|
||||
@@ -1069,17 +1066,19 @@ static void update_attribute_element_offset(Mesh *mesh,
|
||||
Attribute *mattr,
|
||||
AttributePrimitive prim,
|
||||
TypeDesc& type,
|
||||
int& offset,
|
||||
AttributeElement& element)
|
||||
AttributeDescriptor& desc)
|
||||
{
|
||||
if(mattr) {
|
||||
/* store element and type */
|
||||
element = mattr->element;
|
||||
desc.element = mattr->element;
|
||||
type = mattr->type;
|
||||
|
||||
/* store attribute data in arrays */
|
||||
size_t size = mattr->element_size(mesh, prim);
|
||||
|
||||
AttributeElement& element = desc.element;
|
||||
int& offset = desc.offset;
|
||||
|
||||
if(mattr->element == ATTR_ELEMENT_VOXEL) {
|
||||
/* store slot in offset value */
|
||||
VoxelAttribute *voxel_data = mattr->data_voxel();
|
||||
@@ -1153,8 +1152,8 @@ static void update_attribute_element_offset(Mesh *mesh,
|
||||
}
|
||||
else {
|
||||
/* attribute not found */
|
||||
element = ATTR_ELEMENT_NONE;
|
||||
offset = 0;
|
||||
desc.element = ATTR_ELEMENT_NONE;
|
||||
desc.offset = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1243,8 +1242,7 @@ void MeshManager::device_update_attributes(Device *device, DeviceScene *dscene,
|
||||
triangle_mattr,
|
||||
ATTR_PRIM_TRIANGLE,
|
||||
req.triangle_type,
|
||||
req.triangle_offset,
|
||||
req.triangle_element);
|
||||
req.triangle_desc);
|
||||
|
||||
update_attribute_element_offset(mesh,
|
||||
attr_float, attr_float_offset,
|
||||
@@ -1253,8 +1251,7 @@ void MeshManager::device_update_attributes(Device *device, DeviceScene *dscene,
|
||||
curve_mattr,
|
||||
ATTR_PRIM_CURVE,
|
||||
req.curve_type,
|
||||
req.curve_offset,
|
||||
req.curve_element);
|
||||
req.curve_desc);
|
||||
|
||||
update_attribute_element_offset(mesh,
|
||||
attr_float, attr_float_offset,
|
||||
@@ -1263,8 +1260,7 @@ void MeshManager::device_update_attributes(Device *device, DeviceScene *dscene,
|
||||
subd_mattr,
|
||||
ATTR_PRIM_SUBD,
|
||||
req.subd_type,
|
||||
req.subd_offset,
|
||||
req.subd_element);
|
||||
req.subd_desc);
|
||||
|
||||
if(progress.get_cancel()) return;
|
||||
}
|
||||
|
Reference in New Issue
Block a user