1 /*************************************************************************/ 2 /* visual_server_canvas.h */ 3 /*************************************************************************/ 4 /* This file is part of: */ 5 /* GODOT ENGINE */ 6 /* https://godotengine.org */ 7 /*************************************************************************/ 8 /* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */ 9 /* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */ 10 /* */ 11 /* Permission is hereby granted, free of charge, to any person obtaining */ 12 /* a copy of this software and associated documentation files (the */ 13 /* "Software"), to deal in the Software without restriction, including */ 14 /* without limitation the rights to use, copy, modify, merge, publish, */ 15 /* distribute, sublicense, and/or sell copies of the Software, and to */ 16 /* permit persons to whom the Software is furnished to do so, subject to */ 17 /* the following conditions: */ 18 /* */ 19 /* The above copyright notice and this permission notice shall be */ 20 /* included in all copies or substantial portions of the Software. */ 21 /* */ 22 /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ 23 /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ 24 /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ 25 /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ 26 /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ 27 /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ 28 /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ 29 /*************************************************************************/ 30 31 #ifndef VISUALSERVERCANVAS_H 32 #define VISUALSERVERCANVAS_H 33 34 #include "rasterizer.h" 35 #include "visual_server_viewport.h" 36 37 class VisualServerCanvas { 38 public: 39 struct Item : public RasterizerCanvas::Item { 40 41 RID parent; // canvas it belongs to 42 List<Item *>::Element *E; 43 int z_index; 44 bool z_relative; 45 bool sort_y; 46 Color modulate; 47 Color self_modulate; 48 bool use_parent_material; 49 int index; 50 bool children_order_dirty; 51 int ysort_children_count; 52 Color ysort_modulate; 53 Transform2D ysort_xform; 54 Vector2 ysort_pos; 55 56 Vector<Item *> child_items; 57 ItemItem58 Item() { 59 children_order_dirty = true; 60 E = NULL; 61 z_index = 0; 62 modulate = Color(1, 1, 1, 1); 63 self_modulate = Color(1, 1, 1, 1); 64 sort_y = false; 65 use_parent_material = false; 66 z_relative = true; 67 index = 0; 68 ysort_children_count = -1; 69 ysort_xform = Transform2D(); 70 ysort_pos = Vector2(); 71 } 72 }; 73 74 struct ItemIndexSort { 75 operatorItemIndexSort76 _FORCE_INLINE_ bool operator()(const Item *p_left, const Item *p_right) const { 77 78 return p_left->index < p_right->index; 79 } 80 }; 81 82 struct ItemPtrSort { 83 operatorItemPtrSort84 _FORCE_INLINE_ bool operator()(const Item *p_left, const Item *p_right) const { 85 86 if (Math::is_equal_approx(p_left->ysort_pos.y, p_right->ysort_pos.y)) 87 return p_left->ysort_pos.x < p_right->ysort_pos.x; 88 89 return p_left->ysort_pos.y < p_right->ysort_pos.y; 90 } 91 }; 92 93 struct LightOccluderPolygon : RID_Data { 94 95 bool active; 96 Rect2 aabb; 97 VS::CanvasOccluderPolygonCullMode cull_mode; 98 RID occluder; 99 Set<RasterizerCanvas::LightOccluderInstance *> owners; 100 LightOccluderPolygonLightOccluderPolygon101 LightOccluderPolygon() { 102 active = false; 103 cull_mode = VS::CANVAS_OCCLUDER_POLYGON_CULL_DISABLED; 104 } 105 }; 106 107 RID_Owner<LightOccluderPolygon> canvas_light_occluder_polygon_owner; 108 109 RID_Owner<RasterizerCanvas::LightOccluderInstance> canvas_light_occluder_owner; 110 111 struct Canvas : public VisualServerViewport::CanvasBase { 112 113 Set<RID> viewports; 114 struct ChildItem { 115 116 Point2 mirror; 117 Item *item; 118 bool operator<(const ChildItem &p_item) const { 119 return item->index < p_item.item->index; 120 } 121 }; 122 123 Set<RasterizerCanvas::Light *> lights; 124 125 Set<RasterizerCanvas::LightOccluderInstance *> occluders; 126 127 bool children_order_dirty; 128 Vector<ChildItem> child_items; 129 Color modulate; 130 RID parent; 131 float parent_scale; 132 find_itemCanvas133 int find_item(Item *p_item) { 134 for (int i = 0; i < child_items.size(); i++) { 135 if (child_items[i].item == p_item) 136 return i; 137 } 138 return -1; 139 } erase_itemCanvas140 void erase_item(Item *p_item) { 141 int idx = find_item(p_item); 142 if (idx >= 0) 143 child_items.remove(idx); 144 } 145 CanvasCanvas146 Canvas() { 147 modulate = Color(1, 1, 1, 1); 148 children_order_dirty = true; 149 parent_scale = 1.0; 150 } 151 }; 152 153 mutable RID_Owner<Canvas> canvas_owner; 154 RID_Owner<Item> canvas_item_owner; 155 RID_Owner<RasterizerCanvas::Light> canvas_light_owner; 156 157 bool disable_scale; 158 159 private: 160 void _render_canvas_item_tree(Item *p_canvas_item, const Transform2D &p_transform, const Rect2 &p_clip_rect, const Color &p_modulate, RasterizerCanvas::Light *p_lights); 161 void _render_canvas_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); 162 void _light_mask_canvas_items(int p_z, RasterizerCanvas::Item *p_canvas_item, RasterizerCanvas::Light *p_masked_lights, int p_canvas_layer_id); 163 164 RasterizerCanvas::Item **z_list; 165 RasterizerCanvas::Item **z_last_list; 166 167 public: 168 void render_canvas(Canvas *p_canvas, const Transform2D &p_transform, RasterizerCanvas::Light *p_lights, RasterizerCanvas::Light *p_masked_lights, const Rect2 &p_clip_rect, int p_canvas_layer_id); 169 170 RID canvas_create(); 171 void canvas_set_item_mirroring(RID p_canvas, RID p_item, const Point2 &p_mirroring); 172 void canvas_set_modulate(RID p_canvas, const Color &p_color); 173 void canvas_set_parent(RID p_canvas, RID p_parent, float p_scale); 174 void canvas_set_disable_scale(bool p_disable); 175 176 RID canvas_item_create(); 177 void canvas_item_set_parent(RID p_item, RID p_parent); 178 179 void canvas_item_set_visible(RID p_item, bool p_visible); 180 void canvas_item_set_light_mask(RID p_item, int p_mask); 181 182 void canvas_item_set_transform(RID p_item, const Transform2D &p_transform); 183 void canvas_item_set_clip(RID p_item, bool p_clip); 184 void canvas_item_set_distance_field_mode(RID p_item, bool p_enable); 185 void canvas_item_set_custom_rect(RID p_item, bool p_custom_rect, const Rect2 &p_rect = Rect2()); 186 void canvas_item_set_modulate(RID p_item, const Color &p_color); 187 void canvas_item_set_self_modulate(RID p_item, const Color &p_color); 188 189 void canvas_item_set_draw_behind_parent(RID p_item, bool p_enable); 190 191 void canvas_item_set_update_when_visible(RID p_item, bool p_update); 192 193 void canvas_item_add_line(RID p_item, const Point2 &p_from, const Point2 &p_to, const Color &p_color, float p_width = 1.0, bool p_antialiased = false); 194 void canvas_item_add_polyline(RID p_item, const Vector<Point2> &p_points, const Vector<Color> &p_colors, float p_width = 1.0, bool p_antialiased = false); 195 void canvas_item_add_multiline(RID p_item, const Vector<Point2> &p_points, const Vector<Color> &p_colors, float p_width = 1.0, bool p_antialiased = false); 196 void canvas_item_add_rect(RID p_item, const Rect2 &p_rect, const Color &p_color); 197 void canvas_item_add_circle(RID p_item, const Point2 &p_pos, float p_radius, const Color &p_color); 198 void canvas_item_add_texture_rect(RID p_item, const Rect2 &p_rect, RID p_texture, bool p_tile = false, const Color &p_modulate = Color(1, 1, 1), bool p_transpose = false, RID p_normal_map = RID()); 199 void canvas_item_add_texture_rect_region(RID p_item, const Rect2 &p_rect, RID p_texture, const Rect2 &p_src_rect, const Color &p_modulate = Color(1, 1, 1), bool p_transpose = false, RID p_normal_map = RID(), bool p_clip_uv = false); 200 void canvas_item_add_nine_patch(RID p_item, const Rect2 &p_rect, const Rect2 &p_source, RID p_texture, const Vector2 &p_topleft, const Vector2 &p_bottomright, VS::NinePatchAxisMode p_x_axis_mode = VS::NINE_PATCH_STRETCH, VS::NinePatchAxisMode p_y_axis_mode = VS::NINE_PATCH_STRETCH, bool p_draw_center = true, const Color &p_modulate = Color(1, 1, 1), RID p_normal_map = RID()); 201 void canvas_item_add_primitive(RID p_item, const Vector<Point2> &p_points, const Vector<Color> &p_colors, const Vector<Point2> &p_uvs, RID p_texture, float p_width = 1.0, RID p_normal_map = RID()); 202 void canvas_item_add_polygon(RID p_item, const Vector<Point2> &p_points, const Vector<Color> &p_colors, const Vector<Point2> &p_uvs = Vector<Point2>(), RID p_texture = RID(), RID p_normal_map = RID(), bool p_antialiased = false); 203 void canvas_item_add_triangle_array(RID p_item, const Vector<int> &p_indices, const Vector<Point2> &p_points, const Vector<Color> &p_colors, const Vector<Point2> &p_uvs = Vector<Point2>(), const Vector<int> &p_bones = Vector<int>(), const Vector<float> &p_weights = Vector<float>(), RID p_texture = RID(), int p_count = -1, RID p_normal_map = RID(), bool p_antialiased = false, bool p_antialiasing_use_indices = false); 204 void canvas_item_add_mesh(RID p_item, const RID &p_mesh, const Transform2D &p_transform = Transform2D(), const Color &p_modulate = Color(1, 1, 1), RID p_texture = RID(), RID p_normal_map = RID()); 205 void canvas_item_add_multimesh(RID p_item, RID p_mesh, RID p_texture = RID(), RID p_normal_map = RID()); 206 void canvas_item_add_particles(RID p_item, RID p_particles, RID p_texture, RID p_normal); 207 void canvas_item_add_set_transform(RID p_item, const Transform2D &p_transform); 208 void canvas_item_add_clip_ignore(RID p_item, bool p_ignore); 209 void canvas_item_set_sort_children_by_y(RID p_item, bool p_enable); 210 void canvas_item_set_z_index(RID p_item, int p_z); 211 void canvas_item_set_z_as_relative_to_parent(RID p_item, bool p_enable); 212 void canvas_item_set_copy_to_backbuffer(RID p_item, bool p_enable, const Rect2 &p_rect); 213 void canvas_item_attach_skeleton(RID p_item, RID p_skeleton); 214 215 void canvas_item_clear(RID p_item); 216 void canvas_item_set_draw_index(RID p_item, int p_index); 217 218 void canvas_item_set_material(RID p_item, RID p_material); 219 220 void canvas_item_set_use_parent_material(RID p_item, bool p_enable); 221 222 RID canvas_light_create(); 223 void canvas_light_attach_to_canvas(RID p_light, RID p_canvas); 224 void canvas_light_set_enabled(RID p_light, bool p_enabled); 225 void canvas_light_set_scale(RID p_light, float p_scale); 226 void canvas_light_set_transform(RID p_light, const Transform2D &p_transform); 227 void canvas_light_set_texture(RID p_light, RID p_texture); 228 void canvas_light_set_texture_offset(RID p_light, const Vector2 &p_offset); 229 void canvas_light_set_color(RID p_light, const Color &p_color); 230 void canvas_light_set_height(RID p_light, float p_height); 231 void canvas_light_set_energy(RID p_light, float p_energy); 232 void canvas_light_set_z_range(RID p_light, int p_min_z, int p_max_z); 233 void canvas_light_set_layer_range(RID p_light, int p_min_layer, int p_max_layer); 234 void canvas_light_set_item_cull_mask(RID p_light, int p_mask); 235 void canvas_light_set_item_shadow_cull_mask(RID p_light, int p_mask); 236 237 void canvas_light_set_mode(RID p_light, VS::CanvasLightMode p_mode); 238 239 void canvas_light_set_shadow_enabled(RID p_light, bool p_enabled); 240 void canvas_light_set_shadow_buffer_size(RID p_light, int p_size); 241 void canvas_light_set_shadow_gradient_length(RID p_light, float p_length); 242 void canvas_light_set_shadow_filter(RID p_light, VS::CanvasLightShadowFilter p_filter); 243 void canvas_light_set_shadow_color(RID p_light, const Color &p_color); 244 void canvas_light_set_shadow_smooth(RID p_light, float p_smooth); 245 246 RID canvas_light_occluder_create(); 247 void canvas_light_occluder_attach_to_canvas(RID p_occluder, RID p_canvas); 248 void canvas_light_occluder_set_enabled(RID p_occluder, bool p_enabled); 249 void canvas_light_occluder_set_polygon(RID p_occluder, RID p_polygon); 250 void canvas_light_occluder_set_transform(RID p_occluder, const Transform2D &p_xform); 251 void canvas_light_occluder_set_light_mask(RID p_occluder, int p_mask); 252 253 RID canvas_occluder_polygon_create(); 254 void canvas_occluder_polygon_set_shape(RID p_occluder_polygon, const PoolVector<Vector2> &p_shape, bool p_closed); 255 void canvas_occluder_polygon_set_shape_as_lines(RID p_occluder_polygon, const PoolVector<Vector2> &p_shape); 256 257 void canvas_occluder_polygon_set_cull_mode(RID p_occluder_polygon, VS::CanvasOccluderPolygonCullMode p_mode); 258 259 bool free(RID p_rid); 260 VisualServerCanvas(); 261 ~VisualServerCanvas(); 262 }; 263 264 #endif // VISUALSERVERCANVAS_H 265