The Pufferfish is one of few animals which is capable of changing its shape.
This plugin is a set of 330 components which focuses on Tweens, Blends, Morphs, Averages, Transformations, & Interpolations - essentially Shape Changing. Pufferfish mainly uses parameters and factors for inputs for more custom control over operations like tweens and grids as opposed to grasshoppers usual division count inputs. These components are accompanied by support components which are useful methods for tween / blend / morph / lattice operations such as making curves compatible, a custom curve graph mapper, and a multi-threaded morph to twisted box. In addition, there are extra components which simplify some common grasshopper operations such as testing for equality within a tolerance and rounding to nearest numbers. Please email me if you find any bugs. Works with Grasshopper for Rhino 5, Rhino 6, Rhino 7 WIP, and Rhino Mac.
Instagrams: @ekimroyrp & @designmorphine
Download:www.food4rhino.com/app/pufferfish
Michael Pryor
Dec 23, 2017
Michael Pryor
Dec 25, 2017
Michael Pryor
Pufferfish V1.6: Update - Re-uploaded Pufferfish V1.6 to fix a bug in the corner orders of Twisted Box components that use surfaces.
Dec 28, 2017
Michael Pryor
Pufferfish V1.7: Update - adds 7 new components. Components from the Discrete Vectors plug-in (http://www.food4rhino.com/app/discrete-vectors) have been updated and are now a part of Pufferfish. Other minor updates and fixes. Some components require at least Rhino 5 SR12. After installing the pufferfish1-7.gha, please close Rhino completely one time to avoid potential assembly reference errors with the "Twisted Box" components.
Jan 2, 2018
lv
Hi,
I would like to change the size of the twisted boxes along one curve. In this example I deconstructed the twisted boxes and moved the corners nearer to the curve. However, by scaling the boxes fit not together anymore. Is there a way to merge the corners of the boxes so that the geometry matches perfectly together?
Thank you in advance
Jan 8, 2018
Michael Pryor
Hi lv,
Look in the example files "Workflow" folder at the example "Pf_TwistedBoxVariableCurve"
Jan 8, 2018
lv
Thank you for this awesome plugin!
Jan 10, 2018
Michael Pryor
Confirmed works for Rhino 6.
Jan 19, 2018
martin
Hi Michael, first thanks for the pluggin I really like it.
I just have a question, when I tween a surface i get a rectangular tween not the exactly organic shape. I have tried Patch-surface, Boundary surface and Plannar surface directly from rhino. Which surface command should I use?
Jan 28, 2018
Michael Pryor
Hi martin
Surface tweens work on the untrimmed versions of surfaces. Patch, Boundary, and Planar surfaces result in trimmed surfaces. Rhinos tweensrf command will result also in the untrimmed versions. The way to go about this is to retrim the results. Grasshopper has two components for this "retrim" and "copy trim". Use one of those components on the tween surface results to copy the trim data from either one of your input surfaces.
Jan 29, 2018
martin
Thanks for your comment Michael, but I think this command will only get me the top or bottom surface form all along the tween, this for example when iam using diferent surface forms at the top and bottom. My question is because your example tween surface gets from 1 surface form to a different one in the tween proces combining it in the middle; so the tween is neither exactly the bottom nor the top surface form, but more like a combination like the squid example
Jan 29, 2018
Michael Pryor
Hi martin
The squid is because I used a mesh. With mesh it is easy to tween shapes like that (you can make your parts as mesh). The downside of mesh tweens is that they must have the same topology (common in blending through out must software). The downside of surface is there is no robust way to tween trimmed surfaces (even try Rhino's TweenSrf command will give you the untrimmed tweens). Especially if the trim data between multiple trims is very different. (what if one has holes and one does not - for example ) In your case, it seems the surface edges are relatively similar. You could loft surface A edges to surface B edges and cut the tween surfaces with that loft. Or intersect the loft with the tween surfaces and make patch surfaces from the results.
TweenSrfTrim.gh
Jan 29, 2018
Michael Pryor
Pufferfish V1.8: Update - adds 13 new components. All Tween Curve and Tween Curve on Surface components have been completely re-written and include interpolation options. New components added, most notably Scale to Area and Scale to Volume components. Many other additions, options, and outputs added to previous components. General optimizations and fixes all around. Some component rearrangements in the tabs. Some components require at least Rhino 5 SR12. After installing the pufferfish1-8.gha, please close Rhino completely one time to avoid potential assembly reference errors with the "Twisted Box" components.
Feb 16, 2018
Michael Pryor
Pufferfish V1.8: Update - Re-uploaded Pufferfish V1.8 to add edges and faces outputs to the Deconstruct Twisted Box. Also added an Evaluate Twisted Box component and a Twisted Box Centers component. Re-uploaded the V1.8 example files as well.
Mar 1, 2018
Jorge Jimenez Felix
Hi everyone!, im working on a project where im trying to define a structure for a bridge with small diameter pipes (as shown in the discrete polyline example picture) im having some trouble to make the definition to do this, i have some experience in GH but im not an expert if anyone could help me out it would be great
Thank you!
Jorge Jimenez
Apr 8, 2018
Michael Pryor
@Jorge Jimenez all images are from definitions in the example files. Download the example files at the same place as the plugin.
Apr 8, 2018
Garikundesu
Hi Michael,
As always you 're making great things for the community.
I switched to Rhino 6 version and installed Pufferfish 1.8 updated version. Still i receive a loading error after launching grasshopper, and it seems that the hole "Twisted BOX'' tab is missing. Any idea ? I made sure to unblock the component file and restarted my rhino6.
If you could help that would be really great.
Here is an idea of the message received (didn't paste it all) :
Object: WeightedAverageTwistedBox (level 1)
{
TargetInvocationException
}
Object: WeightedAverageTwistedBox (level 2)
{
Impossible de charger le fichier ou l'assembly 'XformComponents, Version=1.0.0.0, Culture=neutral, PublicKeyToken=dda4f5ec2cd80803' ou une de ses dépendances. Le fichier spécifié est introuvable.
FileNotFoundException
}
Object: AverageTwistedBox (level 1)
{
TargetInvocationException
}
Object: AverageTwistedBox (level 2)
{
Impossible de charger le fichier ou l'assembly 'XformComponents, Version=1.0.0.0, Culture=neutral, PublicKeyToken=dda4f5ec2cd80803' ou une de ses dépendances. Le fichier spécifié est introuvable.
FileNotFoundException
}
Object: TweenTwoTwistedBoxes (level 1)
{
TargetInvocationException
}
Object: TweenTwoTwistedBoxes (level 2)
{
Impossible de charger le fichier ou l'assembly 'XformComponents, Version=1.0.0.0, Culture=neutral, PublicKeyToken=dda4f5ec2cd80803' ou une de ses dépendances. Le fichier spécifié est introuvable.
FileNotFoundException
}
Object: TweenThroughTwistedBoxes (level 1)
{
TargetInvocationException
}
Object: TweenThroughTwistedBoxes (level 2)
{
Impossible de charger le fichier ou l'assembly 'XformComponents, Version=1.0.0.0, Culture=neutral, PublicKeyToken=dda4f5ec2cd80803' ou une de ses dépendances. Le fichier spécifié est introuvable.
FileNotFoundException
}
Object: TweenConsecutiveTwistedBoxes (level 1)
{
Une exception a été levée par la cible d'un appel.
TargetInvocationException
}
Object: TweenConsecutiveTwistedBoxes (level 2)
{
Impossible de charger le fichier ou l'assembly 'XformComponents, Version=1.0.0.0, Culture=neutral, PublicKeyToken=dda4f5ec2cd80803' ou une de ses dépendances. Le fichier spécifié est introuvable.
FileNotFoundException
}
Object: TwistedBoxExtrude (level 1)
{
Une exception a été levée par la cible d'un appel.
TargetInvocationException
}
Object: TwistedBoxExtrude (level 2)
{
Impossible de charger le fichier ou l'assembly 'XformComponents, Version=1.0.0.0, Culture=neutral, PublicKeyToken=dda4f5ec2cd80803' ou une de ses dépendances. Le fichier spécifié est introuvable.
FileNotFoundException
}
Object: TwistedBoxPipe (level 2)
{
Impossible de charger le fichier ou l'assembly 'XformComponents, Version=1.0.0.0, Culture=neutral, PublicKeyToken=dda4f5ec2cd80803' ou une de ses dépendances. Le fichier spécifié est introuvable.
FileNotFoundException
}
Object: EvaluateTwistedBox (level 1)
{
Une exception a été levée par la cible d'un appel.
TargetInvocationException
}
Object: EvaluateTwistedBox (level 2)
{
Impossible de charger le fichier ou l'assembly 'XformComponents, Version=1.0.0.0, Culture=neutral, PublicKeyToken=dda4f5ec2cd80803' ou une de ses dépendances. Le fichier spécifié est introuvable.
FileNotFoundException
}
Object: ConstructTwistedBox (level 2)
{
Impossible de charger le fichier ou l'assembly 'XformComponents, Version=1.0.0.0, Culture=neutral, PublicKeyToken=dda4f5ec2cd80803' ou une de ses dépendances. Le fichier spécifié est introuvable.
FileNotFoundException
}
Apr 9, 2018
Michael Pryor
@Garikundesu
I am not exactly sure what the issue could be in that case. Do you still have Rhino 5 installed? For me it works in Rhino 6 but I have both Rhino 5 and Rhino 6 installed and Rhino 6 picks it up automatically from Rhino 5. I haven't switched fully to Rhino 6 yet as it seems Rhino 6 still has many bugs they are updating frequently and Rhino 6 rhino common has methods that cant be used in Rhino 5.
It seems like it cannot find where your grasshopper install is.
Apr 9, 2018
Garikundesu
@Michael Pryor
Thanks a lot for your swift answer.
Well, nice you brought it up. I do actually have Rhino 5 installed on my machine.
Actually the main purpose for installing rhino 6 was because i was getting exactly the same errors in Rhino 5 and that i wanted to use the hole pufferfish components.
Anyway, if you cross by this problem another time and could give me some feedback, i would be really grateful.
Apr 9, 2018
Michael Pryor
@Garikundesu Do you have other native Xform components like boxmorph or surfacebox? Trying to see if maybe you are missing that part of Grasshopper somehow.
Apr 9, 2018
Garikundesu
Hi Michael,
I could finally install it with success. I found the problem.
After downloading the component file, i pasted it in Rhino6>Plug-ins>Grasshopper>Components, while the software could load everything except the twisted box Tab.
Now i removed it from there and i went to paste it in Users>AppData>Roaming>Grasshopper>Libraries, and every Tab of Pufferfish is now working.
Thank you so much for the swift answers regardless of the time difference.
Cheers,
Apr 9, 2018
Michael Pryor
@Garikundesu ah yes - Rhino6>Plug-ins>Grasshopper>Components is where the files that make up native grasshopper go. Libraries is for Grasshopper Plug ins.
Apr 9, 2018
Michael Pryor
Pufferfish V1.9: Update - adds 26 new components. Most notably Mirror Cut components for all geometry types, Scale To Length, Twisted Box Curve Variable, and Twisted Box Pipe Variable, Parameter Mesh Surface, Trim components and others. Additional features, options, and outputs added to previous components. General optimizations and fixes all around. Some component rearrangements in the tabs and renamed. Some components require at least Rhino 5 SR14. After installing the pufferfish1-9.gha, please close Rhino completely one time to avoid potential assembly reference errors with the "Twisted Box" components.
Apr 13, 2018
Michael Pryor
Pufferfish V1.9: Update - Re-uploaded Pufferfish V1.9 to add a K (Keep) input on the Mirror Cut components dealing with geometry which gives the option of keeping the input geometry and mirroring them regularly if it is mirror cut into non-existence, or to output them as null/empty in that case. Re-uploaded the V1.9 example files as well.
Apr 15, 2018
Michael Pryor
Pufferfish V2.0: Update - adds 16 new components. Most notably components for Tweening Curves Along Curves, A custom Curve Graph Mapper which accepts any and multiple curves as inputs to graph with, Unsplit Surface components for making polysurface like surfaces which read as one untrimmed surface, Twisted Box components like Sweep, Deform, Thicken, and Subdivide. Additional features and options added to previous components. General optimizations and fixes all around. Some component rearrangements in the tabs. Some components require at least Rhino 5 SR14. After installing the pufferfish2-0.gha, please close Rhino completely one time to avoid potential assembly reference errors with the "Twisted Box" components.
May 15, 2018
Fatima
Hi!
First I want to thank you for such a great plug in, it is great and very fun to explore.
Im an architecture student, currently doing my graduation project (Vertical City), and I have been exploring closest vector guide curves to create a skin for my building.

Im so new to grasshopper, so I just have couple questions if you have the time:)!
(Im using your example files btw) with Rhino 6 + Puffer fish 2.0
-
This is rough sketchs of what I want it to look like.
-
here Im trying to get the vectors to start from around the building by using populate geometry instead of plane but it still starts from underneath the building instead of around it. How may I fix this ?
-
As for here, I have changed the resolution of vector star and it still looks rough and has unorganized lines around, can this be fixed ?
-
Thank you :)
Jun 4, 2018
Michael Pryor
@Fatima not really possible to tell where you are going wrong without the file and geometry.
Jun 4, 2018
Fatima
Yes of course, sorry
Project-vectorstry.3dm
Graduation-vectorstry.gh
Jun 4, 2018
Michael Pryor
Fatima check this discussion
https://discourse.mcneel.com/t/pufferfish-2-0-discrete-polylines/66...
Jul 3, 2018
Michael Pryor
Pufferfish V2.1: Update - adds 13 new components. Mostly utility and helper components. Additional inputs/outputs added to some components. General optimizations and fixes all around. Some components require at least Rhino 5 SR14. After installing the pufferfish2-1.gha, please close Rhino completely one time to avoid potential assembly reference errors with the "Twisted Box" components. Make sure to first remove any other versions of Pufferfish you may have installed.
Aug 5, 2018
Michael Pryor
Pufferfish V2.2: Update - adds 10 new components for Numbers, Curves, and Surfaces. 40+ components updated, most Tween components rewritten for optimization, accuracy, and bug fixes. After installing the pufferfish2-2.gha, please close Rhino completely one time to avoid potential assembly reference errors with the "Twisted Box" components. Make sure to first remove any other versions of Pufferfish you may have installed. Pufferfish V2.2 works with Rhino 5, Rhino 6, and Rhino Mac. Some components require at least Rhino 5 SR14. Some versions of Rhino 6 Grasshopper have a mesh display issue not related to Pufferfish, if you see a weird mesh, try Recomputing Grasshopper until it goes away.
Sep 18, 2018
Michael Pryor
Pufferfish V2.2: Update - Re-uploaded Pufferfish V2.2 to update 5 components and add 1 more, re-uploaded Pufferfish V2.2 Examples as well.
Sep 26, 2018
Michael Pryor
Pufferfish V2.2: Update - Re-uploaded Pufferfish V2.2 to fix Offset Mesh component causing Rhino to crash when a null was input, re-uploaded Pufferfish V2.2 Examples as well.
Oct 9, 2018
Michael Pryor
Pufferfish V2.3: Update - adds Normalized(N) input to the 17 Tween Through and Twisted Box Through components which enables the use of normalized tween factor values from 0 to 1. Also added a Flip Polysurface component. After installing the pufferfish2-3.gha, please close Rhino completely one time to avoid potential assembly reference errors with the "Twisted Box" components. Make sure to first remove any other versions of Pufferfish you may have installed. Pufferfish V2.3 works with Rhino 5, Rhino 6, and Rhino Mac. Some components require at least Rhino 5 SR14. Some versions of Rhino 6 Grasshopper have a mesh display issue not related to Pufferfish, if you see a weird mesh, try Recomputing Grasshopper until it goes away.
Oct 24, 2018
Christopher Leung
Hi Michael ,
Is there a way to translate the colour together with the mesh with the mirror cut plane component from grasshopper?
I tried to use the mirror cut colours, however it only works within a list of colours and does not work as same as the plane cut.
Regards,
Chris
Mesh%20Colour.3dm
-
May 5, 2019
Michael Pryor
Christopher Leung
I would assign one color set to each half of the mirror cut since the halves will have the same topology (you can get the halves by turning off join and using the i output.) So mirror cut first, then assign color.
I can look into incorporating color into the mirror cut but I can't promise when that would be. There are also conditions where it seems subjective what to do (if I also mirror cut the color of the mesh what colors get assigned to new mesh faces made by the mirror cut bridging?, Do they just take some average of the color of the faces they connect with?)
I don't think any GH components which change a meshes topology (add / remove / combine mesh elements like faces and verts) currently keep track of the original mesh colors do they?
May 6, 2019
Christopher Leung
Hi Michael,
Thanks For your quick response, and developing puffer fish components
I have managed to find a solution by using the TrimMeshPlane Component which keep the original colour of the mesh after the operation, i then mirror and join after operation is done. (bypasse the mirror cut mesh).
It seem that it does the work for now, but im not sure how this might impact me later on down the track.
Here the Results,
---------
I also tried to use the MirrorCutMesh together with the MirrorCutColour components which is not quite successful as the previous one, as it remap the whole mesh colour throughout the whole outcome. (i am wrong on how i interpolate the colour as it require to cull some colour that are cut)
It does the mirroring Mapping colour but not from the Initial Geometry, comparing both image you will understand what i mean.
------
Here the grasshopper component i used and i also attached the files in case you want to give it a try.
As per the colour bridging condition, i think it is subjective, as it depend on the design.
1) one condition for this could be by using the colour from the original mesh colour to define the colour of the bridging element (The offset plane colour is apply to the bridge)
2) Apply the same Mesh colour in along the bridge (Which might look ugly if their is a huge offset), for instance if it is red colour, it just translate the red colour across, it might be better to take the colour on the vertex of the mesh where it cut the plane to map onto the bridging component than averaging colour of the face
I hope this could be somehow helpful into developing the tool, as for myself i dont have much codding experience yet.
Regards,
Chris
-----
Files
MeshColourTest.3dm
Colour%20Test%20Mirroring.gh
May 9, 2019
Michael Pryor
@Christopher Leung
Well, I didnt do anythng special with the Trim Mesh With Plane component to keep the colors so guess it just does, however the mirror cut mesh uses the same method in the code, the difference is the new faces added by bridging. This tell me that adding new faces to the mesh probably erase the color.
"I also tried to use the MirrorCutMesh together with the MirrorCutColour components which is not quite successful as the previous one"
Well it is quite obvious why that wouldn't work, Mirror Cut Colors just cuts a list of colors at an index. There is no way that the order of your mesh verts / colors would match that cut, because a plane cuts a mesh doesn't mean it is cutting the order of its verts / colors in half.
Say you have a list of colors:
0:red
1:Blue
2:Green
3:yellow
say you mirror cut that list at index 2. you will have:
0:red
1:blue
2:blue
3:red
Now say that list of colors are associated with a mesh face
0: vert 0 = red
1: vert 1 = blue
2: vert 2 = green
3: vert 3 = yellow
But you mirror cut that face from between vert 0 and 1 to between vert 2 and 3, you will have remaining vert 0 and 3, so the mirror color of the mesh should be
0:red
1:yellow
2:yellow
3:red
Hope that makes sense.
What I was suggesting to you before is to generate a color map always for one half of the mirror cut but apply it to both halves. This of course means generating the color map with grasshopper in the process.
May 9, 2019
Michael Pryor
Pufferfish V2.4: Update - 55 new components. 3 new tabs (Transform, Domain, List). New options for Equalized, Weighted, and Degree on Tween and Twisted Box components. Multi-threaded Twisted Box components for morphing and geometry filling / subtracting. Some components renamed and organized in different tab locations. Many component updates, bug fixes, code optimizations, and option additions. Please read the installation text file first that comes with this download before installing Pufferfish.
May 14, 2019
Michael Pryor
Pufferfish V2.4: Re-uploaded Pufferfish V2.4 and Pufferfish V2.4 example files to fix the Multi-Threaded "Polysurface Boolean Twisted Boxes" component which was occasionally causing Rhino 5 to crash, inadvertently it is now faster as well.
May 17, 2019
Michael Pryor
Pufferfish V2.5: Update - 12 new components, such as Linearize Numbers to use sine graphs for tween factors to have wave like spacing, Tween Two Surfaces Along Curve, new Constrained Area / Volume components, and new Mirror / Combine components. Updates to the multi-threaded Mesh / Polysurface Boolean Twisted Boxes components to now be able to use multiple Meshes / Polysurfaces. Various other component updates, bug fixes, and code optimizations. Please read the installation text file first that comes with this download before installing Pufferfish.
Jul 4, 2019
Michael Pryor
Pufferfish V2.6: Update - Tween Through Curves, Tween Through Curves On Surface, Tween Through Curves Along Curve now have an Equalized option like the other tween and twisted box components to easily get uniform spacing. Various other component updates, bug fixes, and code optimizations. Please read the installation text file first that comes with this download before installing Pufferfish.
Jul 27, 2019
Michael Pryor
Pufferfish V2.7: Update - Added Recursive Morph Mesh component and much improved a mesh welding algorithm which is used in components like Mirror Cut Mesh and Rebuild Mesh. Various other component updates, bug fixes, and code optimizations. Please read the installation text file first that comes with this download before installing Pufferfish.
Sep 27, 2019
Michael Pryor
Pufferfish V2.7: Re-uploaded Pufferfish V2.7 and Pufferfish V2.7 example files to fix some inconsistancies in some twisted box components orientations and added new examples. Please read the installation text file first that comes with this download before installing Pufferfish.
Oct 5, 2019
Ivan Genov
Hi all,

