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.
2024
2024/10/03 ⬤
RELEASE - V1.0 RC4.26
public://sdk/1.0/RC4
- § 316 / CHANGE
-
Replaced default use of LineEnding.Native with LineEnding.LF:
- § 315 / CHANGE
-
Updated 3rd-party libraries:
-
Assimp 5.4.3
Used by AssimpModelFormat class -
Microsoft.Direct3D.DXC 1.8.2407.12
Used byTinman.Shaders
component -
Microsoft.Data.Sqlite 8.0.8 / SQLite 3.46.1
Used byTinman.AddOns.SQLite
component.
-
- §314 / CHANGE
-
The API now uses generic methods instead of generic class wrappers for helper functionality, which has been moved as follows:
-
CollectionsUtil<T>
→ AlgorithmUtil, ArrayUtil, ArrayVector -
Comparable<T>
→ AlgorithmUtil, SystemUtil -
DefaultConstructor<T>
→ SystemUtil -
DisposableUtil<T>
,DisposableUtil2<T1,T2>
→ DisposableUtil -
Equatable<T>
,EquatableRef<T>
→ ArrayUtil, SystemUtil -
Identity<T>
→ SystemUtil -
SerializationUtil<T>
→ ISerializer -
SystemUtil.Array*
→ ArrayUtil -
SystemUtil.VarInt*
→ IOUtil -
SystemUtilGeneric<T>
→ SystemUtil -
VersionedUtil<T>
→ Versioned
-
- §313 / CHANGE / C++
-
The Code-X Processor has been improved to generate forward declarations, using declarations and
#include
directives in C++ header files more intelligently, in order to increase code robustness and compilation speed. Existing code might run into problems, though:-
Header files no longer contain
using
declarations, so compiling code that uses formerly leaked symbols will fail because of undefined symbols. -
Header files more often use forward declarations instead of
#include
directives, so formerly complete types might become incomplete.
To fix, just include the missing types. For more details, please refer to: Why does compilation or linking fail?
-
- §312 / CHANGE
-
The SceneObject base class now implements the CallbackMask property in a different way: it is no longer
virtual
and its value must be specified via the constructor. - §311 / CHANGE
-
The ISwapChain.Present method has been split into PresentBegin and PresentEnd, to allow additional performance optimizations in ApplicationLoop.
- § 310 / FEATURE
-
Updated the EPSG geodata registry to version 11.017:
Path
"EPSG 11.017 / Tinman 1.0 / Rev. 1"
- §309 / FEATURE
-
The new DecoratorCoordinateAxes.RenderOverlay method can be used to render the same 2D overlay for coordinate axis labels and metrics as used by the ModelWidget class.
- §308 / FEATURE
-
The IShapeExtruder now supports texturing via its Texture property, see ShapeExtruderTexture.Building for an example for buildings.
- §307 / FEATURE
-
The new Privilege API allows client code to restrict the access that the Tinman 3D SDK has to system resources and native APIs:
- §306 / FEATURE
-
The Demo Application now showcases the Code-X Workflow by using the Code-X Processor to generate the C++, HLSL and GLSL source code from the Code-X compliant C# source code. Please refer to Code-X Framework for details on the development process.
- §305 / FIX
-
Fixed a problem in MeshBuffer that could cause the internal object pools to grow excessively up to approx. 1.5 GB of RAM when using complex IHeightmap objects, which in turn could cause out of memory errors, especially on 32-bit platforms. Please refer to Performance Guide / ObjectPoolUtil / Interval for details.
- §304 / FIX
-
Fixed a bug in the algorithm used by IShapeOps.Convert to convert shapes with from ShapeType.Polygon to ShapeType.Mesh, which causes incorrect results under some circumstances.
- §303 / FIX
-
Fixed various issues in CameraPath resulting from improper handling of control point replication (see ICurve) and from improper camera control interaction (see CameraControl). Now, Uniform-B splines and camera control suspension are used, see Maths.SplineUniformB and CameraControl.Suspend.
- §302 / FIX
-
Fixed a problem with the computation of per-pixel eye vectors in ModelRenderer for models with large polygons that intersect the near clipping plane, which caused incorrect rendering of reflections.
- §301 / FIX
-
Fixed a bug in Viewport that prevented the value of the AspectRatio property from being updated correctly when the Set method was used.
- §300 / FIX
-
Fixed a bug in the GPU shader code that caused slight flickering of the overall scene brightness while the lighting parameters change continuously, most noticeable when the Sun moves across the sky.
- §299 / FIX
-
Using SceneObject.DirtyFrame to trigger a redraw after a property change only works when ISceneObject.CallbackMask includes the SceneObjectCallback.UpdateFrameTime flag.
The SceneObject base class has been fixed, so that the required flag is always returned when a redraw has been requested earlier, even if the subclass did not specify it in the first place.
- §298 / FIX
-
Fixed an unwarranted runtime validation warning message that is output by Direct3D 11 when using DirectX11Context and calling IGraphicsFence.Set subsequently without calling IGraphicsFence.Wait in between, which is explicitly allowed by the interface and handled correctly by Direct3D:
ID3D11DeviceContext::End: End is being invoked on a Query, where the previous results have not been obtained with GetData. This is valid; but unusual. The previous results are being abandoned, and new Query results will be generated.
- §297 / FIX
-
Fixed some render issues with
ApplicationControlWpf
when using DirectX11Context:-
Selection of a compatible Direct3D 9 adapter for surface sharing.
-
Incorrect sRGB output and/or flickering when multi-sampling is disabled.
-
Black screen when running over a remote desktop connection.
-
Occasional one-frame latency, when rendering single frames sporadically.
-
- §296 / FIX / GLSL
-
The GLSL code now implements a proper work-around for the unsupported
noperspective
keyword when OpenGLES is used. - §295 / FIX
-
Improved rendering of 3D lines with the Renderer class: depth clipping distortions no longer occur for thin lines (LineThickness = 1) with DX10 and are now a documented restriction of DX9.
2024/07/20 ⬤
RELEASE - V1.0 RC4.25
public://sdk/1.0/RC4/REVISION-25
- §294 / CHANGE
-
The Tinman.AddOns.DirectX9 component now uses the
IDirect3DDevice9Ex
API, instead ofIDirect3DDevice9
. - §293 / CHANGE
-
The IGraphicsContextFactory.AdapterOrdinal and Graphics.adapter properties no longer revert to adapter ordinal
#0
when a value outside of the allowed range is specified. Initialization of the graphics context now fails in such a case.
- §292 / FEATURE
-
The
ApplicationControlWpf
class of theTinman.AddOns.WPF
component now supports Direct3D 11 as render API, in addition to Direct3D 9. TheWpfContextFactory
class has been removed, please use DirectX9ContextFactory or DirectX11ContextFactory instead. - §291 / FEATURE
-
Handling of multiple graphics adapters has been improved, to avoid problems related to incorrectly chosen adapters (e.g. integrated / power-saver vs. high-performance), see the following for more information:
2024/07/04 ⭘
PREVIEW - V1.0 RC4.24
- §290 / CHANGE / C#
-
The Silk.NET library does not support 32-bit for Direct3D 9 (and randomly crashes the process), so the CanCreateGraphicsContext property of DirectX9ContextFactory now returns
false
when running in a 32-bit CLR.
- § 289 / FEATURE
-
Updated the EPSG geodata registry to version 11.012:
Path
"EPSG 11.012 / Tinman 1.0 / Rev. 1"
- §288 / FEATURE
-
The GdalImageFormat now supports all GDAL versions from 1.7 as well as PROJ version 4 and all versions from 6. For details, please refer to the
LibraryNames
methods of theGdalLibrary
,Proj4Library
andProj6Library
classes.
- §287 / FIX
-
The LookupMemory methods of GL and GLES now make correct use of the GL_ATI_meminfo extension. Before, their incorrect use could cause runtime errors and/or memory corruption.
As a work-around, use IGraphicsContextFactory.AvailableVideoMemory to specify the amount of video memory, which avoids the problematic video memory query.
- §286 / FIX
-
The ModelFormat.OBJ now correctly interprets the
.mtl
commandsd
andTr
for material transparency. - §285 / FIX / GLSL
-
The GLSL source code no longer uses the following language constructs, which are not required by the GLSL specification and thus may be unsupported by some OpenGL drivers, for example Intel® HD Graphics:
void Function(float parameter = 1f) (1) { vec4 a = ...; vec4 b = ...; if (all(a == b)) (2) { ... } }
1 Function parameter with default value 2 Implicit conversion from bool
tobvec
The
==
operator behaves differently in GLSL (scalar result) and HLSL (vector result). Use ofall(…)
is required for HLSL but demands non-standard support by GLSL, via implicit conversion. - §284 / FIX
-
Fixed incorrect interpretation of ReadModelFlags.PureTextures by OpenFlightModelReader.
- §283 / FIX
-
Fixed a method precondition in the constructor of GLEffect:
compilationMacro
is optional and may benull
.The OpenGLEffect class passes a
null
value, which caused an InvalidArgumentException in DEBUG mode. As work-around, please changenull
to a dummy compilation macro name, for example"GL_DUMMY"
.
2024/05/31 ⭘
PREVIEW - V1.0 RC4.23
- § 282 / CHANGE / GLSL
-
GLSL code output has been improved for compatibility with more strict and less lenient OpenGL drivers, for example Intel® UHD Graphics:
-
The required GLSL ES language version is now 3.10 with
GL_(EXT|OES)_shader_io_blocks
, to properly declare use of interface blocks, in order to fix compilation errors like this:in / out storage qualifier not allowed
-
The GLSL ES language specification does not allow array types for vertex shader inputs. Such inputs are now unrolled into separate variables, which fixes this error:
invalid type on vertex_?
-
The interpolation qualifier
noperspective
as well as the auxiliary storage qualifierscentroid
andsample
are now output for every shader stage, not just the fragment stage, to fix compilation errors like this:Type of ? different between shaders
-
- § 281 / CHANGE
-
Throughout the SDK, the FileFlags.NoShare flag is used when writing files, in order to prevent accidental read accesses to incomplete (hence corrupt) data.
- § 280 / CHANGE
-
Change ownership behaviour of IPixelPyramid.Cache2, ITexelPyramid.Cache, IDataset.UseCache and DatasetFileCacheDelegate. To migrate existing invocations, an additional call to Acquire must be made to acquire ownership.
- § 279 / CHANGE
-
The StringUtil.ToLower and StringUtil.ToUpper methods now behave like
char.ToLowerInvariant
andchar.ToUpperInvariant
of .NET 8.0 on Windows 10. Before, it was consistent with .NET Framework 4.8. See this breaking change for additional information. - § 278 / CHANGE
-
The behaviour of FormattingUtil.GetCategory has been changed to become consistent with .NET 8.0. Before, it was consistent with .NET Framework 4.8. See this breaking change for additional information.
- § 277 / CHANGE
-
String.LastIndexOf now returns the string length if the search token has zero length, instead of the string length minus one.
"ABCDEF".LastIndexOf("") == 5 (1) "ABCDEF".LastIndexOf("") == 6 (2)
1 Old behaviour, consistent with .NET Framework 4.8 2 New behaviour, consistent with .NET 5.0+, see this breaking change for additional information. - § 276 / CHANGE / C#
-
The
Tinman.AddOns.SQLite
component now uses the NuGet package Microsoft.Data.Sqlite and no longer contains the native SQLite binaries, which must be provided as described by the NuGet package. See TinmanAddOnsSQLiteModule for more information.
- § 275 / FEATURE
-
The IImageOps.Pad method now offers a special padding mode, which can be used to restore the redundant pixel column in wrap-around datasets with PixelIsPoint semantic, if the pixel column has been omitted from the data. See the EGM2008 dataset for an example.
- § 274 / FEATURE
-
The IJsonValue.ToFile and IJsonValue.ToString now provide a choice for the output encoding, which is transparently read back by JsonValue.FromFile:
- § 273 / FEATURE
-
The ConfigScript supports a new aggregation operator
a +> b
and its shortcut form+a
, see Scripting Overview / Operators. - § 272 / FEATURE
-
The CoordinateSystemWkt class now supports both WKT version 1 and WKT version 2.
- § 271 / FEATURE
-
The ICurve interface now supports the concept of replicating control points, in order to control the curve. See ICurve.Replicate for details.
- § 270 / FEATURE
-
Updated the EPSG geodata registry to version 11.008:
Path
"EPSG 11.008 / Tinman 1.0 / Rev. 1"
The old version is still included, in a bug-fixed revision:
Path
"EPSG 9.9.1 / Tinman 1.0 / Rev. 2"
- § 269 / FIX
-
Fixed a bug in GeoPathTrail that sporadically caused incorrect rendering and/or index-out-of-bounds errors when Timestamp was updated frequently.
- § 268 / FIX
-
Fixed the default value of Animation.TimeLapse upon construction: it is now
1.0
(as documented), but was0.0
before. - § 267 / FIX
-
Cancelling HTTP requests via ISimpleHttp.Cancel now also stops the download, if it is already in progress. Although the interface is intended to be used for numerous requests carrying little data, getting large chunks of data is sometimes desirable, too. The fixed behaviour eliminates unnecessary wait times when cancelling heavy requests.
- § 266 / FIX
-
Fixed a multi-threading bug related to IHeightmap objects created with HeightmapBuilder.Memory, possibly leading to inconsistent data or dead-locked threads. As work-around, access in-memory raster datasets only from a single thread.
- § 265 / FIX
-
Fixed incorrect handling of TextureFormat.A8L8 and TextureFormat.L8 in OpenGLContext and OpenGLESContext.
2024/05/08 ⬤
RELEASE - V1.0 RC4.22
public://sdk/1.0/RC4/REVISION-22
- § 264 / CHANGE
-
Updated 3rd-party libraries:
-
Assimp 5.4.0, used by: AssimpModelFormat
-
Silk.NET 2.21.0, used by: DirectX9Context, DirectX11Context, DirectX12Context
-
- § 263 / CHANGE
-
The options of ModelReader have been extracted to the ModelReaderOptions class. Use IModelReader.Options to access them.
- § 262 / CHANGE
-
The ModelSimplifyFlags.RemoveRedundant flag now also removes superfluous parent-child links by merging the IModel objects, if possible.
- § 261 / CHANGE
-
Removed RenderStatePreset.AntiAliasing, because it provides little practical use, given its behavioural differences between graphics APIs. The RenderStatePreset.AlphaBlending preset now includes alpha-based anti-aliasing for line primitives if multi-sampling is not used.
- § 260 / CHANGE
-
The OpenFlightModelReader class provides several performance improvements as well as additional properties. The default values of the new KeepPolygonFootprint and KeepStructure properties establish a different behaviour: polygons classified as footprint for CAT cutout were excluded, now they are included; the hierarchical scene structure was flattened by default, now it is retained.
- § 259 / CHANGE
-
The GeoPathTrail scene entity now uses an improved method for generating dynamic geometry that supports incremental updates, which allows use of geo path trails that are highly detailed and/or very long, without performance degradation.
To migrate, review uses of the removed
MaximumSegments
andMinimumTimestampStep
properties and replace with Capacity and TimestampStep. - § 258 / CHANGE
-
The redundant GpuBufferFlags.Update flag has been removed, because non-static GPU buffers are implicitly updatable. The GpuBufferFlags.Volatile flag has been replaced by GpuBufferFlags.Map.
When creating non-static GPU buffers via IBufferFactory, the specified GpuBufferFlags now determine the ResourceAccessPattern of the created IGpuBuffer object, instead of merely suggesting it.
The documentation of the behaviour of GPU buffer updates has been improved to better explain the interaction between GpuBufferFlags and ResourceAccessPattern.
- § 257 / CHANGE
-
The IStreamingTarget interface is now IDisposable, so that ownership of IModelTextureDynamic objects can be tracked properly.
- § 256 / CHANGE
-
Calls to the TinmanModule.RegisterResource method are now only allowed from TinmanModule.DoInitialize, during SDK initialization.
- § 255 / FEATURE
-
The OpenFlightModelReader class now exposes geo-referencing metadata of the
fltHeader
database record via newFlt*
properties. - § 254 / FEATURE
-
The ModelFormat.WriteModel method now returns a IModelWriter object, which can be used to provide format-specific options for writing model files, for example IModelWriterCmh for ModelFormat.CMH.
- § 253 / FEATURE
-
The IModelGeometry interface now supports preloading via IPreloadingResourceHandle, which eliminates framerate stuttering when the ModelRenderer needs to load geometry data through the ResourceCache.
- § 252 / FIX / GLSL
-
The GLSL source code no longer uses the following language features, which are not required by the GLSL specification and thus may be unsupported by some OpenGL drivers:
in IB_S { vec4 a; } data; struct S { vec4 a; }; void main() { vec4 a = ::data.a; (1) S data = S(data); (2) }
1 The scope operator ::
to access global variables2 Inter-type structure copy constructors - § 251 / FIX
-
Fixed issues in the constructor of WGLContext which caused calls to
RegisterClass
and/orwglChoosePixelFormat(ARB|EXT)
to fail.
2024/04/08 ⭘
PREVIEW - V1.0 RC4.21
- § 250 / FEATURE
-
The new IModelReader.ReadModelDebug method can be used to diagnose file format problems when loading 3D models.
- § 249 / FEATURE
-
The TerrainLayer of a TextureLayer or ShapeLayer scene entity can now be hidden via HideUntilReady while the texture content is being rebuilt, instead of showing data with increasing resolution during the build process.
- § 248 / FEATURE
-
The NativeLibrary class now outputs a warning log message for each required function that failed to load, to explain the reason why IsLibraryLoaded returns
false
. If RenderContext.CanCreate returnsfalse
although the GLApi is known to be available, the warning messages can be used to analyze the problem. - § 247 / FEATURE / C#
-
The built-in IGraphicsContextFactory implementations that use Silk.NET now output a warning log message via GraphicsContext.Logger before returning
false
from CanCreateGraphicsContext, after detecting an unexpected failure, which simplifies debugging.-
WpfContextFactory
If the Silk.NET assemblies have not been redistributed with an application, no log message is output, because this is treated as an expected failure and the graphics context factory will be disabled silently.
- § 246 / FIX
-
Fixed some API usage problems with DirectX12Context which caused runtime validation errors and warnings:
-
#1315:
D3D12_MESSAGE_ID_DESCRIPTOR_HEAP_NOT_SHADER_VISIBLE
-
#1328:
D3D12_MESSAGE_ID_CREATERESOURCE_STATE_IGNORED
-
- § 245 / FIX / C#
-
Fixed errors in the following NuGet packages that have been introduced by § 242 / FEATURE in version V1.0 RC4.20:
-
Tinman.AddOns.WPF
-
Tinman.AddOns.WinForms
-
- § 244 / FIX / C++
-
Fixed a bug in DirectX11Context which caused a call to
IUnknown::Release()
on a COM object that had already been destroyed, when disposing a non-multisample IRenderTarget that has been created with CreateRenderTarget.
2024/03/21 ⭘
PREVIEW - V1.0 RC4.20
- § 243 / FEATURE
-
IGraphicsContext objects now use two separate repositories for GPU shaders: a shared public one and a private one. The former has become optional and may be specified via IGraphicsContextFactory.ShaderRepository. The latter may be defined by IRenderEffectFactory implementations. The AddOns components now contain a private GPU shader repository:
-
AddOns / GLSL shaders
OpenGLContext, OpenGLESContext -
AddOns.DirectX9 / HLSL shaders
DirectX9Context -
AddOns.DirectX11 / HLSL shaders
DirectX11Context -
AddOns.DirectX12 / HLSL shaders
DirectX12Context
-
- § 242 / FEATURE
-
The NuGet packages of the Tinman 3D SDK now include separate sets of binaries for
DEBUG
andRELEASE
.See Software Architecture / DEBUG vs. RELEASE for details.
- § 241 / FIX
-
Fixed a bug in OpenGLEffect and OpenGLESEffect that caused incorrect rendering of the wireframe overlay on top of the material terrain layer, see TerrainLayer.Material and TerrainViewFlags.ShowWireframe.
- § 240 / FIX
-
Fixed a bug in Graphics that caused sporadic render artifacts in rare cases, apparent only when using a DirectX12Context.
2024/03/14 ⬤
RELEASE - V1.0 RC4.19
public://sdk/1.0/RC4/REVISION-19
- § 239 / FEATURE
-
Terrain layer content can now be prepared while the layer is invisible and the texture progress can be queried per layer. Before, content building started when the layer became visible, which progressively showed data with increasing resolution, which might not be desirable.
- § 238 / FEATURE
-
Improved performance of GPU buffer updates with GpuUpdateFlag.Discard for Direct3D 12.
- § 237 / FEATURE
-
Reduced frequency of error checking with GLBase.ErrorReset to improve performance. Use GLContext.DebugFrequentErrorChecks to restore the previous error checking level.
- § 236 / FEATURE / C++
-
Added some helpers for wrapping native arrays and/or buffers with
CodeX::Array
and ByteBuffer. - § 235 / FEATURE
-
Added SpriteCache and VisualCache classes, to support rasterization of 2D visuals (see IVisual) and efficient rendering using batched sprites.
- § 234 / CHANGE / C++
-
Header and source files (
*.h
,*.hpp
,*.cpp
) now use UTF-8 encoding, instead of ISO-8859-1. - § 233 / CHANGE / C#
-
The AddOn libraries for Direct3D 9, 11 and 12 and the AddOn library for WPF now use the Silk.NET package for accessing native APIs.
- § 232 / CHANGE
-
The TexelBuffer.PixelEncode method now pads the given pixel buffer with transparent black, instead of requiring that the buffer is large enough.
- § 231 / CHANGE
-
The TexelBuffer.PixelEncodeMipmaps method now pads the given pixel buffer by duplicating the right and bottom edges, instead of filling with transparent black.
- § 230 / FIX
-
Fixed a bug in RenderPipeline.UploadBytes which causes incorrect uploads to Direct3D 12 resources via IGpuBuffer.BufferUpdate when more than 64 MB of data was specified.
- § 229 / FIX
-
Fixed a bug in Bitmap that happened after ITextureFactory.ValidateTextureSize had adjusted the texture size, which caused a possible index out of bounds error in Bitmap.SetPixels.
- § 228 / FIX
-
The Processor now correctly substitutes all macro occurrences in a text line, instead of just the first one.
- § 227 / FIX
-
Fixed RenderStatePreset.AlphaBlending so that destination alpha is accumulated correctly.
- § 226 / FIX
-
Fixed visual artefacts when rendering thick lines with non-zero surface layers, see IMaterial.LineThickness and IModelPart.Layer.
- § 225 / FIX
-
Fixed a bug in EffectComponents of ModelRendererParameters that always enabled ModelRendererFlags.PixelFrequency.
2024/01/13 ⬤
RELEASE - V1.0 RC4.18
public://sdk/1.0/RC4/REVISION-18
- § 224 / CHANGE
-
Changed behaviour of RenderStatePreset.AntiAliasing to make use of line anti-aliasing (if supported) when multi-sampling is not available.
- § 223 / CHANGE / C++
-
Removed a decade old hack which used
GetErrorMessage
instead ofGetMessage
for System.Message, to compensate for the WinAPI#define
. Now using#undef
instead, where necessary. See FAQ for details. - § 222 / CHANGE / C++
-
The
CodeX::String
class uses the same logic as CharacterEncodingSimple.ISO_8859_1 when converting characters from UTF-16 to ISO-8859-1. For code points below 256, the behaviour is still the same. - § 221 / CHANGE
-
Removed
ValueToBox
andBoxToValue
fromSystemUtilGeneric
. Please use Boxed instead. - § 220 / CHANGE
-
Removed unnecessary boilerplate from SDK code:
-
For-each statements are now used to iterate over IEnumerable objects, strings and arrays:
C# :foreach(T item in list)
C++ :for(T item : list)
-
For local variables in C++,
T::ptr
is now used, instead ofPtr<T>
.
-
- § 219 / CHANGE
-
Changed default render state values when using the IRenderEffect framework:
-
DirectX9Effect.RenderStateDefault:
RS_SCISSORTESTENABLE = true -
GLEffect.RenderStateDefault:
GL.SCISSOR_TEST = enabled
GLES.SCISSOR_TEST = enabled
The RenderStatePreset enumeration is now annotated with FlagsAttribute, which allows to apply multiple presets in a single call.
-
- § 218 / CHANGE
-
If a TerrainModel does not have the ShadowReceiver flag, its geometry will now be rendered without shadows. Lighting may still be performed on it and it may still cast shadows.
- § 217 / CHANGE / C++
-
The default TinmanException.Panic behaviour now calls
std::terminate
inRELEASE
mode.
- § 216 / FEATURE
-
The SamplerStatePreset enumeration has been extended to cover more sampler state combinations:
-
Filter (point, linear, anisotropic)
-
Address U/V (border, clamp, mirror, wrap)
-
Border (RGBA color, with 1 bit per channel)
-
- § 215 / FEATURE
-
The ModelPoseFlags have been extended to support better material manipulation via ModelPose.Material.
- § 214 / FEATURE / C++
-
Modernized
CodeX::Delegate
:-
Replaced preprocessor macros with variadic templates.
-
Added
Ptr<T>::operator()(Type::*Member)
as an alternative toPtr<T>::Method(Type::*Member)
. -
Delegates can now wrap
std::function
values, which allows use of lambda expressions.
-
- § 213 / FEATURE / C++
-
CodeX::String
values can now be constructed via literal operators"…"_CX
andL"…"_CX
, the old-style macrosCSTRING("…")
,ZSTRING("…")
andZCHAR('?')
have been deprecated. - § 212 / FEATURE / C++
-
Minimized use of
CodeX::TypeOf<T>::Default()
and moved field assignment statements in constructors to the initializer list. - § 211 / FEATURE
-
Added a best practice recommendation to IDataStream which states that Finish should be called before disposing the stream and updated SDK classes accordingly.
- § 210 / FIX
-
The GPU code now uses the exact sRGB formula instead of the exponent 2.2 approximation for VertexElementFlags.Srgb, to match the sRGB processing that is performed by the GPU.
- § 209 / FIX
-
The TextureAtlasOptions class now obeys the new ITextureFactory.MaximumSize resource size limit, by balancing the texture and slice counts. For example, see Resource Limits (Direct3D 11).
- § 208 / FIX
-
The DecorationFor method of SilhouetteDecorator no longer throws a FailedAssertionException in
DEBUG
mode when the silhouette is empty (i.e. Silhouette.Vertices is empty). - § 207 / FIX
-
Fixed a buffer overflow error when using ImageFormat.DDS to read a block-compressed texture whose width and/or height are not aligned to the block size.
- § 206 / FIX / C++
-
Fixed an access violation error during the final exit procedure of the process, caused by a bad dependency on the order in which ShutdownSurviveAttribute values are deleted, for binaries that link statically to the Tinman 3D SDK.
2023
2023/10/20 ⬤
RELEASE - V1.0 RC4.17
public://sdk/1.0/RC4/REVISION-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 of1.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
public://sdk/1.0/RC4/REVISION-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 inRELEASE
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 newSystemUtil.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
public://sdk/1.0/RC4/REVISION-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 toTinman.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 theBrowser
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
public://sdk/1.0/RC4/REVISION-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:
-
Render targets may now have a color buffer, a depth/stencil buffer or both.
-
Color and depth/stencil buffers may now be specified separately via RenderTargets.
-
- § 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 makeCodeX::cast
,CodeX::castSafe
andCodeX::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
public://sdk/1.0/RC4/REVISION-06
- § 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 of0
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
public://sdk/1.0/RC4/REVISION-05
- § 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 returnnull
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 thethis
pointer. Constructors may now use the newCODEX_CONSTRUCTOR
macro to prevent this. Before this fix, self-destruction had to be avoided by not wrappingthis
in smart pointers, which required special care when coding constructors.
2022
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 occurred 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 thelabel
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 usesisspace
resp.iswspace
to check for whitespaces. Instead, the logic of FormattingUtil.IsWhitespace is used. The same logic is used bySystem.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 theTinman.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 of0
if the terrain does not have any texture layers. - § 59 / FIX
-
Various performance optimization regarding memory consumption and runtime efficiency:
-
Grammar
Improved handling of left-recursion and performance of rule matching, which greatly increases overall performance. -
ShapeBuilder
Minimized dynamic memory allocations during shape building, to improve performance when building lots of shapes successively. -
Software Architecture / Collections
Harmonized uses of EqualsDelegate, CompareDelegate and HashCodeDelegate to avoid inadvertent value-boxing at runtime.
-
- § 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 ⬤
RELEASE - V1.0 RC4
public://sdk/1.0/RC4/PREVIEW-10
- § 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
andTerrainModel.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 ⬤
RELEASE - V1.0 RC4
public://sdk/1.0/RC4/PREVIEW-09
- § 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
2021/10/17 ⬤
RELEASE - V1.0 RC4
public://sdk/1.0/RC4/PREVIEW-08
- § 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 ⬤
RELEASE - V1.0 RC4
public://sdk/1.0/RC4/PREVIEW-07
- § 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 ⬤
RELEASE - V1.0 RC4
public://sdk/1.0/RC4/PREVIEW-06
- § 11 / FIX
-
Fixed some numerical bugs in map projection code.
- § 10 / FEATURE
-
Updated EPSG geodata registry to version 9.9.1.
2021/04/10 ⬤
RELEASE - V1.0 RC4
public://sdk/1.0/RC4/PREVIEW-05
- § 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 ⬤
RELEASE - V1.0 RC4
public://sdk/1.0/RC4/PREVIEW-04
- § 8 / CHANGE
-
Unified
DisposeManaged
/DisposeUnmanaged
of Disposable into DisposeResources. - § 7 / CHANGE
-
Removed obsolete hooks for disposal at shutdown.
- § 6 / FEATURE
-
Tinman shutdown now frees all resources and reverts to the initial state.
- § 5 / FEATURE
-
Tinman can now be used again after shutdown.
2021/02/10 ⬤
RELEASE - V1.0 RC4
public://sdk/1.0/RC4/PREVIEW-03
- § 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 ⬤
RELEASE - V1.0 RC4
public://sdk/1.0/RC4/PREVIEW-02
- § 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
2019/04/01 ⬤
RELEASE - V1.0 RC4
public://sdk/1.0/RC4/PREVIEW-01
Please refer to Fixed Issues for additional information.