//========================================================================= public void PrepareForRuntime(Camera[] icameras, float ifps) { int loop; int screenWidth; int screenHeight; EchoPFXEffect epe; string shaderName; float per; _mainTexID = Shader.PropertyToID("_echoScreen"); passCount = 1; if (possibleOpts2.Count > 0) { passCount++; } ValidateOptions(); _autoDetailTargetTime = (int)((1.0f / ((float)ifps - autoDetailFudge)) * 10000.0f); // hold the final shader keywords _finalKeywords = new string[2][]; _finalKeywords[0] = new string[possibleOpts1.Count]; _finalKeywords[1] = new string[possibleOpts2.Count]; // used to accumylate the effects that are in use _finalKeyFlags = new int[2][]; _finalKeyFlags[0] = new int[possibleOpts1.Count]; _finalKeyFlags[1] = new int[possibleOpts2.Count]; // used to compare if anything has changed from last frame _prevKeyFlags = new int[2][]; _prevKeyFlags[0] = new int[possibleOpts1.Count]; _prevKeyFlags[1] = new int[possibleOpts2.Count]; FindCameras(icameras); CreateMesh(); _echoRenderMaterial = new EchoPFXRenderMaterial[passCount]; for (loop = 0; loop < passCount; loop++) { shaderName = "echoLogin/PFX/echologin_postfx_group" + id + "_pass" + (loop + 1); Shader shd = Shader.Find(shaderName); _echoRenderMaterial[loop] = new EchoPFXRenderMaterial(new Material(shd)); } _renTex = new EchoPFXRenderTexture[2]; if (!EchoPFXManager.unityPro) { rtAdjustSize = ECHORTADJUST.DEVICE_SIZE; } // Find Render Tex Size switch (rtAdjustSize) { case ECHORTADJUST.AUTO_DETAIL: screenWidth = Screen.width; screenHeight = Screen.height; _autoTexPass1 = new EchoPFXRenderTexture[autoDetailLevels]; _autoTexPass1[0] = new EchoPFXRenderTexture(screenWidth, screenHeight, 16, rtFilterMode[0]); for (loop = 1; loop < autoDetailLevels; loop++) { per = Mathf.Lerp(1.0f, autoDetailMin, ((float)loop / (float)(autoDetailLevels - 1))); _autoTexPass1[loop] = new EchoPFXRenderTexture((int)((float)screenWidth * per), (int)((float)screenHeight * per), 16, rtFilterMode[0]); } if (passCount > 1) { _autoTexPass2 = new EchoPFXRenderTexture[autoDetailLevels]; _autoTexPass2[0] = new EchoPFXRenderTexture(screenWidth, screenHeight, 0, rtFilterMode[0]); for (loop = 1; loop < autoDetailLevels; loop++) { per = Mathf.Lerp(1.0f, autoDetailMin, ((float)loop / (float)(autoDetailLevels - 1))); _autoTexPass2[loop] = new EchoPFXRenderTexture((int)((float)screenWidth * per), (int)((float)screenHeight * per), 0, rtFilterMode[0]); } } _autoTex = new EchoPFXRenderTexture[2][]; _autoTex[0] = _autoTexPass1; _autoTex[1] = _autoTexPass2; break; case ECHORTADJUST.DIVIDE: screenWidth = Screen.width / rtAdjustWidth; screenHeight = Screen.height / rtAdjustHeight; break; case ECHORTADJUST.CUSTOM: screenWidth = rtAdjustWidth; screenHeight = rtAdjustHeight; break; default: case ECHORTADJUST.DEVICE_SIZE: screenWidth = Screen.width; screenHeight = Screen.height; break; } if (screenWidth < 4) { screenWidth = 4; } if (screenHeight < 4) { screenHeight = 4; } if (rtAdjustSize == ECHORTADJUST.AUTO_DETAIL) { _renTex[0] = _autoTexPass1[0]; if (passCount > 1) { _renTex[1] = _autoTexPass2[0]; } } else { _renTex[0] = new EchoPFXRenderTexture(screenWidth, screenHeight, 16, rtFilterMode[0]); if (passCount > 1) { _renTex[1] = new EchoPFXRenderTexture(screenWidth, screenHeight, 0, rtFilterMode[1]); } } epeEchoList = new EchoList <EchoPFXEffect>(epeList); for (loop = 0; loop < epeList.Count; loop++) { epe = epeList[loop]; if (epe.active) { epe.Start(); epeEchoList.Activate(epe); } } _renTex[0].SetCamerasRenderTarget(_camList); if (!EchoPFXManager.unityPro) { if (_camList.Count > 0) { EchoPFXUnityFreeCamCopy uscript; uscript = _camList[0].gameObject.AddComponent <EchoPFXUnityFreeCamCopy>(); uscript.echoRenTex = _renTex[0]; EchoPFXUnityFreeCamSetRect rscript; rscript = _camList[_camList.Count - 1].gameObject.AddComponent <EchoPFXUnityFreeCamSetRect>(); rscript.echoRenTex = _renTex[0]; } } }
//========================================================================= public void Render(Transform icamtrans) { int index; bool flag; string[] finalKeywords; EchoPFXEffect epe; EchoPFXEffect epeNext; EchoPFXOption epo; EchoPFXRenderMaterial erm; EchoPFXRenderTexture.Active(_renTex, 0, passCount); GL.PushMatrix(); GL.LoadOrtho(); for (int pass = 0; pass < passCount; pass++) { erm = _echoRenderMaterial[pass]; erm.ResetAllFrameCounts(); Array.Copy(_finalKeyFlags[pass], _prevKeyFlags[pass], _finalKeyFlags[pass].Length); Array.Clear(_finalKeyFlags[pass], 0, _finalKeyFlags[pass].Length); for (epe = epeEchoList.GetFirstActive(); epe != null; epe = epeNext) { epeNext = epeEchoList.GetNext(epe); if (epe.passActive[pass]) { for (index = 0; index < epe.passOpt[pass].Count; index++) { epo = epe.passOpt[pass][index]; switch (epo.Process()) { case -1: epe.optionsOff++; if (epe.optionsOff >= epe.optionsTotal) { epeEchoList.Deactivate(epe); } break; case 0: break; default: // should index into order of passopts _finalKeyFlags[pass][epo.passOrder] = _finalKeyFlags[pass][epo.passOrder] | 1; switch (epo.optType) { case ECHOPFXOPTION.GREYSCALE: erm.SetFloat(ECHOPROP.GREYFADE, epo.fadeCur); break; case ECHOPFXOPTION.INVERSE: erm.SetFloat(ECHOPROP.INVERSEFADE, epo.fadeCur); break; case ECHOPFXOPTION.COLOR: erm.SetVector(ECHOPROP.COLOR, epo.rgba * epo.rgbaMultiply); erm.SetFloat(ECHOPROP.COLORFADE, epo.fadeCur); break; case ECHOPFXOPTION.ADD: erm.SetVector(ECHOPROP.ADD, epo.rgba * epo.rgbaMultiply); erm.SetFloat(ECHOPROP.ADDFADE, epo.fadeCur); break; case ECHOPFXOPTION.MULTIPLY: erm.SetVector(ECHOPROP.MULT, epo.rgba * epo.rgbaMultiply); erm.SetFloat(ECHOPROP.MULTFADE, epo.fadeCur); break; case ECHOPFXOPTION.NOISE: erm.SetFloat(ECHOPROP.NOISEFADE, epo.fadeCur); _echoRenderMaterial[pass].mat.SetTexture("_NoiseTex", epo.tex); break; case ECHOPFXOPTION.DISTORTION: erm.SetVector(ECHOPROP.DISTPARAMSH, new Vector4(epo.distSpeedH, epo.distAmountH, (1.0f / (float)meshCellWidth) * epo.distStrengthH, epo.fadeCur)); erm.SetVector(ECHOPROP.DISTPARAMSV, new Vector4(epo.distSpeedV, epo.distAmountV, (1.0f / (float)meshCellHeight) * epo.distStrengthV, epo.fadeCur)); break; case ECHOPFXOPTION.SHOCKWAVE: erm.SetVector(ECHOPROP.SHOCKPARAMS, new Vector4(epo.shockCenterX, epo.shockCenterY, epo.shockDistance, epo.shockSize)); erm.SetFloat(ECHOPROP.SHOCKFADE, epo.fadeCur); break; case ECHOPFXOPTION.SCANLINES: erm.SetFloat(ECHOPROP.SCANLINEFADE, epo.fadeCur); if (epo.linesAmountDivideH) { erm.SetFloat(ECHOPROP.SCANLINECOUNTH, (float)Screen.height / (float)epo.linesAmountH); } else { erm.SetFloat(ECHOPROP.SCANLINECOUNTH, epo.linesAmountH); } erm.SetFloat(ECHOPROP.SCANLINESCROLLH, epo.linesScrollH); if (epo.linesAmountDivideV) { erm.SetFloat(ECHOPROP.SCANLINECOUNTV, (float)Screen.width / (float)epo.linesAmountV); } else { erm.SetFloat(ECHOPROP.SCANLINECOUNTV, epo.linesAmountV); } erm.SetFloat(ECHOPROP.SCANLINESCROLLV, epo.linesScrollV); break; case ECHOPFXOPTION.LUMRAMP: erm.SetTexture(ECHOPROP.RAMP_TEX, epo.tex); erm.SetFloat(ECHOPROP.RAMPFADE, epo.fadeCur); break; case ECHOPFXOPTION.COLOR_CORRECT: erm.SetTexture(ECHOPROP.CORRECT_TEX, epo.tex); erm.SetFloat(ECHOPROP.CORRECTFADE, epo.fadeCur); break; case ECHOPFXOPTION.OVERLAY_NORMAL: erm.SetTexture(ECHOPROP.OVERLAY_TEX, epo.tex); erm.SetVector(ECHOPROP.OVERLAY_ST, epo.overlayST); erm.SetFloat(ECHOPROP.OVERLAY_FADE, epo.fadeCur); break; case ECHOPFXOPTION.OVERLAY_SCREEN: erm.SetTexture(ECHOPROP.OVERLAYSCR_TEX, epo.tex); erm.SetFloat(ECHOPROP.OVERLAYSCR_FADE, epo.fadeCur); erm.SetVector(ECHOPROP.OVERLAYSCR_ST, epo.overlayST); break; case ECHOPFXOPTION.OVERLAY_ADD: erm.SetTexture(ECHOPROP.OVERLAYADD_TEX, epo.tex); erm.SetFloat(ECHOPROP.OVERLAYADD_FADE, epo.fadeCur); erm.SetVector(ECHOPROP.OVERLAYADD_ST, epo.overlayST); break; case ECHOPFXOPTION.OVERLAY_SUBTRACT: erm.SetTexture(ECHOPROP.OVERLAYSUB_TEX, epo.tex); erm.SetFloat(ECHOPROP.OVERLAYSUB_FADE, epo.fadeCur); erm.SetVector(ECHOPROP.OVERLAYSUB_ST, epo.overlayST); break; case ECHOPFXOPTION.OVERLAY_MULTIPLY: erm.SetTexture(ECHOPROP.OVERLAYMUL_TEX, epo.tex); erm.SetFloat(ECHOPROP.OVERLAYMUL_FADE, epo.fadeCur); erm.SetVector(ECHOPROP.OVERLAYMUL_ST, epo.overlayST); break; case ECHOPFXOPTION.OVERLAY_OVERLAY: erm.SetTexture(ECHOPROP.OVERLAYOVR_TEX, epo.tex); erm.SetFloat(ECHOPROP.OVERLAYOVR_FADE, epo.fadeCur); erm.SetVector(ECHOPROP.OVERLAYOVR_ST, epo.overlayST); break; case ECHOPFXOPTION.CUSTOM_FRAG_1: if (epo.tex != null) { erm.SetTexture(ECHOPROP.CUSTOM_FRAG_1_TEX, epo.tex); erm.SetVector(ECHOPROP.CUSTOM_FRAG_1_ST, epo.overlayST); } erm.SetFloat(ECHOPROP.CUSTOM_FRAG_1_FADE, epo.fadeCur); erm.SetVector(ECHOPROP.CUSTOM_FRAG_1_ARGS, epo.customArgs); erm.SetVector(ECHOPROP.CUSTOM_FRAG_1_COLOR, epo.rgba * epo.rgbaMultiply); break; case ECHOPFXOPTION.CUSTOM_FRAG_2: if (epo.tex != null) { erm.SetTexture(ECHOPROP.CUSTOM_FRAG_2_TEX, epo.tex); erm.SetVector(ECHOPROP.CUSTOM_FRAG_2_ST, epo.overlayST); } erm.SetFloat(ECHOPROP.CUSTOM_FRAG_2_FADE, epo.fadeCur); erm.SetVector(ECHOPROP.CUSTOM_FRAG_2_ARGS, epo.customArgs); erm.SetVector(ECHOPROP.CUSTOM_FRAG_2_COLOR, epo.rgba * epo.rgbaMultiply); break; case ECHOPFXOPTION.CUSTOM_FRAG_3: if (epo.tex != null) { erm.SetTexture(ECHOPROP.CUSTOM_FRAG_3_TEX, epo.tex); erm.SetVector(ECHOPROP.CUSTOM_FRAG_3_ST, epo.overlayST); } erm.SetFloat(ECHOPROP.CUSTOM_FRAG_3_FADE, epo.fadeCur); erm.SetVector(ECHOPROP.CUSTOM_FRAG_3_ARGS, epo.customArgs); erm.SetVector(ECHOPROP.CUSTOM_FRAG_3_COLOR, epo.rgba * epo.rgbaMultiply); break; case ECHOPFXOPTION.CUSTOM_FRAG_4: if (epo.tex != null) { erm.SetTexture(ECHOPROP.CUSTOM_FRAG_4_TEX, epo.tex); erm.SetVector(ECHOPROP.CUSTOM_FRAG_4_ST, epo.overlayST); } erm.SetFloat(ECHOPROP.CUSTOM_FRAG_4_FADE, epo.fadeCur); erm.SetVector(ECHOPROP.CUSTOM_FRAG_4_ARGS, epo.customArgs); erm.SetVector(ECHOPROP.CUSTOM_FRAG_4_COLOR, epo.rgba * epo.rgbaMultiply); break; } break; } } } } erm.SubmitShaderProperties(); finalKeywords = _finalKeywords[pass]; flag = false; if (pass == 0) { for (index = 0; index < possibleOpts1.Count; index++) { finalKeywords[index] = _keywords[(int)possibleOpts1[index].type, _finalKeyFlags[pass][index]]; if (_finalKeyFlags[pass][index] != _prevKeyFlags[pass][index]) { flag = true; } } } else { for (index = 0; index < possibleOpts2.Count; index++) { finalKeywords[index] = _keywords[(int)possibleOpts2[index].type, _finalKeyFlags[pass][index]]; if (_finalKeyFlags[pass][index] != _prevKeyFlags[pass][index]) { flag = true; } } } if (flag) { _echoRenderMaterial[pass].mat.shaderKeywords = finalKeywords; } #if UNITY_4_0 || UNITY_4_0_1 || UNITY_4_1 _echoRenderMaterial[pass].mat.SetTexture("_echoScreen", _renTex[pass].texture); #else _echoRenderMaterial[pass].mat.SetTexture(_mainTexID, _renTex[pass].texture); #endif _echoRenderMaterial[pass].mat.SetPass(0); Graphics.DrawMeshNow(_mesh, icamtrans.position, icamtrans.rotation); if (passCount > 1) { EchoPFXRenderTexture.Active(_renTex, 1, passCount); } } GL.PopMatrix(); _renTex[0].DiscardContents(); if (passCount > 1) { _renTex[1].DiscardContents(); } }