To give you an idea of how the code behind Photorealizer is organized, here's a list of all of the C++ classes that I've written (updated January 25, 2013), with subclasses nested below their superclass. (A few of these things are actually class templates or namespaces with functions in them, but they might as well be classes.)
AdaptiveSampler
AdaptiveSamplerSample
Aperture
PinholeAperture
WideAperture
AxisAlignedBoundingBox
BasicMath
Bitmap
LDRBitmap
HDRBitmap
BitmapTextureMapData
BoundingSphere
BSDF
CookTorranceBRDF
LambertBRDF
LambertBTDF
ModifiedPhongBRDF
OrenNayarBRDF
SpecularMicrofacetBSDF
BSDFSample
BSDFWeight
BVH
BVHNode
Camera
AngularFisheyeCamera
LatitudeLongitudeCamera
RegularCamera
CameraSample
Color
ColorProfile
PowerLawColorProfile
SRGBColorProfile
ColorRamp
ColorTransform
BlackAndWhiteColorTransform
BlackLevelColorTransform
ColorBalanceColorTransform
CyanColorTransform
RedColorTransform
RollOffContrastColorTransform
SinusoidalContrastColorTransform
CustomOutput
Distribution1D
Distribution1DSample
Distribution2D
Distribution2DSample
FileNameUtils
FinalGatheringPoint
FinalGatheringSample
FinalGatheringSampler
Fresnel
HaltonSequence
ImprovedPerlinNoise
ImprovedPerlinNoiseFunctions
IndexOfRefraction
Interpolator
Intersection
IntersectionExtras
IrradianceSample
KDTree
KDTreeNode
KDTreePoint
Light
DirectionalLight
EnvironmentMap
CIEOvercastSky
ColorEnvironmentMap
GradientEnvironmentMap
HDREnvironmentMap
FisheyeHDREnvironmentMap
EquirectangularHDREnvironmentMap
RectangularAreaLight
SphericalLight
Sun
LightIntersection
LightPhoton
LightSample
LinearAlgebra
Main
MainWindow
Medium
MersenneTwister
Motion
MultipleScattering
MultipleScatteringOctree
MultipleScatteringOctreeNode
OpenEXRImage
OpenEXRStuff
PathTracer
PhaseFunction
HenyeyGreensteinPhaseFunction
IsotropicPhaseFunction
Photon
IrradiancePhoton
PNGWriter
PointMaterial
Material
Rasterizer
Ray
AxisAlignedBoundingBoxRay
ReconstructionFilter
BoxFilter
GaussianFilter
TriangleFilter
ReflectionRefraction
RenderDispatcher
SceneObject
Primitive
AnyPolygon
Cube
Cylinder
HeightField
InfiniteGroundPlane
Metaballs
Sphere
TransformableSceneObject
SceneObjectContainer
Model
Pedestal
Scene
HardCodedScene
SellmeierCoefficients
Settings
HardCodedSettings
Shutter
InstantaneousShutter
SpatialGridHashTable
SimpleIntersection
SpatialGridHashTablePoint
SpecularMicrofacetDistribution
BeckmanDistribution
GGXDistribution
Stopwatch
StringUtils
Test
TextureMap
TextureMap2D
BitmapTextureMap
CheckeredTexture
TextureMap3D
MarbleTexture
WoodTexture
Triangulator
Vertex
VertexWithNormal
VertexWithNormalAndUV
VertexWithUV
Volumetric
VolumetricIntersection
Voxel
VoxelBuffer
I wrote all of that code (and designed the architecture) from scratch, except for the following minor pieces: a function for efficient ray–box intersection (I had previously written my own, but it wasn't as efficient), improved Perlin noise (I converted the Java code to C++; I've implemented Perlin noise before, but not the improved version), a few of the functions in my custom linear algebra
library (I previously used a basic linear algebra library found here), a basic UI based on this Qt image viewer example.
In addition to the classes listed above, I also utilize three libraries for loading and saving bitmap images (OpenEXR, stb_image, and libpng), as well as Qt for the GUI (used to use Cocoa on Mac), OpenMP for multithreading (used to use Grand Central Dispatch on Mac), and of course C++ (including some new TR1 and C++11 features).
I try to write code that is clean, descriptive, and readable. Here are a couple relevant quotes that I like:
"Any fool can write code that a computer can understand. Good programmers write code that humans can understand." ~Martin Fowler
"One of the miseries of life is that everybody names things a little bit wrong, and so it makes everything a little harder to understand in the world than it would be if it were named differently." ~Richard Feynman
No comments:
Post a Comment