New Ab4d.SharpEngine v3.2 and first working demo of web based rendering engine

by abenedik 12. September 2025 17:36

I am happy to inform you that a new version of Ab4d.SharpEngine, the cross-platform 3D rendering engine, was published today.

This version was actually planned to be released in November or December. However, due to the recent resolution of critical issues and the implementation of exciting new features that our users requested, I decided to publish a new official version sooner than planned.

Significant improvements have been made to improve the stability and reliability of the engine. Numerous new tests have been created to check these aspects. Some issues were resolved by modifying the Ab4d.SharpEngine, but there were also some issues that were due to bugs in the Vulkan validation layers or Intel drivers. To check the stability of the engine by yourself, one test is now available to all users. If you start the new samples for Avalonia, WPF or WinUI, then you will find a new "Advanced options" section in the Settings window. Among other options, there is also a new "Show samples TEST runner" CheckBox. When checked, a new TEST button will appear. If clicked, it starts showing random samples as quickly as possible (on ApplicationIdle). You can use that to see how long the engine can run.

This version also brings some major new features. The most interesting is support for rendering 3D models from scanned 2D images from MRI or CT scanners. See the following screenshots:

Volume rendering of 3D head model from MRI slices

The 3D model is rendered by using the new VolumeMaterialEffect that can show the 3D model from any camera angle, despite the slices being made from only one direction (one slice image is shown in the upper right corner of the screenshot). Based on the values from the scanned slices, it is possible to assign different colors and transparencies to different parts of the model - in this sample, this is used to distinguish between hard and soft tissue.

To show the 3D model, first, a 3D texture is generated from all of the scanned 2D images. Then the new CubeSlicer class is used to generate a mesh that slices a 3D cube from the camera's position to the other end of the 3D cube. Then this mesh is rendered by using the new VolumeMaterial that samples the value from the 3D texture (values from the scanned images) and converts the values into colors by using a transfer function texture (for each value in the scanned image, a color is assigned).

The sample can also be used to show how the 3D slices are generated. This can be best observed by yourself by starting the new sample and selecting "Show slice lines" or "Show slices mesh" options. You can also quickly see that by watching the following video.

The code from the sample can be used as a generic method for displaying 3D models from scanned 2D images. However, if you require any special settings or tweaks, please let me know, and I will try to adjust the code accordingly.

Another great new feature is support for super-fast hit-testing of complex meshes by using octree structures. This feature does not look that interesting, but it can be very useful for many of the users of the Ab4d.SharpEngine.

Usually, when performing hit testing, the engine generates a 3D ray from the mouse (or pointer) position to the 3D scene. Then the engine checks which SceneNodes may be intersected by the ray (by checking the bounding box). For those SceneNodes, the ray intersection is checked for each triangle of the SceneNode. When showing complex meshes with millions of triangles, this process can be very slow.

Octree structure helps solve that by organizing the triangles into a multi-level structure where each level divides the parent's 3D space into eight areas (or OctreeNode objects). The first level contains only one area, the second level contains eight areas, the third level 64 areas and the fourth level 512 areas (it is possible to define more than four levels; this is recommended for very complex meshes). Each of those areas has its own bounding box. So when doing hit testing, the area's bounding boxes are used to determine which areas are intersected by the ray. Then only the triangles in those areas are tested for intersection. This may reduce the number of checks by many thousands.

The following screenshot from the new sample shows how each level divides the space into 8 areas (see the bottom right corner to see how many triangles are in each of the levels)

The MeshOctree object can further optimize the distribution of the triangles by slightly expanding the areas so more triangles fall into lower areas. The following screenshot shows the distribution of triangles after that optimization (note that more triangles are distributed in the lower levels):

For example, the unoptimized image shows that the first level contains 728 triangles. Those triangles are always tested for intersection with the ray. But in the optimized versions, the first and the second levels have no triangles. To see the full distribution of triangles, the Octree sample prints the "Octree statistics" to the Visual Studio Output window. Here is a shortened part of that (the numbers in the list show how many triangles are in each area or OctreeNode):

Level 1: Triangles count: 0
Level 2: Triangles count: 0
Level 3: Triangles count: 113: 0, 0, 0, 0, 0, 7, 0, 0, ... (and other values)
Level 4: Triangles count: 3983: 4, 11, 52, 12, 8, 4, 12, ... (and other values)
Total triangles count: 4096

So, for example, if the ray intersects only the bounding box of the first area in the fourth level, then only 4 triangle-ray intersections are performed (11 intersection checks are done when only the second area is hit). Now, compared to 4096 checks that would need to be performed when no octree is used.

But using an octree is not free. For complex meshes, generating all the required OctreeNodes may take some time.

By default, the MeshOctree object is generated when hit-testing a mesh that has more than 512 positions. This is defined by the HitTestOptions.MeshPositionsCountForOctreeGeneration property. You can increase this value or set it to int.MaxValue to prevent automatic octree generation. If your SceneNode is not supposed to be hit-testable, you can also disable octree generation by setting the SceneNode.IsHitTestVisible property to false. You can also manually generate the octree by calling the CreateOctree method on the mesh object (do not forget to assign the created MeshOctree to the Octree property).

In the HitTestOptions class, there are also some other new properties that define the global settings for octree generation (for example, you can set the max level count and generate the octree at mesh initialization instead of hit-test time).

So, the octree structure can provide a huge hit-testing performance boost. However, if you do not need that and you experience a longer initialization time, you can disable the octree generation.

The last new feature that I wanted to mention was also developed for one of the customers and is also related to hit-testing. This customer is showing a mesh with millions of triangles and he needs to know which triangle is hit by the mouse. Usually, using OctTree would be perfect for that scenario, but he is changing the mesh (smoothing) on each frame. This means that on each frame, the MeshOctree needs to be regenerated. This was very slow and significantly impacted the frame rate.

The solution was to render the scene to an ID bitmap where each triangle would get its own color. So instead of regenerating the MeshOctree, the frame only needs to be rendered again and then the index of the triangle can be determined by the pixel color under the mouse. This is much faster and allows the customer to perform real-time smoothing of the triangles under the mouse.

The following screenshot shows the new sample that demonstrates the triangle hit-testing that uses the ID bitmap (the mouse is not shown, but the triangle under the mouse is shown by a red polyline):

This version also brings some other new features. As always, to see the list of all the changes and fixes, check the Ab4d.SharpEngine change log.

 

I know that at this time of the year, many of you have already been expecting to be able to try the first version of Ab4d.SharpEngine for the web browser. But because of the issues in the core Ab43.SharpEngine library, and because some time was spent implementing the new features that are mentioned here, the web version is not yet ready for the first public version.

However, a lot of work was still done for the web version. Therefore, I am very happy to announce that today I have published the web page where you can check how the web version of the Ab4d.SharpEngine works. You can check it in the Ab4d.SharpEngine for web pre-alpha demo page.

