74 if (type->rna_ext.free) {
75 type->rna_ext.free(type->rna_ext.data);
125 RenderEngine *engine = MEM_cnew<RenderEngine>(
"RenderEngine");
139 if (use_gpu_context) {
154 if (use_gpu_context) {
184 RenderEngine *engine,
int x,
int y,
int w,
int h,
const char *layername)
191 if (image->render_layer_name[0] ==
'\0') {
192 STRNCPY(image->render_layer_name, layername);
206 RenderLayer *rl = MEM_cnew<RenderLayer>(
"bake render layer");
217 rr, rl, 4,
"BakeDifferential",
"",
"RGBA",
true);
221 RenderPass *seed_pass = (image->image ==
nullptr) ?
226 for (
int ty = 0; ty < h; ty++) {
227 size_t offset = ty *
w;
232 size_t bake_offset = (y + ty) * image->width + x;
233 const BakePixel *bake_pixel = pixels + bake_offset;
235 for (
int tx = 0; tx <
w; tx++) {
242 primitive[0] = bake_pixel->
uv[0];
243 primitive[1] = bake_pixel->
uv[1];
252 if (seed_pass !=
nullptr) {
288 const size_t channels_size = channels_num *
sizeof(
float);
289 float *result = engine->
bake.
result + image->offset * channels_num;
298 for (
int ty = 0; ty < h; ty++) {
299 const size_t offset = ty *
w;
300 const size_t bake_offset = (y + ty) * image->width + x;
303 const BakePixel *bake_pixel = pixels + bake_offset;
304 float *bake_result = result + bake_offset * channels_num;
306 for (
int tx = 0; tx <
w; tx++) {
308 memcpy(bake_result, pass_rect, channels_size);
310 pass_rect += channels_num;
311 bake_result += channels_num;
320 RenderEngine *engine,
int x,
int y,
int w,
int h,
const char *layername,
const char *viewname)
347 disprect.
xmax = x +
w;
349 disprect.
ymax = y + h;
395 result->layers.first);
404 const char *layername)
425 if (!cancel || merge_results) {
436 if (tile_highlight) {
446 if (!cancel || merge_results) {
455 result->layers.first);
499 engine->
text[0] =
'\0';
501 if (stats && stats[0] && info && info[0]) {
504 else if (info && info[0]) {
507 else if (stats && stats[0]) {
517 CLAMP(progress, 0.0f, 1.0f);
550 if (rr->
error !=
nullptr) {
571 if (layer !=
nullptr) {
597 if (use_spherical_stereo || re ==
nullptr) {
606 bool use_spherical_stereo,
607 float r_modelmat[16])
612 if (use_spherical_stereo || re ==
nullptr) {
629 if (!tiles_highlight) {
636 *r_total_tiles = highlighted_tiles.
size();
637 return highlighted_tiles.
data();
666 bool reuse_depsgraph =
false;
683 reuse_depsgraph =
true;
703 if (use_gpu_context) {
709 if (use_gpu_context) {
767 return (type->bake !=
nullptr);
777 const int pass_filter,
817 for (
int i = 0; i < targets->
images_num; i++) {
822 engine, engine->
depsgraph,
object, pass_type, pass_filter, image->width, image->height);
826 if (type->render_frame_finish) {
828 type->render_frame_finish(engine);
831 memset(&engine->
bake, 0,
sizeof(engine->
bake));
836 engine->
flag &= ~RE_ENGINE_RENDERING;
855 const bool use_engine,
856 const bool use_grease_pencil)
873 if (use_gpu_context) {
901 if (use_gpu_context) {
911 if (use_gpu_context) {
925 if (use_gpu_context) {
1024 if (create_new_result) {
1033 if (re->
result ==
nullptr) {
1071 bool delay_grease_pencil =
false;
1089 if (type->render_frame_finish) {
1090 type->render_frame_finish(engine);
1094 if (delay_grease_pencil) {
1105 engine->
flag &= ~RE_ENGINE_RENDERING;
1128#ifdef WITH_FREESTYLE
1130 RE_RenderFreestyleExternal(re);
1141 void *callback_data)
1193 return view_render->
engine;
1232 RenderEngine *engine,
int x,
int y,
int width,
int height,
bool highlight)
1246 if (!tile_highlight) {
1273 if (!tile_highlight) {
1278 tile_highlight->
clear();
Camera data-block and utility functions.
float BKE_camera_multiview_shift_x(const struct RenderData *rd, const struct Object *camera, const char *viewname)
void BKE_camera_multiview_model_matrix(const struct RenderData *rd, const struct Object *camera, const char *viewname, float r_modelmat[4][4])
bool BKE_camera_multiview_spherical_stereo(const struct RenderData *rd, const struct Object *camera)
bool BKE_reports_contain(ReportList *reports, eReportType level)
void BKE_report(ReportList *reports, eReportType type, const char *message)
bool BKE_scene_uses_cycles(const Scene *scene)
void BKE_scene_graph_update_for_newframe_ex(Depsgraph *depsgraph, bool clear_recalc)
void BKE_scene_frame_set(Scene *scene, float frame)
bool BKE_scene_camera_switch_update(Scene *scene)
bool BKE_scene_uses_cycles_experimental_features(Scene *scene)
float BKE_scene_frame_get(const Scene *scene)
void * BLI_findstring(const struct ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void * BLI_findlink(const struct ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
MINLINE float int_as_float(int i)
char * BLI_strdup(const char *str) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1) ATTR_MALLOC
#define STRNCPY(dst, src)
#define SNPRINTF(dst, format,...)
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_NONNULL(1
void BLI_mutex_end(ThreadMutex *mutex)
void BLI_mutex_init(ThreadMutex *mutex)
#define THREAD_LOCK_WRITE
void BLI_rw_mutex_lock(ThreadRWMutex *mutex, int mode)
int BLI_thread_is_main(void)
void BLI_mutex_lock(ThreadMutex *mutex)
void BLI_mutex_unlock(ThreadMutex *mutex)
void BLI_rw_mutex_unlock(ThreadRWMutex *mutex)
void BPY_DECREF_RNA_INVALIDATE(void *pyob_ptr)
typedef double(DMatrix)[4][4]
void DEG_ids_clear_recalc(Depsgraph *depsgraph, bool backup)
Depsgraph * DEG_graph_new(Main *bmain, Scene *scene, ViewLayer *view_layer, eEvaluationMode mode)
void DEG_graph_replace_owners(Depsgraph *depsgraph, Main *bmain, Scene *scene, ViewLayer *view_layer)
void DEG_graph_free(Depsgraph *graph)
void DEG_evaluate_on_framechange(Depsgraph *graph, float frame, DepsgraphEvaluateSyncWriteback sync_writeback=DEG_EVALUATE_SYNC_WRITEBACK_NO)
void DEG_graph_tag_relations_update(Depsgraph *graph)
void DEG_graph_relations_update(Depsgraph *graph)
void DEG_debug_name_set(Depsgraph *depsgraph, const char *name)
ViewLayer * DEG_get_input_view_layer(const Depsgraph *graph)
Main * DEG_get_bmain(const Depsgraph *graph)
Scene * DEG_get_input_scene(const Depsgraph *graph)
Object is a sort of wrapper for general info.
#define RE_PASSNAME_COMBINED
bool DRW_render_check_grease_pencil(Depsgraph *depsgraph)
void DRW_gpu_context_disable()
void DRW_gpu_context_enable()
void DRW_gpu_context_activate(bool drw_state)
void DRW_render_context_disable(Render *render)
void DRW_engine_register(DrawEngineType *draw_engine_type)
void DRW_render_gpencil(RenderEngine *engine, Depsgraph *depsgraph)
bool DRW_gpu_context_release()
void DRW_engines_register()
void DRW_render_context_enable(Render *render)
GPUContext * GPU_context_create(void *ghost_window, void *ghost_context)
bool GPU_backend_supported()
GPUContext * GPU_context_active_get()
void GPU_context_discard(GPUContext *)
void GPU_context_active_set(GPUContext *)
Contains defines and structs used throughout the imbuf module.
Read Guarded memory(de)allocation.
in reality light always falls off quadratically Particle Retrieve the data of the particle that spawned the object for example to give variation to multiple instances of an object Point Retrieve information about points in a point cloud Retrieve the edges of an object as it appears to Cycles topology will always appear triangulated Convert a blackbody temperature to an RGB value Normal Generate a perturbed normal from an RGB normal map image Typically used for faking highly detailed surfaces Generate an OSL shader from a file or text data block Image Sample an image file as a texture Gabor Generate Gabor noise Gradient Generate interpolated color and intensity values based on the input vector Magic Generate a psychedelic color texture Voronoi Generate Worley noise based on the distance to random points Typically used to generate textures such as or biological cells Brick Generate a procedural texture producing bricks Texture Retrieve multiple types of texture coordinates nTypically used as inputs for texture nodes Vector Convert a or normal between camera
@ RE_USE_ALEMBIC_PROCEDURAL
void(* update_render_passes_cb_t)(void *userdata, struct Scene *scene, struct ViewLayer *view_layer, const char *name, int channels, const char *chanid, eNodeSocketDatatype type)
@ RE_ENGINE_HIGHLIGHT_TILES
struct GPUContext GPUContext
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
static unsigned long seed
constexpr const T * data() const
constexpr int64_t size() const
void highlight_tile_for_result(const RenderResult *result)
void unhighlight_tile(int x, int y, int width, int height)
void unhighlight_tile_for_result(const RenderResult *result)
Span< rcti > get_all_highlighted_tiles() const
void highlight_tile(int x, int y, int width, int height)
const Depsgraph * depsgraph
DEGForeachIDComponentCallback callback
draw_view in_light_buf[] float
static void re_ensure_passes_allocated_thread_safe(Render *re)
void RE_engine_draw_release(Render *re)
bool RE_engine_is_external(const Render *re)
const char * RE_engine_active_view_get(RenderEngine *engine)
RenderEngine * RE_view_engine_get(const ViewRender *view_render)
static RenderResult * render_result_from_bake(RenderEngine *engine, int x, int y, int w, int h, const char *layername)
bool RE_bake_engine(Render *re, Depsgraph *depsgraph, Object *object, const int object_id, const BakePixel pixel_array[], const BakeTargets *targets, const eScenePassType pass_type, const int pass_filter, float result[])
void RE_engine_frame_set(RenderEngine *engine, int frame, float subframe)
bool RE_engine_supports_alembic_procedural(const RenderEngineType *render_type, Scene *scene)
RenderResult * RE_engine_begin_result(RenderEngine *engine, int x, int y, int w, int h, const char *layername, const char *viewname)
RenderResult * RE_engine_get_result(RenderEngine *engine)
static void engine_depsgraph_exit(RenderEngine *engine)
void RE_engine_add_pass(RenderEngine *engine, const char *name, int channels, const char *chan_id, const char *layername)
static void engine_depsgraph_init(RenderEngine *engine, ViewLayer *view_layer)
void RE_engine_report(RenderEngine *engine, int type, const char *msg)
bool RE_bake_has_engine(const Render *re)
void RE_engine_active_view_set(RenderEngine *engine, const char *viewname)
bool RE_engine_use_persistent_data(RenderEngine *engine)
float RE_engine_get_camera_shift_x(RenderEngine *engine, Object *camera, bool use_spherical_stereo)
void RE_engine_update_result(RenderEngine *engine, RenderResult *result)
static void engine_render_view_layer(Render *re, RenderEngine *engine, ViewLayer *view_layer_iter, const bool use_engine, const bool use_grease_pencil)
const rcti * RE_engine_get_current_tiles(Render *re, int *r_total_tiles)
void RE_engine_update_memory_stats(RenderEngine *engine, float mem_used, float mem_peak)
void RE_engine_update_render_passes(RenderEngine *engine, Scene *scene, ViewLayer *view_layer, update_render_passes_cb_t callback, void *callback_data)
RenderEngine * RE_engine_get(const Render *re)
RenderPass * RE_engine_pass_by_index_get(RenderEngine *engine, const char *layer_name, int index)
RenderEngineType * RE_engines_find(const char *idname)
void RE_engine_tile_highlight_set(RenderEngine *engine, int x, int y, int width, int height, bool highlight)
bool RE_engine_draw_acquire(Render *re)
bool RE_engine_get_spherical_stereo(RenderEngine *engine, Object *camera)
RenderEngine * RE_engine_create(RenderEngineType *type)
bool RE_engine_render(Render *re, bool do_all)
bool RE_engine_test_break(RenderEngine *engine)
void RE_engine_update_stats(RenderEngine *engine, const char *stats, const char *info)
void RE_bake_engine_set_engine_parameters(Render *re, Main *bmain, Scene *scene)
void RE_engine_gpu_context_lock(RenderEngine *engine)
void RE_engine_gpu_context_unlock(RenderEngine *engine)
static void engine_depsgraph_free(RenderEngine *engine)
static RenderResult * engine_render_create_result(Render *re)
void RE_engines_register(RenderEngineType *render_type)
static void engine_render_add_result_pass_cb(void *user_data, Scene *, ViewLayer *view_layer, const char *name, int channels, const char *chanid, eNodeSocketDatatype)
void RE_engine_free(RenderEngine *engine)
RenderData * RE_engine_get_render_data(Render *re)
void RE_engine_free_blender_memory(RenderEngine *engine)
void RE_engine_set_error_message(RenderEngine *engine, const char *msg)
void RE_engine_register_pass(RenderEngine *engine, Scene *scene, ViewLayer *view_layer, const char *name, int channels, const char *chanid, eNodeSocketDatatype type)
void RE_engine_end_result(RenderEngine *engine, RenderResult *result, bool cancel, bool highlight, bool merge_results)
void RE_engine_tile_highlight_clear_all(RenderEngine *engine)
static bool engine_keep_depsgraph(RenderEngine *engine)
void RE_engine_gpu_context_destroy(RenderEngine *engine)
static void render_result_to_bake(RenderEngine *engine, RenderResult *rr)
bool RE_engine_gpu_context_enable(RenderEngine *engine)
bool RE_engine_gpu_context_create(RenderEngine *engine)
void RE_engine_get_camera_model_matrix(RenderEngine *engine, Object *camera, bool use_spherical_stereo, float r_modelmat[16])
void RE_engine_update_progress(RenderEngine *engine, float progress)
void RE_engine_gpu_context_disable(RenderEngine *engine)
void MEM_freeN(void *vmemh)
void render_result_exr_file_cache_write(Render *re)
void render_result_merge(RenderResult *rr, RenderResult *rrpart)
RenderPass * render_layer_add_pass(RenderResult *rr, RenderLayer *rl, int channels, const char *name, const char *viewname, const char *chan_id, const bool allocate)
void render_result_passes_allocated_ensure(RenderResult *rr)
void render_result_free(RenderResult *rr)
void render_result_clone_passes(Render *re, RenderResult *rr, const char *viewname)
void render_result_free_list(ListBase *lb, RenderResult *rr)
RenderResult * render_result_new(Render *re, const rcti *partrct, const char *layername, const char *viewname)
void RE_create_render_pass(RenderResult *rr, const char *name, int channels, const char *chan_id, const char *layername, const char *viewname, const bool allocate)
#define FOREACH_VIEW_LAYER_TO_RENDER_END
#define FOREACH_VIEW_LAYER_TO_RENDER_BEGIN(re_, iter_)
void * RE_system_gpu_context_get(Render *re)
RenderPass * RE_pass_find_by_name(RenderLayer *rl, const char *name, const char *viewname)
void render_copy_renderdata(RenderData *to, RenderData *from)
void RE_FreePersistentData(const Scene *scene)
RenderResult * RE_AcquireResultRead(Render *re)
RenderLayer * RE_GetRenderLayer(RenderResult *rr, const char *name)
void RE_ReleaseResult(Render *re)
const char * RE_GetActiveRenderView(Render *re)
void RE_SetActiveRenderView(Render *re, const char *viewname)
char render_layer_name[RE_MAXNAME]
ThreadMutex engine_draw_mutex
struct RenderEngine * engine
ThreadRWMutex resultmutex
ImBufFloatBuffer float_buffer
void(* render)(struct RenderEngine *engine, struct Depsgraph *depsgraph)
void(* update)(struct RenderEngine *engine, struct Main *bmain, struct Depsgraph *depsgraph)
struct DrawEngineType * draw_engine
void(* draw)(struct RenderEngine *engine, const struct bContext *context, struct Depsgraph *depsgraph)
void(* update_render_passes)(struct RenderEngine *engine, struct Scene *scene, struct ViewLayer *view_layer)
struct ReportList * reports
struct Depsgraph * depsgraph
struct RenderEngine::@1361 bake
const struct BakePixel * pixels
ThreadMutex blender_gpu_context_mutex
bool use_drw_render_context
struct GPUContext * blender_gpu_context
void * update_render_passes_data
void * system_gpu_context
update_render_passes_cb_t update_render_passes_cb
ThreadMutex update_render_passes_mutex
const struct BakeTargets * targets
struct Object * camera_override
char scene_name[MAX_ID_NAME - 2]
void draw_unlock() override
void draw_lock() override
void display_update(RenderResult *render_result, rcti *rect) override
bool test_break() override
bool prepare_viewlayer(struct ViewLayer *view_layer, struct Depsgraph *depsgraph) override
blender::render::TilesHighlight * get_tile_highlight() override
void progress(float progress) override
struct ReportList * reports
struct Object * camera_override
void stats_draw(RenderStats *render_stats) override
void * WM_system_gpu_context_create()
void WM_system_gpu_context_dispose(void *context)
void WM_system_gpu_context_activate(void *context)
void WM_system_gpu_context_release(void *context)