Exppython:
- More documentation files for epydoc. - Few minor changes in other files.
This commit is contained in:
@@ -75,7 +75,7 @@ PyObject *M_Window_Redraw(PyObject *self, PyObject *args);
|
||||
int g_window_redrawn;
|
||||
|
||||
static char Draw_doc[] =
|
||||
"Module Blender.Draw ... XXX improve this";
|
||||
"The Blender.Draw submodule";
|
||||
|
||||
static void exit_pydraw (SpaceText *st);
|
||||
static uiBlock *Get_uiBlock (void);
|
||||
@@ -189,7 +189,7 @@ button\n\n\
|
||||
(default) The number of the option to be selected by default\n\
|
||||
[tooltip=""] The button's tooltip\n\n\
|
||||
The menu options are specified through the name of the\n\
|
||||
button. Options are followed by a format code and seperated\n\
|
||||
button. Options are followed by a format code and separated\n\
|
||||
by the '|' (pipe) character.\n\
|
||||
Valid format codes are\n\
|
||||
%t - The option should be used as the title\n\
|
||||
@@ -267,12 +267,12 @@ static PyObject *Method_String (PyObject *self, PyObject *args);
|
||||
|
||||
static char Method_GetStringWidth_doc[] =
|
||||
"(text, font = 'normal') - Return the width in pixels of the given string\n\
|
||||
(font) The font type: 'normal' (default), 'small' or 'tiny'.";
|
||||
(font) The font size: 'normal' (default), 'small' or 'tiny'.";
|
||||
|
||||
static char Method_Text_doc[] =
|
||||
"(text, font = 'normal') - Draw text onscreen\n\n\
|
||||
(text) The text to draw\n\
|
||||
(font) The font type: 'normal' (default), 'small' or 'tiny'.\n\n\
|
||||
(font) The font size: 'normal' (default), 'small' or 'tiny'.\n\n\
|
||||
NEW! - This function now returns the width of the drawn string.";
|
||||
|
||||
static PyObject *Method_GetStringWidth (PyObject *self, PyObject *args);
|
||||
|
@@ -226,6 +226,8 @@ PyObject *Image_Init (void)
|
||||
/*****************************************************************************/
|
||||
static PyObject *Image_getName(BPy_Image *self);
|
||||
static PyObject *Image_getFilename(BPy_Image *self);
|
||||
static PyObject *Image_getXRep(BPy_Image *self);
|
||||
static PyObject *Image_getYRep(BPy_Image *self);
|
||||
static PyObject *Image_setName(BPy_Image *self, PyObject *args);
|
||||
static PyObject *Image_setXRep(BPy_Image *self, PyObject *args);
|
||||
static PyObject *Image_setYRep(BPy_Image *self, PyObject *args);
|
||||
@@ -236,15 +238,19 @@ static PyObject *Image_setYRep(BPy_Image *self, PyObject *args);
|
||||
static PyMethodDef BPy_Image_methods[] = {
|
||||
/* name, method, flags, doc */
|
||||
{"getName", (PyCFunction)Image_getName, METH_NOARGS,
|
||||
"() - Return Image Data name"},
|
||||
{"getFilename", (PyCFunction)Image_getFilename, METH_VARARGS,
|
||||
"() - Return Image Data filename"},
|
||||
"() - Return Image object name"},
|
||||
{"getFilename", (PyCFunction)Image_getFilename, METH_NOARGS,
|
||||
"() - Return Image object filename"},
|
||||
{"getXRep", (PyCFunction)Image_getXRep, METH_NOARGS,
|
||||
"() - Return Image object x repetition value"},
|
||||
{"getYRep", (PyCFunction)Image_getYRep, METH_NOARGS,
|
||||
"() - Return Image object y repetition value"},
|
||||
{"setName", (PyCFunction)Image_setName, METH_VARARGS,
|
||||
"(str) - Change Image Data name"},
|
||||
"(str) - Change Image object name"},
|
||||
{"setXRep", (PyCFunction)Image_setXRep, METH_VARARGS,
|
||||
"(int) - Change Image Data x repetition value"},
|
||||
"(int) - Change Image object x repetition value"},
|
||||
{"setYRep", (PyCFunction)Image_setYRep, METH_VARARGS,
|
||||
"(int) - Change Image Data y repetition value"},
|
||||
"(int) - Change Image object y repetition value"},
|
||||
{0}
|
||||
};
|
||||
|
||||
@@ -348,6 +354,26 @@ static PyObject *Image_getFilename(BPy_Image *self)
|
||||
"couldn't get Image.filename attribute"));
|
||||
}
|
||||
|
||||
static PyObject *Image_getXRep(BPy_Image *self)
|
||||
{
|
||||
PyObject *attr = PyInt_FromLong(self->image->xrep);
|
||||
|
||||
if (attr) return attr;
|
||||
|
||||
return EXPP_ReturnPyObjError (PyExc_RuntimeError,
|
||||
"couldn't get Image.xrep attribute");
|
||||
}
|
||||
|
||||
static PyObject *Image_getYRep(BPy_Image *self)
|
||||
{
|
||||
PyObject *attr = PyInt_FromLong(self->image->yrep);
|
||||
|
||||
if (attr) return attr;
|
||||
|
||||
return EXPP_ReturnPyObjError (PyExc_RuntimeError,
|
||||
"couldn't get Image.yrep attribute");
|
||||
}
|
||||
|
||||
static PyObject *Image_setName(BPy_Image *self, PyObject *args)
|
||||
{
|
||||
char *name;
|
||||
@@ -437,7 +463,7 @@ static PyObject *Image_getAttr (BPy_Image *self, char *name)
|
||||
/*****************************************************************************/
|
||||
/* Function: Image_setAttr */
|
||||
/* Description: This is a callback function for the BPy_Image type. It is the*/
|
||||
/* function that changes Image Data members values. If this */
|
||||
/* function that changes Image object members values. If this */
|
||||
/* data is linked to a Blender Image, it also gets updated. */
|
||||
/*****************************************************************************/
|
||||
static int Image_setAttr (BPy_Image *self, char *name, PyObject *value)
|
||||
@@ -462,7 +488,7 @@ static int Image_setAttr (BPy_Image *self, char *name, PyObject *value)
|
||||
error = Image_setXRep (self, valtuple);
|
||||
else if (strcmp (name, "yrep") == 0)
|
||||
error = Image_setYRep (self, valtuple);
|
||||
else { /* Error: no such member in the Image Data structure */
|
||||
else { /* Error: no such member in the Image object structure */
|
||||
Py_DECREF(value);
|
||||
Py_DECREF(valtuple);
|
||||
return (EXPP_ReturnIntError (PyExc_KeyError,
|
||||
|
@@ -181,7 +181,7 @@ static PyObject *M_Lamp_Get(PyObject *self, PyObject *args)
|
||||
}
|
||||
}
|
||||
|
||||
static PyObject *M_Lamp_TypesDict (void)
|
||||
static PyObject *Lamp_TypesDict (void)
|
||||
{ /* create the Blender.Lamp.Types constant dict */
|
||||
PyObject *Types = M_constant_New();
|
||||
|
||||
@@ -198,7 +198,7 @@ static PyObject *M_Lamp_TypesDict (void)
|
||||
return Types;
|
||||
}
|
||||
|
||||
static PyObject *M_Lamp_ModesDict (void)
|
||||
static PyObject *Lamp_ModesDict (void)
|
||||
{ /* create the Blender.Lamp.Modes constant dict */
|
||||
PyObject *Modes = M_constant_New();
|
||||
|
||||
@@ -229,15 +229,15 @@ PyObject *Lamp_Init (void)
|
||||
|
||||
Lamp_Type.ob_type = &PyType_Type;
|
||||
|
||||
Types = M_Lamp_TypesDict ();
|
||||
Modes = M_Lamp_ModesDict ();
|
||||
Types = Lamp_TypesDict ();
|
||||
Modes = Lamp_ModesDict ();
|
||||
|
||||
submodule = Py_InitModule3("Blender.Lamp", M_Lamp_methods, M_Lamp_doc);
|
||||
|
||||
if (Types) PyModule_AddObject(submodule, "Types", Types);
|
||||
if (Modes) PyModule_AddObject(submodule, "Modes", Modes);
|
||||
|
||||
return (submodule);
|
||||
return submodule;
|
||||
}
|
||||
|
||||
/* Three Python Lamp_Type helper functions needed by the Object module: */
|
||||
|
@@ -48,18 +48,18 @@
|
||||
#define EXPP_MAT_MODE_SHADOW MA_SHADOW
|
||||
#define EXPP_MAT_MODE_SHADELESS MA_SHLESS
|
||||
#define EXPP_MAT_MODE_WIRE MA_WIRE
|
||||
#define EXPP_MAT_MODE_VCOLLIGHT MA_VERTEXCOL
|
||||
#define EXPP_MAT_MODE_VCOL_LIGHT MA_VERTEXCOL
|
||||
#define EXPP_MAT_MODE_HALO MA_HALO
|
||||
#define EXPP_MAT_MODE_ZTRANSP MA_ZTRA
|
||||
#define EXPP_MAT_MODE_VCOLPAINT MA_VERTEXCOLP
|
||||
#define EXPP_MAT_MODE_VCOL_PAINT MA_VERTEXCOLP
|
||||
#define EXPP_MAT_MODE_ZINVERT MA_ZINV
|
||||
#define EXPP_MAT_MODE_HALORINGS MA_HALO_RINGS
|
||||
#define EXPP_MAT_MODE_ENV MA_ENV
|
||||
#define EXPP_MAT_MODE_HALOLINES MA_HALO_LINES
|
||||
#define EXPP_MAT_MODE_ONLYSHADOW MA_ONLYSHADOW
|
||||
#define EXPP_MAT_MODE_XALPHA MA_HALO_XALPHA
|
||||
#define EXPP_MAT_MODE_STAR MA_STAR
|
||||
#define EXPP_MAT_MODE_FACETEX MA_FACETEXTURE
|
||||
#define EXPP_MAT_MODE_HALOXALPHA MA_HALO_XALPHA
|
||||
#define EXPP_MAT_MODE_HALOSTAR MA_STAR
|
||||
#define EXPP_MAT_MODE_TEXFACE MA_FACETEXTURE
|
||||
#define EXPP_MAT_MODE_HALOTEX MA_HALOTEX
|
||||
#define EXPP_MAT_MODE_HALOPUNO MA_HALOPUNO
|
||||
#define EXPP_MAT_MODE_NOMIST MA_NOMIST
|
||||
@@ -79,8 +79,8 @@
|
||||
#define EXPP_MAT_EMIT_MAX 1.0
|
||||
#define EXPP_MAT_REF_MIN 0.0
|
||||
#define EXPP_MAT_REF_MAX 1.0
|
||||
#define EXPP_MAT_SPEBPy_MIN 0.0
|
||||
#define EXPP_MAT_SPEBPy_MAX 2.0
|
||||
#define EXPP_MAT_SPEC_MIN 0.0
|
||||
#define EXPP_MAT_SPEC_MAX 2.0
|
||||
#define EXPP_MAT_SPECTRA_MIN 0.0
|
||||
#define EXPP_MAT_SPECTRA_MAX 1.0
|
||||
#define EXPP_MAT_ZOFFS_MIN 0.0
|
||||
@@ -96,8 +96,12 @@
|
||||
|
||||
#define EXPP_MAT_HARD_MIN 1
|
||||
#define EXPP_MAT_HARD_MAX 255 /* 127 with MODE HALO ON */
|
||||
#define EXPP_MAT_HALOSEED_MIN 1
|
||||
#define EXPP_MAT_HALOSEED_MAX 255
|
||||
#define EXPP_MAT_NFLARES_MIN 1
|
||||
#define EXPP_MAT_NFLARES_MAX 32
|
||||
#define EXPP_MAT_FLARESEED_MIN 1
|
||||
#define EXPP_MAT_FLARESEED_MAX 255
|
||||
#define EXPP_MAT_NSTARS_MIN 3
|
||||
#define EXPP_MAT_NSTARS_MAX 50
|
||||
#define EXPP_MAT_NLINES_MIN 0
|
||||
@@ -244,18 +248,63 @@ static PyObject *M_Material_Get(PyObject *self, PyObject *args)
|
||||
}
|
||||
}
|
||||
|
||||
static PyObject *Lamp_ModesDict (void)
|
||||
{
|
||||
PyObject *Modes = M_constant_New();
|
||||
|
||||
#undef EXPP_ADDCONST
|
||||
#define EXPP_ADDCONST(name) \
|
||||
constant_insert(c, #name, PyInt_FromLong(EXPP_MAT_MODE_##name))
|
||||
|
||||
/* So that:
|
||||
* EXPP_ADDCONST(TRACEABLE) becomes:
|
||||
* constant_insert(c, "TRACEABLE", PyInt_FromLong(EXPP_MAT_MODE_TRACEABLE))
|
||||
*/
|
||||
|
||||
if (Modes) {
|
||||
BPy_constant *c = (BPy_constant *)Modes;
|
||||
|
||||
EXPP_ADDCONST(TRACEABLE);
|
||||
EXPP_ADDCONST(SHADOW);
|
||||
EXPP_ADDCONST(SHADELESS);
|
||||
EXPP_ADDCONST(WIRE);
|
||||
EXPP_ADDCONST(VCOL_LIGHT);
|
||||
EXPP_ADDCONST(HALO);
|
||||
EXPP_ADDCONST(ZTRANSP);
|
||||
EXPP_ADDCONST(VCOL_PAINT);
|
||||
EXPP_ADDCONST(ZINVERT);
|
||||
EXPP_ADDCONST(HALORINGS);
|
||||
EXPP_ADDCONST(ENV);
|
||||
EXPP_ADDCONST(HALOLINES);
|
||||
EXPP_ADDCONST(ONLYSHADOW);
|
||||
EXPP_ADDCONST(HALOXALPHA);
|
||||
EXPP_ADDCONST(HALOSTAR);
|
||||
EXPP_ADDCONST(TEXFACE);
|
||||
EXPP_ADDCONST(HALOTEX);
|
||||
EXPP_ADDCONST(HALOPUNO);
|
||||
EXPP_ADDCONST(NOMIST);
|
||||
EXPP_ADDCONST(HALOSHADE);
|
||||
EXPP_ADDCONST(HALOFLARE);
|
||||
}
|
||||
|
||||
return Modes;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Function: Material_Init */
|
||||
/*****************************************************************************/
|
||||
PyObject *Material_Init (void)
|
||||
{
|
||||
PyObject *submodule;
|
||||
PyObject *submodule, *Modes;
|
||||
|
||||
Material_Type.ob_type = &PyType_Type;
|
||||
|
||||
Modes = Lamp_ModesDict ();
|
||||
|
||||
submodule = Py_InitModule3("Blender.Material",
|
||||
M_Material_methods, M_Material_doc);
|
||||
|
||||
if (Modes) PyModule_AddObject(submodule, "Modes", Modes);
|
||||
return (submodule);
|
||||
}
|
||||
|
||||
@@ -281,7 +330,9 @@ static PyObject *Material_getSpecTransp(BPy_Material *self);
|
||||
static PyObject *Material_getAdd(BPy_Material *self);
|
||||
static PyObject *Material_getZOffset(BPy_Material *self);
|
||||
static PyObject *Material_getHaloSize(BPy_Material *self);
|
||||
static PyObject *Material_getHaloSeed(BPy_Material *self);
|
||||
static PyObject *Material_getFlareSize(BPy_Material *self);
|
||||
static PyObject *Material_getFlareSeed(BPy_Material *self);
|
||||
static PyObject *Material_getFlareBoost(BPy_Material *self);
|
||||
static PyObject *Material_getSubSize(BPy_Material *self);
|
||||
static PyObject *Material_getHardness(BPy_Material *self);
|
||||
@@ -305,7 +356,9 @@ static PyObject *Material_setSpecTransp(BPy_Material *self, PyObject *args);
|
||||
static PyObject *Material_setAdd(BPy_Material *self, PyObject *args);
|
||||
static PyObject *Material_setZOffset(BPy_Material *self, PyObject *args);
|
||||
static PyObject *Material_setHaloSize(BPy_Material *self, PyObject *args);
|
||||
static PyObject *Material_setHaloSeed(BPy_Material *self, PyObject *args);
|
||||
static PyObject *Material_setFlareSize(BPy_Material *self, PyObject *args);
|
||||
static PyObject *Material_setFlareSeed(BPy_Material *self, PyObject *args);
|
||||
static PyObject *Material_setFlareBoost(BPy_Material *self, PyObject *args);
|
||||
static PyObject *Material_setSubSize(BPy_Material *self, PyObject *args);
|
||||
static PyObject *Material_setHardness(BPy_Material *self, PyObject *args);
|
||||
@@ -349,21 +402,26 @@ static PyMethodDef BPy_Material_methods[] = {
|
||||
{"getAdd", (PyCFunction)Material_getAdd, METH_NOARGS,
|
||||
"() - Return Material's glow factor"},
|
||||
{"getZOffset", (PyCFunction)Material_getZOffset, METH_NOARGS,
|
||||
"() - Return Material's artificial offset "},
|
||||
"() - Return Material's artificial offset for faces"},
|
||||
{"getHaloSize", (PyCFunction)Material_getHaloSize, METH_NOARGS,
|
||||
"() - Return Material's halo size"},
|
||||
{"getHaloSeed", (PyCFunction)Material_getHaloSeed, METH_NOARGS,
|
||||
"() - Return Material's seed for random ring dimension and line "
|
||||
"location in halos"},
|
||||
{"getFlareSize", (PyCFunction)Material_getFlareSize, METH_NOARGS,
|
||||
"() - Return Material's (flare size)/(halo size) factor"},
|
||||
{"getFlareSeed", (PyCFunction)Material_getFlareSeed, METH_NOARGS,
|
||||
"() - Return Material's flare offset in the seed table"},
|
||||
{"getFlareBoost", (PyCFunction)Material_getFlareBoost, METH_NOARGS,
|
||||
"() - Return Material's flare boost"},
|
||||
{"getSubSize", (PyCFunction)Material_getSubSize, METH_NOARGS,
|
||||
"() - Return Material's dimension of subflare, dots and circles"},
|
||||
{"getHardness", (PyCFunction)Material_getHardness, METH_NOARGS,
|
||||
"() - Return Material's hardness"},
|
||||
"() - Return Material's specular hardness"},
|
||||
{"getNFlares", (PyCFunction)Material_getNFlares, METH_NOARGS,
|
||||
"() - Return Material's number of flares in halo"},
|
||||
{"getNStars", (PyCFunction)Material_getNStars, METH_NOARGS,
|
||||
"() - Return Material's number of stars in halo"},
|
||||
"() - Return Material's number of points in the halo stars"},
|
||||
{"getNLines", (PyCFunction)Material_getNLines, METH_NOARGS,
|
||||
"() - Return Material's number of lines in halo"},
|
||||
{"getNRings", (PyCFunction)Material_getNRings, METH_NOARGS,
|
||||
@@ -373,13 +431,13 @@ static PyMethodDef BPy_Material_methods[] = {
|
||||
{"setMode", (PyCFunction)Material_setMode, METH_VARARGS,
|
||||
"([s[,s]]) - Set Material mode flag(s)"},
|
||||
{"setRGBCol", (PyCFunction)Material_setRGBCol, METH_VARARGS,
|
||||
"([s[,s]]) - Set Material's rgb color triplet"},
|
||||
"(f,f,f or [f,f,f]) - Set Material's rgb color triplet"},
|
||||
{"setAmbCol", (PyCFunction)Material_setAmbCol, METH_VARARGS,
|
||||
"([s[,s]]) - Set Material's ambient color"},
|
||||
"(f,f,f or [f,f,f]) - Set Material's ambient color"},
|
||||
{"setSpecCol", (PyCFunction)Material_setSpecCol, METH_VARARGS,
|
||||
"([s[,s]]) - Set Material's specular color"},
|
||||
"(f,f,f or [f,f,f]) - Set Material's specular color"},
|
||||
{"setMirCol", (PyCFunction)Material_setMirCol, METH_VARARGS,
|
||||
"([s[,s]]) - Set Material's mirror color"},
|
||||
"(f,f,f or [f,f,f]) - Set Material's mirror color"},
|
||||
{"setAmb", (PyCFunction)Material_setAmb, METH_VARARGS,
|
||||
"(f) - Set how much the Material's color is affected"
|
||||
" by \nthe global ambient colors - [0.0, 1.0]"},
|
||||
@@ -399,23 +457,27 @@ static PyMethodDef BPy_Material_methods[] = {
|
||||
"(f) - Set Material's artificial offset - [0.0, 10.0]"},
|
||||
{"setHaloSize", (PyCFunction)Material_setHaloSize, METH_VARARGS,
|
||||
"(f) - Set Material's halo size - [0.0, 100.0]"},
|
||||
{"setHaloSeed", (PyCFunction)Material_setHaloSeed, METH_VARARGS,
|
||||
"(i) - Set Material's halo seed - [0, 255]"},
|
||||
{"setFlareSize", (PyCFunction)Material_setFlareSize, METH_VARARGS,
|
||||
"(f) - Set Material's factor: (flare size)/(halo size) - [0.1, 25.0]"},
|
||||
{"setFlareSeed", (PyCFunction)Material_setFlareSeed, METH_VARARGS,
|
||||
"(i) - Set Material's flare seed - [0, 255]"},
|
||||
{"setFlareBoost", (PyCFunction)Material_setFlareBoost, METH_VARARGS,
|
||||
"(f) - Set Material's flare boost - [0.1, 10.0]"},
|
||||
{"setSubSize", (PyCFunction)Material_setSubSize, METH_VARARGS,
|
||||
"(f) - Set Material's dimension of subflare,"
|
||||
" dots and circles - [0.1, 25.0]"},
|
||||
{"setHardness", (PyCFunction)Material_setHardness, METH_VARARGS,
|
||||
"(f) - Set Material's hardness - [1, 255 (127 if halo mode is ON)]"},
|
||||
"(i) - Set Material's hardness - [1, 255 (127 if halo mode is ON)]"},
|
||||
{"setNFlares", (PyCFunction)Material_setNFlares, METH_VARARGS,
|
||||
"(f) - Set Material's number of flares in halo - [1, 32]"},
|
||||
"(i) - Set Material's number of flares in halo - [1, 32]"},
|
||||
{"setNStars", (PyCFunction)Material_setNStars, METH_VARARGS,
|
||||
"(f) - Set Material's number of stars in halo - [3, 50]"},
|
||||
"(i) - Set Material's number of stars in halo - [3, 50]"},
|
||||
{"setNLines", (PyCFunction)Material_setNLines, METH_VARARGS,
|
||||
"(f) - Set Material's number of lines in halo - [0, 250]"},
|
||||
"(i) - Set Material's number of lines in halo - [0, 250]"},
|
||||
{"setNRings", (PyCFunction)Material_setNRings, METH_VARARGS,
|
||||
"(f) - Set Material's number of rings in halo - [0, 24]"},
|
||||
"(i) - Set Material's number of rings in halo - [0, 24]"},
|
||||
{0}
|
||||
};
|
||||
|
||||
@@ -684,6 +746,26 @@ static PyObject *Material_getSubSize(BPy_Material *self)
|
||||
"couldn't get Material.subSize attribute");
|
||||
}
|
||||
|
||||
static PyObject *Material_getHaloSeed(BPy_Material *self)
|
||||
{
|
||||
PyObject *attr = PyInt_FromLong((long)self->material->seed1);
|
||||
|
||||
if (attr) return attr;
|
||||
|
||||
return EXPP_ReturnPyObjError (PyExc_RuntimeError,
|
||||
"couldn't get Material.haloSeed attribute");
|
||||
}
|
||||
|
||||
static PyObject *Material_getFlareSeed(BPy_Material *self)
|
||||
{
|
||||
PyObject *attr = PyInt_FromLong((long)self->material->seed2);
|
||||
|
||||
if (attr) return attr;
|
||||
|
||||
return EXPP_ReturnPyObjError (PyExc_RuntimeError,
|
||||
"couldn't get Material.flareSeed attribute");
|
||||
}
|
||||
|
||||
static PyObject *Material_getHardness(BPy_Material *self)
|
||||
{
|
||||
PyObject *attr = PyInt_FromLong((long)self->material->har);
|
||||
@@ -754,7 +836,7 @@ static PyObject *Material_setName(BPy_Material *self, PyObject *args)
|
||||
/* Possible modes are traceable, shadow, shadeless, wire, vcolLight,
|
||||
* vcolPaint, halo, ztransp, zinvert, haloRings, env, haloLines,
|
||||
* onlyShadow, xalpha, star, faceTexture, haloTex, haloPuno, noMist,
|
||||
* haloShade, haloFlare */
|
||||
* haloShaded, haloFlare */
|
||||
static PyObject *Material_setMode(BPy_Material *self, PyObject *args)
|
||||
{
|
||||
int i, flag = 0;
|
||||
@@ -782,9 +864,9 @@ static PyObject *Material_setMode(BPy_Material *self, PyObject *args)
|
||||
else if (strcmp(m[i], "Wire") == 0)
|
||||
flag |= (short)EXPP_MAT_MODE_WIRE;
|
||||
else if (strcmp(m[i], "VColLight") == 0)
|
||||
flag |= (short)EXPP_MAT_MODE_VCOLLIGHT;
|
||||
flag |= (short)EXPP_MAT_MODE_VCOL_LIGHT;
|
||||
else if (strcmp(m[i], "VColPaint") == 0)
|
||||
flag |= (short)EXPP_MAT_MODE_VCOLPAINT;
|
||||
flag |= (short)EXPP_MAT_MODE_VCOL_PAINT;
|
||||
else if (strcmp(m[i], "Halo") == 0)
|
||||
flag |= (short)EXPP_MAT_MODE_HALO;
|
||||
else if (strcmp(m[i], "ZTransp") == 0)
|
||||
@@ -799,19 +881,19 @@ static PyObject *Material_setMode(BPy_Material *self, PyObject *args)
|
||||
flag |= (short)EXPP_MAT_MODE_HALOLINES;
|
||||
else if (strcmp(m[i], "OnlyShadow") == 0)
|
||||
flag |= (short)EXPP_MAT_MODE_ONLYSHADOW;
|
||||
else if (strcmp(m[i], "XAlpha") == 0)
|
||||
flag |= (short)EXPP_MAT_MODE_XALPHA;
|
||||
else if (strcmp(m[i], "Star") == 0)
|
||||
flag |= (short)EXPP_MAT_MODE_STAR;
|
||||
else if (strcmp(m[i], "FaceTex") == 0)
|
||||
flag |= (short)EXPP_MAT_MODE_FACETEX;
|
||||
else if (strcmp(m[i], "HaloXAlpha") == 0)
|
||||
flag |= (short)EXPP_MAT_MODE_HALOXALPHA;
|
||||
else if (strcmp(m[i], "HaloStar") == 0)
|
||||
flag |= (short)EXPP_MAT_MODE_HALOSTAR;
|
||||
else if (strcmp(m[i], "TexFace") == 0)
|
||||
flag |= (short)EXPP_MAT_MODE_TEXFACE;
|
||||
else if (strcmp(m[i], "HaloTex") == 0)
|
||||
flag |= (short)EXPP_MAT_MODE_HALOTEX;
|
||||
else if (strcmp(m[i], "HaloPuno") == 0)
|
||||
flag |= (short)EXPP_MAT_MODE_HALOPUNO;
|
||||
else if (strcmp(m[i], "NoMist") == 0)
|
||||
flag |= (short)EXPP_MAT_MODE_NOMIST;
|
||||
else if (strcmp(m[i], "HaloShade") == 0)
|
||||
else if (strcmp(m[i], "HaloShaded") == 0)
|
||||
flag |= (short)EXPP_MAT_MODE_HALOSHADE;
|
||||
else if (strcmp(m[i], "HaloFlare") == 0)
|
||||
flag |= (short)EXPP_MAT_MODE_HALOFLARE;
|
||||
@@ -962,8 +1044,8 @@ static PyObject *Material_setSpec(BPy_Material *self, PyObject *args)
|
||||
return (EXPP_ReturnPyObjError (PyExc_TypeError,
|
||||
"expected float argument in [0.0, 1.0]"));
|
||||
|
||||
self->material->spec = EXPP_ClampFloat (value, EXPP_MAT_SPEBPy_MIN,
|
||||
EXPP_MAT_SPEBPy_MAX);
|
||||
self->material->spec = EXPP_ClampFloat (value, EXPP_MAT_SPEC_MIN,
|
||||
EXPP_MAT_SPEC_MAX);
|
||||
|
||||
return EXPP_incr_ret (Py_None);
|
||||
}
|
||||
@@ -1052,6 +1134,35 @@ static PyObject *Material_setSubSize(BPy_Material *self, PyObject *args)
|
||||
return EXPP_incr_ret (Py_None);
|
||||
}
|
||||
|
||||
static PyObject *Material_setHaloSeed(BPy_Material *self, PyObject *args)
|
||||
{
|
||||
short value;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "h", &value))
|
||||
return (EXPP_ReturnPyObjError (PyExc_TypeError,
|
||||
"expected int argument in [1, 255]"));
|
||||
|
||||
self->material->seed1 = EXPP_ClampInt (value, EXPP_MAT_HALOSEED_MIN,
|
||||
EXPP_MAT_HALOSEED_MAX);
|
||||
|
||||
return EXPP_incr_ret (Py_None);
|
||||
}
|
||||
|
||||
static PyObject *Material_setFlareSeed(BPy_Material *self, PyObject *args)
|
||||
{
|
||||
short value;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "h", &value))
|
||||
return (EXPP_ReturnPyObjError (PyExc_TypeError,
|
||||
"expected int argument in [1, 255]"));
|
||||
|
||||
self->material->seed2 = EXPP_ClampInt (value, EXPP_MAT_FLARESEED_MIN,
|
||||
EXPP_MAT_FLARESEED_MAX);
|
||||
|
||||
return EXPP_incr_ret (Py_None);
|
||||
}
|
||||
|
||||
|
||||
static PyObject *Material_setHardness(BPy_Material *self, PyObject *args)
|
||||
{
|
||||
short value;
|
||||
@@ -1168,10 +1279,14 @@ static PyObject *Material_getAttr (BPy_Material *self, char *name)
|
||||
attr = PyFloat_FromDouble((double)self->material->zoffs);
|
||||
else if (strcmp(name, "haloSize") == 0)
|
||||
attr = PyFloat_FromDouble((double)self->material->hasize);
|
||||
else if (strcmp(name, "haloSeed") == 0)
|
||||
attr = PyInt_FromLong((double)self->material->seed1);
|
||||
else if (strcmp(name, "flareSize") == 0)
|
||||
attr = PyFloat_FromDouble((double)self->material->flaresize);
|
||||
else if (strcmp(name, "flareBoost") == 0)
|
||||
attr = PyFloat_FromDouble((double)self->material->flareboost);
|
||||
else if (strcmp(name, "flareSeed") == 0)
|
||||
attr = PyInt_FromLong((double)self->material->seed2);
|
||||
else if (strcmp(name, "subSize") == 0)
|
||||
attr = PyFloat_FromDouble((double)self->material->subsize);
|
||||
else if (strcmp(name, "hard") == 0)
|
||||
@@ -1186,13 +1301,13 @@ static PyObject *Material_getAttr (BPy_Material *self, char *name)
|
||||
attr = PyInt_FromLong((long)self->material->ringc);
|
||||
|
||||
else if (strcmp(name, "__members__") == 0) {
|
||||
attr = /* 26 items */
|
||||
Py_BuildValue("[s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s]",
|
||||
attr = /* 28 items */
|
||||
Py_BuildValue("[s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s]",
|
||||
"name", "mode", "rgbCol", "ambCol", "specCol", "mirCol",
|
||||
"R", "G", "B", "alpha", "amb", "emit", "ref",
|
||||
"spec", "specTransp", "add", "zOffset", "haloSize",
|
||||
"flareSize", "flareBoost", "subSize", "hard", "nFlares",
|
||||
"nStars", "nLines", "nRings");
|
||||
"R", "G", "B", "alpha", "amb", "emit", "ref", "spec",
|
||||
"specTransp", "add", "zOffset", "haloSize", "haloSeed",
|
||||
"flareSize", "flareBoost", "flareSeed", "subSize", "hard",
|
||||
"nFlares", "nStars", "nLines", "nRings");
|
||||
}
|
||||
|
||||
if (!attr)
|
||||
@@ -1266,10 +1381,14 @@ static int Material_setAttr (BPy_Material *self, char *name, PyObject *value)
|
||||
error = Material_setZOffset (self, valtuple);
|
||||
else if (strcmp (name, "haloSize") == 0)
|
||||
error = Material_setHaloSize (self, valtuple);
|
||||
else if (strcmp (name, "haloSeed") == 0)
|
||||
error = Material_setHaloSeed (self, valtuple);
|
||||
else if (strcmp (name, "flareSize") == 0)
|
||||
error = Material_setFlareSize (self, valtuple);
|
||||
else if (strcmp (name, "flareBoost") == 0)
|
||||
error = Material_setFlareBoost (self, valtuple);
|
||||
else if (strcmp (name, "flareSeed") == 0)
|
||||
error = Material_setFlareSeed (self, valtuple);
|
||||
else if (strcmp (name, "subSize") == 0)
|
||||
error = Material_setSubSize (self, valtuple);
|
||||
else if (strcmp (name, "hard") == 0)
|
||||
|
@@ -79,6 +79,8 @@ static PyObject *NMCol_getattr(PyObject *self, char *name)
|
||||
else if (strcmp(name, "g") == 0) return Py_BuildValue("i", mc->g);
|
||||
else if (strcmp(name, "b") == 0) return Py_BuildValue("i", mc->b);
|
||||
else if (strcmp(name, "a") == 0) return Py_BuildValue("i", mc->a);
|
||||
else if (strcmp(name, "__members__") == 0)
|
||||
return Py_BuildValue("[s,s,s,s]", "r", "g", "b", "a");
|
||||
|
||||
return EXPP_ReturnPyObjError(PyExc_AttributeError, name);
|
||||
}
|
||||
@@ -112,8 +114,8 @@ PyTypeObject NMCol_Type =
|
||||
{
|
||||
PyObject_HEAD_INIT(NULL)
|
||||
0, /* ob_size */
|
||||
"NMCol", /* tp_name */
|
||||
sizeof(BPy_NMCol), /* tp_basicsize */
|
||||
"Blender NMCol", /* tp_name */
|
||||
sizeof(BPy_NMCol), /* tp_basicsize */
|
||||
0, /* tp_itemsize */
|
||||
/* methods */
|
||||
(destructor) NMCol_dealloc, /* tp_dealloc */
|
||||
@@ -231,6 +233,10 @@ static PyObject *NMFace_getattr(PyObject *self, char *name)
|
||||
else if (strcmp(name, "uv") == 0)
|
||||
return Py_BuildValue("O", mf->uv);
|
||||
|
||||
else if (strcmp(name, "__members__") == 0)
|
||||
return Py_BuildValue("[s,s,s,s,s,s,s,s,s,s]",
|
||||
"v", "col", "mat", "materialIndex", "smooth",
|
||||
"image", "mode", "flag", "transp", "uv");
|
||||
return Py_FindMethod(NMFace_methods, (PyObject*)self, name);
|
||||
}
|
||||
|
||||
@@ -351,8 +357,8 @@ PyTypeObject NMFace_Type =
|
||||
{
|
||||
PyObject_HEAD_INIT(NULL)
|
||||
0, /*ob_size*/
|
||||
"NMFace", /*tp_name*/
|
||||
sizeof(BPy_NMFace), /*tp_basicsize*/
|
||||
"Blender NMFace", /*tp_name*/
|
||||
sizeof(BPy_NMFace), /*tp_basicsize*/
|
||||
0, /*tp_itemsize*/
|
||||
/* methods */
|
||||
(destructor) NMFace_dealloc, /*tp_dealloc*/
|
||||
@@ -404,7 +410,9 @@ static PyObject *NMVert_getattr(PyObject *self, char *name)
|
||||
|
||||
else if (strcmp(name, "no") == 0) return newVectorObject(mv->no, 3);
|
||||
else if (strcmp(name, "uvco") == 0) return newVectorObject(mv->uvco, 3);
|
||||
else if (strcmp(name, "index") == 0) return PyInt_FromLong(mv->index);
|
||||
else if (strcmp(name, "index") == 0) return PyInt_FromLong(mv->index);
|
||||
else if (strcmp(name, "__members__") == 0)
|
||||
return Py_BuildValue("[s,s,s,s]", "co", "no", "uvco", "index");
|
||||
|
||||
return EXPP_ReturnPyObjError (PyExc_AttributeError, name);
|
||||
}
|
||||
@@ -522,8 +530,8 @@ PyTypeObject NMVert_Type =
|
||||
{
|
||||
PyObject_HEAD_INIT(NULL)
|
||||
0, /*ob_size*/
|
||||
"NMVert", /*tp_name*/
|
||||
sizeof(BPy_NMVert), /*tp_basicsize*/
|
||||
"Blender NMVert", /*tp_name*/
|
||||
sizeof(BPy_NMVert), /*tp_basicsize*/
|
||||
0, /*tp_itemsize*/
|
||||
/* methods */
|
||||
(destructor) NMVert_dealloc, /*tp_dealloc*/
|
||||
@@ -547,6 +555,49 @@ static void NMesh_dealloc(PyObject *self)
|
||||
PyObject_DEL(self);
|
||||
}
|
||||
|
||||
static PyObject *NMesh_removeAllKeys (PyObject *self, PyObject *args)
|
||||
{
|
||||
BPy_NMesh *nm = (BPy_NMesh *)self;
|
||||
Mesh *me = nm->mesh;
|
||||
|
||||
if (!PyArg_ParseTuple (args, ""))
|
||||
return EXPP_ReturnPyObjError (PyExc_TypeError,
|
||||
"this function expects no arguments");
|
||||
|
||||
if (!me || !me->key) return EXPP_incr_ret (Py_False);
|
||||
|
||||
me->key->id.us--;
|
||||
me->key = 0;
|
||||
|
||||
return EXPP_incr_ret (Py_True);
|
||||
}
|
||||
|
||||
static PyObject *NMesh_insertKey(PyObject *self, PyObject *args)
|
||||
{
|
||||
int fra = -1, oldfra = -1;
|
||||
BPy_NMesh *nm = (BPy_NMesh *)self;
|
||||
Mesh *mesh = nm->mesh;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "|i", &fra))
|
||||
return EXPP_ReturnPyObjError (PyExc_TypeError,
|
||||
"expected int argument (or nothing)");
|
||||
|
||||
if (fra > 0) {
|
||||
oldfra = G.scene->r.cfra;
|
||||
G.scene->r.cfra = fra;
|
||||
}
|
||||
|
||||
if (!mesh)
|
||||
return EXPP_ReturnPyObjError (PyExc_RuntimeError,
|
||||
"update this NMesh first with its .update() method");
|
||||
|
||||
insert_meshkey(mesh);
|
||||
|
||||
if (fra > 0) G.scene->r.cfra = oldfra;
|
||||
|
||||
return EXPP_incr_ret (Py_None);
|
||||
}
|
||||
|
||||
static PyObject *NMesh_getSelectedFaces(PyObject *self, PyObject *args)
|
||||
{
|
||||
BPy_NMesh *nm = (BPy_NMesh *)self;
|
||||
@@ -780,6 +831,8 @@ static struct PyMethodDef NMesh_methods[] =
|
||||
MethodDef(getActiveFace),
|
||||
MethodDef(getSelectedFaces),
|
||||
MethodDef(getVertexInfluences),
|
||||
MethodDef(insertKey),
|
||||
MethodDef(removeAllKeys),
|
||||
MethodDef(update),
|
||||
{NULL, NULL}
|
||||
};
|
||||
@@ -812,6 +865,10 @@ static PyObject *NMesh_getattr(PyObject *self, char *name)
|
||||
else if (strcmp(name, "faces") == 0)
|
||||
return EXPP_incr_ret(me->faces);
|
||||
|
||||
else if (strcmp(name, "__members__") == 0)
|
||||
return Py_BuildValue("[s,s,s,s,s]",
|
||||
"name", "materials", "verts", "users", "faces");
|
||||
|
||||
return Py_FindMethod(NMesh_methods, (PyObject*)self, name);
|
||||
}
|
||||
|
||||
@@ -819,21 +876,21 @@ static int NMesh_setattr(PyObject *self, char *name, PyObject *v)
|
||||
{
|
||||
BPy_NMesh *me = (BPy_NMesh *)self;
|
||||
|
||||
if (!strcmp(name, "name")) {
|
||||
char buf[21];
|
||||
if (!strcmp(name, "name")) {
|
||||
char buf[21];
|
||||
|
||||
if (!PyString_Check(v))
|
||||
return EXPP_ReturnIntError (PyExc_TypeError,
|
||||
"expected string argument");
|
||||
if (!PyString_Check(v))
|
||||
return EXPP_ReturnIntError (PyExc_TypeError,
|
||||
"expected string argument");
|
||||
|
||||
PyOS_snprintf(buf, sizeof(buf), "%s", PyString_AsString(v));
|
||||
rename_id(&me->mesh->id, buf);
|
||||
PyOS_snprintf(buf, sizeof(buf), "%s", PyString_AsString(v));
|
||||
rename_id(&me->mesh->id, buf);
|
||||
|
||||
Py_DECREF (me->name);
|
||||
me->name = PyString_FromString(me->mesh->id.name+2);
|
||||
}
|
||||
Py_DECREF (me->name);
|
||||
me->name = PyString_FromString(me->mesh->id.name+2);
|
||||
}
|
||||
|
||||
else if (!strcmp(name, "verts") || !strcmp(name, "faces") ||
|
||||
else if (!strcmp(name, "verts") || !strcmp(name, "faces") ||
|
||||
!strcmp(name, "materials")) {
|
||||
|
||||
if(PySequence_Check(v)) {
|
||||
@@ -866,8 +923,8 @@ PyTypeObject NMesh_Type =
|
||||
{
|
||||
PyObject_HEAD_INIT(NULL)
|
||||
0, /*ob_size*/
|
||||
"NMesh", /*tp_name*/
|
||||
sizeof(BPy_NMesh), /*tp_basicsize*/
|
||||
"Blender NMesh", /*tp_name*/
|
||||
sizeof(BPy_NMesh), /*tp_basicsize*/
|
||||
0, /*tp_itemsize*/
|
||||
/* methods */
|
||||
(destructor) NMesh_dealloc, /*tp_dealloc*/
|
||||
@@ -1139,9 +1196,13 @@ static PyObject *M_NMesh_GetRawFromObject(PyObject *self, PyObject *args)
|
||||
else
|
||||
nmesh = new_NMesh(me);
|
||||
}
|
||||
((BPy_NMesh *) nmesh)->mesh = 0; // hack: to mark that (deformed) mesh is readonly,
|
||||
// so the update function will not try to write it.
|
||||
return nmesh;
|
||||
|
||||
/* hack: to mark that (deformed) mesh is readonly, so the update function
|
||||
* will not try to write it. */
|
||||
|
||||
((BPy_NMesh *) nmesh)->mesh = 0;
|
||||
|
||||
return nmesh;
|
||||
}
|
||||
|
||||
static void mvert_from_data(MVert *mv, MSticky *st, BPy_NMVert *from)
|
||||
@@ -1316,10 +1377,28 @@ static int check_validFaceUV(BPy_NMesh *nmesh)
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* this is a copy of unlink_mesh in mesh.c, because ... */
|
||||
void EXPP_unlink_mesh(Mesh *me)
|
||||
{
|
||||
int a;
|
||||
|
||||
if(me==0) return;
|
||||
|
||||
for(a=0; a<me->totcol; a++) {
|
||||
if(me->mat[a]) me->mat[a]->id.us--;
|
||||
me->mat[a]= 0;
|
||||
}
|
||||
/* ... here we want to preserve mesh keys
|
||||
if(me->key) me->key->id.us--;
|
||||
me->key= 0;
|
||||
*/
|
||||
if(me->texcomesh) me->texcomesh= 0;
|
||||
}
|
||||
|
||||
static int unlink_existingMeshData(Mesh *mesh)
|
||||
{
|
||||
freedisplist(&mesh->disp);
|
||||
unlink_mesh(mesh);
|
||||
EXPP_unlink_mesh(mesh);
|
||||
if(mesh->mvert) MEM_freeN(mesh->mvert);
|
||||
if(mesh->mface) MEM_freeN(mesh->mface);
|
||||
if(mesh->mcol) MEM_freeN(mesh->mcol);
|
||||
@@ -1346,7 +1425,7 @@ Material **nmesh_updateMaterials(BPy_NMesh *nmesh)
|
||||
|
||||
if (mesh->mat) MEM_freeN(mesh->mat);
|
||||
|
||||
mesh->mat = matlist;
|
||||
mesh->mat = matlist;
|
||||
|
||||
} else {
|
||||
matlist = 0;
|
||||
@@ -1361,22 +1440,22 @@ PyObject *NMesh_assignMaterials_toObject(BPy_NMesh *nmesh, Object *ob)
|
||||
Material *ma;
|
||||
int i;
|
||||
short old_matmask;
|
||||
Mesh *mesh = nmesh->mesh;
|
||||
int nmats; /* number of mats == len(nmesh->materials)*/
|
||||
Mesh *mesh = nmesh->mesh;
|
||||
int nmats; /* number of mats == len(nmesh->materials)*/
|
||||
|
||||
old_matmask = ob->colbits; /*@ HACK: save previous colbits */
|
||||
ob->colbits = 0; /* make assign_material work on mesh linked material */
|
||||
|
||||
nmats = PyList_Size(nmesh->materials);
|
||||
nmats = PyList_Size(nmesh->materials);
|
||||
|
||||
if (nmats > 0 && !mesh->mat) {
|
||||
ob->totcol = nmats;
|
||||
mesh->totcol = nmats;
|
||||
mesh->mat = MEM_callocN(sizeof(void *)*nmats, "bpy_memats");
|
||||
if (nmats > 0 && !mesh->mat) {
|
||||
ob->totcol = nmats;
|
||||
mesh->totcol = nmats;
|
||||
mesh->mat = MEM_callocN(sizeof(void *)*nmats, "bpy_memats");
|
||||
|
||||
if (ob->mat) MEM_freeN(ob->mat);
|
||||
ob->mat = MEM_callocN(sizeof(void *)*nmats, "bpy_obmats");
|
||||
}
|
||||
if (ob->mat) MEM_freeN(ob->mat);
|
||||
ob->mat = MEM_callocN(sizeof(void *)*nmats, "bpy_obmats");
|
||||
}
|
||||
|
||||
for (i = 0; i < nmats; i++) {
|
||||
pymat = (BPy_Material *)PySequence_GetItem(nmesh->materials, i);
|
||||
@@ -1501,7 +1580,7 @@ static int convert_NMeshToMesh (Mesh *mesh, BPy_NMesh *nmesh)
|
||||
|
||||
newtf++;
|
||||
newmf++;
|
||||
if (newmc) newmc++;
|
||||
if (newmc) newmc += 4;
|
||||
}
|
||||
|
||||
nmesh->flags |= NMESH_HASFACEUV;
|
||||
@@ -1604,7 +1683,7 @@ static PyObject *M_NMesh_PutRaw(PyObject *self, PyObject *args)
|
||||
|
||||
if (ob) { // we created a new object
|
||||
NMesh_assignMaterials_toObject(nmesh, ob);
|
||||
EXPP_synchronizeMaterialLists (ob, ob->data);
|
||||
EXPP_synchronizeMaterialLists (ob, ob->data);
|
||||
return Object_CreatePyObject(ob);
|
||||
}
|
||||
else {
|
||||
|
@@ -54,6 +54,7 @@
|
||||
#include "BLI_blenlib.h"
|
||||
#include "BIF_space.h"
|
||||
#include "DNA_mesh_types.h"
|
||||
#include "DNA_key_types.h"
|
||||
#include "DNA_object_types.h"
|
||||
#include "DNA_material_types.h"
|
||||
#include "DNA_armature_types.h"
|
||||
@@ -66,6 +67,9 @@
|
||||
#include "gen_utils.h"
|
||||
#include "modules.h"
|
||||
|
||||
|
||||
void insert_meshkey(Mesh *me); /* defined in editkey.c */
|
||||
|
||||
/* EXPP PyType Objects */
|
||||
|
||||
PyTypeObject NMesh_Type;
|
||||
@@ -87,7 +91,7 @@ static PyObject *g_nmeshmodule = NULL;
|
||||
#define BPy_NMCol_Check(v) ((v)->ob_type == &NMCol_Type)
|
||||
|
||||
static char M_NMesh_doc[] =
|
||||
"The Blender.NMesh module";
|
||||
"The Blender.NMesh submodule";
|
||||
|
||||
static char M_NMesh_Col_doc[]=
|
||||
"([r, g, b, a]) - Get a new mesh color\n\n\
|
||||
@@ -103,6 +107,15 @@ static char M_NMesh_Vert_doc[] =
|
||||
"([x, y, z]) - Get a new vertice\n\n\
|
||||
[x, y, z] Specify new coordinates";
|
||||
|
||||
static char NMesh_insertKey_doc[] =
|
||||
"(frame = None) - inserts a Mesh key at the given frame\n\
|
||||
if called without arguments, it inserts the key at the current Scene frame";
|
||||
|
||||
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";
|
||||
|
@@ -52,6 +52,8 @@ PyObject *M_Object_Get (PyObject *self, PyObject *args); /* from Object.c */
|
||||
/* Python BPy_Scene defaults: */
|
||||
/*****************************************************************************/
|
||||
#define EXPP_SCENE_FRAME_MAX 18000
|
||||
#define EXPP_SCENE_RENDER_WINRESOLUTION_MIN 4
|
||||
#define EXPP_SCENE_RENDER_WINRESOLUTION_MAX 10000
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Python API function prototypes for the Scene module. */
|
||||
@@ -59,23 +61,30 @@ PyObject *M_Object_Get (PyObject *self, PyObject *args); /* from Object.c */
|
||||
static PyObject *M_Scene_New (PyObject *self, PyObject *args,
|
||||
PyObject *keywords);
|
||||
static PyObject *M_Scene_Get (PyObject *self, PyObject *args);
|
||||
static PyObject *M_Scene_getCurrent (PyObject *self);
|
||||
static PyObject *M_Scene_unlink (PyObject *self, PyObject *arg);
|
||||
static PyObject *M_Scene_GetCurrent (PyObject *self);
|
||||
static PyObject *M_Scene_Unlink (PyObject *self, PyObject *arg);
|
||||
|
||||
/*****************************************************************************/
|
||||
/* The following string definitions are used for documentation strings. */
|
||||
/* In Python these will be written to the console when doing a */
|
||||
/* Blender.Scene.__doc__ */
|
||||
/*****************************************************************************/
|
||||
static char M_Scene_doc[] = "";
|
||||
static char M_Scene_doc[] =
|
||||
"The Blender.Scene submodule";
|
||||
|
||||
static char M_Scene_New_doc[] = "";
|
||||
static char M_Scene_New_doc[] =
|
||||
"(name = 'Scene') - Create a new Scene called 'name' in Blender.";
|
||||
|
||||
static char M_Scene_Get_doc[] = "";
|
||||
static char M_Scene_Get_doc[] =
|
||||
"(name = None) - Return the scene called 'name'.\n\
|
||||
If 'name' is None, return a list with all Scenes.";
|
||||
|
||||
static char M_Scene_getCurrent_doc[] = "";
|
||||
static char M_Scene_GetCurrent_doc[] =
|
||||
"() - Return the currently active Scene in Blender.";
|
||||
|
||||
static char M_Scene_unlink_doc[] = "";
|
||||
static char M_Scene_Unlink_doc[] =
|
||||
"(scene) - Unlink (delete) scene 'Scene' from Blender.\n\
|
||||
(scene) is of type Blender scene.";
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Python method structure definition for Blender.Scene module: */
|
||||
@@ -85,9 +94,12 @@ struct PyMethodDef M_Scene_methods[] = {
|
||||
M_Scene_New_doc},
|
||||
{"Get", M_Scene_Get, METH_VARARGS, M_Scene_Get_doc},
|
||||
{"get", M_Scene_Get, METH_VARARGS, M_Scene_Get_doc},
|
||||
{"getCurrent",(PyCFunction)M_Scene_getCurrent,
|
||||
METH_NOARGS, M_Scene_getCurrent_doc},
|
||||
{"unlink", M_Scene_unlink, METH_VARARGS, M_Scene_unlink_doc},
|
||||
{"GetCurrent",(PyCFunction)M_Scene_GetCurrent,
|
||||
METH_NOARGS, M_Scene_GetCurrent_doc},
|
||||
{"getCurrent",(PyCFunction)M_Scene_GetCurrent,
|
||||
METH_NOARGS, M_Scene_GetCurrent_doc},
|
||||
{"Unlink", M_Scene_Unlink, METH_VARARGS, M_Scene_Unlink_doc},
|
||||
{"unlink", M_Scene_Unlink, METH_VARARGS, M_Scene_Unlink_doc},
|
||||
{NULL, NULL, 0, NULL}
|
||||
};
|
||||
|
||||
@@ -123,9 +135,9 @@ static PyMethodDef BPy_Scene_methods[] = {
|
||||
{"setName", (PyCFunction)Scene_setName, METH_VARARGS,
|
||||
"(str) - Change Scene name"},
|
||||
{"getWinSize", (PyCFunction)Scene_getWinSize, METH_NOARGS,
|
||||
"() - Return Scene size"},
|
||||
"() - Return Render window [x,y] dimensions"},
|
||||
{"setWinSize", (PyCFunction)Scene_setWinSize, METH_VARARGS,
|
||||
"(str) - Change Scene size"},
|
||||
"(str) - Change Render window [x,y] dimensions"},
|
||||
{"copy", (PyCFunction)Scene_copy, METH_VARARGS,
|
||||
"(duplicate_objects = 1) - Return a copy of this scene\n"
|
||||
"The optional argument duplicate_objects defines how the scene\n"
|
||||
@@ -288,12 +300,12 @@ static PyObject *M_Scene_Get(PyObject *self, PyObject *args)
|
||||
}
|
||||
}
|
||||
|
||||
static PyObject *M_Scene_getCurrent (PyObject *self)
|
||||
static PyObject *M_Scene_GetCurrent (PyObject *self)
|
||||
{
|
||||
return Scene_CreatePyObject ((Scene *)G.scene);
|
||||
}
|
||||
|
||||
static PyObject *M_Scene_unlink (PyObject *self, PyObject *args)
|
||||
static PyObject *M_Scene_Unlink (PyObject *self, PyObject *args)
|
||||
{
|
||||
PyObject *pyobj;
|
||||
Scene *scene;
|
||||
@@ -381,34 +393,38 @@ static PyObject *Scene_setName(BPy_Scene *self, PyObject *args)
|
||||
return Py_None;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static PyObject *Scene_getWinSize(BPy_Scene *self)
|
||||
{
|
||||
PyObject* list = PyList_New (0);
|
||||
Scene *scene = self->scene;
|
||||
PyList_Append (list, PyInt_FromLong(scene->r.xsch));
|
||||
PyList_Append (list, PyInt_FromLong(scene->r.ysch));
|
||||
return list;
|
||||
PyObject* list = PyList_New (0);
|
||||
Scene *scene = self->scene;
|
||||
|
||||
PyList_Append (list, PyInt_FromLong(scene->r.xsch));
|
||||
PyList_Append (list, PyInt_FromLong(scene->r.ysch));
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
static PyObject *Scene_setWinSize(BPy_Scene *self, PyObject *args)
|
||||
{
|
||||
PyObject *listargs=0, * tmp;
|
||||
int i;
|
||||
if (!PyArg_ParseTuple(args, "O", &listargs))
|
||||
return (EXPP_ReturnPyObjError(PyExc_TypeError,"expected a list"));
|
||||
if (!PyList_Check(listargs))
|
||||
return (EXPP_ReturnPyObjError(PyExc_TypeError,"expected a list"));
|
||||
puts("popo");
|
||||
tmp = PyList_GetItem(listargs,0);
|
||||
printf("%d\n",self->scene->r.xsch);
|
||||
self->scene->r.xsch = (short)PyInt_AsLong(tmp);
|
||||
printf("%d\n",self->scene->r.xsch);
|
||||
tmp = PyList_GetItem(listargs,1);
|
||||
self->scene->r.ysch = (short)PyInt_AsLong(tmp);
|
||||
int xres = -1, yres = -1;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "(ii)", &xres, &yres))
|
||||
return EXPP_ReturnPyObjError (PyExc_TypeError,
|
||||
"expected a [x, y] list as argument");
|
||||
|
||||
if (xres > 0)
|
||||
self->scene->r.xsch = EXPP_ClampInt(xres,
|
||||
EXPP_SCENE_RENDER_WINRESOLUTION_MIN,
|
||||
EXPP_SCENE_RENDER_WINRESOLUTION_MAX);
|
||||
|
||||
if (yres > 0)
|
||||
self->scene->r.ysch = EXPP_ClampInt(yres,
|
||||
EXPP_SCENE_RENDER_WINRESOLUTION_MIN,
|
||||
EXPP_SCENE_RENDER_WINRESOLUTION_MAX);
|
||||
|
||||
Py_INCREF(Py_None);
|
||||
return Py_None;
|
||||
|
||||
return Py_None;
|
||||
}
|
||||
|
||||
static PyObject *Scene_copy (BPy_Scene *self, PyObject *args)
|
||||
@@ -495,7 +511,7 @@ static PyObject *Scene_update (BPy_Scene *self)
|
||||
static PyObject *Scene_link (BPy_Scene *self, PyObject *args)
|
||||
{
|
||||
Scene *scene = self->scene;
|
||||
BPy_Object *bpy_obj; /* XXX Change to BPy or whatever is chosen */
|
||||
BPy_Object *bpy_obj;
|
||||
|
||||
if (!scene)
|
||||
return EXPP_ReturnPyObjError (PyExc_RuntimeError,
|
||||
|
@@ -60,6 +60,8 @@ PyObject *Types_Init (void)
|
||||
|
||||
/* Blender Object Data Types */
|
||||
|
||||
PyDict_SetItemString(dict, "SceneType", (PyObject *)&Scene_Type);
|
||||
|
||||
PyDict_SetItemString(dict, "NMeshType", (PyObject *)&NMesh_Type);
|
||||
PyDict_SetItemString(dict, "NMFaceType", (PyObject *)&NMFace_Type);
|
||||
PyDict_SetItemString(dict, "NMVertType", (PyObject *)&NMVert_Type);
|
||||
|
@@ -37,6 +37,7 @@
|
||||
extern PyTypeObject Button_Type, Material_Type;
|
||||
|
||||
extern PyTypeObject Object_Type;
|
||||
extern PyTypeObject Scene_Type;
|
||||
extern PyTypeObject NMesh_Type, NMFace_Type, NMVert_Type, NMCol_Type;
|
||||
extern PyTypeObject Camera_Type, Lamp_Type, Image_Type, Text_Type;
|
||||
extern PyTypeObject Armature_Type, Bone_Type;
|
||||
|
76
source/blender/python/api2_2x/doc/Armature.py
Normal file
76
source/blender/python/api2_2x/doc/Armature.py
Normal file
@@ -0,0 +1,76 @@
|
||||
# Blender.Armature module and the Armature PyType object
|
||||
|
||||
"""
|
||||
The Blender.Armature submodule.
|
||||
|
||||
Armature
|
||||
========
|
||||
|
||||
This module provides access to B{Armature} objects in Blender. These are
|
||||
"skeletons", used to deform and animate other objects -- meshes, for
|
||||
example.
|
||||
|
||||
Example::
|
||||
import Blender
|
||||
from Blender import Armature
|
||||
#
|
||||
armatures = Armature.Get()
|
||||
for a in armatures:
|
||||
print "Armature ", a
|
||||
print "- The root bones of %s: %s" % (a.name, a.getBones())
|
||||
"""
|
||||
|
||||
def New (name = 'ArmatureData'):
|
||||
"""
|
||||
Create a new Armature object.
|
||||
@type name: string
|
||||
@param name: The Armature name.
|
||||
@rtype: Blender Armature
|
||||
@return: The created Armature object.
|
||||
"""
|
||||
|
||||
def Get (name = None):
|
||||
"""
|
||||
Get the Armature object(s) from Blender.
|
||||
@type name: string
|
||||
@param name: The name of the Armature.
|
||||
@rtype: Blender Armature or a list of Blender Armatures
|
||||
@return: It depends on the I{name} parameter:
|
||||
- (name): The Armature object with the given I{name};
|
||||
- (): A list with all Armature objects in the current scene.
|
||||
"""
|
||||
|
||||
class Armature:
|
||||
"""
|
||||
The Armature object
|
||||
===================
|
||||
This object gives access to Armature-specific data in Blender.
|
||||
@cvar name: The Armature name.
|
||||
@cvar bones: The Armature root bones (cannot be set yet).
|
||||
"""
|
||||
|
||||
def getName():
|
||||
"""
|
||||
Get the name of this Armature object.
|
||||
@rtype: string
|
||||
"""
|
||||
|
||||
def setName(name):
|
||||
"""
|
||||
Set the name of this Armature object.
|
||||
@type name: string
|
||||
@param name: The new name.
|
||||
"""
|
||||
|
||||
def getBones():
|
||||
"""
|
||||
Get the Armature root bones.
|
||||
@rtype: list
|
||||
@return: a list of Armature bones.
|
||||
"""
|
||||
|
||||
def setBones(bones):
|
||||
"""
|
||||
Set the Armature root bones (still unimplemented).
|
||||
@warn: This method wasn't implemented yet.
|
||||
"""
|
@@ -12,14 +12,22 @@ This is the main Blender module.
|
||||
Blender Python
|
||||
==============
|
||||
|
||||
- The L{Blender} module
|
||||
|
||||
Submodules:
|
||||
-----------
|
||||
|
||||
- L{Types}
|
||||
- L{Scene}
|
||||
- L{NMesh}
|
||||
- L{Material}
|
||||
- L{Armature}
|
||||
- L{Camera}
|
||||
- L{Lamp}
|
||||
- L{BGL}
|
||||
- L{Window}
|
||||
- L{Draw}
|
||||
- L{Image}
|
||||
- L{Text}
|
||||
|
||||
Introduction:
|
||||
@@ -31,7 +39,7 @@ Blender Python
|
||||
- Links to Blender, Blender Python, later: script lists
|
||||
|
||||
@author: The Blender Python Team
|
||||
@requires: Blender 2.28 or newer.
|
||||
@requires: Blender 2.27-NewPy (2.28 pre-release) or newer.
|
||||
@version: 0.1
|
||||
@see: U{www.blender.org<http://www.blender.org>}
|
||||
@see: U{projects.blender.org<http://projects.blender.org>}
|
||||
|
@@ -37,8 +37,8 @@ def Get (name = None):
|
||||
@type name: string
|
||||
@param name: The name of the Camera Data.
|
||||
@rtype: Blender Camera or a list of Blender Cameras
|
||||
@return: It depends on the 'name' parameter:
|
||||
- (name): The Camera Data object with the given name;
|
||||
@return: It depends on the I{name} parameter:
|
||||
- (name): The Camera Data object with the given I{name};
|
||||
- (): A list with all Camera Data objects in the current scene.
|
||||
"""
|
||||
|
||||
|
353
source/blender/python/api2_2x/doc/Draw.py
Normal file
353
source/blender/python/api2_2x/doc/Draw.py
Normal file
@@ -0,0 +1,353 @@
|
||||
# Blender.Draw module and the Button PyType object
|
||||
|
||||
"""
|
||||
The Blender.Draw submodule.
|
||||
|
||||
Draw
|
||||
====
|
||||
|
||||
This module provides access to a B{windowing interface} in Blender. Its widgets
|
||||
include many kinds of buttons: push, toggle, menu, number, string, slider,
|
||||
scrollbar, plus support for text drawing. It also includes keyboard keys and
|
||||
mouse button code values in its dictionary (print dir(Blender.Draw)).
|
||||
|
||||
Example::
|
||||
import Blender
|
||||
from Blender import Draw, BGL
|
||||
#
|
||||
mystring = ""
|
||||
mymsg = ""
|
||||
toggle = 0
|
||||
#
|
||||
def event(evt, val): # the function to handle input events
|
||||
global mystring, mymsg
|
||||
|
||||
if not val: # val = 0: it's a key/mbutton release
|
||||
if evt in [Draw.LEFTMOUSE, Draw.MIDDLEMOUSE, Draw.RIGHTMOUSE]:
|
||||
mymsg = "You released a mouse button."
|
||||
Draw.Redraw(1)
|
||||
return
|
||||
|
||||
if evt == Draw.ESCKEY:
|
||||
Draw.Exit() # exit when user presses ESC
|
||||
return
|
||||
|
||||
elif Draw.AKEY <= evt <= Draw.ZKEY: mystring += chr(evt)
|
||||
elif evt == Draw.SPACEKEY: mystring += ' '
|
||||
elif evt == Draw.BACKSPACEKEY and len(mystring):
|
||||
mystring = mystring[:-1]
|
||||
else: return # this is important: only re-register if an event was caught
|
||||
|
||||
Draw.Register(gui, event, button_event) # re-register to stay in the loop
|
||||
#
|
||||
def button_event(evt): # the function to handle Draw Button events
|
||||
global mymsg, toggle
|
||||
if evt == 1:
|
||||
mymsg = "You pressed the toggle button."
|
||||
toggle = 1 - toggle
|
||||
Draw.Redraw(1)
|
||||
else:
|
||||
Draw.Register(gui, event, button_event)
|
||||
#
|
||||
def gui(): # the function to draw the screen
|
||||
global mystring, mymsg, toggle
|
||||
if len(mystring) > 90: mystring = ""
|
||||
BGL.glClearColor(0,0,1,1)
|
||||
BGL.glClear(BGL.GL_COLOR_BUFFER_BIT)
|
||||
BGL.glColor3f(1,1,1)
|
||||
Draw.Toggle("Toggle", 1, 10, 10, 55, 20, toggle,"A toggle button")
|
||||
BGL.glRasterPos2i(72, 16)
|
||||
if toggle: toggle_state = "down"
|
||||
else: toggle_state = "up"
|
||||
Draw.Text("The toggle button is %s." % toggle_state, "small")
|
||||
BGL.glRasterPos2i(10, 230)
|
||||
Draw.Text("Type letters from a to z, ESC to leave.")
|
||||
BGL.glRasterPos2i(20, 200)
|
||||
Draw.Text(mystring)
|
||||
BGL.glColor3f(1,0.4,0.3)
|
||||
BGL.glRasterPos2i(340, 70)
|
||||
Draw.Text(mymsg, "tiny")
|
||||
#
|
||||
Draw.Register(gui, event, button_event) # registering the 3 callbacks
|
||||
@warn: Inside the windowing loop (after Draw.Register() has been executed and
|
||||
before Draw.Exit() is called), don't use the redraw functions from other
|
||||
modules (Blender and Window). The Draw submodule has its own Draw.Redraw() and
|
||||
Draw.Draw() functions that can be used inside the windowing loop.
|
||||
"""
|
||||
|
||||
def Exit():
|
||||
"""
|
||||
Exit the windowing interface.
|
||||
"""
|
||||
|
||||
def Register(draw = None, event = None, button = None):
|
||||
"""
|
||||
Register callbacks for windowing.
|
||||
@type draw: function
|
||||
@type event: function
|
||||
@type button: function
|
||||
@param draw: A function to draw the screen, taking no arguments: f().
|
||||
@param event: A function to handle keyboard and mouse input events, taking
|
||||
two arguments: f(evt, val), where:
|
||||
- 'evt' (int) is the event number;
|
||||
- 'val' (int) is the value modifier. If val = 0, the event refers to a
|
||||
key or mouse button being released. Otherwise it's a key/button press.
|
||||
@param button: A function to handle Draw Button events, taking one argument:
|
||||
f(evt), where:
|
||||
- 'evt' is the button number (see the I{event} parameter in L{Button}).
|
||||
"""
|
||||
|
||||
def Redraw(after = 0):
|
||||
"""
|
||||
Queue a redraw event. Redraw events are buffered so that, regardless of how
|
||||
many events are queued, the window only receives one redraw event.
|
||||
@type after: int
|
||||
@param after: If non-zero, the redraw is processed before other input events.
|
||||
"""
|
||||
|
||||
def Draw():
|
||||
"""
|
||||
Force an immediate redraw. Forced redraws are not buffered. In other words,
|
||||
the window is redrawn once every time this function is called.
|
||||
"""
|
||||
|
||||
def Create(value):
|
||||
"""
|
||||
Create a default Button object.
|
||||
@type value: int, float or string
|
||||
@param value: The value to store in the button.
|
||||
@rtype: Blender Button
|
||||
@return: The Button created.
|
||||
"""
|
||||
|
||||
def Button(name, event, x, y, width, height, tooltip = None):
|
||||
"""
|
||||
Create a new (push) Button object.
|
||||
@type name: string
|
||||
@param name: The string to display on the button.
|
||||
@type event: int
|
||||
@param event: The event number to pass to the button event function when
|
||||
activated.
|
||||
@type x: int
|
||||
@type y: int
|
||||
@param x: The lower left x (horizontal) coordinate of the button.
|
||||
@param y: The lower left y (vertical) coordinate of the button.
|
||||
@type width: int
|
||||
@type height: int
|
||||
@param width: The button width.
|
||||
@param height: The button height.
|
||||
@type tooltip: string
|
||||
@param tooltip: The button's tooltip (the string that appears when the mouse
|
||||
is kept over the button).
|
||||
"""
|
||||
|
||||
def Menu(name, event, x, y, width, height, default, tooltip = None):
|
||||
"""
|
||||
Create a new Menu Button object.
|
||||
|
||||
The menu options are specified through the 'name' of the button. Options are
|
||||
I{followed} by a format code and separated by the '|' (pipe) character. Valid
|
||||
format codes are:
|
||||
- %t - The option should be used as the title;
|
||||
- %xB{N} - The option should set the integer B{N} in the button value.
|
||||
|
||||
Example::
|
||||
name = "The Title %t|First Entry %x1|Second Entry %x2|Third Entry %x3"
|
||||
menu = Draw.Menu(name, 2, 60, 120, 200, 40, 3, "Just a test menu.")
|
||||
# note that, since default = 3, the "Third Entry"
|
||||
# will appear as the default choice in the Menu.
|
||||
|
||||
@type name: string
|
||||
@param name: The string to display on the button.
|
||||
@type event: int
|
||||
@param event: The event number to pass to the button event function when
|
||||
activated.
|
||||
@type x: int
|
||||
@type y: int
|
||||
@param x: The lower left x (horizontal) coordinate of the button.
|
||||
@param y: The lower left y (vertical) coordinate of the button.
|
||||
@type width: int
|
||||
@type height: int
|
||||
@param width: The button width.
|
||||
@param height: The button height.
|
||||
@type default: int
|
||||
@param default: The number of the option to be selected by default.
|
||||
@type tooltip: string
|
||||
@param tooltip: The button's tooltip (the string that appears when the mouse
|
||||
is kept over the button).
|
||||
@rtype: Blender Button
|
||||
@return: The Button created.
|
||||
"""
|
||||
|
||||
def Toggle(name, event, x, y, width, height, default, tooltip = None):
|
||||
"""
|
||||
Create a new Toggle Button object.
|
||||
@type name: string
|
||||
@param name: The string to display on the button.
|
||||
@type event: int
|
||||
@param event: The event number to pass to the button event function when
|
||||
activated.
|
||||
@type x: int
|
||||
@type y: int
|
||||
@param x: The lower left x (horizontal) coordinate of the button.
|
||||
@param y: The lower left y (vertical) coordinate of the button.
|
||||
@type width: int
|
||||
@type height: int
|
||||
@param width: The button width.
|
||||
@param height: The button height.
|
||||
@type default: int
|
||||
@param default: The value specifying the default state:
|
||||
(0 for "up", 1 for "down").
|
||||
@type tooltip: string
|
||||
@param tooltip: The button's tooltip (the string that appears when the mouse
|
||||
is kept over the button).
|
||||
@rtype: Blender Button
|
||||
@return: The Button created.
|
||||
"""
|
||||
|
||||
def Slider(name, event, x, y, width, height, initial, min, max, realtime = 1,
|
||||
tooltip = None):
|
||||
"""
|
||||
Create a new Toggle Button object.
|
||||
@type name: string
|
||||
@param name: The string to display on the button.
|
||||
@type event: int
|
||||
@param event: The event number to pass to the button event function when
|
||||
activated.
|
||||
@type x: int
|
||||
@type y: int
|
||||
@param x: The lower left x (horizontal) coordinate of the button.
|
||||
@param y: The lower left y (vertical) coordinate of the button.
|
||||
@type width: int
|
||||
@type height: int
|
||||
@param width: The button width.
|
||||
@param height: The button height.
|
||||
@type initial: int or float
|
||||
@type min: int or float
|
||||
@type max: int or float
|
||||
@param initial: The initial value.
|
||||
@param min: The minimum value.
|
||||
@param max: The maximum value.
|
||||
@type realtime: int
|
||||
@param realtime: If non-zero (the default), the slider will emit events as
|
||||
it is edited.
|
||||
@type tooltip: string
|
||||
@param tooltip: The button's tooltip (the string that appears when the mouse
|
||||
is kept over the button).
|
||||
@rtype: Blender Button
|
||||
@return: The Button created.
|
||||
"""
|
||||
|
||||
def Scrollbar(event, x, y, width, height, initial, min, max, realtime = 1,
|
||||
tooltip = None):
|
||||
"""
|
||||
Create a new Scrollbar Button object.
|
||||
@type event: int
|
||||
@param event: The event number to pass to the button event function when
|
||||
activated.
|
||||
@type x: int
|
||||
@type y: int
|
||||
@param x: The lower left x (horizontal) coordinate of the button.
|
||||
@param y: The lower left y (vertical) coordinate of the button.
|
||||
@type width: int
|
||||
@type height: int
|
||||
@param width: The button width.
|
||||
@param height: The button height.
|
||||
@type initial: int or float
|
||||
@type min: int or float
|
||||
@type max: int or float
|
||||
@param initial: The initial value.
|
||||
@param min: The minimum value.
|
||||
@param max: The maximum value.
|
||||
@type realtime: int
|
||||
@param realtime: If non-zero (the default), the slider will emit events as
|
||||
it is edited.
|
||||
@type tooltip: string
|
||||
@param tooltip: The button's tooltip (the string that appears when the mouse
|
||||
is kept over the button).
|
||||
@rtype: Blender Button
|
||||
@return: The Button created.
|
||||
"""
|
||||
|
||||
def Number(name, event, x, y, width, height, initial, min, max, realtime = 1,
|
||||
tooltip = None):
|
||||
"""
|
||||
Create a new Number Button object.
|
||||
@type name: string
|
||||
@param name: The string to display on the button.
|
||||
@type event: int
|
||||
@param event: The event number to pass to the button event function when
|
||||
activated.
|
||||
@type x: int
|
||||
@type y: int
|
||||
@param x: The lower left x (horizontal) coordinate of the button.
|
||||
@param y: The lower left y (vertical) coordinate of the button.
|
||||
@type width: int
|
||||
@type height: int
|
||||
@param width: The button width.
|
||||
@param height: The button height.
|
||||
@type initial: int or float
|
||||
@type min: int or float
|
||||
@type max: int or float
|
||||
@param initial: The initial value.
|
||||
@param min: The minimum value.
|
||||
@param max: The maximum value.
|
||||
@type realtime: int
|
||||
@param realtime: If non-zero (the default), the slider will emit events as
|
||||
it is edited.
|
||||
@type tooltip: string
|
||||
@param tooltip: The button's tooltip (the string that appears when the mouse
|
||||
is kept over the button).
|
||||
@rtype: Blender Button
|
||||
@return: The Button created.
|
||||
"""
|
||||
|
||||
|
||||
def String(name, event, x, y, width, height, initial, length, tooltip = None):
|
||||
"""
|
||||
Create a new String Button object.
|
||||
@type name: string
|
||||
@param name: The string to display on the button.
|
||||
@type event: int
|
||||
@param event: The event number to pass to the button event function when
|
||||
activated.
|
||||
@type x: int
|
||||
@type y: int
|
||||
@param x: The lower left x (horizontal) coordinate of the button.
|
||||
@param y: The lower left y (vertical) coordinate of the button.
|
||||
@type width: int
|
||||
@type height: int
|
||||
@param width: The button width.
|
||||
@param height: The button height.
|
||||
@type initial: string
|
||||
@param initial: The string to display initially.
|
||||
@type length: int
|
||||
@param length: The maximum input length.
|
||||
@type tooltip: string
|
||||
@param tooltip: The button's tooltip (the string that appears when the mouse
|
||||
is kept over the button).
|
||||
@rtype: Blender Button
|
||||
@return: The Button created.
|
||||
"""
|
||||
|
||||
def GetStringWidth(string, fontsize = 'normal'):
|
||||
"""
|
||||
Get the width in pixels of a string.
|
||||
@type string: string
|
||||
@param string: A string.
|
||||
@type fontsize: string
|
||||
@param fontsize: The size of the font: 'normal', 'small' or 'tiny'.
|
||||
@rtype: int
|
||||
@return: The width of I{string} with the chosen I{fontsize}.
|
||||
"""
|
||||
|
||||
def Text(string, fontsize = 'normal'):
|
||||
"""
|
||||
Draw a string on the screen.
|
||||
@type string: string
|
||||
@param string: The text string to draw.
|
||||
@type fontsize: string
|
||||
@param fontsize: The size of the font: 'normal', 'small' or 'tiny'.
|
||||
@rtype: int
|
||||
@return: The width of I{string} drawn with the chosen I{fontsize}.
|
||||
"""
|
115
source/blender/python/api2_2x/doc/Image.py
Normal file
115
source/blender/python/api2_2x/doc/Image.py
Normal file
@@ -0,0 +1,115 @@
|
||||
# Blender.Image module and the Image PyType object
|
||||
|
||||
"""
|
||||
The Blender.Image submodule.
|
||||
|
||||
Image
|
||||
=====
|
||||
|
||||
This module provides access to B{Image} objects in Blender.
|
||||
|
||||
Example::
|
||||
import Blender
|
||||
from Blender import Image
|
||||
#
|
||||
image = Image.Load("/path/to/my/image.png") # load an image file
|
||||
print "Image from", image.getFilename(),
|
||||
print "loaded to obj", image.getName())
|
||||
image.setXRep(4) # set x tiling factor
|
||||
image.setYRep(2) # set y tiling factor
|
||||
print "All Images available now:", Image.Get()
|
||||
"""
|
||||
|
||||
def Load (filename):
|
||||
"""
|
||||
Load the image called 'filename' into an Image object.
|
||||
@type filename: string
|
||||
@param filename: The full path to the image file.
|
||||
@rtype: Blender Image
|
||||
@return: A Blender Image object with the data from I{filename}.
|
||||
"""
|
||||
|
||||
def New (name):
|
||||
"""
|
||||
Create a new Image object (not implemented yet!).
|
||||
@type name: string
|
||||
@param name: The name of the new Image object.
|
||||
@rtype: Blender Image
|
||||
@return: A new Blender Image object.
|
||||
@warn: This function wasn't implemented yet. It simply returns None.
|
||||
"""
|
||||
|
||||
def Get (name = None):
|
||||
"""
|
||||
Get the Image object(s) from Blender.
|
||||
@type name: string
|
||||
@param name: The name of the Image object.
|
||||
@rtype: Blender Image or a list of Blender Images
|
||||
@return: It depends on the I{name} parameter:
|
||||
- (name): The Image object called I{name}, None if not found;
|
||||
- (): A list with all Image objects in the current scene.
|
||||
"""
|
||||
|
||||
|
||||
class Image:
|
||||
"""
|
||||
The Image object
|
||||
================
|
||||
This object gives access to Images in Blender. In the future it will allow
|
||||
direct read/write access to their pixel buffers, too.
|
||||
@cvar name: The name of this Image object.
|
||||
@cvar filename: The filename (path) to the image file loaded into this Image
|
||||
object.
|
||||
@cvar xrep: Texture tiling: the number of repetitions in the x (horizontal)
|
||||
axis.
|
||||
@cvar yrep: Texture tiling: the number of repetitions in the y (vertical)
|
||||
axis.
|
||||
"""
|
||||
|
||||
def getName():
|
||||
"""
|
||||
Get the name of this Image object.
|
||||
@rtype: string
|
||||
"""
|
||||
|
||||
def getFilename():
|
||||
"""
|
||||
Get the filename of the image file loaded into this Image object.
|
||||
@rtype: string
|
||||
"""
|
||||
|
||||
def getXRep():
|
||||
"""
|
||||
Get the number of repetitions in the x (horizontal) axis for this Image.
|
||||
This is for texture tiling.
|
||||
@rtype: int
|
||||
"""
|
||||
|
||||
def getYRep():
|
||||
"""
|
||||
Get the number of repetitions in the y (vertical) axis for this Image.
|
||||
This is for texture tiling.
|
||||
@rtype: int
|
||||
"""
|
||||
|
||||
def setName(name):
|
||||
"""
|
||||
Set the name of this Image object.
|
||||
@type name: string
|
||||
@param name: The new name.
|
||||
"""
|
||||
|
||||
def setXRep(xrep):
|
||||
"""
|
||||
Texture tiling: set the number of x repetitions for this Image.
|
||||
@type xrep: int
|
||||
@param xrep: The new value in [1, 16].
|
||||
"""
|
||||
|
||||
def setYRep(yrep):
|
||||
"""
|
||||
Texture tiling: set the number of y repetitions for this Image.
|
||||
@type yrep: int
|
||||
@param yrep: The new value in [1, 16].
|
||||
"""
|
||||
|
@@ -34,8 +34,8 @@ def Get (name = None):
|
||||
@type name: string
|
||||
@param name: The name of the Lamp Data.
|
||||
@rtype: Blender Lamp or a list of Blender Lamps
|
||||
@return: It depends on the 'name' parameter:
|
||||
- (name): The Lamp Data object with the given name;
|
||||
@return: It depends on the I{name} parameter:
|
||||
- (name): The Lamp Data object with the given I{name};
|
||||
- (): A list with all Lamp Data objects in the current scene.
|
||||
"""
|
||||
|
||||
|
468
source/blender/python/api2_2x/doc/Material.py
Normal file
468
source/blender/python/api2_2x/doc/Material.py
Normal file
@@ -0,0 +1,468 @@
|
||||
# Blender.Material module and the Material PyObject
|
||||
|
||||
"""
|
||||
The Blender.Material submodule.
|
||||
|
||||
Material
|
||||
========
|
||||
|
||||
This module provides access to B{Material} objects in Blender.
|
||||
|
||||
Example::
|
||||
import Blender
|
||||
from Blender import Material
|
||||
mat = Material.New('newMat') # create a new Material called 'newMat'
|
||||
print mat.rgbCol # print its rgb color triplet
|
||||
mat.rgbCol = [0.8, 0.2, 0.2] # change its color
|
||||
mat.setAlpha(0.2) # mat.alpha = 0.2 -- almost transparent
|
||||
mat.emit = 0.7 # equivalent to mat.setEmit(0.8)
|
||||
mat.mode |= Material.Modes.ZTRANSP # turn on Z-Buffer transparency
|
||||
mat.setName('RedBansheeSkin') # change its name
|
||||
mat.setAdd(0.8) # make it glow
|
||||
mat.setMode('Halo') # turn 'Halo' "on" and all others "off"
|
||||
|
||||
@type Modes: readonly dictionary
|
||||
@var Modes: The available Material Modes.
|
||||
- TRACEABLE - Make Material visible for shadow lamps.
|
||||
- SHADOW - Enable Material for shadows.
|
||||
- SHADELESS - Make Material insensitive to light or shadow.
|
||||
- WIRE - Render only the edges of faces.
|
||||
- VCOL_LIGHT - Add vertex colors as extra light.
|
||||
- VCOL_PAINT - Replace basic colors with vertex colors.
|
||||
- HALO - Render as a halo.
|
||||
- ZTRANSP - Z-buffer transparent faces.
|
||||
- ZINVERT - Render with inverted Z-buffer.
|
||||
- - HALORINGS - Render rings over the basic halo.
|
||||
- ENV - Do not render Material.
|
||||
- - HALOLINES - Render star shaped lines over the basic halo.
|
||||
- ONLYSHADOW - Let alpha be determined on the degree of shadow.
|
||||
- - HALOXALPHA - Use extreme alpha.
|
||||
- TEXFACE - UV-Editor assigned texture gives color and texture info
|
||||
for faces.
|
||||
- - HALOSTAR - Render halo as a star.
|
||||
- NOMIST - Set the Material insensitive to mist.
|
||||
- - HALOSHADED - Let halo receive light.
|
||||
- HALOTEX - Give halo a texture.
|
||||
- HALOPUNO - Use the vertex normal to specify the dimension of the halo.
|
||||
- HALOFLARE - Render halo as a lens flare.
|
||||
|
||||
@warn: Some Modes are only available when the 'Halo' mode is I{off} and
|
||||
others only when it is I{on}. But these two subsets of modes share the same
|
||||
numerical values in their Blender C #defines. So, for example, if 'Halo' is
|
||||
on, then 'NoMist' is actually interpreted as 'HaloShaded'. We marked all
|
||||
such possibilities in the Modes dict below: each halo-related mode that
|
||||
uses an already taken value is preceded by "-" and appear below the normal
|
||||
mode which also uses that value.
|
||||
"""
|
||||
|
||||
def New (name = 'Mat'):
|
||||
"""
|
||||
Create a new Material object.
|
||||
@type name: string
|
||||
@param name: The Material name.
|
||||
@rtype: Blender Material
|
||||
@return: The created Material object.
|
||||
"""
|
||||
|
||||
def Get (name = None):
|
||||
"""
|
||||
Get the Material object(s) from Blender.
|
||||
@type name: string
|
||||
@param name: The name of the Material.
|
||||
@rtype: Blender Material or a list of Blender Materials
|
||||
@return: It depends on the 'name' parameter:
|
||||
- (name): The Material object with the given name;
|
||||
- (): A list with all Material objects in the current scene.
|
||||
"""
|
||||
|
||||
class Material:
|
||||
"""
|
||||
The Material object
|
||||
===================
|
||||
This object gives access to Materials in Blender.
|
||||
@cvar name: Material's name.
|
||||
@type mode: int
|
||||
@cvar mode: Mode flags as an or'ed int value. See the Modes dictionary keys
|
||||
and descriptions in L{Modes}.
|
||||
@cvar rgbCol: Material's RGB color triplet.
|
||||
@cvar ambCol: Ambient color rgb triplet.
|
||||
@cvar specCol: Specular color rgb triplet.
|
||||
@cvar mirCol: Mirror color rgb triplet.
|
||||
@cvar R: Red component of L{rgbCol} - [0.0, 1.0].
|
||||
@cvar G: Green component of L{rgbCol} - [0.0, 1.0].
|
||||
@cvar B: Blue component of L{rgbCol} - [0.0, 1.0].
|
||||
@cvar alpha: Alpha (translucency) component of the Material - [0.0, 1.0].
|
||||
@cvar amb: Ambient factor - [0.0, 1.0].
|
||||
@cvar emit: Emitting light intensity - [0.0, 1.0].
|
||||
@cvar ref: Reflectivity - [0.0, 1.0].
|
||||
@cvar spec: Specularity - [0.0, 2.0].
|
||||
@cvar specTransp: Specular transparency - [0.0, 1.0].
|
||||
@cvar add: Glow factor - [0.0, 1.0].
|
||||
@cvar zOffset: Artificial Z offset for faces - [0.0, 10.0].
|
||||
@cvar haloSize: Dimension of the halo - [0.0, 100.0].
|
||||
@cvar flareSize: Factor the flare is larger than the halo - [0.1, 25.0].
|
||||
@cvar flareBoost: Flare's extra strength - [0.1, 10.0].
|
||||
@cvar haloSeed: To use random values for ring dimension and line location -
|
||||
[0, 255].
|
||||
@cvar flareSeed: Offset in the seed table - [0, 255].
|
||||
@cvar subSize: Dimension of subflares, dots and circles - [0.1, 25.0].
|
||||
@cvar hard: Hardness of the specularity - [1, 255].
|
||||
@cvar nFlares: Number of halo subflares - [1, 32].
|
||||
@cvar nStars: Number of points on the halo stars - [3, 50].
|
||||
@cvar nLines: Number of star shaped lines on each halo - [0, 250].
|
||||
@cvar nRings: Number of halo rings - [0, 24].
|
||||
@warning: Most member variables assume values in some [Min, Max] interval.
|
||||
When trying to set them, the given parameter will be clamped to lie in
|
||||
that range: if val < Min, then val = Min, if val > Max, then val = Max.
|
||||
"""
|
||||
|
||||
def getName():
|
||||
"""
|
||||
Get the name of this Material object.
|
||||
@rtype: string
|
||||
"""
|
||||
|
||||
def setName(name):
|
||||
"""
|
||||
Set the name of this Material object.
|
||||
@type name: string
|
||||
@param name: The new name.
|
||||
"""
|
||||
|
||||
def getMode():
|
||||
"""
|
||||
Get this Material's mode flags.
|
||||
@rtype: int
|
||||
@return: B{OR'ed value}. Use the Modes dictionary to check which flags
|
||||
are 'on'.
|
||||
|
||||
Example::
|
||||
import Blender
|
||||
from Blender import Material
|
||||
flags = mymat.getMode()
|
||||
if flags & Material.Modes['HALO']:
|
||||
print "This material is rendered as a halo"
|
||||
else:
|
||||
print "Not a halo"
|
||||
"""
|
||||
|
||||
def setMode(m = None, m2 = None, m3 = None, and_so_on = None,
|
||||
up_to_21 = None):
|
||||
"""
|
||||
Set this Material's mode flags. Mode strings given are turned 'on'.
|
||||
Those not provided are turned 'off', so mat.setMode() -- without
|
||||
arguments -- turns off all mode flags for Material mat.
|
||||
@type m: string
|
||||
@param m: A mode flag. From 1 to 21 can be set at the same time.
|
||||
"""
|
||||
|
||||
def getRGBCol():
|
||||
"""
|
||||
Get the rgb color triplet.
|
||||
@rtype: list of 3 floats
|
||||
@return: [r, g, b]
|
||||
"""
|
||||
|
||||
def setRGBCol(rgb = None):
|
||||
"""
|
||||
Set the rgb color triplet. If B{rgb} is None, set the color to black.
|
||||
@type rgb: three floats or a list of three floats
|
||||
@param rgb: The rgb color values in [0.0, 1.0] as:
|
||||
- a list of three floats: setRGBCol ([r, g, b]) B{or}
|
||||
- three floats as separate parameters: setRGBCol (r,g,b).
|
||||
"""
|
||||
|
||||
def getAmbCol():
|
||||
"""
|
||||
Get the ambient color triplet.
|
||||
@rtype: list of 3 floats
|
||||
@return: [ambR, ambG, ambB]
|
||||
"""
|
||||
|
||||
def setAmbCol(rgb = None):
|
||||
"""
|
||||
Set the ambient color triplet. If B{rgb} is None, set the color to black.
|
||||
@type rgb: three floats or a list of three floats
|
||||
@param rgb: The rgb color values in [0.0, 1.0] as:
|
||||
- a list of three floats: setAmbCol ([r, g, b]) B{or}
|
||||
- three floats as separate parameters: setAmbCol (r,g,b).
|
||||
"""
|
||||
|
||||
def getSpecCol():
|
||||
"""
|
||||
Get the specular color triplet.
|
||||
@rtype: list of 3 floats
|
||||
@return: [specR, specG, specB]
|
||||
"""
|
||||
|
||||
def setSpecCol(rgb = None):
|
||||
"""
|
||||
Set the specular color triplet. If B{rgb} is None, set the color to black.
|
||||
@type rgb: three floats or a list of three floats
|
||||
@param rgb: The rgb color values in [0.0, 1.0] as:
|
||||
- a list of three floats: setSpecCol ([r, g, b]) B{or}
|
||||
- three floats as separate parameters: setSpecCol (r,g,b).
|
||||
"""
|
||||
|
||||
def getMirCol():
|
||||
"""
|
||||
Get the mirror color triplet.
|
||||
@rtype: list of 3 floats
|
||||
@return: [mirR, mirG, mirb]
|
||||
"""
|
||||
|
||||
def setMirCol(rgb = None):
|
||||
"""
|
||||
Set the mirror color triplet. If B{rgb} is None, set the color to black.
|
||||
@type rgb: three floats or a list of three floats
|
||||
@param rgb: The rgb color values in [0.0, 1.0] as:
|
||||
- a list of three floats: setMirCol ([r, g, b]) B{or}
|
||||
- three floats as separate parameters: setMirCol (r,g,b).
|
||||
"""
|
||||
|
||||
def getAlpha():
|
||||
"""
|
||||
Get the alpha (transparency) value.
|
||||
@rtype: float
|
||||
"""
|
||||
|
||||
def setAlpha(alpha):
|
||||
"""
|
||||
Set the alpha (transparency) value.
|
||||
@type alpha: float
|
||||
@param alpha: The new value in [0.0, 1.0].
|
||||
"""
|
||||
|
||||
def getAmb():
|
||||
"""
|
||||
Get the ambient color blend factor.
|
||||
@rtype: float
|
||||
"""
|
||||
|
||||
def setAmb(amb):
|
||||
"""
|
||||
Set the ambient color blend factor.
|
||||
@type amb: float
|
||||
@param amb: The new value in [0.0, 1.0].
|
||||
"""
|
||||
|
||||
def getEmit():
|
||||
"""
|
||||
Get the emitting light intensity.
|
||||
@rtype: float
|
||||
"""
|
||||
|
||||
def setEmit(emit):
|
||||
"""
|
||||
Set the emitting light intensity.
|
||||
@type emit: float
|
||||
@param emit: The new value in [0.0, 1.0].
|
||||
"""
|
||||
|
||||
def getRef():
|
||||
"""
|
||||
Get the reflectivity value.
|
||||
@rtype: float
|
||||
"""
|
||||
|
||||
def setRef(ref):
|
||||
"""
|
||||
Set the reflectivity value.
|
||||
@type ref: float
|
||||
@param ref: The new value in [0.0, 1.0].
|
||||
"""
|
||||
|
||||
def getSpec():
|
||||
"""
|
||||
Get the specularity value.
|
||||
@rtype: float
|
||||
"""
|
||||
|
||||
def setSpec(spec):
|
||||
"""
|
||||
Set the specularity value.
|
||||
@type spec: float
|
||||
@param spec: The new value in [0.0, 2.0].
|
||||
"""
|
||||
|
||||
def getSpecTransp():
|
||||
"""
|
||||
Get the specular transparency.
|
||||
@rtype: float
|
||||
"""
|
||||
|
||||
def setSpecTransp(spectransp):
|
||||
"""
|
||||
Set the specular transparency.
|
||||
@type spectransp: float
|
||||
@param spectransp: The new value in [0.0, 1.0].
|
||||
"""
|
||||
|
||||
def getAdd():
|
||||
"""
|
||||
Get the glow factor.
|
||||
@rtype: float
|
||||
"""
|
||||
|
||||
def setAdd(add):
|
||||
"""
|
||||
Set the glow factor.
|
||||
@type add: float
|
||||
@param add: The new value in [0.0, 1.0].
|
||||
"""
|
||||
|
||||
def getZOffset():
|
||||
"""
|
||||
Get the artificial offset for faces with this Material.
|
||||
@rtype: float
|
||||
"""
|
||||
|
||||
def setZOffset(zoffset):
|
||||
"""
|
||||
Set the artificial offset for faces with this Material.
|
||||
@type zoffset: float
|
||||
@param zoffset: The new value in [0.0, 10.0].
|
||||
"""
|
||||
|
||||
def getHaloSize():
|
||||
"""
|
||||
Get the halo size.
|
||||
@rtype: float
|
||||
"""
|
||||
|
||||
def setHaloSize(halosize):
|
||||
"""
|
||||
Set the halo size.
|
||||
@type halosize: float
|
||||
@param halosize: The new value in [0.0, 100.0].
|
||||
"""
|
||||
|
||||
def getHaloSeed():
|
||||
"""
|
||||
Get the seed for random ring dimension and line location in halos.
|
||||
@rtype: int
|
||||
"""
|
||||
|
||||
def setHaloSeed(haloseed):
|
||||
"""
|
||||
Set the seed for random ring dimension and line location in halos.
|
||||
@type haloseed: int
|
||||
@param haloseed: The new value in [0, 255].
|
||||
"""
|
||||
|
||||
def getFlareSize():
|
||||
"""
|
||||
Get the ratio: flareSize / haloSize.
|
||||
@rtype: float
|
||||
"""
|
||||
|
||||
def setFlareSize(flaresize):
|
||||
"""
|
||||
Set the ratio: flareSize / haloSize.
|
||||
@type flaresize: float
|
||||
@param flaresize: The new value in [0.1, 25.0].
|
||||
"""
|
||||
|
||||
def getFlareSeed():
|
||||
"""
|
||||
Get flare's offset in the seed table.
|
||||
@rtype: int
|
||||
"""
|
||||
|
||||
def setFlareSeed(flareseed):
|
||||
"""
|
||||
Set flare's offset in the seed table.
|
||||
@type flareseed: int
|
||||
@param flareseed: The new value in [0, 255].
|
||||
"""
|
||||
|
||||
def getFlareBoost():
|
||||
"""
|
||||
Get the flare's extra strength.
|
||||
@rtype: float
|
||||
"""
|
||||
|
||||
def setFlareBoost(flareboost):
|
||||
"""
|
||||
Set the flare's extra strength.
|
||||
@type flareboost: float
|
||||
@param flareboost: The new value in [0.1, 10.0].
|
||||
"""
|
||||
|
||||
def getSubSize():
|
||||
"""
|
||||
Get the dimension of subflare, dots and circles.
|
||||
@rtype: float
|
||||
"""
|
||||
|
||||
def setSubSize(subsize):
|
||||
"""
|
||||
Set the dimension of subflare, dots and circles.
|
||||
@type subsize: float
|
||||
@param subsize: The new value in [0.1, 25.0].
|
||||
"""
|
||||
|
||||
def getHardness():
|
||||
"""
|
||||
Get the hardness of the specularity.
|
||||
@rtype: int
|
||||
"""
|
||||
|
||||
def setHardness(hardness):
|
||||
"""
|
||||
Set the hardness of the specularity.
|
||||
@type hardness: int
|
||||
@param hardness: The new value in [1, 255].
|
||||
"""
|
||||
|
||||
def getNFlares():
|
||||
"""
|
||||
Get the number of halo subflares.
|
||||
@rtype: int
|
||||
"""
|
||||
|
||||
def setNFlares(nflares):
|
||||
"""
|
||||
Set the number of halo subflares.
|
||||
@type nflares: int
|
||||
@param nflares: The new value in [1, 32].
|
||||
"""
|
||||
|
||||
def getNStars():
|
||||
"""
|
||||
Get the number of points in the halo stars.
|
||||
@rtype: int
|
||||
"""
|
||||
|
||||
def setNStars(nstars):
|
||||
"""
|
||||
Set the number of points in the halo stars.
|
||||
@type nstars: int
|
||||
@param nstars: The new value in [3, 50].
|
||||
"""
|
||||
|
||||
def getNLines():
|
||||
"""
|
||||
Get the number of star shaped lines on each halo.
|
||||
@rtype: int
|
||||
"""
|
||||
|
||||
def setNLines(nlines):
|
||||
"""
|
||||
Set the number of star shaped lines on each halo.
|
||||
@type nlines: int
|
||||
@param nlines: The new value in [0, 250].
|
||||
"""
|
||||
|
||||
def getNRings():
|
||||
"""
|
||||
Get the number of rings on each halo.
|
||||
@rtype: int
|
||||
"""
|
||||
|
||||
def setNRings(nrings):
|
||||
"""
|
||||
Set the number of rings on each halo.
|
||||
@type nrings: int
|
||||
@param nrings: The new value in [0, 24].
|
||||
"""
|
297
source/blender/python/api2_2x/doc/NMesh.py
Normal file
297
source/blender/python/api2_2x/doc/NMesh.py
Normal file
@@ -0,0 +1,297 @@
|
||||
# Blender.NMesh module and the NMesh PyType object
|
||||
|
||||
"""
|
||||
The Blender.NMesh submodule.
|
||||
|
||||
Mesh Data
|
||||
=========
|
||||
|
||||
This module provides access to B{Mesh Data} objects in Blender.
|
||||
|
||||
Example::
|
||||
|
||||
import Blender
|
||||
from Blender import NMesh, Object, Scene
|
||||
#
|
||||
me = NMesh.GetRaw("Plane") # get the mesh data called "Plane"
|
||||
if me.materials:
|
||||
print me.materials # print the list of materials
|
||||
mat = me.materials[0] # grab the first material in the list
|
||||
mat.R = 1.0 # redefine its red component
|
||||
for v in me.verts: # loop the list of vertices
|
||||
v.co[0] *= 2.5 # multiply the coordinates
|
||||
v.co[1] *= 5.0
|
||||
v.co[2] *= 2.5
|
||||
me.update() # update the real mesh in Blender
|
||||
|
||||
@type FaceFlags: readonly dictionary
|
||||
@type FaceModes: readonly dictionary
|
||||
@type FaceTranspModes: readonly dictionary
|
||||
@var FaceFlags: The available face selection flags:
|
||||
- SELECT - selected.
|
||||
- HIDE - hidden.
|
||||
- ACTIVE - the active face.
|
||||
@var FaceModes: The available face modes:
|
||||
- ALL - set all modes at once.
|
||||
- BILLBOARD - always orient after camera.
|
||||
- HALO - halo face, always point to camera.
|
||||
- DINAMYC - respond to collisions.
|
||||
- INVISIBLE - invisible face.
|
||||
- LIGHT - dinamyc lighting.
|
||||
- OBCOL - use object colour instead of vertex colours.
|
||||
- SHADOW - shadow type.
|
||||
- SHAREDVERT - apparently unused in Blender.
|
||||
- SHAREDCOL - shared vertex colours (per vertex).
|
||||
- TEX - has texture image.
|
||||
- TILES - uses tiled image.
|
||||
- TWOSIDE - two-sided face.
|
||||
@var FaceTranspModes: Note: these are ENUMS, they can't be combined (and'ed,
|
||||
or'ed, etc) like a bit vector. The available face transparency modes:
|
||||
- SOLID - draw solid.
|
||||
- ADD - add to background (halo).
|
||||
- ALPHA - draw with transparency.
|
||||
- SUB - subtract from background.
|
||||
"""
|
||||
|
||||
def Col(col = [255, 255, 255, 255]):
|
||||
"""
|
||||
Get a new mesh rgba color.
|
||||
@type col: list
|
||||
@param col: A list [red, green, blue, alpha] of int values in [0, 255].
|
||||
@rtype: NMCol
|
||||
@return: A new NMCol (mesh rgba color) object.
|
||||
"""
|
||||
|
||||
def Vert(x = 0, y = 0, z = 0):
|
||||
"""
|
||||
Get a new vertex object.
|
||||
@type x: float
|
||||
@type y: float
|
||||
@type z: float
|
||||
@param x: The x coordinate of the vertex.
|
||||
@param y: The y coordinate of the vertex.
|
||||
@param z: The z coordinate of the vertex.
|
||||
@rtype: NMVert
|
||||
@return: A new NMVert object.
|
||||
"""
|
||||
|
||||
def Face(vertexList = None):
|
||||
"""
|
||||
Get a new face object.
|
||||
@type vertexList: list
|
||||
@param vertexList: A list of B{up to 4} NMVerts (mesh vertex
|
||||
objects).
|
||||
@rtype: NMFace
|
||||
@return: A new NMFace object.
|
||||
"""
|
||||
|
||||
def New():
|
||||
"""
|
||||
Create a new mesh object.
|
||||
rtype: NMesh
|
||||
@return: A new (B{empty}) NMesh object.
|
||||
"""
|
||||
|
||||
def GetRaw(name = None):
|
||||
"""
|
||||
Get the mesh data object called I{name} from Blender.
|
||||
@type name: string
|
||||
@param name: The name of the mesh data object.
|
||||
@rtype: NMesh
|
||||
@return: It depends on the 'name' parameter:
|
||||
- (name) - The NMesh wrapper of the mesh called I{name},
|
||||
None if not found.
|
||||
- () - A new (empty) NMesh object.
|
||||
"""
|
||||
|
||||
def GetRawFromObject(name):
|
||||
"""
|
||||
Get the mesh data object from the Object in Blender called I{name}.
|
||||
@type name: string
|
||||
@param name: The name of an Object of type "Mesh".
|
||||
@rtype: NMesh
|
||||
@return: The NMesh wrapper of the mesh data from the Object called I{name}.
|
||||
"""
|
||||
|
||||
def PutRaw(nmesh, name = None, recalculate_normals = 1):
|
||||
"""
|
||||
Put an NMesh object back in Blender.
|
||||
@type nmesh: NMesh
|
||||
@type name: string
|
||||
@type recalculate_normals: int
|
||||
@param name: The name of the mesh data object in Blender which will receive
|
||||
this nmesh data. It can be an existing mesh data object or a new one.
|
||||
@param recalculate_normals: If non-zero, the vertex normals for the mesh will
|
||||
be recalculated.
|
||||
@rtype: None or Object
|
||||
@return: It depends on the 'name' parameter:
|
||||
- I{name} refers to an existing mesh data obj already linked to an
|
||||
object: return None.
|
||||
- I{name} refers to a new mesh data obj or an unlinked (no users) one:
|
||||
return the created Blender Object wrapper.
|
||||
"""
|
||||
|
||||
class NMCol:
|
||||
"""
|
||||
The NMCol object
|
||||
================
|
||||
This object is a list of ints: [r, g, b, a] representing an
|
||||
rgba colour.
|
||||
@cvar r: The Red component in [0, 255].
|
||||
@cvar g: The Green component in [0, 255].
|
||||
@cvar b: The Blue component in [0, 255].
|
||||
@cvar a: The Alpha (transparency) component in [0, 255].
|
||||
"""
|
||||
|
||||
class NMVert:
|
||||
"""
|
||||
The NMVert object
|
||||
=================
|
||||
This object holds mesh vertex data.
|
||||
@cvar co: The vertex coordinates (x, y, z).
|
||||
@cvar no: The vertex normal vector (nx, ny, nz).
|
||||
@cvar uvco: The vertex texture "sticky" coordinates.
|
||||
@cvar index: The vertex index, if owned by a mesh.
|
||||
"""
|
||||
|
||||
class NMFace:
|
||||
"""
|
||||
The NMFace object
|
||||
=================
|
||||
This object holds mesh face data.
|
||||
@type v: list
|
||||
@cvar v: The list of face vertices (B{up to 4}).
|
||||
@cvar col: The list of vertex colours.
|
||||
@cvar mat: Same as I{materialIndex} below.
|
||||
@cvar materialIndex: The index of this face's material in its NMesh materials
|
||||
list.
|
||||
@cvar smooth: If non-zero, the vertex normals are averaged to make this
|
||||
face look smooth.
|
||||
@cvar image: The Image used as a texture for this face.
|
||||
@cvar mode: The display mode (see L{Mesh.FaceModes<FaceModes>})
|
||||
@cvar flag: Bit vector specifying selection flags
|
||||
(see L{NMesh.FaceFlags<FaceFlags>}).
|
||||
@cvar transp: Transparency mode bit vector
|
||||
(see L{NMesh.FaceTranspModes<FaceTranspModes>}).
|
||||
@cvar uv: List of per-face UV coordinates: [(u0, v0), (u1, v1), ...].
|
||||
"""
|
||||
|
||||
def append(vertex):
|
||||
"""
|
||||
Append a vertex to this face's vertex list.
|
||||
@type vertex: NMVert
|
||||
@param vertex: An NMVert object.
|
||||
"""
|
||||
|
||||
class NMesh :
|
||||
"""
|
||||
The NMesh Data object
|
||||
=====================
|
||||
This object gives access to mesh data in Blender. We refer to mesh as the
|
||||
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 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).
|
||||
"""
|
||||
|
||||
def hasVertexColours(flag = None):
|
||||
"""
|
||||
Get (and optionally set) if this NMesh has vertex colours.
|
||||
@type flag: int
|
||||
@param flag: If given and non-zero, the "vertex colour" flag for this NMesh
|
||||
is turned I{on}.
|
||||
@rtype: bool
|
||||
@return: The current value of the "vertex colour" flag.
|
||||
@warn: If a mesh has both vertex colours and textured faces, this function
|
||||
will return False. This is due to the way Blender deals internally with
|
||||
the vertex colours array (if there are textured faces, it is copied to
|
||||
the textured face structure and the original array is freed/deleted).
|
||||
If you want to know if a mesh has both textured faces and vertex
|
||||
colours, set *in Blender* the "VCol Paint" flag for each material that
|
||||
covers an area that was also vertex painted and then check in your
|
||||
Python script if that material flag is set. Of course also tell others
|
||||
who use your script to do the same. The "VCol Paint" material mode flag
|
||||
is the way to tell Blender itself to render with vertex colours, too, so
|
||||
it's a natural solution.
|
||||
"""
|
||||
|
||||
def hasFaceUV(flag = None):
|
||||
"""
|
||||
Get (and optionally set) if this NMesh has UV-mapped textured faces.
|
||||
@type flag: int
|
||||
@param flag: If given and non-zero, the "textured faces" flag for this
|
||||
NMesh is turned I{on}.
|
||||
@rtype: bool
|
||||
@return: The current value of the "textured faces" flag.
|
||||
"""
|
||||
|
||||
def hasVertexUV(flag = None):
|
||||
"""
|
||||
Get (and optionally set) the "sticky" flag that controls if a mesh has
|
||||
per vertex UV coordinates.
|
||||
@type flag: int
|
||||
@param flag: If given and non-zero, the "sticky" flag for this NMesh is
|
||||
turned I{on}.
|
||||
@rtype: bool
|
||||
@return: The current value of the "sticky" flag.
|
||||
"""
|
||||
|
||||
def getActiveFace():
|
||||
"""
|
||||
Get the index of the active face.
|
||||
@rtype: int
|
||||
@return: The index of the active face.
|
||||
"""
|
||||
|
||||
def getSelectedFaces(flag = None):
|
||||
"""
|
||||
Get list of selected faces.
|
||||
@type flag: int
|
||||
@param flag: If given and non-zero, the list will have indices instead of
|
||||
the NMFace objects themselves.
|
||||
@rtype: list
|
||||
@return: It depends on the I{flag} parameter:
|
||||
- if None or zero: List of NMFace objects.
|
||||
- if non-zero: List of indices to NMFace objects.
|
||||
"""
|
||||
|
||||
def getVertexInfluences(index):
|
||||
"""
|
||||
Get influences of bones in a specific vertex.
|
||||
@type index: int
|
||||
@param index: The index of a vertex.
|
||||
@rtype: list
|
||||
@return: List of pairs (name, weight), where name is the bone name (string)
|
||||
and its weight is a float value.
|
||||
"""
|
||||
|
||||
def insertKey(frame = None):
|
||||
"""
|
||||
Insert a mesh key at the given frame.
|
||||
@type frame: int
|
||||
@param frame: The Scene frame where the mesh key should be inserted. If
|
||||
None, the current frame is used.
|
||||
"""
|
||||
|
||||
def removeAllKeys():
|
||||
"""
|
||||
Remove all mesh keys stored in this mesh.
|
||||
@rtype: bool
|
||||
@return: True if succesful or False if this NMesh wasn't linked to a real
|
||||
Blender Mesh yet (or was, but the Mesh had no keys).
|
||||
@warn: Currently the mesh keys from meshs that are grabbed with
|
||||
NMesh.GetRaw() or .GetRawFromObject() are preserved, so if you want to
|
||||
clear them or don't want them at all, remember to call this method. Of
|
||||
course NMeshes created with NMesh.New() don't have mesh keys until you
|
||||
add them.
|
||||
"""
|
||||
|
||||
def update():
|
||||
"""
|
||||
Update the mesh in Blender. The changes made are put back to the mesh in
|
||||
Blender, if available, or put in a newly created mesh object if this NMesh
|
||||
wasn't linked to one, yet.
|
||||
"""
|
193
source/blender/python/api2_2x/doc/Scene.py
Normal file
193
source/blender/python/api2_2x/doc/Scene.py
Normal file
@@ -0,0 +1,193 @@
|
||||
# Blender.Scene module and the Scene PyType object
|
||||
|
||||
"""
|
||||
The Blender.Scene submodule.
|
||||
|
||||
Scene
|
||||
=====
|
||||
|
||||
This module provides access to B{Scenes} in Blender.
|
||||
|
||||
Example::
|
||||
|
||||
"""
|
||||
|
||||
def New (name = 'Scene'):
|
||||
"""
|
||||
Create a new Scene in Blender.
|
||||
@type name: string
|
||||
@param name: The Scene name.
|
||||
@rtype: Blender Scene
|
||||
@return: The created Scene.
|
||||
"""
|
||||
|
||||
def Get (name = None):
|
||||
"""
|
||||
Get the Scene(s) from Blender.
|
||||
@type name: string
|
||||
@param name: The name of a Scene.
|
||||
@rtype: Blender Scene or a list of Blender Scenes
|
||||
@return: It depends on the I{name} parameter:
|
||||
- (name): The Scene with the given I{name};
|
||||
- (): A list with all Scenes currently in Blender.
|
||||
"""
|
||||
|
||||
def GetCurrent():
|
||||
"""
|
||||
Get the currently active Scene in Blender.
|
||||
@rtype: Blender Scene
|
||||
@return: The currently active Scene.
|
||||
"""
|
||||
|
||||
def Unlink(scene):
|
||||
"""
|
||||
Unlink (delete) a Scene from Blender.
|
||||
@type scene: Blender Scene
|
||||
@param scene: The Scene to be unlinked.
|
||||
"""
|
||||
|
||||
class Scene:
|
||||
"""
|
||||
The Scene object
|
||||
================
|
||||
This object gives access to Scene data in Blender.
|
||||
@cvar name: The Scene name.
|
||||
"""
|
||||
|
||||
def getName():
|
||||
"""
|
||||
Get the name of this Scene.
|
||||
@rtype: string
|
||||
"""
|
||||
|
||||
def setName(name):
|
||||
"""
|
||||
Set the name of this Scene.
|
||||
@type name: string
|
||||
@param name: The new name.
|
||||
"""
|
||||
|
||||
def getWinSize():
|
||||
"""
|
||||
Get the current x,y resolution of the render window. These are the
|
||||
dimensions of the image created by the Blender Renderer.
|
||||
@rtype: list
|
||||
@return: [width, height].
|
||||
"""
|
||||
|
||||
def setWinSize(dimensions):
|
||||
"""
|
||||
Set the width and height of the render window. These are the dimensions
|
||||
of the image created by the Blender Renderer.
|
||||
@type dimensions: list
|
||||
@param dimensions: The new [width, height] values.
|
||||
"""
|
||||
|
||||
def copy(duplicate_objects = 1):
|
||||
"""
|
||||
Make a copy of this Scene.
|
||||
@type duplicate_objects: int
|
||||
@param duplicate_objects: Defines how the Scene children are duplicated:
|
||||
- 0: Link Objects;
|
||||
- 1: Link Object Data;
|
||||
- 2: Full copy.
|
||||
@rtype: Scene
|
||||
@return: The copied Blender Scene.
|
||||
"""
|
||||
|
||||
def startFrame(frame = None):
|
||||
"""
|
||||
Get (and optionally set) the start frame value.
|
||||
@type frame: int
|
||||
@param frame: The start frame. If None, this method simply returns the
|
||||
current start frame.
|
||||
@rtype: int
|
||||
@return: The start frame value.
|
||||
"""
|
||||
|
||||
def endFrame(frame = None):
|
||||
"""
|
||||
Get (and optionally set) the end frame value.
|
||||
@type frame: int
|
||||
@param frame: The end frame. If None, this method simply returns the
|
||||
current end frame.
|
||||
@rtype: int
|
||||
@return: The end frame value.
|
||||
"""
|
||||
|
||||
def currentFrame(frame = None):
|
||||
"""
|
||||
Get (and optionally set) the current frame value.
|
||||
@type frame: int
|
||||
@param frame: The current frame. If None, this method simply returns the
|
||||
current frame value.
|
||||
@rtype: int
|
||||
@return: The current frame value.
|
||||
"""
|
||||
|
||||
def frameSettings(start = None, end = None, current = None):
|
||||
"""
|
||||
Get (and optionally set) the start, end and current frame values.
|
||||
@type start: int
|
||||
@type end: int
|
||||
@type current: int
|
||||
@param start: The start frame value.
|
||||
@param end: The end frame value.
|
||||
@param current: The current frame value.
|
||||
@rtype: tuple
|
||||
@return: The frame values in a tuple: [start, end, current].
|
||||
"""
|
||||
|
||||
def makeCurrent():
|
||||
"""
|
||||
Make this Scene the currently active one in Blender.
|
||||
"""
|
||||
|
||||
def link(object):
|
||||
"""
|
||||
Link an Object to this Scene.
|
||||
@type object: Blender Object
|
||||
@param object: A Blender Object.
|
||||
"""
|
||||
|
||||
def unlink(object):
|
||||
"""
|
||||
Unlink an Object from this Scene.
|
||||
@type object: Blender Object
|
||||
@param object: A Blender Object.
|
||||
"""
|
||||
|
||||
def getRenderdir():
|
||||
"""
|
||||
Get the current directory where rendered images are saved.
|
||||
@rtype: string
|
||||
@return: The path to the current render dir
|
||||
"""
|
||||
|
||||
def getBackbufdir():
|
||||
"""
|
||||
Get the location of the backbuffer image.
|
||||
@rtype: string
|
||||
@return: The path to the chosen backbuffer image.
|
||||
"""
|
||||
|
||||
def getChildren():
|
||||
"""
|
||||
Get all objects linked to this Scene.
|
||||
@rtype: list
|
||||
@return: A list with all Blender Objects linked to this Scene.
|
||||
"""
|
||||
|
||||
def getCurrentCamera():
|
||||
"""
|
||||
Get the currently active Camera for this Scene.
|
||||
@rtype: Blender Camera
|
||||
@return: The currently active Camera.
|
||||
"""
|
||||
|
||||
def setCurrentCamera(camera):
|
||||
"""
|
||||
Set the currently active Camera in this Scene.
|
||||
@type camera: Blender Camera
|
||||
@param camera: The new active Camera.
|
||||
"""
|
53
source/blender/python/api2_2x/doc/Types.py
Normal file
53
source/blender/python/api2_2x/doc/Types.py
Normal file
@@ -0,0 +1,53 @@
|
||||
# The Blender.Types submodule
|
||||
|
||||
"""
|
||||
The Blender.Types submodule
|
||||
===========================
|
||||
|
||||
This module is a dictionary of Blender Python types, for type checking.
|
||||
|
||||
Example::
|
||||
|
||||
import Blender
|
||||
from Blender import Types, Object, NMesh, Camera, Lamp
|
||||
#
|
||||
objs = Object.Get() # a list of all objects in the current scene
|
||||
for o in objs:
|
||||
print
|
||||
print o, type(o)
|
||||
data = o.getData()
|
||||
print type(data)
|
||||
if type(data) == Types.NMeshType:
|
||||
if len(data.verts):
|
||||
print "its vertices are obviously of type:", type(data.verts[0])
|
||||
print "and its faces:", Types.NMFaceType
|
||||
elif type(data) == Types.CameraType:
|
||||
print "It's a Camera."
|
||||
elif type(data) == Types.LampType:
|
||||
print "Let there be light!"
|
||||
|
||||
@var ObjectType: Blender Object. The base object, linked to its specific data
|
||||
at its .data member variable.
|
||||
@var NMeshType: Blender NMesh. The mesh structure.
|
||||
@var NMFaceType: Blender NMFace. A mesh face, with one (a point), two (an edge),
|
||||
three (a triangular face) or four (a quad face) vertices.
|
||||
@var NMVertType: Blender NMVert. A mesh vertex.
|
||||
@var NMColType: Blender NMCol. A mesh rgba colour.
|
||||
@var ArmatureType: Blender Armature. The "skeleton", for animating and deforming
|
||||
objects.
|
||||
@var BoneType: Blender Bone. Bones are, obviously, the "pieces" of an Armature.
|
||||
@var CurveType: Blender Curve.
|
||||
@var IpoType: Blender Ipo.
|
||||
@var MetaballType: Blender Metaball.
|
||||
@var CameraType: Blender Camera.
|
||||
@var ImageType: Blender Image.
|
||||
@var LampType: Blender Lamp.
|
||||
@var TextType: Blender Text.
|
||||
@var MaterialType: Blender Material.
|
||||
@var SceneType: A Blender Scene. Container of all other objects.
|
||||
@var ButtonType: Blender Button. One of the Draw widgets.
|
||||
@var vectorType: Blender vector. Used in NMesh.
|
||||
@var bufferType: Blender buffer. A contiguous piece of storage, used in BGL.
|
||||
@var constantType: Blender constant. A constant dictionary.
|
||||
@var rgbTupleType: Blender rgbTuple. A (red, green, blue) triplet.
|
||||
"""
|
@@ -108,9 +108,10 @@ def ImageSelector (callback, title = 'SELECT IMAGE'):
|
||||
def DrawProgressBar (done, text):
|
||||
"""
|
||||
Draw a progress bar in the upper right corner of the screen. To cancel it
|
||||
prematurely, users can press the "Esc" key.
|
||||
prematurely, users can press the "Esc" key. Start it with done = 0 and end
|
||||
it with done = 1.
|
||||
@type done: float
|
||||
@param done: A float in [0, 1] that tells the advance in the progress
|
||||
@param done: A float in [0.0, 1.0] that tells the advance in the progress
|
||||
bar.
|
||||
@type text: string
|
||||
@param text: Info about what is currently being done "behind the scenes".
|
||||
|
Reference in New Issue
Block a user