Changes - History

This page lists changes and fixes that directly affect the API and usage of the Tinman 3D SDK, in chronological order.

A change is associated with a date when it is first included in a release:
YYYY/MM/DD ⬤ - full release
YYYY/MM/DD ⭘ - stable preview

To review the concrete API changes, please refer to Changes - API and Changes - Scripting. There you will find listings of added, removed and renamed API elements.


The existing behaviour has been modified, which might require minor code adjustments.


A new feature has been added, or the existing functionality has been extended.


A bug has been fixed. Performance improvements are treated as bug fixes.


2023/10/20 ⬤

RELEASE - V1.0 RC4.17

§205 / FIX

Improved responsiveness of EnvironmentMapResource by optimizing the performance of IEnvironmentMap.Rasterize2 and ColorCube.Texture1.

§204 / FIX

Reduced memory pressure when using Grammar to parse huge amounts of complex source code.

§203 / FIX

Fixed incorrect output of parenthesis according to precedence and associativity of CxExpression objects, regarding right-associative operators.

§202 / FIX

Fixed a bug in StringUtil.NumberParse and Parse.Number that caused numeric imprecision for very long numbers in non-scientific format (i.e. 0.000123, instead of 1.23E-4).

§201 / FIX

Fixed a bug in EnvironmentMapResource that prevented IEnvironmentMap.MaximumEnvironmentColor from being applied correctly in some cases.

2023/09/29 ⬤

RELEASE - V1.0 RC4.16

§200 / FIX

Fixed a bug in IModel.ColliderWithPose that made the method return an empty IModelCollider if neither IModel.Collider, IModel.ColliderLoad nor IModel.PrepareLazy has been used before.

§199 / FIX

Fixed a threading issue regarding parallel use of IEnvironmentMap.ComputeEnvironmentColor that caused sporadic flickering in scene lighting because of temporary inconsistencies in the resulting environment map texture.

§198 / FIX / C++

Now using static constexpr for compile-time floating-point constants with initialization in the header file, instead of the source file.

2023/09/20 ⭘

PREVIEW - V1.0 RC4.15

§197 / CHANGE

The ITextureFactory.CreateTexture2D method now throws a RenderException if the requested texture array slice count is greater than MaximumCount, instead of throwing a FailedAssertionException in DEBUG mode and returning a truncated texture in RELEASE mode.

§196 / CHANGE

The Colors.Adjust method now preserves the alpha channel value of the given input color, instead of always returning an opaque color, which also affects the behaviour of IImageOps.Adjust and IPixelLayer.Adjust.

§195 / FEATURE

Added support for rendering of realtime data to TerrainDecal. See Example_TextureStreaming for details.

§194 / FEATURE

Added Geodata Examples for Venus and Mercury.

§193 / FIX

Fixed a bug in ColorOp.Blend of IImageOps.Op that caused slight numeric imprecision.

§192 / FIX

Fixed a bug in SpatialOctree that made 3D ray-picking fail to work for 3D models which only have a single triangle as geometry.

§191 / FIX

Fixed performance issues during equality comparison of ModelTexture.For when wrapping ColorBuffer or TexelBuffer objects.

§190 / FIX

Fixed some minor performance issues related to the use of the generic CollectionsUtil.EqualsArray method by using the new SystemUtil.ArrayEquals method for primitive types.

§189 / FIX

Fixed incorrect handling of row padding in tiled TIFFs by ImageFormat.TIFF, which resulted in bad data at the right-most tile column for image widths that are not multiples of the tile size. Please use GdalImageFormat as a work-around.

§188 / FIX

Fixed a bug that made the Workshop Application fail to display a message box when the Processor Tool tries to report that "The given value is empty", which means that the Operation value is null.

2023/09/10 ⭘

PREVIEW - V1.0 RC4.14

§187 / FEATURE

Finished TerrainBufferFlags.Coverage feature set.

§186 / FEATURE

Added a general-purpose 3D model decoration framework to 3D Model, including a built-in decorator for silhouettes. See the following for details: Silhouette, SilhouetteDecorator, TerrainView.Decorator, Vehicle.Silhouette, Example_Models.BuildSilhouette.

§185 / FEATURE

ImageFormat.WriteImage is now available for ImageFormat.PXB.

§184 / FEATURE

Finished IModel.ColliderWithPose, which allows to perform spatial queries on IModel hierarchies in combination with ModelPose.

§183 / FIX

Improved overall traversal performance of SpatialTree by optimizing the nested hierarchy of bounding boxes.

§182 / FIX

Fixed a bug in ISpatialQuery.DistanceTo that in some cases caused incorrect results and/or performance degradation.

