Blender
V3.3
|
#include <string.h>
#include "MEM_guardedalloc.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "BLI_listbase.h"
#include "BLI_math.h"
#include "BLI_threads.h"
#include "BKE_DerivedMesh.h"
#include "BKE_ccg.h"
#include "BKE_global.h"
#include "BKE_image.h"
#include "BKE_lib_id.h"
#include "BKE_material.h"
#include "BKE_mesh.h"
#include "BKE_mesh_tangent.h"
#include "BKE_modifier.h"
#include "BKE_multires.h"
#include "BKE_subsurf.h"
#include "DEG_depsgraph.h"
#include "RE_multires_bake.h"
#include "RE_pipeline.h"
#include "RE_texture.h"
#include "RE_texture_margin.h"
#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
Go to the source code of this file.
Classes | |
struct | MultiresBakeResult |
struct | MResolvePixelData |
struct | MBakeRast |
struct | MHeightBakeData |
struct | MNormalBakeData |
struct | BakeImBufuserData |
struct | MultiresBakeQueue |
struct | MultiresBakeThread |
Typedefs | |
typedef void(* | MPassKnownData) (DerivedMesh *lores_dm, DerivedMesh *hires_dm, void *thread_data, void *bake_data, ImBuf *ibuf, const int face_index, const int lvl, const float st[2], float tangmat[3][3], const int x, const int y) |
typedef void *(* | MInitBakeData) (MultiresBakeRender *bkr, ImBuf *ibuf) |
typedef void(* | MFreeBakeData) (void *bake_data) |
typedef struct MultiresBakeResult | MultiresBakeResult |
typedef void(* | MFlushPixel) (const MResolvePixelData *data, const int x, const int y) |
typedef struct BakeImBufuserData | BakeImBufuserData |
typedef struct MultiresBakeQueue | MultiresBakeQueue |
typedef struct MultiresBakeThread | MultiresBakeThread |
Functions | |
static void | multiresbake_get_normal (const MResolvePixelData *data, const int tri_num, const int vert_index, float r_normal[3]) |
static void | init_bake_rast (MBakeRast *bake_rast, const ImBuf *ibuf, const MResolvePixelData *data, MFlushPixel flush_pixel, short *do_update) |
static void | flush_pixel (const MResolvePixelData *data, const int x, const int y) |
static void | set_rast_triangle (const MBakeRast *bake_rast, const int x, const int y) |
static void | rasterize_half (const MBakeRast *bake_rast, const float s0_s, const float t0_s, const float s1_s, const float t1_s, const float s0_l, const float t0_l, const float s1_l, const float t1_l, const int y0_in, const int y1_in, const int is_mid_right) |
static void | bake_rasterize (const MBakeRast *bake_rast, const float st0_in[2], const float st1_in[2], const float st2_in[2]) |
static int | multiresbake_test_break (MultiresBakeRender *bkr) |
static int | multires_bake_queue_next_tri (MultiresBakeQueue *queue) |
static void * | do_multires_bake_thread (void *data_v) |
static void | init_ccgdm_arrays (DerivedMesh *dm) |
static void | do_multires_bake (MultiresBakeRender *bkr, Image *ima, ImageTile *tile, ImBuf *ibuf, bool require_tangent, MPassKnownData passKnownData, MInitBakeData initBakeData, MFreeBakeData freeBakeData, MultiresBakeResult *result) |
static void | interp_bilinear_grid (CCGKey *key, CCGElem *grid, float crn_x, float crn_y, int mode, float res[3]) |
static void | get_ccgdm_data (DerivedMesh *lodm, DerivedMesh *hidm, const int *index_mp_to_orig, const int lvl, const MLoopTri *lt, const float u, const float v, float co[3], float n[3]) |
static void | interp_bilinear_mpoly (DerivedMesh *dm, MLoop *mloop, MPoly *mpoly, const float u, const float v, const int mode, float res[3]) |
static void | interp_barycentric_mlooptri (DerivedMesh *dm, MLoop *mloop, const MLoopTri *lt, const float u, const float v, const int mode, float res[3]) |
static void * | init_heights_data (MultiresBakeRender *bkr, ImBuf *ibuf) |
static void | free_heights_data (void *bake_data) |
static void | apply_heights_callback (DerivedMesh *lores_dm, DerivedMesh *hires_dm, void *thread_data_v, void *bake_data, ImBuf *ibuf, const int tri_index, const int lvl, const float st[2], float UNUSED(tangmat[3][3]), const int x, const int y) |
static void * | init_normal_data (MultiresBakeRender *bkr, ImBuf *UNUSED(ibuf)) |
static void | free_normal_data (void *bake_data) |
static void | apply_tangmat_callback (DerivedMesh *lores_dm, DerivedMesh *hires_dm, void *UNUSED(thread_data), void *bake_data, ImBuf *ibuf, const int tri_index, const int lvl, const float st[2], float tangmat[3][3], const int x, const int y) |
static void | bake_ibuf_filter (ImBuf *ibuf, char *mask, const int margin, const char margin_type, DerivedMesh *dm, const float uv_offset[2]) |
static void | bake_ibuf_normalize_displacement (ImBuf *ibuf, const float *displacement, const char *mask, float displacement_min, float displacement_max) |
static void | count_images (MultiresBakeRender *bkr) |
static void | bake_images (MultiresBakeRender *bkr, MultiresBakeResult *result) |
static void | finish_images (MultiresBakeRender *bkr, MultiresBakeResult *result) |
void | RE_multires_bake_images (MultiresBakeRender *bkr) |
typedef struct BakeImBufuserData BakeImBufuserData |
typedef void(* MFlushPixel) (const MResolvePixelData *data, const int x, const int y) |
Definition at line 84 of file multires_bake.c.
Definition at line 56 of file multires_bake.c.
typedef void*(* MInitBakeData) (MultiresBakeRender *bkr, ImBuf *ibuf) |
Definition at line 55 of file multires_bake.c.
typedef void(* MPassKnownData) (DerivedMesh *lores_dm, DerivedMesh *hires_dm, void *thread_data, void *bake_data, ImBuf *ibuf, const int face_index, const int lvl, const float st[2], float tangmat[3][3], const int x, const int y) |
Definition at line 43 of file multires_bake.c.
typedef struct MultiresBakeQueue MultiresBakeQueue |
typedef struct MultiresBakeResult MultiresBakeResult |
typedef struct MultiresBakeThread MultiresBakeThread |
|
static |
Definition at line 818 of file multires_bake.c.
References CD_MLOOPUV, clamp_v2(), dot_v3v3(), get_ccgdm_data(), DerivedMesh::getLoopArray, DerivedMesh::getLoopDataArray, DerivedMesh::getLoopTriArray, DerivedMesh::getPolyArray, MultiresBakeThread::height_max, MultiresBakeThread::height_min, MHeightBakeData::heights, interp_barycentric_mlooptri(), interp_bilinear_mpoly(), len, MPoly::loopstart, max_ff(), min_ff(), NULL, MHeightBakeData::orig_index_mp_to_orig, MLoopTri::poly, ImBuf::rect, ImBuf::rect_float, resolve_quad_uv_v2(), resolve_tri_uv_v2(), MHeightBakeData::ssdm, usdtokens::st(), sub_v3_v3v3(), MPoly::totloop, MLoopTri::tri, unit_float_to_uchar_clamp(), MLoopUV::uv, x, ImBuf::x, and y.
Referenced by bake_images().
|
static |
MultiresBake callback for normals' baking.
General idea:
norm(vec) / 2 + (0.5, 0.5, 0.5)
. Definition at line 932 of file multires_bake.c.
References add_v3_v3(), CD_MLOOPUV, clamp_v2(), get_ccgdm_data(), DerivedMesh::getLoopDataArray, DerivedMesh::getLoopTriArray, DerivedMesh::getPolyArray, MPoly::loopstart, mul_v3_m3v3(), normalize_v3_length(), NULL, MNormalBakeData::orig_index_mp_to_orig, MLoopTri::poly, ImBuf::rect, ImBuf::rect_float, resolve_quad_uv_v2(), resolve_tri_uv_v2(), rgb_float_to_uchar(), usdtokens::st(), MPoly::totloop, MLoopTri::tri, MLoopUV::uv, x, ImBuf::x, and y.
Referenced by bake_images().
|
static |
Definition at line 1315 of file multires_bake.c.
References BKE_imbuf_alpha_test(), IMB_filter_extend(), IMB_rectfill_alpha(), mask(), ImBuf::planes, R_BAKE_ADJACENT_FACES, R_BAKE_EXTEND, R_IMF_PLANES_RGBA, and RE_generate_texturemargin_adjacentfaces_dm().
Referenced by finish_images().
|
static |
Definition at line 1350 of file multires_bake.c.
References fabsf, FILTER_MASK_USED, mask(), max_ff(), ImBuf::rect, ImBuf::rect_float, unit_float_to_uchar_clamp(), ImBuf::x, and ImBuf::y.
Referenced by finish_images().
|
static |
Definition at line 1427 of file multires_bake.c.
References apply_heights_callback(), apply_tangmat_callback(), BKE_image_acquire_ibuf(), BKE_image_release_ibuf(), BKE_imageuser_default(), LinkData::data, do_multires_bake(), ListBase::first, free_heights_data(), free_normal_data(), Image::id, MultiresBakeRender::image, init_heights_data(), init_normal_data(), LIB_TAG_DOIT, LISTBASE_FOREACH, BakeImBufuserData::mask_buffer, MEM_callocN, MultiresBakeRender::mode, LinkData::next, NULL, RE_BAKE_AO, RE_BAKE_DISPLACEMENT, RE_BAKE_NORMALS, result, ID::tag, tile, ImageUser::tile, Image::tiles, ImBuf::userdata, ImBuf::x, and ImBuf::y.
Referenced by RE_multires_bake_images().
|
static |
Definition at line 278 of file multires_bake.c.
References ceilf, MBakeRast::h, rasterize_half(), SWAP, w(), and MBakeRast::w.
Referenced by do_multires_bake_thread().
|
static |
Definition at line 1395 of file multires_bake.c.
References MultiresBakeRender::array, BLI_addtail(), BLI_genericNodeN(), BLI_listbase_clear(), data, Image::id, MultiresBakeRender::image, MultiresBakeRender::len, LIB_TAG_DOIT, MultiresBakeRender::ob_image, ID::tag, and MultiresBakeRender::tot_image.
Referenced by RE_multires_bake_images().
|
static |
Definition at line 454 of file multires_bake.c.
References MResolvePixelData::bake_data, MultiresBakeThread::bake_rast, BKE_id_free(), BKE_image_get_tile_uv(), BKE_mesh_calc_loop_tangent_ex(), BKE_mesh_new_nomain(), BKE_mesh_poly_normals_ensure(), BKE_mesh_vertex_normals_ensure(), MultiresBakeThread::bkr, BLI_spin_end(), BLI_spin_init(), BLI_system_thread_count(), BLI_threadpool_end(), BLI_threadpool_init(), BLI_threadpool_insert(), CD_MLOOPUV, CD_NORMAL, CD_ORCO, CD_TANGENT, CustomData_get_layer_index(), MultiresBakeThread::data, DM_get_loop_data_layer(), do_multires_bake_thread(), MultiresBakeRender::do_update, float(), flush_pixel(), DerivedMesh::getEdgeArray, DerivedMesh::getLoopArray, DerivedMesh::getLoopDataArray, DerivedMesh::getLoopTriArray, DerivedMesh::getNumEdges, DerivedMesh::getNumLoops, DerivedMesh::getNumLoopTri, DerivedMesh::getNumPolys, DerivedMesh::getNumVerts, DerivedMesh::getPolyArray, DerivedMesh::getVertArray, DerivedMesh::getVertDataArray, MResolvePixelData::h, handles, MultiresBakeThread::height_max, MultiresBakeThread::height_min, MResolvePixelData::hires_dm, MultiresBakeRender::hires_dm, MResolvePixelData::ibuf, MultiresBakeThread::image, init_bake_rast(), init_ccgdm_arrays(), DerivedMesh::loopData, MResolvePixelData::lores_dm, MultiresBakeRender::lores_dm, MResolvePixelData::lvl, MultiresBakeRender::lvl, max_ff(), Mesh::medge, MEM_callocN, MEM_freeN, min_ff(), Mesh::mloop, MResolvePixelData::mloop, MResolvePixelData::mlooptri, MResolvePixelData::mloopuv, Mesh::mpoly, MResolvePixelData::mpoly, Mesh::mvert, MResolvePixelData::mvert, NULL, MResolvePixelData::pass_data, MResolvePixelData::precomputed_normals, MResolvePixelData::pvtangent, queue, MultiresBakeThread::queue, result, DerivedMesh::tangent_mask, MResolvePixelData::thread_data, blender::compositor::threads, MultiresBakeRender::threads, tile, Mesh::totedge, Mesh::totloop, Mesh::totpoly, Mesh::totvert, MResolvePixelData::uv_offset, MResolvePixelData::vert_normals, MResolvePixelData::w, ImBuf::x, and ImBuf::y.
Referenced by bake_images().
Definition at line 375 of file multires_bake.c.
References MultiresBakeRender::array, MultiresBakeThread::bake_rast, bake_rasterize(), MultiresBakeRender::baked_faces, MultiresBakeRender::baked_objects, MultiresBakeThread::bkr, BLI_spin_lock(), BLI_spin_unlock(), data, MultiresBakeThread::data, MultiresBakeRender::do_update, float(), IB_DISPLAY_BUFFER_INVALID, IB_RECT_INVALID, MultiresBakeThread::image, MultiresBakeRender::len, MPoly::mat_nr, multires_bake_queue_next_tri(), multiresbake_test_break(), NULL, MultiresBakeRender::ob_image, MLoopTri::poly, MultiresBakeRender::progress, MultiresBakeThread::queue, MultiresBakeQueue::spin, sub_v2_v2v2(), MultiresBakeRender::tot_obj, MultiresBakeQueue::tot_tri, MLoopTri::tri, and MLoopUV::uv.
Referenced by do_multires_bake().
|
static |
Definition at line 1490 of file multires_bake.c.
References bake_ibuf_filter(), bake_ibuf_normalize_displacement(), MultiresBakeRender::bake_margin, MultiresBakeRender::bake_margin_type, BKE_image_acquire_ibuf(), BKE_image_get_tile_uv(), BKE_image_mark_dirty(), BKE_image_release_ibuf(), BKE_imageuser_default(), LinkData::data, DEG_id_tag_update(), BakeImBufuserData::displacement_buffer, ListBase::first, IB_DISPLAY_BUFFER_INVALID, IB_MIPMAP_INVALID, IB_RECT_INVALID, Image::id, if(), MultiresBakeRender::image, imb_freemipmapImBuf(), LISTBASE_FOREACH, MultiresBakeRender::lores_dm, BakeImBufuserData::mask_buffer, MEM_freeN, ImBuf::mipmap, MultiresBakeRender::mode, LinkData::next, NULL, RE_BAKE_DISPLACEMENT, ImBuf::rect_float, result, tile, ImageUser::tile, Image::tiles, ImBuf::userdata, ImBuf::userflags, ImBuf::x, and ImBuf::y.
Referenced by RE_multires_bake_images().
|
static |
Definition at line 150 of file multires_bake.c.
References cross_v3_v3v3(), data, invert_m3_m3(), mul_v3_fl(), multiresbake_get_normal(), r, resolve_tri_uv_v2(), KDL::sign(), usdtokens::st(), v, w(), x, y, and zero_m3().
Referenced by do_multires_bake(), init_bake_rast(), and set_rast_triangle().
Definition at line 801 of file multires_bake.c.
References MEM_freeN, DerivedMesh::release, and MHeightBakeData::ssdm.
Referenced by bake_images().
|
static |
Definition at line 635 of file multires_bake.c.
References CLAMP, col, DerivedMesh::getGridData, DerivedMesh::getGridKey, DerivedMesh::getGridOffset, DerivedMesh::getGridSize, DerivedMesh::getLoopArray, DerivedMesh::getPolyArray, DerivedMesh::getVertArray, interp_bilinear_grid(), mdisp_rot_face_to_crn(), NULL, MLoopTri::poly, and v.
Referenced by apply_heights_callback(), and apply_tangmat_callback().
|
static |
Definition at line 132 of file multires_bake.c.
References data, MBakeRast::data, MBakeRast::do_update, MBakeRast::flush_pixel, flush_pixel(), MBakeRast::h, BakeImBufuserData::mask_buffer, MBakeRast::texels, ImBuf::userdata, MBakeRast::w, ImBuf::x, and ImBuf::y.
Referenced by do_multires_bake().
|
static |
Definition at line 437 of file multires_bake.c.
References DerivedMesh::getGridData, DerivedMesh::getGridKey, DerivedMesh::getGridOffset, DerivedMesh::getGridSize, and void.
Referenced by do_multires_bake(), and init_heights_data().
|
static |
Definition at line 764 of file multires_bake.c.
References CD_ORIGINDEX, CLAMP, BakeImBufuserData::displacement_buffer, DerivedMesh::getPolyDataArray, MHeightBakeData::heights, init_ccgdm_arrays(), SubsurfModifierData::levels, MultiresBakeRender::lores_dm, MultiresBakeRender::lvl, MEM_callocN, NULL, MHeightBakeData::orig_index_mp_to_orig, SubsurfModifierData::quality, SubsurfModifierData::renderLevels, MultiresBakeRender::scene, MHeightBakeData::ssdm, subsurf_make_derived_from_derived(), SUBSURF_UV_SMOOTH_PRESERVE_BOUNDARIES, MultiresBakeRender::tot_lvl, MultiresBakeRender::use_lores_mesh, ImBuf::userdata, SubsurfModifierData::uv_smooth, ImBuf::x, and ImBuf::y.
Referenced by bake_images().
|
static |
Definition at line 905 of file multires_bake.c.
References CD_ORIGINDEX, DerivedMesh::getPolyDataArray, MultiresBakeRender::lores_dm, MEM_callocN, and MNormalBakeData::orig_index_mp_to_orig.
Referenced by bake_images().
|
static |
Definition at line 738 of file multires_bake.c.
References data, DerivedMesh::getVertCo, DerivedMesh::getVertNo, interp_barycentric_tri_v3(), MLoopTri::tri, v, and MLoop::v.
Referenced by apply_heights_callback().
|
static |
Definition at line 603 of file multires_bake.c.
References CCG_grid_elem_co(), CCG_grid_elem_no(), copy_v3_v3(), data, CCGKey::grid_size, interp_bilinear_quad_v3(), v, and y1.
Referenced by get_ccgdm_data().
|
static |
Definition at line 712 of file multires_bake.c.
References data, DerivedMesh::getVertCo, DerivedMesh::getVertNo, interp_bilinear_quad_v3(), MPoly::loopstart, v, and MLoop::v.
Referenced by apply_heights_callback().
|
static |
Definition at line 357 of file multires_bake.c.
References BLI_spin_lock(), BLI_spin_unlock(), and queue.
Referenced by do_multires_bake_thread().
|
static |
Definition at line 109 of file multires_bake.c.
References BKE_mesh_calc_poly_normal(), copy_v3_v3(), data, MPoly::flag, MPoly::loopstart, and ME_SMOOTH.
Referenced by flush_pixel().
|
static |
Definition at line 324 of file multires_bake.c.
References G, and MultiresBakeRender::stop.
Referenced by do_multires_bake_thread().
|
static |
Definition at line 228 of file multires_bake.c.
References ceilf, fabsf, MBakeRast::h, set_rast_triangle(), SWAP, w(), MBakeRast::w, x, y, and y1.
Referenced by bake_rasterize().
void RE_multires_bake_images | ( | MultiresBakeRender * | bkr | ) |
Definition at line 1556 of file multires_bake.c.
References bake_images(), count_images(), finish_images(), and result.
Referenced by multiresbake_image_exec_locked(), and multiresbake_startjob().
Definition at line 212 of file multires_bake.c.
References MBakeRast::data, MBakeRast::do_update, FILTER_MASK_USED, flush_pixel(), MBakeRast::h, MBakeRast::texels, w(), MBakeRast::w, x, and y.
Referenced by rasterize_half().