/// <summary> /// 描画します。 /// </summary> /// <param name="device"></param> /// <param name="context"></param> /// <param name="primitiveType"></param> /// <param name="primitiveCount"></param> /// <param name="startIndex"></param> /// <param name="vertexCount"></param> public void Draw(PPDDevice device, AlphaBlendContext context, PrimitiveType primitiveType = PrimitiveType.TriangleStrip, int primitiveCount = 2, int startIndex = 0, int vertexCount = 4) { var cloneContext = device.GetModule <AlphaBlendContextCache>().Clone(context); DrawInternal(device, cloneContext, primitiveType, primitiveCount, startIndex, vertexCount); }
private void DrawGlass(PPDDevice device, AlphaBlendContext context, Matrix m, PrimitiveType primitiveType, int primitiveCount, int startIndex, int vertexCount) { using (var workspaceTexture = device.Workspace.Get()) { Flush(); #if BENCHMARK using (var handler = Benchmark.Instance.Start("Copy")) { #endif device.StretchRectangle(device.GetRenderTarget(), workspaceTexture); #if BENCHMARK } #endif using (var tempWorkspaceTexture = device.Workspace.Get()) using (var tempWorkspaceTexture2 = device.Workspace.Get()) { context.BlendMode = BlendMode.Normal; var renderTarget = device.GetRenderTarget(); device.SetRenderTarget(tempWorkspaceTexture); device.Clear(); device.SetRenderTarget(tempWorkspaceTexture2); device.Clear(); device.SetRenderTarget(tempWorkspaceTexture); DrawNotNormalBlend(device, context, m, tempWorkspaceTexture2, primitiveType, primitiveCount, startIndex, vertexCount); device.SetRenderTarget(renderTarget); device.GetModule <GlassFilter>().Draw(device, tempWorkspaceTexture.Texture, workspaceTexture.Texture); } } }
/// <summary> /// 描画処理 /// </summary> /// <param name="alphaBlendContext"></param> protected override void DrawImpl(Shaders.AlphaBlendContext alphaBlendContext) { if (resource != null && rectangleWidth > 0 && rectangleHeight > 0) { alphaBlendContext.Texture = resource.Texture; alphaBlendContext.Vertex = vertices; device.GetModule <AlphaBlend>().Draw(device, alphaBlendContext); } }
public override void Draw(PPDDevice device, AlphaBlendContext context, PrimitiveType primitiveType, int primitiveCount, int startIndex, int vertexCount) { if (context.Texture == null) { return; } #if BENCHMARK using (var handler = Benchmark.Instance.Start("Draw")) { #endif Matrix m = context.SRTS[0]; if (!context.WorldDisabled) { m *= device.World; } for (var i = 1; i <= context.SRTDepth; i++) { m = context.SRTS[i] * m; } var _device = (device.Device as SharpDX.Direct3D9.Device); _device.SetRenderState(SharpDX.Direct3D9.RenderState.SourceBlend, context.Texture.PA ? SharpDX.Direct3D9.Blend.One : SharpDX.Direct3D9.Blend.SourceAlpha); _device.SetTransform(SharpDX.Direct3D9.TransformState.World, m); _device.SetTexture(0, ((Texture.DX9.Texture)context.Texture)._Texture); var alpha = Math.Max(0, Math.Min(255, (int)(context.Alpha * 255))); _device.SetTexture(1, context.Texture.PA ? paAlphas[alpha] : alphas[alpha]); _device.SetTextureStageState(1, SharpDX.Direct3D9.TextureStage.ColorOperation, SharpDX.Direct3D9.TextureOperation.Modulate); _device.SetTextureStageState(1, SharpDX.Direct3D9.TextureStage.ColorArg1, SharpDX.Direct3D9.TextureArgument.Texture); _device.SetTextureStageState(1, SharpDX.Direct3D9.TextureStage.ColorArg2, SharpDX.Direct3D9.TextureArgument.Current); _device.SetTextureStageState(1, SharpDX.Direct3D9.TextureStage.AlphaOperation, SharpDX.Direct3D9.TextureOperation.Modulate); _device.SetTextureStageState(1, SharpDX.Direct3D9.TextureStage.AlphaArg1, SharpDX.Direct3D9.TextureArgument.Texture); _device.SetTextureStageState(1, SharpDX.Direct3D9.TextureStage.AlphaArg2, SharpDX.Direct3D9.TextureArgument.Current); if (context.Overlay.Alpha > 0) { var colorTexture = ((Texture.DX9.Texture)device.GetModule <ColorTextureAllcator>().CreateTexture(context.Overlay))._Texture; _device.SetTexture(2, colorTexture); _device.SetTextureStageState(2, SharpDX.Direct3D9.TextureStage.ColorOperation, SharpDX.Direct3D9.TextureOperation.Modulate); _device.SetTextureStageState(2, SharpDX.Direct3D9.TextureStage.ColorArg1, SharpDX.Direct3D9.TextureArgument.Texture); _device.SetTextureStageState(2, SharpDX.Direct3D9.TextureStage.ColorArg2, SharpDX.Direct3D9.TextureArgument.Current); _device.SetTextureStageState(2, SharpDX.Direct3D9.TextureStage.AlphaOperation, SharpDX.Direct3D9.TextureOperation.Modulate); _device.SetTextureStageState(2, SharpDX.Direct3D9.TextureStage.AlphaArg1, SharpDX.Direct3D9.TextureArgument.Texture); _device.SetTextureStageState(2, SharpDX.Direct3D9.TextureStage.AlphaArg2, SharpDX.Direct3D9.TextureArgument.Current); } else { _device.SetTexture(2, null); _device.SetTextureStageState(2, SharpDX.Direct3D9.TextureStage.ColorOperation, SharpDX.Direct3D9.TextureOperation.Disable); _device.SetTextureStageState(2, SharpDX.Direct3D9.TextureStage.AlphaOperation, SharpDX.Direct3D9.TextureOperation.Disable); } if (context?.Vertex?.VertexBucket?.VertexBuffer is VertexBuffer vertexBuffer) { device.DrawUserPrimitives(primitiveType, context.Vertex.Offset + startIndex, primitiveCount, vertexBuffer.Vertices); } #if BENCHMARK } #endif }
/// <summary> /// クローンします。 /// </summary> /// <returns></returns> internal void Clone(AlphaBlendContext context) { context.Alpha = Alpha; context.BlendMode = BlendMode; context.FilterCount = FilterCount; context.SRTDepth = SRTDepth; context.Texture = Texture; context.MaskTexture = MaskTexture; context.Vertex = Vertex; context.Overlay = Overlay; context.Transparent = Transparent; context.WorldDisabled = WorldDisabled; Array.Copy(SRTS, context.SRTS, SRTDepth + 1); Array.Copy(Filters, context.Filters, FilterCount); }
private void DrawMask(PPDDevice device, AlphaBlendContext context, Matrix m, PrimitiveType primitiveType, int primitiveCount, int startIndex, int vertexCount) { using (var workspaceTexture = device.Workspace.Get()) { #if BENCHMARK using (var handler = Benchmark.Instance.Start("Copy")) { #endif device.StretchRectangle(device.GetRenderTarget(), workspaceTexture); #if BENCHMARK } #endif #if BENCHMARK using (var handler = Benchmark.Instance.Start("Effect Prepare")) { #endif effect.Technique = maskTechniqueNames[new Tuple <MaskType, bool>(MaskType, context.MaskTexture != null)]; effect.SetTexture(textureHandle, context.Texture); effect.SetTexture(lastRenderTargetTextureHandle, workspaceTexture.Texture); effect.SetTexture(maskTextureHandle, context.MaskTexture); effect.SetValue(drawInfoHandle, new DrawInfo { Matrix = m, Alpha = context.Alpha, OverlayColor = context.Overlay }); #if BENCHMARK } #endif #if BENCHMARK using (var handler = Benchmark.Instance.Start("Mask Draw")) { #endif var passCount = effect.Begin(); effect.BeginPass(0); effect.CommitChanges(); device.VertexDeclaration = effect.VertexDeclaration; device.SetStreamSource(context.Vertex.VertexBucket.VertexBuffer); device.DrawPrimitives(primitiveType, context.Vertex.Offset + startIndex, primitiveCount); effect.EndPass(); effect.End(); effect.SetTexture(textureHandle, null); #if BENCHMARK } #endif } }
public override void Draw(PPDDevice device, AlphaBlendContext context, PrimitiveType primitiveType, int primitiveCount, int startIndex, int vertexCount) { Matrix m = context.SRTS[0]; if (!context.WorldDisabled) { m *= device.World; } for (var i = 1; i <= context.SRTDepth; i++) { m = context.SRTS[i] * m; } if (IsMasking) { DrawMask(device, context, m, primitiveType, primitiveCount, startIndex, vertexCount); } else { if (context.BlendMode == BlendMode.Glass) { DrawGlass(device, context, m, primitiveType, primitiveCount, startIndex, vertexCount); } else { if (context.BlendMode == BlendMode.Normal && !context.Transparent && context.FilterCount == 0 && context.MaskTexture == null) { DrawNormalBlend(device, context, m, primitiveType, primitiveCount, startIndex, vertexCount); } else { using (var workspaceTexture = device.Workspace.Get()) { Flush(); #if BENCHMARK using (var handler = Benchmark.Instance.Start("Copy")) { #endif device.StretchRectangle(device.GetRenderTarget(), workspaceTexture); #if BENCHMARK } #endif DrawNotNormalBlend(device, context, m, workspaceTexture, primitiveType, primitiveCount, startIndex, vertexCount); } } } } }
private void DrawNormalBlend(PPDDevice device, AlphaBlendContext context, Matrix m, PrimitiveType primitiveType, int primitiveCount, int startIndex, int vertexCount) { #if BENCHMARK using (var handler = Benchmark.Instance.Start("Sprite Batch Draw")) { #endif if (context?.Vertex?.VertexBucket?.VertexBuffer is VertexBuffer vertexBuffer) { device.VertexDeclaration = effect.VertexDeclaration; ((DX9.PPDDevice)device).SpriteBatch.Draw(context.Texture, m, context.Alpha, context.Overlay, primitiveType, vertexBuffer.Vertices, context.Vertex.Offset + startIndex, vertexCount); } #if BENCHMARK } #endif }
private void DrawNotNormalBlend(PPDDevice device, AlphaBlendContext context, Matrix m, WorkspaceTexture workspaceTexture, PrimitiveType primitiveType, int primitiveCount, int startIndex, int vertexCount) { #if BENCHMARK using (var handler = Benchmark.Instance.Start("Effect Prepare")) { #endif effect.Technique = techniqueNames[new Tuple <BlendMode, bool, bool, ColorFilterType>(context.BlendMode, context.Texture != null && context.Texture.PA, context.MaskTexture != null, context.FilterCount == 0 ? ColorFilterType.None : context.Filters[context.FilterCount - 1].FilterType)]; effect.SetTexture(textureHandle, context.Texture); effect.SetTexture(lastRenderTargetTextureHandle, workspaceTexture.Texture); effect.SetTexture(maskTextureHandle, context.MaskTexture); if (context.FilterCount > 0) { effect.SetValue(filterInfoHandle, context.Filters[context.FilterCount - 1].ToFilterInfo()); } effect.SetValue(drawInfoHandle, new DrawInfo { Matrix = m, Alpha = context.Alpha, OverlayColor = context.Overlay }); #if BENCHMARK } #endif #if BENCHMARK using (var handler = Benchmark.Instance.Start("Draw")) { #endif var passCount = effect.Begin(); effect.BeginPass(0); effect.CommitChanges(); device.VertexDeclaration = effect.VertexDeclaration; device.SetStreamSource(context.Vertex.VertexBucket.VertexBuffer); device.DrawPrimitives(primitiveType, context.Vertex.Offset + startIndex, primitiveCount); effect.EndPass(); effect.End(); effect.SetTexture(textureHandle, null); #if BENCHMARK } #endif }
public abstract void Draw(PPDDevice device, AlphaBlendContext context, PrimitiveType primitiveType, int primitiveCount, int startIndex, int vertexCount);
internal void DrawInternal(PPDDevice device, AlphaBlendContext context, PrimitiveType primitiveType, int primitiveCount, int startIndex, int vertexCount) { alphaBlend.Draw(device, context, primitiveType, primitiveCount, startIndex, vertexCount); }
protected override void DrawImpl(PPDFramework.Shaders.AlphaBlendContext alphaBlendContext) { alphaBlendContext.Texture = resource.Texture; alphaBlendContext.Vertex = vertices; device.GetModule <AlphaBlend>().Draw(device, alphaBlendContext, PrimitiveType.TriangleStrip, 8, 0, vertices.Count); }
protected override bool OnCanDraw(PPDFramework.Shaders.AlphaBlendContext alphaBlendContext, int depth, int childIndex) { return(vertices != null && resource != null); }