Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/editors/CMakeLists.txt2
-rw-r--r--source/blender/editors/interface/interface.c35
-rw-r--r--source/blender/editors/interface/interface_intern.h3
-rw-r--r--source/blender/editors/interface/interface_widgets.c4
-rw-r--r--source/blender/editors/space_logic/SConscript2
-rw-r--r--source/blender/editors/space_logic/logic_buttons.c87
-rw-r--r--source/blender/editors/space_logic/logic_intern.h1
-rw-r--r--source/blender/editors/space_logic/space_logic.c3
8 files changed, 132 insertions, 5 deletions
diff --git a/source/blender/editors/CMakeLists.txt b/source/blender/editors/CMakeLists.txt
index 8ed840f0be4..0fbc70d522b 100644
--- a/source/blender/editors/CMakeLists.txt
+++ b/source/blender/editors/CMakeLists.txt
@@ -27,7 +27,7 @@
FILE(GLOB SRC */*.c)
SET(INC ../windowmanager
- ../editors/include
+ ../editors/include ../editors/interface
../../../intern/guardedalloc ../../../intern/memutil
../blenlib ../makesdna ../makesrna ../blenkernel
../include ../imbuf ../render/extern/include
diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c
index 72502dd018f..48fd23ad0e7 100644
--- a/source/blender/editors/interface/interface.c
+++ b/source/blender/editors/interface/interface.c
@@ -942,7 +942,42 @@ void uiBlockClearButLock(uiBlock *block)
/* *************************************************************** */
+void ui_delete_linkline(uiLinkLine *line, uiBut *but)
+{
+ uiLink *link;
+ int a, b;
+
+ BLI_remlink(&but->link->lines, line);
+
+ link= line->from->link;
+
+ /* are there more pointers allowed? */
+ if(link->ppoin) {
+
+ if(*(link->totlink)==1) {
+ *(link->totlink)= 0;
+ MEM_freeN(*(link->ppoin));
+ *(link->ppoin)= NULL;
+ }
+ else {
+ b= 0;
+ for(a=0; a< (*(link->totlink)); a++) {
+
+ if( (*(link->ppoin))[a] != line->to->poin ) {
+ (*(link->ppoin))[b]= (*(link->ppoin))[a];
+ b++;
+ }
+ }
+ (*(link->totlink))--;
+ }
+ }
+ else {
+ *(link->poin)= NULL;
+ }
+ MEM_freeN(line);
+ //REDRAW
+}
/* XXX 2.50 no links supported yet */
#if 0
static void ui_delete_active_linkline(uiBlock *block)
diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h
index 52a9ca591e5..089ad85a5a1 100644
--- a/source/blender/editors/interface/interface_intern.h
+++ b/source/blender/editors/interface/interface_intern.h
@@ -318,6 +318,8 @@ typedef struct uiSafetyRct {
/* interface.c */
+extern void ui_delete_linkline(uiLinkLine *line, uiBut *but);
+
extern int ui_translate_buttons(void);
extern int ui_translate_menus(void);
extern int ui_translate_tooltips(void);
@@ -441,6 +443,7 @@ extern int ui_button_is_active(struct ARegion *ar);
void ui_draw_anti_tria(float x1, float y1, float x2, float y2, float x3, float y3);
void ui_draw_menu_back(struct uiStyle *style, uiBlock *block, rcti *rect);
void ui_draw_search_back(struct uiStyle *style, uiBlock *block, rcti *rect);
+int ui_link_bezier_points(rcti *rect, float coord_array[][2], int resol);
void ui_draw_link_bezier(rcti *rect);
extern void ui_draw_but(const struct bContext *C, ARegion *ar, struct uiStyle *style, uiBut *but, rcti *rect);
diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c
index 91253a94073..bbc07e06217 100644
--- a/source/blender/editors/interface/interface_widgets.c
+++ b/source/blender/editors/interface/interface_widgets.c
@@ -1840,8 +1840,8 @@ static void widget_numbut(uiWidgetColors *wcol, rcti *rect, int state, int round
rect->xmax -= textofs;
}
-
-static int ui_link_bezier_points(rcti *rect, float coord_array[][2], int resol)
+//static int ui_link_bezier_points(rcti *rect, float coord_array[][2], int resol)
+int ui_link_bezier_points(rcti *rect, float coord_array[][2], int resol)
{
float dist, vec[4][2];
diff --git a/source/blender/editors/space_logic/SConscript b/source/blender/editors/space_logic/SConscript
index e32fcc1b535..307d229fb3f 100644
--- a/source/blender/editors/space_logic/SConscript
+++ b/source/blender/editors/space_logic/SConscript
@@ -5,7 +5,7 @@ sources = env.Glob('*.c')
incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf'
incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include'
-incs += ' ../../makesrna'
+incs += ' ../../makesrna ../interface'
defs = []
diff --git a/source/blender/editors/space_logic/logic_buttons.c b/source/blender/editors/space_logic/logic_buttons.c
index e159af65c74..9ee170b90d8 100644
--- a/source/blender/editors/space_logic/logic_buttons.c
+++ b/source/blender/editors/space_logic/logic_buttons.c
@@ -56,6 +56,7 @@
#include "BIF_glutil.h"
#include "RNA_access.h"
+#include "RNA_define.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -64,6 +65,7 @@
#include "UI_resources.h"
#include "UI_view2d.h"
+#include "interface_intern.h"
#include "logic_intern.h"
#if 0
@@ -143,5 +145,90 @@ void LOGIC_OT_properties(wmOperatorType *ot)
ot->flag= 0;
}
+/* Remove Logic Bricks Connections */
+/* ********************** Cut Link operator ***************** */
+#define LINK_RESOL 12
+static int cut_links_intersect(uiLinkLine *line, float mcoords[][2], int tot)
+{
+ float coord_array[LINK_RESOL+1][2];
+ int i, b;
+ rcti rectlink;
+
+ rectlink.xmin= (int) (line->from->x1 + line->from->x2) / 2;
+ rectlink.ymin= (int) (line->from->y1 + line->from->y2) / 2;
+ rectlink.xmax= (int) (line->to->x1 + line->to->x2) / 2;
+ rectlink.ymax= (int) (line->to->y1 + line->to->y2) / 2;
+
+ if(ui_link_bezier_points(&rectlink, coord_array, LINK_RESOL)){
+ for(i=0; i<tot-1; i++)
+ for(b=0; b<LINK_RESOL-1; b++)
+ if(isect_line_line_v2(mcoords[i], mcoords[i+1], coord_array[b], coord_array[b+1]) > 0)
+ return 1;
+ }
+ return 0;
+}
+
+static int cut_links_exec(bContext *C, wmOperator *op)
+{
+ ARegion *ar= CTX_wm_region(C);
+ float mcoords[256][2];
+ int i= 0;
+
+ RNA_BEGIN(op->ptr, itemptr, "path") {
+ float loc[2];
+
+ RNA_float_get_array(&itemptr, "loc", loc);
+ UI_view2d_region_to_view(&ar->v2d, (short)loc[0], (short)loc[1],
+ &mcoords[i][0], &mcoords[i][1]);
+ i++;
+ if(i>= 256) break;
+ }
+ RNA_END;
+
+ if (i>1) {
+ uiBlock *block;
+ uiLinkLine *line, *nline;
+ uiBut *but;
+ for(block= ar->uiblocks.first; block; block= block->next)
+ {
+ but= block->buttons.first;
+ while(but) {
+ if(but->type==LINK && but->link) {
+ for(line= but->link->lines.first; line; line= nline) {
+ nline= line->next;
+
+ if(cut_links_intersect(line, mcoords, i)) {
+ ui_delete_linkline(line, but);
+ }
+ }
+ }
+ but= but->next;
+ }
+ }
+ return OPERATOR_FINISHED;
+ }
+ return OPERATOR_CANCELLED|OPERATOR_PASS_THROUGH;
+}
+void LOGIC_OT_links_cut(wmOperatorType *ot)
+{
+ PropertyRNA *prop;
+
+ ot->name= "Cut links";
+ ot->idname= "LOGIC_OT_links_cut";
+
+ ot->invoke= WM_gesture_lines_invoke;
+ ot->modal= WM_gesture_lines_modal;
+ ot->exec= cut_links_exec;
+
+ ot->poll= ED_operator_logic_active;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ prop= RNA_def_property(ot->srna, "path", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_struct_runtime(prop, &RNA_OperatorMousePath);
+ /* internal */
+ RNA_def_int(ot->srna, "cursor", BC_KNIFECURSOR, 0, INT_MAX, "Cursor", "", 0, INT_MAX);
+} \ No newline at end of file
diff --git a/source/blender/editors/space_logic/logic_intern.h b/source/blender/editors/space_logic/logic_intern.h
index ac5d11a3ee1..eba1d332acd 100644
--- a/source/blender/editors/space_logic/logic_intern.h
+++ b/source/blender/editors/space_logic/logic_intern.h
@@ -50,6 +50,7 @@ void logic_header_buttons(const struct bContext *C, struct ARegion *ar);
/* logic_buttons.c */
void logic_buttons_register(struct ARegionType *art);
void LOGIC_OT_properties(struct wmOperatorType *ot);
+void LOGIC_OT_links_cut(struct wmOperatorType *ot);
/* logic_window.c */
void logic_buttons(struct bContext *C, struct ARegion *ar);
diff --git a/source/blender/editors/space_logic/space_logic.c b/source/blender/editors/space_logic/space_logic.c
index 06e92ee5fce..a0ef6c395d4 100644
--- a/source/blender/editors/space_logic/space_logic.c
+++ b/source/blender/editors/space_logic/space_logic.c
@@ -183,7 +183,7 @@ static SpaceLink *logic_duplicate(SpaceLink *sl)
void logic_operatortypes(void)
{
WM_operatortype_append(LOGIC_OT_properties);
-
+ WM_operatortype_append(LOGIC_OT_links_cut);
}
void logic_keymap(struct wmKeyConfig *keyconf)
@@ -191,6 +191,7 @@ void logic_keymap(struct wmKeyConfig *keyconf)
wmKeyMap *keymap= WM_keymap_find(keyconf, "Logic Editor", SPACE_LOGIC, 0);
WM_keymap_add_item(keymap, "LOGIC_OT_properties", NKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "LOGIC_OT_links_cut", LEFTMOUSE, KM_PRESS, KM_CTRL, 0);
}
static void logic_refresh(const bContext *C, ScrArea *sa)