INITBOOLOPTION(DumpArgs,Eob(OPT_USE_ALL,OPT_DUMP_ARGS,_T("--dumpargs"),false,SO_NONE,"\t--dumpargs Print all arguments entered from either the command line or environment variables.\n"));
INITBOOLOPTION(DoProgress,Eob(OPT_USE_ALL,OPT_PROGRESS,_T("--progress"),false,SO_NONE,"\t--progress Display progress. This will slow down processing by about 10%%.\n"));
INITBOOLOPTION(OpenCLInfo,Eob(OPT_USE_ALL,OPT_DUMP_OPENCL_INFO,_T("--openclinfo"),false,SO_NONE,"\t--openclinfo Display platforms and devices for OpenCL.\n"));
INITBOOLOPTION(EmberCL,Eob(OPT_USE_ALL,OPT_OPENCL,_T("--opencl"),false,SO_NONE,"\t--opencl Use OpenCL renderer (EmberCL) for rendering [default: false].\n"));
INITBOOLOPTION(EarlyClip,Eob(OPT_USE_ALL,OPT_EARLYCLIP,_T("--earlyclip"),false,SO_NONE,"\t--earlyclip Perform clipping of RGB values before spatial filtering for better antialiasing and resizing [default: false].\n"));
INITBOOLOPTION(YAxisUp,Eob(OPT_USE_ALL,OPT_POS_Y_UP,_T("--yaxisup"),false,SO_NONE,"\t--yaxisup Orient the image with the positive y axis pointing up [default: false].\n"));
INITBOOLOPTION(Transparency,Eob(OPT_USE_ALL,OPT_TRANSPARENCY,_T("--transparency"),false,SO_NONE,"\t--transparency Include alpha channel in final output [default: false except for PNG].\n"));
INITBOOLOPTION(NameEnable,Eob(OPT_USE_RENDER,OPT_NAME_ENABLE,_T("--name_enable"),false,SO_NONE,"\t--name_enable Use the name attribute contained in the xml as the output filename [default: false].\n"));
INITBOOLOPTION(IntPalette,Eob(OPT_RENDER_ANIM,OPT_INT_PALETTE,_T("--intpalette"),false,SO_NONE,"\t--intpalette Force palette RGB values to be integers [default: false (float)].\n"));
INITBOOLOPTION(HexPalette,Eob(OPT_USE_ALL,OPT_HEX_PALETTE,_T("--hex_palette"),true,SO_OPT,"\t--hex_palette Force palette RGB values to be hex [default: true].\n"));
INITBOOLOPTION(InsertPalette,Eob(OPT_RENDER_ANIM,OPT_INSERT_PALETTE,_T("--insert_palette"),false,SO_NONE,"\t--insert_palette Insert the palette into the image for debugging purposes [default: false].\n"));
INITBOOLOPTION(JpegComments,Eob(OPT_RENDER_ANIM,OPT_JPEG_COMMENTS,_T("--enable_jpeg_comments"),true,SO_OPT,"\t--enable_jpeg_comments Enables comments in the jpeg header [default: true].\n"));
INITBOOLOPTION(PngComments,Eob(OPT_RENDER_ANIM,OPT_PNG_COMMENTS,_T("--enable_png_comments"),true,SO_OPT,"\t--enable_png_comments Enables comments in the png header [default: true].\n"));
INITBOOLOPTION(WriteGenome,Eob(OPT_USE_ANIMATE,OPT_WRITE_GENOME,_T("--write_genome"),false,SO_NONE,"\t--write_genome Write out flame associated with center of motion blur window [default: false].\n"));
INITBOOLOPTION(ThreadedWrite,Eob(OPT_RENDER_ANIM,OPT_THREADED_WRITE,_T("--threaded_write"),true,SO_OPT,"\t--threaded_write Use a separate thread to write images to disk. This doubles the memory required for the final output buffer. [default: true].\n"));
INITBOOLOPTION(Enclosed,Eob(OPT_USE_GENOME,OPT_ENCLOSED,_T("--enclosed"),true,SO_OPT,"\t--enclosed Use enclosing XML tags [default: true].\n"));
INITBOOLOPTION(NoEdits,Eob(OPT_USE_GENOME,OPT_NO_EDITS,_T("--noedits"),false,SO_NONE,"\t--noedits Exclude edit tags when writing Xml [default: false].\n"));
INITBOOLOPTION(UnsmoothEdge,Eob(OPT_USE_GENOME,OPT_UNSMOOTH_EDGE,_T("--unsmoother"),false,SO_NONE,"\t--unsmoother Do not use smooth blending for sheep edges [default: false].\n"));
INITBOOLOPTION(LockAccum,Eob(OPT_USE_ALL,OPT_LOCK_ACCUM,_T("--lock_accum"),false,SO_NONE,"\t--lock_accum Lock threads when accumulating to the histogram using the CPU. This will drop performance to that of single threading [default: false].\n"));
INITBOOLOPTION(DumpKernel,Eob(OPT_USE_RENDER,OPT_DUMP_KERNEL,_T("--dump_kernel"),false,SO_NONE,"\t--dump_kernel Print the iteration kernel string when using OpenCL (ignored for CPU) [default: false].\n"));
//Int.
INITINTOPTION(Symmetry,Eoi(OPT_USE_GENOME,OPT_SYMMETRY,_T("--symmetry"),0,SO_REQ_SEP,"\t--symmetry=<val> Set symmetry of result [default: 0].\n"));
INITINTOPTION(SheepGen,Eoi(OPT_USE_GENOME,OPT_SHEEP_GEN,_T("--sheep_gen"),-1,SO_REQ_SEP,"\t--sheep_gen=<val> Sheep generation of this flame [default: -1].\n"));
INITINTOPTION(SheepId,Eoi(OPT_USE_GENOME,OPT_SHEEP_ID,_T("--sheep_id"),-1,SO_REQ_SEP,"\t--sheep_id=<val> Sheep ID of this flame [default: -1].\n"));
INITUINTOPTION(Platform,Eou(OPT_USE_ALL,OPT_OPENCL_PLATFORM,_T("--platform"),0,SO_REQ_SEP,"\t--platform The OpenCL platform index to use [default: 0].\n"));
INITUINTOPTION(Device,Eou(OPT_USE_ALL,OPT_OPENCL_DEVICE,_T("--device"),0,SO_REQ_SEP,"\t--device The OpenCL device index within the specified platform to use [default: 0].\n"));
INITUINTOPTION(Seed,Eou(OPT_USE_ALL,OPT_SEED,_T("--seed"),0,SO_REQ_SEP,"\t--seed=<val> Integer seed to use for the random number generator [default: random].\n"));
INITUINTOPTION(ThreadCount,Eou(OPT_USE_ALL,OPT_NTHREADS,_T("--nthreads"),0,SO_REQ_SEP,"\t--nthreads=<val> The number of threads to use [default: use all available cores].\n"));
INITUINTOPTION(Strips,Eou(OPT_USE_RENDER,OPT_STRIPS,_T("--nstrips"),1,SO_REQ_SEP,"\t--nstrips=<val> The number of fractions to split a single render frame into. Useful for print size renders or low memory systems [default: 1].\n"));
INITUINTOPTION(Supersample,Eou(OPT_RENDER_ANIM,OPT_SUPERSAMPLE,_T("--supersample"),0,SO_REQ_SEP,"\t--supersample=<val> The supersample value used to override the one specified in the file [default: 0 (use value from file)].\n"));
INITUINTOPTION(BitsPerChannel,Eou(OPT_RENDER_ANIM,OPT_BPC,_T("--bpc"),8,SO_REQ_SEP,"\t--bpc=<val> Bits per channel. 8 or 16 for PNG, 8 for all others [default: 8].\n"));
INITUINTOPTION(SubBatchSize,Eou(OPT_USE_ALL,OPT_SBS,_T("--sub_batch_size"),DEFAULT_SBS,SO_REQ_SEP,"\t--sub_batch_size=<val> The chunk size that iterating will be broken into [default: 10k].\n"));
INITUINTOPTION(Bits,Eou(OPT_USE_ALL,OPT_BITS,_T("--bits"),33,SO_REQ_SEP,"\t--bits=<val> Determines the types used for the histogram and accumulator [default: 33].\n"
INITUINTOPTION(PrintEditDepth,Eou(OPT_USE_ALL,OPT_PRINT_EDIT_DEPTH,_T("--print_edit_depth"),0,SO_REQ_SEP,"\t--print_edit_depth=<val> Depth to truncate <edit> tag structure when converting a flame to xml. 0 prints all <edit> tags [default: 0].\n"));
INITUINTOPTION(JpegQuality,Eou(OPT_RENDER_ANIM,OPT_JPEG,_T("--jpeg"),95,SO_REQ_SEP,"\t--jpeg=<val> Jpeg quality 0-100 for compression [default: 95].\n"));
INITUINTOPTION(FirstFrame,Eou(OPT_USE_ANIMATE,OPT_BEGIN,_T("--begin"),UINT_MAX,SO_REQ_SEP,"\t--begin=<val> Time of first frame to render [default: first time specified in file].\n"));
INITUINTOPTION(LastFrame,Eou(OPT_USE_ANIMATE,OPT_END,_T("--end"),UINT_MAX,SO_REQ_SEP,"\t--end=<val> Time of last frame to render [default: last time specified in the input file].\n"));
INITUINTOPTION(Time,Eou(OPT_ANIM_GENOME,OPT_TIME,_T("--time"),0,SO_REQ_SEP,"\t--time=<val> Time of first and last frame (ie do one frame).\n"));
INITUINTOPTION(Frame,Eou(OPT_ANIM_GENOME,OPT_FRAME,_T("--frame"),0,SO_REQ_SEP,"\t--frame=<val> Synonym for \"time\".\n"));
INITUINTOPTION(Dtime,Eou(OPT_USE_ANIMATE,OPT_DTIME,_T("--dtime"),1,SO_REQ_SEP,"\t--dtime=<val> Time between frames [default: 1].\n"));
INITUINTOPTION(Frames,Eou(OPT_USE_GENOME,OPT_NFRAMES,_T("--nframes"),20,SO_REQ_SEP,"\t--nframes=<val> Number of frames for each stage of the animation [default: 20].\n"));
INITUINTOPTION(Loops,Eou(OPT_USE_GENOME,OPT_LOOPS,_T("--loops"),1,SO_REQ_SEP,"\t--loops=<val> Number of times to rotate each control point in sequence [default: 1].\n"));
INITUINTOPTION(Repeat,Eou(OPT_USE_GENOME,OPT_REPEAT,_T("--repeat"),1,SO_REQ_SEP,"\t--repeat=<val> Number of new flames to create. Ignored if sequence, inter or rotate were specified [default: 1].\n"));
INITUINTOPTION(Tries,Eou(OPT_USE_GENOME,OPT_TRIES,_T("--tries"),10,SO_REQ_SEP,"\t--tries=<val> Number times to try creating a flame that meets the specified constraints. Ignored if sequence, inter or rotate were specified [default: 10].\n"));
INITUINTOPTION(MaxXforms,Eou(OPT_USE_GENOME,OPT_MAX_XFORMS,_T("--maxxforms"),UINT_MAX,SO_REQ_SEP,"\t--maxxforms=<val> The maximum number of xforms allowed in the final output.\n"));
INITUINTOPTION(Priority,Eou(OPT_RENDER_ANIM,OPT_PRIORITY,_T("--priority"),eThreadPriority::NORMAL,SO_REQ_SEP,"\t--priority=<val> The priority of the CPU rendering threads from -2 - 2. This does not apply to OpenCL rendering.\n"));
INITDOUBLEOPTION(SizeScale,Eod(OPT_RENDER_ANIM,OPT_SS,_T("--ss"),1,SO_REQ_SEP,"\t--ss=<val> Size scale. All dimensions are scaled by this amount [default: 1.0].\n"));
INITDOUBLEOPTION(QualityScale,Eod(OPT_RENDER_ANIM,OPT_QS,_T("--qs"),1,SO_REQ_SEP,"\t--qs=<val> Quality scale. All quality values are scaled by this amount [default: 1.0].\n"));
INITDOUBLEOPTION(AspectRatio,Eod(OPT_USE_ALL,OPT_PIXEL_ASPECT,_T("--pixel_aspect"),1,SO_REQ_SEP,"\t--pixel_aspect=<val> Aspect ratio of pixels (width over height), eg. 0.90909 for NTSC [default: 1.0].\n"));
INITDOUBLEOPTION(Stagger,Eod(OPT_USE_GENOME,OPT_STAGGER,_T("--stagger"),0,SO_REQ_SEP,"\t--stagger=<val> Affects simultaneity of xform interpolation during flame interpolation.\n"
"\t Represents how 'separate' the xforms are interpolated. Set to 1 for each\n"
"\t xform to be interpolated individually, fractions control interpolation overlap [default: 0].\n"));
INITDOUBLEOPTION(AvgThresh,Eod(OPT_USE_GENOME,OPT_AVG_THRESH,_T("--avg"),20.0,SO_REQ_SEP,"\t--avg=<val> Minimum average pixel channel sum (r + g + b) threshold from 0 - 765. Ignored if sequence, inter or rotate were specified [default: 20].\n"));
INITDOUBLEOPTION(BlackThresh,Eod(OPT_USE_GENOME,OPT_BLACK_THRESH,_T("--black"),0.01,SO_REQ_SEP,"\t--black=<val> Minimum number of allowed black pixels as a percentage from 0 - 1. Ignored if sequence, inter or rotate were specified [default: 0.01].\n"));
INITDOUBLEOPTION(WhiteLimit,Eod(OPT_USE_GENOME,OPT_WHITE_LIMIT,_T("--white"),0.05,SO_REQ_SEP,"\t--white=<val> Maximum number of allowed white pixels as a percentage from 0 - 1. Ignored if sequence, inter or rotate were specified [default: 0.05].\n"));
INITDOUBLEOPTION(Speed,Eod(OPT_USE_GENOME,OPT_SPEED,_T("--speed"),0.1,SO_REQ_SEP,"\t--speed=<val> Speed as a percentage from 0 - 1 that the affine transform of an existing flame mutates with the new flame. Ignored if sequence, inter or rotate were specified [default: 0.1].\n"));
INITDOUBLEOPTION(OffsetX,Eod(OPT_USE_GENOME,OPT_OFFSETX,_T("--offsetx"),0.0,SO_REQ_SEP,"\t--offsetx=<val> Amount to jitter each flame horizontally when applying genome tools [default: 0].\n"));
INITDOUBLEOPTION(OffsetY,Eod(OPT_USE_GENOME,OPT_OFFSETY,_T("--offsety"),0.0,SO_REQ_SEP,"\t--offsety=<val> Amount to jitter each flame vertically when applying genome tools [default: 0].\n"));
INITDOUBLEOPTION(UseMem,Eod(OPT_USE_RENDER,OPT_USEMEM,_T("--use_mem"),0.0,SO_REQ_SEP,"\t--use_mem=<val> Number of bytes of memory to use [default: max system memory].\n"));
//String.
INITSTRINGOPTION(IsaacSeed,Eos(OPT_USE_ALL,OPT_ISAAC_SEED,_T("--isaac_seed"),"",SO_REQ_SEP,"\t--isaac_seed=<val> Character-based seed for the random number generator [default: random].\n"));
INITSTRINGOPTION(Input,Eos(OPT_RENDER_ANIM,OPT_IN,_T("--in"),"",SO_REQ_SEP,"\t--in=<val> Name of the input file.\n"));
INITSTRINGOPTION(Out,Eos(OPT_RENDER_ANIM,OPT_OUT,_T("--out"),"",SO_REQ_SEP,"\t--out=<val> Name of a single output file. Not recommended when rendering more than one image.\n"));
INITSTRINGOPTION(Prefix,Eos(OPT_RENDER_ANIM,OPT_PREFIX,_T("--prefix"),"",SO_REQ_SEP,"\t--prefix=<val> Prefix to prepend to all output files.\n"));
INITSTRINGOPTION(Suffix,Eos(OPT_RENDER_ANIM,OPT_SUFFIX,_T("--suffix"),"",SO_REQ_SEP,"\t--suffix=<val> Suffix to append to all output files.\n"));
INITSTRINGOPTION(Format,Eos(OPT_RENDER_ANIM,OPT_FORMAT,_T("--format"),"png",SO_REQ_SEP,"\t--format=<val> Format of the output file. Valid values are: bmp, jpg, png, ppm [default: jpg].\n"));
INITSTRINGOPTION(PalettePath,Eos(OPT_USE_ALL,OPT_PALETTE_FILE,_T("--flam3_palettes"),"flam3-palettes.xml",SO_REQ_SEP,"\t--flam3_palettes=<val> Path and name of the palette file [default: flam3-palettes.xml].\n"));
INITSTRINGOPTION(Comment,Eos(OPT_USE_GENOME,OPT_COMMENT,_T("--comment"),"",SO_REQ_SEP,"\t--comment=<val> Comment to use in <edit> tags.\n"));
INITSTRINGOPTION(TemplateFile,Eos(OPT_USE_GENOME,OPT_TEMPLATE,_T("--template"),"",SO_REQ_SEP,"\t--template=<val> Apply defaults based on this flame.\n"));
INITSTRINGOPTION(Clone,Eos(OPT_USE_GENOME,OPT_CLONE,_T("--clone"),"",SO_REQ_SEP,"\t--clone=<val> Clone random flame in input.\n"));
INITSTRINGOPTION(CloneAll,Eos(OPT_USE_GENOME,OPT_CLONE_ALL,_T("--clone_all"),"",SO_REQ_SEP,"\t--clone_all=<val> Clones all flames in the input file. Useful for applying template to all flames.\n"));
INITSTRINGOPTION(CloneAction,Eos(OPT_USE_GENOME,OPT_CLONE_ACTION,_T("--clone_action"),"",SO_REQ_SEP,"\t--clone_action=<val> A description of the clone action taking place.\n"));
INITSTRINGOPTION(Animate,Eos(OPT_USE_GENOME,OPT_ANIMATE,_T("--animate"),"",SO_REQ_SEP,"\t--animate=<val> Interpolates between all flames in the input file, using times specified in file.\n"));
INITSTRINGOPTION(Mutate,Eos(OPT_USE_GENOME,OPT_MUTATE,_T("--mutate"),"",SO_REQ_SEP,"\t--mutate=<val> Randomly mutate a random flame from the input file.\n"));
INITSTRINGOPTION(Cross0,Eos(OPT_USE_GENOME,OPT_CROSS0,_T("--cross0"),"",SO_REQ_SEP,"\t--cross0=<val> Randomly select one flame from the input file to genetically cross...\n"));
INITSTRINGOPTION(Cross1,Eos(OPT_USE_GENOME,OPT_CROSS1,_T("--cross1"),"",SO_REQ_SEP,"\t--cross1=<val> ...with one flame from this file.\n"));
INITSTRINGOPTION(Method,Eos(OPT_USE_GENOME,OPT_METHOD,_T("--method"),"",SO_REQ_SEP,"\t--method=<val> Method used for genetic cross: alternate, interpolate, or union. For mutate: all_vars, one_xform, add_symmetry, post_xforms, color_palette, delete_xform, all_coefs [default: random].\n"));//Original ommitted this important documentation for mutate!
INITSTRINGOPTION(Inter,Eos(OPT_USE_GENOME,OPT_INTER,_T("--inter"),"",SO_REQ_SEP,"\t--inter=<val> Interpolate the input file.\n"));
INITSTRINGOPTION(Rotate,Eos(OPT_USE_GENOME,OPT_ROTATE,_T("--rotate"),"",SO_REQ_SEP,"\t--rotate=<val> Rotate the input file.\n"));
INITSTRINGOPTION(Strip,Eos(OPT_USE_GENOME,OPT_STRIP,_T("--strip"),"",SO_REQ_SEP,"\t--strip=<val> Break strip out of each flame in the input file.\n"));
INITSTRINGOPTION(Sequence,Eos(OPT_USE_GENOME,OPT_SEQUENCE,_T("--sequence"),"",SO_REQ_SEP,"\t--sequence=<val> 360 degree rotation 'loops' times of each control point in the input file plus rotating transitions.\n"));
INITSTRINGOPTION(UseVars,Eos(OPT_USE_GENOME,OPT_USE_VARS,_T("--use_vars"),"",SO_REQ_SEP,"\t--use_vars=<val> Comma separated list of variation #'s to use when generating a random flame.\n"));
INITSTRINGOPTION(DontUseVars,Eos(OPT_USE_GENOME,OPT_DONT_USE_VARS,_T("--dont_use_vars"),"",SO_REQ_SEP,"\t--dont_use_vars=<val> Comma separated list of variation #'s to NOT use when generating a random flame.\n"));
INITSTRINGOPTION(Extras,Eos(OPT_USE_GENOME,OPT_EXTRAS,_T("--extras"),"",SO_REQ_SEP,"\t--extras=<val> Extra attributes to place in the flame section of the Xml.\n"));
}
/// <summary>
/// Parse and populate the supplied command line options for the specified program usage.
/// If --help or --version were specified, information will be printed
/// and parsing will cease.
/// </summary>
/// <param name="argc">The number of command line arguments passed</param>
/// <param name="argv">The command line arguments passed</param>
/// <param name="optUsage">The program for which these options are to be parsed and used.</param>
/// <returns>True if --help or --version specified, else false</returns>