§181 / FIX

Fixed a stack-overflow error in IImage.ReadImage that could occur for some image descriptors when passing the RenderImageFlags.Range flag.

2023/08/31 ⬤

RELEASE - V1.0 RC4.13

§180 / CHANGE / C++

The specification of ByteBuffer.Allocate now requires initialization of the allocated memory to zero. The C# implementation already did this, now the C++ implementation also does. Before, the initial memory contents were undefined.

§179 / CHANGE

The TexelBuffer.Convert methods now take an srgb parameter for controlling the Srgb flag of the resulting texel buffer.

§178 / CHANGE

Subclasses of Widget are now required to call ScreenshotProcess, in order to trigger processing of screenshot requests that have been submitted via IWidget.Screenshot.

§177 / CHANGE

The Render method of Widget is now annotated with EmptyBodyAttribute and thus no longer calls Render2D and no longer triggers screenshot processing. The Render method of WidgetApplication now calls Render2D on each of its widgets.

§176 / FEATURE

Added support for OpenGL 4.1 Core Profile (or newer), see OpenGLContextFactory.

§175 / FEATURE

Added support for OpenGLES 3.0 (or newer), see OpenGLESContextFactory.

§174 / FIX

Fixed a bug in MaterialParameters that sometimes prevented glossiness/roughness from being applied correctly during rendering.

§173 / FIX

Implemented some overall runtime performance improvements:

  • Optimized C++ smart pointer code

  • Reduced number of virtual calls and eliminated dynamic memory allocations during User Interface layout, see Container.ValidateLayout

  • Reduced number of virtual calls for 2D rendering, see Graphics.

  • Minimized buffer pool underflows in MeshBuffer which caused unnecessary dynamic allocations at runtime.

  • Improved performance of computation of Semantic.Horizon values in MeshBuffer.

  • Improved parallelism between GPU and CPU in TerrainView by reordering the render stages and by optimizing the use of GPU fences.

§172 / FIX

Fixed a numeric overflow bug in Parse.Number and StringUtil.NumberParse that caused incorrect results for inputs near the value of Maths.MaxLong.

§171 / FIX

The ConsumeInput method of Widget now correctly passes absolute window-space mouse coordinates when calling the same method on its child components.

§170 / FIX / C++

Fixed a bug in RenderPipeline.Flush that, in some cases, prevented RenderPipeline.WaitForGpu from working correctly.

Fixed a bug in RootSignature that caused a crash when running in 32-bit mode.

§169 / FIX

Corrected detection of available video memory (see ITextureFactory.AvailableVideoMemory) for DirectX11Context and DirectX12Context.

§168 / FIX

Fixed some issues with DirectX12Context:

  • Detection of supported multisample counts now works correctly.

  • Rendering of point primitives now works correctly.

  • No longer requiring support for a RaytracingTier, this is now optional.

§167 / FIX

Fixed 2D vertex format of Graphics:

  • CreatePrimitiveBuffer now correctly documents the vertex format (24 bytes of vertex data, followed by 8 bytes of padding).

  • Write now correctly writes the padding bytes.

As a work-around, call ByteBuffer.PutLong to write the missing 8 bytes of padding manually.

2023/07/19 ⭘

PREVIEW - V1.0 RC4.12

§166 / CHANGE

Removed unused methods from Geometric helper class.

§165 / FEATURE

Added support for high-performance collision detection / distance queries between 3D models, see ISpatialQuery.DistanceTo.

§164 / FEATURE

Added members to IWidgetGui for selectively controlling the visibility of the whole widget GUI or its panels, see Visible and PanelState.

§163 / FEATURE

Existing Direct3D 11 devices can now be wrapped with DirectX11Context.ForDevice.

§162 / FIX

