Kaynağa Gözat

1)use standard setupPass inheritance chain. already checks for !mprocessedmaterial and a few other things
2)pass along mIsSkylight from probes to matinstances
3) stubbs in a seperate setupPass for skylightmatinstance

Azaezel 7 yıl önce
ebeveyn
işleme
79d506d439

+ 28 - 6
Engine/source/lighting/probeManager.cpp

@@ -99,6 +99,7 @@ void ProbeRenderInst::set(const ProbeRenderInst *probeInfo)
    numVerts = probeInfo->numVerts;
    numIndicesForPoly = probeInfo->numIndicesForPoly;
    mBounds = probeInfo->mBounds;
+   mIsSkylight = probeInfo->mIsSkylight;
 
    for (U32 i = 0; i < 9; i++)
    {
@@ -764,13 +765,9 @@ bool ReflectProbeMatInstance::init(const FeatureSet &features, const GFXVertexFo
 
 bool ReflectProbeMatInstance::setupPass(SceneRenderState *state, const SceneData &sgData)
 {
-	// Go no further if the material failed to initialize properly.
-	if (!mProcessedMaterial ||
-		mProcessedMaterial->getNumPasses() == 0)
+	if (!Parent::setupPass(state, sgData)) 
 		return false;
 
-	bool bRetVal = Parent::setupPass(state, sgData);;
-
 	AssertFatal(mProcessedMaterial->getNumPasses() > 0, "No passes created! Ohnoes");
 	const RenderPassData *rpd = mProcessedMaterial->getPass(0);
 	AssertFatal(rpd, "No render pass data!");
@@ -788,9 +785,34 @@ bool ReflectProbeMatInstance::setupPass(SceneRenderState *state, const SceneData
 	// Now override stateblock with our own
 	GFX->setStateBlock(mProjectionState);
 
-	return bRetVal;
+	return true;
 }
 
+bool SkylightMatInstance::setupPass(SceneRenderState *state, const SceneData &sgData)
+{
+	if (!Parent::setupPass(state, sgData))
+		return false;
+
+	AssertFatal(mProcessedMaterial->getNumPasses() > 0, "No passes created! Ohnoes");
+	const RenderPassData *rpd = mProcessedMaterial->getPass(0);
+	AssertFatal(rpd, "No render pass data!");
+	AssertFatal(rpd->mRenderStates[0], "No render state 0!");
+
+	if (!mProjectionState)
+	{
+		GFXStateBlockDesc desc;
+		desc.setZReadWrite(false);
+		desc.zWriteEnable = false;
+		desc.setCullMode(GFXCullNone);
+		desc.setBlend(true, GFXBlendSrcAlpha, GFXBlendDestAlpha, GFXBlendOpMax);
+		//desc.setBlend(false);
+		mProjectionState = GFX->createStateBlock(desc);
+	}
+	// Now override stateblock with our own
+	GFX->setStateBlock(mProjectionState);
+
+	return true;
+}
 //
 //
 ProbeManager::ReflectProbeMaterialInfo::ReflectProbeMaterialInfo(const String &matName,

+ 4 - 0
Engine/source/lighting/probeManager.h

@@ -208,8 +208,12 @@ class SkylightMatInstance : public ReflectProbeMatInstance
 {
 	typedef ReflectProbeMatInstance Parent;
 
+protected:
+	GFXStateBlockRef mProjectionState;
+
 public:
 	SkylightMatInstance(Material &mat) : Parent(mat) {}
+	virtual bool setupPass(SceneRenderState *state, const SceneData &sgData);
 };
 
 class ProbeManager