From 14c55a5828a41395257fe2e59b11c4659d9b44c0 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 1 Jun 2018 11:59:15 +0200 Subject: Cleanup: long lines --- source/blender/blenkernel/intern/studiolight.c | 31 ++++++++++++++++++-------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/source/blender/blenkernel/intern/studiolight.c b/source/blender/blenkernel/intern/studiolight.c index 1f258a40f3c..6348a19d926 100644 --- a/source/blender/blenkernel/intern/studiolight.c +++ b/source/blender/blenkernel/intern/studiolight.c @@ -257,7 +257,9 @@ static void studiolight_calculate_radiance_cubemap_buffers(StudioLight *sl) sl->flag |= STUDIOLIGHT_RADIANCE_BUFFERS_CALCULATED; } -BLI_INLINE void studiolight_evaluate_radiance_buffer(ImBuf *radiance_buffer, const float normal[3], float color[3], int *hits, int xoffset, int yoffset, int zoffset, float zvalue) +BLI_INLINE void studiolight_evaluate_radiance_buffer( + ImBuf *radiance_buffer, const float normal[3], float color[3], int *hits, + int xoffset, int yoffset, int zoffset, float zvalue) { if (radiance_buffer == NULL) { return; @@ -340,7 +342,9 @@ static void studiolight_calculate_diffuse_light(StudioLight *sl) sl->flag |= STUDIOLIGHT_DIFFUSE_LIGHT_CALCULATED; } -BLI_INLINE void studiolight_evaluate_specular_radiance_buffer(ImBuf *radiance_buffer, const float specular, const float normal[3], float color[3], int *hits, int xoffset, int yoffset, int zoffset, float zvalue) +BLI_INLINE void studiolight_evaluate_specular_radiance_buffer( + ImBuf *radiance_buffer, const float specular, const float normal[3], float color[3], int *hits, + int xoffset, int yoffset, int zoffset, float zvalue) { if (radiance_buffer == NULL) { return; @@ -371,19 +375,25 @@ static void studiolight_calculate_specular_irradiance(StudioLight *sl, float col copy_v3_fl(color, 0.0f); /* back */ - studiolight_evaluate_specular_radiance_buffer(sl->radiance_cubemap_buffers[STUDIOLIGHT_Y_POS], specular, normal, color, &hits, 0, 2, 1, 0.5); + studiolight_evaluate_specular_radiance_buffer( + sl->radiance_cubemap_buffers[STUDIOLIGHT_Y_POS], specular, normal, color, &hits, 0, 2, 1, 0.5); /* front */ - studiolight_evaluate_specular_radiance_buffer(sl->radiance_cubemap_buffers[STUDIOLIGHT_Y_NEG], specular, normal, color, &hits, 0, 2, 1, -0.5); + studiolight_evaluate_specular_radiance_buffer( + sl->radiance_cubemap_buffers[STUDIOLIGHT_Y_NEG], specular, normal, color, &hits, 0, 2, 1, -0.5); /* left */ - studiolight_evaluate_specular_radiance_buffer(sl->radiance_cubemap_buffers[STUDIOLIGHT_X_POS], specular, normal, color, &hits, 1, 2, 0, 0.5); + studiolight_evaluate_specular_radiance_buffer( + sl->radiance_cubemap_buffers[STUDIOLIGHT_X_POS], specular, normal, color, &hits, 1, 2, 0, 0.5); /* right */ - studiolight_evaluate_specular_radiance_buffer(sl->radiance_cubemap_buffers[STUDIOLIGHT_X_NEG], specular, normal, color, &hits, 1, 2, 0, -0.5); + studiolight_evaluate_specular_radiance_buffer( + sl->radiance_cubemap_buffers[STUDIOLIGHT_X_NEG], specular, normal, color, &hits, 1, 2, 0, -0.5); /* top */ - studiolight_evaluate_specular_radiance_buffer(sl->radiance_cubemap_buffers[STUDIOLIGHT_Z_POS], specular, normal, color, &hits, 0, 1, 2, 0.5); + studiolight_evaluate_specular_radiance_buffer( + sl->radiance_cubemap_buffers[STUDIOLIGHT_Z_POS], specular, normal, color, &hits, 0, 1, 2, 0.5); /* bottom */ - studiolight_evaluate_specular_radiance_buffer(sl->radiance_cubemap_buffers[STUDIOLIGHT_Z_NEG], specular, normal, color, &hits, 0, 1, 2, -0.5); + studiolight_evaluate_specular_radiance_buffer( + sl->radiance_cubemap_buffers[STUDIOLIGHT_Z_NEG], specular, normal, color, &hits, 0, 1, 2, -0.5); if (hits) { mul_v3_fl(color, specular / hits); @@ -412,7 +422,10 @@ static void studiolight_calculate_irradiance_equirectangular_image(StudioLight * color += 4; } } - sl->equirectangular_irradiance_buffer = IMB_allocFromBuffer(NULL, colbuf, STUDIOLIGHT_IRRADIANCE_EQUIRECTANGULAR_WIDTH, STUDIOLIGHT_IRRADIANCE_EQUIRECTANGULAR_HEIGHT); + sl->equirectangular_irradiance_buffer = IMB_allocFromBuffer( + NULL, colbuf, + STUDIOLIGHT_IRRADIANCE_EQUIRECTANGULAR_WIDTH, + STUDIOLIGHT_IRRADIANCE_EQUIRECTANGULAR_HEIGHT); MEM_freeN(colbuf); #if 0 IMB_saveiff(sl->equirectangular_irradiance_buffer, "/tmp/studiolight_specular_irradiance.png", IB_rectfloat); -- cgit v1.2.3 From 1bc801e02042b6170bb7758157d8bb1703286623 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Thu, 31 May 2018 14:15:25 +0200 Subject: Fix use of uninitialized value in depsgraph. --- source/blender/depsgraph/intern/depsgraph.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/source/blender/depsgraph/intern/depsgraph.cc b/source/blender/depsgraph/intern/depsgraph.cc index 96e89449d42..26f189aae4b 100644 --- a/source/blender/depsgraph/intern/depsgraph.cc +++ b/source/blender/depsgraph/intern/depsgraph.cc @@ -99,6 +99,7 @@ Depsgraph::Depsgraph(Scene *scene, id_hash = BLI_ghash_ptr_new("Depsgraph id hash"); entry_tags = BLI_gset_ptr_new("Depsgraph entry_tags"); debug_flags = G.debug; + memset(id_type_updated, 0, sizeof(id_type_updated)); } Depsgraph::~Depsgraph() -- cgit v1.2.3 From bcbee4b9a3537cce072509a3ec94d309eb1568cc Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Thu, 31 May 2018 20:51:29 +0200 Subject: Fix missing animation updates when the proxy object is not visible. The relation was inverted here, for a long time already. The reason is unclear and in principle it should work fine in the right direction. --- .../depsgraph/intern/builder/deg_builder_nodes.cc | 7 +++---- .../depsgraph/intern/builder/deg_builder_relations.cc | 19 ++++++++----------- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc index 677dcfbfb8d..5867e278c78 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc @@ -502,10 +502,9 @@ void DepsgraphNodeBuilder::build_object(int base_index, if (object->gpd != NULL) { build_gpencil(object->gpd); } - /* Object that this is a proxy for. */ - if (object->proxy) { - object->proxy->proxy_from = object; - build_object(-1, object->proxy, DEG_ID_LINKED_INDIRECTLY); + /* Proxy object to copy from. */ + if (object->proxy_from) { + build_object(-1, object->proxy_from, DEG_ID_LINKED_INDIRECTLY); } /* Object dupligroup. */ if (object->dup_group != NULL) { diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc index 5d0258ac2fe..d5ea8103742 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc @@ -546,21 +546,18 @@ void DepsgraphRelationBuilder::build_object(Base *base, Object *object) if (object->gpd != NULL) { build_gpencil(object->gpd); } - /* Object that this is a proxy for. */ - if (object->proxy != NULL) { - object->proxy->proxy_from = object; - build_object(NULL, object->proxy); - /* TODO(sergey): This is an inverted relation, matches old depsgraph - * behavior and need to be investigated if it still need to be inverted. - */ - ComponentKey ob_pose_key(&object->id, DEG_NODE_TYPE_EVAL_POSE); - ComponentKey proxy_pose_key(&object->proxy->id, DEG_NODE_TYPE_EVAL_POSE); + /* Proxy object to copy from. */ + if (object->proxy_from != NULL) { + build_object(NULL, object->proxy_from); + ComponentKey ob_pose_key(&object->proxy_from->id, DEG_NODE_TYPE_EVAL_POSE); + ComponentKey proxy_pose_key(&object->id, DEG_NODE_TYPE_EVAL_POSE); add_relation(ob_pose_key, proxy_pose_key, "Proxy Pose"); - ComponentKey ob_transform_key(&object->id, DEG_NODE_TYPE_TRANSFORM); - ComponentKey proxy_transform_key(&object->proxy->id, DEG_NODE_TYPE_TRANSFORM); + ComponentKey ob_transform_key(&object->proxy_from->id, DEG_NODE_TYPE_TRANSFORM); + ComponentKey proxy_transform_key(&object->id, DEG_NODE_TYPE_TRANSFORM); add_relation(ob_transform_key, proxy_transform_key, "Proxy Transform"); } + /* Object dupligroup. */ if (object->dup_group != NULL) { build_collection(object, object->dup_group); -- cgit v1.2.3 From 719e782f2c790aab7a822ad9e01a4fa8c93b5620 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Fri, 1 Jun 2018 11:02:54 +0200 Subject: Modifiers: tiny optimizations for mesh deform, lattice, kdop. --- source/blender/blenkernel/intern/lattice.c | 5 +++-- source/blender/blenlib/intern/BLI_kdopbvh.c | 10 ++++++---- source/blender/modifiers/intern/MOD_meshdeform.c | 9 +++++---- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/source/blender/blenkernel/intern/lattice.c b/source/blender/blenkernel/intern/lattice.c index 381f140ecf6..0fa20f00823 100644 --- a/source/blender/blenkernel/intern/lattice.c +++ b/source/blender/blenkernel/intern/lattice.c @@ -420,10 +420,11 @@ void calc_latt_deform(LatticeDeformData *lattice_deform_data, float co[3], float int defgrp_index = -1; float co_prev[3], weight_blend = 0.0f; MDeformVert *dvert = BKE_lattice_deform_verts_get(ob); + float *__restrict latticedata = lattice_deform_data->latticedata; if (lt->editlatt) lt = lt->editlatt->latt; - if (lattice_deform_data->latticedata == NULL) return; + if (latticedata == NULL) return; if (lt->vgroup[0] && dvert) { defgrp_index = defgroup_name_index(ob, lt->vgroup); @@ -504,7 +505,7 @@ void calc_latt_deform(LatticeDeformData *lattice_deform_data, float co[3], float idx_u = idx_v; } - madd_v3_v3fl(co, &lattice_deform_data->latticedata[idx_u * 3], u); + madd_v3_v3fl(co, &latticedata[idx_u * 3], u); if (defgrp_index != -1) weight_blend += (u * defvert_find_weight(dvert + idx_u, defgrp_index)); diff --git a/source/blender/blenlib/intern/BLI_kdopbvh.c b/source/blender/blenlib/intern/BLI_kdopbvh.c index b3adf3106c1..c6daae97688 100644 --- a/source/blender/blenlib/intern/BLI_kdopbvh.c +++ b/source/blender/blenlib/intern/BLI_kdopbvh.c @@ -513,25 +513,27 @@ static void create_kdop_hull(const BVHTree *tree, BVHNode *node, const float *co } /** - * \note depends on the fact that the BVH's for each face is already build + * \note depends on the fact that the BVH's for each face is already built */ static void refit_kdop_hull(const BVHTree *tree, BVHNode *node, int start, int end) { float newmin, newmax; - float *bv = node->bv; + float *__restrict bv = node->bv; int j; axis_t axis_iter; node_minmax_init(tree, node); for (j = start; j < end; j++) { + float *__restrict node_bv = tree->nodes[j]->bv; + /* for all Axes. */ for (axis_iter = tree->start_axis; axis_iter < tree->stop_axis; axis_iter++) { - newmin = tree->nodes[j]->bv[(2 * axis_iter)]; + newmin = node_bv[(2 * axis_iter)]; if ((newmin < bv[(2 * axis_iter)])) bv[(2 * axis_iter)] = newmin; - newmax = tree->nodes[j]->bv[(2 * axis_iter) + 1]; + newmax = node_bv[(2 * axis_iter) + 1]; if ((newmax > bv[(2 * axis_iter) + 1])) bv[(2 * axis_iter) + 1] = newmax; } diff --git a/source/blender/modifiers/intern/MOD_meshdeform.c b/source/blender/modifiers/intern/MOD_meshdeform.c index 0cd73d0ca16..4fe8942a194 100644 --- a/source/blender/modifiers/intern/MOD_meshdeform.c +++ b/source/blender/modifiers/intern/MOD_meshdeform.c @@ -225,8 +225,8 @@ static void meshdeform_vert_task( const MDeformVert *dvert = data->dvert; const int defgrp_index = data->defgrp_index; const int *offsets = mmd->bindoffsets; - const MDefInfluence *influences = mmd->bindinfluences; - /*const*/ float (*dco)[3] = data->dco; + const MDefInfluence *__restrict influences = mmd->bindinfluences; + /*const*/ float (*__restrict dco)[3] = data->dco; float (*vertexCos)[3] = data->vertexCos; float co[3]; float weight, totweight, fac = 1.0f; @@ -253,11 +253,12 @@ static void meshdeform_vert_task( totweight = meshdeform_dynamic_bind(mmd, dco, co); } else { - int a; totweight = 0.0f; zero_v3(co); + int start = offsets[iter]; + int end = offsets[iter + 1]; - for (a = offsets[iter]; a < offsets[iter + 1]; a++) { + for (int a = start; a < end; a++) { weight = influences[a].weight; madd_v3_v3fl(co, dco[influences[a].vertex], weight); totweight += weight; -- cgit v1.2.3 From 01c75c3765eb305b1a99b794c1d40ad224b071c6 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Thu, 31 May 2018 16:36:20 +0200 Subject: Math: optimizations for 4x4x matrix inverse, multiplications. In some heavy rigs matrix inverse can be 10% of computation time. This reduces it to 2% by using Eigen's optimized 4x4 matrix inverse and SSE matrix multiplication. --- build_files/cmake/Modules/GTestTesting.cmake | 1 + intern/eigen/CMakeLists.txt | 2 + intern/eigen/eigen_capi.h | 1 + intern/eigen/intern/matrix.cc | 56 +++++++++++++++++ intern/eigen/intern/matrix.h | 40 ++++++++++++ intern/eigen/intern/svd.cc | 3 + source/blender/blenlib/intern/math_matrix.c | 91 ++++++++-------------------- 7 files changed, 128 insertions(+), 66 deletions(-) create mode 100644 intern/eigen/intern/matrix.cc create mode 100644 intern/eigen/intern/matrix.h diff --git a/build_files/cmake/Modules/GTestTesting.cmake b/build_files/cmake/Modules/GTestTesting.cmake index ba1334d750e..dd80013cb91 100644 --- a/build_files/cmake/Modules/GTestTesting.cmake +++ b/build_files/cmake/Modules/GTestTesting.cmake @@ -32,6 +32,7 @@ macro(BLENDER_SRC_GTEST_EX NAME SRC EXTRA_LIBS DO_ADD_TEST) ${EXTRA_LIBS} ${PLATFORM_LINKLIBS} bf_testing_main + bf_intern_eigen bf_intern_guardedalloc extern_gtest extern_gmock diff --git a/intern/eigen/CMakeLists.txt b/intern/eigen/CMakeLists.txt index 5811b71de94..b2639359318 100644 --- a/intern/eigen/CMakeLists.txt +++ b/intern/eigen/CMakeLists.txt @@ -36,10 +36,12 @@ set(SRC intern/eigenvalues.cc intern/linear_solver.cc + intern/matrix.cc intern/svd.cc intern/eigenvalues.h intern/linear_solver.h + intern/matrix.h intern/svd.h ) diff --git a/intern/eigen/eigen_capi.h b/intern/eigen/eigen_capi.h index be42e340274..7f3267ff508 100644 --- a/intern/eigen/eigen_capi.h +++ b/intern/eigen/eigen_capi.h @@ -29,6 +29,7 @@ #include "intern/eigenvalues.h" #include "intern/linear_solver.h" +#include "intern/matrix.h" #include "intern/svd.h" #endif /* __EIGEN_C_API_H__ */ diff --git a/intern/eigen/intern/matrix.cc b/intern/eigen/intern/matrix.cc new file mode 100644 index 00000000000..cc9e24d2b3c --- /dev/null +++ b/intern/eigen/intern/matrix.cc @@ -0,0 +1,56 @@ +/* + * ***** 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) 2015 Blender Foundation. + * All rights reserved. + * + * Contributor(s): Blender Foundation, + * Bastien Montagne + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#ifndef __EIGEN3_MATRIX_C_API_CC__ +#define __EIGEN3_MATRIX_C_API_CC__ + +/* Eigen gives annoying huge amount of warnings here, silence them! */ +#if defined(__GNUC__) && !defined(__clang__) +# pragma GCC diagnostic ignored "-Wlogical-op" +#endif + +#ifdef __EIGEN3_MATRIX_C_API_CC__ /* quiet warning */ +#endif + +#include +#include + +#include "matrix.h" + +using Eigen::Map; +using Eigen::Matrix4f; + +bool EIG_invert_m4_m4(float inverse[4][4], const float matrix[4][4]) +{ + Map M = Map((float*)matrix); + Matrix4f R; + bool invertible = true; + M.computeInverseWithCheck(R, invertible, 0.0f); + memcpy(inverse, R.data(), sizeof(float)*4*4); + return invertible; +} + +#endif /* __EIGEN3_MATRIX_C_API_CC__ */ diff --git a/intern/eigen/intern/matrix.h b/intern/eigen/intern/matrix.h new file mode 100644 index 00000000000..fd0f60fd81c --- /dev/null +++ b/intern/eigen/intern/matrix.h @@ -0,0 +1,40 @@ +/* + * ***** 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) 2015 Blender Foundation. + * All rights reserved. + * + * Contributor(s): Blender Foundation, + * Bastien Montagne + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#ifndef __EIGEN3_MATRIX_C_API_H__ +#define __EIGEN3_MATRIX_C_API_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +bool EIG_invert_m4_m4(float inverse[4][4], const float matrix[4][4]); + +#ifdef __cplusplus +} +#endif + +#endif /* __EIGEN3_MATRIX_C_API_H__ */ diff --git a/intern/eigen/intern/svd.cc b/intern/eigen/intern/svd.cc index 7c331d25aa7..e035f29f5ac 100644 --- a/intern/eigen/intern/svd.cc +++ b/intern/eigen/intern/svd.cc @@ -37,6 +37,7 @@ #include #include +#include #include "svd.h" @@ -51,6 +52,8 @@ using Eigen::MatrixXf; using Eigen::VectorXf; using Eigen::Map; +using Eigen::Matrix4f; + void EIG_svd_square_matrix(const int size, const float *matrix, float *r_U, float *r_S, float *r_V) { /* Since our matrix is squared, we can use thinU/V. */ diff --git a/source/blender/blenlib/intern/math_matrix.c b/source/blender/blenlib/intern/math_matrix.c index 3559500bf63..0272fa6f52b 100644 --- a/source/blender/blenlib/intern/math_matrix.c +++ b/source/blender/blenlib/intern/math_matrix.c @@ -33,6 +33,8 @@ #include "BLI_strict_flags.h" +#include "eigen_capi.h" + /********************************* Init **************************************/ void zero_m2(float m[2][2]) @@ -192,6 +194,25 @@ void mul_m4_m4m4_uniq(float R[4][4], const float A[4][4], const float B[4][4]) BLI_assert(R != A && R != B); /* matrix product: R[j][k] = A[j][i] . B[i][k] */ +#ifdef __SSE2__ + __m128 A0 = _mm_loadu_ps(A[0]); + __m128 A1 = _mm_loadu_ps(A[1]); + __m128 A2 = _mm_loadu_ps(A[2]); + __m128 A3 = _mm_loadu_ps(A[3]); + + for (int i = 0; i < 4; i++) { + __m128 B0 = _mm_set1_ps(B[i][0]); + __m128 B1 = _mm_set1_ps(B[i][1]); + __m128 B2 = _mm_set1_ps(B[i][2]); + __m128 B3 = _mm_set1_ps(B[i][3]); + + __m128 sum = _mm_add_ps( + _mm_add_ps(_mm_mul_ps(B0, A0), _mm_mul_ps(B1, A1)), + _mm_add_ps(_mm_mul_ps(B2, A2), _mm_mul_ps(B3, A3))); + + _mm_storeu_ps(R[i], sum); + } +#else R[0][0] = B[0][0] * A[0][0] + B[0][1] * A[1][0] + B[0][2] * A[2][0] + B[0][3] * A[3][0]; R[0][1] = B[0][0] * A[0][1] + B[0][1] * A[1][1] + B[0][2] * A[2][1] + B[0][3] * A[3][1]; R[0][2] = B[0][0] * A[0][2] + B[0][1] * A[1][2] + B[0][2] * A[2][2] + B[0][3] * A[3][2]; @@ -211,6 +232,7 @@ void mul_m4_m4m4_uniq(float R[4][4], const float A[4][4], const float B[4][4]) R[3][1] = B[3][0] * A[0][1] + B[3][1] * A[1][1] + B[3][2] * A[2][1] + B[3][3] * A[3][1]; R[3][2] = B[3][0] * A[0][2] + B[3][1] * A[1][2] + B[3][2] * A[2][2] + B[3][3] * A[3][2]; R[3][3] = B[3][0] * A[0][3] + B[3][1] * A[1][3] + B[3][2] * A[2][3] + B[3][3] * A[3][3]; +#endif } void mul_m4_m4_pre(float R[4][4], const float A[4][4]) @@ -875,74 +897,11 @@ bool invert_m4(float m[4][4]) return success; } -/* - * invertmat - - * computes the inverse of mat and puts it in inverse. Returns - * true on success (i.e. can always find a pivot) and false on failure. - * Uses Gaussian Elimination with partial (maximal column) pivoting. - * - * Mark Segal - 1992 - */ - bool invert_m4_m4(float inverse[4][4], const float mat[4][4]) { - int i, j, k; - double temp; - float tempmat[4][4]; - float max; - int maxj; - - BLI_assert(inverse != mat); - - /* Set inverse to identity */ - for (i = 0; i < 4; i++) - for (j = 0; j < 4; j++) - inverse[i][j] = 0; - for (i = 0; i < 4; i++) - inverse[i][i] = 1; - - /* Copy original matrix so we don't mess it up */ - for (i = 0; i < 4; i++) - for (j = 0; j < 4; j++) - tempmat[i][j] = mat[i][j]; - - for (i = 0; i < 4; i++) { - /* Look for row with max pivot */ - max = fabsf(tempmat[i][i]); - maxj = i; - for (j = i + 1; j < 4; j++) { - if (fabsf(tempmat[j][i]) > max) { - max = fabsf(tempmat[j][i]); - maxj = j; - } - } - /* Swap rows if necessary */ - if (maxj != i) { - for (k = 0; k < 4; k++) { - SWAP(float, tempmat[i][k], tempmat[maxj][k]); - SWAP(float, inverse[i][k], inverse[maxj][k]); - } - } - - if (UNLIKELY(tempmat[i][i] == 0.0f)) { - return false; /* No non-zero pivot */ - } - temp = (double)tempmat[i][i]; - for (k = 0; k < 4; k++) { - tempmat[i][k] = (float)((double)tempmat[i][k] / temp); - inverse[i][k] = (float)((double)inverse[i][k] / temp); - } - for (j = 0; j < 4; j++) { - if (j != i) { - temp = tempmat[j][i]; - for (k = 0; k < 4; k++) { - tempmat[j][k] -= (float)((double)tempmat[i][k] * temp); - inverse[j][k] -= (float)((double)inverse[i][k] * temp); - } - } - } - } - return true; + /* Use optimized matrix inverse from Eigen, since performance + * impact of this function is significant in complex rigs. */ + return EIG_invert_m4_m4(inverse, mat); } /****************************** Linear Algebra *******************************/ -- cgit v1.2.3 From c771bbc27e531327e669fdcdd6edcdee8dc0bb13 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Fri, 1 Jun 2018 12:00:33 +0200 Subject: Code cleanup: Compiler warning --- source/blender/draw/engines/workbench/workbench_data.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/draw/engines/workbench/workbench_data.c b/source/blender/draw/engines/workbench/workbench_data.c index 3e369c4f429..6c647ba9f49 100644 --- a/source/blender/draw/engines/workbench/workbench_data.c +++ b/source/blender/draw/engines/workbench/workbench_data.c @@ -77,7 +77,7 @@ void workbench_private_data_get_light_direction(WORKBENCH_PrivateData *wpd, floa { SolidLight *sl = &U.light[index]; if (sl->flag) { - WORKBENCH_UBO_Light *light = &wd->lights[light_index++]; + light = &wd->lights[light_index++]; copy_v4_v4(light->light_direction_vs, sl->vec); negate_v3(light->light_direction_vs); copy_v4_v4(light->specular_color, sl->spec); -- cgit v1.2.3 From 0c18024a8d0cee2ce783bada5060ce5d5540b663 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Fri, 1 Jun 2018 12:04:24 +0200 Subject: Fix error --- source/blender/draw/engines/workbench/workbench_data.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/draw/engines/workbench/workbench_data.c b/source/blender/draw/engines/workbench/workbench_data.c index 6c647ba9f49..3e369c4f429 100644 --- a/source/blender/draw/engines/workbench/workbench_data.c +++ b/source/blender/draw/engines/workbench/workbench_data.c @@ -77,7 +77,7 @@ void workbench_private_data_get_light_direction(WORKBENCH_PrivateData *wpd, floa { SolidLight *sl = &U.light[index]; if (sl->flag) { - light = &wd->lights[light_index++]; + WORKBENCH_UBO_Light *light = &wd->lights[light_index++]; copy_v4_v4(light->light_direction_vs, sl->vec); negate_v3(light->light_direction_vs); copy_v4_v4(light->specular_color, sl->spec); -- cgit v1.2.3 From 4eb47c303df150ba8d102e32c1927ac79a17cd0e Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Fri, 1 Jun 2018 12:14:08 +0200 Subject: Fix: raytrace_mirror does not exist anymore Eevee default material settings were not showing. --- release/scripts/startup/bl_ui/properties_material.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/release/scripts/startup/bl_ui/properties_material.py b/release/scripts/startup/bl_ui/properties_material.py index 5046a10b9c9..6876cf65cb6 100644 --- a/release/scripts/startup/bl_ui/properties_material.py +++ b/release/scripts/startup/bl_ui/properties_material.py @@ -172,9 +172,8 @@ class EEVEE_MATERIAL_PT_surface(MaterialButtonsPanel, Panel): if mat.use_nodes: panel_node_draw(layout, mat.node_tree, ('OUTPUT_EEVEE_MATERIAL', 'OUTPUT_MATERIAL')) else: - raym = mat.raytrace_mirror layout.prop(mat, "diffuse_color", text="Base Color") - layout.prop(raym, "metallic") + layout.prop(mat, "metallic") layout.prop(mat, "specular_intensity", text="Specular") layout.prop(mat, "roughness") -- cgit v1.2.3 From cfdadc7d619e47a557fbb4132bcdb71bbbdc3d10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Fri, 1 Jun 2018 12:28:05 +0200 Subject: Edit Mode: Fix Edit Object renderability with multi objects edit. --- source/blender/draw/intern/draw_manager.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c index 99fb14246bb..b96ab74fa86 100644 --- a/source/blender/draw/intern/draw_manager.c +++ b/source/blender/draw/intern/draw_manager.c @@ -152,7 +152,7 @@ bool DRW_object_is_renderable(Object *ob) BLI_assert(BKE_object_is_visible(ob, OB_VISIBILITY_CHECK_UNKNOWN_RENDER_MODE)); if (ob->type == OB_MESH) { - if (ob == DST.draw_ctx.object_edit) { + if ((ob == DST.draw_ctx.object_edit) || BKE_object_is_in_editmode(ob)) { View3D *v3d = DST.draw_ctx.v3d; const int mask = (V3D_OVERLAY_EDIT_OCCLUDE_WIRE | V3D_OVERLAY_EDIT_WEIGHT); -- cgit v1.2.3 From 83a41ccd0a9f22178d1997563a0c968c76767c2f Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Fri, 1 Jun 2018 12:51:29 +0200 Subject: LookDev: make sure lookdev balls are still visible after 'N' --- source/blender/draw/engines/eevee/eevee_lookdev.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/source/blender/draw/engines/eevee/eevee_lookdev.c b/source/blender/draw/engines/eevee/eevee_lookdev.c index 3894cc57c1f..8107aa33d2b 100644 --- a/source/blender/draw/engines/eevee/eevee_lookdev.c +++ b/source/blender/draw/engines/eevee/eevee_lookdev.c @@ -30,6 +30,8 @@ #include "DNA_screen_types.h" #include "DNA_world_types.h" +#include "ED_screen.h" + #include "eevee_private.h" void EEVEE_lookdev_cache_init( @@ -86,6 +88,7 @@ void EEVEE_lookdev_draw_background(EEVEE_Data *vedata) EEVEE_StorageList *stl = ((EEVEE_Data *)vedata)->stl; EEVEE_EffectsInfo *effects = stl->effects; EEVEE_ViewLayerData *sldata = EEVEE_view_layer_data_ensure(); + DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get(); const DRWContextState *draw_ctx = DRW_context_state_get(); @@ -99,7 +102,7 @@ void EEVEE_lookdev_draw_background(EEVEE_Data *vedata) BKE_camera_params_from_view3d(¶ms, draw_ctx->depsgraph, v3d, rv3d); params.is_ortho = true; - params.ortho_scale = 4.0f; + params.ortho_scale = 3.0f; params.zoom = CAMERA_PARAM_ZOOM_INIT_PERSP; params.offsetx = 0.0f; params.offsety = 0.0f; @@ -111,6 +114,8 @@ void EEVEE_lookdev_draw_background(EEVEE_Data *vedata) BKE_camera_params_compute_matrix(¶ms); const float *viewport_size = DRW_viewport_size_get(); + rcti rect; + ED_region_visible_rect(draw_ctx->ar, &rect); int viewport_inset_x = viewport_size[0] / 4; int viewport_inset_y = viewport_size[1] / 4; @@ -142,7 +147,12 @@ void EEVEE_lookdev_draw_background(EEVEE_Data *vedata) GPUFrameBuffer *fb = effects->final_fb; GPU_framebuffer_bind(fb); - GPU_framebuffer_viewport_set(fb, viewport_size[0] - viewport_inset_x, 0, viewport_inset_x, viewport_inset_y); + GPU_framebuffer_viewport_set(fb, rect.xmax - viewport_inset_x, 0, viewport_inset_x, viewport_inset_y); + DRW_draw_pass(psl->lookdev_pass); + + fb = dfbl->depth_only_fb; + GPU_framebuffer_bind(fb); + GPU_framebuffer_viewport_set(fb, rect.xmax - viewport_inset_x, 0, viewport_inset_x, viewport_inset_y); DRW_draw_pass(psl->lookdev_pass); DRW_viewport_matrix_override_unset_all(); -- cgit v1.2.3 From b85d5b6d524956e212ac329fb99f5ff8d629035c Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 1 Jun 2018 13:56:39 +0200 Subject: Cleanup: quiet warning, don't set unused alpha --- source/blender/blenkernel/intern/material.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c index c98e8ff109c..109b436292e 100644 --- a/source/blender/blenkernel/intern/material.c +++ b/source/blender/blenkernel/intern/material.c @@ -113,7 +113,7 @@ void BKE_material_init(Material *ma) ma->r = ma->g = ma->b = 0.8; ma->specr = ma->specg = ma->specb = 1.0; - ma->alpha = 1.0; + // ma->alpha = 1.0; /* DEPRECATED */ ma->spec = 0.5; ma->roughness = 0.25f; -- cgit v1.2.3 From 4faf9bfbe9d1502d32a62738ebb488710a43c27a Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 1 Jun 2018 12:34:50 +0200 Subject: Mesh versions of DerivedMesh access API calls Add mesh_get_eval_final & mesh_get_eval_deform Note: these will eventually need to be renamed & moved into BKE. --- source/blender/blenkernel/BKE_DerivedMesh.h | 6 ++++ source/blender/blenkernel/intern/DerivedMesh.c | 40 ++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h index 71c1d64eb27..205899a8e18 100644 --- a/source/blender/blenkernel/BKE_DerivedMesh.h +++ b/source/blender/blenkernel/BKE_DerivedMesh.h @@ -534,9 +534,15 @@ void mesh_get_mapped_verts_coords(DerivedMesh *dm, float (*r_cos)[3], const int DerivedMesh *mesh_get_derived_final( struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob, CustomDataMask dataMask); +struct Mesh *mesh_get_eval_final( + struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob, CustomDataMask dataMask); + DerivedMesh *mesh_get_derived_deform( struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob, CustomDataMask dataMask); +struct Mesh *mesh_get_eval_deform( + struct Depsgraph *depsgraph, struct Scene *scene, + struct Object *ob, CustomDataMask dataMask); DerivedMesh *mesh_create_derived_for_modifier( struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob, diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index a3dee4bb795..59739c857da 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -3108,6 +3108,7 @@ void makeDerivedMesh( /***/ +/* Deprecated DM, use: 'mesh_get_eval_final'. */ DerivedMesh *mesh_get_derived_final( struct Depsgraph *depsgraph, Scene *scene, Object *ob, CustomDataMask dataMask) { @@ -3127,7 +3128,27 @@ DerivedMesh *mesh_get_derived_final( if (ob->derivedFinal) { BLI_assert(!(ob->derivedFinal->dirty & DM_DIRTY_NORMALS)); } return ob->derivedFinal; } +Mesh *mesh_get_eval_final( + struct Depsgraph *depsgraph, Scene *scene, Object *ob, CustomDataMask dataMask) +{ + /* if there's no evaluated mesh or the last data mask used doesn't include + * the data we need, rebuild the derived mesh + */ + bool need_mapping; + dataMask |= object_get_datamask(depsgraph, ob, &need_mapping); + + if (!ob->derivedFinal || + ((dataMask & ob->lastDataMask) != dataMask) || + (need_mapping != ob->lastNeedMapping)) + { + mesh_build_data(depsgraph, scene, ob, dataMask, false, need_mapping); + } + + if (ob->runtime.mesh_eval) { BLI_assert(!(ob->runtime.mesh_eval->runtime.cd_dirty_vert & CD_MASK_NORMAL)); } + return ob->runtime.mesh_eval; +} +/* Deprecated DM, use: 'mesh_get_eval_deform' instead. */ DerivedMesh *mesh_get_derived_deform(struct Depsgraph *depsgraph, Scene *scene, Object *ob, CustomDataMask dataMask) { /* if there's no derived mesh or the last data mask used doesn't include @@ -3146,6 +3167,25 @@ DerivedMesh *mesh_get_derived_deform(struct Depsgraph *depsgraph, Scene *scene, return ob->derivedDeform; } +Mesh *mesh_get_eval_deform(struct Depsgraph *depsgraph, Scene *scene, Object *ob, CustomDataMask dataMask) +{ + /* if there's no derived mesh or the last data mask used doesn't include + * the data we need, rebuild the derived mesh + */ + bool need_mapping; + + dataMask |= object_get_datamask(depsgraph, ob, &need_mapping); + + if (!ob->runtime.mesh_deform_eval || + ((dataMask & ob->lastDataMask) != dataMask) || + (need_mapping != ob->lastNeedMapping)) + { + mesh_build_data(depsgraph, scene, ob, dataMask, false, need_mapping); + } + + return ob->runtime.mesh_deform_eval; +} + DerivedMesh *mesh_create_derived_render(struct Depsgraph *depsgraph, Scene *scene, Object *ob, CustomDataMask dataMask) { -- cgit v1.2.3 From be8016908db2caa5055351ff6b257fd69c18b5cf Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 1 Jun 2018 13:48:39 +0200 Subject: Mesh: Replace DM for mesh -> curve conversion --- source/blender/blenkernel/BKE_mesh.h | 2 +- source/blender/blenkernel/intern/mesh_convert.c | 33 ++++++++++++++-------- .../blender/editors/mesh/editmesh_knife_project.c | 26 ++++++++--------- 3 files changed, 35 insertions(+), 26 deletions(-) diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h index e9ace0bb19b..d3b492983de 100644 --- a/source/blender/blenkernel/BKE_mesh.h +++ b/source/blender/blenkernel/BKE_mesh.h @@ -142,7 +142,7 @@ int BKE_mesh_nurbs_displist_to_mdata( void BKE_mesh_from_nurbs_displist( struct Object *ob, struct ListBase *dispbase, const bool use_orco_uv, const char *obdata_name, bool temporary); void BKE_mesh_from_nurbs(struct Object *ob); -void BKE_mesh_to_curve_nurblist(struct DerivedMesh *dm, struct ListBase *nurblist, const int edge_users_test); +void BKE_mesh_to_curve_nurblist(const struct Mesh *me, struct ListBase *nurblist, const int edge_users_test); void BKE_mesh_to_curve(struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob); void BKE_mesh_material_index_remove(struct Mesh *me, short index); void BKE_mesh_material_index_clear(struct Mesh *me); diff --git a/source/blender/blenkernel/intern/mesh_convert.c b/source/blender/blenkernel/intern/mesh_convert.c index 14f563d6053..4af97048faa 100644 --- a/source/blender/blenkernel/intern/mesh_convert.c +++ b/source/blender/blenkernel/intern/mesh_convert.c @@ -669,15 +669,15 @@ static void appendPolyLineVert(ListBase *lb, unsigned int index) BLI_addtail(lb, vl); } -void BKE_mesh_to_curve_nurblist(DerivedMesh *dm, ListBase *nurblist, const int edge_users_test) +void BKE_mesh_to_curve_nurblist(const Mesh *me, ListBase *nurblist, const int edge_users_test) { - MVert *mvert = dm->getVertArray(dm); - MEdge *med, *medge = dm->getEdgeArray(dm); - MPoly *mp, *mpoly = dm->getPolyArray(dm); - MLoop *mloop = dm->getLoopArray(dm); + MVert *mvert = me->mvert; + MEdge *med, *medge = me->medge; + MPoly *mp, *mpoly = me->mpoly; + MLoop *mloop = me->mloop; - int dm_totedge = dm->getNumEdges(dm); - int dm_totpoly = dm->getNumPolys(dm); + int dm_totedge = me->totedge; + int dm_totpoly = me->totpoly; int totedges = 0; int i; @@ -805,12 +805,12 @@ void BKE_mesh_to_curve_nurblist(DerivedMesh *dm, ListBase *nurblist, const int e void BKE_mesh_to_curve(Depsgraph *depsgraph, Scene *scene, Object *ob) { /* make new mesh data from the original copy */ - DerivedMesh *dm = mesh_get_derived_final(depsgraph, scene, ob, CD_MASK_MESH); + Mesh *me_eval = mesh_get_eval_final(depsgraph, scene, ob, CD_MASK_MESH); ListBase nurblist = {NULL, NULL}; bool needsFree = false; - BKE_mesh_to_curve_nurblist(dm, &nurblist, 0); - BKE_mesh_to_curve_nurblist(dm, &nurblist, 1); + BKE_mesh_to_curve_nurblist(me_eval, &nurblist, 0); + BKE_mesh_to_curve_nurblist(me_eval, &nurblist, 1); if (nurblist.first) { Curve *cu = BKE_curve_add(G.main, ob->id.name + 2, OB_CURVE); @@ -826,11 +826,20 @@ void BKE_mesh_to_curve(Depsgraph *depsgraph, Scene *scene, Object *ob) needsFree = true; } - dm->needsFree = needsFree; - dm->release(dm); + /* Just to avoid dangling pointer, dm will be removed. */ + { + DerivedMesh *dm = ob->derivedFinal; + if (dm != NULL) { + dm->needsFree = needsFree; + dm->release(dm); + } + } if (needsFree) { + BKE_mesh_free(me_eval); + ob->derivedFinal = NULL; + ob->runtime.mesh_eval = NULL; /* curve object could have got bounding box only in special cases */ if (ob->bb) { diff --git a/source/blender/editors/mesh/editmesh_knife_project.c b/source/blender/editors/mesh/editmesh_knife_project.c index ba030c42a04..5a61c5aab48 100644 --- a/source/blender/editors/mesh/editmesh_knife_project.c +++ b/source/blender/editors/mesh/editmesh_knife_project.c @@ -62,27 +62,28 @@ static LinkNode *knifeproject_poly_from_object(const bContext *C, Scene *scene, { Depsgraph *depsgraph = CTX_data_depsgraph(C); ARegion *ar = CTX_wm_region(C); - DerivedMesh *dm; - bool dm_needsFree; + struct Mesh *me_eval; + bool me_eval_needs_free; if (ob->type == OB_MESH || ob->derivedFinal) { - dm = ob->derivedFinal ? ob->derivedFinal : mesh_get_derived_final(depsgraph, scene, ob, CD_MASK_BAREMESH); - dm_needsFree = false; + me_eval = (ob->runtime.mesh_eval ? + ob->runtime.mesh_eval : mesh_get_eval_final(depsgraph, scene, ob, CD_MASK_BAREMESH)); + me_eval_needs_free = false; } else if (ELEM(ob->type, OB_FONT, OB_CURVE, OB_SURF)) { - dm = CDDM_from_curve(ob); - dm_needsFree = true; + me_eval = BKE_mesh_new_nomain_from_curve(ob); + me_eval_needs_free = true; } else { - dm = NULL; + me_eval = NULL; } - if (dm) { + if (me_eval) { ListBase nurbslist = {NULL, NULL}; float projmat[4][4]; - BKE_mesh_to_curve_nurblist(dm, &nurbslist, 0); /* wire */ - BKE_mesh_to_curve_nurblist(dm, &nurbslist, 1); /* boundary */ + BKE_mesh_to_curve_nurblist(me_eval, &nurbslist, 0); /* wire */ + BKE_mesh_to_curve_nurblist(me_eval, &nurbslist, 1); /* boundary */ ED_view3d_ob_project_mat_get(ar->regiondata, ob, projmat); @@ -109,12 +110,11 @@ static LinkNode *knifeproject_poly_from_object(const bContext *C, Scene *scene, BKE_nurbList_free(&nurbslist); - if (dm_needsFree) { - dm->release(dm); + if (me_eval_needs_free) { + BKE_mesh_free(me_eval); } } - return polys; } -- cgit v1.2.3 From 32c12d057f42d038d80401b772dd310ffa2b266f Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 1 Jun 2018 13:58:28 +0200 Subject: Cleanup: rename vars --- source/blender/blenkernel/intern/mesh_convert.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/source/blender/blenkernel/intern/mesh_convert.c b/source/blender/blenkernel/intern/mesh_convert.c index 4af97048faa..b2ff79cd933 100644 --- a/source/blender/blenkernel/intern/mesh_convert.c +++ b/source/blender/blenkernel/intern/mesh_convert.c @@ -676,8 +676,8 @@ void BKE_mesh_to_curve_nurblist(const Mesh *me, ListBase *nurblist, const int ed MPoly *mp, *mpoly = me->mpoly; MLoop *mloop = me->mloop; - int dm_totedge = me->totedge; - int dm_totpoly = me->totpoly; + int medge_len = me->totedge; + int mpoly_len = me->totpoly; int totedges = 0; int i; @@ -687,8 +687,8 @@ void BKE_mesh_to_curve_nurblist(const Mesh *me, ListBase *nurblist, const int ed ListBase edges = {NULL, NULL}; /* get boundary edges */ - edge_users = MEM_calloc_arrayN(dm_totedge, sizeof(int), __func__); - for (i = 0, mp = mpoly; i < dm_totpoly; i++, mp++) { + edge_users = MEM_calloc_arrayN(medge_len, sizeof(int), __func__); + for (i = 0, mp = mpoly; i < mpoly_len; i++, mp++) { MLoop *ml = &mloop[mp->loopstart]; int j; for (j = 0; j < mp->totloop; j++, ml++) { @@ -698,7 +698,7 @@ void BKE_mesh_to_curve_nurblist(const Mesh *me, ListBase *nurblist, const int ed /* create edges from all faces (so as to find edges not in any faces) */ med = medge; - for (i = 0; i < dm_totedge; i++, med++) { + for (i = 0; i < medge_len; i++, med++) { if (edge_users[i] == edge_users_test) { EdgeLink *edl = MEM_callocN(sizeof(EdgeLink), "EdgeLink"); edl->edge = med; -- cgit v1.2.3 From 82b8fd8eafdc524e8d97f8cf43bf4ea4b97f6aab Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 1 Jun 2018 14:10:43 +0200 Subject: UI: don't show XYZ text w/ direction buttons --- source/blender/editors/interface/interface_layout.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c index bfd37db4bef..ea40c8e8fd8 100644 --- a/source/blender/editors/interface/interface_layout.c +++ b/source/blender/editors/interface/interface_layout.c @@ -1533,7 +1533,7 @@ void uiItemFullR(uiLayout *layout, PointerRNA *ptr, PropertyRNA *prop, int index layout_sub->space = 0; if ((index == RNA_NO_INDEX && is_array) && - ((ELEM(subtype, PROP_COLOR, PROP_COLOR_GAMMA) && !expand) == 0)) + ((!expand && ELEM(subtype, PROP_COLOR, PROP_COLOR_GAMMA, PROP_DIRECTION)) == 0)) { char name_with_suffix[UI_MAX_DRAW_STR + 2]; char str[2] = {'\0'}; -- cgit v1.2.3 From ddf2a5828215cdd77a93fcbf2041f600349f8e55 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 1 Jun 2018 14:29:22 +0200 Subject: Mesh: Replace DM for mesh w/ wpaint vertex picking --- source/blender/editors/mesh/meshtools.c | 46 ++++++++++++++++----------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/source/blender/editors/mesh/meshtools.c b/source/blender/editors/mesh/meshtools.c index 9b86f904161..802922ab799 100644 --- a/source/blender/editors/mesh/meshtools.c +++ b/source/blender/editors/mesh/meshtools.c @@ -1154,21 +1154,22 @@ bool ED_mesh_pick_face(bContext *C, Object *ob, const int mval[2], unsigned int static void ed_mesh_pick_face_vert__mpoly_find( /* context */ struct ARegion *ar, const float mval[2], - /* mesh data */ - DerivedMesh *dm, MPoly *mp, MLoop *mloop, + /* mesh data (evaluated) */ + const MPoly *mp, + const MVert *mvert, const MLoop *mloop, /* return values */ float *r_len_best, int *r_v_idx_best) { const MLoop *ml; int j = mp->totloop; for (ml = &mloop[mp->loopstart]; j--; ml++) { - float co[3], sco[2], len; + float sco[2]; const int v_idx = ml->v; - dm->getVertCo(dm, v_idx, co); + const float *co = mvert[v_idx].co; if (ED_view3d_project_float_object(ar, co, sco, V3D_PROJ_TEST_NOP) == V3D_PROJ_RET_OK) { - len = len_manhattan_v2v2(mval, sco); - if (len < *r_len_best) { - *r_len_best = len; + const float len_test = len_manhattan_v2v2(mval, sco); + if (len_test < *r_len_best) { + *r_len_best = len_test; *r_v_idx_best = v_idx; } } @@ -1191,7 +1192,7 @@ bool ED_mesh_pick_face_vert(bContext *C, Object *ob, const int mval[2], unsigned struct ARegion *ar = CTX_wm_region(C); /* derived mesh to find deformed locations */ - DerivedMesh *dm = mesh_get_derived_final(depsgraph, scene, ob, CD_MASK_BAREMESH | CD_MASK_ORIGINDEX); + Mesh *me_eval = mesh_get_eval_final(depsgraph, scene, ob, CD_MASK_BAREMESH | CD_MASK_ORIGINDEX); int v_idx_best = ORIGINDEX_NONE; @@ -1199,36 +1200,38 @@ bool ED_mesh_pick_face_vert(bContext *C, Object *ob, const int mval[2], unsigned const float mval_f[2] = {UNPACK2(mval)}; float len_best = FLT_MAX; - MPoly *dm_mpoly; - MLoop *dm_mloop; - unsigned int dm_mpoly_tot; + MPoly *me_eval_mpoly; + MLoop *me_eval_mloop; + MVert *me_eval_mvert; + unsigned int me_eval_mpoly_len; const int *index_mp_to_orig; - dm_mpoly = dm->getPolyArray(dm); - dm_mloop = dm->getLoopArray(dm); + me_eval_mpoly = me_eval->mpoly; + me_eval_mloop = me_eval->mloop; + me_eval_mvert = me_eval->mvert; - dm_mpoly_tot = dm->getNumPolys(dm); + me_eval_mpoly_len = me_eval->totpoly; - index_mp_to_orig = dm->getPolyDataArray(dm, CD_ORIGINDEX); + index_mp_to_orig = CustomData_get_layer(&me_eval->pdata, CD_ORIGINDEX); /* tag all verts using this face */ if (index_mp_to_orig) { unsigned int i; - for (i = 0; i < dm_mpoly_tot; i++) { + for (i = 0; i < me_eval_mpoly_len; i++) { if (index_mp_to_orig[i] == poly_index) { ed_mesh_pick_face_vert__mpoly_find( ar, mval_f, - dm, &dm_mpoly[i], dm_mloop, + &me_eval_mpoly[i], me_eval_mvert, me_eval_mloop, &len_best, &v_idx_best); } } } else { - if (poly_index < dm_mpoly_tot) { + if (poly_index < me_eval_mpoly_len) { ed_mesh_pick_face_vert__mpoly_find( ar, mval_f, - dm, &dm_mpoly[poly_index], dm_mloop, + &me_eval_mpoly[poly_index], me_eval_mvert, me_eval_mloop, &len_best, &v_idx_best); } } @@ -1236,15 +1239,12 @@ bool ED_mesh_pick_face_vert(bContext *C, Object *ob, const int mval[2], unsigned /* map 'dm -> me' index if possible */ if (v_idx_best != ORIGINDEX_NONE) { const int *index_mv_to_orig; - - index_mv_to_orig = dm->getVertDataArray(dm, CD_ORIGINDEX); + index_mv_to_orig = CustomData_get_layer(&me_eval->vdata, CD_ORIGINDEX); if (index_mv_to_orig) { v_idx_best = index_mv_to_orig[v_idx_best]; } } - dm->release(dm); - if ((v_idx_best != ORIGINDEX_NONE) && (v_idx_best < me->totvert)) { *index = v_idx_best; return true; -- cgit v1.2.3 From 3b05034935c482bd3cf377b03549df8d87af90d9 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Fri, 1 Jun 2018 14:30:26 +0200 Subject: Fix broken logic in make static override operators for Collections. Was pretty sure I already fixed that some weeks ago... but look like it was not committed or somehow lost... --- source/blender/editors/object/object_relations.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/source/blender/editors/object/object_relations.c b/source/blender/editors/object/object_relations.c index aee8c3f9122..d417437ad99 100644 --- a/source/blender/editors/object/object_relations.c +++ b/source/blender/editors/object/object_relations.c @@ -2304,7 +2304,7 @@ static int make_override_static_exec(bContext *C, wmOperator *op) } FOREACH_COLLECTION_OBJECT_RECURSIVE_END; - /* Then, we make static override of the whole set of objects in the collection. */ + /* Then, we remove (untag) bone shape objects, you shall never want to override those (hopefully)... */ FOREACH_COLLECTION_OBJECT_RECURSIVE_BEGIN(collection, ob) { if (ob->type == OB_ARMATURE && ob->pose != NULL) { @@ -2325,18 +2325,16 @@ static int make_override_static_exec(bContext *C, wmOperator *op) Collection *new_collection = (Collection *)collection->id.newid; FOREACH_COLLECTION_OBJECT_RECURSIVE_BEGIN(new_collection, new_ob) { - if (new_ob != NULL && - new_ob->id.override_static != NULL && - (base = BKE_view_layer_base_find(view_layer, new_ob)) == NULL) - { - BKE_collection_object_add_from(bmain, scene, obcollection, new_ob); - DEG_id_tag_update_ex(bmain, &new_ob->id, OB_RECALC_OB | DEG_TAG_BASE_FLAGS_UPDATE); + if (new_ob != NULL && new_ob->id.override_static != NULL) { + if ((base = BKE_view_layer_base_find(view_layer, new_ob)) == NULL) { + BKE_collection_object_add_from(bmain, scene, obcollection, new_ob); + DEG_id_tag_update_ex(bmain, &new_ob->id, DEG_TAG_TRANSFORM | DEG_TAG_BASE_FLAGS_UPDATE); + } /* parent to 'collection' empty */ if (new_ob->parent == NULL) { new_ob->parent = obcollection; } if (new_ob == (Object *)obact->id.newid) { - base = BKE_view_layer_base_find(view_layer, new_ob); BKE_view_layer_base_select(view_layer, base); } else { -- cgit v1.2.3 From 13ca63d2adad0da7b73ed3e38da53363e1de3428 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Fri, 1 Jun 2018 15:04:51 +0200 Subject: Draw background on pulldown widgets if the header is transparent. Since the viewport header now supports transparency, text on pulldowns can be hard to read if their color matches the viewport content. Background is drawn using the 'inner' theme color, that was unused until now. --- source/blender/editors/include/ED_screen.h | 1 + .../blender/editors/interface/interface_widgets.c | 23 ++++++++++++++-------- source/blender/editors/interface/resources.c | 9 +++++++++ source/blender/editors/screen/area.c | 16 +++++++-------- 4 files changed, 33 insertions(+), 16 deletions(-) diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h index f2ab7318037..171fbc68e19 100644 --- a/source/blender/editors/include/ED_screen.h +++ b/source/blender/editors/include/ED_screen.h @@ -94,6 +94,7 @@ void ED_region_image_metadata_draw(int x, int y, struct ImBuf *ibuf, const rc void ED_region_grid_draw(struct ARegion *ar, float zoomx, float zoomy); float ED_region_blend_alpha(struct ARegion *ar); void ED_region_visible_rect(struct ARegion *ar, struct rcti *rect); +bool ED_region_is_overlap(int spacetype, int regiontype); int ED_region_snap_size_test(const struct ARegion *ar); bool ED_region_snap_size_apply(struct ARegion *ar, int snap_flag); diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c index e4faac5129e..928ac8c9171 100644 --- a/source/blender/editors/interface/interface_widgets.c +++ b/source/blender/editors/interface/interface_widgets.c @@ -2626,15 +2626,9 @@ static void widget_state_nothing(uiWidgetType *wt, int UNUSED(state)) } /* special case, button that calls pulldown */ -static void widget_state_pulldown(uiWidgetType *wt, int state) +static void widget_state_pulldown(uiWidgetType *wt, int UNUSED(state)) { wt->wcol = *(wt->wcol_theme); - - copy_v4_v4_char(wt->wcol.inner, wt->wcol.inner_sel); - copy_v3_v3_char(wt->wcol.outline, wt->wcol.inner); - - if (state & UI_ACTIVE) - copy_v3_v3_char(wt->wcol.text, wt->wcol.text_sel); } /* special case, pie menu items */ @@ -3812,10 +3806,23 @@ static void widget_menunodebut(uiWidgetColors *wcol, rcti *rect, int UNUSED(stat static void widget_pulldownbut(uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign) { - if (state & UI_ACTIVE) { + float back[4]; + UI_GetThemeColor4fv(TH_BACK, back); + + if ((state & UI_ACTIVE) || (back[3] < 1.0f)) { uiWidgetBase wtb; const float rad = wcol->roundness * U.widget_unit; + if (state & UI_ACTIVE) { + copy_v4_v4_char(wcol->inner, wcol->inner_sel); + copy_v3_v3_char(wcol->text, wcol->text_sel); + copy_v3_v3_char(wcol->outline, wcol->inner); + } + else { + wcol->inner[3] *= 1.0f - back[3]; + wcol->outline[3] = 0.0f; + } + widget_init(&wtb); /* half rounded */ diff --git a/source/blender/editors/interface/resources.c b/source/blender/editors/interface/resources.c index 979a2164199..67165eeee95 100644 --- a/source/blender/editors/interface/resources.c +++ b/source/blender/editors/interface/resources.c @@ -56,6 +56,8 @@ #include "BLF_api.h" +#include "ED_screen.h" + #include "UI_interface.h" #include "UI_interface_icons.h" @@ -96,6 +98,7 @@ const unsigned char *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colo static char error[4] = {240, 0, 240, 255}; static char alert[4] = {240, 60, 60, 255}; static char headerdesel[4] = {0, 0, 0, 255}; + static char back[4] = {0, 0, 0, 255}; static char setting = 0; const char *cp = error; @@ -183,6 +186,12 @@ const unsigned char *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colo cp = ts->header; else cp = ts->button; + + copy_v4_v4_char(back, cp); + if (!ED_region_is_overlap(spacetype, theme_regionid)) { + back[3] = 255; + } + cp = back; break; case TH_LOW_GRAD: cp = ts->gradients.gradient; diff --git a/source/blender/editors/screen/area.c b/source/blender/editors/screen/area.c index cd7a0904f38..daaa6a31446 100644 --- a/source/blender/editors/screen/area.c +++ b/source/blender/editors/screen/area.c @@ -1005,19 +1005,19 @@ static void region_overlap_fix(ScrArea *sa, ARegion *ar) } /* overlapping regions only in the following restricted cases */ -static bool region_is_overlap(ScrArea *sa, ARegion *ar) +bool ED_region_is_overlap(int spacetype, int regiontype) { if (U.uiflag2 & USER_REGION_OVERLAP) { - if (ELEM(sa->spacetype, SPACE_VIEW3D, SPACE_SEQ, SPACE_IMAGE)) { - if (ELEM(ar->regiontype, RGN_TYPE_TOOLS, RGN_TYPE_UI, RGN_TYPE_TOOL_PROPS)) + if (ELEM(spacetype, SPACE_VIEW3D, SPACE_SEQ, SPACE_IMAGE)) { + if (ELEM(regiontype, RGN_TYPE_TOOLS, RGN_TYPE_UI, RGN_TYPE_TOOL_PROPS)) return 1; - if (ELEM(sa->spacetype, SPACE_VIEW3D, SPACE_IMAGE)) { - if (ar->regiontype == RGN_TYPE_HEADER) + if (ELEM(spacetype, SPACE_VIEW3D, SPACE_IMAGE)) { + if (regiontype == RGN_TYPE_HEADER) return 1; } - else if (sa->spacetype == SPACE_SEQ) { - if (ar->regiontype == RGN_TYPE_PREVIEW) + else if (spacetype == SPACE_SEQ) { + if (regiontype == RGN_TYPE_PREVIEW) return 1; } } @@ -1046,7 +1046,7 @@ static void region_rect_recursive(wmWindow *win, ScrArea *sa, ARegion *ar, rcti alignment = ar->alignment & ~RGN_SPLIT_PREV; /* set here, assuming userpref switching forces to call this again */ - ar->overlap = region_is_overlap(sa, ar); + ar->overlap = ED_region_is_overlap(sa->spacetype, ar->regiontype); /* clear state flags first */ ar->flag &= ~RGN_FLAG_TOO_SMALL; -- cgit v1.2.3 From 27881e9948610c97ce4c844856d97ddc3e545b09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vuk=20Garda=C5=A1evi=C4=87?= Date: Fri, 1 Jun 2018 15:07:32 +0200 Subject: Fix Add menu issue when there are no collections to instance Differential Revision: https://developer.blender.org/D3453 --- release/scripts/startup/bl_ui/space_view3d.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py index 542e003c4a9..b93e24da87a 100644 --- a/release/scripts/startup/bl_ui/space_view3d.py +++ b/release/scripts/startup/bl_ui/space_view3d.py @@ -1328,15 +1328,19 @@ class INFO_MT_add(Menu): layout.operator_menu_enum("object.effector_add", "type", text="Force Field", icon='OUTLINER_OB_FORCE_FIELD') layout.separator() - if len(bpy.data.collections) > 10: - layout.operator_context = 'INVOKE_REGION_WIN' - layout.operator( + has_collections = bool(bpy.data.collections) + col = layout.column() + col.enabled = has_collections + + if not has_collections or len(bpy.data.collections) > 10: + col.operator_context = 'INVOKE_REGION_WIN' + col.operator( "object.collection_instance_add", - text="Collection Instance...", + text="Collection Instance..." if has_collections else "No Collections to Instance", icon='OUTLINER_OB_GROUP_INSTANCE', ) else: - layout.operator_menu_enum( + col.operator_menu_enum( "object.collection_instance_add", "collection", text="Collection Instance", -- cgit v1.2.3 From 50afc430fdc17cbdb9aa8856bdfda7a3fd0289b2 Mon Sep 17 00:00:00 2001 From: Pablo Vazquez Date: Fri, 1 Jun 2018 15:32:36 +0200 Subject: Update Flatty themes with the new pulldown background and minor tweaks. --- .../presets/interface_theme/flatty_dark_blueberry.xml | 14 +++++++------- release/scripts/presets/interface_theme/flatty_light.xml | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/release/scripts/presets/interface_theme/flatty_dark_blueberry.xml b/release/scripts/presets/interface_theme/flatty_dark_blueberry.xml index 665259bba00..eb6c8e68511 100644 --- a/release/scripts/presets/interface_theme/flatty_dark_blueberry.xml +++ b/release/scripts/presets/interface_theme/flatty_dark_blueberry.xml @@ -160,8 +160,8 @@ - - + roundness="0.3"> -- cgit v1.2.3 From 75b27294889ca65b1946348f08a8e613af3ad15d Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 1 Jun 2018 15:37:53 +0200 Subject: Fix missing braces --- source/blender/editors/interface/resources.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/blender/editors/interface/resources.c b/source/blender/editors/interface/resources.c index 67165eeee95..fed2808e2c8 100644 --- a/source/blender/editors/interface/resources.c +++ b/source/blender/editors/interface/resources.c @@ -184,7 +184,7 @@ const unsigned char *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colo cp = ts->list; else if (theme_regionid == RGN_TYPE_HEADER) cp = ts->header; - else + else { cp = ts->button; copy_v4_v4_char(back, cp); @@ -192,6 +192,7 @@ const unsigned char *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colo back[3] = 255; } cp = back; + } break; case TH_LOW_GRAD: cp = ts->gradients.gradient; -- cgit v1.2.3 From 06c4106d03214d21b03b7f97dc776749dae59d79 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 1 Jun 2018 15:42:00 +0200 Subject: Fix for fix, indentation was accidental --- source/blender/editors/interface/resources.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/source/blender/editors/interface/resources.c b/source/blender/editors/interface/resources.c index fed2808e2c8..8e5bf8f0323 100644 --- a/source/blender/editors/interface/resources.c +++ b/source/blender/editors/interface/resources.c @@ -184,15 +184,14 @@ const unsigned char *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colo cp = ts->list; else if (theme_regionid == RGN_TYPE_HEADER) cp = ts->header; - else { + else cp = ts->button; - copy_v4_v4_char(back, cp); - if (!ED_region_is_overlap(spacetype, theme_regionid)) { - back[3] = 255; - } - cp = back; + copy_v4_v4_char(back, cp); + if (!ED_region_is_overlap(spacetype, theme_regionid)) { + back[3] = 255; } + cp = back; break; case TH_LOW_GRAD: cp = ts->gradients.gradient; -- cgit v1.2.3 From 44a8070db3c03a4e12d1ec1ca15432ec2b36e2fc Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Fri, 1 Jun 2018 15:42:11 +0200 Subject: Cleanup: fix incorrect contributor information. --- intern/eigen/intern/matrix.cc | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/intern/eigen/intern/matrix.cc b/intern/eigen/intern/matrix.cc index cc9e24d2b3c..5e00540f27c 100644 --- a/intern/eigen/intern/matrix.cc +++ b/intern/eigen/intern/matrix.cc @@ -15,11 +15,10 @@ * 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) 2015 Blender Foundation. + * The Original Code is Copyright (C) 2018 Blender Foundation. * All rights reserved. * - * Contributor(s): Blender Foundation, - * Bastien Montagne + * Contributor(s): Blender Foundation * * ***** END GPL LICENSE BLOCK ***** */ -- cgit v1.2.3