Changeset View
Changeset View
Standalone View
Standalone View
source/blender/draw/intern/draw_manager.c
| Context not available. | |||||
| BLI_assert(!"Draw mode invalid"); | BLI_assert(!"Draw mode invalid"); | ||||
| break; | break; | ||||
| } | } | ||||
| /* grease pencil */ | |||||
| use_drw_engine(&draw_engine_gpencil_type); | |||||
| } | } | ||||
| /** | /** | ||||
| Context not available. | |||||
| drw_engines_enable_from_object_mode(); | drw_engines_enable_from_object_mode(); | ||||
| drw_engines_enable_from_mode(mode); | drw_engines_enable_from_mode(mode); | ||||
| } | } | ||||
| else { | |||||
| /* if gpencil must draw the strokes, but not the object */ | |||||
| if (mode == CTX_MODE_OBJECT) { | |||||
| drw_engines_enable_from_mode(mode); | |||||
| } | |||||
| } | |||||
| } | } | ||||
| static void drw_engines_disable(void) | static void drw_engines_disable(void) | ||||
| Context not available. | |||||
| GPU_offscreen_bind(ofs, false); | GPU_offscreen_bind(ofs, false); | ||||
| } | } | ||||
| /* helper to check if exit object type to render */ | |||||
| static bool DRW_render_check_object_type(struct Depsgraph *depsgraph, short obtype) | |||||
| { | |||||
| DEG_OBJECT_ITER_FOR_RENDER_ENGINE_BEGIN(depsgraph, ob, DRW_iterator_mode_get()) | |||||
| { | |||||
| if ((ob->type == obtype) && (DRW_check_object_visible_within_active_context(ob))) { | |||||
| return true; | |||||
| } | |||||
| } | |||||
| DEG_OBJECT_ITER_FOR_RENDER_ENGINE_END | |||||
| return false; | |||||
| } | |||||
| static void DRW_render_gpencil_to_image(RenderEngine *engine, struct Depsgraph *depsgraph, struct RenderLayer *render_layer, const rcti *rect) | |||||
| { | |||||
| if (draw_engine_gpencil_type.render_to_image) { | |||||
| if (DRW_render_check_object_type(depsgraph, OB_GPENCIL)) { | |||||
| ViewportEngineData *gpdata = drw_viewport_engine_data_ensure(&draw_engine_gpencil_type); | |||||
| draw_engine_gpencil_type.render_to_image(gpdata, engine, render_layer, rect); | |||||
| } | |||||
| } | |||||
| } | |||||
| void DRW_render_gpencil(struct RenderEngine *engine, struct Depsgraph *depsgraph) | |||||
| { | |||||
| /* This function is only valid for Cycles | |||||
| * Eevee done all work in the Eevee render directly. | |||||
| * Maybe it can be done equal for both engines? | |||||
| */ | |||||
| if (STREQ(engine->type->name, "Eevee")) { | |||||
| return; | |||||
| } | |||||
| Scene *scene = DEG_get_evaluated_scene(depsgraph); | |||||
| ViewLayer *view_layer = DEG_get_evaluated_view_layer(depsgraph); | |||||
| RenderEngineType *engine_type = engine->type; | |||||
| DrawEngineType *draw_engine_type = engine_type->draw_engine; | |||||
| RenderData *r = &scene->r; | |||||
| Render *render = engine->re; | |||||
| /* Changing Context */ | |||||
| DRW_opengl_context_enable(); | |||||
| /* Reset before using it. */ | |||||
| memset(&DST, 0x0, offsetof(DRWManager, ogl_context)); | |||||
| DST.options.is_image_render = true; | |||||
| DST.options.is_scene_render = true; | |||||
| DST.options.draw_background = scene->r.alphamode == R_ADDSKY; | |||||
| DST.buffer_finish_called = true; | |||||
| DST.draw_ctx = (DRWContextState) { | |||||
| NULL, NULL, NULL, scene, view_layer, NULL, engine_type, depsgraph, OB_MODE_OBJECT, NULL, | |||||
| }; | |||||
| drw_context_state_init(); | |||||
| DST.viewport = GPU_viewport_create(); | |||||
| const int size[2] = { (r->size * r->xsch) / 100, (r->size * r->ysch) / 100 }; | |||||
| GPU_viewport_size_set(DST.viewport, size); | |||||
| drw_viewport_var_init(); | |||||
| /* set default viewport */ | |||||
| gpuPushAttrib(GPU_ENABLE_BIT | GPU_VIEWPORT_BIT); | |||||
| glDisable(GL_SCISSOR_TEST); | |||||
| glViewport(0, 0, size[0], size[1]); | |||||
| /* Main rendering. */ | |||||
| rctf view_rect; | |||||
| rcti render_rect; | |||||
| RE_GetViewPlane(render, &view_rect, &render_rect); | |||||
| if (BLI_rcti_is_empty(&render_rect)) { | |||||
| BLI_rcti_init(&render_rect, 0, size[0], 0, size[1]); | |||||
| } | |||||
| RenderResult *render_result = RE_engine_get_result(engine); | |||||
| RenderLayer *render_layer = render_result->layers.first; | |||||
| DRW_render_gpencil_to_image(engine, depsgraph, render_layer, &render_rect); | |||||
| /* Force cache to reset. */ | |||||
| drw_viewport_cache_resize(); | |||||
| GPU_viewport_free(DST.viewport); | |||||
| DRW_state_reset(); | |||||
| glDisable(GL_DEPTH_TEST); | |||||
| /* Restore Drawing area. */ | |||||
| gpuPopAttrib(); | |||||
| glEnable(GL_SCISSOR_TEST); | |||||
| GPU_framebuffer_restore(); | |||||
| /* Changing Context */ | |||||
| DRW_opengl_context_disable(); | |||||
| DST.buffer_finish_called = false; | |||||
| } | |||||
| void DRW_render_to_image(RenderEngine *engine, struct Depsgraph *depsgraph) | void DRW_render_to_image(RenderEngine *engine, struct Depsgraph *depsgraph) | ||||
| { | { | ||||
| Scene *scene = DEG_get_evaluated_scene(depsgraph); | Scene *scene = DEG_get_evaluated_scene(depsgraph); | ||||
| Context not available. | |||||
| { | { | ||||
| RE_SetActiveRenderView(render, render_view->name); | RE_SetActiveRenderView(render, render_view->name); | ||||
| engine_type->draw_engine->render_to_image(data, engine, render_layer, &render_rect); | engine_type->draw_engine->render_to_image(data, engine, render_layer, &render_rect); | ||||
| /* grease pencil: render result is merged in the previous render result. */ | |||||
| DRW_render_gpencil_to_image(engine, depsgraph, render_layer, &render_rect); | |||||
| DST.buffer_finish_called = false; | DST.buffer_finish_called = false; | ||||
| } | } | ||||
| Context not available. | |||||
| /* Force cache to reset. */ | /* Force cache to reset. */ | ||||
| drw_viewport_cache_resize(); | drw_viewport_cache_resize(); | ||||
| /* TODO grease pencil */ | |||||
| GPU_viewport_free(DST.viewport); | GPU_viewport_free(DST.viewport); | ||||
| DRW_state_reset(); | DRW_state_reset(); | ||||
| Context not available. | |||||
| DRW_engine_register(&draw_engine_particle_type); | DRW_engine_register(&draw_engine_particle_type); | ||||
| DRW_engine_register(&draw_engine_pose_type); | DRW_engine_register(&draw_engine_pose_type); | ||||
| DRW_engine_register(&draw_engine_sculpt_type); | DRW_engine_register(&draw_engine_sculpt_type); | ||||
| DRW_engine_register(&draw_engine_gpencil_type); | |||||
| /* setup callbacks */ | /* setup callbacks */ | ||||
| { | { | ||||
| Context not available. | |||||
| /* BKE: particle.c */ | /* BKE: particle.c */ | ||||
| extern void *BKE_particle_batch_cache_dirty_cb; | extern void *BKE_particle_batch_cache_dirty_cb; | ||||
| extern void *BKE_particle_batch_cache_free_cb; | extern void *BKE_particle_batch_cache_free_cb; | ||||
| /* BKE: gpencil.c */ | |||||
| extern void *BKE_gpencil_batch_cache_dirty_cb; | |||||
| extern void *BKE_gpencil_batch_cache_free_cb; | |||||
| BKE_mball_batch_cache_dirty_cb = DRW_mball_batch_cache_dirty; | BKE_mball_batch_cache_dirty_cb = DRW_mball_batch_cache_dirty; | ||||
| BKE_mball_batch_cache_free_cb = DRW_mball_batch_cache_free; | BKE_mball_batch_cache_free_cb = DRW_mball_batch_cache_free; | ||||
| Context not available. | |||||
| BKE_particle_batch_cache_dirty_cb = DRW_particle_batch_cache_dirty; | BKE_particle_batch_cache_dirty_cb = DRW_particle_batch_cache_dirty; | ||||
| BKE_particle_batch_cache_free_cb = DRW_particle_batch_cache_free; | BKE_particle_batch_cache_free_cb = DRW_particle_batch_cache_free; | ||||
| BKE_gpencil_batch_cache_dirty_cb = DRW_gpencil_batch_cache_dirty; | |||||
| BKE_gpencil_batch_cache_free_cb = DRW_gpencil_batch_cache_free; | |||||
| } | } | ||||
| } | } | ||||
| Context not available. | |||||