5 Nov 2009

Nebula3 SDK Nov 2009 Changelog

Here’s the new N3 SDK: download link

As always, this only includes the sources for the Win32 platform. Console platform specific source code (Xbox360, PS3 and Wii) is not included for obvious legal reasons.

Here’s a rough change log since the Apr2009 SDK:


== Major New Features

  • unified XNAMath support on Win32 and Xbox360 platforms
  • PS3 support (not part of public SDK, but lots of fixes for GCC 4.x in platform-agnostic code)
  • HTTP filesystem wrapper now working properly, this allows to create standalone N3 apps which load all their data from an HTTP server (see testhttpviewer.exe for an example)
  • “binary XML” support for much faster loading of big XML files (circumvents TinyXML)
  • new “FrameSync” system for running main and render thread in lock-step
  • new “Jobs” system to implement parallel jobs (CPU-thread-pool on Win32 and Xbox360, SPUs on PS3)
  • window parenting, it’s now possible to open the render window as a child of another window, this makes it possible to embed N3 into another Windows application
  • FMOD integration 


== Foundation Layer


  • new Debug::StringAtomPageHandler to inspect string atom table from web browser
  • type casting methods optimized in Ptr<>
  • optional allocation from memory pool support for RefCounted objects (currently unstable!)


  • Win32StringConverter: helper class to convert between UTF-8 and wide character string (currently only on Win32 platform)
  • Util::Array::InsertSorted() now returns index of inserted element
  • new Util::BitField<> class to allow bit mask operations on masks wider then 32 bits
  • removed classes of old string atom system: Util::Atom<>, Util::Proxy<>
  • new method Util::FixedArray<>::Resize()
  • classes for new string atom system: Util::StringAtom, Util::StringBuffer, Util::LocalStringAtomTable, Util::GlobalStringAtomTable
  • new method Util::Queue<>::Reserve()
  • new direct access methods in Util::RingBuffer<>
  • new method Util::Round::RoundUp()
  • new class Util::SparseTable, for 2D data tables with a lot of empty cells
  • Util::String:
    • new method CopyToBuffer()
    • new optimized versions of Tokenize() which fills a provided string array with the tokens, allows to reuse an existing array object
    • new static wrapper methods: IsDigit(), IsAlpha(), IsAlNum(), IsLower(), IsUpper(), StrCmp(), StrLen(), StrChr()
  • new util functions to help with “type punning”


  • BXmlReader: stream reader for “binary XML files” (created by the new binaryxmlconverter3.exe utility)
  • some low-level-optimizations in ZIP filesystem wrapper
  • application root directory stuff moved from AssetRegistry into Core::CoreServer
  • new class GameContentServer, used to properly setup game data on some console platforms
  • added support for http: and httpnz: schemes for reading data from HTTP servers through the N3 filesystem wrapper


  • Xbox360 and Win32 math classes have been unified into XNAMath classes
  • low-level performance tweaking


  • experimental memory pool support on Win32 platform
  • on Win32 platform, dynamically allocated memory is now 16-byte aligned (NOTE: there seems to be a hard to reproduce critical bug in Realloc() where HeapSize() returns a wrong value)
  • new HTML debug output in Debug::MemoryPageHandler for memory pools


  • Threading::CriticalSection rewritten with "Fast critical sections with timeout" by Vladislav Gelfer (on Win32 platform)
  • Threading::Event now supports “manual reset” behaviour
  • Threading::Interlocked class now uses compiler intrinsics on Win32 and Xbox360 platform
  • new class Threading::ThreadBarrier: stops a thread until all other threads have arrived at the barrier
  • optimizations in Threading::SafeQueue


  • new class System::Win32Environment to access environment variables (Win32 platform only)
  • Win32Registry class now reads registry key values as wide char and converts them to UTF-8
  • type punning fixes in System::ByteOrder


  • removed MasterTime/SlaveTime system, global timing is now provided by the FrameSync subsystem


  • the Message::SetHandled() method was not thread-safe, now uses Interlocked::Exchange() to update its status
  • Messaging::AsyncPort rewritten to allow better control over message handling behaviour through subclasses of HandlerThreadBase
  • new async message handler thread classes BlockingHandlerThread, RunThroughHandlerThread


  • some type punning fixes in debugpacket.cc


  • new classes HttpClientRegistry, HttpStream, HttpNzStream to implement a transparent HTTP filesystem, the HttpNzStream uses client-side zlib decompression to improve download performance


  • no noteworthy changes


  • new application identifier strings AppTitle and AppID, this is necessary for some console platforms


  • this is a new subsystem to distribute tasks either across threads in a thread-pool (Win32 and Xbox360) or the SPUs on the PS3


  • this is a new subsystem which implements better synchronization between the game thread and render thread


== Render Layer


  • parent window stuff in DisplayDevice (Win32 platform)
  • it’s now possible to share depth/stencil buffers between render targets
  • the ShaderServer now parses a dictionary file (created by the shaderbatcher3.exe tool) instead of listing the directory content of the shaders directory
  • removed array support from shader variables (shader parameter arrays are not very portable)
  • some restructuring because of the PS3 port (some classes have been split into a base class and platform specific derived classes)
  • new private method in D3D9RenderDevice: SyncGPU() this is called inside Present() to prevent the GPU from running too far ahead of the CPU (this is a driver-internal “optimization” which can lead to frame stuttering under some circumstances)
  • better control over clearing a render target through clear flags
  • the RenderDevice::SaveScreenshot() method is now responsible to set the MIME type on the output stream, this is because the actually saved MIME type may now be different then the requested type
  • no more byte-order conversion when loading mesh files, this happens in the asset pipeline now
  • new class MemoryMeshLoader, setup a mesh object from an existing VertexBuffer and IndexBuffer object

