[Bf-blender-cvs] [9e11b8e2493] blender2.8: Multires: implement reshape operation

Sergey Sharybin noreply at git.blender.org
Wed Aug 22 12:22:12 CEST 2018


Commit: 9e11b8e24939fbc73930bc05ddea1f79bb00783f
Author: Sergey Sharybin
Date:   Tue Aug 21 15:40:23 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB9e11b8e24939fbc73930bc05ddea1f79bb00783f

Multires: implement reshape operation

The one which is used by applying deformation modifiers on the multires.

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

M	source/blender/blenkernel/BKE_multires.h
M	source/blender/blenkernel/CMakeLists.txt
M	source/blender/blenkernel/intern/multires.c
A	source/blender/blenkernel/intern/multires_reshape.c
A	source/blender/blenkernel/intern/multires_subdiv.c
M	source/blender/modifiers/intern/MOD_multires.c

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

diff --git a/source/blender/blenkernel/BKE_multires.h b/source/blender/blenkernel/BKE_multires.h
index 71997e55b66..d94e3f263eb 100644
--- a/source/blender/blenkernel/BKE_multires.h
+++ b/source/blender/blenkernel/BKE_multires.h
@@ -82,7 +82,7 @@ struct DerivedMesh *multires_make_derived_from_derived(struct DerivedMesh *dm,
 struct MultiresModifierData *find_multires_modifier_before(struct Scene *scene,
                                                            struct ModifierData *lastmd);
 struct MultiresModifierData *get_multires_modifier(struct Scene *scene, struct Object *ob, bool use_first);
-int multires_get_level(struct Scene *scene, struct Object *ob, const struct MultiresModifierData *mmd,
+int multires_get_level(const struct Scene *scene, const struct Object *ob, const struct MultiresModifierData *mmd,
                        bool render, bool ignore_simplify);
 struct DerivedMesh *get_multires_dm(struct Depsgraph *depsgraph, struct Scene *scene, struct MultiresModifierData *mmd,
                                     struct Object *ob);
@@ -94,13 +94,6 @@ void multiresModifier_base_apply(struct MultiresModifierData *mmd, struct Scene
 void multiresModifier_subdivide(struct MultiresModifierData *mmd, struct Scene *scene, struct Object *ob, int updateblock, int simple);
 void multiresModifier_sync_levels_ex(
         struct Scene *scene, struct Object *ob_dst, struct MultiresModifierData *mmd_src, struct MultiresModifierData *mmd_dst);
-int multiresModifier_reshape(struct Depsgraph *depsgraph, struct Scene *scene, struct MultiresModifierData *mmd,
-                             struct Object *dst, struct Object *src);
-int multiresModifier_reshapeFromDM(struct Depsgraph *depsgraph, struct Scene *scene, struct MultiresModifierData *mmd,
-                                   struct Object *ob, struct DerivedMesh *srcdm);
-bool multiresModifier_reshapeFromDeformModifier(
-        struct Depsgraph *depsgraph, struct Scene *scene, struct MultiresModifierData *mmd,
-        struct Object *ob, struct ModifierData *md);
 
 void multires_stitch_grids(struct Object *);
 
@@ -121,4 +114,28 @@ void multires_topology_changed(struct Mesh *me);
 void old_mdisps_bilinear(float out[3], float (*disps)[3], const int st, float u, float v);
 int mdisp_rot_face_to_crn(struct MVert *mvert, struct MPoly *mpoly, struct MLoop *mloops, const struct MLoopTri *lt, const int face_side, const float u, const float v, float *x, float *y);
 
+/* Reshaping, define in multires_reshape.c */
+
+bool multiresModifier_reshape(struct Depsgraph *depsgraph, struct Scene *scene, struct MultiresModifierData *mmd,
+                              struct Object *dst, struct Object *src);
+bool multiresModifier_reshapeFromDeformModifier(
+        struct Depsgraph *depsgraph, struct Scene *scene, struct MultiresModifierData *mmd,
+        struct Object *ob, struct ModifierData *md);
+
+/* Subdivision integration, defined in multires_subdiv.c */
+
+struct SubdivSettings;
+struct SubdivToMeshSettings;
+
+void BKE_multires_subdiv_settings_init(
+        struct SubdivSettings *settings,
+        const struct MultiresModifierData *mmd);
+
+void BKE_multires_subdiv_mesh_settings_init(
+        struct SubdivToMeshSettings *mesh_settings,
+        const struct Scene *scene,
+        const struct Object *object,
+        const struct MultiresModifierData *mmd,
+        const bool use_render_params);
+
 #endif  /* __BKE_MULTIRES_H__ */
diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt
index 01900d5b6cf..91355e8ebcc 100644
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@ -155,6 +155,8 @@ set(SRC
 	intern/modifier.c
 	intern/movieclip.c
 	intern/multires.c
+	intern/multires_reshape.c
+	intern/multires_subdiv.c
 	intern/nla.c
 	intern/node.c
 	intern/object.c
diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c
index 995c8a12ebe..f44f1265904 100644
--- a/source/blender/blenkernel/intern/multires.c
+++ b/source/blender/blenkernel/intern/multires.c
@@ -359,7 +359,7 @@ MultiresModifierData *get_multires_modifier(Scene *scene, Object *ob, bool use_f
 	return mmd;
 }
 
-int multires_get_level(Scene *scene, Object *ob, const MultiresModifierData *mmd,
+int multires_get_level(const Scene *scene, const Object *ob, const MultiresModifierData *mmd,
                        bool render, bool ignore_simplify)
 {
 	if (render)
@@ -421,70 +421,6 @@ void multires_force_render_update(Object *ob)
 		multires_force_update(ob);
 }
 
-int multiresModifier_reshapeFromDM(struct Depsgraph *depsgraph, Scene *scene, MultiresModifierData *mmd,
-                                   Object *ob, DerivedMesh *srcdm)
-{
-	DerivedMesh *mrdm = get_multires_dm(depsgraph, scene, mmd, ob);
-
-	if (mrdm && srcdm && mrdm->getNumVerts(mrdm) == srcdm->getNumVerts(srcdm)) {
-		multires_mvert_to_ss(mrdm, srcdm->getVertArray(srcdm));
-
-		multires_dm_mark_as_modified(mrdm, MULTIRES_COORDS_MODIFIED);
-		multires_force_update(ob);
-
-		mrdm->release(mrdm);
-
-		return 1;
-	}
-
-	if (mrdm) mrdm->release(mrdm);
-
-	return 0;
-}
-
-/* Returns 1 on success, 0 if the src's totvert doesn't match */
-int multiresModifier_reshape(struct Depsgraph *depsgraph, Scene *scene, MultiresModifierData *mmd, Object *dst, Object *src)
-{
-	DerivedMesh *srcdm = mesh_get_derived_final(depsgraph, scene, src, CD_MASK_BAREMESH);
-	return multiresModifier_reshapeFromDM(depsgraph, scene, mmd, dst, srcdm);
-}
-
-bool multiresModifier_reshapeFromDeformModifier(
-        struct Depsgraph *depsgraph, Scene *scene, MultiresModifierData *mmd,
-        Object *ob, ModifierData *md)
-{
-	DerivedMesh *dm, *ndm;
-	int numVerts;
-	float (*deformedVerts)[3];
-	const ModifierEvalContext mectx = {depsgraph, ob, 0};
-
-	if (multires_get_level(scene, ob, mmd, false, true) == 0) {
-		return false;
-	}
-
-	/* Create DerivedMesh for deformation modifier */
-	dm = get_multires_dm(depsgraph, scene, mmd, ob);
-	numVerts = dm->getNumVerts(dm);
-	deformedVerts = MEM_malloc_arrayN(numVerts, sizeof(float[3]), "multiresReshape_deformVerts");
-
-	dm->getVertCos(dm, deformedVerts);
-	modifier_deformVerts_DM_deprecated(md, &mectx, dm, deformedVerts, numVerts);
-
-	ndm = CDDM_copy(dm);
-	CDDM_apply_vert_coords(ndm, deformedVerts);
-
-	MEM_freeN(deformedVerts);
-	dm->release(dm);
-
-	/* Reshaping */
-	bool result = (multiresModifier_reshapeFromDM(depsgraph, scene, mmd, ob, ndm) != 0);
-
-	/* Cleanup */
-	ndm->release(ndm);
-
-	return result;
-}
-
 /* reset the multires levels to match the number of mdisps */
 static int get_levels_from_disps(Object *ob)
 {
diff --git a/source/blender/blenkernel/intern/multires_reshape.c b/source/blender/blenkernel/intern/multires_reshape.c
new file mode 100644
index 00000000000..c1cce0ad657
--- /dev/null
+++ b/source/blender/blenkernel/intern/multires_reshape.c
@@ -0,0 +1,467 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software  Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2018 Blender Foundation.
+ * All rights reserved.
+ *
+ * Contributor(s): Sergey Sharybin.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/blenkernel/intern/multires_reshape.c
+ *  \ingroup bke
+ */
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_scene_types.h"
+
+#include "BLI_utildefines.h"
+#include "BLI_math_vector.h"
+
+#include "BKE_library.h"
+#include "BKE_mesh.h"
+#include "BKE_mesh_runtime.h"
+#include "BKE_modifier.h"
+#include "BKE_multires.h"
+#include "BKE_subdiv.h"
+
+#include "DEG_depsgraph_query.h"
+
+/* TODO(sergey): De-duplicate with subdiv_displacement_multires.c. */
+
+/* Coordinates within grid has different convention from PTex coordinates.
+ * This function converts the latter ones to former.
+ */
+BLI_INLINE void ptex_uv_to_grid_uv(const float ptex_u, const float ptex_v,
+                                   float *r_grid_u, float *r_grid_v)
+{
+	*r_grid_u = 1.0f - ptex_v;
+	*r_grid_v = 1.0f - ptex_u;
+}
+
+/* Simplified version of mdisp_rot_face_to_crn, only handles quad and
+ * works in normalized coordinates.
+ *
+ * NOTE: Output coordinates are in ptex coordinates.
+ */
+BLI_INLINE int rotate_quad_to_corner(const float u, const float v,
+                                     float *r_u, float *r_v)
+{
+	int corner;
+	if (u <= 0.5f && v <= 0.5f) {
+		corner = 0;
+		*r_u = 2.0f * u;
+		*r_v = 2.0f * v;
+	}
+	else if (u > 0.5f  && v <= 0.5f) {
+		corner = 1;
+		*r_u = 2.0f * v;
+		*r_v = 2.0f * (1.0f - u);
+	}
+	else if (u > 0.5f  && v > 0.5f) {
+		corner = 2;
+		*r_u = 2.0f * (1.0f - u);
+		*r_v = 2.0f * (1.0f - v);
+	}
+	else if (u <= 0.5f && v >= 0.5f) {
+		corner = 3;
+		*r_u = 2.0f * (1.0f - v);
+		*r_v = 2.0f * u;
+	}
+	else {
+		BLI_assert(!"Unexpected corner configuration");
+	}
+	return corner;
+}
+
+BLI_INLINE void construct_tangent_matrix(float tangent_matrix[3][3],
+                                         const float dPdu[3],
+                                         const float dPdv[3],
+                                         const int corner)
+{
+	if (corner == 0) {
+		copy_v3_v3(tangent_matrix[0], dPdv);
+		copy_v3_v3(tangent_matrix[1], dPdu);
+		mul_v3_fl(tangent_matrix[0], -1.0f);
+		mul_v3_fl(tangent_matrix[1], -1.0f);
+	}
+	else if (corner == 1) {
+		copy_v3_v3(tangent_matrix[0], dPdu);
+		copy_v3_v3(tangent_matrix[1], dPdv);
+		mul_v3_fl(tangent_matrix[1], -1.0f);
+	}
+	else if (corner == 2) {
+		copy_v3_v3(tangent_matri

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list