Physics Interpolation - add support for CPUParticles2D
Similar to the existing 3D CPUParticles physics interpolation.
This commit is contained in:
@ -995,6 +995,7 @@ public:
|
||||
bool light_masked : 1;
|
||||
bool on_interpolate_transform_list : 1;
|
||||
bool interpolated : 1;
|
||||
bool ignore_parent_xform : 1;
|
||||
mutable bool custom_rect : 1;
|
||||
mutable bool rect_dirty : 1;
|
||||
mutable bool bound_dirty : 1;
|
||||
@ -1236,6 +1237,7 @@ public:
|
||||
update_when_visible = false;
|
||||
on_interpolate_transform_list = false;
|
||||
interpolated = true;
|
||||
ignore_parent_xform = false;
|
||||
local_bound_last_update_tick = 0;
|
||||
}
|
||||
virtual ~Item() {
|
||||
|
||||
@ -40,6 +40,8 @@ void VisualServerCanvas::_render_canvas_item_tree(Item *p_canvas_item, const Tra
|
||||
memset(z_list, 0, z_range * sizeof(RasterizerCanvas::Item *));
|
||||
memset(z_last_list, 0, z_range * sizeof(RasterizerCanvas::Item *));
|
||||
|
||||
_current_camera_transform = p_transform;
|
||||
|
||||
if (_canvas_cull_mode == CANVAS_CULL_MODE_NODE) {
|
||||
_prepare_tree_bounds(p_canvas_item);
|
||||
_render_canvas_item_cull_by_node(p_canvas_item, p_transform, p_clip_rect, Color(1, 1, 1, 1), 0, z_list, z_last_list, nullptr, nullptr, false);
|
||||
@ -337,7 +339,12 @@ void VisualServerCanvas::_render_canvas_item_cull_by_item(Item *p_canvas_item, c
|
||||
real_t f = Engine::get_singleton()->get_physics_interpolation_fraction();
|
||||
TransformInterpolator::interpolate_transform_2d(ci->xform_prev, ci->xform_curr, final_xform, f);
|
||||
}
|
||||
final_xform = p_transform * final_xform;
|
||||
|
||||
if (!p_canvas_item->ignore_parent_xform) {
|
||||
final_xform = p_transform * final_xform;
|
||||
} else {
|
||||
final_xform = _current_camera_transform * final_xform;
|
||||
}
|
||||
|
||||
Rect2 global_rect = final_xform.xform(rect);
|
||||
global_rect.position += p_clip_rect.position;
|
||||
@ -473,7 +480,12 @@ void VisualServerCanvas::_render_canvas_item_cull_by_node(Item *p_canvas_item, c
|
||||
real_t f = Engine::get_singleton()->get_physics_interpolation_fraction();
|
||||
TransformInterpolator::interpolate_transform_2d(ci->xform_prev, ci->xform_curr, final_xform, f);
|
||||
}
|
||||
final_xform = p_transform * final_xform;
|
||||
|
||||
if (!p_canvas_item->ignore_parent_xform) {
|
||||
final_xform = p_transform * final_xform;
|
||||
} else {
|
||||
final_xform = _current_camera_transform * final_xform;
|
||||
}
|
||||
|
||||
Rect2 global_rect = final_xform.xform(rect);
|
||||
ci->global_rect_cache = global_rect;
|
||||
@ -667,6 +679,8 @@ void VisualServerCanvas::render_canvas(Canvas *p_canvas, const Transform2D &p_tr
|
||||
memset(z_list, 0, z_range * sizeof(RasterizerCanvas::Item *));
|
||||
memset(z_last_list, 0, z_range * sizeof(RasterizerCanvas::Item *));
|
||||
|
||||
_current_camera_transform = p_transform;
|
||||
|
||||
#ifdef VISUAL_SERVER_CANVAS_TIME_NODE_CULLING
|
||||
bool measure = (Engine::get_singleton()->get_frames_drawn() % 100) == 0;
|
||||
measure &= !Engine::get_singleton()->is_editor_hint();
|
||||
@ -941,6 +955,14 @@ void VisualServerCanvas::canvas_item_set_draw_behind_parent(RID p_item, bool p_e
|
||||
_check_bound_integrity(canvas_item);
|
||||
}
|
||||
|
||||
void VisualServerCanvas::canvas_item_set_ignore_parent_transform(RID p_item, bool p_enable) {
|
||||
Item *canvas_item = canvas_item_owner.getornull(p_item);
|
||||
ERR_FAIL_COND(!canvas_item);
|
||||
|
||||
canvas_item->ignore_parent_xform = p_enable;
|
||||
_make_bound_dirty(canvas_item);
|
||||
}
|
||||
|
||||
void VisualServerCanvas::canvas_item_set_update_when_visible(RID p_item, bool p_update) {
|
||||
Item *canvas_item = canvas_item_owner.getornull(p_item);
|
||||
ERR_FAIL_COND(!canvas_item);
|
||||
|
||||
@ -170,6 +170,7 @@ private:
|
||||
|
||||
RasterizerCanvas::Item **z_list;
|
||||
RasterizerCanvas::Item **z_last_list;
|
||||
Transform2D _current_camera_transform;
|
||||
|
||||
// 3.5 and earlier had no hierarchical culling.
|
||||
void _render_canvas_item_cull_by_item(Item *p_canvas_item, const Transform2D &p_transform, const Rect2 &p_clip_rect, const Color &p_modulate, int p_z, RasterizerCanvas::Item **z_list, RasterizerCanvas::Item **z_last_list, Item *p_canvas_clip, Item *p_material_owner);
|
||||
@ -226,6 +227,7 @@ public:
|
||||
void canvas_item_set_self_modulate(RID p_item, const Color &p_color);
|
||||
|
||||
void canvas_item_set_draw_behind_parent(RID p_item, bool p_enable);
|
||||
void canvas_item_set_ignore_parent_transform(RID p_item, bool p_enable);
|
||||
|
||||
void canvas_item_set_update_when_visible(RID p_item, bool p_update);
|
||||
|
||||
|
||||
@ -690,6 +690,7 @@ public:
|
||||
BIND2(canvas_item_set_self_modulate, RID, const Color &)
|
||||
|
||||
BIND2(canvas_item_set_draw_behind_parent, RID, bool)
|
||||
BIND2(canvas_item_set_ignore_parent_transform, RID, bool)
|
||||
|
||||
BIND6(canvas_item_add_line, RID, const Point2 &, const Point2 &, const Color &, float, bool)
|
||||
BIND5(canvas_item_add_polyline, RID, const Vector<Point2> &, const Vector<Color> &, float, bool)
|
||||
|
||||
@ -594,6 +594,7 @@ public:
|
||||
FUNC2(canvas_item_set_self_modulate, RID, const Color &)
|
||||
|
||||
FUNC2(canvas_item_set_draw_behind_parent, RID, bool)
|
||||
FUNC2(canvas_item_set_ignore_parent_transform, RID, bool)
|
||||
|
||||
FUNC6(canvas_item_add_line, RID, const Point2 &, const Point2 &, const Color &, float, bool)
|
||||
FUNC5(canvas_item_add_polyline, RID, const Vector<Point2> &, const Vector<Color> &, float, bool)
|
||||
|
||||
@ -1024,6 +1024,7 @@ public:
|
||||
virtual void canvas_item_set_self_modulate(RID p_item, const Color &p_color) = 0;
|
||||
|
||||
virtual void canvas_item_set_draw_behind_parent(RID p_item, bool p_enable) = 0;
|
||||
virtual void canvas_item_set_ignore_parent_transform(RID p_item, bool p_enable) = 0;
|
||||
|
||||
enum NinePatchAxisMode {
|
||||
NINE_PATCH_STRETCH,
|
||||
|
||||
Reference in New Issue
Block a user