diff --git a/modules/gfx/pymod/__init__.py b/modules/gfx/pymod/__init__.py index bd5750d32178c50d2ce7758af2a053dd2ea4c0f1..eb3c91a168a46ac1b0b4cee671277f10b068762d 100644 --- a/modules/gfx/pymod/__init__.py +++ b/modules/gfx/pymod/__init__.py @@ -329,3 +329,60 @@ def _entity_reset(self,*args,**kwargs): self._reset3(eh,qr,qf) Entity.Reset=_entity_reset + +def _scene_export(self,*args,**kwargs): + """ + scene.Export(Exporter) + scene.Export("file.png") + scene.Export("file.png",(width,height),samples=0,transparency=False) + deprecated: + scene.Export("file.png",width,height,samples=0,transparency=False) + scene.Export("file.png",width,height,transparency) + """ + scene=Scene() + tp=False + sa=0 + if "tp" in kwargs: + tp=int(kwargs["tp"]) + if "transparency" in kwargs: + tp=int(kwargs["transparency"]) + if "samples" in kwargs: + sa=int(kwargs["samples"]) + + if len(args)==1: + if isinstance(args[0],Exporter): + scene._export_via_exporter(args[0]) + return + elif type(args[0])==type(""): + scene._export_screen(args[0],tp) + return + elif len(args)==2: + if type(args[0]==type("")): + # assume second argument is a dimension + width=int(args[1][0]) + height=int(args[1][1]) + scene._export_buffer(args[0],width,height,sa,tp) + return + elif len(args)==3: + if type(args[0]==type("")): + width=int(args[1]) + height=int(args[2]) + scene._export_buffer(args[0],width,height,sa,tp) + return + elif len(args)==4: + if type(args[0]==type("")): + width=int(args[1]) + height=int(args[2]) + tp=int(args[3]) + scene._export_buffer(args[0],width,height,sa,tp) + return + # getting here indicates an error + raise RuntimeError("""invalid arguments to scene.Export; expected one of + Export(gfx.Exporter) + Export('file.png') + Export('file.png',(width,height),samples=0, transparency=False) + Export('file.png',width,height,samples=0, transparency=False) -> deprecated + Export('file.png',width,height,transparency) -> deprecated + """) + +SceneSingleton.Export=_scene_export diff --git a/modules/gfx/pymod/export_scene.cc b/modules/gfx/pymod/export_scene.cc index 5a8a5929d29a788468f907ba90534f7f79aeac10..59098ea93c962890101edd9598b2618e9fb9aba0 100644 --- a/modules/gfx/pymod/export_scene.cc +++ b/modules/gfx/pymod/export_scene.cc @@ -82,14 +82,14 @@ void export_Scene() void (Scene::* set_light_prop1)(const Color&,const Color&,const Color&) = &Scene::SetLightProp; void (Scene::* set_light_prop2)(float,float,float) = &Scene::SetLightProp; - void (Scene::* export1)(const String&, uint, uint, bool) = &Scene::Export; - void (Scene::* export2)(const String&, uint, uint, int, bool) = &Scene::Export; - void (Scene::* export3)(const String&, bool) = &Scene::Export; - void (Scene::* export4)(Exporter*) const = &Scene::Export; + void (Scene::* export_buffer)(const String&, uint, uint, int, bool) = &Scene::Export; + void (Scene::* export_screen)(const String&, bool) = &Scene::Export; + void (Scene::* export_via_exporter)(Exporter*) const = &Scene::Export; void (Scene::*remove1)(const GfxNodeP&) = &Scene::Remove; void (Scene::*remove2)(const String&) = &Scene::Remove; void (Scene::*center_on1)(const String&) = &Scene::CenterOn; void (Scene::*center_on2)(const GfxObjP&) = &Scene::CenterOn; + bool (Scene::*start_offscreen_mode1)(unsigned int, unsigned int) = &Scene::StartOffscreenMode; bool (Scene::*start_offscreen_mode2)(unsigned int, unsigned int, int) = &Scene::StartOffscreenMode; class_<Viewport>("Viewport", init<>()) .def_readwrite("x", &Viewport::x) @@ -196,10 +196,9 @@ void export_Scene() .def("SetLightProp",set_light_prop1) .def("SetLightProp",set_light_prop2) .def("Apply", apply) - .def("Export",export1, arg("transparent")=false) - .def("Export",export2, arg("transparent")=false) - .def("Export",export3, arg("transparent")=false) - .def("Export",export4) + .def("_export_screen",export_screen) + .def("_export_buffer",export_buffer) + .def("_export_via_exporter",export_via_exporter) .def("ExportPov",&Scene::ExportPov, scene_export_pov_overloads()) .def("PushView",&Scene::PushView) @@ -229,6 +228,7 @@ void export_Scene() .add_property("ao_quality",&Scene::GetAmbientOcclusionQuality,&Scene::SetAmbientOcclusionQuality) .add_property("ao_size",&Scene::GetAmbientOcclusionSize,&Scene::SetAmbientOcclusionSize) .def("AttachObserver",&Scene::AttachObserver) + .def("StartOffscreenMode",start_offscreen_mode1) .def("StartOffscreenMode",start_offscreen_mode2) .def("StopOffscreenMode",&Scene::StopOffscreenMode) .def("SetShadingMode",&Scene::SetShadingMode) diff --git a/modules/gfx/src/impl/glx_offscreen_buffer.cc b/modules/gfx/src/impl/glx_offscreen_buffer.cc index 6b934d1155ce89a69e88bc7b66dfdf0b7e0cea6b..41bca43a363a7c873f0ee719e2ca68c0859a893b 100644 --- a/modules/gfx/src/impl/glx_offscreen_buffer.cc +++ b/modules/gfx/src/impl/glx_offscreen_buffer.cc @@ -29,6 +29,16 @@ namespace ost { namespace gfx { +namespace { + Display* get_dpy() { + static Display* dpy=0; + if(not dpy) { + dpy=XOpenDisplay(getenv("DISPLAY")); + } + return dpy; + } +} + OffscreenBuffer::OffscreenBuffer(unsigned int width, unsigned int height, const OffscreenBufferFormat& f, bool shared): width_(width), height_(height), valid_(false), active_(false) { @@ -39,7 +49,7 @@ OffscreenBuffer::OffscreenBuffer(unsigned int width, unsigned int height, const } LOG_DEBUG("offscreen buffer: XOpenDisplay"); - dpy_ = XOpenDisplay(getenv("DISPLAY")); + dpy_ = get_dpy(); if(dpy_==NULL) { LOG_ERROR("error creating offscreen rendering context: XOpenDisplay failed"); return; @@ -84,7 +94,6 @@ OffscreenBuffer::OffscreenBuffer(unsigned int width, unsigned int height, const search_multisample=false; } else { LOG_ERROR("error creating offscreen rendering context: glXChooseFBConfig failed"); - XCloseDisplay(dpy_); return; } } @@ -129,7 +138,6 @@ OffscreenBuffer::OffscreenBuffer(unsigned int width, unsigned int height, const if(!pbuffer_) { LOG_ERROR("error creating offscreen rendering context: glXCreatePBuffer failed"); XFree(fbconfig_); - XCloseDisplay(dpy_); return; } @@ -148,7 +156,6 @@ OffscreenBuffer::OffscreenBuffer(unsigned int width, unsigned int height, const LOG_ERROR("error creating offscreen rendering context: glXCreateNewContext failed"); glXDestroyPbuffer(dpy_, pbuffer_); XFree(fbconfig_); - XCloseDisplay(dpy_); return; } @@ -163,9 +170,7 @@ OffscreenBuffer::~OffscreenBuffer() LOG_DEBUG("offscreen buffer: glXDestroyPbuffer()"); glXDestroyPbuffer(dpy_, pbuffer_); LOG_DEBUG("offscreen buffer: XFree(fbconfig_list)"); - XFree(fbconfig_); - LOG_DEBUG("offscreen buffer: XCloseDisplay()"); - XCloseDisplay(dpy_); + //XFree(fbconfig_); } } diff --git a/modules/gfx/src/scene.cc b/modules/gfx/src/scene.cc index 724482a79e1d6e0df4e9333abbc1441f93570020..f61b0ed1edd96d165615ac7a7e25b7f8435ef75f 100644 --- a/modules/gfx/src/scene.cc +++ b/modules/gfx/src/scene.cc @@ -1584,6 +1584,10 @@ uint Scene::GetSelectionMode() const return selection_mode_; } +bool Scene::StartOffscreenMode(unsigned int width, unsigned int height) { + return StartOffscreenMode(width,height,2); +} + bool Scene::StartOffscreenMode(unsigned int width, unsigned int height, int max_samples) { LOG_DEBUG("Scene: starting offscreen rendering mode " << width << "x" << height); diff --git a/modules/gfx/src/scene.hh b/modules/gfx/src/scene.hh index 477b160ca58b0b97c266f4fa25b132921ecdc5e2..972d2587c70c687a5bf223d82005a3db88f15719 100644 --- a/modules/gfx/src/scene.hh +++ b/modules/gfx/src/scene.hh @@ -479,6 +479,8 @@ class DLLEXPORT_OST_GFX Scene { */ bool StartOffscreenMode(unsigned int w, unsigned int h, int max_samples); + bool StartOffscreenMode(unsigned int w, unsigned int h); + /// \brief stops offline rendering in interactive mode void StopOffscreenMode();