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); } } }