bool TileSet::_set(const StringName &p_name, const Variant &p_value) { String n = p_name; int slash = n.find("/"); if (slash == -1) return false; int id = String::to_int(n.c_str(), slash); if (!tile_map.has(id)) create_tile(id); String what = n.substr(slash + 1, n.length()); if (what == "name") tile_set_name(id, p_value); else if (what == "texture") tile_set_texture(id, p_value); else if (what == "normal_map") tile_set_normal_map(id, p_value); else if (what == "tex_offset") tile_set_texture_offset(id, p_value); else if (what == "material") tile_set_material(id, p_value); else if (what == "modulate") tile_set_modulate(id, p_value); else if (what == "region") tile_set_region(id, p_value); else if (what == "shape") tile_set_shape(id, 0, p_value); else if (what == "shape_offset") { Transform2D xform = tile_get_shape_transform(id, 0); xform.set_origin(p_value); tile_set_shape_transform(id, 0, xform); } else if (what == "shape_transform") tile_set_shape_transform(id, 0, p_value); else if (what == "shape_one_way") tile_set_shape_one_way(id, 0, p_value); else if (what == "shapes") _tile_set_shapes(id, p_value); else if (what == "occluder") tile_set_light_occluder(id, p_value); else if (what == "occluder_offset") tile_set_occluder_offset(id, p_value); else if (what == "navigation") tile_set_navigation_polygon(id, p_value); else if (what == "navigation_offset") tile_set_navigation_polygon_offset(id, p_value); else return false; return true; }
Transform2D Camera2D::get_camera_transform() { if (!get_tree()) return Transform2D(); ERR_FAIL_COND_V(custom_viewport && !ObjectDB::get_instance(custom_viewport_id), Transform2D()); Size2 screen_size = viewport->get_visible_rect().size; Point2 new_camera_pos = get_global_transform().get_origin(); Point2 ret_camera_pos; if (!first) { if (anchor_mode == ANCHOR_MODE_DRAG_CENTER) { if (h_drag_enabled && !Engine::get_singleton()->is_editor_hint()) { camera_pos.x = MIN(camera_pos.x, (new_camera_pos.x + screen_size.x * 0.5 * drag_margin[MARGIN_RIGHT])); camera_pos.x = MAX(camera_pos.x, (new_camera_pos.x - screen_size.x * 0.5 * drag_margin[MARGIN_LEFT])); } else { if (h_ofs < 0) { camera_pos.x = new_camera_pos.x + screen_size.x * 0.5 * drag_margin[MARGIN_RIGHT] * h_ofs; } else { camera_pos.x = new_camera_pos.x + screen_size.x * 0.5 * drag_margin[MARGIN_LEFT] * h_ofs; } } if (v_drag_enabled && !Engine::get_singleton()->is_editor_hint()) { camera_pos.y = MIN(camera_pos.y, (new_camera_pos.y + screen_size.y * 0.5 * drag_margin[MARGIN_BOTTOM])); camera_pos.y = MAX(camera_pos.y, (new_camera_pos.y - screen_size.y * 0.5 * drag_margin[MARGIN_TOP])); } else { if (v_ofs < 0) { camera_pos.y = new_camera_pos.y + screen_size.y * 0.5 * drag_margin[MARGIN_TOP] * v_ofs; } else { camera_pos.y = new_camera_pos.y + screen_size.y * 0.5 * drag_margin[MARGIN_BOTTOM] * v_ofs; } } } else if (anchor_mode == ANCHOR_MODE_FIXED_TOP_LEFT) { camera_pos = new_camera_pos; } Point2 screen_offset = (anchor_mode == ANCHOR_MODE_DRAG_CENTER ? (screen_size * 0.5 * zoom) : Point2()); Rect2 screen_rect(-screen_offset + camera_pos, screen_size * zoom); if (offset != Vector2()) screen_rect.position += offset; if (limit_smoothing_enabled) { if (screen_rect.position.x < limit[MARGIN_LEFT]) camera_pos.x -= screen_rect.position.x - limit[MARGIN_LEFT]; if (screen_rect.position.x + screen_rect.size.x > limit[MARGIN_RIGHT]) camera_pos.x -= screen_rect.position.x + screen_rect.size.x - limit[MARGIN_RIGHT]; if (screen_rect.position.y + screen_rect.size.y > limit[MARGIN_BOTTOM]) camera_pos.y -= screen_rect.position.y + screen_rect.size.y - limit[MARGIN_BOTTOM]; if (screen_rect.position.y < limit[MARGIN_TOP]) camera_pos.y -= screen_rect.position.y - limit[MARGIN_TOP]; } if (smoothing_enabled && !Engine::get_singleton()->is_editor_hint()) { float c = smoothing * get_fixed_process_delta_time(); smoothed_camera_pos = ((camera_pos - smoothed_camera_pos) * c) + smoothed_camera_pos; ret_camera_pos = smoothed_camera_pos; //camera_pos=camera_pos*(1.0-smoothing)+new_camera_pos*smoothing; } else { ret_camera_pos = smoothed_camera_pos = camera_pos; } } else { ret_camera_pos = smoothed_camera_pos = camera_pos = new_camera_pos; first = false; } Point2 screen_offset = (anchor_mode == ANCHOR_MODE_DRAG_CENTER ? (screen_size * 0.5 * zoom) : Point2()); float angle = get_global_transform().get_rotation(); if (rotating) { screen_offset = screen_offset.rotated(angle); } Rect2 screen_rect(-screen_offset + ret_camera_pos, screen_size * zoom); if (screen_rect.position.x < limit[MARGIN_LEFT]) screen_rect.position.x = limit[MARGIN_LEFT]; if (screen_rect.position.x + screen_rect.size.x > limit[MARGIN_RIGHT]) screen_rect.position.x = limit[MARGIN_RIGHT] - screen_rect.size.x; if (screen_rect.position.y + screen_rect.size.y > limit[MARGIN_BOTTOM]) screen_rect.position.y = limit[MARGIN_BOTTOM] - screen_rect.size.y; if (screen_rect.position.y < limit[MARGIN_TOP]) screen_rect.position.y = limit[MARGIN_TOP]; if (offset != Vector2()) { screen_rect.position += offset; if (screen_rect.position.x + screen_rect.size.x > limit[MARGIN_RIGHT]) screen_rect.position.x = limit[MARGIN_RIGHT] - screen_rect.size.x; if (screen_rect.position.y + screen_rect.size.y > limit[MARGIN_BOTTOM]) screen_rect.position.y = limit[MARGIN_BOTTOM] - screen_rect.size.y; if (screen_rect.position.x < limit[MARGIN_LEFT]) screen_rect.position.x = limit[MARGIN_LEFT]; if (screen_rect.position.y < limit[MARGIN_TOP]) screen_rect.position.y = limit[MARGIN_TOP]; } camera_screen_center = screen_rect.position + screen_rect.size * 0.5; Transform2D xform; if (rotating) { xform.set_rotation(angle); } xform.scale_basis(zoom); xform.set_origin(screen_rect.position /*.floor()*/); /* if (0) { xform = get_global_transform() * xform; } else { xform.elements[2]+=get_global_transform().get_origin(); } */ return (xform).affine_inverse(); }