Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/render/render_opengl.c
| Show First 20 Lines • Show All 323 Lines • ▼ Show 20 Lines | if (gpd) { | ||||
| GPU_clear_color(0.0f, 0.0f, 0.0f, 0.0f); | GPU_clear_color(0.0f, 0.0f, 0.0f, 0.0f); | ||||
| GPU_clear(GPU_COLOR_BIT | GPU_DEPTH_BIT); | GPU_clear(GPU_COLOR_BIT | GPU_DEPTH_BIT); | ||||
| wmOrtho2(0, sizex, 0, sizey); | wmOrtho2(0, sizex, 0, sizey); | ||||
| GPU_matrix_translate_2f(sizex / 2, sizey / 2); | GPU_matrix_translate_2f(sizex / 2, sizey / 2); | ||||
| G.f |= G_RENDER_OGL; | G.f |= G_RENDER_OGL; | ||||
| ED_gpencil_draw_ex(scene, gpd, sizex, sizey, scene->r.cfra, SPACE_SEQ); | ED_gpencil_draw_ex(rv3d, scene, gpd, sizex, sizey, scene->r.cfra, SPACE_SEQ); | ||||
| G.f &= ~G_RENDER_OGL; | G.f &= ~G_RENDER_OGL; | ||||
| gp_rect = MEM_mallocN(sizex * sizey * sizeof(unsigned char) * 4, "offscreen rect"); | gp_rect = MEM_mallocN(sizex * sizey * sizeof(unsigned char) * 4, "offscreen rect"); | ||||
| GPU_offscreen_read_pixels(oglrender->ofs, GL_UNSIGNED_BYTE, gp_rect); | GPU_offscreen_read_pixels(oglrender->ofs, GL_UNSIGNED_BYTE, gp_rect); | ||||
| for (i = 0; i < sizex * sizey * 4; i += 4) { | for (i = 0; i < sizex * sizey * 4; i += 4) { | ||||
| blend_color_mix_byte(&render_rect[i], &render_rect[i], &gp_rect[i]); | blend_color_mix_byte(&render_rect[i], &render_rect[i], &gp_rect[i]); | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 71 Lines • ▼ Show 20 Lines | static void screen_opengl_render_write(OGLRender *oglrender) | ||||
| ok = RE_WriteRenderViewsImage(oglrender->reports, rr, scene, false, name); | ok = RE_WriteRenderViewsImage(oglrender->reports, rr, scene, false, name); | ||||
| RE_ReleaseResultImage(oglrender->re); | RE_ReleaseResultImage(oglrender->re); | ||||
| if (ok) printf("OpenGL Render written to '%s'\n", name); | if (ok) printf("OpenGL Render written to '%s'\n", name); | ||||
| else printf("OpenGL Render failed to write '%s'\n", name); | else printf("OpenGL Render failed to write '%s'\n", name); | ||||
| } | } | ||||
| static void addAlphaOverFloat(float dest[4], const float source[4]) | static void UNUSED_FUNCTION(addAlphaOverFloat)(float dest[4], const float source[4]) | ||||
| { | { | ||||
| /* d = s + (1-alpha_s)d*/ | /* d = s + (1-alpha_s)d*/ | ||||
| float mul; | float mul; | ||||
| mul = 1.0f - source[3]; | mul = 1.0f - source[3]; | ||||
| dest[0] = (mul * dest[0]) + source[0]; | dest[0] = (mul * dest[0]) + source[0]; | ||||
| dest[1] = (mul * dest[1]) + source[1]; | dest[1] = (mul * dest[1]) + source[1]; | ||||
| dest[2] = (mul * dest[2]) + source[2]; | dest[2] = (mul * dest[2]) + source[2]; | ||||
| dest[3] = (mul * dest[3]) + source[3]; | dest[3] = (mul * dest[3]) + source[3]; | ||||
| } | } | ||||
| /* add renderlayer and renderpass for each grease pencil layer for using in composition */ | |||||
| static void add_gpencil_renderpass(const bContext *C, OGLRender *oglrender, RenderResult *rr, RenderView *rv) | |||||
| { | |||||
| bGPdata *gpd = oglrender->scene->gpd; | |||||
| Scene *scene = oglrender->scene; | |||||
| /* sanity checks */ | |||||
| if (gpd == NULL) { | |||||
| return; | |||||
| } | |||||
| if (scene == NULL) { | |||||
| return; | |||||
| } | |||||
| if (BLI_listbase_is_empty(&gpd->layers)) { | |||||
| return; | |||||
| } | |||||
| if (oglrender->v3d != NULL && (oglrender->v3d->flag2 & V3D_SHOW_GPENCIL) == 0) { | |||||
| return; | |||||
| } | |||||
| /* save old alpha mode */ | |||||
| short oldalphamode = scene->r.alphamode; | |||||
| /* set alpha transparent for gp */ | |||||
| scene->r.alphamode = R_ALPHAPREMUL; | |||||
| /* saves layer status */ | |||||
| short *oldsts = MEM_mallocN(BLI_listbase_count(&gpd->layers) * sizeof(short), "temp_gplayers_flag"); | |||||
| int i = 0; | |||||
| for (bGPDlayer *gpl = gpd->layers.first; gpl; gpl = gpl->next) { | |||||
| oldsts[i] = gpl->flag; | |||||
| ++i; | |||||
| } | |||||
| /* loop all layers to create separate render */ | |||||
| for (bGPDlayer *gpl = gpd->layers.first; gpl; gpl = gpl->next) { | |||||
| /* dont draw layer if hidden */ | |||||
| if (gpl->flag & GP_LAYER_HIDE) | |||||
| continue; | |||||
| /* hide all layer except current */ | |||||
| for (bGPDlayer *gph = gpd->layers.first; gph; gph = gph->next) { | |||||
| if (gpl != gph) { | |||||
| gph->flag |= GP_LAYER_HIDE; | |||||
| } | |||||
| } | |||||
| /* render this gp layer */ | |||||
| screen_opengl_render_doit(C, oglrender, rr); | |||||
| /* add RendePass composite */ | |||||
| RenderPass *rp = RE_create_gp_pass(rr, gpl->info, rv->name); | |||||
| /* copy image data from rectf */ | |||||
| // XXX: Needs conversion. | |||||
| unsigned char *src = (unsigned char *)RE_RenderViewGetById(rr, oglrender->view_id)->rect32; | |||||
| if (src != NULL) { | |||||
| float *dest = rp->rect; | |||||
| int x, y, rectx, recty; | |||||
| rectx = rr->rectx; | |||||
| recty = rr->recty; | |||||
| for (y = 0; y < recty; y++) { | |||||
| for (x = 0; x < rectx; x++) { | |||||
| unsigned char *pixSrc = src + 4 * (rectx * y + x); | |||||
| if (pixSrc[3] > 0) { | |||||
| float *pixDest = dest + 4 * (rectx * y + x); | |||||
| float float_src[4]; | |||||
| srgb_to_linearrgb_uchar4(float_src, pixSrc); | |||||
| addAlphaOverFloat(pixDest, float_src); | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| /* back layer status */ | |||||
| i = 0; | |||||
| for (bGPDlayer *gph = gpd->layers.first; gph; gph = gph->next) { | |||||
| gph->flag = oldsts[i]; | |||||
| ++i; | |||||
| } | |||||
| } | |||||
| /* free memory */ | |||||
| MEM_freeN(oldsts); | |||||
| /* back default alpha mode */ | |||||
| scene->r.alphamode = oldalphamode; | |||||
| } | |||||
| static void screen_opengl_render_apply(const bContext *C, OGLRender *oglrender) | static void screen_opengl_render_apply(const bContext *C, OGLRender *oglrender) | ||||
| { | { | ||||
| RenderResult *rr; | RenderResult *rr; | ||||
| RenderView *rv; | RenderView *rv; | ||||
| int view_id; | int view_id; | ||||
| ImBuf *ibuf; | ImBuf *ibuf; | ||||
| void *lock; | void *lock; | ||||
| Show All 18 Lines | if (oglrender->is_sequencer) { | ||||
| } | } | ||||
| } | } | ||||
| rr = RE_AcquireResultRead(oglrender->re); | rr = RE_AcquireResultRead(oglrender->re); | ||||
| for (rv = rr->views.first, view_id = 0; rv; rv = rv->next, view_id++) { | for (rv = rr->views.first, view_id = 0; rv; rv = rv->next, view_id++) { | ||||
| BLI_assert(view_id < oglrender->views_len); | BLI_assert(view_id < oglrender->views_len); | ||||
| RE_SetActiveRenderView(oglrender->re, rv->name); | RE_SetActiveRenderView(oglrender->re, rv->name); | ||||
| oglrender->view_id = view_id; | oglrender->view_id = view_id; | ||||
| /* add grease pencil passes. For sequencer, the render does not include renderpasses | |||||
| * TODO: The sequencer render of grease pencil should be rethought */ | |||||
| if (!oglrender->is_sequencer) { | |||||
| add_gpencil_renderpass(C, oglrender, rr, rv); | |||||
| } | |||||
| /* render composite */ | /* render composite */ | ||||
| screen_opengl_render_doit(C, oglrender, rr); | screen_opengl_render_doit(C, oglrender, rr); | ||||
| } | } | ||||
| RE_ReleaseResult(oglrender->re); | RE_ReleaseResult(oglrender->re); | ||||
| ibuf = BKE_image_acquire_ibuf(oglrender->ima, &oglrender->iuser, &lock); | ibuf = BKE_image_acquire_ibuf(oglrender->ima, &oglrender->iuser, &lock); | ||||
| if (ibuf) { | if (ibuf) { | ||||
| ▲ Show 20 Lines • Show All 651 Lines • Show Last 20 Lines | |||||