@@ -1686,6 +1686,119 @@ suite('p5.RendererGL', function() {
16861686 done ( ) ;
16871687 } ) ;
16881688
1689+ test ( 'TESS mode prompts user before tessellating >50k vertices' , function ( done ) {
1690+ var renderer = myp5 . createCanvas ( 10 , 10 , myp5 . WEBGL ) ;
1691+ var confirmStub = sinon . stub ( window , 'confirm' ) . returns ( false ) ;
1692+
1693+ renderer . beginShape ( myp5 . TESS ) ;
1694+ for ( let i = 0 ; i < 60000 ; i ++ ) {
1695+ renderer . vertex ( i % 100 , Math . floor ( i / 100 ) , 0 ) ;
1696+ }
1697+ renderer . endShape ( ) ;
1698+
1699+ assert . isTrue (
1700+ confirmStub . called ,
1701+ 'window.confirm should be called when vertex count exceeds threshold'
1702+ ) ;
1703+ assert . isTrue (
1704+ confirmStub . args [ 0 ] [ 0 ] . includes ( '60000' ) ,
1705+ 'confirm message should include the actual vertex count'
1706+ ) ;
1707+ // Shape mode must NOT be changed to TRIANGLE_FAN — draw nothing on cancel
1708+ assert . notEqual (
1709+ renderer . immediateMode . shapeMode ,
1710+ myp5 . TRIANGLE_FAN ,
1711+ 'Shape mode should not fall back to TRIANGLE_FAN when user cancels'
1712+ ) ;
1713+
1714+ confirmStub . restore ( ) ;
1715+ done ( ) ;
1716+ } ) ;
1717+
1718+ test ( 'TESS mode only prompts once when user approves large tessellation' , function ( done ) {
1719+ var renderer = myp5 . createCanvas ( 10 , 10 , myp5 . WEBGL ) ;
1720+ var confirmStub = sinon . stub ( window , 'confirm' ) . returns ( true ) ;
1721+ var tessellateStub = sinon . stub ( renderer , '_tesselateShape' ) ;
1722+
1723+ renderer . beginShape ( myp5 . TESS ) ;
1724+ for ( let i = 0 ; i < 60000 ; i ++ ) {
1725+ renderer . vertex ( i % 100 , Math . floor ( i / 100 ) , 0 ) ;
1726+ }
1727+ renderer . endShape ( ) ;
1728+
1729+ assert . equal ( confirmStub . callCount , 1 , 'confirm should be called once on first large shape' ) ;
1730+ assert . isTrue (
1731+ renderer . _largeTessellationAcknowledged ,
1732+ '_largeTessellationAcknowledged should be set after user approves'
1733+ ) ;
1734+
1735+ renderer . beginShape ( myp5 . TESS ) ;
1736+ for ( let i = 0 ; i < 60000 ; i ++ ) {
1737+ renderer . vertex ( i % 100 , Math . floor ( i / 100 ) , 0 ) ;
1738+ }
1739+ renderer . endShape ( ) ;
1740+
1741+ assert . equal ( confirmStub . callCount , 1 , 'confirm should not be called again after acknowledgement' ) ;
1742+
1743+ confirmStub . restore ( ) ;
1744+ tessellateStub . restore ( ) ;
1745+ done ( ) ;
1746+ } ) ;
1747+
1748+ test ( 'TESS mode skips prompt when p5.disableFriendlyErrors is true' , function ( done ) {
1749+ var renderer = myp5 . createCanvas ( 10 , 10 , myp5 . WEBGL ) ;
1750+ var confirmStub = sinon . stub ( window , 'confirm' ) . returns ( false ) ;
1751+ var tessellateStub = sinon . stub ( renderer , '_tesselateShape' ) ;
1752+ p5 . disableFriendlyErrors = true ;
1753+
1754+ renderer . beginShape ( myp5 . TESS ) ;
1755+ for ( let i = 0 ; i < 60000 ; i ++ ) {
1756+ renderer . vertex ( i % 100 , Math . floor ( i / 100 ) , 0 ) ;
1757+ }
1758+ renderer . endShape ( ) ;
1759+
1760+ assert . isFalse (
1761+ confirmStub . called ,
1762+ 'window.confirm should not be called when p5.disableFriendlyErrors is true'
1763+ ) ;
1764+ assert . isTrue (
1765+ tessellateStub . called ,
1766+ 'tessellation should proceed without prompt when p5.disableFriendlyErrors is true'
1767+ ) ;
1768+
1769+ p5 . disableFriendlyErrors = false ;
1770+ confirmStub . restore ( ) ;
1771+ tessellateStub . restore ( ) ;
1772+ done ( ) ;
1773+ } ) ;
1774+
1775+ test ( 'TESS mode works normally for <50k vertices' , function ( done ) {
1776+ var renderer = myp5 . createCanvas ( 10 , 10 , myp5 . WEBGL ) ;
1777+ var confirmStub = sinon . stub ( window , 'confirm' ) . returns ( false ) ;
1778+
1779+ // use a simple shape that tessellates quickly
1780+ renderer . beginShape ( myp5 . TESS ) ;
1781+ renderer . vertex ( - 10 , - 10 , 0 ) ;
1782+ renderer . vertex ( 10 , - 10 , 0 ) ;
1783+ renderer . vertex ( 10 , 10 , 0 ) ;
1784+ renderer . vertex ( - 10 , 10 , 0 ) ;
1785+ renderer . endShape ( myp5 . CLOSE ) ;
1786+
1787+ assert . isFalse (
1788+ confirmStub . called ,
1789+ 'window.confirm should not be called for shapes with fewer than 50k vertices'
1790+ ) ;
1791+
1792+ assert . equal (
1793+ renderer . immediateMode . shapeMode ,
1794+ myp5 . TRIANGLES ,
1795+ 'Shape mode should be TRIANGLES after normal tessellation'
1796+ ) ;
1797+
1798+ confirmStub . restore ( ) ;
1799+ done ( ) ;
1800+ } ) ;
1801+
16891802 test ( 'TESS does not affect stroke colors' , function ( done ) {
16901803 var renderer = myp5 . createCanvas ( 10 , 10 , myp5 . WEBGL ) ;
16911804
0 commit comments