46 #include "arraybuffer.h"
53 OSVERSIONINFO winVersion(
void)
56 ZeroMemory(&osvi,
sizeof(OSVERSIONINFO));
57 osvi.dwOSVersionInfoSize =
sizeof(OSVERSIONINFO);
76 G.world = PyList_New(0);
77 G.cameras = PyList_New(0);
83 G.clearColor[0] = 0.0;
84 G.clearColor[1] = 0.0;
85 G.clearColor[2] = 0.0;
86 G.clearColor[3] = 0.0;
93 G.resizeCallback = NULL;
94 G.mouseDownCallback = NULL;
95 G.mouseUpCallback = NULL;
96 G.mouseMovedCallback = NULL;
97 G.keyDownCallback = NULL;
98 G.keyUpCallback = NULL;
104 return Py_BuildValue(
"");
114 return Py_BuildValue(
"[i,i,i]", G.color_picked[0], G.color_picked[1], G.color_picked[2]);
124 SDL_GetMouseState(&x, &y);
125 return Py_BuildValue(
"[i,i]", x, y);
135 return Py_BuildValue(
"i", SDL_GetModState());
144 return Py_BuildValue(
"i,i", G.windowWidth, G.windowHeight);
156 if (!PyArg_ParseTuple(args,
"i", &useTimer))
162 return Py_BuildValue(
"");
176 return Py_BuildValue(
"");
189 return Py_BuildValue(
"");
199 static PyObject*
mh_redraw(PyObject *
self, PyObject *args)
202 if (!PyArg_ParseTuple(args,
"i", &async))
208 return Py_BuildValue(
"");
220 if (!PyArg_ParseTuple(args,
"i", &fullscreen))
223 return Py_BuildValue(
"");
229 if (!PyArg_ParseTuple(args,
"ffff", &r, &g, &b, &a))
232 return Py_BuildValue(
"");
246 if (!PyArg_ParseTuple(args,
"si", &filename, &texture))
248 else if (!(texture =
mhLoadTexture(filename, texture, NULL, NULL)))
251 return Py_BuildValue(
"i", texture);
257 char *vertexShaderSource;
258 if (!PyArg_ParseTuple(args,
"s", &vertexShaderSource))
263 return Py_BuildValue(
"i", shader);
270 if (!PyArg_ParseTuple(args,
"s", &source))
275 return Py_BuildValue(
"i", shader);
281 int vertexShader, fragmentShader;
282 if (!PyArg_ParseTuple(args,
"ii", &vertexShader, &fragmentShader))
284 else if (!(shader =
mhCreateShader(vertexShader, fragmentShader)))
287 return Py_BuildValue(
"i", shader);
292 int x, y, width, height;
295 if (!PyArg_ParseTuple(args,
"iiiiO", &x, &y, &width, &height, &path))
298 if (PyString_Check(path))
300 if (!
mhGrabScreen(x, y, width, height, PyString_AsString(path)))
303 else if (PyUnicode_Check(path))
305 path = PyUnicode_AsUTF8String(path);
306 if (!
mhGrabScreen(x, y, width, height, PyString_AsString(path)))
315 PyErr_SetString(PyExc_TypeError,
"String or Unicode object expected");
319 return Py_BuildValue(
"");
334 if (!PyArg_ParseTuple(args,
"iO", &milliseconds, &callback))
337 if (!PyCallable_Check(callback))
339 PyErr_SetString(PyExc_TypeError,
"Callable expected");
345 id = SDL_AddTimer(milliseconds,
mhTimerFunc, callback);
347 return Py_BuildValue(
"i",
id);
354 if (!PyArg_ParseTuple(args,
"i", &
id))
360 return Py_BuildValue(
"");
365 if (!PyCallable_Check(callback))
367 PyErr_SetString(PyExc_TypeError,
"Callable expected");
376 event.type = SDL_USEREVENT;
378 event.user.data1 = callback;
379 event.user.data2 = NULL;
381 SDL_PushEvent(&event);
384 return Py_BuildValue(
"");
389 if (!PyCallable_Check(callback))
391 PyErr_SetString(PyExc_TypeError,
"Callable expected");
397 if (G.resizeCallback)
398 Py_DECREF(G.resizeCallback);
400 G.resizeCallback = callback;
402 return Py_BuildValue(
"");
407 if (!PyCallable_Check(callback))
409 PyErr_SetString(PyExc_TypeError,
"Callable expected");
415 if (G.mouseDownCallback)
416 Py_DECREF(G.mouseDownCallback);
418 G.mouseDownCallback = callback;
420 return Py_BuildValue(
"");
425 if (!PyCallable_Check(callback))
427 PyErr_SetString(PyExc_TypeError,
"Callable expected");
433 if (G.mouseUpCallback)
434 Py_DECREF(G.mouseUpCallback);
436 G.mouseUpCallback = callback;
438 return Py_BuildValue(
"");
443 if (!PyCallable_Check(callback))
445 PyErr_SetString(PyExc_TypeError,
"Callable expected");
451 if (G.mouseMovedCallback)
452 Py_DECREF(G.mouseMovedCallback);
454 G.mouseMovedCallback = callback;
456 return Py_BuildValue(
"");
461 if (!PyCallable_Check(callback))
463 PyErr_SetString(PyExc_TypeError,
"Callable expected");
469 if (G.keyDownCallback)
470 Py_DECREF(G.keyDownCallback);
472 G.keyDownCallback = callback;
474 return Py_BuildValue(
"");
479 if (!PyCallable_Check(callback))
481 PyErr_SetString(PyExc_TypeError,
"Callable expected");
488 Py_DECREF(G.keyUpCallback);
490 G.keyUpCallback = callback;
492 return Py_BuildValue(
"");
543 const char *path = NULL;
546 #define MAX_PATH 1024
556 if (PyString_Check(type))
557 typeStr = PyString_AsString(type);
558 else if (PyObject_Not(type))
562 PyErr_SetString(PyExc_TypeError,
"String expected");
566 typeStr = PyString_AsString(type);
569 if (0 == strcmp(typeStr,
"exports"))
571 path = osx_getExportPath();
573 else if (0 == strcmp(typeStr,
"models"))
575 path = osx_getModelPath();
577 else if (0 == strcmp(typeStr,
"grab"))
579 path = osx_getGrabPath();
581 else if (0 == strcmp(typeStr,
"render"))
583 path = osx_getRenderPath();
585 else if (0 == strcmp(typeStr,
""))
587 path = osx_getDocumentsPath();
591 PyErr_Format(PyExc_ValueError,
"Unknown value %s for getPath()!", typeStr);
598 #ifdef CSIDL_MYDOCUMENTS
599 hr = SHGetFolderPathW(NULL, CSIDL_MYDOCUMENTS, NULL, 0, path);
601 hr = SHGetFolderPathW(NULL, CSIDL_PERSONAL, NULL, 0, path);
606 PyErr_SetFromWindowsErr(0);
610 if (0 == strcmp(typeStr,
"exports"))
612 wcscat(path, L
"\\makehuman\\exports\\");
614 else if (0 == strcmp(typeStr,
"models"))
616 wcscat(path, L
"\\makehuman\\models\\");
618 else if (0 == strcmp(typeStr,
"grab"))
620 wcscat(path, L
"\\makehuman\\grab\\");
622 else if (0 == strcmp(typeStr,
"render"))
624 wcscat(path, L
"\\makehuman\\render\\");
626 else if (0 == strcmp(typeStr,
""))
628 wcscat(path, L
"\\makehuman\\");
632 PyErr_Format(PyExc_ValueError,
"Unknown value %s for getPath()!", typeStr);
638 char *home = getenv(
"HOME");
644 if (0 == strcmp(typeStr,
"exports"))
646 strcat(path,
"/makehuman/exports/");
648 else if (0 == strcmp(typeStr,
"models"))
650 strcat(path,
"/makehuman/models/");
652 else if (0 == strcmp(typeStr,
"grab"))
654 strcat(path,
"/makehuman/grab/");
656 else if (0 == strcmp(typeStr,
"render"))
658 strcat(path,
"/makehuman/render/");
660 else if (0 == strcmp(typeStr,
""))
662 strcat(path,
"/makehuman/");
666 PyErr_Format(PyExc_ValueError,
"Unknown property %s for getPath()!", typeStr);
673 PyErr_Format(PyExc_ValueError,
"Unknown value %s for getPath()!", typeStr);
677 return Py_BuildValue(
"u", path);
679 return Py_BuildValue(
"s", path);
717 {NULL, NULL, 0, NULL}
735 #ifdef MAKEHUMAN_AS_MODULE
736 PyMODINIT_FUNC initmh()
742 module = Py_InitModule3(
"mh", EmbMethods,
"makehuman as a module.");
747 RegisterArrayBuffer(module);
748 RegisterTypedArrayViews(module);
749 PyModule_AddObject(module,
"world", G.world);
750 PyModule_AddObject(module,
"cameras", G.cameras);
753 int main(
int argc,
char *argv[])
762 snprintf(str,
sizeof(str),
"execfile(\"%s\")", argv[1]);
766 strcpy(str,
"execfile(\"main.py\")");
769 int rc = osx_adjustWorkingDir(argv[0]);
773 rc = osx_adjustRenderEnvironment();
777 Py_SetProgramName(argv[0]);
780 if (!Py_IsInitialized())
782 printf(
"Could not initialize Python\n");
786 PyEval_InitThreads();
788 PySys_SetArgv(argc, argv);
791 module = Py_InitModule(
"mh", EmbMethods);
795 RegisterArrayBuffer(module);
796 RegisterTypedArrayViews(module);
797 PyModule_AddObject(module,
"world", G.world);
798 PyModule_AddObject(module,
"cameras", G.cameras);
800 #if defined(__GNUC__) && defined(__WIN32__)
801 PyRun_SimpleString(
"import sys\nfo = open(\"python_out.txt\", \"w\")\nsys.stdout = fo");
802 PyRun_SimpleString(
"import sys\nfe = open(\"python_err.txt\", \"w\")\nsys.stderr = fe");
803 err = PyRun_SimpleString(str);
804 PyRun_SimpleString(
"fo.close()");
805 PyRun_SimpleString(
"fe.close()");
807 err = PyRun_SimpleString(str);
812 printf(
"Could not run main Python script\n");
void RegisterCamera(PyObject *module)
Registers the Camera object in the Python environment.
int main(int argc, char *argv[])
The main function initializes the MakeHuman application.
static PyObject * mh_SetResizeCallback(PyObject *self, PyObject *callback)
void mhCreateWindow(int useTimer)
Create SDL window.
GLuint mhLoadTexture(const char *fname, GLuint texture, int *width, int *height)
Load a texture from a file and bind it into the textures array.
void mhShutDown(void)
Shutdown the MakeHuman Application.
static PyObject * mh_shutDown(PyObject *self, PyObject *unused)
End the GUI application.
static PyObject * mh_getMousePos(PyObject *self, PyObject *unused)
Get the current mouse x, y cursor position on the screen, in pixels. This function retrieves the x an...
GLuint mhCreateShader(GLuint vertexShader, GLuint fragmentShader)
static PyObject * mh_LoadTexture(PyObject *self, PyObject *args)
Load texture of an object from file.
GLuint mhCreateFragmentShader(const char *source)
static PyObject * mh_CreateVertexShader(PyObject *self, PyObject *args)
static PyObject * mh_SetMouseMovedCallback(PyObject *self, PyObject *callback)
static PyObject * mh_setFullscreen(PyObject *self, PyObject *args)
Sets the fullscreen state of the GUI window.
static PyObject * mh_startEventLoop(PyObject *self, PyObject *unused)
Start the event loop at application launch.
static PyObject * mh_getPath(PyObject *self, PyObject *type)
Gets program specific path locations. MakeHuman uses pathes to export objects and to (re)store export...
static PyObject * mh_removeTimer(PyObject *self, PyObject *args)
static PyObject * mh_getKeyModifiers(PyObject *self, PyObject *unused)
Get an integer representing the current modifier key settings.
static PyObject * mh_CreateFragmentShader(PyObject *self, PyObject *args)
void mhSetFullscreen(int fullscreen)
Set fullscreen mode.
static PyObject * mh_SetMouseDownCallback(PyObject *self, PyObject *callback)
void RegisterObject3D(PyObject *module)
Registers the Object3D object in the Python environment.
static PyObject * mh_startWindow(PyObject *self, PyObject *args)
Start the GUI window at application launch.
static PyObject * mh_setClearColor(PyObject *self, PyObject *args)
void mhDraw(void)
Draw all visible 3D objects.
static PyObject * mh_GrabScreen(PyObject *self, PyObject *args)
GLuint mhCreateVertexShader(const char *source)
static PyObject * mh_callAsync(PyObject *self, PyObject *callback)
static PyObject * mh_getWindowSize(PyObject *self, PyObject *unused)
Get the current window (viewport) width and height in pixels. This function retrieves the current wid...
static PyObject * mh_updatePickingBuffer(PyObject *self, PyObject *unused)
void RegisterTexture(PyObject *module)
Registers the Texture object in the Python environment.
static PyObject * mh_SetMouseUpCallback(PyObject *self, PyObject *callback)
static PyObject * mh_SetKeyUpCallback(PyObject *self, PyObject *callback)
static PyObject * mh_SetKeyDownCallback(PyObject *self, PyObject *callback)
void mhQueueUpdate(void)
Queue an update.
static PyMethodDef EmbMethods[]
Defines a set of functions as an array that can be passed into the Py_InitModule function.
void UpdatePickingBuffer(void)
static void initGlobals(void)
Initialize Globals.
void mhEventLoop(void)
Start the event loop to manage the MakeHuman GUI.
void setClearColor(float r, float g, float b, float a)
int mhGrabScreen(int x, int y, int width, int height, const char *filename)
Capture a rectangular area from the screen into an image file.
unsigned int mhTimerFunc(unsigned int interval, void *param)
Pass a timer callback event up to Python.
static PyObject * mh_CreateShader(PyObject *self, PyObject *args)
static PyObject * mh_redraw(PyObject *self, PyObject *args)
Redraws the scene in the GUI window.
static PyObject * mh_getColorPicked(PyObject *self, PyObject *unused)
Get the RGB value of the color that has been picked.
static PyObject * mh_addTimer(PyObject *self, PyObject *args)
Adds a timer which will call a callback after the specified number of milliseconds has elapsed...