Пример #1
0
        /// <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);
        }
Пример #2
0
            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);
                        }
                }
            }
Пример #3
0
 /// <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);
     }
 }
Пример #4
0
            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
            }
Пример #5
0
 /// <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);
 }
Пример #6
0
            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
                }
            }
Пример #7
0
            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);
                            }
                        }
                    }
                }
            }
Пример #8
0
            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
            }
Пример #9
0
            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
            }
Пример #10
0
 public abstract void Draw(PPDDevice device, AlphaBlendContext context, PrimitiveType primitiveType, int primitiveCount, int startIndex, int vertexCount);
Пример #11
0
 internal void DrawInternal(PPDDevice device, AlphaBlendContext context, PrimitiveType primitiveType, int primitiveCount, int startIndex, int vertexCount)
 {
     alphaBlend.Draw(device, context, primitiveType, primitiveCount, startIndex, vertexCount);
 }
Пример #12
0
 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);
 }
Пример #13
0
 protected override bool OnCanDraw(PPDFramework.Shaders.AlphaBlendContext alphaBlendContext, int depth, int childIndex)
 {
     return(vertices != null && resource != null);
 }