[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