@@ -2596,6 +2596,18 @@ function primitives3D(p5, fn){
25962596 return this . _renderer . curveDetail ( d ) ;
25972597 } ;
25982598
2599+ /**
2600+ * @typedef {Object } InstancesWrapper
2601+ * @property {function(radius: Number=, detailX: Number=, detailY: Number=): undefined } sphere
2602+ * @property {function(width: Number=, height: Number=, depth: Number=, detailX: Number=, detailY: Number=): undefined } box
2603+ * @property {function(width: Number=, height: Number=, detailX: Number=, detailY: Number=): undefined } plane
2604+ * @property {function(radiusX: Number=, radiusY: Number=, radiusZ: Number=, detailX: Number=, detailY: Number=): undefined } ellipsoid
2605+ * @property {function(radius: Number=, height: Number=, detailX: Number=, detailY: Number=, bottomCap: Boolean=, topCap: Boolean=): undefined } cylinder
2606+ * @property {function(radius: Number=, height: Number=, detailX: Number=, detailY: Number=, cap: Boolean=): undefined } cone
2607+ * @property {function(radius: Number=, tubeRadius: Number=, detailX: Number=, detailY: Number=): undefined } torus
2608+ * @property {function(model: p5.Geometry, count: Number=): undefined } model
2609+ */
2610+
25992611 /**
26002612 * Draws `count` instances of the next 3D primitive or model using WebGL
26012613 * instanced rendering.
@@ -2608,21 +2620,38 @@ function primitives3D(p5, fn){
26082620 * @method instances
26092621 * @param {Number } count number of instances to draw. Must be a positive
26102622 * integer.
2611- * @returns {Object } an object with methods `sphere`, `box`, `plane`,
2623+ * @returns {p5.InstancesWrapper } an object with methods `sphere`, `box`, `plane`,
26122624 * `ellipsoid`, `cylinder`, `cone`, `torus`, and `model`. Call one of
26132625 * these to draw `count` instances of that primitive.
26142626 *
26152627 * @example
26162628 * <div>
26172629 * <code>
2618- * // Draw 10 spheres in a single instanced draw call.
2619- * // A custom shader reads gl_InstanceID to offset each sphere.
2630+ * let myShader;
2631+ * let count = 5;
2632+ *
26202633 * function setup() {
2621- * createCanvas(100, 100, WEBGL);
2634+ * createCanvas(200, 200, WEBGL);
2635+ * myShader = buildMaterialShader(drawSpaced);
2636+ * describe('Five red spheres arranged in a horizontal line.');
26222637 * }
2638+ *
2639+ * function drawSpaced() {
2640+ * worldInputs.begin();
2641+ * // Spread spheres evenly across the canvas based on their index
2642+ * let spacing = width / count;
2643+ * worldInputs.position.x +=
2644+ * (instanceIndex - (count - 1) / 2) * spacing;
2645+ * worldInputs.end();
2646+ * }
2647+ *
26232648 * function draw() {
2624- * background(200);
2625- * instances(10).sphere(20);
2649+ * background(220);
2650+ * lights();
2651+ * noStroke();
2652+ * fill('red');
2653+ * shader(myShader);
2654+ * instances(count).sphere(15);
26262655 * }
26272656 * </code>
26282657 * </div>
@@ -2631,17 +2660,16 @@ function primitives3D(p5, fn){
26312660 this . _assert3d ( 'instances' ) ;
26322661
26332662 if ( typeof count !== 'number' || ! isFinite ( count ) || count < 1 ) {
2634- console . log (
2635- '🌸 p5.js says: instances() requires a positive integer count.' +
2636- ' Clamping to 1. '
2663+ p5 . _friendlyError (
2664+ 'instances() requires a positive integer count. Clamping to 1.' ,
2665+ 'instances '
26372666 ) ;
2638- count = Math . max ( 1 , Math . round ( count ) || 1 ) ;
2667+ count = 1 ;
26392668 } else {
26402669 count = Math . round ( count ) ;
26412670 }
26422671
26432672 const r = this . _renderer ;
2644- const p = this ;
26452673
26462674 // Each wrapped method: set _instanceCount, call the renderer method with
26472675 // the correct `this`, clear _instanceCount in finally so it never leaks.
@@ -2652,7 +2680,6 @@ function primitives3D(p5, fn){
26522680 } finally {
26532681 r . _instanceCount = undefined ;
26542682 }
2655- return p ;
26562683 } ;
26572684
26582685 return {
0 commit comments