Release Notes
Welcome to the Release Notes for the Stride Community Toolkit. This section aims to provide you with an organized, high-level summary of changes, enhancements, and fixes made in each version release. If you're looking to understand what has changed from one version to the next, you're in the right place.
What to Expect
The Stride Community Toolkit is developed with rapid iteration in mind. It moves at a faster development pace compared to the Stride Game Engine. As a result, you should expect frequent updates that may introduce breaking changes. This fast-paced approach allows us to incorporate community feedback quickly and continue improving the toolkit.
1.0.0.0-preview.68
What's Changed
💥 Breaking Changes
- Built against Stride 4.4.1 (was 4.4.0). What a game sees from the engine: transparent materials are brighter, since alpha is applied once; Direct3D 12 needs no Developer Mode and ships the Agility SDK in a
D3D12folder beside the executable; every effect, shader and material compiles again once on the first run;MaxStepPerFrameis honoured; a hybrid laptop runs on its discrete GPU.
Lettering comes from fonts
LetterMeshFactory, with its 37 hand-authored glyphs, is gone; TextMesh builds solid lettering from any font, with the toolkit's embedded Open Sans as the default.
| Before | After | Note |
|---|---|---|
LetterMeshFactory.CreateTextMeshDraw(device, "XYZ") |
TextMesh.CreateMeshDraw(device, MeshFont.Default, "XYZ") |
In Stride.CommunityToolkit.Rendering.Text. Any character the font has, upper and lower case, digits, punctuation. |
CreateTextMeshDraw(..., depth: 0.3f, spacing: 0.1f, centerOrigin: true) |
new TextMeshOptions { Depth = 0.3f, LetterSpacing = 0.1f, Anchor = TextAnchor.MiddleCenter } |
Size is world units per EM; the old glyphs were one unit tall, a capital is now about 0.7 of Size. |
LetterMeshFactory.SupportedCharacters, TryGetOutlines |
font.HasGlyph(c), font.GetGlyph(c) |
A glyph the font lacks draws its "missing glyph" box instead of throwing. |
🎉 New Features
EarClipping.Triangulate(outer, holes)is new; the one-polygon overload is unchanged.MeshBuilder.AddExtrudedPolygonis unchanged.scene.GetComponentsInScene<T>()andgame.GetComponentsInScene<T>(), withGetComponentInScene<T>()for the first match: every component of a type across a scene, its children and child scenes, or across every scene the game has loaded. The scene-wide half of the FindObjectOfType answer.game.Script.RunOnGameThread(action)andRunOnGameThreadAsync(function): hand work from any thread to the next update, with the result back as a task. Ends "Collection was modified" from network callbacks and finished downloads.transform.RotateAround(point, axis, angle)swings an entity about an axis through a point and turns it by the same angle;transform.FaceDirection(direction)turns the forward axis along a world direction, with the samesmoothasLookAt. Both update the world matrix.MeshFont: a font file opened for its glyph outlines through the FreeType the engine ships, so TrueType, OpenType and collections work on every platform.MeshFont.Defaultis an embedded Open Sans Regular;Load(path),Load(bytes)andFromFamily(family, style)open any other. Outlines come back in EM units as curves (GlyphOutline,GlyphContour,OutlineSegment) and flatten into polygons with their holes sorted out (GlyphShape).TextMesh: solid 3D text from aMeshFont.Creategives CPU mesh data,CreateMeshDrawuploads it,CreateGlyphsgives one centred mesh per glyph for a body or an animation per letter,Measuregives the block. Lines, alignment, letter and line spacing, curve quality, the nine-point anchor, and texture coordinates on caps and walls, throughTextMeshOptions.Primitive3D.Text: lettering as a shape, soCreatePrimitivegives it a material and a collider of one convex hull per glyph, on Bepu (TextCollider) and on Bullet.TextBevel: a rounded edge between the caps and the walls of 3D text, front and back, throughTextMeshOptions.Bevel; a bevel wider than a glyph's thinnest stem shrinks for that glyph instead of folding.- Instancing needs one call, not three:
UseInstancing()on the scene setup puts the render feature in the compositor from the first frame, andAddInstancingBufferUploadadds it itself. A master whose compositor has no render feature used to draw as one model with nothing said; the run loop now logs a warning naming the entity. EntityInstancingandBufferedEntityInstancingunregister an instance whose entity leaves the scene, as the engine'sInstanceComponentdoes; a removed entity no longer draws on as a ghost untilClear().AddOrientationGizmo(): the world axes in a corner of the screen as arrows with white letters, in the proportions of Game Studio's space marker, turning with the camera and ignoring depth;OrientationGizmoRendererfor the corner, size, colours and opacity.AddGroundGizmostays the world-space marker of the origin.AddPhysicsDebug(contactsVisible: true)draws the solver's contact points and normals with the debug meshes, the debug view Stride 4.4.1 added;DebugRenderComponentScript.ShowContactsis the same switch on the component.E05_3D_TriggerZonesturns it on.ToMeshDraw(device),ToMesh(device)andBounds()onGeometricMeshData<VertexPositionNormalTexture>, for any procedural mesh data;TextMesh.CreateMeshandCreateModelgive lettering with its bounds, so the renderer can cull it.
🐞 Bug Fixes
E20_3D_CubeCollapse: the tower spread apart as it spawned. Since the scene setup chose Bepu (preview.67),CreatePrimitivegave every cube a dynamic body of its own on top of the spawner'sSlidingCubeComponent, and the two pushed each other apart; the cube is now created withIncludePhysics = false.
✨ Enhancement
SceneSetup.Nonestill honours what is not scene: the physics engine, the game settings, the overlay and the profiler.SceneSetup.None.UseBepu()is a hand-built scene whose primitives and ground get Bepu bodies, the way a tutorial that adds the camera, light and ground line by line wants it; before, the engine chosen on it was silently dropped. It is a new instance each time.AddSceneRendererkeeps aGameoverload with the signature binaries built against preview.66 and earlier bind to, soGum.Stride2026.10.1.1, built against preview.63, runs again; source binds to theIGameoverload as before.E02_3D_MaterialPreviewruns onSceneSetup.Noneagain: the default scene's ground, light and sky had crept under the thumbnail rig since the scene setup became data. The thumbnail camera has the controller; the editor's pose is the start and H brings it back.GrabberScriptpicks through trigger volumes: a body inside a zone can be grabbed, since a collidable whose handler saysNoContactResponsedoes not stop the pick ray;TryPick(segment, out hit)is that pick, for a game that wants the same rule.GrabberScriptserves a 2D scene as it is: under an orthographic camera the pick ray runs along the view and aBody2DComponentis carried across its plane; the mouse wheel does nothing for a 2D body or under an orthographic camera, since depth there is the plane itself.game.AddGrabber()is the same call in 2D and 3D. The reach (MaxDistance) defaults to 100 instead of 50: a 2D camera stands 50 from its bodies, and the stress pile is viewed from 80.
📄 Docs
- The glossary is in the top navigation, and defines gizmo, mesh collider, glyph and EM.
- FAQ: why a HUD never goes through the tone map (Stride's UI stage and the toolkit's overlays draw after the post effects), and the scene-wide search and game-thread helpers in the FindObjectOfType and background-thread answers. The entity extensions page gains a turning-and-moving section for the transform helpers.
- A manual page for the orientation gizmo (
rendering/orientation-gizmo.md), with the two gizmos side by side. - A correctness and verbosity sweep of the whole
docs/tree against the code: stale physics plumbing (CreatePrimitiveoverloads that no longer exist,SetupBase*), wrong defaults, keys and paths, dead links, the superseded Windows package, the four packages missing from the libraries list, example pages whose code includes swallowed the metadata block or described code that had changed, and the story-led rendering pages (render to texture, GPU picking, MeshBuilder, TextureCanvas) rewritten as reference pages. - Game Studio: a table of every toolkit component in the Add component menu, with its package, category and page.
- The examples pipeline's design-decisions page is gone from the contributing section; the three rules a contributor needs that were only there (why slugs carry no level, the metadata block last in the file, the navigation depth) are on the examples page and in the generator README.
- Every example page is now owned by the metadata block in its example: 24 hand-written pages became generated, and four keep a hand-written tail below the generated part (
generated: partial) for a second file, a multi-file walkthrough or the SignalR how-to. - Physics extensions: a section on the simulation clock (
TimeScale,Enabled,PoseGravity,MaxStepPerFrame,ISimulationUpdate), a Triggers and contact events section (Trigger,IContactHandler, what the callbacks get and when they run), a Shape queries section (Overlap,OverlapInfo,SweepCast,SweepCastPenetrating, what the distance means), and a Mesh colliders section, what aMeshCollideron a static keeps that a hull fills in, and what a mesh is not (a surface with no inside), measured inE05_3D_MeshColliders. - A manual page for 3D text (
rendering/text-3d.md); the MeshBuilder page points at it. A second page,rendering/text-3d-pipeline.md, walks the pipeline from the font file to the mesh, with the files behind each stage.
🎓 Examples
- Cube Collapse orbits its camera with
RotateAroundand turns its falling letters withFaceDirection, in place of the quaternion maths each script carried. E04_Myra_DraggableWindowis back in the solution and the docs: Myra.Stride 1.6.8 carries the Stride 4.4 retarget, so it builds and runs again.E04_Myra_ControlPanel: Myra's widget set in one draggable window that drives a Stride scene. A menu bar, tabs, sliders for the light and the physics clock, a combo for gravity, check buttons for shadows and collider gizmos, a spin button and buttons that spawn bodies, a list view that selects and lights one, a dialog before clearing, tooltips and a status line.E03_3D_TextShaders: four materials on the same solid lettering, a gradient texture through the caps' texture coordinates, a rim light as a shader-class colour node, a vertex-stage wave onGlobal.Timeand a pixel-stage dissolve driven per frame, each shader in the example'sEffectsfolder.E03_3D_MeshTextis 3D text from a font: the embedded font, an installed font found by family, lines that align in one mesh, the frame counter, and words with physics throughPrimitive3D.Text.E07_3D_ProceduralGeometryandE20_3D_CubeCollapseuseTextMeshfor their lettering.E05_3D_MeshColliders: a convex hull against a mesh collider on the same ring model, with a ball resting on the hull's lid and falling through the mesh's hole; a mesh sphere with a ball outside and one inside shows that a mesh has no inside; a moving mesh ring lands on a mesh ring. The overlay prints where each dropped thing came to rest, measured, and P draws the colliders.E05_3D_ShapeQueries: the two questions a raycast cannot answer. A probe box follows the mouse over a field of bodies and lists what it holds throughOverlap, a click tosses them; a ball is swept from a launcher throughSweepCast, a ghost marks the first touch, and T throws a real ball, without gravity, to land where the ghost was.E05_3D_Raycastcasts two rays: the camera's finds the clicked point, and a second one from the sphere through that point lists everything in that direction throughRayCastPenetrating, drawn as the line; panels stand around the sphere to be gone through.E05_3D_TimeControl: the simulation's own clock.TimeScalefrom 1/16x to 4x,Enabledto pause,PoseGravitycycled through Earth, Moon, none and upside down, a dropper on the game clock against a spinning bar on the physics clock, and anISimulationUpdatecomponent counting the steps.E05_3D_TriggerZones: reacting to contact. ATriggerzone with no model counts who enters and leaves, a solid plate with anIContactHandlercounts what stands on it, and a crate measures each hit withComputeImpactForce. Space drops balls, the grabber carries them.- A sweep of the example comments: references to the helpers that
SceneSetup3Dreplaced are corrected, comments that only restated the code and leftover commented-out code are gone, and the longest metadata descriptions are shorter. - A grabber in every Bepu example with bodies to pick up and a free left mouse button:
E01_2D_FallingShapes,E02_2D_Primitives,E04_2D_SpawnMenu,E05_2D_FallingShapes,E08_2D_DebugRender,E10_2D_StressPile,E01_3D_FallingShapes,E08_3D_CollidableGizmoandE08_3D_DebugRenderComponent, one line each; the overlay says so where there is one.
🔧 Engineering
- The
text-3dgold scene, the whole alphabet with a bevelled sample and aPrimitive3D.Text, joins the gold images; the text pipeline is covered byTextMeshTests,TextBevelTests,TextReviewTestsandTextColliderTests, every mesh checked watertight and outward-wound.