Browse Source

Cleaned and repacked work to update the probe bin and reflection probe behavior to clean and standardize it.

JeffR 3 years ago
parent
commit
79eebdd5f3
24 changed files with 1096 additions and 997 deletions
  1. 2 2
      Engine/source/T3D/lighting/boxEnvironmentProbe.cpp
  2. 24 21
      Engine/source/T3D/lighting/reflectionProbe.cpp
  3. 67 12
      Engine/source/T3D/lighting/reflectionProbe.h
  4. 2 2
      Engine/source/T3D/lighting/skylight.cpp
  5. 2 75
      Engine/source/T3D/lighting/sphereEnvironmentProbe.cpp
  6. 0 4
      Engine/source/T3D/lighting/sphereEnvironmentProbe.h
  7. 0 8
      Engine/source/environment/scatterSky.cpp
  8. 379 427
      Engine/source/renderInstance/renderProbeMgr.cpp
  9. 265 144
      Engine/source/renderInstance/renderProbeMgr.h
  10. 72 75
      Engine/source/shaderGen/GLSL/shaderFeatureGLSL.cpp
  11. 36 34
      Engine/source/shaderGen/HLSL/shaderFeatureHLSL.cpp
  12. 8 6
      Engine/source/shaderGen/shaderGenVars.cpp
  13. 6 4
      Engine/source/shaderGen/shaderGenVars.h
  14. 2 0
      Templates/BaseGame/game/core/postFX/scripts/ReflectionProbes/reflectionProbeArrayPostFX.tscript
  15. 38 44
      Templates/BaseGame/game/core/rendering/shaders/gl/lighting.glsl
  16. 41 45
      Templates/BaseGame/game/core/rendering/shaders/lighting.hlsl
  17. 32 0
      Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/gl/pointLightP.glsl
  18. 23 41
      Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/gl/reflectionProbeArrayP.glsl
  19. 35 0
      Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/gl/spotLightP.glsl
  20. 32 1
      Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/gl/vectorLightP.glsl
  21. 4 5
      Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/pointLightP.hlsl
  22. 22 41
      Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/reflectionProbeArrayP.hlsl
  23. 4 5
      Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/spotLightP.hlsl
  24. 0 1
      Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/vectorLightP.hlsl

+ 2 - 2
Engine/source/T3D/lighting/boxEnvironmentProbe.cpp

