예제 #1
0
        internal static void InitDeviceResources(GraphicsDevice device)
        {
            if (charRenderTargets.Count > 0)
            {
                return;
            }

            effectCache = new EffectCache <EffectParams>();
            effectCache.Load(Effect);

            vertexBuf = new VertexBuffer(device, typeof(VertexPositionTexture), 4, BufferUsage.WriteOnly);
            VertexPositionTexture[] verts = new VertexPositionTexture[4] {
                new VertexPositionTexture(new Vector3(0, 0, 0), new Vector2(0, 0)),
                new VertexPositionTexture(new Vector3(0, 0, 0), new Vector2(1, 0)),
                new VertexPositionTexture(new Vector3(0, 0, 0), new Vector2(1, 1)),
                new VertexPositionTexture(new Vector3(0, 0, 0), new Vector2(0, 1)),
            };
            vertexBuf.SetData <VertexPositionTexture>(verts);

            y_margin = 0;

            char[] crtChars = new char[] { '-', '+', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };

            foreach (char crtChar in crtChars)
            {
                CharRenderTarget crt = CharRenderTarget.Create(crtChar);
                charRenderTargets.Add(crtChar, crt);
            }
        }
예제 #2
0
        private static void RenderEffect(ScoreEffect scoreEffect, Camera camera, Vector3 forward)
        {
            if (scoreEffect.crts == null)
            {
                return;
            }

            GraphicsDevice device = BokuGame.bokuGame.GraphicsDevice;

            Vector3 diff = scoreEffect.curr - camera.ActualFrom;
            float   dist = diff.Length();

            Parameter(EffectParams.ScoreAlpha).SetValue(scoreEffect.alpha);
            Parameter(EffectParams.ScoreColor).SetValue(Classification.ColorVector4(scoreEffect.color));
            Parameter(EffectParams.ScoreColorDarken).SetValue(kScoreColorDarken);

            device.SetVertexBuffer(vertexBuf);
            device.Indices = UI2D.Shared.QuadIndexBuff;

            Matrix translation = new Matrix();
            Matrix world       = Matrix.CreateBillboard(
                scoreEffect.curr,
                camera.ActualFrom,
                camera.ViewUp,
                forward);

            float distanceScalar = kEffectScalar * dist;
            float offset         = 0;

            for (int i = 0; i < scoreEffect.crts.Length; ++i)
            {
                CharRenderTarget crt = scoreEffect.crts[i];

                if (i > 0)
                {
                    offset += crt.charWidth / 2;
                }

                translation = Matrix.CreateTranslation(world.Left * offset * distanceScalar);
                Matrix worldViewProj = world * translation * camera.ViewMatrix * camera.ProjectionMatrix;

                Vector2 scoreSize = new Vector2(crt.surface.Width, crt.surface.Height) * distanceScalar;

                Parameter(EffectParams.WorldViewProj).SetValue(worldViewProj);
                Parameter(EffectParams.ScoreSize).SetValue(scoreSize);
                Parameter(EffectParams.ScoreTexture).SetValue(crt.surface);

                Effect.CurrentTechnique.Passes[0].Apply();

                device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, 4, 0, 2);

                offset += crt.charWidth / 2;
            }
        }
예제 #3
0
            public static CharRenderTarget Create(char ch)
            {
                int shadowOffset = Scoreboard.ShadowOffset;

                CharRenderTarget target = new CharRenderTarget();

                target.ch         = ch;
                target.charWidth  = shadowOffset + (int)ScoreBoardFont().MeasureString(String.Format("{0}", ch)).X;
                target.charHeight = shadowOffset + ScoreBoardFont().LineSpacing;

                target.CreateRenderTargets(BokuGame.bokuGame.GraphicsDevice);

                return(target);
            }