[Bf-blender-cvs] [51da664fa18] blender2.8: Fix broken merge in fb45821, was missing changes from cc64872.
Brecht Van Lommel
noreply at git.blender.org
Mon Jan 22 14:44:02 CET 2018
Commit: 51da664fa1848b086b3a942c37dddd8cce0b0d89
Author: Brecht Van Lommel
Date: Mon Jan 22 14:28:43 2018 +0100
Branches: blender2.8
https://developer.blender.org/rB51da664fa1848b086b3a942c37dddd8cce0b0d89
Fix broken merge in fb45821, was missing changes from cc64872.
===================================================================
M intern/cycles/blender/blender_mesh.cpp
===================================================================
diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp
index 2c0548adbed..51f41e58b3b 100644
--- a/intern/cycles/blender/blender_mesh.cpp
+++ b/intern/cycles/blender/blender_mesh.cpp
@@ -79,7 +79,7 @@ inline void face_split_tri_indices(const int face_flag,
struct MikkUserData {
MikkUserData(const BL::Mesh& b_mesh,
- BL::MeshTextureFaceLayer *layer,
+ const char *layer_name,
const Mesh *mesh,
float3 *tangent,
float *tangent_sign)
@@ -89,16 +89,19 @@ struct MikkUserData {
tangent(tangent),
tangent_sign(tangent_sign)
{
- Attribute *attr_vN = mesh->attributes.find(ATTR_STD_VERTEX_NORMAL);
+ const AttributeSet& attributes = (mesh->subd_faces.size()) ?
+ mesh->subd_attributes : mesh->attributes;
+
+ Attribute *attr_vN = attributes.find(ATTR_STD_VERTEX_NORMAL);
vertex_normal = attr_vN->data_float3();
- if(layer == NULL) {
- Attribute *attr_orco = mesh->attributes.find(ATTR_STD_GENERATED);
+ if(layer_name == NULL) {
+ Attribute *attr_orco = attributes.find(ATTR_STD_GENERATED);
orco = attr_orco->data_float3();
mesh_texture_space(*(BL::Mesh*)&b_mesh, orco_loc, orco_size);
}
else {
- Attribute *attr_uv = mesh->attributes.find(ustring(layer->name()));
+ Attribute *attr_uv = attributes.find(ustring(layer_name));
if(attr_uv != NULL) {
texface = attr_uv->data_float3();
}
@@ -120,13 +123,47 @@ struct MikkUserData {
static int mikk_get_num_faces(const SMikkTSpaceContext *context)
{
const MikkUserData *userdata = (const MikkUserData *)context->m_pUserData;
- return userdata->mesh->num_triangles();
+ if(userdata->mesh->subd_faces.size()) {
+ return userdata->mesh->subd_faces.size();
+ }
+ else {
+ return userdata->mesh->num_triangles();
+ }
}
-static int mikk_get_num_verts_of_face(const SMikkTSpaceContext * /*context*/,
- const int /*face_num*/)
+static int mikk_get_num_verts_of_face(const SMikkTSpaceContext *context,
+ const int face_num)
{
- return 3;
+ const MikkUserData *userdata = (const MikkUserData *)context->m_pUserData;
+ if(userdata->mesh->subd_faces.size()) {
+ const Mesh *mesh = userdata->mesh;
+ return mesh->subd_faces[face_num].num_corners;
+ }
+ else {
+ return 3;
+ }
+}
+
+static int mikk_vertex_index(const Mesh *mesh, const int face_num, const int vert_num)
+{
+ if(mesh->subd_faces.size()) {
+ const Mesh::SubdFace& face = mesh->subd_faces[face_num];
+ return mesh->subd_face_corners[face.start_corner + vert_num];
+ }
+ else {
+ return mesh->triangles[face_num * 3 + vert_num];
+ }
+}
+
+static int mikk_corner_index(const Mesh *mesh, const int face_num, const int vert_num)
+{
+ if(mesh->subd_faces.size()) {
+ const Mesh::SubdFace& face = mesh->subd_faces[face_num];
+ return face.start_corner + vert_num;
+ }
+ else {
+ return face_num * 3 + vert_num;
+ }
}
static void mikk_get_position(const SMikkTSpaceContext *context,
@@ -135,9 +172,8 @@ static void mikk_get_position(const SMikkTSpaceContext *context,
{
const MikkUserData *userdata = (const MikkUserData *)context->m_pUserData;
const Mesh *mesh = userdata->mesh;
- const int vert_index = mesh->triangles[face_num * 3 + vert_num];
- const float3 vP = mesh->verts[vert_index];
-
+ const int vertex_index = mikk_vertex_index(mesh, face_num, vert_num);
+ const float3 vP = mesh->verts[vertex_index];
P[0] = vP.x;
P[1] = vP.y;
P[2] = vP.z;
@@ -148,15 +184,15 @@ static void mikk_get_texture_coordinate(const SMikkTSpaceContext *context,
const int face_num, const int vert_num)
{
const MikkUserData *userdata = (const MikkUserData *)context->m_pUserData;
+ const Mesh *mesh = userdata->mesh;
if(userdata->texface != NULL) {
- const size_t corner_index = face_num * 3 + vert_num;
+ const int corner_index = mikk_corner_index(mesh, face_num, vert_num);
float3 tfuv = userdata->texface[corner_index];
uv[0] = tfuv.x;
uv[1] = tfuv.y;
}
else if(userdata->orco != NULL) {
- const Mesh *mesh = userdata->mesh;
- const size_t vertex_index = mesh->triangles[face_num * 3 + vert_num];
+ const int vertex_index = mikk_vertex_index(mesh, face_num, vert_num);
const float3 orco_loc = userdata->orco_loc;
const float3 orco_size = userdata->orco_size;
const float3 orco = (userdata->orco[vertex_index] + orco_loc) / orco_size;
@@ -177,13 +213,25 @@ static void mikk_get_normal(const SMikkTSpaceContext *context, float N[3],
const MikkUserData *userdata = (const MikkUserData *)context->m_pUserData;
const Mesh *mesh = userdata->mesh;
float3 vN;
- if(mesh->smooth[face_num]) {
- const size_t vert_index = mesh->triangles[face_num * 3 + vert_num];
- vN = userdata->vertex_normal[vert_index];
+ if(mesh->subd_faces.size()) {
+ const Mesh::SubdFace& face = mesh->subd_faces[face_num];
+ if(face.smooth) {
+ const int vertex_index = mikk_vertex_index(mesh, face_num, vert_num);
+ vN = userdata->vertex_normal[vertex_index];
+ }
+ else {
+ vN = face.normal(mesh);
+ }
}
else {
- const Mesh::Triangle tri = mesh->get_triangle(face_num);
- vN = tri.compute_normal(&mesh->verts[0]);
+ if(mesh->smooth[face_num]) {
+ const int vertex_index = mikk_vertex_index(mesh, face_num, vert_num);
+ vN = userdata->vertex_normal[vertex_index];
+ }
+ else {
+ const Mesh::Triangle tri = mesh->get_triangle(face_num);
+ vN = tri.compute_normal(&mesh->verts[0]);
+ }
}
N[0] = vN.x;
N[1] = vN.y;
@@ -196,7 +244,8 @@ static void mikk_set_tangent_space(const SMikkTSpaceContext *context,
const int face_num, const int vert_num)
{
MikkUserData *userdata = (MikkUserData *)context->m_pUserData;
- const size_t corner_index = face_num * 3 + vert_num;
+ const Mesh *mesh = userdata->mesh;
+ const int corner_index = mikk_corner_index(mesh, face_num, vert_num);
userdata->tangent[corner_index] = make_float3(T[0], T[1], T[2]);
if(userdata->tangent_sign != NULL) {
userdata->tangent_sign[corner_index] = sign;
@@ -204,27 +253,27 @@ static void mikk_set_tangent_space(const SMikkTSpaceContext *context,
}
static void mikk_compute_tangents(const BL::Mesh& b_mesh,
- BL::MeshTextureFaceLayer *b_layer,
+ const char *layer_name,
Mesh *mesh,
bool need_sign,
bool active_render)
{
/* Create tangent attributes. */
+ AttributeSet& attributes = (mesh->subd_faces.size()) ?
+ mesh->subd_attributes : mesh->attributes;
Attribute *attr;
ustring name;
- if(b_layer != NULL) {
- name = ustring((string(b_layer->name().c_str()) + ".tangent").c_str());
+ if(layer_name != NULL) {
+ name = ustring((string(layer_name) + ".tangent").c_str());
}
else {
name = ustring("orco.tangent");
}
if(active_render) {
- attr = mesh->attributes.add(ATTR_STD_UV_TANGENT, name);
+ attr = attributes.add(ATTR_STD_UV_TANGENT, name);
}
else {
- attr = mesh->attributes.add(name,
- TypeDesc::TypeVector,
- ATTR_ELEMENT_CORNER);
+ attr = attributes.add(name, TypeDesc::TypeVector, ATTR_ELEMENT_CORNER);
}
float3 *tangent = attr->data_float3();
/* Create bitangent sign attribute. */
@@ -232,8 +281,8 @@ static void mikk_compute_tangents(const BL::Mesh& b_mesh,
if(need_sign) {
Attribute *attr_sign;
ustring name_sign;
- if(b_layer != NULL) {
- name_sign = ustring((string(b_layer->name().c_str()) +
+ if(layer_name != NULL) {
+ name_sign = ustring((string(layer_name) +
".tangent_sign").c_str());
}
else {
@@ -241,18 +290,17 @@ static void mikk_compute_tangents(const BL::Mesh& b_mesh,
}
if(active_render) {
- attr_sign = mesh->attributes.add(ATTR_STD_UV_TANGENT_SIGN,
- name_sign);
+ attr_sign = attributes.add(ATTR_STD_UV_TANGENT_SIGN, name_sign);
}
else {
- attr_sign = mesh->attributes.add(name_sign,
- TypeDesc::TypeFloat,
- ATTR_ELEMENT_CORNER);
+ attr_sign = attributes.add(name_sign,
+ TypeDesc::TypeFloat,
+ ATTR_ELEMENT_CORNER);
}
tangent_sign = attr_sign->data_float();
}
/* Setup userdata. */
- MikkUserData userdata(b_mesh, b_layer, mesh, tangent, tangent_sign);
+ MikkUserData userdata(b_mesh, layer_name, mesh, tangent, tangent_sign);
/* Setup interface. */
SMikkTSpaceInterface sm_interface;
memset(&sm_interface, 0, sizeof(sm_interface));
@@ -399,45 +447,9 @@ static void attr_create_uv_map(Scene *scene,
Mesh *mesh,
BL::Mesh& b_mesh,
const vector<int>& nverts,
- const vector<int>& face_flags,
- bool subdivision,
- bool subdivide_uvs)
+ const vector<int>& face_flags)
{
- 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_layers[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);
-
- if(subdivide_uvs) {
- attr->flags |= ATTR_SUBDIVIDED;
- }
-
- 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.le
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list