[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