forked from bartvdbraak/blender
Merge branch 'master' into blender2.8
This commit is contained in:
commit
3692a2bcb3
@ -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",
|
||||
|
@ -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
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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 */
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
130
intern/ghost/intern/GHOST_TaskbarX11.cpp
Normal file
130
intern/ghost/intern/GHOST_TaskbarX11.cpp
Normal file
@ -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);
|
||||
}
|
45
intern/ghost/intern/GHOST_TaskbarX11.h
Normal file
45
intern/ghost/intern/GHOST_TaskbarX11.h
Normal file
@ -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__*/
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -59,6 +59,8 @@
|
||||
#include "RNA_define.h"
|
||||
#include "RNA_enum_types.h"
|
||||
|
||||
#include "ED_object.h"
|
||||
|
||||
#include "UI_interface.h"
|
||||
#include "UI_resources.h"
|
||||
|
||||
@ -543,6 +545,12 @@ static int wm_alembic_import_exec(bContext *C, wmOperator *op)
|
||||
}
|
||||
}
|
||||
|
||||
/* Switch out of edit mode to avoid being stuck in it (T54326). */
|
||||
Object *obedit = CTX_data_edit_object(C);
|
||||
if (obedit) {
|
||||
ED_object_mode_toggle(C, OB_MODE_EDIT);
|
||||
}
|
||||
|
||||
bool ok = ABC_import(C, filename, scale, is_sequence, set_frame_range,
|
||||
sequence_len, offset, validate_meshes,
|
||||
as_background_job);
|
||||
|
@ -536,10 +536,8 @@ static void render_image_update_pass_and_layer(RenderJob *rj, RenderResult *rr,
|
||||
int layer = BLI_findstringindex(&main_rr->layers,
|
||||
(char *)rr->renlay->name,
|
||||
offsetof(RenderLayer, name));
|
||||
if (layer != rj->last_layer) {
|
||||
sima->iuser.layer = layer;
|
||||
rj->last_layer = layer;
|
||||
}
|
||||
sima->iuser.layer = layer;
|
||||
rj->last_layer = layer;
|
||||
}
|
||||
|
||||
iuser->pass = sima->iuser.pass;
|
||||
@ -637,7 +635,21 @@ static void render_image_restore_layer(RenderJob *rj)
|
||||
if (sa == rj->sa) {
|
||||
if (sa->spacetype == SPACE_IMAGE) {
|
||||
SpaceImage *sima = sa->spacedata.first;
|
||||
sima->iuser.layer = rj->orig_layer;
|
||||
|
||||
if (RE_HasSingleLayer(rj->re)) {
|
||||
/* For single layer renders keep the active layer
|
||||
* visible, or show the compositing result. */
|
||||
RenderResult *rr = RE_AcquireResultRead(rj->re);
|
||||
if(RE_HasCombinedLayer(rr)) {
|
||||
sima->iuser.layer = 0;
|
||||
}
|
||||
RE_ReleaseResult(rj->re);
|
||||
}
|
||||
else {
|
||||
/* For multiple layer render, set back the layer
|
||||
* that was set at the start of rendering. */
|
||||
sima->iuser.layer = rj->orig_layer;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
@ -238,6 +238,8 @@ void RE_render_result_rect_from_ibuf(
|
||||
struct RenderLayer *RE_GetRenderLayer(struct RenderResult *rr, const char *name);
|
||||
float *RE_RenderLayerGetPass(volatile struct RenderLayer *rl, const char *name, const char *viewname);
|
||||
|
||||
bool RE_HasSingleLayer(struct Render *re);
|
||||
|
||||
/* add passes for grease pencil */
|
||||
struct RenderPass *RE_create_gp_pass(struct RenderResult *rr, const char *layername, const char *viewname);
|
||||
|
||||
|
@ -261,6 +261,11 @@ RenderLayer *RE_GetRenderLayer(RenderResult *rr, const char *name)
|
||||
}
|
||||
}
|
||||
|
||||
bool RE_HasSingleLayer(Render *re)
|
||||
{
|
||||
return (re->r.scemode & R_SINGLE_LAYER);
|
||||
}
|
||||
|
||||
RenderResult *RE_MultilayerConvert(void *exrhandle, const char *colorspace, bool predivide, int rectx, int recty)
|
||||
{
|
||||
return render_result_new_from_exr(exrhandle, colorspace, predivide, rectx, recty);
|
||||
@ -268,12 +273,19 @@ RenderResult *RE_MultilayerConvert(void *exrhandle, const char *colorspace, bool
|
||||
|
||||
RenderLayer *render_get_active_layer(Render *re, RenderResult *rr)
|
||||
{
|
||||
RenderLayer *rl = BLI_findlink(&rr->layers, re->active_view_layer);
|
||||
|
||||
if (rl)
|
||||
return rl;
|
||||
else
|
||||
return rr->layers.first;
|
||||
ViewLayer *view_layer = BLI_findlink(&re->view_layers, re->active_view_layer);
|
||||
|
||||
if (view_layer) {
|
||||
RenderLayer *rl = BLI_findstring(&rr->layers,
|
||||
view_layer->name,
|
||||
offsetof(RenderLayer, name));
|
||||
|
||||
if (rl) {
|
||||
return rl;
|
||||
}
|
||||
}
|
||||
|
||||
return rr->layers.first;
|
||||
}
|
||||
|
||||
static int UNUSED_FUNCTION(render_scene_needs_vector)(Render *re)
|
||||
|
Loading…
Reference in New Issue
Block a user