Here is also a screenshot:

This demo shows that the engine already supports rendering meshes with standard material (with or without a specular effect). It also supports hit testing, rendering 3D lines and camera manipulation with mouse or touch (on mobile devices).

When the demo page is first opened, it takes a few seconds until the page is loaded (most time is spent downloading and compiling the self-contained .NET WASM file). But on subsequent page loads, the 3D scene is shown immediately.

You can also test how the engine works when rendering many SceneNodes. With each click on the "Add many objects" 1000 BoxModelNode objects are added to the scene. You can observe the rendering times by opening the DevTools (F12) and check the log messages in the Console tab. You will see that even though the engine is running in the browser, it can be very fast - on my computer, it is rendering more than 5000 objects in around 7 ms (rendering individual objects and not using mesh instancing).

As seen from this demo, many of the major features are already implemented. The code just needs a little bit of additional work. Also, documentation about the web project setup and a quick usage guide need to be written. I think that this can be completed before the end of this month. Then a new NuGet package and the source code for the sample project will be published. This will also allow you to test the engine with your own web projects.

Some of you were asking about the license of the new Ab4d.SharpEngine for the web. The good news is that there will continue to be only one license for desktop, mobile and web platforms. This means that the existing customer will be able to start using the new web version without any additional costs.

Tags: , , , , , , ,

SharpEngine

New Ab4d.SharpEngine v3.1 published

by abenedik 7. July 2025 18:07

I would like to inform you that a huge new update to Ab4d.SharpEngine has been published. The Ab4d.SharpEngine is a cross-platform 3D rendering engine for desktop and mobile .Net apps.

Here is the list of the highlights for this version:

  • Improved rendering semi-transparent objects.
  • Added support for post-processing effects.
  • Added support for rendering object outlines that are rendered on top of other objects.
  • Added InstancedTextNode that can render millions of characters.
  • Added support for billboards (pixels with textures).
  • Added ModelOptimizer that can optimize rendering static objects.
  • Added support for rendering depth pre-pass rendering step.
  • Added .stl file importer and exporter and .obj file exporter (note: .obj importer was already available).

However, before I provide additional details about those changes, I would like to announce another significant update: from version 3.1 onwards, you can use the Ab4d.SharpEngine on desktop and mobile devices with the standard license. This means that it is no longer necessary to purchase an additional mobile development license when you want to develop for mobile devices. If you already have a standard license, then you only need to upgrade the version of Ab4d.SharpEngine to v3.1 and you will be able to use the library on mobile platforms.

And now let me describe the major changes in more detail. If you are using semi-transparent objects, you will likely notice that the colors of those objects are different in the new version. The problem with the previous version was that for some materials, the alpha value was applied twice, which made some objects appear too dark. See the comparison (the left image shows the previous version; the right image shows the new version):

SharpEngine semi-transparent object changes in v3.1

What is more, IsPreMultipliedAlphaColor property was added to VertexColorMaterial, PixelMaterial, PixelsNode and InstancedMeshNode. This makes it easy to define how the Color4 values are defined. By default, all values are defined without pre-multiplying the alpha value. But if you want to use alpha pre-multiplied colors, then you can set the IsPreMultipliedAlphaColor property to true. The alpha pre-multiplied colors are colors where the red, green and blue color values were multiplied by the alpha value. The graphics card requires that color format and the new version can now correctly provide the color in the correct format.

The next big new feature is support for post-processing effects. Post-processing effects are executed after the 3D scene is rendered and can utilize a fragment shader code to adjust the colors of the rendered scene. The following post-processes are available: SobelEdgeDetectionPostProcess, BlackAndWhitePostProcess, ToonShadingPostProcess, GammaCorrectionPostProcess, ColorOverlayPostProcess, ExpandPostProcess and GaussianBlurPostProcess. It is also very easy to add custom post-process effects. This is demonstrated with a custom HsvColorPostProcess that is available with full source code. The following screenshot shows the new Post-processes sample:

SharpEngine post-processing

The new post-processing effects provide the building blocks for another highly requested feature: rendering object outlines that are also visible behind other objects. This is possible by rendering the selected objects to their own render target and then using SobelEdgeDetectionPostProcess and ExpandPostProcess. Then the 2D image that is created by those two post processes is drawn on top of the standard rendered image. The following screenshot shows that in action:

SharpEngine model outlines sample

Another very impressive new feature is support for using instancing to render text. This is done by using the new InstancedTextNode. This SceneNode object can very efficiently render millions of characters. This is achieved by rendering all instances of a single character with a single draw call using mesh instancing. We all know that modern graphics cards are very fast. But it is hard to actually see that speed. The sample that demonstrates the InstancedTextNode can help us see how extremely fast the graphics cards are. For example, the following screenshot shows the sample with the default settings:

SharpEngine InstancedTextNode with 8000 texts

As you see, this shows 8000 individual texts where each text represents its x, y and z coordinate values in brackets. This requires rendering 108,000 individual characters. The 8000 value was chosen so that it is still possible to see individual texts. But this is far from what a modern graphics card is capable of. If you select the last option with 1 million coordinate texts, then after a few seconds of initialization, the following scene is shown (showing more than 13 million individual characters):

SharpEngine InstancedTextNode with 1 mio texts

It is really impressive to see how fast such a 3D scene can be rotated by the mouse and how many calculations are required to achieve that.

Another similar new feature is support for rendering billboards. Billboards are texture images that are always oriented towards the camera. In the new version, billboards can be rendered by using PixelsNode and assigning a texture to be rendered for each pixel. This can render millions of billboards very efficiently. The following screenshot shows the updated pixels sample that shows tiny tree textures instead of square pixels:

SharpEngine billboards

As it is demonstrated in the new "Pixels rendering options" sample, this also allows rendering circular pixels. In this case, a white circle texture is used for each pixel (the texture color is white, so the final circle color is defined by multiplying the white color by the pixel color).

I have helped many customers improve the performance of their applications with 3D graphics. In most cases, the most significant reason for slow performance was the large number of draw calls. A draw call is a command for the graphics card to render one object. In Ab4d.SharpEngine each SceneNode object usually requires one draw call. When the scene is defined by a few thousand small objects, then the performance may begin to worsen. The reason for this is that for each draw call, the driver and the graphics card must assemble a new job and execute it. This can take significant time. It is much faster to issue just a few draw calls, where each provides a lot of work for the graphics card.

This concept can be demonstrated by running the "3D Lines / Lines performance" sample. With this sample, it is possible to render millions of line segments. This works very fast when there are not a lot of lines and when each line has many line segments. However, if the number of line segments is reduced and the number of lines is increased, then the performance drops significantly. This indicates that issuing a small number of demanding draw calls is faster than issuing many simple draw calls. Instancing also greatly demonstrates this principle.

