예제 #1
0
    private void TranslucentRender()
    {
        GraphicsDeviceContext device = GraphicsDeviceContext.Instance;

        device.SetBlendState(Addition);
        device.SetRasterizerState(CullingOff);
        device.SetDepthStencilState(ZTestOnWriteOff);
        device.SetVertexBuffer(VertexPositionsBuffer, 0);
        device.SetVertexBuffer(VertexTexcoordsBuffer, 1);
        device.SetIndexBuffer(IndexBuffer);
        device.SetVertexLayout(VertexLayout);
        device.SetPrimitiveTopology(PrimitiveTopology.TriangleList);
        device.SetVertexShader(VertexShader);
        device.SetPixelShader(PixelShader);

        PixelShader.SetSamplerState(Wrap, 0);
        PixelShader.SetTexture(Texture, 0);

        if (this.Power > 0.9f)
        {
            var physics   = this.Owner.Get <PhysicsComponent>();
            var transform = this.Owner.Get <TransformComponent>();
            var angular   = new Vector4(physics.AngularVelocity, 0) * transform.Matrix.Inverse;

            {
                var       offsetPosition = this.OffsetPosition;
                Matrix4x3 adjustment     = new Matrix4x3();
                adjustment.Identity();
                adjustment.Translate(offsetPosition);
                adjustment.RotateX(clamp((-angular.X * 2 + angular.Z * 0.5f) * 5, -0.2f, 0.2f));
                adjustment.Scale(normal(1.7f, 0.1f), normal(1.7f, 0.1f), normal(3.8f, 0.1f) * (this.Power - 0.9f) / 0.1f);

                VertexShader.SetConstantBuffer(adjustment * WVPMatrix, 0);
                device.DrawIndexed(IndexBuffer.Count);
            }

            if (this.OffsetPosition.X != 0)
            {
                var offsetPosition = this.OffsetPosition;
                offsetPosition.X *= -1;

                Matrix4x3 adjustment = new Matrix4x3();
                adjustment.Identity();
                adjustment.Translate(offsetPosition + new Vector3(0, 0, 0.5f));
                adjustment.RotateX(clamp((-angular.X * 2 - angular.Z * 0.5f) * 5, -0.2f, 0.2f));
                adjustment.Scale(normal(1.7f, 0.1f), normal(1.7f, 0.1f), normal(3.8f, 0.1f) * (this.Power - 0.9f) / 0.1f);

                VertexShader.SetConstantBuffer(adjustment * WVPMatrix, 0);
                device.DrawIndexed(IndexBuffer.Count);
            }
        }
    }