[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [26103] trunk/blender/source/blender/ editors: patch [#20690] Cut Linking for Logic Bricks

Campbell Barton ideasman42 at gmail.com
Tue Jan 19 12:24:44 CET 2010


Revision: 26103
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=26103
Author:   campbellbarton
Date:     2010-01-19 12:24:42 +0100 (Tue, 19 Jan 2010)

Log Message:
-----------
patch [#20690] Cut Linking for Logic Bricks
from Dalai Felinto (dfelinto)

cutting kinks now works the same as in the node editor.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/CMakeLists.txt
    trunk/blender/source/blender/editors/interface/interface.c
    trunk/blender/source/blender/editors/interface/interface_intern.h
    trunk/blender/source/blender/editors/interface/interface_widgets.c
    trunk/blender/source/blender/editors/space_logic/SConscript
    trunk/blender/source/blender/editors/space_logic/logic_buttons.c
    trunk/blender/source/blender/editors/space_logic/logic_intern.h
    trunk/blender/source/blender/editors/space_logic/space_logic.c

Modified: trunk/blender/source/blender/editors/CMakeLists.txt
===================================================================
--- trunk/blender/source/blender/editors/CMakeLists.txt	2010-01-19 11:11:56 UTC (rev 26102)
+++ trunk/blender/source/blender/editors/CMakeLists.txt	2010-01-19 11:24:42 UTC (rev 26103)
@@ -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

Modified: trunk/blender/source/blender/editors/interface/interface.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface.c	2010-01-19 11:11:56 UTC (rev 26102)
+++ trunk/blender/source/blender/editors/interface/interface.c	2010-01-19 11:24:42 UTC (rev 26103)
@@ -942,7 +942,42 @@
 
 /* *************************************************************** */
 
+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)

Modified: trunk/blender/source/blender/editors/interface/interface_intern.h
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_intern.h	2010-01-19 11:11:56 UTC (rev 26102)
+++ trunk/blender/source/blender/editors/interface/interface_intern.h	2010-01-19 11:24:42 UTC (rev 26103)
@@ -318,6 +318,8 @@
 
 /* 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 @@
 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);

Modified: trunk/blender/source/blender/editors/interface/interface_widgets.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_widgets.c	2010-01-19 11:11:56 UTC (rev 26102)
+++ trunk/blender/source/blender/editors/interface/interface_widgets.c	2010-01-19 11:24:42 UTC (rev 26103)
@@ -1840,8 +1840,8 @@
 	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];
 

Modified: trunk/blender/source/blender/editors/space_logic/SConscript
===================================================================
--- trunk/blender/source/blender/editors/space_logic/SConscript	2010-01-19 11:11:56 UTC (rev 26102)
+++ trunk/blender/source/blender/editors/space_logic/SConscript	2010-01-19 11:24:42 UTC (rev 26103)
@@ -5,7 +5,7 @@
 
 incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf'
 incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include'
-incs += ' ../../makesrna'
+incs += ' ../../makesrna ../interface'
 
 defs = []
 

Modified: trunk/blender/source/blender/editors/space_logic/logic_buttons.c
===================================================================
--- trunk/blender/source/blender/editors/space_logic/logic_buttons.c	2010-01-19 11:11:56 UTC (rev 26102)
+++ trunk/blender/source/blender/editors/space_logic/logic_buttons.c	2010-01-19 11:24:42 UTC (rev 26103)
@@ -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 @@
 	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

Modified: trunk/blender/source/blender/editors/space_logic/logic_intern.h
===================================================================
--- trunk/blender/source/blender/editors/space_logic/logic_intern.h	2010-01-19 11:11:56 UTC (rev 26102)
+++ trunk/blender/source/blender/editors/space_logic/logic_intern.h	2010-01-19 11:24:42 UTC (rev 26103)
@@ -50,6 +50,7 @@
 /* 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);

Modified: trunk/blender/source/blender/editors/space_logic/space_logic.c
===================================================================
--- trunk/blender/source/blender/editors/space_logic/space_logic.c	2010-01-19 11:11:56 UTC (rev 26102)
+++ trunk/blender/source/blender/editors/space_logic/space_logic.c	2010-01-19 11:24:42 UTC (rev 26103)
@@ -183,7 +183,7 @@
 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 @@
 	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)





More information about the Bf-blender-cvs mailing list