[Bf-blender-cvs] [26efc7bbd1d] blender2.8: Merge branch 'master' into blender2.8

Campbell Barton noreply at git.blender.org
Wed Jun 14 09:14:33 CEST 2017


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. @@




More information about the Bf-blender-cvs mailing list