Changelog: v2.15
v2.15.0 (unreleased)
These fixes come from a full review of RaiSim and rayrai. Unless an entry says otherwise, results in ordinary scenes are bit-identical. A change is only noted where it alters the output of a scene that did not hit the bug.
RaiSim
- Behaviour change: world XML, URDF, MJCF and inline scene text that does not parse is now a fatal error that names the file, row and column. Before, everything after a typo was dropped silently and the world loaded with objects and settings missing. Text, a stray end tag, a second element or CDATA outside the root element is an error too (comments, processing instructions and whitespace there are still accepted). The vendored TinyXML no longer reads past a multibyte character cut off at the end of the input, and no longer loops forever on it (the CVE-2021-42260 pattern). On Windows, world XML, URDF (with its sensor and actuator files), MJCF (with its includes) and
.rassetfiles load from folders whose names the active code page cannot represent; paths are UTF-8 (raisim::pathFromText()andraisim::isUtf8()inPathUtils.hpp), and code-page strings that are not valid UTF-8 still work. Mesh files named by a URDF or MJCF, modules, URDF export and USD import do not handle such folders yet. - Behaviour change: an MJCF
<joint>without atypeis a hinge on top-level bodies too, as in MuJoCo; before, it welded the body. MJCF default classes that are defined twice or inherit from themselves are errors instead of a stack overflow. URDFzaxisandaxisangleare normalized, and a zero vector is an error. A URDF material defined after its first use is applied, and a visual's own color no longer changes the shared material. Vector and list attributes accept subnormal numbers, so exported files with tiny values load again.searchForFile()with an empty root searches the working directory instead of/..rscenemodulesandjointOrderlists are unescaped one item at a time. Compound children'sappearanceis exported. USD visual mesh caches no longer collide for prim paths that differ only in/versus_, and USD texture paths given asfile://URIs are decoded. - Checkpoints: restoring a checkpoint taken before the first ray query no longer freezes the ray and lidar caches; before, rays missed bodies that moved after the restore.
setObjectMaterial()andsetObjectCollisionFilter()no longer make earlier checkpoints unrestorable. Checkpoints also keep deformable pin targets and the sleep-state ids. - Sleeping: adding or removing an object, or changing a material or collision filter, wakes only the islands it can affect instead of every island, and
removeObject()keeps the sleep states of the remaining objects. A sleeping granular pool wakes when a body hits it or its grains move. World::setWorldTime()shifts the times of live blasts, explosions and projectiles with the clock, so a reset in the middle of a blast no longer replays it. A surface burst placed exactly on the ground loads the bodies around it; its line-of-sight rays used to stop at the ground.integrateNoContactDetection()advances projectiles and blasts.- Behaviour change: invalid input is now fatal: a ray or lidar with a non-finite length, direction or pose; collision indices outside [0, 63] in
collision[...](collision[]means none); Gaussian depth noise with a standard deviation of zero or less; a zero or non-finite quaternion insetGeneralizedCoordinate(),setState()orsetBaseOrientation(); a non-orthonormal base rotation matrix; a root joint that is neither FIXED nor FLOATING (Joint::typenow defaults to FIXED);setBodyType(DYNAMIC)on a ground or height map; a malformed OBJ face index; a height-map text file whose header declares more heights than the file holds. ArticulatedSystem::getGeneralizedMomentum()returns M·u. It used to return memory that was never computed. It is computed when called and is valid before the first step.- Position-only
solveIK()overloads ignoreuseOrientation, as documented.solveIK()no longer overwrites the solver's velocity scratch, and it cleans contacts exactly when it moves the system.getContactPointVel()is zero for the skipped half of a self-contact; before, it read another contact's stale Jacobian. - Behaviour change (solver): articulated self-collision contacts use their pair's true relative normal velocity for restitution. Before, a stale Jacobian could enter it. This changes the results of robots whose links touch each other.
- Behaviour change (solver): rolling and spinning friction converge. Their rows used to report an error that never shrank, so every solve with angular friction ran to the stall exit (11 sweeps a step for a ball held on a slope), dropped the warm start of every pin, and let held bodies creep. The rows now report the change of their impulse and are warm-started. A held ball converges in 1 sweep, and a resting pile with rolling friction in about 1 instead of 4. Results change only in scenes with rolling or spinning friction. A contact that loses its normal impulse also releases its angular impulse.
World::resetContactSolverWarmStart()(andBisectionContactSolver::resetWarmStart()) clears the solver's warm start, so the steps aftersetState()or a reset do not depend on earlier ones. The default behaviour is unchanged.- Contact detection:
- Two small triangles (a few millimetres) or small convex hulls separated by more than 0.1 mm are no longer reported as touching by GJK, unless the GJK search reaches its iteration limit first (then the previous answer is kept). Touching pairs keep their exact contacts.
- A capsule whose axis passes into a box is pushed out along the axis of least overlap, with its true depth. Before, it was pushed sideways from the box center by one radius whatever the depth.
- A box–cylinder or box–capsule pair limited to fewer contacts than it has no longer drops a contact that is more than 1 nm deeper than every contact it keeps. In that case it keeps a deepest contact and spreads the others over the contact patch; otherwise the selection is unchanged.
- A sphere whose center lies on a box face gets that face's normal instead of +x.
- Degenerate box–box contact sets no longer repeat their deepest point.
- Mesh–mesh contacts with opposed normals are no longer merged into one.
- A ray aimed at a height-map cell whose first sample is a hole hits the cell's other triangle.
- Rays with a zero or non-finite direction or length miss everything instead of turning into +z.
- The sweep-and-prune broadphase keeps only the pairs that overlap instead of a table of every possible pair: 20,000 bodies used about 1 GB. Pair order is unchanged.
- Multi-box pruning no longer loses pairs on x86 when a body lies far outside the grid.
- Perlin terrain from a seed is the same with every standard library: macOS, Windows, WebAssembly and source builds against libstdc++ 11 or newer now produce the terrain of the released Linux binaries.
- Deformables: surfaces resampled from a mesh whose triangles differ in size are closed. Before, edges shared by two triangles were split differently, which left cracks, and
Mode::Filledfailed with "requires a closed triangle mesh" on anything but uniform meshes such as cubes. Particles of torus-, cup- or multi-part closed meshes sit inside their surface; their offsets were taken from the centroid, which put some of them outside.pinVertex()no longer changes the rest shape. World XML writes a pinned particle'spin_targetonly when it was pinned away from its rest position. Volumes built from negatively oriented tetrahedra get an outward boundary. - Granular systems: grains on a periodic boundary collide across the seam; before, they overlapped by half a diameter there and were thrown apart. Sleeping and STATIC systems use the world's gravity and (sub)step time step. A grain deep inside a closed mesh is pushed out. Bulk emitting and removing particles is linear in the particle count. Non-finite radii, positions and material values are rejected, a drained system's checkpoint loads, and every system has an object id.
- Fluids: a mesh shape wound inward gets buoyancy and drag; before, all its loads were dropped silently. Each closed part is oriented on its own. A mesh that is not closed is ignored with a warning.
- Sensors: the CPU depth camera casts its rays like the segmentation camera, from the near plane to the far plane along the camera axis, so corner pixels reach the far plane and bodies nearer than the near plane no longer blank pixels.
World::captureDepthCamera()matches it. A spinning lidar sweeps at most one turn after a jump in time. A tactile contact of zero weight no longer erases the taxel's force. RaisimServer:- Camera, focus and screenshot requests made while no viewer is connected no longer pile up until no viewer can connect. The queue is bounded and is cleared when a frame cannot hold it.
- Behaviour change: a viewer can write the world to a file only after
setViewerWorldExport(true). - The server deletes the visuals it owns, and
VisualsandCharthave virtual destructors. - Viewer camera replies that no longer match the camera are dropped instead of ending the process. Segmentation replies rendered before an object was removed are requested again.
- A polyline segment between two equal points is sent with an identity rotation instead of NaN.
addVisualHeightMap()checks names among height maps. Visual height maps reach the viewer under their own name. Removing a visual articulated system or height map updates the viewer.- The listening socket no longer blocks the server thread, and
pauseSimulation()andstepSimulation()calls from other threads are no longer lost. - The new
PROTOCOL_FEATURE_SENSOR_IMAGE_OFFSETsends camera image offsets to the viewer.
- Math:
- Behaviour change:
VecDyn(size_t)is explicit andv = 1., 2., 3.;fills aVecDyn/MatDynwithout resizing it. Before, it silently made a one-element vector. - Behaviour change: matrix expressions other than 1×1 no longer convert to
double.+=,-=,/=between expressions and==/!=are element-wise; before, they used element (0,0) only. dot()checks the sizes.- On macOS the public headers no longer redefine
aligned_alloc.
- Behaviour change:
- Removed
ArticulatedSystem::getFullDelassusAndTauStar()(also from raisimPy), a stale copy of the contact Jacobian build. - New contact-engine functions
meshGeometryEpoch()andmeshGeometryFingerprint()incontact_engine/mesh.h. - Class layouts of
World,ArticulatedSystem,DeformableObject,GranularSystem,Visualsand the contact detector changed: rebuild raisimPy and code compiled against older headers.
Rayrai
- Hi-Z occlusion culling:
- On GL below 4.3 (macOS) the Hi-Z build no longer leaves the viewport at a mip size; before, the rest of the frame rendered into a corner.
- The pyramid is stored as 32-bit float. Half floats culled instances just in front of walls.
- The pyramid has full mip chains for odd sizes.
- The culling shader gives up instead of reading thousands of texels for a large near instance.
- Depth and segmentation sensor images honor alpha-mask cutouts, the base-color alpha factor and the albedo UV transform like the color image. Linear depth comes from view-space depth instead of
gl_FragCoord.z, which is more accurate far away. - Sensor cameras:
- They apply their image offset (
x_offset,y_offset), as the CPU cameras do. - A near clip of 0 gives a near plane of far × 1e-4 instead of 0.1 m.
- Segmentation readback ignores the application's pack inversion.
- Lights and billboard shadows follow the rendering camera instead of the GUI camera.
- They apply their image offset (
- GPU lidar no longer reuses the geometry of a removed terrain or mesh, or of a mesh edited in place.
- Shadows:
- Orthographic cameras with more than one cascade keep their shadows at the screen edges.
- Cascades follow an off-axis image window.
- With the opaque depth prepass and simple materials, moving dynamic primitives are no longer replaced by shadow casters.
- Debug overlays no longer clear lights or compound the weather effect.
- Assets:
- glTF alpha is no longer applied twice. OPAQUE materials ignore alpha, and occlusion maps are used.
- Grayscale textures render gray (they were red), and gray+alpha cutouts keep their alpha.
- Raw embedded texels are no longer red/blue swapped.
- Line and point primitives are no longer drawn as triangles.
- An OBJ bump map that is clearly a normal map is used as one.
- FBX fallback lights are scaled like the meshes.
- glTF lights are not duplicated, and cyclic node graphs are rejected.
- Materials with their own wrap mode no longer change shared textures.
- Edited or newly added texture files are picked up.
- On Windows, model and texture paths with characters outside the code page load.
- Mesh visuals loaded in the background get automatic LODs. Mesh LOD caches validate their contents and live in a per-user cache folder; their version changed, so they are rebuilt once. Async LOD preparation survives worker exceptions.
- Picking ids of objects and visuals no longer collide, and visuals outside their visibility range cannot be picked.
setGroundPatternResourcePath()updates an existing ground. The static scene layer keeps HDR values. Probe filter sample counts are clamped to 1024.
TCP viewer
- Stopping a video recording, or quitting, no longer hangs when an example was started while recording: the ffmpeg pipe and the viewer's sockets are no longer inherited by child processes. On Windows, recording and Encode To Video work again (the quoted command line was mangled). Encode To Video runs in the background and never overwrites an existing file.
- The viewer rejects malformed frames (with an oversized sensor or instance count, or a truncated section) instead of allocating without bound, or half-applying them. A parse error ends the session. Legacy layout guesses were removed.
- Visual height maps are drawn at their real height and pose. Collision-body toggling keeps mesh colors. Inspector joint sliders use the right joint limits. Depth and segmentation previews are upright. Examples that never announce a port stop after 60 s, and beacons from other computers are ignored. Pane layouts and settings values containing
#survive a reload. Replay speed is clamped. - On Windows, dropped files, the file browser, resource folders, screenshots and videos handle non-ASCII paths. Resource folders saved with non-ASCII names by an older viewer have to be added again.
- Sends time out after 5 s on a stalled server.
Browser (WebAssembly)
- Releases no longer attach
webassembly-<version>.zip. The browser examples and the scene editor are on this website, andwebassembly-sdk-<version>.zipstays the download for building browser programs of your own (WebAssembly SDK).
FEM Workbench
- Behaviour change: the workbench opens B-rep CAD solids only: STEP, IGES and BREP, plus its
.rfemprojects. Volume meshes (.msh,.mesh,.vtk) and triangle surface meshes (STL, OBJ, PLY, glTF, DAE) are rejected; export a STEP solid instead. - Clicking a face selects the whole CAD face, and dragging still rotates the view. Before, clicks did nothing until a selection tool was chosen, and that tool then blocked rotating. Hovering highlights the face under the pointer, Ctrl/Shift+click adds or removes faces, and clicking empty space clears the selection. Faces keep their CAD identity through meshing and remeshing, so faces stay selectable after meshing.
- The panel follows the analysis steps: open the CAD, select faces, then apply supports and loads with buttons that act on the selection and stay disabled until there is one. Supports are drawn as green cones and loads as magenta arrows in the 3D scene, so the solid hides them by depth. Faces with a support or load are tinted, and adding a condition reports where it was applied. The panel is docked on the left and the 3D view fills the rest of the window, so parts are centred in the visible view instead of behind the panel. Results use a blue-to-red scale (red for high values) on a light grey background with brighter ambient lighting, and dark lines mark the boundaries between CAD faces. Button icons and labels are left-aligned.
- The native mesher (
raisim_fem_mesher --surface-only) and the browser CAD importer write the B-rep face of every preview triangle (surface format version 2; version 1 is still read). Projects are saved as version 5 with their CAD faces; older projects open with their faces grouped into smooth patches. - The Edit panel is organized in tabs (Model, Parts, Loads, Connect, File) instead of one long list of sections, and switches to the Parts or Loads tab after a file opens.
- Edit and Result view buttons at the top of the panel separate setup from results. Edit shows the undeformed solid with its supports and loads; Result view shows the deformed, colored solid, the display and export settings, and a summary of peak von Mises stress, peak displacement and strain energy. Solve switches to Result view. Half-transparent Von Mises and Displacement buttons at the top right of the view switch fields and become opaque under the pointer, and hovering over the solid shows the element value. Before, results replaced the setup view as soon as a solution existed.
- Interface icons are Uicons by Flaticon (https://www.flaticon.com/uicons), credited in the panel.
- Behaviour change: the workbench meshes with a new RaiSim constrained Delaunay mesher, natively and in the browser, instead of fTetWild. The surface is remeshed to the element size and the curvature of the CAD, keeping every CAD face boundary; points are inserted with exact predicates, the surface is recovered in the tetrahedralization and the volume is refined and optimized. On a robot knee-mount STEP part at 5 mm it takes 3.4 s with all threads (3.7 s on one core) instead of 141 s, and the two-block assembly, hollow cylinder and sphere fixtures mesh 7-30 times faster with equal or better element quality. Curved parts get more elements than before (1.3-4 times), because the surface follows the CAD to the requested accuracy. The same geometry and settings always give the same mesh, independent of the number of threads; solids are meshed in parallel and CAD faces are tessellated in parallel within
--threads. - Behaviour change: Gmsh is no longer supported as a mesher; Use external Gmsh and
RAISIM_FEM_GMSHare gone. Projects saved with Gmsh selected still open and mesh with the built-in mesher. - Behaviour change: CAD files are read by original RaiSim STEP, IGES and BREP readers instead of Open CASCADE, natively and in the browser. STEP supports analytic and rational B-spline curves and surfaces, oriented trimming loops, faceted B-reps, units, assembly placements and mapped instances; IGES supports solid B-rep topology (entities 186, 514, 510, 508, 504 and 502) with analytic and rational B-spline surfaces; ASCII BREP V1-V3 supports analytic surfaces, non-periodic B-splines, surface curves and seams. Shared CAD edges are sampled once and faces are triangulated in their parameter space against the surface error, keeping every CAD face id. Unsupported entities and open shells are reported as errors instead of being sewn or replaced. The native helper needs no shared libraries besides the C++ runtime, and builds no longer download Open CASCADE or occt-import-js. On an AMD Ryzen 9 3950X, the two-part STEP assembly meshes in 13-79 ms (20-5 mm), the hollow cylinder in 0.51 s and the sphere in 1.9 s (15 mm), with volume errors of 0, 0.11% and 0.30%; three Gmsh example files (a torus, a freeform part and an 18-solid assembly) are read and tessellated in 0.18-0.86 s.
- Needle triangles from tiny CAD edges are collapsed and folded tessellation triangles are unfolded. Narrow CAD faces and sharp wedges are meshed with triangles sized to their width, and folds are prevented in the surface remesher. Before, such parts (one at every element size of 23 mm and above) failed with "Cannot recover the surface".
- Progress bars for meshing and solving, with elapsed time and Cancel.
raisim_fem_mesherprintsRAISIM_FEM_PROGRESS <fraction> <stage>lines. The solver runs on a background thread; the view stays interactive and editing pauses until it finishes. - Total force can act normal to its own faces (a uniform normal pressure with the given total magnitude, the default for new forces on faces), along X/Y/Z components, or normal to a reference face picked in the view.
- Supports and loads on whole CAD faces follow those faces through remeshing. Before, a support on a CAD face often failed to transfer to the generated mesh ("The mesh does not preserve the complete fixture region") because the mesher did not reproduce CAD face boundaries exactly; the new mesher keeps them.
- Behaviour change: Solve refines the mesh automatically where stresses concentrate (Refine stress concentrations, on by default). After each solve it estimates every element's error, bisects the elements holding half of the estimated error and solves again. It stops at the target error (10% of the energy by default), after three refinement steps or at 400,000 elements. Supports, loads and the selection follow the refined faces exactly. The result summary shows the estimated error and element count. Results therefore differ from earlier versions on the same mesh settings; turn the option off to solve on the generated mesh alone. On a 52,000-tetrahedron STEP part, three steps took 16 s of solving and raised the strain energy by 39% (the coarse mesh was too stiff).
- Assemblies: dropping a STEP, IGES or BREP file, or Add CAD, adds it to the open model as more parts (before, a dropped file replaced the model), and the command line accepts several files. Parts lists every solid with show/hide, isolate, focus, remove and Clear all, and gives each part the model material or its own (with presets). Connect parts joins two parts by clicking the faces of each: glue (bonded tie), bolt, bearing/pin, ball joint, slider or rigid link; bearing and slider axes are fitted to the faces. Solve meshes the files in parallel on up to half of the CPU cores and solves the parts together. Projects save the parts, their materials, yield strengths and positions, and the added and removed parts; older projects still open.
- Result view: labels pin the peak von Mises stress, peak displacement and lowest factor of safety (optionally the min and max of any field), which can be dragged aside (double-click resets them); clicking with Probe values pins values at chosen points. Deformation can be Automatic (largest displacement at 5% of the model size), True scale or Custom, and can be animated. Contours are node-averaged by default (or per element), with continuous colors and a threshold that greys out low values. A Factor of safety field uses yield strengths, which the material library includes (stored per part in projects; older projects leave them unknown). The summary lists the minimum factor of safety and the reaction force of every support. The solver status and the latest message share one box at the top left of the view instead of a separate bar at the bottom.
- Workbench panel: the Parts tab lists each part as an expandable row (colour stripe matching the 3D view, name, material, show/hide and remove); expanding it sets the name, model or own material and offset. The view buttons are icon only, with named tooltips, in one row at the bottom centre of the view; the color legend stays at the top right. The panel no longer shows instructional text; tooltips and the animated hover previews explain the controls. X, Y and Z inputs carry red, green and blue bars (with the numbers padded away from them), and supports, loads and connections are marked green, magenta and cyan in the panel. Parts use more distinct colours.
- Quick connections: selecting faces on two parts (click one, then Ctrl/Shift+click the other; a plain click always selects a single face, also in the Connect tab) shows a toolbar beside the pointer with the connections that fit those faces, best first, as in a CAD assembly's quick mates: bearing/pin and slider for concentric cylinders, ball joint for concentric spheres, glue for touching faces, bolt for opposite in-line seats, and rigid link always.
fem_workbench::describeFacesclassifies a face set as planar, cylindrical or spherical andfem_workbench::suggestMatesranks the connections. - Behaviour change: the scroll wheel zooms about the point under the cursor (SolidWorks style) instead of toward a fixed centre, the right button and Ctrl+middle button pan, and the middle button rotates as well as a left drag on empty space. The view no longer recentres when parts are added, removed or remeshed; Center and Fit all at the bottom centre of the view look at the geometric centre of all parts. In Edit mode, dragging a part moves it (lock with Move parts; exact offsets in the Parts tab). Moving keeps the mesh, supports, loads and connections, and remeshing applies the offset again.
- Hovering over a support or load button, or an entry of More supports, shows an animated sketch and a description of what it does.
- Mesh edges draws every edge of the surface mesh as depth-tested lines, for meshes of any size. Before, edges were drawn only up to 18,000 faces and showed through the solid.
- Mates place parts against each other as in a SolidWorks assembly, for example before gluing them: Coincident, Parallel, Perpendicular, Tangent, Concentric, Distance, Angle and Lock, and the advanced Profile center and Width, between planes, cylinders and spheres, with Aligned/Anti-aligned and other-side options. Selecting a face on each of two parts offers the mates that fit in the quick toolbar, with a preview on hover and Flip, Edit and Undo after adding one; Add mate opens an editor with two face boxes, the mate types, the options and a live preview, like the Mate PropertyManager. The moving part turns and moves by the smallest motion; Distance and Angle start at the current value. Mates persist (named Coincident1, Distance2, ...), can be flipped, edited or removed under Mates, and are saved in projects. A part keeps all of its mates (a second mate fixes how it turns on the first), conflicting mates are refused, parts positioned on a moved part follow it, and the Parts tab shows how many motions each part keeps. A part can be fixed (Fixed in the Parts tab): mates then move the other part, and it cannot be dragged. Dragging previews the motion the mates allow, Shift+drag turns a part, and the Parts tab sets Rotation X/Y/Z, Move by and Rotate by steps and Reset. Supports, loads and connections on a moved part keep their centres and axes on it; before, a translated part left the centre of a bearing or remote displacement behind. Projects are saved as version 10 with part rotations, fixed parts and mates; version 1-9 projects still open. The model API is
Model::addMate(MateRequest),previewMate(),editMate(),removeMate(),movePart(),previewMove(),setFixed()andfreeMotions();fem_workbench::solvePlacementsolves the mates of a part (closed-form rotation and translation, then minimum-norm Gauss-Newton from several starts). - Connections are added with an editor that shows both face boxes at once instead of the Next/Create steps, and the quick toolbar labels them (Glue, Bolt, Pin, Ball joint, Slider, Rigid link). Glue touching faces glues every pair of faces where two parts touch, like the contact sets SolidWorks finds automatically (
Model::touchingFaces(),bondTouchingFaces()). The model API isModel::addConnection(kind, firstFaces, secondFaces, tolerance), which takes faces only;connectionAxisFitted()reports whether a pin or slider axis was fitted. - Set material opens a material library of 170 engineering materials in 15 families (carbon and alloy steels, stainless steels, cast irons, aluminium, titanium, copper, nickel and cobalt, magnesium and other metals, plastics, reinforced plastics and composites, elastomers, wood, ceramics and glass, concrete and stone), chosen by family and then grade or by search, with Young's modulus, Poisson's ratio, density and strength. It replaces the nine presets, which keep their names and values.
- Result view lists what every connection carries: force and moment, and for glue the average and peak peel, compression and shear and the equivalent shear sqrt(shear^2 + peel^2 / 3), spread over the bond from the transmitted force and moment as in the elastic method for bonded joints (mesh-independent; the singular stresses at single edge nodes are listed separately). Bolts report shank axial, shear and von Mises stress. An adhesive lap shear strength (with typical adhesives) or bolt yield strength (property classes) gives a factor of safety, and labels pin the peak of every glue and bolt.
Model::connectionLoad()returns these values; projects save the strengths. - Clicking faces of one part shows a toolbar beside the pointer with the supports and loads that fit them, in every tab and in Result view (which switches back to Edit) (Fixed and Roller for planes; Fixed, Bearing and Bolt hole for cylinders, with the axis fitted; Fixed and Ball for spheres; Force and Pressure), which applies one and opens it in the Loads tab. The quick toolbars can be dragged out of the way and stay there while open.
- Dragging a face moves its part in Edit mode, also when the model has a single part; dragging empty space or the middle button turns the view. Hovering over a face says so. A press becomes a drag only after the pointer moves more than ImGui's drag threshold (6 pixels), so a slightly shaky click still selects the face.
- Right-clicking a part hides it until a face is picked, to reach faces behind it; while parts are hidden, Show all parts appears at the right edge of the view. The part list shows or hides parts with an eye button.
- More buttons carry icons (the mate types, show/hide, swap, undo, flip, copy, search and others); the Uicons subset now has 55 glyphs, and a test checks that every icon the workbench uses is in it.
- Hovering over a mate or connection in the Connect tab, or over a connection in the quick toolbar, shows it in the 3D view: the rest of the model turns half transparent, its two face sets stay opaque in yellow and cyan (lit from both sides, so faces that face away or lie behind others show), plane normals, cylinder axes, a pin or slider axis, a ball-joint center, a link line or a distance dimension, and a label saying what it does.
Model::mateFaces()finds the faces of a mate again from its stored shapes. Edit and Result view at the top of the panel are drawn as tabs. - Hovering over a support or load in the Loads tab list makes the model half transparent and shows its faces opaque and brightened in the support or load colour, with its name.
- The workbench panels use the RaiSim colors: graphite surfaces with outlined fields and check boxes, the logo's pink for the active tab and hover, a logo-gradient strip at the top and a pink Solve button. The 3D view keeps its colors and blue-to-red contours. The hover tooltip no longer covers the toolbar that a click on a face opens.
RaiSim
LinearElasticity::setProgressCallback()reports the stage and progress ofsolve(); iterative solves report their residual reduction. Results are unchanged, and an exception thrown by the callback cancels the solve.- Behaviour change:
LinearElasticity's Automatic backend preconditions conjugate gradients with smoothed-aggregation algebraic multigrid (SolverBackend::AlgebraicMultigridCG) instead of incomplete Cholesky for models with at least 5,000 free DOFs. It stops at the same residual, so results agree within that tolerance (cantilever tip displacements match to ten digits), but they are not bit-identical. Iteration counts no longer grow with the mesh: a 245,760-tetrahedron cantilever in bending solves in 1.9 s instead of 8.0 s (3.6 s instead of 32 s at Poisson ratio 0.49), and a 258,000-unknown CAD part in 3.4 s instead of 60 s. Easy axial-tension models of medium size are slightly slower because of the multigrid setup (212 ms instead of 142 ms at 41,472 tetrahedra).SolverBackend::IncompleteCholeskyCGkeeps the previous solver, andStatistics::multigridreports which preconditioner ran. raisim/fem/ErrorEstimation.hpp:estimateRecoveryError()estimates the energy-norm discretization error of every element from the recovered stress (Zienkiewicz-Zhu), andrefinementTargets()marks the elements holding a given share of it.raisim/fem/MeshResolution.hppaddsrefineElements()(bisect marked tetrahedra to per-element targets) andrefineToEdgeTargets()(per-vertex targets); both keep the mesh conforming, split longest edges first to bound element quality, and report the parent edge of every new vertex.refineToMaximumEdge()produces the same meshes as before.