When you generate the SceneNodes objects by yourself, you can usually group many objects into a small number of more complex objects. But when you import 3D objects from files, those 3D objects may be purely optimized with many small objects. If you do not need to change those objects (they are static) in the 3D scene, or if the objects are only rarely changed, then it is now possible to optimize the objects.

This is done by using the new ModelOptimizer. It can be used to optimize the GroupNode by combining meshes in SceneNodes with the same materials into combined SceneNode objects. The new sample that demonstrates this loads an obj file with an old sailing ship. The ship model is composed of 3381 objects. When using ModelOptimizer, those objects are combined into 30 objects. That renders the scene much faster.

Another new optimization that is available with the new version is rendering the so-called depth pre-pass. In this case, all 3D objects are first rendered only with the vertex shader (fragment shader is disabled). This does not render any pixels but only fills the depth buffer. After that, the standard rendering is executed. But because now the depth buffer is already filled with the final versions of the depth, the fragment shader is now executed only for the pixels that will be actually visible. For all other pixels that are farther away from the camera and would be discarded, the fragment shader is not executed. Because all the lighting calculations are done in the fragment shader, this can provide a huge performance boost for 3D scenes with a lot of overdraw (many 3D objects are occluded by other 3D objects). This is especially important on slower graphics cards, for example, those on mobile devices.

The following screenshot shows the 3D scene that is rendered by the new "Depth pre-pass rendering" sample:

SharpEngine depth pre-pass sample

When this sample is run without depth pre-pass and then analyzed in RenderDoc, the following image shows the amount of overdraw:

SharpEngine no depth pre-pass overdraw

In the image, the white area represents pixels with more than 20 executed fragment shaders. Some pixels have even more than 50 executed fragment shaders. This means that to get the final color of that pixel, 50 invocations of the fragment shader were required. This can take quite some time.

When depth pre-pass is used, then all the pixels require only one fragment shader invocation.

I would like to conclude the description of highlighted features with improved object importers and exporters. The previous version of Ab4d.SharpEngine included an importer for .obj files. With an additional Ab4d.SharpEngine.glTF library it is also possible to import and export glTF files. To import other files, you need to use a third-party Assimp library. That library can import from many file formats. But because it is a native library (not written in .NET), it may be hard to distribute it with your application, especially if you want to create a cross-platform application. Because of this, the new version got a new .stl file importer and exporter. Stl file is very commonly used for 3D printing so including that into the Ab4d.SharpEngine makes it very easy to create helper tools for 3D printers. What is more, the new version also has an .obj file exporter. It can be used to easily export the 3D scene into an .obj file.

Those are only some of the new features. There are many more changes and fixes. To see all of them, please check the Ab4d.SharpEngine change log.

The easiest way to explore the new features is by getting the updated samples from GitHub (note the UP and NEW icons after the name of the sample to see the changed samples; the UP icon also contains a ToolTip with the description of the change).

For the conclusion, I would like to wish you a nice summer vacation (if you are living in the Northern Hemisphere).

After the vacations, many new exciting things are coming: I plan to publish the alpha version of Ab4d.SharpEngine for the web (for the Blazor Web Applications). And after that, new versions of Ab3d.PowerToys and Ab3d.DXEngine libraries will be released with some great new features.

Tags: , ,

SharpEngine

Huge Ab4d.SharpEngine update with new open-source license

by abenedik 7. March 2025 13:32

I am thrilled to inform you that a major new version of the Ab4d.SharpEngine has just been published.

This version has many great new features, but let's start with a new licensing option: the new version of Ab4d.SharpEngine allows using the engine for free for non-commercial open-source projects.

There are multiple reasons why I decided to allow this option. One is that this will provide more samples and use cases on how to use the engine. This will also provide additional testing on additional devices and UI frameworks. However, one of the more important reasons for a free version is that I want to give people who like to work with 3D graphics a great and easy-to-use rendering engine. I have been passionate about 3D graphics for as long as I can remember. For example, when I was young, I liked to visit computer fares where I could stare for hours at Silicon Graphics machines that showed 3D CAD applications. This was like magic to me because at home I had only ZX Spectrum (btw, it had only 48 KM of RAM!). A few years later, when WPF was introduced, I was super excited because it also provided support for showing 3D graphics. I immediately started playing with that. And after a few months, this led to my first product - Ab3d.Reader3ds. So, if you are a similar enthusiast about 3D graphics, you can now use the Ab4d.SharpEngine for free. To apply for the free open-source license, use the online form.

To show what an interesting open-source project could look like, we decided to create a simple space simulator and use Ab4d.SharpEngine to show the planets and the moons. The simulator uses just a simple Newton's equation to calculate gravitation force: F = (G * m1 * m2) / (r * r). This equation is enough to simulate the whole solar system with all the planets and the moons. You can check the space simulator on its GitHub repo. But please be patient with this project as it is still in its early development form and has some issues. After those issues are fixed, we will be glad to accept PRs with new simulation scenarios and visual improvements.

Here is a screenshot from the Ab4d.SpaceSimulator running on Android tablet:

Space sumulator with Ab3d.SharpEngine in Andoid tablet

And now, here is a quick list of the major new features in v3.0:

  • Added support for super-sampling anti-aliasing (SSAA).
  • Added support for hardware accelerated line caps rendering and rendering hidden lines.
  • Added support for loading TrueType font files and showing text as 3D vector meshes.
  • Added support for async and background image loading and buffer upload.
  • Significantly improved performance of adding many small meshes.
  • Added support for showing a single Scene by multiple SharpEngineSceneView objects.
  • Added support for mesh triangle sorting.
  • Added support for Uno platform.

Just as its predecessor Ab3d.DXEngine, the Ab4d.SharpEngine also tries to provide superior render quality. By enabling super-sampling, you can now get super-smooth lines and text rendering. See the following image that shows a comparison of rendered lines with only multi-sampling (MSAA) and with additional super-sampling (SSAA):

Comparision of only MSAA to SSAA with MSAA

Super-sampling works by rendering a bigger image and then downsampling it to the final image. The 4x SSAA renders 4 times as many pixels (width and height are doubled). This also requires 4 times as many pixel shader invocations and can significantly affect the performance. Therefore, by default, 4x SSAA is used on dedicated graphics cards, 2x SSAA is used on integrated graphics cards, and no super-sampling is used on other devices. This can be changed by setting the value of the SupersamplingCount property.

Another great new feature is improved line rendering. The previous version supported only arrow line cap and even that was rendered as a series of additional lines. See the screenshot of how the old version rendered the line arrows:

Now, the line arrows are correctly generated in the geometry shader. This means that millions of lines with arrows can be rendered. What is more, it is also possible to render many other line caps:

Harware accelerated line caps in Ab4d.SharpEngine

Another line improvement is that it is now possible to render hidden lines - lines that should not be visible because they are behind 3D objects. Those lines can also be rendered with line patterns. This is very useful for CAD or similar applications:

