1 /* 2 * This program is free software; you can redistribute it and/or 3 * modify it under the terms of the GNU General Public License 4 * as published by the Free Software Foundation; either version 2 5 * of the License, or (at your option) any later version. 6 * 7 * This program is distributed in the hope that it will be useful, 8 * but WITHOUT ANY WARRANTY; without even the implied warranty of 9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10 * GNU General Public License for more details. 11 * 12 * You should have received a copy of the GNU General Public License 13 * along with this program; if not, write to the Free Software Foundation, 14 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 15 * 16 * The Original Code is Copyright (C) 2006 Blender Foundation. 17 * All rights reserved. 18 */ 19 20 /** \file 21 * \ingroup render 22 */ 23 24 #pragma once 25 26 #include "DNA_listBase.h" 27 #include "DNA_node_types.h" 28 #include "DNA_scene_types.h" 29 #include "RE_bake.h" 30 #include "RNA_types.h" 31 32 #include "BLI_threads.h" 33 34 struct BakePixel; 35 struct Depsgraph; 36 struct Main; 37 struct Object; 38 struct Render; 39 struct RenderData; 40 struct RenderEngine; 41 struct RenderEngineType; 42 struct RenderLayer; 43 struct RenderResult; 44 struct ReportList; 45 struct Scene; 46 struct ViewLayer; 47 struct bNode; 48 struct bNodeTree; 49 50 #ifdef __cplusplus 51 extern "C" { 52 #endif 53 54 /* External Engine */ 55 56 /* RenderEngineType.flag */ 57 #define RE_INTERNAL 1 58 /* #define RE_FLAG_DEPRECATED 2 */ 59 #define RE_USE_PREVIEW 4 60 #define RE_USE_POSTPROCESS 8 61 #define RE_USE_EEVEE_VIEWPORT 16 62 #define RE_USE_SAVE_BUFFERS 32 63 #define RE_USE_SHADING_NODES_CUSTOM 64 64 #define RE_USE_SPHERICAL_STEREO 128 65 #define RE_USE_STEREO_VIEWPORT 256 66 #define RE_USE_GPU_CONTEXT 512 67 68 /* RenderEngine.flag */ 69 #define RE_ENGINE_ANIMATION 1 70 #define RE_ENGINE_PREVIEW 2 71 #define RE_ENGINE_DO_DRAW 4 72 #define RE_ENGINE_DO_UPDATE 8 73 #define RE_ENGINE_RENDERING 16 74 #define RE_ENGINE_HIGHLIGHT_TILES 32 75 76 extern ListBase R_engines; 77 78 typedef struct RenderEngineType { 79 struct RenderEngineType *next, *prev; 80 81 /* type info */ 82 char idname[64]; /* best keep the same size as BKE_ST_MAXNAME. */ 83 char name[64]; 84 int flag; 85 86 void (*update)(struct RenderEngine *engine, struct Main *bmain, struct Depsgraph *depsgraph); 87 void (*render)(struct RenderEngine *engine, struct Depsgraph *depsgraph); 88 void (*bake)(struct RenderEngine *engine, 89 struct Depsgraph *depsgraph, 90 struct Object *object, 91 const int pass_type, 92 const int pass_filter, 93 const int width, 94 const int height); 95 96 void (*view_update)(struct RenderEngine *engine, 97 const struct bContext *context, 98 struct Depsgraph *depsgraph); 99 void (*view_draw)(struct RenderEngine *engine, 100 const struct bContext *context, 101 struct Depsgraph *depsgraph); 102 103 void (*update_script_node)(struct RenderEngine *engine, 104 struct bNodeTree *ntree, 105 struct bNode *node); 106 void (*update_render_passes)(struct RenderEngine *engine, 107 struct Scene *scene, 108 struct ViewLayer *view_layer); 109 110 struct DrawEngineType *draw_engine; 111 112 /* RNA integration */ 113 ExtensionRNA rna_ext; 114 } RenderEngineType; 115 116 typedef void (*update_render_passes_cb_t)(void *userdata, 117 struct Scene *scene, 118 struct ViewLayer *view_layer, 119 const char *name, 120 int channels, 121 const char *chanid, 122 eNodeSocketDatatype type); 123 124 typedef struct RenderEngine { 125 RenderEngineType *type; 126 void *py_instance; 127 128 int flag; 129 struct Object *camera_override; 130 unsigned int layer_override; 131 132 int tile_x; 133 int tile_y; 134 135 struct Render *re; 136 ListBase fullresult; 137 char text[512]; /* IMA_MAX_RENDER_TEXT */ 138 139 int resolution_x, resolution_y; 140 141 struct ReportList *reports; 142 143 struct { 144 const struct BakePixel *pixels; 145 float *result; 146 int width, height, depth; 147 int object_id; 148 } bake; 149 150 /* Depsgraph */ 151 struct Depsgraph *depsgraph; 152 bool has_grease_pencil; 153 154 /* callback for render pass query */ 155 ThreadMutex update_render_passes_mutex; 156 update_render_passes_cb_t update_render_passes_cb; 157 void *update_render_passes_data; 158 159 rctf last_viewplane; 160 rcti last_disprect; 161 float last_viewmat[4][4]; 162 int last_winx, last_winy; 163 } RenderEngine; 164 165 RenderEngine *RE_engine_create(RenderEngineType *type); 166 void RE_engine_free(RenderEngine *engine); 167 168 void RE_layer_load_from_file( 169 struct RenderLayer *layer, struct ReportList *reports, const char *filename, int x, int y); 170 void RE_result_load_from_file(struct RenderResult *result, 171 struct ReportList *reports, 172 const char *filename); 173 174 struct RenderResult *RE_engine_begin_result( 175 RenderEngine *engine, int x, int y, int w, int h, const char *layername, const char *viewname); 176 void RE_engine_update_result(RenderEngine *engine, struct RenderResult *result); 177 void RE_engine_add_pass(RenderEngine *engine, 178 const char *name, 179 int channels, 180 const char *chan_id, 181 const char *layername); 182 void RE_engine_end_result(RenderEngine *engine, 183 struct RenderResult *result, 184 bool cancel, 185 bool highlight, 186 bool merge_results); 187 struct RenderResult *RE_engine_get_result(struct RenderEngine *engine); 188 189 const char *RE_engine_active_view_get(RenderEngine *engine); 190 void RE_engine_active_view_set(RenderEngine *engine, const char *viewname); 191 float RE_engine_get_camera_shift_x(RenderEngine *engine, 192 struct Object *camera, 193 bool use_spherical_stereo); 194 void RE_engine_get_camera_model_matrix(RenderEngine *engine, 195 struct Object *camera, 196 bool use_spherical_stereo, 197 float *r_modelmat); 198 bool RE_engine_get_spherical_stereo(RenderEngine *engine, struct Object *camera); 199 200 bool RE_engine_test_break(RenderEngine *engine); 201 void RE_engine_update_stats(RenderEngine *engine, const char *stats, const char *info); 202 void RE_engine_update_progress(RenderEngine *engine, float progress); 203 void RE_engine_update_memory_stats(RenderEngine *engine, float mem_used, float mem_peak); 204 void RE_engine_report(RenderEngine *engine, int type, const char *msg); 205 void RE_engine_set_error_message(RenderEngine *engine, const char *msg); 206 207 int RE_engine_render(struct Render *re, int do_all); 208 209 bool RE_engine_is_external(const struct Render *re); 210 211 void RE_engine_frame_set(struct RenderEngine *engine, int frame, float subframe); 212 213 void RE_engine_update_render_passes(struct RenderEngine *engine, 214 struct Scene *scene, 215 struct ViewLayer *view_layer, 216 update_render_passes_cb_t callback, 217 void *callback_data); 218 void RE_engine_register_pass(struct RenderEngine *engine, 219 struct Scene *scene, 220 struct ViewLayer *view_layer, 221 const char *name, 222 int channels, 223 const char *chanid, 224 eNodeSocketDatatype type); 225 226 /* Engine Types */ 227 228 void RE_engines_init(void); 229 void RE_engines_exit(void); 230 void RE_engines_register(RenderEngineType *render_type); 231 232 bool RE_engine_is_opengl(RenderEngineType *render_type); 233 234 RenderEngineType *RE_engines_find(const char *idname); 235 236 rcti *RE_engine_get_current_tiles(struct Render *re, int *r_total_tiles, bool *r_needs_free); 237 struct RenderData *RE_engine_get_render_data(struct Render *re); 238 void RE_bake_engine_set_engine_parameters(struct Render *re, 239 struct Main *bmain, 240 struct Scene *scene); 241 242 void RE_engine_free_blender_memory(struct RenderEngine *engine); 243 244 #ifdef __cplusplus 245 } 246 #endif 247