예제 #1
0
        private void AddRenderArrow(RenderBuffer renderBuffer,
                                    Pointd fromPoint, Pointd toPoint,
                                    double priorityRate, Color color)
        {
            var diff      = toPoint - fromPoint;
            var length    = diff.Distance;
            var lengthMax = SquareSize.Width * 5.0;

            // 距離が近いものほど小さくなる
            var lengthRate = Math.Min(length, lengthMax) / lengthMax;

            var rad       = Math.Atan2(diff.Y, diff.X);
            var transform = new Matrix44d();

            transform.Translate(fromPoint.X, fromPoint.Y, 1.0);
            transform.Rotate(rad - Math.PI / 2, 0, 0, 1);
            transform.Scale(
                SquareSize.Width *
                MathEx.InterpLiner(0.8, 0.8, lengthRate) *
                MathEx.InterpLiner(0.8, 0.2, priorityRate),
                length, 1.0);

            // 矢印の不透明度を更新
            var newColor = Color.FromArgb(ArrowAlpha(priorityRate), color);

            // 矢印の中身を描画
            renderBuffer.AddRender(
                BlendType.Diffuse, newColor,
                CreateArrowMesh(length, priorityRate, false),
                transform, ShogiZOrder.PreEffectZ - priorityRate);

            // 矢印のアウトラインを描画
            renderBuffer.AddRenderAction(
                () =>
            {
                GL.Color4(newColor.R, newColor.G, newColor.B, (byte)(newColor.A + 50));
                GL.LineWidth(0.5f);
                GL.LoadMatrix(transform.AsColumnMajorArray);

                var mesh2 = CreateArrowMesh(length, priorityRate, true);
                GL.Begin(PrimitiveType.LineLoop);
                mesh2.VertexArray.ForEach(_ => GL.Vertex3(_.X, _.Y, _.Z));
                GL.End();
            },
                ShogiZOrder.PreEffectZ - priorityRate);
        }