HISE Logo Forum
    • Categories
    • Register
    • Login

    Spectrum ballistic (display buffer)

    Scheduled Pinned Locked Moved Unsolved General Questions
    52 Posts 7 Posters 3.7k Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • LindonL
      Lindon @Christoph Hart
      last edited by

      @Christoph-Hart said in Spectrum ballistic (display buffer):

      @ustk Yes I've added this recently. if you click on the edit button (where you can assign an external slot), you can see a new entry called "Edit properties". This opens a JSON editor that lets you change the properties:

      6f72eb4e-d2b9-4494-9801-2b893c936339-image.png

      Be aware that these properties are not stored in the network, but you can set them programmatically using the scripting API:

      // only works with ring buffers that you have registered as external.
      const var dp = Engine.createAndRegisterRingBuffer(0);
      
      const var mySpecialProperties = {
        "BufferLength": 4096,
        "WindowType": "Triangle",
        "DecibelRange": [
          -90.0,
          0.0
        ],
        "UsePeakDecay": false,
        "UseDecibelScale": true,
        "YGamma": 1.8,
        "Decay": 0.2,
        "UseLogarithmicFreqAxis": true
      };
      
      dp.setRingBufferProperties(mySpecialProperties);
      

      Can I apply these setting to an EQ displaying in a FloatingTile (not in ScriptNode)?

      HISE Development for hire.
      www.channelrobot.com

      Matt_SFM 1 Reply Last reply Reply Quote 0
      • Matt_SFM
        Matt_SF @Lindon
        last edited by

        @Lindon I think I've done it recently (just for testing). I've simply copy/pasted the JSON datato the empty floating tile data.

        Develop branch
        Win10 & VS17 / Ventura & Xcode 14. 3

        DanHD 1 Reply Last reply Reply Quote 0
        • DanHD
          DanH @Matt_SF
          last edited by DanH

          @Matt_SF you mean like this?

          Screenshot 2022-09-20 at 13.14.01.png

          DHPlugins / DC Breaks | Artist / Producer / DJ / Developer
          https://dhplugins.com/ | https://dcbreaks.com/
          London, UK

          Matt_SFM 1 Reply Last reply Reply Quote 0
          • Matt_SFM
            Matt_SF @DanH
            last edited by

            @DanH I think so, it's been a while and I didn't spent much time on it 😅

            Develop branch
            Win10 & VS17 / Ventura & Xcode 14. 3

            DanHD 1 Reply Last reply Reply Quote 0
            • DanHD
              DanH @Matt_SF
              last edited by

              @Matt_SF ok thanks! Doesn't do anything for me sadly...

              DHPlugins / DC Breaks | Artist / Producer / DJ / Developer
              https://dhplugins.com/ | https://dcbreaks.com/
              London, UK

              Matt_SFM 3 Replies Last reply Reply Quote 0
              • Matt_SFM
                Matt_SF @DanH
                last edited by

                @DanH I'll try again in a minute, I'm just compiling the last commit

                Develop branch
                Win10 & VS17 / Ventura & Xcode 14. 3

                1 Reply Last reply Reply Quote 0
                • Matt_SFM
                  Matt_SF @DanH
                  last edited by

                  @DanH Yep you're right, it's not working... Maybe I'm confusing this with something else I did... If I come up with a solution I'll post it here.

                  Develop branch
                  Win10 & VS17 / Ventura & Xcode 14. 3

                  1 Reply Last reply Reply Quote 0
                  • Matt_SFM
                    Matt_SF @DanH
                    last edited by

                    @DanH @Lindon this is one way to do it, but it uses a scriptnode analyzer :

                    HiseSnippet 1487.3oc2XstaaaCElJNpaw8BVGJF1OEJ1OT.RMr2Z6FPQQcrSbavZR8hSSGPwP.iDsMWnH0jnSh6PA1O2i0dD1ivdD5av14PJYIk3kk5s1ATmzByyEpOdt7cnR+DU.KMUkPbVYuowLhy0bGLUpG2cLkKIasAw4FtaSS0rDOqnNSiooorPhiSsGiBbVYYh4yadTGpfJCXEhHj8U7.1S4Qbcgz9s+VtPziFx1iGUx561dq.krqRnl.3olaSRLM3H5H1NTzrkbINWYyPtVkLPS0rThyxcTgSGLVchzZ+97T9gBFtnEY.rQVw8ThPDw32IcGyEg8yO2oDhia+hnPMaT3VtayC4yjWDM9DiBuBOJGObVpJ7pUAdsJCulkf2bfjSIHsrER2zcPPBOVWnAwyUc2RBImgTHrWFJVaIK8vZtcUfERciH5QrdIvhYd3e+lMWyC9uUeP85PnOU6cLMwKVJVWRESeEjzenWt6iX5tpnXkDV3e6R1bav6BmoYRG.Iw.F3uobB8dCdZrfNsyjgCyU6eaZoModoMsQHUSabnw1lvtTcaO214aNBU1fTltOj0z6pln4Rl+vIx.MWI8GsZ8et9JiPCr0Z9MOsWuVMwefcAzLDJOA2jPQytr.MUNRv70i4o3y8op.pnCpMEdpP3qQlWU2O6GqlvD5I8o5w18vbxhgkPr+kv+fey26WvCAqVsPvSX7Qi09q9Cq40x7bd87NmXaTRWpPbHzuTbPMmyy7HgPYgjrvaifDFTvZP3aAfd4c.HYvkwk6zZFHsOzDVLF+8yPcELqoIVT625dq9fbD6oj6nzrmkA85utt2YUMb3b0gEoIJg.1v4o19nt.G8kShNjkrFTBKlvlYHz7Usi18uuitLgSfsmojgJ4VRt9Ywrr0mummj0nAe64asAjdPZfLYfcwrDMGgfyFriANUKovJtavRORqhM1l0cBzjZi1qmSYPkLAgGhRJkFHmNi682Nr8zYK9kuq8IXdelf+XR6wl79LIs+w1jySQAjipvIBptJiINlHSADzqPSgTQxTtdZ4wHmkFc4KGMZAK+bCuWR3dS29bcv34i2klCdgzz6Z7lMT55taB8qA5Bvtrauu+Bm.8VCk+woQtVrTOqzBd9HPp6lSPWAN6LIpBMM1A43.GtrwSN+paQyXLRXjv1S0Gr2OkFEKX6BGi07NTnBNZ.+Ury2AGaQVGzB+fwTITomtHM5W4RO5t0EN5lXm2LZapNgCMXtPLvNzpaF5vXvRX+tccSbMVFMfICMK9S3SlxVyBXfxV4JKQUrCSehJ4HSVJ66vYASIWyM0DjOX3osHqKDpSPBBdVQMjbLx5qDSiGqj7.Tj0hbjtdDLkSmC2mPS2ixEXWv9PlzrIejayFvOPGvNpPH331iF.Awo3nDrUB4AgZUfwOXVMaEbUoXA1h7K+YiH.bhL7Y3U+pUhDzVRhqfFwkr65Vo6iZggyj8wbKBTBtm1XiEenottCGpIUP50skuorFnpEETnJnl8zbx6yT5eVIHxgqXbZ9FuITXFBsgF2yyz8oIvke0LKkP4EcTpihnlT+BMvnLAyMrJup6.HYYtvlIU8Yl0dufdLy6wLHMhTkstfWA32uruBP7k9U.dFb+qiY6kPkowpzJa7.VDeOXhWZYgOOEtjK6m1EKyKKuqhlLWUu4Q8fC4b8Y.UOIwzuj2JThzu1klosLgQ0YgkreNztK+t58RduNP8e+7++adMpUxw3.N1kto7Xl.ZRLX7SgthgzIBctzpE4aqjpbRxhJfcY.C+nQXibA1m6AZcsFtXdgja0dWlfQKWM+EseJTERS11vSsPwhVu0uR4byWetqEtdXmo2GF2aq1G72aq0+WWE48wyHhFjnNHvdCNrV9iMRfysz7WFZE2sw0dsHGam76h2KgDALhGDDfg66.wm46yWt.97UKfO2cA74dKfO2eA74qW.e9lKzGbXz5SzpHaqHHn+l1603rojBUxlpdxeA7SAq9M
                    

                    You'll have to thank @ustk for his previous R&D on the matter :)

                    Develop branch
                    Win10 & VS17 / Ventura & Xcode 14. 3

                    LindonL DanHD 2 Replies Last reply Reply Quote 0
                    • LindonL
                      Lindon @Matt_SF
                      last edited by

                      @Matt_SF said in Spectrum ballistic (display buffer):

                      @DanH @Lindon this is one way to do it, but it uses a scriptnode analyzer :

                      HiseSnippet 1487.3oc2XstaaaCElJNpaw8BVGJF1OEJ1OT.RMr2Z6FPQQcrSbavZR8hSSGPwP.iDsMWnH0jnSh6PA1O2i0dD1ivdD5av14PJYIk3kk5s1ATmzByyEpOdt7cnR+DU.KMUkPbVYuowLhy0bGLUpG2cLkKIasAw4FtaSS0rDOqnNSiooorPhiSsGiBbVYYh4yadTGpfJCXEhHj8U7.1S4Qbcgz9s+VtPziFx1iGUx561dq.krqRnl.3olaSRLM3H5H1NTzrkbINWYyPtVkLPS0rThyxcTgSGLVchzZ+97T9gBFtnEY.rQVw8ThPDw32IcGyEg8yO2oDhia+hnPMaT3VtayC4yjWDM9DiBuBOJGObVpJ7pUAdsJCulkf2bfjSIHsrER2zcPPBOVWnAwyUc2RBImgTHrWFJVaIK8vZtcUfERciH5QrdIvhYd3e+lMWyC9uUeP85PnOU6cLMwKVJVWRESeEjzenWt6iX5tpnXkDV3e6R1bav6BmoYRG.Iw.F3uobB8dCdZrfNsyjgCyU6eaZoModoMsQHUSabnw1lvtTcaO214aNBU1fTltOj0z6pln4Rl+vIx.MWI8GsZ8et9JiPCr0Z9MOsWuVMwefcAzLDJOA2jPQytr.MUNRv70i4o3y8op.pnCpMEdpP3qQlWU2O6GqlvD5I8o5w18vbxhgkPr+kv+fey26WvCAqVsPvSX7Qi09q9Cq40x7bd87NmXaTRWpPbHzuTbPMmyy7HgPYgjrvaifDFTvZP3aAfd4c.HYvkwk6zZFHsOzDVLF+8yPcELqoIVT625dq9fbD6oj6nzrmkA85utt2YUMb3b0gEoIJg.1v4o19nt.G8kShNjkrFTBKlvlYHz7Usi18uuitLgSfsmojgJ4VRt9Ywrr0mummj0nAe64asAjdPZfLYfcwrDMGgfyFriANUKovJtavRORqhM1l0cBzjZi1qmSYPkLAgGhRJkFHmNi682Nr8zYK9kuq8IXdelf+XR6wl79LIs+w1jySQAjipvIBptJiINlHSADzqPSgTQxTtdZ4wHmkFc4KGMZAK+bCuWR3dS29bcv34i2klCdgzz6Z7lMT55taB8qA5Bvtrauu+Bm.8VCk+woQtVrTOqzBd9HPp6lSPWAN6LIpBMM1A43.GtrwSN+paQyXLRXjv1S0Gr2OkFEKX6BGi07NTnBNZ.+Ury2AGaQVGzB+fwTITomtHM5W4RO5t0EN5lXm2LZapNgCMXtPLvNzpaF5vXvRX+tccSbMVFMfICMK9S3SlxVyBXfxV4JKQUrCSehJ4HSVJ66vYASIWyM0DjOX3osHqKDpSPBBdVQMjbLx5qDSiGqj7.Tj0hbjtdDLkSmC2mPS2ixEXWv9PlzrIejayFvOPGvNpPH331iF.Awo3nDrUB4AgZUfwOXVMaEbUoXA1h7K+YiH.bhL7Y3U+pUhDzVRhqfFwkr65Vo6iZggyj8wbKBTBtm1XiEenottCGpIUP50skuorFnpEETnJnl8zbx6yT5eVIHxgqXbZ9FuITXFBsgF2yyz8oIvke0LKkP4EcTpihnlT+BMvnLAyMrJup6.HYYtvlIU8Yl0dufdLy6wLHMhTkstfWA32uruBP7k9U.dFb+qiY6kPkowpzJa7.VDeOXhWZYgOOEtjK6m1EKyKKuqhlLWUu4Q8fC4b8Y.UOIwzuj2JThzu1klosLgQ0YgkreNztK+t58RduNP8e+7++adMpUxw3.N1kto7Xl.ZRLX7SgthgzIBctzpE4aqjpbRxhJfcY.C+nQXibA1m6AZcsFtXdgja0dWlfQKWM+EseJTERS11vSsPwhVu0uR4byWetqEtdXmo2GF2aq1G72aq0+WWE48wyHhFjnNHvdCNrV9iMRfysz7WFZE2sw0dsHGam76h2KgDALhGDDfg66.wm46yWt.97UKfO2cA74dKfO2eA74qW.e9lKzGbXz5SzpHaqHHn+l1603rojBUxlpdxeA7SAq9M
                      

                      You'll have to thank @ustk for his previous R&D on the matter :)

                      sadly not a path I can go down now...

                      HISE Development for hire.
                      www.channelrobot.com

                      1 Reply Last reply Reply Quote 0
                      • DanHD
                        DanH @Matt_SF
                        last edited by

                        @Matt_SF Thanks. A potential solution perhaps. It's still glitchy like @ustk pointed to originally and I'm still not crazy about the blocky lines 😆 Any chance of reinstating the old Analyser on top of these or adding a curvier Window Type @Christoph-Hart ?

                        DHPlugins / DC Breaks | Artist / Producer / DJ / Developer
                        https://dhplugins.com/ | https://dcbreaks.com/
                        London, UK

                        1 Reply Last reply Reply Quote 0
                        • ustkU
                          ustk
                          last edited by ustk

                          @Christoph-Hart This bug hasn't been yet resolved... Is it still the best way to draw a buffer, or something replaced it?

                          This topic from above seems the best example for reproducing it:
                          https://forum.hise.audio/topic/5791/spectrum-ballistic-display-buffer/17

                          Can't help pressing F5 in the forum...

                          1 Reply Last reply Reply Quote 2
                          • ustkU
                            ustk
                            last edited by

                            @Christoph-Hart Any idea to sort this out?

                            Can't help pressing F5 in the forum...

                            1 Reply Last reply Reply Quote 0
                            • ustkU
                              ustk
                              last edited by ustk

                              Has anyone ever released a product that uses a buffer drawing, or am I the only one counting on it at the moment?

                              Can't help pressing F5 in the forum...

                              Matt_SFM DanHD 2 Replies Last reply Reply Quote 0
                              • Matt_SFM
                                Matt_SF @ustk
                                last edited by

                                @ustk I'm working on a project - far from being released - but I sure am counting on this one :)

                                Develop branch
                                Win10 & VS17 / Ventura & Xcode 14. 3

                                1 Reply Last reply Reply Quote 1
                                • DanHD
                                  DanH @ustk
                                  last edited by

                                  @ustk said in Spectrum ballistic (display buffer):

                                  Has anyone ever released a product that uses a buffer drawing, or am I the only one counting on this at the moment?

                                  My current update uses the parametric EQ’s analyser with laf and source code tweaks because drawing the analyser in a panel was buggy. I would love this to be fixed however.

                                  DHPlugins / DC Breaks | Artist / Producer / DJ / Developer
                                  https://dhplugins.com/ | https://dcbreaks.com/
                                  London, UK

                                  1 Reply Last reply Reply Quote 1
                                  • ustkU
                                    ustk
                                    last edited by ustk

                                    @Christoph-Hart Even coming back after months here I still feel like a beggar asking for fixes and this is very frustrating... This would make a great Christmas present though!

                                    Can't help pressing F5 in the forum...

                                    1 Reply Last reply Reply Quote 5
                                    • ustkU
                                      ustk
                                      last edited by

                                      @Christoph-Hart Bumpy bump

                                      Can't help pressing F5 in the forum...

                                      Christoph HartC 1 Reply Last reply Reply Quote 0
                                      • Christoph HartC
                                        Christoph Hart @ustk
                                        last edited by Christoph Hart

                                        The problem with your snippet is that there is no synchronization between your slow Hisescript loop that creates the path and the audio thread that pushes new signals to the FFT - this is why I added the special createPath() method (that also tries to reduce the path points to optimize the drawing performance).

                                        If I use the ScriptRingBuffer.createPath() method the artifacts will disappear completely and I can render it with 30fps.

                                        HiseSnippet 2245.3ocyYEzaajaElx1TNRqSPVffhdbpwdPAvqxLxxN1cQajksksPrcDr75cMBVDPMCkDgmYn5LTwVcQ.ROz+.81dq+B58dK+E5Oidp6+fzGImQyLxRwxt6FTYaLhju2ie7wG+dONtU.2lFFxCP4Jb1nATTtUvsG4K5uaeByG0bOTteCtQiyLpOraWZfwdAjqX98L1.Uez.RXH0AkK2hGHkMWgkPpO+7KpSbI91zjtPny4La5QLOlHo2V0dIy0sAwgdFyKkzUq0zl6uK2kODv0hXSz.h8kjdzSHRwV.ixkeeGlfGzVPDzPTtkpycF0tO+Jes7myBYcboxFVn1fgzc2f65HQrrWzt8YtNshW+gHvJsR7FKp8FOAeLygMt+DuxiUCXjnQZ+QtExBuEy.OqzvyLE7lBjxkBRXMj9Rba6.1.QxHR77E3l9BZPWB31SCkSF5sGKbfKYjdGDPCN2BfSVaDzB+0Ew6xAU8Ek8HWRaD.MFapRVULMWyXSSym9MEAwB4tzx1tTRPInihvtTnv3sj.iVDepqkwevH1V8nhc4dC39PiRqpGdUPmDUBgcWaJnhJdSpPFf1VMboU03znw2qTun1RkcHBR4NJAMASns0MrQIIrSqw.hnuYJTZGPgcnVPux0S.smgzllv7DqVHUzB1yEmxGJX9zRcG5aKXb+R8dZwerXgdRAzQpkzOBKyCH98nf8fQcfyKJyK5yBSgg0LdM7G7qpe.2eGyQBhjNNjx50WT5o+.HV4MjKj2IW+oAl7TSvtDW2NvwiDjo.1ydlZk.q0jYNxeIs9ozP1el5D4lrLqTcMCKIjuEsHwpHksXA49XmtSSb0v5elXoCR2oaZOe7J9HtMwsNenuSHrwI8PkAGjUYsi5qsTdBym9MorZ.cfbyoTj2I10HHAZmSo0M0NsnOw9HCt+IbA8UQNqhuqnwjC0s6TGSF4DvccktfoLrdV+DJVxenWGZvZvQ.2gzwBBjOYoLvylxHMilsNPNkfb+l9LwqFP8mEOGJJ5G9121bOXeQxyD0GH2.ZffIgPt8nuEHs0rNEv6QCuTvGnjM5fMvCKTi9vXNI4F.hALOO.q2LPWmlWeT5FWIC4G2gweqVeUH+3dd+eoFJE82RZf.DubmgtDQV1XYJnnA.+cFJPIaleHSLJcJpewnnmWH9k3VLgc+oiwElBFgckeMvXThsGh2GNmZKR.3R3Fe+mgrX40yewnHFXNkS9J3Dd9IyecFAlEUdqbvR4VSn8uV.mJKiOU.DN662CHuiHc1KbvITwU7fKKsZnRo2z8ZU1EPXIuZCdvUj.mnSrgmwaQBfJOfbhgk5RbCoYy8cZcyImhc7cNk1iEBpbJTtTprQoUyZ9TyJ6z4Mp8.pMi3lbVEryOVzvXUsBGQ86I5u5u2XKqsqr1yd15Ud9laslb7ui46vuRtA.itZcWHsgGw2+PRP.KbUkH6AltC08TYJLPnWC8Y.bulRtX02gu.O+AkveaHsEkbInCYDHrx2DOPjgZCb5RCIBFpG5hCHddDnGKsEWMVaHKWrtGw6QBXh9dL6FAz+zNWCnSahhuC7EfCWtMk3hR7Dklh2Abefu9NpwjILFHS0DPgXAHxqTHwafK8TXKaMiNtb6KaCYSuIq+.cXecoDkr6CtZpa38I4P949jn0mlHPWFSuiIh.FvLigSS5Bs1MBcwmlhZaJaK4hZS8cTM9H7IZPq3yjxAshGLI8Rt7QqK.NhHlQ8oTHCRGdc90pTEOF2IUb6tcPpUeBQ3usFZtryivWMN99lV4w2zJOJxJscYNz.kMVAqJd6H9K8ugEt3C2AKbHaJVHJ26sXgu.qOiLMCLWKhkwNxyTYT9u+S+z+9EnHdOIm7BQeG1kzDvITgnyAlNYFJvRvw8xlncbc4WIS6yhxcALyp9ZwcGMnO2mYK6RKQbrzNdPsbh3.pCIgmQXtxjcvbyc.fgaPrgn5Qxp.kIHkEy.YinAksGmUJCtRRLHCukFI9Rh5fTX98TkkHuh3hxwUWqKZ1zliGZCW5TlaFcioOfVN0v2sYSt1coWGWO0D4nlrGncSeG50xzteMTjVRFF4wlwsfo5Xl+458Qrby.cL45wsqBsaKnCjrOx1.kpxokWV.BEkQOTJilOwn4wUxZ0BPGlR59TV9IfErL0erptsok0l.OykzqzdPs.Upr81lU2XyJUVu5VOeqMhtVpj.eH02dTLbJrzG+3yvHzaqgl05zJChxis1bFKzUTl23TYPIJi5n40GZMSe3A.Y6rM5R2lQkFYYbq9jvOwNwbYk7ppamDJIUpiPohvw3tcEYCseHl3SbGERKKG5ySXsJ+S5n5YB37R.a8+CH151Qbd8tp5UfjExqf8fm5WNxDHN8qc5VP+BYHBxc2i2zcMQ7V50wLWgppzksf6frf9vUyvykiBkvEaQfJuNmCUMpRhfxlCIOFpNQ7qd1ibye1iHDcuxa7+tm5dc657otc8CtKUMk5h1eU5KZ+U07HxR8xkGZvDTOXx+cX4q7oXEypaUrp41aVTdUghVat9VUKptt.J6kye+qm7x4n+nrTj4BoSTW1rv4Iw3b4DbVCeJbGUndJWZwIttRwCgZjfRYgm99EeIgERCJdV.SKbCHR6LvcdGWFOZ9JLL0RfkdIzrlGywwk1hCWkWEnGOwm8gvw4XhqG6e9Buzu17K9fZ8O127gPX+UUjN1voNxSEzKCTT2q51WYMqInWKj2z9zcN4f8MN5UHGZWxPWw4Sot1wtfGNeU1NKW.BMCW.pxs5Bd+4YcAHzuvtfCahRuTKLWkfmBPilXklFr0hlqB3KLNXmiOdmY3sQyJFA8yobFJeSZrt7sVs+rvYyZI378O4e7edwTvk51AZ7uLdu82cmK97bUQOhc.+M1QunEfo7Apd.RXe0+pmB3iksMrhuKiNiF3AYuw1Nt34oqSk6gNqeOzo58PmMtG5r48PmmeOzYqOoNx+qW6LTv8zYxgNZsuJKWtb66KeQcp2ZG5+B7.yn4C
                                        

                                        Edit: the second example you posted somehow creates the glitches with the createPath method too. I'll check again if I can spot something.

                                        Christoph HartC 1 Reply Last reply Reply Quote 0
                                        • Christoph HartC
                                          Christoph Hart @Christoph Hart
                                          last edited by

                                          Alright I think I solved it.

                                          The problem was indeed a multithreading issue, but not between reading and writing (this was already handled), but between reading into the buffer and then applying the FFT. The createPath() could be called between those steps and then you would get some glitch values (I could reproduce it very reliably in Debug mode with the 32768 sample size).

                                          I've fixed it now so it should not glitch anymore, but I might have to do a bit of profiling to find out whether the two threads wait on each other for too often.

                                          ustkU 2 Replies Last reply Reply Quote 5
                                          • ustkU
                                            ustk @Christoph Hart
                                            last edited by ustk

                                            @Christoph-Hart It's building at the moment so I'll test this right away.
                                            Your snippet using createPath() strangely crashes (before I could test the fix commit at least), but this might be because I was compiling at the same time, it's strange nonetheless...

                                            The reason I don't use createPath() is because I want to perform my own interpolation in order to smoothing out the blocky look of the path. I remember looking to add a smoothing option to the method and not succeeding, but I might try again since this would be way more efficient if made natively rather than in a paint routine...

                                            Can't help pressing F5 in the forum...

                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            22

                                            Online

                                            1.7k

                                            Users

                                            11.8k

                                            Topics

                                            103.2k

                                            Posts