Guest User

Untitled

a guest
Jul 24th, 2016
238
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.16 KB | None | 0 0
  1. void Renderer::SetBatchShaders(Batch& batch, Technique* tech, bool allowShadows)
  2. {
  3.     // Check if shaders are unloaded or need reloading
  4.     Pass* pass = batch.pass_;
  5.     Vector<SharedPtr<ShaderVariation> >& vertexShaders = pass->GetVertexShaders();
  6.     Vector<SharedPtr<ShaderVariation> >& pixelShaders = pass->GetPixelShaders();
  7.     Vector<SharedPtr<ShaderVariation> >& geometryShaders = pass->GetGeometryShaders();
  8.     if (!vertexShaders.Size() || !pixelShaders.Size() || pass->GetShadersLoadedFrameNumber() != shadersChangedFrameNumber_)
  9.     {
  10.         // First release all previous shaders, then load
  11.         pass->ReleaseShaders();
  12.         LoadPassShaders(pass);
  13.     }
  14.  
  15.     // Make sure shaders are loaded now
  16.     if (vertexShaders.Size() && pixelShaders.Size())
  17.     {
  18.         bool heightFog = batch.zone_ && batch.zone_->GetHeightFog();
  19.  
  20.         // If instancing is not supported, but was requested, choose static geometry vertex shader instead
  21.         if (batch.geometryType_ == GEOM_INSTANCED && !GetDynamicInstancing())
  22.             batch.geometryType_ = GEOM_STATIC;
  23.  
  24.         if (batch.geometryType_ == GEOM_STATIC_NOINSTANCING)
  25.             batch.geometryType_ = GEOM_STATIC;
  26.  
  27.         //  Check whether is a pixel lit forward pass. If not, there is only one pixel shader
  28.         if (pass->GetLightingMode() == LIGHTING_PERPIXEL)
  29.         {
  30.             LightBatchQueue* lightQueue = batch.lightQueue_;
  31.             if (!lightQueue)
  32.             {
  33.                 // Do not log error, as it would result in a lot of spam
  34.                 batch.vertexShader_ = 0;
  35.                 batch.pixelShader_ = 0;
  36.                 batch.geometryShader_ = 0;
  37.                 return;
  38.             }
  39.  
  40.             Light* light = lightQueue->light_;
  41.             unsigned vsi = 0;
  42.             unsigned psi = 0;
  43.             unsigned gsi = 0;
  44.             vsi = batch.geometryType_ * MAX_LIGHT_VS_VARIATIONS;
  45.             gsi = batch.geometryType_ * MAX_LIGHT_GS_VARIATIONS;
  46.  
  47.             bool materialHasSpecular = batch.material_ ? batch.material_->GetSpecular() : true;
  48.             if (specularLighting_ && light->GetSpecularIntensity() > 0.0f && materialHasSpecular)
  49.                 psi += LPS_SPEC;
  50.             if (allowShadows && lightQueue->shadowMap_)
  51.             {
  52.                 if (light->GetShadowBias().normalOffset_ > 0.0f)
  53.                 {
  54.                     vsi += LVS_SHADOWNORMALOFFSET;
  55.                     gsi += LGS_SHADOWNORMALOFFSET;
  56.                 }
  57.                 else
  58.                 {
  59.                     vsi += LVS_SHADOW;
  60.                     gsi += LGS_SHADOW;
  61.                 }
  62.                 psi += LPS_SHADOW;
  63.             }
  64.  
  65.             switch (light->GetLightType())
  66.             {
  67.             case LIGHT_DIRECTIONAL:
  68.                 vsi += LVS_DIR;
  69.                 gsi += LGS_DIR;
  70.                 break;
  71.  
  72.             case LIGHT_SPOT:
  73.                 psi += LPS_SPOT;
  74.                 vsi += LVS_SPOT;
  75.                 gsi += LGS_SPOT;
  76.                 break;
  77.  
  78.             case LIGHT_POINT:
  79.                 if (light->GetShapeTexture())
  80.                     psi += LPS_POINTMASK;
  81.                 else
  82.                     psi += LPS_POINT;
  83.                 vsi += LVS_POINT;
  84.                 gsi += LGS_POINT;
  85.                 break;
  86.             }
  87.  
  88.             if (heightFog)
  89.                 psi += MAX_LIGHT_PS_VARIATIONS;
  90.  
  91.             batch.vertexShader_ = vertexShaders[vsi];
  92.             batch.pixelShader_ = pixelShaders[psi];
  93.             //batch.geometryShader_ = geometryShaders.Size() > 0 ? geometryShaders[gsi] : (ShaderVariation*)0;
  94.             batch.geometryShader_ = geometryShaders[gsi];
  95.         }
  96.         else
  97.         {
  98.             // Check if pass has vertex lighting support
  99.             if (pass->GetLightingMode() == LIGHTING_PERVERTEX)
  100.             {
  101.                 unsigned numVertexLights = 0;
  102.                 if (batch.lightQueue_)
  103.                     numVertexLights = batch.lightQueue_->vertexLights_.Size();
  104.  
  105.                 unsigned vsi = batch.geometryType_ * MAX_VERTEXLIGHT_VS_VARIATIONS + numVertexLights;
  106.                 unsigned gsi = batch.geometryType_ * MAX_VERTEXLIGHT_GS_VARIATIONS + numVertexLights;
  107.                 batch.vertexShader_ = vertexShaders[vsi];
  108.                 //batch.geometryShader_ = geometryShaders.Size() > 0 ? geometryShaders[gsi] : (ShaderVariation*)0;
  109.                 batch.geometryShader_ = geometryShaders[gsi];
  110.  
  111.             }
  112.             else
  113.             {
  114.                 unsigned vsi = batch.geometryType_;
  115.                 unsigned gsi = batch.geometryType_;
  116.                 batch.vertexShader_ = vertexShaders[vsi];
  117.                 //batch.geometryShader_ = geometryShaders.Size() > 0 ? geometryShaders[gsi] : (ShaderVariation*)0;
  118.                 batch.geometryShader_ = geometryShaders[gsi];
  119.             }
  120.  
  121.             batch.pixelShader_ = pixelShaders[heightFog ? 1 : 0];
  122.         }
  123.     }
  124.     // Log error if shaders could not be assigned, but only once per technique
  125.     if (!batch.vertexShader_ || !batch.pixelShader_)
  126.     {
  127.         if (!shaderErrorDisplayed_.Contains(tech))
  128.         {
  129.             shaderErrorDisplayed_.Insert(tech);
  130.             URHO3D_LOGERROR("Technique " + tech->GetName() + " has missing shaders");
  131.         }
  132.     }
  133. }
Add Comment
Please, Sign In to add comment