@@ -77,7 +77,7 @@ ConsoleDocClass(BoxEnvironmentProbe,
 BoxEnvironmentProbe::BoxEnvironmentProbe() : ReflectionProbe()
 BoxEnvironmentProbe::BoxEnvironmentProbe() : ReflectionProbe()
 {
 {
    mCaptureMask = REFLECTION_PROBE_CAPTURE_TYPEMASK;
    mCaptureMask = REFLECTION_PROBE_CAPTURE_TYPEMASK;
-   mProbeShapeType = ProbeRenderInst::Box;
+   mProbeShapeType = ProbeInfo::Box;
    mAtten = 0.0;
    mAtten = 0.0;
 }
 }
 
 
@@ -158,7 +158,7 @@ void BoxEnvironmentProbe::unpackUpdate(NetConnection *conn, BitStream *stream)
 
 
 void BoxEnvironmentProbe::updateProbeParams()
 void BoxEnvironmentProbe::updateProbeParams()
 {
 {
-   mProbeShapeType = ProbeRenderInst::Box;
+   mProbeShapeType = ProbeInfo::Box;
    mProbeInfo.mAtten = mAtten;
    mProbeInfo.mAtten = mAtten;
 
 
    Parent::updateProbeParams();
    Parent::updateProbeParams();

+ 24 - 21
Engine/source/T3D/lighting/reflectionProbe.cpp

@@ -73,8 +73,8 @@ ConsoleDocClass(ReflectionProbe,
 ImplementEnumType(ReflectProbeType,
 ImplementEnumType(ReflectProbeType,
    "Type of mesh data available in a shape.\n"
    "Type of mesh data available in a shape.\n"
    "@ingroup gameObjects")
    "@ingroup gameObjects")
-{ ProbeRenderInst::Sphere, "Sphere", "Sphere shaped" },
-{ ProbeRenderInst::Box, "Box", "Box shape" }
+{ ReflectionProbe::ProbeInfo::Sphere, "Sphere", "Sphere shaped" },
+{ ReflectionProbe::ProbeInfo::Box, "Box", "Box shape" }
 EndImplementEnumType;
 EndImplementEnumType;
 
 
 ImplementEnumType(ReflectionModeEnum,
 ImplementEnumType(ReflectionModeEnum,
@@ -97,7 +97,7 @@ ReflectionProbe::ReflectionProbe()
 
 
    mTypeMask = LightObjectType | MarkerObjectType;
    mTypeMask = LightObjectType | MarkerObjectType;
 
 
-   mProbeShapeType = ProbeRenderInst::Box;
+   mProbeShapeType = ProbeInfo::Box;
 
 
    mReflectionModeType = BakedCubemap;
    mReflectionModeType = BakedCubemap;
 
 
@@ -121,8 +121,6 @@ ReflectionProbe::ReflectionProbe()
    mRefreshRateMS = 200;
    mRefreshRateMS = 200;
    mDynamicLastBakeMS = 0;
    mDynamicLastBakeMS = 0;
 
 
-   mMaxDrawDistance = 75;
-
    mResourcesCreated = false;
    mResourcesCreated = false;
    mPrefilterSize = 64;
    mPrefilterSize = 64;
    mPrefilterMipLevels = mLog2(F32(mPrefilterSize));
    mPrefilterMipLevels = mLog2(F32(mPrefilterSize));
@@ -239,7 +237,7 @@ bool ReflectionProbe::_setRadius(void *object, const char *index, const char *da
 {
 {
    ReflectionProbe* probe = reinterpret_cast<ReflectionProbe*>(object);
    ReflectionProbe* probe = reinterpret_cast<ReflectionProbe*>(object);
 
 
-   if (probe->mProbeShapeType != ProbeRenderInst::Sphere)
+   if (probe->mProbeShapeType != ProbeInfo::Sphere)
       return false;
       return false;
 
 
    probe->mObjScale = Point3F(probe->mRadius, probe->mRadius, probe->mRadius);
    probe->mObjScale = Point3F(probe->mRadius, probe->mRadius, probe->mRadius);
@@ -291,7 +289,7 @@ bool ReflectionProbe::onAdd()
       if (!mPersistentId)
       if (!mPersistentId)
          mPersistentId = getOrCreatePersistentId();
          mPersistentId = getOrCreatePersistentId();
 
 
-      mProbeUniqueID = String::ToString(mPersistentId->getUUID().getHash());
+      mProbeUniqueID = mPersistentId->getUUID().toString();
    }
    }
 
 
    // Refresh this object's material (if any)
    // Refresh this object's material (if any)
@@ -312,7 +310,7 @@ void ReflectionProbe::onRemove()
 {
 {
    if (isClientObject())
    if (isClientObject())
    {
    {
-      PROBEMGR->unregisterProbe(mProbeInfo.mProbeIdx);
+      PROBEMGR->unregisterProbe(&mProbeInfo);
    }
    }
 
 
    // Remove this object from the scene
    // Remove this object from the scene
@@ -461,10 +459,10 @@ void ReflectionProbe::unpackUpdate(NetConnection *conn, BitStream *stream)
 
 
    if (stream->readFlag())  // StaticDataMask
    if (stream->readFlag())  // StaticDataMask
    {
    {
-      U32 shapeType = ProbeRenderInst::Sphere;
+      U32 shapeType = ProbeInfo::Sphere;
       stream->read(&shapeType);
       stream->read(&shapeType);
 
 
-      mProbeShapeType = (ProbeRenderInst::ProbeShapeType)shapeType;
+      mProbeShapeType = (ProbeInfo::ProbeShapeType)shapeType;
 
 
       stream->read(&mRadius);
       stream->read(&mRadius);
 
 
@@ -497,6 +495,8 @@ void ReflectionProbe::unpackUpdate(NetConnection *conn, BitStream *stream)
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 void ReflectionProbe::updateProbeParams()
 void ReflectionProbe::updateProbeParams()
 {
 {
+   mProbeInfo.mObject = this;
+
    if (!mResourcesCreated)
    if (!mResourcesCreated)
    {
    {
       if (!createClientResources())
       if (!createClientResources())
@@ -507,12 +507,12 @@ void ReflectionProbe::updateProbeParams()
 
 
    mProbeInfo.mProbeShapeType = mProbeShapeType;
    mProbeInfo.mProbeShapeType = mProbeShapeType;
 
 
-   if (mProbeShapeType == ProbeRenderInst::Sphere)
+   if (mProbeShapeType == ProbeInfo::Sphere)
       mObjScale.set(mRadius, mRadius, mRadius);
       mObjScale.set(mRadius, mRadius, mRadius);
 
 
    Box3F bounds;
    Box3F bounds;
 
 
-   if (mProbeShapeType == ProbeRenderInst::Skylight)
+   if (mProbeShapeType == ProbeInfo::Skylight)
    {
    {
       mProbeInfo.mPosition = Point3F::Zero;
       mProbeInfo.mPosition = Point3F::Zero;
       mProbeInfo.mTransform = MatrixF::Identity;
       mProbeInfo.mTransform = MatrixF::Identity;
@@ -564,8 +564,6 @@ void ReflectionProbe::updateProbeParams()
       else
       else
          processDynamicCubemap();
          processDynamicCubemap();
    }
    }
-
-   PROBEMGR->updateProbes();
 }
 }
 
 
 void ReflectionProbe::processDynamicCubemap()
 void ReflectionProbe::processDynamicCubemap()
@@ -575,7 +573,7 @@ void ReflectionProbe::processDynamicCubemap()
 
 
 void ReflectionProbe::processBakedCubemap()
 void ReflectionProbe::processBakedCubemap()
 {
 {
-   mProbeInfo.mIsEnabled = false;
+   //mProbeInfo.mIsEnabled = false;
 
 
    if ((mReflectionModeType != BakedCubemap) || mProbeUniqueID.isEmpty())
    if ((mReflectionModeType != BakedCubemap) || mProbeUniqueID.isEmpty())
       return;
       return;
@@ -611,7 +609,7 @@ void ReflectionProbe::processBakedCubemap()
 
 
    if (mEnabled && mProbeInfo.mPrefilterCubemap->isInitialized() && mProbeInfo.mIrradianceCubemap->isInitialized())
    if (mEnabled && mProbeInfo.mPrefilterCubemap->isInitialized() && mProbeInfo.mIrradianceCubemap->isInitialized())
    {
    {
-      mProbeInfo.mIsEnabled = true;
+      //mProbeInfo.mIsEnabled = true;
 
 
       mCubemapDirty = false;
       mCubemapDirty = false;
 
 
@@ -622,6 +620,11 @@ void ReflectionProbe::processBakedCubemap()
       mProbeInfo.mPrefilterCubemap.free();
       mProbeInfo.mPrefilterCubemap.free();
       mProbeInfo.mIrradianceCubemap.free();
       mProbeInfo.mIrradianceCubemap.free();
    }
    }
+   else
+   {
+      //if we failed, disable
+      mProbeInfo.mIsEnabled = false;
+   }
 }
 }
 
 
 void ReflectionProbe::processStaticCubemap()
 void ReflectionProbe::processStaticCubemap()
@@ -811,16 +814,16 @@ void ReflectionProbe::createEditorResources()
 
 
 void ReflectionProbe::prepRenderImage(SceneRenderState *state)
 void ReflectionProbe::prepRenderImage(SceneRenderState *state)
 {
 {
-   if (!mEnabled || !RenderProbeMgr::smRenderReflectionProbes)
+   if (!mEnabled || (!RenderProbeMgr::smRenderReflectionProbes && Con::getVariable("$Probes::Capturing", "0") == "0"))
       return;
       return;
 
 
    Point3F distVec = getRenderPosition() - state->getCameraPosition();
    Point3F distVec = getRenderPosition() - state->getCameraPosition();
    F32 dist = distVec.len();
    F32 dist = distVec.len();
 
 
    //Culling distance. Can be adjusted for performance options considerations via the scalar
    //Culling distance. Can be adjusted for performance options considerations via the scalar
-   if (dist > mMaxDrawDistance * Con::getFloatVariable("$pref::GI::ProbeDrawDistScale", 1.0))
+   if (dist > RenderProbeMgr::smMaxProbeDrawDistance * Con::getFloatVariable("$pref::GI::ProbeDrawDistScale", 1.0))
    {
    {
-      mProbeInfo.mScore = mMaxDrawDistance;
+      mProbeInfo.mScore = RenderProbeMgr::smMaxProbeDrawDistance;
       return;
       return;
    }
    }
 
 
@@ -842,7 +845,7 @@ void ReflectionProbe::prepRenderImage(SceneRenderState *state)
 
 
    //mProbeInfo.mScore *= mMax(mAbs(mDot(vect, state->getCameraTransform().getForwardVector())),0.001f);
    //mProbeInfo.mScore *= mMax(mAbs(mDot(vect, state->getCameraTransform().getForwardVector())),0.001f);
 
 
-   PROBEMGR->submitProbe(mProbeInfo);
+   PROBEMGR->submitProbe(&mProbeInfo);
 
 
 #ifdef TORQUE_TOOLS
 #ifdef TORQUE_TOOLS
    if (ReflectionProbe::smRenderPreviewProbes && gEditingMission && mPrefilterMap != nullptr)
    if (ReflectionProbe::smRenderPreviewProbes && gEditingMission && mPrefilterMap != nullptr)
@@ -938,7 +941,7 @@ void ReflectionProbe::_onRenderViz(ObjectRenderInst *ri,
    ColorI color = ColorI(255, 0, 255, 63);
    ColorI color = ColorI(255, 0, 255, 63);
 
 
    const MatrixF worldToObjectXfm = mObjToWorld;
    const MatrixF worldToObjectXfm = mObjToWorld;
-   if (mProbeShapeType == ProbeRenderInst::Sphere)
+   if (mProbeShapeType == ProbeInfo::Sphere)
    {
    {
       draw->drawSphere(desc, mRadius, getPosition(), color);
       draw->drawSphere(desc, mRadius, getPosition(), color);
    }
    }

+ 67 - 12
Engine/source/T3D/lighting/reflectionProbe.h

@@ -41,10 +41,6 @@
 #include "renderInstance/renderPassManager.h"
 #include "renderInstance/renderPassManager.h"
 #endif
 #endif
 
 
-#ifndef RENDER_PROBE_MGR_H
-#include "renderInstance/renderProbeMgr.h"
-#endif
-
 class BaseMatInstance;
 class BaseMatInstance;
 
 
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
@@ -74,6 +70,67 @@ public:
       DynamicCubemap = 5,
       DynamicCubemap = 5,
    };
    };
 
 
+   /// <summary>
+   /// This contains all the important data the Probe uses for rendering.
+   /// </summary>
+   struct ProbeInfo
+   {
+      bool mIsEnabled;
+
+      MatrixF mTransform;
+
+      ReflectionProbe* mObject;
+
+      F32 mRadius;
+
+      bool mDirty;
+
+      Box3F mBounds;
+      Point3F mExtents;
+      Point3F mPosition;
+      Point3F mProbeRefOffset;
+      Point3F mProbeRefScale;
+      F32 mAtten;
+
+      F32 mScore;
+
+      GFXCubemapHandle mPrefilterCubemap;
+      GFXCubemapHandle mIrradianceCubemap;
+
+      /// The priority of this light used for
+      /// light and shadow scoring.
+      F32 mPriority;
+
+      enum ProbeShapeType
+      {
+         Box = 0,            
+         Sphere = 1,               
+         Skylight = 2
+      };
+
+      ProbeShapeType mProbeShapeType;
+
+   public:
+
+      ProbeInfo() : mScore(0) {}
+      ~ProbeInfo() {}
+
+      // Copies data passed in from light
+      void set(const ProbeInfo* probeInfo);
+
+      // Accessors
+      const MatrixF& getTransform() const { return mTransform; }
+      void setTransform(const MatrixF& xfm) { mTransform = xfm; }
+
+      Point3F getPosition() const { return mPosition; }
+      void setPosition(const Point3F& pos) { mPosition = pos; }
+
+      void setPriority(F32 priority) { mPriority = priority; }
+      F32 getPriority() const { return mPriority; }
+
+      void clear();
+   };
+
 protected:
 protected:
 
 
    // Networking masks
    // Networking masks
@@ -124,7 +181,7 @@ protected:
    /// <summary>
    /// <summary>
    /// The shape of the probe
    /// The shape of the probe
    /// </summary>
    /// </summary>
-   ProbeRenderInst::ProbeShapeType mProbeShapeType;
+   ProbeInfo::ProbeShapeType mProbeShapeType;
 
 
    /// <summary>
    /// <summary>
    /// This is effectively a packed cache of the probe data actually utilized for rendering.
    /// This is effectively a packed cache of the probe data actually utilized for rendering.
@@ -132,7 +189,7 @@ protected:
    /// When the manager goes to render it has the compacted data to read over more efficiently for setting up what probes should
    /// When the manager goes to render it has the compacted data to read over more efficiently for setting up what probes should
    /// Actually render in that frame
    /// Actually render in that frame
    /// </summary>
    /// </summary>
-   ProbeRenderInst mProbeInfo;
+   ProbeInfo mProbeInfo;
 
 
    /// <summary>
    /// <summary>
    /// Used to dictate what sort of cubemap the probes use when using IBL
    /// Used to dictate what sort of cubemap the probes use when using IBL
@@ -166,14 +223,13 @@ protected:
    CubemapData *mStaticCubemap;
    CubemapData *mStaticCubemap;
    GFXCubemapHandle  mDynamicCubemap;
    GFXCubemapHandle  mDynamicCubemap;
 
 
-   String cubeDescName;
-   U32 cubeDescId;
-   ReflectorDesc *reflectorDesc;
+   //String cubeDescName;
+   //U32 cubeDescId;
+   //ReflectorDesc *reflectorDesc;
 
 
    //Utilized in dynamic reflections
    //Utilized in dynamic reflections
    //CubeReflector mCubeReflector;
    //CubeReflector mCubeReflector;
 
 
-   ///Prevents us from saving out the cubemaps(for now) but allows us the full HDR range on the in-memory cubemap captures
    bool mUseHDRCaptures;
    bool mUseHDRCaptures;
 
 
    //irridiance resources
    //irridiance resources
@@ -196,7 +252,6 @@ protected:
    U32 mDynamicLastBakeMS;
    U32 mDynamicLastBakeMS;
    U32 mRefreshRateMS;
    U32 mRefreshRateMS;
 
 
-   F32 mMaxDrawDistance;
 
 
    bool mResourcesCreated;
    bool mResourcesCreated;
    U32 mCaptureMask;
    U32 mCaptureMask;
@@ -313,7 +368,7 @@ public:
    void bake();
    void bake();
 };
 };
 
 
-typedef ProbeRenderInst::ProbeShapeType ReflectProbeType;
+typedef ReflectionProbe::ProbeInfo::ProbeShapeType ReflectProbeType;
 DefineEnumType(ReflectProbeType);
 DefineEnumType(ReflectProbeType);
 
 
 typedef ReflectionProbe::ReflectionModeType ReflectionModeEnum;
 typedef ReflectionProbe::ReflectionModeType ReflectionModeEnum;

+ 2 - 2
Engine/source/T3D/lighting/skylight.cpp

@@ -148,7 +148,7 @@ void Skylight::unpackUpdate(NetConnection *conn, BitStream *stream)
 
 
 void Skylight::updateProbeParams()
 void Skylight::updateProbeParams()
 {
 {
-   mProbeShapeType = ProbeRenderInst::Skylight;
+   mProbeShapeType = ProbeInfo::Skylight;
    Parent::updateProbeParams();
    Parent::updateProbeParams();
 }
 }
 
 
@@ -167,7 +167,7 @@ void Skylight::prepRenderImage(SceneRenderState *state)
    // Get a handy pointer to our RenderPassmanager
    // Get a handy pointer to our RenderPassmanager
    //RenderPassManager *renderPass = state->getRenderPass();
    //RenderPassManager *renderPass = state->getRenderPass();
 
 
-   PROBEMGR->submitProbe(mProbeInfo);
+   PROBEMGR->submitProbe(&mProbeInfo);
 
 
 #ifdef TORQUE_TOOLS
 #ifdef TORQUE_TOOLS
    if (Skylight::smRenderPreviewProbes && gEditingMission && mEditorShapeInst && mPrefilterMap != nullptr)
    if (Skylight::smRenderPreviewProbes && gEditingMission && mEditorShapeInst && mPrefilterMap != nullptr)

+ 2 - 75
Engine/source/T3D/lighting/sphereEnvironmentProbe.cpp

@@ -77,7 +77,7 @@ ConsoleDocClass(SphereEnvironmentProbe,
 SphereEnvironmentProbe::SphereEnvironmentProbe() : ReflectionProbe()
 SphereEnvironmentProbe::SphereEnvironmentProbe() : ReflectionProbe()
 {
 {
    mCaptureMask = REFLECTION_PROBE_CAPTURE_TYPEMASK;
    mCaptureMask = REFLECTION_PROBE_CAPTURE_TYPEMASK;
-   mProbeShapeType = ProbeRenderInst::Sphere;
+   mProbeShapeType = ProbeInfo::Sphere;
 }
 }
 
 
 SphereEnvironmentProbe::~SphereEnvironmentProbe()
 SphereEnvironmentProbe::~SphereEnvironmentProbe()
@@ -144,83 +144,10 @@ void SphereEnvironmentProbe::unpackUpdate(NetConnection *conn, BitStream *stream
 
 
 void SphereEnvironmentProbe::updateProbeParams()
 void SphereEnvironmentProbe::updateProbeParams()
 {
 {
-   mProbeShapeType = ProbeRenderInst::Sphere;
+   mProbeShapeType = ProbeInfo::Sphere;
    Parent::updateProbeParams();
    Parent::updateProbeParams();
 }
 }
 
 
-void SphereEnvironmentProbe::prepRenderImage(SceneRenderState *state)
-{
-   if (!mEnabled || !ReflectionProbe::smRenderPreviewProbes)
-      return;
-
-#ifdef TORQUE_TOOLS
-   if (ReflectionProbe::smRenderPreviewProbes && gEditingMission && mEditorShapeInst && mPrefilterMap != nullptr)
-   {
-      GFXTransformSaver saver;
-
-      // Calculate the distance of this object from the camera
-      Point3F cameraOffset;
-      getRenderTransform().getColumn(3, &cameraOffset);
-      cameraOffset -= state->getDiffuseCameraPosition();
-      F32 dist = cameraOffset.len();
-      if (dist < 0.01f)
-         dist = 0.01f;
-
-      // Set up the LOD for the shape
-      F32 invScale = (1.0f / getMax(getMax(mObjScale.x, mObjScale.y), mObjScale.z));
-
-      mEditorShapeInst->setDetailFromDistance(state, dist * invScale);
-
-      // Make sure we have a valid level of detail
-      if (mEditorShapeInst->getCurrentDetail() < 0)
-         return;
-
-      BaseMatInstance* probePrevMat = mEditorShapeInst->getMaterialList()->getMaterialInst(0);
-
-      setPreviewMatParameters(state, probePrevMat);
-
-      // GFXTransformSaver is a handy helper class that restores
-      // the current GFX matrices to their original values when
-      // it goes out of scope at the end of the function
-
-      // Set up our TS render state      
-      TSRenderState rdata;
-      rdata.setSceneState(state);
-      rdata.setFadeOverride(1.0f);
-
-      // We might have some forward lit materials
-      // so pass down a query to gather lights.
-      LightQuery query;
-      query.init(getWorldSphere());
-      rdata.setLightQuery(&query);
-
-      // Set the world matrix to the objects render transform
-      MatrixF mat = getRenderTransform();
-      mat.scale(Point3F(1, 1, 1));
-      GFX->setWorldMatrix(mat);
-
-      // Animate the the shape
-      mEditorShapeInst->animate();
-
-      // Allow the shape to submit the RenderInst(s) for itself
-      mEditorShapeInst->render(rdata);
-
-      saver.restore();
-   }
-
-   // If the light is selected or light visualization
-   // is enabled then register the callback.
-   const bool isSelectedInEditor = (gEditingMission && isSelected());
-   if (isSelectedInEditor)
-   {
-      ObjectRenderInst *ri = state->getRenderPass()->allocInst<ObjectRenderInst>();
-      ri->renderDelegate.bind(this, &ReflectionProbe::_onRenderViz);
-      ri->type = RenderPassManager::RIT_Editor;
-      state->getRenderPass()->addInst(ri);
-   }
-#endif
-}
-
 void SphereEnvironmentProbe::setPreviewMatParameters(SceneRenderState* renderState, BaseMatInstance* mat)
 void SphereEnvironmentProbe::setPreviewMatParameters(SceneRenderState* renderState, BaseMatInstance* mat)
 {
 {
    Parent::setPreviewMatParameters(renderState, mat);
    Parent::setPreviewMatParameters(renderState, mat);

+ 0 - 4
Engine/source/T3D/lighting/sphereEnvironmentProbe.h

@@ -98,10 +98,6 @@ public:
    // use the same Materials.
    // use the same Materials.
    //--------------------------------------------------------------------------
    //--------------------------------------------------------------------------
    virtual void updateProbeParams();
    virtual void updateProbeParams();
-
-   // This is the function that allows this object to submit itself for rendering
-   void prepRenderImage(SceneRenderState *state);
-
    void setPreviewMatParameters(SceneRenderState* renderState, BaseMatInstance* mat);
    void setPreviewMatParameters(SceneRenderState* renderState, BaseMatInstance* mat);
 };
 };
 
 

+ 0 - 8
Engine/source/environment/scatterSky.cpp

@@ -970,14 +970,6 @@ void ScatterSky::_render( ObjectRenderInst *ri, SceneRenderState *state, BaseMat
    xform *= GFX->getViewMatrix();
    xform *= GFX->getViewMatrix();
    xform *=  GFX->getWorldMatrix();
    xform *=  GFX->getWorldMatrix();
 
 
-   if(state->isReflectPass())
-   {
-      static MatrixF rotMat(EulerF(0.0, 0.0, M_PI_F));
-      xform.mul(rotMat);
-      rotMat.set(EulerF(M_PI_F, 0.0, 0.0));
-      xform.mul(rotMat);
-   }
-
    mShaderConsts->setSafe( mModelViewProjSC, xform );
    mShaderConsts->setSafe( mModelViewProjSC, xform );
    mShaderConsts->setSafe( mMiscSC, miscParams );
    mShaderConsts->setSafe( mMiscSC, miscParams );
    mShaderConsts->setSafe( mSphereRadiiSC, sphereRadii );
    mShaderConsts->setSafe( mSphereRadiiSC, sphereRadii );

File diff suppressed because it is too large
+ 379 - 427
Engine/source/renderInstance/renderProbeMgr.cpp


+ 265 - 144
Engine/source/renderInstance/renderProbeMgr.h

@@ -39,7 +39,7 @@
 #include "gfx/gfxVertexBuffer.h"
 #include "gfx/gfxVertexBuffer.h"
 #endif
 #endif
 
 
-#include "core/util/systemInterfaceList.h"
+//#include "core/util/systemInterfaceList.h"
 
 
 #ifndef _MATERIALS_PROCESSEDSHADERMATERIAL_H_
 #ifndef _MATERIALS_PROCESSEDSHADERMATERIAL_H_
 #include "materials/processedShaderMaterial.h"
 #include "materials/processedShaderMaterial.h"
@@ -52,52 +52,23 @@
 #include "scene/reflector.h"
 #include "scene/reflector.h"
 #endif
 #endif
 
 
-static U32 MAXPROBECOUNT = 50;
+#ifndef REFLECTIONPROBE_H
+#include "T3D/lighting/reflectionProbe.h"
+#endif
 
 
 class PostEffect;
 class PostEffect;
 class ReflectionProbe;
 class ReflectionProbe;
 
 
+/// <summary>
+/// A simple container for a ReflectionProbe's ProbeInfo and index for it's associated
+/// cubemaps in the cubemap array pair
+/// </summary>
 struct ProbeRenderInst
 struct ProbeRenderInst
 {
 {
-   bool mIsEnabled;
-
-   MatrixF mTransform;
-
-   F32 mRadius;
-
-   bool mDirty;
-
-   Box3F mBounds;
-   Point3F mExtents;
-   Point3F mPosition;
-   Point3F mProbeRefOffset;
-   Point3F mProbeRefScale;
-   F32 mAtten;
-
-   GFXCubemapHandle mPrefilterCubemap;
-   GFXCubemapHandle mIrradianceCubemap;
-
-   /// The priority of this light used for
-   /// light and shadow scoring.
-   F32 mPriority;
-
-   /// A temporary which holds the score used
-   /// when prioritizing lights for rendering.
-   F32 mScore;
-
-   enum ProbeShapeType
-   {
-      Box = 0,            ///< Sphere shaped
-      Sphere = 1,               ///< Box-based shape
-      Skylight = 2
-   };
-
-   ProbeShapeType mProbeShapeType;
+   ReflectionProbe::ProbeInfo* mProbeInfo;
 
 
    U32 mCubemapIndex;
    U32 mCubemapIndex;
 
 
-   U32 mProbeIdx;
-
 public:
 public:
 
 
    ProbeRenderInst();
    ProbeRenderInst();
@@ -105,28 +76,11 @@ public:
 
 
    // Copies data passed in from light
    // Copies data passed in from light
    void set(const ProbeRenderInst *probeInfo);
    void set(const ProbeRenderInst *probeInfo);
-
-   // Accessors
-   const MatrixF& getTransform() const { return mTransform; }
-   void setTransform(const MatrixF &xfm) { mTransform = xfm; }
-
-   Point3F getPosition() const { return mPosition; }
-   void setPosition(const Point3F &pos) { mPosition = pos; }
-
-   void setPriority(F32 priority) { mPriority = priority; }
-   F32 getPriority() const { return mPriority; }
-
-   void setScore(F32 score) { mScore = score; }
-   F32 getScore() const { return mScore; }
-
-   void clear();
-
-   inline bool operator ==(const ProbeRenderInst& b) const
-   {
-      return mProbeIdx == b.mProbeIdx;
-   }
 };
 };
 
 
+/// <summary>
+/// A container for all the shader consts needed for rendering probes in forward mode
+/// </summary>
 struct ProbeShaderConstants
 struct ProbeShaderConstants
 {
 {
    bool mInit;
    bool mInit;
@@ -134,19 +88,21 @@ struct ProbeShaderConstants
    GFXShaderRef mShader;
    GFXShaderRef mShader;
    
    
    //Reflection Probes
    //Reflection Probes
-   GFXShaderConstHandle *mProbePositionSC;
-   GFXShaderConstHandle *mProbeRefPosSC;
-   GFXShaderConstHandle *mRefScaleSC;
+   GFXShaderConstHandle *mProbePositionArraySC;
+   GFXShaderConstHandle *mProbeRefPosArraySC;
+   GFXShaderConstHandle *mRefScaleArraySC;
    GFXShaderConstHandle *mWorldToObjArraySC;
    GFXShaderConstHandle *mWorldToObjArraySC;
-   GFXShaderConstHandle *mProbeConfigDataSC;
-   GFXShaderConstHandle *mProbeSpecularCubemapSC;
-   GFXShaderConstHandle *mProbeIrradianceCubemapSC;
+   GFXShaderConstHandle *mProbeConfigDataArraySC;
+   GFXShaderConstHandle *mProbeSpecularCubemapArraySC;
+   GFXShaderConstHandle *mProbeIrradianceCubemapArraySC;
    GFXShaderConstHandle *mProbeCountSC;
    GFXShaderConstHandle *mProbeCountSC;
 
 
    GFXShaderConstHandle *mBRDFTextureMap;
    GFXShaderConstHandle *mBRDFTextureMap;
 
 
    GFXShaderConstHandle *mSkylightCubemapIdxSC;
    GFXShaderConstHandle *mSkylightCubemapIdxSC;
 
 
+   GFXShaderConstHandle* mMaxProbeDrawDistanceSC;
+
    ProbeShaderConstants();
    ProbeShaderConstants();
    ~ProbeShaderConstants();
    ~ProbeShaderConstants();
 
 
@@ -159,6 +115,10 @@ struct ProbeShaderConstants
 
 
 typedef Map<GFXShader*, ProbeShaderConstants*> ProbeConstantMap;
 typedef Map<GFXShader*, ProbeShaderConstants*> ProbeConstantMap;
 
 
+/// <summary>
+/// A container for processed and packed probe data. This is made when we get the frame's
+/// best probes, and is passed to the shader for actual rendering.
+/// </summary>
 struct ProbeDataSet
 struct ProbeDataSet
 {
 {
    Vector<Point4F> probePositionArray;
    Vector<Point4F> probePositionArray;
@@ -198,18 +158,10 @@ struct ProbeDataSet
 
 
       probeWorldToObjArray.setSize(maxProbeCount);
       probeWorldToObjArray.setSize(maxProbeCount);
 
 
-      skyLightIdx = -1;
       effectiveProbeCount = 0;
       effectiveProbeCount = 0;
    }
    }
 };
 };
 
 
-struct ProbeTextureArrayData
-{
-   GFXTexHandle BRDFTexture;
-   GFXCubemapArrayHandle prefilterArray;
-   GFXCubemapArrayHandle irradianceArray;
-};
-
 //**************************************************************************
 //**************************************************************************
 // RenderObjectMgr
 // RenderObjectMgr
 //**************************************************************************
 //**************************************************************************
@@ -217,11 +169,6 @@ class RenderProbeMgr : public RenderBinManager
 {
 {
    typedef RenderBinManager Parent;
    typedef RenderBinManager Parent;
 
 
-   Vector<ProbeRenderInst*> mRegisteredProbes;
-
-   bool mProbesDirty;
-   
-   Vector<ProbeRenderInst>  mActiveProbes;
 public:
 public:
    //maximum number of allowed probes
    //maximum number of allowed probes
    static const U32 PROBE_MAX_COUNT = 250;
    static const U32 PROBE_MAX_COUNT = 250;
@@ -230,51 +177,161 @@ public:
    //number of slots to allocate at once in the cubemap array
    //number of slots to allocate at once in the cubemap array
    static const U32 PROBE_ARRAY_SLOT_BUFFER_SIZE = 10;
    static const U32 PROBE_ARRAY_SLOT_BUFFER_SIZE = 10;
 
 
-   static const U32 PROBE_IRRAD_SIZE = 64;
-   static const U32 PROBE_PREFILTER_SIZE = 64;
+   //These dictate the default resolution size for the probe arrays
    static const GFXFormat PROBE_FORMAT = GFXFormatR16G16B16A16F;// GFXFormatR8G8B8A8;// when hdr fixed GFXFormatR16G16B16A16F; look into bc6h compression
    static const GFXFormat PROBE_FORMAT = GFXFormatR16G16B16A16F;// GFXFormatR8G8B8A8;// when hdr fixed GFXFormatR16G16B16A16F; look into bc6h compression
    static const U32 INVALID_CUBE_SLOT = U32_MAX;
    static const U32 INVALID_CUBE_SLOT = U32_MAX;
 
 
    static F32 smMaxProbeDrawDistance;
    static F32 smMaxProbeDrawDistance;
    static S32 smMaxProbesPerFrame;
    static S32 smMaxProbesPerFrame;
-
+   static S32 smProbeBakeResolution;
+   SceneRenderState *mState;
 private:
 private:
-   //Array rendering
-   U32 mEffectiveProbeCount;
-   S32 mMipCount;
-
+   /// <summary>
+   /// List of registered probes. These are not necessarily rendered in a given frame
+   /// but the Probe Manager is aware of them and they have cubemap array slots allocated
+   /// </summary>
+   Vector<ProbeRenderInst>    mRegisteredProbes;
+
+   /// <summary>
+   /// List of active probes. These are ones that are not only registered, but submitted by the probe itself as
+   /// ready to be rendered. Likely to be rendered in the current frame, settings-dependent.
+   /// </summary>
+   Vector<ProbeRenderInst>    mActiveProbes;
+
+   /// <summary>
+   /// The PostEffect used to actually rendered the probes into the frame when in deferred mode
+   /// </summary>
+   SimObjectPtr<PostEffect>   mProbeArrayEffect;
+
+   /// <summary>
+   /// Do we have a active skylight probe
+   /// </summary>
    bool            mHasSkylight;
    bool            mHasSkylight;
+
+   /// <summary>
+   /// If we have a skylight, what's the array pair index for it?
+   /// </summary>
    S32             mSkylightCubemapIdx;
    S32             mSkylightCubemapIdx;
 
 
-   //number of cubemaps
+   /// <summary>
+   /// The 'effective' probe count. This tracks the number of probes that are actually going to be rendered
+   /// </summary>
+   U32                        mEffectiveProbeCount;
+   //
+   //Array rendering
+
+   /// <summary>
+   /// The number of mips the cubemap array has. Mips are used in the PBR calcs for handling roughness
+   /// </summary>
+   S32                        mMipCount;
+
+   /// <summary>
+   /// The number of cubemaps registered in our array pair
+   /// </summary>
    U32 mCubeMapCount;
    U32 mCubeMapCount;
-   //number of cubemap slots allocated
+
+   /// <summary>
+   /// The number of allocated slots for the array pair. Rather than adding slots one at a time to the arrays
+   /// We allocate in chunks so we don't have to resize/rebuild the arrays as often
+   /// </summary>
    U32 mCubeSlotCount;
    U32 mCubeSlotCount;
-   //array of cubemap slots, due to the editor these may be mixed around as probes are added and deleted
+
+   /// <summary>
+   /// List indicating if a given allocated slot is actually in use.
+   /// Due to the editor these may be mixed around as probes are added and deleted
+   /// </summary>
+   /// <returns></returns>
    bool mCubeMapSlots[PROBE_MAX_COUNT];
    bool mCubeMapSlots[PROBE_MAX_COUNT];
 
 
+   /// <summary>
+   /// The prefilter cubemap array
+   /// </summary>
    GFXCubemapArrayHandle mPrefilterArray;
    GFXCubemapArrayHandle mPrefilterArray;
+
+   /// <summary>
+   /// The irradiance cubemap array
+   /// </summary>
    GFXCubemapArrayHandle mIrradianceArray;
    GFXCubemapArrayHandle mIrradianceArray;
 
 
    //Utilized in forward rendering
    //Utilized in forward rendering
+
+   /// <summary>
+   /// This is used to look up already-made ProbeShaderConsts for a given shader
+   /// This allows us to avoid having to rebuild the consts each frame if it's a shader
+   /// we've already handled before.
+   /// </summary>
    ProbeConstantMap mConstantLookup;
    ProbeConstantMap mConstantLookup;
-   GFXShaderRef mLastShader;
-   ProbeShaderConstants* mLastConstants;
 
 
-   //
-   SimObjectPtr<PostEffect> mProbeArrayEffect;
+   /// <summary>
+   /// The last shader we rendered(in forward mode). With this, we can shortcut the constant
+   /// lookup if the shader being processed and the last one are the same.
+   /// </summary>
+   GFXShaderRef mLastShader;
 
 
-   //Default skylight, used for shape editors, etc
-   ProbeRenderInst* mDefaultSkyLight;
+   /// <summary>
+   /// THe previous shader constants. When used in conjunction with the mLastShader, we can skip
+   /// having to do a lookup to find an existing ProbeShaderConstants, saving overhead on batched
+   /// rendering
+   /// </summary>
+   ProbeShaderConstants* mLastConstants;
 
 
+   /// <summary>
+   /// The BRDF texture used in PBR math calculations
+   /// </summary>
    GFXTexHandle mBRDFTexture;
    GFXTexHandle mBRDFTexture;
 
 
+   /// <summary>
+   /// Processed best probe selection list of the current frame when rendering in deferred mode.
+   /// </summary>
    ProbeDataSet mProbeData;
    ProbeDataSet mProbeData;
-   ///Prevents us from saving out the cubemaps(for now) but allows us the full HDR range on the in-memory cubemap captures
+
+   /// <summary>
+   /// Allows us the full HDR range on the in-memory cubemap captures
+   /// </summary>
    bool mUseHDRCaptures;
    bool mUseHDRCaptures;
 
 
-   U32 mPrefilterMipLevels;
-   U32 mPrefilterSize;
+protected:
+   /// The current active light manager.
+   static RenderProbeMgr* smProbeManager;
+
+   //=============================================================================
+   // Internal Management/Utility Functions
+   //=============================================================================
+
+   /// <summary>
+   /// Simple utility function that finds the next free cubemap slot for the cubemap array
+   /// </summary>
+   /// <returns>U32 index of next available slot</returns>
+   U32 _findNextEmptyCubeSlot()
+   {
+      for (U32 i = 0; i < PROBE_MAX_COUNT; i++)
+      {
+         if (!mCubeMapSlots[i])
+            return i;
+      }
+      return INVALID_CUBE_SLOT;
+   }
+
+   /// <summary>
+   /// Utility function to quickly find a ProbeRenderInst in association to a
+   /// ReflectionProbe's ProbeInfo
+   /// </summary>
+   /// <param name="probeInfo"></param>
+   /// <returns>Associated ProbeRederInst to param's probeInfo. Null if no matches found</returns>
+   ProbeRenderInst* findProbeInst(ReflectionProbe::ProbeInfo* probeInfo)
+   {
+      for (U32 i = 0; i < mRegisteredProbes.size(); i++)
+      {
+         auto asd = mRegisteredProbes[i];
+         if (mRegisteredProbes[i].mProbeInfo == probeInfo)
+         {
+            return &mRegisteredProbes[i];
+         }
+      }
+
+      return nullptr;
+   }
+
 public:
 public:
    RenderProbeMgr();
    RenderProbeMgr();
    RenderProbeMgr(RenderInstType riType, F32 renderOrder, F32 processAddOrder);
    RenderProbeMgr(RenderInstType riType, F32 renderOrder, F32 processAddOrder);
@@ -286,75 +343,139 @@ public:
    static void initPersistFields();
    static void initPersistFields();
    static void consoleInit();
    static void consoleInit();
 
 
+   virtual void addElement(RenderInst* inst) {};
    DECLARE_CONOBJECT(RenderProbeMgr);
    DECLARE_CONOBJECT(RenderProbeMgr);
 
 
-protected:
-   /// The current active light manager.
-   static RenderProbeMgr *smProbeManager;
+   /// <summary>
+   /// Static flag used to indicate if probes should be rendered at all. Used for debugging
+   /// </summary>
+   static bool smRenderReflectionProbes;
 
 
-   /// This helper function sets the shader constansts
-   /// for the stock 4 light forward lighting code.
-   void _update4ProbeConsts(const SceneData &sgData,
-      MatrixSet &matSet,
-      ProbeShaderConstants *probeShaderConsts,
-      GFXShaderConstBuffer *shaderConsts);
+   //=============================================================================
+   // Utility functions for processing and setting up the probes for rendering
+   //=============================================================================
 
 
-   void _setupStaticParameters();
-   void _setupPerFrameParameters(const SceneRenderState *state);
-   virtual void addElement(RenderInst* inst) {};
-   virtual void render(SceneRenderState * state);
+   /// <summary>
+   /// Sorts probes based on their score values. These scores are calculated by the probes themselves based on size, distance from camera, etc
+   /// </summary>
+   static S32 QSORT_CALLBACK _probeScoreCmp(const ProbeRenderInst* a, const  ProbeRenderInst* b);
 
 
-   ProbeShaderConstants* getProbeShaderConstants(GFXShaderConstBuffer* buffer);
+   /// <summary>
+   /// Builds a dataset of the best probes to be rendered this frame.
+   /// </summary>
+   /// <param name="objPosition"></param>
+   /// <param name="probeDataSet"></param>
 
 
+   void getBestProbes(const Point3F& objPosition, ProbeDataSet* probeDataSet);
+
+   /// <summary>
+   /// This function adds a ReflectionProbe to the registered list and also allocates
+   /// a slot in the cubemap array pair for its use
+   /// </summary>
+   /// <param name="probeInfo">The probe info to be registered to the bin</param>
+   void registerProbe(ReflectionProbe::ProbeInfo* probeInfo);
+
+   /// <summary>
+   /// This function removes the ReflectionProbe from the registered list, and marks it's cubemap
+   /// array slots as unused, allowing them to be freed.
+   /// </summary>
+   /// <param name="probeInfo">The probe info to be un-registered to the bin</param>
+   void unregisterProbe(ReflectionProbe::ProbeInfo* probeInfo);
+
+   /// <summary>
+   /// This function is for registering a ReflectionProbe's probe info
+   /// as being rendered in the current frame. This is distinct from
+   /// registered probes in that registered probes are any 'real' probe
+   /// in the scene, but they may not necessarily render
+   /// Active(submmitted) probes are intended to actual be rendered this frame
+   /// </summary>
+   /// <param name="probe">The ProbeInfo being submitted to be rendered</param>
+   void submitProbe(ReflectionProbe::ProbeInfo* probe);
+
+   /// <summary>
+   /// Gets the PostEffect used by the bin for rendering the probe array in deferred
+   /// </summary>
+   /// <returns>the PostEffect object</returns>
    PostEffect* getProbeArrayEffect();
    PostEffect* getProbeArrayEffect();
 
 
+   /// <summary>
+   /// Finds the associated cubemap array slot for the incoming ProbeInfo and updates the array's texture(s) from it
+   /// </summary>
+   /// <param name="probeInfo"></param>
+   void updateProbeTexture(ReflectionProbe::ProbeInfo* probeInfo);
 
 
-   U32 _findNextEmptyCubeSlot()
-   {
-      for (U32 i = 0; i < PROBE_MAX_COUNT; i++)
-      {
-         if (!mCubeMapSlots[i])
-            return i;
-      }
-      return INVALID_CUBE_SLOT;
-   }
+   /// <summary>
+   /// Forces an update for all registered probes' cubemaps
+   /// </summary>
+   void reloadTextures();
 
 
-public:
-   // RenderBinMgr
-   void updateProbes();
+   /// <summary>
+   /// Takes a reflection probe and runs the cubemap bake process on it, outputting the resulting files to disk
+   /// </summary>
+   void bakeProbe(ReflectionProbe* probe);
 
 
-   /// Returns the active LM.
+   /// <summary>
+   /// Runs the cubemap bake on all probes in the current scene
+   /// </summary>
+   void bakeProbes();
+
+   /// <summary>
+   /// Returns the active Probe Manager.
+   /// </summary>
    static inline RenderProbeMgr* getProbeManager();
    static inline RenderProbeMgr* getProbeManager();
 
 
-   void registerProbe(ProbeRenderInst* newProbe);
-   void unregisterProbe(U32 probeIdx);
-   void submitProbe(const ProbeRenderInst& newProbe);
+   //=============================================================================
+   // Forward Rendering functions
+   //=============================================================================
 
 
-   static S32 QSORT_CALLBACK _probeScoreCmp(const ProbeRenderInst* a, const  ProbeRenderInst* b);
+   /// <summary>
+   /// This function returns or builds a ProbeShaderConsts containing needed data for
+   /// rendering probes in forward mode
+   /// </summary>
+   /// <param name="buffer">The GFXShaderConstBuffer used to build or fetch the Probe Consts</param>
+   ProbeShaderConstants* getProbeShaderConstants(GFXShaderConstBuffer* buffer);
 
 
-   virtual void setProbeInfo(ProcessedMaterial *pmat,
-	   const Material *mat,
-	   const SceneData &sgData,
-	   const SceneRenderState *state,
+   /// <summary>
+   /// Sets up the probe data required for doing a render in forward mode.
+   /// </summary>
+   virtual void setProbeInfo(ProcessedMaterial* pmat,
+      const Material* mat,
+      const SceneData& sgData,
+      const SceneRenderState* state,
 	   U32 pass,
 	   U32 pass,
-	   GFXShaderConstBuffer *shaderConsts);
+      GFXShaderConstBuffer* shaderConsts);
 
 
+   /// <summary>
+   /// Invoked as part of the setup in preperation to render an object in forward mode. Used to ensure the probes are
+   /// sorted ahead of render.
+   /// </summary>
+   /// <param name="state"></param>
    void setupSGData(SceneData& data, const SceneRenderState* state, LightInfo* light);
    void setupSGData(SceneData& data, const SceneRenderState* state, LightInfo* light);
    
    
-   void updateProbeTexture(ProbeRenderInst* probeInfo);
-
-   void reloadTextures();
-
-   /// Debug rendering
-   static bool smRenderReflectionProbes;
+   /// <summary>
+   /// Sets up and binds all the shader const data required for rendering probes/IBL for a forward-rendered material.
+   /// </summary>
+   /// <returns></returns>
+   void _update4ProbeConsts(const SceneData& sgData,
+      MatrixSet& matSet,
+      ProbeShaderConstants* probeShaderConsts,
+      GFXShaderConstBuffer* shaderConsts);
+
+   //=============================================================================
+   // Deferred Rendering Functions
+   //=============================================================================
+
+   /// <summary>
+   /// Ensures the probes are properly sorted before we render them in deferred mode
+   /// </summary>
+   void _setupPerFrameParameters(const SceneRenderState *state);
 
 
-   void bakeProbe(ReflectionProbe *probeInfo);
-   void bakeProbes();
+   /// <summary>
+   /// Renders the sorted probes list via a PostEffect to draw them into the buffer data in deferred mode.
+   /// </summary>
+   virtual void render(SceneRenderState * state);
 
 
-   void getProbeTextureData(ProbeTextureArrayData* probeTextureSet);
-   S32 getSkylightIndex() { return mSkylightCubemapIdx; }
-   //accumulates the best fit of probes given the object position
-   void getBestProbes(const Point3F& objPosition, ProbeDataSet* probeDataSet);
+   virtual void clear() { mActiveProbes.clear(); Parent::clear(); }
 };
 };
 
 
 RenderProbeMgr* RenderProbeMgr::getProbeManager()
 RenderProbeMgr* RenderProbeMgr::getProbeManager()

+ 72 - 75
Engine/source/shaderGen/GLSL/shaderFeatureGLSL.cpp

@@ -758,7 +758,7 @@ Var* ShaderFeatureGLSL::getWsView( Var *wsPosition, MultiLine *meta )
          eyePos->constSortPos = cspPass;
          eyePos->constSortPos = cspPass;
       }
       }
 		
 		
-      meta->addStatement( new GenOp( "   @ = normalize( @ - @ );\r\n", 
+      meta->addStatement( new GenOp( "   @ = @ - @;\r\n", 
 												new DecOp( wsView ), eyePos, wsPosition ) );
 												new DecOp( wsView ), eyePos, wsPosition ) );
    }
    }
 	
 	
@@ -838,79 +838,66 @@ Var* ShaderFeatureGLSL::addOutDetailTexCoord(   Vector<ShaderComponent*> &compon
 
 
 Var* ShaderFeatureGLSL::getSurface(Vector<ShaderComponent*>& componentList, MultiLine* meta, const MaterialFeatureData& fd)
 Var* ShaderFeatureGLSL::getSurface(Vector<ShaderComponent*>& componentList, MultiLine* meta, const MaterialFeatureData& fd)
 {
 {
-   ShaderConnector* connectComp = dynamic_cast<ShaderConnector*>(componentList[C_CONNECTOR]);
-
-   Var* diffuseColor = (Var*)LangElement::find(getOutputTargetVarName(ShaderFeature::DefaultTarget));
-
-   Var* ormConfig = (Var*)LangElement::find("ORMConfig");
-   if (!ormConfig)
-   {
-      Var* metalness = (Var*)LangElement::find("metalness");
-      if (!metalness)
-      {
-         metalness = new Var("metalness", "float");
-         metalness->uniform = true;
-         metalness->constSortPos = cspPotentialPrimitive;
-      }
-
-      Var* roughness = (Var*)LangElement::find("roughness");
-      if (!roughness)
-      {
-         roughness = new Var("roughness", "float");
-         roughness->uniform = true;
-         roughness->constSortPos = cspPotentialPrimitive;
-      }
-
-      ormConfig = new Var("ORMConfig", "vec4");
-      LangElement* colorDecl = new DecOp(ormConfig);
-      meta->addStatement(new GenOp("   @ = vec4(0.0,1.0,@,@);\r\n", colorDecl, roughness, metalness)); //reconstruct ormConfig, no ao darkening
-   }
-
-   Var* normal = (Var*)LangElement::find("normal");
-   if (!normal)
-   {
-      normal = new Var("normal", "vec3");
-      meta->addStatement(new GenOp("  @;\r\n\n", new DecOp(normal)));
-
-      Var* wsNormal = (Var*)LangElement::find("wsNormal");
-      if (!fd.features[MFT_NormalMap])
-      {
-         if (!wsNormal)
-            wsNormal = getInWorldNormal(componentList);
-         meta->addStatement(new GenOp("  @ = normalize( @ );\r\n\n", normal, wsNormal));
-      }
-      else
-      {
-         meta->addStatement(new GenOp("   @ = normalize(  @ );\r\n", normal, wsNormal));
-      }
-   }
-
-   Var* wsEyePos = (Var*)LangElement::find("eyePosWorld");
-
-   if (!wsEyePos)
-   {
-      wsEyePos = new Var("eyePosWorld", "vec3");
-      wsEyePos->uniform = true;
-      wsEyePos->constSortPos = cspPass;
-   }
-
-   Var* wsPosition = getInWsPosition(componentList);
-   Var* wsView = getWsView(wsPosition, meta);
-
-   Var* surface = (Var*)LangElement::find("surface");
+   Var *surface = (Var *)LangElement::find("surface");
 
 
    if (!surface)
    if (!surface)
    {
    {
+	   Var* diffuseColor = (Var*)LangElement::find(getOutputTargetVarName(ShaderFeature::DefaultTarget));
+	
+	   Var* ormConfig = (Var*)LangElement::find("ORMConfig");
+	   if (!ormConfig)
+	   {
+	      Var* metalness = (Var*)LangElement::find("metalness");
+	      if (!metalness)
+	      {
+	         metalness = new Var("metalness", "float");
+	         metalness->uniform = true;
+	         metalness->constSortPos = cspPotentialPrimitive;
+	      }
+	
+	      Var* roughness = (Var*)LangElement::find("roughness");
+	      if (!roughness)
+	      {
+	         roughness = new Var("roughness", "float");
+	         roughness->uniform = true;
+	         roughness->constSortPos = cspPotentialPrimitive;
+	      }
+	
+	      ormConfig = new Var("ORMConfig", "vec4");
+	      LangElement* colorDecl = new DecOp(ormConfig);
+	      meta->addStatement(new GenOp("   @ = vec4(0.0,1.0,@,@);\r\n", colorDecl, roughness, metalness)); //reconstruct ormConfig, no ao darkening
+	   }
+	
+	   Var* normal = (Var*)LangElement::find("normal");
+	   if (!normal)
+	   {
+	      normal = new Var("normal", "vec3");
+	      meta->addStatement(new GenOp("  @;\r\n\n", new DecOp(normal)));
+	
+         Var *wsNormal = (Var *)LangElement::find("wsNormal");
+	         if (!wsNormal)
+	            wsNormal = getInWorldNormal(componentList);
+
+	         meta->addStatement(new GenOp("   @ = normalize(  @ );\r\n", normal, wsNormal));
+	      }
+	
+	   Var* wsEyePos = (Var*)LangElement::find("eyePosWorld");
+	
+	   if (!wsEyePos)
+	   {
+	      wsEyePos = new Var("eyePosWorld", "vec3");
+	      wsEyePos->uniform = true;
+	      wsEyePos->constSortPos = cspPass;
+	   }
+	
+	   Var* wsPosition = getInWsPosition(componentList);
+	   Var* wsView = getWsView(wsPosition, meta);
+
       surface = new Var("surface", "Surface");
       surface = new Var("surface", "Surface");
-      meta->addStatement(new GenOp("  @ = createForwardSurface(@,@,@,@,@,@);\r\n\n", new DecOp(surface), diffuseColor, normal, ormConfig,
+      meta->addStatement(new GenOp("  @ = createForwardSurface(@,normalize(@),@,@,@,@);\r\n\n", new DecOp(surface), diffuseColor, normal, ormConfig,
          wsPosition, wsEyePos, wsView));
          wsPosition, wsEyePos, wsView));
    }
    }
 
 
-   /*Var* surface = (Var*)LangElement::find("surface");
-   if (!surface)
-   {
-      surface = new Var("surface", "float");
-   }*/
    return surface;
    return surface;
 }
 }
 //****************************************************************************
 //****************************************************************************
@@ -3003,12 +2990,12 @@ void ReflectionProbeFeatGLSL::processPix(Vector<ShaderComponent*>& componentList
    inRefPosArray->uniform = true;
    inRefPosArray->uniform = true;
    inRefPosArray->constSortPos = cspPotentialPrimitive;
    inRefPosArray->constSortPos = cspPotentialPrimitive;
 
 
-   Var * refScaleArray = new Var("inRefScale", "vec4");
+   Var * refScaleArray = new Var("inRefScaleArray", "vec4");
    refScaleArray->arraySize = MAX_FORWARD_PROBES;
    refScaleArray->arraySize = MAX_FORWARD_PROBES;
    refScaleArray->uniform = true;
    refScaleArray->uniform = true;
    refScaleArray->constSortPos = cspPotentialPrimitive;
    refScaleArray->constSortPos = cspPotentialPrimitive;
 
 
-   Var * probeConfigData = new Var("inProbeConfigData", "vec4");
+   Var * probeConfigData = new Var("inProbeConfigDataArray", "vec4");
    probeConfigData->arraySize = MAX_FORWARD_PROBES;
    probeConfigData->arraySize = MAX_FORWARD_PROBES;
    probeConfigData->uniform = true;
    probeConfigData->uniform = true;
    probeConfigData->constSortPos = cspPotentialPrimitive;
    probeConfigData->constSortPos = cspPotentialPrimitive;
@@ -3026,12 +3013,12 @@ void ReflectionProbeFeatGLSL::processPix(Vector<ShaderComponent*>& componentList
    BRDFTexture->sampler = true;
    BRDFTexture->sampler = true;
    BRDFTexture->constNum = Var::getTexUnitNum();     // used as texture unit num here
    BRDFTexture->constNum = Var::getTexUnitNum();     // used as texture unit num here
    
    
-   Var * specularCubemapAR = new Var("inSpecularCubemapAR", "samplerCubeArray");
+   Var * specularCubemapAR = new Var("SpecularCubemapAR", "samplerCubeArray");
    specularCubemapAR->uniform = true;
    specularCubemapAR->uniform = true;
    specularCubemapAR->sampler = true;
    specularCubemapAR->sampler = true;
    specularCubemapAR->constNum = Var::getTexUnitNum();
    specularCubemapAR->constNum = Var::getTexUnitNum();
 
 
-   Var * irradianceCubemapAR = new Var("inIrradianceCubemapAR", "samplerCubeArray");
+   Var * irradianceCubemapAR = new Var("IrradianceCubemapAR", "samplerCubeArray");
    irradianceCubemapAR->uniform = true;
    irradianceCubemapAR->uniform = true;
    irradianceCubemapAR->sampler = true;
    irradianceCubemapAR->sampler = true;
    irradianceCubemapAR->constNum = Var::getTexUnitNum();
    irradianceCubemapAR->constNum = Var::getTexUnitNum();
@@ -3044,14 +3031,24 @@ void ReflectionProbeFeatGLSL::processPix(Vector<ShaderComponent*>& componentList
       return;
       return;
    }
    }
 
 
+   Var* eyePos = (Var*)LangElement::find("eyePosWorld");
+   if (!eyePos)
+   {
+      eyePos = new Var;
+      eyePos->setType("vec3");
+      eyePos->setName("eyePosWorld");
+      eyePos->uniform = true;
+      eyePos->constSortPos = cspPotentialPrimitive;
+   }
+
    Var *curColor = (Var*)LangElement::find(getOutputTargetVarName(ShaderFeature::DefaultTarget));
    Var *curColor = (Var*)LangElement::find(getOutputTargetVarName(ShaderFeature::DefaultTarget));
       
       
    //Reflection vec
    //Reflection vec
-   String computeForwardProbes = String("   @.rgb = computeForwardProbes(@,@,@,@,@,@,@,@,\r\n\t\t");
+   String computeForwardProbes = String("   @.rgb = computeForwardProbes(@,@,@,@,@,@,@,@,@,\r\n\t\t");
    computeForwardProbes += String("@,@,\r\n\t\t");
    computeForwardProbes += String("@,@,\r\n\t\t");
    computeForwardProbes += String("@,@).rgb; \r\n");
    computeForwardProbes += String("@,@).rgb; \r\n");
 
 
-   meta->addStatement(new GenOp(computeForwardProbes.c_str(), curColor, surface, cubeMips, numProbes, worldToObjArray, probeConfigData, inProbePosArray, refScaleArray, inRefPosArray,
+   meta->addStatement(new GenOp(computeForwardProbes.c_str(), curColor, surface, cubeMips, numProbes, worldToObjArray, probeConfigData, inProbePosArray, refScaleArray, inRefPosArray, eyePos,
       skylightCubemapIdx, BRDFTexture,
       skylightCubemapIdx, BRDFTexture,
       irradianceCubemapAR, specularCubemapAR));
       irradianceCubemapAR, specularCubemapAR));
 
 
@@ -3078,9 +3075,9 @@ void ReflectionProbeFeatGLSL::setTexData(Material::StageData& stageDat,
       passData.mSamplerNames[texIndex] = "BRDFTexture";
       passData.mSamplerNames[texIndex] = "BRDFTexture";
       passData.mTexType[texIndex++] = Material::Standard;
       passData.mTexType[texIndex++] = Material::Standard;
       // assuming here that it is a scenegraph cubemap
       // assuming here that it is a scenegraph cubemap
-      passData.mSamplerNames[texIndex] = "inSpecularCubemapAR";
+      passData.mSamplerNames[texIndex] = "SpecularCubemapAR";
       passData.mTexType[texIndex++] = Material::SGCube;
       passData.mTexType[texIndex++] = Material::SGCube;
-      passData.mSamplerNames[texIndex] = "inIrradianceCubemapAR";
+      passData.mSamplerNames[texIndex] = "IrradianceCubemapAR";
       passData.mTexType[texIndex++] = Material::SGCube;
       passData.mTexType[texIndex++] = Material::SGCube;
    }
    }
 }
 }

+ 36 - 34
Engine/source/shaderGen/HLSL/shaderFeatureHLSL.cpp

@@ -764,7 +764,7 @@ Var* ShaderFeatureHLSL::getWsView( Var *wsPosition, MultiLine *meta )
          eyePos->constSortPos = cspPass;
          eyePos->constSortPos = cspPass;
       }
       }
 
 
-      meta->addStatement( new GenOp( "   @ = normalize( @ - @ );\r\n", 
+      meta->addStatement( new GenOp( "   @ = @ - @;\r\n", 
          new DecOp( wsView ), eyePos, wsPosition ) );
          new DecOp( wsView ), eyePos, wsPosition ) );
    }
    }
 
 
@@ -844,14 +844,16 @@ Var* ShaderFeatureHLSL::addOutDetailTexCoord(   Vector<ShaderComponent*> &compon
 
 
 Var* ShaderFeatureHLSL::getSurface(Vector<ShaderComponent*>& componentList, MultiLine* meta, const MaterialFeatureData& fd)
 Var* ShaderFeatureHLSL::getSurface(Vector<ShaderComponent*>& componentList, MultiLine* meta, const MaterialFeatureData& fd)
 {
 {
-   ShaderConnector* connectComp = dynamic_cast<ShaderConnector*>(componentList[C_CONNECTOR]);
+   Var *surface = (Var *)LangElement::find("surface");
 
 
-   Var* diffuseColor = (Var*)LangElement::find(getOutputTargetVarName(ShaderFeature::DefaultTarget));
+   if (!surface)
+   {
+      Var *diffuseColor = (Var *)LangElement::find(getOutputTargetVarName(ShaderFeature::DefaultTarget));
 
 
-   Var* ormConfig = (Var*)LangElement::find("ORMConfig");
+      Var *ormConfig = (Var *)LangElement::find("ORMConfig");
    if (!ormConfig)
    if (!ormConfig)
    {
    {
-      Var* metalness = (Var*)LangElement::find("metalness");
+         Var *metalness = (Var *)LangElement::find("metalness");
       if (!metalness)
       if (!metalness)
       {
       {
          metalness = new Var("metalness", "float");
          metalness = new Var("metalness", "float");
@@ -859,7 +861,7 @@ Var* ShaderFeatureHLSL::getSurface(Vector<ShaderComponent*>& componentList, Mult
          metalness->constSortPos = cspPotentialPrimitive;
          metalness->constSortPos = cspPotentialPrimitive;
       }
       }
 
 
-      Var* roughness = (Var*)LangElement::find("roughness");
+         Var *roughness = (Var *)LangElement::find("roughness");
       if (!roughness)
       if (!roughness)
       {
       {
          roughness = new Var("roughness", "float");
          roughness = new Var("roughness", "float");
@@ -868,30 +870,24 @@ Var* ShaderFeatureHLSL::getSurface(Vector<ShaderComponent*>& componentList, Mult
       }
       }
 
 
       ormConfig = new Var("ORMConfig", "float4");
       ormConfig = new Var("ORMConfig", "float4");
-      LangElement* colorDecl = new DecOp(ormConfig);
+         LangElement *colorDecl = new DecOp(ormConfig);
       meta->addStatement(new GenOp("   @ = float4(0.0,1.0,@,@);\r\n", colorDecl, roughness, metalness)); //reconstruct matinfo, no ao darkening
       meta->addStatement(new GenOp("   @ = float4(0.0,1.0,@,@);\r\n", colorDecl, roughness, metalness)); //reconstruct matinfo, no ao darkening
    }
    }
 
 
-   Var* normal = (Var*)LangElement::find("normal");
+      Var *normal = (Var *)LangElement::find("normal");
    if (!normal)
    if (!normal)
    {
    {
       normal = new Var("normal", "float3");
       normal = new Var("normal", "float3");
       meta->addStatement(new GenOp("  @;\r\n\n", new DecOp(normal)));
       meta->addStatement(new GenOp("  @;\r\n\n", new DecOp(normal)));
 
 
-      Var* wsNormal = (Var*)LangElement::find("wsNormal");
-      if (!fd.features[MFT_NormalMap])
-      {
+         Var *wsNormal = (Var *)LangElement::find("wsNormal");
          if (!wsNormal)
          if (!wsNormal)
             wsNormal = getInWorldNormal(componentList);
             wsNormal = getInWorldNormal(componentList);
-         meta->addStatement(new GenOp("  @ = normalize( @ );\r\n\n", normal, wsNormal));
-      }
-      else
-      {
+
          meta->addStatement(new GenOp("   @ = normalize(  @ );\r\n", normal, wsNormal));
          meta->addStatement(new GenOp("   @ = normalize(  @ );\r\n", normal, wsNormal));
       }      
       }      
-   }
 
 
-   Var* wsEyePos = (Var*)LangElement::find("eyePosWorld");
+      Var *wsEyePos = (Var *)LangElement::find("eyePosWorld");
 
 
    if (!wsEyePos)
    if (!wsEyePos)
    {
    {
@@ -900,15 +896,11 @@ Var* ShaderFeatureHLSL::getSurface(Vector<ShaderComponent*>& componentList, Mult
       wsEyePos->constSortPos = cspPass;
       wsEyePos->constSortPos = cspPass;
    }
    }
 
 
-   Var* wsPosition = getInWsPosition(componentList);
-   Var* wsView = getWsView(wsPosition, meta);
+      Var *wsPosition = getInWsPosition(componentList);
+      Var *wsView = getWsView(wsPosition, meta);
 
 
-   Var* surface = (Var*)LangElement::find("surface");
-
-   if (!surface)
-   {
       surface = new Var("surface", "Surface");
       surface = new Var("surface", "Surface");
-      meta->addStatement(new GenOp("  @ = createForwardSurface(@,@,@,@,@,@);\r\n\n", new DecOp(surface), diffuseColor, normal, ormConfig,
+      meta->addStatement(new GenOp("  @ = createForwardSurface(@,normalize(@),@,@,@,@);\r\n\n", new DecOp(surface), diffuseColor, normal, ormConfig,
          wsPosition, wsEyePos, wsView));
          wsPosition, wsEyePos, wsView));
    }
    }
 
 
@@ -3076,12 +3068,12 @@ void ReflectionProbeFeatHLSL::processPix(Vector<ShaderComponent*> &componentList
    inRefPosArray->uniform = true;
    inRefPosArray->uniform = true;
    inRefPosArray->constSortPos = cspPotentialPrimitive;
    inRefPosArray->constSortPos = cspPotentialPrimitive;
 
 
-   Var * refScaleArray = new Var("inRefScale", "float4");
+   Var * refScaleArray = new Var("inRefScaleArray", "float4");
    refScaleArray->arraySize = MAX_FORWARD_PROBES;
    refScaleArray->arraySize = MAX_FORWARD_PROBES;
    refScaleArray->uniform = true;
    refScaleArray->uniform = true;
    refScaleArray->constSortPos = cspPotentialPrimitive;
    refScaleArray->constSortPos = cspPotentialPrimitive;
 
 
-   Var *probeConfigData = new Var("inProbeConfigData", "float4");
+   Var *probeConfigData = new Var("inProbeConfigDataArray", "float4");
    probeConfigData->arraySize = MAX_FORWARD_PROBES;
    probeConfigData->arraySize = MAX_FORWARD_PROBES;
    probeConfigData->uniform = true;
    probeConfigData->uniform = true;
    probeConfigData->constSortPos = cspPotentialPrimitive;
    probeConfigData->constSortPos = cspPotentialPrimitive;
@@ -3101,22 +3093,22 @@ void ReflectionProbeFeatHLSL::processPix(Vector<ShaderComponent*> &componentList
    BRDFTextureTex->texture = true;
    BRDFTextureTex->texture = true;
    BRDFTextureTex->constNum = BRDFTexture->constNum;
    BRDFTextureTex->constNum = BRDFTexture->constNum;
 
 
-   Var *specularCubemapAR = new Var("inSpecularCubemapAR", "SamplerState");
+   Var *specularCubemapAR = new Var("SpecularCubemapAR", "SamplerState");
    specularCubemapAR->uniform = true;
    specularCubemapAR->uniform = true;
    specularCubemapAR->sampler = true;
    specularCubemapAR->sampler = true;
    specularCubemapAR->constNum = Var::getTexUnitNum();     // used as texture unit num here
    specularCubemapAR->constNum = Var::getTexUnitNum();     // used as texture unit num here
 
 
-   Var *specularCubemapARTex = new Var("texture_inSpecularCubemapAR", "TextureCubeArray");
+   Var *specularCubemapARTex = new Var("texture_SpecularCubemapAR", "TextureCubeArray");
    specularCubemapARTex->uniform = true;
    specularCubemapARTex->uniform = true;
    specularCubemapARTex->texture = true;
    specularCubemapARTex->texture = true;
    specularCubemapARTex->constNum = specularCubemapAR->constNum;
    specularCubemapARTex->constNum = specularCubemapAR->constNum;
 
 
-   Var *irradianceCubemapAR = new Var("inIrradianceCubemapAR", "SamplerState");
+   Var *irradianceCubemapAR = new Var("IrradianceCubemapAR", "SamplerState");
    irradianceCubemapAR->uniform = true;
    irradianceCubemapAR->uniform = true;
    irradianceCubemapAR->sampler = true;
    irradianceCubemapAR->sampler = true;
    irradianceCubemapAR->constNum = Var::getTexUnitNum();     // used as texture unit num here
    irradianceCubemapAR->constNum = Var::getTexUnitNum();     // used as texture unit num here
 
 
-   Var *irradianceCubemapARTex = new Var("texture_inIrradianceCubemapAR", "TextureCubeArray");
+   Var *irradianceCubemapARTex = new Var("texture_IrradianceCubemapAR", "TextureCubeArray");
    irradianceCubemapARTex->uniform = true;
    irradianceCubemapARTex->uniform = true;
    irradianceCubemapARTex->texture = true;
    irradianceCubemapARTex->texture = true;
    irradianceCubemapARTex->constNum = irradianceCubemapAR->constNum;
    irradianceCubemapARTex->constNum = irradianceCubemapAR->constNum;
@@ -3138,11 +3130,21 @@ void ReflectionProbeFeatHLSL::processPix(Vector<ShaderComponent*> &componentList
       ibl = new Var("ibl", "float3");
       ibl = new Var("ibl", "float3");
    }
    }
 
 
-   String computeForwardProbes = String("   @ = computeForwardProbes(@,@,@,@,@,@,@,@,\r\n\t\t");
+   Var* eyePos = (Var*)LangElement::find("eyePosWorld");
+   if (!eyePos)
+   {
+      eyePos = new Var;
+      eyePos->setType("float3");
+      eyePos->setName("eyePosWorld");
+      eyePos->uniform = true;
+      eyePos->constSortPos = cspPass;
+   }
+
+   String computeForwardProbes = String("   @ = computeForwardProbes(@,@,@,@,@,@,@,@,@,\r\n\t\t");
    computeForwardProbes += String("@,TORQUE_SAMPLER2D_MAKEARG(@),\r\n\t\t"); 
    computeForwardProbes += String("@,TORQUE_SAMPLER2D_MAKEARG(@),\r\n\t\t"); 
    computeForwardProbes += String("TORQUE_SAMPLERCUBEARRAY_MAKEARG(@),TORQUE_SAMPLERCUBEARRAY_MAKEARG(@)).rgb; \r\n");
    computeForwardProbes += String("TORQUE_SAMPLERCUBEARRAY_MAKEARG(@),TORQUE_SAMPLERCUBEARRAY_MAKEARG(@)).rgb; \r\n");
       
       
-   meta->addStatement(new GenOp(computeForwardProbes.c_str(), new DecOp(ibl), surface, cubeMips, numProbes, worldToObjArray, probeConfigData, inProbePosArray, refScaleArray, inRefPosArray,
+   meta->addStatement(new GenOp(computeForwardProbes.c_str(), new DecOp(ibl), surface, cubeMips, numProbes, worldToObjArray, probeConfigData, inProbePosArray, refScaleArray, inRefPosArray, eyePos,
       skylightCubemapIdx, BRDFTexture,
       skylightCubemapIdx, BRDFTexture,
       irradianceCubemapAR, specularCubemapAR));
       irradianceCubemapAR, specularCubemapAR));
 
 
@@ -3171,9 +3173,9 @@ void ReflectionProbeFeatHLSL::setTexData(Material::StageData &stageDat,
       passData.mSamplerNames[texIndex] = "BRDFTexture";
       passData.mSamplerNames[texIndex] = "BRDFTexture";
       passData.mTexType[texIndex++] = Material::Standard;
       passData.mTexType[texIndex++] = Material::Standard;
       // assuming here that it is a scenegraph cubemap
       // assuming here that it is a scenegraph cubemap
-      passData.mSamplerNames[texIndex] = "inSpecularCubemapAR";
+      passData.mSamplerNames[texIndex] = "SpecularCubemapAR";
       passData.mTexType[texIndex++] = Material::SGCube;
       passData.mTexType[texIndex++] = Material::SGCube;
-      passData.mSamplerNames[texIndex] = "inIrradianceCubemapAR";
+      passData.mSamplerNames[texIndex] = "IrradianceCubemapAR";
       passData.mTexType[texIndex++] = Material::SGCube;
       passData.mTexType[texIndex++] = Material::SGCube;
    }
    }
 }
 }

+ 8 - 6
Engine/source/shaderGen/shaderGenVars.cpp

@@ -80,17 +80,19 @@ const String ShaderGenVars::glowMul("$glowMul");
 
 
 //Reflection Probes - Forward lit. not to be confused with the deferred handwritten vars
 //Reflection Probes - Forward lit. not to be confused with the deferred handwritten vars
 //change to parity once we've got the same arrays used for both routes
 //change to parity once we've got the same arrays used for both routes
-const String ShaderGenVars::probePosition("$inProbePosArray");
-const String ShaderGenVars::probeRefPos("$inRefPosArray");
-const String ShaderGenVars::refScale("$inRefScale");
+const String ShaderGenVars::probePositionArray("$inProbePosArray");
+const String ShaderGenVars::probeRefPosArray("$inRefPosArray");
+const String ShaderGenVars::refScaleArray("$inRefScaleArray");
 const String ShaderGenVars::worldToObjArray("$inWorldToObjArray");
 const String ShaderGenVars::worldToObjArray("$inWorldToObjArray");
-const String ShaderGenVars::probeConfigData("$inProbeConfigData");
-const String ShaderGenVars::specularCubemapAR("$inSpecularCubemapAR");
-const String ShaderGenVars::irradianceCubemapAR("$inIrradianceCubemapAR");
+const String ShaderGenVars::probeConfigDataArray("$inProbeConfigDataArray");
+const String ShaderGenVars::specularCubemapAR("$SpecularCubemapAR");
+const String ShaderGenVars::irradianceCubemapAR("$IrradianceCubemapAR");
 const String ShaderGenVars::probeCount("$inNumProbes");
 const String ShaderGenVars::probeCount("$inNumProbes");
 
 
 const String ShaderGenVars::BRDFTextureMap("$BRDFTexture");
 const String ShaderGenVars::BRDFTextureMap("$BRDFTexture");
 
 
+const String ShaderGenVars::maxProbeDrawDistance("$maxProbeDrawDistance");
+
 //Skylight
 //Skylight
 const String ShaderGenVars::skylightCubemapIdx("$inSkylightCubemapIdx");
 const String ShaderGenVars::skylightCubemapIdx("$inSkylightCubemapIdx");
 
 

+ 6 - 4
Engine/source/shaderGen/shaderGenVars.h

@@ -91,17 +91,19 @@ struct ShaderGenVars
    const static String glowMul;
    const static String glowMul;
 
 
    //Reflection Probes
    //Reflection Probes
-   const static String probePosition;
-   const static String probeRefPos;
-   const static String refScale;
+   const static String probePositionArray;
+   const static String probeRefPosArray;
+   const static String refScaleArray;
    const static String worldToObjArray;
    const static String worldToObjArray;
-   const static String probeConfigData;
+   const static String probeConfigDataArray;
    const static String specularCubemapAR;
    const static String specularCubemapAR;
    const static String irradianceCubemapAR;
    const static String irradianceCubemapAR;
    const static String probeCount;
    const static String probeCount;
 
 
    const static String BRDFTextureMap;
    const static String BRDFTextureMap;
 
 
+   const static String maxProbeDrawDistance;
+
    //Skylight
    //Skylight
    const static String skylightCubemapIdx;
    const static String skylightCubemapIdx;
    
    

+ 2 - 0
Templates/BaseGame/game/core/postFX/scripts/ReflectionProbes/reflectionProbeArrayPostFX.tscript

@@ -15,4 +15,6 @@ singleton PostEffect( reflectionProbeArrayPostFX )
    texture[0] = "#deferred";
    texture[0] = "#deferred";
    texture[1] = "#color";
    texture[1] = "#color";
    texture[2] = "#matinfo";
    texture[2] = "#matinfo";
+
+   allowReflectPass = true;
 };
 };

+ 38 - 44
Templates/BaseGame/game/core/rendering/shaders/gl/lighting.glsl

@@ -23,6 +23,8 @@
 #include "./torque.glsl"
 #include "./torque.glsl"
 #include "./brdf.glsl"
 #include "./brdf.glsl"
 
 
+uniform float maxProbeDrawDistance;
+
 #ifndef TORQUE_SHADERGEN
 #ifndef TORQUE_SHADERGEN
 #line 27
 #line 27
 // These are the uniforms used by most lighting shaders.
 // These are the uniforms used by most lighting shaders.
@@ -330,7 +332,7 @@ float defineSphereSpaceInfluence(vec3 wsPosition, vec3 wsProbePosition, float ra
 {
 {
    vec3 L = wsProbePosition.xyz - wsPosition;
    vec3 L = wsProbePosition.xyz - wsPosition;
    float contribution = 1.0 - length(L) / radius;
    float contribution = 1.0 - length(L) / radius;
-   return contribution;
+   return saturate(contribution);
 }
 }
 
 
 float getDistBoxToPoint(vec3 pt, vec3 extents)
 float getDistBoxToPoint(vec3 pt, vec3 extents)
@@ -342,10 +344,9 @@ float getDistBoxToPoint(vec3 pt, vec3 extents)
 float defineBoxSpaceInfluence(vec3 wsPosition, mat4 worldToObj, float attenuation)
 float defineBoxSpaceInfluence(vec3 wsPosition, mat4 worldToObj, float attenuation)
 {
 {
    vec3 surfPosLS = tMul(worldToObj, vec4(wsPosition, 1.0)).xyz;
    vec3 surfPosLS = tMul(worldToObj, vec4(wsPosition, 1.0)).xyz;
-   float atten = 1.0 - attenuation;
    float baseVal = 0.25;
    float baseVal = 0.25;
    float dist = getDistBoxToPoint(surfPosLS, vec3(baseVal, baseVal, baseVal));
    float dist = getDistBoxToPoint(surfPosLS, vec3(baseVal, baseVal, baseVal));
-   return saturate(smoothstep(baseVal + 0.0001, atten*baseVal, dist));
+   return saturate(smoothstep(baseVal, (baseVal-attenuation/2), dist));
 }
 }
 
 
 // Box Projected IBL Lighting
 // Box Projected IBL Lighting
@@ -367,9 +368,9 @@ vec3 boxProject(vec3 wsPosition, vec3 wsReflectVec, mat4 worldToObj, vec3 refSca
 }
 }
 
 
 vec4 computeForwardProbes(Surface surface,
 vec4 computeForwardProbes(Surface surface,
-    float cubeMips, int numProbes, mat4x4 worldToObjArray[MAX_FORWARD_PROBES], vec4 probeConfigData[MAX_FORWARD_PROBES], 
-    vec4 inProbePosArray[MAX_FORWARD_PROBES], vec4 refScaleArray[MAX_FORWARD_PROBES], vec4 inRefPosArray[MAX_FORWARD_PROBES],
-    float skylightCubemapIdx, sampler2D BRDFTexture, 
+    float cubeMips, int numProbes, mat4x4 inWorldToObjArray[MAX_FORWARD_PROBES], vec4 inProbeConfigData[MAX_FORWARD_PROBES], 
+    vec4 inProbePosArray[MAX_FORWARD_PROBES], vec4 inRefScaleArray[MAX_FORWARD_PROBES], vec4 inRefPosArray[MAX_FORWARD_PROBES],
+    vec3 wsEyePos, float skylightCubemapIdx, sampler2D BRDFTexture, 
 	samplerCubeArray irradianceCubemapAR, samplerCubeArray specularCubemapAR)
 	samplerCubeArray irradianceCubemapAR, samplerCubeArray specularCubemapAR)
 {
 {
    int i = 0;
    int i = 0;
@@ -384,47 +385,37 @@ vec4 computeForwardProbes(Surface surface,
   for (i = 0; i < numProbes; ++i)
   for (i = 0; i < numProbes; ++i)
   {
   {
       contribution[i] = 0;
       contribution[i] = 0;
-
-      if (probeConfigData[i].r == 0) //box
+      float atten = 1.0-(length(wsEyePos-inProbePosArray[i].xyz)/maxProbeDrawDistance);
+      if (inProbeConfigData[i].r == 0) //box
       {
       {
-         contribution[i] = defineBoxSpaceInfluence(surface.P, worldToObjArray[i], probeConfigData[i].b);
-         if (contribution[i] > 0.0)
-            probehits++;
+         contribution[i] = defineBoxSpaceInfluence(surface.P, inWorldToObjArray[i], inProbeConfigData[i].b)*atten;
       }
       }
-      else if (probeConfigData[i].r == 1) //sphere
+      else if (inProbeConfigData[i].r == 1) //sphere
       {
       {
-         contribution[i] = defineSphereSpaceInfluence(surface.P, inProbePosArray[i].xyz, probeConfigData[i].g);
-         if (contribution[i] > 0.0)
-            probehits++;
+         contribution[i] = defineSphereSpaceInfluence(surface.P, inProbePosArray[i].xyz, inProbeConfigData[i].g)*atten;
       }
       }
 
 
-      contribution[i] = max(contribution[i], 0);
+      if (contribution[i]>0.0)
+         probehits++;
+      else
+         contribution[i] = 0.0;
 
 
       blendSum += contribution[i];
       blendSum += contribution[i];
-      invBlendSum += (1.0f - contribution[i]);
    }
    }
 
 
-   if (probehits > 1.0)
+   if (probehits > 1.0)//if we overlap
    {
    {
+      invBlendSum = (probehits - blendSum)/(probehits-1); //grab the remainder 
       for (i = 0; i < numProbes; i++)
       for (i = 0; i < numProbes; i++)
       {
       {
-         blendFactor[i] = ((contribution[i] / blendSum)) / probehits;
-         blendFactor[i] *= ((contribution[i]) / invBlendSum);
-         blendFactor[i] = saturate(blendFactor[i]);
-         blendFacSum += blendFactor[i];
+         blendFactor[i] = contribution[i]/blendSum; //what % total is this instance
+         blendFactor[i] *= blendFactor[i] / invBlendSum;  //what should we add to sum to 1
+         blendFacSum += blendFactor[i]; //running tally of results
       }
       }
 
 
-      // Normalize blendVal
-      if (blendFacSum == 0.0f) // Possible with custom weight
-      {
-         blendFacSum = 1.0f;
-      }
-
-      float invBlendSumWeighted = 1.0f / blendFacSum;
       for (i = 0; i < numProbes; ++i)
       for (i = 0; i < numProbes; ++i)
       {
       {
-         blendFactor[i] *= invBlendSumWeighted;
-         contribution[i] *= blendFactor[i];
+         contribution[i] *= blendFactor[i]/blendFacSum; //normalize
       }
       }
    }
    }
 
 
@@ -471,8 +462,8 @@ vec4 computeForwardProbes(Surface surface,
       float contrib = contribution[i];
       float contrib = contribution[i];
       if (contrib > 0.0f)
       if (contrib > 0.0f)
       {
       {
-         float cubemapIdx = int(probeConfigData[i].a);
-         vec3 dir = boxProject(surface.P, surface.R, worldToObjArray[i], refScaleArray[i].xyz, inRefPosArray[i].xyz);
+         float cubemapIdx = int(inProbeConfigData[i].a);
+         vec3 dir = boxProject(surface.P, surface.R, inWorldToObjArray[i], inRefScaleArray[i].xyz, inRefPosArray[i].xyz);
 
 
          irradiance += textureLod(irradianceCubemapAR, vec4(dir, cubemapIdx), 0).xyz * contrib;
          irradiance += textureLod(irradianceCubemapAR, vec4(dir, cubemapIdx), 0).xyz * contrib;
          specular += textureLod(specularCubemapAR, vec4(dir, cubemapIdx), lod).xyz * contrib;
          specular += textureLod(specularCubemapAR, vec4(dir, cubemapIdx), lod).xyz * contrib;
@@ -491,8 +482,8 @@ vec4 computeForwardProbes(Surface surface,
    vec3 kD = 1.0f - F;
    vec3 kD = 1.0f - F;
    kD *= 1.0f - surface.metalness;
    kD *= 1.0f - surface.metalness;
 
 
-   float dfgNdotV = max( surface.NdotV , 0.0009765625f ); //0.5f/512.0f (512 is size of dfg/brdf lookup tex)
-   vec2 envBRDF = textureLod(BRDFTexture, vec2(dfgNdotV, surface.roughness),0).rg;
+   //float dfgNdotV = max( surface.NdotV , 0.0009765625f ); //0.5f/512.0f (512 is size of dfg/brdf lookup tex)
+   vec2 envBRDF = textureLod(BRDFTexture, vec2(surface.NdotV, surface.roughness),0).rg;
    specular *= F * envBRDF.x + surface.f90 * envBRDF.y;
    specular *= F * envBRDF.x + surface.f90 * envBRDF.y;
    irradiance *= kD * surface.baseColor.rgb;
    irradiance *= kD * surface.baseColor.rgb;
 
 
@@ -504,13 +495,16 @@ vec4 computeForwardProbes(Surface surface,
    float horizonOcclusion = 1.3;
    float horizonOcclusion = 1.3;
    float horizon = saturate( 1 + horizonOcclusion * dot(surface.R, surface.N));
    float horizon = saturate( 1 + horizonOcclusion * dot(surface.R, surface.N));
    horizon *= horizon;
    horizon *= horizon;
-
+#if CAPTURING == 1
+    return vec4(mix(surface.baseColor.rgb,(irradiance + specular) * horizon,surface.metalness/2),0);
+#else
    return vec4((irradiance + specular) * horizon, 0);//alpha writes disabled
    return vec4((irradiance + specular) * horizon, 0);//alpha writes disabled
+#endif
 }
 }
 
 
 vec4 debugVizForwardProbes(Surface surface,
 vec4 debugVizForwardProbes(Surface surface,
-    float cubeMips, int numProbes, mat4 worldToObjArray[MAX_FORWARD_PROBES], vec4 probeConfigData[MAX_FORWARD_PROBES], 
-    vec4 inProbePosArray[MAX_FORWARD_PROBES], vec4 refScaleArray[MAX_FORWARD_PROBES], vec4 inRefPosArray[MAX_FORWARD_PROBES],
+    float cubeMips, int numProbes, mat4 inWorldToObjArray[MAX_FORWARD_PROBES], vec4 inProbeConfigData[MAX_FORWARD_PROBES], 
+    vec4 inProbePosArray[MAX_FORWARD_PROBES], vec4 inRefScaleArray[MAX_FORWARD_PROBES], vec4 inRefPosArray[MAX_FORWARD_PROBES],
     float skylightCubemapIdx, sampler2D BRDFTexture, 
     float skylightCubemapIdx, sampler2D BRDFTexture, 
 	 samplerCubeArray irradianceCubemapAR, samplerCubeArray specularCubemapAR, int showAtten, int showContrib, int showSpec, int showDiff)
 	 samplerCubeArray irradianceCubemapAR, samplerCubeArray specularCubemapAR, int showAtten, int showContrib, int showSpec, int showDiff)
 {
 {
@@ -527,15 +521,15 @@ vec4 debugVizForwardProbes(Surface surface,
   {
   {
       contribution[i] = 0;
       contribution[i] = 0;
 
 
-      if (probeConfigData[i].r == 0) //box
+      if (inProbeConfigData[i].r == 0) //box
       {
       {
-         contribution[i] = defineBoxSpaceInfluence(surface.P, worldToObjArray[i], probeConfigData[i].b);
+         contribution[i] = defineBoxSpaceInfluence(surface.P, inWorldToObjArray[i], inProbeConfigData[i].b);
          if (contribution[i] > 0.0)
          if (contribution[i] > 0.0)
             probehits++;
             probehits++;
       }
       }
-      else if (probeConfigData[i].r == 1) //sphere
+      else if (inProbeConfigData[i].r == 1) //sphere
       {
       {
-         contribution[i] = defineSphereSpaceInfluence(surface.P, inProbePosArray[i].xyz, probeConfigData[i].g);
+         contribution[i] = defineSphereSpaceInfluence(surface.P, inProbePosArray[i].xyz, inProbeConfigData[i].g);
          if (contribution[i] > 0.0)
          if (contribution[i] > 0.0)
             probehits++;
             probehits++;
       }
       }
@@ -620,8 +614,8 @@ vec4 debugVizForwardProbes(Surface surface,
       float contrib = contribution[i];
       float contrib = contribution[i];
       if (contrib > 0.0f)
       if (contrib > 0.0f)
       {
       {
-         float cubemapIdx = probeConfigData[i].a;
-         vec3 dir = boxProject(surface.P, surface.R, worldToObjArray[i], refScaleArray[i].xyz, inRefPosArray[i].xyz);
+         float cubemapIdx = inProbeConfigData[i].a;
+         vec3 dir = boxProject(surface.P, surface.R, inWorldToObjArray[i], inRefScaleArray[i].xyz, inRefPosArray[i].xyz);
 
 
          irradiance += textureLod(irradianceCubemapAR, vec4(dir, cubemapIdx), 0).xyz * contrib;
          irradiance += textureLod(irradianceCubemapAR, vec4(dir, cubemapIdx), 0).xyz * contrib;
          specular += textureLod(specularCubemapAR, vec4(dir, cubemapIdx), lod).xyz * contrib;
          specular += textureLod(specularCubemapAR, vec4(dir, cubemapIdx), lod).xyz * contrib;

+ 41 - 45
Templates/BaseGame/game/core/rendering/shaders/lighting.hlsl

@@ -24,6 +24,9 @@
 #include "./brdf.hlsl"
 #include "./brdf.hlsl"
 #include "./shaderModelAutoGen.hlsl"
 #include "./shaderModelAutoGen.hlsl"
 
 
+//globals
+uniform float3 eyePosWorld;
+uniform float maxProbeDrawDistance;
 #ifndef TORQUE_SHADERGEN
 #ifndef TORQUE_SHADERGEN
 
 
 // These are the uniforms used by most lighting shaders.
 // These are the uniforms used by most lighting shaders.
@@ -333,7 +336,7 @@ float defineSphereSpaceInfluence(float3 wsPosition, float3 wsProbePosition, floa
 {
 {
    float3 L = wsProbePosition.xyz - wsPosition;
    float3 L = wsProbePosition.xyz - wsPosition;
    float contribution = 1.0 - length(L) / radius;
    float contribution = 1.0 - length(L) / radius;
-   return contribution;
+   return saturate(contribution);
 }
 }
 
 
 float getDistBoxToPoint(float3 pt, float3 extents)
 float getDistBoxToPoint(float3 pt, float3 extents)
@@ -345,10 +348,9 @@ float getDistBoxToPoint(float3 pt, float3 extents)
 float defineBoxSpaceInfluence(float3 wsPosition, float4x4 worldToObj, float attenuation)
 float defineBoxSpaceInfluence(float3 wsPosition, float4x4 worldToObj, float attenuation)
 {
 {
    float3 surfPosLS = mul(worldToObj, float4(wsPosition, 1.0)).xyz;
    float3 surfPosLS = mul(worldToObj, float4(wsPosition, 1.0)).xyz;
-   float atten = 1.0 - attenuation;
    float baseVal = 0.25;
    float baseVal = 0.25;
    float dist = getDistBoxToPoint(surfPosLS, float3(baseVal, baseVal, baseVal));
    float dist = getDistBoxToPoint(surfPosLS, float3(baseVal, baseVal, baseVal));
-   return saturate(smoothstep(baseVal + 0.0001, atten*baseVal, dist));
+   return saturate(smoothstep(baseVal, (baseVal-attenuation/2), dist));
 }
 }
 
 
 // Box Projected IBL Lighting
 // Box Projected IBL Lighting
@@ -370,9 +372,9 @@ float3 boxProject(float3 wsPosition, float3 wsReflectVec, float4x4 worldToObj, f
 }
 }
 
 
 float4 computeForwardProbes(Surface surface,
 float4 computeForwardProbes(Surface surface,
-    float cubeMips, int numProbes, float4x4 worldToObjArray[MAX_FORWARD_PROBES], float4 probeConfigData[MAX_FORWARD_PROBES], 
-    float4 inProbePosArray[MAX_FORWARD_PROBES], float4 refScaleArray[MAX_FORWARD_PROBES], float4 inRefPosArray[MAX_FORWARD_PROBES],
-    float skylightCubemapIdx, TORQUE_SAMPLER2D(BRDFTexture), 
+    float cubeMips, int numProbes, float4x4 inWorldToObjArray[MAX_FORWARD_PROBES], float4 inProbeConfigData[MAX_FORWARD_PROBES], 
+    float4 inProbePosArray[MAX_FORWARD_PROBES], float4 inRefScaleArray[MAX_FORWARD_PROBES], float4 inRefPosArray[MAX_FORWARD_PROBES],
+    float3 wsEyePos, float skylightCubemapIdx, TORQUE_SAMPLER2D(BRDFTexture), 
 	 TORQUE_SAMPLERCUBEARRAY(irradianceCubemapAR), TORQUE_SAMPLERCUBEARRAY(specularCubemapAR))
 	 TORQUE_SAMPLERCUBEARRAY(irradianceCubemapAR), TORQUE_SAMPLERCUBEARRAY(specularCubemapAR))
 {
 {
    int i = 0;
    int i = 0;
@@ -384,50 +386,41 @@ float4 computeForwardProbes(Surface surface,
    float probehits = 0;
    float probehits = 0;
    //Set up our struct data
    //Set up our struct data
    float contribution[MAX_FORWARD_PROBES];
    float contribution[MAX_FORWARD_PROBES];
+   //Process prooooobes
   for (i = 0; i < numProbes; ++i)
   for (i = 0; i < numProbes; ++i)
   {
   {
-      contribution[i] = 0;
-
-      if (probeConfigData[i].r == 0) //box
+      contribution[i] = 0.0;
+      float atten = 1.0-(length(wsEyePos-inProbePosArray[i].xyz)/maxProbeDrawDistance);
+      if (inProbeConfigData[i].r == 0) //box
       {
       {
-         contribution[i] = defineBoxSpaceInfluence(surface.P, worldToObjArray[i], probeConfigData[i].b);
-         if (contribution[i] > 0.0)
-            probehits++;
+         contribution[i] = defineBoxSpaceInfluence(surface.P, inWorldToObjArray[i], inProbeConfigData[i].b)*atten;
       }
       }
-      else if (probeConfigData[i].r == 1) //sphere
+      else if (inProbeConfigData[i].r == 1) //sphere
       {
       {
-         contribution[i] = defineSphereSpaceInfluence(surface.P, inProbePosArray[i].xyz, probeConfigData[i].g);
-         if (contribution[i] > 0.0)
-            probehits++;
+         contribution[i] = defineSphereSpaceInfluence(surface.P, inProbePosArray[i].xyz, inProbeConfigData[i].g)*atten;
       }
       }
 
 
-      contribution[i] = max(contribution[i], 0);
+      if (contribution[i]>0.0)
+         probehits++;
+      else
+         contribution[i] = 0.0;
 
 
       blendSum += contribution[i];
       blendSum += contribution[i];
-      invBlendSum += (1.0f - contribution[i]);
    }
    }
 
 
-   if (probehits > 1.0)
+   if (probehits > 1.0)//if we overlap
    {
    {
+      invBlendSum = (probehits - blendSum)/(probehits-1); //grab the remainder 
       for (i = 0; i < numProbes; i++)
       for (i = 0; i < numProbes; i++)
       {
       {
-         blendFactor[i] = ((contribution[i] / blendSum)) / probehits;
-         blendFactor[i] *= ((contribution[i]) / invBlendSum);
-         blendFactor[i] = saturate(blendFactor[i]);
-         blendFacSum += blendFactor[i];
+         blendFactor[i] = contribution[i]/blendSum; //what % total is this instance
+         blendFactor[i] *= blendFactor[i] / invBlendSum;  //what should we add to sum to 1
+         blendFacSum += blendFactor[i]; //running tally of results
       }
       }
 
 
-      // Normalize blendVal
-      if (blendFacSum == 0.0f) // Possible with custom weight
-      {
-         blendFacSum = 1.0f;
-      }
-
-      float invBlendSumWeighted = 1.0f / blendFacSum;
       for (i = 0; i < numProbes; ++i)
       for (i = 0; i < numProbes; ++i)
       {
       {
-         blendFactor[i] *= invBlendSumWeighted;
-         contribution[i] *= blendFactor[i];
+         contribution[i] *= blendFactor[i]/blendFacSum; //normalize
       }
       }
    }
    }
 
 
@@ -474,8 +467,8 @@ float4 computeForwardProbes(Surface surface,
       float contrib = contribution[i];
       float contrib = contribution[i];
       if (contrib > 0.0f)
       if (contrib > 0.0f)
       {
       {
-         int cubemapIdx = probeConfigData[i].a;
-         float3 dir = boxProject(surface.P, surface.R, worldToObjArray[i], refScaleArray[i].xyz, inRefPosArray[i].xyz);
+         int cubemapIdx = inProbeConfigData[i].a;
+         float3 dir = boxProject(surface.P, surface.R, inWorldToObjArray[i], inRefScaleArray[i].xyz, inRefPosArray[i].xyz);
 
 
          irradiance += TORQUE_TEXCUBEARRAYLOD(irradianceCubemapAR, dir, cubemapIdx, 0).xyz * contrib;
          irradiance += TORQUE_TEXCUBEARRAYLOD(irradianceCubemapAR, dir, cubemapIdx, 0).xyz * contrib;
          specular += TORQUE_TEXCUBEARRAYLOD(specularCubemapAR, dir, cubemapIdx, lod).xyz * contrib;
          specular += TORQUE_TEXCUBEARRAYLOD(specularCubemapAR, dir, cubemapIdx, lod).xyz * contrib;
@@ -494,8 +487,8 @@ float4 computeForwardProbes(Surface surface,
    float3 kD = 1.0f - F;
    float3 kD = 1.0f - F;
    kD *= 1.0f - surface.metalness;
    kD *= 1.0f - surface.metalness;
 
 
-   float dfgNdotV = max( surface.NdotV , 0.0009765625f ); //0.5f/512.0f (512 is size of dfg/brdf lookup tex)
-   float2 envBRDF = TORQUE_TEX2DLOD(BRDFTexture, float4(dfgNdotV, surface.roughness,0,0)).rg;
+   //float dfgNdotV = max( surface.NdotV , 0.0009765625f ); //0.5f/512.0f (512 is size of dfg/brdf lookup tex)
+   float2 envBRDF = TORQUE_TEX2DLOD(BRDFTexture, float4(surface.NdotV, surface.roughness,0,0)).rg;
    specular *= F * envBRDF.x + surface.f90 * envBRDF.y;
    specular *= F * envBRDF.x + surface.f90 * envBRDF.y;
    irradiance *= kD * surface.baseColor.rgb;
    irradiance *= kD * surface.baseColor.rgb;
 
 
@@ -507,13 +500,16 @@ float4 computeForwardProbes(Surface surface,
    float horizonOcclusion = 1.3;
    float horizonOcclusion = 1.3;
    float horizon = saturate( 1 + horizonOcclusion * dot(surface.R, surface.N));
    float horizon = saturate( 1 + horizonOcclusion * dot(surface.R, surface.N));
    horizon *= horizon;
    horizon *= horizon;
-
+#if CAPTURING == 1
+    return float4(lerp(surface.baseColor.rgb,(irradiance + specular) * horizon,surface.metalness/2),0);
+#else
    return float4((irradiance + specular) * horizon, 0);//alpha writes disabled
    return float4((irradiance + specular) * horizon, 0);//alpha writes disabled
+#endif
 }
 }
 
 
 float4 debugVizForwardProbes(Surface surface,
 float4 debugVizForwardProbes(Surface surface,
-    float cubeMips, int numProbes, float4x4 worldToObjArray[MAX_FORWARD_PROBES], float4 probeConfigData[MAX_FORWARD_PROBES], 
-    float4 inProbePosArray[MAX_FORWARD_PROBES], float4 refScaleArray[MAX_FORWARD_PROBES], float4 inRefPosArray[MAX_FORWARD_PROBES],
+    float cubeMips, int numProbes, float4x4 inWorldToObjArray[MAX_FORWARD_PROBES], float4 inProbeConfigData[MAX_FORWARD_PROBES], 
+    float4 inProbePosArray[MAX_FORWARD_PROBES], float4 inRefScaleArray[MAX_FORWARD_PROBES], float4 inRefPosArray[MAX_FORWARD_PROBES],
     float skylightCubemapIdx, TORQUE_SAMPLER2D(BRDFTexture), 
     float skylightCubemapIdx, TORQUE_SAMPLER2D(BRDFTexture), 
 	 TORQUE_SAMPLERCUBEARRAY(irradianceCubemapAR), TORQUE_SAMPLERCUBEARRAY(specularCubemapAR), int showAtten, int showContrib, int showSpec, int showDiff)
 	 TORQUE_SAMPLERCUBEARRAY(irradianceCubemapAR), TORQUE_SAMPLERCUBEARRAY(specularCubemapAR), int showAtten, int showContrib, int showSpec, int showDiff)
 {
 {
@@ -530,15 +526,15 @@ float4 debugVizForwardProbes(Surface surface,
   {
   {
       contribution[i] = 0;
       contribution[i] = 0;
 
 
-      if (probeConfigData[i].r == 0) //box
+      if (inProbeConfigData[i].r == 0) //box
       {
       {
-         contribution[i] = defineBoxSpaceInfluence(surface.P, worldToObjArray[i], probeConfigData[i].b);
+         contribution[i] = defineBoxSpaceInfluence(surface.P, inWorldToObjArray[i], inProbeConfigData[i].b);
          if (contribution[i] > 0.0)
          if (contribution[i] > 0.0)
             probehits++;
             probehits++;
       }
       }
-      else if (probeConfigData[i].r == 1) //sphere
+      else if (inProbeConfigData[i].r == 1) //sphere
       {
       {
-         contribution[i] = defineSphereSpaceInfluence(surface.P, inProbePosArray[i].xyz, probeConfigData[i].g);
+         contribution[i] = defineSphereSpaceInfluence(surface.P, inProbePosArray[i].xyz, inProbeConfigData[i].g);
          if (contribution[i] > 0.0)
          if (contribution[i] > 0.0)
             probehits++;
             probehits++;
       }
       }
@@ -623,8 +619,8 @@ float4 debugVizForwardProbes(Surface surface,
       float contrib = contribution[i];
       float contrib = contribution[i];
       if (contrib > 0.0f)
       if (contrib > 0.0f)
       {
       {
-         int cubemapIdx = probeConfigData[i].a;
-         float3 dir = boxProject(surface.P, surface.R, worldToObjArray[i], refScaleArray[i].xyz, inRefPosArray[i].xyz);
+         int cubemapIdx = inProbeConfigData[i].a;
+         float3 dir = boxProject(surface.P, surface.R, inWorldToObjArray[i], inRefScaleArray[i].xyz, inRefPosArray[i].xyz);
 
 
          irradiance += TORQUE_TEXCUBEARRAYLOD(irradianceCubemapAR, dir, cubemapIdx, 0).xyz * contrib;
          irradiance += TORQUE_TEXCUBEARRAYLOD(irradianceCubemapAR, dir, cubemapIdx, 0).xyz * contrib;
          specular += TORQUE_TEXCUBEARRAYLOD(specularCubemapAR, dir, cubemapIdx, lod).xyz * contrib;
          specular += TORQUE_TEXCUBEARRAYLOD(specularCubemapAR, dir, cubemapIdx, lod).xyz * contrib;

+ 32 - 0
Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/gl/pointLightP.glsl

@@ -196,6 +196,38 @@ void main()
       lightCol *= max(cookie.r, max(cookie.g, cookie.b));
       lightCol *= max(cookie.r, max(cookie.g, cookie.b));
    #endif
    #endif
 
 
+   #ifdef DIFFUSE_LIGHT_VIZ
+      float attenuation = getDistanceAtt(surfaceToLight.Lu, radius);
+      vec3 factor = lightColor * max(surfaceToLight.NdotL, 0) * shadow * lightIntensity * attenuation;
+
+      vec3 diffuse = BRDF_GetDebugDiffuse(surface,surfaceToLight) * factor;
+      vec3 final = max(0.0f, diffuse);
+      OUT_col = vec4(final, 0);
+      return
+   #endif
+
+   #ifdef SPECULAR_LIGHT_VIZ
+   float attenuation = getDistanceAtt(surfaceToLight.Lu, radius);
+      vec3 factor = lightColor * max(surfaceToLight.NdotL, 0) * shadow * lightIntensity * attenuation;
+
+      vec3 diffuse = BRDF_GetDebugSpecular(surface,surfaceToLight) * factor;
+      vec3 final = max(0.0f, diffuse);
+      OUT_col = vec4(final, 0);
+      return
+   #endif
+
+   #ifdef DETAIL_LIGHTING_VIZ
+      float attenuation = getDistanceAtt(surfaceToLight.Lu, radius);
+      vec3 factor = lightColor * max(surfaceToLight.NdotL, 0) * shadow * lightIntensity * attenuation;
+
+      vec3 diffuse = BRDF_GetDiffuse(surface,surfaceToLight) * factor;
+      vec3 spec = BRDF_GetSpecular(surface,surfaceToLight) * factor;
+
+      vec3 final = max(vec3(0.0f), diffuse + spec * surface.F);
+      OUT_col = vec4(final, 0);
+      return
+   #endif
+
       //get punctual light contribution   
       //get punctual light contribution   
       lighting = getPunctualLight(surface, surfaceToLight, lightCol, lightBrightness, lightInvSqrRange, shadowed);
       lighting = getPunctualLight(surface, surfaceToLight, lightCol, lightBrightness, lightInvSqrRange, shadowed);
    }
    }

+ 23 - 41
Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/gl/reflectionProbeArrayP.glsl

@@ -84,78 +84,57 @@ void main()
       {
       {
          contribution[i] = 0;
          contribution[i] = 0;
 
 
+         float atten =1.0-(length(eyePosWorld-probePosArray[i].xyz)/maxProbeDrawDistance);
          if (probeConfigData[i].r == 0) //box
          if (probeConfigData[i].r == 0) //box
          {
          {
-            contribution[i] = defineBoxSpaceInfluence(surface.P, worldToObjArray[i], probeConfigData[i].b);
-            if (contribution[i]>0.0)
-               probehits++;
+            contribution[i] = defineBoxSpaceInfluence(surface.P, worldToObjArray[i], probeConfigData[i].b)*atten;
          }
          }
          else if (probeConfigData[i].r == 1) //sphere
          else if (probeConfigData[i].r == 1) //sphere
          {
          {
-            contribution[i] = defineSphereSpaceInfluence(surface.P, probePosArray[i].xyz, probeConfigData[i].g);
-            if (contribution[i]>0.0)
-               probehits++;
+            contribution[i] = defineSphereSpaceInfluence(surface.P, probePosArray[i].xyz, probeConfigData[i].g)*atten;
          }
          }
 
 
-         contribution[i] = max(contribution[i],0);
+            if (contribution[i]>0.0)
+               probehits++;
+         else
+            contribution[i] = 0;
 
 
          blendSum += contribution[i];
          blendSum += contribution[i];
-         invBlendSum += (1.0f - contribution[i]);
       }
       }
-      // Weight0 = normalized NDF, inverted to have 1 at center, 0 at boundary.
-	   // And as we invert, we need to divide by Num-1 to stay normalized (else sum is > 1). 
-	   // respect constraint B.
-	   // Weight1 = normalized inverted NDF, so we have 1 at center, 0 at boundary
-	   // and respect constraint A.
       
       
-      if (probehits > 1.0)
+       if (probehits > 1.0)//if we overlap
 	   {
 	   {
+         invBlendSum = (probehits - blendSum)/(probehits-1); //grab the remainder 
          for (i = 0; i < numProbes; i++)
          for (i = 0; i < numProbes; i++)
          {
          {
-               blendFactor[i] = ((contribution[i] / blendSum)) / probehits;
-               blendFactor[i] *= ((contribution[i]) / invBlendSum);
-               blendFactor[i] = saturate(blendFactor[i]);
-               blendFacSum += blendFactor[i];
+               blendFactor[i] = contribution[i]/blendSum; //what % total is this instance
+               blendFactor[i] *= blendFactor[i] / invBlendSum;  //what should we add to sum to 1
+               blendFacSum += blendFactor[i]; //running tally of results
          }
          }
 
 
-         // Normalize blendVal
-         if (blendFacSum == 0.0f) // Possible with custom weight
-         {
-               blendFacSum = 1.0f;
-         }
-
-         float invBlendSumWeighted = 1.0f / blendFacSum;
          for (i = 0; i < numProbes; ++i)
          for (i = 0; i < numProbes; ++i)
          {
          {
-               blendFactor[i] *= invBlendSumWeighted;
-               contribution[i] *= blendFactor[i];
+               contribution[i] *= blendFactor[i]/blendFacSum; //normalize
          }
          }
       }
       }
       
       
 #if DEBUGVIZ_ATTENUATION == 1
 #if DEBUGVIZ_ATTENUATION == 1
-      float contribAlpha = 1;
+      float contribAlpha = 0;
       for (i = 0; i < numProbes; ++i)
       for (i = 0; i < numProbes; ++i)
       {
       {
-         contribAlpha -= contribution[i];
+         contribAlpha += contribution[i];
       }
       }
 
 
-      OUT_col = vec4(1 - contribAlpha, 1 - contribAlpha, 1 - contribAlpha, 1);
+      OUT_col = vec4(contribAlpha,contribAlpha,contribAlpha, 1);
       return;
       return;
 #endif
 #endif
 
 
 #if DEBUGVIZ_CONTRIB == 1
 #if DEBUGVIZ_CONTRIB == 1
       vec3 finalContribColor = vec3(0, 0, 0);
       vec3 finalContribColor = vec3(0, 0, 0);
-      float contribAlpha = 1;
       for (i = 0; i < numProbes; ++i)
       for (i = 0; i < numProbes; ++i)
       {
       {
-         finalContribColor += contribution[i] *probeContribColors[i].rgb;
-         contribAlpha -= contribution[i];
+         finalContribColor += contribution[i] * vec3(fmod(i+1,2),fmod(i+1,3),fmod(i+1,4));
       }
       }
-
-      //Skylight coloration for anything not covered by probes above
-      if(skylightCubemapIdx != -1)
-      	finalContribColor += vec3(0, 1, 0) * contribAlpha;
-
       OUT_col = vec4(finalContribColor, 1);
       OUT_col = vec4(finalContribColor, 1);
       return;
       return;
 #endif
 #endif
@@ -188,7 +167,7 @@ void main()
    }
    }
 #endif
 #endif
 
 
-   if (skylightCubemapIdx != -1 && alpha > 0.001)
+   if (skylightCubemapIdx != -1 && alpha >= 0.001)
    {
    {
       irradiance = lerp(irradiance,textureLod(irradianceCubemapAR, vec4(surface.R, skylightCubemapIdx), 0).xyz,alpha);
       irradiance = lerp(irradiance,textureLod(irradianceCubemapAR, vec4(surface.R, skylightCubemapIdx), 0).xyz,alpha);
       specular = lerp(specular,textureLod(specularCubemapAR, vec4(surface.R, skylightCubemapIdx), lod).xyz,alpha);
       specular = lerp(specular,textureLod(specularCubemapAR, vec4(surface.R, skylightCubemapIdx), lod).xyz,alpha);
@@ -220,6 +199,9 @@ void main()
    float horizonOcclusion = 1.3;
    float horizonOcclusion = 1.3;
    float horizon = saturate( 1 + horizonOcclusion * dot(surface.R, surface.N));
    float horizon = saturate( 1 + horizonOcclusion * dot(surface.R, surface.N));
    horizon *= horizon;
    horizon *= horizon;
-
-   OUT_col = vec4(irradiance + specular, 0);//alpha writes disabled
+#if CAPTURING == 1
+   OUT_col = vec4(mix(surface.baseColor.rgb,(irradiance + specular) * horizon,surface.metalness/2),0);
+#else
+   OUT_col = vec4((irradiance + specular) * horizon, 0);//alpha writes disabled
+#endif
 }
 }

+ 35 - 0
Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/gl/spotLightP.glsl

@@ -122,6 +122,41 @@ void main()
       lightCol *= max(cookie.r, max(cookie.g, cookie.b));
       lightCol *= max(cookie.r, max(cookie.g, cookie.b));
    #endif
    #endif
 
 
+   #ifdef DIFFUSE_LIGHT_VIZ
+      float attenuation = getDistanceAtt(surfaceToLight.Lu, radius);
+      vec3 factor = lightColor * max(surfaceToLight.NdotL, 0) * shadow * lightIntensity * attenuation;
+
+      vec3 diffuse = BRDF_GetDebugDiffuse(surface,surfaceToLight) * factor;
+      vec3 final = max(0.0f, diffuse) * getSpotAngleAtt(-surfaceToLight.L, lightDirection, lightSpotParams );
+      
+      OUT_col = vec4(final, 0);
+      return;
+   #endif
+
+   #ifdef SPECULAR_LIGHT_VIZ
+   float attenuation = getDistanceAtt(surfaceToLight.Lu, radius);
+      float3 factor = lightColor * max(surfaceToLight.NdotL, 0) * shadow * lightIntensity * attenuation;
+
+      vec3 diffuse = BRDF_GetDebugSpecular(surface,surfaceToLight) * factor;
+      vec3 final = max(0.0f, diffuse) * getSpotAngleAtt(-surfaceToLight.L, lightDirection, lightSpotParams );
+      
+      OUT_col = vec4(final, 0);
+      return;
+   #endif
+
+   #ifdef DETAIL_LIGHTING_VIZ
+      float attenuation = getDistanceAtt(surfaceToLight.Lu, radius);
+      vec3 factor = lightColor * max(surfaceToLight.NdotL, 0) * shadow * lightIntensity * attenuation;
+
+      vec3 diffuse = BRDF_GetDiffuse(surface,surfaceToLight) * factor;
+      vec3 spec = BRDF_GetSpecular(surface,surfaceToLight) * factor;
+
+      vec3 final = max(vec3(0.0f), diffuse + spec * surface.F) * getSpotAngleAtt(-surfaceToLight.L, lightDirection, lightSpotParams );
+      
+      OUT_col = vec4(final, 0);
+      return;
+   #endif
+
       //get Punctual light contribution   
       //get Punctual light contribution   
       lighting = getPunctualLight(surface, surfaceToLight, lightCol, lightBrightness, lightInvSqrRange, shadowed);
       lighting = getPunctualLight(surface, surfaceToLight, lightCol, lightBrightness, lightInvSqrRange, shadowed);
       //get spot angle attenuation
       //get spot angle attenuation

+ 32 - 1
Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/gl/vectorLightP.glsl

@@ -216,7 +216,7 @@ void main()
 	     lightingColor = shadowed_colors.rgb;
 	     lightingColor = shadowed_colors.rgb;
       #endif
       #endif
       
       
-      shadow = lerp( shadow, 1.0, saturate( fadeOutAmt ) );
+      shadow = mix( shadow, 1.0, saturate( fadeOutAmt ) );
       
       
       #ifdef PSSM_DEBUG_RENDER
       #ifdef PSSM_DEBUG_RENDER
          if ( fadeOutAmt > 1.0 )
          if ( fadeOutAmt > 1.0 )
@@ -225,6 +225,37 @@ void main()
 
 
    #endif //NO_SHADOW
    #endif //NO_SHADOW
 
 
+   #ifdef DIFFUSE_LIGHT_VIZ
+      vec3 factor = lightingColor.rgb * max(surfaceToLight.NdotL, 0) * shadow * lightBrightness;
+      vec3 diffuse = BRDF_GetDebugDiffuse(surface,surfaceToLight) * factor;
+
+      vec3 final = max(0.0f, diffuse);
+      
+      OUT_col = vec4(final, 0);
+      return;
+   #endif
+
+   #ifdef SPECULAR_LIGHT_VIZ
+      vec3 factor = lightingColor.rgb * max(surfaceToLight.NdotL, 0) * shadow * lightBrightness;
+      vec3 spec = BRDF_GetDebugSpecular(surface, surfaceToLight) * factor;
+
+      vec3 final = max(0.0f, factor);
+      
+      OUT_col = vec4(final, 0);
+      return;
+   #endif
+
+   #ifdef DETAIL_LIGHTING_VIZ
+      vec3 factor = lightingColor.rgb * max(surfaceToLight.NdotL, 0) * shadow * lightBrightness;
+      vec3 diffuse = BRDF_GetDebugDiffuse(surface,surfaceToLight) * factor;
+      vec3 spec = BRDF_GetDebugSpecular(surface,surfaceToLight) * factor;
+
+      vec3 final = max(0.0f, diffuse + spec);
+      
+      OUT_col = vec4(final, 0);
+      return;
+   #endif
+
    //get directional light contribution   
    //get directional light contribution   
    vec3 lighting = getDirectionalLight(surface, surfaceToLight, lightingColor.rgb, lightBrightness, shadow);
    vec3 lighting = getDirectionalLight(surface, surfaceToLight, lightingColor.rgb, lightBrightness, shadow);
 
 

+ 4 - 5
Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/pointLightP.hlsl

@@ -134,7 +134,6 @@ uniform float shadowSoftness;
 uniform float4x4 worldToCamera;
 uniform float4x4 worldToCamera;
 uniform float3x3 worldToLightProj;
 uniform float3x3 worldToLightProj;
 
 
-uniform float3 eyePosWorld;
 uniform float4x4 cameraToWorld;
 uniform float4x4 cameraToWorld;
 
 
 float4 main(   ConvexConnectP IN ) : SV_TARGET
 float4 main(   ConvexConnectP IN ) : SV_TARGET
@@ -218,12 +217,12 @@ float4 main(   ConvexConnectP IN ) : SV_TARGET
 
 
    #ifdef DETAIL_LIGHTING_VIZ
    #ifdef DETAIL_LIGHTING_VIZ
       float attenuation = getDistanceAtt(surfaceToLight.Lu, radius);
       float attenuation = getDistanceAtt(surfaceToLight.Lu, radius);
-      vec3 factor = lightColor * max(surfaceToLight.NdotL, 0) * shadow * lightIntensity * attenuation;
+      float3 factor = lightColor * max(surfaceToLight.NdotL, 0) * shadow * lightIntensity * attenuation;
 
 
-      vec3 diffuse = BRDF_GetDiffuse(surface,surfaceToLight) * factor;
-      vec3 spec = BRDF_GetSpecular(surface,surfaceToLight) * factor;
+      float3 diffuse = BRDF_GetDiffuse(surface,surfaceToLight) * factor;
+      float3 spec = BRDF_GetSpecular(surface,surfaceToLight) * factor;
 
 
-      vec3 final = max(vec3(0.0f), diffuse + spec * surface.F);
+      float3 final = max(float3(0.0f), diffuse + spec * surface.F);
       return final;
       return final;
    #endif
    #endif
 
 

+ 22 - 41
Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/reflectionProbeArrayP.hlsl

@@ -12,7 +12,6 @@ TORQUE_UNIFORM_SAMPLER2D(BRDFTexture, 3);
 uniform float4 rtParams0;
 uniform float4 rtParams0;
 uniform float4 vsFarPlane;
 uniform float4 vsFarPlane;
 uniform float4x4 cameraToWorld;
 uniform float4x4 cameraToWorld;
-uniform float3 eyePosWorld;
 
 
 //cubemap arrays require all the same size. so shared mips# value
 //cubemap arrays require all the same size. so shared mips# value
 uniform float cubeMips;
 uniform float cubeMips;
@@ -76,79 +75,58 @@ float4 main(PFXVertToPix IN) : SV_TARGET
       //Process prooooobes
       //Process prooooobes
       for (i = 0; i < numProbes; ++i)
       for (i = 0; i < numProbes; ++i)
       {
       {
-         contribution[i] = 0;
+         contribution[i] = 0.0;
 
 
+         float atten =1.0-(length(eyePosWorld-probePosArray[i].xyz)/maxProbeDrawDistance);
          if (probeConfigData[i].r == 0) //box
          if (probeConfigData[i].r == 0) //box
          {
          {
-            contribution[i] = defineBoxSpaceInfluence(surface.P, worldToObjArray[i], probeConfigData[i].b);
-            if (contribution[i]>0.0)
-               probehits++;
+            contribution[i] = defineBoxSpaceInfluence(surface.P, worldToObjArray[i], probeConfigData[i].b)*atten;
          }
          }
          else if (probeConfigData[i].r == 1) //sphere
          else if (probeConfigData[i].r == 1) //sphere
          {
          {
-            contribution[i] = defineSphereSpaceInfluence(surface.P, probePosArray[i].xyz, probeConfigData[i].g);
-            if (contribution[i]>0.0)
-               probehits++;
+            contribution[i] = defineSphereSpaceInfluence(surface.P, probePosArray[i].xyz, probeConfigData[i].g)*atten;
          }
          }
 
 
-         contribution[i] = max(contribution[i],0);
+            if (contribution[i]>0.0)
+               probehits++;
+         else
+            contribution[i] = 0.0;
 
 
          blendSum += contribution[i];
          blendSum += contribution[i];
-         invBlendSum += (1.0f - contribution[i]);
       }
       }
-      // Weight0 = normalized NDF, inverted to have 1 at center, 0 at boundary.
-	   // And as we invert, we need to divide by Num-1 to stay normalized (else sum is > 1). 
-	   // respect constraint B.
-	   // Weight1 = normalized inverted NDF, so we have 1 at center, 0 at boundary
-	   // and respect constraint A.
       
       
-      if (probehits > 1.0)
+       if (probehits > 1.0)//if we overlap
 	   {
 	   {
+         invBlendSum = (probehits - blendSum)/(probehits-1); //grab the remainder 
          for (i = 0; i < numProbes; i++)
          for (i = 0; i < numProbes; i++)
          {
          {
-               blendFactor[i] = ((contribution[i] / blendSum)) / probehits;
-               blendFactor[i] *= ((contribution[i]) / invBlendSum);
-               blendFactor[i] = saturate(blendFactor[i]);
-               blendFacSum += blendFactor[i];
+               blendFactor[i] = contribution[i]/blendSum; //what % total is this instance
+               blendFactor[i] *= blendFactor[i] / invBlendSum;  //what should we add to sum to 1
+               blendFacSum += blendFactor[i]; //running tally of results
          }
          }
 
 
-         // Normalize blendVal
-         if (blendFacSum == 0.0f) // Possible with custom weight
-         {
-               blendFacSum = 1.0f;
-         }
-
-         float invBlendSumWeighted = 1.0f / blendFacSum;
          for (i = 0; i < numProbes; ++i)
          for (i = 0; i < numProbes; ++i)
          {
          {
-               blendFactor[i] *= invBlendSumWeighted;
-               contribution[i] *= blendFactor[i];
+               contribution[i] *= blendFactor[i]/blendFacSum; //normalize
          }
          }
       }
       }
       
       
 #if DEBUGVIZ_ATTENUATION == 1
 #if DEBUGVIZ_ATTENUATION == 1
-      float contribAlpha = 1;
+      float contribAlpha = 0;
       for (i = 0; i < numProbes; ++i)
       for (i = 0; i < numProbes; ++i)
       {
       {
-         contribAlpha -= contribution[i];
+         contribAlpha += contribution[i];
       }
       }
 
 
-      return float4(1 - contribAlpha, 1 - contribAlpha, 1 - contribAlpha, 1);
+      return float4(contribAlpha,contribAlpha,contribAlpha, 1);
 #endif
 #endif
 
 
 #if DEBUGVIZ_CONTRIB == 1
 #if DEBUGVIZ_CONTRIB == 1
       float3 finalContribColor = float3(0, 0, 0);
       float3 finalContribColor = float3(0, 0, 0);
-      float contribAlpha = 1;
       for (i = 0; i < numProbes; ++i)
       for (i = 0; i < numProbes; ++i)
       {
       {
-         finalContribColor += contribution[i] *probeContribColors[i].rgb;
-         contribAlpha -= contribution[i];
+         finalContribColor += contribution[i] * float3(fmod(i+1,2),fmod(i+1,3),fmod(i+1,4));
       }
       }
-
-      //Skylight coloration for anything not covered by probes above
-      if(skylightCubemapIdx != -1)
-         finalContribColor += float3(0, 1, 0) * contribAlpha;
-
       return float4(finalContribColor, 1);
       return float4(finalContribColor, 1);
 #endif
 #endif
    }
    }
@@ -209,6 +187,9 @@ float4 main(PFXVertToPix IN) : SV_TARGET
    float horizonOcclusion = 1.3;
    float horizonOcclusion = 1.3;
    float horizon = saturate( 1 + horizonOcclusion * dot(surface.R, surface.N));
    float horizon = saturate( 1 + horizonOcclusion * dot(surface.R, surface.N));
    horizon *= horizon;
    horizon *= horizon;
-
+#if CAPTURING == 1
+    return float4(lerp(surface.baseColor.rgb,(irradiance + specular) * horizon,surface.metalness/2),0);
+#else
    return float4((irradiance + specular) * horizon, 0);//alpha writes disabled
    return float4((irradiance + specular) * horizon, 0);//alpha writes disabled
+#endif
 }
 }

+ 4 - 5
Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/spotLightP.hlsl

@@ -67,7 +67,6 @@ uniform float4x4 worldToLightProj;
 uniform float4 lightParams;
 uniform float4 lightParams;
 
 
 uniform float shadowSoftness;
 uniform float shadowSoftness;
-uniform float3 eyePosWorld;
 
 
 uniform float4x4 cameraToWorld;
 uniform float4x4 cameraToWorld;
 uniform float4x4 worldToCamera;
 uniform float4x4 worldToCamera;
@@ -147,12 +146,12 @@ float4 main(   ConvexConnectP IN ) : SV_TARGET
 
 
    #ifdef DETAIL_LIGHTING_VIZ
    #ifdef DETAIL_LIGHTING_VIZ
       float attenuation = getDistanceAtt(surfaceToLight.Lu, radius);
       float attenuation = getDistanceAtt(surfaceToLight.Lu, radius);
-      vec3 factor = lightColor * max(surfaceToLight.NdotL, 0) * shadow * lightIntensity * attenuation;
+      float3 factor = lightColor * max(surfaceToLight.NdotL, 0) * shadow * lightIntensity * attenuation;
 
 
-      vec3 diffuse = BRDF_GetDiffuse(surface,surfaceToLight) * factor;
-      vec3 spec = BRDF_GetSpecular(surface,surfaceToLight) * factor;
+      float3 diffuse = BRDF_GetDiffuse(surface,surfaceToLight) * factor;
+      float3 spec = BRDF_GetSpecular(surface,surfaceToLight) * factor;
 
 
-      vec3 final = max(vec3(0.0f), diffuse + spec * surface.F) * getSpotAngleAtt(-surfaceToLight.L, lightDirection, lightSpotParams );
+      vec3 final = max(float3(0.0f), diffuse + spec * surface.F) * getSpotAngleAtt(-surfaceToLight.L, lightDirection, lightSpotParams );
       return final;
       return final;
    #endif
    #endif
 
 

+ 0 - 1
Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/vectorLightP.hlsl

@@ -42,7 +42,6 @@ uniform float4 lightColor;
 uniform float4 lightAmbient;
 uniform float4 lightAmbient;
 
 
 uniform float shadowSoftness;
 uniform float shadowSoftness;
-uniform float3 eyePosWorld;
 
 
 uniform float4 atlasXOffset;
 uniform float4 atlasXOffset;
 uniform float4 atlasYOffset;
 uniform float4 atlasYOffset;

Some files were not shown because too many files changed in this diff