Adam Lenart
 
  HyperBall  
  • OpenGL based 3D engine written in C/C++ (Microsoft Visual Studio 6.0 w/ SP5, 7.1 .NET), featuring:
    • Simple DirectMedia Layer (SDL) as base framework for cross-platform compatibility (compiles and runs on Win32 and Linux platforms).
    • Image/texture manager that creates or reuses already loaded Image objects:
      • Uses SDL_image library to load different image formats (16/24/32-bit).
      • Maintains texture material properties including ambience, diffusion, emission, shininess, and specular highlight.
      • Ability to draw textures in 2D orthographic mode at pixel offset relative to top/left hand corner.
      • Font extension to Image, creating bitmap font display lists that can quickly draw 2D text using printf(...) style function syntax.
    • Full-featured math template classes for vectors and matrices.
    • Camera system that tracks given view point with acceleration-based panning towards ideal view.
    • Event/message manager with priority queue for handling user input events from keyboard, mouse, joystick, and remote network source via ENet API.
  • Uses basic 3D map format based on Quake 1/Quake 2 brush based MAP format:
    • Built-in conversion tool to convert from MAP format to stripped-down uncompiled binary format.
    • QERadient v1.0 build 147 with tweaked entities.def files used as primary editor.
    • Runtime octree compiler/renderer for spatial partitioning and hidden surface removal/exclusion during rendering and collision detection.
    • Runtime BSP tree compiler/renderer implemented, but not used due to imperfect collision detection.
    • Renders using combination of hidden surface removal and recursively built display lists.
    • Internal data representation consists of sectors (with position and velocity) containing lumps (a.k.a. brushes) containing vertices, edges, and sides, also grouped by polygons/triangles with texture coordinates (for octree/BSP rendering purposes).
    • Support for objects/entities (definable by constants or model filenames).
    • Support for simple dynamic lights (lightmaps and cellshading coming soon!).
    • Support for tracks/paths that solid map geometry (e.g. platforms, lifts) or entities can move along, using time based linear interpolation to calculate their positions.
    • Support for start, end, and teleporter pads that are linkable to each other.
  • Physics system that handles basic acceleration, velocity, displacement, and force:
    • Uses collision detection based on time (i.e. time before object collides with other object or map surface, edge, or vertex).
    • Highly developed collision detection and impact/trajectory calculation for spheres, resulting in very realistic ball movement/bouncing.
    • Ability to apply physical attributes to surfaces for friction and spring coeffiecient (e.g. minimal friction creates ice-like surface for ball).
    • Definable constants for gravity (defaulted to -9.8), air resistance, terminal velocity, etc...
  • Model/mesh support with full frame/animation manager and model instances, extended by:
    • Quake 2 MD2 loader with time based vertex interpolation for smooth animation (enabling use of Quake 2 models for demo purposes).
    • 3D Studio Max loader for static models.
    • Quadric/shape factory that can create spheres, cylinders, disks, cubes, boxes, pyramids, etc...
    • Uses sphere and/or axis aligned bounding box based collision detection for speed.
  • File system that acts as centralized resource manager:
    • Uses custom encrypted binary resource bundle format that preserves directory structure and file names.
    • Uses hashtable-like structure in file lookup table, allowing for quick file searching and offset positioning for streaming.
    • Built-in tool to compile and encrypt resource bundles given a directory name (bundles all files, recursively traversing through sub-directories).
    • Ability to mount/unmount multiple resource bundles, where the mount order retains the file loading precedence in the case that multiple bundles contain the same file/directory.
    • Physical files, placed inside directory structure rooted at location of resouces bundles, will take highest loading precedence.
  • Quake-style console with fast runtime parser/tokenizer/interpreter/event manager that handles:
    • Commands: that support multiple arguments and are directly linked to functions prototyped with the function(int argc, char *argv[]) syntax.
    • Variables: that can be strings, integers, floats, or booleans (toggles) and are directly linked to in-code variables. Can be embedded in any command/argument by using $ escape symbol (e.g. echo "player $name is wearing $skin").
    • Aliases: that can define new commands as sequences of multiple commands seperated by semicolons (e.g. alias "abort" "echo aborting...; condump abort_$date.log; quit").
    • Actions: that are commands with on/off dualities (+command/-command) that toggle in-code action bits and fire events.
    • Bindings: that tie key input events to commands or actions that trigger +command for key down events and -command for key up events.
  • Menu system with hierarchal menu structure:
    • Passes through console interpreter for variables and commands.
    • Base menu item with extendible menu items including: command buttons, textboxes, listboxes, sliders, checkboxes, labels, images, key bindings (with key polling), and seperators.
  • Sound and music manager that creates or reuses already loaded Sound and Music objects:
    • Uses FMOD library for sound and music.
    • Supports full loading and playing of WAVE, MIDI, MOD, IT, and XM samples/tracks.
    • Supports memory buffered streaming for MP3 playback when loading from resource bundles.
    • SDL_mixer library also implementated for sound/music, but not used since FMOD is more capable.
  • Partially implemented game logic for action/puzzle ball game inspired by Marble Madness (Atari/NES) and Kirby's Dream Course (SNES). See in-game help for information on user input and changing maps.
  • Some models (MD2 files w/ skins) and textures were borrowed from Quake 2 for demonstration purposes: