[<< home] Dev log for "Le Cauchemar", a freeware game by Phil Palmer                            
[<< archive]      
  Download / game info    
  Mailing list / contact    
       
Total hours: 3005                    
                     
Date Entry Hours                  
9-mars-2010   3,25    
  I'm wondering how to do the devlog(s) from now on…
- wants to be in the wiki
- does NOT want to be a separate log for engine/tools/cauchemar/gnome.  For release logs yes, but not devlogs because I'll be tending to flit between engine, tools & project a lot and don't want to lose the 'trail'.
- however, some kind of colour-coding to indicate the thing being worked on at each part of the log would be nice.
- wants to be a log per PERSON

choice therefore seems to be between:
- devlog as a sub-page of the user page
- devlog as a namespace

Decided the devlog should be a sub-page of my user page.  Here it is:
http://programmerart.org/wiki/index.php?title=User:Phil/Devlog

This Excel devlog is now discontinued.  Please follow the link above for the new devlog on the wiki.
     
       
8-mars-2010   4    
  Let's work-out why the .X exports from Max 10 aren't working (appearing invisible)…      
  Tested opening a Max file saved from max 6 with max 10: works perfectly.    
  Test: Saved the same geosphere, with the same export settings, from both max 6 & 10:
c:\gnome\exporttest

…hmm, neither the 6 nor the 10 version shows up in the DX viewer.
Let's try in-game…..

The 6 version isn't showing up in game.
Let's try exporting Tubby from 6...
interesting, he exports, with his anims, but he's lying on his front with his head facing back behind the player.

Try exporting him from 10...
loading him in 10, there's a message saying "obselete data found, please resave file"
Weird! (but cool) - saving from 10, tubby works perfectly, he's standing up this time.  No idea what was wrong with the 6 export, never seen that problem before.
   
  Guitar exported from 10: still invisible.
Think this might be a bones thing.

Gnome exported from 10: invisible.

Now waiting for Graeme to send me a max 10 zombie in .max format.  I'll export him as a binary X and release him in a new build of Le Cauchemar.
   
  Documented v24 here:
http://programmerart.org/wiki/index.php?title=Le_Cauchemar_talk:Game/Release_Log
   
20h56 Right, while I wait for the new zombie model, I'm going to improve the Options Parser tool so that it spits out wiki documentation for all the options it processes.    
#revision 2018 The Options Parser tool now outputs wiki documentation for all the options it parses (using the code comments).
The page that it generates is currently (C:\noctambule\docs\WikiOptionsList.txt), which goes here in the wiki:
http://programmerart.org/wiki/index.php?title=Engine:Engine/Options/List
   
#revision 2020 The wiki documentation generated by the Options Parser now includes the lists of available enumeration values.
TODO: Include the comments for the enumeration values.
   
