51 environment_node_ = environment;
67 bke::node_add_link(*ntree, *environment, *environment_out, *background, *background_color_in);
71 world->nodetree = ntree;
98 if (parameters_changed) {
99 intensity_socket_->value = parameters_.intensity;
100 angle_socket_->value = parameters_.rot_z;
103 environment_node_->id =
nullptr;
113 environment_node_->id = &image->id;
119 return parameters_changed;
133 for (gpu::Batch *
batch : sphere_lod_) {
138blender::gpu::Batch *LookdevModule::sphere_get(
const SphereLOD level_of_detail)
140 BLI_assert(level_of_detail >= SphereLOD::LOW && level_of_detail < SphereLOD::MAX);
143#if (defined(__GNUC__) && (__GNUC__ >= 15) && !defined(__clang__))
144 [[assume((level_of_detail >= 0) && (level_of_detail < SphereLOD::MAX))]];
147 if (sphere_lod_[level_of_detail] !=
nullptr) {
148 return sphere_lod_[level_of_detail];
153 switch (level_of_detail) {
174 float nor_x, nor_y, nor_z;
178 int v_len = (lat_res - 1) * lon_res * 6;
181 const float lon_inc = 2 *
M_PI / lon_res;
182 const float lat_inc =
M_PI / lat_res;
188 auto sphere_lat_lon_vert = [&](
float lat,
float lon) {
190 vert.nor_x = vert.x =
sinf(lat) *
cosf(lon);
191 vert.nor_y = vert.y =
cosf(lat);
192 vert.nor_z = vert.z =
sinf(lat) *
sinf(lon);
197 for (
int i = 0;
i < lon_res;
i++, lon += lon_inc) {
199 for (
int j = 0; j < lat_res; j++, lat += lat_inc) {
200 if (j != lat_res - 1) {
201 sphere_lat_lon_vert(lat + lat_inc, lon + lon_inc);
202 sphere_lat_lon_vert(lat + lat_inc, lon);
203 sphere_lat_lon_vert(lat, lon);
206 sphere_lat_lon_vert(lat, lon + lon_inc);
207 sphere_lat_lon_vert(lat + lat_inc, lon + lon_inc);
208 sphere_lat_lon_vert(lat, lon);
215 return sphere_lod_[level_of_detail];
220 visible_rect_ = *visible_rect;
221 enabled_ = inst_.is_viewport() && inst_.overlays_enabled() && inst_.use_lookdev_overlay();
224 const int2 extent_dummy(1);
227 dummy_cryptomatte_tx_.ensure_2d(gpu::TextureFormat::SFLOAT_32_32_32_32, extent_dummy, usage);
228 dummy_aov_color_tx_.ensure_2d_array(
229 gpu::TextureFormat::SFLOAT_16_16_16_16, extent_dummy, 1, usage);
230 dummy_aov_value_tx_.ensure_2d_array(gpu::TextureFormat::SFLOAT_16, extent_dummy, 1, usage);
234float LookdevModule::calc_viewport_scale()
236 const float viewport_scale =
clamp_f(
238 return viewport_scale;
241LookdevModule::SphereLOD LookdevModule::calc_level_of_detail(
const float viewport_scale)
244 (
U.lookdev_sphere_size / 400.0f) * viewport_scale *
UI_SCALE_FAC, 0.1f, 1.0f);
246 if (res_scale > 0.7f) {
247 return LookdevModule::SphereLOD::HIGH;
249 if (res_scale > 0.25f) {
250 return LookdevModule::SphereLOD::MEDIUM;
252 return LookdevModule::SphereLOD::LOW;
257 const int sphere_radius =
U.lookdev_sphere_size *
UI_SCALE_FAC * viewport_scale;
258 return sphere_radius * 2;
266 const float viewport_scale = calc_viewport_scale();
272 if (spheres_[index].color_tx_.ensure_2d(color_format, extent)) {
274 if (inst_.is_viewport() && inst_.sampling.finished_viewport()) {
275 inst_.sampling.reset();
283 const Camera &cam = inst_.camera;
285 int2 display_extent = inst_.film.display_extent_get();
290 pixel_radius *= sphere_distance;
293 this->sphere_radius_ = (extent.x / 2) * pixel_radius;
294 this->sphere_position_ = cam.
position() -
295 cam.
forward() * (sphere_distance + this->sphere_radius_);
298 model_m4.
location() = this->sphere_position_;
302 gpu::Batch *geom = sphere_get(calc_level_of_detail(viewport_scale));
304 sync_pass(spheres_[0].pass, geom, inst_.materials.metallic_mat, handle);
305 sync_pass(spheres_[1].pass, geom, inst_.materials.diffuse_mat, handle);
309void LookdevModule::sync_pass(
PassSimple &pass,
332 pass.
draw(geom, res_handle, 0);
335void LookdevModule::sync_display()
343 pass.state_set(
state);
345 pass.push_constant(
"viewportSize", viewport_size);
346 pass.push_constant(
"invertedViewportSize", 1.0f / viewport_size);
347 pass.push_constant(
"anchor",
int2(visible_rect_.
xmax, visible_rect_.
ymin));
348 pass.bind_texture(
"metallic_tx", &spheres_[0].color_tx_);
349 pass.bind_texture(
"diffuse_tx", &spheres_[1].color_tx_);
360 inst_.volume_probes.set_view(
view);
361 inst_.sphere_probes.set_view(
view);
363 for (Sphere &sphere : spheres_) {
364 sphere.framebuffer.bind();
365 inst_.manager->submit(sphere.pass,
view);
381 inst_.manager->submit(display_ps_);
394 if (v3d ==
nullptr) {
398 const ::View3DShading &shading = v3d->shading;
402 rot_z = shading.studiolight_rot_z;
404 blur = shading.studiolight_blur;
405 intensity = shading.studiolight_intensity;
419 return !(*
this == other);
blender::gpu::Texture * BKE_image_get_gpu_texture(Image *image, ImageUser *iuser)
void BKE_id_free(Main *bmain, void *idv)
void * BKE_id_new_nomain(short type, const char *name)
#define SH_NODE_OUTPUT_WORLD
#define SH_NODE_VECTOR_ROTATE
#define SH_NODE_TEX_COORD
#define SH_NODE_TEX_ENVIRONMENT
#define SH_NODE_BACKGROUND
@ STUDIOLIGHT_EQUIRECT_RADIANCE_GPUTEXTURE
struct StudioLight * BKE_studiolight_find(const char *name, int flag)
void BKE_studiolight_ensure_flag(StudioLight *sl, int flag)
#define STUDIOLIGHT_ORIENTATIONS_MATERIAL_MODE
MINLINE float clamp_f(float value, float min, float max)
MINLINE void copy_v4_fl(float r[4], float f)
BLI_INLINE int BLI_rcti_size_x(const struct rcti *rct)
@ NODE_VECTOR_ROTATE_TYPE_AXIS_Z
@ V3D_SHADING_SCENE_WORLD_RENDER
@ V3D_SHADING_SCENE_WORLD
#define GPU_BATCH_DISCARD_SAFE(batch)
blender::gpu::Batch * GPU_batch_create_ex(GPUPrimType primitive_type, blender::gpu::VertBuf *vertex_buf, blender::gpu::IndexBuf *index_buf, GPUBatchFlag owns_flag)
void GPU_framebuffer_viewport_reset(blender::gpu::FrameBuffer *fb)
#define GPU_ATTACHMENT_TEXTURE(_texture)
#define GPU_ATTACHMENT_NONE
void GPU_framebuffer_bind(blender::gpu::FrameBuffer *fb)
void GPU_material_free(ListBase *gpumaterial)
void GPU_texture_ref(blender::gpu::Texture *texture)
@ GPU_TEXTURE_USAGE_SHADER_READ
@ GPU_TEXTURE_USAGE_SHADER_WRITE
#define GPU_TEXTURE_FREE_SAFE(texture)
void GPU_vertbuf_vert_set(blender::gpu::VertBuf *verts, uint v_idx, const void *data)
static blender::gpu::VertBuf * GPU_vertbuf_create_with_format(const GPUVertFormat &format)
void GPU_vertbuf_data_alloc(blender::gpu::VertBuf &verts, uint v_len)
struct blender::bke::bNodeTreeType * ntreeType_Shader
ATTR_WARN_UNUSED_RESULT const BMVert * v
SIMD_FORCE_INLINE const btScalar & z() const
Return the z value.
void bind_resources(U &resources)
void bind_texture(const char *name, gpu::Texture *texture, GPUSamplerState state=sampler_auto)
void state_set(DRWState state, int clip_plane_count=0)
void draw(gpu::Batch *batch, uint instance_len=-1, uint vertex_len=-1, uint vertex_first=-1, ResourceIndexRange res_index={}, uint custom_id=0)
void clear_color_depth_stencil(float4 color, float depth, uint8_t stencil)
void material_set(Manager &manager, GPUMaterial *material, bool deferred_texture_loading=false)
const float3 & forward() const
const float3 & position() const
const CameraData & data_get() const
bool is_perspective() const
struct blender::eevee::Film::DepthState depth
struct blender::eevee::HiZBuffer::@312272073133116306117315271010160007344264367302 front
A running instance of the engine.
VolumeProbeModule volume_probes
SphereProbeModule sphere_probes
const DRWContext * draw_ctx
UniformDataModule uniform_data
void init(const rcti *visible_rect)
LookdevModule(Instance &inst)
bool sync(const LookdevParameters &new_parameters)
::Material * default_surface
UtilityTexture utility_tx
gpu::Shader * static_shader_get(eShaderType shader_type)
GPUMaterial * material_shader_get(::Material *blender_mat, bNodeTree *nodetree, eMaterialPipeline pipeline_type, eMaterialGeometry geometry_type, bool deferred_compilation, ::Material *default_mat)
static float screen_pixel_radius(const float4x4 &wininv, bool is_perspective, const int2 &extent)
struct blender::eevee::VolumeModule::@250013332365273170227003077320346304121216231272 result
#define RBUFS_UTILITY_TEX_SLOT
struct @021025263243242147216143265077100330027142264337::@225245033123204053237120173316075113304004012000 batch
TEX_TEMPLATE DataVec texture(T, FltCoord, float=0.0f) RET
bNodeTree * node_tree_add_tree_embedded(Main *bmain, ID *owner_id, StringRefNull name, StringRefNull idname)
bNodeSocket * node_find_socket(bNode &node, eNodeSocketInOut in_out, StringRef identifier)
bNode * node_add_static_node(const bContext *C, bNodeTree &ntree, int type)
bNodeLink & node_add_link(bNodeTree &ntree, bNode &fromnode, bNodeSocket &fromsock, bNode &tonode, bNodeSocket &tosock)
void node_set_active(bNodeTree &ntree, bNode &node)
detail::Pass< command::DrawCommandBuf > PassSimple
static int calc_sphere_extent(const float viewport_scale)
MatBase< T, NumCol, NumRow > scale(const MatBase< T, NumCol, NumRow > &mat, const VectorT &scale)
MatBase< T, NumCol, NumRow > rotate(const MatBase< T, NumCol, NumRow > &mat, const RotationT &rotation)
bool assign_if_different(T &old_value, T new_value)
MatBase< float, 4, 4 > float4x4
VecBase< float, 4 > float4
VecBase< int32_t, 2 > int2
VecBase< float, 2 > float2
MatBase< float, 3, 3 > float3x3
VecBase< float, 3 > float3
blender::float2 viewport_size_get() const
blender::gpu::FrameBuffer * default_fb
struct bNodeTree * nodetree
blender::gpu::Texture * equirect_radiance_gputexture
bool operator==(const LookdevParameters &other) const
bool operator!=(const LookdevParameters &other) const
void * BKE_image_get_tile