Merge branch 'master' into blender2.8

This commit is contained in:
2018-06-28 23:57:00 +02:00
20 changed files with 36 additions and 316 deletions

View File

@@ -163,7 +163,7 @@ class SpellChecker:
"rolloff",
"runtime",
"scanline",
"screencast", "screenshot", "screenshots",
"screenshot", "screenshots",
"seekability",
"selfcollision",
"shadowbuffer", "shadowbuffers",

View File

@@ -88,7 +88,6 @@ kmi = km.keymap_items.new('screen.screen_full_area', 'UP_ARROW', 'PRESS', ctrl=T
kmi = km.keymap_items.new('screen.screen_full_area', 'DOWN_ARROW', 'PRESS', ctrl=True)
kmi = km.keymap_items.new('screen.screen_full_area', 'SPACE', 'PRESS', shift=True)
kmi = km.keymap_items.new('screen.screenshot', 'F3', 'PRESS', ctrl=True)
kmi = km.keymap_items.new('screen.screencast', 'F3', 'PRESS', alt=True)
kmi = km.keymap_items.new('screen.region_quadview', 'W', 'PRESS', alt=True)
kmi = km.keymap_items.new('screen.repeat_history', 'F3', 'PRESS', shift=True)
kmi = km.keymap_items.new('screen.repeat_last', 'R', 'PRESS', shift=True)
@@ -2433,4 +2432,3 @@ kmi = km.keymap_items.new_modal('SELECT', 'LEFTMOUSE', 'RELEASE', any=True)
kmi = km.keymap_items.new_modal('SELECT', 'RIGHTMOUSE', 'RELEASE', any=True)
kmi = km.keymap_items.new_modal('BEGIN', 'MIDDLEMOUSE', 'PRESS')
kmi = km.keymap_items.new_modal('DESELECT', 'MIDDLEMOUSE', 'RELEASE')

View File

@@ -86,7 +86,6 @@ kmi = km.keymap_items.new('screen.screen_set', 'LEFT_ARROW', 'PRESS', ctrl=True)
kmi.properties.delta = -1
kmi = km.keymap_items.new('screen.screen_full_area', 'SPACE', 'PRESS', shift=True)
kmi = km.keymap_items.new('screen.screenshot', 'F3', 'PRESS', ctrl=True)
kmi = km.keymap_items.new('screen.screencast', 'F3', 'PRESS', alt=True)
kmi = km.keymap_items.new('screen.region_quadview', 'SPACE', 'PRESS')
kmi = km.keymap_items.new('screen.repeat_history', 'F3', 'PRESS')
kmi = km.keymap_items.new('screen.repeat_last', 'G', 'PRESS')
@@ -1916,4 +1915,3 @@ kmi.properties.action = 'TOGGLE'
kmi = km.keymap_items.new('transform.translate', 'W', 'PRESS')
kmi = km.keymap_items.new('transform.translate', 'EVT_TWEAK_S', 'ANY')
kmi = km.keymap_items.new('transform.resize', 'R', 'PRESS')

View File

@@ -522,7 +522,6 @@ class INFO_MT_window(Menu):
layout.separator()
layout.operator("screen.screenshot")
layout.operator("screen.screencast")
if sys.platform[:3] == "win":
layout.separator()

View File

@@ -505,12 +505,6 @@ class USERPREF_PT_system(Panel):
col.separator()
col.label(text="Screencast:")
col.prop(system, "screencast_fps")
col.prop(system, "screencast_wait_time")
col.separator()
if bpy.app.build_options.cycles:
addon = userpref.addons.get("cycles")
if addon is not None:

View File

@@ -26,6 +26,7 @@
#include <Alembic/AbcGeom/All.h>
#include <algorithm>
#include <unordered_map>
extern "C" {
#include "DNA_customdata_types.h"
@@ -51,6 +52,27 @@ using Alembic::Abc::V2fArraySample;
using Alembic::AbcGeom::OV2fGeomParam;
using Alembic::AbcGeom::OC4fGeomParam;
static inline uint64_t uv_to_hash_key(Imath::V2f v)
{
/* Convert -0.0f to 0.0f, so bitwise comparison works. */
if (v.x == 0.0f) {
v.x = 0.0f;
}
if (v.y == 0.0f) {
v.y = 0.0f;
}
/* Pack floats in 64bit. */
union {
float xy[2];
uint64_t key;
} tmp;
tmp.xy[0] = v.x;
tmp.xy[1] = v.y;
return tmp.key;
}
static void get_uvs(const CDStreamConfig &config,
std::vector<Imath::V2f> &uvs,
std::vector<uint32_t> &uvidx,
@@ -84,6 +106,9 @@ static void get_uvs(const CDStreamConfig &config,
}
}
else {
std::unordered_map<uint64_t, int> idx_map;
int idx_count = 0;
for (int i = 0; i < num_poly; ++i) {
MPoly &current_poly = polygons[i];
MLoopUV *loopuvpoly = mloopuv_array + current_poly.loopstart + current_poly.totloop;
@@ -91,15 +116,15 @@ static void get_uvs(const CDStreamConfig &config,
for (int j = 0; j < current_poly.totloop; ++j) {
loopuvpoly--;
Imath::V2f uv(loopuvpoly->uv[0], loopuvpoly->uv[1]);
std::vector<Imath::V2f>::iterator it = std::find(uvs.begin(), uvs.end(), uv);
if (it == uvs.end()) {
uvidx.push_back(uvs.size());
uint64_t k = uv_to_hash_key(uv);
std::unordered_map<uint64_t, int>::iterator it = idx_map.find(k);
if (it == idx_map.end()) {
idx_map[k] = idx_count;
uvs.push_back(uv);
uvidx.push_back(idx_count++);
}
else {
uvidx.push_back(std::distance(uvs.begin(), it));
uvidx.push_back(it->second);
}
}
}

View File

@@ -4222,9 +4222,6 @@ void uiTemplateRunningJobs(uiLayout *layout, bContext *C)
NULL, 0.0f, 0.0f, 0, 0, TIP_("Stop this job"));
}
if (WM_jobs_test(wm, screen, WM_JOB_TYPE_SCREENCAST))
uiDefIconTextBut(block, UI_BTYPE_BUT, B_STOPCAST, ICON_CANCEL, IFACE_("Capture"), 0, 0, UI_UNIT_X * 4.25f, UI_UNIT_Y,
NULL, 0.0f, 0.0f, 0, 0, TIP_("Stop screencast"));
if (screen->animtimer)
uiDefIconTextBut(block, UI_BTYPE_BUT, B_STOPANIM, ICON_CANCEL, IFACE_("Anim Player"), 0, 0, UI_UNIT_X * 5.0f, UI_UNIT_Y,
NULL, 0.0f, 0.0f, 0, 0, TIP_("Stop animation playback"));

View File

@@ -1513,10 +1513,6 @@ void init_userdef_do_versions(Main *bmain)
if (U.dbl_click_time == 0) {
U.dbl_click_time = 350;
}
if (U.scrcastfps == 0) {
U.scrcastfps = 10;
U.scrcastwait = 50;
}
if (U.v2d_min_gridsize == 0) {
U.v2d_min_gridsize = 35;
}

View File

@@ -78,7 +78,6 @@ extern const char *screen_context_dir[]; /* doc access */
/* screendump.c */
void SCREEN_OT_screenshot(struct wmOperatorType *ot);
void SCREEN_OT_screencast(struct wmOperatorType *ot);
/* screen_ops.c */
void region_blend_start(struct bContext *C, struct ScrArea *sa, struct ARegion *ar);

View File

@@ -4687,7 +4687,6 @@ void ED_operatortypes_screen(void)
WM_operatortype_append(SCREEN_OT_back_to_previous);
WM_operatortype_append(SCREEN_OT_spacedata_cleanup);
WM_operatortype_append(SCREEN_OT_screenshot);
WM_operatortype_append(SCREEN_OT_screencast);
WM_operatortype_append(SCREEN_OT_userpref_show);
WM_operatortype_append(SCREEN_OT_drivers_editor_show);
WM_operatortype_append(SCREEN_OT_region_blend);
@@ -4817,7 +4816,6 @@ void ED_keymap_screen(wmKeyConfig *keyconf)
RNA_boolean_set(kmi->ptr, "use_hide_panels", true);
WM_keymap_add_item(keymap, "SCREEN_OT_screenshot", F3KEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "SCREEN_OT_screencast", F3KEY, KM_PRESS, KM_ALT, 0);
kmi = WM_keymap_add_item(keymap, "SCREEN_OT_space_context_cycle", TABKEY, KM_PRESS, KM_CTRL, 0);
RNA_enum_set(kmi->ptr, "direction", SPACE_CONTEXT_CYCLE_NEXT);

View File

@@ -36,7 +36,6 @@
#include "BLI_blenlib.h"
#include "BLI_utildefines.h"
#include "BLI_math.h"
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
@@ -44,21 +43,15 @@
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
#include "DNA_userdef_types.h"
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_main.h"
#include "BKE_image.h"
#include "BKE_report.h"
#include "BKE_writeavi.h"
#include "BIF_gl.h"
#include "GPU_immediate.h"
#include "GPU_immediate_util.h"
#include "GPU_state.h"
#include "RNA_access.h"
#include "RNA_define.h"
@@ -67,9 +60,6 @@
#include "WM_types.h"
#include "WM_api.h"
#include "PIL_time.h"
#include "screen_intern.h"
typedef struct ScreenshotData {
@@ -309,257 +299,3 @@ void SCREEN_OT_screenshot(wmOperatorType *ot)
"Capture the whole window (otherwise only capture the active area)");
}
/* *************** screenshot movie job ************************* */
typedef struct ScreenshotJob {
Main *bmain;
Scene *scene;
wmWindowManager *wm;
unsigned int *dumprect;
int x, y, dumpsx, dumpsy;
const short *stop;
const short *do_update;
ReportList reports;
bMovieHandle *movie_handle;
void *movie_ctx;
} ScreenshotJob;
static void screenshot_freejob(void *sjv)
{
ScreenshotJob *sj = sjv;
if (sj->dumprect)
MEM_freeN(sj->dumprect);
if (sj->movie_handle) {
bMovieHandle *mh = sj->movie_handle;
mh->end_movie(sj->movie_ctx);
mh->context_free(sj->movie_ctx);
}
MEM_freeN(sj);
}
/* called before redraw notifiers, copies a new dumprect */
static void screenshot_updatejob(void *sjv)
{
ScreenshotJob *sj = sjv;
unsigned int *dumprect;
if (sj->dumprect == NULL) {
dumprect = MEM_mallocN(sizeof(int) * sj->dumpsx * sj->dumpsy, "dumprect");
screenshot_read_pixels(sj->x, sj->y, sj->dumpsx, sj->dumpsy, (unsigned char *)dumprect);
sj->dumprect = dumprect;
}
}
/* only this runs inside thread */
static void screenshot_startjob(void *sjv, short *stop, short *do_update, float *UNUSED(progress))
{
ScreenshotJob *sj = sjv;
RenderData rd = sj->scene->r;
bMovieHandle *mh = NULL;
/* we need this as local variables for renderdata */
rd.frs_sec = U.scrcastfps;
rd.frs_sec_base = 1.0f;
if (BKE_imtype_is_movie(rd.im_format.imtype)) {
mh = BKE_movie_handle_get(sj->scene->r.im_format.imtype);
if (mh == NULL) {
printf("Movie format unsupported\n");
return;
}
sj->movie_ctx = mh->context_create();
sj->movie_handle = mh;
if (!mh->start_movie(sj->movie_ctx, sj->scene, &rd, sj->dumpsx, sj->dumpsy, &sj->reports, false, "")) {
printf("screencast job stopped\n");
return;
}
}
sj->stop = stop;
sj->do_update = do_update;
*do_update = true; /* wait for opengl rect */
while (*stop == 0) {
if (sj->dumprect) {
if (mh) {
if (mh->append_movie(sj->movie_ctx, &rd, rd.sfra, rd.cfra, (int *)sj->dumprect,
sj->dumpsx, sj->dumpsy, "", &sj->reports))
{
BKE_reportf(&sj->reports, RPT_INFO, "Appended frame: %d", rd.cfra);
printf("Appended frame %d\n", rd.cfra);
}
else {
break;
}
}
else {
ImBuf *ibuf = IMB_allocImBuf(sj->dumpsx, sj->dumpsy, rd.im_format.planes, 0);
char name[FILE_MAX];
int ok;
BKE_image_path_from_imformat(
name, rd.pic, BKE_main_blendfile_path(sj->bmain), rd.cfra,
&rd.im_format, (rd.scemode & R_EXTENSION) != 0, true, NULL);
ibuf->rect = sj->dumprect;
ok = BKE_imbuf_write(ibuf, name, &rd.im_format);
if (ok == 0) {
printf("Write error: cannot save %s\n", name);
BKE_reportf(&sj->reports, RPT_INFO, "Write error: cannot save %s", name);
break;
}
else {
printf("Saved file: %s\n", name);
BKE_reportf(&sj->reports, RPT_INFO, "Saved file: %s", name);
}
/* imbuf knows which rects are not part of ibuf */
IMB_freeImBuf(ibuf);
}
MEM_freeN(sj->dumprect);
sj->dumprect = NULL;
*do_update = true;
rd.cfra++;
}
else
PIL_sleep_ms(U.scrcastwait);
}
if (mh) {
mh->end_movie(sj->movie_ctx);
mh->context_free(sj->movie_ctx);
sj->movie_handle = NULL;
}
BKE_report(&sj->reports, RPT_INFO, "Screencast job stopped");
}
/* Helper callback for drawing the cursor itself */
static void screencast_draw_cursor(bContext *UNUSED(C), int x, int y, void *UNUSED(p_ptr))
{
GPU_line_smooth(true);
GPU_blend(true);
Gwn_VertFormat *format = immVertexFormat();
unsigned int pos = GWN_vertformat_attr_add(format, "pos", GWN_COMP_F32, 2, GWN_FETCH_FLOAT);
immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
immUniformColor4ub(0, 0, 0, 32);
imm_draw_circle_fill_2d(pos, (float)x, (float)y, 20, 40);
immUniformColor4ub(255, 255, 255, 128);
imm_draw_circle_wire_2d(pos, (float)x, (float)y, 20, 40);
immUnbindProgram();
GPU_blend(false);
GPU_line_smooth(false);
}
/* Turn brush cursor in 3D view on/off */
static void screencast_cursor_toggle(wmWindowManager *wm, short enable)
{
static void *cursor = NULL;
if (cursor && !enable) {
/* clear cursor */
WM_paint_cursor_end(wm, cursor);
cursor = NULL;
}
else if (enable) {
/* enable cursor */
cursor = WM_paint_cursor_activate(wm, NULL, screencast_draw_cursor, NULL);
}
}
static void screenshot_endjob(void *sjv)
{
ScreenshotJob *sj = sjv;
screencast_cursor_toggle(sj->wm, 0);
}
static int screencast_exec(bContext *C, wmOperator *op)
{
wmWindowManager *wm = CTX_wm_manager(C);
wmWindow *win = CTX_wm_window(C);
bScreen *screen = CTX_wm_screen(C);
wmJob *wm_job;
ScreenshotJob *sj;
/* if called again, stop the running job */
if (WM_jobs_test(wm, screen, WM_JOB_TYPE_SCREENCAST))
WM_jobs_stop(wm, screen, screenshot_startjob);
wm_job = WM_jobs_get(wm, win, screen, "Screencast", 0, WM_JOB_TYPE_SCREENCAST);
sj = MEM_callocN(sizeof(ScreenshotJob), "screenshot job");
/* setup sj */
if (RNA_boolean_get(op->ptr, "full")) {
sj->x = 0;
sj->y = 0;
sj->dumpsx = WM_window_pixels_x(win);
sj->dumpsy = WM_window_pixels_y(win);
}
else {
ScrArea *curarea = CTX_wm_area(C);
sj->x = curarea->totrct.xmin;
sj->y = curarea->totrct.ymin;
sj->dumpsx = curarea->totrct.xmax - sj->x;
sj->dumpsy = curarea->totrct.ymax - sj->y;
}
sj->bmain = CTX_data_main(C);
sj->scene = CTX_data_scene(C);
sj->wm = wm;
BKE_reports_init(&sj->reports, RPT_PRINT);
/* setup job */
WM_jobs_customdata_set(wm_job, sj, screenshot_freejob);
WM_jobs_timer(wm_job, 0.1, 0, NC_SCREEN | ND_SCREENCAST);
WM_jobs_callbacks(wm_job, screenshot_startjob, NULL, screenshot_updatejob, screenshot_endjob);
WM_jobs_start(sj->wm, wm_job);
screencast_cursor_toggle(sj->wm, 1);
WM_event_add_notifier(C, NC_SCREEN | ND_SCREENCAST, screen);
return OPERATOR_FINISHED;
}
void SCREEN_OT_screencast(wmOperatorType *ot)
{
ot->name = "Make Screencast";
ot->idname = "SCREEN_OT_screencast";
ot->description = "Capture a video of the active area or whole Blender window";
ot->invoke = WM_operator_confirm;
ot->exec = screencast_exec;
ot->poll = screenshot_poll; /* shared poll */
ot->flag = 0;
RNA_def_property(ot->srna, "filepath", PROP_STRING, PROP_FILEPATH);
RNA_def_boolean(ot->srna, "full", 1, "Full Screen",
"Capture the whole window (otherwise only capture the active area)");
}

View File

@@ -264,7 +264,7 @@ static void info_header_listener(
/* context changes */
switch (wmn->category) {
case NC_SCREEN:
if (ELEM(wmn->data, ND_LAYER, ND_SCREENCAST, ND_ANIMPLAY)) {
if (ELEM(wmn->data, ND_LAYER, ND_ANIMPLAY)) {
ED_region_tag_redraw(ar);
}
break;

View File

@@ -772,7 +772,6 @@ static void node_region_listener(
WM_manipulatormap_tag_refresh(mmap);
}
switch (wmn->data) {
case ND_SCREENCAST:
case ND_ANIMPLAY:
case ND_LAYER:
ED_region_tag_redraw(ar);

View File

@@ -529,7 +529,7 @@ static void sequencer_main_region_listener(
ED_region_tag_redraw(ar);
break;
case NC_SCREEN:
if (ELEM(wmn->data, ND_SCREENCAST, ND_ANIMPLAY))
if (ELEM(wmn->data, ND_ANIMPLAY))
ED_region_tag_redraw(ar);
break;
}

View File

@@ -115,7 +115,7 @@ static void statusbar_header_region_listener(
/* context changes */
switch (wmn->category) {
case NC_SCREEN:
if (ELEM(wmn->data, ND_LAYER, ND_SCREENCAST, ND_ANIMPLAY)) {
if (ELEM(wmn->data, ND_LAYER, ND_ANIMPLAY)) {
ED_region_tag_redraw(ar);
}
break;

View File

@@ -584,8 +584,7 @@ typedef struct UserDef {
int view_frame_keyframes; /* number of keyframes to zoom around current frame */
float view_frame_seconds; /* seconds to zoom around current frame */
short scrcastfps; /* frame rate for screencast to be played back */
short scrcastwait; /* milliseconds between screencast snapshots */
char _pad1[4];
short widget_unit; /* private, defaults to 20 for 72 DPI setting */
short anisotropic_filter;

View File

@@ -4391,17 +4391,6 @@ static void rna_def_userdef_system(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Audio Channels", "Audio channel count");
RNA_def_property_update(prop, 0, "rna_UserDef_audio_update");
prop = RNA_def_property(srna, "screencast_fps", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "scrcastfps");
RNA_def_property_range(prop, 10, 100);
RNA_def_property_ui_text(prop, "FPS", "Frame rate for the screencast to be played back");
prop = RNA_def_property(srna, "screencast_wait_time", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "scrcastwait");
RNA_def_property_range(prop, 10, 1000);
RNA_def_property_ui_text(prop, "Wait Timer (ms)",
"Time in milliseconds between each frame recorded for screencast");
prop = RNA_def_property(srna, "use_text_antialiasing", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "text_render", USER_TEXT_DISABLE_AA);
RNA_def_property_ui_text(prop, "Text Anti-aliasing", "Draw user interface text anti-aliased");

View File

@@ -504,7 +504,6 @@ enum {
WM_JOB_TYPE_COMPOSITE,
WM_JOB_TYPE_RENDER,
WM_JOB_TYPE_RENDER_PREVIEW, /* UI preview */
WM_JOB_TYPE_SCREENCAST,
WM_JOB_TYPE_OBJECT_SIM_OCEAN,
WM_JOB_TYPE_OBJECT_SIM_FLUID,
WM_JOB_TYPE_OBJECT_BAKE_TEXTURE,

View File

@@ -272,7 +272,6 @@ typedef struct wmNotifier {
/* NC_SCREEN */
#define ND_LAYOUTBROWSE (1<<16)
#define ND_LAYOUTDELETE (2<<16)
#define ND_SCREENCAST (3<<16)
#define ND_ANIMPLAY (4<<16)
#define ND_GPENCIL (5<<16)
#define ND_EDITOR_CHANGED (6<<16) /*sent to new editors after switching to them*/

View File

@@ -1314,11 +1314,6 @@ static int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr C_void_ptr
state = GHOST_GetWindowState(win->ghostwin);
win->windowstate = state;
/* stop screencast if resize */
if (type == GHOST_kEventWindowSize) {
WM_jobs_stop(wm, WM_window_get_active_screen(win), NULL);
}
WM_window_set_dpi(win);
/* win32: gives undefined window size when minimized */