[Bf-blender-cvs] [d58c8e12895] cycles_procedural_api: transform subdface into sockets

Kévin Dietrich noreply at git.blender.org
Tue Sep 22 14:14:46 CEST 2020


Commit: d58c8e12895fbc9111d1f7893337a1f64ee3d646
Author: Kévin Dietrich
Date:   Mon Sep 21 12:44:08 2020 +0200
Branches: cycles_procedural_api
https://developer.blender.org/rBd58c8e12895fbc9111d1f7893337a1f64ee3d646

transform subdface into sockets

===================================================================

M	intern/cycles/blender/blender_mesh.cpp
M	intern/cycles/render/attribute.cpp
M	intern/cycles/render/geometry.cpp
M	intern/cycles/render/mesh.cpp
M	intern/cycles/render/mesh.h
M	intern/cycles/render/mesh_subdivision.cpp
M	intern/cycles/subd/subd_split.cpp

===================================================================

diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp
index 7f098a5830e..97e7a084361 100644
--- a/intern/cycles/blender/blender_mesh.cpp
+++ b/intern/cycles/blender/blender_mesh.cpp
@@ -48,7 +48,7 @@ struct MikkUserData {
                float *tangent_sign)
       : mesh(mesh), texface(NULL), orco(NULL), tangent(tangent), tangent_sign(tangent_sign)
   {
-    const AttributeSet &attributes = (mesh->get_subd_faces().size()) ? mesh->subd_attributes :
+    const AttributeSet &attributes = (mesh->num_subd_faces()) ? mesh->subd_attributes :
                                                                        mesh->attributes;
 
     Attribute *attr_vN = attributes.find(ATTR_STD_VERTEX_NORMAL);
@@ -85,8 +85,8 @@ struct MikkUserData {
 static int mikk_get_num_faces(const SMikkTSpaceContext *context)
 {
   const MikkUserData *userdata = (const MikkUserData *)context->m_pUserData;
-  if (userdata->mesh->get_subd_faces().size()) {
-    return userdata->mesh->get_subd_faces().size();
+  if (userdata->mesh->num_subd_faces()) {
+    return userdata->mesh->num_subd_faces();
   }
   else {
     return userdata->mesh->num_triangles();
@@ -96,9 +96,9 @@ static int mikk_get_num_faces(const SMikkTSpaceContext *context)
 static int mikk_get_num_verts_of_face(const SMikkTSpaceContext *context, const int face_num)
 {
   const MikkUserData *userdata = (const MikkUserData *)context->m_pUserData;
-  if (userdata->mesh->get_subd_faces().size()) {
+  if (userdata->mesh->num_subd_faces()) {
     const Mesh *mesh = userdata->mesh;
-    return mesh->get_subd_faces()[face_num].num_corners;
+    return mesh->get_subd_num_corners()[face_num];
   }
   else {
     return 3;
@@ -107,8 +107,8 @@ static int mikk_get_num_verts_of_face(const SMikkTSpaceContext *context, const i
 
 static int mikk_vertex_index(const Mesh *mesh, const int face_num, const int vert_num)
 {
-  if (mesh->get_subd_faces().size()) {
-    const Mesh::SubdFace &face = mesh->get_subd_faces()[face_num];
+  if (mesh->num_subd_faces()) {
+    const Mesh::SubdFace &face = mesh->get_subd_face(face_num);
     return mesh->get_subd_face_corners()[face.start_corner + vert_num];
   }
   else {
@@ -118,8 +118,8 @@ static int mikk_vertex_index(const Mesh *mesh, const int face_num, const int ver
 
 static int mikk_corner_index(const Mesh *mesh, const int face_num, const int vert_num)
 {
-  if (mesh->get_subd_faces().size()) {
-    const Mesh::SubdFace &face = mesh->get_subd_faces()[face_num];
+  if (mesh->num_subd_faces()) {
+    const Mesh::SubdFace &face = mesh->get_subd_face(face_num);
     return face.start_corner + vert_num;
   }
   else {
@@ -178,8 +178,8 @@ static void mikk_get_normal(const SMikkTSpaceContext *context,
   const MikkUserData *userdata = (const MikkUserData *)context->m_pUserData;
   const Mesh *mesh = userdata->mesh;
   float3 vN;
-  if (mesh->get_subd_faces().size()) {
-    const Mesh::SubdFace &face = mesh->get_subd_faces()[face_num];
+  if (mesh->num_subd_faces()) {
+    const Mesh::SubdFace &face = mesh->get_subd_face(face_num);
     if (face.smooth) {
       const int vertex_index = mikk_vertex_index(mesh, face_num, vert_num);
       vN = userdata->vertex_normal[vertex_index];
@@ -222,7 +222,7 @@ static void mikk_compute_tangents(
     const BL::Mesh &b_mesh, const char *layer_name, Mesh *mesh, bool need_sign, bool active_render)
 {
   /* Create tangent attributes. */
-  AttributeSet &attributes = (mesh->get_subd_faces().size()) ? mesh->subd_attributes :
+  AttributeSet &attributes = (mesh->num_subd_faces()) ? mesh->subd_attributes :
                                                                mesh->attributes;
   Attribute *attr;
   ustring name;
@@ -1023,10 +1023,6 @@ void BlenderSync::sync_mesh(BL::Depsgraph b_depsgraph,
     return;
   }
 
-  // todo(kevin) : we should use some API to set the new topology data
-  array<Mesh::SubdFace> oldsubd_faces;
-  oldsubd_faces.steal_data(mesh->get_subd_faces());
-
   mesh->clear();
   mesh->set_used_shaders(used_shaders);
   mesh->set_time_stamp(b_depsgraph.scene().frame_current());
@@ -1062,8 +1058,13 @@ void BlenderSync::sync_mesh(BL::Depsgraph b_depsgraph,
   sync_mesh_fluid_motion(b_ob, scene, mesh);
 
   /* tag update */
-  bool rebuild = (mesh->triangles_is_modified()) || (oldsubd_faces != mesh->get_subd_faces()) ||
-                 (mesh->subd_face_corners_is_modified());
+  bool rebuild = (mesh->triangles_is_modified()) ||
+      (mesh->subd_num_corners_is_modified()) ||
+      (mesh->subd_shader_is_modified()) ||
+      (mesh->subd_smooth_is_modified()) ||
+      (mesh->subd_ptex_offset_is_modified()) ||
+      (mesh->subd_start_corner_is_modified()) ||
+      (mesh->subd_face_corners_is_modified());
 
   mesh->tag_update(scene, rebuild);
 }
diff --git a/intern/cycles/render/attribute.cpp b/intern/cycles/render/attribute.cpp
index 097b827034e..4f888d40434 100644
--- a/intern/cycles/render/attribute.cpp
+++ b/intern/cycles/render/attribute.cpp
@@ -191,7 +191,7 @@ size_t Attribute::element_size(Geometry *geom, AttributePrimitive prim) const
           size = mesh->num_triangles();
         }
         else {
-          size = mesh->subd_faces.size() + mesh->num_ngons;
+          size = mesh->num_subd_faces() + mesh->num_ngons;
         }
       }
       break;
diff --git a/intern/cycles/render/geometry.cpp b/intern/cycles/render/geometry.cpp
index c0f2833971a..8b9c5b6d0ea 100644
--- a/intern/cycles/render/geometry.cpp
+++ b/intern/cycles/render/geometry.cpp
@@ -435,7 +435,7 @@ void GeometryManager::update_svm_attributes(Device *,
 
       if (geom->is_mesh()) {
         Mesh *mesh = static_cast<Mesh *>(geom);
-        if (mesh->subd_faces.size()) {
+        if (mesh->num_subd_faces()) {
           attr_map[index].x = id;
           attr_map[index].y = req.subd_desc.element;
           attr_map[index].z = as_uint(req.subd_desc.offset);
@@ -810,8 +810,8 @@ void GeometryManager::mesh_calc_offset(Scene *scene)
       vert_size += mesh->verts.size();
       tri_size += mesh->num_triangles();
 
-      if (mesh->subd_faces.size()) {
-        Mesh::SubdFace &last = mesh->subd_faces[mesh->subd_faces.size() - 1];
+      if (mesh->num_subd_faces()) {
+        Mesh::SubdFace last = mesh->get_subd_face(mesh->num_subd_faces() - 1);
         patch_size += (last.ptex_offset + last.num_ptex_faces()) * 8;
 
         /* patch tables are stored in same array so include them in patch_size */
@@ -821,7 +821,7 @@ void GeometryManager::mesh_calc_offset(Scene *scene)
         }
       }
 
-      face_size += mesh->subd_faces.size();
+      face_size += mesh->num_subd_faces();
       corner_size += mesh->subd_face_corners.size();
 
       mesh->optix_prim_offset = optix_prim_size;
@@ -861,8 +861,8 @@ void GeometryManager::device_update_mesh(
       vert_size += mesh->verts.size();
       tri_size += mesh->num_triangles();
 
-      if (mesh->subd_faces.size()) {
-        Mesh::SubdFace &last = mesh->subd_faces[mesh->subd_faces.size() - 1];
+      if (mesh->num_subd_faces()) {
+        Mesh::SubdFace last = mesh->get_subd_face(mesh->num_subd_faces() - 1);
         patch_size += (last.ptex_offset + last.num_ptex_faces()) * 8;
 
         /* patch tables are stored in same array so include them in patch_size */
diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp
index dfdb836d4a9..64faf0622dd 100644
--- a/intern/cycles/render/mesh.cpp
+++ b/intern/cycles/render/mesh.cpp
@@ -144,6 +144,11 @@ NODE_DEFINE(Mesh)
   SOCKET_INT_ARRAY(subd_creases_edge, "Subdivision Crease Edges", array<int>());
   SOCKET_FLOAT_ARRAY(subd_creases_weight, "Subdivision Crease Weights", array<float>());
   SOCKET_INT_ARRAY(subd_face_corners, "Subdivision Face Corners", array<int>());
+  SOCKET_INT_ARRAY(subd_start_corner, "Subdivision Face Start Corner", array<int>());
+  SOCKET_INT_ARRAY(subd_num_corners, "Subdivision Face Corner Count", array<int>());
+  SOCKET_INT_ARRAY(subd_face_corners, "Subdivision Face Shader", array<int>());
+  SOCKET_BOOLEAN_ARRAY(subd_smooth, "Subdivision Face Smooth", array<bool>());
+  SOCKET_INT_ARRAY(subd_ptex_offset, "Subdivision Face PTex Offset", array<int>());
   SOCKET_INT(num_ngons, "NGons Number", 0);
 
   /* Subdivisions parameters */
@@ -207,7 +212,7 @@ void Mesh::resize_mesh(int numverts, int numtris)
   shader.resize(numtris);
   smooth.resize(numtris);
 
-  if (subd_faces.size()) {
+  if (num_subd_faces()) {
     triangle_patch.resize(numtris);
     vert_patch_uv.resize(numverts);
   }
@@ -223,7 +228,7 @@ void Mesh::reserve_mesh(int numverts, int numtris)
   shader.reserve(numtris);
   smooth.reserve(numtris);
 
-  if (subd_faces.size()) {
+  if (num_subd_faces()) {
     triangle_patch.reserve(numtris);
     vert_patch_uv.reserve(numverts);
   }
@@ -233,7 +238,11 @@ void Mesh::reserve_mesh(int numverts, int numtris)
 
 void Mesh::resize_subd_faces(int numfaces, int num_ngons_, int numcorners)
 {
-  subd_faces.resize(numfaces);
+  subd_start_corner.resize(numfaces);
+  subd_num_corners.resize(numfaces);
+  subd_shader.resize(numfaces);
+  subd_smooth.resize(numfaces);
+  subd_ptex_offset.resize(numfaces);
   subd_face_corners.resize(numcorners);
   num_ngons = num_ngons_;
 
@@ -242,7 +251,11 @@ void Mesh::resize_subd_faces(int numfaces, int num_ngons_, int numcorners)
 
 void Mesh::reserve_subd_faces(int numfaces, int num_ngons_, int numcorners)
 {
-  subd_faces.reserve(numfaces);
+  subd_start_corner.reserve(numfaces);
+  subd_num_corners.reserve(numfaces);
+  subd_shader.reserve(numfaces);
+  subd_smooth.reserve(numfaces);
+  subd_ptex_offset.reserve(numfaces);
   subd_face_corners.reserve(numcorners);
   num_ngons = num_ngons_;
 
@@ -270,7 +283,11 @@ void Mesh::clear(bool preserve_voxel_data)
   triangle_patch.clear();
   vert_patch_uv.clear();
 
-  subd_faces.clear();
+  subd_start_corner.clear();
+  subd_num_corners.clear();
+  subd_shader.clear();
+  subd_smooth.clear();
+  subd_ptex_offset.clear();
   subd_face_corners.clear();
 
   num_subd_verts = 0;
@@ -299,7 +316,7 @@ void Mesh::add_vertex(float3 P)
 {
   verts.push_back_reserved(P);
 
-  if (subd_faces.size()) {
+  if (num_subd_faces()) {
     vert_patch_uv.push_back_reserved(make_float2(0.0f, 0.0f));
   }
 }
@@ -310,7 +327,7 @@ voi

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list