Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/intern
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@gmail.com>2018-03-16 06:16:21 +0300
committerBrecht Van Lommel <brechtvanlommel@gmail.com>2018-03-16 06:35:37 +0300
commit3692a2bcb3b8f742551c791c6e484e01678a0835 (patch)
treed9953d66c88c504aaf7967da9ecadf1eea2d2d6d /intern
parentcca1e1b707c2d34244d3da87efcd78775c4eb048 (diff)
parente5327afcb73f102db8a82ccefc29bbf9cc6fb60c (diff)
Merge branch 'master' into blender2.8
Diffstat (limited to 'intern')
-rw-r--r--intern/cycles/app/cycles_standalone.cpp32
-rw-r--r--intern/cycles/render/buffers.cpp33
-rw-r--r--intern/cycles/render/buffers.h1
-rw-r--r--intern/cycles/render/session.cpp10
-rw-r--r--intern/cycles/render/session.h8
-rw-r--r--intern/ghost/CMakeLists.txt2
-rw-r--r--intern/ghost/intern/GHOST_TaskbarX11.cpp130
-rw-r--r--intern/ghost/intern/GHOST_TaskbarX11.h45
-rw-r--r--intern/ghost/intern/GHOST_WindowX11.cpp22
-rw-r--r--intern/ghost/intern/GHOST_WindowX11.h7
10 files changed, 248 insertions, 42 deletions
diff --git a/intern/cycles/app/cycles_standalone.cpp b/intern/cycles/app/cycles_standalone.cpp
index 2d4b0d35e54..c682744f5fa 100644
--- a/intern/cycles/app/cycles_standalone.cpp
+++ b/intern/cycles/app/cycles_standalone.cpp
@@ -51,6 +51,7 @@ struct Options {
SessionParams session_params;
bool quiet;
bool show_help, interactive, pause;
+ string output_path;
} options;
static void session_print(const string& str)
@@ -86,6 +87,34 @@ static void session_print_status()
session_print(status);
}
+static bool write_render(const uchar *pixels, int w, int h, int channels)
+{
+ string msg = string_printf("Writing image %s", options.output_path.c_str());
+ session_print(msg);
+
+ ImageOutput *out = ImageOutput::create(options.output_path);
+ if(!out) {
+ return false;
+ }
+
+ ImageSpec spec(w, h, channels, TypeDesc::UINT8);
+ if(!out->open(options.output_path, spec)) {
+ return false;
+ }
+
+ /* conversion for different top/bottom convention */
+ out->write_image(TypeDesc::UINT8,
+ pixels + (h - 1) * w * channels,
+ AutoStride,
+ -w * channels,
+ AutoStride);
+
+ out->close();
+ delete out;
+
+ return true;
+}
+
static BufferParams& session_buffer_params()
{
static BufferParams buffer_params;
@@ -120,6 +149,7 @@ static void scene_init()
static void session_init()
{
+ options.session_params.write_render_cb = write_render;
options.session = new Session(options.session_params);
if(options.session_params.background && !options.quiet)
@@ -364,7 +394,7 @@ static void options_parse(int argc, const char **argv)
"--background", &options.session_params.background, "Render in background, without user interface",
"--quiet", &options.quiet, "In background mode, don't print progress messages",
"--samples %d", &options.session_params.samples, "Number of samples to render",
- "--output %s", &options.session_params.output_path, "File path to write output image",
+ "--output %s", &options.output_path, "File path to write output image",
"--threads %d", &options.session_params.threads, "CPU Rendering Threads",
"--width %d", &options.width, "Window width in pixel",
"--height %d", &options.height, "Window height in pixel",
diff --git a/intern/cycles/render/buffers.cpp b/intern/cycles/render/buffers.cpp
index e4931a6317c..91b739741bb 100644
--- a/intern/cycles/render/buffers.cpp
+++ b/intern/cycles/render/buffers.cpp
@@ -21,7 +21,6 @@
#include "util/util_foreach.h"
#include "util/util_hash.h"
-#include "util/util_image.h"
#include "util/util_math.h"
#include "util/util_opengl.h"
#include "util/util_time.h"
@@ -452,37 +451,5 @@ bool DisplayBuffer::draw_ready()
return (draw_width != 0 && draw_height != 0);
}
-void DisplayBuffer::write(const string& filename)
-{
- int w = draw_width;
- int h = draw_height;
-
- if(w == 0 || h == 0)
- return;
-
- if(half_float)
- return;
-
- /* read buffer from device */
- uchar4 *pixels = rgba_byte.copy_from_device(0, w, h);
-
- /* write image */
- ImageOutput *out = ImageOutput::create(filename);
- ImageSpec spec(w, h, 4, TypeDesc::UINT8);
-
- out->open(filename, spec);
-
- /* conversion for different top/bottom convention */
- out->write_image(TypeDesc::UINT8,
- (uchar*)(pixels + (h-1)*w),
- AutoStride,
- -w*sizeof(uchar4),
- AutoStride);
-
- out->close();
-
- delete out;
-}
-
CCL_NAMESPACE_END
diff --git a/intern/cycles/render/buffers.h b/intern/cycles/render/buffers.h
index 028bfb83735..dfc98fe2061 100644
--- a/intern/cycles/render/buffers.h
+++ b/intern/cycles/render/buffers.h
@@ -113,7 +113,6 @@ public:
~DisplayBuffer();
void reset(BufferParams& params);
- void write(const string& filename);
void draw_set(int width, int height);
void draw(Device *device, const DeviceDrawParams& draw_params);
diff --git a/intern/cycles/render/session.cpp b/intern/cycles/render/session.cpp
index 41156038558..bb636dd962a 100644
--- a/intern/cycles/render/session.cpp
+++ b/intern/cycles/render/session.cpp
@@ -55,7 +55,7 @@ Session::Session(const SessionParams& params_)
device = Device::create(params.device, stats, params.background);
- if(params.background && params.output_path.empty()) {
+ if(params.background && !params.write_render_cb) {
buffers = NULL;
display = NULL;
}
@@ -101,7 +101,7 @@ Session::~Session()
wait();
}
- if(!params.output_path.empty()) {
+ if(params.write_render_cb) {
/* tonemap and write out image if requested */
delete display;
@@ -109,8 +109,10 @@ Session::~Session()
display->reset(buffers->params);
tonemap(params.samples);
- progress.set_status("Writing Image", params.output_path);
- display->write(params.output_path);
+ int w = display->draw_width;
+ int h = display->draw_height;
+ uchar4 *pixels = display->rgba_byte.copy_from_device(0, w, h);
+ params.write_render_cb((uchar*)pixels, w, h, 4);
}
/* clean up */
diff --git a/intern/cycles/render/session.h b/intern/cycles/render/session.h
index 8495d95666b..e63cad0d977 100644
--- a/intern/cycles/render/session.h
+++ b/intern/cycles/render/session.h
@@ -45,7 +45,6 @@ public:
DeviceInfo device;
bool background;
bool progressive_refine;
- string output_path;
bool progressive;
bool experimental;
@@ -71,11 +70,15 @@ public:
ShadingSystem shadingsystem;
+ function<bool(const uchar *pixels,
+ int width,
+ int height,
+ int channels)> write_render_cb;
+
SessionParams()
{
background = false;
progressive_refine = false;
- output_path = "";
progressive = false;
experimental = false;
@@ -106,7 +109,6 @@ public:
{ return !(device == params.device
&& background == params.background
&& progressive_refine == params.progressive_refine
- && output_path == params.output_path
/* && samples == params.samples */
&& progressive == params.progressive
&& experimental == params.experimental
diff --git a/intern/ghost/CMakeLists.txt b/intern/ghost/CMakeLists.txt
index 7771af93d4f..e4b74ae24af 100644
--- a/intern/ghost/CMakeLists.txt
+++ b/intern/ghost/CMakeLists.txt
@@ -178,10 +178,12 @@ elseif(WITH_X11)
intern/GHOST_DisplayManagerX11.cpp
intern/GHOST_SystemX11.cpp
intern/GHOST_WindowX11.cpp
+ intern/GHOST_TaskbarX11.cpp
intern/GHOST_DisplayManagerX11.h
intern/GHOST_SystemX11.h
intern/GHOST_WindowX11.h
+ intern/GHOST_TaskbarX11.h
)
if(NOT WITH_GL_EGL)
diff --git a/intern/ghost/intern/GHOST_TaskbarX11.cpp b/intern/ghost/intern/GHOST_TaskbarX11.cpp
new file mode 100644
index 00000000000..b47068df39f
--- /dev/null
+++ b/intern/ghost/intern/GHOST_TaskbarX11.cpp
@@ -0,0 +1,130 @@
+/*
+ * ***** 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):
+ * Lukas Stockner
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file ghost/intern/GHOST_TaskbarX11.cpp
+ * \ingroup GHOST
+ */
+
+#include "GHOST_TaskbarX11.h"
+
+#include <dlfcn.h>
+#include <cstdio>
+#include <cassert>
+#include <cstdlib>
+
+typedef void*(*unity_get_entry_t)(const char*);
+typedef void(*unity_set_progress_t)(void*, double);
+typedef void(*unity_set_progress_visible_t)(void*, int);
+typedef int(*unity_event_loop_t)(void*, int);
+
+static unity_get_entry_t unity_get_entry;
+static unity_set_progress_t unity_set_progress;
+static unity_set_progress_visible_t unity_set_progress_visible;
+static unity_event_loop_t unity_event_loop;
+
+static bool libunity_initialized = false;
+static bool libunity_available = false;
+void* libunity_handle = NULL;
+
+void GHOST_TaskBarX11::free()
+{
+ if(libunity_handle) {
+ dlclose(libunity_handle);
+ libunity_handle = NULL;
+ }
+}
+
+bool GHOST_TaskBarX11::init()
+{
+ if(libunity_initialized) {
+ return libunity_available;
+ }
+
+ libunity_initialized = true;
+
+ const char *libunity_names[] = {"libunity.so.4", "libunity.so.6", "libunity.so.9", "libunity.so", NULL};
+ for(int i = 0; libunity_names[i]; i++) {
+ libunity_handle = dlopen(libunity_names[i], RTLD_LAZY);
+ if(libunity_handle) {
+ break;
+ }
+ }
+
+ if(!libunity_handle) {
+ return false;
+ }
+
+ unity_get_entry = (unity_get_entry_t) dlsym(libunity_handle, "unity_launcher_entry_get_for_desktop_id");
+ if(!unity_get_entry) {
+ fprintf(stderr, "failed to load libunity: %s\n", dlerror());
+ return false;
+ }
+ unity_set_progress = (unity_set_progress_t) dlsym(libunity_handle, "unity_launcher_entry_set_progress");
+ if(!unity_set_progress) {
+ fprintf(stderr, "failed to load libunity: %s\n", dlerror());
+ return false;
+ }
+ unity_set_progress_visible = (unity_set_progress_visible_t) dlsym(libunity_handle, "unity_launcher_entry_set_progress_visible");
+ if(!unity_set_progress_visible) {
+ fprintf(stderr, "failed to load libunity: %s\n", dlerror());
+ return false;
+ }
+ unity_event_loop = (unity_event_loop_t) dlsym(libunity_handle, "g_main_context_iteration");
+ if(!unity_event_loop) {
+ fprintf(stderr, "failed to load libunity: %s\n", dlerror());
+ return false;
+ }
+
+ atexit(GHOST_TaskBarX11::free);
+
+ libunity_available = true;
+ return true;
+}
+
+GHOST_TaskBarX11::GHOST_TaskBarX11(const char *name)
+{
+ if(GHOST_TaskBarX11::init()) {
+ handle = unity_get_entry(name);
+ }
+ else {
+ handle = NULL;
+ }
+}
+
+bool GHOST_TaskBarX11::is_valid()
+{
+ return (handle != NULL);
+}
+
+void GHOST_TaskBarX11::set_progress(double progress)
+{
+ assert(is_valid());
+ unity_set_progress(handle, progress);
+}
+
+void GHOST_TaskBarX11::set_progress_enabled(bool enabled)
+{
+ assert(is_valid());
+ unity_set_progress_visible(handle, enabled ? 1 : 0);
+ unity_event_loop(NULL, 0);
+} \ No newline at end of file
diff --git a/intern/ghost/intern/GHOST_TaskbarX11.h b/intern/ghost/intern/GHOST_TaskbarX11.h
new file mode 100644
index 00000000000..ed0e5f9b329
--- /dev/null
+++ b/intern/ghost/intern/GHOST_TaskbarX11.h
@@ -0,0 +1,45 @@
+/*
+ * ***** 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):
+ * Lukas Stockner
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file ghost/intern/GHOST_TaskbarX11.h
+ * \ingroup GHOST
+ */
+#ifndef __GHOST_TASKBARX11_H__
+#define __GHOST_TASKBARX11_H__
+
+class GHOST_TaskBarX11
+{
+public:
+ static bool init();
+ static void free();
+
+ GHOST_TaskBarX11(const char *name);
+
+ bool is_valid();
+ void set_progress(double progress);
+ void set_progress_enabled(bool enabled);
+private:
+ void *handle;
+};
+
+#endif /*__GHOST_TASKBARX11_H__*/
diff --git a/intern/ghost/intern/GHOST_WindowX11.cpp b/intern/ghost/intern/GHOST_WindowX11.cpp
index 78a1c841934..3c291bd5ec6 100644
--- a/intern/ghost/intern/GHOST_WindowX11.cpp
+++ b/intern/ghost/intern/GHOST_WindowX11.cpp
@@ -334,6 +334,7 @@ GHOST_WindowX11(GHOST_SystemX11 *system,
m_empty_cursor(None),
m_custom_cursor(None),
m_visible_cursor(None),
+ m_taskbar("blender.desktop"),
#ifdef WITH_XDND
m_dropTarget(NULL),
#endif
@@ -1697,3 +1698,24 @@ getDPIHint()
int dpi = pixelDiagonal / inchDiagonal;
return dpi;
}
+
+GHOST_TSuccess GHOST_WindowX11::setProgressBar(float progress)
+{
+ if (m_taskbar.is_valid()) {
+ m_taskbar.set_progress(progress);
+ m_taskbar.set_progress_enabled(true);
+ return GHOST_kSuccess;
+ }
+
+ return GHOST_kFailure;
+}
+
+GHOST_TSuccess GHOST_WindowX11::endProgressBar()
+{
+ if (m_taskbar.is_valid()) {
+ m_taskbar.set_progress_enabled(false);
+ return GHOST_kSuccess;
+ }
+
+ return GHOST_kFailure;
+}
diff --git a/intern/ghost/intern/GHOST_WindowX11.h b/intern/ghost/intern/GHOST_WindowX11.h
index 5c54c1e8162..236fe0b76b0 100644
--- a/intern/ghost/intern/GHOST_WindowX11.h
+++ b/intern/ghost/intern/GHOST_WindowX11.h
@@ -41,6 +41,8 @@
# include <X11/extensions/XInput.h>
#endif
+#include "GHOST_TaskbarX11.h"
+
#include <map>
class STR_String;
@@ -166,6 +168,9 @@ public:
invalidate(
);
+ GHOST_TSuccess setProgressBar(float progress);
+ GHOST_TSuccess endProgressBar();
+
/**
* Destructor.
* Closes the window and disposes resources allocated.
@@ -347,6 +352,8 @@ private:
/** Cache of XC_* ID's to XCursor structures */
std::map<unsigned int, Cursor> m_standard_cursors;
+ GHOST_TaskBarX11 m_taskbar;
+
#ifdef WITH_XDND
GHOST_DropTargetX11 *m_dropTarget;
#endif