Commit: 1607bcebc65fd5296f9f695e76580a1ae7ade9a2 Author: Dalai Felinto Date: Mon Jul 28 16:43:32 2014 -0300 Branches: testbuild https://developer.blender.org/rB1607bcebc65fd5296f9f695e76580a1ae7ade9a2
Bake-API: use size_t instead of width, height * Original patch by Sergey Sharybin * Current patch includes function to estimate a width/height when baking into multiple images Attempt to Fix T41222 Blender gives weird ouput when baking (4096*4096) resolution on GPU Reviewers: sergey Subscribers: RadiationG0D Maniphest Tasks: T41222 Differential Revision: https://developer.blender.org/D688 =================================================================== M intern/cycles/blender/addon/__init__.py M intern/cycles/blender/addon/engine.py M intern/cycles/blender/blender_python.cpp M intern/cycles/blender/blender_session.cpp M intern/cycles/blender/blender_session.h M intern/cycles/render/bake.cpp M intern/cycles/render/bake.h M source/blender/editors/object/object_bake_api.c M source/blender/makesrna/intern/rna_render.c M source/blender/render/extern/include/RE_bake.h M source/blender/render/extern/include/RE_engine.h M source/blender/render/intern/source/bake_api.c M source/blender/render/intern/source/external_engine.c =================================================================== diff --git a/intern/cycles/blender/addon/__init__.py b/intern/cycles/blender/addon/__init__.py index 27d9869..44ffdc4 100644 --- a/intern/cycles/blender/addon/__init__.py +++ b/intern/cycles/blender/addon/__init__.py @@ -67,8 +67,8 @@ class CyclesRender(bpy.types.RenderEngine): def render(self, scene): engine.render(self) - def bake(self, scene, obj, pass_type, pixel_array, num_pixels, depth, result): - engine.bake(self, obj, pass_type, pixel_array, num_pixels, depth, result) + def bake(self, scene, obj, pass_type, pixel_array, width, height, depth, result): + engine.bake(self, obj, pass_type, pixel_array, width, height, depth, result) # viewport render def view_update(self, context): diff --git a/intern/cycles/blender/addon/engine.py b/intern/cycles/blender/addon/engine.py index 18235ec..ca14bfe 100644 --- a/intern/cycles/blender/addon/engine.py +++ b/intern/cycles/blender/addon/engine.py @@ -59,11 +59,11 @@ def render(engine): _cycles.render(engine.session) -def bake(engine, obj, pass_type, pixel_array, num_pixels, depth, result): +def bake(engine, obj, pass_type, pixel_array, width, height, depth, result): import _cycles session = getattr(engine, "session", None) if session is not None: - _cycles.bake(engine.session, obj.as_pointer(), pass_type, pixel_array.as_pointer(), num_pixels, depth, result.as_pointer()) + _cycles.bake(engine.session, obj.as_pointer(), pass_type, pixel_array.as_pointer(), width, height, depth, result.as_pointer()) def reset(engine, data, scene): diff --git a/intern/cycles/blender/blender_python.cpp b/intern/cycles/blender/blender_python.cpp index 1d18f56..e89043e 100644 --- a/intern/cycles/blender/blender_python.cpp +++ b/intern/cycles/blender/blender_python.cpp @@ -160,9 +160,9 @@ static PyObject *bake_func(PyObject *self, PyObject *args) PyObject *pysession, *pyobject; PyObject *pypixel_array, *pyresult; const char *pass_type; - int num_pixels, depth; + int width, height, depth; - if(!PyArg_ParseTuple(args, "OOsOiiO", &pysession, &pyobject, &pass_type, &pypixel_array, &num_pixels, &depth, &pyresult)) + if(!PyArg_ParseTuple(args, "OOsOiiiO", &pysession, &pyobject, &pass_type, &pypixel_array, &width, &height, &depth, &pyresult)) return NULL; BlenderSession *session = (BlenderSession*)PyLong_AsVoidPtr(pysession); @@ -179,7 +179,7 @@ static PyObject *bake_func(PyObject *self, PyObject *args) python_thread_state_save(&session->python_thread_state); - session->bake(b_object, pass_type, b_bake_pixel, num_pixels, depth, (float *)b_result); + session->bake(b_object, pass_type, b_bake_pixel, width, height, depth, (float *)b_result); python_thread_state_restore(&session->python_thread_state); diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp index e57a672..57d0f5b 100644 --- a/intern/cycles/blender/blender_session.cpp +++ b/intern/cycles/blender/blender_session.cpp @@ -481,22 +481,23 @@ void BlenderSession::render() sync = NULL; } -static void populate_bake_data(BakeData *data, BL::BakePixel pixel_array, const int num_pixels) +static void populate_bake_data(BakeData *data, BL::BakePixel pixel_array, const size_t num_pixels) { BL::BakePixel bp = pixel_array; - int i; + size_t i; for(i=0; i < num_pixels; i++) { data->set(i, bp.primitive_id(), bp.uv(), bp.du_dx(), bp.du_dy(), bp.dv_dx(), bp.dv_dy()); bp = bp.next(); } } -void BlenderSession::bake(BL::Object b_object, const string& pass_type, BL::BakePixel pixel_array, int num_pixels, int depth, float result[]) +void BlenderSession::bake(BL::Object b_object, const string& pass_type, BL::BakePixel pixel_array, int width, int height, int depth, float result[]) { ShaderEvalType shader_type = get_shader_type(pass_type); size_t object_index = OBJECT_NONE; int tri_offset = 0; + const size_t num_pixels = width * height; /* ensure kernels are loaded before we do any scene updates */ session->load_kernels(); diff --git a/intern/cycles/blender/blender_session.h b/intern/cycles/blender/blender_session.h index 5146483..c936b3b 100644 --- a/intern/cycles/blender/blender_session.h +++ b/intern/cycles/blender/blender_session.h @@ -52,7 +52,7 @@ public: /* offline render */ void render(); - void bake(BL::Object b_object, const string& pass_type, BL::BakePixel pixel_array, int num_pixels, int depth, float pixels[]); + void bake(BL::Object b_object, const string& pass_type, BL::BakePixel pixel_array, int width, int height, int depth, float pixels[]); void write_render_result(BL::RenderResult b_rr, BL::RenderLayer b_rlay, RenderTile& rtile); void write_render_tile(RenderTile& rtile); diff --git a/intern/cycles/render/bake.cpp b/intern/cycles/render/bake.cpp index bc313a5..d7da63d 100644 --- a/intern/cycles/render/bake.cpp +++ b/intern/cycles/render/bake.cpp @@ -19,7 +19,7 @@ CCL_NAMESPACE_BEGIN -BakeData::BakeData(const int object, const int tri_offset, const int num_pixels): +BakeData::BakeData(const int object, const size_t tri_offset, const size_t num_pixels): m_object(object), m_tri_offset(tri_offset), m_num_pixels(num_pixels) @@ -60,7 +60,7 @@ int BakeData::object() return m_object; } -int BakeData::size() +size_t BakeData::size() { return m_num_pixels; } @@ -113,7 +113,7 @@ void BakeManager::set_baking(const bool value) m_is_baking = value; } -BakeData *BakeManager::init(const int object, const int tri_offset, const int num_pixels) +BakeData *BakeManager::init(const int object, const size_t tri_offset, const size_t num_pixels) { m_bake_data = new BakeData(object, tri_offset, num_pixels); return m_bake_data; diff --git a/intern/cycles/render/bake.h b/intern/cycles/render/bake.h index bf03a16..652420c 100644 --- a/intern/cycles/render/bake.h +++ b/intern/cycles/render/bake.h @@ -27,20 +27,20 @@ CCL_NAMESPACE_BEGIN class BakeData { public: - BakeData(const int object, const int tri_offset, const int num_pixels); + BakeData(const int object, const size_t tri_offset, const size_t num_pixels); ~BakeData(); void set(int i, int prim, float uv[2], float dudx, float dudy, float dvdx, float dvdy); int object(); - int size(); + size_t size(); uint4 data(int i); uint4 differentials(int i); bool is_valid(int i); private: int m_object; - int m_tri_offset; - int m_num_pixels; + size_t m_tri_offset; + size_t m_num_pixels; vector<int>m_primitive; vector<float>m_u; vector<float>m_v; @@ -58,7 +58,7 @@ public: bool get_baking(); void set_baking(const bool value); - BakeData *init(const int object, const int tri_offset, const int num_pixels); + BakeData *init(const int object, const size_t tri_offset, const size_t num_pixels); bool bake(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress, ShaderEvalType shader_type, BakeData *bake_data, float result[]); diff --git a/source/blender/editors/object/object_bake_api.c b/source/blender/editors/object/object_bake_api.c index c3bb6d9..417dcef 100644 --- a/source/blender/editors/object/object_bake_api.c +++ b/source/blender/editors/object/object_bake_api.c @@ -178,7 +178,7 @@ static bool write_internal_bake_pixels( void *lock; bool is_float; char *mask_buffer = NULL; - const int num_pixels = width * height; + const size_t num_pixels = width * height; ibuf = BKE_image_acquire_ibuf(image, NULL, &lock); @@ -311,7 +311,7 @@ static bool write_external_bake_pixels( /* margins */ if (margin > 0) { char *mask_buffer = NULL; - const int num_pixels = width * height; + const size_t num_pixels = width * height; mask_buffer = MEM_callocN(sizeof(char) * num_pixels, "Bake Mask"); RE_bake_mask_fill(pixel_array, num_pixels, mask_buffer); @@ -514,10 +514,10 @@ static void build_image_lookup(Main *bmain, Object *ob, BakeImages *bake_images) /* * returns the total number of pixels */ -static int initialize_internal_images(BakeImages *bake_images, ReportList *reports) +static size_t initialize_internal_images(BakeImages *bake_images, ReportList *reports) { int i; - int tot_size = 0; + size_t tot_size = 0; for (i = 0; i < bake_images->size; i++) { ImBuf *ibuf; @@ -543,6 +543,28 @@ static int initialize_internal_images(BakeImages *bake_images, ReportList *repor return tot_size; } +/* returns the image dimensions for single-images baking sessions, or an optimal dimension (the closest we can get to the square root) */ +static void calculate_buffer_dimension(int *width, int *height, const size_t num_pixels, BakeImages *bake_images) +{ + if (bake_images->size == 1) { + *width = bake_images->data[0].width; + *height = bake_images->data[0].height; + } + else { + int max_dividend = floor(sqrt(num_pixels)); + BLI_assert(max_dividend > 0); + + while (true) { + if ((num_pixels % max_dividend) == 0) { + *width = max_dividend; + *height = num_pixels / max_dividend; + break; + } + max_dividend--; + } + } +} + static int bake( Render *re, Main *bmain, Scene *scene, Object *ob_low, ListBase *selected_objects, ReportList *reports, const ScenePassType pass_type, const int margin, @@ -576,10 +598,12 @@ static int bake( BakeImages bake_images = {NULL}; - int num_pixels; + size_t num_pixels; int tot_materials; int i; + int buffer_width, buffer_height; + RE_bake_engine_set_engine_parameters(re, bmain, scene); if (!RE_bake_has_engine(re)) { @@ -649,6 +673,8 @@ static int bake( } } + calculate_buffer_dimension(&buffer_width, &buffer_height, num_pixels, &bake_images); + if (is_selected_to_active) { CollectionPointerLink *link; tot_highpoly = 0; @@ -788,7 +814,7 @@ static int bake( /* the baking itself */ for (i = 0; i < tot_highpoly; i++) { - ok = RE_bake_engine(re, highpoly[i].ob, highpoly[i].pixel_array, num_pixels, + ok = RE_bake_engine(re, highpoly[i].ob, highpoly[i].pixel_array, buffer_width, buffer_height, depth, pass_type, result); if (!ok) { BKE_reportf(reports, RPT_ERROR, "Error baking from object \"%s\"", highpoly[i].ob->id.name + 2); @@ -815,7 +841,7 @@ cage_cleanup: ob_low->restrictflag &= ~OB_RESTRICT_RENDER; if (RE_bake_has_engine(re)) @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list [email protected] http://lists.blender.org/mailman/listinfo/bf-blender-cvs
