File Overview ------------- * winmain.cpp Windows front-end. There's a lot of initialization code that should be moved to a module that's not platform-specific. * simulation.cpp The heart of Celestia . . . handles tracking an observer moving through the universe. * render.cpp The Renderer class. Everything on the screen is put there by an instance of Renderer. * bigfix.cpp High precision (128-bit) fixed point numbers. * univcoord.cpp UnivseralCoord class--a 3-vector with BigFix components. Represents positions over a range of billions of light years to about millimeter resolution. * observer.cpp This class is a package for position, orientation, and velocity. The position of the observer is a UniversalCoord. * octree.cpp Octree is a class used to determine which stars from are visible to an Observer * stellarclass.cpp * starname.cpp * star.cpp * stardb.cpp Everything to do with stars. StarDatabase contains a list of Stars and a list of StarNames. * constellation.cpp Just a bunch of static data giving the names and official abbreviations of the 88 recognized constellations. * orbit.cpp The Orbit base class has a single method to compute the barycentric position of an object at a given Julian Date. Currently, the only subclass of Orbit is EllipticalOrbit, which calculates the position of an object along an orbit specified by the standard six orbital elements. * body.cpp A planet, moon, probe, etc. Pretty much anything in space other than a star is a Body. A PlanetarySystem is a list of bodies. * solarsys.cpp SolarSystem and SolarSystemCatalog classes. * mesh.cpp * spheremesh.cpp * 3dsmesh.cpp * vertexlist.cpp These files are all related to internal geometry representation. Mesh is an abstract class from which SphereMesh and Mesh3DS are derived. VertexList is basically an easy to use wrapper for OpenGL 1.1 vertex arrays. Eventually, VertexList will be made a subclass of mesh (SimpleMesh) and Mesh3DS will be replaced by a more general class, CompositeMesh, which is just a container for multiple Meshes. * surface.h An aggregation of surface properties that may be applied to a mesh. * texture.cpp An OpenGL texture class. * tokenizer.cpp * parser.cpp The tokenizer and parser for Celestia text files (including the config file, the solar system catalogs, and Celestia procedural meshes) * resmanager.cpp * texmanager.cpp * meshmanager.cpp Resource management. Resource manager is an abstract class from which TextureManager and MeshManager are derived. Right now, there isn't much in the way of actual management done, but having these classes around makes it much easier to implement a more sophisticated texture manager in the future. * 3dschunk.h * 3dsread.cpp * 3dsmodel.cpp 3DS mesh reading stuff. Slurp a file and spits out a Mesh3DS. * console.cpp GL text console class that supports both printf and C++ << style output. * perlin.cpp Noise functions used for procedural geometry and textures. * regcombine.cpp A few functions that make it easy to use nVidia's REGISTER_COMBINERS extension. * color.cpp Simple RGBA color class. * astro.cpp Astronomical conversions and a Date class for converting from dd/mm/yyyy to Julian date. * vecgl.h A handful of template functions which make it easy to use types from Eigen with OpenGL * glext.h * glext.cpp GL extension declarations * filetype.cpp A function for determining the type of a file based on its extension. * dispmap.cpp Some silly code for applying displacement maps to SphereMeshes. * texfont.cpp Mark J. Kilgard's texture font package * buildstardb.cpp The program used to munge the HIPPARCOS data set into the star database. If you wish to munge your own database, you will need to download a copy of the HIPPARCOS database, it may be found at the URL: ftp://cdsarc.u-strasbg.fr/cats/I/239 You will need the files hip_main.dat h_dm_com.dat hip_dm_o.da & tyc_main.dat The Star Database ----------------- The main star database is data/stars.dat. This contains about 112,000 stars, including most of the HIPPARCOS catalog, plus one addition: Sol, our sun. The file starnames.dat contains proper names and Bayer and Flamsteed designations for about 1000 stars. Every star in stars.dat has a unique identifier called its catalog number, and the name entries are linked with stars from the database via this number. The readStars function in celestiacore.cpp is responsible for loading the star database for Celestia. Once initialized, the StarDatabase may be queried in one of three ways: by star index, by catalog number, or by star name. The star index is just the order of the star within the database, so lookup by index is a constant time operation. Looking up a star by catalog number requires a search of the star database; since the database entries are sorted by catalog number, this is a log N operation. All three query types return a pointer to a star from the database. Stars ----- Since there are so many stars in a star database, it's important that the size of the Star class be kept to a minimum. Thus, in order to avoid the 4 byte vtable overhead Star is not a derived class, even though it might be somewhat useful to have a common base class for stars and planets. All stars have a unique catalog number, a position, a stellar class, and a luminosity. The radius, temperature, and color of a star are not stored, but are instead derived from stellar class and luminosity. The position of a star is its cartesian ecliptical position in units of light years. The catalog number of a star is generally it's HD number. In cases where the star doesn't have an HD number, the lower 28 bits are the HIPPARCOS catalog number and the high 4 bits are 0x1. Celestia Overview ----------------- The basic skeleton of Celestia looks like this: StarDatabase* stardb = ReadStars("data/stars.dat", "data/starnames.dat"); SolarSystemCatalog* solarSystems = ReadSolarSystems("data/solarsys.ssc"); Simulation* sim = new Simulation(); sim->setStarDatabase(stardb); sim->setTime(now); Renderer renderer = new Renderer(); renderer->init(); for (;;) { sim->update(tick); sim->render(*renderer); } The platform specific stuff to create a GL window and update it has been omitted, as has any UI. Tracking Visible Stars ---------------------- The VisibleStarSet class exists to limit the amount of computation spent determining which stars from a StarDatabase are visible to an Observer. The fairly simple trick used to help alleviate the problem involves only checking a portion of the database for visibility at each update. UNIX ---- To develop under Unix, you will probably need some of the following packages: autoconf, automake, and of course the usual array of c++ compilers/linkers.