#include "DynamicLighting_shader.h"
#include <math.h>
#define DYNAMICLIGHTING__CLASS DYNAMICLIGHTING__CLASSNAME
#ifdef _MB_INTERNAL
#define DYNAMICLIGHTING__DESC "Dynamic Lighting" // This is what shows up in the shader window ...
#else
#define DYNAMICLIGHTING__DESC "Dynamic Lighting Plugin" // This is what shows up in the shader window ...
#endif
DYNAMICLIGHTING__CLASS,
DYNAMICLIGHTING__DESCSTR,
DYNAMICLIGHTING__DESC,
Graphics::Shader* DynamicLighting::mpLightShader =
NULL;
int DynamicLighting::mpLightShaderRefCount = 0;
bool DynamicLighting::FBCreate()
{
mpLightShaderRefCount++;
AffectingLights.SetFilter(FBLight::GetInternalClassId());
AffectingLights.SetSingleConnect(false);
RenderingPass = GetRenderingPassNeededForAlpha(Transparency);
TransparencyFactor.SetMinMax(0.0, 1.0);
TransparencyFactor = 1.0;
SetDrawInstancedMaximumSize(kMaxDrawInstancedSize);
return true;
}
void DynamicLighting::FBDestroy()
{
mpLightShaderRefCount--;
if (mpLightShaderRefCount == 0)
{
delete mpLightShader;
}
ParentClass::FBDestroy();
}
void DynamicLighting::ShaderPassTypeBegin ( FBRenderOptions* pRenderOptions,
FBRenderingPass pPass)
{
if ( !mpLightShader )
{
FBSystem lSystem;
FBString lVertexShader;
lVertexShader = lSystem.ApplicationPath ;
FBString lPixelShader;
lPixelShader = lSystem.ApplicationPath ;
#ifdef _MB_INTERNAL
lVertexShader += "/../system/shaders/LightingVS.cg";
lPixelShader += "/../system/shaders/LightingPS.cg";
#else
lVertexShader += "/plugins/LightingVS.cg";
lPixelShader += "/plugins/LightingPS.cg";
#endif
mpLightShader = new Graphics::Shader();
if( !mpLightShader->Initialize(lVertexShader, lPixelShader) )
{
return;
}
}
}
void DynamicLighting::ShaderPassTypeEnd ( FBRenderOptions* pRenderOptions,
FBRenderingPass pPass)
{
}
void DynamicLighting::ShaderPassInstanceBegin( FBRenderOptions* pRenderOptions,
FBRenderingPass pPass)
{
FBArrayTemplate<FBLight*> lAffectingLights;
for(
int i = 0;
i < AffectingLights.GetCount(); ++
i)
{
FBLight* lFBLight = FBCast<FBLight>(AffectingLights.GetAt(
i)->GetHIObject());
if (lFBLight)
lAffectingLights.Add(lFBLight);
}
mpLightShader->BeginShading(pRenderOptions, &lAffectingLights);
}
void DynamicLighting::ShaderPassInstanceEnd ( FBRenderOptions* pRenderOptions,
FBRenderingPass pPass)
{
mpLightShader->EndShading();
}
void DynamicLighting::ShaderPassMaterialBegin( FBRenderOptions* pRenderOptions,
FBRenderingPass pPass, FBShaderModelInfo* pInfo)
{
mpLightShader->SwitchMaterial(pRenderOptions, pInfo, pInfo->GetFBMaterial(), TransparencyFactor);
}
void DynamicLighting::ShaderPassMaterialEnd ( FBRenderOptions* pRenderOptions,
FBRenderingPass pPass, FBShaderModelInfo* pInfo)
{
}
void DynamicLighting::ShaderPassModelDraw ( FBRenderOptions* pRenderOptions,
FBRenderingPass pPass, FBShaderModelInfo* pInfo)
{
mpLightShader->ShaderPassModelDraw(pRenderOptions, pPass, pInfo);
}
void DynamicLighting::ShaderPassDrawShadowBegin( FBRenderOptions* pRenderOptions)
{
}
void DynamicLighting::ShaderPassDrawShadowEnd( FBRenderOptions* pRenderOptions)
{
}
void DynamicLighting::UploadModelViewMatrixArrayForDrawInstanced(const double* pModelViewMatrixArray, int pCount)
{
mpLightShader->UploadModelViewMatrixArrayForDrawInstanced(pModelViewMatrixArray, pCount);
}
FBShaderModelInfo* DynamicLighting::NewShaderModelInfo(
HKModelRenderInfo pModelRenderInfo,
int pSubRegionIndex)
{
FBShaderModelInfo* lShaderModelInfo = ParentClass::NewShaderModelInfo(pModelRenderInfo, pSubRegionIndex);
return lShaderModelInfo;
}
void DynamicLighting::UpdateModelShaderInfo( FBRenderOptions* pOptions, FBShaderModelInfo* pModelRenderInfo )
{
pModelRenderInfo->UpdateModelShaderInfo(GetShaderVersion());
if (pModelRenderInfo->GetOriginalTextureFlag())
{
FBMaterial* lMaterial = pModelRenderInfo->GetFBMaterial();
if (lMaterial)
{
if (lNormalMapTexture ==
NULL)
if (lNormalMapTexture)
}
}
pModelRenderInfo->SetGeometryArrayIds(lVBOFormat);
}
void DynamicLighting::SetTransparencyType(
FBAlphaSource pTransparency )
{
if (Transparency != pTransparency)
{
Transparency = pTransparency;
InvalidateShaderVersion();
}
}
{
return Transparency;
}
{
DynamicLighting* lShader = FBCast<DynamicLighting>(pObject);
if (lShader->Transparency != pState)
{
lShader->Transparency.SetPropertyValue(pState);
lShader->RenderingPass = GetRenderingPassNeededForAlpha(pState);
}
}