[Bf-blender-cvs] [398c669] temp_widgets_c++_experiment: Refactor widget library

Julian Eisel noreply at git.blender.org
Fri Dec 25 02:30:59 CET 2015


Commit: 398c669d6329db9f74278fba579c0ddd73fd4e56
Author: Julian Eisel
Date:   Fri Dec 25 02:00:08 2015 +0100
Branches: temp_widgets_c++_experiment
https://developer.blender.org/rB398c669d6329db9f74278fba579c0ddd73fd4e56

Refactor widget library

* Rename folder 3d_widgets/ to widget_library/
* Split up wm_generic_widgets.c into separate .cc files for each widget, move them into widget_library/
* Rename files containing geometry vectors from xxx_widget.c to geom_xxx_widget.cc
* Rename wm_widget_library.h to widget_geometry.h (contains the geom_xxx_widget.cc declarations)
* Add widget_library.h (contains widget library API declarations for external access)
* Move widget drawing function to wm_widget.cc
* Add/improve (doxygen) comments
* Remove wm_generic_widgets.c
* Usual cleanup

We have 22 files for widgets now :S Seems a lot, but maaaaaan things are so nicely structured now!

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

M	release/datafiles/widget_export.py
M	source/blender/windowmanager/CMakeLists.txt
M	source/blender/windowmanager/WM_api.h
D	source/blender/windowmanager/widgets/3d_widgets/arrow_widget.c
D	source/blender/windowmanager/widgets/3d_widgets/cube_widget.c
D	source/blender/windowmanager/widgets/3d_widgets/dial_widget.c
D	source/blender/windowmanager/widgets/3d_widgets/wm_widget_library.h
A	source/blender/windowmanager/widgets/widget_library/arrow_widget.cc
A	source/blender/windowmanager/widgets/widget_library/cage_widget.cc
A	source/blender/windowmanager/widgets/widget_library/dial_widget.cc
A	source/blender/windowmanager/widgets/widget_library/facemap_widget.cc
A	source/blender/windowmanager/widgets/widget_library/geom_arrow_widget.cc
A	source/blender/windowmanager/widgets/widget_library/geom_cube_widget.cc
A	source/blender/windowmanager/widgets/widget_library/geom_dial_widget.cc
A	source/blender/windowmanager/widgets/widget_library/plane_widget.cc
A	source/blender/windowmanager/widgets/widget_library/widget_geometry.h
A	source/blender/windowmanager/widgets/widget_library/widget_library.h
D	source/blender/windowmanager/widgets/wm_generic_widgets.c
M	source/blender/windowmanager/widgets/wm_widget.cc
M	source/blender/windowmanager/widgets/wm_widget.h
M	source/blender/windowmanager/widgets/wm_widgets_c_api.h

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

diff --git a/release/datafiles/widget_export.py b/release/datafiles/widget_export.py
index c700f25..1958b28 100644
--- a/release/datafiles/widget_export.py
+++ b/release/datafiles/widget_export.py
@@ -13,14 +13,14 @@ def mesh_triangulate(me):
     
 
 class ExportWidget(Operator, ExportHelper):
-    """Export a widget mesh as a C file"""
+    """Export a widget mesh as a C++ file"""
     bl_idname = "export_scene.widget"
     bl_label = "Export Widget"
     bl_options = {'PRESET', 'UNDO'}
 
-    filename_ext = ".c"
+    filename_ext = ".cc"
     filter_glob = StringProperty(
-            default="*.c;",
+            default="*.cc;",
             options={'HIDDEN'},
             )
     @classmethod
@@ -63,7 +63,7 @@ class ExportWidget(Operator, ExportHelper):
         return {'FINISHED'}
 
 def menu_func_export(self, context):
-    self.layout.operator(ExportWidget.bl_idname, text="Widget (.c)")
+    self.layout.operator(ExportWidget.bl_idname, text="Widget (.cc)")
 
         
 def register():
