[Bf-blender-cvs] [eb8376b] temp-cycles-microdisplacement: Sync ngons and attributes from Blender to Cycles
Mai Lavelle
noreply at git.blender.org
Fri Jun 24 19:26:44 CEST 2016
Commit: eb8376bcbe7ba00e68c142235421c57e4e3304f0
Author: Mai Lavelle
Date: Wed Jun 22 11:27:15 2016 -0400
Branches: temp-cycles-microdisplacement
https://developer.blender.org/rBeb8376bcbe7ba00e68c142235421c57e4e3304f0
Sync ngons and attributes from Blender to Cycles
===================================================================
M intern/cycles/blender/blender_mesh.cpp
M intern/cycles/blender/blender_util.h
M intern/cycles/render/mesh.cpp
===================================================================
diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp
index 3f22355..455668a 100644
--- a/intern/cycles/blender/blender_mesh.cpp
+++ b/intern/cycles/blender/blender_mesh.cpp
@@ -191,8 +191,7 @@ static void mikk_compute_tangents(BL::Mesh& b_mesh,
const vector<int>& nverts,
const vector<int>& face_flags,
bool need_sign,
- bool active_render,
- bool subdivision)
+ bool active_render)
{
/* setup userdata */
MikkUserData userdata(b_mesh, b_layer, nverts.size());
@@ -218,7 +217,6 @@ static void mikk_compute_tangents(BL::Mesh& b_mesh,
/* create tangent attributes */
Attribute *attr;
- AttributeSet& mesh_attributes = subdivision? mesh->subd_attributes: mesh->attributes;
ustring name;
if(b_layer != NULL)
name = ustring((string(b_layer->name().c_str()) + ".tangent").c_str());
@@ -226,9 +224,9 @@ static void mikk_compute_tangents(BL::Mesh& b_mesh,
name = ustring("orco.tangent");
if(active_render)
- attr = mesh_attributes.add(ATTR_STD_UV_TANGENT, name);
+ attr = mesh->attributes.add(ATTR_STD_UV_TANGENT, name);
else
- attr = mesh_attributes.add(name, TypeDesc::TypeVector, ATTR_ELEMENT_CORNER);
+ attr = mesh->attributes.add(name, TypeDesc::TypeVector, ATTR_ELEMENT_CORNER);
float3 *tangent = attr->data_float3();
@@ -244,59 +242,40 @@ static void mikk_compute_tangents(BL::Mesh& b_mesh,
name_sign = ustring("orco.tangent_sign");
if(active_render)
- attr_sign = mesh_attributes.add(ATTR_STD_UV_TANGENT_SIGN, name_sign);
+ attr_sign = mesh->attributes.add(ATTR_STD_UV_TANGENT_SIGN, name_sign);
else
- attr_sign = mesh_attributes.add(name_sign, TypeDesc::TypeFloat, ATTR_ELEMENT_CORNER);
+ attr_sign = mesh->attributes.add(name_sign, TypeDesc::TypeFloat, ATTR_ELEMENT_CORNER);
tangent_sign = attr_sign->data_float();
}
- if(!subdivision) {
- for(int i = 0; i < nverts.size(); i++) {
- int tri_a[3], tri_b[3];
- face_split_tri_indices(nverts[i], face_flags[i], tri_a, tri_b);
+ for(int i = 0; i < nverts.size(); i++) {
+ int tri_a[3], tri_b[3];
+ face_split_tri_indices(nverts[i], face_flags[i], tri_a, tri_b);
- tangent[0] = float4_to_float3(userdata.tangent[i*4 + tri_a[0]]);
- tangent[1] = float4_to_float3(userdata.tangent[i*4 + tri_a[1]]);
- tangent[2] = float4_to_float3(userdata.tangent[i*4 + tri_a[2]]);
- tangent += 3;
+ tangent[0] = float4_to_float3(userdata.tangent[i*4 + tri_a[0]]);
+ tangent[1] = float4_to_float3(userdata.tangent[i*4 + tri_a[1]]);
+ tangent[2] = float4_to_float3(userdata.tangent[i*4 + tri_a[2]]);
+ tangent += 3;
- if(tangent_sign) {
- tangent_sign[0] = userdata.tangent[i*4 + tri_a[0]].w;
- tangent_sign[1] = userdata.tangent[i*4 + tri_a[1]].w;
- tangent_sign[2] = userdata.tangent[i*4 + tri_a[2]].w;
- tangent_sign += 3;
- }
-
- if(nverts[i] == 4) {
- tangent[0] = float4_to_float3(userdata.tangent[i*4 + tri_b[0]]);
- tangent[1] = float4_to_float3(userdata.tangent[i*4 + tri_b[1]]);
- tangent[2] = float4_to_float3(userdata.tangent[i*4 + tri_b[2]]);
- tangent += 3;
-
- if(tangent_sign) {
- tangent_sign[0] = userdata.tangent[i*4 + tri_b[0]].w;
- tangent_sign[1] = userdata.tangent[i*4 + tri_b[1]].w;
- tangent_sign[2] = userdata.tangent[i*4 + tri_b[2]].w;
- tangent_sign += 3;
- }
- }
+ if(tangent_sign) {
+ tangent_sign[0] = userdata.tangent[i*4 + tri_a[0]].w;
+ tangent_sign[1] = userdata.tangent[i*4 + tri_a[1]].w;
+ tangent_sign[2] = userdata.tangent[i*4 + tri_a[2]].w;
+ tangent_sign += 3;
}
- }
- else {
- for(int i = 0; i < nverts.size(); i++) {
- tangent[0] = float4_to_float3(userdata.tangent[i*4 + 0]);
- tangent[1] = float4_to_float3(userdata.tangent[i*4 + 1]);
- tangent[2] = float4_to_float3(userdata.tangent[i*4 + 2]);
- tangent[3] = float4_to_float3(userdata.tangent[i*4 + 3]);
- tangent += 4;
+
+ if(nverts[i] == 4) {
+ tangent[0] = float4_to_float3(userdata.tangent[i*4 + tri_b[0]]);
+ tangent[1] = float4_to_float3(userdata.tangent[i*4 + tri_b[1]]);
+ tangent[2] = float4_to_float3(userdata.tangent[i*4 + tri_b[2]]);
+ tangent += 3;
if(tangent_sign) {
- tangent_sign[0] = userdata.tangent[i*4 + 0].w;
- tangent_sign[1] = userdata.tangent[i*4 + 1].w;
- tangent_sign[2] = userdata.tangent[i*4 + 2].w;
- tangent_sign[3] = userdata.tangent[i*4 + 3].w;
- tangent_sign += 4;
+ tangent_sign[0] = userdata.tangent[i*4 + tri_b[0]].w;
+ tangent_sign[1] = userdata.tangent[i*4 + tri_b[1]].w;
+ tangent_sign[2] = userdata.tangent[i*4 + tri_b[2]].w;
+ tangent_sign += 3;
}
}
}
@@ -359,31 +338,55 @@ static void attr_create_vertex_color(Scene *scene,
const vector<int>& face_flags,
bool subdivision)
{
- BL::Mesh::tessface_vertex_colors_iterator l;
- for(b_mesh.tessface_vertex_colors.begin(l); l != b_mesh.tessface_vertex_colors.end(); ++l) {
- if(!mesh->need_attribute(scene, ustring(l->name().c_str())))
- continue;
+ if(subdivision) {
+ BL::Mesh::vertex_colors_iterator l;
- Attribute *attr = (subdivision? mesh->subd_attributes: mesh->attributes).add(
- ustring(l->name().c_str()), TypeDesc::TypeColor, ATTR_ELEMENT_CORNER_BYTE);
+ for(b_mesh.vertex_colors.begin(l); l != b_mesh.vertex_colors.end(); ++l) {
+ if(!mesh->need_attribute(scene, ustring(l->name().c_str())))
+ continue;
- BL::MeshColorLayer::data_iterator c;
- uchar4 *cdata = attr->data_uchar4();
- size_t i = 0;
+ Attribute *attr = mesh->subd_attributes.add(ustring(l->name().c_str()),
+ TypeDesc::TypeColor,
+ ATTR_ELEMENT_CORNER_BYTE);
- for(l->data.begin(c); c != l->data.end(); ++c, ++i) {
- int tri_a[3], tri_b[3];
- face_split_tri_indices(nverts[i], face_flags[i], tri_a, tri_b);
+ BL::Mesh::polygons_iterator p;
+ uchar4 *cdata = attr->data_uchar4();
- uchar4 colors[4];
- colors[0] = color_float_to_byte(color_srgb_to_scene_linear(get_float3(c->color1())));
- colors[1] = color_float_to_byte(color_srgb_to_scene_linear(get_float3(c->color2())));
- colors[2] = color_float_to_byte(color_srgb_to_scene_linear(get_float3(c->color3())));
- if(nverts[i] == 4) {
- colors[3] = color_float_to_byte(color_srgb_to_scene_linear(get_float3(c->color4())));
+ for(b_mesh.polygons.begin(p); p != b_mesh.polygons.end(); ++p) {
+ int n = p->loop_total();
+ for(int i = 0; i < n; i++) {
+ float3 color = get_float3(l->data[p->loop_start() + i].color());
+ *(cdata++) = color_float_to_byte(color_srgb_to_scene_linear(color));
+ }
}
+ }
+ }
+ else {
+ BL::Mesh::tessface_vertex_colors_iterator l;
+ for(b_mesh.tessface_vertex_colors.begin(l); l != b_mesh.tessface_vertex_colors.end(); ++l) {
+ if(!mesh->need_attribute(scene, ustring(l->name().c_str())))
+ continue;
+
+ Attribute *attr = mesh->attributes.add(ustring(l->name().c_str()),
+ TypeDesc::TypeColor,
+ ATTR_ELEMENT_CORNER_BYTE);
+
+ BL::MeshColorLayer::data_iterator c;
+ uchar4 *cdata = attr->data_uchar4();
+ size_t i = 0;
+
+ for(l->data.begin(c); c != l->data.end(); ++c, ++i) {
+ int tri_a[3], tri_b[3];
+ face_split_tri_indices(nverts[i], face_flags[i], tri_a, tri_b);
+
+ uchar4 colors[4];
+ colors[0] = color_float_to_byte(color_srgb_to_scene_linear(get_float3(c->color1())));
+ colors[1] = color_float_to_byte(color_srgb_to_scene_linear(get_float3(c->color2())));
+ colors[2] = color_float_to_byte(color_srgb_to_scene_linear(get_float3(c->color3())));
+ if(nverts[i] == 4) {
+ colors[3] = color_float_to_byte(color_srgb_to_scene_linear(get_float3(c->color4())));
+ }
- if(!subdivision) {
cdata[0] = colors[tri_a[0]];
cdata[1] = colors[tri_a[1]];
cdata[2] = colors[tri_a[2]];
@@ -397,13 +400,6 @@ static void attr_create_vertex_color(Scene *scene,
else
cdata += 3;
}
- else {
- cdata[0] = colors[0];
- cdata[1] = colors[1];
- cdata[2] = colors[2];
- cdata[3] = colors[3];
- cdata += 4;
- }
}
}
}
@@ -416,7 +412,37 @@ static void attr_create_uv_map(Scene *scene,
const vector<int>& face_flags,
bool subdivision)
{
- if(b_mesh.tessface_uv_textures.length() != 0) {
+ if(subdivision) {
+ BL::Mesh::uv_layers_iterator l;
+ int i = 0;
+
+ for(b_mesh.uv_layers.begin(l); l != b_mesh.uv_layers.end(); ++l, ++i) {
+ bool active_render = b_mesh.uv_textures[i].active_render();
+ AttributeStandard std = (active_render)? ATTR_STD_UV: ATTR_STD_NONE;
+ ustring name = ustring(l->name().c_str());
+
+ /* UV map */
+ if(mesh->need_attribute(scene, name) || mesh->need_attribute(scene, std)) {
+ Attribute *attr;
+
+ if(active_render)
+ attr = mesh->subd_attributes.add(std, name);
+ else
+ attr = mesh->subd_attributes.add(name, TypeDesc::TypePoint, ATTR_ELEMENT_CORNER);
+
+ BL::Mesh::polygons_iterator p;
+ float3 *fdata = attr->data_float3();
+
+ for(b_mesh.polygons.begin(p); p != b_mesh.polygons.end(); ++p) {
+ int n = p->loop_total();
+ for(int j = 0; j < n; j++) {
+ *(fdata++) = get_float3(l->data[p->loop_start() + j].uv());
+ }
+ }
+ }
+ }
+ }
+ else if(b_mesh.tessface_uv_textures.length() != 0) {
BL::Mesh::tessface_uv_textures_iterator l;
for(b_mesh.tessface_uv_textures.begin(l); l != b_mesh.tessface_uv_textures.end(); ++l) {
@@ -429,9 +455,9 @@ static void attr_create_uv_map(Scene *scene,
Attribute *attr;
if(active_render)
- attr = (subdivision? mesh->subd_attributes: mesh->attributes).add(std, name);
+ attr = mesh->attributes.add(std, name);
else
- attr = (subdivision? mesh->subd_attributes: mesh->attributes).add(name, TypeDesc::TypePoint, ATTR_ELEMENT_CORNER);
+ attr = mesh->attributes.add(name, TypeDesc::TypePoint, ATTR_ELEMENT_CORNER);
BL::MeshTextureFaceLayer::data_iterator t;
float3 *fdat
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list