Fixed incorrect handling of nested preprocessor directives (see #include) in Processor class.

2023/07/04 ⭘

PREVIEW - V1.0 RC4.11

§ 161 / CHANGE

The source code of the HLSL/GLSL shaders now has a uniform structure, which is generated automatically from C# code using the Code-X workflow.

§ 160 / CHANGE

Moved the types in the Tinman.AddOns.API namespace to Tinman.Engine.API, which makes them part of the Tinman.Engine component.

§ 159 / CHANGE

Removed Quality from MultiSampleType, because it represented a mostly outdated and practically obsolete concept (e.g. choosing a device-specific quality level for multi-sampling, such as NVidia’s CSAA for the GeForce 8 series), at least in the context of the Tinman 3D SDK.

§ 158 / FEATURE

Added a ready-to-use ISceneEntity implementation to the Scene framework for creating particle effects, see ParticleEffect.

§ 157 / FIX

Fixed a bug in ModelReader.TextureFileReplace that prevented texture file replacements to be applied correctly when the bad texture name refers to a non-existent file.

§ 156 / FIX

The ConfigValueBrowser_Tinman_AddOns.BrowseModelReader method now correctly outputs the validation messages that have been generated by IModelReader, for example: "texture['bad-name.png']: Cannot resolve texture name.". In the Workshop Application, these messages now show up properly in the Message List, in the Browser section. The Inspector Tool does not show these messages, because it only inspects the model reader itself, without loading the model.

§ 155 / FIX

Fixed incorrect rasterization of HeightmapShape objects that use per-vertex HeightmapSamples data which does not include all HeightmapLayers of the enclosing IHeightmapShape object.

§ 154 / FIX

Fixed rendering of thick 3D lines with Renderer for LineFeatureLevel.DX10 (wrong clipping, distorted thickness) when the line segment endpoints are on different sides of the Z=0 plane.

2023/05/02 ⬤

RELEASE - V1.0 RC4.10

§ 153 / CHANGE

Distribution licence keys may only be used to unlock the redistributable binaries in non-debug mode. To unlock the SDK in debug mode, a Development licence key is required.

§ 152 / FEATURE

Added support for particle effects (e.g. smoke, fire, dust) to the Scene framework. See ParticleBuffer, Example_SceneApi.BuildFireEffect and Tutorial_31_Showcase for details.

§ 151 / FIX

Fixed a bug in ISimpleHttp.GetImage of SimpleHttp where the defaultSrgb parameter could get interpreted incorrectly.

§ 150 / FIX

Fixed rendering of ICanvasFactory.Bounds in CanvasWidget (green rectangle) after setting Factory to a different object.

2023/04/14 ⭘

PREVIEW - V1.0 RC4.9

§ 149 / CHANGE

The ITextureFactory.CreateTexture2DStatic method now also scales the given TexelBuffer objects to the supported texture size, in addition to converting them to the supported texture format, instead of throwing a RenderException.

§ 148 / CHANGE

Added new render target formats and changed the naming scheme to become more compact.

§ 147 / CHANGE

Decoupled GPU render target buffers when using IGraphicsContext.CreateRenderTarget, to allow more flexible usage scenarios:

§ 146 / FEATURE

Added order-independent transparency to the GPU rendering layer. See the new IRenderStage API for details.

§ 145 / FEATURE

The ImageDecal class now supports image content tiling, which allows image data to be used that is larger than the supported maximum texture size and increases parallelism of loading large images.

§ 144 / FEATURE

Added a deterministic refinement mode to the MeshBuffer class, for example to be used during offline processing or in distributed rendering environments, see MeshBuffer.CycleLimit and TerrainBufferFlags.Deterministic.

§ 143 / FIX

Fixed a panic in MeshBuffer.MeshUpdate that could happen after removing a mesh right after its creation, before it would become ready.

2023/03/29 ⭘

PREVIEW - V1.0 RC4.8

§ 142 / CHANGE

Simplified TerrainBufferFlags and exposed them to SceneOptions.

§ 141 / CHANGE

Dropped obsolete per-vertex tangent vectors for terrain meshes: terrain texturing uses terrain-space instead of tangent-space, terrain materials use tri-planar mapping.

§ 140 / CHANGE

WidgetBounds.FullScreen now always puts the widget onto the whole screen and ignores the user-interface screen regions (see INonUserInterfaceBounds). Use WidgetBounds.ClientArea to get the old behaviour.

§ 139 / CHANGE

Changed default value of EnvironmentMapSky.GroundColorDark. Use #111111 to get the old appearance.

§ 138 / CHANGE

Replaced the ModelRenderer.Wireframe property with the model renderer flag ModelRendererFlags.Wireframe.

§ 137 / FEATURE

Improved quality and robustness of per-vertex ambient occlusion terms (see Semantic.Horizon) and shadow-mapping (see ShadowMapping).

§ 136 / FEATURE

The new ModelRendererFlags.PixelFrequency flag may be used to improve performance in cases where the quality improvement of running pixel shaders at sample frequency is negligible. For example, Tutorial_22_Game uses on-the-fly planting of instanced geometry, which is rendered at pixel frequency, because the quality difference to sample frequency is not noticeable while the drop in performance is significant.

§ 135 / FIX

Fixed a problem with inconsistent input event processing of WidgetApplication when IApplicationWindow.MouseCaptured is used.

§ 134 / FIX / C++

Added missing CODEX_TYPE_METADATA_BASE directives for types derived from the system types IEquatable, IComparable, IEnumerable and IEnumerator, to make CodeX::cast, CodeX::castSafe and CodeX::instanceOf work as expected.

§ 133 / FIX

Fixed undefined semantic of IBagConst.ContainsAll when both collections are empty.

§ 132 / FIX

Moved input state processing of WidgetApplication out of RenderPrepare, to fix problems related to lingering and/or lost input events when the application loop performs no rendering.

§ 131 / FIX

The DirectX12Context class now splits large GPU uploads (for example huge textures or vertex buffers), instead of failing.

2023/03/14 ⭘

PREVIEW - V1.0 RC4.7

§ 130 / FEATURE

The ModelRenderer class now uses bicubic interpolation on the GPU to produce high-quality specular reflections.

§ 129 / FEATURE

Finished IRenderTarget.Finish of DirectX12Context for RenderTargetFormat.Mipmaps.

§ 128 / FEATURE

Added support for high-dynamic range environment maps, see EnvironmentMapImage.HdrAutomatic and ImageFormat.HDR.

§ 127 / FEATURE

The range of actual raw pixel values in an image may now be queried with IImageInfo.Values and computed with ReadImageFlags.Range, if necessary.

§ 126 / FEATURE

Added support for tiled images to ImageFormat.TIFF.

§ 125 / FIX

Fixed a bug when using RenderTargetFormat.Mipmap with DirectX11Context that prevented mipmap levels from being computed correctly.

§ 124 / FIX

Fixed a bug in ImageFormat.TIFF that prevented images with planar configuration to be loaded correctly.

§ 123 / FIX

Fixed a bug that caused gamma-correction to be applied to alpha values in GdalImageFormat, ImageFormat.BMP and ImageFormat.TIFF.

2023/03/07 ⬤

RELEASE - V1.0 RC4.6

§ 122 / CHANGE

The ModelRenderer class now uses the formulae of the glTF 2.0 specification and the associated reference implementation for rendering, using the new material properties of the IMaterial interface.

§ 121 / CHANGE

Changed error handling of DirectX12Context: instead of panicking, the RenderPipeline now goes into failure mode and silently drops all subsequent rendering. Error details are output as log messages and the next call to IGraphicsContext.Validate will then return false.

§ 120 / CHANGE

Replaced the ModelFlags.Lighting flag with the ModelPartFlags.NoLighting flag. Building 3D models by using the Model class will now create lit geometry by default, the new flag may specified explicitly to create unlit geometry.

§ 119 / FEATURE

ModelFormat.GLB (read)

§ 118 / FEATURE

ModelFormat.GLTF (read)

§ 117 / FEATURE

Native Libraries (Used By table columns)

§ 116 / FEATURE

Added a debug helper to the MG class for enabling system messages of the OpenFlight API, for testing and debugging.

§ 115 FIX

Fixed some byte alignment issues when using non-power-of-two textures that have a block-based format (for example BC1) with DX9 / DX11 / DX12, which caused incorrect rendering of whole textures or single mipmap levels.

§ 114 FIX

Fixed several bugs in ModelWidget regarding camera control problems, level-of-detail rendering not working properly for the shadow pass and clamping of the visible depth range.

§ 113 FIX

Fixed several bugs in the implementations of IBufferCodec.BufferEncode that caused false-positive assertion failures regarding texture block size misalignment and possible buffer overflows when passing in byte buffers with a capacity of 22 bytes or less.

§ 112 FIX

Fixed handling of instance and reference nodes in OpenFlightModelReader when reading 3D models in the FLT format.

§ 111 FIX

Fixed a bug in IModel.Simplify that mingled child transformations when ModelSimplifyFlags.RemoveEmptyChildren or ModelSimplifyFlags.SortChildren was used.

§ 110 FIX

Dirty state processing of built-in SceneObject subclasses now correctly triggers rendering of new frames by returning true from UpdateFrameTime.

§ 109 FIX

Fixed a bug in Mat3D.Orthogonalize and Mat3F.Orthogonalize which resulted in non-orthogonal output basis vectors if the input basis vectors are nearly co-linear.

§ 108 FIX

Texturing.Progress now returns 100 instead of 0 when no terrain sectors have been processed, for example when all terrain parts are culled away while looking straight up.

2023/02/10 ⬤

RELEASE - V1.0 RC4.5

§ 107 / CHANGE

Changed default unit of UnitOfMeasureType.Angle from UnitOfMeasure.Radian to UnitOfMeasure.Degree and introduced default values to scripting fields of CoordSys (and related types), in order to avoid output of redundant script code. This change affects the following API:

§ 106 / CHANGE

Simplified factory methods of ColorRamp and rasterization helpers of PixelPyramidShape.

§ 105 / CHANGE

Changed JSON grammar to no longer allow control characters (0x00..0x1F) to be present in string literals, for compliance with the official JSON specification. Trying to parse such an invalid value now correctly throws a ValidatingException.

§ 104 / CHANGE

IMapShapes.ShapeAdd and IMapShapes.ShapePrepare no longer always transform the given IShape to the target coordinate system that is used by rasterization. Instead, the transform parameter may now be used to perform this transformation optionally.

§ 103 / FEATURE

Added surface levels to 3D models, to avoid Z-fighting of co-planar surfaces, see IModelPart.Layer.

§ 102 / FEATURE

Built-in file format / OpenFlightModelFormat (read)

§ 101 / FEATURE

Updated the documentation to better explain the interaction between ISceneEntity.CreateView, ISceneEntityView.Owner and ISceneView.ViewOf.

§ 100 / FEATURE

Added features for curves based on cubic splines (see Curve.Tangent) and associated shape factories, see Shape.Curve and RoadBuilder.

§ 99 / FEATURE

Shape rasterization via IMapShapes now supports on-the-fly projection, which will be performed automatically if the coordinate system of a IShape is not the same as the target coordinate system used by rasterization (for example, a global cubemap coordinate system).

§ 98 / FEATURE

Added support for localization of text labels in GUI components.

§ 97 / FIX

The ISceneView objects that are created by the Vehicle class via ISceneEntity.CreateView now return their respective owner via ISceneEntityView.Owner, instead of returning null, which made ISceneView.ViewOf return null and caused null-pointer errors when a Vehicle was removed from the scene.

§ 96 / FIX

Fixed equality comparison between IGeoObject objects after deserialization, where objects that had been equivalent before became non-equivalent afterwards.

§ 95 / FIX

Fixed rendering of FloatingLabel tick lines that broke with § 85.

§ 94 / FIX

Fixed handling of distance field offsets for IShape objects that use a geographic coordinate system by correcting the scale factor that is used by CoordinateSystemTransform.TransformScale, affecting the following API:

§ 93 / FIX / C++

Eliminated the possibility of object self-destruction during the execution of constructors of classes derived from CodeX::Object (C++), caused by smart pointers that acquire and release the this pointer. Constructors may now use the new CODEX_CONSTRUCTOR macro to prevent this. Before this fix, self-destruction had to be avoided by not wrapping this in smart pointers, which required special care when coding constructors.


2022/12/27 ⭘

PREVIEW - V1.0 RC4.4

§ 92 / FIX

Fixed bad handling of corrupted BlockStorage data by throwing an IOException (instead of panicking or crashing) which indicates the location of corrupted file, for example:
Invalid 'BST' file: <path/to/corrupted/file>

§ 91 / FIX

Fixed a null-pointer error in the implementation of the ISceneObject.QueryRay method by the SceneEntity class, which occured when the list of TerrainModel objects (see ITerrainEntityContainer) is empty. As a work-around, add an empty TerrainModel object:
sceneView.TerrainModelAdd(new TerrainModel());

2022/12/13 ⭘

PREVIEW - V1.0 RC4.3

§ 90 / FIX

Fixed a bug in GPU synchronization with multiple ISceneView objects which caused occasional flickering, because GpuUpdateFlag.NoOverwrite was used to update data still being in use by rendering.

§ 89 / FIX

Fixed a sporadic GPU crash after resetting / switching the graphics context because of uninitialized data being used by TriangleMode.TriangleTerminal or TriangleMode.SectorList, which triggered Timeout detection and recovery (TDR).

§ 88 / FIX

Improved performance of when using TriangleMode.SectorList for terrain triangulation on the GPU.

§ 87 / FIX

Fixed terrain mesh refinement for problematic data (e.g. spikes, near-vertical slopes, displacement with wrinkles), which produced high amounts of unnecessary triangles, thus slowing down overall performance.

§ 86 / CHANGE

Moved some helper methods from ISceneView3D to IScene, please use ISceneView.Scene to access them, if necessary.

§ 85 / FIX

Fixed calls to SceneObject.QueryScreenLabelResult2 that were passing null as the label parameter, causing possible null-pointer errors in FloatingLabel and ScreenGizmo.

§ 84 / CHANGE

Repackaged the Tinman.AddOns library components so that a separate library is only used when 3rd-party dependencies exist at build-time (dependencies still exist at run-time).

§ 83 / FIX

Fixed a bug in Path.Copy that sporadically caused IOError.SharingViolation errors due to a lingering IFile object for the source of the file copy operation.

§ 82 / FIX

Fixed a bug that could cause an array out-of-bounds error when decoding TriangleMode.SectorList primitives on the CPU and could make the GPU crash when using TerrainFeatureLevel.DX11 or higher.

§ 81 / CHANGE

The IScene.Transform method family now takes VerticalType.Height as default parameter value instead of VerticalType.HeightMesh, because its primary purpose is to place static objects in the scene.

§ 80 / CHANGE / C++

The CodeX::String::Trim (C++) method no longer uses isspace resp. iswspace to check for whitespaces. Instead, the logic of FormattingUtil.IsWhitespace is used. The same logic is used by System.String.Trim (C#).

§ 79 / FIX

Fixed a null-pointer error in ScreenLabelPlacement when calling Clear without having initialized Size first.

§ 78 / FIX

Fixed a bug that sometimes caused a DirectX9RenderTarget to not update its content properly when IRenderTarget.Finish is called.

§ 77 / FIX

Fixed a spurious panic in MeshBuffer and a possible mesh refinement freeze that became apparent with § 75.

2022/11/22 ⭘

PREVIEW - V1.0 RC4.2

§ 76 / FIX

Greatly improved performance of IHeightmap.GetSample, especially when being used repeatedly on heightmaps that have a complex aggregation structure, as it is often the case in the Scene API where Geocentric.ToVerticalOffset is used a lot, for example by GeoPathTrack entities.

§ 75 / FIX

Fixed a sporadic bug in MeshBuffer that could make the Refinement Thread think that a vertex may be re-used, although it is still visible to the application in the Shadow Buffer.

§ 74 / CHANGE

The Aircraft class has been refactored into the Vehicle class, which provides additional helpers and examples for moving ground vehicles around while aligning them to the terrain slope.

§ 73 / FEATURE

Added helpers to the Scene API for placing objects on the ground, while aligning them with the terrain slope by computing pitch and roll angles automatically, see GroundPathTransform, YawPitchRollTransform and IScene.Transform.

§ 72 / FIX

Fixed a grammar bug in ConfigScript which made it impossible to declare an array of qualified identifiers:
variableName = [ ScriptName::memberName ] ;

§ 71 / FIX

Fixed a number of minor issues in the ConfigScript API that prevented qualified identifiers to be resolved properly, when referring to members of other scripts in the domain.

§ 70 / FEATURE

Added callbacks for dynamic DPI changes at runtime, so that applications may adjust rendering, for example by choosing appropriate font and image sizes: IApplicationWindow.Resolution, IApplication.WindowResolution, IGraphicsComponent.GraphicsResolution

§ 69 / FIX

Fixed a bug in the high-DPI handling code of ApplicationControlWpf in the Tinman.AddOns.WPF component, which caused the render canvas to be sized incorrectly and the mouse cursor position to be interpreted wrongly.

§ 68 / CHANGE

Platform-specific limits for file and directory path lengths are now taken into account by IFileSystem.PathValidate of LocalFileSystem.

§ 67 / FIX

Fixed stack-overflow error when outputting extremely long messages with LogMessageFormat.Default.

2022/11/14 ⭘

PREVIEW - V1.0 RC4.1

§ 66 / FEATURE / C#

The C# assemblies of Tinman 3D SDK are now available on NuGet.

§ 65 / CHANGE

ModelRenderer now uses AffineTransform instead of Mat4D, which reduces the number of required arithmetic operations during model traversal and eliminates redundant conversions.

§ 64 / CHANGE

AffineTransform now uses separate methods for forward and reverse transformations, instead of a single combined one with an inverse parameter, which favors more aggressive optimization by compilers.

§ 63 / CHANGE

The Visual Studio solutions in the Tinman 3D SDK package now use the 2022 version. C++ code may be compiled with the 2022, 2019, 2017 or 2015 toolset. C# code may target Mono 6+, .NET Framework 4.8, .NET Core 3.1 or .NET 6.0+. Out-of-support versions or legacy toolsets may still be used (for example .NET 5.0), by adjusting the project files.

§ 62 / FIX

Fixed a bug in GeoPathConverter that did not read the input vertical coordinate correctly if it was different to GeoPathValue.Ellipsoid.

§ 61 / FIX

Various performance improvements and minor fixes regarding use of numerous scene objects (> 10.000) with the Scene API.

§ 60 / FIX

TerrainView.TextureProgress now returns 100 instead of 0 if the terrain does not have any texture layers.

§ 59 / FIX

Various performance optimization regarding memory consumption and runtime efficiency:

§ 58 / FIX

Fixed the signed distance field of shapes that have shared polygon contour edges, which may result from using the ReadShapeFlags.HintMergePolygons flag.

§ 57 / FIX

Fixed trimming of the common whitespace prefix from all text lines in a TextBlockNode when there are one or more empty text lines.

§ 56 / FEATURE

The difference between state handling of terrain objects in the High-level Terrain API and scene objects in the Scene API is now explained in Scene Overview / State Handling and exposed to code by the ITerrainEntityContainer interface.

§ 55 / FEATURE

IShapeReader and Shape.File now support filtering and modification while reading shape data.

§ 54 / FEATURE

Shapes may now carry JSON metadata and custom per-vertex shape values.

§ 53 / FEATURE

Introduced IJsonValue interface, so that immutable JSON values may be passed around safely.

§ 52 / CHANGE

ShapeFormat.CSH now uses delta encoding to reduce file sizes by ~30%. New .csh files can no longer be read with old SDK versions, but old .csh files may still be read with new SDK versions.

§ 51 / FEATURE

ShapeFormat.SHP no longer requires that the *.shx index file exists and can read shape data solely from a single *.shp file.

2022/10/05 ⬤


§ 50 / CHANGE

Extracted GUI code from tutorials and moved them to sub-namespaces, according to their target API (e.g. low-level / high-level terrain API, scene API).

§ 49 / CHANGE

Revised ISceneQuery API, to allow re-use of scene query objects and to increase flexibility via aggregated query operations.

§ 48 / FIX

Optimized interpolation code in GeoPath, which increases performance by a factor of ~300%.

§ 47 / CHANGE

ModelReader now computes per-face normal vectors when a model does not contain normal vector data. Computation of smooth per-vertex normal vectors may be enabled with ReadModelFlags.SmoothNormals.

§ 46 / FEATURE

ModelFormat.OBJ now supports materials via .mtl files.

§ 45 / FIX

ModelFormat.OBJ and ModelFormat.LAS now correctly apply ModelReader.RootUnit.

§ 44 / FIX

Fixed longitude wrap-around distortion in IPixelPyramid.Unproject.

§ 43 / FEATURE

Added default color-space handling to ISimpleHttp.GetImage and HttpPyramid, to disambiguate cases when sRGB image data is returned without color-space information. For example, BingMaps sometimes returns PNG files that contain sRGB image data but do not include a GAMA or SRGB chunk.

§ 42 / FEATURE

The PixelFontBuilder class has been improved to provide better control over the font building process and now uses a slightly modified pixel font image format. Please rebuild your custom pixel font files once, to migrate to the new format.

§ 41 / FIX

Fixed rendering of opaque 3D lines with Direct3D 9 which broke with § 32.

§ 40 / CHANGE / C#

Refactored C# project files (*.csproj) to SDK-style and performed minor code fixes to compile and run on .NET Framework, Mono and .NET 5+ / .NET Core.

§ 39 / FIX

The Decaling class has been improved to eliminate inaccurate mapping of decal textures, which happened at cubemap edges / corners and when large geo-referenced image overlays were used.

§ 38 / CHANGE

Changed semantic of decal textures in Low-level Terrain API: decal vertex coordinates must now be specified in a given coordinate system, it is no longer possible to use heightmap coordinates directly. See IDecal for details.

§ 37 / FIX

Fixed some numeric precision issues in ICoordinateTransform implementations to comply to to the Geospatial Integrity of Geoscience Software (GIGS) Test Dataset v2.1.

§ 36 / FIX

Fixed numeric overflow bug in LatLon.FromSexagesimal and updated epsg-9.9.1.dat accordingly. IGeoRegistry.Name returns "EPSG 9.9.1 / Tinman 1.0 / Rev.1" for the fixed version.

§ 35 / CHANGE

Changed semantic of CoordinateSystem.CreateCoordinateTransform to throw a GeorefException when CoordinateSystem.IsLocal returns true.

§ 34 / CHANGE

Changed semantic of Dome.Subdivision to allow direct control of the coefficients that are passed to ModelGeometry.Sphere and ModelGeometry.SphereIco.

§ 33 / FIX

The texture addressing mode in the DirectX9Effect subclass for decaling was incorrectly set to TADDRESS_CLAMP and has been fixed to TADDRESS_BORDER with transparent black as border color.

§ 32 / CHANGE

ModelRenderer.LineThickness and TerrainModel.LineThickness have been removed. Please use Material.LineThickness and IModelGeometrySimple.ToModel instead.

§ 31 / CHANGE

Geocentric.Vertical no longer assumes that the given heightmaps are cubemaps and use the same geographic coordinate system as the Geocentric object.

§ 30 / CHANGE

The value of TextureDecal.Offset is now added to the vertex coordinates of the decal texture (after scaling and rotation), instead of subtracting it.

§ 29 / CHANGE

Scene.UpdateFrameTime no longer calls SceneView.UpdateFrameTime. See Scene and SceneView for details on the new update behaviour.

§ 28 / CHANGE

Changed semantic of automatic calls to MeshBuffer.MeshUpdate, which makes TerrainViewFlags.MeshUpdate obsolete. See TerrainView for details.

§ 27 / CHANGE

In the logging framework, renamed LogSeverity to LogVerbosity.

§ 26 / FIX

Enabled of TextureLayer now toggles the visibility of the underlying TerrainLayer.

§ 25 / FIX

MBTilesPyramid now applies the geographic bounds, if present in metadata table, to avoid that out-of-bounds data appears on the terrain.

§ 24 / CHANGE

SceneEntityBase.SceneAttach no longer calls UpdateState before returning, so that subclasses do not have to deal with incomplete initialization in their DoUpdateState overrides.

§ 23 / FIX

Modifying the GeoPathTrail.ColorFill / GeoPathTrail.ColorLine properties now correctly triggers an update to the 3D model.

§ 22 / FEATURE

The render order of terrain decals can now be configured per terrain layer, see: TerrainDecal.SortIndex, ImageDecal.SortIndex, TextureDecal.SortIndex.

2022/01/21 ⬤


§ 21 / FIX

DirectX9Context.SetGeometryBuffer now sets up non-instanced geometry explicitly:
IDirect3DDevice9::SetStreamSourceFreq(0, 1) IDirect3DDevice9::SetStreamSourceFreq(1, 1)
Instead of using an instance count of 1 (n = number of instances):
IDirect3DDevice9::SetStreamSourceFreq(0, n | D3DSTREAMSOURCE_INDEXEDDATA)
IDirect3DDevice9::SetStreamSourceFreq(1, 1 | D3DSTREAMSOURCE_INSTANCEDATA)
These variants should be equivalent. In some specific cases, the second variant does not work.

§ 20 / FIX

Fixed endless loop in Path.MakeRelative when passing Path.Unknown.

§ 19 / CHANGE

IGraphicsContext.ClearRenderTarget is no longer allowed to fail silently when invalid clear flags are passed. Instead, the clear is performed using the valid subset of the given flags.

§ 18 / FEATURE

Added warning log messages for failed non-critical render API calls (DirectX9, DirectX11).


2021/10/17 ⬤


§ 17 / FEATURE

Added the possibility for case-insensitive comparisons in various methods of the Path class and the related API.

§ 16 / FEATURE

Exposed the set of invalid characters for path elements via IFileSystem.InvalidCharacters.

§ 15 / FEATURE / C++

Added NATVIS files to make C++ debugging easier.

§ 14 / CHANGE / C#

Moved unit testing API (C#) into separate library.

2021/09/10 ⬤


§ 13 / FEATURE / C++

Now using C++ noexcept for non-throwing methods, in order to allow more aggressive code optimization.

§ 12 / CHANGE

No longer using the WinAPI WaitForSingleObject function.

2021/05/10 ⬤


§ 11 / FIX

Fixed some numerical bugs in map projection code.

§ 10 / FEATURE

Updated EPSG geodata registry to version 9.9.1.

2021/04/10 ⬤


§ 9 / FIX / C++

Fixed the algorithm that orders #include directives in the C++ source code, to reduce the number of code changes for future updates.

2021/03/10 ⬤


§ 8 / CHANGE

Unified DisposeManaged / DisposeUnmanaged of Disposable into DisposeResources.

§ 7 / CHANGE

Removed obsolete hooks for disposal at shutdown.


Tinman shutdown now frees all resources and reverts to the initial state.


Tinman can now be used again after shutdown.

2021/02/10 ⬤


§ 4 / FIX

Fixed a bug when loading non-power-of-two DDS textures.

§ 3 / CHANGE

Now using local NuGet cache for packages, please run "Restore NuGet packages" once.

§ 2 / CHANGE

AddOns for Direct3D 9 no longer use the D3DX Effects API, source code has been dropped.

2021/01/10 ⬤


§ 1 / FIX

Now performing additional thread-synchronization in Disposable class. There were reports of spurious sharing violation problems on dataset files when being used concurrently.


2019/04/01 ⬤


Please refer to Fixed Issues for additional information.