CoreAudio and Audio

  • the CoreAudio and Audio subsystem are obsolete and have been replaced with the FMOD-based Audio2 subsystem, which “automatically” works across all platforms, please check the FMOD license restrictions for commercial projects!


  • the following classes have been removed from CoreAnimation: AnimDrivenMotionSampler, AnimMixer, AnimSampler
  • new file format for animation data: nax3
  • new animation curve type: Velocity, this is used by the AnimDrivenMotion feature


  • no noteworthy changes


  • minor changes for Pre-Lightpass-Rendering
  • better control over render target clear in FramePass
  • FramePostEffect: rendering a full-screen-quad has been moved into new helper class RenderUtil::DrawFullScreenQuad
  • frame shaders are now loaded on demand
  • new LightServer class: LightPrePassServer implements light pre-pass rendering (a variation on deferred shading, currently only implemented in the PS3 port)


  • anim evaluation has been “jobified”
  • no more AnimDrivenMotion specific code in Animation subsystem (this is now handled through a new anim curve type which contains velocity keys)


  • new FMOD-based multiplatform audio subsystem


  • skeleton evaluation has been “jobified”
  • on PS3, skinning is now running on SPUs
  • the entire character subsystem has been optimized (essentially rewritten)


  • uses the FrameSync subsystem to run render thread and game thread in lock-step (this basically fixes all stuttering problems)
  • more debug infos displayed in web browser through GraphicsPageHandler
  • lots of fixes to the attachment system (character joint attachments: swords, shields, etc…)
  • restructured the Update/Render-Loop for better parallelization support, the idea is basically to make more room between updating an object and rendering an object so that asynchronous jobs have a better chance to finish on time before rendering requires the jobs output data


  • some new messages to communicate from the main thread to the render thread (see graphicshandler.cc)


  • nothing noteworthy…


  • some restructuring for better portability
  • particle updates have been “jobified”


  • no noteworthy changes…


  • new helper class RenderFullScreenQuad
  • new helper class NodeLookupUtil to lookup a ModelNodeInstance in a hierarchy


  • nothing noteworthy

== Moved into Addons:

  • fx
  • network
  • locale
  • posteffect
  • ui
  • vegetation
  • vibration
  • video

== New Stuff in ExtLibs:

  • FMOD
  • RakNet



rogerdv said...

No linux version?

Bruce said...


Dmitry said...


Unknown said...

Do you have just an archived version for those that'd like to look at the source code but aren't using Windows?


Kim, Hyoun Woo said...

Great, thank you for all these proceeding.

Bruce said...

Jedd, I'll get you something within a day or so and post it in a comment here.

Bruce said...
This comment has been removed by the author.
Bruce said...

Better (and working link) for my .zip file version:


If you can use the .exe version that Floh posted, use that please as my host has limited bandwidth.

Unknown said...

Thank you very much Bruce :-)

Unknown said...
This comment has been removed by the author.
Unknown said...

Great work, thanks for the release, I have a question though, I have tried Nebula a long time ago (don't remember if that was the first or second version), after reading the features in Nebula3 and skimming through the docs I am considering the use of Nebula3 for my future indie games.

In the docs, I read this in the forward: "Please note that this is (until further notice) a very early preview of what Nebula3 will be. Everything in this SDK is work in progress, and there's not much to play around with yet."
Do you still consider Nebula3 (in it's current state) to be unstable/uncomplete for production? I noticed it has been in development for considerable time since the first rewrite.

Thanks much! :)

Dmitry said...

I'm confused...
For example, D3D9ShaderInstance has "D9SI" fourcc.
But if it becomes D3D10ShaderInstance, so it's logically for code will be a "D10SI", but this is not "four"cc...
It's a foolish question, but how should you name this?

giblet37 said...

Not really a problem, seeing as docs and support are not the focus right now, but the docs (in the section about compiling) still reference Visual Studio 2005 SP1 as the required version. This is no longer true with this release - it contains only VS2008 solutions, which cannot be opened with VS2005.

Obviously not a major issue, but it would still have been nice to know that ahead of time.

eda said...




GeekMan said...

hi, thank you for your great work.
but, i have some questions.
1: is there any sample application for Nebula3?

2: is ther any active community for Nebula3 for Q&A?

DEADC0DE said...

I've noticed that now Nebula uses Lua instead of TinyTCL. What's the reason behind that choice?

thewhiteline said...

I managed to get the N3 SDK compiling with the DirectX Feb 2010 SDK. The testviewer runs. I also compiled the Maya plugin. I was hoping someone could give me some help with how to use the Maya plugin?

chris said...

I want to download and play around with the SDK. The authors and bruces links are not working. Is there anyone who can provide one? Thanks in advance.

draxd said...

If anyone needs Nebula3 here is upgraded version by some chinese dude :