Hidden line rendering

When using the current version of Ab4d.SharpEngine, I got some complaints that the text rendering was not well supported. The bitmap font does not look nice when the user zooms in to the text. Also, it is complicated to prepare your own bitmap fonts and to include new characters and symbols into the new bitmap font. Those issues should be solved by the new support for rendering vector fonts. Now, it is possible to use TrueTypeFontLoader, which can read TrueType font files (.ttf). After that the VectorFontFactory can generate vector text meshes and outlines from the glyph defined in the font file. This means that the font will look crisp even if you zoom into it. Also, it is very easy to include new fonts - just load the required ttf files. See the following screenshots:

Vector font from TTF file with outlines
Curlz vector font in Ab4d.SharpEngine
Chinese vector font in Ab4d.SharpEngine

Another common complaint about the current version was that it was slow to generate many smaller meshes. Also, uploading textures and bigger meshes blocked the UI thread. There was no way to upload that in the background.

Both those issues are solved with the new version. The reason why generating many small meshes was slow was that when uploading each mesh's vertex and index buffer, the code waited until the upload was completed. In this case, the transfer time was short, but the synchronization time (to signal that the upload is completed) was very long. Now, small mesh uploads are grouped into a batch upload so all uploads are done simultaneously. For example, creating 1000 pyramids, each with its own mesh now takes 15ms instead of 200ms.

On the other hand, when you need to upload a huge vertex and index buffer or want to upload a big texture, the new version now supports background upload with full async / await support (when supported by the GPU). This prevents blocking the UI thread. 

There are many ways to use background upload. One of the easiest ways to do this is to use the new constructors for StandardMaterial and SolidColorMaterial objects. They take the initial color and the texture file name. When they are used, the material is immediately created with the initial color. Then, the texture loading is started in the background, and when it is loaded and when the GpuImage is created on the GPU, the texture is set to the material. See the new "Advanced / Async upload" sample for more info.

The last major new feature that I would like to mention is that the SharpEngineSceneView object now has a constructor that takes a Scene as a parameter. This means that you can create a single Scene object and show it with multiple SharpEngineSceneView objects. Each can show the Scene with a different camera and view site. What is more, each SharpEngineSceneView can use different rendering techniques, for example, render the Scene as a wireframe. It is also possible to filter which RenderingLayers and individual objects are rendered in each view. The following screenshot shows that:

One Scene with multiple SharpEngineSceneView objects

There are many additional new features and fixes. To see the whole list of changes, check the change log for RC and beta 2.1 versions on the history web page.

I would like to conclude by looking into the future of the Ab4d.SharpEngine. It currently supports all desktop and mobile devices but cannot run in a web browser. This is going to change. Today, I would like to announce that a WebGPU based prototype was successfully developed. It took a lot of effort and struggle to be able to show 3D graphics by using Blazor WebAssembly. But now that the initial code works, the actual development can start.

The new engine will use WebGPU when the browser supports it. WebGPU is a new, high-performance API that is very similar to Vulkan API. It should provide much faster web 3D graphics than the old WebGL. Currently, WebGPU is supported by all major browsers except Safari. In cases where WebGPU is not supported (Safari and older browsers), I plan to provide WebGL fallback support.

This is the base that will allow the use of Ab4d.SharpEngine in a web browser. I am very excited about that because it will allow writing super fast 3D graphics code in C# that will be shown in any web browser. What is more, you will be able to use the same code for all possible platforms.

I am planning to release the first public version of the web rendering engine before the summer and the first official version before the end of the year. 

Here is a screenshot of the prototype (rendering a hash symbol with a solid color material - no light shading is supported yet):

WebGPU Blazor WebAssembly prototype

Tags:

SharpEngine

New Ab3d.PowerToys and Ab3d.DXEngine published

by abenedik 5. December 2024 20:07

As usual, shortly after a new .Net release, I am releasing new versions of Ab3d.PowerToys and Ab3d.DXEngine.

This is another bigger release with great new features and some important fixes. But before revealing what is new for Ab3d.PowerToys and Ab3d.DXEngine, I would like to present a brand new product.

As long as I am providing 3D graphics libraries, there has been a single most requested feature: provide support for importing .step and .iges files

Finally, I would like to announce that this is now possible with the new Ab4d.OpenCascade library. See the screenshots from the new CadImporter sample application:

CAD Importer with import settings
CAD Importer with assembly hierarchy

So far it was possible to use ReaderObj, glTFImporter or Assimp importer to import 3D models from many file formats. But all those file formats store their models as triangles or simple meshes that were defined by simple polygons. So after importing the meshes, it was relatively easy to show them using a rendering engine. But CAD applications like SolidWorks, CATIA, Autodesk Fusion 360, Autodesk Inventor, Pro/Engineer, Siemens NX, and others define their 3D models by using mathematically defined surfaces. All of those applications can store the models to .step or .igen files. Importing 3D models from those files first requires understanding all surface types and then triangulating them into meshes with triangles. Only after that can they be sent to the graphics card to render them.

The new Ab4d.OpenCascade library uses a third-party native OpenCascade library to read .step and .iges files and triangulate their models. This way the CadImporter class from the Ab4d.OpenCascade library can get 3D meshes that can be used by Ab3d.DXEngine (or Ab4d.SharpEngine) to render the 3D objects. The importer also preserves the names and hierarchical structure of the CAD parts (Compound or Solid). The faces and edges that define the parts can be also retrieved. For each edge, it is possible to get the original curve with its parameters. For example, you can get a location and a radius for a Circle (as seen in the image above); for BSpline curve you can get control points (Poles), weights and knots. What is more, it is possible to get the exact part volume and surface area (not from triangulated mesh but from actual mathematically defined objects).

The third-party OpenCascade library has its own license that allows free commercial use. The Ab4d.OpenCascade library can be used freely when the library is used with Ab3d.DXEngine or Ab4d.SharpEngine. The library provides the imported data in standard .Net types (int, float, double, simple arrays and structs) so it can be used by any other .Net code without Ab3d.DXEngine or Ab4d.SharpEngine. But in this case the source code for the Ab4d.OpenCascade library needs to be purchased (contact support for more info).

This is the first version of the importer, so your feedback is much appreciated. If you want some additional data from the .step or .iges files or would like to use some additional functionality from the OpenCascade library, please let me know.

The sample CadImporter application can be downloaded from CadImporter GitHub page.

 

And now to the new Ab3d.DXEngine. My favorite new feature is the new DynamicPlanarShadowRenderingProvider. It can render soft planar shadows with shadow darkness based on the objects' distance from the shadow plane. A screenshot best describes this:

soft and dynamic planar shadows

This looks even better when seen live in the sample because the objects are animated, and this updates the shadow dynamically.

