2022-02-11 09:07:11 +11:00
|
|
|
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
2007-12-24 18:53:37 +00:00
|
|
|
|
2019-02-18 08:08:12 +11:00
|
|
|
/** \file
|
|
|
|
* \ingroup python
|
2011-02-21 06:58:46 +00:00
|
|
|
*/
|
|
|
|
|
2012-02-17 18:59:41 +00:00
|
|
|
#pragma once
|
2007-12-24 18:53:37 +00:00
|
|
|
|
2021-02-24 11:57:29 -03:00
|
|
|
struct ARegionType;
|
2021-07-16 11:48:54 +10:00
|
|
|
struct AnimationEvalContext;
|
2009-02-15 23:28:30 +00:00
|
|
|
struct ChannelDriver; /* DNA_anim_types.h */
|
2019-01-28 21:08:24 +11:00
|
|
|
struct ID; /* DNA_ID.h */
|
2007-12-24 18:53:37 +00:00
|
|
|
struct ListBase; /* DNA_listBase.h */
|
2019-01-28 21:08:24 +11:00
|
|
|
struct Object; /* DNA_object_types.h */
|
|
|
|
struct PathResolvedRNA;
|
|
|
|
struct Text; /* defined in DNA_text_types.h */
|
2007-12-24 18:53:37 +00:00
|
|
|
struct bConstraint; /* DNA_constraint_types.h */
|
|
|
|
struct bConstraintOb; /* DNA_constraint_types.h */
|
2021-07-23 16:56:00 +10:00
|
|
|
struct bConstraintTarget; /* DNA_constraint_types.h */
|
2008-12-21 10:36:29 +00:00
|
|
|
struct bContext;
|
2009-11-10 16:18:54 +00:00
|
|
|
struct bContextDataResult;
|
2019-01-28 21:08:24 +11:00
|
|
|
struct bPythonConstraint; /* DNA_constraint_types.h */
|
2021-02-24 11:57:29 -03:00
|
|
|
struct wmWindowManager;
|
2009-06-22 18:19:18 +00:00
|
|
|
|
2020-05-08 18:16:39 +02:00
|
|
|
#include "BLI_utildefines.h"
|
|
|
|
|
2007-12-24 18:53:37 +00:00
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
2011-01-05 02:08:54 +00:00
|
|
|
void BPY_pyconstraint_exec(struct bPythonConstraint *con,
|
|
|
|
struct bConstraintOb *cob,
|
|
|
|
struct ListBase *targets);
|
2009-11-20 15:01:09 +00:00
|
|
|
// void BPY_pyconstraint_settings(void *arg1, void *arg2);
|
2011-01-05 02:08:54 +00:00
|
|
|
void BPY_pyconstraint_target(struct bPythonConstraint *con, struct bConstraintTarget *ct);
|
|
|
|
void BPY_pyconstraint_update(struct Object *owner, struct bConstraint *con);
|
|
|
|
int BPY_is_pyconstraint(struct Text *text);
|
2009-11-20 15:01:09 +00:00
|
|
|
// void BPY_free_pyconstraint_links(struct Text *text);
|
2011-10-31 06:13:20 +00:00
|
|
|
|
2013-12-17 18:44:56 +11:00
|
|
|
/* global interpreter lock */
|
|
|
|
|
|
|
|
typedef void *BPy_ThreadStatePtr;
|
|
|
|
|
2021-12-02 17:24:04 +11:00
|
|
|
/**
|
|
|
|
* Analogue of #PyEval_SaveThread()
|
|
|
|
*/
|
2013-12-17 18:44:56 +11:00
|
|
|
BPy_ThreadStatePtr BPY_thread_save(void);
|
2021-12-02 17:24:04 +11:00
|
|
|
/**
|
|
|
|
* Analogue of #PyEval_RestoreThread()
|
|
|
|
*/
|
2013-12-17 18:44:56 +11:00
|
|
|
void BPY_thread_restore(BPy_ThreadStatePtr tstate);
|
|
|
|
|
2022-03-15 15:27:52 +11:00
|
|
|
/** Our own wrappers to #Py_BEGIN_ALLOW_THREADS / #Py_END_ALLOW_THREADS */
|
2013-12-17 18:44:56 +11:00
|
|
|
#define BPy_BEGIN_ALLOW_THREADS \
|
|
|
|
{ \
|
|
|
|
BPy_ThreadStatePtr _bpy_saved_tstate = BPY_thread_save(); \
|
|
|
|
(void)0
|
|
|
|
#define BPy_END_ALLOW_THREADS \
|
|
|
|
BPY_thread_restore(_bpy_saved_tstate); \
|
|
|
|
} \
|
2019-04-17 06:17:24 +02:00
|
|
|
(void)0
|
|
|
|
|
2011-01-05 02:08:54 +00:00
|
|
|
void BPY_text_free_code(struct Text *text);
|
2021-12-10 21:40:53 +11:00
|
|
|
/**
|
|
|
|
* Needed so the #Main pointer in `bpy.data` doesn't become out of date.
|
|
|
|
*/
|
2020-10-15 18:12:03 +11:00
|
|
|
void BPY_modules_update(void);
|
2011-01-05 02:08:54 +00:00
|
|
|
void BPY_modules_load_user(struct bContext *C);
|
2019-04-17 06:17:24 +02:00
|
|
|
|
2022-04-26 14:25:58 +10:00
|
|
|
void BPY_app_handlers_reset(bool do_all);
|
2019-04-17 06:17:24 +02:00
|
|
|
|
2021-12-02 17:24:04 +11:00
|
|
|
/**
|
2022-03-15 15:27:52 +11:00
|
|
|
* Update function, it gets rid of python-drivers global dictionary: `bpy.app.driver_namespace`,
|
|
|
|
* forcing #BPY_driver_exec to recreate it. Use this when loading a new `.blend` file
|
|
|
|
* so any variables setup by the previous blend file are cleared.
|
2021-12-02 17:24:04 +11:00
|
|
|
*/
|
2011-01-05 02:08:54 +00:00
|
|
|
void BPY_driver_reset(void);
|
2021-12-02 17:24:04 +11:00
|
|
|
|
|
|
|
/**
|
|
|
|
* This evaluates Python driver expressions, `driver_orig->expression`
|
|
|
|
* is a Python expression that should evaluate to a float number, which is returned.
|
|
|
|
*/
|
2018-06-11 20:00:03 +02:00
|
|
|
float BPY_driver_exec(struct PathResolvedRNA *anim_rna,
|
|
|
|
struct ChannelDriver *driver,
|
|
|
|
struct ChannelDriver *driver_orig,
|
T77086 Animation: Passing Dependency Graph to Drivers
Custom driver functions need access to the dependency graph that is
triggering the evaluation of the driver. This patch passes the
dependency graph pointer through all the animation-related calls.
Instead of passing the evaluation time to functions, the code now passes
an `AnimationEvalContext` pointer:
```
typedef struct AnimationEvalContext {
struct Depsgraph *const depsgraph;
const float eval_time;
} AnimationEvalContext;
```
These structs are read-only, meaning that the code cannot change the
evaluation time. Note that the `depsgraph` pointer itself is const, but
it points to a non-const depsgraph.
FCurves and Drivers can be evaluated at a different time than the
current scene time, for example when evaluating NLA strips. This means
that, even though the current time is stored in the dependency graph, we
need an explicit evaluation time.
There are two functions that allow creation of `AnimationEvalContext`
objects:
- `BKE_animsys_eval_context_construct(Depsgraph *depsgraph, float
eval_time)`, which creates a new context object from scratch, and
- `BKE_animsys_eval_context_construct_at(AnimationEvalContext
*anim_eval_context, float eval_time)`, which can be used to create a
`AnimationEvalContext` with the same depsgraph, but at a different
time. This makes it possible to later add fields without changing any
of the code that just want to change the eval time.
This also provides a fix for T75553, although it does require a change
to the custom driver function. The driver should call
`custom_function(depsgraph)`, and the function should use that depsgraph
instead of information from `bpy.context`.
Reviewed By: brecht, sergey
Differential Revision: https://developer.blender.org/D8047
2020-07-17 17:38:09 +02:00
|
|
|
const struct AnimationEvalContext *anim_eval_context);
|
2019-04-17 06:17:24 +02:00
|
|
|
|
2022-03-15 15:27:52 +11:00
|
|
|
/**
|
|
|
|
* Acquire the global-interpreter-lock (GIL) and wrap `Py_DECREF`.
|
|
|
|
* as there are some cases when this needs to be called outside the Python API code.
|
|
|
|
*/
|
|
|
|
void BPY_DECREF(void *pyob_ptr);
|
|
|
|
|
2012-10-26 10:54:02 +00:00
|
|
|
void BPY_DECREF_RNA_INVALIDATE(void *pyob_ptr);
|
2011-01-05 02:08:54 +00:00
|
|
|
int BPY_context_member_get(struct bContext *C,
|
|
|
|
const char *member,
|
|
|
|
struct bContextDataResult *result);
|
|
|
|
void BPY_context_set(struct bContext *C);
|
2021-12-10 21:40:53 +11:00
|
|
|
/**
|
|
|
|
* Use for updating while a python script runs - in case of file load.
|
|
|
|
*/
|
2012-05-08 22:07:06 +00:00
|
|
|
void BPY_context_update(struct bContext *C);
|
2019-04-17 06:17:24 +02:00
|
|
|
|
2020-09-17 18:23:12 +10:00
|
|
|
#define BPY_context_dict_clear_members(C, ...) \
|
|
|
|
BPY_context_dict_clear_members_array(&((C)->data.py_context), \
|
|
|
|
(C)->data.py_context_orig, \
|
|
|
|
((const char *[]){__VA_ARGS__}), \
|
|
|
|
VA_NARGS_COUNT(__VA_ARGS__))
|
2021-12-02 17:24:04 +11:00
|
|
|
/**
|
|
|
|
* Use for `CTX_*_set(..)` functions need to set values which are later read back as expected.
|
|
|
|
* In this case we don't want the Python context to override the values as it causes problems
|
|
|
|
* see T66256.
|
|
|
|
*
|
|
|
|
* \param dict_p: A pointer to #bContext.data.py_context so we can assign a new value.
|
|
|
|
* \param dict_orig: The value of #bContext.data.py_context_orig to check if we need to copy.
|
|
|
|
*
|
|
|
|
* \note Typically accessed via #BPY_context_dict_clear_members macro.
|
|
|
|
*/
|
2020-09-17 18:23:12 +10:00
|
|
|
void BPY_context_dict_clear_members_array(void **dict_p,
|
|
|
|
void *dict_orig,
|
|
|
|
const char *context_members[],
|
|
|
|
uint context_members_len);
|
|
|
|
|
2011-03-01 09:02:54 +00:00
|
|
|
void BPY_id_release(struct ID *id);
|
2019-04-17 06:17:24 +02:00
|
|
|
|
2021-12-10 21:40:53 +11:00
|
|
|
/**
|
|
|
|
* Avoids duplicating keyword list.
|
|
|
|
*/
|
2016-04-01 09:43:11 +11:00
|
|
|
bool BPY_string_is_keyword(const char *str);
|
|
|
|
|
2021-02-24 11:57:29 -03:00
|
|
|
/* bpy_rna_callback.c */
|
2022-03-15 15:27:52 +11:00
|
|
|
|
2021-02-24 11:57:29 -03:00
|
|
|
void BPY_callback_screen_free(struct ARegionType *art);
|
|
|
|
void BPY_callback_wm_free(struct wmWindowManager *wm);
|
|
|
|
|
Python i18n API. Many thanks to Campbell and Brecht for the reviews and suggestions!
This commit adds:
* A new bpy.app.translations module giving some info about locales/translation stuff (current active locale, all locales currently known by blender, all translation contexts currently defined, etc.).
* The ability for addons to feature translations, using the (un)register functions of above module.
* Also cleans up "translate py string when storing into RNA prop" by removing "PROP_TRANSLATE" string's subtype, and adding a PROP_STRING_PY_TRANSLATE flag instead (this way it is no more exposed to python...).
Addon translations work with py dictionaries: each addon features a dict {lang: {(context, message): translation, ...}, ...}, which is registered when the addon is enabled (and unregistered when disabled).
Then, when a key (context, message) is not found in regular mo catalog, a cache dict for current locale is built from all registered addon translations, and key is searched in it.
Note: currently addons writers have to do all the work by hand, will add something (probably extend "edit translation" addon) to automate messages extraction from addons soon(ish)! To get a look to expected behavior from addons, have a look at render_copy_settings/__init__.py and render_copy_settings/translations.py (rather stupid example currently, but...). Once we have a complete process, I'll also update relevant wiki pages.
2013-01-20 17:29:07 +00:00
|
|
|
/* I18n for addons */
|
|
|
|
#ifdef WITH_INTERNATIONAL
|
|
|
|
const char *BPY_app_translations_py_pgettext(const char *msgctxt, const char *msgid);
|
|
|
|
#endif
|
|
|
|
|
2007-12-24 18:53:37 +00:00
|
|
|
#ifdef __cplusplus
|
|
|
|
} /* extern "C" */
|
|
|
|
#endif
|