diff --git a/source/blender/windowmanager/CMakeLists.txt b/source/blender/windowmanager/CMakeLists.txt
index 35763c2..20ba0a0 100644
--- a/source/blender/windowmanager/CMakeLists.txt
+++ b/source/blender/windowmanager/CMakeLists.txt
@@ -79,16 +79,20 @@ set(SRC
 	wm_subwindow.h
 	wm_window.h
 
-	widgets/wm_generic_widgets.c
 	widgets/wm_widget.cc
 	widgets/wm_widgetgroup.cc
 	widgets/wm_widgetgrouptype.cc
 	widgets/wm_widgetmap.cc
 	widgets/wm_widgetmaptype.cc
 	widgets/wm_widgets_c_api.cc
-	widgets/3d_widgets/arrow_widget.c
-	widgets/3d_widgets/cube_widget.c
-	widgets/3d_widgets/dial_widget.c
+	widgets/widget_library/arrow_widget.cc
+	widgets/widget_library/cage_widget.cc
+	widgets/widget_library/dial_widget.cc
+	widgets/widget_library/facemap_widget.cc
+	widgets/widget_library/geom_arrow_widget.cc
+	widgets/widget_library/geom_cube_widget.cc
+	widgets/widget_library/geom_dial_widget.cc
+	widgets/widget_library/plane_widget.cc
 
 	widgets/wm_widget.h
 	widgets/wm_widgetgroup.h
@@ -96,7 +100,8 @@ set(SRC
 	widgets/wm_widgetmap.h
 	widgets/wm_widgetmaptype.h
 	widgets/wm_widgets_c_api.h
-	widgets/3d_widgets/wm_widget_library.h
+	widgets/widget_library/widget_geometry.h
+	widgets/widget_library/widget_library.h
 )
 
 if(WITH_AUDASPACE)
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 5bcd6e5..c7f4801 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -518,7 +518,8 @@ enum {
 
 wmKeyMap *WM_widgetgroup_keymap_common(wmKeyConfig *config, const char *wgroupname);
 
-/* wm_generic_widgets.c */
+
+/* widget library */
 
 enum {
 	WIDGET_ARROW_STYLE_NORMAL        =  1,
@@ -552,29 +553,7 @@ enum {
 	RECT_TRANSFORM_SLOT_SCALE = 1
 };
 
-struct wmWidget *WIDGET_arrow_new(struct wmWidgetGroup *wgroup, const char *name, const int style);
-void WIDGET_arrow_set_direction(struct wmWidget *widget, const float direction[3]);
-void WIDGET_arrow_set_up_vector(struct wmWidget *widget, const float direction[3]);
-void WIDGET_arrow_set_line_len(struct wmWidget *widget, const float len);
-void WIDGET_arrow_set_ui_range(struct wmWidget *widget, const float min, const float max);
-void WIDGET_arrow_set_range_fac(struct wmWidget *widget, const float range_fac);
-void WIDGET_arrow_cone_set_aspect(struct wmWidget *widget, const float aspect[2]);
-
-struct wmWidget *WIDGET_dial_new(struct wmWidgetGroup *wgroup, const char *name, const int style);
-void WIDGET_dial_set_up_vector(struct wmWidget *widget, const float direction[3]);
-
-struct wmWidget *WIDGET_plane_new(struct wmWidgetGroup *wgroup, const char *name, const int style);
-void WIDGET_plane_set_direction(struct wmWidget *widget, const float direction[3]);
-void WIDGET_plane_set_up_vector(struct wmWidget *widget, const float direction[3]);
-
-struct wmWidget *WIDGET_rect_transform_new(
-        struct wmWidgetGroup *wgroup, const char *name, const int style,
-        const float width, const float height);
-
-struct wmWidget *WIDGET_facemap_new(
-        struct wmWidgetGroup *wgroup, const char *name, const int style,
-        struct Object *ob, const int facemap);
-struct bFaceMap *WIDGET_facemap_get_fmap(struct wmWidget *widget);
+/* end Widget API  */
 
 
 #ifdef WITH_INPUT_IME
diff --git a/source/blender/windowmanager/widgets/3d_widgets/wm_widget_library.h b/source/blender/windowmanager/widgets/3d_widgets/wm_widget_library.h
deleted file mode 100644
index 24dc8c9..0000000
--- a/source/blender/windowmanager/widgets/3d_widgets/wm_widget_library.h
+++ /dev/null
@@ -1,24 +0,0 @@
-
-/* arrow widget */
-extern int _WIDGET_nverts_arrow;
-extern int _WIDGET_ntris_arrow;
-
-extern float _WIDGET_verts_arrow[][3];
-extern float _WIDGET_normals_arrow[][3];
-extern unsigned short _WIDGET_indices_arrow[];
-
-/* cube widget */
-extern int _WIDGET_nverts_cube;
-extern int _WIDGET_ntris_cube;
-
-extern float _WIDGET_verts_cube[][3];
-extern float _WIDGET_normals_cube[][3];
-extern unsigned short _WIDGET_indices_cube[];
-
-/* dial widget */
-extern int _WIDGET_nverts_dial;
-extern int _WIDGET_ntris_dial;
-
-extern float _WIDGET_verts_dial[][3];
-extern float _WIDGET_normals_dial[][3];
-extern unsigned short _WIDGET_indices_dial[];
diff --git a/source/blender/windowmanager/widgets/widget_library/arrow_widget.cc b/source/blender/windowmanager/widgets/widget_library/arrow_widget.cc
new file mode 100644
index 0000000..6b23bc7
--- /dev/null
+++ b/source/blender/windowmanager/widgets/widget_library/arrow_widget.cc
@@ -0,0 +1,659 @@
+/*
+ * ***** 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, Julian Eisel
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/windowmanager/widgets/widget_library/arrow_widget.cc
+ *  \ingroup wm
+ *
+ * \name Arrow Widget
+ *
+ * 3D Widget
+ *
+ * \brief Simple arrow widget which is dragged into a certain direction. The arrow head can have varying shapes, e.g.
+ *        cone, box, etc.
+ */
+
+#include "BIF_gl.h"
+
+#include "BKE_context.h"
+
+#include "BLI_math.h"
+
+#include "DNA_view3d_types.h"
+
+#include "ED_view3d.h"
+#include "ED_screen.h"
+
+#include "GPU_select.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "RNA_access.h"
+
+#include "WM_types.h"
+#include "WM_api.h"
+#include "wm.h"
+
+#include "../wm_widget.h"
+#include "widget_geometry.h"
+
+
+/* to use custom arrows exported to arrow_widget.c */
+//#define WIDGET_USE_CUSTOM_ARROWS
+
+
+#ifdef WIDGET_USE_CUSTOM_ARROWS
+WidgetDrawInfo arrow_head_draw_info = {0};
+#endif
+WidgetDrawInfo cube_draw_info = {0};
+
+/* ArrowWidget->flag */
+enum {
+	ARROW_UP_VECTOR_SET    = (1 << 0),
+	ARROW_CUSTOM_RANGE_SET = (1 << 1),
+};
+
+typedef struct ArrowWidget {
+	wmWidget widget;
+	int style;
+	int flag;
+
+	float len;          /* arrow line length */
+	float direction[3];
+	float up[3];
+	float aspect[2];    /* cone style only */
+
+	float range_fac;      /* factor for arrow min/max distance */
+	float offset;
+	/* property range and minimum for constrained arrows */
+	float range, min;
+} ArrowWidget;
+
+typedef struct ArrowInteraction {
+	float orig_value; /* initial property value */
+	float orig_origin[3];
+	float orig_mouse[2];
+	float orig_offset;
+	float orig_scale;
+
+	/* offset of last handling step */
+	float prev_offset;
+	/* Total offset added by precision tweaking.
+	 * Needed to allow toggling precision on/off without causing jumps */
+	float precision_offset;
+} ArrowInteraction;
+
+/* factor for precision tweaking */
+#define ARROW_PRECISION_FAC 0.05f
+
+
+static void widget_arrow_get_final_pos(wmWidget *widget, float r_pos[3])
+{
+	ArrowWidget *arrow = (ArrowWidget *)widget;
+
+	mul_v3_v3fl(r_pos, arrow->direction, arrow->offset);
+	add_v3_v3(r_pos, arrow->widget.origin);
+}
+
+static void arrow_draw_geom(const ArrowWidget *arrow, const bool select)
+{
+	if (arrow->style & WIDGET_ARROW_STYLE_CROSS) {
+		glPushAttrib(GL_ENABLE_BIT);
+		glDisable(GL_LIGHTING);
+		glBegin(GL_LINES);
+		glVertex2f(-1.0, 0.f);
+		glVertex2f(1.0, 0.f);
+		glVertex2f(0.f, -1.0);
+		glVertex2f(0.f, 1.0);
+		glEnd();
+
+		glPopAttrib();
+	}
+	else if (arrow->style & WIDGET_ARROW_STYLE_CONE) {
+		const float unitx = arrow->aspect[0];
+		const float unity = arrow->aspect[1];
+		const float vec[4][3] = {
+			{-unitx, -unity, 0},
+			{ unitx, -unity, 0},
+			{ unitx,  unity, 0},
+			{-unitx,  unity, 0},
+		};
+
+		glLineWidth(arrow->widget.line_width);
+		glEnableClientState(GL_VERTEX_ARRAY);
+		glVertexPointer(3, GL_FLOAT, 0, vec);
+		glDrawArrays(GL_LINE_LOOP, 0, ARRAY_SIZE(vec));
+		glDisableClientState(GL_VERTEX_ARRAY);
+		glLineWidth(1.0);
+	}
+	else {
+#ifdef WIDGET_USE_CUSTOM_ARROWS
+		widget_draw_intern(&arrow_head_draw_info, select);
+#else
+		const float vec[2][3] = {
+			{0.0f, 0.0f, 0.0f},
+			{0.0f, 0.0f, arrow->len},
+		};
+
+		glLineWidth(arrow->widget.line_width);
+		glEnableClientState(GL_VERTEX_ARRAY);
+		glVertexPointer(3, GL_FLOAT, 0, vec);
+		glDrawArrays(GL_LINE_STRIP, 0, ARRAY_SIZE(vec));
+		glDisableClientState(GL_VERTEX_ARRAY);
+		glLineWidth(1.0);
+
+
+		/* *** draw arrow head *** */
+
+		glPushMatrix();
+
+		if (arrow->style & WIDGET_ARROW_STYLE_BOX) {
+			const float size = 0.05f;
+
+			/* translate to line end with some extra offset so box starts exactly where line ends */
+			glTranslatef(0.0f, 0.0f, arrow->len + size);
+			/* scale down to box size */
+			glScalef(size, size, size);
+
+			/* draw cube *

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list