Commands/Filters/Set-OBS3DFilter.ps.ps1
function Set-OBS3DFilter { <# .SYNOPSIS Sets an OBS 3D Filter. .DESCRIPTION Adds or Changes a 3D Filter on an OBS Input. This requires the [3D Effect](https://github.com/exeldro/obs-3d-effect). #> [inherit(Command={ Import-Module ..\..\obs-powershell.psd1 -Global "Add-OBSSourceFilter" }, Dynamic, Abstract, ExcludeParameter='FilterKind','FilterSettings')] [Alias('Add-OBS3DFilter')] param( # The Field of View [Parameter(ValueFromPipelineByPropertyName)] [ComponentModel.DefaultBindingProperty("fov")] [double] $FieldOfView, # The Rotation along the X-axis [Parameter(ValueFromPipelineByPropertyName)] [ComponentModel.DefaultBindingProperty("rot_x")] [double] $RotationX, # The Rotation along the Y-axis [Parameter(ValueFromPipelineByPropertyName)] [ComponentModel.DefaultBindingProperty("rot_y")] [double] $RotationY, # The Rotation along the Z-axis [Parameter(ValueFromPipelineByPropertyName)] [ComponentModel.DefaultBindingProperty("rot_z")] [double] $RotationZ, # The Position along the X-axis [Parameter(ValueFromPipelineByPropertyName)] [ComponentModel.DefaultBindingProperty("pos_x")] [double] $PositionX, # The Position along the Y-axis [Parameter(ValueFromPipelineByPropertyName)] [ComponentModel.DefaultBindingProperty("pos_y")] [double] $PositionY, # The Position along the Z-axis [Parameter(ValueFromPipelineByPropertyName)] [ComponentModel.DefaultBindingProperty("pos_z")] [double] $PositionZ, # The scale of the source along the X-axis [Parameter(ValueFromPipelineByPropertyName)] [ComponentModel.DefaultBindingProperty("scale_x")] [double] $ScaleX, # The scale of the source along the Y-axis [Parameter(ValueFromPipelineByPropertyName)] [ComponentModel.DefaultBindingProperty("scale_y")] [double] $ScaleY, # If set, will remove a filter if one already exists. # If this is not provided and the filter already exists, the settings of the filter will be changed. [switch] $Force ) process { $myParameters = [Ordered]@{} + $PSBoundParameters if (-not $myParameters["FilterName"]) { $filterName = $myParameters["FilterName"] = "3Band3D" } $myParameterData = [Ordered]@{} foreach ($parameter in $MyInvocation.MyCommand.Parameters.Values) { $bindToPropertyName = $null foreach ($attribute in $parameter.Attributes) { if ($attribute -is [ComponentModel.DefaultBindingPropertyAttribute]) { $bindToPropertyName = $attribute.Name break } } if (-not $bindToPropertyName) { continue } if ($myParameters.Contains($parameter.Name)) { $myParameterData[$bindToPropertyName] = $myParameters[$parameter.Name] if ($myParameters[$parameter.Name] -is [switch]) { $myParameterData[$bindToPropertyName] = $parameter.Name -as [bool] } } } $addSplat = @{ filterName = $myParameters["FilterName"] SourceName = $myParameters["SourceName"] filterKind = "3d_effect_filter" filterSettings = $myParameterData NoResponse = $myParameters["NoResponse"] } if ($MyParameters["PassThru"]) { $addSplat.Passthru = $MyParameters["PassThru"] if ($MyInvocation.InvocationName -like 'Add-*') { Add-OBSSourceFilter @addSplat } else { $addSplat.Remove('FilterKind') Set-OBSSourceFilterSettings @addSplat } return } # Add the input. $outputAddedResult = Add-OBSSourceFilter @addSplat *>&1 # If we got back an error if ($outputAddedResult -is [Management.Automation.ErrorRecord]) { # and that error was saying the source already exists, if ($outputAddedResult.TargetObject.d.requestStatus.code -eq 601) { # then check if we use the -Force. if ($Force) { # If we do, remove the input Remove-OBSSourceFilter -FilterName $addSplat.FilterName -SourceName $addSplat.SourceName # and re-add our result. $outputAddedResult = Add-OBSInput @addSplat *>&1 } else { # Otherwise, get the existing filter. $existingFilter = Get-OBSSourceFilter -SourceName $addSplat.SourceName -FilterName $addSplat.FilterName # then apply the settings $existingFilter.Set($addSplat.filterSettings) # and output them $existingFilter # (don't forget to null the result, so we don't show this error) $outputAddedResult = $null } } # If the output was still an error if ($outputAddedResult -is [Management.Automation.ErrorRecord]) { # use $psCmdlet.WriteError so that it shows the error correctly. $psCmdlet.WriteError($outputAddedResult) } } # Otherwise, if we had a result elseif ($outputAddedResult) { # Otherwise, get the input from the filters. Get-OBSSourceFilter -SourceName $addSplat.SourceName -FilterName $addSplat.FilterName } } } |