1-mars-2010   1,5    
  Grrr, my bug from yesterday was just the old chestnut of confusing 'view matrices' with view-to-world matrices >:(
How embarrassing.
Made a rule about this now in my coding conventions:
     
  http://programmerart.org/wiki/index.php?title=Engine:Engine/Programming/Conventions#Matrix_Names      
#revsion 2016  Moved MATRIX44 typedef from global.h to maths.h      
#revsion 2016  Maths.cpp: Added function ReflectMatrixByPlane.      
#revsion 2016  Fixed the culling of objects in the ground reflection.      
  Dug-out the old TrackIR 4.  It gave me a couple of bluescreen crashes when I connected it to my USB two-way splitter.  Seems happy enough connected directly to a USB port though.
Tested that it was being handled properly in v23.2 and in the current code.
TODO: fix shadow glitches seen at the edge of the screen when the tracked head is off-centre.
     
28-févr-2010   1,25    
  trying to fix the culling of reflected objects….
- In TestSphereVisibility, see the two versions of the setup of pInvCameraMat.  The second is the one I'm trying to get working.
- See current changes in CModeEnvironment::GenerateReflectionImage.  Why is that reflected matrix not working for TestSphereVisibility?
     
21-févr-2010   0,5    
#revision 2012
#revision 2013
wiki: Fixed the page script errors.  Not sure what the proper fix would have been; i've just remmed-out the references to these undefined variables :
wgBreakFrames (now as if false, revision 2012)
wgContentLanguage (ts_europeandate is now always true, revision 2013)
     
#revision 2014 website: added 'wiki' link to the links at the top of the home page      
#revision 2010 wiki: removed copyright & powered-by stuff from the page footer      
  wiki: installed this syntax-highlighter extension; can't get it to work….
http://www.mediawiki.org/wiki/Extension:SyntaxHighlighterAndCodeColorizer
     
15-févr-2010      
  TODO: "proper" (non-youtube) video/media player:
http://www.mediawiki.org/wiki/Extension:MediawikiPlayer
     
  programmerart.org was framed to http://www.philpalmer.me.uk      
  can't figure out how to make programmerart.org point to programmerart.org/wiki      
14-févr-2010      
  NOTE: When making changes to style sheets, need to Ctrl-F5 to be sure that the changes take effect!      
#revision 1997 baseTemplate.css: #mainContent :
float: none
width: auto
     
#revision 1998 intech: properly fixed the content wrapping problem now, by copying some of the 'basic structure' section from the basetemplate.css of the Cavendish theme      
#revision 2003 simplified the sidebar a little; changed it to use pngs      
  The site is a ton snappier speed-wise now that I've changed all the jpgs to pngs.  Jpgs are real slow.      
  "__NOEDITSECTION__" anywhere on the page will remove the edit links      
  http://www.mediawiki.org/wiki/Extension:Edit_Section_Link_Transform
this is supposed to replace the [edit] links with an icon.  Doesn't work for me - prevents the pages loading, in either intech or monobook skins.
     
  http://www.mwusers.com/forums/showthread.php?6870-Edit-section-link-moved      
#revision 2007 got the section [edit] links behaving themselves with the intech skin.  In the main.css, I just had to add style entries for "h1.editsection", "h2.editsection" etc.  I also had to add "float:right;" into each of these, although I had thought that the "float:right;" in shared.css should have already taken care of that.      
#revision 2008 http://www.mediawiki.org/wiki/Manual:$wgAllowExternalImages
localsettings.php: added:

# allow inline images hosted on external websites, sometimes called Inline linking.
$wgAllowExternalImages = true;
     
13-févr-2010      
  wiki: no idea why I can't get the 'editinterface' permission to work (to edit the page 'MediaWiki:Sidebar').
I'm registered as an admin, and Special:ListGroupRights confirms that admins have the editinterface permission.
But I can't edit the sidebar page; there is no edit tab.  (?)

...AHA: I can edit using this link:
http://programmerart.org/wiki/index.php?title=MediaWiki:Sidebar&action=edit
     
  Sidebar page was:

* navigation
** mainpage|mainpage-description
** portal-url|portal
** currentevents-url|currentevents
** recentchanges-url|recentchanges
** randompage-url|randompage
** helppage|help
* SEARCH
* TOOLBOX
* LANGUAGES
     
  Installed software      
  Product Version       
  MediaWiki 1.15.0       
  PHP 5.2.8 (cgi-fcgi)       
  MySQL 5.0.77-log       
  Spent ages trying to prettify the urls, so that for example
http://programmerart.org/wiki/index.php?title=Main_Page
would be
http://programmerart.org/wiki/Main_Page

instructions here:
http://www.mediawiki.org/wiki/Manual:Short_URL

Couldn't get the .htaccess file (in wwwroot) to have any effect.  Sent a note to Catalyst2 asking if this is possible and if I'm doing it right...
hmm, pas de bol :
"Hi Phil,
I am afraid .htaccess doesn't work on windows hosting, just our linux packages."

"If you're planning to use PHP and MySQL, then a Linux account would probably suit you better."

TODO: switch to Linux hosting once the old site is dead?
     
  wiki: Been wrestling with the dilemma of namespaces vs no namespaces.
With namespaces (for Engine, Tools, Le Cauchemar and Gnome), we can filter the search, which is really nice I think.
The downside is that Engine page can't be called 'Engine', it has to be called something like 'Engine:Main' or 'Engine:Engine' :/  not great.

Decided in the end to go with the namespces; the search-filtering is too nice a feature to lose.
The namespace root pages are therefore called:
Engine:Engine
Tools:Tools
Le Cauchemar:Game
Gnome:Game

Not great, but my opinion right now is that it's the best compromise overall.
     
  Cool, an extension to hide page titles:
http://www.mediawiki.org/wiki/Extension:NoTitle
"Just put __NOTITLE__ on any pages where you want to hide the title."
     
  Didn't manage to get NoTitle working for the intech skin.  TODO: clean-out the unsuccessful test code.      
10-févr-2010      
  had a look at wikispaces      
  and Zwiki:
http://zwiki.org/ZwikiInANutshell

This allows a hierarchical layout (nice backlinks etc), but not hierarchical naming.
     
  Helm: Set PHP version to 5 (in the website settings).  This is in preparation for potentially using the latest version of MediaWiki      
  test: website write permissions = yes      
  test: show folder sizes = yes      
  I think Catalyst2 has got everything I need to run a MediaWiki site:

"Required software:
* Web server with PHP 5.x or higher.
* A MySQL server, 4.0.14 or higher OR a Postgres server, 8.1 or higher"


so I'm going to try MediaWiki…
It's all about those sub-pages…
     
  I've already downloaded
mediawiki-1.15.0.tar.gz
and unpacked it.
     
  Renamed the remote root folder for the ScrewTurn site to
"ScrewturnWiki"
     
  MediaWiki 1.15.0 Installation
Don't forget security updates! Keep an eye on the low-traffic release announcements mailing list.
Checking environment...
Please include all of the lines below when reporting installation problems.

PHP 5.2.8 installed
Found database drivers for: MySQL
PHP server API is cgi-fcgi; using ugly URLs (index.php?title=Page_Title)
Have XML / Latin1-UTF-8 conversion support.
Warning: A value for session.save_path has not been set in PHP.ini. If the default value causes problems with saving session data, set it to a valid path which is read/write/execute for the user your web server is running under.
PHP's memory_limit is 128M.
Couldn't find Turck MMCache, eAccelerator, APC or XCache; cannot use these for object caching.
GNU diff3 not found.
Found GD graphics library built-in, image thumbnailing will be enabled if you enable uploads.
Installation directory: D:\domains\programmerart.org\wwwroot\wiki
Script URI path: /wiki
Installing MediaWiki with php file extensions
Environment checked. You can install MediaWiki.
     
  contact email was: root@localhost
language was en-English
copyright/license was: No license metadata
admin username was: WikiSysop
     
  bought a 25MB MySQL 5 database
Added it in Helm as "wikidb"
Added the "wikiuser" user
done: "Move the config/LocalSettings.php file to the parent directory"
todo: "You should change file permissions for LocalSettings.php as required to prevent other users on the server reading passwords and altering configuration data."
     
  LocalSettings.php: added:

# Enable subpages in all namespaces
$wgNamespacesWithSubpages = array_fill(0, 200, true);
     
  big w00t !  The MediaWiki site is working and sub-pages are working.
http:\\programmerart.org\wiki
     
10-févr-2010      
22h23 It would appear that I has wiki!!!!1      
  Previous wiki header:
<div style="float: right;">Welcome {USERNAME}, you are in: {NAMESPACEDROPDOWN} &bull; {LOGINLOGOUT}</div><h1>{WIKITITLE}</h1>
     
  Server Error in '/wiki' Application.
--------------------------------------------------------------------------------

Configuration Error
Description: An error occurred during the processing of a configuration file required to service this request. Please review the specific error details below and modify your configuration file appropriately.

Parser Error Message: Theme 'Custom' cannot be found in the application or global theme directories.

Source Error:


Line 36:     <trace enabled="true" localOnly="false" />
Line 37:     <!-- -->
Line 38:     <pages styleSheetTheme="Custom"/>
Line 39:    
Line 40:     <customErrors mode="Off"/>
 
     
  <- TEMP: to fix the problem above (without damaging the current active site), I've added the folder wiki/App_Themes, which just contains an empty Default.css.
TODO: once I drop the current main site in favour of the wiki, I should delete this folder.
     
  Doesn't look like I can do MediaWiki-style subpages with ScrewTurn Wiki :(

Andy Henderson, Screwturn developer:
"Basically, Wikis are good at handling unstructured data and mapping structured data onto a Wiki can be frustrating. If you use a page naming convention to allow a page to identify its subpages, you could consider writing your own plugin to do the connecting up automatically."
NOTE: with MediaWiki's subpage system, it's not difficult or frustrating at all!

http://www.screwturn.eu/forum/viewtopic.php?f=20&t=6426
     
  ScrewTurn plugins:
http://www.screwturn.eu/Customize.UsersPluginsV2.ashx
     
16-janv-2010      
  Really want to set up a wiki before I do anything else.  Documentation is really valuable.
Tested wetpaint.com (provider of free hosted wikis).  Sucks - plastered in muscly-man/dating adverts.
$19.95/month to remove the ads.
     
  "how to build your own wikipedia":http://www.cio.com/article/189150/How_to_Build_Your_Own_Wikipedia?page=3&taxonomyId=3000      
  http://en.wikipedia.org/wiki/Comparison_of_wiki_software      
  Installed Emerald Viewer (replacement Second Life viewer).
g:\Program Files\Emerald Viewer
     
  Downloaded Screwturn Wiki no-database-required version:
File-System Data Storage
ScrewTurn Wiki 3.0.1.400, pre-configured for storing data on the local file-system. Optimized for easy deployment and for low-traffic wikis.
     
  Deleted the old wiki test folder:
wwwroot/wiki
     
  Recreated wwwroot/wiki and will use it for ScrewTurn
Following the "Clean Installation" instructions:
G:\Installs\ScrewTurn Wiki\ScrewTurnWiki-3.0.1.400\install.txt
     
  TODO:
 4. Set the permissions of the "public" directory so that the ASP.NET Worker Process has "Modify"
    permissions on it (usually, the ASP.NET Worker Process runs as "NETWORK SERVICE" or "ASPNET",
    depending on the Operating System version).

 5. Setup a Web Site or Application in IIS, setting the root directory to TARGET_DIRECTORY.

 6. Navigate to the Web Site or Application using a web browser and verify that everything works properly.
     
8-nov-2009   18:45->20:50  
  Trying to fix the culling of reflected objects….      
5-nov-2009   1,91667    
#revision 1984 added option stereoscopy\interlaceStyle
blocky / fizzy (defaults blocky)
     
4-nov-2009   2,55    
  c:\noctambule\screenshots\4_11_9_interlacedPixelShift_vs_not.psd      
  Found the cause of the ineffective-interlaced-pixel-shift-on-menus problem:
The menus are not drawn to the (half-height) frame RT.  They're drawn directly to the screen, using a z-buffer mask in certain stereo modes such as interlaced.
     
  c:\noctambule\screenshots\4_11_9_lightingJitterGlitch.png      
25-oct-2009   2,16667    
#revision 1981
#revision 1982
CViewInfo::ApplyCamera: tidied the zero-parallax-distance test so that it can be left in (it's not useful for this game but good reference for the future).      
  Added the required one-pixel offset for the second eye in line-sequential and column-sequential stereo modes.      
#revision 1983 bugfix: COptions::LoadOverrides: The correct default override profile is now loaded when column-sequential stereo modes are selected.  Previously the line-sequential override was getting loaded instead (cut & paste error).      
23-oct-2009   3,333    
#revision 1978 Example_3DDisplay_Zalman_Trimon_ZM-M190.txt
now uses an accurate screen width measurement: 37.5cm
     
#revision 1979 Added missing source files to the install:
Frustum.cpp, Frustum.h
MaterialTexturePathnames.hpp
Checked that all other releasable CPPs and headers are present.
     
  Found John Whigham's public Isis blog (not updated since May 2009 unfortunately) :
http://genesis-machina.net/wordpress/?cat=4
     
#revision 1980 ETEXTURE_ZOMBIE
has been replaced by
ETEXTURE_CHARACTER_TUBBY
and
ETEXTURE_CHARACTER_GRACORE
     
#revision 1980 Added option Debug \ playerCharacter and Debug \ enemyCharacter
Valid values are currently ECHARACTER_TUBBY or ECHARACTER_GRACORE
Both options default to Gracore.  The Gracore model is currently over-expensive, but it looks tons nicer than the old placeholder zombie, so it's got to be the one we use by default.
     
26-sept-2009      
#revision 1973
#revision 1975
Added profile Example_3DDisplay_Zalman_Trimon_ZM-M190.txt
This uses a rounded screen measurement of 44cm from invincibletiger.com (can't find my measuring tape)
<-FIXED (23.10.9)
     
23-sept-2009      
  Bought the domain name stereoshare.org for one year.  This is for the photo/video viewer that I'm going to make, that will allow (as an initial goal) stereo photos from my Fuji W1 to display optimally on a Zalman ZM-190 with no hassle.
The idea is:
- select camera
- select monitor
- look at photos (they're correctly calibrated for the camera-montior combo) - no hassle.
TODO: Advertising deal for 3D monitors.
TODO?: This viewer could allow head-tracked viewing of 360x180 panorama photos (very cool).
     
30-août-2009   1,5    
#revision 1968 zombies now render with colour maps      
13-juin-2009      
  59.922743 Hz ?
http://www.youtube.com/watch?v=Rloz1tv3BLI
     
13-juin-2009      
  _ground
is now a subdivided, rippled plane at 0,0,0
     
         
         
7-juin-2009   6    
#revision 1884 Fixed a silly bug that was causing the 3DVisor custom override profile to get loaded in place of the iWear one.
The iWear custom override profile now works.
     
#revision 1885 DXUT: I'm now calling the device-lost callback at every point in the file where SetDeviceLost(true) is called.
A few of these cases are rare and never get tested... :/
     
  AdapterOrdinal      
  Fixed the crash I was getting in VR920 mode when dragging the game window between monitors:
     
#revision 1886 The failing assert (in DXUTSetMultihead: "NumberOfAdaptersInGroup > 1") was actually invalid so I've removed it.
Explanation from DX docs:
"NumberOfAdaptersInGroup is 1 for conventional adapters, and greater than 1 for the master adapter of a multihead card. The value will be 0 for a subordinate adapter of a multihead card. Each card can have at most one master, but might have many subordinates."
     
#revision 1887 The crash that followed the failing assert was in CLamppost::Prep, where it was assuming 'this->pLight' was non-NULL.  pLight is set up in the Update (todo: move), so it must have been getting to a prep before an update.  Thought this might have been because of the frame-sequential style ("more synchronised", don't update between the eyes), but it was happening on "smoother" as well.
Anyway, fixed with a NULL check.
     
  The iWear default override profile now sets displayWidth=30, distanceToScreen=40.
Might be too strong for some people; let's wait and see what they say.
   
#revision 1889 Z800 & VR920 example profiles now set fullscreen=true, fullscreen res = 800x600    
#revision 1890 Added option display \ adapterOrdinal (defaults 0)
This allows you to specify the index of the adapter (monitor port) for which to create the D3D device.
When the value is used, it is clamped between zero and the index of the highest available adapter.
   
  Described the geometry of accurate life-sized stereo in an MTBS post (handy info):
http://mtbs3d.com/phpbb/viewtopic.php?p=26175#p26175
   
#revision 1891 The Z800 & VR920 example profiles now set display \ adapterOrdinal to 1 (so they assume that the headset is the secondary monitor).    
#revision 1892 Added option headTracking \ ignoreYaw.  Ignore headtracker yaw values (only applies to iWear)
Defaults false / true when using iWear headtracking.
   
#revision 1893 Moved headOffsetMatrix setting from OptiTrack custom override profile to OptiTrack default override profile.
No idea if the data is good or not, but at least now it's the in the right file.
   
#version 23.2
revision 1895
Released v23.2 (VR920 improvements)    
  Added missing profile Example_HMD_eMagin_Z800_3DVisor.txt to the install    
6-juin-2009   1,5    
#revision 1882 Graeme's going to take over the art & design for this project, because I don't seem to enjoy modelling/texturing/animation enough to get good/fast at it any time soon.
I've burnt him a DVD containing all the current artwork, photography and plugins.  He might need to throw away the existing landscape because the unconventional way I've approached the modelling (huge towering modifier stacks that I never collapse) might not suit him.  I've got no problems with starting the scenery from scratch, as long as the results are better than mine.
We'll set up a workflow that will allow him to test his work easily in-game as he goes along.  The aim is to get from what we have now - a sparse engine demo - to a presentable finished game.  Then we'll start on the next one ;)
     
  TOFIX: game now crashes if dragged from one monitor to another, except (if you're lucky/fast) if this is done during startup.
<-Fixed(7th)
     
2-juin-2009   0    
  Stereo filmmaking terminology reference:
http://www.popularmechanics.com/technology/industry/4310774.html
- "interaxial setting" (camera spacing)
- "zero parallax setting" (stereo "focus depth") aka (less appealing) "convergence point"
     
  TODO: Sensio 3D mode.  Is the Sensio box PC-compatible?

http://www.stereo3d.com/discus/messages/21/2251.html?1088933126

"Anyone that wants a screen grab of the sensio format, just email me at *******
Basically it is side by side squeezed 720x480 image with a 6 pixel vertical black border up the middle of the 2 images. The image on the left is 360 pixels wide, then the 6 oixel border then a 354 pixel image on the right"
     
1-juin-2009   1,25    
  These settings make the VR920 mode awesome:

displayWidth: 30 // bizarrely small, was 100
distanceToScreen: 40 // bizarrely small, was 150
iWearUnleashed:  yes // 60fps ftw
frameSequentialStyle:  EFRAMESEQUENTIALSTYLE_MORE_SYNCHRONISED // really just for the blaster effect
     
  Above: re the 30 & 40: interesting, that, very interesting.  I think what's happening is this:
- the field of view is being exaggerated (which is nice except it makes things more miniature)
- at the same time, the horizontal image translation is also being exaggerated (which stretches the Z axis)
- the combination of the two keeps everything looking approximately life-sized, but more juicy than it would be if using the true values.
...something along those lines.  Need to be able to explain it more scientifically.  But the important thing is that it feels a load more immersive than it did before.  Of course, there could just be a bug somewhere in my maths, but that's not my gut feeling (and any such bug would need to have been hiding pretty hard through all the headtracking etc).
So I think I've stumbled on something quite useful here - just need to make a bit more sense of it....
     
  TODO: for v23.2: use the 30 & 40 (above), see what people think of it.
<-done(7th)
     
  TOFIX: in v23.1, in VR920 mode, trying to override displayWidth / distanceToScreen:
customOverrides_EHEADTRACKERMETHOD_IWEAR.txt doesn't seem to work;
custom.txt doesn't seem to work !
<-fixed (7th)
     
31-mai-2009   5    
  Visual Studio: kept getting that "Embedding manifest…" hang, which requires a restart >:(      
  When I interrupted the hang by trying to shutdown Windows, I got this:
"1>Project : error PRJ0002 : Error result -1073741510 returned from 'C:\Program Files\Microsoft Visual Studio "
     
#revision 1877 Managed to get fullscreen alt-tab working in VR920 mode.
Found that DXUT hadn't actually been calling my device-lost callback… it's very tricky to debug fullscreen problems when the VR920 is my primary monitor.
Incidentally, the matrices sample crashes on fullscreen alt-tab.
     
  Found the source of the slowdown in VR920 mode.  It's in CiWear::PostPresent, the 'while' that waits for the eye queries.  If I rem that out, the framerate rips back up 60 but the synchronisation relies on it staying at 60 (just like the Z800).  Sooo much nicer in 60.
<-added an option to skip the while: "VR920 max speed" (stereoscopy\iWearUnleashed)
TODO: See if there's a better place in the frame for that 'while' (maybe in PrePresent???)
     
#version 23.1
revision 1878
Released v23.1 (VR920 improvements)      
29-mai-2009   2    
  Trying to get fullscreen alt-tab working in VR920 mode…      
25-mai-2009   3,25    
#revision 1873
#revision 1874
Added option stubs:
- stereo \ sceneScale
-
stereo \ smootherFrameSequential (update between first and second eye in frame-sequential modes).  Currently I  prefer it 'smoother' (but less synchronised).  Need to compare the two versions on a faster PC if possible.
     
#revision 1875 Option stereo \ smootherFrameSequential now works.  Defaults true.      
  TOFIX: if game is launched in fullscreen, the fullscreen res specified by the HMD override profiles doesn't take effect because the HMD is detected later than the display being set up.      
  TODO: fullscreen alt-tab handling (enter pause mode and pull the VR920 out of stereo mode.      
21-mai-2009   5,5    
  TODO: Find out how the options "head-mounted display" and "camera mounted on monitor" sit with each other.
Plus other improvements to the mix-and match configurations (keep the Z800 awake, etc)
     
  Had to add an iWear case to COptions::LoadBasicProfiles, otherwise changing the stereo mode would set the HMD option false.
TODO: some tidying (see duplication of profile loading between COptions::LoadBasicProfiles and CHeadTracker::Init)
     
  …also fixed a bug in COptions::LoadBasicProfiles that was preventing the 3DVisor custom override profile from being loaded.      
  Forced the VR920 into mono when windowed.  TEMP?
I couldn't get it to sync properly in stereo in winodowed mode.  Even the Matrices sample doesn't manage to do this reliably.  So it's probably not worthwhile trying to fix it.
     
  Got rid of the messages saying that the VR920 is not connected to a video adapter (it was appearing erroneously, even in the Matrices sample).  TODO: put them back in?      
#version 23.0
revision 1872
Released v23.0 (VR920 native support)      
20-mai-2009   3    
  Got the eyes into sync on the VR920.  Just had to move the query Issue calls to be around the entire BeginScene-EndScene section (OnFrameRender, main.cpp)      
  Found that the VR920 headtracking pitch and roll are almost perfect.  It's just the yaw that's unusable.
TODO: add an 'ignore yaw' option that defaults true in the VR920 profile?
     
  At 640x480 fullscreen, the game has some strange tearing at the bottom of the screen in VR920 stereo mode.
Tested the 'Matrices' sample from the iWear SDK - it does exactly the same thing in 640x480 :P
So I'm going to forget about it and set the default fullscreen res in VR920 mode to 800x600 (same as Z800).  That's good for a couple of reasons - gives us a sort of antialiasing and prevents me getting any false impression of how well the game is performing GPU-wise (as would be the case at 640x480).
     
  So tomorrow, version 23 - with VR920 native support, finally :)      
19-mai-2009   3,5    
  Remembered there is no Mist.fx anymore.  The mist is currently rendered in DeferredLightingApply.fx      
  The problem with loading the iWear DLLs (16th) looks like it was [mostly] just a unicode/non-unicode mixup.  I hadn't noticed a compile warning 4133 telling me that the DLL filenames were ASCII which was invalid input for LoadLibrary.
The other weirdness there was that the debugger was showing faulty values for variables (so even once it started working, it still appeared in the debugger as if LoadLibrary was returning NULL)
     
  Global.h, added:
#pragma warning(error:4133)   // PP(19.5.9): warning C4133: 'function' : incompatible types - from 'char [13]' to 'LPCWSTR'

Also added this separately to iWearSDK.c
     
  Added CiWear::InvalidateDeviceObjects & RestoreDeviceObjects
Device changes now work (eg. Alt-enter to non-desktop res)
     
  Tested AssaultCube in VR920 native mode.  Works…although I got the impression the headtracking yaw was being doubled maybe?      
  Progress!  Headtracking is working; stereo is working fine in windowed mode but the eyes are switching in fullscreen.  Shouldn't be too hard to track that down tomorrow.      
  Ouch!  The VR920 just took its first tumble onto the stone floor (drop of about 1.5 feet).  Thankfully the screens still look fine.  I might stick some bubble-wrap on it.      
18-mai-2009   0    
  TODO: for sound, find out about IXACT3Engine - something built into directX / xna      
16-mai-2009   5    
  Teehee, a great name for the sequel: Cauchemardeux !      
  Added to project Configuration Properties \ C/C++ \ General \ Addition Include Directories :
C:\IWEARSDK\inc
     
  iWear headtracker values: +- 32768
#define IWR_RAWTODEG   180.0f / 32768.0f
#define IWR_RAWTORAD   IWR_PI / 32768.0f
     
  WM_MOVE and WM_SIZE messages are sent automatically when the app starts up      
  Couldn't get LoadLibrary to work for iweardrv.dll - no idea why; it works fine in the samples
So I'm now linking statically with iweardrv.lib instead
Same for iwrstdrv.lib
<-FIXED (19th), and the static linking didn't seem to want to work anyway
     
  Added
C:\IWEARSDK\lib
to VS library paths
     
15-mai-2009   4    
  TODO: Why on earth is some of the stuff (menu, rain) rendering in anaglyph now when in fullscreen???
And where are all the character/lamppost shadows???
Must be because of the video driver update?
->oops, the nvidia stereo driver had somehow got activated, panic over
     
#revision 1858 Vuzix SDK: Successful upgrade from 2.1 to 2.4      
  TOFIX: custom override profiles are currently built from my dev versions.  Need to do the same as I did with custom.txt      
#revision 1861 CCamera::CalculateProjection: removed a variable that was being used uninitialised…very worrying.  Need to test window headtracking asap.
Problem started in revision 1843, meaning it was released in v22.1
     
  Shadows are getting cut-off at the edges of the screen (debug and master), although 22.1 was fine.
Conclusion: revision 1843 corrected the frustum face orientations but it pushed the near face out to the screen plane.  As a result, when the distance-to-screen is low the shadows become blocky; when distance-to-screen is large the shadow culling causes gaps at the edges of the screen.
<- fixed in revision 1864
     
#revision 1864 Corrected the g_viewInfo.cameraSpaceViewFrustumso that it now matches the the actual frustum used for the projection.  The result is that no shadows are cutting out or getting blocky, etc.      
  TOFIX: in side-by-side modes, you can see some wrapping of the rendertargets at the edges      
  TODO: Stereo scene-scale parameter, just for fun / completeness.  Could be interesting with the headtracking actually.
TODO: Follow that with a focus depth parameter (for the same reasons), and even an auto-focus (for the same reasons)?
     
14-mai-2009   0,83333    
  Been away for a while.  The purpose of this project was to help me apply for a job somewhere French-speaking, and back in December that all came to a successful conclusion (I'm now in France rather than the UK... YHESS!)
I've been a bit busy with the move, the new job etc.  But the side-project 'bug' isn't easily shaken off (nor is the stereo 'bug') - I've missed it.  So I'm coming back to do some stuff... but hopefully I won't let it absorb me quite as much as it did before.
     
  I've just bought a Vuzix VR920 HMD, so it's time to put the native support for that into the game.  From what I can tell, the headtracker is pathetic, but the screens are quite nice.      
  Downloaded and installed the VR920 Windows SDK v2.4 from here:
http://www.vuzix.com/support/downloads_drivers.html
Installed 2.4 over the 2.1 that was already installed and in SVN
     
  Tested the HelloTracker2 sample project - seems to be working fine.      
  MatricesQueryGPU sample:
1>Linking...
1>MatricesQueryGPU.obj : error LNK2019: unresolved external symbol _D3DXCreateFontA@48 referenced in function "long __cdecl InitD3D(struct HWND__ *)" (?InitD3D@@YAJPAUHWND__@@@Z)
1>Debug/VR920StereoScopy.exe : fatal error LNK1120: 1 unresolved externals
     
11-déc-2008   2,5    
#revision 1841
#revision 1842
Added new options profiles:
- Example_HeadTracking_OptiTrack_FLEX_V100.txt
- Example_Stereoscopy_50Inch3DDLP.txt
- Example_Stereoscopy_Speedy_50Inch3DDLP.txt
     
#revision 1843 Camera.cpp: Made a further fix to g_viewInfo.cameraSpaceViewFrustum, continuing from revision 1839.
The near (small) end of the frustum represented by it now simply matches the screen rather than the near clip plane.

This fixes a bug that had been remaining whereby objects and shadows would still sometimes cut out at the edges of the screen when using headtracking.
     
#version 22.1
#revision 1844
Released version 22.1 (culling fixes for headtracking).      
9-déc-2008   3    
#revision 1838 Remembered that you can't [always] breakpoint 'goto' lines :/
For this reason I've now removed all the gotos from CMeshFrame::TestVisibility
     
  OptiTrack: The hang I've been getting, when using the Flex V100 camera, is in
pCameraCollection->Enum in COptiTrack::Init.
It makes the game process impossible to kill from task manager.

Removing the USB fixes the problem straight away.
     
#revision 1839 Took me a while to track it down, but I've now fixed the annoying culling & shadow glitches that I was seeing when using virtual-window headtracking and moving the viewpoint well off-axis.
I had been forming the off-axis frustum using the camera-space eye position as the origin (the tip).
However, I had been generating the face planes using that tip and two points on the near clip plane (rather than points on the screen plane).  Effectively I had been generating frustum data for a smaller screen (a screen the size of the intersection between the near clip plane and the frustum).  That had been producing incorrect plane equations for the frustum's faces.

I'm now scaling the tip position by (nearClip / (distance to screen when head is centred)).  The near end of the frustum still sits on the near clip plane.
     
7-déc-2008   2,5    
#revision 1836 Fixed the bug that was stopping the headtrack offset matrix being saved.  It's now saved to the headtracker's custom override profile when the headtrack calibration mode is popped.      
  TODO: fix problems with options being set by stereo default overrides, eg. Aspect ratio & IP distance for cross-eyed.      
2-déc-2008   2    
  Bit of modelling: did the Bedford Court window pod.  Used 'fixed' window primitives for this; they worked well.      
23-nov-2008   12,666    
  todo get skydome collision exclusion working      
  Shadows now use a 4*4 blur pass after the screen-res scattering process - the result is very clean soft shadows.  Scattering now uses a repeating 4*4 pattern so that it blurs neatly.  The repeating scatter pattern also improves texture cache efficiency lots (at least, it did last time I tested it).
Shadow dest RT must now always be a quarter of the width & height of the shadow source RT.
     
#revision 1824
#revision 1825
Parallax.fx: Fixed the shadow gaps seen where geometry intersected a parallax surface.
The fix makes parallax.fx output a slightly untrue position value (as if the POM peaks were poking out instead of the troughs poking in).  But there are no side effects that I care about in the slightest.
     
#revision 1831 Added a subtle ambient occlusion effect to the shadows, by making them get slightly weaker as they move away from the point where the occluder touches the receiver.
I don't know if I'll be able to keep this or not… it's totally beautiful in the areas where it works, but when there's busy mesh detail (eg. characters) it causes artefacts.  I'll keep an eye on it....
     
#revision 1832 Added option Debug\exhibitLighting.  This shows the scene with no textures.      
  I may have fixed the problem where the lighting would occasionally jitter out of position for one frame at a time.
I'm confused about the problem; I'm also hoping it could be a possible fix for the no-lighting-at-all bug seen by CK.
I had a hunch that the problem was to do with getting the current render target dimensions (with pSurface->GetDesc) in order to set the half-pixel offset constant for DeferredLighting.fx.... some kind of contention thing....?
I've now changed most of those places to use the width & height members of the CRenderTarget instead.
     
#revision 1832 Are all of the following rendertargets cleared if required? :
- shadow source? - clear needed and done.  Barely needed, but without it, a clipping glitch leaves smears on the player's hands (TODO: find nicer fix?)
- shadow dest? - clear not needed and not done
- splash source? - clear needed and done
- splash dest? - clear not needed and not done
     
  Temp v24 bodge: Mesh frames now default to drawing to rain occlusion again (there's a bit more work involved in letting it default false…TODO!)      
  Disabled the placeholder weapon sound.  It's been nothing but trouble from day 1.  I'll add proper audio if I get a chance.      
  noiseNormals.png
puddleNoise1Tight.tga
puddleNoise2Tight.tga
velocityTest.png
whiteSquare.tga
dimpleTileTest.png
testDimples.tga
dimple_LSCCover.tga
HUDObject.fxo
Characters folder
     
#version 22.0 Released version 22.0 (shadow improvements)      
22-nov-2008   7    
  Grr, since updating my DirectX SDK, HLSL syntax highlighting is not available:
http://forums.microsoft.com/msdn/ShowPost.aspx?PostID=1324043&SiteID=1
I can't see what I'm doing without syntax highlighting :(
     
#revision 1815 Fixed the bug in the new shadow softening.  The first sample had been getting no position offset, because of the ordering in the loop.      
#revision 1816 <- nice accident that causes trees to cast multi-layered shadows (they're not usable though)      
#revision 1820 The new shadow softening is now much more geometrically accurate.  Takes into account the light-to-occluder distance, light emission radius, and occluder-to-receiver distance.  Looks very concincing.      
#revision 1821 Improved the dynamic shadow frustum by making the far distance adaptive as well as the near distance.  This is good for two reasons:
1. it greatly increases the apparent resolution of the sharp shadows
2. it reduces the amount of redundant casting geometry used.
     
#revision 1822 Further improved the dynamic shadow frustum by adding new rays for the intersection tests:
- left side
- right side
- top-left
- top-right
- top centre
It's still one ray-test per frame, so there's no increase in cost.
     
  Scenic modifier: 'Draw to Rain Occlusion' now defaults FALSE.
MeshFrame.h: Mesh frames are now excluded fram rain occlusion render by default.
     
  Scenic modifier: added an 'Enable Collision' property.  Currently defaults TRUE.      
  The placeholder skydome no longer has collision enabled.  It had been reducing the effectiveness of the dynamic shadow frustum.      
17-nov-2008   1,5    
  There is something screwy with the first two iterations of the PS loop in ProjectorShadow.fx.
See temp test "if( i > 1)"
Try reordering or unrolling.<-FIXED(22nd)
     
16-nov-2008   8,45    
  Had an idea for speeding-up the FFSM shadows: when each face samples the position buffer behind the lighting geometry, it could write a value to a Z buffer if the pixel landed within its frustum face.  This Z value would then block-out the passes for subsequent faces so they wouldn't need to run the pixel shader for pixels that don't concern them.
I tried it, and I'm a bit confused by the results....
     
  …Z test and stencil test happen AFTER the pixel shader (http://www.gamedev.net/columns/hardcore/dxshader3/pipelinegr.gif).  So presumably the idea was flawed from the start.
However, I found that if I cleared my Z buffer to 0 (so all lighting would be occluded), I got the kind of speedup I was originally expecting - but only if the vertex shader outputs the depth value rather than the pixel shader doing it.  I've got no idea what kind of crazy magic is going on there.
     
  …Then I tried clearing the Z buffer to 1 and letting the lighting plant its proper depth values in the Z buffer so each face pass should partly occlude subsequent face passes (the way it should work).  This didn't give any speedup.      
  …'clip' does work as an optimisation.
Hang on, the whole reason for trying this Z-buffer optimisation was that my early (very rough) test showed 'clip' NOT working as an optimisation.  I just wasted half a day!  It's a good thing no-one reads this devlog.
The final check-in for this experiment is revision 1808.
Removed in revision 1809.
     
  Aha!  Finally worked out why my keyboard keeps randomly switching to AZERTY: it's whenever I accidentally press left-alt + shift (the shorcut to change input language).  Now fixed.      
#revision 1808 Had to change the reflection RT back to half-by-half.  It's used for fallback shadows, for which quarter height is too blocky :(
TODO: compare performance both ways
     
  TODO: clear the rain splash RTs!!!!!!!      
  The game project is taking forever to "embed the manifest" today.  No idea what's going on there.  I'm in Master config.      
  TODO: When the headtracker connection is lost, and the player chooses to cancel (continue without headtracking), the headtracking transform needs to reset.      
#revision 1810
#revision 1811
Fixed a bug that had been causing nasty random overdraw for ProjectorShadow.fx.
CProjector::GenerateShadows had been drawing the light's geometry using
LIGHTMANAGER_PRIMS_PER_LIGHTING_STRIP
rather than
this->pLight->numPrims
I've now changed that define to a private static member of CLight (s_numPrimsPerLightingStrip_withTail).
     
  This evening I've been improving my shadow softening, as you'll see in the next release…..      
15-nov-2008   4,8    
  Max X exporter: Although 'use full pathnames' doesn't have any effect on texture names in effect instance blocks, it does affect the FX filename.
Had to un-tick it to go back to exporting just FX leafnames.
The game is now loading again.
     
#revision 1792 Profiles: The horizontal res now defaults to being halved (frameRT:[/2,/1]) in checkerboard and iZ3D stereo modes.  This isn't ideal, but keeps the performance more consistent with the other modes.      
  Had to set my PC clock forward an hour, because it had jumped backwards a few days ago.  I expect it's using French DST or something?      
  Rain splash source & dest RTs no longer share with       
  Mist RT now defaults to full screen res.  This removes quite noticeable blocky edges on lampposts etc.      
  Reflection RTs now default to half screen res and quarter screen height (previously half by half).<-had to change back (16th, #1)      
  Changing shadow RTs from 1/2 & 1/4 to 1/1 & 1/2, with two projectors, debug:
45.75 fps becomes 44 fps
Not a very scientific measurement, but it gives me some idea of the damage.
     
  SVN: deleted graphics files from their old locations.      
  SVN: added graphics files in their new locations.      
11-nov-2008   3    
  Did away with UtilFindMediaFile, which I'd been meaning to do for a long time.
The auto-generated inventory (MaterialTexturePathnames.hpp) is now being used instead.
     
  Set up the new structure of the installer.  This is almost working now.      
10-nov-2008   3    
  To output a directory listing to a file (which I was trying to do a while ago for the code conversion tool) :
in C:
system("dir C:\\noctambule\\source\\HLSL\\*.fx /b >> C:\\noctambule\\tools\\ShaderBuild\\fileList.txt");
in DOS:
dir C:\noctambule\source\HLSL\*.fx /b >> C:\noctambule\tools\ShaderBuild\fileList.txt
     
  Added a new tool called Inventory, whose job is to parse the VDPROJ (setup project) file and spit out various handy data for me:
1. an ordered table of the CRCs and full filenames of all the textures in the install (MaterialTexturePathnames.hpp).  This is needed because the X file exporter for Max only outputs texture
leaf names for the material instances >:(  It's a handy table to have anyway, because at load time I can now assert that each texture being used has been added to the install.  Is there even the possibility of putting custom properties on the textures in the setup project now???
     
  ...2. (TODO): 'mega source file', a concatenation of all my source files.  That can then be pasted into Dev Studio (so it gets syntax-highlighted), and from there into Word, then exported as nicely-formatted HTML.  A separate tool (or maybe the same one) will then chop that up into an HTML file for each source/header file; those HTML files will go on the website.  I'll probably auto-generate a nice index page for the source code too (each filename as a link, with its description next to it).      
9-nov-2008   5,33333    
  Lamppost: Must be exported with 'optimization' set to NONE, otherwise the skinning gets messed up.
Non-animating meshes should be exported with it set to OPTIMIZED (otherwise the exporter seems to hang on 'animation sets').
     
#revision 1784 Removed the Graphics\Final folder      
  X file exporter: Ticked 'Use full pathname' on the 'Textures & .fx files' tab.
…but it's still just writing out leaf names for the textures in the EffectInstance blocks >:(
     
  Wondered if there might be an annotation that would persuade the exporter to export full texture paths.
Nothing mentioned here:
http://developer.nvidia.com/object/using_sas.html
     
  Updated Panda X exporter to 4.6.62.0
Same problem with the texture filenames though.  Hmm…..
     
  Made lots of improvements to the game's file/folder hierarchy.  Files that used to be loose in Graphics\Final are now properly categorised into Graphics\Effects\... and so on.      
8-nov-2008   10,5    
  I've been trying all sorts of ways to position these Xref'd buildings (and their child objects) into the town scene in such a way that they're well-behaved and easy to maintain.  I seem to have got something that works now for BC:
- made a mesh proxy object for the building itself, called "BedfordCourtProxy"
- in leam.max, the bool'd building object "BedfordCourt" is Xref'd in but uses its proxy to avoid crazy transform weirdness resulting from the bools (reset transform doesn't work on bools)
- then I used the 'Xref Objects' window to add the raw sub-object bools "crukFramesNORTH" & "crukFramesEAST".  Max spots that they're children of "BedfordCourt" in the external scene, and offers to make the Xrefs children of the building Xref.  I accept and it works - no transform problems for the child objects, so they don't need proxies.
     
  Remembered that the 'draw to reflections' scenic flag, when set false, also causes the child objects to be skipped in the reflection draw.  This is good.  Same goes for 'draw to rain occlusion' and 'draw to shadows'.      
#revision 1766
#revision 1767
The following files now live in Graphics rather than Graphics/Final (which I'm trying to get rid of):
leam.x
leam.nwf
scene.x
TODO: probably best to move them into Graphics\Scenery instead.<-DONE(9th)
     
  TODO: Change CCullPlaneManager to use the new view frustum.      
#revision 1768 Had a problem with the window-frame sub-objects of the BC Xref - when their 'name' entries were parsed in CLandscape::ReadProperty, the frame returned by FindFrame was a stub frame rather than the one I wanted.  That's why these sub-objects' cull-planes were null.
I've now improved the hierarchy pruning so that nodes with no mesh and no child, that aren't CMeshFiles, are pruned out.  That fixed the problem, and has stripped out 156 stub nodes, kewl!
     
  Bedford Court is progressing nicely (by my standards at least; a real modeller would say I'm taking forever with it).
I might release a build tomorrow night.
The increased building detail is really showing-up imprecisions in the shadows.  Nothing worrying - no intrinsic problems; I just need to consider rendering them at a higher res and using better (more expensive) softening :/
     
5-nov-2008   2,75    
  TOFIX: cpBedfordWest (west side of Bedford Street) is culling the north sub-objects of Bedford Court.
What's supposed to prevent that again?
   
30-oct-2008   3,5    
  Continued modelling Bedford Court.  I'm getting a good grasp of the workflow now, and the building is starting to come to life.
It now has two floors; all the windows and arches are cut into the shop and the upstairs bit (so you can see in), and the basic blue window frames are in.
   
  This evening, instanced modifiers and Linked Xform modifiers are my favourite things.    
27-oct-2008   3,5    
  MAX: Perspective view: ctrl+alt + middle-drag forward & backwards, for sensible camera movements!!    
  MAX: Boolean modifier-stack-entries can't be dragged up or down like other modifiers.
This means that once an object is referenced, bools added to the top of its modifier stack don't appear on top of the references.
In other words, each time you add a bool on top of something, it becomes a different object, and any references to it only reference one of the bool operands.
So bool objects can't safely be referenced into other bool objects.
   
  MAX: Holy moley, modifiers can be copied and "pasted instanced" (creates a two-way link between the two instances of the modifier).  Instanced modifiers show in italics.    
  MAX: Hmm, the problem I'm finding now is simply that there's no Boolean modifier type.  Everything would be perfect if Max had Boolean modifiers instead of Boolean objects.    
  Max: Remembered about the fancy primitives such as:
- windows
- walls
- stairs
- fences
- trees, some really nice ones
   
26-oct-2008   13,5    
#version 21.3
#revision ~1704
Released version 21.3 (occlusion culling fix; more lampposts)    
  MAX: Lights and CullPlanes are going to be kept in leam.x, not in the buildings' sub-scenes.
So there's no changes needed in the deployment scripts.
   
  MAX: All Xref'd nodes lose their modifiers, and in the case of lights and cull planes, they sort of lose their type as well.
That's why lights and cullplanes can't be set up in the Xref'd building sub-scenes.  Doesn't bother me though.
     
#revision ~1703 Separated Bedford Court off into its own Max file (graphics\objects\buildings\BedfordCourt.max)
Xref'd it into leam.x, and it worked!  So now I'm finally at the stage where it's safe to start modelling buildings!
     
#1 SVN, trying to commit the project folder since moving to new PC:
"Commande: Livrer 
Erreur: Échec de la propagation (commit), détails :  
Erreur: Impossible d'ouvrir une session ra_local pour l'URL 
Erreur: Le dépôt 'file:///C:' n'a pu être ouvert 
Erreur: Impossible d'ouvrir le fichier '\C:\format': Syntaxe du nom de fichier, de  
Erreur: répertoire ou de volume incorrecte."
This seems to only happen when there's modifications in more than one sub-folder.
<-FIXED (#2)
     
  Visual Studio: find-&-replace bug:
find: "_cullPlane."
replace with "pCullPlane->"
match case, match whole word

replaces "_cullPlane " (space instead of dot) with "pCullPlane->"
     
#2 SVN: Managed to fix my tangled working copy (project folder), so that I can now commit from the top level.
It had become tangled because I had copied it in its entirety (including the SVN gubbins) from the old PC.
Wouldn't let me commit from the top level (see #1).
Fixed it by doing this:
- check everything in
- delete all SVN files from normal working copy
- make a new clean checkout in a separate location
- copy all files from clean checkout into the normal working copy
     
#revision 1721, 1722 Started going down the route of calculating cull-plane exclusions at load time rather than deployment time (thought I needed to, for Xrefs).  Turned out I had just broken a hierarchy link so the north cull-plane of BC wasn't a child any more.
Now fixed.  In case the load-time code is ever needed, it's in stuff.cpp.
     
  MAX: To stop the flickering grey soot over all the objects:
untick Object properties \ Vertex channel display (vertex colour)
NOTE: need to turn this on when not using a DX shader material though.
     
#revision ~1739 It took quite a lot of hours, but I've now successfully booled-out a bunch of windows at Bedford Court, and used references of the same shapes to build the window frames, and the decorative brick surrounds on the texture patchwork.  The frames and surrounds are working neatly in Max; yet to export them to the game.
Extrude and Shell modifiers are my new best friends.
If the shapes need shifting or scaling, the best way will be to use Xform modifiers directly above each one.  This'll update the bools, the frames and the surrounds, on multiple walls, as if by magic.
I didn't know if this 'tower of bools and modifiers' approach to modelling the buildings was going to work or not (or if Max would be sturdy enough to let me do it), but it is really working well.  And I find modelling very relaxing.
     
  I'm mid-way through phasing-out the 'Graphics\Final' folder (to use 'Graphics' instead).  Decided not to use 'obj' and 'tex' folders for each sub-scene; meshes and textures now live together, along with their PSDs.
- Moved Leam.x to Graphics
- Moved Lamppost and BC sub-scenes to Graphics\Scenery..
- Most textures are still in Final
     
25-oct-2008   8,91667    
  BT building (north cull plane):
- broken in 21.2
- also tested 17.6 and it's broken there too
So it's always been broken.<-FIXED (#1)
   
#2 Visual Studio: added the executable path:
$(DXSDK_DIR)Utilities\bin\x86
so that 'fxc' (shader compiler) is found
   
#1
#revision 1689
Found the cause of my disappearing BT building.
In CLandscape::ReadProperty, when reading each property such as cullPlaneExclusions, I hadn't been asserting that the 'current scenic frame' pointer was non-null.  It always was null, because CLandscape::FindFrames was getting called later than CWorldParser::Parse.
Also remembered that CWorldParser::Parse is called twice, to perform two different passes of the world loading.
TODO: change this into a single pass - less dangerous and confusing.
     
#revision 1690 Re-added a cull plane on the south side of Regent Street.  Had deleted it at some point in the past because of the problem fixed in #1.
Checked that the cull plane works (hides the buildings on Augusta Place).
     
  Re #2: also copied fxc into C:\windows because it was the simplest way of getting ShaderBuild.exe to work without hardcoding a path.      
#3 Building all shaders on the new machine/DXSDK, I've started getting this error:
"error X3025: global variables are implicitly constant, enable compatibility mode to allow modification"
But strangely the shaders still seem to be working exactly as they should (I suppose because compatibility mode must've been enabled by default in previous versions of fxc?)
     
#revision 1691 Fixed #3 in h_Projector.fx-<-SEE #4      
#revision 1693 Fixed #3 in h_GroundPOM.fx      
#revision 1694 Fixed this in Ground.fx:
"c:\Noctambule\Source\HLSL\Ground.fx(581,4): error X3017: 'PSReadGroundTopology': cannot convert from 'float' to 'const float'"
   
  pt2 = float2( fCurrentBound + fStepSize, fPrevHeight );

fCurrHeight = tex2Dgrad( normalsHeightSamplerIn, vTexCurrentOffset, dx, dy ).POM_HEIGHT_CHANNEL;

"h_GroundPOM.fx(156,17): warning X4121: gradient-based operations must be moved out of flow control to prevent divergence. Performance may improve by using a non-gradient operation"

I've got no idea why the DX sample ParallaxOcclusionMapping.fx doesn't give this warning - it's the same code (tex2Dgrad inside a 'while').  What am I missing?
Would be interesting to do a diff between the latest version of that sample file and the version I ported from (except, I ported from the ATI sample not the DX one).
   
  Wowza - there are actually NO Google results for "warning X4121" (except maybe this one ;)    
  Had a look at the DX10 samples.    
#revision 1696 HDRLighting.fx, HDR.cpp: Appended "_Technique" to the technique names to prevent name conflicts with the PS functions:

"c:\Noctambule\Source\HLSL\HDRLighting.fx(807,11): error X3003: redefinition of 'Bloom'"
   
#revision 1697 increased water refraction on the ground (0.03 -> 0.1)    
  Removed the 'Website' folder from the source project (it contained the old website).    
  Tried copying all the FXOs from v21.2 into my working copy's Source/Master folder.
This appears to reproduce Carl Kenner's bug, or something similar!!
Because I've renamed the techniques in HDRLighting.fx, HDR.cpp will be silently failing to set any techniques.  The question is - why would this be happening on someone's machine in v21.2 (where the technique names are correct) ???
I can almost imagine it's something to do with DirectX versions.  Maybe some versions can make use of techniques with bad names and some can't.
   
#4
#revision 1699
Caused myself a silly shadow bug in revision 1691, by removing a #include that I thought wasn't needed.  Although none of the header's FUNCTIONS were being used, one of its DEFINES was.  And of course, FXC didn't give me any warning that the define was missing, even though I used #if rather than #ifdef.  Apparently C/C++ compilers don't give any warning in this situation either - seems wrong to me! >:(

The lesson is: when tidying code, be hellish wary of removing #includes.  Fixed in revision 1699
     
  I've removed all the anaglyph ghost reduction variant shaders.  If I ever re-add the ghost reduction, I'll use uniform variables instead.      
  The plan for tomorrow is to get started on the SCENERY PATCHWORKS, ie. the system that allows the building textures to be assembled in Max as sorta collages - and if need be, rendered by the game viewpoint-dependently for infinite resolution, phwoar.  That's what I'm already doing with the ground textures, and by jingo does it make things easy (and allows me to use parallax occlusion mapping everywhere).
There's a million other things I should be doing instead, so why this?  Because the placeholder scenery textures are grinding-down my morale.  They make the game look stupid. Tomorrow, finally, I'll start doing something about it.
     
  GRR, Windows just restarted my machine (to "configure updates") while I was in the middle of typing.
Totally out of line, that.  I'LL decide when to turn off my computer, thanks.
     
  TODO: release v21.3 (it's ready to package)      
22-oct-2008   1,666    
  Replaced a load of placeholder lampposts with Xref'd wobbly ones.  They all worked!
Just got a bit of disappearing-building weirdness at the north side of the BT building though.<-FIXED (25th, #1)
   
  Found that instances of references seem to work just fine for the likes of these lampposts (unless that's what's causing the BT building to disappear?)  TODO: investigate<-FIXED (25th, #1)    
21-oct-2008   3,666    
  MAX: Xrefs no longer need to be top-level; they can be placed in the hierarchy like any other object.
Deploy.ms now writes a 'ParentName' entry into each 'FrameMeshName' block (or writes "<noparent>" if the Xref is root-level).
   
  Added a CMeshFrame::FindFrame that takes a CRC rather than a name.    
  Added CMeshFrame::InsertFrame, which is now used by CMeshFrame::AutoInsertFrame      
  Added CMeshFrame::fixupParentCRC      
  TODO: make pruning stricter & simpler.  Chuck out anything with zero radius.      
  Finally got manual insertion of Xrefs working.  Tomorrow I'll give this a workout by placing loads of wobbly lampposts.      
19-oct-2008   6,083    
  TODO: investigate visibility testing of likes of lightMarkerSphere_pointLight06
ie. should that object even be trying to draw?<-probably pruned-away now; see #1 below
   
  CMeshFrame: in the course of some debugging, I added a temp test method 'IsLamppost'.  Found that this could only worked properly when called from within CAnimMesh rather than CMeshFrame.  And I was using the 'override' keyword.  No idea what was going on there.  Rebuild-all didn't help.    
  NOTE: Drawing debug spheres in the shadow depth render is currently a bad idea!  That was really adding to the confusion this morning.

Wrap any debug draw in:
if( CModeEnvironment::s_pCurrentRenderData->renderCategory == ERENDERCATEGORY_MAIN )
     
#revision 1683
#revision 1684
CCullPlaneUser now uses a CBoundingBox member ('bounds') instead of minPos, maxPos & centre.      
#revision 1685 Fixed the handling of dynamic bounds for reactive scenics.  This fixes the disappearing shadows on the new lamppost I added the other day.      
#1 Landscape hierarchy pruning is now done after auto-insertion of Xrefs (object instances such as lampposts and cars).    
  Right then - recursive Xrefs with manual placement in the hierarchy - that's what I need now.
- I'll change Deploy.ms to generate a '<worldname>_scene.x' file (like the current scene.x), for the max file that it's run on.
- FrameMeshName entries in these '_scene.x' files will now specify which '_scene.x' file to include as an instance.
- For the manual placement in the heirarchy, FrameMeshName entries will simply include the name of the scenic that is their immediate parent (need to throw up an error if the parent isn't a scenic).
   
  MAXSCRIPT:
getFilenamePath file   -- returns: "g:\subdir1\subdir2\"

getFilenameFile file   -- returns: "myImage"
   
  TODO: finish altering Deploy.ms.  Update the template at the top of LoadSceneFromX.cpp, so that it reads in the parent name.    
15-oct-2008   0    
  Downloaded and installed the Vuzix (VR920) SDK from here:
http://www.vuzix.com/support/downloads_drivers.html
   
  Put the VR920 SDK into SVN.
Im pleased that it's every bit as user-friendly as the eMagin SDK.  The samples build & run straight out of the box.  This should be an easy headset to support :)
   
  TODO: See comments about synchronisation in the MatricesQueryGPU sample.
Could this be useful for the Z800??
     
12-oct-2008   7    
  I don't know why this devlog is such a big file now (over half a meg).  I'm going to have to start a new one (again).    
  MAX: SVN-'restored' the file stdplugs/cmbtex.dlt which was missing.
No idea what it is or what it does, but I (presumably) had it on the old machine so let's have it on this one too.
   
  SVN: Gave the project folder a cleanup after committing all the sub-folders individually.  So far it seems to be behaving again (can commit the top-level project folder again).
<- nah, still broken
   
#revision 1669  WOWvx: 'Set offset' now works (previously there was a paste-o bug causing this to be controlled by 'set factor').    
#revision 1670
#revision 1671
#revision 1673
I've hidden (and might decide to remove) the option to specify a field of view directly (auto-fov is now forced on).
Auto-fov got broken by the recent frustum changes.  There are too many if's and but's to do with the way an arbitrary FOV setting would relate to stereo and headtracking.  And I've never wanted to turn auto-fov off anyway, except for WOWvx.
My advice to players who want a bigger FOV is "buy a bigger monitor" or "sit closer to the screen" ;P
The WOWvx default-override profile now produces a sensible FOV by setting a fake viewing distance of 70 whereas the real distance would be about 300.  This will break if OptiTrack headtracking is used with it (the headtracking will measure the real viewing distance and update the view accordingly).
Previous vertical half-fov used in the WOWvx profile was 33°.
     
#revision 1672 Measured the virtual screen of my Z800, using a tape measure.  This is with each eyepiece shifted two notches out from its innermost position:
- screen width: 81 cm
- viewing distance: 144 cm
These settings are working well and are now in the Z800 default-override profile.
   
#revision 1674 Removed the following example profile from the install; it was duplicating the WOWvx default-override profile:
Example_3DDisplay_Philips_WOWvx_42inch.txt
   
#revision 1675 The following example profile no longer specifies a frameRT value (because frameRT is now automatically set to an optimal value in over-under-gap mode):
Example_Stereoscopy_Another_EYE_2000_syncDoubled.txt
   
#revision 1676 Controls: Reduced the default mouse turn & pitch speed from 0.1 to 0.055.
Various people had said the old defaults were too fast.  Thinking about it, the reason the high sensitivity felt right to me would be that I disable Windows' 'enhance pointer precision' thing (so I'm used to making smaller movements).
   
  Interpupillary distance now defaults to 6.4 cm, which is apparently just right for a typical European woman (ie. errs on the side of a weaker effect rather than discomfort).  I've also seen this number used elsewhere as a typical IPD.
See info:
http://en.wikipedia.org/wiki/Inter-pupillary_distance

See also comment #1 from yesterday.
   
#revision 1678 Found that shadows had become blocky when using 3DVisor.  Investigated and found it was because Cfrustum::SetupViewFrustumWithOffsetViewpoint actually wanted to take in a width and height for the near-clip end of the frustum, not the screen width & height,
Now fixed.  I had hoped that this also would fix the cutting-out of shadows at the edge of the screen when using window headtracking, but it didn't.
     
  As a result of the fix above, shadows and objects can sometimes be seen cutting-out at the edges of the screen in stereo modes or when using window headtracking.  It's a bit distracting, so I expect I'll fix it fairly soon.
Checked that this bug was present on v21.1 - reproduced it by setting the screen width small........does that make sense??
     
#version 21.2
#revision 1680
Released version 21.2 (corrected HMD stereo for full depth range)    
  MAX: Hah! Remembered what stdplugs/cmbtex.dlt is - it's The File That Stops Max Loading (on this PC).
Deleted it again.
     
11-oct-2008   3    
#1 (below) Carl Kenner rightly pointed out that my HMD stereo was still wrong in v21.0 / v21.1:
I had been using the assumption that an HMD places a display directly in front of each eye.  If this were true, it would mean that 2D images on an HMD would appear infinitely distant, which they don't.  On my Z800 I get the impression that the 'screen' is say 120cm away.
I think it would be bad, uncomfortable HMD design if 2D images appeared infinitely distant, because it would force the viewer to the limit of their eyes' range of motion.  I get the impression that when eyes are totally relaxed, they're not parallel; this explains the faulty 'measurement' I got for interpupillary distance a while back (a stare-up-close-to-the-screen test gave ~5.35cm instead of ~6.4cm).  Still, it is useful to get that 'relaxed' measurement for reference.....
     
  http://www.mtbs3d.com/phpBB/viewtopic.php?p=15957#15957      
  I fixed the HMD stereo fault described above and it made a big difference, which is great.  There's a full range of depth now.      
  I also re-tested 6DOF TrackIR headtracking in combination with 3DVisor stereo.
It's like the beginnings of a holodeck - I can creep round in a very small area of the bedroom, peeking around the edges of virtual objects, ducking behind virtual walls, pacing around on a piece of virtual pavement - it's all life-sized and properly placed in my field of view.
The weak links are the FOV and angular range of the TrackIR / TrackClip PRO.  All I'd need is positional tracking around the whole room (angular can come from the Z800), and I'd have a sort of holodeck - it would be awesome!
So the question is: what's the easiest way to track the 3D position of an object that's moving and rotating freely within the bounds of a room?
     
  I'll release v21.2 tomorrow.      
  Found a French (only) dictionary:
http://www.cnrtl.fr/definition/mot
     
14-sept-2008      
  Visual Studio 2003 isn't compatible with Windows Vista:

"… The changes impact Visual Studio and thus we're unable to support Visual Studio .NET 2002 or
Visual Studio .NET 2003 on Windows Vista."

http://msdn.microsoft.com/en-us/vstudio/aa948853.aspx?lcid=1033
   
  OdbcPermission:

http://forums.asp.net/p/1312636/2588351.aspx
     
10-sept-2008   0    
  Knackered the Windows XP on what was my master PC.  Spent the past few days setting-up camp on the new PC instead (all done now, apart from VS2003 which I might not bother with - was only used for maintaining the older web pages).
Before that, I was tied-up with some time-critical stuff at work.
   
  Big thanks to Brian from Oz for helping to debug a TrackIR compatibility problem.  Details are now in the release notes.
The release log also links to the required versions of the NaturalPoint installs, hosted on my site, so hopefully the game will be future-proof now as far as headtracking's concerned (the required eMagin dll is already included in the install).
     
#version 21.1 Released version 21.1 (couple of crash fixes)    
  v21.1 was supposed to fix the sound initialisation on my Vista 64 machine at work, but strangely it didn't.
The bug I found was that UtilGetTempWideString was being used in two places at once - I'm amazed sound loading ever worked.
     
31-août-2008   9    
  Removed TestPointVisibility because it was OOD.    
  Spent the day weeding-out bugs to do with shadows and culling using the new view frustum.
It's still not perfect - the window-style headtracking can cause gaps in the shadows at the edge of the screen.
But I can't afford to spend any more time fixing it.
     
  NOTE: the 'head-mounted display' option assumes that each eye has its own screen in front of it (binocular display).  TODO?: separate option to indicate that?    
  V21 BODGE: Since auto-fov is currently forced on unless an HMD is used, I've improved the FOV in the WOWvx default overrive profile by removing its value for realWorld/distanceToScreen      
  Inspected stereo correctness of falling rain.  It looks wrong sometimes in cross-eyed mode, but I think that's just because the interpupillary distance is doubled.  In anaglyph mode it looks right.
It seems to move with the viewpoint though (not usually noticeable becuase it's falling so fast).
     
#revision 1619 CNoctambuleApp::SetCameraEye: Added null checks to prevent master-only first-frame crash on v21.0.  todo: investigate      
  Headtrack calibration mode is now enabled in master builds.  Doesn't draw in stereo [yet], but other than that it works.      
#version 21.0
#revision 1620
Released version 21.0 (corrected stereo, overhauled TrackIR)      
29-août-2008   4    
#revision 1605 Started to realise that making the FFSM shadows work with my new view frustum was going to be more complicated than I'd thought.  I was getting close to something that looked right, but there were definitely gaps and guesswork in the maths, which it could have taken forever to clear up.
So I've decided to change CFrustum so that it's always a regular frustum.  In the case of the new shadowing frustum, it'll be the regular frustum that *contains* the irregular view frustum.
In this way, the FFSM code stays practically the same as it was before - still using a view direction and two half-fov angles, rather than a set of completely unmatching faces.
   
  Revision 1605 is the point I got to before turning back.      
#revision 1606 Reverted:
Projector.cpp to revision 1569
Projector.h to revision 1497
   
#revision 1607 Changed Projector.cpp to use g_viewInfo.cameraSpaceViewFrustum (TODO RENAME), instead of all the g_viewInfo.mainView* stuff.    
  Picked up a couple more 99p domain names from 123-reg.co.uk:
s-3d.info
stereo3d.info

s-3d.org was tempting, but nah, I don't need it.<-couldn't resist
   
28-août-2008   5,16667    
  Got the shadows 90% working with an offset viewpoint.  Just a little join-up problem remaining - probably to do with the projection matrix (SetupResBiasForFrustumPlanes).    
  It's worth all the hassle to cater for this unusual view frustum though - I still can't get over how comfortable and weighty the stereo is now (v21).      
27-août-2008   1,43333    
#revision 1597 Website: Added the WOWvx-related source code back onto the FAQ.    
#revision 1598 Setup: Added the following code files back into the installer:
-WOWvx.h
-WOWvx.cpp
-HLSL\WOWvx.fx
-HLSL\h_WOWvx.fx
-HLSL\Interlace.fx
-HLSL\Chequer.fx
-HLSL\StereoscopyMirror.fx
     
#revision 1599 Setup: Added the 3DVisor source files to the installer.  The eMagin SDK has been totally public for some time now.
Downloaded the SDK again, from the public route this time; couldn't see any differences in the docs to do with confidentiality details.  They're still marked confidential, but they can't be if they're publicly linked-to on the eMagin site.
     
  Earlier on I got a blue-screen crash when changing my windows theme (just trying to switch to better colours like I always do).  Promptly backed-up all my source to a USB stick.
Presumably related to that crash some way, Windows is now making *sounds* whenever things happen (eg. breakpoints) :/  Make it stop!
     
#revision 1600 Fixed the main bug I was seeing the shadows since changing to the new view frustum (far face had gaps all round it).  The bug was in SetupViewFrustumWithOffsetViewpoint.
So everthing's rolling again, phew.  I'm looking forward to version 21.
     
  TODO: get the shadows handling an offset viewpoint<done(31st), then a stereo frustum.      
26-août-2008   0    
  Tied-up with work :(    
25-août-2008   8,18333    
#revision 1583 Website: Had to remove WOWvx-related source code from the FAQ (sorry).    
#revision 1584 Setup: Removed the following code files from the installer:
-WOWvx.h
-WOWvx.cpp
-HLSL\WOWvx.fx
-HLSL\h_WOWvx.fx
-HLSL\Interlace.fx
-HLSL\Chequer.fx
-HLSL\StereoscopyMirror.fx
     
#revision 1587 Added a frustum class CFrustum (Frustum.cpp & h)      
#revision 1587 g_viewInfo.GetCentralViewMatrix now returns the main camera's central view matrix.  Previously it was returning the final view matrix.  I think that was part of the problem with the stereo mist (see CMist::Prep)
TODO: needs to be renamed if it deals with just the main camera.
     
#revision 1587 Added g_viewInfo.cameraSpaceViewFrustum      
  NOTE:
- D3DXPlaneFromPoints creates a normalised plane.
- D3DXPlaneFromPoints creates a plane with its normal pointing out of the side on which the points appear clockwise.
     
  TODO: Test falling rain (uses TestSphereVisibility with vpRelativePositionIn=true)      
  Nice, never seen this one before:
"Edit and Continue : error 1013 : Debugger ran out of memory while applying code changes"
     
  Currently half-way through fixing the shadows to work with the new view frustum (for headtracking & stereo).      
24-août-2008   11,0833    
  Found that window-style headtracking is at its most effective when mouse pitch is switched off.  TODO: put the mouse pitch option on the headtracking menu?
Update: there was also a projection bug that made pitch look wrong in window headtracking mode; now fixed.
   
  Added function MatrixRemoveOrientationAndScale      
#revision 1577 HMD-style headtracking is now 6DOF when using TrackIR.      
#revision 1577 Website: Removed any mention of where I work.      
  Prevented a crash on exit while headtracking is in use.
Added g_game.flags.shuttingDown for this.
     
#revision 1580 Cross-eyed default override profile no longer sets a large interpupillary distance.

Interpupillary distance should no longer be used as a means of customising the stereoscopy - it should be the exact distance between the player's pupils.
     
#revision 1580 NOTE: the rain mist is currently using an infinitely-far stereo depth.  It's going to have to stay that way till I get the chance to change it over to use a sphere mesh.  Now that the projection matrix is non-standard, the method I had for drawing it in stereo before (which was broken anyway) can't be used.
It doesn't look especially wrong being infinitely far away (and looks better than it did), but it would be much nicer if it had proper stereo parallax.
I don't think anyone's going to be too concerned about it except me.  There are more important things to fix.
     
#revision 1580 Removed the stereo convergence setting.  I might add a suitably-named replacement for this later.      
#revision 1581 Interpupillary distance now defaults to 5.5cm instead of 7cm.  I've measured and tested this; it's better.      
#revision 1581 Tested TrackIR headtracking + an HMD; this is now working (6DOF).
Even tried using anaglyph for the stereo - that works properly as well.
     
#revision 1581 The 3DVisor default override profile no longer overrides:
- interpupillaryDistance
- displayWidth
- distanceToScreen
It now sets an explicit fov.

Distance to screen should no longer be used as a means of customising the stereoscopy - it should be the exact distance from the player's point-between-eyes to the monitor (if there is one).
     
#revision 1581 g_game.verticalHalfFov -> g_game.options.general.verticalHalfFOV (non-loaded)      
#revision 1581 CHeadTracker::ResetTransform no longer resets the yaw in Z800 mode.  The function was only called when exiting pause, and I've got no idea why I would want to reset the yaw at that point; seemed sily.      
  TODO (low priority) : make the Z800 profile independent of the headtracking method (always loaded if a Z800 is detected, even when the headtracking method is set to OptiTrack or force-none.      
#revision 1582 Fixed the bug that was stopping the Z800's keep-alive signals being sent.
In CHeadTracker::Update, it was checking the frame number to know when to send the message, but the frame number is incremented twice between each update because of the frame-sequential stereo.
Now fires every ten seconds when running at 60fps.

This does mean I have to remember not to leave the game running in the background for a long period of time.....
NB - the keep-alive message also brings the headset out of standby mode.
     
23-août-2008   4,8    
  CCamera::CalculateProjection now calculates projection pre-calcs before building the projection matrix.
Previously it was pulling some of the pre-calcs out of the projection matrix, which is nifty as long as the projection matrix is standard.  But I can't rely on the projection matrix being standard in any way nowadays.
   
  A double-whammy of Win today.
1. Worked out the correct transformations for the window-style headtracking; got that all working the way it should be.
2. Realised that those same transformations are exactly what's needed for geometrically-correct stereo projection on a fixed monitor - instead of converging the views!

On a fixed monitor:
Stereo convergence = WRONG; it's a lazy approximation of what's actually needed.
Offset projection = RIGHT
   
  The results are wonderful.  I've been using real-world measurements for stuff like screen dimensions, interpupillary distance, etc. right from the start, but until now they've never quite added up right.  Now, they create a stereo scene that looks and feels perfectly life-size.  It's got all the weight and depth as if it's really there.  Can't wait to see this on a 3D monitor.    
  TODO: shadows need to know about the new frustum.  Might be a good opportunity to build a unioned stereo frustum.  That will remove all the projector depth draws from the second eye, at the cost of some shadow res.
TODO: reflect the shadows.
TODO: deal with anything else that uses the g_viewInfo FOV data......
   
  TODO: take head tilt into account in the stereo<-DONE (24th)      
22-août-2008   3,5    
#version 20.6
#revision 1565
Built version 20.6 (same as 20.4 but with no source code)      
#revision 1566 The new OptiTrack tracking produces noticeably cleaner movements than the old version, as well as achieving its results through far less processing.  Mathematicians rock!

So I've chucked out the old functions:
COptiTrack::InterpretObjects (old version)
COptiTrack::FindBestZPositionRecursive
and let's never speak of them again.

COptiTrack::TestZPosition is still used; I pass it the single Z position calculated from the Alter equations, and it gives me back the fore & up vec.
   
#revision 1568 Removed unused option g_game.options.headTracking.smoothing.
Removed its slider from the head-tracking menu.
Added 'Head-mounted display' check to the OptiTrack menu (this toggles between HMD/window head-tracking styles)
Reduced default value for OptiTrack/smoothingRange (0.1 -> 0.05)
   
  Found the source of the faulty pitching tilt in the window-style headtracking.  Will concentrate on improving window style tomorrow (see #error here).

It's going to be really amazing playing this game with TrackIR and a 3D screen together.  Even ghosty old anaglyph becomes thoroughly convincing when combined with the window-style headtracking.
   
21-août-2008   3,83333    
#revision 1563 OptiTrack (TrackIR) optical head-tracking:
Successfully replaced my binary-search-based point interpretation with a version that uses 'weak-perspective projection'  as described in the paper "3D Pose from 3 Corresponding Points under Weak-Perspective Projection" by T.D. Alter:
C:\noctambule\articles\headtracking\AIM-1378.pdf

I ported the code from crim3's script that uses this same method - big thanks to him for posting that on MTBS3D.com:
http://www.mtbs3d.com/phpBB/viewtopic.php?t=1643
(C:\Installs\Crim3HeadTracking\wii_alterpose_trackir\wii_alterpose_trackir.PIE.txt)

This is also the method used by Free-Track.   I tried getting the Free-Track source code using TortoiseSVN but didn't manage......
     
20-août-2008   3    
  (below) Inspired by this thread, I decided it was time to finish-off my TrackIR headtracking support.      
  http://www.mtbs3d.com/phpBB/viewtopic.php?t=1512      
  Found that the TrackIR headtracking is completely broken nowadays - oops...      
#revision 1559 Headtrack calibration meshes are drawing again.  Had to pass MESHRENDERFLAG_DONTSETOBJECTMATRIX.
Should that be a default flag??
     
  TODO: draw menus at screen depth in cross-eyed stereo mode.      
  Got the TrackIR headtracking back into the state it should have been in.      
#version 20.4
#revision 1560
Built version 20.4 (English, fixed TrackIR)      
#version 20.5
#revision 1561
Released version 20.5 (fixed TrackIR)      
  Website: bought another 100MB of space      
19-août-2008   4,5    
  Installed 64-bit nvidia drivers on the slave.      
  Tested v20.1 on Vista 64.  Can't get it to misbehave in any way :/
On my machine at work, it fails to find shoot.wav, and can crash when it loses focus (while loading, I think).
   
  TODO: I'm going to have to debug the game on my work machine to find out what's causing the problems there.    
  I'm also finding on Vista 64 on the slave that the two monitors don't need to be set to the same refresh rate (in nvidia control panel) for the multihead modes to work.      
#1 Vista 64: Lampposts and drainpipes are showing uninitialised vertex colours.      
#revision 1550 Added dual-monitor stereo mirror options, and StereoscopyMirror.fx.
Mirrored stereo is a surprisingly good (and economical) viewing method!
     
#revision 1551 Added cross-eyed stereoscopic mode (ESTEREOSCOPYMODE_CROSS_EYED)
Added defaultOverrides\\defaultOverrides_ESTEREOSCOPYMODE_CROSS_EYED.txt
     
#revision 1552 Now exporting leam.x as a compressed binary X file.  1.7 megs instead of 9.6.
And it actually works!  For some reason I was expecting it all to go wrong, but it works.
Speeds up loading and dual-monitor mode changes nicely.
     
#revision 1552 Re #1: Added VertexPaint modifiers to the objects I'd seen coming out black on Vista 64.      
#revision 1553 Wrapped the chugmaster stuff in #ifdef _DEBUG      
#version 20.2
#revision 1554
Released version 20.2 (mirrored stereo, etc.)      
  Grrr, the compressed binary leam.x makes the install bigger than it was with the text version!!      
#revision 1557 Re-constructed the English installer.      
#version 20.2 en
#revision 1555
Built version 20.2 en.      
#version 20.3 Built version 20.3 (English)      
18-août-2008      
  Installed Vista 64 on the slave again.      
17-août-2008   8,666    
#revision 1542 Realised I do want an eye-swapped iZ3D mode.  Doesn't swap the front & back, just the left & right images from which the front & back are formed.
This is useful if the player is using flipped glasses, or if I somehow get the eyes the wrong way round on the first attempt (certainly should be correct), or if the format flips in the future for some crazy reason.

changed ESTEREOSCOPYMODE_IZ3D
->
ESTEREOSCOPYMODE_IZ3D
ESTEREOSCOPYMODE_IZ3D_SWAPPED
     
#revision 1542 Added shader effect iZ3D.fx (form iZ3D front and back images from a left and right image)
This is an asm->HLSL port of the pixel shader from the reference code (HLSL so I can see what's going on and connect it up more easily).

iZ3D.fx is confidential and therefore excluded from the released source code (sorry!)
   
  Double-checked that iZ3D.fxo doesn't reveal any comment strings      
#revision 1543 Added render targets:
ERENDERTARGET_IZ3D_LEFT
ERENDERTARGET_IZ3D_RIGHT

(A8R8G8B8, same dimensions as frameRT.  For the pair, about 10.5 MB at 2*1280*1024, or 6.3 MB at 2*1024*768)
     
#revision 1543 Kewl, iZ3D mode is working.  I don't have an iZ3D monitor to test it on, but it certainly looks right.      
#revision 1544 Added profile defaultOverrides_ESTEREOSCOPYMODE_IZ3D.txt
1680 * 1050
16:10
22" diagonal screen size
     
#revision 1544 COptions::ApplyStereoscopy: For the benefit of per-value override profiles, had to change it so that the likes of g_game.options.stereoscopy.iZ3D get set even when the mode is 'denatured' (ie. inactive until the device is suitable).      
#revision 1545 Moved the iZ3D modes further into the list (just before checkerboard), in accordance with the rule about menu readability (in fullscreen mode).
Depending on feedback, I might want to force the menus to screen-depth for iZ3D, in which case I will move the iZ3D mode back to before anaglyph.

<-d'oh!  Just remembered that iZ3D mode, even in fullscreen, doesn't apply automatically.  The menu is therefore 100% easy-to-read when you're cycling through those modes.  Now moved it to before anaglyph.
     
#revision 1546 Added column-sequential stereo mode (now ready to use).
Borrowed Interlace.fx for this.
     
  Stereoscopy: Confirmed that canFreezePauseBackground and canUseEyeStyleMotionBlur must both be set false for dual-monitor and iZ3D stereo modes.      
  Stereoscopy: Moved the drawing of the Z-buffer mask into CNoctambuleApp::DrawStereoscopyZBufferMask      

#revision 1547
#revision 1548
Started trying to improve the checkerboard mode to make it more efficient.  This would involve drawing the Z-buffer mask as early as possible.
Quickly gave up for several reasons:
- realised this wouldn't be compatible with motion blur;
- didn't seem to be getting any speed increase (??) when I moved the mask draw right back before the scenery draws - even though the mask was clearly doing its job there;
- shadows and motion blur were very broken.  Time is too short to spend it fixing unnecessary problems like that.
Revision 1547 is the point I got to before giving up.
Revision 1548 puts it back to the old way.  The code is slightly neater now, which is nice.
     
#version 20.1
#revision ~1549
Released version 20.1 (iZ3D and column-sequential stereo modes)      
#revision 1549 Anaglyph mode now supports yellow filters and magenta filters.    
  TODO: tomorrow I'm going to quickly add 'mirroring' options to the dual-monitor stereo mode, because the mirrored viewing method seems quite popular.  I'll borrow a screen-sized LDR rendertarget and just blat it onto the backbuffer horizontally flipped, job done.  There's no nicer easy way of flipping an entire frame (I would need to manually flip the menus, the rain, headtrack calibration....yeugh).
<-done(19th)
   
16-août-2008   10,25    
#revision 1529 Added function g_game.IsDeviceMultihead
Indicates whether or not the current D3D device was created as a multihead device.

Added function g_game.SetDeviceMultihead
     
#revision 1529 Added functions:
DXUTInternalSetFullScreen
DXUTSetMultihead

g_game.OnToggleFullScreen -> g_game.OnSetFullScreen
   
  TOFIX?: the HDR middle grey value seems sligthly different (in effect, not the number) between dual-monitor stereo mode and mono mode (?)
->probably just due to the large difference in framerate in the pause menus between those two stereo modes.
   
#revision 1530 Added CMenuItem::flags.flagOptionOverrideOnChange (usually true; set false on the fullscreen check as a temp workaround for the crash seen when starting in fullscreen mode on Vista 64, Quadro)    
#revision 1531 WinMain, for first DXUTCreateDevice:

 if( g_game.options.stereoscopy.multihead && g_game.options.display.fullScreen )
  initialNumMonitors = 2;
 else
  initialNumMonitors = 1;
   
#revision 1532 The second monitor is now cleared to black, the minimum required number of times, when not in use (rather than continuing to swap through its last few frames).
See CNotambuleApp::flags.clearSecondaryLDRBackbufferOnce

...of course, duh, I could have just hidden the second monitor's fullscreen window :/
   
#revision 1533 DXUTDeviceSettings::numMonitors -> DXUTDeviceSettings::desiredNumMonitors    
#1 Shadows: TOFIX: the +Z face doesn't seem to be getting the full benefit of the adaptive frustum stuff - it's blocky even when the wall is right up close.
<-see #2
   
#revision 1535 DXUT.h: defined DXUT_MAX_SUPPORTED_ADAPTERS, the maximum number of grouped adapters that the app can cope with.  If there are more adapters than this in the group, we display an error message and close the app (the player will have to disable the excess monitors in order to run the game).
Currently set to 16.
This is now used as the number of elements for DXUTDeviceSettings::pp.
   
#revision 1535 Added g_game.flags.multipleAdaptersOnPhysicalDevice    
#revision 1535 NOTE: D3DCAPS9::NumberOfAdaptersInGroup shows as 1 in span mode.    
#revision 1535 Removed g_game.IsSecondMonitorUsable (made redundant by g_game.IsDeviceMultihead)    
#revision 1535 Added function DXUTInternalPropagatePresentParameters    
#revision 1537 ESTEREOSCOPYMODE_DUAL_MONITOR_1/2 now behave like ESTEREOSCOPYMODE_NONE while the device is not multihead.    
#revision 1538 Added COptions::stereoscopy::canDisplayCrosshair.  This is now set true when ESTEREOSCOPYMODE_DUAL_MONITOR_1/2 are mimicking ESTEREOSCOPYMODE_NONE.    
#revision 1538 Fixed the problem I was getting where the window was using DXUT default sizes on change of device; now uses correct size.    
#revision 1539 Added CPauseMenuTree::OnSetStereoscopyMode, called from COptions::ApplyStereoscopy.
Removed redundant CPauseMenuTree::MenuItemCallback_StereoscopyMode.
   
#revision 1539 Chugmaster debug menu option is now disabled in master builds.    
#revision 1540 With multihead disabled in the video driver app, I was finding that full-screen alt-tabs were again causing a device change.  Solved this as follows:

DXUTRender3DEnvironment:
  // PP(16.8.8): never favour a new device (it's nothing but trouble)
  favourNewDevice = false;
   
#2 Re #1 (shadows looking blocky on PZ face even when facing a close wall) :
Remembered that the collision side of the FFSM adaptive frustum code only controls the near distance of the frustum.  It would be unsafe to use the collision info to control the far distance, unless perhaps we knew that a CullPlane was covering the screen??
TODO?
     
  ...The other thing that might well be worth doing is reducing lights' shadow casting range independently of their light casting range.
TODO!  (see CProjector::UpdateViewFrustumExtents)
     
#version 20.0
#revision 1541
Released version 20.0 (multihead stereo mode)      
15-août-2008   2,86667    
  Bought an extra gig of hosting bandwidth, because I'd exceeded my 3 gigs.
I'm quite baffled by the amount of bandwidth apprently being used by my site.  Are there really as many as 130 people downloading my demo each month?? (130 x 24 MB = 3.12 GB)
     
  Re #1 yesterday:
Re-tested v19.0; tested more carefully this time and found it behaves exactly like the latest code.
test:
- set monitors to 2048*768 horizontal span mode
- set  fullScreenXRes:  2048, fullScreenYRes:  768
- run game and alt-enter into fullscreen mode.  Ensure span mode is working.
- alt-tab back to driver app.  Switch to vertical span mode (1024*1536)
- alt-tab back to fullscreen game.  Mad flickering of black window-type-thing followed by a crash or a hang (stack overflow).
   
  Did the same test on v17.6 (17 was the first build after revision 1287, where I reckoned I'd got this all sorted).
17.6 also does the same the the latest code.  So this case has never worked.
     
  Finally, tried the same test with v16.1 (WOWvx kiosk demo), because I had a feeling it was well-behaved with this stuff.
Same problem as latest code.
Error message this time:
failed hr, DXUT.cpp line 3484
     
  Tested latest code again with 'favourNewDevice' forced false.  Exactly the same behaviour.
Fed up with this now; it's 'fix creep'.  Giving up and moving on.  Span mode doesn't even exist on Vista.
     
#revision 1527 EEK!  Just noticed I'd left a temp test in CMeshFrame::TestVisibility:
All the visibility testing of meshes, in perspective mode, was being skipped in v19 - all meshes drawing all the time.   Oops.  (revision 1476)

Now fixed.
...and I'm amazed that this fix hasn't broken the shadows!  They're still working!

Anyway, the skipped culling would explain the slowdown I noticed when I tested v19 on the Z800 (it was only-just staying in 60).
     
  Spot-checked occlusion culling in multihead stereo mode.  Working (independently) in both eyes.      
#revision 1528 Multihead second window now has a "Please wait - creating new D3D device..." caption.  The player sees this when alt-entering into fullscreen multihead mode.  This message uses the current language at the point where the app is started; doesn't change language on the fly.
TODO: proper in-game "please wait" messages.
     
  Added an 'Apply selected mode' option to the stereoscopy menu.
TODO: this is greyed-out until required.  When it's enabled and it's pressed, it recreates the device in the required format.  In the case of applying a multihead mode, it will also switch the game into fullscreen as required.<-done(16th)
     
14-août-2008   2,8    
  Yesterday's stereo screenshots were taken using default settings apart from:
interpupillaryDistance:  20.33174515
convergence:  0.00000000
mode:  ESTEREOSCOPYMODE_DUAL_MONITOR_2
     
  RESET ATTEMPT #1 ----------------------------------------
***** D3DERR_DEVICELOST
RESET ATTEMPT #2 ----------------------------------------
################# SUCCESS DXUTReset3DEnvironment
   
  TOFIX:
- drag game window to second monitor
- alt-enter into a multihead mode
- "Failed creating the Direct3D device"
   
#revision 1525 PHEW, managed to fix yesterday's alt-tab problems in multihead modes:

Found that the multihead device is put into the LOST state when you alt-tab away from it (makes sense i suppose, since we're stepping out of fullscreen mode).
In revision 1287 I changed DXUT so that if we were trying to render, and the device was lost, a new device would be created.  That was a big help for span mode, but turned out to be a bad idea when the device is multihead.
So I've now wrapped revision 1287's changes in an 'if(favourNewDevice)' - we still favour a new device in these situations except when the current device is multihead.<-see revision 1540, 16th
   
  When favourNewDevice is false (multihead), DXUTRender3DEnvironment doesn't get to calling DXUTChangeDevice during a lost device; it just bails out of the render.  So bForceRecreateIfRequired (revision 1287) can be left true.    
  TOFIX: looks like there's something slightly wrong with the mist movement direction in stereo modes; this can be seen when convergence is zero and interpupillary distance is 20 odd.  The rain angle is also suspect (maybe just looks wrong because it doesn't match the mist movements).  Need to test this thoroughly again.    
  Re-tried the test of switching between horizontal and vertical span mode while the game is full-screen.
I'm sure this used to work nicely since revision 1287.
Now the call to DXUTReset3DEnvironment in DXUTChangeDevice is failing with DXUTERR_RESETTINGDEVICE ("An error occurred when attempting to reset an IDirect3DDevice9 device.").
   
#1 ...checked that the v19 master build definitely does work in that situation, and that the current master build definitely doesn't (behaves same as debug).
So it's something that's changed since v19.  Must be in DXUT, surely, and shouldn't be hard to track down.
   
13-août-2008   5    
  TODO: Since some stereo setups use a mirror to reflect the second monitor over the first one, the dual-monitor mode should provide the option to horizontally flip either the left or right image (or both).      
#revision 1523 Added new stereo mode entries:
ESTEREOSCOPYMODE_DUAL_MONITOR_1
ESTEREOSCOPYMODE_DUAL_MONITOR_2
ESTEREOSCOPYMODE_IZ3D (note: no flipped version)<-see 17th; now have a _SWAPPED version

A quick google showed that "dual monitor" was a far more common term (with "stereoscopic") than 'multihead'.
   
#revision 1523 Cool, I've got the two dual-monitor stereo modes working now.  Exits cleanly.
I never imagined it would be this easy!
   
  reverted->
MOVEME?: DXUTChangeDevice: removed check: if( !IsWindowVisible( DXUTGetHWND() ) )
to force ShowWindow for both windows when alt-entering.
TOFIX: this has the side-effect of bringing the mouse pointer on screen and losing input focus on first alt-enter, until the mouse is clicked.<-(12th)
   
  now removed the UpdateWindow calls->
Re #1: the mouse pointer appearing was caused by the UpdateWindow calls done when the two windows are created (UpdateWindow forces a WM_PAINT).  This also caused RenderScene to get called before the mode stack etc. was set up.
For now, to match the multihead reference code, I've left the UpdateWindow calls in and added a NULL modestack check to RenderScene.<-(12th)
   
#1
#revision 1524
Added function g_game.IsSecondMonitorUsable.
False when windowed.  TODO: improve.

The function is used to skip second eye's render in multihead modes.<-see #2
   
#revision 1524 DXUTBuildValidDeviceSettings: added this line:
pValidDeviceSettings->numMonitors     = pDeviceSettingsIn->numMonitors;
   
#revision 1524 Got DXUTDeviceSettings::numMonitors hooked-up.
DXUTChangeDevice now picks up the changing D3DCREATE_ADAPTERGROUP_DEVICE flag in this test:

[if] pOldDeviceSettings->BehaviorFlags == pNewDeviceSettings->BehaviorFlags

So it forces a new device to be created when alt-entering in multihead modes.  This is necessary (unless maybe I wanted to store a separate fullscreen & windowed device simultaneously and just switch between them???  To get any benefit from that, I think they would each need to keep all their resources loaded at the same time; would probably be disastrous.)
   
#revision 1524 As a result of the above, alt-entering now works in multihead modes.    
#2
#revision 1524
Had to remove the optimisation mentioned in #1 for now, because it was preventing projector transitions from working (not surprising that it would break stuff).  Need a better solution, like a 'desired stereoscopic mode' as well as the actual current one (which, when windowed, would be 'none' standing-in for any multihead modes).    
  Alt-tabbing BACK to game in fullscreen multihead mode:
DXUTChangeDevice gets to DXUTReset3DEnvironment, which reports D3DERR_DEVICELOST
......
see bForceRecreateIfRequired, now forced false as a test.  Alt-tabbing back, without recreating the device, is successful about one in 3 times now; haven't spotted much of a pattern yet....
TODO: get this working.<-sorted(14th)
   
  Got sidetracked taking cross-eye stereoscopic screenshots.  Posted 8 of these on MTBS3D.com.

http://www.mtbs3d.com/gallery/thumbnails.php?album=1
   
12-août-2008   3,5    
  DXUTCreateDevice now has a number-of-monitors parameter.
DXUTGetHWNDDeviceFullScreen has a monitor index parameter that defaults to 0.
     
#revision 1515 Game is now creating two windows; the second one is a child of the first, as in the reference code.  That means it gets cleaned away automatically.  Can't see the second window yet.    
#1
#revision 1516
MOVEME?: DXUTChangeDevice: removed check: if( !IsWindowVisible( DXUTGetHWND() ) )
to force ShowWindow for both windows when alt-entering.
TOFIX: this has the side-effect of bringing the mouse pointer on screen and losing input focus on first alt-enter, until the mouse is clicked.
<-reverted (13th)
     
#revision 1518 Changed DXUTDeviceSettings::pp (presentation parameters) to be an array with DXUT_MAX_MONITORS elements.

TODO:
"The number of elements in D3DPRESENT_PARAMETERS should equal the number of adapters defined by the NumberOfAdaptersInGroup member of the D3DCAPS9 structure. The DirectX runtime will assign each element to each head in the numerical order specified by the AdapterOrdinalInGroup member of D3DCAPS9."
     
#revision 1519 Updated DXUTBuildValidDeviceSettings to 'match' the D3DCREATE_ADAPTERGROUP_DEVICE (multihead) flag.      
#revision 1519 Now successfully creating a D3D device with D3DCREATE_ADAPTERGROUP_DEVICE.    
  NOTE: Inverse blending is not compatible with D3DSWAPEFFECT_DISCARD (which I'm using because it's apparently the most effecient swap effect, and the one used in the multihead reference code) :

"Applications that use D3DSWAPEFFECT_FLIP or D3DSWAPEFFECT_DISCARD should not expect full-screen destination alpha to work. This means that the D3DRS_DESTBLEND render state will not work as expected because full-screen swap chains with these swap effects do not have an explicit pixel format from the driver's point of view. The driver infers that they should take on the display format, which does not have an alpha channel"
   
#revision 1520 Each element of the 'pp' array now has the correct hDeviceWindow when creating the fullscreen device.    
#2
#revision 1521
Re #1: the mouse pointer appearing was caused by the UpdateWindow calls done when the two windows are created (UpdateWindow forces a WM_PAINT).  This also caused RenderScene to get called before the mode stack etc. was set up.
For now, to match the multihead reference code, I've left the UpdateWindow calls in and added a NULL modestack check to RenderScene.
<- now removed the UpdateWindow calls (13th)
   
  Kewl, the second window is showing up on the second monitor now (flickering and empty).  It's definitely the second window, as seen from its title bar.    
  Alt-entering back to windowed mode:
device Reset fails with INVALIDCALL.  Probably because I'm trying to reset a multihead device into windowed mode, which isn't valid.

"When trying to reset more than one display adapter in a group, set pPresentationParameters to point to an array of D3DPRESENT_PARAMETERS structures, one for each display in the adapter group.
If a multihead device was created with D3DCREATE_ADAPTERGROUP_DEVICE, Reset requires an array of D3DPRESENT_PARAMETERS structures wherein each structure must specify a full-screen display.
To switch back to windowed mode, the application must destroy the device and re-create a non-multihead device in windowed mode."
   
#revision 1522 WIN!!
Successfully tested rendering to the second monitor!
See TEMP TEST at top of C_HDR::BeginScene

An evening well spent :D
   
11-août-2008   1,83333    
  Back from a two-week holiday.      
  Remembered I don't have catch-all forwarding for programmerart.org.  So all the times I've been submitting ad-hoc @programmerart.org addresses on sites (as a spam-limitation measure), they won't have been working at all.
That'll learn 'em.
   
  Big thanks to cybereality.com for the flattering review of my demo!
http://www.cybereality.com/2008/07/le-cauchemar-realtime-3d-tech-demo
     
  Thanks also to z800.blog.shinobi.jp for persevering with the recent builds and providing nifty Japanese documentation :)
http://z800.blog.shinobi.jp/Entry/756
     
  I'm now going to concentrate on adding those last few missing stereoscopic modes (mainly dual-monitor and iZ3D).
If that goes well, I'll apply for certification of native stereo support at MTBS3D.com.
     
  Added DXUT_MAX_MONITORS, the maximum supported number of monitor outputs.      
  Changed
DXUTState::m_HWNDDeviceFullScreen
to
DXUTState::m_HWNDDeviceFullScreenArray[DXUT_MAX_MONITORS]

SetHWNDDeviceFullScreen and GetHWNDDeviceFullScreen now take a monitor index paramter.
     
  Changed
DXUTCreateWindow
to
DXUTCreateWindows, which takes a number-of-windows parameter between 1 and DXUT_MAX_MONITORS inclusive.
     
  Remmed-out DXUTSetWindow which was unused and now OOD      
  DXUTGetHWND now takes an optional monitor index (defaults to 0)      
25-juil-2008   2    
  Light toggling works with headtracking again.      
  Removed crosshair in frame-sequential stereo mode    
#version 19.0
#revision 1514
Released version 19.0      
24-juil-2008   3,8    
  The award for Most Hassle Caused by a Visual Effect goes to:

rain splashes, for The Trouble They Cause in Stereoscopic Modes.
     
#revision 1509 TOFIX: There is an ordering mixup that was causing the rain splashes to be out of sync between the eyes unless I prepped CRainImpact before drawing the second eye.<-EXCEPT IN ANAGLYPH
For now, I've got them in sync by doing that.
<-FIXED: the two-frames-per-frame eye-toggling was being done before the render instead of after.  Now moved up to RenderScene (from CModeEnvironment::Render)
NOTE: made the corresponding re-fix in HDR.cpp (see clearLDRBackbufferOnce)
   
#revision 1510 Improved rain splash brightness consistency, for varying sizes of ERENDERTARGET_RAINIMPACT_SPLASH_DEST, by not affecting the height sample spacings according to the dimensions of that render target, only its aspect ratio.
See RAINIMPACT_SPLASHNORMALS_HEIGHT_SAMPLE_DENSITY
     
#revision 1511 Related to the above, the other half of the brightness inconsistency in the stereo modes was being caused by the defaultOverrides files specifying shadows\sourceRT=/1 and shadows\destRT=/2.
Investigation might be needed there.
For now I've removed those lines from all the defaultOverrides files.
   
#revision 1512 Lights can now be toggled back on again.    
#revision 1513 Frame-sequential stereo now updates between the eyes.<-undone this; performance is already as low is as it can go without losing Z800 stereoscopy.  Need to optimise stuff shortly.    
  I'll release v19.0 tomorrow    
23-juil-2008   2    
#revision 1505 Default fullscreen res is now 1024x768.
TODO?: should default to using desktop res?  What do other games do?
     
#revision 1505 TEMP: disabled everything on the Display menu apart from the full-screen toggle.
People are constantly getting confused by those controls that don't work yet.
I will get them working soon.
   
#revision 1506 Blaster sound now triggers correctly on each shot (with overlapping samples).    
#revision 1507 Added a NULL check round the blaster sound play.  TODO: missing samples need to be handled better, by the sound manager probably.
The NULL check should prevent the crash I was getting on Vista 64 (I assume that's all it was).  TODO: debug the missing-sound problem on Vista 64.
   
#revision 1508 Added  CLightManager::RegisterLightVisibleInMainDraw
This prevents a couple of bugs:
- when cycling through the stereoscopy modes, the number of visible light would previously keep increasing and not have the chance to reset (now prevents duplicate entries in the visible lights list).
- previously there was no check for the maximum number of visible lights being reached (now bails out when this limit is reached).
   
#revision 1508 CBlasterEffect is no longer a temp-friend of CLightManager.
CLightManager::numVisibleLights and numVisibleLightsInMainDraw are now private.
   
  Website: Tried to get an icon working, by adding this to the 'head' block of Default.master:

<link rel="icon" href="http://www.programmerart.org/favicon.ico" type="image/x-icon" />

It's not working :(
   
22-juil-2008   3,5    
#revision 1502 Fixed the remaining problem cases with the blaster lights and projector transitioning.
The projector transitioning now seems [perfectly?] stable even with three (or presumably more) projectors! :)
<-update: they do still suffer from fade-right-out-before-fading-back-in, but that's a really minor problem in the grand scheme of things - I'll fix it another time if I need to.  I'm bored with projector transitions now, and they've had their fair share of my time.

All safely checked-in in revision 1502; now to tidy-up.
     
#revision 1503 Tidied a bit by adding CLight::flags.borrowingProjector used by blaster lights when they're stealing a projector.
Projector assignment loop now also handles 'visible' lights that aren't enabled this frame (see explanation in comments).
     
21-juil-2008   4,3    
  Spent pretty much the whole evening trying to get the blaster shadow projectors to play nicely with the projector transitioning.  Surprisingly difficult.  Working now, except TOFIX: the blaster shots don't seem to obtain a projector when there are no other lights around.  Shouldn't be hard to fix that.<-FIXED (22nd)
TODO: lots of tidying needed (or "I think we could do with a mega-tidy-out in here, don't you?")
     
20-juil-2008   7,5    
  This seems to be the right syntax for linking to a YouTube video in its own page (nice big frame, no junk) :

http://www.youtube.com/swf/l.swf?video_id=4_p69UwOsNU&rel=1&eurl=http%3A//www.mtbs3d.com/phpBB/viewtopic.php%3Ft%3D1707%26highlight%3D%26sid%3D4fb125ec327b6f02a6764e13302fe1f8&iurl=http%3A//i.ytimg.com/vi/4_p69UwOsNU/default.jpg&t=OEgsToPDskKRVlcPZ4NNaFkXpVPBgabl
     
  Ditched Friday (18th)'s version of the projector assignment loop.  I had gone off the tracks a bit and it had become more complicated than it should have been.
The previous version seems to be slightly less glitchy than it was, presumably because of changes made peripherally on Friday.  For a moment I even thought it was fully working, but no.
     
  The projector assignment loop only appears faulty when the number of projectors is 3 or more (I think).
Since the default is 2, I'm going to move on because there are more important things to do.
   
  Lighting geometry (the geometry that renders the deferred lighting) wants improvement, but it's low priority.  In lighting-only debug mode, the problems are much clearer than in normal mode.<-Actually it is quite noticeable in the game :(
Should really be using meshes instead of spritey-things.
   
  Renamed CCullPlane::exclusionBit -> indexBit    
  Added CCullPlaneUser::cullPlanePenetrations    
  Couldn't find any pre-written way in MAXScript of testing for intersection between a light and a plane.    
  CullPlaneUser now inherits from CListItem    
  Found some glaring problems with the CullPlaneUser 'penetration handling' added on the 14th of June.
Fixed it right up.  Also reduced LIGHT_AABB_BOUNDINGRADIUS_MULTIPLIER, which makes a big difference to how many lighting pixels are drawn each frame.  TODO: lights should fade in and out as they cull.
   
  Increased the range of the John Street big white light.  Makes the place look totally different (and more like the real location).  But I need angle limits on the lights, for performance and for realism - TODO
It's also clear that I need to reflect those shadows.  Looks very wrong that the shadows aren't reflected.
   
  TOFIX: crash when firing!<-fixed (was assigning a projector to blaster lights before the light's bounds & centre were set up)    
18-juil-2008   3,333    
  Completely re-wrote the projector assignment loop, but it's still wrong.  It's horribly complicated and I hate it.  The most frustrating thing is that I can't even work as late tonight as I normally would do to get it fixed.  I just have to stop now, having made no progress, and leave it till Sunday.      
17-juil-2008   3,5    
  Another possible stereo mode: SIS™
http://www.sis3d.co.uk/9344/index.html
Seems to be simply over-under (right eye on top), tipped anti-clickwise 90°

Ultra low priority, because video drivers let you rotate the display anyway.
     
#revision 1489 Projector transitions are now 95% working.  There's one little glitch case that can be seen in the west alley of Bedford Court.  Shouldn't be hard to track down.
TODO: simplify/tidy the projector assingment loop.
   
  TOFIX: rain splashes seem to be double-bright in stereo modes.
Also, they match up really badly between the eyes.  Am I updating them in each render or something?
Rain splashes are now the only effect that's letting down the stereo.  Anything that lets down the stereo is pretty embarrassing.  Shadows are now perfectly stereo-friendly.

Maybe to improve stereo consistency of rain splashes:
- don't influence them by the normals behind them
- use world-space position (rather than screen-space) to lookup the detail texture.  This should also prevent some shimmering when the viewpoint is travelling.
   
  TOFIX: Post curve: doesn't match with Photoshop results!      
16-juil-2008   3,6666    
#revision 1481 Removed CMenuTree::transitionTimer (not used)      
#revision 1482 Projector transitions:
added CLight::projectorHomer,
CLight::StartProjector,
CLight::EndProjector,
CLight::Update,

CLightManager::Update
     
#revision 1483 Removed CProjector::direction (not used)    
#revision 1483 Moved projector assignment into LightManager::Update
TODO: get blaster shadows working again
   
#revision 1484 Projector (shadow) fade-ins are now starting to work.  They look really nice.  Kinda dream-like in fact.
The fading uses CHomer, the same class that produces the smooth menu transitions.
   
15-juil-2008   1,333    
  Huge thanks to Tril in mtbs3d.com for the advice on multi-monitor support.  It looks like this is going to be possible for me after all.  I have the goodies back from iZ3D as well, so straight after the shadows I'm going to add the missing stereo modes.  I'll actually have a complete set!!      
#revision 1477 Changed the shadowmaps to use squared distance.  This saves zillions of pixel shader sqrts per frame.
Had to upgrade PROJECTOR_ORT_FORMAT to D3DFMT_R32F for this; the float16's were having none of it.
I wasn't using the green channel anyway; light filter textures will be applied from the receiving end.

NOTE: the z buffering used during projector depth draws is now squared 0..1 depth as well.  Doesn't seem to cause any trouble.

Also reordered the ProjectorShadow PS for efficiency.
     
#revision 1478 DeferredLighting.fx: For lights with projectors, specular is now blocked by fallback shadows as well as projected shadows.  This will be tidied when I add the projector cross-fading.      
14-juil-2008   2,66667    
#revision 1474 Added CLight::priorityMultiplier.  This is used by blaster lights to pretty-much ensure that they always cast shadows.
See LIGHT_GETPROJECTORPRIORITY_BLASTER_INFLUENCE_FACTOR (todo: tidy)
     
#revision 1475 Added CViewInfo::Update (once-per-frame update of g_viewInfo).  Each frame, this tests one of several rays against the environment.  The minimum of the most recent ray test results (currently 4 frames' worth) is stored as g_viewInfo.shadowFrustumMinZ.  This is used, in combination with data about each light's view-space bounds, to control the near & far distances of the frustum used to generate shadows.      
  Realised I'd overlooked something with this adaptive frustum stuff:
Using the view-space light bounds to limit the frustum dimensions is fine for diffuse light, but useless for specular light since it has no distance falloff in my lighting model.  D'oh!
I think what I need to do is use fallback shadows together with the projected shadows, to block the specular.
I'll get that working
<-DONE(15th)
when I do the projector cross-fading (starting tomorrow night).
     
  TODO: change projector depth images to use squared distance.  Probably need to keep that second channel for mask/overlay textures.<-DONE(15th)      
13-juil-2008   9,25    
#revision 1468 Made a partial fix for the projector culling problems.  This fixes the cutting-out shadows of the pillars in the BT building.
I had been forgetting to:
- actually use the FOV angles calculated in CProjector::GenerateDepthImages
- set the aspect ratio for the projector camera (this now happens automatically in CCamera::CalculateProjection; added an aspectRatioDirty flag to the cameras).

CCamera::CalculateProjection is now being used again; before it had been duplicated into CViewInfo::ApplyCamera during headtracking improvements.  The (virtual window) headtracking now updates the FOV of the camera itself; so everything should still work properly.
     
#revision 1469 Eventually cornered my projector culling bug.  Funnily enough it was exactly what I'd guessed it was: shear in the view matrix.  I don't yet know what it is about TestSphereVisibility that doesn't support shear, and I'm not sure I've got the time to investigate.  For now what I've done is just remove the shear from the view matrix for the projector depth draws (CProjector::GenerateDepthImages).  There should be no practical difference anyway; the important thing by far is just to make sure that sphere culling is being used for these depth draws, and it is.  Let's move on.      
#revision 1470 Further hacky fix to reinforce revision 1465.  Reactive scenics with 'dynamic bounds' set true now ensure that their parents' bounds are at least as big as their own.
This assumes the parent's centre matches this centre (like I say, hacky, but it does its job).
     
#revision 1471 Little fix to the new aspect ratio stuff - there was an ordering/dependency bug.      
  So, now I'm FINALLY at the stage I'd hoped to be at by yesterday afternoon - ready to start on the adaptive-frustum stuff that will maximise the res for the shadows.      
  Added a draft version of the adaptive-frustum stuff.  It's already working wonderfully.      
  Also improved the blaster's assisted aiming so it works with the ground plane as well as the landscape meshes (it doesn't actually test the ground mesh yet, but the ground plane seems to work well enough from what I've seen).      
12-juil-2008   6,3    
#revision 1462 The soft shadows option (the option to turn softening off) now works, and works as an optimisation.      
  Tried using a half-pixel UV offset on the shadow depth lookup.  Didn't seem to be the right thing to do:
C:\Noctambule\Debug\12_7_8_FFSM_shadowDepthHPOffsets.psd
     
#revision 1463 Shadow depth, when written to the depth maps, is no longer divided by PROJECTOR_DEPTH_RANGE.
Projectors now clear their depth maps to zero, and ProjectorShadow.fx bails out if it reads zero from the depth map.
   
#revision 1463, 1464 Changed the shadowmapping to work on true distance from the light rather than distance along the light's direction (to the frustum face).
In some extreme cases where a frustum face was close to the light, the old method clearly wasn't up to the job, because part of the frustum face would (correctly) be a negative distance along the light direction.
That had been the cause of the mini-gaps that I mentioned last night - I'm glad to see them go :)
   
  Following-on from the above, a possible optimisation later would be to use the new distance calculation only in those extreme cases (a spare colour channel would indicate which of the two methods to use for each pixel of the depth map).    
  Briefly had a bug where I'd forgotten the 'out' direction specifier on a vertex shader parameter.
I would have hoped the compiler would tell me about something like that.  It had no semantic - it should have been obvious that I wasn't trying to use it as an input.
   
#revision 1465 D3DXFrameCalculateBoundingSphere doesn't seem to take into account scaling animation.
Because the lampposts use bone scaling to correct their size, the lampposts' bounding radii were too small.

I've now added a slightly hacky fix in CReactiveScenic::UpdateVirtual.  A 'dynamic bounds' flag is set true by lampposts so that each frame the bounds update to contain all the bone positions.
   
#revision 1466 Added option debug\lockProjectors.  This freezes the assignment of projectors to lights.  Handy for debugging a particular lightsource.    
#revision 1467 DeferredLighting.fx: added classic halo removal for the soft shadows.    
  TOFIX: I'm having some problems with TestSphereVisibility in the projector depth draws.  This is probably something to do with the unusual sheared view matrices that they use.  It's causing bits of the shadows to cut out sometimes.<-FIXED(13th) TestSphereVisibility doesn't support a sheared view matrix.    
11-juil-2008   3,666    
#revision 1460 Cleared up all the errant back-projecting shadows (ProjectorShadow.fx)      
  I think the very last artefacts I'm now seeing, in the case of a point light very close to a casting object (lampposts), is down to a natural discontinuity in the projected shapes of the casting object on the different frustum face maps.
I think.  It's certainly a convenient explanation, because it means the problem is un-fixable.  It's fairly minor anyway.  So it means the whole effect is working properly.
C:\Noctambule\Debug\11_7_8_final_FFSM_artefacts.psd
     
  ...actually, there's seems to be one little bug left that shows up occasionally.  I'll weed that out tomorrow<-FIXED(12th)
 and then start adding the adaptive frustum stuff that minimises the length of the frustum to maximise the shadow res.
     
9-juil-2008   0    
  Note to self: don't get involved with editing Wikipedia pages - it draws you in!!
I sort of lost the whole evening doing this :(
     
8-juil-2008   2    
  Got the far face of the view frustum shadowing properly.      
  TOFIX: the first bailout in the ProjectorShadow.fx pixel shader needs to use the normal of the frustum face, not the light's view direction.      
7-juil-2008   3,6666    
  Got the shadows working properly now (completely fixed yesterday's gaps).
These shadows really are something special.....

(link) There's a new screenshot in the 'behind the scenes' gallery (go to the end).
     
6-juil-2008   13    
  Bought the cheapest domain name ever: shadowmap.info for 99p !?  From 123-reg.co.uk      
#revision 1443 Added SEnvironmentRenderData::pOriginalCamera.  Fixed a place in CModeEnvironment::RenderSubset where the player/flycam camera was getting applied even if the render category was projectordepth.  Not sure what effect that was having if any.
CProjector::GenerateDepthImages now restores (re-applies) SEnvironmentRenderData::pOriginalCamera after generating the depth images.
CModeEnvironment::Render no longer applies a camera (because RenderEye does this before drawing).
     
  CModeEnvironment::RenderSubset: prevented unnecessary Z buffer clears for redraw effects.      
  GRR, I've been debugging the wrong frustum face for the past....grrrrr      
  DX: D3DXMatrixPerspectiveOffCenter is misleading with its parameters; see explanation here:
http://discussms.hosting.lsoft.com/SCRIPTS/WA-MSD.EXE?A2=ind0011A&L=directxdev&D=0&T=0&P=6897
     
  Checked that SViewFrustumPlane normals and plane equations are still needed.      
  Eventually got the new shadow res bias working on the four long faces of the view frustum.  I'm relieved that the faces all more-or-less join up now (edges and corners pretty-much line up).  However there are still little gaps...they look like they shouldn't be too hard to track-down or bodge away.  Hopefully I've just made a silly mistake somewhere....<-FIXED(7th)      
  Anyway, the work has paid off.  The serious gap problems I had before are fixed; the overall apparent res is much higher; these shadows are doing some REALLY good stuff now.  When you get up close to them they are pin sharp :)      
  I seriously expect it would be possible to patent this shadow technique, but I'm not sure I'd want to.  I think that would make it less likely to get seen, used and appreciated.
Instead, I'll probably just give it a fancy name, write a little document about it and see if it becomes popular.  Depending on how that goes, I might do the same for some of the other effects.  All good stuff for the website.
     
5-juil-2008   12    
  PLAYER_CAMERA_NEARCLIP
PROJECTOR_MIN_FACE_DOT
PROJECTOR_MAX_RES_BIAS
ProjectorDepth.fx CULLMODE
     
  TODO?: imrove the TrackIR support by copying the equations from this script from Crim3:
C:\Installs\Crim3HeadTracking\wii_alterpose_trackir\wii_alterpose_trackir.PIE.txt
which draws from the paper "3D Pose from 3 Corresponding Points under Weak-Perspective Projection" by T.D. Alter:
C:\noctambule\articles\headtracking\AIM-1378.pdf
     
  Realised something important about my shadows:
The projector view that I've been setting up to point at the frustum face has got no relationship with the view that I actually want to use to render the casting geometry flattened onto the frustum face.  It's good that I'm setting up the view, because it's appropriately used for culling.  But when I draw the projector depth I should actually be looking along the frustum face from the narrow end (the face-space offset of the viewpoint from the face's left->right line should have a zero Y component).
     
  In other words, once I've flattened the casting geometry onto the frustum face, I'm free to use whatever viewpoint I want to render that geometry to the depth map.  The ideal viewpoint is one that fits the face perfectly into the viewport.      
  Hah!  There is another missing half-pixel offset in ProjectorShadow.fx, in amongst all the crazy projection trickery.
TODO: fix<-was already fixed I think
     
  I think my shadows could generate depth images for several (three?) frustum faces per draw, using a geometry shader.  But that won't happen for this project because this project is not going to move onto DX10.      
  Spent most of the evening working out how to set up the view so that each frustum face will exactly fill the viewport.
Max was very helpful for this:
C:\Noctambule\Mockups\newResBias.max
     
  Started adding the new shadow res bias code.  Will get this working tomorrow.      
4-juil-2008   2,75    
  v18 bugs on Quadro / Vista 64:
C:\noctambule\debug\v18_0_quadroBugs_vista64.psd
     
  ESHADEREFFECT_RAINNORMALS is written-to in CRainImpact::Render, which is called earlier than when the lighting is generated.
ESHADEREFFECT_SHADOWBLUR is written-to in CLightManager::GenerateLighting \ CProjector::GenerateShadows.
It almost looks as if SHADOWBLUR is writing its output into the splash (alpha) channel of its render target.
It's not though!  It's writing zero alpha.  And it draws after the rain splashes are done anyway.  And the rain splash effects all draw without blending, and *now* without alpha testing.  Maybe it was just failing an alpha test???  We'll soon find that out.
   
  RainNormals.fx: changed it from using bizarre (but mostly ok-looking) renderstates to using ALPHATEST=FALSE, ALPHABLENDENABLE=FALSE    
  RainSplash.fx: fixed some sampler filtering.    
  Sent myelf some new FXOs to try on the Quadro, with the fixes described above.    
#revision 1434 RainSplash.fx: Added missing half-pixel offset.    
  Anyway, this weekend is SHADOW WEEKEND!  That means I finally get round to attacking all those glitches that have been ruining the shadows.
This has been on my to-do list since May 2006 when I concocted this shadow technique of mine (which still doesn't have a proper name).
   
  (link) Added a couple of shadow screenshots to the 'behind the scenes' gallery (go to the end).    
3-juil-2008   3,5    
#revision 1430 Tracked-down & fixed the problem that was vertically flipping the blaster streaks in screen-space:
When I changed several shader effects to use input.uv instead of converting clip-space position into UV, I accidentally left the line in that negates the Y component.  So I had vertex shaders doing this:

   output.uv    = input.uv;
  
output.uv.y    = 1.f-output.uv.y; // this is just left-over from when clip-space position was being converted to UV

The vertex shader that was flipping the blaster streaks was in MotionBlur.fx (CombinePass).
     
#revision 1431 MotionBlur.fx: Made a correction to compensate for the fact that the velocity buffer is an 8-bits-per-channel int format.
When reading the velocity from the buffer, just had to subtract (127.f / 255.f) rather than 0.5f.
When the camera is still, the frame is now completely un-blurred :)
   
  TODO?: To speed up the lighting, get rid of the position buffer and instead use the W of the normals buffer to store view-space Z position?
The question is: would it be faster to extract view-space/world-space position this way than to read it from a 4-channel 64bpp screen-sized RT?  My gut feeling is that it would be tons faster (in which case, why do people use position buffers??)
TODO: do a rough test to gauge the performance gain.
   
  BlasterEffect: Fixed the stray poly that was appearing on one of the streaks.  Just needed to subtract 2 from the number of prims to draw (ie. always remove the trailing degenerate quad because in the case of the last projectile, it connects to nothing).    
#revision 1432 Following-on from revision 1431, made a corresponding fix in Velocity.fx.  Needed to do this because it seemed that the X1900 was definitely rounding 0.5f up to 128.f/255.f, causing different results between the two machines.  Slightly worrying, that.
The fix was to offset the output of Velocity.fx by (0.5f-(127.f/255.f))

This fix is future-proof in that it would allow the velocity buffer to be changed to floating-point (if I had any reason to), without me having to adjust the shader code again.
   
#version 18.0 Released version 18.0    
2-juil-2008   0    
  Below: In response to an email, some info about the ideas that have been forming in my head about the mythical "next game" that I'll never ever have time to do.
I'm a bit tired so apologies if the info is kinda fluffy and vague.  Click to see some pictures that help describe the visual style.
     
       
  "The ideas I've been day-dreaming for "my next game" aren't very commercial, just something I'd really like to experiment with.  It's probably over-ambitious, and I know I'll never have the time.  It goes something like this:      
  - Story-based virtual reality adventure.      
  - Engine is designed for present and future VR equipment; this forward-compatibility contributes to the game's timeless appeal.      
  - Setting is Zelda-like, with idyllic countryside, charming characters and fantastical voyages.  No violence; it's more about exploring, travelling, meeting people, making things better and enjoying the scenery.  There might be quaint steam trains, wooden boats and a hot air balloon.  And plenty of interesting people with tales to tell.      
  - Visual style is uniquely impressionistic, always conveying the essence of the scene rather than photographic details.  Something like this: http://www.programmerart.org/future.  This reduces the art manpower required.      
  - The audio style is exactly the opposite: meticulously authentic and detailed, using bespoke location recordings and new audio technology.  Would probably require an obsessive sound recordist and a fair bit of audio R&D.  Probably a ton of voice actors required as well, and script, and a good story......      
  It's probably not something I could ever hope to put together successfully - but an interesting idea all the same."      
1-juil-2008   2,8333    
#revision 1428 Added missing half-pixel offsets:
DeferredLightingApply.fx (this fixes the stepping glitch seen on the slave)
VolumeLighting.fx
ProjectorShadow.fx
     
  Dream-text mockup:
C:\noctambule\mockups\dreamTextTitle.psd
     
  TOFIX: I seem to have broken BlasterEffect in a bizarre way.  When motion blur's enabled, the Y axis of the projection matrix is negated (????)<-FIXED(3rd)      
30-juin-2008   3,5    
  Found that the 'halfScreenPixelOffsetsIn' parameter of UtilDrawScreenQuad was defaulting false!
Now fixed.
     
  Found that the half-pixel offsets applied by UtilDrawScreenQuad were always screen-res half pixel offsets, not current RT.  Now fixed.      
#revision 1426 DeferredLighting.fx: Tried loads of different ways of combining the clean and blurred shadow images.  What seemed to look best in the end was pretty much what I started with (nice & simple), but with a wider blur and a shorter clean-to-blurred blend range.
Shadows are looking a bit nicer now.
     
  ShadowBlur.fx: Added missing half-pixel offset and corrected the alignment of the blur.    
  Velocity.fx: MotionBlur.fx: Added missing half-pixel offsets.    
  Yesterday's strange stepping pattern now seems to be fixed in windowed mode, but not fullscreen.    
29-juin-2008   8,16667    
  Dreamt about half-pixel offsets all night.  Once I've finished this project, I really need to get out more.      
#revision 1413 (below) Stumbled on something that could be useful - a shader effect that seems to calculate the distance of each pixel from the centre of its face - or something like that.  Don't ask me how it works!
Almost looks like something that could be used to counteract SSAO 'facetting' artefacts ?
The pattern is just as strong at any angle, but weakens with distance.
C:\Noctambule\Debug\29_6_8_showDistFromFaceCentre.png
FallbackShadowReflectionPosition.fx
     
 
     
#revision 1414 FallbackShadowReflectionPosition.fx: Tried to rearrange this so as to remove the sqrt from the pixel shader.
Found that this wasn't possible because of the way I'm using a threshold value in the comparison between the receiver depth and the scene depth.
(A-B==threshold) != ((A*A)-(B*B)==(threshold*threshold))
   
  I've done some repair work on FallbackShadowReflectionPosition.fx to make it cleaner & more accurate.    
#revision 1417 FallbackShadowReflectionPosition.fx: Noticed that the deferred lighting samplers (position, normals) were using linear filtering (???)  Now using point.
No visible difference on the X1900 (it can't filter floating-point textures)
   
#revision 1418 ERENDERTARGET_RAINIMPACT_SPLASH_NORMALS now shares with ERENDERTARGET_PATCHWORK_DIMPLENORMALS.
Previously it shared with ERENDERTARGET_REFLECTION_DIFFUSE.

So the splash normals are now generated on a fixed-point render target.  This gives a per-light saving (when sampling the splash normals), and per-light savings are the best kind.
   
#revision 1418 ERENDERTARGET_PATCHWORK_DIMPLENORMALS now defaults to half-by-half size rather than quarter-by-quarter.
Previously, the dimple normals were a big source of blockiness that couldn't really be ignored.
The generation of the dimple normals (PatchworkDimpleProcessing.fx) is not the cheapest of pixel shaders, but I've seen worse ;)
   
#revision 1418
#revision 1419
DeferredLighting.fx, RainNormals.fx: Tweaked the way the rain splash normals are used, to get them looking right again.
Removed a normalise.<-D'oh! No, forgot that auto-reloads aren't working in full-screen
   
#1
#revision 1420
ERENDERTARGET_FALLBACKSHADOWREFLECTIONPOSITION now shares with ERENDERTARGET_MOTIONBLUR.
Previously it wasn't sharing.
NB. It is now full-res.  This removes specular fringes that were previously seen round objects due to fallback shadows (previously it was a half-by-half RT).
   
#revision 1424 Tried making ERENDERTARGET_RAINOCCLUSION share with ERENDERTARGET_REFLECTION_DIFFUSE, but the ordering got tangled.
Previously it shared with ERENDERTARGET_FALLBACKSHADOWREFLECTIONPOSITION but now that's gone full-res (see #1).
Decided to make ERENDERTARGET_RAINOCCLUSION a non-shared RT instead.
Added option weather\rainOcclusionRT.  Currently defaults to 512x512.
   
  CAnimMesh::Render no longer sets an identity object matrix before and after drawing, and it now ignores the current object matrix.    
#revision 1421 v18 bodge: CAnimMesh::Render bails out if render category is ERENDERCATEGORY_RAINOCCLUSIONDEPTH.
This is because anim meshes have been making a nuisance of themselves in the rain occlusion draw.
TODO: probably need to fix this at some point!
   
#revision 1422 v18 bodge: toggling fullscreen no longer flags an override of the 'display\fullScreen' option.  So the game will always start windowed unless the config file is edited manually.
This prevents a startup crash seen on Vista 64 when launching the game in full-screen.
TODO: INVESTIGATE!!!
   
#revision 1423 CLightManager::DrawPlaceholderLightObjects no longer includes blaster lights.    
#revision 1424 Added the required half-pixel offsets to the following shader effects that use non-screen-filling geometry to sample screen buffers (positions, normals, etc) :
DeferredLighting.fx
FallbackShadowReflectionPosition.fx

TODO: resolve duplicated code for this.
     
  Didn't manage to release version 18.0.
1. On the slave, when the frame RT is reduced (anaglyph, WOWvx), there's an odd stepping pattern round the edges of things (noticeable on cars).  This doesn't happen at all on the master PC.<-FIXED(1st Aug)
2. There's a visible should-be-degenerate linking quad hanging-off one of the blaster projectiles.<-FIXED(3rd Aug)
3. I want to try putting a little adjustment on the motion blur, because currently the velocities are slightly offset.  For example there's a slight blur even when the view is static.  This is because of the lack of precision in the integer format used for the [blurred] velocity image.<-FIXED(3rd Aug)
   
  TODO: get those reflected shadows working.    
28-juin-2008   10,1667    
#revision 1397 Blaster shots now terminate at their impact point when hitting a zombie.  This prevents noticeably upwards-pointing shots (due to assisted aiming) when firing very close to the zombie (like, a couple of metres away).
In the most extreme case of the assisted aiming, the viewpoint is inside the zombie's collision sphere when the shot is fired, so the shot heads directly up to the viewpoint.
     
#revision 1439 Added Vec3IsIdentity: determine whether or not the specified 3-element vector is zero-length      
#revision 1400 Found that the BlasterEffect render can run into a freak problem case where the streak has zero length (this is valid).
This case is now detected and handled by simply hiding the projectile's verts rather than plotting them into position.  No point adding complicated code to handle a one-in-a-thousand case - just let the projectile become invisible.
   
#revision 1401 Added CModeEnvironment::TestRayIntersection.  This performs:
ray collision on the zombies (currently ray-sphere with culling: CZombieManager::TestRayIntersection);
ray-mesh collision on the landscape, using D3DXIntersect (CLandscape::TestRayIntersection).
The closest T value is passed out in a CEnvironmentCollision instance.
   
#revision 1402 Ray-landscape collision now has hierarchical bounds culling (ray-to-bounds).

TODO?: also use hierarchical bounds occlusion culling (CullPlanes)?  The benefits of this would be fairly small at present, but would increase as the complexity of the town increases.
   
  Robot pirates?    
#revision 1403 TEMP: Blaster shots now launch from the player model's right hand    
#revision 1404 Each blaster projectile can now store information about a known terminal collision.  This collision is found by ray-testing the static landscape just before the projectile is launched.
If the projectile travels for as many seconds as it takes to reach the known terminal collision, it terminates at that point.  This prevents the need for the projectiles to perform collision tests with the static landscape each frame.
   
#revision 1405 CBlasterEffect::CollideWithSphere now correctly handles the case where the projectile's position and previous-position members are equal.    
#revision 1406 DeferredLighting.fx now skips the sampling of a blurred shadow image (n/a) if the shadows are fallback shadows.
This is done using a uniform parameter.
   
#revision 1407 DeferredLighting.fx: removed the 'diffuseShadow' uniform because it was only being used to indicate whether the shadows were real or fallback.    
  TODO: cancel perspective for texture sampling in DeferredLighting.fx and for other shaders that use the same lighting geometry.<-Not needed, because the geometry is screen-aligned rather than camera-facing    
#revision 1409 Moved the generation of fallback shadows into DeferredLighting.fx.  The benefits of this are:
- the fallback shadows now have higher resolution (reduces haloes round objects)
- the fallback shadows are now only generated for the pixels that need them (the pixels of the lighting geometry)
- saves various CPU & (mostly) GPU work
- gets rid of a little corruption/junk glitch I was sometimes seeing in the fallback shadows at the bottom-left of the screen
   
#revision 1411 Removed everything to do with the old separate-stage fallback shadows: FallbackShadow.fx, ERENDERTARGET_FALLBACKSHADOW, etc.    
#revision 1412 DeferredLighting.fx: Noticed that the deferred lighting samplers (position, normals) were using linear filtering (???)  Now using point.    
  TOFIX: Realised that all my effects that convert screen-space positions into 'screen UVs' are lacking half-pixel offsets.  Maybe that explains the remaining slight specular haloes round objects?    
27-juin-2008   3    
  DebugSphere now takes a vector pointer instead of a reference.  TODO: same for other debug draw functions.      
  Noticed that D3DX has some useful collision functions:
D3DXIntersect, D3DXIntersectSubset (ray-mesh collision)
D3DXIntersectTri
D3DXSphereBoundProbe (ray-sphere collision)
D3DXBoxBoundProbe (ray-AABB collision)
     
  Added CBoundingBox::DrawDebug      
#revision 1391 Determined that my AABB-AABB collision is now working properly.
The collision failure in CBlasterEffect::CollideWithSphere must be happening somewhere else...<-FIXED
     
#revision 1392 Fixed a problem with ray-sphere collision.  It was the way I was using the t1 & t2 vectors....
The IntersectRaySphere functions now pass out a single T value.
     
#revision 1393 Fixed a clumsy mistake in CBlasterEffect::CollideWithSphere (had been returning if T was out of range, instead of continuing to next projectile)      
#revision 1394 The IntersectRaySphere functions now treat the sphere as 'solid' (filled).  If the ray starts inside the sphere, the intersection point is the start point.      
#revision 1396 Blaster-to-zombie-sphere collision is now fully working and properly culled.      
  TODO: blaster-to-landscape-mesh collision.  Use D3DXIntersect to save time.
Should probably compare performance of D3DXIntersect for ground collision against my current specialised ground collision, just as a test (there's no way it should be as fast as my collision, but it will be useful to see how much difference there is).
<-DONE (28th)
     
26-juin-2008   3,16667    
#revision 1384 Grr, DebugSphere doesn't work at the moment.<-FIXED (just needed to 'apply' the current main camera)      
#revision 1385 Added CZombieManager::DrawDebug      
#revision 1386
#revision 1387
IntersectRaySphere now takes a start point and a direction vector.
Added
IntersectRaySphere_StartEnd which takes a start and end point.
     
#revision 1388 Added Vec3ScaleAdd - better late than never.      
#revision 1389 Added a discreet assisted-aiming feature that makes the crosshair more meaningful.
When you fire a weapon, the enemies are checked for intersection with a ray that casts from the viewpoint out through the crosshair (TODO: landcsape collision too).  If an intersection point is found, the shot is launched directly towards that intersection point.  This aiming assistance is not 'noticeable' to the player but it gives them exactly what they expect - an impact point right on the crosshair.
     
  TODO: fix the bounding box intersection test in CBlasterEffect::CollideWithSphere which is often returning an incorrect false result.<-FIXED(27th)      
25-juin-2008   5    
  Got some French terminology help from v3ry at stereovision.fr - much appreciated, merci !      
  Started avoiding backward loops because apparently they tend to make very poor use of the data cache.      
#revision 1378 Fixed my bug where the blaster lights were re-appearing after their shots had finished.  This was something really stupid - I had forgotten to hook-up the 'shootable' flag on the lights.  Old lights were therefore getting toggled back on by new shots.      
#revision 1378 Blaster shots now have a limited lifespan.      
  Lights default non-shootable, to save confusion.  Lights parsed from the world file are all flagged shootable when they are parsed.      
#revision 1381 Collision.cpp: Got rid of IntersectRaySphere2, which was a temporary test.      
#revision 1380 Added CBoundingBox (BoundingBox.cpp&h) : An axis-aligned bounding box      
  Blaster effect now has an overall bounding box that contains all projectiles.      
#revision 1382 Blaster projectiles now collide accurately with the zombies' heads.      
  TODO: need to fix the skydome so that it doesn't get in the way of weapon projectiles (need to make it infinitely distant)      
15-juin-2008   10,1667    
  Improved the 3DVisor default stereoscopy settings, by adjusting 'display width' & 'viewing distance'      
  Motion blur: Ideally, I wouldn't smear the HDR backbuffer; I'd smear the scene diffuse and the scene normals.  Separate motion blur would be applied to the lit reflection image(s), based on the velocities of the reflected views.
This would mean that flat reflective surfaces moving through the frustum wouldn't incorrectly smear the reflection.
There's a slim chance I could make this change later.  CViewInfo now stores the previous world->view matrix for each eye,
for each render category.  The reflected previous world->view matrices are used by CBlasterEffect when drawing in reflections.<-had to remove this because it meant the reflections were double-smeared
     
#revision 1373 BlasterEffect: Motion blur: In EYE style, the persistence value is used and the streak is consistent in strength across frame boundaries (as much as possible; the overlap messes this up slightly).
In FILM style, the shutter angle value is used but with a floor of 180º (lower than that, the streaks look naff).
NONE behaves like film-style with a shutter angle of 360º.
     
  Blaster shots are now drawing nicely.      
#revision 1377 Blaster shots now collide with the ground plane.
I expect I'm going to add full per-poly landscape collision soon.  Maybe collision tests on the ground mesh should be culled-off if they don't hit the ground plane.
     
  Blaster shots now each have a point light.      
14-juin-2008   10,3333    
  From yesterday:
"I'll remember for next time - the better way to do split-screen stereo is using
viewports."
Thinking about this again, I remember why using viewports isn't ideal either.  It's because HDR bloom & glares would leak over the edge of each viewport into the other one (the HDR effects would treat the split screen as a single image).
Losing eye-style motion blur (downgrading to film-style) is definitely better than having HDR effects leaking between the eyes.
     
  TOFIX: lighting-geometry seems to be really wonky when generating the reflection image.<-fixed      
#revision 1357 I'm now using a release version of EMADevice_DLL.dll
The master build of the game project no longer fails its post-build step (the release dll is now where it should be; the post-build step copies it into the Master folder)
     
#revision 1357 Fixed quite a few 'assert' bugs (function calls being used as 'assert' conditions, and therefore being skipped in master builds).  These were the bugs I saw in v17.5 last night - all fixed now.      
#revision 1358 LightManager::GenerateLighting: the prep-type stuff (checking light priorities and assigning projectors accordingly) is now only done for the first eye.<-TODO?  Had to put this back because it could cause a crash (select a stereo mode, look straight down, run around)      
#revision 1359 CModeEnvironment::RenderSubset: Made a fix so that during a reflected draw, the view matrix isn't un-reflected (by CCamera::Apply) before generating the lighting.
After making this change, I had to fix the RespondToTestShot functions so that they get a view direction from the player's camera rather than from g_viewInfo.
     
  Vec3DotXZVec2: what a winner!      
#revision 1360
#revision 1364
#revision 1365
CCullPlaneManager::TestOcclusionVisibility: Added a little improvement that allows an object with its centre on the far side of a cull plane, and its occlusion corners both overlapping the plane in screen space, to be deemed occluded even if its bounds are poking through the cull plane (towards the viewpoint).  This was needed because I was seeing some lights failing to get culled by the double-sided cull planes around the BT building (because the lights are close to the cull planes).
The new behaviour is controlled by the 'handlePenetrationIn' parameter (defaults false; only used by CLight).
NOTE: When I tried having this behaviour active all the time, it caused some objects to cut out when they shouldn't.  So it might need a bit of improvement later.<-might be better now
Seems to work fine with all the lights though.<-I did see one cutting-out occasionally....
     
#revision 1361 Options: Renamed motiontblur\eyeStyle_amount -> motiontblur\eyeStyle_persistence      
  Reflected lighting geometry no longer has tails.
Also fixed faulty 'sliding' UVs on lighting geometry:
Removed CLight::s_handleTilt (now always true).
CLight::ClipLightingVertsToViewportEdges: removed UV in/out parameters (they were only needed in the old non-tilty version of the lighting geometry.  They were still being used though, which was the cause of the bug)
     
#version 17.5 Released v17.5      
#version 17.6 Released v17.6
This fixes a menu crash on startup when launching the game with a headtracker attached.
     
  TOFIX: 3DVisor 'keep alive' messsages aren't working [on the master PC, master builds].      
13-juin-2008   3,66667    
  Realised that the way I've done my split-screen stereo modes doesn't allow for eye-style motion blur.  This is because the two eyes render to the same HDR backbuffer area (before being positioned on the required part of the screen).  It's the HDR backbuffer that persists in eye-style motion blur (the motion blur is quite rightly HDR).

I'll remember for next time - the better way to do split-screen stereo is using viewports.
It's possible that I could find time later to make the change so that eye-style motion blur will work in these modes.  It should be an easy job, but it's also very low priority.  It would allow rain to render directly to the screen in most of the split modes.

<-see 14th
     
  COption::ApplyAll now forces all variable menu items in the pause menu tree to update their variable verts.
It's brute force again, because time is short.
     
  Added CMICombo::SetValidValues and CMICombo::IsValueValid
These are used to disable the eye-style motion blur option in stereoscopy modes that aren't compatible with it.
     
  Built a version 17.5 in the hope of releasing it tonight, but it has a few interesting bugs....      
12-juin-2008   1,83333    
  Frozen pause backgrounds were not working for split-screen stereo modes so I've changed them back to non-frozen.
In theory they should be able to work, but I don't have time to experiment.

Maybe the problem is that the first frame, after changing the stereo mode, has a faulty view setup - and that's the frame that gets frozen and displayed until the mode is changed again.
     
#revision 1351 Fixed a little ordering problem in COptions::ApplyBeforeDeviceCreation:
Needed to call ApplyAspectRatio before ApplyFOV.

The problem showed up as an incorrect FOV when switching from WOWvx to the next stereo mode, using override profiles.
     
#revision 1352 CMenuItem: Added flag 'resetDeviceOnChangeOfValue'.  Currently used by CMIRenderTarget and by the stereoscopy mode combo.
This causes all game modes to be invalidated and then restored, after the options have been applied, whenever the item's value is changed.
Changes to render target dimensions (when switching between override profiles) are now fully working.
     
#revision 1353 CLightManager::ApplyLighting: Anaglyph mode no longer forces motion blur off.

Checked that new eye-style motion blur works in anaglyph mode:
debug\12_6_8_anaglyph_eyeMotionBlur.png
     
11-juin-2008   4,16667    
  Realised that eye-style motion blur (in which each frame persists over subsequent frames) isn't compatible with 'two-frames-per-frame' stereoscopy modes (line-sequential, checkerboard).  It's not compatible with frame-sequential either.

In those modes, eye-style motion blur will be (todo...) forced to draw as film-style motion blur.
     
#revision 1350 I'm adding a new option overrides system that, for example, automatically configures the optimal render target sizes for each stereoscopy mode.
Each option enumeration value can have an override profile associated with it; they're kept in
profiles\defaultOverrides and they're named according to the value name.
So for example
defaultOverride_ESTEREOSCOPYMODE_WOWVX sets the res to 1920*1080, the frameRT to half size, the aspect ratio to 16:9, etc.  It would be automatically loaded at the start of the game if launching in WOWvx mode; and automatically loaded when selecting WOWvx mode from the stereoscopy menu.
     
  I'm not sure why freezing the pause background in interlaced/checkerboard stereo modes didn't work.
In theory it should be possible; seems I've just not got some ordering or something set-up how it needs to be...
For now I've kept it non-frozen in those modes.
     
  I've still got various problem cases to work through with the option overrides system, but it's basically working and I'm pleased with it.
It also seems that updating render target options on the fly isn't as complicated as I might have thought.  The simple brute-force version is just an invalidate-reset-restore of the device, same as what's done in Reload and on alt-enter.
So I'll get that working at some point in the next couple of days.  It's good to see the menu functionality edging towards completion.
     
10-juin-2008   4,5    
#revision 1343 Motion blur smearing now weakens, at the tail, down to one step above the strength of the previous frame's smear head (so there's a continuity of strength between frames).      
#revision 1344 Font: added new characters: Œ œ      
#revision 1345 CMISpinner and CMISlider now support ints.      
#revision 1347 Added two new motion blur options: "Blur amount (eye)" and "Shutter angle (film)"      
  Duh, I had completely forgotten that I have a CMotionBlur that looks after the motion blur (shader constants etc)      
#revision 1348 Grr, the cost of the motion blur doesn't seem to be affected by the number of samples I'm telling it to use (per pixel).  That's annoying.

So it's currently faster to take the full number of samples regardless of speed.  I've now changed it back to doing that.
     
  Eye-style and film-style motion blur both work correctly now.      
9-juin-2008   3    
#revision 1340 MotionBlur.fx, Velocity.fx:
The number of samples per pixel for motion blur is now influenced by the pixel's screen-space speed.
This is the way it was always supposed to work - where nothing's moving, the motion blur only uses one sample.
The 'distanceForMaxSamples' option now works.
<-didn't work as an optimisation so I've changed it back (10th)
     
#revision 1342 Motion blur smearing is now weighted so that it's weaker at the tail.  It weakens down to one step above* the strength of the previous frame's smear head (so there's a continuity of strength between frames).
C:\noctambule\debug\9_6_8_newMotionBlur.psd

It was faffy to get this working, because the compiler was being silly.  I found that BlurPixelShader would only work when I calculated 'totalStrength' using a formula rather than incrementally.  If I calculated it incrementally, I could output it and see it had the right values; I just couldn't divide 'frameRGB' by it without getting a complete malfunction.  (????)
     
  *(above) : todo<-done(10th)      
8-juin-2008   8    
  Weapon #1:
Classic Star Wars type blaster or 'laser gun' - it shoots streaks of light that cause sparks when they hit.
I'll have my streaks in blue, please.  The gun itself could be a handgun with a brushed aluminium finish and a few little LEDs...
This is the 'pop gun' that you start with or that you find easily at the start of the game.  But its effects need to be totally impressive and satisfying - first impressions and all.
     
#revision 1334 Added BlasterEffect.cpp & h: Class that contains, updates and renders all blaster weapon effects (CBlasterEffect)
There's one instance of this class, belonging to the CModeEnvironment instance.

I expect "later on" the actual weapon objects that you pick up and use will be called CWeapon, with subclasses like CBlaster / CWeaponBlaster / CBlasterWeapon.
     
  Added SEnvironmentRenderData::luminousWeaponEffects
This category includes blaster streaks, explosions, electricity, etc.
     
#revision 1335 Master builds: Added NDEBUG to the preprocessor line in the project settings.  This turns 'assert' calls into ((void)0)
NB - This could easily cause hiccups for the next master build - need to test it!!!
     
#revision 1336 Added Blaster.fx, the shader effect used for BlasterEffect.  ESHADEREFFECT_BLASTER      
  BlasterEffect draws into ERENDERTARGET_MOTIONBLUR, between the two passes of ESHADEREFFECT_MOTIONBLUR.
The first of those passes forms a motion-blurred HDR image of the scene on ERENDERTARGET_MOTIONBLUR.
The second of those passes applies the motion-blurred scene image into the HDR backbuffer (frameRT).
Secondary motion blur is applied much later, in HDR end-scene, and it includes the blaster streaks.
BlasterEffect is my first post-motion-blur-pre-HDR effect.
     
  Eye-style motion blur (ie. leaving traces of the previous frames as well as smearing each frame) is now working - yay!  Looks nice.  It will look amazing when it's combined with some shaky cam / wind buffetting.      
  Alt-tabbing to the game in fullscreen mode now calls Reload if required.<-not working yet - get this working and get it clearing the HDR backbuffer reliably!  (CNoctambuleApp::VirtualRestoreDeviceObjects)      
7-juin-2008   10,1667    
  Changed the strereo mode names in English (including the enum names) to be more conventional:
"split left-right" -> "side-by-side" ESTEREOSCOPYMODE_SIDE_BY_SIDE_(1/2)
"split top-bottom" -> "over-under" ESTEREOSCOPYMODE_OVER_UNDER_(1/2)
     
#revision 1325 Added a new stereo mode: "over-under gap" ESTEREOSCOPYMODE_OVER_UNDER_GAP
This is the same as over-under but with a black bar between the views.
The size of the bar can be controlled from the stereoscopy menu ("over-under gap size").
The default gap size is 0.041015625 (42 / 1024.f).  This is based on information about the AnotherWorld Inc. "Another EYE 2000" glasses which need a gap of that size when in under-over mode using its sync-doubler, at 60Hz at least (info from Tril on mtbs3d.com).
     
#revision 1326 UtilWarning now displays a warning icon instead of an error icon.
UtilWarning is used when the player's custom profiles are using out-of-date option names.
     
#revision 1327 Added UtilDrawOverUnderGapQuad (similar to UtilDrawHalfScreenQuad but applies the over-under gap size).      
  Tested that the default "over-under gap" mode produces views 491 pixels tall separated by a gap 42 pixels tall.
C:\noctambule\debug\7_6_8_overUnderGap.psd
     
#revision 1327 Compared a grab of "over-under" with a grab of "over-under gap" using a gap size of zero.
This showed that the bottom quad drawn by UtilDrawHalfScreenQuad (over-under) was one pixel too tall at the top -> now fixed.
C:\noctambule\debug\7_6_8_overUnderGap.psd
This PSD also shows that the X positioning of the quads is correct.
     
#revision 1328 Added g_game.flags.clearLDRBackbufferOnce.  This is needed for the "over-under gap" mode, to clear the gap to black.  Could be needed again for other stereo modes later, or for film borders etc.
It uses the current backbuffer count to clear as many times as it needs to, on consecutive frames.
See also: g_game.clearLDRBackbufferOnce_count
     
  TODO?: 'ground casts shadows' option should apply to fallback shadows as well?      
  Ooh, just noticed these:
D3DBACKBUFFER_TYPE_LEFT
D3DBACKBUFFER_TYPE_RIGHT
I expect those are what you use for the VBE 3 hardware page-flipping thing?
From the DX 9 doc for IDirect3DDevice9::GetBackBuffer:
"
Stereo view is not supported in Direct3D 9, so the only valid value for this parameter is D3DBACKBUFFER_TYPE_MONO."
     
#revision 1329 Tested that the multiply mode was working properly in render target options, by setting frameRT:[/1, *0.4794921875] to match up with the "over-under gap" default gap size.  At 1280x1024:
"EResolutionMode::frameMultiplication 1024 * 0.479492 produced result 491"
491 is the correct result.
     
  Wrapped the printf above in a RENDERTARGETOPTIONS_DEBUG define.      
#revision 1330 The stereoscopy menu now contains a duplicate of the 'interpupillary distance' spinner (from the real-world menu).
All that was needed to keep the two spinners in sync was an on-change callback that calls SetupVariableVerts on the other spinner.
     
#revision 1331 Realised that sprintf's default precision for a float is SIX decimal places, not ALL decimal places.
This was causing precision to be lost when saving options.
I've now changed it so that floats, matrices and render targets save to the text files using %.8f instead of %f
     
#revision 1332 Setup:
The Custom.txt that gets included in builds is now a copy of Custom_SHIPPED.txt.
This is blank apart from instruction comments.  Currently, instruction comments are lost each time Custom.txt is saved from the game - hence the need for this other version of the file.
     
  Setup: As of version 17.4, the game install includes complete source code (C++ and HLSL).
The only files that are excluded are
- string table (in-game text) files - they will be included once they're finalised;
- confidential material.  Currently, the 3DVisor interfacing code falls into this category, but that might change because I think the eMagin SDK is now completely public (TODO: check).

NOTE: The code is
not shipped in a ready-to-run state (no project files, etc), although eventually I would like to make it ready-to-run, so it can be used as an engine for new VR-ready games (how cool would that be).  Currently it's there for:
1. reference, to assist other programmers.  No point re-inventing the wheel.
2. inspection by the target audience.  I want them to see that my code is (hopefully) well-designed, well-written and well-commented.  I'll also be putting the code online as nicely-formatted HTML very soon.
     
#revision 1332 Moved MatrixDeterminant out of the project (into stuff.cpp).      
  French code site, with French comments etc, handy:
http://files.codes-sources.com
     
#revision 1332 Removed ESHADEREFFECT_ANAGLYPHFRAMECOPY from the project.      
#version 17.4 Released version 17.4      
  Forgot to make the '1' versions of the split-screen stereo modes left-eye-first.  Will probably do that next time.      
  I've not spent today very productively - really just added the 'over-under gap' stereo mode and done some housekeeping.      
  Tomorrow, I should start on weapons.  Flashy lights and explosions...long overdue.  I can't wait to see how this stuff turns out.      
  Started chipping away at the code converter tool...but I've run out of steam for today.      
5-juin-2008   3,5    
  TODO based on v17.2 feedback:
- option to make the game speed framerate-independent even at very low framerates (disable the current 20fps floor).
- line sequential 2 (right eye first) seems to be the one that works for Zalman monitors??
     
  Realised that the checkerboard mode isn't optimal with a half-by-half frameRT.  So the masking wants to be done during the main rendering, not at the end of the frame.      
  Files currently excluded from source install:
3DVisor.cpp
3DVisor.h
Strings.h
StringsFrançais.hpp
StringsEnglish.hpp
     
  Both/any setup projects now use the following graphics:
website\new\favicon.ico (the game also gets it from here when it builds).
C:\noctambule\setup\banner.jpg
     
  Decided to ditch the source code install and include all the source in the game install instead (with the install folder strictly matching my working copy).
The source is only about a meg, and I want my target audience to be able to inspect it as easily as possible.
Eventually, I might want to make the whole installed project compilable, so you can download it and compile it just like that.
     
4-juin-2008   6    
  3DDLP info:
http://www.dlp.com/hdtv/3-d_dlp_hdtv.aspx
C:\noctambule\3dtv\3ddlp
     
  DLP (checkerboard): Left image goes first (top-left pixel is for the left eye).      
  Zalman (interlaced): Also left eye first, I think.      
#revision 1318 UtilDrawScreenQuad now takes a parameter to specify that full-res half-pixel offsets (positive) should be applied to the UVs.  This defaults false; TODO: the function should use the res of the current render target.
Tested line-sequential on master and slave at 1024*768 fullscreen.  Left eye is first on both, as intended.
     
  Added Chequer.fx, the same as Interlace.fx but performs 'checkerboard' masking, eg. for 3D DLP displays.

For anyone even more pedantic than me:
'Checkerboard' is the term used in the DLP whitepaper.  It's an Americanism but it's simply the term that's used - don't blame me ;)
     
#revision 1319
#revision 1320
CModeHUD::Render: Improved stereo-related bail-out conditions for the crosshair.
I will get the crosshairs working properly in all stereo modes, one day.  They do draw in checkerboard mode, but not line-sequential (because there'd be a big discrepancy between the eyes).
They don't draw in any stereo mode when using a head-mounted display.
     
#revision 1321 CMenuTree::Render now takes into account swapped stereo eyes (hasn't needed to until now).      
#revision 1322 Added checkerboard stereoscopy modes: ESTEREOSCOPYMODE_CHECKERBOARD_1 / 2      
#revision 1322 The following stereoscopy modes now have a '1' version and a '2' version.  The '1' version is the more conventional configuration; the '2' version swaps the eyes:
- split left-right
- split top-bottom
- checkerboard
- line sequential
- frame sequential
     
#version 17.2 Released version 17.2      
3-juin-2008   0    
  Version 17 bugs:
1. On Quadro, stereo interlacing isn't right.  (screenshots: C:\Noctambule\Builds\17_0\quadro).  I only had a very quick look at this at work.  I'm pretty sure it was happening in fullscreen as well as windowed, but the fullscreen grab (1280*1024) is fine (??)  In the windowed grab (800*600) there's about nine faulty horizontal lines.
Could Quadro be using strange pixel centres?  I gather some graphics driver control apps let you control this.  That would break all sorts of stuff.  Could the monitor be doing some strange scaling in fullscreen mode?
<-fixed in v17.2 (I had forgotten my half-pixel offsets again).
2. At work, I got the startup message that
shoot.wav couldn't be found.  But the file was in the right place.
     
  TODO, based on v17 feedback:
- start option to launch in English.
- language flags (in speech bubbles?) on the pause menu?
- fix the resolution spinners so they give you proper resolutions - several people have mentioned this.
- ability to type values into spinners and combos.
- auto-sizing of the frame RT based on stereo mode
     
2-juin-2008   5,5    
  The new graphics folder layout (see 29th May) can wait till version 18.      
#revision 1307 The crosshair is now not drawn in the various stereoscopic modes in which it doesn't yet appear the way it should.  This is temporary, just till I fix it to draw properly in those modes.      
#revision 1308 Split-off my placeholder car into a new max file (graphics/objects/vehicles/AudiTT.max).  The only thing it has in common with an Audi TT is the dimensions.  Still, it's always seemed too small somehow (I'll investigate this).
The car is now XRef'd into leam.max.
     
  Instances: Ran into another auto-parenting problem case: the new instanced car outside Regent St. was becoming a child of a drainpipe; the drainpipe is culled when its CullPlane is backfacing....      
  Had some last-minute problems with the instanced placeholder cars (strange normals), so instead I dug-out the v15.1 level and used that for v17.0.      
#version 17.0 released v17.0      
1-juin-2008   4,83333    
  Below: another nice French technical dictionary site:      
  http://dico.developpez.com/html/      
#revision 1298 Menu: Change of language is now working correctly as far as the main menu-item text is concerned (apart from bounds).      
#revision 1299 Menu: Change of language is now working correctly as far as the circuitry is concerned.
Also refactored CM