Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2019-01-04 17:57:44 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2019-01-04 17:58:41 +0300
commitb69cbe7d8759e604e34d81a9ddc90d8167751f33 (patch)
tree226fb926b8dc81e5f31b2e7b69f1b99356dae8bf /source/blender/blenkernel/intern/subdiv_displacement_multires.c
parentbfac8a429c7fd34daf562bb4af4146735baf9e98 (diff)
Fix T60124: Multires modifier not reading data from external files
Diffstat (limited to 'source/blender/blenkernel/intern/subdiv_displacement_multires.c')
-rw-r--r--source/blender/blenkernel/intern/subdiv_displacement_multires.c35
1 files changed, 25 insertions, 10 deletions
diff --git a/source/blender/blenkernel/intern/subdiv_displacement_multires.c b/source/blender/blenkernel/intern/subdiv_displacement_multires.c
index 5744ac3ca0d..d6865e1826f 100644
--- a/source/blender/blenkernel/intern/subdiv_displacement_multires.c
+++ b/source/blender/blenkernel/intern/subdiv_displacement_multires.c
@@ -49,20 +49,23 @@ typedef struct PolyCornerIndex {
typedef struct MultiresDisplacementData {
int grid_size;
+ /* Mesh is used to read external displacement. */
+ Mesh *mesh;
const MPoly *mpoly;
const MDisps *mdisps;
/* Indexed by ptex face index, contains polygon/corner which corresponds
* to it.
*
* NOTE: For quad polygon this is an index of first corner only, since
- * there we only have one ptex.
- */
+ * there we only have one ptex. */
PolyCornerIndex *ptex_poly_corner;
+ /* Sanity check, is used in debug builds.
+ * Controls that initialize() was called prior to eval_displacement(). */
+ bool is_initialized;
} MultiresDisplacementData;
/* Denotes which grid to use to average value of the displacement read from the
- * grid which corresponds to the ptex face.
- */
+ * grid which corresponds to the ptex face. */
typedef enum eAverageWith {
AVERAGE_WITH_NONE,
AVERAGE_WITH_ALL,
@@ -238,6 +241,16 @@ static void average_displacement(SubdivDisplacement *displacement,
}
}
+static void initialize(SubdivDisplacement *displacement)
+{
+ MultiresDisplacementData *data = displacement->user_data;
+ Mesh *mesh = data->mesh;
+ /* Make sure external displacement is read. */
+ CustomData_external_read(
+ &mesh->ldata, &mesh->id, CD_MASK_MDISPS, mesh->totloop);
+ data->is_initialized = true;
+}
+
static void eval_displacement(SubdivDisplacement *displacement,
const int ptex_face_index,
const float u, const float v,
@@ -245,6 +258,7 @@ static void eval_displacement(SubdivDisplacement *displacement,
float r_D[3])
{
MultiresDisplacementData *data = displacement->user_data;
+ BLI_assert(data->is_initialized);
const int grid_size = data->grid_size;
/* Get displacement in tangent space. */
const MDisps *displacement_grid;
@@ -254,8 +268,7 @@ static void eval_displacement(SubdivDisplacement *displacement,
&displacement_grid,
&grid_u, &grid_v);
/* Read displacement from the current displacement grid and see if any
- * averaging is needed.
- */
+ * averaging is needed. */
float tangent_D[3];
eAverageWith average_with =
read_displacement_grid(displacement_grid, grid_size,
@@ -279,8 +292,7 @@ static void free_displacement(SubdivDisplacement *displacement)
}
/* TODO(sergey): This seems to be generally used information, which almost
- * worth adding to a subdiv itself, with possible cache of the value.
- */
+ * worth adding to a subdiv itself, with possible cache of the value. */
static int count_num_ptex_faces(const Mesh *mesh)
{
int num_ptex_faces = 0;
@@ -323,25 +335,28 @@ static void displacement_data_init_mapping(SubdivDisplacement *displacement,
}
static void displacement_init_data(SubdivDisplacement *displacement,
- const Mesh *mesh,
+ Mesh *mesh,
const MultiresModifierData *mmd)
{
MultiresDisplacementData *data = displacement->user_data;
data->grid_size = BKE_subdiv_grid_size_from_level(mmd->totlvl);
+ data->mesh = mesh;
data->mpoly = mesh->mpoly;
data->mdisps = CustomData_get_layer(&mesh->ldata, CD_MDISPS);
+ data->is_initialized = false;
displacement_data_init_mapping(displacement, mesh);
}
static void displacement_init_functions(SubdivDisplacement *displacement)
{
+ displacement->initialize = initialize;
displacement->eval_displacement = eval_displacement;
displacement->free = free_displacement;
}
void BKE_subdiv_displacement_attach_from_multires(
Subdiv *subdiv,
- const Mesh *mesh,
+ Mesh *mesh,
const MultiresModifierData *mmd)
{
/* Make sure we don't have previously assigned displacement. */