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