The DynamicPlanarShadowRenderingProvider renders a shadow to a texture that can be set to a material that is shown by a 3D plane. When using static 3D objects (for example in ModelViewer sample in Ab3D.DXEngine samples), the shadow can be rendered only once and then the same texture can be shown as long as the 3D scene does not change. In an animated scene, the shadow can be updated on each frame.

This puts the DynamicPlanarShadowRenderingProvider somewhere between the already existing shadow providers: PlanarShadowRenderingProvider and VarianceShadowRenderingProvider. The PlanarShadowRenderingProvider is the simplest option for rendering shadows. It transforms all 3D objects into flat 3D models (using a shadow matrix). This creates a sharp shadow that is easy to render. The VarianceShadowRenderingProvider is a more standard shadow provider - it renders the objects from the light's position to a so-called shadow map that stores the distances from the 3D objects to the light. Those distances are then used when rendering 3D objects to determine whether the rendered pixel is in shadow or not. This can render shadow on any object (not only to a flat plane). The Variance term in the name means that a special technique that provides softer shadows is used. The shadow is always the same color, regardless of the object's distance. This is accurate for light that comes from a single source. But in reality, most of the light comes from ambient light that bounces around the walls and other objects.

In this case, the shadow is dark only when close to the object, but when the object is farther away, the shadow is not that strong anymore. This is what the new DynamicPlanarShadowRenderingProvider tries to achieve. 

The DynamicPlanarShadowRenderingProvider renders the shadow to a texture that can be shown on a 3D plane. The shadow can also be rendered to a transparent texture. This is also seen in the screenshot above. 

However, when using VarianceShadowRenderingProvider, it was not possible to render the shadow to a transparent 3D plane. You always needed to have an opaque object to see the shadow. But with the new version, there is a new VarianceShadowMaterial that can be used to render the shadow to a transparent texture (areas that are not in shadow are transparent).

 

The new shadow provider can improve the visual quality of the rendered scene. But when using 3D lines, the feature that provides the most significant improvement in the visual quality is super-sampling (SSAA). Graphics cards provide hardware support for multi-sampled anti-aliasing (MSAA), which significantly improves rendering quality. But super-sampling takes that to another level and can produce super smooth 3D lines. When SSAA is used, the 3D scene is rendered to a bigger texture that is then down-sampled to the final size.

But the cost of rendering a bigger texture can be quite significant. By default, Ab3d.DXEngine does not use SSAA (NormalQualityHardwareRendering GraphicsProfile is used). But many users changed that to HighQualityHardwareRendering and that uses 4xSSAA. This renders the 3D scene to a texture with 4 times as many pixels (width and height are multiplied by 2). Because in Ab3d.DXEngine the lighting calculations are done in a pixel shader, this means that 4xSSAA requires 4 times more pixel shader executions compared to rendering a scene without SSAA (and there is also an additional cost of down-sampling). Luckily, the graphics cards are incredibly fast and this is usually not a problem.

But what if I tell you that the new version can achieve almost the same visual quality as the previous version but at half the cost? The previous version supported only the following values for super-sampling count: 1 (disabled), 4, 16 and 64. Those values increased the width and height by a factor of 2, 4, or 8. However, after some research, I found out that almost the same visual quality can be achieved by using 2xSSAA - increasing the number of pixels by 2. In this case, the width and height of the texture are increased by a factor of 1.41 (a square root of 2). Rendering a scene with 2xSSAA can be done twice as fast as 4xSSAA because it requires only half of the pixel shader invocations.

So, the new version of Ab3d.DXEngine supports all values from 1 to 64 for super-sampling count, including 2, 3, and others. There is also a new OptimizedHighQualityHardwareRendering GraphicsProfile that supports 2xSSAA.

See the following screenshot for comparison:

super smooth lines sample

The top left part shows rendering without any anti-aliasing. The top right shows the improvement when using 4xMSAA (multi-sample anti-aliasing). The bottom left uses the new 2xSSAA (super-sampling anti-aliasing) + 4xMSAA. The bottom right uses 4xSSAA + 4xMSAA. The visual quality between the bottom two renderings is almost the same, but the left version is twice faster to render.

The following code enables the new OptimizedHighQualityHardwareRendering:

MainDXViewportView.GraphicsProfiles = new GraphicsProfile[]
{
    GraphicsProfile.OptimizedHighQualityHardwareRendering, // 2xSSAA + 4xMSAA
    GraphicsProfile.NormalQualitySoftwareRendering, // 4xMSAA
    GraphicsProfile.Wpf3D
};

 

The last new feature that I would like to describe in more detail is support for pixel hit-testing and point-cloud hit-testing.

From the first version on the Ab3d.DXEngine supports the standard hit-testing that generates a ray from a camera and mouse coordinates and then checks which triangles are intersected by the ray. Later a special hit testing that use ID bitmap was introduced. In this case, the whole scene is rendered in such a way that each 3D object gets a color that is calculated from the object's ID. This way, it is possible to check what color is under the mouse and from the color get the ID of the object. This is also very useful for mesh instancing where a huge number of meshes are rendered. In this case, it would take very long to check each mesh for ray intersections.

With the new version, it is also possible to render ID bitmap from pixels. To support that, set the new UseVertexIdColor property on the PixelEffect to true. This will render each pixel by a color that is defined from the index of the pixel.

To see that in action, check the new "Ab3d.DXEngine hit testing / Using Vertex ID Bitmap" sample. The sample also provides support for measuring distances on a point-cloud. See the screenshot:

point-cloud hit testing

The used ID bitmap can be seen in the bottom right corner.

 

There are also some other new features. And as always, this version also comes with some bug fixes. Let me mention just some of them:

  • fixed selecting lines with LineSelectorData when some lines are completely behind the camera,
  • fixed FitIntoView in some cases when parent ModelVisual3D objects have transformation applied,
  • improved edge line generation,
  • prevented showing render artifacts (may be shown as partially rendered image while camera is rotated rapidly),
  • prevented some exceptions like "childNode is already child of another SceneNode" and "StartBackgroundWaiting was called ..."

See the whole list of changes here and here.

To see the changes by yourself it is best to get the latest version of Ab3d.PowerToys samples and Ab3d.DXEngine samples. Check for NEW and UP icons (UP icons also provide a tooltip with additional information). If your updated subscription has already expired, you can still still get the new samples and start them. This will start a new trial version for the new version. If you have an expired subscription and have used the libraries for at least 2 years, contact me for a renewal discount (valid only in December).

 

Next week, I plan to release a new beta version of Ab4d.SharpEngine with many new features. Then until the end of February the new official version of Ab4d.SharpEngine will be released. If you want to purchase the Ab4d.SharpEngine, then now is the best time to do that because you can use a 30% discount in December.

And because we are already in December, I would like to wish you happy and peaceful holidays and all the best in the new year.

Tags: , , ,

Ab3d.PowerToys | DXEngine

New bug fix Ab3d.DXEngine published

