bool Camera::_get(const StringName& p_name,Variant &r_ret) const { if (p_name=="projection") { r_ret= mode; } else if (p_name=="fov" || p_name=="fovy" || p_name=="fovx") r_ret= fov; else if (p_name=="size" || p_name=="sizex" || p_name=="sizey") r_ret= size; else if (p_name=="near") r_ret= near; else if (p_name=="far") r_ret= far; else if (p_name=="keep_aspect") r_ret= int(keep_aspect); else if (p_name=="current") { if (is_inside_tree() && get_tree()->is_node_being_edited(this)) { r_ret=current; } else { r_ret=is_current(); } } else if (p_name=="visible_layers") { r_ret=get_visible_layers(); } else if (p_name=="h_offset") { r_ret=get_h_offset(); } else if (p_name=="v_offset") { r_ret=get_v_offset(); } else if (p_name=="environment") { r_ret=get_environment(); } else return false; return true; }
bool PathFollow2D::_get(const StringName& p_name,Variant &r_ret) const{ if (p_name==SceneStringNames::get_singleton()->offset) { r_ret=get_offset(); } else if (p_name==SceneStringNames::get_singleton()->unit_offset) { r_ret=get_unit_offset(); } else if (p_name==SceneStringNames::get_singleton()->rotate) { r_ret=is_rotating(); } else if (p_name==SceneStringNames::get_singleton()->v_offset) { r_ret=get_v_offset(); } else if (p_name==SceneStringNames::get_singleton()->h_offset) { r_ret=get_h_offset(); } else if (String(p_name)=="cubic_interp") { r_ret=cubic; } else if (String(p_name)=="loop") { r_ret=loop; } else if (String(p_name)=="lookahead") { r_ret=lookahead; } else return false; return true; }
void OrientedPathFollow::_update_transform() { if (!path) return; Ref<Curve3D> c = path->get_curve(); if (!c.is_valid()) return; int count = c->get_point_count(); if (count < 2) return; if (delta_offset == 0) { return; } float offset = get_offset(); float bl = c->get_baked_length(); float bi = c->get_bake_interval(); float o = offset; float o_next = offset + bi; if (has_loop()) { o = Math::fposmod(o, bl); o_next = Math::fposmod(o_next, bl); } else if (o_next >= bl) { o = bl - bi; o_next = bl; } bool cubic = get_cubic_interpolation(); Vector3 pos = c->interpolate_baked(o, cubic); Vector3 forward = c->interpolate_baked(o_next, cubic) - pos; if (forward.length_squared() < CMP_EPSILON2) forward = Vector3(0, 0, 1); else forward.normalize(); Vector3 up = c->interpolate_baked_up_vector(o, true); if (o_next < o) { Vector3 up1 = c->interpolate_baked_up_vector(o_next, true); Vector3 axis = up.cross(up1); if (axis.length_squared() < CMP_EPSILON2) axis = forward; else axis.normalize(); up.rotate(axis, up.angle_to(up1) * 0.5f); } Transform t = get_transform(); Vector3 scale = t.basis.get_scale(); Vector3 sideways = up.cross(forward).normalized(); up = forward.cross(sideways).normalized(); t.basis.set(sideways, up, forward); t.basis.scale_local(scale); t.origin = pos + sideways * get_h_offset() + up * get_v_offset(); set_transform(t); }