@@ -25,15 +25,21 @@ LensDistortPlugin::LensDistortPlugin( OfxImageEffectHandle handle )
2525 _reverse = fetchBooleanParam ( kParamReverse );
2626 _displaySource = fetchBooleanParam ( kParamDisplaySource );
2727 _lensType = fetchChoiceParam ( kParamLensType );
28+ _normalization = fetchChoiceParam ( kParamNormalization );
29+ _focal = fetchDoubleParam ( kParamFocal );
2830 _coef1 = fetchDoubleParam ( kParamCoef1 );
2931 _coef2 = fetchDoubleParam ( kParamCoef2 );
32+ _coef3 = fetchDoubleParam ( kParamCoef3 );
3033 _squeeze = fetchDoubleParam ( kParamSqueeze );
3134 _asymmetric = fetchDouble2DParam ( kParamAsymmetric );
3235 _center = fetchDouble2DParam ( kParamCenter );
36+ _centerUnit = fetchChoiceParam ( kParamCenterUnit );
3337 _centerOverlay = fetchBooleanParam ( kParamCenterOverlay );
3438 _centerType = fetchChoiceParam ( kParamCenterType );
3539 _preScale = fetchDoubleParam ( kParamPreScale );
3640 _postScale = fetchDoubleParam ( kParamPostScale );
41+ _preOffset = fetchDouble2DParam ( kParamPreOffset );
42+ _postOffset = fetchDouble2DParam ( kParamPostOffset );
3743 _resizeRod = fetchChoiceParam ( kParamResizeRod );
3844 _resizeRodManualScale = fetchDoubleParam ( kParamResizeRodManualScale );
3945 _groupDisplayParams = fetchGroupParam ( kParamDisplayOptions );
@@ -53,6 +59,7 @@ void LensDistortPlugin::initParamsProps()
5359 changedParam ( args, kParamFilter );
5460 changedParam ( args, kParamLensType );
5561 changedParam ( args, kParamResizeRod );
62+ changedParam ( args, kParamNormalization );
5663}
5764
5865/* *
@@ -70,38 +77,42 @@ void LensDistortPlugin::changedParam( const OFX::InstanceChangedArgs& args, cons
7077
7178 if ( paramName == kParamLensType )
7279 {
73- switch ( _lensType->getValue () )
80+ switch ( (EParamLensType) _lensType->getValue () )
7481 {
75- case 0 : // normal
76- _coef2 -> setIsSecret ( true );
77- _coef2 -> setEnabled ( false );
78- _squeeze -> setIsSecret ( true );
79- _squeeze -> setEnabled ( false );
80- _asymmetric -> setIsSecret ( true );
81- _asymmetric -> setEnabled ( false );
82+ case eParamLensTypeBrown1:
83+ _coef2 -> setIsSecretAndDisabled ( true );
84+ _coef3 -> setIsSecretAndDisabled ( true );
85+ _squeeze -> setIsSecretAndDisabled ( true );
86+ _asymmetric -> setIsSecretAndDisabled ( true );
8287 break ;
83- case 1 : // fish-eye
84- _coef2 ->setIsSecret ( false );
85- _coef2 -> setEnabled ( true );
86- _squeeze -> setIsSecret ( true );
87- _squeeze -> setEnabled ( false );
88- _asymmetric -> setIsSecret ( true );
89- _asymmetric -> setEnabled ( false );
88+ case eParamLensTypeBrown3:
89+ _coef2 -> setIsSecretAndDisabled ( false );
90+ _coef3 -> setIsSecretAndDisabled ( false );
91+ _squeeze -> setIsSecretAndDisabled ( true );
92+ _asymmetric -> setIsSecretAndDisabled ( true );
9093 break ;
91- case 2 : // advanced
92- _coef2 -> setIsSecret ( false );
93- _coef2 -> setEnabled ( true );
94- _squeeze -> setIsSecret ( false );
95- _squeeze -> setEnabled ( true );
96- _asymmetric -> setIsSecret ( false );
97- _asymmetric -> setEnabled ( true );
94+ case eParamLensTypePTLens:
95+ _coef2 -> setIsSecretAndDisabled ( false );
96+ _coef3 -> setIsSecretAndDisabled ( false );
97+ _squeeze -> setIsSecretAndDisabled ( true );
98+ _asymmetric -> setIsSecretAndDisabled ( true );
99+ break ;
100+ case eParamLensTypeFisheye:
101+ _coef2 ->setIsSecretAndDisabled ( true );
102+ _coef3 ->setIsSecretAndDisabled ( true );
103+ _squeeze -> setIsSecretAndDisabled ( true );
104+ _asymmetric -> setIsSecretAndDisabled ( true );
98105 break ;
99106 default :
100107 BOOST_THROW_EXCEPTION ( exception::Bug ()
101108 << exception::user () + " Lens type value not recognize." );
102109 break ;
103110 }
104111 }
112+ else if ( paramName == kParamNormalization )
113+ {
114+ _focal->setIsSecretAndDisabled ( _normalization->getValue () != eParamNormalizationFocal );
115+ }
105116 else if ( paramName == kParamResizeRod )
106117 {
107118 if ( _resizeRod->getValue () == eParamResizeRodManual )
@@ -129,10 +140,13 @@ bool LensDistortPlugin::isIdentity( const OFX::RenderArguments& args, OFX::Clip*
129140 {
130141 isIdentity = true ;
131142 }
132- else if ( _coef1->getValue () == 0 /* _coef1->getDefault( ) */ &&
143+ else if ( _coef1->getValue () == 0 &&
133144 _preScale->getValue () == _preScale->getDefault () &&
134145 _postScale->getValue () == _postScale->getDefault () &&
135- ( !_coef2->getIsEnable () || _coef2->getValue () == _coef2->getDefault () ) &&
146+ _preOffset->getValue () == _preOffset->getDefault () &&
147+ _postOffset->getValue () == _postOffset->getDefault () &&
148+ ( !_coef2->getIsEnable () || _coef2->getValue () == 0 ) &&
149+ ( !_coef3->getIsEnable () || _coef3->getValue () == 0 ) &&
136150 ( !_squeeze->getIsEnable () || _squeeze->getValue () == _squeeze->getDefault () ) &&
137151 ( !_asymmetric->getIsEnable () || _asymmetric->getValue () == _asymmetric->getDefault () ) )
138152 {
@@ -186,18 +200,18 @@ bool LensDistortPlugin::getRegionOfDefinition( const OFX::RegionOfDefinitionArgu
186200 pMax.x = std::min ( tr.x , br.x );
187201 pMax.y = std::min ( bl.y , br.y );
188202
189- if ( params._lensCenterSrc .x > srcRodInDstFrame.x1 && params._lensCenterSrc .x < srcRodInDstFrame.x2 )
203+ if ( params.lensCenterSrc .x > srcRodInDstFrame.x1 && params.lensCenterSrc .x < srcRodInDstFrame.x2 )
190204 {
191- Point2 t = transformValues ( getLensType (), params, Point2 ( params._lensCenterSrc .x , srcRodInDstFrame.y1 ) );
205+ Point2 t = transformValues ( getLensType (), params, Point2 ( params.lensCenterSrc .x , srcRodInDstFrame.y1 ) );
192206 pMin.y = std::max ( pMin.y , t.y );
193- Point2 b = transformValues ( getLensType (), params, Point2 ( params._lensCenterSrc .x , srcRodInDstFrame.y2 ) );
207+ Point2 b = transformValues ( getLensType (), params, Point2 ( params.lensCenterSrc .x , srcRodInDstFrame.y2 ) );
194208 pMax.y = std::min ( pMax.y , b.y );
195209 }
196- if ( params._lensCenterSrc .y > srcRodInDstFrame.y1 && params._lensCenterSrc .y < srcRodInDstFrame.y2 )
210+ if ( params.lensCenterSrc .y > srcRodInDstFrame.y1 && params.lensCenterSrc .y < srcRodInDstFrame.y2 )
197211 {
198- Point2 l = transformValues ( getLensType (), params, Point2 ( srcRodInDstFrame.x1 , params._lensCenterSrc .y ) );
212+ Point2 l = transformValues ( getLensType (), params, Point2 ( srcRodInDstFrame.x1 , params.lensCenterSrc .y ) );
199213 pMin.x = std::max ( pMin.x , l.x );
200- Point2 r = transformValues ( getLensType (), params, Point2 ( srcRodInDstFrame.x2 , params._lensCenterSrc .y ) );
214+ Point2 r = transformValues ( getLensType (), params, Point2 ( srcRodInDstFrame.x2 , params.lensCenterSrc .y ) );
201215 pMax.x = std::min ( pMax.x , r.x );
202216 }
203217 rod.x1 = pMin.x ;
@@ -335,42 +349,90 @@ LensDistortProcessParams<LensDistortPlugin::Scalar> LensDistortPlugin::getProces
335349 double preScale = _preScale->getValue ();
336350 double postScale = _postScale->getValue ();
337351
338- params._coef1 = _coef1 ->getValue ();
352+ params.distort = _reverse ->getValue ();
339353
340- if ( params._coef1 >= 0 )
341- params._distort = true ; // distort
342- else
343- params._distort = false ; // undistort
354+ params.coef1 = _coef1->getValue ();
355+ params.coef2 = _coef2->getValue ();
356+ params.coef3 = _coef3->getValue ();
357+ params.squeeze = _squeeze->getValue ();
358+ params.asymmetric = ofxToGil ( _asymmetric->getValue () );
344359
345- params._coef1 = std::abs ( params._coef1 );
346- params._coef2 = _coef2->getValue ();
347- params._squeeze = _squeeze->getValue ();
348- params._asymmetric = ofxToGil ( _asymmetric->getValue () );
360+ params.preScale .x = params.preScale .y = 1.0 / preScale;
361+ params.postScale .x = params.postScale .y = 1.0 / postScale;
349362
350- params. _preScale . x = ( 1.0 / preScale );
351- params. _preScale . y = 1.0 / preScale ;
363+ Point2 preOffset = ofxToGil (_preOffset-> getValue () );
364+ Point2 postOffset = ofxToGil (_postOffset-> getValue ()) ;
352365
353- params._postScale .x = ( 1.0 / postScale );
354- params._postScale .y = 1.0 / postScale;
366+ if ( reverse )
367+ {
368+ params.distort = !params.distort ;
355369
356- Point2 imgShift = Point2 ( inputRod.x1 - outputRod.x1 , inputRod.y1 - outputRod.y1 ); // translate output -> source
357- params._imgSizeSrc = Point2 ( choosedInputRod.x2 - choosedInputRod.x1 , choosedInputRod.y2 - choosedInputRod.y1 );
358- params._imgCenterSrc = Point2 ( params._imgSizeSrc .x * 0.5 , params._imgSizeSrc .y * 0.5 );
359- params._imgCenterDst = params._imgCenterSrc + imgShift;
360- params._imgHalfDiagonal = std::sqrt ( params._imgCenterSrc .x * params._imgCenterSrc .x * pixelAspectRatio * pixelAspectRatio + params._imgCenterSrc .y * params._imgCenterSrc .y );
361- params._pixelRatio = pixelAspectRatio;
370+ // swap pre/post scale
371+ Point2 swapPoint = params.preScale ;
372+ params.preScale = 1.0 / params.postScale ;
373+ params.postScale = 1.0 / swapPoint;
374+
375+ // swap pre/post offset
376+ swapPoint = preOffset;
377+ preOffset = postOffset;
378+ postOffset = swapPoint;
379+ }
380+
381+ Point2 imgShift = Point2 ( inputRod.x1 - outputRod.x1 , inputRod.y1 - outputRod.y1 ); // translate output -> source
382+ params.imgSizeSrc = Point2 ( choosedInputRod.x2 - choosedInputRod.x1 , choosedInputRod.y2 - choosedInputRod.y1 );
383+ params.imgCenterSrc = Point2 ( params.imgSizeSrc .x * 0.5 , params.imgSizeSrc .y * 0.5 );
384+ params.imgCenterDst = params.imgCenterSrc + imgShift;
385+ switch ( (EParamNormalization)_normalization->getValue () )
386+ {
387+ case eParamNormalizationWidth:
388+ params.normalizeCoef = params.imgSizeSrc .x ;
389+ break ;
390+ case eParamNormalizationHeight:
391+ params.normalizeCoef = params.imgSizeSrc .y ;
392+ break ;
393+ case eParamNormalizationMinSize:
394+ params.normalizeCoef = std::min (params.imgSizeSrc .x , params.imgSizeSrc .y );
395+ break ;
396+ case eParamNormalizationMaxSize:
397+ params.normalizeCoef = std::max (params.imgSizeSrc .x , params.imgSizeSrc .y );
398+ break ;
399+ case eParamNormalizationDiagonal:
400+ params.normalizeCoef = std::sqrt ( params.imgSizeSrc .x * params.imgSizeSrc .x + params.imgSizeSrc .y * params.imgSizeSrc .y );
401+ break ;
402+ case eParamNormalizationHalfDiagonal:
403+ params.normalizeCoef = std::sqrt ( params.imgCenterSrc .x * params.imgCenterSrc .x + params.imgCenterSrc .y * params.imgCenterSrc .y );
404+ break ;
405+ case eParamNormalizationFocal:
406+ params.normalizeCoef = _focal->getValue ();
407+ break ;
408+ }
409+ params.pixelRatio = pixelAspectRatio;
362410
363411 switch ( getCenterType () )
364412 {
365413 case eParamCenterTypeSource:
366414 {
367- params._lensCenterSrc = pointNormalizedXXcToCanonicalXY ( ofxToGil ( _center->getValue () ), params._imgSizeSrc );
415+ switch ( (EParamCenterUnit)_centerUnit->getValue () )
416+ {
417+ case eParamCenterUnitCenteredPixel:
418+ params.lensCenterSrc = ofxToGil ( _center->getValue () ) + params.imgCenterSrc ;
419+ break ;
420+ case eParamCenterUnitPixel:
421+ params.lensCenterSrc = ofxToGil ( _center->getValue () );
422+ break ;
423+ case eParamCenterUnitCenteredNormWidth:
424+ params.lensCenterSrc = pointNormalizedXXcToCanonicalXY ( ofxToGil ( _center->getValue () ), params.imgSizeSrc );
425+ break ;
426+ case eParamCenterUnitNormWidth:
427+ params.lensCenterSrc = pointNormalizedXXToCanonicalXY ( ofxToGil ( _center->getValue () ), params.imgSizeSrc );
428+ break ;
429+ }
368430 if ( useOptionalInputRod )
369431 {
370432 Point2 imgShiftBetweenInputs = Point2 ( optionalInputRod.x1 - inputRod.x1 , optionalInputRod.y1 - inputRod.y1 ); // translate inputRod -> optionalInputRod
371- params._lensCenterSrc += imgShiftBetweenInputs;
433+ params.lensCenterSrc += imgShiftBetweenInputs;
372434 }
373- params._lensCenterDst = params._lensCenterSrc + imgShift;
435+ params.lensCenterDst = params.lensCenterSrc + imgShift;
374436 break ;
375437 }
376438 case eParamCenterTypeRoW:
@@ -379,14 +441,9 @@ LensDistortProcessParams<LensDistortPlugin::Scalar> LensDistortPlugin::getProces
379441 break ;
380442 }
381443 }
382- if ( _reverse->getValue () != reverse )
383- {
384- Point2 swapPreScale = params._preScale ;
444+ params.lensCenterSrc -= preOffset;
445+ params.lensCenterDst += postOffset;
385446
386- params._distort = !params._distort ;
387- params._preScale = 1.0 / params._postScale ;
388- params._postScale = 1.0 / swapPreScale;
389- }
390447 return params;
391448}
392449
0 commit comments