You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-14 13:41:12 +00:00
Use the original canvas to calculate light positioning
This commit is contained in:
@@ -224,13 +224,12 @@ void RasterizerCanvasGLES3::canvas_render_items(RID p_to_render_target, Item *p_
|
|||||||
l = l->next_ptr;
|
l = l->next_ptr;
|
||||||
ERR_CONTINUE(!clight);
|
ERR_CONTINUE(!clight);
|
||||||
}
|
}
|
||||||
Transform2D to_light_xform = (p_canvas_transform * l->light_shader_xform).affine_inverse();
|
|
||||||
|
|
||||||
Vector2 canvas_light_pos = p_canvas_transform.xform(l->xform.get_origin()); //convert light position to canvas coordinates, as all computation is done in canvas coords to avoid precision loss
|
Vector2 canvas_light_pos = p_canvas_transform.xform(l->xform.get_origin()); //convert light position to canvas coordinates, as all computation is done in canvas coords to avoid precision loss
|
||||||
state.light_uniforms[index].position[0] = canvas_light_pos.x;
|
state.light_uniforms[index].position[0] = canvas_light_pos.x;
|
||||||
state.light_uniforms[index].position[1] = canvas_light_pos.y;
|
state.light_uniforms[index].position[1] = canvas_light_pos.y;
|
||||||
|
|
||||||
_update_transform_2d_to_mat2x4(to_light_xform, state.light_uniforms[index].matrix);
|
_update_transform_2d_to_mat2x4(l->light_shader_xform.affine_inverse(), state.light_uniforms[index].matrix);
|
||||||
_update_transform_2d_to_mat2x4(l->xform_cache.affine_inverse(), state.light_uniforms[index].shadow_matrix);
|
_update_transform_2d_to_mat2x4(l->xform_cache.affine_inverse(), state.light_uniforms[index].shadow_matrix);
|
||||||
|
|
||||||
state.light_uniforms[index].height = l->height * (p_canvas_transform.columns[0].length() + p_canvas_transform.columns[1].length()) * 0.5; //approximate height conversion to the canvas size, since all calculations are done in canvas coords to avoid precision loss
|
state.light_uniforms[index].height = l->height * (p_canvas_transform.columns[0].length() + p_canvas_transform.columns[1].length()) * 0.5; //approximate height conversion to the canvas size, since all calculations are done in canvas coords to avoid precision loss
|
||||||
|
|||||||
@@ -1252,13 +1252,12 @@ void RendererCanvasRenderRD::canvas_render_items(RID p_to_render_target, Item *p
|
|||||||
l = l->next_ptr;
|
l = l->next_ptr;
|
||||||
ERR_CONTINUE(!clight);
|
ERR_CONTINUE(!clight);
|
||||||
}
|
}
|
||||||
Transform2D to_light_xform = (p_canvas_transform * l->light_shader_xform).affine_inverse();
|
|
||||||
|
|
||||||
Vector2 canvas_light_pos = p_canvas_transform.xform(l->xform.get_origin()); //convert light position to canvas coordinates, as all computation is done in canvas coords to avoid precision loss
|
Vector2 canvas_light_pos = p_canvas_transform.xform(l->xform.get_origin()); //convert light position to canvas coordinates, as all computation is done in canvas coords to avoid precision loss
|
||||||
state.light_uniforms[index].position[0] = canvas_light_pos.x;
|
state.light_uniforms[index].position[0] = canvas_light_pos.x;
|
||||||
state.light_uniforms[index].position[1] = canvas_light_pos.y;
|
state.light_uniforms[index].position[1] = canvas_light_pos.y;
|
||||||
|
|
||||||
_update_transform_2d_to_mat2x4(to_light_xform, state.light_uniforms[index].matrix);
|
_update_transform_2d_to_mat2x4(l->light_shader_xform.affine_inverse(), state.light_uniforms[index].matrix);
|
||||||
_update_transform_2d_to_mat2x4(l->xform_cache.affine_inverse(), state.light_uniforms[index].shadow_matrix);
|
_update_transform_2d_to_mat2x4(l->xform_cache.affine_inverse(), state.light_uniforms[index].shadow_matrix);
|
||||||
|
|
||||||
state.light_uniforms[index].height = l->height * (p_canvas_transform.columns[0].length() + p_canvas_transform.columns[1].length()) * 0.5; //approximate height conversion to the canvas size, since all calculations are done in canvas coords to avoid precision loss
|
state.light_uniforms[index].height = l->height * (p_canvas_transform.columns[0].length() + p_canvas_transform.columns[1].length()) * 0.5; //approximate height conversion to the canvas size, since all calculations are done in canvas coords to avoid precision loss
|
||||||
|
|||||||
@@ -349,7 +349,7 @@ void RendererViewport::_draw_viewport(Viewport *p_viewport) {
|
|||||||
Transform2D scale;
|
Transform2D scale;
|
||||||
scale.scale(cl->rect_cache.size);
|
scale.scale(cl->rect_cache.size);
|
||||||
scale.columns[2] = cl->rect_cache.position;
|
scale.columns[2] = cl->rect_cache.position;
|
||||||
cl->light_shader_xform = cl->xform * scale;
|
cl->light_shader_xform = xf * cl->xform * scale;
|
||||||
if (cl->use_shadow) {
|
if (cl->use_shadow) {
|
||||||
cl->shadows_next_ptr = lights_with_shadow;
|
cl->shadows_next_ptr = lights_with_shadow;
|
||||||
if (lights_with_shadow == nullptr) {
|
if (lights_with_shadow == nullptr) {
|
||||||
|
|||||||
Reference in New Issue
Block a user