forked from bartvdbraak/blender
Trying to fix bug reported by Peter den Bak and Meino Christian Cramer (thanks!):
-- splash screen disappeared (duh, I did that!) and Blender quits upon exiting from some 225 games: It was troublesome to find how to run demos in general with the screen correctly redrawn before they started, etc. Ended up making the above error in screenmain(). About the games, I don't have them and will need some time to get the files for testing, but I'll do it, though only on linux. BPython: -- Window: added GetScreens, SetScreen and improved GetScreenInfo. -- Object, NMesh: updated (added in NMesh) method getMaterials to return either only valid materials as before or also empty slots (as None). This previous omission can be considered a bug, since it made info about materials incomplete / incompatible with face mat indices. Thanks Yann Vernier for bringing this up and sending/proposing a patch that also fixed a bug related to assigning lists of materials with different lengths to obj and its mesh. setMaterials also accepts Py_None entries now, which become empty slots in Blender. -- doc updates.
This commit is contained in:
parent
9bf1655070
commit
7b3b3ae432
@ -59,6 +59,7 @@ void BPY_free_compiled_text(struct Text* text);
|
||||
/*void BPY_clear_bad_scriptlink(struct ID *id, struct Text *byebye); */
|
||||
void BPY_clear_bad_scriptlinks(struct Text *byebye);
|
||||
/*void BPY_clear_bad_scriptlist(struct ListBase *, struct Text *byebye); */
|
||||
int BPY_has_onload_script(void);
|
||||
void BPY_do_all_scripts(short event);
|
||||
void BPY_do_pyscript(struct ID *id, short event);
|
||||
void BPY_free_scriptlink(struct ScriptLink *slink);
|
||||
|
@ -908,6 +908,21 @@ static PyObject *ID_asPyObject(ID *id)
|
||||
}
|
||||
}
|
||||
|
||||
int BPY_has_onload_script(void)
|
||||
{
|
||||
ScriptLink *slink = &G.scene->scriptlink;
|
||||
int i;
|
||||
|
||||
if (!slink || !slink->totscript) return 0;
|
||||
|
||||
for (i = 0; i < slink->totscript; i++) {
|
||||
if ((slink->flag[i] == SCRIPT_ONLOAD) && (slink->scripts[i] != NULL))
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void BPY_do_pyscript(ID *id, short event)
|
||||
{
|
||||
ScriptLink *scriptlink = ID_getScriptlink(id);
|
||||
|
@ -209,11 +209,11 @@ static PyObject *M_Material_Get(PyObject *self, PyObject *args)
|
||||
|
||||
BPy_Material *wanted_mat = NULL;
|
||||
|
||||
while ((mat_iter) && (wanted_mat == NULL)) {
|
||||
|
||||
if (strcmp (name, mat_iter->id.name+2) == 0)
|
||||
while (mat_iter) {
|
||||
if (strcmp (name, mat_iter->id.name+2) == 0) {
|
||||
wanted_mat = (BPy_Material *)Material_CreatePyObject (mat_iter);
|
||||
|
||||
break;
|
||||
}
|
||||
mat_iter = mat_iter->id.next;
|
||||
}
|
||||
|
||||
@ -221,7 +221,7 @@ static PyObject *M_Material_Get(PyObject *self, PyObject *args)
|
||||
char error_msg[64];
|
||||
PyOS_snprintf(error_msg, sizeof(error_msg),
|
||||
"Material \"%s\" not found", name);
|
||||
return (EXPP_ReturnPyObjError (PyExc_NameError, error_msg));
|
||||
return EXPP_ReturnPyObjError (PyExc_NameError, error_msg);
|
||||
}
|
||||
|
||||
return (PyObject *)wanted_mat;
|
||||
@ -1714,11 +1714,10 @@ static PyObject *Material_repr (BPy_Material *self)
|
||||
return PyString_FromFormat ("[Material \"%s\"]", self->material->id.name+2);
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************/
|
||||
/* These functions are used in NMesh.c and Object.c */
|
||||
/*****************************************************************************/
|
||||
PyObject *EXPP_PyList_fromMaterialList (Material **matlist, int len)
|
||||
PyObject *EXPP_PyList_fromMaterialList (Material **matlist, int len, int all)
|
||||
{
|
||||
PyObject *list;
|
||||
int i;
|
||||
@ -1735,6 +1734,9 @@ PyObject *EXPP_PyList_fromMaterialList (Material **matlist, int len)
|
||||
PyList_Append (list, ob);
|
||||
Py_DECREF (ob); /* because Append increfs */
|
||||
}
|
||||
else if (all) { /* return NULL mats (empty slots) as Py_None */
|
||||
PyList_Append (list, Py_None);
|
||||
}
|
||||
}
|
||||
|
||||
return list;
|
||||
@ -1752,7 +1754,7 @@ Material **EXPP_newMaterialList_fromPyList (PyObject *list)
|
||||
|
||||
matlist = EXPP_newMaterialList (len);
|
||||
|
||||
for (i= 0; i < len; i++) {
|
||||
for (i = 0; i < len; i++) {
|
||||
|
||||
pymat = (BPy_Material *)PySequence_GetItem (list, i);
|
||||
|
||||
@ -1760,7 +1762,9 @@ Material **EXPP_newMaterialList_fromPyList (PyObject *list)
|
||||
mat = pymat->material;
|
||||
matlist[i] = mat;
|
||||
}
|
||||
|
||||
else if ((PyObject *)pymat == Py_None) {
|
||||
matlist[i] = NULL;
|
||||
}
|
||||
else { /* error; illegal type in material list */
|
||||
Py_DECREF(pymat);
|
||||
MEM_freeN(matlist);
|
||||
@ -1783,26 +1787,26 @@ Material **EXPP_newMaterialList(int len)
|
||||
|
||||
int EXPP_releaseMaterialList (Material **matlist, int len)
|
||||
{
|
||||
int i;
|
||||
Material * mat;
|
||||
int i;
|
||||
Material *mat;
|
||||
|
||||
if ((len < 0) || (len > MAXMAT)) {
|
||||
printf ("illegal matindex!\n");
|
||||
return 0;
|
||||
printf ("illegal matindex!\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (i=0 ; i<len ; i++) {
|
||||
mat = matlist[i];
|
||||
if (mat != NULL) {
|
||||
if (((ID *)mat)->us > 0)
|
||||
((ID *)mat)->us--;
|
||||
else
|
||||
printf ("FATAL: material usage=0: %s", ((ID *)mat)->name);
|
||||
}
|
||||
mat = matlist[i];
|
||||
if (mat) {
|
||||
if (((ID *)mat)->us > 0)
|
||||
((ID *)mat)->us--;
|
||||
else
|
||||
printf ("FATAL: material usage=0: %s", ((ID *)mat)->name);
|
||||
}
|
||||
}
|
||||
MEM_freeN (matlist);
|
||||
MEM_freeN (matlist);
|
||||
|
||||
return 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/** expands pointer array of length 'oldsize' to length 'newsize'.
|
||||
@ -1818,16 +1822,16 @@ static int expandPtrArray(void **p, int oldsize, int newsize)
|
||||
if (newsize < oldsize) {
|
||||
return 0;
|
||||
}
|
||||
newarray = MEM_callocN(newsize * sizeof(void *), "PtrArray");
|
||||
newarray = MEM_callocN(sizeof(void *)*newsize, "PtrArray");
|
||||
if (*p) {
|
||||
memcpy(newarray, *p, oldsize);
|
||||
memcpy(newarray, *p, sizeof(void *)*oldsize);
|
||||
MEM_freeN(*p);
|
||||
}
|
||||
*p = newarray;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int EXPP_synchronizeMaterialLists (Object *object, void *data)
|
||||
int EXPP_synchronizeMaterialLists (Object *object)
|
||||
{
|
||||
Material *** p_dataMaterials = give_matarar (object);
|
||||
short * nmaterials = give_totcolp (object);
|
||||
|
@ -62,7 +62,7 @@ Material *Material_FromPyObject (PyObject *pyobj);
|
||||
int Material_CheckPyObject (PyObject *pyobj);
|
||||
|
||||
/* Some functions needed by NMesh.c */
|
||||
PyObject *EXPP_PyList_fromMaterialList (Material **matlist, int len);
|
||||
PyObject *EXPP_PyList_fromMaterialList (Material **matlist, int len, int all);
|
||||
Material **EXPP_newMaterialList_fromPyList (PyObject *list);
|
||||
Material **EXPP_newMaterialList(int len);
|
||||
|
||||
|
@ -48,6 +48,165 @@
|
||||
#define NMESH_SUBDIV_MIN 1
|
||||
#define NMESH_SUBDIV_MAX 6
|
||||
|
||||
static char NMesh_addVertGroup_doc[] =
|
||||
"add a named and empty vertex(deform) Group to a mesh that has been linked\n\
|
||||
to an object. ";
|
||||
|
||||
static char NMesh_removeVertGroup_doc[] =
|
||||
"remove a named vertex(deform) Group from a mesh that has been linked\n\
|
||||
to an object. Will remove all verts assigned to group.";
|
||||
|
||||
static char NMesh_assignVertsToGroup_doc[] =
|
||||
"Adds an array (a python list) of vertex points (by index) to a named\n\
|
||||
vertex group. The list will have an associated wieght assigned to them.\n\
|
||||
The weight represents the amount of influence this group has over these\n\
|
||||
vertex points. Weights should be in the range of 0.0 - 1.0.\n\
|
||||
The assignmode can be either 'add', 'subtract', or 'replace'. If this vertex\n\
|
||||
is not assigned to the group 'add' creates a new association with the weight\n\
|
||||
specified, otherwise the weight given is added to the current weight of the\n\
|
||||
vertex.\n\
|
||||
'subtract' will attempt to subtract the weight passed from a vertex already\n\
|
||||
associated with a group, else it does nothing. 'replace' attempts to replace\n\
|
||||
the weight with the new weight value for an already associated vertex/group,\n\
|
||||
else it does nothing. The mesh must have all it's vertex points set before\n\
|
||||
attempting to assign any vertex points to a vertex group.";
|
||||
|
||||
static char NMesh_removeVertsFromGroup_doc[] =
|
||||
"Remove an array (a python list) of vertex points from a named group in a\n\
|
||||
mesh that has been linked to an object. If no list is given this will remove\n\
|
||||
all vertex point associations with the group passed";
|
||||
|
||||
static char NMesh_getVertsFromGroup_doc[] =
|
||||
"By passing a python list of vertex indices and a named group, this will\n\
|
||||
return a python list representing the indeces that are a part of this vertex.\n\
|
||||
group. If no association was found for the index passed nothing will be\n\
|
||||
return for the index. An optional flag will also return the weights as well";
|
||||
|
||||
static char NMesh_renameVertGroup_doc[] =
|
||||
"Renames a vertex group";
|
||||
|
||||
static char NMesh_getVertGroupNames_doc[] =
|
||||
"Returns a list of all the vertex group names";
|
||||
|
||||
static char M_NMesh_doc[] =
|
||||
"The Blender.NMesh submodule";
|
||||
|
||||
static char M_NMesh_Col_doc[]=
|
||||
"([r, g, b, a]) - Get a new mesh color\n\n\
|
||||
[r=255, g=255, b=255, a=255] Specify the color components";
|
||||
|
||||
static char M_NMesh_Face_doc[] =
|
||||
"(vertexlist = None) - Get a new face, and pass optional vertex list";
|
||||
|
||||
static char NMFace_append_doc[] =
|
||||
"(vert) - appends Vertex 'vert' to face vertex list";
|
||||
|
||||
static char M_NMesh_Vert_doc[] =
|
||||
"([x, y, z]) - Get a new vertice\n\n\
|
||||
[x, y, z] Specify new coordinates";
|
||||
|
||||
static char NMesh_getMaterials_doc[] =
|
||||
"(i = -1) - Get this mesh's list of materials.\n\
|
||||
(i = -1) - int: determines the list's contents:\n\
|
||||
-1: return the current list, possibly modified by the script (default);\n\
|
||||
0: get a fresh list from the Blender mesh -- modifications not included,\n\
|
||||
unless the script called mesh.update() first;\n\
|
||||
1: like 0, but does not ignore empty slots, returns them as 'None'.";
|
||||
|
||||
static char NMesh_setMaterials_doc[] =
|
||||
"(matlist) - Set this mesh's list of materials. This method makes sure\n\
|
||||
the passed matlist is valid (can only include up to 16 materials and None's).";
|
||||
|
||||
static char NMesh_addMaterial_doc[] =
|
||||
"(material) - add a new Blender Material 'material' to this Mesh's materials\n\
|
||||
list.";
|
||||
|
||||
static char NMesh_insertKey_doc[] =
|
||||
"(frame = None, type = 'relative') - inserts a Mesh key at the given frame\n\
|
||||
if called without arguments, it inserts the key at the current Scene frame.\n\
|
||||
(type) - 'relative' or 'absolute'. Only relevant on the first call to this\n\
|
||||
function for each nmesh.";
|
||||
|
||||
static char NMesh_removeAllKeys_doc[] =
|
||||
"() - removes all keys from this mesh\n\
|
||||
returns True if successful or False if this NMesh wasn't linked to a real\n\
|
||||
Blender Mesh yet or the Mesh had no keys";
|
||||
|
||||
static char NMesh_getSelectedFaces_doc[] =
|
||||
"(flag = None) - returns list of selected Faces\n\
|
||||
If flag = 1, return indices instead";
|
||||
|
||||
static char NMesh_getActiveFace_doc[] =
|
||||
"returns the index of the active face ";
|
||||
|
||||
static char NMesh_hasVertexUV_doc[] =
|
||||
"(flag = None) - returns 1 if Mesh has per vertex UVs ('Sticky')\n\
|
||||
The optional argument sets the Sticky flag";
|
||||
|
||||
static char NMesh_hasFaceUV_doc[] =
|
||||
"(flag = None) - returns 1 if Mesh has textured faces\n\
|
||||
The optional argument sets the textured faces flag";
|
||||
|
||||
static char NMesh_hasVertexColours_doc[] =
|
||||
"(flag = None) - returns 1 if Mesh has vertex colours.\n\
|
||||
The optional argument sets the vertex colour flag";
|
||||
|
||||
static char NMesh_getVertexInfluences_doc[] =
|
||||
"Return a list of the influences of bones in the vertex \n\
|
||||
specified by index. The list contains pairs with the \n\
|
||||
bone name and the weight.";
|
||||
|
||||
|
||||
static char NMesh_update_doc[] = "(recalc_normals = 0) - updates the Mesh.\n\
|
||||
if recalc_normals is given and is equal to 1, normal vectors are recalculated.";
|
||||
|
||||
static char NMesh_getMode_doc[] =
|
||||
"() - get the mode flags of this nmesh as an or'ed int value.";
|
||||
|
||||
static char NMesh_setMode_doc[] =
|
||||
"(none to 5 strings) - set the mode flags of this nmesh.\n\
|
||||
() - unset all flags.";
|
||||
|
||||
static char NMesh_getMaxSmoothAngle_doc[] =
|
||||
"() - get the max smooth angle for mesh auto smoothing.";
|
||||
|
||||
static char NMesh_setMaxSmoothAngle_doc[] =
|
||||
"(int) - set the max smooth angle for mesh auto smoothing in the range\n\
|
||||
[1,80] in degrees.";
|
||||
|
||||
static char NMesh_getSubDivLevels_doc[] =
|
||||
"() - get the subdivision levels for display and rendering: [display, render]";
|
||||
|
||||
static char NMesh_setSubDivLevels_doc[] =
|
||||
"([int, int]) - set the subdivision levels for [display, render] -- they are\n\
|
||||
clamped to the range [1,6].";
|
||||
|
||||
static char M_NMesh_New_doc[] =
|
||||
"() - returns a new, empty NMesh mesh object\n";
|
||||
|
||||
static char M_NMesh_GetRaw_doc[] =
|
||||
"([name]) - Get a raw mesh from Blender\n\n\
|
||||
[name] Name of the mesh to be returned\n\n\
|
||||
If name is not specified a new empty mesh is\n\
|
||||
returned, otherwise Blender returns an existing\n\
|
||||
mesh.";
|
||||
|
||||
static char M_NMesh_GetRawFromObject_doc[] =
|
||||
"(name) - Get the raw mesh used by a Blender object\n\n\
|
||||
(name) Name of the object to get the mesh from\n\n\
|
||||
This returns the mesh as used by the object, which\n\
|
||||
means it contains all deformations and modifications.";
|
||||
|
||||
static char M_NMesh_PutRaw_doc[] =
|
||||
"(mesh, [name, renormal]) - Return a raw mesh to Blender\n\n\
|
||||
(mesh) The NMesh object to store\n\
|
||||
[name] The mesh to replace\n\
|
||||
[renormal=1] Flag to control vertex normal recalculation\n\n\
|
||||
If the name of a mesh to replace is not given a new\n\
|
||||
object is created and returned.";
|
||||
|
||||
|
||||
|
||||
void mesh_update(Mesh *mesh)
|
||||
{
|
||||
edge_drawflags_mesh(mesh);
|
||||
@ -273,7 +432,7 @@ static PyObject *NMFace_getattr(PyObject *self, char *name)
|
||||
|
||||
else if ((strcmp(name, "normal") == 0) || (strcmp(name, "no") == 0)) {
|
||||
|
||||
if (EXPP_check_sequence_consistency(mf->v, &NMVert_Type)) {
|
||||
if (EXPP_check_sequence_consistency(mf->v, &NMVert_Type) == 1) {
|
||||
|
||||
float fNormal[3] = {0.0,0.0,0.0};
|
||||
float *vco[4] = {NULL, NULL, NULL, NULL};
|
||||
@ -632,6 +791,51 @@ static void NMesh_dealloc(PyObject *self)
|
||||
PyObject_DEL(self);
|
||||
}
|
||||
|
||||
static PyObject *NMesh_getMaterials (PyObject *self, PyObject *args)
|
||||
{
|
||||
BPy_NMesh *nm = (BPy_NMesh *)self;
|
||||
PyObject *list = NULL;
|
||||
Mesh *me = nm->mesh;
|
||||
int all = -1;
|
||||
|
||||
if (!PyArg_ParseTuple (args, "|i", &all))
|
||||
return EXPP_ReturnPyObjError (PyExc_TypeError,
|
||||
"expected nothing or an int (bool) as argument");
|
||||
|
||||
if (all >= 0) {
|
||||
list = EXPP_PyList_fromMaterialList (me->mat, me->totcol, all);
|
||||
Py_DECREF (nm->materials); /* update nmesh.materials attribute */
|
||||
nm->materials = EXPP_incr_ret(list);
|
||||
}
|
||||
else
|
||||
list = EXPP_incr_ret (nm->materials);
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
static PyObject *NMesh_setMaterials (PyObject *self, PyObject *args)
|
||||
{
|
||||
BPy_NMesh *me = (BPy_NMesh *)self;
|
||||
PyObject *pymats = NULL;
|
||||
|
||||
if (!PyArg_ParseTuple (args, "O!", &PyList_Type, pymats))
|
||||
return EXPP_ReturnPyObjError (PyExc_TypeError,
|
||||
"expected a list of materials (None's also accepted) as argument");
|
||||
|
||||
if (!EXPP_check_sequence_consistency (pymats, &Material_Type))
|
||||
return EXPP_ReturnPyObjError (PyExc_TypeError,
|
||||
"list should only contain materials (None's also accepted)");
|
||||
|
||||
if (PyList_Size(pymats) > 16)
|
||||
return EXPP_ReturnPyObjError (PyExc_TypeError,
|
||||
"list can't have more than 16 materials");
|
||||
|
||||
Py_DECREF (me->materials);
|
||||
me->materials = EXPP_incr_ret (pymats);
|
||||
|
||||
return EXPP_incr_ret (Py_None);
|
||||
}
|
||||
|
||||
static PyObject *NMesh_addMaterial (PyObject *self, PyObject *args)
|
||||
{
|
||||
BPy_NMesh *me = (BPy_NMesh *)self;
|
||||
@ -1076,6 +1280,8 @@ static struct PyMethodDef NMesh_methods[] =
|
||||
MethodDef(getActiveFace),
|
||||
MethodDef(getSelectedFaces),
|
||||
MethodDef(getVertexInfluences),
|
||||
MethodDef(getMaterials),
|
||||
MethodDef(setMaterials),
|
||||
MethodDef(addMaterial),
|
||||
MethodDef(insertKey),
|
||||
MethodDef(removeAllKeys),
|
||||
@ -1434,7 +1640,7 @@ static PyObject *new_NMesh_internal(Mesh *oldmesh,
|
||||
PyList_SetItem (me->faces, i,
|
||||
(PyObject *)nmface_from_data(me, vidxs, oldmf->mat_nr, oldmf->flag, oldtf, oldmc));
|
||||
}
|
||||
me->materials = EXPP_PyList_fromMaterialList(oldmesh->mat, oldmesh->totcol);
|
||||
me->materials = EXPP_PyList_fromMaterialList(oldmesh->mat, oldmesh->totcol, 0);
|
||||
}
|
||||
|
||||
return (PyObject *)me;
|
||||
@ -1959,10 +2165,10 @@ static PyObject *M_NMesh_PutRaw(PyObject *self, PyObject *args)
|
||||
return EXPP_ReturnPyObjError (PyExc_AttributeError,
|
||||
"nmesh materials are not a sequence");
|
||||
|
||||
if (!EXPP_check_sequence_consistency(nmesh->verts, &NMVert_Type))
|
||||
if (EXPP_check_sequence_consistency(nmesh->verts, &NMVert_Type) != 1)
|
||||
return EXPP_ReturnPyObjError (PyExc_AttributeError,
|
||||
"nmesh vertices must be NMVerts");
|
||||
if (!EXPP_check_sequence_consistency(nmesh->faces, &NMFace_Type))
|
||||
if (EXPP_check_sequence_consistency(nmesh->faces, &NMFace_Type) != 1)
|
||||
return EXPP_ReturnPyObjError (PyExc_AttributeError,
|
||||
"nmesh faces must be NMFaces");
|
||||
|
||||
@ -2021,7 +2227,7 @@ static PyObject *M_NMesh_PutRaw(PyObject *self, PyObject *args)
|
||||
if (ob) { // we created a new object
|
||||
nmesh->object = ob; // linking so vgrouping methods know which obj to work on
|
||||
NMesh_assignMaterials_toObject(nmesh, ob);
|
||||
EXPP_synchronizeMaterialLists (ob, ob->data);
|
||||
EXPP_synchronizeMaterialLists (ob);
|
||||
return Object_CreatePyObject(ob);
|
||||
}
|
||||
else {
|
||||
|
@ -101,152 +101,6 @@ static PyObject *g_nmeshmodule = NULL;
|
||||
#define BPy_NMVert_Check(v) ((v)->ob_type == &NMVert_Type)
|
||||
#define BPy_NMCol_Check(v) ((v)->ob_type == &NMCol_Type)
|
||||
|
||||
|
||||
static char NMesh_addVertGroup_doc[] =
|
||||
"add a named and empty vertex(deform) Group to a mesh that has been linked\n\
|
||||
to an object. ";
|
||||
|
||||
static char NMesh_removeVertGroup_doc[] =
|
||||
"remove a named vertex(deform) Group from a mesh that has been linked\n\
|
||||
to an object. Will remove all verts assigned to group.";
|
||||
|
||||
static char NMesh_assignVertsToGroup_doc[] =
|
||||
"Adds an array (a python list) of vertex points (by index) to a named\n\
|
||||
vertex group. The list will have an associated wieght assigned to them.\n\
|
||||
The weight represents the amount of influence this group has over these\n\
|
||||
vertex points. Weights should be in the range of 0.0 - 1.0.\n\
|
||||
The assignmode can be either 'add', 'subtract', or 'replace'. If this vertex\n\
|
||||
is not assigned to the group 'add' creates a new association with the weight\n\
|
||||
specified, otherwise the weight given is added to the current weight of the\n\
|
||||
vertex.\n\
|
||||
'subtract' will attempt to subtract the weight passed from a vertex already\n\
|
||||
associated with a group, else it does nothing. 'replace' attempts to replace\n\
|
||||
the weight with the new weight value for an already associated vertex/group,\n\
|
||||
else it does nothing. The mesh must have all it's vertex points set before\n\
|
||||
attempting to assign any vertex points to a vertex group.";
|
||||
|
||||
static char NMesh_removeVertsFromGroup_doc[] =
|
||||
"Remove an array (a python list) of vertex points from a named group in a\n\
|
||||
mesh that has been linked to an object. If no list is given this will remove\n\
|
||||
all vertex point associations with the group passed";
|
||||
|
||||
static char NMesh_getVertsFromGroup_doc[] =
|
||||
"By passing a python list of vertex indices and a named group, this will\n\
|
||||
return a python list representing the indeces that are a part of this vertex.\n\
|
||||
group. If no association was found for the index passed nothing will be\n\
|
||||
return for the index. An optional flag will also return the weights as well";
|
||||
|
||||
static char NMesh_renameVertGroup_doc[] =
|
||||
"Renames a vertex group";
|
||||
|
||||
static char NMesh_getVertGroupNames_doc[] =
|
||||
"Returns a list of all the vertex group names";
|
||||
|
||||
static char M_NMesh_doc[] =
|
||||
"The Blender.NMesh submodule";
|
||||
|
||||
static char M_NMesh_Col_doc[]=
|
||||
"([r, g, b, a]) - Get a new mesh color\n\n\
|
||||
[r=255, g=255, b=255, a=255] Specify the color components";
|
||||
|
||||
static char M_NMesh_Face_doc[] =
|
||||
"(vertexlist = None) - Get a new face, and pass optional vertex list";
|
||||
|
||||
static char NMFace_append_doc[] =
|
||||
"(vert) - appends Vertex 'vert' to face vertex list";
|
||||
|
||||
static char M_NMesh_Vert_doc[] =
|
||||
"([x, y, z]) - Get a new vertice\n\n\
|
||||
[x, y, z] Specify new coordinates";
|
||||
|
||||
static char NMesh_addMaterial_doc[] =
|
||||
"(material) - add a new Blender Material 'material' to this Mesh's materials\n\
|
||||
list.";
|
||||
|
||||
static char NMesh_insertKey_doc[] =
|
||||
"(frame = None, type = 'relative') - inserts a Mesh key at the given frame\n\
|
||||
if called without arguments, it inserts the key at the current Scene frame.\n\
|
||||
(type) - 'relative' or 'absolute'. Only relevant on the first call to this\n\
|
||||
function for each nmesh.";
|
||||
|
||||
static char NMesh_removeAllKeys_doc[] =
|
||||
"() - removes all keys from this mesh\n\
|
||||
returns True if successful or False if this NMesh wasn't linked to a real\n\
|
||||
Blender Mesh yet or the Mesh had no keys";
|
||||
|
||||
static char NMesh_getSelectedFaces_doc[] =
|
||||
"(flag = None) - returns list of selected Faces\n\
|
||||
If flag = 1, return indices instead";
|
||||
|
||||
static char NMesh_getActiveFace_doc[] =
|
||||
"returns the index of the active face ";
|
||||
|
||||
static char NMesh_hasVertexUV_doc[] =
|
||||
"(flag = None) - returns 1 if Mesh has per vertex UVs ('Sticky')\n\
|
||||
The optional argument sets the Sticky flag";
|
||||
|
||||
static char NMesh_hasFaceUV_doc[] =
|
||||
"(flag = None) - returns 1 if Mesh has textured faces\n\
|
||||
The optional argument sets the textured faces flag";
|
||||
|
||||
static char NMesh_hasVertexColours_doc[] =
|
||||
"(flag = None) - returns 1 if Mesh has vertex colours.\n\
|
||||
The optional argument sets the vertex colour flag";
|
||||
|
||||
static char NMesh_getVertexInfluences_doc[] =
|
||||
"Return a list of the influences of bones in the vertex \n\
|
||||
specified by index. The list contains pairs with the \n\
|
||||
bone name and the weight.";
|
||||
|
||||
|
||||
static char NMesh_update_doc[] = "(recalc_normals = 0) - updates the Mesh.\n\
|
||||
if recalc_normals is given and is equal to 1, normal vectors are recalculated.";
|
||||
|
||||
static char NMesh_getMode_doc[] =
|
||||
"() - get the mode flags of this nmesh as an or'ed int value.";
|
||||
|
||||
static char NMesh_setMode_doc[] =
|
||||
"(none to 5 strings) - set the mode flags of this nmesh.\n\
|
||||
() - unset all flags.";
|
||||
|
||||
static char NMesh_getMaxSmoothAngle_doc[] =
|
||||
"() - get the max smooth angle for mesh auto smoothing.";
|
||||
|
||||
static char NMesh_setMaxSmoothAngle_doc[] =
|
||||
"(int) - set the max smooth angle for mesh auto smoothing in the range\n\
|
||||
[1,80] in degrees.";
|
||||
|
||||
static char NMesh_getSubDivLevels_doc[] =
|
||||
"() - get the subdivision levels for display and rendering: [display, render]";
|
||||
|
||||
static char NMesh_setSubDivLevels_doc[] =
|
||||
"([int, int]) - set the subdivision levels for [display, render] -- they are\n\
|
||||
clamped to the range [1,6].";
|
||||
|
||||
static char M_NMesh_New_doc[] =
|
||||
"() - returns a new, empty NMesh mesh object\n";
|
||||
|
||||
static char M_NMesh_GetRaw_doc[] =
|
||||
"([name]) - Get a raw mesh from Blender\n\n\
|
||||
[name] Name of the mesh to be returned\n\n\
|
||||
If name is not specified a new empty mesh is\n\
|
||||
returned, otherwise Blender returns an existing\n\
|
||||
mesh.";
|
||||
|
||||
static char M_NMesh_GetRawFromObject_doc[] =
|
||||
"(name) - Get the raw mesh used by a Blender object\n\n\
|
||||
(name) Name of the object to get the mesh from\n\n\
|
||||
This returns the mesh as used by the object, which\n\
|
||||
means it contains all deformations and modifications.";
|
||||
|
||||
static char M_NMesh_PutRaw_doc[] =
|
||||
"(mesh, [name, renormal]) - Return a raw mesh to Blender\n\n\
|
||||
(mesh) The NMesh object to store\n\
|
||||
[name] The mesh to replace\n\
|
||||
[renormal=1] Flag to control vertex normal recalculation\n\n\
|
||||
If the name of a mesh to replace is not given a new\n\
|
||||
object is created and returned.";
|
||||
|
||||
/* Typedefs for the new types */
|
||||
|
||||
typedef struct {
|
||||
|
@ -108,7 +108,7 @@ static PyObject *Object_getEuler (BPy_Object *self);
|
||||
static PyObject *Object_getInverseMatrix (BPy_Object *self);
|
||||
static PyObject *Object_getIpo (BPy_Object *self);
|
||||
static PyObject *Object_getLocation (BPy_Object *self, PyObject *args);
|
||||
static PyObject *Object_getMaterials (BPy_Object *self);
|
||||
static PyObject *Object_getMaterials (BPy_Object *self, PyObject *args);
|
||||
static PyObject *Object_getMatrix (BPy_Object *self, PyObject *args);
|
||||
static PyObject *Object_getName (BPy_Object *self);
|
||||
static PyObject *Object_getParent (BPy_Object *self);
|
||||
@ -183,8 +183,9 @@ hierarchy (faster)"},
|
||||
"Returns the object's inverse matrix"},
|
||||
{"getLocation", (PyCFunction)Object_getLocation, METH_VARARGS,
|
||||
"Returns the object's location (x, y, z)"},
|
||||
{"getMaterials", (PyCFunction)Object_getMaterials, METH_NOARGS,
|
||||
"Returns list of materials assigned to the object"},
|
||||
{"getMaterials", (PyCFunction)Object_getMaterials, METH_VARARGS,
|
||||
"(i = 0) - Returns list of materials assigned to the object.\n\
|
||||
if i is nonzero, empty slots are not ignored: they are returned as None's."},
|
||||
{"getMatrix", (PyCFunction)Object_getMatrix, METH_VARARGS,
|
||||
"Returns the object matrix - worlspace or localspace (default)"},
|
||||
{"getName", (PyCFunction)Object_getName, METH_NOARGS,
|
||||
@ -919,10 +920,17 @@ static PyObject *Object_getLocation (BPy_Object *self, PyObject *args)
|
||||
"couldn't get Object.loc attributes"));
|
||||
}
|
||||
|
||||
static PyObject *Object_getMaterials (BPy_Object *self)
|
||||
static PyObject *Object_getMaterials (BPy_Object *self, PyObject *args)
|
||||
{
|
||||
int all = 0;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "|i", &all)){
|
||||
return (EXPP_ReturnPyObjError (PyExc_AttributeError,
|
||||
"expected an int or nothing"));
|
||||
}
|
||||
|
||||
return (EXPP_PyList_fromMaterialList (self->object->mat,
|
||||
self->object->totcol));
|
||||
self->object->totcol, all));
|
||||
}
|
||||
|
||||
static PyObject *Object_getMatrix (BPy_Object *self, PyObject *args)
|
||||
@ -1258,7 +1266,7 @@ static PyObject *Object_link (BPy_Object *self, PyObject *args)
|
||||
if ( self->object->type == OB_MESH)
|
||||
{
|
||||
self->object->totcol = 0;
|
||||
EXPP_synchronizeMaterialLists(self->object, id);
|
||||
EXPP_synchronizeMaterialLists(self->object);
|
||||
}
|
||||
|
||||
id_us_plus (id);
|
||||
@ -1585,8 +1593,7 @@ static PyObject *Object_setMaterials (BPy_Object *self, PyObject *args)
|
||||
case OB_MESH: /* fall through */
|
||||
case OB_MBALL: /* fall through */
|
||||
case OB_SURF:
|
||||
EXPP_synchronizeMaterialLists (self->object,
|
||||
self->object->data);
|
||||
EXPP_synchronizeMaterialLists (self->object);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@ -1679,13 +1686,13 @@ static PyObject *Object_shareFrom (BPy_Object *self, PyObject *args)
|
||||
|
||||
if (!PyArg_ParseTuple (args, "O", &object))
|
||||
{
|
||||
return EXPP_ReturnPyObjError (PyExc_AttributeError,
|
||||
return EXPP_ReturnPyObjError (PyExc_TypeError,
|
||||
"expected an object argument");
|
||||
}
|
||||
if (!Object_CheckPyObject ((PyObject*)object))
|
||||
{
|
||||
return EXPP_ReturnPyObjError (PyExc_TypeError,
|
||||
"argument 1 is not of type 'Object'");
|
||||
"first argument is not of type 'Object'");
|
||||
}
|
||||
|
||||
if (self->object->type != object->object->type)
|
||||
@ -1708,7 +1715,7 @@ static PyObject *Object_shareFrom (BPy_Object *self, PyObject *args)
|
||||
|
||||
if ( self->object->type == OB_MESH && id ){
|
||||
self->object->totcol = 0;
|
||||
EXPP_synchronizeMaterialLists(self->object, id);
|
||||
EXPP_synchronizeMaterialLists(self->object);
|
||||
}
|
||||
|
||||
id_us_plus (id);
|
||||
|
@ -96,6 +96,8 @@ static PyObject *M_Window_GetKeyQualifiers (PyObject *self);
|
||||
static PyObject *M_Window_SetKeyQualifiers (PyObject *self, PyObject *args);
|
||||
static PyObject *M_Window_GetAreaSize (PyObject *self);
|
||||
static PyObject *M_Window_GetAreaID (PyObject *self);
|
||||
static PyObject *M_Window_GetScreens (PyObject *self);
|
||||
static PyObject *M_Window_SetScreen (PyObject *self, PyObject *args);
|
||||
static PyObject *M_Window_GetScreenInfo (PyObject *self, PyObject *args,
|
||||
PyObject *kwords);
|
||||
|
||||
@ -232,20 +234,28 @@ static char M_Window_GetAreaID_doc[] =
|
||||
static char M_Window_GetAreaSize_doc[] =
|
||||
"() - Get the current window's (area) size as [x,y].";
|
||||
|
||||
static char M_Window_GetScreens_doc[] =
|
||||
"() - Get a list with the names of all available screens.";
|
||||
|
||||
static char M_Window_SetScreen_doc[] =
|
||||
"(name) - Set current screen to the one with the given 'name'.";
|
||||
|
||||
static char M_Window_GetScreenInfo_doc[] =
|
||||
"(type = -1, rect = 'win') - Get info about the current screen setup.\n\
|
||||
"(type = -1, rect = 'win', screen = None)\n\
|
||||
- Get info about the the areas in the current screen setup.\n\
|
||||
(type = -1) - int: the space type (Blender.Window.Types) to restrict the\n\
|
||||
results to, all if -1;\n\
|
||||
(rect = 'win') - the rectangle of interest. This defines if the corner\n\
|
||||
(rect = 'win') - str: the rectangle of interest. This defines if the corner\n\
|
||||
coordinates returned will refer to:\n\
|
||||
- the whole area: 'total';\n\
|
||||
- only the header: 'header';\n\
|
||||
- only the window content (default): 'win'.\n\n\
|
||||
- only the window content (default): 'win'.\n\
|
||||
(screen = None) - str: the screen name, current if not given.\n\n\
|
||||
A list of dictionaries (one for each area) is returned.\n\
|
||||
Each dictionary has keys:\n\
|
||||
'vertices': [xmin, ymin, xmax, ymax] area corners;\n\
|
||||
'win': window type, see Blender.Window.Types dict;\n\
|
||||
'id': this area's id.";
|
||||
'id': area's id.";
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Python method structure definition for Blender.Window module: */
|
||||
@ -304,6 +314,10 @@ struct PyMethodDef M_Window_methods[] = {
|
||||
M_Window_GetAreaSize_doc},
|
||||
{"GetAreaID", (PyCFunction)M_Window_GetAreaID, METH_NOARGS,
|
||||
M_Window_GetAreaID_doc},
|
||||
{"GetScreens", (PyCFunction)M_Window_GetScreens, METH_NOARGS,
|
||||
M_Window_GetScreens_doc},
|
||||
{"SetScreen", (PyCFunction)M_Window_SetScreen, METH_VARARGS,
|
||||
M_Window_SetScreen_doc},
|
||||
{"GetScreenInfo", (PyCFunction)M_Window_GetScreenInfo,
|
||||
METH_VARARGS | METH_KEYWORDS, M_Window_GetScreenInfo_doc},
|
||||
{NULL, NULL, 0, NULL}
|
||||
@ -958,21 +972,75 @@ static PyObject *M_Window_GetAreaID(PyObject *self)
|
||||
return Py_BuildValue("h", sa->win);
|
||||
}
|
||||
|
||||
static PyObject *M_Window_SetScreen(PyObject *self, PyObject *args)
|
||||
{
|
||||
bScreen *scr = G.main->screen.first;
|
||||
char *name = NULL;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "s", &name))
|
||||
return EXPP_ReturnPyObjError (PyExc_TypeError,
|
||||
"expected string as argument");
|
||||
|
||||
while (scr) {
|
||||
if (!strcmp(scr->id.name+2, name)) {
|
||||
setscreen(scr);
|
||||
break;
|
||||
}
|
||||
scr = scr->id.next;
|
||||
}
|
||||
|
||||
if (!scr)
|
||||
return EXPP_ReturnPyObjError (PyExc_AttributeError,
|
||||
"no such screen, check Window.GetScreens() for valid names.");
|
||||
|
||||
return EXPP_incr_ret(Py_None);
|
||||
}
|
||||
|
||||
static PyObject *M_Window_GetScreens(PyObject *self)
|
||||
{
|
||||
bScreen *scr = G.main->screen.first;
|
||||
PyObject *list = PyList_New(0);
|
||||
PyObject *str = NULL;
|
||||
|
||||
if (!list)
|
||||
return EXPP_ReturnPyObjError (PyExc_MemoryError,
|
||||
"couldn't create py list!");
|
||||
|
||||
while (scr) {
|
||||
str = PyString_FromString(scr->id.name+2);
|
||||
|
||||
if (!str) {
|
||||
Py_DECREF(list);
|
||||
return EXPP_ReturnPyObjError (PyExc_MemoryError,
|
||||
"couldn't create py string!");
|
||||
}
|
||||
|
||||
PyList_Append(list, str); /* incref's str */
|
||||
Py_DECREF(str);
|
||||
|
||||
scr = scr->id.next;
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
static PyObject *M_Window_GetScreenInfo(PyObject *self, PyObject *args,
|
||||
PyObject *kwords)
|
||||
{
|
||||
ScrArea *sa = G.curscreen->areabase.first;
|
||||
bScreen *scr = G.main->screen.first;
|
||||
PyObject *item, *list;
|
||||
rcti *rct;
|
||||
int type = -1;
|
||||
char *rect = "win";
|
||||
static char *kwlist[] = {"type", "rect", NULL};
|
||||
char *screen = "";
|
||||
static char *kwlist[] = {"type", "rect", "screen", NULL};
|
||||
int rctype = 0;
|
||||
|
||||
if (!PyArg_ParseTupleAndKeywords(args, kwords, "|is", kwlist, &type,
|
||||
&rect))
|
||||
if (!PyArg_ParseTupleAndKeywords(args, kwords, "|iss", kwlist, &type,
|
||||
&rect, &screen))
|
||||
return EXPP_ReturnPyObjError (PyExc_TypeError,
|
||||
"expected nothing or an int and a string as arguments");
|
||||
"expected nothing or an int and two strings as arguments");
|
||||
|
||||
if (!strcmp(rect, "win"))
|
||||
rctype = 0;
|
||||
@ -986,6 +1054,22 @@ static PyObject *M_Window_GetScreenInfo(PyObject *self, PyObject *args,
|
||||
|
||||
list = PyList_New(0);
|
||||
|
||||
if (screen && screen[0] != '\0') {
|
||||
while (scr) {
|
||||
if (!strcmp(scr->id.name+2, screen)) {
|
||||
sa = scr->areabase.first;
|
||||
break;
|
||||
}
|
||||
scr = scr->id.next;
|
||||
}
|
||||
}
|
||||
|
||||
if (!scr) {
|
||||
Py_DECREF(list);
|
||||
return EXPP_ReturnPyObjError (PyExc_AttributeError,
|
||||
"no such screen, see existing ones with Window.GetScreens.");
|
||||
}
|
||||
|
||||
while (sa) {
|
||||
if (type != -1 && sa->spacetype != type) {
|
||||
sa = sa->next;
|
||||
|
@ -53,11 +53,11 @@ The Blender Python API Reference
|
||||
Introduction:
|
||||
-------------
|
||||
|
||||
This Reference documents the Blender Python API, a growing collection of
|
||||
Python modules (libs) that give access to part of the program's internal data
|
||||
and functions.
|
||||
This reference documents the Blender Python API, a growing collection of
|
||||
Python modules (libraries) that give access to part of the program's internal
|
||||
data and functions.
|
||||
|
||||
Through scripting, Blender can be extended in realtime. Possibilities range
|
||||
Through scripting Blender can be extended in realtime. Possibilities range
|
||||
from simple functionality to importers / exporters and even more complex
|
||||
"applications". Blender scripts are written in
|
||||
U{Python <www.python.org>}, an impressive high level, multi-paradigm,
|
||||
@ -66,7 +66,8 @@ The Blender Python API Reference
|
||||
@author: The Blender Python Team
|
||||
@requires: Blender 2.34 or newer.
|
||||
@version: 2.34
|
||||
@see: U{www.blender.org<http://www.blender.org>}
|
||||
@see: U{www.blender.org<http://www.blender.org>}: documentation and forum
|
||||
@see: U{www.elysiun.com<http://www.elysiun.com>}: user forum
|
||||
@see: U{projects.blender.org<http://projects.blender.org>}
|
||||
@see: U{www.python.org<http://www.python.org>}
|
||||
@see: U{www.python.org/doc<http://www.python.org/doc>}
|
||||
|
@ -3,7 +3,7 @@
|
||||
"""
|
||||
The Blender.NMesh submodule.
|
||||
|
||||
B{New}: vertex selection.
|
||||
B{New}: L{NMesh.getMaterials}, L{NMesh.setMaterials}.
|
||||
|
||||
Mesh Data
|
||||
=========
|
||||
@ -235,7 +235,8 @@ class NMesh:
|
||||
object in Blender and NMesh as its Python counterpart.
|
||||
@cvar name: The NMesh name. It's common to use this field to store extra
|
||||
data about the mesh (to be exported to another program, for example).
|
||||
@cvar materials: The list of materials used by this NMesh.
|
||||
@cvar materials: The list of materials used by this NMesh. See
|
||||
L{NMesh.getMaterials} for important details.
|
||||
@cvar verts: The list of NMesh vertices (NMVerts).
|
||||
@cvar users: The number of Objects using (linked to) this mesh.
|
||||
@cvar faces: The list of NMesh faces (NMFaces).
|
||||
@ -254,6 +255,35 @@ class NMesh:
|
||||
@param material: A Blender Material.
|
||||
"""
|
||||
|
||||
def getMaterials(what = -1):
|
||||
"""
|
||||
Get this NMesh's list of materials.
|
||||
@type what: int
|
||||
@param what: determines the list's contents:
|
||||
- -1: return the current nmesh's list;
|
||||
- 0: retrieve a fresh list from the Blender mesh -- eventual
|
||||
modifications made by the script not included, unless
|
||||
L{NMesh.update}d is called before this method;
|
||||
- 1: like 0, but empty slots are not ignored, they are returned as
|
||||
None's.
|
||||
@note: what >= 0 also updates nmesh.materials attribute.
|
||||
@rtype: list of materials
|
||||
@return: the requested list of materials.
|
||||
@note: if a user goes to the material buttons window and removes some
|
||||
mesh's link to a material, that material slot becomes empty.
|
||||
Previously such materials were ignored.
|
||||
"""
|
||||
|
||||
def setMaterials(matlist):
|
||||
"""
|
||||
Set this NMesh's list of materials. This method checks the consistency of
|
||||
the passed list: must only have materials or None's and can't contain more
|
||||
than 16 entries.
|
||||
@type matlist: list of materials
|
||||
@param matlist: a list with materials, None's also accepted (they become
|
||||
empty material slots in Blender.
|
||||
"""
|
||||
|
||||
def hasVertexColours(flag = None):
|
||||
"""
|
||||
Get (and optionally set) if this NMesh has vertex colours.
|
||||
|
@ -277,9 +277,12 @@ class Object:
|
||||
@return: a python action.
|
||||
"""
|
||||
|
||||
def getMaterials():
|
||||
def getMaterials(what = 0):
|
||||
"""
|
||||
Returns a list of materials assigned to the object.
|
||||
@type what: int
|
||||
@param what: if nonzero, empty slots will be returned as None's instead
|
||||
of being ignored (default way). See L{NMesh.NMesh.getMaterials}.
|
||||
@rtype: list of Material Objects
|
||||
@return: list of Material Objects assigned to the object.
|
||||
"""
|
||||
@ -492,7 +495,7 @@ class Object:
|
||||
|
||||
def shareFrom(object):
|
||||
"""
|
||||
Link data of self with object specified in the argument. This works only
|
||||
Link data of object specified in the argument with self. This works only
|
||||
if self and the object specified are of the same type.
|
||||
@type object: Blender Object
|
||||
@param object: A Blender Object of the same type.
|
||||
|
@ -8,7 +8,7 @@ Window
|
||||
|
||||
This module provides access to B{Window} functions in Blender.
|
||||
|
||||
B{New}: L{EditMode}, L{ViewLayer}, functions related to input events, etc.
|
||||
B{New}: many new functions related to screens and events.
|
||||
|
||||
Example:
|
||||
--------
|
||||
@ -360,7 +360,22 @@ def GetAreaSize ():
|
||||
returns for the 'vertices' of the same area.
|
||||
"""
|
||||
|
||||
def GetScreenInfo (type = -1, rect = 'win'):
|
||||
def GetScreens ():
|
||||
"""
|
||||
Get the names of all available screens.
|
||||
@rtype: list of strings
|
||||
@return: a list of names that can be passed to L{SetScreen}.
|
||||
"""
|
||||
|
||||
def SetScreen (name):
|
||||
"""
|
||||
Set as current screen the one with the given name.
|
||||
@type name: string
|
||||
@param name: the name of an existing screen. Use L{GetScreens} to get
|
||||
a list with all screen names.
|
||||
"""
|
||||
|
||||
def GetScreenInfo (type = -1, rect = 'win', screen = ''):
|
||||
"""
|
||||
Get info about the current screen setup.
|
||||
@type type: int
|
||||
@ -373,6 +388,9 @@ def GetScreenInfo (type = -1, rect = 'win'):
|
||||
- the whole area: 'total'
|
||||
- only the header: 'header'
|
||||
- only the window content part (default): 'win'
|
||||
@type screen: string
|
||||
@param screen: the name of an available screen. The current one is used by
|
||||
default.
|
||||
@rtype: list of dictionaries
|
||||
@return: a list of dictionaries, one for each area in the screen. Each
|
||||
dictionary has these keys (all values are ints):
|
||||
|
@ -145,17 +145,18 @@ int EXPP_check_sequence_consistency(PyObject *seq, PyTypeObject *against)
|
||||
{
|
||||
PyObject *ob;
|
||||
int len = PySequence_Length(seq);
|
||||
int i;
|
||||
int i, result = 1;
|
||||
|
||||
for (i = 0; i < len; i++) {
|
||||
ob = PySequence_GetItem(seq, i);
|
||||
if (ob->ob_type != against) {
|
||||
if (ob == Py_None) result = 2;
|
||||
else if (ob->ob_type != against) {
|
||||
Py_DECREF(ob);
|
||||
return 0;
|
||||
}
|
||||
Py_DECREF(ob);
|
||||
}
|
||||
return 1;
|
||||
return result; /* 1 if all of 'against' type, 2 if there are (also) Nones */
|
||||
}
|
||||
|
||||
PyObject *EXPP_tuple_repr(PyObject *self, int size)
|
||||
|
@ -100,9 +100,9 @@ int Material_CheckPyObject (PyObject *pyobj);
|
||||
Material **EXPP_newMaterialList_fromPyList (PyObject *list);
|
||||
Material **EXPP_newMaterialList(int len);
|
||||
int EXPP_releaseMaterialList (Material **matlist, int len);
|
||||
int EXPP_synchronizeMaterialLists (Object *object, void *data);
|
||||
int EXPP_synchronizeMaterialLists (Object *object);
|
||||
void EXPP_incr_mats_us (Material **matlist, int len);
|
||||
PyObject * EXPP_PyList_fromMaterialList(Material **matlist, int len);
|
||||
PyObject * EXPP_PyList_fromMaterialList(Material **matlist, int len, int all);
|
||||
Material * GetMaterialByName (char * name);
|
||||
|
||||
/* Texture */
|
||||
|
@ -939,6 +939,7 @@ void screenmain(void)
|
||||
{
|
||||
int has_input= 1;
|
||||
int firsttime = 1;
|
||||
int onload_script = 0;
|
||||
|
||||
window_make_active(mainwin);
|
||||
|
||||
@ -1035,8 +1036,10 @@ void screenmain(void)
|
||||
BIF_read_file(ext_load_str);
|
||||
sound_initialize_sounds();
|
||||
}
|
||||
else if (event==ONLOAD_SCRIPT) {
|
||||
firsttime = 1; /* trick to run BPY_do_pyscript below */
|
||||
else if ((event==ONLOAD_SCRIPT) && BPY_has_onload_script()) {
|
||||
/* event queued in setup_app_data() in blender.c, where G.f is checked */
|
||||
onload_script = 1;
|
||||
firsttime = 1; /* see last 'if' in this function */
|
||||
}
|
||||
else {
|
||||
towin= 1;
|
||||
@ -1134,7 +1137,12 @@ void screenmain(void)
|
||||
/* Bizar hack. The event queue has mutated... */
|
||||
if ( (firsttime) && (event == 0) ) {
|
||||
|
||||
if (G.fileflags & G_FILE_AUTOPLAY) {
|
||||
if (onload_script) {
|
||||
/* OnLoad scriptlink */
|
||||
BPY_do_pyscript(&G.scene->id, SCRIPT_ONLOAD);
|
||||
onload_script = 0;
|
||||
}
|
||||
else if (G.fileflags & G_FILE_AUTOPLAY) {
|
||||
// SET AUTOPLAY in G.flags for
|
||||
// other fileloads
|
||||
|
||||
@ -1145,9 +1153,6 @@ void screenmain(void)
|
||||
// fake a 'p' keypress
|
||||
|
||||
mainqenter(PKEY, 1);
|
||||
} else if (G.f & G_SCENESCRIPT) {
|
||||
/* ONLOAD scriptlink */
|
||||
BPY_do_pyscript(&G.scene->id, SCRIPT_ONLOAD);
|
||||
} else {
|
||||
extern char datatoc_splash_jpg[];
|
||||
extern int datatoc_splash_jpg_size;
|
||||
|
Loading…
Reference in New Issue
Block a user