by abenedik 12. July 2024 17:56

I would like to inform you that a new version of Ab3d.DXEngine has been published.

This is only a bug fix release that fixes the problems that were found after the last release. What is more, a new Ab3d.DXEngine.glTF library was also published (see below).

Here is a list of fixes:

  • Fixed changing IsVisible property on InstancedTextNode.
  • Improved hit-testing by preventing the creation of new objects on each hit test.
  • Prevented exception when the IsVisible of DXViewportView is set to true (from false) but the size of DXViewportView is empty (0, 0).
  • Corrected calculating Bounds (BoundingBox) for ScreenSpaceLineNode and ScreenSpaceLineMesh when IsPolyLine is true. Before the bounds were too big because the 2 generated adjacency positions that were required by the shader were also counted into the BoundingBox.
  • Updated Bounds in ScreenSpaceLineMesh when calling RecreateMesh.
  • Added new overload to RecreateMesh method in ScreenSpaceLineMesh. The new overload also takes BoundingBox as a parameter. It can be used when BoundingBox is already known - this prevents calculating new BoundingBox from new positions.
  • Fixed regenerating screen-space positions in some cases when the count of line positions is changed.

As promised in previous blog posts, a new fully managed glTF importer for Ab3d.DXEngine was published. If you are showing 3D models in your application, then you will now be able to use the new glTFImporter instead of Assimp importer. This will remove the dependency on the native Assimp library. If you are currently using some other file format (for example, .fbx or .dae), then you may consider converting that to a glTF file. There are many offline and online glTF converters that can be used for that task.

First, note that the new importer can read only the second version of glTF files (version 2). This new version is also used by most of the 3D modeling tools. glTF files come with two possible file extensions: .gltf and .glb. The  .gltf file extension represents a text json file with basic information of the 3D objects. Usually .gltf file also comes with a .bin file that stores the vertex and index buffers and embedded textures. It is also possible to embed the buffers and textures as base64 encoded text into the .gltf file. The other possible file extension (.glb) represents a binary version of the file. It has a smaller size and is the fastest to read. It also contains all the buffers and textures.

glTF 2 files store materials by using PhysicallyBased properties that use base color, metalness and roughness as base material properties. Ab3d.DXEngine also supports showing PhysicallyBasedMaterials. But for technical and business 3D objects the material usually use diffuse and specular colors (StandardMaterial in Ab3d.DXEngine or DiffuseMaterial in WPF 3D). Because of this, the importer in the Ab3d.DXEngine.glTF library has two special properties that can be used to define when the StandardMaterial with diffuse color is created from the PhysicallyBased properties:

ConvertSimplePhysicallyBasedMaterialsToStandardMaterials - when this property is true (by default) then  simple glTF's PhysicallyBasedMaterials that have MetallicFactor set to 0 and do not have MetallicRoughness texture are converted into StandardMaterial objects.

ConvertAllPhysicallyBasedMaterialsToStandardMaterials - when this property is true (false by default) then all glTF's PhysicallyBasedMaterials are converted into StandardMaterial objects.

