Commit: 26efc7bbd1d15bfea9c1bd0538a27d13c9620f3b
Author: Campbell Barton
Date:   Wed Jun 14 17:17:00 2017 +1000
Branches: blender2.8
https://developer.blender.org/rB26efc7bbd1d15bfea9c1bd0538a27d13c9620f3b

Merge branch 'master' into blender2.8

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



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

diff --cc source/blender/editors/space_view3d/view3d_view.c
index 11b011dbc73,5c13fd37dda..854f71b17b3
--- a/source/blender/editors/space_view3d/view3d_view.c
+++ b/source/blender/editors/space_view3d/view3d_view.c
@@@ -1198,19 -1191,10 +1198,19 @@@ int view3d_opengl_select
        hits = GPU_select_end();
        
        /* second pass, to get the closest object to camera */
-       if (do_passes) {
+       if (do_passes && (hits > 0)) {
                GPU_select_begin(buffer, bufsize, &rect, 
GPU_SELECT_NEAREST_SECOND_PASS, hits);
  
 -              ED_view3d_draw_select_loop(vc, scene, v3d, ar, use_obedit_skip, 
use_nearest);
 +#ifdef WITH_OPENGL_LEGACY
 +              if (IS_VIEWPORT_LEGACY(vc->v3d)) {
 +                      ED_view3d_draw_select_loop(vc, scene, sl, v3d, ar, 
use_obedit_skip, use_nearest);
 +              }
 +              else
 +#else
 +              {
 +                      DRW_draw_select_loop(graph, ar, v3d, use_obedit_skip, 
use_nearest, &rect);
 +              }
 +#endif /* WITH_OPENGL_LEGACY */
  
                GPU_select_end();
        }
diff --cc source/blender/windowmanager/manipulators/intern/wm_manipulatormap.c
index 6732a4cfee9,00000000000..51466426d79
mode 100644,000000..100644
--- a/source/blender/windowmanager/manipulators/intern/wm_manipulatormap.c
+++ b/source/blender/windowmanager/manipulators/intern/wm_manipulatormap.c
@@@ -1,769 -1,0 +1,770 @@@
 +/*
 + * ***** 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) 2014 Blender Foundation.
 + * All rights reserved.
 + *
 + * Contributor(s): Blender Foundation
 + *
 + * ***** END GPL LICENSE BLOCK *****
 + */
 +
 +/** \file blender/windowmanager/manipulators/intern/wm_manipulatormap.c
 + *  \ingroup wm
 + */
 +
 +#include <string.h>
 +
 +#include "BKE_context.h"
 +
 +#include "BLI_listbase.h"
 +#include "BLI_math.h"
 +#include "BLI_string.h"
 +#include "BLI_ghash.h"
 +
 +#include "DNA_manipulator_types.h"
 +
 +#include "ED_screen.h"
 +#include "ED_view3d.h"
 +
 +#include "GPU_glew.h"
 +#include "GPU_matrix.h"
 +#include "GPU_select.h"
 +
 +#include "MEM_guardedalloc.h"
 +
 +#include "WM_api.h"
 +#include "WM_types.h"
 +#include "wm_event_system.h"
 +
 +/* own includes */
 +#include "wm_manipulator_wmapi.h"
 +#include "wm_manipulator_intern.h"
 +
 +/**
 + * Store all manipulator-maps here. Anyone who wants to register a 
manipulator for a certain
 + * area type can query the manipulator-map to do so.
 + */
 +static ListBase manipulatormaptypes = {NULL, NULL};
 +
 +/**
 + * Manipulator-map update tagging.
 + */
 +enum eManipulatorMapUpdateFlags {
 +      /* Tag manipulator-map for refresh. */
 +      MANIPULATORMAP_REFRESH = (1 << 0),
 +};
 +
 +
 +/* -------------------------------------------------------------------- */
 +/** \name wmManipulatorMap
 + *
 + * \{ */
 +
 +/**
 + * Creates a manipulator-map with all registered manipulators for that type
 + */
 +wmManipulatorMap *WM_manipulatormap_new_from_type(const struct 
wmManipulatorMapType_Params *mmap_params)
 +{
 +      wmManipulatorMapType *mmaptype = 
WM_manipulatormaptype_ensure(mmap_params);
 +      wmManipulatorMap *mmap;
 +
 +      mmap = MEM_callocN(sizeof(wmManipulatorMap), "ManipulatorMap");
 +      mmap->type = mmaptype;
 +      mmap->update_flag = MANIPULATORMAP_REFRESH;
 +
 +      /* create all manipulator-groups for this manipulator-map. We may 
create an empty one
 +       * too in anticipation of manipulators from operators etc */
 +      for (wmManipulatorGroupType *wgt = 
mmaptype->manipulator_grouptypes.first; wgt; wgt = wgt->next) {
 +              wm_manipulatorgroup_new_from_type(mmap, wgt);
 +      }
 +
 +      return mmap;
 +}
 +
 +void wm_manipulatormap_selected_clear(wmManipulatorMap *mmap)
 +{
 +      MEM_SAFE_FREE(mmap->mmap_context.selected);
 +      mmap->mmap_context.selected_len = 0;
 +}
 +
 +void wm_manipulatormap_remove(wmManipulatorMap *mmap)
 +{
 +      if (!mmap)
 +              return;
 +
 +      for (wmManipulatorGroup *mgroup = mmap->manipulator_groups.first, 
*mgroup_next; mgroup; mgroup = mgroup_next) {
 +              mgroup_next = mgroup->next;
 +              BLI_assert(mgroup->parent_mmap == mmap);
 +              wm_manipulatorgroup_free(NULL, mgroup);
 +      }
 +      BLI_assert(BLI_listbase_is_empty(&mmap->manipulator_groups));
 +
 +      wm_manipulatormap_selected_clear(mmap);
 +
 +      MEM_freeN(mmap);
 +}
 +
 +/**
 + * Creates and returns idname hash table for (visible) manipulators in \a mmap
 + *
 + * \param poll  Polling function for excluding manipulators.
 + * \param data  Custom data passed to \a poll
 + */
 +static GHash *WM_manipulatormap_manipulator_hash_new(
 +        const bContext *C, wmManipulatorMap *mmap,
 +        bool (*poll)(const wmManipulator *, void *),
 +        void *data, const bool include_hidden)
 +{
 +      GHash *hash = BLI_ghash_str_new(__func__);
 +
 +      /* collect manipulators */
 +      for (wmManipulatorGroup *mgroup = mmap->manipulator_groups.first; 
mgroup; mgroup = mgroup->next) {
 +              if (!mgroup->type->poll || mgroup->type->poll(C, mgroup->type)) 
{
 +                      for (wmManipulator *mpr = mgroup->manipulators.first; 
mpr; mpr = mpr->next) {
 +                              if ((include_hidden || (mpr->flag & 
WM_MANIPULATOR_HIDDEN) == 0) &&
 +                                  (!poll || poll(mpr, data)))
 +                              {
 +                                      BLI_ghash_insert(hash, mpr->name, mpr);
 +                              }
 +                      }
 +              }
 +      }
 +
 +      return hash;
 +}
 +
 +void WM_manipulatormap_tag_refresh(wmManipulatorMap *mmap)
 +{
 +      if (mmap) {
 +              mmap->update_flag |= MANIPULATORMAP_REFRESH;
 +      }
 +}
 +
 +static void manipulatormap_tag_updated(wmManipulatorMap *mmap)
 +{
 +      mmap->update_flag = 0;
 +}
 +
 +static bool manipulator_prepare_drawing(
 +        wmManipulatorMap *mmap, wmManipulator *mpr,
 +        const bContext *C, ListBase *draw_manipulators)
 +{
 +      if (!wm_manipulator_is_visible(mpr)) {
 +              /* skip */
 +      }
 +      else {
 +              wm_manipulator_update(mpr, C, (mmap->update_flag & 
MANIPULATORMAP_REFRESH) != 0);
 +              BLI_addhead(draw_manipulators, BLI_genericNodeN(mpr));
 +              return true;
 +      }
 +
 +      return false;
 +}
 +
 +/**
 + * Update manipulators of \a mmap to prepare for drawing. Adds all 
manipulators that
 + * should be drawn to list \a draw_manipulators, note that added items need 
freeing.
 + */
 +static void manipulatormap_prepare_drawing(
 +        wmManipulatorMap *mmap, const bContext *C, ListBase 
*draw_manipulators, const int drawstep)
 +{
 +      if (!mmap || BLI_listbase_is_empty(&mmap->manipulator_groups))
 +              return;
 +      wmManipulator *active_manipulator = mmap->mmap_context.active;
 +
 +      /* only active manipulator needs updating */
 +      if (active_manipulator) {
 +              if (manipulator_prepare_drawing(mmap, active_manipulator, C, 
draw_manipulators)) {
 +                      manipulatormap_tag_updated(mmap);
 +              }
 +              /* don't draw any other manipulators */
 +              return;
 +      }
 +
 +      for (wmManipulatorGroup *mgroup = mmap->manipulator_groups.first; 
mgroup; mgroup = mgroup->next) {
 +              /* check group visibility - drawstep first to avoid unnecessary 
call of group poll callback */
 +              if (!wm_manipulatorgroup_is_visible_in_drawstep(mgroup, 
drawstep) ||
 +                  !wm_manipulatorgroup_is_visible(mgroup, C))
 +              {
 +                      continue;
 +              }
 +
 +              /* needs to be initialized on first draw */
 +              wm_manipulatorgroup_ensure_initialized(mgroup, C);
 +              /* update data if needed */
 +              /* XXX weak: Manipulator-group may skip refreshing if it's 
invisible (map gets untagged nevertheless) */
 +              if (mmap->update_flag & MANIPULATORMAP_REFRESH && 
mgroup->type->refresh) {
 +                      mgroup->type->refresh(C, mgroup);
 +              }
 +              /* prepare drawing */
 +              if (mgroup->type->draw_prepare) {
 +                      mgroup->type->draw_prepare(C, mgroup);
 +              }
 +
 +              for (wmManipulator *mpr = mgroup->manipulators.first; mpr; mpr 
= mpr->next) {
 +                      manipulator_prepare_drawing(mmap, mpr, C, 
draw_manipulators);
 +              }
 +      }
 +
 +      manipulatormap_tag_updated(mmap);
 +}
 +
 +/**
 + * Draw all visible manipulators in \a mmap.
 + * Uses global draw_manipulators listbase.
 + */
 +static void manipulators_draw_list(const wmManipulatorMap *mmap, const 
bContext *C, ListBase *draw_manipulators)
 +{
 +      if (!mmap)
 +              return;
 +      BLI_assert(!BLI_listbase_is_empty(&mmap->manipulator_groups));
 +
 +      const bool draw_multisample = (U.ogl_multisamples != 
USER_MULTISAMPLE_NONE);
 +
 +      /* TODO this will need it own shader probably? don't think it can be 
handled from that point though. */
 +/*    const bool use_lighting = (U.manipulator_flag & 
V3D_SHADED_MANIPULATORS) != 0; */
 +
 +      /* enable multisampling */
 +      if (draw_multisample) {
 +              glEnable(GL_MULTISAMPLE);
 +      }
 +
 +      /* draw_manipulators contains all visible manipulators - draw them */
 +      for (LinkData *link = draw_manipulators->first, *link_next; link; link 
= link_next) {
 +              wmManipulator *mpr = link->data;
 +              link_next = link->next;
 +
 +              mpr->type->draw(C, mpr);
 +              /* free/remove manipulator link after drawing */
 +              BLI_freelinkN(draw_manipulators, link);
 +      }
 +
 +      if (draw_multisample) {
 +              glDisable(GL_MULTISAMPLE);
 +      }
 +}
 +
 +void WM_manipulatormap_draw(wmManipulatorMap *mmap, const bContext *C, const 
int drawstep)
 +{
 +      ListBase draw_manipulators = {NULL};
 +
 +      manipulatormap_prepare_drawing(mmap, C, &draw_manipulators, drawstep);
 +      manipulators_draw_list(mmap, C, &draw_manipulators);
 +      BLI_assert(BLI_listbase_is_empty(&draw_manipulators));
 +}
 +
 +static void manipulator_find_active_3D_loop(const bContext *C, ListBase 
*visible_manipulators)
 +{
 +      int selectionbase = 0;
 +      wmManipulator *mpr;
 +
 +      for (LinkData *link = visible_manipulators->first; link; link = 
link->next) {
 +              mpr = link->data;
 +              /* pass the selection id shifted by 8 bits. Last 8 bits are 
used for selected manipulator part id */
 +              mpr->type->draw_select(C, mpr, selectionbase << 8);
 +
 +              selectionbase++;
 +      }
 +}
 +
 +static int manipulator_find_intersected_3d_int

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to