Blender
V3.3
|
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 "RE_texture_margin.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 pixels_num, char *mask) |
void | RE_bake_margin (ImBuf *ibuf, char *mask, const int margin, const char margin_type, Mesh const *me, char const *uv_layer, const float uv_offset[2]) |
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 pixels_num, 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 pixels_num, const BakeTargets *targets, const char *uv_layer) |
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 pixels_num, 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 pixels_num, 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 pixels_num, 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, pixels_num, 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
, next
.next()
is a function that returns the next BakePixel in the array.primitive_id == -1
.For 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 681 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 273 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 177 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 220 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(), TriTessFace::normal, normalize_v3(), v, and TriTessFace::vert_normals.
Referenced by RE_bake_pixels_populate_from_objects().
|
static |
This function populates pixel_array and returns TRUE if things are correct
Definition at line 318 of file bake.c.
References barycentric_differentials_from_position(), BLI_assert, BLI_bvhtree_ray_cast(), BVH_RAYCAST_DIST_MAX, MVert::co, BVHTreeRayHit::dist, blender::math::distance_squared(), 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 451 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_poly_normals_are_dirty(), BKE_mesh_poly_normals_ensure(), BKE_mesh_recalc_looptri(), BKE_mesh_recalc_looptri_with_normals(), BKE_mesh_vertex_normals_ensure(), 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, MLoop::v, Mesh::vdata, and TriTessFace::vert_normals.
Referenced by RE_bake_normal_world_to_tangent(), and RE_bake_pixels_populate_from_objects().
|
static |
Definition at line 791 of file bake.c.
References usdtokens::out(), and KDL::sign().
Referenced by RE_bake_normal_world_to_object(), RE_bake_normal_world_to_tangent(), and RE_bake_normal_world_to_world().
Definition at line 1012 of file bake.c.
References BKE_image_acquire_ibuf(), BKE_image_release_ibuf(), BLI_assert, image(), IMB_rectfill(), lock, NULL, ImBuf::planes, and R_IMF_PLANES_RGBA.
Referenced by bake_targets_clear().
void RE_bake_margin | ( | ImBuf * | ibuf, |
char * | mask, | ||
const int | margin, | ||
const char | margin_type, | ||
Mesh const * | me, | ||
char const * | uv_layer, | ||
const float | uv_offset[2] | ||
) |
Definition at line 144 of file bake.c.
References 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().
Referenced by write_external_bake_pixels(), and write_internal_bake_pixels().
Definition at line 129 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 | pixels_num, | ||
const int | depth, | ||
float | result[], | ||
struct Object * | ob, | ||
const eBakeNormalSwizzle | normal_swizzle[3] | ||
) |
Definition at line 956 of file bake.c.
References copy_v3_v3(), invert_m4_m4(), mul_mat3_m4_v3(), nor, normal_compress(), normalize_v3(), Object::obmat, offset, and result.
Referenced by bake().
void RE_bake_normal_world_to_tangent | ( | const BakePixel | pixel_array[], |
size_t | pixels_num, | ||
int | depth, | ||
float | result[], | ||
struct 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 831 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(), nor, normal, TriTessFace::normal, normal_compress(), normalize_v3(), normals, NULL, offset, BakePixel::primitive_id, result, KDL::sign(), TSpace::sign, TSpace::tangent, tangents, TriTessFace::tspace, BakePixel::uv, v, TriTessFace::vert_normals, and w().
Referenced by bake().
void RE_bake_normal_world_to_world | ( | const BakePixel | pixel_array[], |
const size_t | pixels_num, | ||
const int | depth, | ||
float | result[], | ||
const eBakeNormalSwizzle | normal_swizzle[3] | ||
) |
Definition at line 988 of file bake.c.
References copy_v3_v3(), nor, normal_compress(), offset, and result.
Referenced by bake().
void RE_bake_pixels_populate | ( | Mesh * | me, |
BakePixel | pixel_array[], | ||
const size_t | pixels_num, | ||
const BakeTargets * | targets, | ||
const char * | uv_layer | ||
) |
Definition at line 706 of file bake.c.
References Freestyle::a, bake_differentials(), BakeDataZSpan::bk_image, BKE_mesh_recalc_looptri(), CD_MLOOPUV, clamp_i(), CustomData_get_layer(), CustomData_get_layer_n(), CustomData_get_named_layer(), BakeImage::height, image(), BakeImage::image, BakeTargets::images, BakeTargets::images_num, Mesh::ldata, MPoly::mat_nr, BakeTargets::material_to_image, BakeTargets::materials_num, MEM_callocN, MEM_freeN, MEM_mallocN, Mesh::mloop, Mesh::mpoly, Mesh::mvert, NULL, 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::uv_offset, 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 | pixels_num, | ||
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 535 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 1037 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_POSITION, 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 104 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, offset, 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().