[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [28877] branches/render25: Render Branch: svn merge https://svn.blender.org/svnroot/bf-blender/trunk/blender -r28865 :28876
Brecht Van Lommel
brecht at blender.org
Thu May 20 11:38:15 CEST 2010
Revision: 28877
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=28877
Author: blendix
Date: 2010-05-20 11:38:15 +0200 (Thu, 20 May 2010)
Log Message:
-----------
Render Branch: svn merge https://svn.blender.org/svnroot/bf-blender/trunk/blender -r28865:28876
Modified Paths:
--------------
branches/render25/release/scripts/ui/space_view3d.py
branches/render25/source/blender/editors/animation/anim_channels_edit.c
branches/render25/source/blender/editors/animation/anim_filter.c
branches/render25/source/blender/editors/include/ED_anim_api.h
branches/render25/source/blender/editors/space_action/action_edit.c
branches/render25/source/blender/editors/space_action/action_select.c
branches/render25/source/blender/editors/space_graph/graph_edit.c
branches/render25/source/blender/editors/space_graph/graph_select.c
branches/render25/source/blender/editors/space_graph/space_graph.c
branches/render25/source/blender/editors/space_logic/logic_window.c
branches/render25/source/blender/editors/space_view3d/drawobject.c
branches/render25/source/blender/makesrna/intern/rna_curve.c
branches/render25/source/blender/makesrna/intern/rna_fcurve.c
branches/render25/source/blender/makesrna/intern/rna_image.c
branches/render25/source/blender/makesrna/intern/rna_material.c
branches/render25/source/blender/makesrna/intern/rna_scene.c
branches/render25/source/blender/makesrna/intern/rna_space.c
branches/render25/source/blender/makesrna/intern/rna_texture.c
Added Paths:
-----------
branches/render25/release/scripts/templates/operator_modal_view3d.py
Copied: branches/render25/release/scripts/templates/operator_modal_view3d.py (from rev 28876, trunk/blender/release/scripts/templates/operator_modal_view3d.py)
===================================================================
--- branches/render25/release/scripts/templates/operator_modal_view3d.py (rev 0)
+++ branches/render25/release/scripts/templates/operator_modal_view3d.py 2010-05-20 09:38:15 UTC (rev 28877)
@@ -0,0 +1,56 @@
+from mathutils import Vector
+from bpy.props import FloatVectorProperty
+
+class ViewOperator(bpy.types.Operator):
+ '''Translate the view using mouse events.'''
+ bl_idname = "view3d.modal_operator"
+ bl_label = "Simple View Operator"
+
+ offset = FloatVectorProperty(name="Offset", size=3)
+
+
+ def execute(self, context):
+ v3d = context.area.spaces[0]
+ rv3d = v3d.region_3d
+
+ rv3d.view_location = self._initial_location + Vector(self.properties.offset)
+
+ def modal(self, context, event):
+ v3d = context.area.spaces[0]
+ rv3d = v3d.region_3d
+
+ if event.type == 'MOUSEMOVE':
+ self.properties.offset = (self._initial_mouse - Vector((event.mouse_x, event.mouse_y, 0.0))) * 0.02
+ self.execute(context)
+
+ elif event.type == 'LEFTMOUSE':
+ return {'FINISHED'}
+
+ elif event.type in ('RIGHTMOUSE', 'ESC'):
+ rv3d.view_location = self._initial_location
+ return {'CANCELLED'}
+
+ return {'RUNNING_MODAL'}
+
+ def invoke(self, context, event):
+ active_space = context.area.spaces[0]
+
+ if active_space.type == 'VIEW_3D':
+ v3d = active_space
+ rv3d = v3d.region_3d
+
+ context.manager.add_modal_handler(self)
+
+ if rv3d.view_perspective == 'CAMERA':
+ rv3d.view_perspective = 'PERSP'
+
+ self._initial_mouse = Vector((event.mouse_x, event.mouse_y, 0.0))
+ self._initial_location = rv3d.view_location.copy()
+
+ return {'RUNNING_MODAL'}
+ else:
+ self.report({'WARNING'}, "Active space must be a View3d")
+ return {'CANCELLED'}
+
+
+bpy.types.register(ViewOperator)
Modified: branches/render25/release/scripts/ui/space_view3d.py
===================================================================
--- branches/render25/release/scripts/ui/space_view3d.py 2010-05-20 09:17:49 UTC (rev 28876)
+++ branches/render25/release/scripts/ui/space_view3d.py 2010-05-20 09:38:15 UTC (rev 28877)
@@ -32,14 +32,13 @@
obj = context.active_object
toolsettings = context.tool_settings
- row = layout.row()
+ row = layout.row(align=True)
row.template_header()
- sub = row.row(align=True)
-
# Menus
if context.area.show_menus:
-
+ sub = row.row(align=True)
+
sub.menu("VIEW3D_MT_view")
# Select Menu
@@ -54,6 +53,7 @@
else:
sub.menu("VIEW3D_MT_object")
+ row = layout.row()
row.template_header_3D()
# do in C for now since these buttons cant be both toggle AND exclusive.
Modified: branches/render25/source/blender/editors/animation/anim_channels_edit.c
===================================================================
--- branches/render25/source/blender/editors/animation/anim_channels_edit.c 2010-05-20 09:17:49 UTC (rev 28876)
+++ branches/render25/source/blender/editors/animation/anim_channels_edit.c 2010-05-20 09:38:15 UTC (rev 28877)
@@ -939,7 +939,7 @@
/* do groups only first (unless in Drivers mode, where there are none) */
if (ac.datatype != ANIMCONT_DRIVERS) {
/* filter data */
- filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL | ANIMFILTER_CHANNELS | ANIMFILTER_FOREDIT);
+ filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL | ANIMFILTER_CHANNELS | ANIMFILTER_FOREDIT | ANIMFILTER_NODUPLIS);
ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
/* delete selected groups and their associated channels */
@@ -978,7 +978,7 @@
/* now do F-Curves */
if (ac.datatype != ANIMCONT_GPENCIL) {
/* filter data */
- filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL | ANIMFILTER_FOREDIT);
+ filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL | ANIMFILTER_FOREDIT | ANIMFILTER_NODUPLIS);
ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
/* delete selected F-Curves */
@@ -1038,7 +1038,7 @@
ANIM_animdata_filter(&ac, &all_data, filter, ac.data, ac.datatype);
/* hide all channels not selected */
- filter= (ANIMFILTER_VISIBLE | ANIMFILTER_UNSEL);
+ filter= (ANIMFILTER_VISIBLE | ANIMFILTER_UNSEL | ANIMFILTER_NODUPLIS);
ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
for (ale= anim_data.first; ale; ale= ale->next) {
@@ -1054,7 +1054,7 @@
BLI_freelistN(&anim_data);
/* make all the selected channels visible */
- filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL);
+ filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL | ANIMFILTER_NODUPLIS);
ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
for (ale= anim_data.first; ale; ale= ale->next) {
@@ -1113,11 +1113,11 @@
return OPERATOR_CANCELLED;
/* get list of all channels that selection may need to be flushed to */
- filter= ANIMFILTER_CHANNELS;
+ filter= (ANIMFILTER_CHANNELS | ANIMFILTER_NODUPLIS);
ANIM_animdata_filter(&ac, &all_data, filter, ac.data, ac.datatype);
/* filter data */
- filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL);
+ filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL | ANIMFILTER_NODUPLIS);
ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
/* See if we should be making showing all selected or hiding */
@@ -1215,7 +1215,8 @@
}
/* filter data that we're working on */
- filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CHANNELS);
+ // XXX: noduplis enabled so that results don't cancel, but will be problematic for some channels where only type differs
+ filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CHANNELS | ANIMFILTER_NODUPLIS);
if (onlysel) filter |= ANIMFILTER_SEL;
ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
Modified: branches/render25/source/blender/editors/animation/anim_filter.c
===================================================================
--- branches/render25/source/blender/editors/animation/anim_filter.c 2010-05-20 09:17:49 UTC (rev 28876)
+++ branches/render25/source/blender/editors/animation/anim_filter.c 2010-05-20 09:38:15 UTC (rev 28877)
@@ -68,6 +68,7 @@
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
+#include "BLI_ghash.h"
#include "BKE_animsys.h"
#include "BKE_action.h"
@@ -2512,6 +2513,65 @@
return 1;
}
+/* ----------- Cleanup API --------------- */
+
+/* Remove entries with invalid types in animation channel list */
+static int animdata_filter_remove_invalid (ListBase *anim_data)
+{
+ bAnimListElem *ale, *next;
+ int items = 0;
+
+ /* only keep entries with valid types */
+ for (ale= anim_data->first; ale; ale= next) {
+ next= ale->next;
+
+ if (ale->type == ANIMTYPE_NONE)
+ BLI_freelinkN(anim_data, ale);
+ else
+ items++;
+ }
+
+ return items;
+}
+
+/* Remove duplicate entries in animation channel list */
+static int animdata_filter_remove_duplis (ListBase *anim_data)
+{
+ bAnimListElem *ale, *next;
+ GHash *gh;
+ int items = 0;
+
+ /* build new hashtable to efficiently store and retrieve which entries have been
+ * encountered already while searching
+ */
+ gh= BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "animdata_filter_duplis_remove gh");
+
+ /* loop through items, removing them from the list if a similar item occurs already */
+ for (ale = anim_data->first; ale; ale = next) {
+ next = ale->next;
+
+ /* check if hash has any record of an entry like this
+ * - just use ale->data for now, though it would be nicer to involve
+ * ale->type in combination too to capture corner cases (where same data performs differently)
+ */
+ if (BLI_ghash_haskey(gh, ale->data) == 0) {
+ /* this entry is 'unique' and can be kept */
+ BLI_ghash_insert(gh, ale->data, NULL);
+ items++;
+ }
+ else {
+ /* this entry isn't needed anymore */
+ BLI_freelinkN(anim_data, ale);
+ }
+ }
+
+ /* free the hash... */
+ BLI_ghash_free(gh, NULL, NULL);
+
+ /* return the number of items still in the list */
+ return items;
+}
+
/* ----------- Public API --------------- */
/* This function filters the active data source to leave only animation channels suitable for
@@ -2527,7 +2587,6 @@
/* only filter data if there's somewhere to put it */
if (data && anim_data) {
- bAnimListElem *ale, *next;
Object *obact= (ac) ? ac->obact : NULL;
/* firstly filter the data */
@@ -2572,16 +2631,12 @@
break;
}
- /* remove any weedy entries */
- // XXX this is weedy code!
- for (ale= anim_data->first; ale; ale= next) {
- next= ale->next;
-
- if (ale->type == ANIMTYPE_NONE) {
- items--;
- BLI_freelinkN(anim_data, ale);
- }
- }
+ /* remove any 'weedy' entries */
+ items = animdata_filter_remove_invalid(anim_data);
+
+ /* remove duplicates (if required) */
+ if (filter_mode & ANIMFILTER_NODUPLIS)
+ items = animdata_filter_remove_duplis(anim_data);
}
/* return the number of items in the list */
Modified: branches/render25/source/blender/editors/include/ED_anim_api.h
===================================================================
--- branches/render25/source/blender/editors/include/ED_anim_api.h 2010-05-20 09:17:49 UTC (rev 28876)
+++ branches/render25/source/blender/editors/include/ED_anim_api.h 2010-05-20 09:38:15 UTC (rev 28877)
@@ -192,6 +192,7 @@
ANIMFILTER_ANIMDATA = (1<<9), /* only return the underlying AnimData blocks (not the tracks, etc.) data comes from */
ANIMFILTER_NLATRACKS = (1<<10), /* only include NLA-tracks */
ANIMFILTER_SELEDIT = (1<<11), /* link editability with selected status */
+ ANIMFILTER_NODUPLIS = (1<<12), /* duplicate entries for animation data attached to multi-user blocks must not occur */
/* all filters - the power inside the bracket must be the last power for left-shifts + 1 */
ANIMFILTER_ALLFILTERS = ((1<<12) - 1)
Modified: branches/render25/source/blender/editors/space_action/action_edit.c
===================================================================
--- branches/render25/source/blender/editors/space_action/action_edit.c 2010-05-20 09:17:49 UTC (rev 28876)
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list