@ -54,10 +54,13 @@ public class DepthOfFieldFilter extends Filter {
private float focusDistance = 50f ;
private float focusDistance = 50f ;
private float focusRange = 10f ;
private float focusRange = 10f ;
private float blurScale = 1f ;
private float blurScale = 1f ;
private float blurThreshold = 0 . 2f ;
// These values are set internally based on the
// These values are set internally based on the
// viewport size.
// viewport size.
private float xScale ;
private float xScale ;
private float yScale ;
private float yScale ;
private boolean debugUnfocus ;
/ * *
/ * *
* Creates a DepthOfField filter
* Creates a DepthOfField filter
@ -83,7 +86,8 @@ public class DepthOfFieldFilter extends Filter {
material = new Material ( assets , "Common/MatDefs/Post/DepthOfField.j3md" ) ;
material = new Material ( assets , "Common/MatDefs/Post/DepthOfField.j3md" ) ;
material . setFloat ( "FocusDistance" , focusDistance ) ;
material . setFloat ( "FocusDistance" , focusDistance ) ;
material . setFloat ( "FocusRange" , focusRange ) ;
material . setFloat ( "FocusRange" , focusRange ) ;
material . setFloat ( "BlurThreshold" , blurThreshold ) ;
material . setBoolean ( "DebugUnfocus" , debugUnfocus ) ;
xScale = 1 . 0f / w ;
xScale = 1 . 0f / w ;
yScale = 1 . 0f / h ;
yScale = 1 . 0f / h ;
@ -161,13 +165,62 @@ public class DepthOfFieldFilter extends Filter {
return blurScale ;
return blurScale ;
}
}
/ * *
* Sets the minimum blur factor before the convolution filter is
* calculated . The default is 0 . 2 which means if the "unfocus"
* amount is less than 0 . 2 ( where 0 is no blur and 1 . 0 is full blurScale )
* then no blur will be applied at all . Depending on the GPU implementation ,
* this may be an optimization since it uses branching to skip the expensive
* convolution filter .
*
* < p > In scenes where the focus distance is close ( like 0 ) and the focus range
* is relatively large , this threshold will remove some subtlety in
* the near - camera blurring and should be set smaller than the default
* or to 0 to disable completely . Sometimes that cut - off is desired if
* mid - to - far field unfocusing is all that is desired . < / p >
* /
public void setBlurThreshold ( float f ) {
this . blurThreshold = f ;
if ( material ! = null ) {
material . setFloat ( "BlurThreshold" , blurThreshold ) ;
}
}
/ * *
* returns the blur threshold .
* @return
* /
public float getBlurThreshold ( ) {
return blurThreshold ;
}
/ * *
* Turns on / off debugging of the ' unfocus ' value that is used to
* mix the convolution filter . When this is on , the ' unfocus ' value
* is rendered as gray scale . This can be used to more easily visualize
* where in your view the focus is centered and how steep the gradient / cutoff
* is , etc . .
* /
public void setDebugUnfocus ( boolean b ) {
this . debugUnfocus = b ;
if ( material ! = null ) {
material . setBoolean ( "DebugUnfocus" , debugUnfocus ) ;
}
}
public boolean getDebugUnfocus ( ) {
return debugUnfocus ;
}
@Override
@Override
public void write ( JmeExporter ex ) throws IOException {
public void write ( JmeExporter ex ) throws IOException {
super . write ( ex ) ;
super . write ( ex ) ;
OutputCapsule oc = ex . getCapsule ( this ) ;
OutputCapsule oc = ex . getCapsule ( this ) ;
oc . write ( blurScale , "blurScale" , 1f ) ;
oc . write ( blurScale , "blurScale" , 1f ) ;
oc . write ( blurScale , "blurThreshold" , 0 . 2f ) ;
oc . write ( focusDistance , "focusDistance" , 50f ) ;
oc . write ( focusDistance , "focusDistance" , 50f ) ;
oc . write ( focusRange , "focusRange" , 10f ) ;
oc . write ( focusRange , "focusRange" , 10f ) ;
oc . write ( debugUnfocus , "debugUnfocus" , false ) ; // strange to write this I guess
}
}
@Override
@Override
@ -175,7 +228,9 @@ public class DepthOfFieldFilter extends Filter {
super . read ( im ) ;
super . read ( im ) ;
InputCapsule ic = im . getCapsule ( this ) ;
InputCapsule ic = im . getCapsule ( this ) ;
blurScale = ic . readFloat ( "blurScale" , 1f ) ;
blurScale = ic . readFloat ( "blurScale" , 1f ) ;
blurThreshold = ic . readFloat ( "blurThreshold" , 0 . 2f ) ;
focusDistance = ic . readFloat ( "focusDistance" , 50f ) ;
focusDistance = ic . readFloat ( "focusDistance" , 50f ) ;
focusRange = ic . readFloat ( "focusRange" , 10f ) ;
focusRange = ic . readFloat ( "focusRange" , 10f ) ;
debugUnfocus = ic . readBoolean ( "debugUnfocus" , false ) ;
}
}
}
}