123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256 |
- /*
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * Contributor(s): Mitchell Stokes
- *
- * ***** END GPL LICENSE BLOCK *****
- */
- /** \file KX_LibLoadStatus.cpp
- * \ingroup bgeconv
- */
- #include "KX_LibLoadStatus.h"
- #include "PIL_time.h"
- KX_LibLoadStatus::KX_LibLoadStatus(class KX_BlenderSceneConverter* kx_converter,
- class KX_KetsjiEngine* kx_engine,
- class KX_Scene* merge_scene,
- const char *path) :
- m_converter(kx_converter),
- m_engine(kx_engine),
- m_mergescene(merge_scene),
- m_data(NULL),
- m_libname(path),
- m_progress(0.0f),
- m_finished(false)
- #ifdef WITH_PYTHON
- ,
- m_finish_cb(NULL),
- m_progress_cb(NULL)
- #endif
- {
- m_endtime = m_starttime = PIL_check_seconds_timer();
- }
- void KX_LibLoadStatus::Finish()
- {
- m_finished = true;
- m_progress = 1.f;
- m_endtime = PIL_check_seconds_timer();
- RunFinishCallback();
- RunProgressCallback();
- }
- void KX_LibLoadStatus::RunFinishCallback()
- {
- #ifdef WITH_PYTHON
- if (m_finish_cb) {
- PyObject* args = Py_BuildValue("(O)", GetProxy());
- if (!PyObject_Call(m_finish_cb, args, NULL)) {
- PyErr_Print();
- PyErr_Clear();
- }
- Py_DECREF(args);
- }
- #endif
- }
- void KX_LibLoadStatus::RunProgressCallback()
- {
- // Progess callbacks are causing threading problems with Python, so they're disabled for now
- #if 0
- #ifdef WITH_PYTHON
- if (m_progress_cb) {
- //PyGILState_STATE gstate = PyGILState_Ensure();
- PyObject* args = Py_BuildValue("(O)", GetProxy());
- if (!PyObject_Call(m_progress_cb, args, NULL)) {
- PyErr_Print();
- PyErr_Clear();
- }
- Py_DECREF(args);
- //PyGILState_Release(gstate);
- }
- #endif
- #endif
- }
- class KX_BlenderSceneConverter *KX_LibLoadStatus::GetConverter()
- {
- return m_converter;
- }
- class KX_KetsjiEngine *KX_LibLoadStatus::GetEngine()
- {
- return m_engine;
- }
- class KX_Scene *KX_LibLoadStatus::GetMergeScene()
- {
- return m_mergescene;
- }
- void KX_LibLoadStatus::SetLibName(const char *name)
- {
- m_libname = name;
- }
- const char *KX_LibLoadStatus::GetLibName()
- {
- return m_libname;
- }
- void KX_LibLoadStatus::SetData(void *data)
- {
- m_data = data;
- }
- void *KX_LibLoadStatus::GetData()
- {
- return m_data;
- }
- void KX_LibLoadStatus::SetProgress(float progress)
- {
- m_progress = progress;
- RunProgressCallback();
- }
- float KX_LibLoadStatus::GetProgress()
- {
- return m_progress;
- }
- void KX_LibLoadStatus::AddProgress(float progress)
- {
- m_progress += progress;
- RunProgressCallback();
- }
- #ifdef WITH_PYTHON
- PyMethodDef KX_LibLoadStatus::Methods[] =
- {
- {NULL} //Sentinel
- };
- PyAttributeDef KX_LibLoadStatus::Attributes[] = {
- KX_PYATTRIBUTE_RW_FUNCTION("onFinish", KX_LibLoadStatus, pyattr_get_onfinish, pyattr_set_onfinish),
- // KX_PYATTRIBUTE_RW_FUNCTION("onProgress", KX_LibLoadStatus, pyattr_get_onprogress, pyattr_set_onprogress),
- KX_PYATTRIBUTE_FLOAT_RO("progress", KX_LibLoadStatus, m_progress),
- KX_PYATTRIBUTE_STRING_RO("libraryName", KX_LibLoadStatus, m_libname),
- KX_PYATTRIBUTE_RO_FUNCTION("timeTaken", KX_LibLoadStatus, pyattr_get_timetaken),
- KX_PYATTRIBUTE_BOOL_RO("finished", KX_LibLoadStatus, m_finished),
- { NULL } //Sentinel
- };
- PyTypeObject KX_LibLoadStatus::Type = {
- PyVarObject_HEAD_INIT(NULL, 0)
- "KX_LibLoadStatus",
- sizeof(PyObjectPlus_Proxy),
- 0,
- py_base_dealloc,
- 0,
- 0,
- 0,
- 0,
- py_base_repr,
- 0,0,0,0,0,0,0,0,0,
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
- 0,0,0,0,0,0,0,
- Methods,
- 0,
- 0,
- &PyObjectPlus::Type,
- 0,0,0,0,0,0,
- py_base_new
- };
- PyObject* KX_LibLoadStatus::pyattr_get_onfinish(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
- {
- KX_LibLoadStatus* self = static_cast<KX_LibLoadStatus*>(self_v);
-
- if (self->m_finish_cb) {
- Py_INCREF(self->m_finish_cb);
- return self->m_finish_cb;
- }
- Py_RETURN_NONE;
- }
- int KX_LibLoadStatus::pyattr_set_onfinish(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
- {
- KX_LibLoadStatus* self = static_cast<KX_LibLoadStatus*>(self_v);
- if (!PyCallable_Check(value)) {
- PyErr_SetString(PyExc_TypeError, "KX_LibLoadStatus.onFinished requires a callable object");
- return PY_SET_ATTR_FAIL;
- }
- if (self->m_finish_cb)
- Py_DECREF(self->m_finish_cb);
- Py_INCREF(value);
- self->m_finish_cb = value;
- return PY_SET_ATTR_SUCCESS;
- }
- PyObject* KX_LibLoadStatus::pyattr_get_onprogress(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
- {
- KX_LibLoadStatus* self = static_cast<KX_LibLoadStatus*>(self_v);
-
- if (self->m_progress_cb) {
- Py_INCREF(self->m_progress_cb);
- return self->m_progress_cb;
- }
- Py_RETURN_NONE;
- }
- int KX_LibLoadStatus::pyattr_set_onprogress(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
- {
- KX_LibLoadStatus* self = static_cast<KX_LibLoadStatus*>(self_v);
- if (!PyCallable_Check(value)) {
- PyErr_SetString(PyExc_TypeError, "KX_LibLoadStatus.onProgress requires a callable object");
- return PY_SET_ATTR_FAIL;
- }
- if (self->m_progress_cb)
- Py_DECREF(self->m_progress_cb);
- Py_INCREF(value);
- self->m_progress_cb = value;
- return PY_SET_ATTR_SUCCESS;
- }
- PyObject* KX_LibLoadStatus::pyattr_get_timetaken(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
- {
- KX_LibLoadStatus* self = static_cast<KX_LibLoadStatus*>(self_v);
- return PyFloat_FromDouble(self->m_endtime - self->m_starttime);
- }
- #endif // WITH_PYTHON
|