HOME | Jump to snapshot:

# asteroids3d/cakeday Changelog

[18/01/2009] Snapshot 19 -
- New kernel loop and frame event layouts. Timing is now on a per-second, rather than
  a per-frame basis, and only physics ticks solely on keyframes; game logic, object
  updates and rendering take place as often as possible, with results determined by time
  passed since the previous iteration.
- New driver-independent Window interface means Windows/Textures/VBOs can be implemented
  by OpenGL, DirectX or dummy modules as required. Also Textures and Geometry no longer
  depend on the window interface.

- Altered renderer and geometry structure to use vertex arrays (and vertex buffer
  objects, where possible) for sending mesh data (actors and skysphere) to OpenGL.

- Added asynchronous (multi-threaded) geometry loading mechanism so that initial load
  doesn't freeze the graphical interface.
- Altered font renderer to use cached textures rather than per-point shading.
- Created new dynamic lighting system capable of placing lights within particles and
  beams, and of displaying lights physically. Objects are now rendered with smooth shading
  up to a predefined visible distance, but flat shading can be used by specifying
  "-flatshade" on the command-line. Diffuse material properties are handled
  properly. Uses light virtualisation system which applies only the effects of the 8 most
  influencial lights to an object (saves valuable processing time by ignoring potentially
  negligible light sources, and also sets us up for future work with hardware shaders which
  tend to only accept up to roughly this many lights at any one time).
  Speculars don't yet work.
  Particle lighting is available via "lightParticles" environment flag, but [a] particles
  tend to get easily saturated in distant light so close lights are hard to detect without
  hacking down the light list, and [b] the algorithm is far too slow for software rendering
  and we don't have any implementation of hardware shaders yet.
- New driver-independent SoundEngine interface means audio can be implemented by OpenAL or
  dummy modules as required.
- Implemented key mapping in InputHandler. Although there is no interface through which the
  player can manipulate control layout, this is the backend preparation for that feature.
  Also created double-click/double-tap detection mechanism.
- Added left/right/up/down/behind camera angles as well as a zoom control for Follow mode.
  Switching between camera angles is done in a visually smooth, sweeping manner.
- Added autospin on double-tap IA_YAWLEFT|IA_YAWRIGHT and autoflip on double-tap
  IA_PITCHUP|IA_PITCHDOWN. The autospin is a BSG-style 180º yaw with some stylistic roll,
  while the autoflip is a BSG-style 180º pitch with roll correction, similar to a real-life
  Herbst maneuver (but can be performed stationary or while gliding).
- Added thrust maneuver to vehicles on IA_THRUST (default ).
- Changed order of colour parameters in colour_t type from ARGB to RGBA. This is more
  standard and allows faster alpha blending.
- Moved Beam collision detection logic to Vector::shortestPathToLine(Vertex,Line) and
  re-used it in light spread calculations for when a beam is a light source.
- Increased quality of texture blending.
- Added header dependency generation and automatic version counting to Makefile.
- Halved memory requirements of MMPointer and replaced explicit pointee compatibility check
  with basic assertion.
- GameEnvironment::updateEntities no longer iterates over a copy of the actor list, but
  over the live one. An assertion is in place to test long-term whether any actor->frame calls
  lead to (illegal) modification of the list during this iteration. The Server will no longer
  be responsible for removing objects from the environment: this is performed by the update
  step in a seperate iteration.

- Created command-handler and some basic commands that can be used in-game from the chatline
  (and, eventually, the engine console directly) to list/spawn/kill entities, set/change
  environment variables, register geometry and such. This will in time form the basis of an
  entire scripting subsystem.
- Fixed obscure crash-on-exit bug: geometry name->object map got cleaned up after the
  kernel had deleted all remaining memory managed objects, assuming they had been left
  behind by naughty parents.
- Fixed another crash-on-exit bug: collecting remaining MMObjects at program end iterates
  through livelist, but calling destructors on objects within the list may affect the list
  itself (when child MMObjects get released), invalidating the iterator.

- Fixed bug: TimerClients that do not explicitly unregister their timers before destruction
  could cause a crash in the next tick. TimerClient destructors now do this implicitly.

- Added thread-safety to output streams interface.

- Added onscreen graphical profiler, activated with '#' key.

- Altered debug mode so that ALL debug messages are sent to on-screen console, and increased
  the number of messages that remain on-screen in debug mode has been increased to 16. This
  should help to end reliance on an OS-provided console window for reading debug messages.

[16/08/2008] Snapshot 18 -

Game engine updates:

- Fixed skysphere creation code, and employed new 'galactic centre' background.
- Updated proximity indicators with textured frame.
- Moved trail hotspot on Raptor lower and removed one of its gun turrets.
- Removed version, fps and clock information from main screen and moved to loading
  screens and debug pane.
- Added 'side' vector values to orientation messages. Three extra floating-point
  numbers doesn't use enough bandwidth to warrant asking clients to orthonormalise
  a 3x3 matrix after every state change received.
