Scalable Vector Shapes 2D lets you do 3 things:
- Draw seamless vector shapes using a Path Editor inspired by the awesome Inkscape with a new node type:
ScalableVectorShape2D1 - Animate the shape of the curve using keyframes on a property-track in an
AnimationPlayer - Import .svg files as seamless vector shapes in stead of as raster images2
In this 10 minute video I explain how to use all the features of Scalable Vector Shapes 2D in short succession:
- Scalable Vector Shapes 2D plugin for Godot 4
- Table of Contents
- Drawing Shapes in the Godot 2D Viewport
- The Create Shapes Dock
- The Import SVG File Dock
- The Project Settings Dock
- The Advanced Tab
- Moving, Rotating and Resizing the Points of a Shape
- Manipulating shapes
- Adding a point to a shape
- Bending a curve
- Creating, mirroring and dragging control point handles
- Closing the loop and breaking the loop
- Deleting points and control points
- Setting the global position of a point / curve handle manually
- Create a cutout/clip/merge shape (a hole, a clipped frame, ...)
- Converting a line segment into an arc-segment
- Editing arc properties
- Setting the pivot of your shape
- Manipulating 2D Shapes in the 3D export
- Manipulating gradients
- Using the Inspector Form for
ScalableVectorShape2D - More about assigned
Line2D,Polygon2DandCollisionObject2D - Animating / Changing shapes at runtime
- Autoscaling SVG Textures for GUI Controls
- FAQ's
- The curve of my
ScalableVectorShape2Dwon't animate at runtime, what do I do? - I want to change shapes while debugging my game. Is this even possible?
- When I animate the curve of an imported scene, it animates all the other curves as well
- When I duplicate a
ScalableVectorShape2Dand change its shape, the originalScalableVectorShape2Dshape also changes - Can I draw shapes programmatically?
- Should I draw shapes programmatically?
- When should I draw shapes programmatically?
- Can I change shapes in the 2D editor while running the game?
- The curve of my
- Attributions
- Reaching out / Contributing
After activating this plugin a new bottom panel item appears, called "Scalable Vector Shapes 2D".
There are 2 recommended ways to start drawing:
- Creating a Circle/Ellipse, Rectangle or empty Path using the bottom panel item
- Using the
.svgimporter
The Create Shapes tab gives you some basic choices:
Pressing the Create Empty Path or one of the Create Path buttons will add a new shape to an open 2D Scene in 'Path' mode, meaning all points in the 'Bézier' curve are editable.
It's probably easier to start out with a basic primitive shape (like you would in Inkscape <3) using the Create Rectangle or Create Ellipse button. This will expose less features, but will make it a lot easier to manipulate shapes:
Ellipses will only have one handle to change the size property with (representing the x and y diameter). This will set the rx and ry property indirectly.
Rectangles will have a handle for size and 2 handles for rounded corners rx and ry property.
- Enable/Disable Fill (when creating new shapes via this bottom panel)
- Fill color (when creating new shapes in this bottom panel)
- Enable/Disable Stroke (when creating new shapes this this bottom panel)
- Stroke color (when creating new shapes in this bottom panel)
- Choose a
CollisionObject2Dtype (when creating new shapes in this bottom panel, default is no collision object assignment) - Paint order: a toggle which represent what comes in front of what (when creating new shapes in the bottom panel)
- Stroke Settings:
- Stroke Width (when creating new shapes via this bottom panel)
- Use
Line2D: when flagged off, aPolygon2Dwill be used to draw strokes with in stead (see also:Line2D StrokeversusPolygon2D Stroke) - Begin- and End Cap modes
- Line Joint Mode
Read more about manipulating shapes
On the left side of this panel is a form with a couple of options:
- Import as ScalableVectorShape2D: check this Off if you want to import the svg file with only built-in godot nodes, without being able to edit/animate the curves in the editor.
- Lock imported shapes in editor: this simply flags on the lock so that the
Polygon2D,Line2D, etc are not selected on click, but the owning ScalableVectorShape2D is - Flag on antialiased on Polygon2D and Line2D: flags on the
antialiasedproperty of either - Use Line2D for Strokes: when flagged Off a
Polygon2Dis used for strokes in stead of a Line2D - Pick a
CollisionObject2Dtype to also generate collision polygons when importing the svg file
A tooltip highlights the costs and benefits when picking either of these to draw strokes with:
- A
Polygon2Dstroke can be more neatly clipped than aLine2D CollisionPolygon2D's matchPolygon2DStroke better- A
Polygon2Dstroke can be textured with gradients like fills are textured Line2Dhas sharper caps and line joints at high zoomLine2Dcan be textured directionally in stead of like a Fill textureLine2Dcan set different Begin and End Cap Modes wherePolygon2Dcan only pick one
On the right side is an import log, which will show warnings of known problems, usually unsupported stuff.
The link it shows is to the issues list on the github repository hosting this plugin. Here you can report any encountered bugs while importing SVG files using this plugin.
- Enable/Disable ScalableVectorShape2D Editing (when checked off, you can edit nodes the normal, built-in, godot-way. You are going to need this)
- Show/Hide Edit hints
- Show Point Details (which are the exact indices of each point on the
Curve2Dof this shape, what is it's global position) - Snap to Pixel (snaps points and curve handles to whole pixels on the global transform)
- Snap distance (the snap step / resolution)
These settings are applied to the Curve Settings of new shapes when added via the bottom panel docks (either SVG importer or via Create Shapes).
For more information on these settings, please refer to the section on The Curve settings inspector form
As of release 2.18.0 a new flag was added which causes any Line2D that you add as stroke to be antialiased via a repeating texture.
This approach follows exactly the Antialiased Line2D plugin by @Calinou.
To be more specific, I reused these bits:
- The tool script code for the
Line2Dcreation is here: addons/antialiased_line2d/antialiased_line2d.gd - And the LumAlpha8.tex texture resource it uses was generated by this script: addons/antialiased_line2d/texture.gd
Of course, once you assign this to the Line2D.texture, you cannot use another texture on that Line2D anymore.
Since release 2.13.0 a tab named 'Advanced' is added to the bottom dock.
- PNG file (see Export as PNG Button )
- A 'Baked' scene (see Export as 'baked' scene button)
- 3D scene: creates a new 3D scene, in which all the Fills and Strokes in the scene are turned into instances of
CSGPolygon3D3
Since 2.14.0 you can export your animated scene as sprite frames in one PNG spritesheet or separate PNG files.
Release 2.16.0 adds the posibility to do uniform transforms on the points of a shape, as opposed to the entire node.
When a ScalableVectorShape2D is selected in Select Mode (Q), the following command buttons are made available:
Move all the Points without moving the Node (Z)Rotate all the Points without rotating the Node (X)Resize all the Points without scaling the Node (C)Edit the points normally (Q)
When moving all the points of a shape, the Node2D.position property does not change.
This operation responds to the snap-to-pixel mode of the Project Settings tab.
In the case of the 2 supported primitive shapes, the offset property is changed, to represent the translation.
The offset property can be used to set keyframes in an AnimationPlayer and is so easier to use than the Batch Update button for an entire curve.
When the Shape Type Settings > Shape Type is Path, all the points are simply moved, relative to the node position (translating their individual local position).
When rotating all the points of a shape, the Node2D.rotation property does not change.
Just like rotating Node2D, holding Ctrl allows you to rotate in steps of 5°.
In the case of the 2 supported primitive shapes, the spin property is changed, to represent the rotation of all the points.
The spin property can be used to set keyframes in an AnimationPlayer and is so easier to use than the Batch Update button for an entire cruve.
When the Shape Type Settings > Shape Type is Path, all the points can be rotated in 2 ways:
- Around the
Node2D's pivot - Around their natural center (by holding the
Shiftbutton - this is not perfect, but comes close enough)
When resizing all the points of a shape, the Node2D.scale property does not change, this is especially useful when using strokes, because their width will remain the same this way.
This operation responds to the snap-to-pixel mode of the Project Settings tab.
In the case of the 2 supported primitive shapes, the size property is changed, to represent the 'distance' of all the points away from their origin.
The size property can be used to set keyframes in an AnimationPlayer and is so easier to use than the Batch Update button for an entire cruve.
When the Shape Type Settings > Shape Type is Path, all the points can be resized in 2 ways:
- Away from / towards the
Node2D's pivot - Away from / towards their natural center (by holding Shift)
Release 2.17.0 adds vertical and horizontal flip buttons. This allows you to flip your shape without changing the Node2D.scale property of your ScalableVectorShape2D.
Flipping primitive shapes (shape type is ellipse, or rectangle) simply reverses the rotation of points around their pivot by negating the value of the spin property.
Flipping paths multiplies the position of each point by negative-x for horizontal flipping, or negative-y for vertical flipping. The in- and out- control points are also flipped, effectively flipping the bézier curves.
Arcs are flipped by toggling negating the sweep flag of each listed arc.
The hints in the 2D viewport should have you covered, but this section lists all the operations available to you. You can also watch the chapter on sculpting paths on youtube:
Using Ctrl4 + Left Click you can add a point anywhere in the 2D viewport, while your shape is selected.
By double clicking on a line segment you can add a point inbetween 2 existing points:
Holding the mouse over line segment you can start dragging it to turn it into a curve.
When you have new node you can drag out curve manipulation control points while holding the Shift button. The 2 control points will be mirrored for a symmetrical / round effect.
Dragging control point handles while holding Shift will keep them mirrored / round:
Dragging them without holding shift will allow for unmirrored / shap corners:
Double clicking on the start node, or end node of an unclosed shape will close the loop.
Double clicking on the start-/endpoint again will break the loop back up:
You can recognise the start-/endpoint(s) by the infinity symbol: ∞
You can delete points and control points by using right click.
Using Alt+Click you can now open a form to set the global position of a point manually:
While holding Ctrl+Shift4 on a selected shape you can start adding cutouts to your selected shape:
- Use
mousewheelto change shapes (rectangle, ellipse, or empty path) - Use
right clickto change operation (cut out, clip, or merge) - Use
left clickon your selected shape to create and select the newScalableVectorShape2Dwhich acta as a cutout, a frame clipping, or merged shape:
When cutting out an empty shapem, the created cutout will have only one point, so to see the effect you'd need to add more points to using regular Ctrl+Click4:
Use Right click on a line segment to convert it into an arc5 (a an ellipse-shaped bend with an x- and y-radius).
Use Right click on an arc again to convert it back into a normal line segment.
Using Left click on an arc segment opens a popup form to edit the properties of the arc:
- radius (
rx/ry) - rotation (rotates the arc around its elliptical center; is only noticable when radius is non-uniform)
- large arc (when the arc's radius is greater than distance between its start- and endpoint it can be drawn the short and the long way 'round)
- sweep (determines the direction the arc points are drawn: clockwise / counter-clockwise; this effectively flips the arc)
You can use the Change pivot mode to change the origin of your shape, just like you would a Sprite2D. In this case, the 'pivot' will actually be the position property of you ScalableVectorShape2D node.
This rat will want to rotate it's head elsewhere:
Like this:
Using the new Export to 3D Scene in the Advanced Editing Tab produces the new AdaptableVectorShape3D node, which holds instances of CSGPolygon3D with:
Pressing the button Add 2D Shape Editor will instantiate a new ScalableVectorShape2D that can be used to edit with. For now I will suffice with a screenshot. I'm hope to record a long explainer about this soon.
This screenshot was made using the DualEditor plugin by @Meta-Ben, which is very useful for this purpose:
You can also use the Batch insert button for curve key frames to animate the 3D shape's curve. Of course the performace impact for this is not negligable.
Once a gradient is assigned to the 'Fill' of your shape via the inspector, its properties can be changed using the same controls as will the other handles.
Drag the outer orbit of the start- and endpoint of a the gradient line using the left mouse button to move them:
Drag the color stops along the gradient line to change their position.
Right click to remove a color stop.
Double clicking on the gradient line will add a new color stop (the assigned color will be sampled from the existing color at that point)
This plugin can sometimes get in the way of the default 2D viewport behavior. Sometimes it is hard not to select a ScalableVectorShape2D.
There are 4 ways to get around this:
- Locking the
ScalableVectorShape2Dusing the lock togglebutton above the 2D viewport
- Hiding the
ScalableVectorShape2Dvia the scene tree - Saving the branch containing the
ScalableVectorShape2Das a new scene via the scene tree and importing it will also prevent selection - Toggling off Enable/Disable ScalableVectorShape2D Editing altogether in the bottom panel
The following custom forms were added, with extensive tooltips to help explain the actual functions they provide:
- Fill (actually the assigned
Polygon2D) - Stroke (actually the assigned
Line2DorPolygon2D) - Collision (manages an assigned
CollisionObject2D) - Navigation (manages an assigned
NavigationRegion2D) - Curve Settings
- Masking
- Shape Type Settings
- Editor Settings
- Export Options
When a primitive shape (basic rectangle or ellipse) is selected, a Convert to Path-button is available at the top of the inspector.
When the selected shape has no fill, an Add Fill button is provided. Clicking that will create and assign a new Polygon2D to the selected ScalableVectorShape2D:
Once assigned, the following options are available:
- Fill color, changes the
colorproperty of the assignedPolygon2D - Gradient, will assign or remove a
GradientTexture2Dto thePolygon2D - Stop colors (if a gradient is set), one color button per color
- A
Edit Polygon2Dbutton, which will make the editor select the assignedPolygon2D
Below that, a standard godot Assign ...-field is also available to set the polygon-property directly with and to enable unassignment.
With this form the following ScalableVectorShape2D properties can be edited:
stroke_colorstroke_widthbegin_cap_mode(in case of aPolygon2D-based stroke, this will also set the end cap)end_cap_modeline_joint_mode
When a Line2D is assigned to draw the stroke with, these properties will be kept synchronized with the ScalableVectorShape2D properties.
In case of a Polygon2D based stroke, the stroke_color will be kept synchronized with the Polygon2D color.
When the selected shape has no stroke, an extra set of buttons is provided:
Add Line2D StrokeAdd Polygon2D Stroke
Clicking either will create and assign a new Line2D or Polygon2D to the selected ScalableVectorShape2D:
Below that, a standard godot Assign ...-field is also available to set these properties:
line: aLine2Dassignmentpoly_stroke: aPolygon2Dassignment
This works the same as the Fill- and Stroke forms, but in this case a descendant of a CollisionObject2D is assigned to the collision_object-property6:
Every time the shape is changed, one or more Polygon2D nodes will be added/updated as direct children of this collision_object. The descendants of CollisionObject2D are:
StaticBody2DArea2DAnimatableBody2DRigidBody2DCharacterBody2DPhysicalBone2D
This form can hold a reference to an assigned NavigationRegion2D. When the shape changes, a new navigation polygon is calculated.
The curve settings inspector form provides the following options
- A
Batch insertkeyframes button for all theCurve2D's control points (the whole shape). This will be active when a valid track is being edited in aAnimationPlayervia the bottom panel - The standard godot built-in editor for
Curve2Dresources, assigned to thecurveproperty of the selectedScalableVectorShape2D - The
update_curve_at_runtimecheckbox, which enables animating the entire shape - The
max_stagesproperty which influences smoothness (and performance!) of curve drawing; a higher value means smoother lines - The
tolerance_degreesproperty, which also influences smoothness (and performance) of curve drawing: a lower value adds a smoother curve, especially for very subtle bends - The
arc_listproperty: a container for the metadata-objects describing elliptical arc segments of the curve (implemented viaScalableArc2DandScalableArcListresource-classes). - The
glue_mapproperty: with this dictionary you can control the position of anyNode2Din the scene with the a point position in thecurve.
These properties are used for clipping this shape and cutting out of this shape.
- The
clip_pathsproperty: an array of assignedScalableVectorShape2D-nodes, which describe the shapes to cut out of this shape - When the
use_interect_when_clippingproperty is checked on and thisScalableVectorShape2Dis used in another's clip_paths array, theGeometry2D.intersect_polygons(...)operation is used in stead of theGeometry2D.clip_polygons(...) operation - When the
use_union_in_stead_of_clippingproperty is check on and thisScalableVectorShape2Dis used in another's clip_paths array, theGeometry2D.merge_polygons(...)operation is used in stead of theGeometry2D.clip_polygons(...) operation7
This form allows manipulation of the properties of primitive shape types (rectangle, ellipsis):
- Shape type, here you can selected the type of the shape: Path, Rect and Ellipse. (Be warned: changing a shape from a path to a primitive shape is a destructive action and cannot be undone)
- Offset: this represents the position of the pivot relative to the shape's natural center.
- Size: the box size of the entire shape (stroke thickness excluded)
- Rx: the x-radius of the shape
- Ry: the y-radius of the shape
It is best to change these properties via the handles in the 2D editor. They are, however, quite useful for animating key frames.
This form exposes 2 settings:
- Shape Hint Color: the color of the line with which this shape is drawn, when selected
- Lock Assigned Shapes: when this is checked, added strokes, fills and collision polygons will be locked in the editor, once created.
With the Export as PNG-button you can save any ScalableVectorShape2D and its children as a new .png-file. Note that nodes which are assigned as Fill or Stroke that are higher up in the hierarchy will be excluded from the exported file.
You can however change the type of any Node2D to ScalableVectorShape2D temporarily in order to export group of shapes as a PNG file.
With the Export as baked scene button you can generate a new scene (like Save branch as scene), with all the ScalableVectorShape2D-nodes converted to basic Node2D-nodes.
Use this when you are done drawing entirely and do not want to update curves at runtime, or when you want to keep the shapes but drop the dependency of this plugin from your project.
An exported AnimationPlayer will not support animated curves, track references will, however, remain.
Using the Add ... buttons in the inspector simply adds a new node as a child to ScalableVectorShape2D but it does not need to be a child. The important bit is that the new node is assigned to it via its properties: polygon, line and collision_object.
This video gives more context on how Line2D, Polygon2D and CollisionPolygon2D are assigned to the ScalableVectorShape2D:
Watch this explainer on youtube on animating:
The shapes you create will work fine with basic key-frame operations.
You can even detach the Line2D, Polygon2D and CollisionObject2D from ScalableVectorShape2D entirely, once you're done drawing and aligning, and change the ScalableVectorShape2D to a simple Node2D if necessary.
Sometimes, however, you want your shape to change at runtime (or even your collision shape!)
You can use the Update Curve at Runtime checkbox in the inspector to enable dynamic changing of your curved shapes at runtime.
You can then add an AnimationPlayer node to your scene, create a new animation and (batch) insert key frames for the following:
- The entire shape of your
ScalableVectorShape2D, which are:curve:point_*/positioncurve:point_*/incurve:point_*/outarc_list:arc_*/radiusarc_list:arc_*/rotation_degarc_list:arc_*/large_arc_flagarc_list:arc_*/sweep_flag
- All the gradient properties of your fill (
Polygon2Dassigned toScalableVectorShape2D), which are:texture:gradient:colors(the entirePackedColorArray)texture:gradient:offsets(the entirePackedFloat32Array)texture:fill_fromtexture:fill_to
- Fill color, i.e.: the
colorof the assignedPolygon2D
* Note: the keyframes of stroke properties are set directly on ScalableVectorShape2D as of release 2.12
When the update_curve_at_runtime property is checked, every time the curve changes in your game the path_changed signal is emitted.
Duplicating a ScalableVectorShape2D will not make a new Curve2D, but use a reference. This means line-segments will be calculated multiple times on one and the same curve! Very wasteful.
If however you want to, for instance, animate 100 blades of grass, just use one ScalableVectorShape2D and have the 100 Line2D node listen to the path_changed signal and overwrite their points property with the PackedVector2Array argument of your listener func:
This very short section of the youtube video illustrates how to do this: https://youtu.be/IwS2Rf65i18?feature=shared&t=55
Animating curve points at runtime does, however, impact performance of your game, because calculating segments is an expensive operation.
Under Tesselation settings you can lower Max Stages or bump up Tolerance Degrees to reduce curve smoothness and increase performance (and vice-versa)
Release 2.15 makes it easy to add crisp, autoscaling images for your GUI Control nodes using two new classes:
SVGTextureHelper: aNodethat manages an SVG image resource when it's a direct child of aTextureRect,Button, orTextureButtonSVGTextureResource: aResourcethat holds a reference to the svg file and a base64 encoded string of the file's contents, as well as a baseline scale factor (so you can even keep the image crips and sharp at higher zoom levels)
These 3 control nodes now have an extra button Set Scalable SVG Texture in the inspector to set their texture with:
TextureRectButtonTextureButton
Once an SVG file has been chosen as a texture, a SVGTextureHelper node is automatically added to manage the automatically scaled image via a SVGTextureResource.
A button with the name of the texture property and an icon-preview will then be presented with which you can pick another SVG file source.
There is an example scene in the plugin directory: addons/curved_lines_2d/examples/gui.tscn.
To remove this type of texture again, the SVGTextureHelper node needs to be deleted via the scene tree:
Any Control node's Texture2D properties can be managed by a manually added SVGTextureHelper. For this you will need to set the target_property-field of the SVGTextureHelper manually.
Check the box:
Yes, when you check the box Update Curve at Runtime box.
This is a common issue: there is one Curve2D instance being referenced by all scenes. You fix this by checking On "Local To Scene" for the Curve2D:
When I duplicate a ScalableVectorShape2D and change its shape, the original ScalableVectorShape2D shape also changes
This is a common issue: there is one Curve2D instance being referenced by both nodes.
You can work around this by using 'Make unique' by right-clicking Curve settings > Curve > Curve2D in the Inspector of your duplicated shape:
When using arcs in a shape the Arc List property must also be 'made unique'
Overriding the default duplication behavior of godot can lead to more unforeseen problems. So a good solution must be well thought through.
Search reddit on the trials and tribulations of 'Make Unique':
Yes you can. There are a couple of small things to be aware of:
- You need to set
my_shape.up_date_curve_at_runtime = true - To draw anything, your shape needs a Stroke, Fill, or Collision Object:
- Setting a stroke:
my_shape.line = Line2D.new() - Setting a fill:
my_shape.polygon = Polygon2D.new() - Setting a collision object:
my_shape.collision_object = StaticBody2D.new() - The Stroke, Fill, Collision Object need to be inside the scene tree, i.e.:
my_shape.add_child(my_shape.line)
I added a small example based on this question
This depends on the complexity of what you want to achieve.
In many cases just drawing something in the editor and saving it as a scene to import elsewhere (or instantiate() via preloading) is a better option, adhering to the Keep it Simple principle.
But that's just my personal opinion.
There are very many situations left where you might want to do exactly this, but that is up to your own creativity.
One powerful feature I can think of is 'mining': use ScalableVectorShape2D-nodes to make cuts in collision shapes and navigation areas.
Playing Rat's Return will give a first impression how this might work:
ScalableVectorShape2D already ships quite some convenience methods like:
clipped_polygon_has_point(global_pos : Vector2) -> boolandadd_clip_path(other_shape : ScalableVectorShape2D)
But I have not come around to documenting yet.
When the Update Curve At Runtime checkbox is checked, the shape will also sync up with a scene running in debug mode.
Once you're done drawing and do not need the shape to change anymore at runtime you can turn this checkbox off again.
- This plugin was first inspired by Mark Hedberg's blog on rendering curves in Godot.
- The suggestion to support both
Polygon2Dand collisions was done by GeminiSquishGames, who's pointers inspired me to go further, like implementing uniform transform tools. - The SVG Importer code was adapted from the script hosted on github in the pixelriot/SVG2Godot repository
- The code for making cutout shapes was adapted from the great knife tool plugin by @mrkdji
- The inspiration for using Geometry2D.offset_polyline for strokes came from @theshaggydev, who recorded this video about it.
- Lot's of gratitude to @kcfresh53 for architecting the auto-scaling control image textures via the
SVGTextureHelpernode and theSVGTextureResource
And a big thank you goes to to @MewPurPur
The author of GodSVG for writing a great SVG Arc command implementation I could reuse here:
- Download from the GodSVG website
- Or try out the web version
- Also on itch.io
As an early adopter Hannes was quick to point out good quality of life improvements like snap to pixel, setting global position exactly and exporting as PNG.
Make sure to try out "Spring Ball" on Itch, a 48h game jam solo project that used ScalableVectorShape2D for all level objects, including a wrapper script to change the block that makes up the majority of the level between cube and triangle shapes:
- @hedberg-games
- @thiagola92
- @HannesParth
If you have feedback on this project, feel free to post an issue on github, or to:
- Follow my channel on youtube: @scalablev2d
If you'd like to improve on the code yourself, ideally use a fork and make a pull request.
This stuff makes me zero money, so you can always branch off in your own direction if you're in a hurry.
Footnotes
-
Looking for EZ Curved Lines 2D? The renamed plugin deprecates the old
DrawablePath2Dcustom node in favor ofScalableVectorShape2D. A Conversion button is provided: converter button. The reason is thatScalableVectorShape2Dinherits directly fromNode2Dgiving much more control to the plugin over how you can draw. ↩ -
Important sidenote: This plugin only supports a small - yet relevant - subset of the huge SVG Specification ↩
-
Coming soon: a 3D Node with an editable outline using a
ScalableVectorShape2Dnode ↩ -
Arcs are implemented the same way as specified by the w3c for scalable vecor graphics. ↩
-
Note that the
collision_polygonproperty ofScalableVectorShape2Dremains supported for backward compatibility, even though the inspector form will now show a deprecation warning and suggest replacing it by assigning aCollisionObject2Dto thecollision_objectproperty. ↩ -
see also: the cloud example ↩











































