| 
									
										
										
										
											2003-02-26 19:22:24 +00:00
										 |  |  | /* 
 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * ***** BEGIN GPL/BL DUAL 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. The Blender | 
					
						
							|  |  |  |  * Foundation also sells licenses for use in proprietary software under | 
					
						
							|  |  |  |  * the Blender License.  See http://www.blender.org/BL/ for information
 | 
					
						
							|  |  |  |  * about this. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 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, | 
					
						
							| 
									
										
										
										
											2004-06-24 09:43:13 +00:00
										 |  |  |  * Inc., 59 Temple Place - Suite 330, Boston, MA	02111-1307, USA. | 
					
						
							| 
									
										
										
										
											2003-02-26 19:22:24 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. | 
					
						
							|  |  |  |  * All rights reserved. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This is a new part of Blender. | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2003-05-17 04:29:49 +00:00
										 |  |  |  * Contributor(s): Michel Selten, Willian P. Germano | 
					
						
							| 
									
										
										
										
											2003-02-26 19:22:24 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * ***** END GPL/BL DUAL LICENSE BLOCK ***** | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-05-17 04:29:49 +00:00
										 |  |  | #include "gen_utils.h"
 | 
					
						
							| 
									
										
										
										
											2003-12-14 01:18:09 +00:00
										 |  |  | #include "constant.h"
 | 
					
						
							| 
									
										
										
										
											2003-03-08 18:10:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-06-24 09:43:13 +00:00
										 |  |  | #include <DNA_text_types.h>
 | 
					
						
							|  |  |  | #include <MEM_guardedalloc.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-05-17 04:29:49 +00:00
										 |  |  | /*****************************************************************************/ | 
					
						
							| 
									
										
										
										
											2004-06-24 09:43:13 +00:00
										 |  |  | /* Description: This function clamps an int to the given interval						 */ | 
					
						
							|  |  |  | /*							[min, max].																									 */ | 
					
						
							| 
									
										
										
										
											2003-05-17 04:29:49 +00:00
										 |  |  | /*****************************************************************************/ | 
					
						
							|  |  |  | int EXPP_ClampInt (int value, int min, int max) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if (value < min) return min; | 
					
						
							|  |  |  | 	else if (value > max) return max; | 
					
						
							|  |  |  | 	return value; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2003-03-08 18:10:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-04-08 19:54:14 +00:00
										 |  |  | /*****************************************************************************/ | 
					
						
							| 
									
										
										
										
											2004-06-24 09:43:13 +00:00
										 |  |  | /* Description: This function clamps a float to the given interval					 */ | 
					
						
							|  |  |  | /*							[min, max].																									 */ | 
					
						
							| 
									
										
										
										
											2003-04-08 19:54:14 +00:00
										 |  |  | /*****************************************************************************/ | 
					
						
							|  |  |  | float EXPP_ClampFloat (float value, float min, float max) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if (value < min) return min; | 
					
						
							|  |  |  | 	else if (value > max) return max; | 
					
						
							|  |  |  | 	return value; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-03-18 20:21:26 +00:00
										 |  |  | /*****************************************************************************/ | 
					
						
							|  |  |  | /* Description: This function returns true if both given strings are equal,  */ | 
					
						
							| 
									
										
										
										
											2004-06-24 09:43:13 +00:00
										 |  |  | /*							otherwise it returns false.																	 */ | 
					
						
							| 
									
										
										
										
											2003-03-18 20:21:26 +00:00
										 |  |  | /*****************************************************************************/ | 
					
						
							| 
									
										
										
										
											2003-11-23 17:46:06 +00:00
										 |  |  | int StringEqual (const char * string1, const char * string2) | 
					
						
							| 
									
										
										
										
											2003-03-08 18:10:20 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	return (strcmp(string1, string2)==0); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-03-18 20:21:26 +00:00
										 |  |  | /*****************************************************************************/ | 
					
						
							| 
									
										
										
										
											2004-06-24 09:43:13 +00:00
										 |  |  | /* Description: This function returns the name of the given ID struct				 */ | 
					
						
							|  |  |  | /*							without the Object type identifying characters prepended.		 */ | 
					
						
							| 
									
										
										
										
											2003-03-18 20:21:26 +00:00
										 |  |  | /*****************************************************************************/ | 
					
						
							| 
									
										
										
										
											2003-03-15 19:14:16 +00:00
										 |  |  | char * GetIdName (ID *id) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return ((id->name)+2); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-05-17 04:29:49 +00:00
										 |  |  | /*****************************************************************************/ | 
					
						
							| 
									
										
										
										
											2004-06-24 09:43:13 +00:00
										 |  |  | /* Description: This function returns the ID of the object with given name	 */ | 
					
						
							|  |  |  | /*							from a given list.																					 */ | 
					
						
							| 
									
										
										
										
											2003-05-17 04:29:49 +00:00
										 |  |  | /*****************************************************************************/ | 
					
						
							|  |  |  | ID *GetIdFromList(ListBase *list, char *name) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	ID *id = list->first; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	while (id) { | 
					
						
							|  |  |  | 		if(strcmp(name, id->name+2) == 0) break; | 
					
						
							|  |  |  | 			id= id->next; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return id; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-03-18 20:21:26 +00:00
										 |  |  | /*****************************************************************************/ | 
					
						
							| 
									
										
										
										
											2004-06-24 09:43:13 +00:00
										 |  |  | /* Description: These functions set an internal string with the given type	 */ | 
					
						
							|  |  |  | /*							and error_msg arguments.																		 */ | 
					
						
							| 
									
										
										
										
											2003-03-18 20:21:26 +00:00
										 |  |  | /*****************************************************************************/ | 
					
						
							| 
									
										
										
										
											2003-03-08 18:10:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-05-08 03:06:46 +00:00
										 |  |  | PyObject *EXPP_ReturnPyObjError (PyObject * type, char * error_msg) | 
					
						
							|  |  |  | { /* same as above, just to change its name smoothly */ | 
					
						
							|  |  |  | 	PyErr_SetString (type, error_msg); | 
					
						
							|  |  |  | 	return NULL; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int EXPP_ReturnIntError (PyObject *type, char *error_msg) | 
					
						
							| 
									
										
										
										
											2003-04-08 19:54:14 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	PyErr_SetString (type, error_msg); | 
					
						
							|  |  |  | 	return -1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-03-18 20:21:26 +00:00
										 |  |  | /*****************************************************************************/ | 
					
						
							| 
									
										
										
										
											2004-06-24 09:43:13 +00:00
										 |  |  | /* Description: This function increments the reference count of the given		 */ | 
					
						
							|  |  |  | /*							Python object (usually Py_None) and returns it.							 */ | 
					
						
							| 
									
										
										
										
											2003-03-18 20:21:26 +00:00
										 |  |  | /*****************************************************************************/ | 
					
						
							| 
									
										
										
										
											2003-03-08 18:10:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-05-08 03:06:46 +00:00
										 |  |  | PyObject *EXPP_incr_ret (PyObject *object) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	Py_INCREF (object); | 
					
						
							|  |  |  | 	return (object); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2004-06-06 22:42:51 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-03-18 20:21:26 +00:00
										 |  |  | /*****************************************************************************/ | 
					
						
							| 
									
										
										
										
											2004-06-24 09:43:13 +00:00
										 |  |  | /* Description: This function maps the event identifier to a string.				 */ | 
					
						
							| 
									
										
										
										
											2003-03-18 20:21:26 +00:00
										 |  |  | /*****************************************************************************/ | 
					
						
							| 
									
										
										
										
											2003-03-08 18:10:20 +00:00
										 |  |  | char * event_to_name(short event) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	switch (event) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		case SCRIPT_FRAMECHANGED: | 
					
						
							|  |  |  | 			return "FrameChanged"; | 
					
						
							|  |  |  | 		case SCRIPT_ONLOAD: | 
					
						
							|  |  |  | 			return "OnLoad"; | 
					
						
							|  |  |  | 		case SCRIPT_REDRAW: | 
					
						
							|  |  |  | 			return "Redraw"; | 
					
						
							|  |  |  | 		default: | 
					
						
							|  |  |  | 			return "Unknown"; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | }	 | 
					
						
							| 
									
										
										
										
											2003-02-26 19:22:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-05-17 04:29:49 +00:00
										 |  |  | /*****************************************************************************/ | 
					
						
							| 
									
										
										
										
											2004-06-24 09:43:13 +00:00
										 |  |  | /* Description: Checks whether all objects in a PySequence are of a same		 */ | 
					
						
							|  |  |  | /*							given type.  Returns 0 if not, 1 on success.								 */ | 
					
						
							| 
									
										
										
										
											2003-05-17 04:29:49 +00:00
										 |  |  | /*****************************************************************************/ | 
					
						
							|  |  |  | int EXPP_check_sequence_consistency(PyObject *seq, PyTypeObject *against) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	PyObject *ob; | 
					
						
							|  |  |  | 	int len = PySequence_Length(seq); | 
					
						
							| 
									
										
										
										
											2004-07-20 08:16:46 +00:00
										 |  |  | 	int i, result = 1; | 
					
						
							| 
									
										
										
										
											2003-05-17 04:29:49 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	for (i = 0; i < len; i++) { | 
					
						
							|  |  |  | 		ob = PySequence_GetItem(seq, i); | 
					
						
							| 
									
										
										
										
											2004-07-20 08:16:46 +00:00
										 |  |  | 		if (ob == Py_None) result = 2; | 
					
						
							|  |  |  | 		else if (ob->ob_type != against) { | 
					
						
							| 
									
										
										
										
											2003-05-17 04:29:49 +00:00
										 |  |  | 			Py_DECREF(ob); | 
					
						
							|  |  |  | 			return 0; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		Py_DECREF(ob); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2004-07-20 08:16:46 +00:00
										 |  |  | 	return result; /* 1 if all of 'against' type, 2 if there are (also) Nones */ | 
					
						
							| 
									
										
										
										
											2003-05-17 04:29:49 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2003-06-22 20:14:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | PyObject *EXPP_tuple_repr(PyObject *self, int size) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2003-07-06 20:34:59 +00:00
										 |  |  | 	PyObject *repr, *item; | 
					
						
							| 
									
										
										
										
											2003-06-22 20:14:11 +00:00
										 |  |  | 	int i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*@	note: a value must be built because the list is decrefed!
 | 
					
						
							|  |  |  |  * otherwise we have nirvana pointers inside python.. */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-07-06 20:34:59 +00:00
										 |  |  | 	repr = PyString_FromString(""); | 
					
						
							| 
									
										
										
										
											2003-06-22 20:14:11 +00:00
										 |  |  | 	if (!repr) return 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	item = PySequence_GetItem(self, 0);  | 
					
						
							|  |  |  | 	PyString_ConcatAndDel(&repr, PyObject_Repr(item)); | 
					
						
							|  |  |  | 	Py_DECREF(item); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for (i = 1; i < size; i++) { | 
					
						
							|  |  |  | 		item = PySequence_GetItem(self, i); | 
					
						
							|  |  |  | 		PyString_ConcatAndDel(&repr, PyObject_Repr(item)); | 
					
						
							|  |  |  | 		Py_DECREF(item); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return repr; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2003-11-23 17:46:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /****************************************************************************/ | 
					
						
							|  |  |  | /* Description: searches through a map for a pair with a given name. If the */ | 
					
						
							| 
									
										
										
										
											2004-06-24 09:43:13 +00:00
										 |  |  | /*							pair is present, its ival is stored in *ival and nonzero is */ | 
					
						
							|  |  |  | /*							returned. If the pair is absent, zero is returned.					*/ | 
					
						
							| 
									
										
										
										
											2003-11-23 17:46:06 +00:00
										 |  |  | /****************************************************************************/ | 
					
						
							|  |  |  | int EXPP_map_getIntVal (const EXPP_map_pair *map, const char *sval, int *ival) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2004-06-24 09:43:13 +00:00
										 |  |  | 		while (map->sval) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 				if (StringEqual(sval, map->sval)) | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 						*ival = map->ival; | 
					
						
							|  |  |  | 						return 1; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				++map; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return 0; | 
					
						
							| 
									
										
										
										
											2003-11-23 17:46:06 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /****************************************************************************/ | 
					
						
							|  |  |  | /* Description: searches through a map for a pair with a given name. If the */ | 
					
						
							| 
									
										
										
										
											2004-06-24 09:43:13 +00:00
										 |  |  | /*							pair is present, its ival is stored in *ival and nonzero is */ | 
					
						
							|  |  |  | /*							returned. If the pair is absent, zero is returned.					*/ | 
					
						
							|  |  |  | /* note: this function is identical to EXPP_map_getIntVal except that the		*/ | 
					
						
							|  |  |  | /*			 output is stored in a short value.																	*/ | 
					
						
							| 
									
										
										
										
											2003-11-23 17:46:06 +00:00
										 |  |  | /****************************************************************************/ | 
					
						
							|  |  |  | int EXPP_map_getShortVal (const EXPP_map_pair *map,  | 
					
						
							| 
									
										
										
										
											2004-06-24 09:43:13 +00:00
										 |  |  | 																				const char *sval, short *ival) | 
					
						
							| 
									
										
										
										
											2003-11-23 17:46:06 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2004-06-24 09:43:13 +00:00
										 |  |  | 		while (map->sval) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 				if (StringEqual(sval, map->sval)) | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 						*ival = map->ival; | 
					
						
							|  |  |  | 						return 1; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				++map; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return 0; | 
					
						
							| 
									
										
										
										
											2003-11-23 17:46:06 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /****************************************************************************/ | 
					
						
							|  |  |  | /* Description: searches through a map for a pair with a given ival. If the */ | 
					
						
							| 
									
										
										
										
											2004-06-24 09:43:13 +00:00
										 |  |  | /*							pair is present, a pointer to its name is stored in *sval		*/ | 
					
						
							|  |  |  | /*							and nonzero is returned. If the pair is absent, zero is			*/ | 
					
						
							|  |  |  | /*							returned.																										*/ | 
					
						
							| 
									
										
										
										
											2003-11-23 17:46:06 +00:00
										 |  |  | /****************************************************************************/ | 
					
						
							| 
									
										
										
										
											2003-12-14 01:18:09 +00:00
										 |  |  | int EXPP_map_getStrVal (const EXPP_map_pair *map, int ival, const char **sval) | 
					
						
							| 
									
										
										
										
											2003-11-23 17:46:06 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2004-06-24 09:43:13 +00:00
										 |  |  | 	while (map->sval) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		if (ival == map->ival) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			*sval = map->sval; | 
					
						
							|  |  |  | 			return 1; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		++map; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /************************************************************************/ | 
					
						
							|  |  |  | /* Scriptlink-related functions, used by scene, object, etc. bpyobjects */ | 
					
						
							|  |  |  | /************************************************************************/ | 
					
						
							|  |  |  | PyObject *EXPP_getScriptLinks (ScriptLink *slink, PyObject *args, int is_scene) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	PyObject *list = NULL; | 
					
						
							|  |  |  | 	char *eventname = NULL; | 
					
						
							|  |  |  | 	int i, event = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* actually !scriptlink shouldn't happen ... */ | 
					
						
							|  |  |  | 	if (!slink || !slink->totscript) | 
					
						
							|  |  |  | 		return EXPP_incr_ret (Py_None); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (!PyArg_ParseTuple(args, "s", &eventname)) | 
					
						
							|  |  |  | 		return EXPP_ReturnPyObjError (PyExc_TypeError, | 
					
						
							|  |  |  | 			"expected event name (string) as argument"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	list = PyList_New(0); | 
					
						
							|  |  |  | 	if (!list) | 
					
						
							|  |  |  | 		return EXPP_ReturnPyObjError (PyExc_MemoryError, | 
					
						
							|  |  |  | 			"couldn't create PyList!"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (!strcmp(eventname, "FrameChanged")) | 
					
						
							|  |  |  | 		event = SCRIPT_FRAMECHANGED; | 
					
						
							|  |  |  | 	else if (!strcmp(eventname, "Redraw")) | 
					
						
							|  |  |  | 		event = SCRIPT_REDRAW; | 
					
						
							|  |  |  | 	else if (is_scene && !strcmp(eventname, "OnLoad")) | 
					
						
							|  |  |  | 		event = SCRIPT_ONLOAD; | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		return EXPP_ReturnPyObjError (PyExc_AttributeError, | 
					
						
							|  |  |  | 						"invalid event name."); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for (i = 0; i < slink->totscript; i++) { | 
					
						
							|  |  |  | 		if ((slink->flag[i] == event) && slink->scripts[i]) | 
					
						
							|  |  |  | 			PyList_Append(list, PyString_FromString(slink->scripts[i]->name+2)); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return list; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int EXPP_clearScriptLinks (ScriptLink *slink) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	/* actually !scriptlink shouldn't happen ... */ | 
					
						
							|  |  |  | 	if (!slink || !slink->totscript) return -1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (slink->scripts) MEM_freeN(slink->scripts); | 
					
						
							|  |  |  | 	if (slink->flag) MEM_freeN(slink->flag); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	slink->scripts = NULL; | 
					
						
							|  |  |  | 	slink->flag = NULL; | 
					
						
							|  |  |  | 	slink->totscript = slink->actscript = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return 0; /* normal return */ | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int EXPP_addScriptLink (ScriptLink *slink, PyObject *args, int is_scene) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	int event = 0, found_txt = 0; | 
					
						
							|  |  |  | 	void *stmp = NULL, *ftmp = NULL; | 
					
						
							|  |  |  | 	Text *bltxt = G.main->text.first; | 
					
						
							|  |  |  | 	char *textname = NULL; | 
					
						
							|  |  |  | 	char *eventname = NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* !scriptlink shouldn't happen ... */ | 
					
						
							|  |  |  | 	if (!slink) { | 
					
						
							|  |  |  | 		return EXPP_ReturnIntError (PyExc_RuntimeError, | 
					
						
							|  |  |  | 			"internal error: no scriptlink!"); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (!PyArg_ParseTuple(args, "ss", &textname, &eventname)) | 
					
						
							|  |  |  | 		return EXPP_ReturnIntError (PyExc_TypeError, | 
					
						
							|  |  |  | 			"expected two strings as arguments"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	while (bltxt) { | 
					
						
							|  |  |  | 		if (!strcmp(bltxt->id.name+2, textname)) { | 
					
						
							|  |  |  | 			found_txt = 1; | 
					
						
							|  |  |  | 			break; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		bltxt = bltxt->id.next; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (!found_txt) | 
					
						
							|  |  |  | 		return EXPP_ReturnIntError (PyExc_AttributeError, | 
					
						
							|  |  |  | 			"no such Blender Text."); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (!strcmp(eventname, "FrameChanged")) | 
					
						
							|  |  |  | 		event = SCRIPT_FRAMECHANGED; | 
					
						
							|  |  |  | 	else if (!strcmp(eventname, "Redraw")) | 
					
						
							|  |  |  | 		event = SCRIPT_REDRAW; | 
					
						
							|  |  |  | 	else if (is_scene && !strcmp(eventname, "OnLoad")) | 
					
						
							|  |  |  | 		event = SCRIPT_ONLOAD; | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		return EXPP_ReturnIntError (PyExc_AttributeError, | 
					
						
							|  |  |  | 						"invalid event name."); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	stmp= slink->scripts; | 
					
						
							|  |  |  | 	slink->scripts= MEM_mallocN(sizeof(ID*)*(slink->totscript+1), "bpySlinkL"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ftmp= slink->flag; | 
					
						
							|  |  |  | 	slink->flag= MEM_mallocN(sizeof(short*)*(slink->totscript+1), "bpySlinkF"); | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	if (slink->totscript) { | 
					
						
							|  |  |  | 		memcpy(slink->scripts, stmp, sizeof(ID*)*(slink->totscript)); | 
					
						
							|  |  |  | 		MEM_freeN(stmp); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		memcpy(slink->flag, ftmp, sizeof(short)*(slink->totscript)); | 
					
						
							|  |  |  | 		MEM_freeN(ftmp); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	slink->scripts[slink->totscript] = (ID*)bltxt; | 
					
						
							|  |  |  | 	slink->flag[slink->totscript]= event; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	slink->totscript++; | 
					
						
							|  |  |  | 				 | 
					
						
							|  |  |  | 	if (slink->actscript < 1) slink->actscript = 1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return 0; /* normal exit */ | 
					
						
							| 
									
										
										
										
											2003-11-23 17:46:06 +00:00
										 |  |  | } |