And here are a few screenshots from the sample models that can be downloaded from glTF sample assets (https://github.com/KhronosGroup/glTF-Sample-Assets):

ABeautifulGame 3D model importer by DXEngine's glTF importer

FlightHelmet 3D model importer by DXEngine's glTF importer

In the future, I plan to remove some of the library's dependencies by embedding the glTF objects model into the library. I will also add an exporter that will be able to export an existing 3D scene to glTF file.

Tags: , , ,

DXEngine

Major new vesion of Ab4d.SharpEngine published

by abenedik 5. July 2024 12:48

I am really excited that I can present you a new Ab4d.ShareEngine version 2.0!

The version 1.0 was already very capable and could show 3D graphics on platforms from tiny Rasberry PI to mobile devices and high end PCs. But if you know the Ab3d.PowerToys and Ab3d.DXEngine libraries then you missed some of the features. Now, with version 2.0, many of those highly requested features are available.

Here is a list of some of the major new features:

  • Added support for rendering pixels and point-clouds. There is also a sample that can import point-cloud data from .ply and .xyz files.
  • Added ModelMover, ModelScalar and ModelRotator that can be used to move, scale and rotate selected 3D objects.
  • Added InputEventsManager that can be used on SceneNodes to subscribe to Clicked, Entered, Exited, Dragged and other mouse and pointer events.
  • Added MultiMaterialModelNode that can render a single mesh with multiple materials.
  • Added support for slicing SceneNodes with a 3D plane.
  • Significantly improved performance of generating edge lines and selecting 3D lines.
  • Added support for triangulation and extrusion of shapes with holes.
  • Added new sample that shows how to create a custom effect by using your own shaders.
  • Added full support for Windows Forms with new Ab4d.SharpEngine.WinForms library that provides SharpEngineSceneView control for Windows Forms.
  • Added fully managed glTF file importer and exporter that can be used on all platforms and does not require any native library (that is required by Assimp importer).
  • Added support for using Vulkan backend in Avalonia. This way the whole application (UI controls and 3D scene) is rendered by Vulkan. This requires Avalonia v11.1.0 (currently in pre-release version).

If you are following the development of Ab4d.SharpEngine, then you may be surprised by the new version number. I always said that the next version would be version 1.1, but now version 2.0 has been released. The reason for that is that there are also some breaking changes. In the previous version many classes, enum values and parameter names used the "mouse" word. But with the new cross-platform environment the "mouse" is no longer the correct word and has been replaced by "pointer" by many frameworks (Avalonia, WinUI). This has also been done in SharpEngine, for example: MouseCameraController => PointerCameraController, MouseButtons => PointerButtons, MouseAndKeyboardConditions => PointerAndKeyboardConditions, etc. In most cases the old class or enum values still exist but were marked as obsolete with a message about how to change its name. I know that such changes are not nice for users, but they must be done to modernize the API.

Here are some of the screenshots of the new version:

Point-cloud importer that can import data from .ply and .xyz files

ModelMover, ModelScalar and ModelRotator

Sliced 3D model

Triangulated and extruded 2D shape with holes

glTF importer

WinForms samples with 3D graphics by Ab4d.SharpEngine

 

Images are nice, but it's even better to see the new features in action. To do that, get the latest version of the samples from GitHub

Note that the Samples project is not updated only on each release but new samples may be added between releases. So, it is best to subscribe to changes or check the commit history of the Samples from time to time.

Most of the new features should be easy to understand and use. So let me describe in more detail only two of them.

3D models are usually created by a 3D modeling application and then saved in many possible file formats. When we wanted to show such 3D model in our application, the Ab4d.SharpEngine library provided two options. The first was to save the file in the .obj file format and the import it by using ReaderObj that is part of the core Ab4d.SharpEngine library. The problem was that obj file is missing many features (for example, object hierarchy and transformations) and is only text based, so files can be large and take longer to read. The other option was to save the 3D model to some of the common file formats like .fbx, .gltf, .dae, etc and then use Assimp importer to import the models. This works well for many file formats, but this requires the use of a third-party native Assimp importer. When you are developing a cross-platform application, this is a problem. The samples come with native builds for Windows and Linux. It is also possible to compile the Assimp library for macOS, Android an iOS, but this requires some special skills and you need to distribute all the native libraries with your application. A much better way would be to have a fully managed importer where only one dll can be used on all platforms.

Because of this, a new Ab4d.SharpEngine.glTF library was developed. It provides a fully managed cross-platform glTF 2 file importer and exporter. The glTF 2 file format is a modern file format developed by the Khronos group and can store meshes, hierarchies, materials, transformations and animations in a text or binary format. Many online and offline converters can convert to glTF from many other file formats. The new library can also export the SharpEngine's SceneNodes to glTF file (not all SceneNode types are supported yet). Please note that glTF 2 file saves materials as Physically-Based-Rendering (PBR) materials. This requires some transformations of the StandardMaterials to PBR materials and back. In the next version of Ab4d.SharpEngine I plan to add support for rendering PBR materials.

Another new feature that I would like to talk about is the support for creating fully Vulkan based applications by using the new version of Avalonia (v11.1.0-rc2 at the time of writing). Vulkan API is a cross-platform API that is used to communicate with the graphics card. It is used by the Ab4d.SharpEngine to render the 3D scene. But until now, there were no UI framework that would use Vulkan. Some of the frameworks use only DirectX (WPF, WinUI) or a combination of DirectX and OpenGL based on the current platforms (Avalonia, MAUI). In many cases this requires copying rendered 3D scene to some other format before it can be shared by the UI (but the rended texture can still stay in the GPU memory). In some cases, sharing is not possible and this requires copying the rendered image to the main CPU memory, creating a bitmap (WritableBitmap) and sending that back to the GPU by the UI platform. But with the new Avalonia, we can finally create an application that is 100% rendered by Vulkan. This provides very fast UI rendering and great integration with Ab4d.SharpEngine. Currently, this is possible only on Windows but in the future other platforms will be supported as well. You can test that by starting the new Ab4d.SharpEngine.Samples.AvaloniaUI.VulkanBackend solution.

Note that currently there are two versions of Ab4d.SharpEngine.AvaloniaUI libraries available. One has version 2.0.8951. This one is using the Avalonia version 11.0.11 (the last official version). Then there is another Ab4d.SharpEngine.AvaloniaUI library that has version 2.0.8953-rc1 (pre-release). It requires Avalonia version 11.1.0-rc2 (also pre-release). Those two pre-release versions are required to use Vulkan as a backend. When an official Avalonia version 11.1.0 is released, I will also provide a new version of Ab4d.SharpEngine.AvaloniaUI that will not be marked as pre-release.

To see the list of all changed in v2.0 check out the SharpEngine history web page.

Let's finish with a quick view into the future. 

Next week, I plan to publish a new bug fix release for Ab3d.DXEngine. In the past few months some bugs were fixed and it is now time to release that. I will also be adding new samples for Ab4d.SharpEngine and updating some of the existing samples. Before the end of the year I expect to release another new version of Ab4d.SharpEngine, Ab3d.PowerToys and Ab3d.DXEngine.

The plans for Ab4d.SharpEngine include work on the core of the engine with support for background resource creation (top priority) and multi-threaded rendering (hopefully). There will also be support for post-processing and improved pixel rendering options. I would also like to add support for Uno platform, PhysicallyBasedRendering effect and rendering 3D lines with arrows.

For both Ab4d.SharpEngine and Ab3d.DXEngine I would also like to provide support for importing STEP and IGES file formats that are commonly used by CAD applications.

There are lots of plans. But I am sure that many of you have some additional ideas and requirements. In this case please contact us.

And finally, I wish you a nice and relaxed summer and shiny 3D graphics in your applications.

Tags:

SharpEngine

Great new features in new Ab3d.PowerToys and Ab3d.DXEngine

by abenedik 12. April 2024 11:22

Even though a new Ab4d.SharpEngine, a cross-platform rendering engine, was released a few months ago, work on the Ab3d.PowerToys and Ab3d.DXEngine has not stopped. The proof of that is the just published version that brings many great new features and improvements. Here is a list of the most important:

  • Added many new options to render pixels and point-clouds.
  • Added hardware support to render millions of textures as billboards.
  • Added support for Screen Space Ambient Occlusion (SSAO).
  • Significantly improved performance of line selection and generating edge lines.
  • Added sample that shows how to render objects with glow.

The previous version of Ab3d.DXEngine already provided great support for rendering pixels and point-clouds. It was possible to render millions of pixels with various sizes and colors. There was an OptimizedPointMesh class that could optimize the rendering of large point-clouds. On top of that, the new version adds the following new options:

  • The pixel size can be defined in screen or world size. Before, pixel size was defined only in screen size, but now you can also define the size in 3D world size so when using perspective camera the pixels that are farther away from the camera are smaller.
  • Pixels can be rendered as rectangles or as circles. Before, only rectangular pixels were possible. Now circular pixels can be rendered and this looks nicer for some point-clouds.
  • It is possible to specify a texture that will be rendered on each pixel. This can be used to render millions of billboards that are always facing the camera.
  • It is possible to fix the up vector of each pixel so the pixels do not fully face the camera. For example, this can be useful when rendering trees that are always growing vertically and should not face the camera when the camera is looking straight down.
  • The Ab3d.DXEngine samples project comes with new PlyPointCloudReader and PlyPointCloudWriter classes (available with full source code). They can be used to read and write point-clouds from and to ply files.

Here are a few screenshots:

Importing point-cloud with more than 12 million pixels from a ply file.

(Point-cloud with 12 million points)

Cropping point-cloud and exportin it to a ply file.

(New point-cloud importer sample supports exporting a cropped point-cloud)

Rendering may 3D textures as billboards (the screenshot shows 15.000 tree textures, but modern GPU can also easily handle many more textures).

(Rendering may 3D textures as billboards. The screenshot shows 15.000 tree textures, but modern GPU can also easily handle much more textures).

 

Another big new feature is support for Screen Space Ambient Occlusion (SSAO). If you look around you, you can see all the places around the room. All receive at least some light even if the lights or windows do not directly illuminate them. This light is called an ambient light. To correctly render that light, we need to use ray tracing. But in real-time computer graphics, we can usually specify an ambient light with just one value. This will illuminate all the objects in the scene with the same amount of light. But if you look around you, you will notice that, especially at the corners, the amount of ambient light is much lower, and a shadow is visible. Those shadows can be approximated by using the Screen Space Ambient Occlusion. This reduces the amount of the applied ambient light in places that have some objects around them.

See the difference in the following two screenshots (one with and one without SSAO):

Screen Space Ambient Occlusion (SSAO) that can dynamically shadow ambient light
SSAO disabled

Note that to see SSAO shadows, you need to use a lot of ambient light and should not use camera's lights (set camera.ShowCameraLight to ShowCameraLightType.Never). If you are using camera's light, it can illuminate the areas dimmed by the SSAO effect. So, using fixed directional or point lights and strong ambient light is recommended to see SSAO shadows.

 

The next major change in the new version is not a new feature but a significant improvement of the existing functionality that many of you are using. The new version of Ab3d.PowerToys greatly improves the performance of line selection and generating edge lines.

Showing edge lines can significantly improve the clarity of the shown 3D model. But with the previous version, if you had complex 3D models, calculating edge lines was very slow. The new version significantly speeds up this process. For example, the next graph shows the time in ms that was needed to generate edge lines for a complex P51 oil rig model (3.7 mio triangles; 1000 individual models, some have more than 100,000 positions; CPU: AMD Ryzen 9 5900X):

Graph that shows performance improvement of new edge lines generation

The previous version required 13 seconds in .Net Framework 4.8 (11 seconds in .Net 8). In the new version, this is almost 50 times faster: 350 ms in .Net Framework 4.8 (280 ms in .Net 8).

So, when using the previous version the user needed to wait for quite a while until the edge lines were generated, but now this is hardly noticeable.

What is more, if you know that your mesh is nicely defined or does not have duplicate positions, you can speed up this process even further. Duplicate positions are very common because they are required to create sharp edges by defining different normals for each position (for example, BoxVisual3D defined 24 positions and not only 6). But if you know that you have a smooth mesh without duplicate positions, you can set the ProcessDuplicatePositions property to false to skip the step of finding and collapsing duplicate positions. Also, if you know that the mesh has nicely defined triangles where each triangle edge is fully covered by any adjacent triangle edge (except on the outer mesh borders), then you can set the ProcessPartiallyCoveredEdges property to false. This skips code to process complex meshes (for example, such complex meshes can be produced by Boolean operations). If users of your application can import any 3D model, then you should have all the settings enabled, but if you have fixed 3D models, then you can experiment by turning off some settings and get even better performance. What is more, the updated "Edge lines creation" sample in Ab3d.PowerToys samples has code that shows how to easily write and read the calculated edge lines to and from a file.

 

Another very commonly used feature was line selection. The line selection in Ab3d.PowerToys allows selecting lines when the mouse is close to the line (the user can specify the max selection distance). When you were showing a lot of lines or lines have lots of line segments, then the line selection could eat a lot of CPU cycles. Before, 2D screen coordinates were calculated for all line segments. Then the 2D distance from the mouse to each line segment was calculated. The line with the closest distance was the result of the line selection. The new version significantly improves the performance of line selection for lines that have more than 30 segments. In this case, only 2D screen bounding box of the line is calculated and if the mouse position is in the bounding box or close to it, then the 2D screen positions for all line segments are calculated. This can skip a lot of calculations because only lines that are close to the mouse are fully processed. Note that to use the new faster code path, you need to set the new CheckBoundingBox property to true. This is needed to preserve the behavior of the GetClosestDistance method. Before, this method always returned a valid distance value, but now, when CheckBoundingBox is true and when the mouse position is not close to the bounding box, then double.MaxValue is returned.

What is more, if you are using ScreenSpaceLineNodes instead of lines derived from Visual3D objects (this significantly improves the initialization time but is harder to work with), then you can use the new DXLineSelectorData that is the same as LineSelectorData but works with Vector3 structs instead of Point3D structs. This will give you even better performance because of reduced memory usage (using float values instead of double values).

The following screenshot shows a new sample that shows 5000 lines each with 5000 line segments and still achieving super-fast line selection time:

Super fast line selection where lines can be selected by specifying the distance to the lines (moving mouse close to the line).

 

The next new feature did not need any change in the Ab3d.DXEngine library but it just needed a special rendering setup. It is implemented in a new "Glowing objects" sample that can be found in the Advanced section of the Ab3d.DXEngine sample project. As its name suggests, it shows how to render glowing effect to objects with an emissive material. I know that this is not an essential feature, but I am sure that some of you will be able to use it to achieve some very nice visual effects.

Rendering glowing objects.

 

As always, there were many other new features, fixes and improvements. You can check them by starting the updated sample projects (Ab3d.PowerToys or Ab3d.DXEngine) and checking for samples with NEW or UP icons. You can get the list of all changed in Ab3d.PowerToys change log and Ab3d.DXEngine change log

 

When speaking about fixes, I would like to mention one nasty bug that occurred when many 3D lines were rendered (using multi-threader rendering), and after the size of the window was changed, then in some cases the lines could be rendered with invalid line thickness. If this also happens in your application, then please upgrade to the latest version. If this is not possible, then disable multi-threader rendering for 3D line or the whole scene (contact support for more info).

 

Lastly, I would like to mention that the new version comes with a new native Assimp importer that can import 3D models from many 3D file formats. The previous official version of Assimp importer v5.3.1 was released more than half a year ago (2023-09-25). The new version was released just a few days ago (2024-04-07) and comes with many improvements (https://github.com/assimp/assimp/releases). You can build the new version by yourself or get prebuilt dlls from the libs folder in the Ab3d.PowerToys or Ab3d.DXEngine samples.

 

Here, I would also like to announce that in the coming weeks, I will be releasing a fully managed glTF importer and exporter. This will allow you to import 3D models with full details without using a native Assimp library. Currently, if you do not want to use Assimp importer, you could use ReaderObj (part of Ab3d.PowerToys library) to read obj files or use Ab3d.Reader3ds library to read 3ds files. However, both obj and 3ds file formats have their limitations. Obj files do not support hierarchy and animations, are text only, and have limited materials. 3ds files support only 8.3 file names for textures. So, those two file formats could be used only in a limited number of cases.

On the other hand, the glTF 2 file format is a modern file format that was developed by Khronos group and can store meshes, hierarchies, materials, transformations and animations in a text or binary format. Suppose you distribute 3D models with your application and are currently using Assimp importer to load the models from various files. In that case, you will be able to convert the files into glTF (using Assimp importer and exporter or by using some other third-party or online glTF converter) and then distribute your models as glTF files. This way, you will not need to distribute native Assimp's dlls with your application anymore.

 

As seen here, the new version can significantly improve the performance of your application and the new features can make it even more visually appealing.

Now, the primary development focus will switch back to the new Ab4d.SharpEngine. I am really happy with the adaptation of the new engine. It seems that the first version already had enough features for many of your projects. Some new features have already been developed, but many are still to be implemented. I am planning to publish a new version in June 2024. So, if you have any feedback or a new feature request for the new version, now is the best time to provide that.

Tags: , , ,

Ab3d.PowerToys | DXEngine