|
Blender
V2.93
|
The API itself is simple. Blender sends a populated array of BakePixels to the renderer, and gets back an array of floats with the result. More...
#include <limits.h>#include "MEM_guardedalloc.h"#include "BLI_math.h"#include "DNA_mesh_types.h"#include "DNA_meshdata_types.h"#include "BKE_bvhutils.h"#include "BKE_customdata.h"#include "BKE_image.h"#include "BKE_lib_id.h"#include "BKE_mesh.h"#include "BKE_mesh_runtime.h"#include "BKE_mesh_tangent.h"#include "BKE_node.h"#include "IMB_imbuf.h"#include "IMB_imbuf_types.h"#include "RE_bake.h"#include "render_types.h"#include "zbuf.h"Go to the source code of this file.
Classes | |
| struct | BakeDataZSpan |
| struct | TSpace |
| struct | TriTessFace |
Typedefs | |
| typedef struct BakeDataZSpan | BakeDataZSpan |
| typedef struct TSpace | TSpace |
| typedef struct TriTessFace | TriTessFace |
Functions | |
| static void | store_bake_pixel (void *handle, int x, int y, float u, float v) |
| void | RE_bake_mask_fill (const BakePixel pixel_array[], const size_t num_pixels, char *mask) |
| void | RE_bake_margin (ImBuf *ibuf, char *mask, const int margin) |
| static void | calc_point_from_barycentric_cage (TriTessFace *triangles_low, TriTessFace *triangles_cage, const float mat_low[4][4], const float mat_cage[4][4], int primitive_id, float u, float v, float r_co[3], float r_dir[3]) |
| static void | calc_point_from_barycentric_extrusion (TriTessFace *triangles, const float mat[4][4], const float imat[4][4], int primitive_id, float u, float v, float cage_extrusion, float r_co[3], float r_dir[3], const bool is_cage) |
| static void | barycentric_differentials_from_position (const float co[3], const float v1[3], const float v2[3], const float v3[3], const float dxco[3], const float dyco[3], const float facenor[3], const bool differentials, float *u, float *v, float *dx_u, float *dx_v, float *dy_u, float *dy_v) |
| static bool | cast_ray_highpoly (BVHTreeFromMesh *treeData, TriTessFace *triangle_low, TriTessFace *triangles[], BakePixel *pixel_array_low, BakePixel *pixel_array, const float mat_low[4][4], BakeHighPolyData *highpoly, const float co[3], const float dir[3], const int pixel_id, const int tot_highpoly, const float max_ray_distance) |
| static TriTessFace * | mesh_calc_tri_tessface (Mesh *me, bool tangent, Mesh *me_eval) |
| bool | RE_bake_pixels_populate_from_objects (struct Mesh *me_low, BakePixel pixel_array_from[], BakePixel pixel_array_to[], BakeHighPolyData highpoly[], const int tot_highpoly, const size_t num_pixels, const bool is_custom_cage, const float cage_extrusion, const float max_ray_distance, float mat_low[4][4], float mat_cage[4][4], struct Mesh *me_cage) |
| static void | bake_differentials (BakeDataZSpan *bd, const float *uv1, const float *uv2, const float *uv3) |
| void | RE_bake_pixels_populate (Mesh *me, BakePixel pixel_array[], const size_t num_pixels, const BakeTargets *targets, const char *uv_layer) |
| static void | normal_uncompress (float out[3], const float in[3]) |
| static void | normal_compress (float out[3], const float in[3], const eBakeNormalSwizzle normal_swizzle[3]) |
| void | RE_bake_normal_world_to_tangent (const BakePixel pixel_array[], const size_t num_pixels, const int depth, float result[], Mesh *me, const eBakeNormalSwizzle normal_swizzle[3], float mat[4][4]) |
| void | RE_bake_normal_world_to_object (const BakePixel pixel_array[], const size_t num_pixels, const int depth, float result[], struct Object *ob, const eBakeNormalSwizzle normal_swizzle[3]) |
| void | RE_bake_normal_world_to_world (const BakePixel pixel_array[], const size_t num_pixels, const int depth, float result[], const eBakeNormalSwizzle normal_swizzle[3]) |
| void | RE_bake_ibuf_clear (Image *image, const bool is_tangent) |
| int | RE_pass_depth (const eScenePassType pass_type) |
The API itself is simple. Blender sends a populated array of BakePixels to the renderer, and gets back an array of floats with the result.
The Bake API is fully implemented with Python rna functions. The operator expects/call a function:
def bake(scene, object, pass_type, object_id, pixel_array, num_pixels, depth, result)
bake(Python object, see bake_pixel).pixel_array is a Python object storing BakePixel elements:
In python you have access to:
primitive_id, object_id, uv, du_dx, du_dy, nextnext() is a function that returns the next BakePixel in the array.primitive_id == -1For a complete implementation example look at the Cycles Bake commit.
Definition in file bake.c.
| typedef struct BakeDataZSpan BakeDataZSpan |
| typedef struct TriTessFace TriTessFace |
|
static |
Definition at line 669 of file bake.c.
References A, BakeDataZSpan::du_dx, BakeDataZSpan::du_dy, BakeDataZSpan::dv_dx, BakeDataZSpan::dv_dy, and fabsf.
Referenced by RE_bake_pixels_populate().
|
static |
Definition at line 270 of file bake.c.
References axis_dominant_v3(), v, v1, and v2.
Referenced by cast_ray_highpoly().
|
static |
This function returns the coordinate and normal of a barycentric u,v for a face defined by the primitive_id index. The returned normal is actually the direction from the same barycentric coordinate in the cage to the base mesh The returned coordinate is the point in the cage mesh
Definition at line 174 of file bake.c.
References copy_v3_v3(), data, interp_barycentric_tri_v3(), mul_m4_v3(), normalize_v3(), sub_v3_v3v3(), and v.
Referenced by RE_bake_pixels_populate_from_objects().
|
static |
This function returns the coordinate and normal of a barycentric u,v for a face defined by the primitive_id index. The returned coordinate is extruded along the normal by cage_extrusion
Definition at line 217 of file bake.c.
References add_v3_v3(), MVert::co, copy_v3_v3(), data, interp_barycentric_tri_v3(), TriTessFace::is_smooth, mul_m4_v3(), mul_transposed_mat3_m4_v3(), mul_v3_v3fl(), TriTessFace::mverts, negate_v3(), MVert::no, TriTessFace::normal, normal_short_to_float_v3(), normalize_v3(), and v.
Referenced by RE_bake_pixels_populate_from_objects().
|
static |
This function populates pixel_array and returns TRUE if things are correct
Definition at line 315 of file bake.c.
References barycentric_differentials_from_position(), BLI_assert, BLI_bvhtree_ray_cast(), BVH_RAYCAST_DIST_MAX, MVert::co, BVHTreeRayHit::dist, distance(), dot_v3v3(), BakePixel::du_dx, BakePixel::du_dy, BakePixel::dv_dx, BakePixel::dv_dy, BVHTreeRayHit::index, len_squared_v3v3(), madd_v3_v3fl(), MEM_freeN, MEM_mallocN, mul_mat3_m4_v3(), mul_v3_m4v3(), mul_v3_mat3_m4v3(), mul_v3_v3fl(), TriTessFace::mverts, TriTessFace::normal, normalize_v3(), BakePixel::object_id, BakePixel::primitive_id, raycast_callback(), BakePixel::seed, sub_v3_v3v3(), tree, and BakePixel::uv.
Referenced by RE_bake_pixels_populate_from_objects().
|
static |
This function populates an array of verts for the triangles of a mesh Tangent and Normals are also stored
Definition at line 450 of file bake.c.
References BKE_mesh_calc_loop_tangents(), BKE_mesh_calc_normals_split(), BKE_mesh_calc_poly_normal(), BKE_mesh_ensure_normals_for_display(), BKE_mesh_recalc_looptri(), BLI_assert, CD_MVERT, CD_NORMAL, CD_TANGENT, copy_v3_v3(), CustomData_get_layer(), MPoly::flag, float(), TriTessFace::is_smooth, Mesh::ldata, TriTessFace::loop_normal, MPoly::loopstart, ME_SMOOTH, MEM_callocN, MEM_freeN, MEM_mallocN, Mesh::mloop, Mesh::mpoly, Mesh::mvert, TriTessFace::mverts, normal, NULL, MLoopTri::poly, poly_to_tri_count(), Mesh::totloop, Mesh::totpoly, MLoopTri::tri, TriTessFace::tspace, UINT_MAX, and MLoop::v.
Referenced by RE_bake_normal_world_to_tangent(), and RE_bake_pixels_populate_from_objects().
|
static |
Definition at line 783 of file bake.c.
References KDL::sign().
Referenced by RE_bake_normal_world_to_object(), RE_bake_normal_world_to_tangent(), and RE_bake_normal_world_to_world().
convert a normalized normal to the -1.0 1.0 range the input is expected to be POS_X, POS_Y, POS_Z
Definition at line 775 of file bake.c.
Referenced by RE_bake_normal_world_to_object(), RE_bake_normal_world_to_tangent(), and RE_bake_normal_world_to_world().
| void RE_bake_ibuf_clear | ( | Image * | image, |
| const bool | is_tangent | ||
| ) |
Definition at line 1008 of file bake.c.
References BKE_image_acquire_ibuf(), BKE_image_release_ibuf(), BLI_assert, IMB_rectfill(), NULL, ImBuf::planes, and R_IMF_PLANES_RGBA.
Referenced by bake_targets_clear().
| void RE_bake_margin | ( | ImBuf * | ibuf, |
| char * | mask, | ||
| const int | margin | ||
| ) |
Definition at line 156 of file bake.c.
References IMB_filter_extend(), IMB_rectfill_alpha(), mask(), ImBuf::planes, and R_IMF_PLANES_RGBA.
Referenced by write_external_bake_pixels(), and write_internal_bake_pixels().
| void RE_bake_mask_fill | ( | const BakePixel | pixel_array[], |
| const size_t | num_pixels, | ||
| char * | mask | ||
| ) |
Definition at line 141 of file bake.c.
References FILTER_MASK_USED, and mask().
Referenced by write_external_bake_pixels(), and write_internal_bake_pixels().
| void RE_bake_normal_world_to_object | ( | const BakePixel | pixel_array[], |
| const size_t | num_pixels, | ||
| const int | depth, | ||
| float | result[], | ||
| struct Object * | ob, | ||
| const eBakeNormalSwizzle | normal_swizzle[3] | ||
| ) |
Definition at line 952 of file bake.c.
References invert_m4_m4(), mul_mat3_m4_v3(), nor, normal_compress(), normal_uncompress(), normalize_v3(), Object::obmat, and result.
Referenced by bake().
| void RE_bake_normal_world_to_tangent | ( | const BakePixel | pixel_array[], |
| const size_t | num_pixels, | ||
| const int | depth, | ||
| float | result[], | ||
| Mesh * | me, | ||
| const eBakeNormalSwizzle | normal_swizzle[3], | ||
| float | mat[4][4] | ||
| ) |
This function converts an object space normal map to a tangent space normal map for a given low poly mesh.
Definition at line 827 of file bake.c.
References BKE_id_free(), BKE_mesh_copy_for_eval(), BLI_assert, copy_v3_fl3(), copy_v3_v3(), copy_v4_fl4(), cross_v3_v3v3(), interp_barycentric_tri_v3(), invert_m3_m3(), TriTessFace::is_smooth, TriTessFace::loop_normal, MEM_freeN, mesh_calc_tri_tessface(), mul_m3_v3(), mul_transposed_mat3_m4_v3(), mul_v3_fl(), TriTessFace::mverts, MVert::no, nor, normal, TriTessFace::normal, normal_compress(), normal_short_to_float_v3(), normal_uncompress(), normalize_v3(), normals, NULL, BakePixel::primitive_id, result, KDL::sign(), TSpace::sign, TSpace::tangent, TriTessFace::tspace, BakePixel::uv, v, and w().
Referenced by bake().
| void RE_bake_normal_world_to_world | ( | const BakePixel | pixel_array[], |
| const size_t | num_pixels, | ||
| const int | depth, | ||
| float | result[], | ||
| const eBakeNormalSwizzle | normal_swizzle[3] | ||
| ) |
Definition at line 984 of file bake.c.
References nor, normal_compress(), normal_uncompress(), and result.
Referenced by bake().
| void RE_bake_pixels_populate | ( | Mesh * | me, |
| BakePixel | pixel_array[], | ||
| const size_t | num_pixels, | ||
| const BakeTargets * | targets, | ||
| const char * | uv_layer | ||
| ) |
Definition at line 694 of file bake.c.
References Freestyle::a, bake_differentials(), BakeDataZSpan::bk_image, BKE_mesh_recalc_looptri(), CD_MLOOPUV, CustomData_get_layer(), CustomData_get_layer_n(), CustomData_get_named_layer(), float(), BakeImage::height, BakeTargets::images, Mesh::ldata, MPoly::mat_nr, BakeTargets::material_to_image, MEM_callocN, MEM_freeN, MEM_mallocN, Mesh::mloop, Mesh::mpoly, Mesh::mvert, NULL, BakeTargets::num_images, BakePixel::object_id, BakeDataZSpan::pixel_array, MLoopTri::poly, poly_to_tri_count(), BakeDataZSpan::primitive_id, BakePixel::primitive_id, store_bake_pixel(), Mesh::totloop, Mesh::totpoly, MLoopTri::tri, MLoopUV::uv, BakeImage::width, blender::compositor::zbuf_alloc_span(), blender::compositor::zbuf_free_span(), BakeDataZSpan::zspan, and zspan_scanconvert().
Referenced by bake_targets_populate_pixels().
| bool RE_bake_pixels_populate_from_objects | ( | struct Mesh * | me_low, |
| BakePixel | pixel_array_from[], | ||
| BakePixel | pixel_array_to[], | ||
| BakeHighPolyData | highpoly[], | ||
| const int | tot_highpoly, | ||
| const size_t | num_pixels, | ||
| const bool | is_custom_cage, | ||
| const float | cage_extrusion, | ||
| const float | max_ray_distance, | ||
| float | mat_low[4][4], | ||
| float | mat_cage[4][4], | ||
| struct Mesh * | me_cage | ||
| ) |
Definition at line 523 of file bake.c.
References BKE_bvhtree_from_mesh_get(), BKE_id_free(), BKE_mesh_copy_for_eval(), BKE_mesh_runtime_looptri_ensure(), BVHTREE_FROM_LOOPTRI, calc_point_from_barycentric_cage(), calc_point_from_barycentric_extrusion(), cast_ray_highpoly(), free_bvhtree_from_mesh(), invert_m4_m4(), BakeHighPolyData::me, MEM_callocN, MEM_freeN, MEM_mallocN, mesh_calc_tri_tessface(), NULL, BakePixel::primitive_id, result, tree, BakePixel::uv, and v.
Referenced by bake().
| int RE_pass_depth | ( | const eScenePassType | pass_type | ) |
Definition at line 1033 of file bake.c.
References SCE_PASS_AO, SCE_PASS_COMBINED, SCE_PASS_DIFFUSE_COLOR, SCE_PASS_DIFFUSE_DIRECT, SCE_PASS_DIFFUSE_INDIRECT, SCE_PASS_EMIT, SCE_PASS_ENVIRONMENT, SCE_PASS_GLOSSY_COLOR, SCE_PASS_GLOSSY_DIRECT, SCE_PASS_GLOSSY_INDIRECT, SCE_PASS_INDEXMA, SCE_PASS_INDEXOB, SCE_PASS_MIST, SCE_PASS_NORMAL, SCE_PASS_RAYHITS, SCE_PASS_SHADOW, SCE_PASS_SUBSURFACE_COLOR, SCE_PASS_SUBSURFACE_DIRECT, SCE_PASS_SUBSURFACE_INDIRECT, SCE_PASS_TRANSM_COLOR, SCE_PASS_TRANSM_DIRECT, SCE_PASS_TRANSM_INDIRECT, SCE_PASS_UV, SCE_PASS_VECTOR, and SCE_PASS_Z.
Referenced by bake_targets_init().
Definition at line 116 of file bake.c.
References BakeDataZSpan::bk_image, copy_v2_fl2(), BakeDataZSpan::du_dx, BakePixel::du_dx, BakeDataZSpan::du_dy, BakePixel::du_dy, BakeDataZSpan::dv_dx, BakePixel::dv_dx, BakeDataZSpan::dv_dy, BakePixel::dv_dy, BakePixel::object_id, BakeImage::offset, BakeDataZSpan::pixel_array, BakeDataZSpan::primitive_id, BakePixel::primitive_id, BakePixel::seed, BakePixel::uv, v, width, BakeImage::width, x, and y.
Referenced by RE_bake_pixels_populate().