@ -704,8 +704,9 @@ public class Material implements CloneableSmartAsset, Cloneable, Savable {
setParam ( name , VarType . Vector4 , value ) ;
}
private ColorRGBA getAmbientColor ( LightList lightList , boolean removeLights ) {
private LightProbe extractIndirectLights ( LightList lightList , boolean removeLights ) {
ambientLightColor . set ( 0 , 0 , 0 , 1 ) ;
LightProbe probe = null ;
for ( int j = 0 ; j < lightList . size ( ) ; j + + ) {
Light l = lightList . get ( j ) ;
if ( l instanceof AmbientLight ) {
@ -714,9 +715,15 @@ public class Material implements CloneableSmartAsset, Cloneable, Savable {
lightList . remove ( l ) ;
}
}
if ( l instanceof LightProbe ) {
probe = ( LightProbe ) l ;
if ( removeLights ) {
lightList . remove ( l ) ;
}
}
}
ambientLightColor . a = 1 . 0f ;
return ambientLightColor ;
return probe ;
}
private static void renderMeshFromGeometry ( Renderer renderer , Geometry geom ) {
@ -764,13 +771,32 @@ public class Material implements CloneableSmartAsset, Cloneable, Savable {
Uniform lightProbeIrrMap = shader . getUniform ( "g_IrradianceMap" ) ;
Uniform lightProbePemMap = shader . getUniform ( "g_PrefEnvMap" ) ;
LightProbe lightProbe = null ;
if ( startIndex ! = 0 ) {
// apply additive blending for 2nd and future passes
rm . getRenderer ( ) . applyRenderState ( additiveLight ) ;
ambientColor . setValue ( VarType . Vector4 , ColorRGBA . Black ) ;
} else {
ambientColor . setValue ( VarType . Vector4 , getAmbientColor ( lightList , true ) ) ;
lightProbe = extractIndirectLights ( lightList , true ) ;
ambientColor . setValue ( VarType . Vector4 , ambientLightColor ) ;
}
//If there is a lightProbe in the list we force it's render on the first pass
if ( lightProbe ! = null ) {
BoundingSphere s = ( BoundingSphere ) lightProbe . getBounds ( ) ;
lightProbeData . setVector4InArray ( lightProbe . getPosition ( ) . x , lightProbe . getPosition ( ) . y , lightProbe . getPosition ( ) . z , 1f / s . getRadius ( ) , 0 ) ;
//assigning new texture indexes if they have never been assigned.
if ( irrUnit = = - 1 ) {
irrUnit = nextTexUnit + + ;
pemUnit = nextTexUnit + + ;
}
rm . getRenderer ( ) . setTexture ( irrUnit , lightProbe . getIrradianceMap ( ) ) ;
lightProbeIrrMap . setValue ( VarType . Int , irrUnit ) ;
rm . getRenderer ( ) . setTexture ( pemUnit , lightProbe . getPrefilteredEnvMap ( ) ) ;
lightProbePemMap . setValue ( VarType . Int , pemUnit ) ;
} else {
//Disable IBL for this pass
lightProbeData . setVector4InArray ( 0 , 0 , 0 , - 1 , 0 ) ;
}
int lightDataIndex = 0 ;
@ -841,34 +867,13 @@ public class Material implements CloneableSmartAsset, Cloneable, Savable {
transposeLightDataToSpace ( technique . getDef ( ) . getLightSpace ( ) , rm , tmpVec ) ;
lightData . setVector4InArray ( tmpVec . getX ( ) , tmpVec . getY ( ) , tmpVec . getZ ( ) , spotAngleCos , lightDataIndex ) ;
lightDataIndex + + ;
break ;
case Probe :
useIBL = true ;
endIndex + + ;
LightProbe probe = ( LightProbe ) l ;
BoundingSphere s = ( BoundingSphere ) probe . getBounds ( ) ;
lightProbeData . setVector4InArray ( probe . getPosition ( ) . x , probe . getPosition ( ) . y , probe . getPosition ( ) . z , 1f / s . getRadius ( ) , 0 ) ;
//assigning new texture indexes if they have never been assigned.
if ( irrUnit = = - 1 ) {
irrUnit = nextTexUnit + + ;
pemUnit = nextTexUnit + + ;
}
rm . getRenderer ( ) . setTexture ( irrUnit , probe . getIrradianceMap ( ) ) ;
lightProbeIrrMap . setValue ( VarType . Int , irrUnit ) ;
rm . getRenderer ( ) . setTexture ( pemUnit , probe . getPrefilteredEnvMap ( ) ) ;
lightProbePemMap . setValue ( VarType . Int , pemUnit ) ;
break ;
break ;
default :
throw new UnsupportedOperationException ( "Unknown type of light: " + l . getType ( ) ) ;
}
}
vars . release ( ) ;
if ( ! useIBL ) {
//Disable IBL for this pass
lightProbeData . setVector4InArray ( 0 , 0 , 0 , - 1 , 0 ) ;
}
//Padding of unsued buffer space
while ( lightDataIndex < numLights * 3 ) {
lightData . setVector4InArray ( 0f , 0f , 0f , 0f , lightDataIndex ) ;
@ -889,13 +894,14 @@ public class Material implements CloneableSmartAsset, Cloneable, Savable {
for ( int i = 0 ; i < lightList . size ( ) ; i + + ) {
Light l = lightList . get ( i ) ;
if ( l instanceof AmbientLight ) {
if ( l instanceof AmbientLight | | l instanceof LightProbe ) {
continue ;
}
if ( isFirstLight ) {
// set ambient color for first light only
ambientColor . setValue ( VarType . Vector4 , getAmbientColor ( lightList , false ) ) ;
extractIndirectLights ( lightList , false ) ;
ambientColor . setValue ( VarType . Vector4 , ambientLightColor ) ;
isFirstLight = false ;
isSecondLight = true ;
} else if ( isSecondLight ) {
@ -967,7 +973,7 @@ public class Material implements CloneableSmartAsset, Cloneable, Savable {
lightDir . setValue ( VarType . Vector4 , tmpLightDirection ) ;
break ;
break ;
default :
throw new UnsupportedOperationException ( "Unknown type of light: " + l . getType ( ) ) ;
}
@ -979,7 +985,8 @@ public class Material implements CloneableSmartAsset, Cloneable, Savable {
if ( isFirstLight ) {
// Either there are no lights at all, or only ambient lights.
// Render a dummy "normal light" so we can see the ambient color.
ambientColor . setValue ( VarType . Vector4 , getAmbientColor ( lightList , false ) ) ;
extractIndirectLights ( lightList , false ) ;
ambientColor . setValue ( VarType . Vector4 , ambientLightColor ) ;
lightColor . setValue ( VarType . Vector4 , ColorRGBA . BlackNoAlpha ) ;
lightPos . setValue ( VarType . Vector4 , nullDirLight ) ;
r . setShader ( shader ) ;