[Bf-blender-cvs] [941484ff817] blender2.8: Merge branch 'master' into blender2.8

Campbell Barton noreply at git.blender.org
Tue Oct 31 15:20:58 CET 2017


Commit: 941484ff81744ad2dca1741f3e9c4b4c18664a82
Author: Campbell Barton
Date:   Wed Nov 1 01:21:12 2017 +1100
Branches: blender2.8
https://developer.blender.org/rB941484ff81744ad2dca1741f3e9c4b4c18664a82

Merge branch 'master' into blender2.8

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



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

diff --cc source/blender/blenkernel/BKE_curve.h
index 06bef637107,30db8f45059..fd5b20f3e38
--- a/source/blender/blenkernel/BKE_curve.h
+++ b/source/blender/blenkernel/BKE_curve.h
@@@ -215,16 -213,19 +215,26 @@@ void BKE_nurb_handles_test(struct Nurb 
  
  /* **** Depsgraph evaluation **** */
  
 -struct EvaluationContext;
 -
 -void BKE_curve_eval_geometry(struct EvaluationContext *eval_ctx,
 -                             struct Curve *curve);
 +void BKE_curve_eval_geometry(
 +        const struct EvaluationContext *eval_ctx,
 +        struct Curve *curve);
 +
 +/* Draw Cache */
 +enum {
 +	BKE_CURVE_BATCH_DIRTY_ALL = 0,
 +	BKE_CURVE_BATCH_DIRTY_SELECT,
 +};
 +void BKE_curve_batch_cache_dirty(struct Curve *cu, int mode);
 +void BKE_curve_batch_cache_free(struct Curve *cu);
  
+ /* curve_decimate.c */
+ unsigned int BKE_curve_decimate_bezt_array(
+         struct BezTriple *bezt_array, const unsigned int bezt_array_len, const unsigned int resolu, const bool is_cyclic,
+         const char flag_test, const char flag_set,
+         const float error_sq_max, const unsigned int error_target_len);
+ 
+ void BKE_curve_decimate_nurb(
+         struct Nurb *nu, const unsigned int resolu,
+         const float error_sq_max, const unsigned int error_target_len);
+ 
  #endif  /* __BKE_CURVE_H__ */
diff --cc source/blender/editors/curve/editcurve.c
index 4757c896650,ee83f212463..565521ad111
--- a/source/blender/editors/curve/editcurve.c
+++ b/source/blender/editors/curve/editcurve.c
@@@ -5909,6 -5905,86 +5909,86 @@@ void CURVE_OT_dissolve_verts(wmOperator
  	ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
  }
  
+ static bool nurb_bezt_flag_any(const Nurb *nu, const char flag_test)
+ {
+ 	BezTriple *bezt = nu->bezt;
+ 	int i;
+ 
+ 	for (i = nu->pntsu, bezt = nu->bezt; i--; bezt++) {
+ 		if (bezt->f2 & flag_test) {
+ 			return true;
+ 		}
+ 	}
+ 
+ 	return false;
+ }
+ 
+ static int curve_decimate_exec(bContext *C, wmOperator *op)
+ {
+ 	Object *obedit = CTX_data_edit_object(C);
+ 	Curve *cu = (Curve *)obedit->data;
+ 	bool all_supported = true;
+ 	bool changed = false;
+ 
+ 	{
+ 		const float error_sq_max = FLT_MAX;
+ 		float ratio = RNA_float_get(op->ptr, "ratio");
+ 
+ 		ListBase *editnurb = object_editcurve_get(obedit);
+ 		Nurb *nu;
+ 
+ 		for (nu = editnurb->first; nu; nu = nu->next) {
+ 			if (nu->type == CU_BEZIER) {
+ 				if ((nu->pntsu > 2) && nurb_bezt_flag_any(nu, SELECT)) {
+ 					const int error_target_len = max_ii(2, nu->pntsu * ratio);
+ 					if (error_target_len != nu->pntsu) {
+ 						BKE_curve_decimate_nurb(nu, cu->resolu, error_sq_max, error_target_len);
+ 						changed = true;
+ 					}
+ 				}
+ 			}
+ 			else {
+ 				all_supported = false;
+ 			}
+ 		}
+ 	}
+ 
+ 	if (all_supported == false) {
+ 		BKE_report(op->reports, RPT_WARNING, "Only bezier curves are supported");
+ 	}
+ 
+ 	if (changed) {
+ 		cu->actnu = cu->actvert = CU_ACT_NONE;
+ 		if (ED_curve_updateAnimPaths(obedit->data)) {
+ 			WM_event_add_notifier(C, NC_OBJECT | ND_KEYS, obedit);
+ 		}
+ 
+ 		WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
 -		DAG_id_tag_update(obedit->data, 0);
++		DEG_id_tag_update(obedit->data, 0);
+ 	}
+ 
+ 	return OPERATOR_FINISHED;
+ }
+ 
+ void CURVE_OT_decimate(wmOperatorType *ot)
+ {
+ 	/* identifiers */
+ 	ot->name = "Decimate Curve";
+ 	ot->description = "Simplify selected curves";
+ 	ot->idname = "CURVE_OT_decimate";
+ 
+ 	/* api callbacks */
+ 	ot->exec = curve_decimate_exec;
+ 	ot->poll = ED_operator_editcurve;
+ 
+ 	/* flags */
+ 	ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+ 
+ 	/* properties */
+ 	RNA_def_float_factor(ot->srna, "ratio", 1.0f, 0.0f, 1.0f, "Ratio", "", 0.0f, 1.0f);
+ }
+ 
+ 
  /********************** shade smooth/flat operator *********************/
  
  static int shade_smooth_exec(bContext *C, wmOperator *op)
diff --cc source/blender/editors/screen/workspace_edit.c
index d64420fb976,00000000000..e90c63f7a45
mode 100644,000000..100644
--- a/source/blender/editors/screen/workspace_edit.c
+++ b/source/blender/editors/screen/workspace_edit.c
@@@ -1,443 -1,0 +1,443 @@@
 +/*
 + * ***** 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.
 + *
 + * ***** END GPL LICENSE BLOCK *****
 + */
 +
 +/** \file blender/editors/screen/workspace_edit.c
 + *  \ingroup edscr
 + */
 +
 +#include <stdlib.h>
 +#include <string.h>
 +
 +#include "BLI_utildefines.h"
 +#include "BLI_fileops.h"
 +#include "BLI_listbase.h"
 +#include "BLI_path_util.h"
 +#include "BLI_string.h"
 +
 +#include "BKE_appdir.h"
 +#include "BKE_blendfile.h"
 +#include "BKE_context.h"
 +#include "BKE_idcode.h"
 +#include "BKE_main.h"
 +#include "BKE_library.h"
 +#include "BKE_report.h"
 +#include "BKE_scene.h"
 +#include "BKE_screen.h"
 +#include "BKE_workspace.h"
 +
 +#include "BLO_readfile.h"
 +
 +#include "DNA_object_types.h"
 +#include "DNA_screen_types.h"
 +#include "DNA_windowmanager_types.h"
 +#include "DNA_workspace_types.h"
 +
 +#include "ED_object.h"
 +#include "ED_screen.h"
 +
 +#include "MEM_guardedalloc.h"
 +
 +#include "RNA_access.h"
 +
 +#include "UI_interface.h"
 +#include "UI_resources.h"
 +
 +#include "WM_api.h"
 +#include "WM_types.h"
 +
 +#include "screen_intern.h"
 +
 +
 +/** \name Workspace API
 + *
 + * \brief API for managing workspaces and their data.
 + * \{ */
 +
 +WorkSpace *ED_workspace_add(
 +        Main *bmain, const char *name, SceneLayer *act_render_layer, ViewRender *view_render)
 +{
 +	WorkSpace *workspace = BKE_workspace_add(bmain, name);
 +
 +#ifdef USE_WORKSPACE_MODE
 +	BKE_workspace_object_mode_set(workspace, OB_MODE_OBJECT);
 +#endif
 +
 +	BKE_workspace_render_layer_set(workspace, act_render_layer);
 +	BKE_viewrender_copy(&workspace->view_render, view_render);
 +
 +	return workspace;
 +}
 +
 +#ifdef USE_WORKSPACE_MODE
 +/**
 + * Changes the object mode (if needed) to the one set in \a workspace_new.
 + * Object mode is still stored on object level. In future it should all be workspace level instead.
 + */
 +static void workspace_change_update_mode(
 +        const WorkSpace *workspace_old, const WorkSpace *workspace_new,
 +        bContext *C, Object *ob_act, ReportList *reports)
 +{
 +	eObjectMode mode_old = BKE_workspace_object_mode_get(workspace_old);
 +	eObjectMode mode_new = BKE_workspace_object_mode_get(workspace_new);
 +
 +	if (mode_old != mode_new) {
 +		ED_object_mode_compat_set(C, ob_act, mode_new, reports);
 +		ED_object_toggle_modes(C, mode_new);
 +	}
 +}
 +#endif
 +
 +static void workspace_change_update_render_layer(
 +        WorkSpace *workspace_new, const WorkSpace *workspace_old)
 +{
 +	if (!BKE_workspace_render_layer_get(workspace_new)) {
 +		BKE_workspace_render_layer_set(workspace_new, BKE_workspace_render_layer_get(workspace_old));
 +	}
 +}
 +
 +static void workspace_change_update(
 +        WorkSpace *workspace_new, const WorkSpace *workspace_old,
 +        bContext *C, wmWindowManager *wm)
 +{
 +	/* needs to be done before changing mode! (to ensure right context) */
 +	workspace_change_update_render_layer(workspace_new, workspace_old);
 +#ifdef USE_WORKSPACE_MODE
 +	workspace_change_update_mode(workspace_old, workspace_new, C, CTX_data_active_object(C), &wm->reports);
 +#else
 +	UNUSED_VARS(C, wm);
 +#endif
 +}
 +
 +static bool workspace_change_find_new_layout_cb(const WorkSpaceLayout *layout, void *UNUSED(arg))
 +{
 +	/* return false to stop the iterator if we've found a layout that can be activated */
 +	return workspace_layout_set_poll(layout) ? false : true;
 +}
 +
 +static WorkSpaceLayout *workspace_change_get_new_layout(
 +        WorkSpace *workspace_new, wmWindow *win)
 +{
 +	/* ED_workspace_duplicate may have stored a layout to activate once the workspace gets activated. */
 +	WorkSpaceLayout *layout_new;
 +	bScreen *screen_new;
 +
 +	if (win->workspace_hook->temp_workspace_store) {
 +		layout_new = win->workspace_hook->temp_layout_store;
 +	}
 +	else {
 +		layout_new = BKE_workspace_hook_layout_for_workspace_get(win->workspace_hook, workspace_new);
 +		if (!layout_new) {
 +			layout_new = BKE_workspace_layouts_get(workspace_new)->first;
 +		}
 +	}
 +	screen_new = BKE_workspace_layout_screen_get(layout_new);
 +
 +	if (screen_new->winid) {
 +		/* screen is already used, try to find a free one */
 +		WorkSpaceLayout *layout_temp = BKE_workspace_layout_iter_circular(
 +		                                   workspace_new, layout_new, workspace_change_find_new_layout_cb,
 +		                                   NULL, false);
 +		if (!layout_temp) {
 +			/* fallback solution: duplicate layout */
 +			layout_temp = ED_workspace_layout_duplicate(workspace_new, layout_new, win);
 +		}
 +		layout_new = layout_temp;
 +	}
 +
 +	return layout_new;
 +}
 +
 +/**
 + * \brief Change the active workspace.
 + *
 + * Operator call, WM + Window + screen already existed before
 + * Pretty similar to #ED_screen_change since changing workspace also changes screen.
 + *
 + * \warning Do NOT call in area/region queues!
 + * \returns if workspace changing was successful.
 + */
 +bool ED_workspace_change(
 +        WorkSpace *workspace_new, bContext *C, wmWindowManager *wm, wmWindow *win)
 +{
 +	Main *bmain = CTX_data_main(C);
 +	WorkSpace *workspace_old = WM_window_get_active_workspace(win);
 +	WorkSpaceLayout *layout_new = workspace_change_get_new_layout(workspace_new, win);
 +	bScreen *screen_new = BKE_workspace_layout_screen_get(layout_new);
 +	bScreen *screen_old = BKE_workspace_active_screen_get(win->workspace_hook);
 +
 +	win->workspace_hook->temp_layout_store = NULL;
 +	if (workspace_old == workspace_new) {
 +		

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list