probably a stupid question, but here it goes:
I really like the following example, but couldn´t find in the exercise file. Could you please give me a hint how to achieve something like that? Help a beginner out:)
Oct 28, 2019
Michael Pryor
Ivan Genov it is from the example file "Pf_ClosestVectorLoops - Requires Anemone Plugin.gh" Then to make the mesh you should use either mesh Pipes from the Mesh Tools Plugin + Zbrush, Mesh Voxels from Mesh Tools Plugin and Smooth with Weaverbird Plugin, or use the Dendro Plugin.
Oct 28, 2019
Michael Pryor
Pufferfish V2.8: Update - 24 new components. New Parameter Mesh Tools for extrusions, lofts, pipes, voxels, etc. with base methods provided by Mateusz Zwierzycki. New Twisted Box components for Curves. New Rhino 7 WIP SubD components for Averaging SubDs, Tweening SubDs, and creating Twisted Boxes from SubDs. Various other component additions, updates, bug fixes, and code optimizations. Please read the installation text file first that comes with this download before installing Pufferfish.
Jan 16, 2020
Michael Pryor
Pufferfish V2.9: Update - 13 new components. Most notably components for Averaging / Tweening Transforms. New Rhino 7 WIP Mirror Cut SubD component. New falloff options for Pinch'n'Spread. Average / Tween Mesh components can now use colored meshes. Various other updates.
May 1, 2020
Michael Pryor
Pufferfish V2.9: Re-uploaded Pufferfish V2.9 and Pufferfish V2.9 example files to add new polyline conditions to Average Curve and Weighted Average Curve components.
May 31, 2020
Michael Pryor
Pufferfish V2.9: Re-uploaded Pufferfish V2.9 and Pufferfish V2.9 example files to fix occasional Invalid Mesh result from the Rebuild Mesh components welding in Rhino 6.
Jun 5, 2020