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
Core
- 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!)
Util
- 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”
IO
- 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
Math
- Xbox360 and Win32 math classes have been unified into XNAMath classes
- low-level performance tweaking
Memory
- 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
- 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
System
- 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
Timing
- removed MasterTime/SlaveTime system, global timing is now provided by the FrameSync subsystem
Messaging
- 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
Net
- some type punning fixes in debugpacket.cc
Http
- new classes HttpClientRegistry, HttpStream, HttpNzStream to implement a transparent HTTP filesystem, the HttpNzStream uses client-side zlib decompression to improve download performance
Debug
- no noteworthy changes
App
- new application identifier strings AppTitle and AppID, this is necessary for some console platforms
Jobs
- this is a new subsystem to distribute tasks either across threads in a thread-pool (Win32 and Xbox360) or the SPUs on the PS3
FrameSync
- this is a new subsystem which implements better synchronization between the game thread and render thread
== Render Layer
CoreGraphics
- 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!
CoreAnimation
- 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
Input
- no noteworthy changes
Frame
- 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)
Animation
- 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)
Audio2
- new FMOD-based multiplatform audio subsystem
Characters
- skeleton evaluation has been “jobified”
- on PS3, skinning is now running on SPUs
- the entire character subsystem has been optimized (essentially rewritten)
InternalGraphics
- 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
Graphics
- some new messages to communicate from the main thread to the render thread (see graphicshandler.cc)
Models
- nothing noteworthy…
Particles
- some restructuring for better portability
- particle updates have been “jobified”
RenderModules
- no noteworthy changes…
RenderUtil
- new helper class RenderFullScreenQuad
- new helper class NodeLookupUtil to lookup a ModelNodeInstance in a hierarchy
Resources
- nothing noteworthy
== Moved into Addons:
- fx
- network
- locale
- posteffect
- ui
- vegetation
- vibration
- video
== New Stuff in ExtLibs:
- FMOD
- RakNet
Enjoy!