- Changed behaviour of HUD 'beep' so that it does not play on every keystroke
  during chat input.
- Distance indicators now fade with distance from ship, as well as 2D distance from
  screen centre.
- Disabled vehicles emitting jet trails when in manual mode.
- Fixed framecount timer never incrementing internal frame count when running server
  in background mode. This primarily affected weapons fire and AIs.
- Fixed client ship may be able to keep weapons after death.
- Fixed enemy ship fire not appearing on client.
- Fixed rockets not dying on client once dead on host.
- Fixed smoke trails not showing up on client.
- Fixed client ship being locally uncontrollable.
- Fixed background music commands not propogating over network.
- Fixed sound effects and smoke trail commands not propogating over network.
- Fixed clients not being granted correct weapon set, and not being able to change
- Fixed many other network play problems.
- Fixed issues raised by allowing capslock to produce distinct keypresses.
- Fixed default random player name always being "Player467" (was seeding PRND too
- Added more `catch` blocks in main.cpp to report more specifically on library
- Re-wrote geometry file parser for better speed and error handling.
- Added remote commands via chat to spec. Players can now enter /top10, /admin or
  /whoami in their chat line to access those commands in the same way that can be
  done from within a terminal client.
- Added text-wrapping capabilities to renderer. Mostly useful for console/screen
  output when incoming chat/server text is long.
- Reduced the size of jet trails for vehicles.
- Fixed segfault when throwing an exception from the constructor of a memory
  managed object, by adding calls in MMObject's virtual destructor to forcibly
  remove the object from internal lists.
- Dust particles are now always visible regardless of local speed.
- Added high-score table to GAME OVER screen.
- Added new jet gas exhausts for vehicles.
- Fixed unknown library exception sometimes causing game to fail at the loading stage,
  possibly due to bad iostream coding when reading from highscores.dat.
- Added sound device selection menu to standard output on engine start-up.
- Fixed rogue exceptions being thrown when vehicle model specifies only one cannon.
- Added "demo modes" DEMO_BASIC (simple models, no Asteroids/AIs) and DEMO_TARGET
  (real models, one asteroid) to program. Normal play is DEMO_FULL.
  Activate with the following command-line options:
   * DEMO_BASIC:  -demo 1
   * DEMO_TARGET: -demo 2
   * DEMO_FULL:   -demo 3 (default)
  "-demo" alone will produce an input prompt from which the user can pick a mode.
- Added -wireframe switch to commandline options.
- Created Windows/Linux Makefile.
- Added Beam entity type and BeamCutter weapon, with associated collision detection
  routine and handler.
- Removed sound effect from beam fire and impact.
- Enabled anti-aliasing for RADAR and beams.
- Fixed HUD speed indicator going red occasionally when speed is at max but is not
- Added MMPointer sanity checks so that NULL entries in actor/nonactor registry lists
  do not cause horrible exceptions to get thrown about the place.
- Fixed OS-created repeat keyDown events re-firing non-chat engine events (specifically
  Fire events with repeat flag false, so missiles could be repeat fired by OS-invented
  keypresses whilst 'x' key depressed).
- Moved ALC, advanced string operations, , , ,  and
   includes out of defs.hpp.
- Implemented John Carmack's fast sqrt() function from Quake.files.
- Added debug message for when clients disconnect, in order to better diagnose a recurring
  random /part problem, and additional messages upon certain entity death conditions.
- Deprecated _DEBUG constant and replaced with usage of fixed DEBUG variable in makefile.
- Fixed timing bug; on systems with CLOCKS_PER_SEC != 1000, all timers would have startTime
  far in the future, and consequently all events would appear to fire undelayed.
- Added SIGINT and SIGTERM capturing to kernel idle loop, so the application can shut down
  gracefully after a ^C.

[14/04/2008] Snapshot 17 -

Game engine updates:

- Textures are no longer loaded if the server is running in background mode
  (which would be a waste of time, memory and effort).

- Added commands to cmp (cakeday Messaging Protocol) to allow remote
  administration of the game, such as remote shutdown and booting badly
  behaved players.

- Server_Host TCP/UDP networking implemented with numerous amendments to
  the protocol. The mechanism for functionality through the Server_Guest interface
  is in place, although it is currently too buggy to play as a remote player.

- Tidied Application, Powerup and Entities code for faster compilation and
  ease of modification. Code in headers is A Bad Thing™.

- Moved Camera from Application to GameEnvironment.

- Added string explode/implode functions.

- Fixed bug: actors sometimes triggered world-radius bouncing under
  supposedly non-candidate conditions (when stationary).

- Changed on-screen notification area to display notices in downwards
  order, rather than upwards.

- Added rudimentary, function-less mouse cursor visible during all states
  when not playing, i.e. CONNECTING, LOADING, ENDED and DISCONNECTED. This
  is to reassure the user whilst the window is otherwise not doing much.

- Fixed mouse pointer jumping when resuming a paused game.

- Dust now only appears if the camera is moving above a certain velocity.

- Fixed chronic slow-down: was only half using memory management on
  particles within particle systems: storing them in object lists but not
  performing clean-up operations on them. The particles were destroyed by C++
  as they are not stored as pointers inside particle systems, but references
  remained within IMMObject::liveObjects, causing meaningful operations on this
  list to become progressively slower. The actual memory leak would have been
  in the order of a mere 10KB every three minutes or so, which is why it went
  undetected for so long.
  Remedied this with a bit of a nasty hack in IMMObject, providing a relinquish()
  function which instructs the memory manager to relinquish control over an
  otherwise memory-managed object. Then it can be safely removed from a STD data
  structure such as a vector with neither a dangling list entry nor risk of
  attempting to double-destroy it.
  This non-memory managed behaviour of otherwise memory-managed objects can also
  be invoked by sending 'true' to the second argument of Entity's or IMMObject's
  constructor, or to the fourth argument to Particle's parameter.

- Added on-screen message input function.
   * Press 'c' and start typing then press  to send, or  to cancel.
     Backspace works too.
   * Camera view can now be changed by pressing 'v'.

- Renamed IMMObject and CMMPointer to MMObject and MMPointer respectively, to
  retain consistent class naming.

- Altered on-screen clock to display hrs:mins:secs rather than mins:secs.millis.

- Added 'spectate' functionality to camera which randomly alternates between
  view modes and tracked objects whilst the player's ship is dead. There is a
  delay before this comes into force after the player's ship dies, so that
  spectate doesn't begin during the default three seconds before re-spawn.

- Fixed miscellaneous bugs in vehicle/AI/input/bullet/particle timing when
  frame rate is compensated.

- Procured new "missile" geometry. It's still just a cylinder but it's better
  than what we had.

- Fixed geometry loading bug: hotspot and gun vertex information was unaffected
  by scale/rotate/translate adjustments.

- Fixed bug: vehicles would sometimes spawn with velocity due to bad error
  checking in InputHandler; this velocity would be invalid and the ship would
  fly skewed. Very annoying.

- Streamlined GameEnvironment by moving explosions to Server and removing some
  redundant passages.

- Implemented sound engine capable of playing background music and sound effects.
   * Press 'm' to toggle muted sounds.
   * Call application with the '-nosound' command-line option to disable sounds

- Fixed Remote Missile sometimes detonating on top of ship that fires it.

- Fixed cloaked ships showing up on RADAR and other HUD elements.

- Fixed lower-right hand corner 'about' text appearing brighter than usual whilst
  game is paused or ended.

- Fixed HUD showing spatial information relative to the local player's ship,
  irrespective of the entity that the Camera is currently following. This was most
  apparent after Game Over when the camera may be following a third-party ship with
  the HUD up.

- Small efficiency improvement in RADAR generation code.

- Small improvement in resolution of AI roll matching.

- Increased gamearea size and maximum ship speed to give the impression of greater
  movement and a faster game pace.

- AIs seem more intelligent by compensating for their own velocity when turning to
  face/track a target to shoot (bullets inherit source velocity so they 'drift').

- Re-arranged loading/status screens and added game logo.

- Tidied textual status output with the aid of new text alignment routines.

- Fixed bug: attempting to load a malformed texture file or create a texture from
  invalid parameters previously resulted in a segmentation fault. An exception is
  now gracefully raised. Also, invalid geometry textures are reported only on the
  first rendering attempt, and are then flagged as do-not-render so that the console
  is not flooded with exceptions for all time.
  Model files have been updated to request 24 bits per pixel texture loading, rather
  than the erroneous 32 bits per pixel previously stated.

- Added distance drop-off to lighting model.

- Added new 'pulsating' god-mode effect.

- Adjusted ship models: colmftr1cox pitched up slightly and had its gun turrets and
  smoke emission points tweaked.

- Created new type of timer -- framecount -- to supplement realtime clock in timing
  asynchronous events. Used this for AI timers (because they are heavy and can cause
  recursive bottlenecks if there's any strain on the system) and gun fire delay.

- Created exception for weapons inheriting the velocity of their source for Beam Guns,
  as the low speed of beam particles made them look pretty odd when fired at certain
  orientations relative to direction of movement in manual velco mode.

- Added playername indicators to HUD.

- HUD indicators now fade out slightly the further they are from the reticle (screen
  centre). This is to reduce clutter on the HUD.

- Implemented template-templated implode() function and used it to build framework for
  more advanced console messages.

- Added colour formatting to HUD text rendering. Style is similar to that of mIRC, use
  \x03 followed by C (where C is a number 0-15) to render the remainder of the string
  in the colour defined by C on a 16-bit indexed colour chart. Use \x0F to render the
  remainder of the string in the colour originally passed as an argument to writeText.

- Added timeout to on-screen notices to reduce HUD clutter.

- Sound now controlled by game, not the engine. Added sound commands to CMP spec.

- Moved all weapon-related code from Vehicle to Actor. Fixed Actors being allowed to fire
  with a given type of weapon after it has been revoke()'d.

- Created interfaces to visual effects related code (explosions, implosions, trailsmoke
  etc) in the server.

- Moved memory management call from game loop to seperate 10 second loop. This reduces
  the risk of dying actors being deleted on a Guest before the explosion command is
  received. The explosion function requires access to the original actor for position
  and geometry information.

Game updates:

- Altered command-line syntax again, allowing all parameters to be optional.
  The new syntax is as follows:
  asteroids3d.exe [-single|-multihost|-multiguest] [-ip ] [-port ]
                  [-bg|-window|-fullscreen] [-debug] [-notrails] [-fps ]
                  [-name ]

[05/04/2008] Snapshot 16 -

Game engine updates:

- Achieved speed, effiency and memory footprint improvements by abandoning
  all double-precision variables for typical floating-point numbers, and
  replacing Particle's transformation matrix with a position vector (since
  particles can have no rotation component). This involved modifying the
  structure of all Entities and eventually even led to some algorithmic
  simplification in the collision detection code.

- Fixed bug: using ship thrust controls before game was fully loaded could
  result in the player's ship spawning with an incorrectly oriented

- Sped up Transform inverse operation by eliminating calculations rendered
  unneccesary by the assumption of a [0,0,0,1] bottom row.

- Fixed physics bouncing giving ships excess velocity when in manual velocity
  correction mode.

- Implemented AI interface so that the engine has some knowledge of how to
  handle playerless vehicles.

- Fixed frustum culling filter ruling out some smoke particles incorrectly.
  This was made obvious by the fact that the player's ship's jet trail was
  cut off above the window edge.

- Added self-destruct mode to ship. Press 'd' to activate.

- Changed the way kills/deaths are reported textually through the server chat

- Added jet trails to rockets.

- Misc bug fixes relating to application/game state consistency.

- Some efficiency improvements in collision detection algorithm.

- Adopted convention of pre-incrementing iterator counters in loops for added

- Some speed improvements in the Cinema camera.

- Moved score control to Server and implemented high-score table. (Not
  visible yet.)

- Added screenshot function.

    * Press key F9 to take a screenshot.

- Fixed bug: position of HUD speed indicator remained horizontally fixed even
  when window was resized.

- Added upper limit to mouse-control of ship orientation.

- Fullscreen mode now retains the screen's existing resolution, allowing the
  use of fullscreen mode to improve visual quality.

- Speed indicator turns red in case of overflow, for example if bouncing has
  temporarily made the physical velocity in excess of the ship's natural maximum

- Miscellaneous re-workings of code to prepare the infrastructure for the
  user being able to choose game mode at application start.

- Added 'pause' feature; press 'p' to toggle game pause.

- Fixed bug: passing around CMMPointers to Weapon which was not of type
  IMMObject (memory managed object) and statically casting to IMMObject for
  cleanup caused a variable override. This caused some pointer dereference errors
  internally. Weapon now has IMMObject in its inheritance tree.

- Fixed bug: fatal errors would crash the process during destruction, due to
  accessing the kernel's debug output stream after kernel destruction.

- Added subdirectory structure to code base and seperate WinInterface into
  component classes for convenience.

- Altered compiler options and replaced dynamic libraries with statically-linked

Game updates:

- AIs hunt Asteroids, collect powerups and chase/attack other vehicles.
  They even mimic the roll orientation of their targets as closely as
  possible, giving a semi-realistic impression of a semi-intelligent pilot!

- Added temporary 'game over' screen when three deaths have occured. To be
  disabled for Arena play once implemented.

- Users must now choose between -fullscreen and -window command-line options. This
  enables packages to distribute a pre-built Windows shortcut with pre-set options,
  which users who aren't aware of the fullscreen choice will be provoked into using.

- Added new game mode command line options to specify whether the user wants to
  player a singleplayer game or a multiplayer game and in the case of the latter,
  whether the user wishes to host the game on his own client or if he wishes to
  connect to a game server elsewhere via TCP/IP. The user can also now specify their
  player name.
  The new command-line syntax is:
  { -single  | -multihost  {  | -bg } | -multiguest    }
  { -fullscreen | -window } [-debug] [-notrails] [-fps ]

[25/03/2008] Snapshot 15 -

Game engine updates:

- Implemented complete bounding-sphere collision detection algorithms.
  Polygon-based algorithms in place on standby; pretty slow but they work.

- Added powerups: score boost, health boost, extra live, god mode. Includes
  visual 'implosion' effect when a powerup is picked up, colour differing
  per powerup type.

- Replaced RADAR with new, working version.
    * Cycle through three radar ranges by pressing 'r'.

- Misc HUD adjustments.

- Fixed normal vectors being stored pointing in the wrong direction (and
  changed all uses to compensate, namely explosion/implosion creation and
  backface culling.)

- The attached game is now responsible for creating light positions, and the
  game environment owns them, rather than the renderer.

- Misc lighting fixes.

- Added cinematic camera mode which produces an automatically updated, fully
  third-person vantage point tracking the player ship from a distance.
    * Cycle through STATIC, FOLLOW and CINEMA by pressing 'c'.
- Added option to set gamearea radius at game load-time.

- Added capability to automatically spawn actors at the gamearea boundary,
  heading towards the centre. This should be the automatic spawn mode for
  players and AIs.

- Added geometry compensators to cakeday Model Format (.cmf). New syntax:
    * adjust rotation   
    * adjust translation   
    * adjust scale 

- Added support for mousewheel, which cycles through the player's vehicle's

- Altered explosion effects for actors so that geometry vertices appear
  to expand and vapourise.

- Added new "strafe" and "lift" attitude handlers. Controls are now:
    * 'a' to accelerate
    * 'z' to decelerate
    * keypad -/+ to lift
    * keypad 7/9 to strafe
    * keypad 4/6 to yaw
    * keypad 2/8 to pitch
    * keypad 1/3 to roll

- Added vehicle state markers to Vehicle class:
    * auto velco
    * trails
  Including some new vehicle state features:
    * stalled
    * invisible
    * invincible

- Organised weapons into groups named by their respective launchers:
    * Shooter (Railgun, Beam Gun, Magnetic Charge)
    * MissileLauncher (Missile, Seeker, Remote Missile, Nuke)
    * MineDropper (Proximity Mine, Timed Mine, Remote Mine)
    * EMPGenerator (Electro-magnetic Pulse)

- Implemented trajectory & remote missiles with basic geometric models.

- Added weapons indicators to HUD.

- Added velocity correction toggle callback to right mouse button.

- Fixed target velocity being displayed on HUD when in manual mode.

- Explosions now inherit the velocity of an actor parent, if applicable.
  This makes them seem more realistic.

- Ensured that only Vehicles get bounced back at the game area edge. All
  other actors (such as floating powerups, projectiles and asteroids) are
  immediately killed.

- Dead ships drop their weapons as a weapons powerup. This keeps weapons
  in the game despite frequent deaths.

- Fixed impact health loss calculations (mainly by deleting the mass

- Fixed defensive strength value not being read in from cmf models.

- Added multi-texture modelling. This is mainly for barrel powerups which
  come with three different textures but we do not wish to triplicate
  geometry unneccesarily.

- Updated cmf spec (cakeday model format) to include adjustments and
  multi-texture models.

- Update cmp spec (cakeday messaging protocol) to include weapons and

- Added 'range' and a central point to particle systems to better control
  particle visibility.

- Implemented dust field.

Game updates:

- AIs spawn at game area and head straight through the game area, bouncing
  back at the game boundary. This allows easier testing of various
  elements of game functionality pending the design of realistic AIs.

- Floating Missile weapon powerups appear every 50 seconds and pass through
  the game area.

Known issues:

- The dust field is always visible regardless of the ship's speed; also it
  appears to move very slowly because of the game's unit proportions. All
  dimensions/speeds will have to be increased to give a faster feel to the
  game. Also, particles in the dust field at the visibility boundary simply
  *appear*, rather than fading in elegantly.

!Snapshot does not include libs required for compilation!

[18/03/2008] Snapshot 14 -

Game engine updates:

- Dynamic texture loading based on information found in geometry model
  files. Consequently, the cakeday Model Format has changed spec again.
  New syntax:
    * set texture      

- Added loading screen which displays between window creation and first
  scene render. i.e. whilst textures and geometries are being loaded.

- Re-added average framerate indicator to HUD and moved calculation to
  a decent place in the Application code.

- Fixed call to glutInit() unpredictably crashing due to uninitialised
  fake argc/argv variables.

- Added graphical Auto/Manual velocity correction indicator to fixed

- Added concept of 'mass' to geometry models, so that larger objects
  require more firepower to damage/destroy.

- Added concept of multiple weapons. Switch between guns with apostrophe
  ("'") key.

- Changed velocity correction / camera mode change notices to debug
  messages, so they generally won't clutter the screen up (which is
  largely unneccesary now thanks to the new HUD elements).

- Adjusted mouse movement response so that ship rolls as well as yaws
  with horizontal movement. This produces a more realistic turn motion.

- Added concept of 'players' and added local player's score and death
  count to HUD.

- Re-wrote Freetype interface so that rendering text is /far/ more

- Clicking now instructs the ship to fire as well as holding down the 
  mouse button. There may be a small difference between the two events
  if a mouse click is very short.

- Fixed bug: Speeds did not scale properly with frame rate.

- Fixed bug: Pressing 'z' to decelerate when ship not oriented with
  [x,y,z]=[0,0,-1] caused target speed to fall directly to 0.

- Added gamearea boundary: if vehicles are flying outwards and pass the
  1000 units waymark, they will automatically have their course/orientation
  reversed. This is the same behaviour as for boats in GTA:VC.

- Fixed bug: Coming out of manual velocity correction mode into automatic led
  to strange flightpath whilst re-orienting.

- Added realistic 'bouncing' reaction when two non-bullet objects collide.

- Added "normalInvert" parameter to .cmf format, to be used in case a model's
  faces have been specified in terms of vertices given in clockwise order
  rather than anti-clockwise.

- Implemented manual backface culling and lighting algorithm. OpenGL's lighting/
  materials engine is no long used.

- Implemented frustum culling. There remains a small bug in that all eight
  corners of an actor's bounding box must be within the frustum for the actor
  to be rendered. Fringe cases such as bounding box line intersection have not
  yet been considered.

Game updates:

- Automatic spawn timers. Will auto-respawn any Actor after 4 seconds,
  using a list-managed queue of timer IDs. Maximum of 100 pending re-spawns
  available at any one time.

- Fixed re-spawned AI ships flying off into oblivion.

!Snapshot does not include libs required for compilation!

[08/03/2008] Snapshot 13 -

Game engine updates:

- Massive game engine redesign: now utilising server/client paradigm
  providing multi-player arena capability from the ground up.
  See documentation/report for layout/structural descriptions.

- Textured skysphere (buggy texture wrapping at present).

- Support for textures within geometry models. (Texture loading not
  yet dynamic.)

- New, textured BSG ship models.

- Extended output text functionality. There are now four seperate streams
  available for output:
    * OS_DEBUG
  This allows the renderer to display notices intelligently based on their
  importance and context. For example, only OS_NOTICE text is always 
  displayed in the top-left corner of the screen (for notices such as camera
  changes, players leaving/joining, chat messages). OS_DEBUG text is only
  shown if the debug mode is on.

- Added new command-line switches. New syntax:
    * asteroids3d.exe [-fullscreen] [-debug] [-notrails] [-fps ]

- Added 'player health' system to actors and 'strength' variable to geometry for
  collision/physics routines.

- Moved existing collision reaction code to engine to form something of a
  physics system. e.g. bullet hits will automatically be handled by the engine
  so that actor health is updated. However the game will still be notified of
  collision events if it wishes to perform extra functionality, such as
  auto-spawning replacement enemies.

Game updates:

- Ships can be shot at and also explode on collision with other objects. They
  will respawn.

!Snapshot does not include libs required for compilation!

[01/03/2008] Snapshot 12 -

- Major re-organisation of code base to reduce header file re-use and
  promote forward declaration whereever possible.

Game engine updates:

- Seperated relevant code into new Renderer class.

- Automatic memory management using new classes IMMObject and CMMPointer,
  and static timer mechanism rather than a distinct 'timer engine' object.

- HUD indicators (radar, proximity and distance indicators) no longer
  appear on-screen in STATIC camera mode.

- Fixed stuttery snap-back in FOLLOW camera mode.

- Added frame compensation to camera follow values.

- Abstracted game timer to game engine.

- Re-organised timer engine prototypes into a single Timers.hpp header.

- Streamlined collision detection framework; order specified in lookups
  is maintained in the response, even if the matching collision event
  was in the reverse order.
  e.g. if collision detected between Obj1 and Obj2 in context ct,
       collisionLookup(Obj1, Obj2, *ct) will return [Obj1, Obj2, type].
       collisionLookup(Obj2, Obj1, *ct) will return [Obj2, Obj1, type].

  and  if collision detected between Obj2 and Obj1 in context ct,
       collisionLookup(Obj1, Obj2, *ct) will return [Obj1, Obj2, type].
       collisionLookup(Obj2, Obj1, *ct) will return [Obj2, Obj1, type].

- Moved class Bullet into engine.

- Abstracted bullet fire mechanism and jet trail smoke mechanism to

- Fixed particles in explosions exhibiting rectangular artefacts by
  modifying the texture bitmap.

- Re-organised "actors" list into a new class structure of Entities,
  derived from by Actors and Particles. This means the Game Engine can
  track and render particles out of systems, and include them in collision
  detection if desired. Particles can now be stored as Entities in the Game
  Engine and within Particle Systems in the Particle Engine.

- Transformed bullets from Actors with geometry into Particles.

- Placed upper bound of 260 units per second on Actor_Vehicle speed.
  This means the user cannot send the viper ship flying off into outer
  space at ridiculous speeds.

- Added frame render skipper for cases where frame is >400ms late. Should
  help prevent slowdown under extreme graphics load, but could lead to
  apparent freeze if no frames arrive on time.

- Formally defined cakeday Model Format (.cmf) and added new Hotspot and
  Gun location parameters to the format.

- Fixed slow ParticleSystem / Actor cleanup in GameEngine frame code.

- Fixed Particle memory leak (although there are still some mysteries to be
  solved about object copies in ParticleEngine::createSmoke(), and segfaults
  when particleSystems are passed around by reference).

Game updates:

- Extended non-default frame rate compensation to explosion timings, ship
  attitude control values and ship speeds, and re-implemented this
  functionality as a set of constant variables modified by functions in
  GameEngine (frc() and frci()).

- Added basic AI functionality to temporary alien ships (TestAI class).

- Temporarily fixed particle memory problem by drastically cutting down
  the number of particles produced to create jet trail smoke. The effect
  is less visually realistic but the game now continues to run at a decent

- Added basic speed meter to HUD.

- Added -notrails command-line option to disable jet trails for increased

!Snapshot does not include libs required for compilation!

[26/02/2008] Snapshot 11 -

Game engine updates:

- Renamed glide to 'Velocity Correction auto/manual'.
  Concept is now similar to that of automatic/manual transmission
  in car racing games, which ought to be more intuitive.

- Abstracted automatic velocity correction to Actor_Vehicle class.
- Temporary ship speed/mode indicator on overlay HUD.
- Particle Engine functions: smoke and explosions based on functional
  division into 'particle systems'.
- Added STATIC camera mode and distinguished from FOLLOW camera mode.
- FOLLOW camera mode now mimics the ship's movement more fluidly.
- Moved FOLLOW camera mode objects into Camera class.
- Engine HUD clock timer now reads "MINS:SECS.MILLIS" rather than clock ticks.

Game updates:
- Jet engine trails.
- Destroyed asteroids turn into particle explosions.

!Snapshot does not include libs required for compilation!

[20/02/2008] Snapshot 10 -

Game engine updates:

- Added collision engine framework and rudimentary detection algorithm
  (collision if respective object centres come within 20 cubic units of
  each other).

- Actors no longer store their own geometry; models are created (and
  transformed if corrections are requried at load-time) then registered
  with the engine. Actors have GeometryIDs which point to registered

  This approach should eliminate observed heavy memory use with 8+
  asteroids on-screen as shared models are safely now stored only once.

- Various pointer handling fixes. Geometry no longer stored as pointers
  to triangles, but as triangles. Dead-actor culling mechanism no longer
  falsely assumes valid deque iterators after an item has been erased.

- Implemented very basic "texture reading" framework with RGB header-less
  raw image file reading and OpenGL upload of texture data to hardware.

- Replaced RGB chart skybox with "starry sky" image skybox. Still needs to
  be refined and spherized.

- Moved non-class GL callbacks/handlers back into seperate file (gl.cpp).

- Fixed Timer Engine not calling timers at the proper interval when the
  value of that interval is particularly prone to rounding errors.

- Fixed debug window not displaying blank lines and added timestamps to

- Limited debug window output to 24 statically-scrolling lines. Still need
  to speed up text drawing though.

- Added clock timer to engine HUD.

Game updates:

- Added pthreads to lib requirements.

- Moved model load procedures into a new thread, so that the game window
  can display 'loading' message and continue to receive Win32 events whilst
  models are being read into memory.

- Streamlined overall game init process.
- Added 'game state' variable.
- Took bullets off RADAR.
- Added null pointer checks in fireBullet() function.
- Re-arranged keyboard/mouse hold check functions.

- Added some collision reaction: asteroid vanishes and re-spawns elsewhere
  if shot.

  There are occasional bugs in this part of the code; after playing for
  several minutes it is possible that eventually all Actors will be declared
  dead and removed from the engine. Any subsequent attempts to control the
  ship result in a segfault.

- Implemented variable frame rate: default rate (40ms/f) can be overridden
  by command-line argument, and other variables (such as bullet speed/delay)
  are adjusted in proportion to preserve relative game timings.

- Added commandline switches, run like:
  Asteroids3D.exe [-fullscreen] [-fps ]

!Snapshot does not include libs required for compilation!

[15/02/2008] Snapshot 9 -

Game engine updates:

- Created 'Actor_Vehicle' class with all features of Actor plus the
  concept of a 'target velocity' which will be incrementally approached,
  rather than the standard fixed velocity which is set immediately.
  New controls:
  '[' - Begin accelerating to maximum speed
  ']' - Begin accelerating to second-maximum speed
  '\' - Begin decelerating to dead stop

- Moved 'object glide' parameters into Actor_Vehicle class.
- Moved object models into bin/models directory.
- Fixed exception handling when object model files not found.

- Fixed lighting bug: lights were being set with position in camera space,
  not world space.

- Added template skybox background, currently consisting of RGB charts
  until a proper planetscape background can be created.

- Added rudimentary proximity indicators.
  A bug currently exists in that they show up not only when an actor is
  off-screen, but also when it has been clipped in the far distance in
  front of the camera.

- Added rudimentary RADAR in lower-left screen corner which displays
  relative position of actors from camera in the XZ plane.

!Snapshot does not include libs required for compilation!

[12/02/2008] Snapshot 8 -

Game engine updates:

- Added rudimentary support for object distance indicators.

- 'Camera glide' replaced with 'object glide'.
  Previously, the object's behaviour as regards movement did not change,
  but the camera's position and orientation became fixed for the duration
  of the glide.
  Now the object's velocity remains constant no matter what thrust controls
  are used nor how its orientation changes. The camera intelligently follows
  behind, allowing the player to 'see' in the direction of fire.

- Debug pane is semi-functional.
  Activated by '`'. Displays debug messages in order. However, currently does not
  scroll and it is slow due to lack of font glyph caching.
  Debug messages are echo'd to stdout if the macro "_DEBUG" in GameEngine.hpp is
  set to true.

- Substituted basic ship model for Viper Mk VII model for shade testing. Also
  added temporary Mk II and raptor models for fun.

- Added bullets and fire control.
- Added mouse-based orientation control override.
- Changed on-screen font from Arial to "SF Atarian System", an Atari-like font.

!Snapshot does not include libs required for compilation!

[04/02/2008] Snapshot 7 -

Game engine updates:
- Abandoned SDL and home-made rendering subsystem.
- Converted framework to use OpenGL.
- 'Interface' and 'Renderer' no longer in use.
- Shading via two basic light sources
- Triangles retain planar 'normal' information

Game updates:
- Implemented barebones 'game' with one asteroid and basic ship control
  'a' to accelerate
  'z' to decelerate
  keypad 4/6 to yaw
  keypad 2/8 to pitch
  keypad 1/3 to roll

!Snapshot does not include libs required for compilation!

[02/02/2008] Snapshot 6 -

Game engine updates:
- GeometrySource_FileReader implemented for reading .smf mesh data from files.
- Fixed some shading bugs.

Game updates:
- Rudimentary ship added for camera/orientation testing.

[30/01/2008] Snapshot 5 -

Game engine updates:
- Text support via FreeType2.
- Temporary textual status indicators on-screen.
- Effected speed increase by beginning to alter code to pass object references
  around, instead of forcing pointer deference operations all the time.
- Implemented [very slow] scanline rendering algorithm (with z-buffering).
- Partially implemented surface shader.
- Re-organised project directory structure.

(Toggle scanline rendering and shading with 's' key.)

[26/01/2008] Snapshot 4 -

Game engine updates:
- Grouped engine components in new namespace `cakeday`.
- Fully commented existing code.
- New line algorithm:
  Support for anti-aliasing and line thickness.
- Fixed transforms cross-product maths error.
- CubeCreator geometry source.
- Re-organised Camera projection functions.
- Demonstration: rotating floating cube.

(Toggle anti-aliasing with 'l' key.)

[25/01/2008] Snapshot 3 -

Game engine updates:
- Transforms (rotation+translation) now implemented as 3x3+1x3, not 3x4+1x4.
  Fourth row is implicitly assumed to be [0,0,0]+[1] in all matrix-matrix/matrix-vector operations.
- Rudimentary camera projection and 3D test render of single triangle.

[24/01/2008] Snapshot 2 -

Game engine updates:
- Event handling pass-back (SDL-based for now).
- Structured game loop.
- Timers.
- Graphics primitives: pixels, lines, rectangles; all with transparency support.
- 3D primitives: triangles, vectors, transforms.
- Exception types defined.

[20/01/2008] Snapshot 1

- Switch to C++ codebase.
- Rudimentary framework in place for `cakeday` game engine.


[25/11/2007] Snapshot VII

- Added starfield.
- Re-organised World render process for added efficiency.
- Fixed proximity indicators.
- Fixed game-area wrap bugs.

[12/11/2007] Snapshot VI

- Finished game-area wrap: smoother and can now see properly over boundaries.
- Visibility limited to size of world: cannot see same object more than twice at once.
- Improved rendering efficiency.
- Increased framerate and removed some rounding errors that led to coarse lines.
- Distance indicators on objects.
- Rudimentary proximity indicators on HUD for non-visible objects.
- Fixed asteroids getting 'stuck' in z-buffers; hadn't extended 'nudging' code for 3D.
- Added stereo anaglyph mode.

[06/11/2007] Snapshot V

- Functioning real collision detection.
- Fixed Asteroid spawn location being wrong.
- Fixed explosions not rendering.
- Added dustfield.
- Added temporary game area wrap see-through solution.
- Made bullets appear gold.
- Slowed ship rotation as a temporary fix for coarse rotation graphics.

[03/11/2007] Snapshot IV

- Functioning bounding-sphere collision detection.

[25/10/2007] Snapshot III

- Functioning spectate camera.
- Follow camera glide mode.
- All 3D rendering systems now in World: Renderer is purely 2D.

[22/10/2007] Snapshot II

- Functioning follow camera.

[16/10/2007] Snapshot I

- 3D navigable space.
- 3D ship movement and attitude control.