/// <summary> /// 破棄します。 /// </summary> protected override void DisposeResource() { while (textures.Count > 0) { textures.Pop().DisposeInternal(); } foreach (var texture in usingTextures) { texture.DisposeInternal(); } usingTextures.Clear(); if (primal != null) { primal.Dispose(); primal = null; } }
internal void DrawInternal(AlphaBlendContext alphaBlendContext, int depth) { if (Clip != null) { Clip.GameHost.SetClipping(Clip.PositionX, Clip.PositionY, Clip.Width, Clip.Height); } if (preScreenFilters.Count > 0) { device.GetModule <AlphaBlend>().Flush(); foreach (var filter in preScreenFilters) { filter.Filter(device); } } if (BlendMode != BlendMode.None) { alphaBlendContext.BlendMode = BlendMode; } alphaBlendContext.SetSRT(Matrix.Transformation2D(ScaleCenter, 0, Scale, RotationCenter, Rotation, Position + Offset), depth); alphaBlendContext.SRTDepth = depth; for (var i = colorFilters.Count - 1; i >= 0; i--) { alphaBlendContext.SetFilter(colorFilters[i], alphaBlendContext.FilterCount++); } var currentAlpha = alphaBlendContext.Alpha; var currentBlendMode = alphaBlendContext.BlendMode; var currentFilterCount = alphaBlendContext.FilterCount; var enabledRenderMask = renderMasks.Where(m => m.Enabled).ToArray(); WorkspaceTexture renderMaskTexture = null; if (enabledRenderMask.Length > 0 && !PPDSetting.Setting.ShaderDisabled) { device.GetModule <AlphaBlend>().Flush(); var renderTarget = device.GetRenderTarget(); renderMaskTexture = device.Workspace.Get(); device.SetRenderTarget(renderMaskTexture); device.Clear(); DrawImpl(alphaBlendContext); device.GetModule <AlphaBlend>().Flush(); device.SetRenderTarget(renderTarget); } WorkspaceTexture maskTexture = null; if (Mask != null && !PPDSetting.Setting.ShaderDisabled) { device.GetModule <AlphaBlend>().Flush(); maskTexture = device.Workspace.Get(); var renderTarget = device.GetRenderTarget(); device.SetRenderTarget(maskTexture); device.Clear(MaskType == MaskType.Include ? new Color4(0, 0, 0, 0) : new Color4(0, 0, 0, 1)); using (var handler = device.GetModule <AlphaBlend>().StartMaskGeneration(MaskType)) { Mask.Draw(device.GetModule <AlphaBlendContextCache>().Clone(alphaBlendContext), depth + 1, 0); } device.SetRenderTarget(renderTarget); alphaBlendContext.MaskTexture = maskTexture.Texture; } WorkspaceTexture filterTargetTexture = null; WorkspaceTexture prevRenderTarget = null; if (currentFilterCount >= 2 && !PPDSetting.Setting.ShaderDisabled) { device.GetModule <AlphaBlend>().Flush(); alphaBlendContext.Alpha = 1; alphaBlendContext.BlendMode = BlendMode.Normal; filterTargetTexture = device.Workspace.Get(); prevRenderTarget = device.GetRenderTarget(); device.SetRenderTarget(filterTargetTexture); device.Clear(new Color4(0, 0, 0, 0)); } DrawImpl(alphaBlendContext); if (currentFilterCount >= 2 && !PPDSetting.Setting.ShaderDisabled) { device.GetModule <AlphaBlend>().Flush(); var context = device.GetModule <AlphaBlendContextCache>().Get(); context.Alpha = 1; context.BlendMode = BlendMode.Normal; context.Vertex = device.GetModule <ShaderCommon>().ScreenVertex; context.SetSRT(Matrix.Identity, 0); WorkspaceTexture renderedTexture = filterTargetTexture; for (var i = currentFilterCount - 2; i >= 0; i--) { context.Texture = renderedTexture.Texture; var newRenderTarget = device.Workspace.Get(); device.SetRenderTarget(newRenderTarget); context.SetFilter(alphaBlendContext.Filters[i], 0); context.FilterCount = 1; device.GetModule <AlphaBlend>().Draw(device, context); renderedTexture.Dispose(); renderedTexture = newRenderTarget; if (i == 0) { context.Alpha = currentAlpha; context.BlendMode = currentBlendMode; context.Texture = renderedTexture.Texture; context.FilterCount = 0; device.SetRenderTarget(prevRenderTarget); device.GetModule <AlphaBlend>().Draw(device, context); } } if (renderedTexture != null) { renderedTexture.Dispose(); } } if (enabledRenderMask.Length > 0 && !PPDSetting.Setting.ShaderDisabled) { device.GetModule <AlphaBlend>().Flush(); foreach (var renderMask in enabledRenderMask) { renderMask.Draw(device, renderMaskTexture); } if (renderMaskTexture != null) { renderMaskTexture.Dispose(); } } DrawChildrenImpl(alphaBlendContext, currentAlpha, currentBlendMode, currentFilterCount, depth + 1); if (Mask != null && !PPDSetting.Setting.ShaderDisabled) { alphaBlendContext.MaskTexture = null; if (maskTexture != null) { maskTexture.Dispose(); } } alphaBlendContext.SRTDepth = depth; alphaBlendContext.Alpha = currentAlpha; alphaBlendContext.BlendMode = currentBlendMode; alphaBlendContext.FilterCount = currentFilterCount; AfterChildenDraw(alphaBlendContext); if (postScreenFilters.Count > 0) { device.GetModule <AlphaBlend>().Flush(); foreach (var filter in postScreenFilters) { filter.Filter(device); } } if (Clip != null) { Clip.GameHost.RestoreClipping(); } }