diff --git a/.gitignore b/.gitignore index e57bcfc62..b3bb8d82d 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,6 @@ CMakeCache.txt moc_*.cxx cmake_install.cmake *.[ao] - +Makefile +makefile +data diff --git a/CMakeLists.txt b/CMakeLists.txt index 07ee92417..6fb0ee34c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -96,6 +96,7 @@ source_group(libs\\mangle FILES ${MANGLE_ALL}) set(OENGINE_OGRE ${LIBDIR}/openengine/ogre/renderer.cpp ${LIBDIR}/openengine/ogre/mouselook.cpp + ${LIBDIR}/openengine/ogre/fader.cpp ) set(OENGINE_GUI ${LIBDIR}/openengine/gui/events.cpp @@ -192,7 +193,6 @@ include_directories("." ${OGRE_INCLUDE_DIR} ${OGRE_INCLUDE_DIR}/Ogre ${OGRE_INCLUDE_DIR}/OGRE ${OIS_INCLUDE_DIRS} ${Boost_INCLUDE_DIR} ${PLATFORM_INCLUDE_DIR} - ${CMAKE_HOME_DIRECTORY}/extern/caelum/include ${CMAKE_HOME_DIRECTORY}/extern/mygui_3.0.1/MyGUIEngine/include ${CMAKE_HOME_DIRECTORY}/extern/mygui_3.0.1/OgrePlatform/include ${OPENAL_INCLUDE_DIR} @@ -206,10 +206,10 @@ if(APPLE) # List used Ogre plugins SET(USED_OGRE_PLUGINS "RenderSystem_GL" "Plugin_OctreeSceneManager" + "Plugin_CgProgramManager" "Plugin_ParticleFX") endif(APPLE) -add_subdirectory( extern/caelum ) add_subdirectory( extern/mygui_3.0.1 ) # Make sure that certain libraries are used as static libraries @@ -219,9 +219,6 @@ add_subdirectory( extern/mygui_3.0.1 ) # MyGUI: extern/mygui_3.0.0/ add_definitions(-DMYGUI_STATIC) -# Caelum: extern/caelum/ -add_definitions(-DCAELUM_STATIC) - # Specify build paths if (APPLE) diff --git a/apps/esmtool/CMakeLists.txt b/apps/esmtool/CMakeLists.txt index f2ab7bce7..af3dc090e 100644 --- a/apps/esmtool/CMakeLists.txt +++ b/apps/esmtool/CMakeLists.txt @@ -1,6 +1,4 @@ set(ESMTOOL - esmtool_cmd.c - esmtool_cmd.h esmtool.cpp ) source_group(apps\\esmtool FILES ${ESMTOOL}) diff --git a/apps/esmtool/Makefile b/apps/esmtool/Makefile deleted file mode 100644 index ee92cf4c8..000000000 --- a/apps/esmtool/Makefile +++ /dev/null @@ -1,5 +0,0 @@ -esmtool_cmd.c: esmtool.ggo - gengetopt < esmtool.ggo - -clean: - rm esmtool_cmd.c esmtool_cmd.h diff --git a/apps/esmtool/esmtool.cpp b/apps/esmtool/esmtool.cpp index fe067d85d..f417d5c60 100644 --- a/apps/esmtool/esmtool.cpp +++ b/apps/esmtool/esmtool.cpp @@ -1,35 +1,138 @@ +#include + +#include + #include #include -#include "esmtool_cmd.h" - -#include +#define ESMTOOL_VERSION 1.1 using namespace std; using namespace ESM; +// Create a local alias for brevity +namespace bpo = boost::program_options; + void printRaw(ESMReader &esm); void loadCell(Cell &cell, ESMReader &esm, bool quiet); -int main(int argc, char**argv) +// Based on the legacy struct +struct Arguments { - gengetopt_args_info info; + unsigned int raw_given; + unsigned int quiet_given; + unsigned int loadcells_given; + std::string encoding; + std::string filename; +}; - if(cmdline_parser(argc, argv, &info) != 0) - return 1; +bool parseOptions (int argc, char** argv, Arguments &info) +{ + bpo::options_description desc("Inspect and extract from Morrowind ES files (ESM, ESP, ESS)\nSyntax: esmtool [options] file \nAllowed options"); + + desc.add_options() + ("help,h", "print help message.") + ("version,v", "print version information and quit.") + ("raw,r", "Show an unformattet list of all records and subrecords.") + ("quiet,q", "Supress all record information. Useful for speed tests.") + ("loadcells,C", "Browse through contents of all cells.") + + ( "encoding,e", bpo::value(&(info.encoding))-> + default_value("win1252"), + "Character encoding used in ESMTool:\n" + "\n\twin1250 - Central and Eastern European such as Polish, Czech, Slovak, Hungarian, Slovene, Bosnian, Croatian, Serbian (Latin script), Romanian and Albanian languages\n" + "\n\twin1251 - Cyrillic alphabet such as Russian, Bulgarian, Serbian Cyrillic and other languages\n" + "\n\twin1252 - Western European (Latin) alphabet, used by default") + ; + + std::string finalText = "\nIf no option is given, the default action is to parse all records in the archive\nand display diagnostic information."; - if(info.inputs_num != 1) + // input-file is hidden and used as a positional argument + bpo::options_description hidden("Hidden Options"); + + hidden.add_options() + ( "input-file,i", bpo::value< vector >(), "input file") + ; + + bpo::positional_options_description p; + p.add("input-file", -1); + + // there might be a better way to do this + bpo::options_description all; + all.add(desc).add(hidden); + bpo::parsed_options valid_opts = bpo::command_line_parser(argc, argv) + .options(all).positional(p).run(); + + bpo::variables_map variables; + bpo::store(valid_opts, variables); + bpo::notify(variables); + + if (variables.count ("help")) { - if(info.inputs_num == 0) - cout << "ERROR: missing ES file\n\n"; - else - cout << "ERROR: more than one ES file specified\n\n"; - cmdline_parser_print_help(); - return 1; + std::cout << desc << finalText << std::endl; + return false; + } + if (variables.count ("version")) + { + std::cout << "ESMTool version " << ESMTOOL_VERSION << std::endl; + return false; + } + + if ( !variables.count("input-file") ) + { + std::cout << "\nERROR: missing ES file\n\n"; + std::cout << desc << finalText << std::endl; + return false; } + // handling gracefully the user adding multiple files + if (variables["input-file"].as< vector >().size() > 1) + { + std::cout << "\nERROR: more than one ES file specified\n\n"; + std::cout << desc << finalText << std::endl; + return false; + } + + info.filename = variables["input-file"].as< vector >()[0]; + + info.raw_given = variables.count ("raw"); + info.quiet_given = variables.count ("quiet"); + info.loadcells_given = variables.count ("loadcells"); + + // Font encoding settings + info.encoding = variables["encoding"].as(); + if (info.encoding == "win1250") + { + std::cout << "Using Central and Eastern European font encoding." << std::endl; + } + else if (info.encoding == "win1251") + { + std::cout << "Using Cyrillic font encoding." << std::endl; + } + else + { + if(info.encoding != "win1252") + { + std::cout << info.encoding << " is not a valid encoding option." << std::endl; + info.encoding = "win1252"; + } + std::cout << "Using default (English) font encoding." << std::endl; + } + + return true; +} + + +int main(int argc, char**argv) +{ + Arguments info; + if(!parseOptions (argc, argv, info)) + return 1; + ESMReader esm; - const char* filename = info.inputs[0]; + esm.setEncoding(info.encoding); + + string filename = info.filename; cout << "\nFile: " << filename << endl; try { diff --git a/apps/esmtool/esmtool.ggo b/apps/esmtool/esmtool.ggo deleted file mode 100644 index 9d0f3c189..000000000 --- a/apps/esmtool/esmtool.ggo +++ /dev/null @@ -1,10 +0,0 @@ -package "esmtool" -version "1.0" -purpose "Inspect and extract from Morrowind ES files (ESM, ESP, ESS)" -args "--unamed-opts=ES-FILE -F esmtool_cmd -G" - -option "raw" r "Show an unformattet list of all records and subrecords" optional -option "quiet" q "Supress all record information. Useful for speed tests." optional -option "loadcells" C "Browse through contents of all cells." optional - -text "\nIf no option is given, the default action is to parse all records in the archive and display diagnostic information." diff --git a/apps/esmtool/esmtool_cmd.c b/apps/esmtool/esmtool_cmd.c deleted file mode 100644 index 3fce77de2..000000000 --- a/apps/esmtool/esmtool_cmd.c +++ /dev/null @@ -1,1141 +0,0 @@ -/* - File autogenerated by gengetopt version 2.22.2 - generated with the following command: - gengetopt --unamed-opts=ES-FILE -F esmtool_cmd -G - - The developers of gengetopt consider the fixed text that goes in all - gengetopt output files to be in the public domain: - we make no copyright claims on it. -*/ - -/* If we use autoconf. */ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include - -#ifndef FIX_UNUSED -#define FIX_UNUSED(X) (void) (X) /* avoid warnings for unused params */ -#endif - - -#include "esmtool_cmd.h" - -const char *gengetopt_args_info_purpose = "Inspect and extract from Morrowind ES files (ESM, ESP, ESS)"; - -const char *gengetopt_args_info_usage = "Usage: esmtool [OPTIONS]... [ES-FILE]..."; - -const char *gengetopt_args_info_description = ""; - -const char *gengetopt_args_info_help[] = { - " -h, --help Print help and exit", - " -V, --version Print version and exit", - " -r, --raw Show an unformattet list of all records and subrecords", - " -q, --quiet Supress all record information. Useful for speed tests.", - " -C, --loadcells Browse through contents of all cells.", - "\nIf no option is given, the default action is to parse all records in the \narchive and display diagnostic information.", - 0 -}; - -typedef enum {ARG_NO -} cmdline_parser_arg_type; - -static -void clear_given (struct gengetopt_args_info *args_info); -static -void clear_args (struct gengetopt_args_info *args_info); - -static int -cmdline_parser_internal (int argc, char * const *argv, struct gengetopt_args_info *args_info, - struct cmdline_parser_params *params, const char *additional_error); - - -static char * -gengetopt_strdup (const char *s); - -static -void clear_given (struct gengetopt_args_info *args_info) -{ - args_info->help_given = 0 ; - args_info->version_given = 0 ; - args_info->raw_given = 0 ; - args_info->quiet_given = 0 ; - args_info->loadcells_given = 0 ; -} - -static -void clear_args (struct gengetopt_args_info *args_info) -{ - FIX_UNUSED (args_info); - -} - -static -void init_args_info(struct gengetopt_args_info *args_info) -{ - - - args_info->help_help = gengetopt_args_info_help[0] ; - args_info->version_help = gengetopt_args_info_help[1] ; - args_info->raw_help = gengetopt_args_info_help[2] ; - args_info->quiet_help = gengetopt_args_info_help[3] ; - args_info->loadcells_help = gengetopt_args_info_help[4] ; - -} - -void -cmdline_parser_print_version (void) -{ - printf ("%s %s\n", - (strlen(CMDLINE_PARSER_PACKAGE_NAME) ? CMDLINE_PARSER_PACKAGE_NAME : CMDLINE_PARSER_PACKAGE), - CMDLINE_PARSER_VERSION); -} - -static void print_help_common(void) { - cmdline_parser_print_version (); - - if (strlen(gengetopt_args_info_purpose) > 0) - printf("\n%s\n", gengetopt_args_info_purpose); - - if (strlen(gengetopt_args_info_usage) > 0) - printf("\n%s\n", gengetopt_args_info_usage); - - printf("\n"); - - if (strlen(gengetopt_args_info_description) > 0) - printf("%s\n\n", gengetopt_args_info_description); -} - -void -cmdline_parser_print_help (void) -{ - int i = 0; - print_help_common(); - while (gengetopt_args_info_help[i]) - printf("%s\n", gengetopt_args_info_help[i++]); -} - -void -cmdline_parser_init (struct gengetopt_args_info *args_info) -{ - clear_given (args_info); - clear_args (args_info); - init_args_info (args_info); - - args_info->inputs = 0; - args_info->inputs_num = 0; -} - -void -cmdline_parser_params_init(struct cmdline_parser_params *params) -{ - if (params) - { - params->override = 0; - params->initialize = 1; - params->check_required = 1; - params->check_ambiguity = 0; - params->print_errors = 1; - } -} - -struct cmdline_parser_params * -cmdline_parser_params_create(void) -{ - struct cmdline_parser_params *params = - (struct cmdline_parser_params *)malloc(sizeof(struct cmdline_parser_params)); - cmdline_parser_params_init(params); - return params; -} - - - -static void -cmdline_parser_release (struct gengetopt_args_info *args_info) -{ - unsigned int i; - - - for (i = 0; i < args_info->inputs_num; ++i) - free (args_info->inputs [i]); - - if (args_info->inputs_num) - free (args_info->inputs); - - clear_given (args_info); -} - - -static void -write_into_file(FILE *outfile, const char *opt, const char *arg, const char *values[]) -{ - FIX_UNUSED (values); - if (arg) { - fprintf(outfile, "%s=\"%s\"\n", opt, arg); - } else { - fprintf(outfile, "%s\n", opt); - } -} - - -int -cmdline_parser_dump(FILE *outfile, struct gengetopt_args_info *args_info) -{ - int i = 0; - - if (!outfile) - { - fprintf (stderr, "%s: cannot dump options to stream\n", CMDLINE_PARSER_PACKAGE); - return EXIT_FAILURE; - } - - if (args_info->help_given) - write_into_file(outfile, "help", 0, 0 ); - if (args_info->version_given) - write_into_file(outfile, "version", 0, 0 ); - if (args_info->raw_given) - write_into_file(outfile, "raw", 0, 0 ); - if (args_info->quiet_given) - write_into_file(outfile, "quiet", 0, 0 ); - if (args_info->loadcells_given) - write_into_file(outfile, "loadcells", 0, 0 ); - - - i = EXIT_SUCCESS; - return i; -} - -int -cmdline_parser_file_save(const char *filename, struct gengetopt_args_info *args_info) -{ - FILE *outfile; - int i = 0; - - outfile = fopen(filename, "w"); - - if (!outfile) - { - fprintf (stderr, "%s: cannot open file for writing: %s\n", CMDLINE_PARSER_PACKAGE, filename); - return EXIT_FAILURE; - } - - i = cmdline_parser_dump(outfile, args_info); - fclose (outfile); - - return i; -} - -void -cmdline_parser_free (struct gengetopt_args_info *args_info) -{ - cmdline_parser_release (args_info); -} - -/** @brief replacement of strdup, which is not standard */ -char * -gengetopt_strdup (const char *s) -{ - char *result = 0; - if (!s) - return result; - - result = (char*)malloc(strlen(s) + 1); - if (result == (char*)0) - return (char*)0; - strcpy(result, s); - return result; -} - -int -cmdline_parser (int argc, char * const *argv, struct gengetopt_args_info *args_info) -{ - return cmdline_parser2 (argc, argv, args_info, 0, 1, 1); -} - -int -cmdline_parser_ext (int argc, char * const *argv, struct gengetopt_args_info *args_info, - struct cmdline_parser_params *params) -{ - int result; - result = cmdline_parser_internal (argc, argv, args_info, params, 0); - - if (result == EXIT_FAILURE) - { - cmdline_parser_free (args_info); - exit (EXIT_FAILURE); - } - - return result; -} - -int -cmdline_parser2 (int argc, char * const *argv, struct gengetopt_args_info *args_info, int override, int initialize, int check_required) -{ - int result; - struct cmdline_parser_params params; - - params.override = override; - params.initialize = initialize; - params.check_required = check_required; - params.check_ambiguity = 0; - params.print_errors = 1; - - result = cmdline_parser_internal (argc, argv, args_info, ¶ms, 0); - - if (result == EXIT_FAILURE) - { - cmdline_parser_free (args_info); - exit (EXIT_FAILURE); - } - - return result; -} - -int -cmdline_parser_required (struct gengetopt_args_info *args_info, const char *prog_name) -{ - FIX_UNUSED (args_info); - FIX_UNUSED (prog_name); - return EXIT_SUCCESS; -} - -/* - * Extracted from the glibc source tree, version 2.3.6 - * - * Licensed under the GPL as per the whole glibc source tree. - * - * This file was modified so that getopt_long can be called - * many times without risking previous memory to be spoiled. - * - * Modified by Andre Noll and Lorenzo Bettini for use in - * GNU gengetopt generated files. - * - */ - -/* - * we must include anything we need since this file is not thought to be - * inserted in a file already using getopt.h - * - * Lorenzo - */ - -struct option -{ - const char *name; - /* has_arg can't be an enum because some compilers complain about - type mismatches in all the code that assumes it is an int. */ - int has_arg; - int *flag; - int val; -}; - -/* This version of `getopt' appears to the caller like standard Unix `getopt' - but it behaves differently for the user, since it allows the user - to intersperse the options with the other arguments. - - As `getopt' works, it permutes the elements of ARGV so that, - when it is done, all the options precede everything else. Thus - all application programs are extended to handle flexible argument order. -*/ -/* - If the field `flag' is not NULL, it points to a variable that is set - to the value given in the field `val' when the option is found, but - left unchanged if the option is not found. - - To have a long-named option do something other than set an `int' to - a compiled-in constant, such as set a value from `custom_optarg', set the - option's `flag' field to zero and its `val' field to a nonzero - value (the equivalent single-letter option character, if there is - one). For long options that have a zero `flag' field, `getopt' - returns the contents of the `val' field. */ - -/* Names for the values of the `has_arg' field of `struct option'. */ -#ifndef no_argument -#define no_argument 0 -#endif - -#ifndef required_argument -#define required_argument 1 -#endif - -#ifndef optional_argument -#define optional_argument 2 -#endif - -struct custom_getopt_data { - /* - * These have exactly the same meaning as the corresponding global variables, - * except that they are used for the reentrant versions of getopt. - */ - int custom_optind; - int custom_opterr; - int custom_optopt; - char *custom_optarg; - - /* True if the internal members have been initialized. */ - int initialized; - - /* - * The next char to be scanned in the option-element in which the last option - * character we returned was found. This allows us to pick up the scan where - * we left off. If this is zero, or a null string, it means resume the scan by - * advancing to the next ARGV-element. - */ - char *nextchar; - - /* - * Describe the part of ARGV that contains non-options that have been skipped. - * `first_nonopt' is the index in ARGV of the first of them; `last_nonopt' is - * the index after the last of them. - */ - int first_nonopt; - int last_nonopt; -}; - -/* - * the variables optarg, optind, opterr and optopt are renamed with - * the custom_ prefix so that they don't interfere with getopt ones. - * - * Moreover they're static so they are visible only from within the - * file where this very file will be included. - */ - -/* - * For communication from `custom_getopt' to the caller. When `custom_getopt' finds an - * option that takes an argument, the argument value is returned here. - */ -static char *custom_optarg; - -/* - * Index in ARGV of the next element to be scanned. This is used for - * communication to and from the caller and for communication between - * successive calls to `custom_getopt'. - * - * On entry to `custom_getopt', 1 means this is the first call; initialize. - * - * When `custom_getopt' returns -1, this is the index of the first of the non-option - * elements that the caller should itself scan. - * - * Otherwise, `custom_optind' communicates from one call to the next how much of ARGV - * has been scanned so far. - * - * 1003.2 says this must be 1 before any call. - */ -static int custom_optind = 1; - -/* - * Callers store zero here to inhibit the error message for unrecognized - * options. - */ -static int custom_opterr = 1; - -/* - * Set to an option character which was unrecognized. This must be initialized - * on some systems to avoid linking in the system's own getopt implementation. - */ -static int custom_optopt = '?'; - -/* - * Exchange two adjacent subsequences of ARGV. One subsequence is elements - * [first_nonopt,last_nonopt) which contains all the non-options that have been - * skipped so far. The other is elements [last_nonopt,custom_optind), which contains - * all the options processed since those non-options were skipped. - * `first_nonopt' and `last_nonopt' are relocated so that they describe the new - * indices of the non-options in ARGV after they are moved. - */ -static void exchange(char **argv, struct custom_getopt_data *d) -{ - int bottom = d->first_nonopt; - int middle = d->last_nonopt; - int top = d->custom_optind; - char *tem; - - /* - * Exchange the shorter segment with the far end of the longer segment. - * That puts the shorter segment into the right place. It leaves the - * longer segment in the right place overall, but it consists of two - * parts that need to be swapped next. - */ - while (top > middle && middle > bottom) { - if (top - middle > middle - bottom) { - /* Bottom segment is the short one. */ - int len = middle - bottom; - int i; - - /* Swap it with the top part of the top segment. */ - for (i = 0; i < len; i++) { - tem = argv[bottom + i]; - argv[bottom + i] = - argv[top - (middle - bottom) + i]; - argv[top - (middle - bottom) + i] = tem; - } - /* Exclude the moved bottom segment from further swapping. */ - top -= len; - } else { - /* Top segment is the short one. */ - int len = top - middle; - int i; - - /* Swap it with the bottom part of the bottom segment. */ - for (i = 0; i < len; i++) { - tem = argv[bottom + i]; - argv[bottom + i] = argv[middle + i]; - argv[middle + i] = tem; - } - /* Exclude the moved top segment from further swapping. */ - bottom += len; - } - } - /* Update records for the slots the non-options now occupy. */ - d->first_nonopt += (d->custom_optind - d->last_nonopt); - d->last_nonopt = d->custom_optind; -} - -/* Initialize the internal data when the first call is made. */ -static void custom_getopt_initialize(struct custom_getopt_data *d) -{ - /* - * Start processing options with ARGV-element 1 (since ARGV-element 0 - * is the program name); the sequence of previously skipped non-option - * ARGV-elements is empty. - */ - d->first_nonopt = d->last_nonopt = d->custom_optind; - d->nextchar = NULL; - d->initialized = 1; -} - -#define NONOPTION_P (argv[d->custom_optind][0] != '-' || argv[d->custom_optind][1] == '\0') - -/* return: zero: continue, nonzero: return given value to user */ -static int shuffle_argv(int argc, char *const *argv,const struct option *longopts, - struct custom_getopt_data *d) -{ - /* - * Give FIRST_NONOPT & LAST_NONOPT rational values if CUSTOM_OPTIND has been - * moved back by the user (who may also have changed the arguments). - */ - if (d->last_nonopt > d->custom_optind) - d->last_nonopt = d->custom_optind; - if (d->first_nonopt > d->custom_optind) - d->first_nonopt = d->custom_optind; - /* - * If we have just processed some options following some - * non-options, exchange them so that the options come first. - */ - if (d->first_nonopt != d->last_nonopt && - d->last_nonopt != d->custom_optind) - exchange((char **) argv, d); - else if (d->last_nonopt != d->custom_optind) - d->first_nonopt = d->custom_optind; - /* - * Skip any additional non-options and extend the range of - * non-options previously skipped. - */ - while (d->custom_optind < argc && NONOPTION_P) - d->custom_optind++; - d->last_nonopt = d->custom_optind; - /* - * The special ARGV-element `--' means premature end of options. Skip - * it like a null option, then exchange with previous non-options as if - * it were an option, then skip everything else like a non-option. - */ - if (d->custom_optind != argc && !strcmp(argv[d->custom_optind], "--")) { - d->custom_optind++; - if (d->first_nonopt != d->last_nonopt - && d->last_nonopt != d->custom_optind) - exchange((char **) argv, d); - else if (d->first_nonopt == d->last_nonopt) - d->first_nonopt = d->custom_optind; - d->last_nonopt = argc; - d->custom_optind = argc; - } - /* - * If we have done all the ARGV-elements, stop the scan and back over - * any non-options that we skipped and permuted. - */ - if (d->custom_optind == argc) { - /* - * Set the next-arg-index to point at the non-options that we - * previously skipped, so the caller will digest them. - */ - if (d->first_nonopt != d->last_nonopt) - d->custom_optind = d->first_nonopt; - return -1; - } - /* - * If we have come to a non-option and did not permute it, either stop - * the scan or describe it to the caller and pass it by. - */ - if (NONOPTION_P) { - d->custom_optarg = argv[d->custom_optind++]; - return 1; - } - /* - * We have found another option-ARGV-element. Skip the initial - * punctuation. - */ - d->nextchar = (argv[d->custom_optind] + 1 + (longopts != NULL && argv[d->custom_optind][1] == '-')); - return 0; -} - -/* - * Check whether the ARGV-element is a long option. - * - * If there's a long option "fubar" and the ARGV-element is "-fu", consider - * that an abbreviation of the long option, just like "--fu", and not "-f" with - * arg "u". - * - * This distinction seems to be the most useful approach. - * - */ -static int check_long_opt(int argc, char *const *argv, const char *optstring, - const struct option *longopts, int *longind, - int print_errors, struct custom_getopt_data *d) -{ - char *nameend; - const struct option *p; - const struct option *pfound = NULL; - int exact = 0; - int ambig = 0; - int indfound = -1; - int option_index; - - for (nameend = d->nextchar; *nameend && *nameend != '='; nameend++) - /* Do nothing. */ ; - - /* Test all long options for either exact match or abbreviated matches */ - for (p = longopts, option_index = 0; p->name; p++, option_index++) - if (!strncmp(p->name, d->nextchar, nameend - d->nextchar)) { - if ((unsigned int) (nameend - d->nextchar) - == (unsigned int) strlen(p->name)) { - /* Exact match found. */ - pfound = p; - indfound = option_index; - exact = 1; - break; - } else if (pfound == NULL) { - /* First nonexact match found. */ - pfound = p; - indfound = option_index; - } else if (pfound->has_arg != p->has_arg - || pfound->flag != p->flag - || pfound->val != p->val) - /* Second or later nonexact match found. */ - ambig = 1; - } - if (ambig && !exact) { - if (print_errors) { - fprintf(stderr, - "%s: option `%s' is ambiguous\n", - argv[0], argv[d->custom_optind]); - } - d->nextchar += strlen(d->nextchar); - d->custom_optind++; - d->custom_optopt = 0; - return '?'; - } - if (pfound) { - option_index = indfound; - d->custom_optind++; - if (*nameend) { - if (pfound->has_arg != no_argument) - d->custom_optarg = nameend + 1; - else { - if (print_errors) { - if (argv[d->custom_optind - 1][1] == '-') { - /* --option */ - fprintf(stderr, "%s: option `--%s' doesn't allow an argument\n", - argv[0], pfound->name); - } else { - /* +option or -option */ - fprintf(stderr, "%s: option `%c%s' doesn't allow an argument\n", - argv[0], argv[d->custom_optind - 1][0], pfound->name); - } - - } - d->nextchar += strlen(d->nextchar); - d->custom_optopt = pfound->val; - return '?'; - } - } else if (pfound->has_arg == required_argument) { - if (d->custom_optind < argc) - d->custom_optarg = argv[d->custom_optind++]; - else { - if (print_errors) { - fprintf(stderr, - "%s: option `%s' requires an argument\n", - argv[0], - argv[d->custom_optind - 1]); - } - d->nextchar += strlen(d->nextchar); - d->custom_optopt = pfound->val; - return optstring[0] == ':' ? ':' : '?'; - } - } - d->nextchar += strlen(d->nextchar); - if (longind != NULL) - *longind = option_index; - if (pfound->flag) { - *(pfound->flag) = pfound->val; - return 0; - } - return pfound->val; - } - /* - * Can't find it as a long option. If this is not getopt_long_only, or - * the option starts with '--' or is not a valid short option, then - * it's an error. Otherwise interpret it as a short option. - */ - if (print_errors) { - if (argv[d->custom_optind][1] == '-') { - /* --option */ - fprintf(stderr, - "%s: unrecognized option `--%s'\n", - argv[0], d->nextchar); - } else { - /* +option or -option */ - fprintf(stderr, - "%s: unrecognized option `%c%s'\n", - argv[0], argv[d->custom_optind][0], - d->nextchar); - } - } - d->nextchar = (char *) ""; - d->custom_optind++; - d->custom_optopt = 0; - return '?'; -} - -static int check_short_opt(int argc, char *const *argv, const char *optstring, - int print_errors, struct custom_getopt_data *d) -{ - char c = *d->nextchar++; - const char *temp = strchr(optstring, c); - - /* Increment `custom_optind' when we start to process its last character. */ - if (*d->nextchar == '\0') - ++d->custom_optind; - if (!temp || c == ':') { - if (print_errors) - fprintf(stderr, "%s: invalid option -- %c\n", argv[0], c); - - d->custom_optopt = c; - return '?'; - } - if (temp[1] == ':') { - if (temp[2] == ':') { - /* This is an option that accepts an argument optionally. */ - if (*d->nextchar != '\0') { - d->custom_optarg = d->nextchar; - d->custom_optind++; - } else - d->custom_optarg = NULL; - d->nextchar = NULL; - } else { - /* This is an option that requires an argument. */ - if (*d->nextchar != '\0') { - d->custom_optarg = d->nextchar; - /* - * If we end this ARGV-element by taking the - * rest as an arg, we must advance to the next - * element now. - */ - d->custom_optind++; - } else if (d->custom_optind == argc) { - if (print_errors) { - fprintf(stderr, - "%s: option requires an argument -- %c\n", - argv[0], c); - } - d->custom_optopt = c; - if (optstring[0] == ':') - c = ':'; - else - c = '?'; - } else - /* - * We already incremented `custom_optind' once; - * increment it again when taking next ARGV-elt - * as argument. - */ - d->custom_optarg = argv[d->custom_optind++]; - d->nextchar = NULL; - } - } - return c; -} - -/* - * Scan elements of ARGV for option characters given in OPTSTRING. - * - * If an element of ARGV starts with '-', and is not exactly "-" or "--", - * then it is an option element. The characters of this element - * (aside from the initial '-') are option characters. If `getopt' - * is called repeatedly, it returns successively each of the option characters - * from each of the option elements. - * - * If `getopt' finds another option character, it returns that character, - * updating `custom_optind' and `nextchar' so that the next call to `getopt' can - * resume the scan with the following option character or ARGV-element. - * - * If there are no more option characters, `getopt' returns -1. - * Then `custom_optind' is the index in ARGV of the first ARGV-element - * that is not an option. (The ARGV-elements have been permuted - * so that those that are not options now come last.) - * - * OPTSTRING is a string containing the legitimate option characters. - * If an option character is seen that is not listed in OPTSTRING, - * return '?' after printing an error message. If you set `custom_opterr' to - * zero, the error message is suppressed but we still return '?'. - * - * If a char in OPTSTRING is followed by a colon, that means it wants an arg, - * so the following text in the same ARGV-element, or the text of the following - * ARGV-element, is returned in `custom_optarg'. Two colons mean an option that - * wants an optional arg; if there is text in the current ARGV-element, - * it is returned in `custom_optarg', otherwise `custom_optarg' is set to zero. - * - * If OPTSTRING starts with `-' or `+', it requests different methods of - * handling the non-option ARGV-elements. - * See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. - * - * Long-named options begin with `--' instead of `-'. - * Their names may be abbreviated as long as the abbreviation is unique - * or is an exact match for some defined option. If they have an - * argument, it follows the option name in the same ARGV-element, separated - * from the option name by a `=', or else the in next ARGV-element. - * When `getopt' finds a long-named option, it returns 0 if that option's - * `flag' field is nonzero, the value of the option's `val' field - * if the `flag' field is zero. - * - * The elements of ARGV aren't really const, because we permute them. - * But we pretend they're const in the prototype to be compatible - * with other systems. - * - * LONGOPTS is a vector of `struct option' terminated by an - * element containing a name which is zero. - * - * LONGIND returns the index in LONGOPT of the long-named option found. - * It is only valid when a long-named option has been found by the most - * recent call. - * - * Return the option character from OPTS just read. Return -1 when there are - * no more options. For unrecognized options, or options missing arguments, - * `custom_optopt' is set to the option letter, and '?' is returned. - * - * The OPTS string is a list of characters which are recognized option letters, - * optionally followed by colons, specifying that that letter takes an - * argument, to be placed in `custom_optarg'. - * - * If a letter in OPTS is followed by two colons, its argument is optional. - * This behavior is specific to the GNU `getopt'. - * - * The argument `--' causes premature termination of argument scanning, - * explicitly telling `getopt' that there are no more options. If OPTS begins - * with `--', then non-option arguments are treated as arguments to the option - * '\0'. This behavior is specific to the GNU `getopt'. - */ - -static int getopt_internal_r(int argc, char *const *argv, const char *optstring, - const struct option *longopts, int *longind, - struct custom_getopt_data *d) -{ - int ret, print_errors = d->custom_opterr; - - if (optstring[0] == ':') - print_errors = 0; - if (argc < 1) - return -1; - d->custom_optarg = NULL; - - /* - * This is a big difference with GNU getopt, since optind == 0 - * means initialization while here 1 means first call. - */ - if (d->custom_optind == 0 || !d->initialized) { - if (d->custom_optind == 0) - d->custom_optind = 1; /* Don't scan ARGV[0], the program name. */ - custom_getopt_initialize(d); - } - if (d->nextchar == NULL || *d->nextchar == '\0') { - ret = shuffle_argv(argc, argv, longopts, d); - if (ret) - return ret; - } - if (longopts && (argv[d->custom_optind][1] == '-' )) - return check_long_opt(argc, argv, optstring, longopts, - longind, print_errors, d); - return check_short_opt(argc, argv, optstring, print_errors, d); -} - -static int custom_getopt_internal(int argc, char *const *argv, const char *optstring, - const struct option *longopts, int *longind) -{ - int result; - /* Keep a global copy of all internal members of d */ - static struct custom_getopt_data d; - - d.custom_optind = custom_optind; - d.custom_opterr = custom_opterr; - result = getopt_internal_r(argc, argv, optstring, longopts, - longind, &d); - custom_optind = d.custom_optind; - custom_optarg = d.custom_optarg; - custom_optopt = d.custom_optopt; - return result; -} - -static int custom_getopt_long (int argc, char *const *argv, const char *options, - const struct option *long_options, int *opt_index) -{ - return custom_getopt_internal(argc, argv, options, long_options, - opt_index); -} - - -static char *package_name = 0; - -/** - * @brief updates an option - * @param field the generic pointer to the field to update - * @param orig_field the pointer to the orig field - * @param field_given the pointer to the number of occurrence of this option - * @param prev_given the pointer to the number of occurrence already seen - * @param value the argument for this option (if null no arg was specified) - * @param possible_values the possible values for this option (if specified) - * @param default_value the default value (in case the option only accepts fixed values) - * @param arg_type the type of this option - * @param check_ambiguity @see cmdline_parser_params.check_ambiguity - * @param override @see cmdline_parser_params.override - * @param no_free whether to free a possible previous value - * @param multiple_option whether this is a multiple option - * @param long_opt the corresponding long option - * @param short_opt the corresponding short option (or '-' if none) - * @param additional_error possible further error specification - */ -static -int update_arg(void *field, char **orig_field, - unsigned int *field_given, unsigned int *prev_given, - char *value, const char *possible_values[], - const char *default_value, - cmdline_parser_arg_type arg_type, - int check_ambiguity, int override, - int no_free, int multiple_option, - const char *long_opt, char short_opt, - const char *additional_error) -{ - //char *stop_char = 0; - //const char *val = value; - //int found; - FIX_UNUSED (field); - - //stop_char = 0; - //found = 0; - - if (!multiple_option && prev_given && (*prev_given || (check_ambiguity && *field_given))) - { - if (short_opt != '-') - fprintf (stderr, "%s: `--%s' (`-%c') option given more than once%s\n", - package_name, long_opt, short_opt, - (additional_error ? additional_error : "")); - else - fprintf (stderr, "%s: `--%s' option given more than once%s\n", - package_name, long_opt, - (additional_error ? additional_error : "")); - return 1; /* failure */ - } - - FIX_UNUSED (default_value); - - if (field_given && *field_given && ! override) - return 0; - if (prev_given) - (*prev_given)++; - if (field_given) - (*field_given)++; - //if (possible_values) - //val = possible_values[found]; - - switch(arg_type) { - default: - break; - }; - - - /* store the original value */ - switch(arg_type) { - case ARG_NO: - break; - default: - if (value && orig_field) { - if (no_free) { - *orig_field = value; - } else { - if (*orig_field) - free (*orig_field); /* free previous string */ - *orig_field = gengetopt_strdup (value); - } - } - }; - - return 0; /* OK */ -} - - -int -cmdline_parser_internal ( - int argc, char * const *argv, struct gengetopt_args_info *args_info, - struct cmdline_parser_params *params, const char *additional_error) -{ - int c; /* Character of the parsed option. */ - - int error = 0; - struct gengetopt_args_info local_args_info; - - int override; - int initialize; - //int check_required; - int check_ambiguity; - - char *optarg; - int optind; - int opterr; - int optopt; - - package_name = argv[0]; - - override = params->override; - initialize = params->initialize; - //check_required = params->check_required; - check_ambiguity = params->check_ambiguity; - - if (initialize) - cmdline_parser_init (args_info); - - cmdline_parser_init (&local_args_info); - - optarg = 0; - optind = 0; - opterr = params->print_errors; - optopt = '?'; - - while (1) - { - int option_index = 0; - - static struct option long_options[] = { - { "help", 0, NULL, 'h' }, - { "version", 0, NULL, 'V' }, - { "raw", 0, NULL, 'r' }, - { "quiet", 0, NULL, 'q' }, - { "loadcells", 0, NULL, 'C' }, - { 0, 0, 0, 0 } - }; - - custom_optarg = optarg; - custom_optind = optind; - custom_opterr = opterr; - custom_optopt = optopt; - - c = custom_getopt_long (argc, argv, "hVrqC", long_options, &option_index); - - optarg = custom_optarg; - optind = custom_optind; - opterr = custom_opterr; - optopt = custom_optopt; - - if (c == -1) break; /* Exit from `while (1)' loop. */ - - switch (c) - { - case 'h': /* Print help and exit. */ - cmdline_parser_print_help (); - cmdline_parser_free (&local_args_info); - exit (EXIT_SUCCESS); - - case 'V': /* Print version and exit. */ - cmdline_parser_print_version (); - cmdline_parser_free (&local_args_info); - exit (EXIT_SUCCESS); - - case 'r': /* Show an unformattet list of all records and subrecords. */ - - - if (update_arg( 0 , - 0 , &(args_info->raw_given), - &(local_args_info.raw_given), optarg, 0, 0, ARG_NO, - check_ambiguity, override, 0, 0, - "raw", 'r', - additional_error)) - goto failure; - - break; - case 'q': /* Supress all record information. Useful for speed tests.. */ - - - if (update_arg( 0 , - 0 , &(args_info->quiet_given), - &(local_args_info.quiet_given), optarg, 0, 0, ARG_NO, - check_ambiguity, override, 0, 0, - "quiet", 'q', - additional_error)) - goto failure; - - break; - case 'C': /* Browse through contents of all cells.. */ - - - if (update_arg( 0 , - 0 , &(args_info->loadcells_given), - &(local_args_info.loadcells_given), optarg, 0, 0, ARG_NO, - check_ambiguity, override, 0, 0, - "loadcells", 'C', - additional_error)) - goto failure; - - break; - - case 0: /* Long option with no short option */ - case '?': /* Invalid option. */ - /* `getopt_long' already printed an error message. */ - goto failure; - - default: /* bug: option not considered. */ - fprintf (stderr, "%s: option unknown: %c%s\n", CMDLINE_PARSER_PACKAGE, c, (additional_error ? additional_error : "")); - abort (); - } /* switch */ - } /* while */ - - - - - cmdline_parser_release (&local_args_info); - - if ( error ) - return (EXIT_FAILURE); - - if (optind < argc) - { - int i = 0 ; - int found_prog_name = 0; - /* whether program name, i.e., argv[0], is in the remaining args - (this may happen with some implementations of getopt, - but surely not with the one included by gengetopt) */ - - - args_info->inputs_num = argc - optind - found_prog_name; - args_info->inputs = - (char **)(malloc ((args_info->inputs_num)*sizeof(char *))) ; - while (optind < argc) - args_info->inputs[ i++ ] = gengetopt_strdup (argv[optind++]) ; - } - - return 0; - -failure: - - cmdline_parser_release (&local_args_info); - return (EXIT_FAILURE); -} diff --git a/apps/esmtool/esmtool_cmd.h b/apps/esmtool/esmtool_cmd.h deleted file mode 100644 index 8c420c189..000000000 --- a/apps/esmtool/esmtool_cmd.h +++ /dev/null @@ -1,179 +0,0 @@ -/** @file esmtool_cmd.h - * @brief The header file for the command line option parser - * generated by GNU Gengetopt version 2.22.2 - * http://www.gnu.org/software/gengetopt. - * DO NOT modify this file, since it can be overwritten - * @author GNU Gengetopt by Lorenzo Bettini */ - -#ifndef ESMTOOL_CMD_H -#define ESMTOOL_CMD_H - -/* If we use autoconf. */ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include /* for FILE */ - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#ifndef CMDLINE_PARSER_PACKAGE -/** @brief the program name (used for printing errors) */ -#define CMDLINE_PARSER_PACKAGE "esmtool" -#endif - -#ifndef CMDLINE_PARSER_PACKAGE_NAME -/** @brief the complete program name (used for help and version) */ -#define CMDLINE_PARSER_PACKAGE_NAME "esmtool" -#endif - -#ifndef CMDLINE_PARSER_VERSION -/** @brief the program version */ -#define CMDLINE_PARSER_VERSION "1.0" -#endif - -/** @brief Where the command line options are stored */ -struct gengetopt_args_info -{ - const char *help_help; /**< @brief Print help and exit help description. */ - const char *version_help; /**< @brief Print version and exit help description. */ - const char *raw_help; /**< @brief Show an unformattet list of all records and subrecords help description. */ - const char *quiet_help; /**< @brief Supress all record information. Useful for speed tests. help description. */ - const char *loadcells_help; /**< @brief Browse through contents of all cells. help description. */ - - unsigned int help_given ; /**< @brief Whether help was given. */ - unsigned int version_given ; /**< @brief Whether version was given. */ - unsigned int raw_given ; /**< @brief Whether raw was given. */ - unsigned int quiet_given ; /**< @brief Whether quiet was given. */ - unsigned int loadcells_given ; /**< @brief Whether loadcells was given. */ - - char **inputs ; /**< @brief unamed options (options without names) */ - unsigned inputs_num ; /**< @brief unamed options number */ -} ; - -/** @brief The additional parameters to pass to parser functions */ -struct cmdline_parser_params -{ - int override; /**< @brief whether to override possibly already present options (default 0) */ - int initialize; /**< @brief whether to initialize the option structure gengetopt_args_info (default 1) */ - int check_required; /**< @brief whether to check that all required options were provided (default 1) */ - int check_ambiguity; /**< @brief whether to check for options already specified in the option structure gengetopt_args_info (default 0) */ - int print_errors; /**< @brief whether getopt_long should print an error message for a bad option (default 1) */ -} ; - -/** @brief the purpose string of the program */ -extern const char *gengetopt_args_info_purpose; -/** @brief the usage string of the program */ -extern const char *gengetopt_args_info_usage; -/** @brief all the lines making the help output */ -extern const char *gengetopt_args_info_help[]; - -/** - * The command line parser - * @param argc the number of command line options - * @param argv the command line options - * @param args_info the structure where option information will be stored - * @return 0 if everything went fine, NON 0 if an error took place - */ -int cmdline_parser (int argc, char * const *argv, - struct gengetopt_args_info *args_info); - -/** - * The command line parser (version with additional parameters - deprecated) - * @param argc the number of command line options - * @param argv the command line options - * @param args_info the structure where option information will be stored - * @param override whether to override possibly already present options - * @param initialize whether to initialize the option structure my_args_info - * @param check_required whether to check that all required options were provided - * @return 0 if everything went fine, NON 0 if an error took place - * @deprecated use cmdline_parser_ext() instead - */ -int cmdline_parser2 (int argc, char * const *argv, - struct gengetopt_args_info *args_info, - int override, int initialize, int check_required); - -/** - * The command line parser (version with additional parameters) - * @param argc the number of command line options - * @param argv the command line options - * @param args_info the structure where option information will be stored - * @param params additional parameters for the parser - * @return 0 if everything went fine, NON 0 if an error took place - */ -int cmdline_parser_ext (int argc, char * const *argv, - struct gengetopt_args_info *args_info, - struct cmdline_parser_params *params); - -/** - * Save the contents of the option struct into an already open FILE stream. - * @param outfile the stream where to dump options - * @param args_info the option struct to dump - * @return 0 if everything went fine, NON 0 if an error took place - */ -int cmdline_parser_dump(FILE *outfile, - struct gengetopt_args_info *args_info); - -/** - * Save the contents of the option struct into a (text) file. - * This file can be read by the config file parser (if generated by gengetopt) - * @param filename the file where to save - * @param args_info the option struct to save - * @return 0 if everything went fine, NON 0 if an error took place - */ -int cmdline_parser_file_save(const char *filename, - struct gengetopt_args_info *args_info); - -/** - * Print the help - */ -void cmdline_parser_print_help(void); -/** - * Print the version - */ -void cmdline_parser_print_version(void); - -/** - * Initializes all the fields a cmdline_parser_params structure - * to their default values - * @param params the structure to initialize - */ -void cmdline_parser_params_init(struct cmdline_parser_params *params); - -/** - * Allocates dynamically a cmdline_parser_params structure and initializes - * all its fields to their default values - * @return the created and initialized cmdline_parser_params structure - */ -struct cmdline_parser_params *cmdline_parser_params_create(void); - -/** - * Initializes the passed gengetopt_args_info structure's fields - * (also set default values for options that have a default) - * @param args_info the structure to initialize - */ -void cmdline_parser_init (struct gengetopt_args_info *args_info); -/** - * Deallocates the string fields of the gengetopt_args_info structure - * (but does not deallocate the structure itself) - * @param args_info the structure to deallocate - */ -void cmdline_parser_free (struct gengetopt_args_info *args_info); - -/** - * Checks that all the required options were specified - * @param args_info the structure to check - * @param prog_name the name of the program that will be used to print - * possible errors - * @return - */ -int cmdline_parser_required (struct gengetopt_args_info *args_info, - const char *prog_name); - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ -#endif /* ESMTOOL_CMD_H */ diff --git a/apps/openmw/CMakeLists.txt b/apps/openmw/CMakeLists.txt index d8fe3deb5..39cd99cf6 100644 --- a/apps/openmw/CMakeLists.txt +++ b/apps/openmw/CMakeLists.txt @@ -14,7 +14,7 @@ set(GAME_HEADER source_group(game FILES ${GAME} ${GAME_HEADER}) add_openmw_dir (mwrender - renderingmanager debugging sky player animation npcanimation creatureanimation actors objects renderinginterface + renderingmanager debugging sky player animation npcanimation creatureanimation actors objects renderinginterface ) add_openmw_dir (mwinput @@ -23,7 +23,7 @@ add_openmw_dir (mwinput add_openmw_dir (mwgui layouts text_input widgets race class birth review window_manager console dialogue - dialogue_history window_base stats_window messagebox journalwindow + dialogue_history window_base stats_window messagebox journalwindow charactercreation ) add_openmw_dir (mwdialogue @@ -43,8 +43,8 @@ add_openmw_dir (mwsound add_openmw_dir (mwworld refdata world physicssystem scene environment globals class action nullaction actionteleport - containerstore actiontalk actiontake containerstore manualref containerutil player cellfunctors - cells localscripts + containerstore actiontalk actiontake manualref player cellfunctors + cells localscripts customdata weather ) add_openmw_dir (mwclass @@ -77,7 +77,6 @@ target_link_libraries(openmw ${OPENAL_LIBRARY} ${SOUND_INPUT_LIBRARY} ${BULLET_LIBRARIES} - caelum components MyGUIEngine MyGUIOgrePlatform diff --git a/apps/openmw/engine.cpp b/apps/openmw/engine.cpp index 6535974a9..c2700752f 100644 --- a/apps/openmw/engine.cpp +++ b/apps/openmw/engine.cpp @@ -37,8 +37,6 @@ #include "mwsound/soundmanager.hpp" #include "mwworld/world.hpp" -#include "mwworld/ptr.hpp" -#include "mwworld/environment.hpp" #include "mwworld/class.hpp" #include "mwworld/player.hpp" @@ -177,7 +175,6 @@ bool OMW::Engine::frameRenderingQueued (const Ogre::FrameEvent& evt) OMW::Engine::Engine(Files::ConfigurationManager& configurationManager) : mOgre (0) - , mPhysicEngine (0) , mFpsLevel(0) , mDebug (false) , mVerboseScripts (false) @@ -188,7 +185,6 @@ OMW::Engine::Engine(Files::ConfigurationManager& configurationManager) , mFocusTDiff (0) , mScriptManager (0) , mScriptContext (0) - , mGuiManager (0) , mFSStrict (false) , mCfgMgr(configurationManager) { @@ -198,7 +194,6 @@ OMW::Engine::Engine(Files::ConfigurationManager& configurationManager) OMW::Engine::~Engine() { - delete mGuiManager; delete mEnvironment.mWorld; delete mEnvironment.mSoundManager; delete mEnvironment.mGlobalScripts; @@ -207,7 +202,6 @@ OMW::Engine::~Engine() delete mEnvironment.mJournal; delete mScriptManager; delete mScriptContext; - delete mPhysicEngine; delete mOgre; } @@ -334,26 +328,15 @@ void OMW::Engine::go() loadBSA(); - /// \todo move this into the physics manager - // Create physics. shapeLoader is deleted by the physic engine - NifBullet::ManualBulletShapeLoader* shapeLoader = new NifBullet::ManualBulletShapeLoader(); - mPhysicEngine = new OEngine::Physic::PhysicEngine(shapeLoader); - // Create the world - mEnvironment.mWorld = new MWWorld::World (*mOgre, mPhysicEngine, mFileCollections, mMaster, + mEnvironment.mWorld = new MWWorld::World (*mOgre, mFileCollections, mMaster, mResDir, mNewGame, mEnvironment, mEncoding); - /// \todo move this into the GUI manager (a.k.a WindowManager) - // Set up the GUI system - mGuiManager = new OEngine::GUI::MyGUIManager(mOgre->getWindow(), mOgre->getScene(), false, - mCfgMgr.getLogPath().string() + std::string("/")); - - // Create window manager - this manages all the MW-specific GUI windows MWScript::registerExtensions (mExtensions); - mEnvironment.mWindowManager = new MWGui::WindowManager(mGuiManager->getGui(), mEnvironment, - mExtensions, mFpsLevel, mNewGame); + mEnvironment.mWindowManager = new MWGui::WindowManager(mEnvironment, + mExtensions, mFpsLevel, mNewGame, mOgre, mCfgMgr.getLogPath().string() + std::string("/")); // Create sound system mEnvironment.mSoundManager = new MWSound::SoundManager(mOgre->getRoot(), diff --git a/apps/openmw/engine.hpp b/apps/openmw/engine.hpp index b6d52a35d..5c5cdc018 100644 --- a/apps/openmw/engine.hpp +++ b/apps/openmw/engine.hpp @@ -7,8 +7,6 @@ #include -#include - #include #include @@ -67,7 +65,6 @@ namespace OMW Files::PathContainer mDataDirs; boost::filesystem::path mResDir; OEngine::Render::OgreRenderer *mOgre; - OEngine::Physic::PhysicEngine* mPhysicEngine; std::string mCellName; std::string mMaster; int mFpsLevel; @@ -84,7 +81,7 @@ namespace OMW MWScript::ScriptManager *mScriptManager; Compiler::Extensions mExtensions; Compiler::Context *mScriptContext; - OEngine::GUI::MyGUIManager *mGuiManager; + Files::Collections mFileCollections; bool mFSStrict; diff --git a/apps/openmw/mwclass/apparatus.cpp b/apps/openmw/mwclass/apparatus.cpp index 30b308e70..da7ff8696 100644 --- a/apps/openmw/mwclass/apparatus.cpp +++ b/apps/openmw/mwclass/apparatus.cpp @@ -8,8 +8,7 @@ #include "../mwworld/ptr.hpp" #include "../mwworld/actiontake.hpp" - -#include "containerutil.hpp" +#include "../mwrender/objects.hpp" namespace MWClass { @@ -20,7 +19,7 @@ namespace MWClass assert (ref->base != NULL); const std::string &model = ref->base->model; - + if (!model.empty()) { MWRender::Objects& objects = renderingInterface.getObjects(); @@ -58,12 +57,6 @@ namespace MWClass new MWWorld::ActionTake (ptr)); } - void Apparatus::insertIntoContainer (const MWWorld::Ptr& ptr, - MWWorld::ContainerStore& containerStore) const - { - insertIntoContainerStore (ptr, containerStore.appas); - } - std::string Apparatus::getScript (const MWWorld::Ptr& ptr) const { ESMS::LiveCellRef *ref = diff --git a/apps/openmw/mwclass/apparatus.hpp b/apps/openmw/mwclass/apparatus.hpp index 4c8a2c0e2..86223cf60 100644 --- a/apps/openmw/mwclass/apparatus.hpp +++ b/apps/openmw/mwclass/apparatus.hpp @@ -2,7 +2,6 @@ #define GAME_MWCLASS_APPARATUS_H #include "../mwworld/class.hpp" -#include "../mwrender/objects.hpp" namespace MWClass { @@ -23,10 +22,6 @@ namespace MWClass const MWWorld::Ptr& actor, const MWWorld::Environment& environment) const; ///< Generate action for activation - virtual void insertIntoContainer (const MWWorld::Ptr& ptr, - MWWorld::ContainerStore& containerStore) const; - ///< Insert into a containe - virtual std::string getScript (const MWWorld::Ptr& ptr) const; ///< Return name of the script attached to ptr diff --git a/apps/openmw/mwclass/armor.cpp b/apps/openmw/mwclass/armor.cpp index a8a431acf..3cdf63119 100644 --- a/apps/openmw/mwclass/armor.cpp +++ b/apps/openmw/mwclass/armor.cpp @@ -8,8 +8,7 @@ #include "../mwworld/ptr.hpp" #include "../mwworld/actiontake.hpp" - -#include "containerutil.hpp" +#include "../mwrender/objects.hpp" namespace MWClass { @@ -20,7 +19,7 @@ namespace MWClass assert (ref->base != NULL); const std::string &model = ref->base->model; - + if (!model.empty()) { MWRender::Objects& objects = renderingInterface.getObjects(); @@ -70,12 +69,6 @@ namespace MWClass return ref->base->data.health; } - void Armor::insertIntoContainer (const MWWorld::Ptr& ptr, - MWWorld::ContainerStore& containerStore) const - { - insertIntoContainerStore (ptr, containerStore.armors); - } - std::string Armor::getScript (const MWWorld::Ptr& ptr) const { ESMS::LiveCellRef *ref = diff --git a/apps/openmw/mwclass/armor.hpp b/apps/openmw/mwclass/armor.hpp index c5f9812b7..060bc364e 100644 --- a/apps/openmw/mwclass/armor.hpp +++ b/apps/openmw/mwclass/armor.hpp @@ -2,7 +2,6 @@ #define GAME_MWCLASS_ARMOR_H #include "../mwworld/class.hpp" -#include "../mwrender/objects.hpp" namespace MWClass { @@ -29,10 +28,6 @@ namespace MWClass virtual int getItemMaxHealth (const MWWorld::Ptr& ptr) const; ///< Return item max health or throw an exception, if class does not have item health - virtual void insertIntoContainer (const MWWorld::Ptr& ptr, - MWWorld::ContainerStore& containerStore) const; - ///< Insert into a containe - virtual std::string getScript (const MWWorld::Ptr& ptr) const; ///< Return name of the script attached to ptr diff --git a/apps/openmw/mwclass/book.cpp b/apps/openmw/mwclass/book.cpp index 011fd2c32..576e521ee 100644 --- a/apps/openmw/mwclass/book.cpp +++ b/apps/openmw/mwclass/book.cpp @@ -8,8 +8,7 @@ #include "../mwworld/ptr.hpp" #include "../mwworld/actiontake.hpp" - -#include "containerutil.hpp" +#include "../mwrender/objects.hpp" namespace MWClass { @@ -20,7 +19,7 @@ namespace MWClass assert (ref->base != NULL); const std::string &model = ref->base->model; - + if (!model.empty()) { MWRender::Objects& objects = renderingInterface.getObjects(); @@ -60,12 +59,6 @@ namespace MWClass new MWWorld::ActionTake (ptr)); } - void Book::insertIntoContainer (const MWWorld::Ptr& ptr, - MWWorld::ContainerStore& containerStore) const - { - insertIntoContainerStore (ptr, containerStore.books); - } - std::string Book::getScript (const MWWorld::Ptr& ptr) const { ESMS::LiveCellRef *ref = diff --git a/apps/openmw/mwclass/book.hpp b/apps/openmw/mwclass/book.hpp index f0e38cceb..12dc27bb2 100644 --- a/apps/openmw/mwclass/book.hpp +++ b/apps/openmw/mwclass/book.hpp @@ -2,7 +2,6 @@ #define GAME_MWCLASS_BOOK_H #include "../mwworld/class.hpp" -#include "../mwrender/objects.hpp" namespace MWClass { @@ -23,10 +22,6 @@ namespace MWClass const MWWorld::Ptr& actor, const MWWorld::Environment& environment) const; ///< Generate action for activation - virtual void insertIntoContainer (const MWWorld::Ptr& ptr, - MWWorld::ContainerStore& containerStore) const; - ///< Insert into a containe - virtual std::string getScript (const MWWorld::Ptr& ptr) const; ///< Return name of the script attached to ptr diff --git a/apps/openmw/mwclass/clothing.cpp b/apps/openmw/mwclass/clothing.cpp index 0214c72ad..88c43d82c 100644 --- a/apps/openmw/mwclass/clothing.cpp +++ b/apps/openmw/mwclass/clothing.cpp @@ -8,8 +8,7 @@ #include "../mwworld/ptr.hpp" #include "../mwworld/actiontake.hpp" - -#include "containerutil.hpp" +#include "../mwrender/objects.hpp" namespace MWClass { @@ -20,7 +19,7 @@ namespace MWClass assert (ref->base != NULL); const std::string &model = ref->base->model; - + if (!model.empty()) { MWRender::Objects& objects = renderingInterface.getObjects(); @@ -58,12 +57,6 @@ namespace MWClass new MWWorld::ActionTake (ptr)); } - void Clothing::insertIntoContainer (const MWWorld::Ptr& ptr, - MWWorld::ContainerStore& containerStore) const - { - insertIntoContainerStore (ptr, containerStore.clothes); - } - std::string Clothing::getScript (const MWWorld::Ptr& ptr) const { ESMS::LiveCellRef *ref = diff --git a/apps/openmw/mwclass/clothing.hpp b/apps/openmw/mwclass/clothing.hpp index 76c2c4a3e..606aba9e0 100644 --- a/apps/openmw/mwclass/clothing.hpp +++ b/apps/openmw/mwclass/clothing.hpp @@ -2,7 +2,6 @@ #define GAME_MWCLASS_CLOTHING_H #include "../mwworld/class.hpp" -#include "../mwrender/objects.hpp" namespace MWClass { @@ -23,10 +22,6 @@ namespace MWClass const MWWorld::Ptr& actor, const MWWorld::Environment& environment) const; ///< Generate action for activation - virtual void insertIntoContainer (const MWWorld::Ptr& ptr, - MWWorld::ContainerStore& containerStore) const; - ///< Insert into a containe - virtual std::string getScript (const MWWorld::Ptr& ptr) const; ///< Return name of the script attached to ptr diff --git a/apps/openmw/mwclass/container.cpp b/apps/openmw/mwclass/container.cpp index 4157ce17a..c58606996 100644 --- a/apps/openmw/mwclass/container.cpp +++ b/apps/openmw/mwclass/container.cpp @@ -6,9 +6,45 @@ #include #include "../mwworld/ptr.hpp" +#include "../mwworld/nullaction.hpp" +#include "../mwworld/containerstore.hpp" +#include "../mwworld/customdata.hpp" +#include "../mwworld/environment.hpp" + +#include "../mwrender/objects.hpp" + +#include "../mwsound/soundmanager.hpp" + +namespace +{ + struct CustomData : public MWWorld::CustomData + { + MWWorld::ContainerStore mContainerStore; + + virtual MWWorld::CustomData *clone() const; + }; + + MWWorld::CustomData *CustomData::clone() const + { + return new CustomData (*this); + } +} namespace MWClass { + void Container::ensureCustomData (const MWWorld::Ptr& ptr) const + { + if (!ptr.getRefData().getCustomData()) + { + std::auto_ptr data (new CustomData); + + // \todo add initial container content + + // store + ptr.getRefData().setCustomData (data.release()); + } + } + void Container::insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const { ESMS::LiveCellRef *ref = @@ -16,7 +52,7 @@ namespace MWClass assert (ref->base != NULL); const std::string &model = ref->base->model; - + if (!model.empty()) { MWRender::Objects& objects = renderingInterface.getObjects(); @@ -39,6 +75,38 @@ namespace MWClass } + boost::shared_ptr Container::activate (const MWWorld::Ptr& ptr, + const MWWorld::Ptr& actor, const MWWorld::Environment& environment) const + { + const std::string lockedSound = "LockedChest"; + const std::string trapActivationSound = "Disarm Trap Fail"; + + if (ptr.getCellRef().lockLevel>0) + { + // TODO check for key + std::cout << "Locked container" << std::endl; + environment.mSoundManager->playSound(lockedSound, 1.0, 1.0); + return boost::shared_ptr (new MWWorld::NullAction); + } + else + { + std::cout << "Unlocked container" << std::endl; + if(ptr.getCellRef().trap.empty()) + { + // Not trapped, Inventory GUI goes here + return boost::shared_ptr (new MWWorld::NullAction); + } + else + { + // Trap activation goes here + std::cout << "Activated trap: " << ptr.getCellRef().trap << std::endl; + environment.mSoundManager->playSound(trapActivationSound, 1.0, 1.0); + ptr.getCellRef().trap = ""; + return boost::shared_ptr (new MWWorld::NullAction); + } + } + } + std::string Container::getName (const MWWorld::Ptr& ptr) const { ESMS::LiveCellRef *ref = @@ -47,20 +115,12 @@ namespace MWClass return ref->base->name; } - MWWorld::ContainerStore& Container::getContainerStore (const MWWorld::Ptr& ptr) + MWWorld::ContainerStore& Container::getContainerStore (const MWWorld::Ptr& ptr) const { - if (!ptr.getRefData().getContainerStore().get()) - { - boost::shared_ptr > store ( - new MWWorld::ContainerStore); - - // TODO add initial content - - ptr.getRefData().getContainerStore() = store; - } + ensureCustomData (ptr); - return *ptr.getRefData().getContainerStore(); + return dynamic_cast (*ptr.getRefData().getCustomData()).mContainerStore; } std::string Container::getScript (const MWWorld::Ptr& ptr) const diff --git a/apps/openmw/mwclass/container.hpp b/apps/openmw/mwclass/container.hpp index 01763870a..387714176 100644 --- a/apps/openmw/mwclass/container.hpp +++ b/apps/openmw/mwclass/container.hpp @@ -2,12 +2,13 @@ #define GAME_MWCLASS_CONTAINER_H #include "../mwworld/class.hpp" -#include "../mwrender/objects.hpp" namespace MWClass { class Container : public MWWorld::Class { + void ensureCustomData (const MWWorld::Ptr& ptr) const; + public: virtual void insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const; @@ -19,8 +20,11 @@ namespace MWClass ///< \return name (the one that is to be presented to the user; not the internal one); /// can return an empty string. - virtual MWWorld::ContainerStore& getContainerStore ( - const MWWorld::Ptr& ptr) const; + virtual boost::shared_ptr activate (const MWWorld::Ptr& ptr, + const MWWorld::Ptr& actor, const MWWorld::Environment& environment) const; + ///< Generate action for activation + + virtual MWWorld::ContainerStore& getContainerStore (const MWWorld::Ptr& ptr) const; ///< Return container store virtual std::string getScript (const MWWorld::Ptr& ptr) const; diff --git a/apps/openmw/mwclass/containerutil.hpp b/apps/openmw/mwclass/containerutil.hpp deleted file mode 100644 index 76bdf0236..000000000 --- a/apps/openmw/mwclass/containerutil.hpp +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef GAME_MWCLASS_CONTAINERUTIL_H -#define GAME_MWCLASS_CONTAINERUTIL_H - -#include - -#include "../mwworld/ptr.hpp" -#include "../mwworld/containerstore.hpp" - -namespace MWClass -{ - template - void insertIntoContainerStore (const MWWorld::Ptr& ptr, - ESMS::CellRefList& containerStore) - { - if (!ptr.isEmpty()) - { - // TODO check stacking - - ESMS::LiveCellRef cellRef(ptr.getCellRef(), ptr.get()->base); - cellRef.mData = ptr.getRefData(); - - containerStore.list.push_back (cellRef); - - } - } -} - -#endif diff --git a/apps/openmw/mwclass/creature.cpp b/apps/openmw/mwclass/creature.cpp index 5aa203a49..7270fd22b 100644 --- a/apps/openmw/mwclass/creature.cpp +++ b/apps/openmw/mwclass/creature.cpp @@ -4,16 +4,62 @@ #include #include "../mwmechanics/creaturestats.hpp" +#include "../mwmechanics/mechanicsmanager.hpp" #include "../mwworld/ptr.hpp" #include "../mwworld/actiontalk.hpp" #include "../mwworld/environment.hpp" +#include "../mwworld/customdata.hpp" +#include "../mwworld/containerstore.hpp" +namespace +{ + struct CustomData : public MWWorld::CustomData + { + MWMechanics::CreatureStats mCreatureStats; + MWWorld::ContainerStore mContainerStore; -#include "../mwmechanics/mechanicsmanager.hpp" + virtual MWWorld::CustomData *clone() const; + }; + + MWWorld::CustomData *CustomData::clone() const + { + return new CustomData (*this); + } +} namespace MWClass { + void Creature::ensureCustomData (const MWWorld::Ptr& ptr) const + { + if (!ptr.getRefData().getCustomData()) + { + std::auto_ptr data (new CustomData); + + ESMS::LiveCellRef *ref = ptr.get(); + + // creature stats + data->mCreatureStats.mAttributes[0].set (ref->base->data.strength); + data->mCreatureStats.mAttributes[1].set (ref->base->data.intelligence); + data->mCreatureStats.mAttributes[2].set (ref->base->data.willpower); + data->mCreatureStats.mAttributes[3].set (ref->base->data.agility); + data->mCreatureStats.mAttributes[4].set (ref->base->data.speed); + data->mCreatureStats.mAttributes[5].set (ref->base->data.endurance); + data->mCreatureStats.mAttributes[6].set (ref->base->data.personality); + data->mCreatureStats.mAttributes[7].set (ref->base->data.luck); + data->mCreatureStats.mDynamic[0].set (ref->base->data.health); + data->mCreatureStats.mDynamic[1].set (ref->base->data.mana); + data->mCreatureStats.mDynamic[2].set (ref->base->data.fatigue); + + data->mCreatureStats.mLevel = ref->base->data.level; + + // \todo add initial container content + + // store + ptr.getRefData().setCustomData (data.release()); + } + } + std::string Creature::getId (const MWWorld::Ptr& ptr) const { ESMS::LiveCellRef *ref = @@ -24,18 +70,8 @@ namespace MWClass void Creature::insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const { - - /*ESMS::LiveCellRef *ref = - ptr.get(); - - assert (ref->base != NULL); - const std::string &model = ref->base->model; - - if (!model.empty()) - {*/ - MWRender::Actors& actors = renderingInterface.getActors(); - actors.insertCreature(ptr); - + MWRender::Actors& actors = renderingInterface.getActors(); + actors.insertCreature(ptr); } void Creature::insertObject(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics, MWWorld::Environment& environment) const @@ -49,7 +85,6 @@ namespace MWClass if(!model.empty()){ physics.insertActorPhysics(ptr, "meshes\\" + model); } - } void Creature::enable (const MWWorld::Ptr& ptr, MWWorld::Environment& environment) const @@ -72,31 +107,9 @@ namespace MWClass MWMechanics::CreatureStats& Creature::getCreatureStats (const MWWorld::Ptr& ptr) const { - if (!ptr.getRefData().getCreatureStats().get()) - { - boost::shared_ptr stats ( - new MWMechanics::CreatureStats); + ensureCustomData (ptr); - ESMS::LiveCellRef *ref = ptr.get(); - - stats->mAttributes[0].set (ref->base->data.strength); - stats->mAttributes[1].set (ref->base->data.intelligence); - stats->mAttributes[2].set (ref->base->data.willpower); - stats->mAttributes[3].set (ref->base->data.agility); - stats->mAttributes[4].set (ref->base->data.speed); - stats->mAttributes[5].set (ref->base->data.endurance); - stats->mAttributes[6].set (ref->base->data.personality); - stats->mAttributes[7].set (ref->base->data.luck); - stats->mDynamic[0].set (ref->base->data.health); - stats->mDynamic[1].set (ref->base->data.mana); - stats->mDynamic[2].set (ref->base->data.fatigue); - - stats->mLevel = ref->base->data.level; - - ptr.getRefData().getCreatureStats() = stats; - } - - return *ptr.getRefData().getCreatureStats(); + return dynamic_cast (*ptr.getRefData().getCustomData()).mCreatureStats; } boost::shared_ptr Creature::activate (const MWWorld::Ptr& ptr, @@ -105,20 +118,12 @@ namespace MWClass return boost::shared_ptr (new MWWorld::ActionTalk (ptr)); } - MWWorld::ContainerStore& Creature::getContainerStore (const MWWorld::Ptr& ptr) + MWWorld::ContainerStore& Creature::getContainerStore (const MWWorld::Ptr& ptr) const { - if (!ptr.getRefData().getContainerStore().get()) - { - boost::shared_ptr > store ( - new MWWorld::ContainerStore); - - // TODO add initial content - - ptr.getRefData().getContainerStore() = store; - } + ensureCustomData (ptr); - return *ptr.getRefData().getContainerStore(); + return dynamic_cast (*ptr.getRefData().getCustomData()).mContainerStore; } std::string Creature::getScript (const MWWorld::Ptr& ptr) const diff --git a/apps/openmw/mwclass/creature.hpp b/apps/openmw/mwclass/creature.hpp index b7b654bc0..8eb45e838 100644 --- a/apps/openmw/mwclass/creature.hpp +++ b/apps/openmw/mwclass/creature.hpp @@ -10,6 +10,8 @@ namespace MWClass { class Creature : public MWWorld::Class { + void ensureCustomData (const MWWorld::Ptr& ptr) const; + public: virtual std::string getId (const MWWorld::Ptr& ptr) const; @@ -37,7 +39,7 @@ namespace MWClass const MWWorld::Ptr& actor, const MWWorld::Environment& environment) const; ///< Generate action for activation - virtual MWWorld::ContainerStore& getContainerStore ( + virtual MWWorld::ContainerStore& getContainerStore ( const MWWorld::Ptr& ptr) const; ///< Return container store diff --git a/apps/openmw/mwclass/door.cpp b/apps/openmw/mwclass/door.cpp index 26436a012..bd7af9597 100644 --- a/apps/openmw/mwclass/door.cpp +++ b/apps/openmw/mwclass/door.cpp @@ -14,7 +14,7 @@ #include "../mwrender/objects.hpp" -#include +#include "../mwsound/soundmanager.hpp" namespace MWClass { @@ -25,7 +25,7 @@ namespace MWClass assert (ref->base != NULL); const std::string &model = ref->base->model; - + if (!model.empty()) { MWRender::Objects& objects = renderingInterface.getObjects(); @@ -39,13 +39,11 @@ namespace MWClass ESMS::LiveCellRef *ref = ptr.get(); - const std::string &model = ref->base->model; assert (ref->base != NULL); if(!model.empty()){ physics.insertObjectPhysics(ptr, "meshes\\" + model); } - } std::string Door::getName (const MWWorld::Ptr& ptr) const @@ -65,15 +63,28 @@ namespace MWClass ESMS::LiveCellRef *ref = ptr.get(); + const std::string &openSound = ref->base->openSound; + //const std::string &closeSound = ref->base->closeSound; + const std::string lockedSound = "LockedDoor"; + const std::string trapActivationSound = "Disarm Trap Fail"; + if (ptr.getCellRef().lockLevel>0) { // TODO check for key // TODO report failure to player (message, sound?). Look up behaviour of original MW. std::cout << "Locked!" << std::endl; + environment.mSoundManager->playSound(lockedSound, 1.0, 1.0); return boost::shared_ptr (new MWWorld::NullAction); } - // TODO check trap + if(!ptr.getCellRef().trap.empty()) + { + // Trap activation + std::cout << "Activated trap: " << ptr.getCellRef().trap << std::endl; + environment.mSoundManager->playSound(trapActivationSound, 1.0, 1.0); + ptr.getCellRef().trap = ""; + return boost::shared_ptr (new MWWorld::NullAction); + } if (ref->ref.teleport) { @@ -81,12 +92,13 @@ namespace MWClass if (environment.mWorld->getPlayer().getPlayer()==actor) { // the player is using the door + environment.mSoundManager->playSound(openSound, 1.0, 1.0); return boost::shared_ptr ( new MWWorld::ActionTeleportPlayer (ref->ref.destCell, ref->ref.doorDest)); } else { - // another NPC or a create is using the door + // another NPC or a creature is using the door // TODO return action for teleporting other NPC/creature return boost::shared_ptr (new MWWorld::NullAction); } @@ -95,6 +107,9 @@ namespace MWClass { // animated door // TODO return action for rotating the door + + // This is a little pointless, but helps with testing + environment.mSoundManager->playSound(openSound, 1.0, 1.0); return boost::shared_ptr (new MWWorld::NullAction); } } diff --git a/apps/openmw/mwclass/door.hpp b/apps/openmw/mwclass/door.hpp index c230cf357..aecb4224c 100644 --- a/apps/openmw/mwclass/door.hpp +++ b/apps/openmw/mwclass/door.hpp @@ -2,7 +2,6 @@ #define GAME_MWCLASS_DOOR_H #include "../mwworld/class.hpp" -#include "../mwrender/objects.hpp" namespace MWClass { diff --git a/apps/openmw/mwclass/ingredient.cpp b/apps/openmw/mwclass/ingredient.cpp index 5e55010eb..d00e4592d 100644 --- a/apps/openmw/mwclass/ingredient.cpp +++ b/apps/openmw/mwclass/ingredient.cpp @@ -8,8 +8,7 @@ #include "../mwworld/ptr.hpp" #include "../mwworld/actiontake.hpp" - -#include "containerutil.hpp" +#include "../mwrender/objects.hpp" namespace MWClass { @@ -20,7 +19,7 @@ namespace MWClass assert (ref->base != NULL); const std::string &model = ref->base->model; - + if (!model.empty()) { MWRender::Objects& objects = renderingInterface.getObjects(); @@ -34,14 +33,11 @@ namespace MWClass ESMS::LiveCellRef *ref = ptr.get(); - - const std::string &model = ref->base->model; assert (ref->base != NULL); if(!model.empty()){ physics.insertObjectPhysics(ptr, "meshes\\" + model); } - } std::string Ingredient::getName (const MWWorld::Ptr& ptr) const @@ -59,12 +55,6 @@ namespace MWClass new MWWorld::ActionTake (ptr)); } - void Ingredient::insertIntoContainer (const MWWorld::Ptr& ptr, - MWWorld::ContainerStore& containerStore) const - { - insertIntoContainerStore (ptr, containerStore.ingreds); - } - std::string Ingredient::getScript (const MWWorld::Ptr& ptr) const { ESMS::LiveCellRef *ref = diff --git a/apps/openmw/mwclass/ingredient.hpp b/apps/openmw/mwclass/ingredient.hpp index 47bd1a9e5..92d2c4eef 100644 --- a/apps/openmw/mwclass/ingredient.hpp +++ b/apps/openmw/mwclass/ingredient.hpp @@ -2,7 +2,6 @@ #define GAME_MWCLASS_INGREDIENT_H #include "../mwworld/class.hpp" -#include "../mwrender/objects.hpp" namespace MWClass { @@ -23,10 +22,6 @@ namespace MWClass const MWWorld::Ptr& actor, const MWWorld::Environment& environment) const; ///< Generate action for activation - virtual void insertIntoContainer (const MWWorld::Ptr& ptr, - MWWorld::ContainerStore& containerStore) const; - ///< Insert into a containe - virtual std::string getScript (const MWWorld::Ptr& ptr) const; ///< Return name of the script attached to ptr diff --git a/apps/openmw/mwclass/light.cpp b/apps/openmw/mwclass/light.cpp index 0009c575b..f9ec1c956 100644 --- a/apps/openmw/mwclass/light.cpp +++ b/apps/openmw/mwclass/light.cpp @@ -12,7 +12,7 @@ #include "../mwsound/soundmanager.hpp" -#include "containerutil.hpp" +#include "../mwrender/objects.hpp" namespace MWClass { @@ -86,12 +86,6 @@ namespace MWClass new MWWorld::ActionTake (ptr)); } - void Light::insertIntoContainer (const MWWorld::Ptr& ptr, - MWWorld::ContainerStore& containerStore) const - { - insertIntoContainerStore (ptr, containerStore.lights); - } - std::string Light::getScript (const MWWorld::Ptr& ptr) const { ESMS::LiveCellRef *ref = diff --git a/apps/openmw/mwclass/light.hpp b/apps/openmw/mwclass/light.hpp index 34421ff51..c9940d0a5 100644 --- a/apps/openmw/mwclass/light.hpp +++ b/apps/openmw/mwclass/light.hpp @@ -2,7 +2,6 @@ #define GAME_MWCLASS_LIGHT_H #include "../mwworld/class.hpp" -#include "../mwrender/objects.hpp" namespace MWClass { @@ -28,10 +27,6 @@ namespace MWClass const MWWorld::Ptr& actor, const MWWorld::Environment& environment) const; ///< Generate action for activation - virtual void insertIntoContainer (const MWWorld::Ptr& ptr, - MWWorld::ContainerStore& containerStore) const; - ///< Insert into a containe - virtual std::string getScript (const MWWorld::Ptr& ptr) const; ///< Return name of the script attached to ptr diff --git a/apps/openmw/mwclass/lockpick.cpp b/apps/openmw/mwclass/lockpick.cpp index 636a8f0be..98c05a1b3 100644 --- a/apps/openmw/mwclass/lockpick.cpp +++ b/apps/openmw/mwclass/lockpick.cpp @@ -8,7 +8,7 @@ #include "../mwworld/ptr.hpp" #include "../mwworld/actiontake.hpp" -#include "containerutil.hpp" +#include "../mwrender/objects.hpp" namespace MWClass { @@ -19,7 +19,7 @@ namespace MWClass assert (ref->base != NULL); const std::string &model = ref->base->model; - + if (!model.empty()) { MWRender::Objects& objects = renderingInterface.getObjects(); @@ -58,12 +58,6 @@ namespace MWClass new MWWorld::ActionTake (ptr)); } - void Lockpick::insertIntoContainer (const MWWorld::Ptr& ptr, - MWWorld::ContainerStore& containerStore) const - { - insertIntoContainerStore (ptr, containerStore.lockpicks); - } - std::string Lockpick::getScript (const MWWorld::Ptr& ptr) const { ESMS::LiveCellRef *ref = diff --git a/apps/openmw/mwclass/lockpick.hpp b/apps/openmw/mwclass/lockpick.hpp index c5f1539b4..9cbfa0d23 100644 --- a/apps/openmw/mwclass/lockpick.hpp +++ b/apps/openmw/mwclass/lockpick.hpp @@ -2,7 +2,6 @@ #define GAME_MWCLASS_LOCKPICK_H #include "../mwworld/class.hpp" -#include "../mwrender/objects.hpp" namespace MWClass { @@ -23,10 +22,6 @@ namespace MWClass const MWWorld::Ptr& actor, const MWWorld::Environment& environment) const; ///< Generate action for activation - virtual void insertIntoContainer (const MWWorld::Ptr& ptr, - MWWorld::ContainerStore& containerStore) const; - ///< Insert into a containe - virtual std::string getScript (const MWWorld::Ptr& ptr) const; ///< Return name of the script attached to ptr diff --git a/apps/openmw/mwclass/misc.cpp b/apps/openmw/mwclass/misc.cpp index a2642d8d5..8dde84be9 100644 --- a/apps/openmw/mwclass/misc.cpp +++ b/apps/openmw/mwclass/misc.cpp @@ -8,7 +8,7 @@ #include "../mwworld/ptr.hpp" #include "../mwworld/actiontake.hpp" -#include "containerutil.hpp" +#include "../mwrender/objects.hpp" namespace MWClass { @@ -19,7 +19,7 @@ namespace MWClass assert (ref->base != NULL); const std::string &model = ref->base->model; - + if (!model.empty()) { MWRender::Objects& objects = renderingInterface.getObjects(); @@ -57,12 +57,6 @@ namespace MWClass new MWWorld::ActionTake (ptr)); } - void Miscellaneous::insertIntoContainer (const MWWorld::Ptr& ptr, - MWWorld::ContainerStore& containerStore) const - { - insertIntoContainerStore (ptr, containerStore.miscItems); - } - std::string Miscellaneous::getScript (const MWWorld::Ptr& ptr) const { ESMS::LiveCellRef *ref = diff --git a/apps/openmw/mwclass/misc.hpp b/apps/openmw/mwclass/misc.hpp index 36ee2c1b2..de01a64f4 100644 --- a/apps/openmw/mwclass/misc.hpp +++ b/apps/openmw/mwclass/misc.hpp @@ -2,7 +2,6 @@ #define GAME_MWCLASS_MISC_H #include "../mwworld/class.hpp" -#include "../mwrender/objects.hpp" namespace MWClass { @@ -23,10 +22,6 @@ namespace MWClass const MWWorld::Ptr& actor, const MWWorld::Environment& environment) const; ///< Generate action for activation - virtual void insertIntoContainer (const MWWorld::Ptr& ptr, - MWWorld::ContainerStore& containerStore) const; - ///< Insert into a containe - virtual std::string getScript (const MWWorld::Ptr& ptr) const; ///< Return name of the script attached to ptr diff --git a/apps/openmw/mwclass/npc.cpp b/apps/openmw/mwclass/npc.cpp index 2b98a3d60..cc7daa83e 100644 --- a/apps/openmw/mwclass/npc.cpp +++ b/apps/openmw/mwclass/npc.cpp @@ -1,27 +1,88 @@ #include "npc.hpp" +#include + +#include + #include #include "../mwmechanics/creaturestats.hpp" #include "../mwmechanics/npcstats.hpp" +#include "../mwmechanics/movement.hpp" +#include "../mwmechanics/mechanicsmanager.hpp" #include "../mwworld/ptr.hpp" #include "../mwworld/actiontalk.hpp" #include "../mwworld/environment.hpp" #include "../mwworld/world.hpp" - -#include "../mwmechanics/mechanicsmanager.hpp" -#include +#include "../mwworld/containerstore.hpp" +#include "../mwworld/customdata.hpp" namespace { const Ogre::Radian kOgrePi (Ogre::Math::PI); const Ogre::Radian kOgrePiOverTwo (Ogre::Math::PI / Ogre::Real(2.0)); + + struct CustomData : public MWWorld::CustomData + { + MWMechanics::NpcStats mNpcStats; + MWMechanics::CreatureStats mCreatureStats; + MWMechanics::Movement mMovement; + MWWorld::ContainerStore mContainerStore; + + virtual MWWorld::CustomData *clone() const; + }; + + MWWorld::CustomData *CustomData::clone() const + { + return new CustomData (*this); + } } namespace MWClass { + void Npc::ensureCustomData (const MWWorld::Ptr& ptr) const + { + if (!ptr.getRefData().getCustomData()) + { + std::auto_ptr data (new CustomData); + + ESMS::LiveCellRef *ref = ptr.get(); + + // NPC stats + if (!ref->base->faction.empty()) + { + // TODO research how initial rank is stored. The information in loadnpc.hpp are at + // best very unclear. + data->mNpcStats.mFactionRank[ref->base->faction] = 0; + } + + for (int i=0; i<27; ++i) + data->mNpcStats.mSkill[i].setBase (ref->base->npdt52.skills[i]); + + // creature stats + data->mCreatureStats.mAttributes[0].set (ref->base->npdt52.strength); + data->mCreatureStats.mAttributes[1].set (ref->base->npdt52.intelligence); + data->mCreatureStats.mAttributes[2].set (ref->base->npdt52.willpower); + data->mCreatureStats.mAttributes[3].set (ref->base->npdt52.agility); + data->mCreatureStats.mAttributes[4].set (ref->base->npdt52.speed); + data->mCreatureStats.mAttributes[5].set (ref->base->npdt52.endurance); + data->mCreatureStats.mAttributes[6].set (ref->base->npdt52.personality); + data->mCreatureStats.mAttributes[7].set (ref->base->npdt52.luck); + data->mCreatureStats.mDynamic[0].set (ref->base->npdt52.health); + data->mCreatureStats.mDynamic[1].set (ref->base->npdt52.mana); + data->mCreatureStats.mDynamic[2].set (ref->base->npdt52.fatigue); + + data->mCreatureStats.mLevel = ref->base->npdt52.level; + + // \todo add initial container content + + // store + ptr.getRefData().setCustomData (data.release()); + } + } + std::string Npc::getId (const MWWorld::Ptr& ptr) const { ESMS::LiveCellRef *ref = @@ -77,56 +138,16 @@ namespace MWClass MWMechanics::CreatureStats& Npc::getCreatureStats (const MWWorld::Ptr& ptr) const { - if (!ptr.getRefData().getCreatureStats().get()) - { - boost::shared_ptr stats ( - new MWMechanics::CreatureStats); - - ESMS::LiveCellRef *ref = ptr.get(); + ensureCustomData (ptr); - stats->mAttributes[0].set (ref->base->npdt52.strength); - stats->mAttributes[1].set (ref->base->npdt52.intelligence); - stats->mAttributes[2].set (ref->base->npdt52.willpower); - stats->mAttributes[3].set (ref->base->npdt52.agility); - stats->mAttributes[4].set (ref->base->npdt52.speed); - stats->mAttributes[5].set (ref->base->npdt52.endurance); - stats->mAttributes[6].set (ref->base->npdt52.personality); - stats->mAttributes[7].set (ref->base->npdt52.luck); - stats->mDynamic[0].set (ref->base->npdt52.health); - stats->mDynamic[1].set (ref->base->npdt52.mana); - stats->mDynamic[2].set (ref->base->npdt52.fatigue); - - stats->mLevel = ref->base->npdt52.level; - - ptr.getRefData().getCreatureStats() = stats; - } - - return *ptr.getRefData().getCreatureStats(); + return dynamic_cast (*ptr.getRefData().getCustomData()).mCreatureStats; } MWMechanics::NpcStats& Npc::getNpcStats (const MWWorld::Ptr& ptr) const { - if (!ptr.getRefData().getNpcStats().get()) - { - boost::shared_ptr stats ( - new MWMechanics::NpcStats); - - ESMS::LiveCellRef *ref = ptr.get(); - - if (!ref->base->faction.empty()) - { - // TODO research how initial rank is stored. The information in loadnpc.hpp are at - // best very unclear. - stats->mFactionRank[ref->base->faction] = 0; - } + ensureCustomData (ptr); - for (int i=0; i<27; ++i) - stats->mSkill[i].setBase (ref->base->npdt52.skills[i]); - - ptr.getRefData().getNpcStats() = stats; - } - - return *ptr.getRefData().getNpcStats(); + return dynamic_cast (*ptr.getRefData().getCustomData()).mNpcStats; } boost::shared_ptr Npc::activate (const MWWorld::Ptr& ptr, @@ -135,20 +156,12 @@ namespace MWClass return boost::shared_ptr (new MWWorld::ActionTalk (ptr)); } - MWWorld::ContainerStore& Npc::getContainerStore (const MWWorld::Ptr& ptr) + MWWorld::ContainerStore& Npc::getContainerStore (const MWWorld::Ptr& ptr) const { - if (!ptr.getRefData().getContainerStore().get()) - { - boost::shared_ptr > store ( - new MWWorld::ContainerStore); - - // TODO add initial content + ensureCustomData (ptr); - ptr.getRefData().getContainerStore() = store; - } - - return *ptr.getRefData().getContainerStore(); + return dynamic_cast (*ptr.getRefData().getCustomData()).mContainerStore; } std::string Npc::getScript (const MWWorld::Ptr& ptr) const @@ -239,29 +252,20 @@ namespace MWClass MWMechanics::Movement& Npc::getMovementSettings (const MWWorld::Ptr& ptr) const { - if (!ptr.getRefData().getMovement().get()) - { - boost::shared_ptr movement ( - new MWMechanics::Movement); - - ptr.getRefData().getMovement() = movement; - } + ensureCustomData (ptr); - return *ptr.getRefData().getMovement(); + return dynamic_cast (*ptr.getRefData().getCustomData()).mMovement; } Ogre::Vector3 Npc::getMovementVector (const MWWorld::Ptr& ptr) const { Ogre::Vector3 vector (0, 0, 0); - if (ptr.getRefData().getMovement().get()) - { - vector.x = - ptr.getRefData().getMovement()->mLeftRight * 200; - vector.y = ptr.getRefData().getMovement()->mForwardBackward * 200; + vector.x = - getMovementSettings (ptr).mLeftRight * 200; + vector.y = getMovementSettings (ptr).mForwardBackward * 200; - if (getStance (ptr, Run, false)) - vector *= 2; - } + if (getStance (ptr, Run, false)) + vector *= 2; return vector; } diff --git a/apps/openmw/mwclass/npc.hpp b/apps/openmw/mwclass/npc.hpp index cc9dbef7f..bef417332 100644 --- a/apps/openmw/mwclass/npc.hpp +++ b/apps/openmw/mwclass/npc.hpp @@ -3,11 +3,12 @@ #include "../mwworld/class.hpp" - namespace MWClass { class Npc : public MWWorld::Class { + void ensureCustomData (const MWWorld::Ptr& ptr) const; + public: virtual std::string getId (const MWWorld::Ptr& ptr) const; @@ -34,8 +35,7 @@ namespace MWClass virtual MWMechanics::NpcStats& getNpcStats (const MWWorld::Ptr& ptr) const; ///< Return NPC stats - virtual MWWorld::ContainerStore& getContainerStore ( - const MWWorld::Ptr& ptr) const; + virtual MWWorld::ContainerStore& getContainerStore (const MWWorld::Ptr& ptr) const; ///< Return container store virtual boost::shared_ptr activate (const MWWorld::Ptr& ptr, diff --git a/apps/openmw/mwclass/potion.cpp b/apps/openmw/mwclass/potion.cpp index 86d1e2a98..c57c18fd1 100644 --- a/apps/openmw/mwclass/potion.cpp +++ b/apps/openmw/mwclass/potion.cpp @@ -8,8 +8,7 @@ #include "../mwworld/ptr.hpp" #include "../mwworld/actiontake.hpp" - -#include "containerutil.hpp" +#include "../mwrender/objects.hpp" namespace MWClass { @@ -20,7 +19,7 @@ namespace MWClass assert (ref->base != NULL); const std::string &model = ref->base->model; - + if (!model.empty()) { MWRender::Objects& objects = renderingInterface.getObjects(); @@ -58,12 +57,6 @@ namespace MWClass new MWWorld::ActionTake (ptr)); } - void Potion::insertIntoContainer (const MWWorld::Ptr& ptr, - MWWorld::ContainerStore& containerStore) const - { - insertIntoContainerStore (ptr, containerStore.potions); - } - std::string Potion::getScript (const MWWorld::Ptr& ptr) const { ESMS::LiveCellRef *ref = diff --git a/apps/openmw/mwclass/potion.hpp b/apps/openmw/mwclass/potion.hpp index 85678121f..fd78bba53 100644 --- a/apps/openmw/mwclass/potion.hpp +++ b/apps/openmw/mwclass/potion.hpp @@ -2,7 +2,6 @@ #define GAME_MWCLASS_POTION_H #include "../mwworld/class.hpp" -#include "../mwrender/objects.hpp" namespace MWClass { @@ -23,10 +22,6 @@ namespace MWClass const MWWorld::Ptr& actor, const MWWorld::Environment& environment) const; ///< Generate action for activation - virtual void insertIntoContainer (const MWWorld::Ptr& ptr, - MWWorld::ContainerStore& containerStore) const; - ///< Insert into a containe - virtual std::string getScript (const MWWorld::Ptr& ptr) const; ///< Return name of the script attached to ptr diff --git a/apps/openmw/mwclass/probe.cpp b/apps/openmw/mwclass/probe.cpp index a09a39e66..de024e430 100644 --- a/apps/openmw/mwclass/probe.cpp +++ b/apps/openmw/mwclass/probe.cpp @@ -8,7 +8,6 @@ #include "../mwworld/ptr.hpp" #include "../mwworld/actiontake.hpp" -#include "containerutil.hpp" #include "../mwrender/objects.hpp" namespace MWClass @@ -20,7 +19,7 @@ namespace MWClass assert (ref->base != NULL); const std::string &model = ref->base->model; - + if (!model.empty()) { MWRender::Objects& objects = renderingInterface.getObjects(); @@ -58,12 +57,6 @@ namespace MWClass new MWWorld::ActionTake (ptr)); } - void Probe::insertIntoContainer (const MWWorld::Ptr& ptr, - MWWorld::ContainerStore& containerStore) const - { - insertIntoContainerStore (ptr, containerStore.probes); - } - std::string Probe::getScript (const MWWorld::Ptr& ptr) const { ESMS::LiveCellRef *ref = diff --git a/apps/openmw/mwclass/probe.hpp b/apps/openmw/mwclass/probe.hpp index d7b9df738..3f2bfed5b 100644 --- a/apps/openmw/mwclass/probe.hpp +++ b/apps/openmw/mwclass/probe.hpp @@ -3,7 +3,6 @@ #include "../mwworld/class.hpp" - namespace MWClass { class Probe : public MWWorld::Class @@ -23,10 +22,6 @@ namespace MWClass const MWWorld::Ptr& actor, const MWWorld::Environment& environment) const; ///< Generate action for activation - virtual void insertIntoContainer (const MWWorld::Ptr& ptr, - MWWorld::ContainerStore& containerStore) const; - ///< Insert into a containe - virtual std::string getScript (const MWWorld::Ptr& ptr) const; ///< Return name of the script attached to ptr diff --git a/apps/openmw/mwclass/repair.cpp b/apps/openmw/mwclass/repair.cpp index f8755b2eb..f831b6b50 100644 --- a/apps/openmw/mwclass/repair.cpp +++ b/apps/openmw/mwclass/repair.cpp @@ -8,7 +8,7 @@ #include "../mwworld/ptr.hpp" #include "../mwworld/actiontake.hpp" -#include "containerutil.hpp" +#include "../mwrender/objects.hpp" namespace MWClass { @@ -19,7 +19,7 @@ namespace MWClass assert (ref->base != NULL); const std::string &model = ref->base->model; - + if (!model.empty()) { MWRender::Objects& objects = renderingInterface.getObjects(); @@ -57,12 +57,6 @@ namespace MWClass new MWWorld::ActionTake (ptr)); } - void Repair::insertIntoContainer (const MWWorld::Ptr& ptr, - MWWorld::ContainerStore& containerStore) const - { - insertIntoContainerStore (ptr, containerStore.repairs); - } - std::string Repair::getScript (const MWWorld::Ptr& ptr) const { ESMS::LiveCellRef *ref = diff --git a/apps/openmw/mwclass/repair.hpp b/apps/openmw/mwclass/repair.hpp index 1e0ea5178..a5864ab35 100644 --- a/apps/openmw/mwclass/repair.hpp +++ b/apps/openmw/mwclass/repair.hpp @@ -2,7 +2,6 @@ #define GAME_MWCLASS_REPAIR_H #include "../mwworld/class.hpp" -#include "../mwrender/objects.hpp" namespace MWClass { @@ -23,10 +22,6 @@ namespace MWClass const MWWorld::Ptr& actor, const MWWorld::Environment& environment) const; ///< Generate action for activation - virtual void insertIntoContainer (const MWWorld::Ptr& ptr, - MWWorld::ContainerStore& containerStore) const; - ///< Insert into a containe - virtual std::string getScript (const MWWorld::Ptr& ptr) const; ///< Return name of the script attached to ptr diff --git a/apps/openmw/mwclass/static.cpp b/apps/openmw/mwclass/static.cpp index 24d36dc1e..48750dd01 100644 --- a/apps/openmw/mwclass/static.cpp +++ b/apps/openmw/mwclass/static.cpp @@ -5,6 +5,7 @@ #include "../mwworld/ptr.hpp" +#include "../mwrender/objects.hpp" namespace MWClass { diff --git a/apps/openmw/mwclass/static.hpp b/apps/openmw/mwclass/static.hpp index be3fdb180..a4b1d8c54 100644 --- a/apps/openmw/mwclass/static.hpp +++ b/apps/openmw/mwclass/static.hpp @@ -2,7 +2,6 @@ #define GAME_MWCLASS_STATIC_H #include "../mwworld/class.hpp" -#include "../mwrender/objects.hpp" namespace MWClass { diff --git a/apps/openmw/mwclass/weapon.cpp b/apps/openmw/mwclass/weapon.cpp index 1fbd21f7c..90fd3e33b 100644 --- a/apps/openmw/mwclass/weapon.cpp +++ b/apps/openmw/mwclass/weapon.cpp @@ -8,8 +8,7 @@ #include "../mwworld/ptr.hpp" #include "../mwworld/actiontake.hpp" - -#include "containerutil.hpp" +#include "../mwrender/objects.hpp" namespace MWClass { @@ -20,7 +19,7 @@ namespace MWClass assert (ref->base != NULL); const std::string &model = ref->base->model; - + if (!model.empty()) { MWRender::Objects& objects = renderingInterface.getObjects(); @@ -71,12 +70,6 @@ namespace MWClass return ref->base->data.health; } - void Weapon::insertIntoContainer (const MWWorld::Ptr& ptr, - MWWorld::ContainerStore& containerStore) const - { - insertIntoContainerStore (ptr, containerStore.weapons); - } - std::string Weapon::getScript (const MWWorld::Ptr& ptr) const { ESMS::LiveCellRef *ref = diff --git a/apps/openmw/mwclass/weapon.hpp b/apps/openmw/mwclass/weapon.hpp index 79bc4d4de..b056249b9 100644 --- a/apps/openmw/mwclass/weapon.hpp +++ b/apps/openmw/mwclass/weapon.hpp @@ -2,7 +2,6 @@ #define GAME_MWCLASS_WEAPON_H #include "../mwworld/class.hpp" -#include "../mwrender/objects.hpp" namespace MWClass { @@ -29,10 +28,6 @@ namespace MWClass virtual int getItemMaxHealth (const MWWorld::Ptr& ptr) const; ///< Return item max health or throw an exception, if class does not have item health - virtual void insertIntoContainer (const MWWorld::Ptr& ptr, - MWWorld::ContainerStore& containerStore) const; - ///< Insert into a containe - virtual std::string getScript (const MWWorld::Ptr& ptr) const; ///< Return name of the script attached to ptr diff --git a/apps/openmw/mwgui/charactercreation.cpp b/apps/openmw/mwgui/charactercreation.cpp new file mode 100644 index 000000000..1cb0593e7 --- /dev/null +++ b/apps/openmw/mwgui/charactercreation.cpp @@ -0,0 +1,629 @@ +#include "charactercreation.hpp" + +#include "text_input.hpp" +#include "race.hpp" +#include "class.hpp" +#include "birth.hpp" +#include "review.hpp" +#include "dialogue.hpp" +#include "mode.hpp" + +namespace +{ + struct Step + { + const char* mText; + const char* mButtons[3]; + ESM::Class::Specialization mSpecializations[3]; // The specialization for each answer + }; + + static boost::array sGenerateClassSteps = { { + // Question 1 + {"On a clear day you chance upon a strange animal, its legs trapped in a hunter's clawsnare. Judging from the bleeding, it will not survive long.", + {"Draw your dagger, mercifully endings its life with a single thrust.", + "Use herbs from your pack to put it to sleep.", + "Do not interfere in the natural evolution of events, but rather take the opportunity to learn more about a strange animal that you have never seen before."}, + {ESM::Class::Combat, ESM::Class::Magic, ESM::Class::Stealth} + }, + // Question 2 + {"One Summer afternoon your father gives you a choice of chores.", + {"Work in the forge with him casting iron for a new plow.", + "Gather herbs for your mother who is preparing dinner.", + "Go catch fish at the stream using a net and line."}, + {ESM::Class::Combat, ESM::Class::Magic, ESM::Class::Stealth} + }, + // Question 3 + {"Your cousin has given you a very embarrassing nickname and, even worse, likes to call you it in front of your friends. You asked him to stop, but he finds it very amusing to watch you blush.", + {"Beat up your cousin, then tell him that if he ever calls you that nickname again, you will bloody him worse than this time.", + "Make up a story that makes your nickname a badge of honor instead of something humiliating.", + "Make up an even more embarrassing nickname for him and use it constantly until he learns his lesson."}, + {ESM::Class::Combat, ESM::Class::Magic, ESM::Class::Stealth} + }, + // Question 4 + {"There is a lot of heated discussion at the local tavern over a grouped of people called 'Telepaths'. They have been hired by certain City-State kings. Rumor has it these Telepaths read a person's mind and tell their lord whether a follower is telling the truth or not.", + {"This is a terrible practice. A person's thoughts are his own and no one, not even a king, has the right to make such an invasion into another human's mind.", + "Loyal followers to the king have nothing to fear from a Telepath. It is important to have a method of finding assassins and spies before it is too late.", + "In these times, it is a necessary evil. Although you do not necessarily like the idea, a Telepath could have certain advantages during a time of war or in finding someone innocent of a crime."}, + {ESM::Class::Combat, ESM::Class::Magic, ESM::Class::Stealth} + }, + // Question 5 + {"Your mother sends you to the market with a list of goods to buy. After you finish you find that by mistake a shopkeeper has given you too much money back in exchange for one of the items.", + {"Return to the store and give the shopkeeper his hard-earned money, explaining to him the mistake?", + "Decide to put the extra money to good use and purchase items that would help your family?", + "Pocket the extra money, knowing that shopkeepers in general tend to overcharge customers anyway?"}, + {ESM::Class::Combat, ESM::Class::Magic, ESM::Class::Stealth} + }, + // Question 6 + {"While in the market place you witness a thief cut a purse from a noble. Even as he does so, the noble notices and calls for the city guards. In his haste to get away, the thief drops the purse near you. Surprisingly no one seems to notice the bag of coins at your feet.", + {"Pick up the bag and signal to the guard, knowing that the only honorable thing to do is return the money to its rightful owner.", + "Leave the bag there, knowing that it is better not to get involved.", + "Pick up the bag and pocket it, knowing that the extra windfall will help your family in times of trouble."}, + {ESM::Class::Combat, ESM::Class::Magic, ESM::Class::Stealth} + }, + // Question 7 + {"Your father sends you on a task which you loathe, cleaning the stables. On the way there, pitchfork in hand, you run into your friend from the homestead near your own. He offers to do it for you, in return for a future favor of his choosing.", + {"Decline his offer, knowing that your father expects you to do the work, and it is better not to be in debt.", + "Ask him to help you, knowing that two people can do the job faster than one, and agree to help him with one task of his choosing in the future.", + "Accept his offer, reasoning that as long as the stables are cleaned, it matters not who does the cleaning."}, + {ESM::Class::Combat, ESM::Class::Magic, ESM::Class::Stealth} + }, + // Question 8 + {"Your mother asks you to help fix the stove. While you are working, a very hot pipe slips its mooring and falls towards her.", + {"Position yourself between the pipe and your mother.", + "Grab the hot pipe and try to push it away.", + "Push your mother out of the way."}, + {ESM::Class::Combat, ESM::Class::Magic, ESM::Class::Stealth} + }, + // Question 9 + {"While in town the baker gives you a sweetroll. Delighted, you take it into an alley to enjoy only to be intercepted by a gang of three other kids your age. The leader demands the sweetroll, or else he and his friends will beat you and take it.", + {"Drop the sweetroll and step on it, then get ready for the fight.", + "Give him the sweetroll now without argument, knowing that later this afternoon you will have all your friends with you and can come and take whatever he owes you.", + "Act like you're going to give him the sweetroll, but at the last minute throw it in the air, hoping that they'll pay attention to it long enough for you to get a shot in on the leader."}, + {ESM::Class::Combat, ESM::Class::Magic, ESM::Class::Stealth} + }, + // Question 10 + {"Entering town you find that you are witness to a very well-dressed man running from a crowd. He screams to you for help. The crowd behind him seem very angry.", + {"Rush to the town's aid immediately, despite your lack of knowledge of the circumstances.", + "Stand aside and allow the man and the mob to pass, realizing it is probably best not to get involved.", + "Rush to the man's aid immediately, despite your lack of knowledge of the circumstances."}, + {ESM::Class::Combat, ESM::Class::Magic, ESM::Class::Stealth} + } + } }; +} + +using namespace MWGui; + +CharacterCreation::CharacterCreation(WindowManager* _wm, MWWorld::Environment* _environment) + : mNameDialog(0) + , mRaceDialog(0) + , mDialogueWindow(0) + , mClassChoiceDialog(0) + , mGenerateClassQuestionDialog(0) + , mGenerateClassResultDialog(0) + , mPickClassDialog(0) + , mCreateClassDialog(0) + , mBirthSignDialog(0) + , mReviewDialog(0) + , mWM(_wm) + , mEnvironment(_environment) +{ + mCreationStage = CSE_NotStarted; +} + +void CharacterCreation::spawnDialog(const char id) +{ + switch (id) + { + case GM_Name: + if(mNameDialog) + mWM->removeDialog(mNameDialog); + mNameDialog = new TextInputDialog(*mWM); + mNameDialog->setTextLabel(mWM->getGameSettingString("sName", "Name")); + mNameDialog->setTextInput(mPlayerName); + mNameDialog->setNextButtonShow(mCreationStage >= CSE_NameChosen); + mNameDialog->eventDone = MyGUI::newDelegate(this, &CharacterCreation::onNameDialogDone); + mNameDialog->open(); + break; + + case GM_Race: + if (mRaceDialog) + mWM->removeDialog(mRaceDialog); + mRaceDialog = new RaceDialog(*mWM); + mRaceDialog->setNextButtonShow(mCreationStage >= CSE_RaceChosen); + mRaceDialog->setRaceId(mPlayerRaceId); + mRaceDialog->eventDone = MyGUI::newDelegate(this, &CharacterCreation::onRaceDialogDone); + mRaceDialog->eventBack = MyGUI::newDelegate(this, &CharacterCreation::onRaceDialogBack); + mRaceDialog->open(); + break; + + case GM_Class: + if (mClassChoiceDialog) + mWM->removeDialog(mClassChoiceDialog); + mClassChoiceDialog = new ClassChoiceDialog(*mWM); + mClassChoiceDialog->eventButtonSelected = MyGUI::newDelegate(this, &CharacterCreation::onClassChoice); + mClassChoiceDialog->open(); + break; + + case GM_ClassPick: + if (mPickClassDialog) + mWM->removeDialog(mPickClassDialog); + mPickClassDialog = new PickClassDialog(*mWM); + mPickClassDialog->setNextButtonShow(mCreationStage >= CSE_ClassChosen); + mPickClassDialog->setClassId(mPlayerClass.name); + mPickClassDialog->eventDone = MyGUI::newDelegate(this, &CharacterCreation::onPickClassDialogDone); + mPickClassDialog->eventBack = MyGUI::newDelegate(this, &CharacterCreation::onPickClassDialogBack); + mPickClassDialog->open(); + break; + + case GM_Birth: + if (mBirthSignDialog) + mWM->removeDialog(mBirthSignDialog); + mBirthSignDialog = new BirthDialog(*mWM); + mBirthSignDialog->setNextButtonShow(mCreationStage >= CSE_BirthSignChosen); + mBirthSignDialog->setBirthId(mPlayerBirthSignId); + mBirthSignDialog->eventDone = MyGUI::newDelegate(this, &CharacterCreation::onBirthSignDialogDone); + mBirthSignDialog->eventBack = MyGUI::newDelegate(this, &CharacterCreation::onBirthSignDialogBack); + mBirthSignDialog->open(); + break; + + case GM_ClassCreate: + if (mCreateClassDialog) + mWM->removeDialog(mCreateClassDialog); + mCreateClassDialog = new CreateClassDialog(*mWM); + mCreateClassDialog->eventDone = MyGUI::newDelegate(this, &CharacterCreation::onCreateClassDialogDone); + mCreateClassDialog->eventBack = MyGUI::newDelegate(this, &CharacterCreation::onCreateClassDialogBack); + mCreateClassDialog->open(); + break; + case GM_ClassGenerate: + mGenerateClassStep = 0; + mGenerateClass = ""; + mGenerateClassSpecializations[0] = 0; + mGenerateClassSpecializations[1] = 0; + mGenerateClassSpecializations[2] = 0; + showClassQuestionDialog(); + break; + case GM_Review: + if (mReviewDialog) + mWM->removeDialog(mReviewDialog); + mReviewDialog = new ReviewDialog(*mWM); + mReviewDialog->setPlayerName(mPlayerName); + mReviewDialog->setRace(mPlayerRaceId); + mReviewDialog->setClass(mPlayerClass); + mReviewDialog->setBirthSign(mPlayerBirthSignId); + + mReviewDialog->setHealth(mPlayerHealth); + mReviewDialog->setMagicka(mPlayerMagicka); + mReviewDialog->setFatigue(mPlayerFatigue); + + { + std::map >::iterator end = mPlayerAttributes.end(); + for (std::map >::iterator it = mPlayerAttributes.begin(); it != end; ++it) + { + mReviewDialog->setAttribute(it->first, it->second); + } + } + + { + std::map >::iterator end = mPlayerSkillValues.end(); + for (std::map >::iterator it = mPlayerSkillValues.begin(); it != end; ++it) + { + mReviewDialog->setSkillValue(it->first, it->second); + } + mReviewDialog->configureSkills(mPlayerMajorSkills, mPlayerMinorSkills); + } + + mReviewDialog->eventDone = MyGUI::newDelegate(this, &CharacterCreation::onReviewDialogDone); + mReviewDialog->eventBack = MyGUI::newDelegate(this, &CharacterCreation::onReviewDialogBack); + mReviewDialog->eventActivateDialog = MyGUI::newDelegate(this, &CharacterCreation::onReviewActivateDialog); + mReviewDialog->open(); + break; + } +} + +void CharacterCreation::setPlayerHealth (const MWMechanics::DynamicStat& value) +{ + mPlayerHealth = value; +} + +void CharacterCreation::setPlayerMagicka (const MWMechanics::DynamicStat& value) +{ + mPlayerMagicka = value; +} + +void CharacterCreation::setPlayerFatigue (const MWMechanics::DynamicStat& value) +{ + mPlayerFatigue = value; +} + +void CharacterCreation::onReviewDialogDone(WindowBase* parWindow) +{ + if (mReviewDialog) + mWM->removeDialog(mReviewDialog); + + mWM->setGuiMode(GM_Game); +} + +void CharacterCreation::onReviewDialogBack() +{ + if (mReviewDialog) + mWM->removeDialog(mReviewDialog); + + mWM->setGuiMode(GM_Birth); +} + +void CharacterCreation::onReviewActivateDialog(int parDialog) +{ + if (mReviewDialog) + mWM->removeDialog(mReviewDialog); + mCreationStage = CSE_ReviewNext; + + switch(parDialog) + { + case ReviewDialog::NAME_DIALOG: + mWM->setGuiMode(GM_Name); + break; + case ReviewDialog::RACE_DIALOG: + mWM->setGuiMode(GM_Race); + break; + case ReviewDialog::CLASS_DIALOG: + mWM->setGuiMode(GM_Class); + break; + case ReviewDialog::BIRTHSIGN_DIALOG: + mWM->setGuiMode(GM_Birth); + }; +} + +void CharacterCreation::onPickClassDialogDone(WindowBase* parWindow) +{ + if (mPickClassDialog) + { + const std::string &classId = mPickClassDialog->getClassId(); + if (!classId.empty()) + mEnvironment->mMechanicsManager->setPlayerClass(classId); + const ESM::Class *klass = mEnvironment->mWorld->getStore().classes.find(classId); + if (klass) + { + mPlayerClass = *klass; + mWM->setPlayerClass(mPlayerClass); + } + mWM->removeDialog(mPickClassDialog); + } + + //TODO This bit gets repeated a few times; wrap it in a function + if (mCreationStage == CSE_ReviewNext) + mWM->setGuiMode(GM_Review); + else if (mCreationStage >= CSE_ClassChosen) + mWM->setGuiMode(GM_Birth); + else + { + mCreationStage = CSE_ClassChosen; + mWM->setGuiMode(GM_Game); + } +} + +void CharacterCreation::onPickClassDialogBack() +{ + if (mPickClassDialog) + { + const std::string classId = mPickClassDialog->getClassId(); + if (!classId.empty()) + mEnvironment->mMechanicsManager->setPlayerClass(classId); + mWM->removeDialog(mPickClassDialog); + } + + mWM->setGuiMode(GM_Class); +} + +void CharacterCreation::onClassChoice(int _index) +{ + if (mClassChoiceDialog) + { + mWM->removeDialog(mClassChoiceDialog); + } + + switch(_index) + { + case ClassChoiceDialog::Class_Generate: + mWM->setGuiMode(GM_ClassGenerate); + break; + case ClassChoiceDialog::Class_Pick: + mWM->setGuiMode(GM_ClassPick); + break; + case ClassChoiceDialog::Class_Create: + mWM->setGuiMode(GM_ClassCreate); + break; + case ClassChoiceDialog::Class_Back: + mWM->setGuiMode(GM_Race); + break; + + }; +} + +void CharacterCreation::onNameDialogDone(WindowBase* parWindow) +{ + if (mNameDialog) + { + mPlayerName = mNameDialog->getTextInput(); + mWM->setValue("name", mPlayerName); + mEnvironment->mMechanicsManager->setPlayerName(mPlayerName); + mWM->removeDialog(mNameDialog); + } + + if (mCreationStage == CSE_ReviewNext) + mWM->setGuiMode(GM_Review); + else if (mCreationStage >= CSE_NameChosen) + mWM->setGuiMode(GM_Race); + else + { + mCreationStage = CSE_NameChosen; + mWM->setGuiMode(GM_Game); + } +} + +void CharacterCreation::onRaceDialogBack() +{ + if (mRaceDialog) + { + mPlayerRaceId = mRaceDialog->getRaceId(); + if (!mPlayerRaceId.empty()) + mEnvironment->mMechanicsManager->setPlayerRace(mPlayerRaceId, mRaceDialog->getGender() == RaceDialog::GM_Male); + mWM->removeDialog(mRaceDialog); + } + + mWM->setGuiMode(GM_Name); +} + +void CharacterCreation::onRaceDialogDone(WindowBase* parWindow) +{ + if (mRaceDialog) + { + mPlayerRaceId = mRaceDialog->getRaceId(); + mWM->setValue("race", mPlayerRaceId); + if (!mPlayerRaceId.empty()) + mEnvironment->mMechanicsManager->setPlayerRace(mPlayerRaceId, mRaceDialog->getGender() == RaceDialog::GM_Male); + mWM->removeDialog(mRaceDialog); + } + + if (mCreationStage == CSE_ReviewNext) + mWM->setGuiMode(GM_Review); + else if(mCreationStage >= CSE_RaceChosen) + mWM->setGuiMode(GM_Class); + else + { + mCreationStage = CSE_RaceChosen; + mWM->setGuiMode(GM_Game); + } +} + +void CharacterCreation::onBirthSignDialogDone(WindowBase* parWindow) +{ + if (mBirthSignDialog) + { + mPlayerBirthSignId = mBirthSignDialog->getBirthId(); + mWM->setBirthSign(mPlayerBirthSignId); + if (!mPlayerBirthSignId.empty()) + mEnvironment->mMechanicsManager->setPlayerBirthsign(mPlayerBirthSignId); + mWM->removeDialog(mBirthSignDialog); + } + + if (mCreationStage >= CSE_BirthSignChosen) + mWM->setGuiMode(GM_Review); + else + { + mCreationStage = CSE_BirthSignChosen; + mWM->setGuiMode(GM_Game); + } +} + +void CharacterCreation::onBirthSignDialogBack() +{ + if (mBirthSignDialog) + { + mEnvironment->mMechanicsManager->setPlayerBirthsign(mBirthSignDialog->getBirthId()); + mWM->removeDialog(mBirthSignDialog); + } + + mWM->setGuiMode(GM_Class); +} + +void CharacterCreation::onCreateClassDialogDone(WindowBase* parWindow) +{ + if (mCreateClassDialog) + { + ESM::Class klass; + klass.name = mCreateClassDialog->getName(); + klass.description = mCreateClassDialog->getDescription(); + klass.data.specialization = mCreateClassDialog->getSpecializationId(); + klass.data.isPlayable = 0x1; + + std::vector attributes = mCreateClassDialog->getFavoriteAttributes(); + assert(attributes.size() == 2); + klass.data.attribute[0] = attributes[0]; + klass.data.attribute[1] = attributes[1]; + + std::vector majorSkills = mCreateClassDialog->getMajorSkills(); + std::vector minorSkills = mCreateClassDialog->getMinorSkills(); + assert(majorSkills.size() >= sizeof(klass.data.skills)/sizeof(klass.data.skills[0])); + assert(minorSkills.size() >= sizeof(klass.data.skills)/sizeof(klass.data.skills[0])); + for (size_t i = 0; i < sizeof(klass.data.skills)/sizeof(klass.data.skills[0]); ++i) + { + klass.data.skills[i][1] = majorSkills[i]; + klass.data.skills[i][0] = minorSkills[i]; + } + mEnvironment->mMechanicsManager->setPlayerClass(klass); + mPlayerClass = klass; + mWM->setPlayerClass(klass); + + mWM->removeDialog(mCreateClassDialog); + } + + if (mCreationStage == CSE_ReviewNext) + mWM->setGuiMode(GM_Review); + else if (mCreationStage >= CSE_ClassChosen) + mWM->setGuiMode(GM_Birth); + else + { + mCreationStage = CSE_ClassChosen; + mWM->setGuiMode(GM_Game); + } +} + +void CharacterCreation::onCreateClassDialogBack() +{ + if (mCreateClassDialog) + mWM->removeDialog(mCreateClassDialog); + + mWM->setGuiMode(GM_Class); +} + +void CharacterCreation::onClassQuestionChosen(int _index) +{ + if (mGenerateClassQuestionDialog) + mWM->removeDialog(mGenerateClassQuestionDialog); + if (_index < 0 || _index >= 3) + { + mWM->setGuiMode(GM_Class); + return; + } + + ESM::Class::Specialization specialization = sGenerateClassSteps[mGenerateClassStep].mSpecializations[_index]; + if (specialization == ESM::Class::Stealth) + ++mGenerateClassSpecializations[0]; + else if (specialization == ESM::Class::Combat) + ++mGenerateClassSpecializations[1]; + else if (specialization == ESM::Class::Magic) + ++mGenerateClassSpecializations[2]; + ++mGenerateClassStep; + showClassQuestionDialog(); +} + +void CharacterCreation::showClassQuestionDialog() +{ + if (mGenerateClassStep == sGenerateClassSteps.size()) + { + static boost::array classes = { { + {"Acrobat", {6, 2, 2}}, + {"Agent", {6, 1, 3}}, + {"Archer", {3, 5, 2}}, + {"Archer", {5, 5, 0}}, + {"Assassin", {6, 3, 1}}, + {"Barbarian", {3, 6, 1}}, + {"Bard", {3, 3, 3}}, + {"Battlemage", {1, 3, 6}}, + {"Crusader", {1, 6, 3}}, + {"Healer", {3, 1, 6}}, + {"Knight", {2, 6, 2}}, + {"Monk", {5, 3, 2}}, + {"Nightblade", {4, 2, 4}}, + {"Pilgrim", {5, 2, 3}}, + {"Rogue", {3, 4, 3}}, + {"Rogue", {4, 4, 2}}, + {"Rogue", {5, 4, 1}}, + {"Scout", {2, 5, 3}}, + {"Sorcerer", {2, 2, 6}}, + {"Spellsword", {2, 4, 4}}, + {"Spellsword", {5, 1, 4}}, + {"Witchhunter", {2, 3, 5}}, + {"Witchhunter", {5, 0, 5}} + } }; + + int match = -1; + for (unsigned i = 0; i < classes.size(); ++i) + { + if (mGenerateClassSpecializations[0] == classes[i].points[0] && + mGenerateClassSpecializations[1] == classes[i].points[1] && + mGenerateClassSpecializations[2] == classes[i].points[2]) + { + match = i; + mGenerateClass = classes[i].id; + break; + } + } + + if (match == -1) + { + if (mGenerateClassSpecializations[0] >= 7) + mGenerateClass = "Thief"; + else if (mGenerateClassSpecializations[1] >= 7) + mGenerateClass = "Warrior"; + else if (mGenerateClassSpecializations[2] >= 7) + mGenerateClass = "Mage"; + else + { + std::cerr << "Failed to deduce class from chosen answers in generate class dialog" << std::endl; + mGenerateClass = "Thief"; + } + } + + if (mGenerateClassResultDialog) + mWM->removeDialog(mGenerateClassResultDialog); + mGenerateClassResultDialog = new GenerateClassResultDialog(*mWM); + mGenerateClassResultDialog->setClassId(mGenerateClass); + mGenerateClassResultDialog->eventBack = MyGUI::newDelegate(this, &CharacterCreation::onGenerateClassBack); + mGenerateClassResultDialog->eventDone = MyGUI::newDelegate(this, &CharacterCreation::onGenerateClassDone); + mGenerateClassResultDialog->open(); + return; + } + + if (mGenerateClassStep > sGenerateClassSteps.size()) + { + mWM->setGuiMode(GM_Class); + return; + } + + if (mGenerateClassQuestionDialog) + mWM->removeDialog(mGenerateClassQuestionDialog); + mGenerateClassQuestionDialog = new InfoBoxDialog(*mWM); + + InfoBoxDialog::ButtonList buttons; + mGenerateClassQuestionDialog->setText(sGenerateClassSteps[mGenerateClassStep].mText); + buttons.push_back(sGenerateClassSteps[mGenerateClassStep].mButtons[0]); + buttons.push_back(sGenerateClassSteps[mGenerateClassStep].mButtons[1]); + buttons.push_back(sGenerateClassSteps[mGenerateClassStep].mButtons[2]); + mGenerateClassQuestionDialog->setButtons(buttons); + mGenerateClassQuestionDialog->eventButtonSelected = MyGUI::newDelegate(this, &CharacterCreation::onClassQuestionChosen); + mGenerateClassQuestionDialog->open(); +} + +void CharacterCreation::onGenerateClassBack() +{ + if(mCreationStage < CSE_ClassChosen) + mCreationStage = CSE_ClassChosen; + + if (mGenerateClassResultDialog) + mWM->removeDialog(mGenerateClassResultDialog); + mEnvironment->mMechanicsManager->setPlayerClass(mGenerateClass); + + mWM->setGuiMode(GM_Class); +} + +void CharacterCreation::onGenerateClassDone(WindowBase* parWindow) +{ + if (mGenerateClassResultDialog) + mWM->removeDialog(mGenerateClassResultDialog); + mEnvironment->mMechanicsManager->setPlayerClass(mGenerateClass); + + if (mCreationStage == CSE_ReviewNext) + mWM->setGuiMode(GM_Review); + else if (mCreationStage >= CSE_ClassChosen) + mWM->setGuiMode(GM_Birth); + else + { + mCreationStage = CSE_ClassChosen; + mWM->setGuiMode(GM_Game); + } +} + +CharacterCreation::~CharacterCreation() +{ + delete mNameDialog; + delete mRaceDialog; + delete mDialogueWindow; + delete mClassChoiceDialog; + delete mGenerateClassQuestionDialog; + delete mGenerateClassResultDialog; + delete mPickClassDialog; + delete mCreateClassDialog; + delete mBirthSignDialog; + delete mReviewDialog; +} diff --git a/apps/openmw/mwgui/charactercreation.hpp b/apps/openmw/mwgui/charactercreation.hpp new file mode 100644 index 000000000..b01e754d9 --- /dev/null +++ b/apps/openmw/mwgui/charactercreation.hpp @@ -0,0 +1,120 @@ +#ifndef CHARACTER_CREATION_HPP +#define CHARACTER_CREATION_HPP + +#include "window_manager.hpp" + +#include "../mwmechanics/mechanicsmanager.hpp" +#include "../mwmechanics/stat.hpp" +#include "../mwworld/world.hpp" +#include + +namespace MWGui +{ + class WindowManager; + class WindowBase; + + class TextInputDialog; + class InfoBoxDialog; + class RaceDialog; + class DialogueWindow; + class ClassChoiceDialog; + class GenerateClassResultDialog; + class PickClassDialog; + class CreateClassDialog; + class BirthDialog; + class ReviewDialog; + class MessageBoxManager; + + class CharacterCreation + { + public: + typedef std::vector SkillList; + + CharacterCreation(WindowManager* _wm, MWWorld::Environment* _environment); + ~CharacterCreation(); + + //Show a dialog + void spawnDialog(const char id); + + void setPlayerHealth (const MWMechanics::DynamicStat& value); + + void setPlayerMagicka (const MWMechanics::DynamicStat& value); + + void setPlayerFatigue (const MWMechanics::DynamicStat& value); + + private: + //Dialogs + TextInputDialog* mNameDialog; + RaceDialog* mRaceDialog; + DialogueWindow* mDialogueWindow; + ClassChoiceDialog* mClassChoiceDialog; + InfoBoxDialog* mGenerateClassQuestionDialog; + GenerateClassResultDialog* mGenerateClassResultDialog; + PickClassDialog* mPickClassDialog; + CreateClassDialog* mCreateClassDialog; + BirthDialog* mBirthSignDialog; + ReviewDialog* mReviewDialog; + + WindowManager* mWM; + MWWorld::Environment* mEnvironment; + + //Player data + std::string mPlayerName; + std::string mPlayerRaceId; + std::string mPlayerBirthSignId; + ESM::Class mPlayerClass; + std::map > mPlayerAttributes; + SkillList mPlayerMajorSkills, mPlayerMinorSkills; + std::map > mPlayerSkillValues; + MWMechanics::DynamicStat mPlayerHealth; + MWMechanics::DynamicStat mPlayerMagicka; + MWMechanics::DynamicStat mPlayerFatigue; + + //Class generation vars + unsigned mGenerateClassStep; // Keeps track of current step in Generate Class dialog + unsigned mGenerateClassSpecializations[3]; // A counter for each specialization which is increased when an answer is chosen + std::string mGenerateClass; // In order: Stealth, Combat, Magic + + ////Dialog events + //Name dialog + void onNameDialogDone(WindowBase* parWindow); + + //Race dialog + void onRaceDialogDone(WindowBase* parWindow); + void onRaceDialogBack(); + + //Class dialogs + void onClassChoice(int _index); + void onPickClassDialogDone(WindowBase* parWindow); + void onPickClassDialogBack(); + void onCreateClassDialogDone(WindowBase* parWindow); + void onCreateClassDialogBack(); + void showClassQuestionDialog(); + void onClassQuestionChosen(int _index); + void onGenerateClassBack(); + void onGenerateClassDone(WindowBase* parWindow); + + //Birthsign dialog + void onBirthSignDialogDone(WindowBase* parWindow); + void onBirthSignDialogBack(); + + //Review dialog + void onReviewDialogDone(WindowBase* parWindow); + void onReviewDialogBack(); + void onReviewActivateDialog(int parDialog); + + enum CSE //Creation Stage Enum + { + CSE_NotStarted, + CSE_NameChosen, + CSE_RaceChosen, + CSE_ClassChosen, + CSE_BirthSignChosen, + CSE_ReviewNext + }; + + CSE mCreationStage; // Which state the character creating is in, controls back/next/ok buttons + }; +} + +#endif diff --git a/apps/openmw/mwgui/window_manager.cpp b/apps/openmw/mwgui/window_manager.cpp index d16611794..aca9fbd9a 100644 --- a/apps/openmw/mwgui/window_manager.cpp +++ b/apps/openmw/mwgui/window_manager.cpp @@ -1,9 +1,6 @@ #include "window_manager.hpp" #include "layouts.hpp" #include "text_input.hpp" -#include "race.hpp" -#include "class.hpp" -#include "birth.hpp" #include "review.hpp" #include "dialogue.hpp" #include "dialogue_history.hpp" @@ -15,6 +12,7 @@ #include "console.hpp" #include "journalwindow.hpp" +#include "charactercreation.hpp" #include #include @@ -22,20 +20,10 @@ using namespace MWGui; -WindowManager::WindowManager(MyGUI::Gui *_gui, MWWorld::Environment& environment, - const Compiler::Extensions& extensions, int fpsLevel, bool newGame) +WindowManager::WindowManager(MWWorld::Environment& environment, + const Compiler::Extensions& extensions, int fpsLevel, bool newGame, OEngine::Render::OgreRenderer *mOgre, const std::string logpath) : environment(environment) - , nameDialog(nullptr) - , raceDialog(nullptr) , dialogueWindow(nullptr) - , classChoiceDialog(nullptr) - , generateClassQuestionDialog(nullptr) - , generateClassResultDialog(nullptr) - , pickClassDialog(nullptr) - , createClassDialog(nullptr) - , birthSignDialog(nullptr) - , reviewDialog(nullptr) - , gui(_gui) , mode(GM_Game) , nextMode(GM_Game) , needModeChange(false) @@ -44,7 +32,9 @@ WindowManager::WindowManager(MyGUI::Gui *_gui, MWWorld::Environment& environment { showFPSLevel = fpsLevel; - creationStage = NotStarted; + // Set up the GUI system + mGuiManager = new OEngine::GUI::MyGUIManager(mOgre->getWindow(), mOgre->getScene(), false, logpath); + gui = mGuiManager->getGui(); //Register own widgets with MyGUI MyGUI::FactoryManager::getInstance().registerFactory("Widget"); @@ -58,9 +48,6 @@ WindowManager::WindowManager(MyGUI::Gui *_gui, MWWorld::Environment& environment menu = new MainMenu(w,h); map = new MapWindow(); stats = new StatsWindow(*this); -#if 0 - inventory = new InventoryWindow (); -#endif console = new Console(w,h, environment, extensions); mJournal = new JournalWindow(*this); mMessageBoxManager = new MessageBoxManager(this); @@ -68,6 +55,8 @@ WindowManager::WindowManager(MyGUI::Gui *_gui, MWWorld::Environment& environment // The HUD is always on hud->setVisible(true); + mCharGen = new CharacterCreation(this, &environment); + // Setup player stats for (int i = 0; i < ESM::Attribute::Length; ++i) { @@ -91,6 +80,7 @@ WindowManager::WindowManager(MyGUI::Gui *_gui, MWWorld::Environment& environment WindowManager::~WindowManager() { + delete mGuiManager; delete console; delete mMessageBoxManager; delete hud; @@ -98,20 +88,9 @@ WindowManager::~WindowManager() delete menu; delete stats; delete mJournal; -#if 0 - delete inventory; -#endif - - delete nameDialog; - delete raceDialog; delete dialogueWindow; - delete classChoiceDialog; - delete generateClassQuestionDialog; - delete generateClassResultDialog; - delete pickClassDialog; - delete createClassDialog; - delete birthSignDialog; - delete reviewDialog; + + delete mCharGen; cleanupGarbage(); } @@ -168,9 +147,6 @@ void WindowManager::updateVisible() map->setVisible(false); menu->setVisible(false); stats->setVisible(false); -#if 0 - inventory->setVisible(false); -#endif console->disable(); mJournal->setVisible(false); @@ -178,7 +154,7 @@ void WindowManager::updateVisible() gui->setVisiblePointer(isGuiMode()); // If in game mode, don't show anything. - if(mode == GM_Game) + if(mode == GM_Game) //Use a switch/case structure { return; } @@ -196,126 +172,10 @@ void WindowManager::updateVisible() return; } - if (mode == GM_Name) - { - if (nameDialog) - removeDialog(nameDialog); - nameDialog = new TextInputDialog(*this); - std::string sName = getGameSettingString("sName", "Name"); - nameDialog->setTextLabel(sName); - nameDialog->setTextInput(playerName); - nameDialog->setNextButtonShow(creationStage >= NameChosen); - nameDialog->eventDone = MyGUI::newDelegate(this, &WindowManager::onNameDialogDone); - nameDialog->open(); - return; - } - - if (mode == GM_Race) - { - if (raceDialog) - removeDialog(raceDialog); - raceDialog = new RaceDialog(*this); - raceDialog->setNextButtonShow(creationStage >= RaceChosen); - raceDialog->setRaceId(playerRaceId); - raceDialog->eventDone = MyGUI::newDelegate(this, &WindowManager::onRaceDialogDone); - raceDialog->eventBack = MyGUI::newDelegate(this, &WindowManager::onRaceDialogBack); - raceDialog->open(); - return; - } - - if (mode == GM_Class) - { - if (classChoiceDialog) - removeDialog(classChoiceDialog); - classChoiceDialog = new ClassChoiceDialog(*this); - classChoiceDialog->eventButtonSelected = MyGUI::newDelegate(this, &WindowManager::onClassChoice); - classChoiceDialog->open(); - return; - } - - if (mode == GM_ClassGenerate) - { - generateClassStep = 0; - generateClass = ""; - generateClassSpecializations[0] = 0; - generateClassSpecializations[1] = 0; - generateClassSpecializations[2] = 0; - showClassQuestionDialog(); - return; - } - - if (mode == GM_ClassPick) + //There must be a more elegant solution + if (mode == GM_Name || mode == GM_Race || mode == GM_Class || mode == GM_ClassPick || mode == GM_ClassCreate || mode == GM_Birth || mode == GM_ClassGenerate || mode == GM_Review) { - if (pickClassDialog) - removeDialog(pickClassDialog); - pickClassDialog = new PickClassDialog(*this); - pickClassDialog->setNextButtonShow(creationStage >= ClassChosen); - pickClassDialog->setClassId(playerClass.name); - pickClassDialog->eventDone = MyGUI::newDelegate(this, &WindowManager::onPickClassDialogDone); - pickClassDialog->eventBack = MyGUI::newDelegate(this, &WindowManager::onPickClassDialogBack); - pickClassDialog->open(); - return; - } - - if (mode == GM_ClassCreate) - { - if (createClassDialog) - removeDialog(createClassDialog); - createClassDialog = new CreateClassDialog(*this); - createClassDialog->eventDone = MyGUI::newDelegate(this, &WindowManager::onCreateClassDialogDone); - createClassDialog->eventBack = MyGUI::newDelegate(this, &WindowManager::onCreateClassDialogBack); - createClassDialog->open(); - return; - } - - if (mode == GM_Birth) - { - if (birthSignDialog) - removeDialog(birthSignDialog); - birthSignDialog = new BirthDialog(*this); - birthSignDialog->setNextButtonShow(creationStage >= BirthSignChosen); - birthSignDialog->setBirthId(playerBirthSignId); - birthSignDialog->eventDone = MyGUI::newDelegate(this, &WindowManager::onBirthSignDialogDone); - birthSignDialog->eventBack = MyGUI::newDelegate(this, &WindowManager::onBirthSignDialogBack); - birthSignDialog->open(); - return; - } - - if (mode == GM_Review) - { - if (reviewDialog) - removeDialog(reviewDialog); - reviewDialog = new ReviewDialog(*this); - reviewDialog->setPlayerName(playerName); - reviewDialog->setRace(playerRaceId); - reviewDialog->setClass(playerClass); - reviewDialog->setBirthSign(playerBirthSignId); - - reviewDialog->setHealth(playerHealth); - reviewDialog->setMagicka(playerMagicka); - reviewDialog->setFatigue(playerFatigue); - - { - std::map >::iterator end = playerAttributes.end(); - for (std::map >::iterator it = playerAttributes.begin(); it != end; ++it) - { - reviewDialog->setAttribute(it->first, it->second); - } - } - - { - std::map >::iterator end = playerSkillValues.end(); - for (std::map >::iterator it = playerSkillValues.begin(); it != end; ++it) - { - reviewDialog->setSkillValue(it->first, it->second); - } - reviewDialog->configureSkills(playerMajorSkills, playerMinorSkills); - } - - reviewDialog->eventDone = MyGUI::newDelegate(this, &WindowManager::onReviewDialogDone); - reviewDialog->eventBack = MyGUI::newDelegate(this, &WindowManager::onReviewDialogBack); - reviewDialog->eventActivateDialog = MyGUI::newDelegate(this, &WindowManager::onReviewActivateDialog); - reviewDialog->open(); + mCharGen->spawnDialog(mode); return; } @@ -330,9 +190,6 @@ void WindowManager::updateVisible() // Show the windows we want map -> setVisible( (eff & GW_Map) != 0 ); stats -> setVisible( (eff & GW_Stats) != 0 ); -#if 0 - // inventory -> setVisible( eff & GW_Inventory ); -#endif return; } @@ -362,7 +219,6 @@ void WindowManager::updateVisible() return; } - // Unsupported mode, switch back to game // Note: The call will eventually end up this method again but // will stop at the check if(mode == GM_Game) above. @@ -410,13 +266,34 @@ void WindowManager::setValue (const std::string& id, const MWMechanics::DynamicS stats->setValue (id, value); hud->setValue (id, value); if (id == "HBar") + { playerHealth = value; + mCharGen->setPlayerHealth (value); + } else if (id == "MBar") + { playerMagicka = value; + mCharGen->setPlayerMagicka (value); + } else if (id == "FBar") + { playerFatigue = value; + mCharGen->setPlayerFatigue (value); + } } +#if 0 +MWMechanics::DynamicStat WindowManager::getValue(const std::string& id) +{ + if(id == "HBar") + return playerHealth; + else if (id == "MBar") + return playerMagicka; + else if (id == "FBar") + return playerFatigue; +} +#endif + void WindowManager::setValue (const std::string& id, const std::string& value) { stats->setValue (id, value); @@ -505,49 +382,6 @@ const std::string &WindowManager::getGameSettingString(const std::string &id, co return default_; } -void WindowManager::onNameDialogDone(WindowBase* parWindow) -{ - if (nameDialog) - { - playerName = nameDialog->getTextInput(); - environment.mMechanicsManager->setPlayerName(playerName); - removeDialog(nameDialog); - } - - // Go to next dialog if name was previously chosen - if (creationStage == ReviewNext) - setGuiMode(GM_Review); - else if (creationStage >= NameChosen) - setGuiMode(GM_Race); - else - { - creationStage = NameChosen; - setGuiMode(GM_Game); - } -} - -void WindowManager::onRaceDialogDone(WindowBase* parWindow) -{ - if (raceDialog) - { - playerRaceId = raceDialog->getRaceId(); - if (!playerRaceId.empty()) - environment.mMechanicsManager->setPlayerRace(playerRaceId, raceDialog->getGender() == RaceDialog::GM_Male); - removeDialog(raceDialog); - } - - // Go to next dialog if race was previously chosen - if (creationStage == ReviewNext) - setGuiMode(GM_Review); - else if(creationStage >= RaceChosen) - setGuiMode(GM_Class); - else - { - creationStage = RaceChosen; - setGuiMode(GM_Game); - } -} - void WindowManager::onDialogueWindowBye() { if (dialogueWindow) @@ -558,434 +392,11 @@ void WindowManager::onDialogueWindowBye() setGuiMode(GM_Game); } -void WindowManager::onRaceDialogBack() -{ - if (raceDialog) - { - playerRaceId = raceDialog->getRaceId(); - if (!playerRaceId.empty()) - environment.mMechanicsManager->setPlayerRace(playerRaceId, raceDialog->getGender() == RaceDialog::GM_Male); - removeDialog(raceDialog); - } - - setGuiMode(GM_Name); -} - -void WindowManager::onClassChoice(int _index) -{ - if (classChoiceDialog) - { - removeDialog(classChoiceDialog); - } - - switch(_index) - { - case ClassChoiceDialog::Class_Generate: - setGuiMode(GM_ClassGenerate); - break; - case ClassChoiceDialog::Class_Pick: - setGuiMode(GM_ClassPick); - break; - case ClassChoiceDialog::Class_Create: - setGuiMode(GM_ClassCreate); - break; - case ClassChoiceDialog::Class_Back: - setGuiMode(GM_Race); - break; - - }; -} - void WindowManager::onFrame (float frameDuration) { mMessageBoxManager->onFrame(frameDuration); } -namespace MWGui -{ - - struct Step - { - const char* text; - const char* buttons[3]; - // The specialization for each answer - ESM::Class::Specialization specializations[3]; - }; - - static boost::array generateClassSteps = { { - // Question 1 - {"On a clear day you chance upon a strange animal, its legs trapped in a hunter's clawsnare. Judging from the bleeding, it will not survive long.", - {"Draw your dagger, mercifully endings its life with a single thrust.", - "Use herbs from your pack to put it to sleep.", - "Do not interfere in the natural evolution of events, but rather take the opportunity to learn more about a strange animal that you have never seen before."}, - {ESM::Class::Combat, ESM::Class::Magic, ESM::Class::Stealth} - }, - // Question 2 - {"One Summer afternoon your father gives you a choice of chores.", - {"Work in the forge with him casting iron for a new plow.", - "Gather herbs for your mother who is preparing dinner.", - "Go catch fish at the stream using a net and line."}, - {ESM::Class::Combat, ESM::Class::Magic, ESM::Class::Stealth} - }, - // Question 3 - {"Your cousin has given you a very embarrassing nickname and, even worse, likes to call you it in front of your friends. You asked him to stop, but he finds it very amusing to watch you blush.", - {"Beat up your cousin, then tell him that if he ever calls you that nickname again, you will bloody him worse than this time.", - "Make up a story that makes your nickname a badge of honor instead of something humiliating.", - "Make up an even more embarrassing nickname for him and use it constantly until he learns his lesson."}, - {ESM::Class::Combat, ESM::Class::Magic, ESM::Class::Stealth} - }, - // Question 4 - {"There is a lot of heated discussion at the local tavern over a grouped of people called 'Telepaths'. They have been hired by certain City-State kings. Rumor has it these Telepaths read a person's mind and tell their lord whether a follower is telling the truth or not.", - {"This is a terrible practice. A person's thoughts are his own and no one, not even a king, has the right to make such an invasion into another human's mind.", - "Loyal followers to the king have nothing to fear from a Telepath. It is important to have a method of finding assassins and spies before it is too late.", - "In these times, it is a necessary evil. Although you do not necessarily like the idea, a Telepath could have certain advantages during a time of war or in finding someone innocent of a crime."}, - {ESM::Class::Combat, ESM::Class::Magic, ESM::Class::Stealth} - }, - // Question 5 - {"Your mother sends you to the market with a list of goods to buy. After you finish you find that by mistake a shopkeeper has given you too much money back in exchange for one of the items.", - {"Return to the store and give the shopkeeper his hard-earned money, explaining to him the mistake?", - "Decide to put the extra money to good use and purchase items that would help your family?", - "Pocket the extra money, knowing that shopkeepers in general tend to overcharge customers anyway?"}, - {ESM::Class::Combat, ESM::Class::Magic, ESM::Class::Stealth} - }, - // Question 6 - {"While in the market place you witness a thief cut a purse from a noble. Even as he does so, the noble notices and calls for the city guards. In his haste to get away, the thief drops the purse near you. Surprisingly no one seems to notice the bag of coins at your feet.", - {"Pick up the bag and signal to the guard, knowing that the only honorable thing to do is return the money to its rightful owner.", - "Leave the bag there, knowing that it is better not to get involved.", - "Pick up the bag and pocket it, knowing that the extra windfall will help your family in times of trouble."}, - {ESM::Class::Combat, ESM::Class::Magic, ESM::Class::Stealth} - }, - // Question 7 - {"Your father sends you on a task which you loathe, cleaning the stables. On the way there, pitchfork in hand, you run into your friend from the homestead near your own. He offers to do it for you, in return for a future favor of his choosing.", - {"Decline his offer, knowing that your father expects you to do the work, and it is better not to be in debt.", - "Ask him to help you, knowing that two people can do the job faster than one, and agree to help him with one task of his choosing in the future.", - "Accept his offer, reasoning that as long as the stables are cleaned, it matters not who does the cleaning."}, - {ESM::Class::Combat, ESM::Class::Magic, ESM::Class::Stealth} - }, - // Question 8 - {"Your mother asks you to help fix the stove. While you are working, a very hot pipe slips its mooring and falls towards her.", - {"Position yourself between the pipe and your mother.", - "Grab the hot pipe and try to push it away.", - "Push your mother out of the way."}, - {ESM::Class::Combat, ESM::Class::Magic, ESM::Class::Stealth} - }, - // Question 9 - {"While in town the baker gives you a sweetroll. Delighted, you take it into an alley to enjoy only to be intercepted by a gang of three other kids your age. The leader demands the sweetroll, or else he and his friends will beat you and take it.", - {"Drop the sweetroll and step on it, then get ready for the fight.", - "Give him the sweetroll now without argument, knowing that later this afternoon you will have all your friends with you and can come and take whatever he owes you.", - "Act like you're going to give him the sweetroll, but at the last minute throw it in the air, hoping that they'll pay attention to it long enough for you to get a shot in on the leader."}, - {ESM::Class::Combat, ESM::Class::Magic, ESM::Class::Stealth} - }, - // Question 10 - {"Entering town you find that you are witness to a very well-dressed man running from a crowd. He screams to you for help. The crowd behind him seem very angry.", - {"Rush to the town's aid immediately, despite your lack of knowledge of the circumstances.", - "Stand aside and allow the man and the mob to pass, realizing it is probably best not to get involved.", - "Rush to the man's aid immediately, despite your lack of knowledge of the circumstances."}, - {ESM::Class::Combat, ESM::Class::Magic, ESM::Class::Stealth} - } - } }; -} - -void WindowManager::showClassQuestionDialog() -{ - if (generateClassStep == generateClassSteps.size()) - { - - static boost::array classes = { { - {"Acrobat", {6, 2, 2}}, - {"Agent", {6, 1, 3}}, - {"Archer", {3, 5, 2}}, - {"Archer", {5, 5, 0}}, - {"Assassin", {6, 3, 1}}, - {"Barbarian", {3, 6, 1}}, - {"Bard", {3, 3, 3}}, - {"Battlemage", {1, 3, 6}}, - {"Crusader", {1, 6, 3}}, - {"Healer", {3, 1, 6}}, - {"Knight", {2, 6, 2}}, - {"Monk", {5, 3, 2}}, - {"Nightblade", {4, 2, 4}}, - {"Pilgrim", {5, 2, 3}}, - {"Rogue", {3, 4, 3}}, - {"Rogue", {4, 4, 2}}, - {"Rogue", {5, 4, 1}}, - {"Scout", {2, 5, 3}}, - {"Sorcerer", {2, 2, 6}}, - {"Spellsword", {2, 4, 4}}, - {"Spellsword", {5, 1, 4}}, - {"Witchhunter", {2, 3, 5}}, - {"Witchhunter", {5, 0, 5}} - } }; - - int match = -1; - for (unsigned i = 0; i < classes.size(); ++i) - { - if (generateClassSpecializations[0] == classes[i].points[0] && - generateClassSpecializations[1] == classes[i].points[1] && - generateClassSpecializations[2] == classes[i].points[2]) - { - match = i; - generateClass = classes[i].id; - break; - } - } - - if (match == -1) - { - if (generateClassSpecializations[0] >= 7) - generateClass = "Thief"; - else if (generateClassSpecializations[1] >= 7) - generateClass = "Warrior"; - else if (generateClassSpecializations[2] >= 7) - generateClass = "Mage"; - else - { - std::cerr - << "Failed to deduce class from chosen answers in generate class dialog" - << std::endl; - generateClass = "Thief"; - } - } - - if (generateClassResultDialog) - removeDialog(generateClassResultDialog); - generateClassResultDialog = new GenerateClassResultDialog(*this); - generateClassResultDialog->setClassId(generateClass); - generateClassResultDialog->eventBack = MyGUI::newDelegate(this, &WindowManager::onGenerateClassBack); - generateClassResultDialog->eventDone = MyGUI::newDelegate(this, &WindowManager::onGenerateClassDone); - generateClassResultDialog->open(); - return; - } - - if (generateClassStep > generateClassSteps.size()) - { - setGuiMode(GM_Class); - return; - } - - if (generateClassQuestionDialog) - removeDialog(generateClassQuestionDialog); - generateClassQuestionDialog = new InfoBoxDialog(*this); - - InfoBoxDialog::ButtonList buttons; - generateClassQuestionDialog->setText(generateClassSteps[generateClassStep].text); - buttons.push_back(generateClassSteps[generateClassStep].buttons[0]); - buttons.push_back(generateClassSteps[generateClassStep].buttons[1]); - buttons.push_back(generateClassSteps[generateClassStep].buttons[2]); - generateClassQuestionDialog->setButtons(buttons); - generateClassQuestionDialog->eventButtonSelected = MyGUI::newDelegate(this, &WindowManager::onClassQuestionChosen); - generateClassQuestionDialog->open(); -} - -void WindowManager::onClassQuestionChosen(int _index) -{ - if (generateClassQuestionDialog) - removeDialog(generateClassQuestionDialog); - if (_index < 0 || _index >= 3) - { - setGuiMode(GM_Class); - return; - } - - ESM::Class::Specialization specialization = generateClassSteps[generateClassStep].specializations[_index]; - if (specialization == ESM::Class::Stealth) - ++generateClassSpecializations[0]; - else if (specialization == ESM::Class::Combat) - ++generateClassSpecializations[1]; - else if (specialization == ESM::Class::Magic) - ++generateClassSpecializations[2]; - ++generateClassStep; - showClassQuestionDialog(); -} - -void WindowManager::onGenerateClassBack() -{ - if(creationStage < ClassChosen) - creationStage = ClassChosen; - - if (generateClassResultDialog) - removeDialog(generateClassResultDialog); - environment.mMechanicsManager->setPlayerClass(generateClass); - - setGuiMode(GM_Class); -} - -void WindowManager::onGenerateClassDone(WindowBase* parWindow) -{ - if (generateClassResultDialog) - removeDialog(generateClassResultDialog); - environment.mMechanicsManager->setPlayerClass(generateClass); - - // Go to next dialog if class was previously chosen - if (creationStage == ReviewNext) - setGuiMode(GM_Review); - else if (creationStage >= ClassChosen) - setGuiMode(GM_Birth); - else - { - creationStage = ClassChosen; - setGuiMode(GM_Game); - } -} - - -void WindowManager::onPickClassDialogDone(WindowBase* parWindow) -{ - if (pickClassDialog) - { - const std::string &classId = pickClassDialog->getClassId(); - if (!classId.empty()) - environment.mMechanicsManager->setPlayerClass(classId); - const ESM::Class *klass = environment.mWorld->getStore().classes.find(classId); - if (klass) - playerClass = *klass; - removeDialog(pickClassDialog); - } - - // Go to next dialog if class was previously chosen - if (creationStage == ReviewNext) - setGuiMode(GM_Review); - else if (creationStage >= ClassChosen) - setGuiMode(GM_Birth); - else - { - creationStage = ClassChosen; - setGuiMode(GM_Game); - } -} - -void WindowManager::onPickClassDialogBack() -{ - if (pickClassDialog) - { - const std::string classId = pickClassDialog->getClassId(); - if (!classId.empty()) - environment.mMechanicsManager->setPlayerClass(classId); - removeDialog(pickClassDialog); - } - - setGuiMode(GM_Class); -} - -void WindowManager::onCreateClassDialogDone(WindowBase* parWindow) -{ - if (createClassDialog) - { - ESM::Class klass; - klass.name = createClassDialog->getName(); - klass.description = createClassDialog->getDescription(); - klass.data.specialization = createClassDialog->getSpecializationId(); - klass.data.isPlayable = 0x1; - - std::vector attributes = createClassDialog->getFavoriteAttributes(); - assert(attributes.size() == 2); - klass.data.attribute[0] = attributes[0]; - klass.data.attribute[1] = attributes[1]; - - std::vector majorSkills = createClassDialog->getMajorSkills(); - std::vector minorSkills = createClassDialog->getMinorSkills(); - assert(majorSkills.size() >= sizeof(klass.data.skills)/sizeof(klass.data.skills[0])); - assert(minorSkills.size() >= sizeof(klass.data.skills)/sizeof(klass.data.skills[0])); - for (size_t i = 0; i < sizeof(klass.data.skills)/sizeof(klass.data.skills[0]); ++i) - { - klass.data.skills[i][1] = majorSkills[i]; - klass.data.skills[i][0] = minorSkills[i]; - } - environment.mMechanicsManager->setPlayerClass(klass); - playerClass = klass; - - removeDialog(createClassDialog); - } - - // Go to next dialog if class was previously chosen - if (creationStage == ReviewNext) - setGuiMode(GM_Review); - else if (creationStage >= ClassChosen) - setGuiMode(GM_Birth); - else - { - creationStage = ClassChosen; - setGuiMode(GM_Game); - } -} - -void WindowManager::onCreateClassDialogBack() -{ - if (createClassDialog) - removeDialog(createClassDialog); - - setGuiMode(GM_Class); -} - -void WindowManager::onBirthSignDialogDone(WindowBase* parWindow) -{ - if (birthSignDialog) - { - playerBirthSignId = birthSignDialog->getBirthId(); - if (!playerBirthSignId.empty()) - environment.mMechanicsManager->setPlayerBirthsign(playerBirthSignId); - removeDialog(birthSignDialog); - } - - // Go to next dialog if birth sign was previously chosen - if (creationStage >= BirthSignChosen) - setGuiMode(GM_Review); - else - { - creationStage = BirthSignChosen; - setGuiMode(GM_Game); - } -} - -void WindowManager::onBirthSignDialogBack() -{ - if (birthSignDialog) - { - environment.mMechanicsManager->setPlayerBirthsign(birthSignDialog->getBirthId()); - removeDialog(birthSignDialog); - } - - setGuiMode(GM_Class); -} - -void WindowManager::onReviewDialogDone(WindowBase* parWindow) -{ - if (reviewDialog) - removeDialog(reviewDialog); - - setGuiMode(GM_Game); -} - -void WindowManager::onReviewDialogBack() -{ - if (reviewDialog) - removeDialog(reviewDialog); - - setGuiMode(GM_Birth); -} - -void WindowManager::onReviewActivateDialog(int parDialog) -{ - if (reviewDialog) - removeDialog(reviewDialog); - creationStage = ReviewNext; - - switch(parDialog) - { - case ReviewDialog::NAME_DIALOG: - setGuiMode(GM_Name); - break; - case ReviewDialog::RACE_DIALOG: - setGuiMode(GM_Race); - break; - case ReviewDialog::CLASS_DIALOG: - setGuiMode(GM_Class); - break; - case ReviewDialog::BIRTHSIGN_DIALOG: - setGuiMode(GM_Birth); - }; -} - const ESMS::ESMStore& WindowManager::getStore() const { return environment.mWorld->getStore(); diff --git a/apps/openmw/mwgui/window_manager.hpp b/apps/openmw/mwgui/window_manager.hpp index a47e53fed..89ff4b9bb 100644 --- a/apps/openmw/mwgui/window_manager.hpp +++ b/apps/openmw/mwgui/window_manager.hpp @@ -8,13 +8,15 @@ MyGUI should be initialized separately before creating instances of this class. - */ +**/ #include #include #include #include +#include +#include #include "../mwmechanics/stat.hpp" #include "mode.hpp" @@ -32,6 +34,12 @@ namespace Compiler namespace MWWorld { class Environment; + class World; +} + +namespace MWMechanics +{ + class MechanicsManager; } namespace OEngine @@ -52,17 +60,11 @@ namespace MWGui class InventoryWindow; class Console; class JournalWindow; + class CharacterCreation; class TextInputDialog; class InfoBoxDialog; - class RaceDialog; class DialogueWindow; - class ClassChoiceDialog; - class GenerateClassResultDialog; - class PickClassDialog; - class CreateClassDialog; - class BirthDialog; - class ReviewDialog; class MessageBoxManager; struct ClassPoint @@ -80,95 +82,11 @@ namespace MWGui typedef std::vector FactionList; typedef std::vector SkillList; - private: - MWWorld::Environment& environment; - HUD *hud; - MapWindow *map; - MainMenu *menu; - StatsWindow *stats; - MessageBoxManager *mMessageBoxManager; -#if 0 - InventoryWindow *inventory; -#endif - Console *console; - JournalWindow* mJournal; - - // Character creation - TextInputDialog *nameDialog; - RaceDialog *raceDialog; - DialogueWindow *dialogueWindow; - ClassChoiceDialog *classChoiceDialog; - InfoBoxDialog *generateClassQuestionDialog; - GenerateClassResultDialog *generateClassResultDialog; - PickClassDialog *pickClassDialog; - CreateClassDialog *createClassDialog; - BirthDialog *birthSignDialog; - ReviewDialog *reviewDialog; - - // Keeps track of current step in Generate Class dialogs - unsigned generateClassStep; - // A counter for each specialization which is increased when an answer is chosen, in order: Stealth, Combat, Magic - unsigned generateClassSpecializations[3]; - std::string generateClass; - - // Various stats about player as needed by window manager - std::string playerName; - ESM::Class playerClass; - std::string playerRaceId, playerBirthSignId; - std::map > playerAttributes; - SkillList playerMajorSkills, playerMinorSkills; - std::map > playerSkillValues; - MWMechanics::DynamicStat playerHealth, playerMagicka, playerFatigue; - - // Gui - MyGUI::Gui *gui; - - // Current gui mode - GuiMode mode; - - /** - * Next mode to activate in update(). - */ - GuiMode nextMode; - /** - * Whether a mode change is needed in update(). - * Will use @a nextMode as the new mode. - */ - bool needModeChange; - - std::vector garbageDialogs; - void cleanupGarbage(); - - // Currently shown windows in inventory mode - GuiWindow shown; - - /* Currently ALLOWED windows in inventory mode. This is used at - the start of the game, when windows are enabled one by one - through script commands. You can manipulate this through using - allow() and disableAll(). - - The setting should also affect visibility of certain HUD - elements, but this is not done yet. - */ - GuiWindow allowed; - - // Update visibility of all windows based on mode, shown and - // allowed settings. - void updateVisible(); + WindowManager(MWWorld::Environment& environment, const Compiler::Extensions& extensions, int fpsLevel, bool newGame, OEngine::Render::OgreRenderer *mOgre, const std::string logpath); + virtual ~WindowManager(); void setGuiMode(GuiMode newMode); - int showFPSLevel; - float mFPS; - size_t mTriangleCount; - size_t mBatchCount; - - public: - /// The constructor needs the main Gui object - WindowManager(MyGUI::Gui *_gui, MWWorld::Environment& environment, - const Compiler::Extensions& extensions, int fpsLevel, bool newGame); - virtual ~WindowManager(); - /** * Should be called each frame to update windows/gui elements. * This could mean updating sizes of gui elements or opening @@ -190,8 +108,7 @@ namespace MWGui GuiMode getMode() const { return mode; } - // Everything that is not game mode is considered "gui mode" - bool isGuiMode() const { return getMode() != GM_Game; } + bool isGuiMode() const { return getMode() != GM_Game; } // Everything that is not game mode is considered "gui mode" // Disallow all inventory mode windows void disallowAll() @@ -216,54 +133,31 @@ namespace MWGui mBatchCount = batchCount; } - void setValue (const std::string& id, const MWMechanics::Stat& value); - ///< Set value for the given ID. +// MWMechanics::DynamicStat getValue(const std::string& id); - void setValue(const ESM::Skill::SkillEnum parSkill, const MWMechanics::Stat& value); ///< Set value for the given ID. - + void setValue (const std::string& id, const MWMechanics::Stat& value); + void setValue(const ESM::Skill::SkillEnum parSkill, const MWMechanics::Stat& value); void setValue (const std::string& id, const MWMechanics::DynamicStat& value); - ///< Set value for the given ID. - void setValue (const std::string& id, const std::string& value); - ///< set value for the given ID. - void setValue (const std::string& id, int value); - ///< set value for the given ID. - - void setPlayerClass (const ESM::Class &class_); - ///< set current class of player - - void configureSkills (const SkillList& major, const SkillList& minor); - ///< configure skill groups, each set contains the skill ID for that group. - void setFactions (const FactionList& factions); - ///< set faction and rank to display on stat window, use an empty vector to disable + void setPlayerClass (const ESM::Class &class_); ///< set current class of player + void configureSkills (const SkillList& major, const SkillList& minor); ///< configure skill groups, each set contains the skill ID for that group. + void setFactions (const FactionList& factions); ///< set faction and rank to display on stat window, use an empty vector to disable + void setBirthSign (const std::string &signId); ///< set birth sign to display on stat window, use an empty string to disable. + void setReputation (int reputation); ///< set the current reputation value + void setBounty (int bounty); ///< set the current bounty value + void updateSkillArea(); ///< update display of skills, factions, birth sign, reputation and bounty - void setBirthSign (const std::string &signId); - ///< set birth sign to display on stat window, use an empty string to disable. - - void setReputation (int reputation); - ///< set the current reputation value - - void setBounty (int bounty); - ///< set the current bounty value - - void updateSkillArea(); - ///< update display of skills, factions, birth sign, reputation and bounty template - void removeDialog(T*& dialog); - ///< Casts to OEngine::GUI::Layout and calls removeDialog, then resets pointer to nullptr. + void removeDialog(T*& dialog); ///< Casts to OEngine::GUI::Layout and calls removeDialog, then resets pointer to nullptr. + void removeDialog(OEngine::GUI::Layout* dialog); ///< Hides dialog and schedules dialog to be deleted. - void removeDialog(OEngine::GUI::Layout* dialog); - ///< Hides dialog and schedules dialog to be deleted. - void messageBox (const std::string& message, const std::vector& buttons); - - int readPressedButton (); - ///< returns the index of the pressed button or -1 if no button was pressed (->MessageBoxmanager->InteractiveMessageBox) - + int readPressedButton (); ///< returns the index of the pressed button or -1 if no button was pressed (->MessageBoxmanager->InteractiveMessageBox) + void onFrame (float frameDuration); /** @@ -278,54 +172,58 @@ namespace MWGui const ESMS::ESMStore& getStore() const; private: + OEngine::GUI::MyGUIManager *mGuiManager; + MWWorld::Environment& environment; + HUD *hud; + MapWindow *map; + MainMenu *menu; + StatsWindow *stats; + MessageBoxManager *mMessageBoxManager; + Console *console; + JournalWindow* mJournal; + DialogueWindow *dialogueWindow; - void onDialogueWindowBye(); + CharacterCreation* mCharGen; - // Character generation: Name dialog - void onNameDialogDone(WindowBase* parWindow); + // Various stats about player as needed by window manager + ESM::Class playerClass; + std::string playerName; + std::string playerRaceId; + std::string playerBirthSignId; + std::map > playerAttributes; + SkillList playerMajorSkills, playerMinorSkills; + std::map > playerSkillValues; + MWMechanics::DynamicStat playerHealth, playerMagicka, playerFatigue; - // Character generation: Race dialog - void onRaceDialogDone(WindowBase* parWindow); - void onRaceDialogBack(); - // Character generation: Choose class process - void onClassChoice(int _index); + MyGUI::Gui *gui; // Gui + GuiMode mode; // Current gui mode + GuiMode nextMode; // Next mode to activate in update() + bool needModeChange; //Whether a mode change is needed in update() [will use nextMode] - // Character generation: Generate Class - void showClassQuestionDialog(); - void onClassQuestionChosen(int _index); - void onGenerateClassBack(); - void onGenerateClassDone(WindowBase* parWindow); + std::vector garbageDialogs; + void cleanupGarbage(); - // Character generation: Pick Class dialog - void onPickClassDialogDone(WindowBase* parWindow); - void onPickClassDialogBack(); + GuiWindow shown; // Currently shown windows in inventory mode - // Character generation: Create Class dialog - void onCreateClassDialogDone(WindowBase* parWindow); - void onCreateClassDialogBack(); + /* Currently ALLOWED windows in inventory mode. This is used at + the start of the game, when windows are enabled one by one + through script commands. You can manipulate this through using + allow() and disableAll(). - // Character generation: Birth sign dialog - void onBirthSignDialogDone(WindowBase* parWindow); - void onBirthSignDialogBack(); + The setting should also affect visibility of certain HUD + elements, but this is not done yet. + */ + GuiWindow allowed; - // Character generation: Review dialog - void onReviewDialogDone(WindowBase* parWindow); - void onReviewDialogBack(); - void onReviewActivateDialog(int parDialog); + void updateVisible(); // Update visibility of all windows based on mode, shown and allowed settings - enum CreationStageEnum - { - NotStarted, - NameChosen, - RaceChosen, - ClassChosen, - BirthSignChosen, - ReviewNext - }; - - // Which state the character creating is in, controls back/next/ok buttons - CreationStageEnum creationStage; + int showFPSLevel; + float mFPS; + size_t mTriangleCount; + size_t mBatchCount; + + void onDialogueWindowBye(); }; template diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index 12dfc0ce4..7b58a80d7 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -19,14 +19,10 @@ using namespace Ogre; namespace MWRender { - - RenderingManager::RenderingManager (OEngine::Render::OgreRenderer& _rend, const boost::filesystem::path& resDir, OEngine::Physic::PhysicEngine* engine, MWWorld::Environment& environment) -:mRendering(_rend), mObjects(mRendering), mActors(mRendering, environment), mDebugging(engine) +:mRendering(_rend), mObjects(mRendering), mActors(mRendering, environment), mAmbientMode(0), mDebugging(engine) { mRendering.createScene("PlayerCam", 55, 5); - //mSkyManager = 0; - mSkyManager = MWRender::SkyManager::create(mRendering.getWindow(), mRendering.getCamera(), resDir); // Set default mipmap level (NB some APIs ignore this) TextureManager::getSingleton().setDefaultNumMipmaps(5); @@ -44,7 +40,7 @@ RenderingManager::RenderingManager (OEngine::Render::OgreRenderer& _rend, const mMwRoot->pitch(Degree(-90)); mObjects.setMwRoot(mMwRoot); mActors.setMwRoot(mMwRoot); - + //used to obtain ingame information of ogre objects (which are faced or selected) mRaySceneQuery = mRendering.getScene()->createRayQuery(Ray()); @@ -53,6 +49,9 @@ RenderingManager::RenderingManager (OEngine::Render::OgreRenderer& _rend, const Ogre::SceneNode *cameraYawNode = playerNode->createChildSceneNode(); Ogre::SceneNode *cameraPitchNode = cameraYawNode->createChildSceneNode(); cameraPitchNode->attachObject(mRendering.getCamera()); + + //mSkyManager = 0; + mSkyManager = new SkyManager(mMwRoot, mRendering.getCamera()); mPlayer = new MWRender::Player (mRendering.getCamera(), playerNode); mSun = 0; @@ -65,6 +64,10 @@ RenderingManager::~RenderingManager () delete mSkyManager; } +MWRender::SkyManager* RenderingManager::getSkyManager() +{ + return mSkyManager; +} MWRender::Objects& RenderingManager::getObjects(){ return mObjects; @@ -77,6 +80,11 @@ MWRender::Player& RenderingManager::getPlayer(){ return (*mPlayer); } +OEngine::Render::Fader* RenderingManager::getFader() +{ + return mRendering.getFader(); +} + void RenderingManager::removeCell (MWWorld::Ptr::CellStore *store){ mObjects.removeCell(store); mActors.removeCell(store); @@ -125,6 +133,10 @@ void RenderingManager::moveObjectToCell (const MWWorld::Ptr& ptr, const Ogre::Ve void RenderingManager::update (float duration){ mActors.update (duration); + + mSkyManager->update(duration); + + mRendering.update(duration); } void RenderingManager::skyEnable () @@ -167,8 +179,24 @@ void RenderingManager::skySetMoonColour (bool red){ if(mSkyManager) mSkyManager->setMoonColour(red); } -bool RenderingManager::toggleRenderMode(int mode){ - return mDebugging.toggleRenderMode(mode); + +bool RenderingManager::toggleRenderMode(int mode) +{ + if (mode == MWWorld::World::Render_CollisionDebug) + return mDebugging.toggleRenderMode(mode); + else // if (mode == MWWorld::World::Render_Wireframe) + { + if (mRendering.getCamera()->getPolygonMode() == PM_SOLID) + { + mRendering.getCamera()->setPolygonMode(PM_WIREFRAME); + return true; + } + else + { + mRendering.getCamera()->setPolygonMode(PM_SOLID); + return false; + } + } } void RenderingManager::configureFog(ESMS::CellStore &mCell) @@ -176,14 +204,22 @@ void RenderingManager::configureFog(ESMS::CellStore &mCell) Ogre::ColourValue color; color.setAsABGR (mCell.cell->ambi.fog); - float high = 4500 + 9000 * (1-mCell.cell->ambi.fogDensity); - float low = 200; + configureFog(mCell.cell->ambi.fogDensity, color); +} - mRendering.getScene()->setFog (FOG_LINEAR, color, 0, low, high); - mRendering.getCamera()->setFarClipDistance (high + 10); - mRendering.getViewport()->setBackgroundColour (color); +void RenderingManager::configureFog(const float density, const Ogre::ColourValue& colour) +{ + /// \todo make the viewing distance and fog start/end configurable + float low = 3000 / density; + float high = 6200 / density; + + mRendering.getScene()->setFog (FOG_LINEAR, colour, 0, low, high); + + mRendering.getCamera()->setFarClipDistance ( high ); + mRendering.getViewport()->setBackgroundColour (colour); } + void RenderingManager::setAmbientMode() { switch (mAmbientMode) @@ -252,4 +288,38 @@ void RenderingManager::skipAnimation (const MWWorld::Ptr& ptr) mActors.skipAnimation(ptr); } +void RenderingManager::setSunColour(const Ogre::ColourValue& colour) +{ + mSun->setDiffuseColour(colour); } + +void RenderingManager::setAmbientColour(const Ogre::ColourValue& colour) +{ + mRendering.getScene()->setAmbientLight(colour); +} + +void RenderingManager::sunEnable() +{ + if (mSun) mSun->setVisible(true); +} + +void RenderingManager::sunDisable() +{ + if (mSun) mSun->setVisible(false); +} + +void RenderingManager::setSunDirection(const Ogre::Vector3& direction) +{ + // direction * -1 (because 'direction' is camera to sun vector and not sun to camera), + // then convert from MW to ogre coordinates (swap y,z and make y negative) + if (mSun) mSun->setDirection(Vector3(-direction.x, -direction.z, direction.y)); + + mSkyManager->setSunDirection(direction); +} + +void RenderingManager::setGlare(bool glare) +{ + mSkyManager->setGlare(glare); +} + +} // namespace diff --git a/apps/openmw/mwrender/renderingmanager.hpp b/apps/openmw/mwrender/renderingmanager.hpp index ca5d95a3f..d84ee43e0 100644 --- a/apps/openmw/mwrender/renderingmanager.hpp +++ b/apps/openmw/mwrender/renderingmanager.hpp @@ -9,6 +9,7 @@ #include #include +#include #include #include @@ -61,8 +62,12 @@ class RenderingManager: private RenderingInterface { /// MWWorld::Player has been rewritten to not need access /// to internal details of the rendering system anymore + SkyManager* getSkyManager(); + void toggleLight(); bool toggleRenderMode(int mode); + + OEngine::Render::Fader* getFader(); void removeCell (MWWorld::Ptr::CellStore *store); @@ -81,7 +86,14 @@ class RenderingManager: private RenderingInterface { void moveObjectToCell (const MWWorld::Ptr& ptr, const Ogre::Vector3& position, MWWorld::Ptr::CellStore *store); void update (float duration); - + + void setAmbientColour(const Ogre::ColourValue& colour); + void setSunColour(const Ogre::ColourValue& colour); + void setSunDirection(const Ogre::Vector3& direction); + void sunEnable(); + void sunDisable(); + + void setGlare(bool glare); void skyEnable (); void skyDisable (); void skySetHour (double hour); @@ -90,9 +102,13 @@ class RenderingManager: private RenderingInterface { int skyGetSecundaPhase() const; void skySetMoonColour (bool red); void configureAmbient(ESMS::CellStore &mCell); + /// configure fog according to cell void configureFog(ESMS::CellStore &mCell); - + + /// configure fog manually + void configureFog(const float density, const Ogre::ColourValue& colour); + void playAnimationGroup (const MWWorld::Ptr& ptr, const std::string& groupName, int mode, int number = 1); ///< Run animation for a MW-reference. Calls to this function for references that are currently not @@ -108,7 +124,9 @@ class RenderingManager: private RenderingInterface { private: void setAmbientMode(); + SkyManager* mSkyManager; + OEngine::Render::OgreRenderer &mRendering; MWRender::Objects mObjects; diff --git a/apps/openmw/mwrender/sky.cpp b/apps/openmw/mwrender/sky.cpp index 95601d043..b8bd588c4 100644 --- a/apps/openmw/mwrender/sky.cpp +++ b/apps/openmw/mwrender/sky.cpp @@ -1,116 +1,764 @@ #include "sky.hpp" -#include "Caelum.h" - -namespace MWRender -{ - // - // Implements a Caelum sky with default settings. - // - // Note: this is intended as a temporary solution to provide some form of - // sky rendering. This code will obviously need significant tailoring to - // support fidelity with Morrowind's rendering. Before doing major work - // on this class, more research should be done to determine whether - // Caelum or another plug-in such as SkyX would be best for the long-term. - // - class CaelumManager : public SkyManager - { - protected: - Caelum::CaelumSystem* mpCaelumSystem; - - public: - CaelumManager (Ogre::RenderWindow* pRenderWindow, - Ogre::Camera* pCamera, - const boost::filesystem::path& resDir); - virtual ~CaelumManager (); - - virtual void enable() {} - - virtual void disable() {} - - virtual void setHour (double hour) {} - ///< will be called even when sky is disabled. - - virtual void setDate (int day, int month) {} - ///< will be called even when sky is disabled. - - virtual int getMasserPhase() const { return 0; } - ///< 0 new moon, 1 waxing or waning cresecent, 2 waxing or waning half, - /// 3 waxing or waning gibbous, 4 full moon - - virtual int getSecundaPhase() const { return 0; } - ///< 0 new moon, 1 waxing or waning cresecent, 2 waxing or waning half, - /// 3 waxing or waning gibbous, 4 full moon - - virtual void setMoonColour (bool red) {} - }; - - CaelumManager::CaelumManager (Ogre::RenderWindow* pRenderWindow, - Ogre::Camera* pCamera, - const boost::filesystem::path& resDir) - : mpCaelumSystem (NULL) + +#include +#include +#include +#include +#include +#include +#include + +#include + +using namespace MWRender; +using namespace Ogre; + +// the speed at which the clouds are animated +#define CLOUD_SPEED 0.001 + +// this distance has to be set accordingly so that the +// celestial bodies are behind the clouds, but in front of the atmosphere +#define CELESTIAL_BODY_DISTANCE 1000.f + +BillboardObject::BillboardObject( const String& textureName, + const float initialSize, + const Vector3& position, + SceneNode* rootNode) +{ + init(textureName, initialSize, position, rootNode); +} + +BillboardObject::BillboardObject() +{ +} + +void BillboardObject::setVisible(const bool visible) +{ + mNode->setVisible(visible); +} + +void BillboardObject::setSize(const float size) +{ + mNode->setScale(size, size, size); +} + +void BillboardObject::setVisibility(const float visibility) +{ + mMaterial->getTechnique(0)->getPass(0)->setDiffuse(0.0, 0.0, 0.0, visibility); +} + +void BillboardObject::setPosition(const Vector3& pPosition) +{ + Vector3 normalised = pPosition.normalisedCopy(); + Vector3 finalPosition = normalised * CELESTIAL_BODY_DISTANCE; + + mBBSet->setCommonDirection( -normalised ); + + mNode->setPosition(finalPosition); +} + +Vector3 BillboardObject::getPosition() const +{ + return mNode->getPosition(); +} + +void BillboardObject::setColour(const ColourValue& pColour) +{ + mMaterial->getTechnique(0)->getPass(0)->setSelfIllumination(pColour); +} + +void BillboardObject::setRenderQueue(unsigned int id) +{ + mBBSet->setRenderQueueGroup(id); +} + +SceneNode* BillboardObject::getNode() +{ + return mNode; +} + +void BillboardObject::init(const String& textureName, + const float initialSize, + const Vector3& position, + SceneNode* rootNode) +{ + SceneManager* sceneMgr = rootNode->getCreator(); + + Vector3 finalPosition = position.normalisedCopy() * CELESTIAL_BODY_DISTANCE; + + static unsigned int bodyCount=0; + + /// \todo These billboards are not 100% correct, might want to revisit them later + mBBSet = sceneMgr->createBillboardSet("SkyBillboardSet"+StringConverter::toString(bodyCount), 1); + mBBSet->setDefaultDimensions(550.f*initialSize, 550.f*initialSize); + mBBSet->setRenderQueueGroup(RENDER_QUEUE_SKIES_EARLY+2); + mBBSet->setBillboardType(BBT_PERPENDICULAR_COMMON); + mBBSet->setCommonDirection( -position.normalisedCopy() ); + mNode = rootNode->createChildSceneNode(); + mNode->setPosition(finalPosition); + mNode->attachObject(mBBSet); + mBBSet->createBillboard(0,0,0); + + mMaterial = MaterialManager::getSingleton().create("BillboardMaterial"+StringConverter::toString(bodyCount), ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); + mMaterial->removeAllTechniques(); + Pass* p = mMaterial->createTechnique()->createPass(); + p->setSceneBlending(SBT_TRANSPARENT_ALPHA); + p->setDepthCheckEnabled(false); + p->setDepthWriteEnabled(false); + p->setSelfIllumination(1.0,1.0,1.0); + p->setDiffuse(0.0,0.0,0.0,1.0); + p->setAmbient(0.0,0.0,0.0); + p->createTextureUnitState(textureName); + mBBSet->setMaterialName("BillboardMaterial"+StringConverter::toString(bodyCount)); + + bodyCount++; +} + +Moon::Moon( const String& textureName, + const float initialSize, + const Vector3& position, + SceneNode* rootNode) +{ + init(textureName, initialSize, position, rootNode); + + HighLevelGpuProgramManager& mgr = HighLevelGpuProgramManager::getSingleton(); + HighLevelGpuProgramPtr vshader; + if (mgr.resourceExists("Moon_VP")) + vshader = mgr.getByName("Moon_VP"); + else + vshader = mgr.createProgram("Moon_VP", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, "cg", GPT_VERTEX_PROGRAM); + vshader->setParameter("profiles", "vs_2_x arbvp1"); + vshader->setParameter("entry_point", "main_vp"); + StringUtil::StrStreamType outStream; + outStream << + "void main_vp( \n" + " float4 position : POSITION, \n" + " in float2 uv : TEXCOORD0, \n" + " out float2 oUV : TEXCOORD0, \n" + " out float4 oPosition : POSITION, \n" + " uniform float4x4 worldViewProj \n" + ") \n" + "{ \n" + " oUV = uv; \n" + " oPosition = mul( worldViewProj, position ); \n" + "}"; + vshader->setSource(outStream.str()); + vshader->load(); + vshader->getDefaultParameters()->setNamedAutoConstant("worldViewProj", GpuProgramParameters::ACT_WORLDVIEWPROJ_MATRIX); + mMaterial->getTechnique(0)->getPass(0)->setVertexProgram(vshader->getName()); + + HighLevelGpuProgramPtr fshader; + if (mgr.resourceExists("Moon_FP")) + fshader = mgr.getByName("Moon_FP"); + else + fshader = mgr.createProgram("Moon_FP", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, "cg", GPT_FRAGMENT_PROGRAM); + + fshader->setParameter("profiles", "ps_2_x arbfp1"); + fshader->setParameter("entry_point", "main_fp"); + StringUtil::StrStreamType outStream2; + outStream2 << + "void main_fp( \n" + " in float2 uv : TEXCOORD0, \n" + " out float4 oColor : COLOR, \n" + " uniform sampler2D texture : TEXUNIT0, \n" + " uniform float4 diffuse, \n" + " uniform float4 emissive \n" + ") \n" + "{ \n" + " float4 tex = tex2D(texture, uv); \n" + " oColor = float4(emissive.xyz,1) * tex2D(texture, uv) * float4(1,1,1,diffuse.a); \n" + " float bump = pow((1-diffuse.a),4); \n" + " oColor.rgb += float3(bump, bump, bump)*0.5; \n" + "}"; + fshader->setSource(outStream2.str()); + fshader->load(); + fshader->getDefaultParameters()->setNamedAutoConstant("diffuse", GpuProgramParameters::ACT_SURFACE_DIFFUSE_COLOUR); + fshader->getDefaultParameters()->setNamedAutoConstant("emissive", GpuProgramParameters::ACT_SURFACE_EMISSIVE_COLOUR); + mMaterial->getTechnique(0)->getPass(0)->setFragmentProgram(fshader->getName()); + + setVisibility(1.0); + + mPhase = Moon::Phase_Full; +} + +void Moon::setType(const Moon::Type& type) +{ + mType = type; +} + + +/// \todo the moon phase rendering is not correct - the dark part of the moon does not occlude the stars +void Moon::setPhase(const Moon::Phase& phase) +{ + Ogre::String textureName = "textures\\tx_"; + + if (mType == Moon::Type_Secunda) textureName += "secunda_"; + else textureName += "masser_"; + + if (phase == Moon::Phase_New) textureName += "new"; + else if (phase == Moon::Phase_WaxingCrescent) textureName += "one_wax"; + else if (phase == Moon::Phase_WaxingHalf) textureName += "half_wax"; + else if (phase == Moon::Phase_WaxingGibbous) textureName += "three_wax"; + else if (phase == Moon::Phase_WaningCrescent) textureName += "one_wan"; + else if (phase == Moon::Phase_WaningHalf) textureName += "half_wan"; + else if (phase == Moon::Phase_WaningGibbous) textureName += "three_wan"; + else if (phase == Moon::Phase_Full) textureName += "full"; + + textureName += ".dds"; + + mMaterial->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setTextureName(textureName); + + mPhase = phase; +} + +Moon::Phase Moon::getPhase() const +{ + return mPhase; +} + +unsigned int Moon::getPhaseInt() const +{ + if (mPhase == Moon::Phase_New) return 0; + else if (mPhase == Moon::Phase_WaxingCrescent) return 1; + else if (mPhase == Moon::Phase_WaningCrescent) return 1; + else if (mPhase == Moon::Phase_WaxingHalf) return 2; + else if (mPhase == Moon::Phase_WaningHalf) return 2; + else if (mPhase == Moon::Phase_WaxingGibbous) return 3; + else if (mPhase == Moon::Phase_WaningGibbous) return 3; + else if (mPhase == Moon::Phase_Full) return 4; + + return 0; +} + +void SkyManager::ModVertexAlpha(Entity* ent, unsigned int meshType) +{ + // Get the vertex colour buffer of this mesh + const Ogre::VertexElement* ves_diffuse = ent->getMesh()->getSubMesh(0)->vertexData->vertexDeclaration->findElementBySemantic( Ogre::VES_DIFFUSE ); + HardwareVertexBufferSharedPtr colourBuffer = ent->getMesh()->getSubMesh(0)->vertexData->vertexBufferBinding->getBuffer(ves_diffuse->getSource()); + + // Lock + void* pData = colourBuffer->lock(HardwareBuffer::HBL_NORMAL); + + // Iterate over all vertices + int vertex_size = colourBuffer->getVertexSize(); + float * currentVertex = NULL; + for (unsigned int i=0; igetNumVertices(); ++i) { - using namespace Ogre; - using namespace Caelum; - - assert(pCamera); - assert(pRenderWindow); - - // Load the Caelum resources - // - ResourceGroupManager::getSingleton().addResourceLocation((resDir / "caelum").string(), "FileSystem", "Caelum"); - ResourceGroupManager::getSingleton().initialiseAllResourceGroups(); - - // Load the Caelum resources - // - Ogre::SceneManager* pScene = pCamera->getSceneManager(); - Caelum::CaelumSystem::CaelumComponent componentMask = CaelumSystem::CAELUM_COMPONENTS_DEFAULT; - mpCaelumSystem = new Caelum::CaelumSystem (Root::getSingletonPtr(), pScene, componentMask); - - // Set time acceleration. - mpCaelumSystem->getUniversalClock()->setTimeScale(128); - - // Disable fog since OpenMW is handling OGRE fog elsewhere - mpCaelumSystem->setManageSceneFog(false); - - // Change the camera far distance to make sure the sky is not clipped - pCamera->setFarClipDistance(50000); - - // Register Caelum as an OGRE listener - pRenderWindow->addListener(mpCaelumSystem); - Root::getSingletonPtr()->addFrameListener(mpCaelumSystem); + // Get a pointer to the vertex colour + ves_diffuse->baseVertexPointerToElement( pData, ¤tVertex ); + + unsigned char alpha; + if (meshType == 0) alpha = i%2 ? 0 : 255; // this is a cylinder, so every second vertex belongs to the bottom-most row + else if (meshType == 1) + { + if (i>= 49 && i <= 64) alpha = 0; // bottom-most row + else if (i>= 33 && i <= 48) alpha = 64; // second bottom-most row + else alpha = 255; + } + + uint8 tmpR = static_cast(255); + uint8 tmpG = static_cast(255); + uint8 tmpB = static_cast(255); + uint8 tmpA = static_cast(alpha); + + // This does not matter since R and B are always 1. + /*VertexElementType format = Root::getSingleton().getRenderSystem()->getColourVertexElementType(); + switch (format) + { + case VET_COLOUR_ARGB: + std::swap(tmpR, tmpB); + break; + case VET_COLOUR_ABGR: + break; + default: + break; + }*/ + + // Modify + *((uint32*)currentVertex) = tmpR | (tmpG << 8) | (tmpB << 16) | (tmpA << 24); + + // Move to the next vertex + pData = static_cast (pData) + vertex_size; } - CaelumManager::~CaelumManager() + // Unlock + ent->getMesh()->getSubMesh(0)->vertexData->vertexBufferBinding->getBuffer(ves_diffuse->getSource())->unlock(); +} + +SkyManager::SkyManager (SceneNode* pMwRoot, Camera* pCamera) : + mGlareFade(0), mGlareEnabled(false) +{ + mViewport = pCamera->getViewport(); + mSceneMgr = pMwRoot->getCreator(); + mRootNode = pCamera->getParentSceneNode()->createChildSceneNode(); + mRootNode->pitch(Degree(-90)); // convert MW to ogre coordinates + mRootNode->setInheritOrientation(false); + + /// \todo preload all the textures and meshes that are used for sky rendering + + // Create overlay used for thunderstorm + MaterialPtr material = MaterialManager::getSingleton().create( "ThunderMaterial", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME ); + Pass* pass = material->getTechnique(0)->getPass(0); + pass->setSceneBlending(SBT_TRANSPARENT_ALPHA); + mThunderTextureUnit = pass->createTextureUnitState(); + mThunderTextureUnit->setColourOperationEx(LBX_SOURCE1, LBS_MANUAL, LBS_CURRENT, ColourValue(1.f, 1.f, 1.f)); // always black colour + mThunderTextureUnit->setAlphaOperation(LBX_SOURCE1, LBS_MANUAL, LBS_CURRENT, 0.5f); + OverlayManager& ovm = OverlayManager::getSingleton(); + mThunderOverlay = ovm.create( "ThunderOverlay" ); + OverlayContainer* overlay_panel; + overlay_panel = (OverlayContainer*)ovm.createOverlayElement("Panel", "ThunderPanel"); + overlay_panel->_setPosition(0, 0); + overlay_panel->_setDimensions(1, 1); + overlay_panel->setMaterialName( "ThunderMaterial" ); + overlay_panel->show(); + mThunderOverlay->add2D(overlay_panel); + mThunderOverlay->hide(); + + mSecunda = new Moon("textures\\tx_secunda_full.dds", 0.5, Vector3(-0.4, 0.4, 0.5), mRootNode); + mSecunda->setType(Moon::Type_Secunda); + mSecunda->setRenderQueue(RENDER_QUEUE_SKIES_EARLY+4); + + mMasser = new Moon("textures\\tx_masser_full.dds", 0.75, Vector3(-0.4, 0.4, 0.5), mRootNode); + mMasser->setRenderQueue(RENDER_QUEUE_SKIES_EARLY+3); + mMasser->setType(Moon::Type_Masser); + + mSun = new BillboardObject("textures\\tx_sun_05.dds", 1, Vector3(0.4, 0.4, 0.4), mRootNode); + mSunGlare = new BillboardObject("textures\\tx_sun_flash_grey_05.dds", 3, Vector3(0.4, 0.4, 0.4), mRootNode); + mSunGlare->setRenderQueue(RENDER_QUEUE_SKIES_LATE); + + + HighLevelGpuProgramManager& mgr = HighLevelGpuProgramManager::getSingleton(); + + // Stars + /// \todo sky_night_02.nif (available in Bloodmoon) + MeshPtr mesh = NifOgre::NIFLoader::load("meshes\\sky_night_01.nif"); + Entity* night1_ent = mSceneMgr->createEntity("meshes\\sky_night_01.nif"); + night1_ent->setRenderQueueGroup(RENDER_QUEUE_SKIES_EARLY+1); + + mAtmosphereNight = mRootNode->createChildSceneNode(); + mAtmosphereNight->attachObject(night1_ent); + + for (unsigned int i=0; igetNumSubEntities(); ++i) { - if (mpCaelumSystem) - mpCaelumSystem->shutdown (false); + MaterialPtr mp = night1_ent->getSubEntity(i)->getMaterial(); + mp->getTechnique(0)->getPass(0)->setSelfIllumination(1.0, 1.0, 1.0); + mp->getTechnique(0)->getPass(0)->setAmbient(0.0, 0.0, 0.0); + mp->getTechnique(0)->getPass(0)->setDiffuse(0.0, 0.0, 0.0, 1.0); + mp->getTechnique(0)->getPass(0)->setDepthWriteEnabled(false); + mp->getTechnique(0)->getPass(0)->setDepthCheckEnabled(false); + mp->getTechnique(0)->getPass(0)->setSceneBlending(SBT_TRANSPARENT_ALPHA); + + mStarsMaterials[i] = mp; } - /// Creates and connects the sky rendering component to OGRE. - /// - /// \return NULL on failure. - /// - SkyManager* SkyManager::create (Ogre::RenderWindow* pRenderWindow, - Ogre::Camera* pCamera, - const boost::filesystem::path& resDir) + // Stars vertex shader + HighLevelGpuProgramPtr vshader3 = mgr.createProgram("Stars_VP", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, + "cg", GPT_VERTEX_PROGRAM); + vshader3->setParameter("profiles", "vs_2_x arbvp1"); + vshader3->setParameter("entry_point", "main_vp"); + StringUtil::StrStreamType outStream4; + outStream4 << + "void main_vp( \n" + " float4 position : POSITION, \n" + " in float2 uv : TEXCOORD0, \n" + " out float2 oUV : TEXCOORD0, \n" + " out float oFade : TEXCOORD1, \n" + " out float4 oPosition : POSITION, \n" + " uniform float4x4 worldViewProj \n" + ") \n" + "{ \n" + " oUV = uv; \n" + " oFade = (position.z > 50) ? 1.f : 0.f; \n" + " oPosition = mul( worldViewProj, position ); \n" + "}"; + vshader3->setSource(outStream4.str()); + vshader3->load(); + vshader3->getDefaultParameters()->setNamedAutoConstant("worldViewProj", GpuProgramParameters::ACT_WORLDVIEWPROJ_MATRIX); + night1_ent->getSubEntity(3)->getMaterial()->getTechnique(0)->getPass(0)->setVertexProgram(vshader3->getName()); + + // Stars fragment shader + HighLevelGpuProgramPtr stars_fp = mgr.createProgram("Stars_FP", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, + "cg", GPT_FRAGMENT_PROGRAM); + stars_fp->setParameter("profiles", "ps_2_x arbfp1"); + stars_fp->setParameter("entry_point", "main_fp"); + StringUtil::StrStreamType outStream5; + outStream5 << + "void main_fp( \n" + " in float2 uv : TEXCOORD0, \n" + " out float4 oColor : COLOR, \n" + " in float fade : TEXCOORD1, \n" + " uniform sampler2D texture : TEXUNIT0, \n" + " uniform float opacity, \n" + " uniform float4 diffuse, \n" + " uniform float4 emissive \n" + ") \n" + "{ \n" + " oColor = tex2D(texture, uv) * float4(emissive.xyz, 1) * float4(1,1,1,fade*diffuse.a); \n" + "}"; + stars_fp->setSource(outStream5.str()); + stars_fp->load(); + stars_fp->getDefaultParameters()->setNamedAutoConstant("emissive", GpuProgramParameters::ACT_SURFACE_EMISSIVE_COLOUR); + stars_fp->getDefaultParameters()->setNamedAutoConstant("diffuse", GpuProgramParameters::ACT_SURFACE_DIFFUSE_COLOUR); + night1_ent->getSubEntity(3)->getMaterial()->getTechnique(0)->getPass(0)->setFragmentProgram(stars_fp->getName()); + + // Atmosphere (day) + mesh = NifOgre::NIFLoader::load("meshes\\sky_atmosphere.nif"); + Entity* atmosphere_ent = mSceneMgr->createEntity("meshes\\sky_atmosphere.nif"); + + ModVertexAlpha(atmosphere_ent, 0); + + atmosphere_ent->setRenderQueueGroup(RENDER_QUEUE_SKIES_EARLY); + mAtmosphereDay = mRootNode->createChildSceneNode(); + mAtmosphereDay->attachObject(atmosphere_ent); + mAtmosphereMaterial = atmosphere_ent->getSubEntity(0)->getMaterial(); + + // Atmosphere shader + HighLevelGpuProgramPtr vshader = mgr.createProgram("Atmosphere_VP", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, + "cg", GPT_VERTEX_PROGRAM); + + vshader->setParameter("profiles", "vs_2_x arbvp1"); + vshader->setParameter("entry_point", "main_vp"); + + StringUtil::StrStreamType outStream; + outStream << + "void main_vp( \n" + " float4 position : POSITION, \n" + " in float4 color : COLOR, \n" + " out float4 oPosition : POSITION, \n" + " out float4 oColor : COLOR, \n" + " uniform float4 emissive, \n" + " uniform float4x4 worldViewProj \n" + ") \n" + "{ \n" + " oPosition = mul( worldViewProj, position ); \n" + " oColor = color * emissive; \n" + "}"; + vshader->setSource(outStream.str()); + vshader->load(); + + vshader->getDefaultParameters()->setNamedAutoConstant("worldViewProj", GpuProgramParameters::ACT_WORLDVIEWPROJ_MATRIX); + vshader->getDefaultParameters()->setNamedAutoConstant("emissive", GpuProgramParameters::ACT_SURFACE_EMISSIVE_COLOUR); + mAtmosphereMaterial->getTechnique(0)->getPass(0)->setVertexProgram(vshader->getName()); + + // Clouds + NifOgre::NIFLoader::load("meshes\\sky_clouds_01.nif"); + Entity* clouds_ent = mSceneMgr->createEntity("meshes\\sky_clouds_01.nif"); + clouds_ent->setRenderQueueGroup(RENDER_QUEUE_SKIES_EARLY+5); + SceneNode* clouds_node = mRootNode->createChildSceneNode(); + clouds_node->attachObject(clouds_ent); + mCloudMaterial = clouds_ent->getSubEntity(0)->getMaterial(); + + // Clouds vertex shader + HighLevelGpuProgramPtr vshader2 = mgr.createProgram("Clouds_VP", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, + "cg", GPT_VERTEX_PROGRAM); + vshader2->setParameter("profiles", "vs_2_x arbvp1"); + vshader2->setParameter("entry_point", "main_vp"); + StringUtil::StrStreamType outStream3; + outStream3 << + "void main_vp( \n" + " float4 position : POSITION, \n" + " in float4 color : COLOR, \n" + " out float4 oColor : TEXCOORD1, \n" + " in float2 uv : TEXCOORD0, \n" + " out float2 oUV : TEXCOORD0, \n" + " out float4 oPosition : POSITION, \n" + " uniform float4x4 worldViewProj \n" + ") \n" + "{ \n" + " oUV = uv; \n" + " oColor = color; \n" + " oPosition = mul( worldViewProj, position ); \n" + "}"; + vshader2->setSource(outStream3.str()); + vshader2->load(); + vshader2->getDefaultParameters()->setNamedAutoConstant("worldViewProj", GpuProgramParameters::ACT_WORLDVIEWPROJ_MATRIX); + mCloudMaterial->getTechnique(0)->getPass(0)->setVertexProgram(vshader2->getName()); + + // Clouds fragment shader + mCloudFragmentShader = mgr.createProgram("Clouds_FP", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, + "cg", GPT_FRAGMENT_PROGRAM); + mCloudFragmentShader->setParameter("profiles", "ps_2_x arbfp1"); + mCloudFragmentShader->setParameter("entry_point", "main_fp"); + StringUtil::StrStreamType outStream2; + outStream2 << + "void main_fp( \n" + " in float2 uv : TEXCOORD0, \n" + " out float4 oColor : COLOR, \n" + " in float4 color : TEXCOORD1, \n" + " uniform sampler2D texture : TEXUNIT0, \n" + " uniform sampler2D secondTexture : TEXUNIT1, \n" + " uniform float transitionFactor, \n" + " uniform float time, \n" + " uniform float speed, \n" + " uniform float opacity, \n" + " uniform float4 emissive \n" + ") \n" + "{ \n" + " uv += float2(1,1) * time * speed * "<setSource(outStream2.str()); + mCloudFragmentShader->load(); + mCloudFragmentShader->getDefaultParameters()->setNamedAutoConstant("emissive", GpuProgramParameters::ACT_SURFACE_EMISSIVE_COLOUR); + mCloudMaterial->getTechnique(0)->getPass(0)->setFragmentProgram(mCloudFragmentShader->getName()); + setCloudsOpacity(0.75); + + ModVertexAlpha(clouds_ent, 1); + + // I'm not sure if the materials are being used by any other objects + // Make a unique "modifiable" copy of the materials to be sure + mCloudMaterial = mCloudMaterial->clone("Clouds"); + clouds_ent->getSubEntity(0)->setMaterial(mCloudMaterial); + mAtmosphereMaterial = mAtmosphereMaterial->clone("Atmosphere"); + atmosphere_ent->getSubEntity(0)->setMaterial(mAtmosphereMaterial); + + mAtmosphereMaterial->getTechnique(0)->getPass(0)->setSelfIllumination(1.0, 1.0, 1.0); + mAtmosphereMaterial->getTechnique(0)->getPass(0)->setDiffuse(0.0, 0.0, 0.0, 0.0); + mAtmosphereMaterial->getTechnique(0)->getPass(0)->setAmbient(0.0, 0.0, 0.0); + mCloudMaterial->getTechnique(0)->getPass(0)->setSelfIllumination(1.0, 1.0, 1.0); + mCloudMaterial->getTechnique(0)->getPass(0)->setDepthWriteEnabled(false); + mAtmosphereMaterial->getTechnique(0)->getPass(0)->setDepthWriteEnabled(false); + mAtmosphereMaterial->getTechnique(0)->getPass(0)->setSceneBlending(SBT_TRANSPARENT_ALPHA); + mCloudMaterial->getTechnique(0)->getPass(0)->setSceneBlending(SBT_TRANSPARENT_ALPHA); + + mCloudMaterial->getTechnique(0)->getPass(0)->createTextureUnitState(""); +} + +SkyManager::~SkyManager() +{ + delete mSun; + delete mSunGlare; + delete mMasser; + delete mSecunda; +} + +int SkyManager::getMasserPhase() const +{ + return mMasser->getPhaseInt(); +} + +int SkyManager::getSecundaPhase() const +{ + return mSecunda->getPhaseInt(); +} + +void SkyManager::update(float duration) +{ + if (!mEnabled) return; + + // UV Scroll the clouds + mCloudMaterial->getTechnique(0)->getPass(0)->getFragmentProgramParameters()->setNamedConstantFromTime("time", 1); + + /// \todo improve this + mMasser->setPhase( static_cast( (int) ((mDay % 32)/4.f)) ); + mSecunda->setPhase ( static_cast( (int) ((mDay % 32)/4.f)) ); + + // increase the strength of the sun glare effect depending + // on how directly the player is looking at the sun + if (mSunEnabled) { - SkyManager* pSkyManager = NULL; + Vector3 sun = mSunGlare->getPosition(); + sun = Vector3(sun.x, sun.z, -sun.y); + Vector3 cam = mViewport->getCamera()->getRealDirection(); + const Degree angle = sun.angleBetween( cam ); + float val = 1- (angle.valueDegrees() / 180.f); + val = (val*val*val*val)*2; - try + if (mGlareEnabled) { - pSkyManager = new CaelumManager(pRenderWindow, pCamera, resDir); + mGlareFade += duration*3; + if (mGlareFade > 1) mGlareFade = 1; } - catch (Ogre::Exception& e) + else { - std::cout << "\nOGRE Exception when attempting to add sky: " - << e.getFullDescription().c_str() << std::endl; - } - catch (std::exception& e) - { - std::cout << "\nException when attempting to add sky: " - << e.what() << std::endl; + mGlareFade -= duration*3; + if (mGlareFade < 0.3) mGlareFade = 0; } - return pSkyManager; + mSunGlare->setSize(val * (mGlareFade)); + } + + mSunGlare->setVisible(mGlareFade>0 && mSunEnabled); + mSun->setVisible(mSunEnabled); + mMasser->setVisible(mMasserEnabled); + mSecunda->setVisible(mSecundaEnabled); +} + +void SkyManager::enable() +{ + mRootNode->setVisible(true); + mEnabled = true; +} + +void SkyManager::disable() +{ + mRootNode->setVisible(false); + mEnabled = false; +} + +void SkyManager::setMoonColour (bool red) +{ + mSecunda->setColour( red ? ColourValue(1.0, 0.0784, 0.0784) + : ColourValue(1.0, 1.0, 1.0)); +} + +void SkyManager::setCloudsOpacity(float opacity) +{ + mCloudMaterial->getTechnique(0)->getPass(0)->getFragmentProgramParameters()->setNamedConstant("opacity", Real(opacity)); +} + +void SkyManager::setWeather(const MWWorld::WeatherResult& weather) +{ + if (mClouds != weather.mCloudTexture) + { + mCloudMaterial->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setTextureName("textures\\"+weather.mCloudTexture); + mClouds = weather.mCloudTexture; + } + + if (mNextClouds != weather.mNextCloudTexture) + { + mCloudMaterial->getTechnique(0)->getPass(0)->getTextureUnitState(1)->setTextureName("textures\\"+weather.mNextCloudTexture); + mNextClouds = weather.mNextCloudTexture; } -} + + if (mCloudBlendFactor != weather.mCloudBlendFactor) + { + mCloudMaterial->getTechnique(0)->getPass(0)->getFragmentProgramParameters()->setNamedConstant("transitionFactor", Real(weather.mCloudBlendFactor)); + mCloudBlendFactor = weather.mCloudBlendFactor; + } + + if (mCloudOpacity != weather.mCloudOpacity) + { + mCloudMaterial->getTechnique(0)->getPass(0)->getFragmentProgramParameters()->setNamedConstant("opacity", Real(weather.mCloudOpacity)); + mCloudOpacity = weather.mCloudOpacity; + } + + if (mCloudColour != weather.mSunColor) + { + ColourValue clr( weather.mSunColor.r*0.7 + weather.mAmbientColor.r*0.7, + weather.mSunColor.g*0.7 + weather.mAmbientColor.g*0.7, + weather.mSunColor.b*0.7 + weather.mAmbientColor.b*0.7); + + mCloudMaterial->getTechnique(0)->getPass(0)->setSelfIllumination(clr); + mCloudColour = weather.mSunColor; + } + + if (mSkyColour != weather.mSkyColor) + { + mAtmosphereMaterial->getTechnique(0)->getPass(0)->setSelfIllumination(weather.mSkyColor); + mSkyColour = weather.mSkyColor; + } + + if (mCloudSpeed != weather.mCloudSpeed) + { + mCloudMaterial->getTechnique(0)->getPass(0)->getFragmentProgramParameters()->setNamedConstant("speed", Real(weather.mCloudSpeed)); + mCloudSpeed = weather.mCloudSpeed; + } + + if (weather.mNight && mStarsOpacity != weather.mNightFade) + { + for (int i=0; i<7; ++i) + mStarsMaterials[i]->getTechnique(0)->getPass(0)->setDiffuse(0.0, 0.0, 0.0, weather.mNightFade); + mStarsOpacity = weather.mNightFade; + } + + float strength; + float timeofday_angle = std::abs(mSunGlare->getPosition().z/mSunGlare->getPosition().length()); + if (timeofday_angle <= 0.44) + strength = timeofday_angle/0.44f; + else + strength = 1.f; + + mSunGlare->setVisibility(weather.mGlareView * strength); + + mAtmosphereNight->setVisible(weather.mNight && mEnabled); +} + +void SkyManager::setGlare(bool glare) +{ + mGlareEnabled = glare; +} + +Vector3 SkyManager::getRealSunPos() +{ + return mSun->getNode()->_getDerivedPosition(); +} + +void SkyManager::sunEnable() +{ + mSunEnabled = true; +} + +void SkyManager::sunDisable() +{ + mSunEnabled = false; +} + +void SkyManager::setSunDirection(const Vector3& direction) +{ + mSun->setPosition(direction); + mSunGlare->setPosition(direction); +} + +void SkyManager::setMasserDirection(const Vector3& direction) +{ + mMasser->setPosition(direction); +} + +void SkyManager::setSecundaDirection(const Vector3& direction) +{ + mSecunda->setPosition(direction); +} + +void SkyManager::masserEnable() +{ + mMasserEnabled = true; +} + +void SkyManager::secundaEnable() +{ + mSecundaEnabled = true; +} + +void SkyManager::masserDisable() +{ + mMasserEnabled = false; +} + +void SkyManager::secundaDisable() +{ + mSecundaEnabled = false; +} + +void SkyManager::setThunder(const float factor) +{ + if (factor > 0.f) + { + mThunderOverlay->show(); + mThunderTextureUnit->setAlphaOperation(LBX_SOURCE1, LBS_MANUAL, LBS_CURRENT, factor*0.6); + } + else + mThunderOverlay->hide(); +} + +void SkyManager::setMasserFade(const float fade) +{ + mMasser->setVisibility(fade); +} + +void SkyManager::setSecundaFade(const float fade) +{ + mSecunda->setVisibility(fade); +} + +void SkyManager::setHour(double hour) +{ + mHour = hour; +} + +void SkyManager::setDate(int day, int month) +{ + mDay = day; + mMonth = month; +} diff --git a/apps/openmw/mwrender/sky.hpp b/apps/openmw/mwrender/sky.hpp index 446ed3f1c..2678165e3 100644 --- a/apps/openmw/mwrender/sky.hpp +++ b/apps/openmw/mwrender/sky.hpp @@ -1,40 +1,211 @@ #ifndef _GAME_RENDER_SKY_H #define _GAME_RENDER_SKY_H -#include +#include +#include +#include +#include +#include + +#include "sky.hpp" +#include "../mwworld/weather.hpp" namespace Ogre { class RenderWindow; + class SceneNode; class Camera; + class Viewport; + class SceneManager; + class Entity; + class BillboardSet; + class TextureUnitState; + class Overlay; } namespace MWRender { - /// - /// Interface for the sky rendering system - /// + class BillboardObject + { + public: + BillboardObject( const Ogre::String& textureName, + const float size, + const Ogre::Vector3& position, + Ogre::SceneNode* rootNode + ); + BillboardObject(); + + void setColour(const Ogre::ColourValue& pColour); + void setPosition(const Ogre::Vector3& pPosition); + void setVisible(const bool visible); + void setRenderQueue(unsigned int id); + void setSize(const float size); + Ogre::Vector3 getPosition() const; + + void setVisibility(const float visibility); + + Ogre::SceneNode* getNode(); + + protected: + virtual void init(const Ogre::String& textureName, + const float size, + const Ogre::Vector3& position, + Ogre::SceneNode* rootNode); + + Ogre::SceneNode* mNode; + Ogre::MaterialPtr mMaterial; + Ogre::BillboardSet* mBBSet; + }; + + + /* + * The moons need a seperate class because of their shader (which allows them to be partially transparent) + */ + class Moon : public BillboardObject + { + public: + Moon( const Ogre::String& textureName, + const float size, + const Ogre::Vector3& position, + Ogre::SceneNode* rootNode + ); + + enum Phase + { + Phase_New = 0, + Phase_WaxingCrescent, + Phase_WaxingHalf, + Phase_WaxingGibbous, + Phase_Full, + Phase_WaningGibbous, + Phase_WaningHalf, + Phase_WaningCrescent + }; + + enum Type + { + Type_Masser = 0, + Type_Secunda + }; + + void setPhase(const Phase& phase); + void setType(const Type& type); + + Phase getPhase() const; + unsigned int getPhaseInt() const; + + private: + Type mType; + Phase mPhase; + }; + class SkyManager { public: - static SkyManager* create (Ogre::RenderWindow* pRenderWindow, - Ogre::Camera* pCamera, - const boost::filesystem::path& resDir); - virtual ~SkyManager() {} + SkyManager(Ogre::SceneNode* pMwRoot, Ogre::Camera* pCamera); + ~SkyManager(); + + void update(float duration); + + void enable(); + + void disable(); + + void setHour (double hour); + ///< will be called even when sky is disabled. + + void setDate (int day, int month); + ///< will be called even when sky is disabled. + + int getMasserPhase() const; + ///< 0 new moon, 1 waxing or waning cresecent, 2 waxing or waning half, + /// 3 waxing or waning gibbous, 4 full moon + + int getSecundaPhase() const; + ///< 0 new moon, 1 waxing or waning cresecent, 2 waxing or waning half, + /// 3 waxing or waning gibbous, 4 full moon + + void setMoonColour (bool red); + ///< change Secunda colour to red + + void setCloudsOpacity(float opacity); + ///< change opacity of the clouds + + void setWeather(const MWWorld::WeatherResult& weather); + + void sunEnable(); + + void sunDisable(); + + void setSunDirection(const Ogre::Vector3& direction); + + void setMasserDirection(const Ogre::Vector3& direction); + + void setSecundaDirection(const Ogre::Vector3& direction); + + void setMasserFade(const float fade); + + void setSecundaFade(const float fade); + + void masserEnable(); + void masserDisable(); + + void secundaEnable(); + void secundaDisable(); + + void setThunder(const float factor); + + void setGlare(bool glare); + Ogre::Vector3 getRealSunPos(); + + private: + float mHour; + int mDay; + int mMonth; + + BillboardObject* mSun; + BillboardObject* mSunGlare; + Moon* mMasser; + Moon* mSecunda; + + Ogre::Viewport* mViewport; + Ogre::SceneNode* mRootNode; + Ogre::SceneManager* mSceneMgr; + + Ogre::SceneNode* mAtmosphereDay; + Ogre::SceneNode* mAtmosphereNight; + + Ogre::MaterialPtr mCloudMaterial; + Ogre::MaterialPtr mAtmosphereMaterial; - virtual void enable() = 0; + Ogre::MaterialPtr mStarsMaterials[7]; - virtual void disable() = 0; + Ogre::HighLevelGpuProgramPtr mCloudFragmentShader; - virtual void setHour (double hour) = 0; + // remember some settings so we don't have to apply them again if they didnt change + Ogre::String mClouds; + Ogre::String mNextClouds; + float mCloudBlendFactor; + float mCloudOpacity; + float mCloudSpeed; + float mStarsOpacity; + Ogre::ColourValue mCloudColour; + Ogre::ColourValue mSkyColour; - virtual void setDate (int day, int month) = 0; + Ogre::Overlay* mThunderOverlay; + Ogre::TextureUnitState* mThunderTextureUnit; + + float mRemainingTransitionTime; - virtual int getMasserPhase() const = 0; + float mGlareFade; - virtual int getSecundaPhase() const = 0; + void ModVertexAlpha(Ogre::Entity* ent, unsigned int meshType); - virtual void setMoonColour (bool red) = 0; + bool mEnabled; + bool mGlareEnabled; + bool mSunEnabled; + bool mMasserEnabled; + bool mSecundaEnabled; }; } diff --git a/apps/openmw/mwscript/containerextensions.cpp b/apps/openmw/mwscript/containerextensions.cpp index aef48ddec..a0aba5db9 100644 --- a/apps/openmw/mwscript/containerextensions.cpp +++ b/apps/openmw/mwscript/containerextensions.cpp @@ -11,7 +11,7 @@ #include "../mwworld/manualref.hpp" #include "../mwworld/class.hpp" -#include "../mwworld/containerutil.hpp" +#include "../mwworld/containerstore.hpp" #include "interpretercontext.hpp" #include "ref.hpp" @@ -45,8 +45,7 @@ namespace MWScript ref.getPtr().getRefData().setCount (count); - MWWorld::Class::get (ref.getPtr()).insertIntoContainer (ref.getPtr(), - MWWorld::Class::get (ptr).getContainerStore (ptr)); + MWWorld::Class::get (ptr).getContainerStore (ptr).add (ref.getPtr()); } }; @@ -59,25 +58,16 @@ namespace MWScript { MWWorld::Ptr ptr = R()(runtime); - MWScript::InterpreterContext& context - = static_cast (runtime.getContext()); - std::string item = runtime.getStringLiteral (runtime[0].mInteger); runtime.pop(); - std::vector list; - - MWWorld::listItemsInContainer (item, - MWWorld::Class::get (ptr).getContainerStore (ptr), - context.getWorld().getStore(), list); + MWWorld::ContainerStore& store = MWWorld::Class::get (ptr).getContainerStore (ptr); Interpreter::Type_Integer sum = 0; - for (std::vector::iterator iter (list.begin()); iter!=list.end(); - ++iter) - { - sum += iter->getRefData().getCount(); - } + for (MWWorld::ContainerStoreIterator iter (store.begin()); iter!=store.end(); ++iter) + if (iter->getCellRef().refID==item) + sum += iter->getRefData().getCount(); runtime.push (sum); } @@ -92,9 +82,6 @@ namespace MWScript { MWWorld::Ptr ptr = R()(runtime); - MWScript::InterpreterContext& context - = static_cast (runtime.getContext()); - std::string item = runtime.getStringLiteral (runtime[0].mInteger); runtime.pop(); @@ -104,25 +91,23 @@ namespace MWScript if (count<0) throw std::runtime_error ("second argument for RemoveItem must be non-negative"); - std::vector list; + MWWorld::ContainerStore& store = MWWorld::Class::get (ptr).getContainerStore (ptr); - MWWorld::listItemsInContainer (item, - MWWorld::Class::get (ptr).getContainerStore (ptr), - context.getWorld().getStore(), list); - - for (std::vector::iterator iter (list.begin()); - iter!=list.end() && count; + for (MWWorld::ContainerStoreIterator iter (store.begin()); iter!=store.end() && count; ++iter) { - if (iter->getRefData().getCount()<=count) - { - count -= iter->getRefData().getCount(); - iter->getRefData().setCount (0); - } - else + if (iter->getCellRef().refID==item) { - iter->getRefData().setCount (iter->getRefData().getCount()-count); - count = 0; + if (iter->getRefData().getCount()<=count) + { + count -= iter->getRefData().getCount(); + iter->getRefData().setCount (0); + } + else + { + iter->getRefData().setCount (iter->getRefData().getCount()-count); + count = 0; + } } } diff --git a/apps/openmw/mwscript/docs/vmformat.txt b/apps/openmw/mwscript/docs/vmformat.txt index 183605328..09b0c0482 100644 --- a/apps/openmw/mwscript/docs/vmformat.txt +++ b/apps/openmw/mwscript/docs/vmformat.txt @@ -115,4 +115,10 @@ op 0x2000136: GetPCCell op 0x2000137: GetButtonPressed op 0x2000138: SkipAnim op 0x2000139: SkipAnim, expplicit reference -opcodes 0x200013a-0x3ffffff unused +op 0x200013b: twf +op 0x200013c: FadeIn +op 0x200013d: FadeOut +op 0x200013e: FadeTo +op 0x200013f: GetCurrentWeather +op 0x2000140: ChangeWeather +opcodes 0x2000141-0x3ffffff unused diff --git a/apps/openmw/mwscript/miscextensions.cpp b/apps/openmw/mwscript/miscextensions.cpp index d8dfbdde4..5bfffd3a2 100644 --- a/apps/openmw/mwscript/miscextensions.cpp +++ b/apps/openmw/mwscript/miscextensions.cpp @@ -103,7 +103,75 @@ namespace MWScript context.getWorld().toggleRenderMode (MWWorld::World::Render_CollisionDebug); context.report (enabled ? - "Collsion Mesh Rendering -> On" : "Collision Mesh Rendering -> Off"); + "Collision Mesh Rendering -> On" : "Collision Mesh Rendering -> Off"); + } + }; + + class OpToggleWireframe : public Interpreter::Opcode0 + { + public: + + virtual void execute (Interpreter::Runtime& runtime) + { + InterpreterContext& context = + static_cast (runtime.getContext()); + + bool enabled = + context.getWorld().toggleRenderMode (MWWorld::World::Render_Wireframe); + + context.report (enabled ? + "Wireframe Rendering -> On" : "Wireframe Rendering -> Off"); + } + }; + + class OpFadeIn : public Interpreter::Opcode0 + { + public: + + virtual void execute (Interpreter::Runtime& runtime) + { + InterpreterContext& context = + static_cast (runtime.getContext()); + + Interpreter::Type_Float time = runtime[0].mFloat; + runtime.pop(); + + context.getWorld().getFader()->fadeIn(time); + } + }; + + class OpFadeOut : public Interpreter::Opcode0 + { + public: + + virtual void execute (Interpreter::Runtime& runtime) + { + InterpreterContext& context = + static_cast (runtime.getContext()); + + Interpreter::Type_Float time = runtime[0].mFloat; + runtime.pop(); + + context.getWorld().getFader()->fadeOut(time); + } + }; + + class OpFadeTo : public Interpreter::Opcode0 + { + public: + + virtual void execute (Interpreter::Runtime& runtime) + { + InterpreterContext& context = + static_cast (runtime.getContext()); + + Interpreter::Type_Float alpha = runtime[0].mFloat; + runtime.pop(); + + Interpreter::Type_Float time = runtime[0].mFloat; + runtime.pop(); + + context.getWorld().getFader()->fadeTo(alpha, time); } }; @@ -115,6 +183,10 @@ namespace MWScript const int opcodeUnlock = 0x200008c; const int opcodeUnlockExplicit = 0x200008d; const int opcodeToggleCollisionDebug = 0x2000132; + const int opcodeToggleWireframe = 0x200013b; + const int opcodeFadeIn = 0x200013c; + const int opcodeFadeOut = 0x200013d; + const int opcodeFadeTo = 0x200013e; void registerExtensions (Compiler::Extensions& extensions) { @@ -127,6 +199,11 @@ namespace MWScript extensions.registerInstruction ("togglecollisiongrid", "", opcodeToggleCollisionDebug); extensions.registerInstruction ("tcb", "", opcodeToggleCollisionDebug); extensions.registerInstruction ("tcg", "", opcodeToggleCollisionDebug); + extensions.registerInstruction ("twf", "", opcodeToggleWireframe); + extensions.registerInstruction ("togglewireframe", "", opcodeToggleWireframe); + extensions.registerInstruction ("fadein", "f", opcodeFadeIn); + extensions.registerInstruction ("fadeout", "f", opcodeFadeOut); + extensions.registerInstruction ("fadeto", "ff", opcodeFadeTo); } void installOpcodes (Interpreter::Interpreter& interpreter) @@ -139,6 +216,10 @@ namespace MWScript interpreter.installSegment5 (opcodeUnlock, new OpUnlock); interpreter.installSegment5 (opcodeUnlockExplicit, new OpUnlock); interpreter.installSegment5 (opcodeToggleCollisionDebug, new OpToggleCollisionDebug); + interpreter.installSegment5 (opcodeToggleWireframe, new OpToggleWireframe); + interpreter.installSegment5 (opcodeFadeIn, new OpFadeIn); + interpreter.installSegment5 (opcodeFadeOut, new OpFadeOut); + interpreter.installSegment5 (opcodeFadeTo, new OpFadeTo); } } } diff --git a/apps/openmw/mwscript/skyextensions.cpp b/apps/openmw/mwscript/skyextensions.cpp index caa07c095..a5cc9e213 100644 --- a/apps/openmw/mwscript/skyextensions.cpp +++ b/apps/openmw/mwscript/skyextensions.cpp @@ -79,12 +79,46 @@ namespace MWScript runtime.push (context.getWorld().getSecundaPhase()); } }; + + class OpGetCurrentWeather : public Interpreter::Opcode0 + { + public: + + virtual void execute (Interpreter::Runtime& runtime) + { + InterpreterContext& context = + static_cast (runtime.getContext()); + + runtime.push (context.getWorld().getCurrentWeather()); + } + }; + + class OpChangeWeather : public Interpreter::Opcode0 + { + public: + + virtual void execute (Interpreter::Runtime& runtime) + { + InterpreterContext& context = + static_cast (runtime.getContext()); + + std::string region = runtime.getStringLiteral (runtime[0].mInteger); + runtime.pop(); + + Interpreter::Type_Integer id = runtime[0].mInteger; + runtime.pop(); + + context.getWorld().changeWeather(region, id); + } + }; const int opcodeToggleSky = 0x2000021; const int opcodeTurnMoonWhite = 0x2000022; const int opcodeTurnMoonRed = 0x2000023; const int opcodeGetMasserPhase = 0x2000024; const int opcodeGetSecundaPhase = 0x2000025; + const int opcodeGetCurrentWeather = 0x200013f; + const int opcodeChangeWeather = 0x2000140; void registerExtensions (Compiler::Extensions& extensions) { @@ -92,8 +126,10 @@ namespace MWScript extensions.registerInstruction ("ts", "", opcodeToggleSky); extensions.registerInstruction ("turnmoonwhite", "", opcodeTurnMoonWhite); extensions.registerInstruction ("turnmoonred", "", opcodeTurnMoonRed); + extensions.registerInstruction ("changeweather", "Sl", opcodeChangeWeather); extensions.registerFunction ("getmasserphase", 'l', "", opcodeGetMasserPhase); extensions.registerFunction ("getsecundaphase", 'l', "", opcodeGetSecundaPhase); + extensions.registerFunction ("getcurrentweather", 'l', "", opcodeGetCurrentWeather); } void installOpcodes (Interpreter::Interpreter& interpreter) @@ -103,6 +139,8 @@ namespace MWScript interpreter.installSegment5 (opcodeTurnMoonRed, new OpTurnMoonRed); interpreter.installSegment5 (opcodeGetMasserPhase, new OpGetMasserPhase); interpreter.installSegment5 (opcodeGetSecundaPhase, new OpGetSecundaPhase); + interpreter.installSegment5 (opcodeGetCurrentWeather, new OpGetCurrentWeather); + interpreter.installSegment5 (opcodeChangeWeather, new OpChangeWeather); } } } diff --git a/apps/openmw/mwscript/statsextensions.cpp b/apps/openmw/mwscript/statsextensions.cpp index ca82830d9..0e97a39cf 100644 --- a/apps/openmw/mwscript/statsextensions.cpp +++ b/apps/openmw/mwscript/statsextensions.cpp @@ -10,6 +10,7 @@ #include "../mwworld/class.hpp" #include "../mwmechanics/creaturestats.hpp" +#include "../mwmechanics/npcstats.hpp" #include "interpretercontext.hpp" #include "ref.hpp" diff --git a/apps/openmw/mwworld/actiontake.cpp b/apps/openmw/mwworld/actiontake.cpp index b318f0796..bbe954049 100644 --- a/apps/openmw/mwworld/actiontake.cpp +++ b/apps/openmw/mwworld/actiontake.cpp @@ -4,6 +4,7 @@ #include "class.hpp" #include "environment.hpp" #include "world.hpp" +#include "containerstore.hpp" namespace MWWorld { @@ -14,8 +15,7 @@ namespace MWWorld // insert into player's inventory MWWorld::Ptr player = environment.mWorld->getPtr ("player", true); - MWWorld::Class::get (mObject).insertIntoContainer (mObject, - MWWorld::Class::get (player).getContainerStore (player)); + MWWorld::Class::get (player).getContainerStore (player).add (mObject); // remove from world environment.mWorld->deleteObject (mObject); diff --git a/apps/openmw/mwworld/class.cpp b/apps/openmw/mwworld/class.cpp index b4f93576a..641da73e1 100644 --- a/apps/openmw/mwworld/class.cpp +++ b/apps/openmw/mwworld/class.cpp @@ -7,6 +7,7 @@ #include "ptr.hpp" #include "nullaction.hpp" +#include "containerstore.hpp" namespace MWWorld { @@ -71,16 +72,11 @@ namespace MWWorld return boost::shared_ptr (new NullAction); } - ContainerStore& Class::getContainerStore (const Ptr& ptr) const + ContainerStore& Class::getContainerStore (const Ptr& ptr) const { throw std::runtime_error ("class does not have a container store"); } - void Class::insertIntoContainer (const Ptr& ptr, ContainerStore& containerStore) const - { - throw std::runtime_error ("class does not support inserting into a container"); - } - void Class::lock (const Ptr& ptr, int lockLevel) const { throw std::runtime_error ("class does not support locking"); diff --git a/apps/openmw/mwworld/class.hpp b/apps/openmw/mwworld/class.hpp index 706b11aaa..9b6acb3ce 100644 --- a/apps/openmw/mwworld/class.hpp +++ b/apps/openmw/mwworld/class.hpp @@ -7,11 +7,11 @@ #include #include "action.hpp" -#include "containerstore.hpp" #include "refdata.hpp" -#include "../mwrender/renderinginterface.hpp" #include "physicssystem.hpp" +#include "../mwrender/renderinginterface.hpp" + namespace Ogre { class Vector3; @@ -33,6 +33,7 @@ namespace MWWorld { class Ptr; class Environment; + class ContainerStore; /// \brief Base class for referenceable esm records class Class @@ -61,8 +62,6 @@ namespace MWWorld ///< Return ID of \a ptr or throw an exception, if class does not support ID retrieval /// (default implementation: throw an exception) - - virtual void insertObjectRendering (const Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const; virtual void insertObject(const Ptr& ptr, MWWorld::PhysicsSystem& physics, MWWorld::Environment& environment) const; ///< Add reference into a cell for rendering (default implementation: don't render anything). @@ -105,15 +104,10 @@ namespace MWWorld ///< Generate action for using via inventory menu (default implementation: return a /// null action). - virtual ContainerStore& getContainerStore (const Ptr& ptr) const; + virtual ContainerStore& getContainerStore (const Ptr& ptr) const; ///< Return container store or throw an exception, if class does not have a /// container store (default implementation: throw an exceoption) - virtual void insertIntoContainer (const Ptr& ptr, ContainerStore& containerStore) - const; - ///< Insert into a container or throw an exception, if class does not support inserting into - /// a container. - virtual void lock (const Ptr& ptr, int lockLevel) const; ///< Lock object (default implementation: throw an exception) diff --git a/apps/openmw/mwworld/containerstore.cpp b/apps/openmw/mwworld/containerstore.cpp new file mode 100644 index 000000000..54908deec --- /dev/null +++ b/apps/openmw/mwworld/containerstore.cpp @@ -0,0 +1,342 @@ + +#include "containerstore.hpp" + +#include +#include +#include + +MWWorld::ContainerStoreIterator MWWorld::ContainerStore::begin (int mask) +{ + return ContainerStoreIterator (mask, this); +} + +MWWorld::ContainerStoreIterator MWWorld::ContainerStore::end() +{ + return ContainerStoreIterator (this); +} + +void MWWorld::ContainerStore::add (const Ptr& ptr) +{ + /// \todo implement item stocking + + switch (getType (ptr)) + { + case Type_Potion: potions.list.push_back (*ptr.get()); break; + case Type_Apparatus: appas.list.push_back (*ptr.get()); break; + case Type_Armor: armors.list.push_back (*ptr.get()); break; + case Type_Book: books.list.push_back (*ptr.get()); break; + case Type_Clothing: clothes.list.push_back (*ptr.get()); break; + case Type_Ingredient: ingreds.list.push_back (*ptr.get()); break; + case Type_Light: lights.list.push_back (*ptr.get()); break; + case Type_Lockpick: lockpicks.list.push_back (*ptr.get()); break; + case Type_Miscellaneous: miscItems.list.push_back (*ptr.get()); break; + case Type_Probe: probes.list.push_back (*ptr.get()); break; + case Type_Repair: repairs.list.push_back (*ptr.get()); break; + case Type_Weapon: weapons.list.push_back (*ptr.get()); break; + } +} + +int MWWorld::ContainerStore::getType (const Ptr& ptr) +{ + if (ptr.isEmpty()) + throw std::runtime_error ("can't put a non-existent object into a container"); + + if (ptr.getTypeName()==typeid (ESM::Potion).name()) + return Type_Potion; + + if (ptr.getTypeName()==typeid (ESM::Apparatus).name()) + return Type_Apparatus; + + if (ptr.getTypeName()==typeid (ESM::Armor).name()) + return Type_Armor; + + if (ptr.getTypeName()==typeid (ESM::Book).name()) + return Type_Book; + + if (ptr.getTypeName()==typeid (ESM::Clothing).name()) + return Type_Clothing; + + if (ptr.getTypeName()==typeid (ESM::Ingredient).name()) + return Type_Ingredient; + + if (ptr.getTypeName()==typeid (ESM::Light).name()) + return Type_Light; + + if (ptr.getTypeName()==typeid (ESM::Tool).name()) + return Type_Lockpick; + + if (ptr.getTypeName()==typeid (ESM::Miscellaneous).name()) + return Type_Miscellaneous; + + if (ptr.getTypeName()==typeid (ESM::Probe).name()) + return Type_Probe; + + if (ptr.getTypeName()==typeid (ESM::Repair).name()) + return Type_Repair; + + if (ptr.getTypeName()==typeid (ESM::Weapon).name()) + return Type_Weapon; + + throw std::runtime_error ( + "Object of type " + ptr.getTypeName() + " can not be placed into a container"); +} + + +MWWorld::ContainerStoreIterator::ContainerStoreIterator (ContainerStore *container) +: mType (-1), mMask (0), mContainer (container) +{} + +MWWorld::ContainerStoreIterator::ContainerStoreIterator (int mask, ContainerStore *container) +: mType (0), mMask (mask), mContainer (container) +{ + nextType(); +} + +void MWWorld::ContainerStoreIterator::incType() +{ + if (mType==0) + mType = 1; + else if (mType!=-1) + { + mType <<= 1; + + if (mType>ContainerStore::Type_Last) + mType = -1; + } +} + +void MWWorld::ContainerStoreIterator::nextType() +{ + while (mType!=-1) + { + incType(); + + if (mType & mMask) + if (resetIterator()) + break; + } +} + +bool MWWorld::ContainerStoreIterator::resetIterator() +{ + switch (mType) + { + case ContainerStore::Type_Potion: + + mPotion = mContainer->potions.list.begin(); + return mPotion!=mContainer->potions.list.end(); + + case ContainerStore::Type_Apparatus: + + mApparatus = mContainer->appas.list.begin(); + return mApparatus!=mContainer->appas.list.end(); + + case ContainerStore::Type_Armor: + + mArmor = mContainer->armors.list.begin(); + return mArmor!=mContainer->armors.list.end(); + + case ContainerStore::Type_Book: + + mBook = mContainer->books.list.begin(); + return mBook!=mContainer->books.list.end(); + + case ContainerStore::Type_Clothing: + + mClothing = mContainer->clothes.list.begin(); + return mClothing!=mContainer->clothes.list.end(); + + case ContainerStore::Type_Ingredient: + + mIngredient = mContainer->ingreds.list.begin(); + return mIngredient!=mContainer->ingreds.list.end(); + + case ContainerStore::Type_Light: + + mLight = mContainer->lights.list.begin(); + return mLight!=mContainer->lights.list.end(); + + case ContainerStore::Type_Lockpick: + + mLockpick = mContainer->lockpicks.list.begin(); + return mLockpick!=mContainer->lockpicks.list.end(); + + case ContainerStore::Type_Miscellaneous: + + mMiscellaneous = mContainer->miscItems.list.begin(); + return mMiscellaneous!=mContainer->miscItems.list.end(); + + case ContainerStore::Type_Probe: + + mProbe = mContainer->probes.list.begin(); + return mProbe!=mContainer->probes.list.end(); + + case ContainerStore::Type_Repair: + + mRepair = mContainer->repairs.list.begin(); + return mRepair!=mContainer->repairs.list.end(); + + case ContainerStore::Type_Weapon: + + mWeapon = mContainer->weapons.list.begin(); + return mWeapon!=mContainer->weapons.list.end(); + } + + return false; +} + +bool MWWorld::ContainerStoreIterator::incIterator() +{ + switch (mType) + { + case ContainerStore::Type_Potion: + + ++mPotion; + return mPotion==mContainer->potions.list.end(); + + case ContainerStore::Type_Apparatus: + + ++mApparatus; + return mApparatus==mContainer->appas.list.end(); + + case ContainerStore::Type_Armor: + + ++mArmor; + return mArmor==mContainer->armors.list.end(); + + case ContainerStore::Type_Book: + + ++mBook; + return mBook==mContainer->books.list.end(); + + case ContainerStore::Type_Clothing: + + ++mClothing; + return mClothing==mContainer->clothes.list.end(); + + case ContainerStore::Type_Ingredient: + + ++mIngredient; + return mIngredient==mContainer->ingreds.list.end(); + + case ContainerStore::Type_Light: + + ++mLight; + return mLight==mContainer->lights.list.end(); + + case ContainerStore::Type_Lockpick: + + ++mLockpick; + return mLockpick==mContainer->lockpicks.list.end(); + + case ContainerStore::Type_Miscellaneous: + + ++mMiscellaneous; + return mMiscellaneous==mContainer->miscItems.list.end(); + + case ContainerStore::Type_Probe: + + ++mProbe; + return mProbe==mContainer->probes.list.end(); + + case ContainerStore::Type_Repair: + + ++mRepair; + return mRepair==mContainer->repairs.list.end(); + + case ContainerStore::Type_Weapon: + + ++mWeapon; + return mWeapon==mContainer->weapons.list.end(); + } + + return true; +} + +MWWorld::Ptr *MWWorld::ContainerStoreIterator::operator->() const +{ + mPtr = **this; + return &mPtr; +} + +MWWorld::Ptr MWWorld::ContainerStoreIterator::operator*() const +{ + switch (mType) + { + case ContainerStore::Type_Potion: return MWWorld::Ptr (&*mPotion, 0); + case ContainerStore::Type_Apparatus: return MWWorld::Ptr (&*mApparatus, 0); + case ContainerStore::Type_Armor: return MWWorld::Ptr (&*mArmor, 0); + case ContainerStore::Type_Book: return MWWorld::Ptr (&*mBook, 0); + case ContainerStore::Type_Clothing: return MWWorld::Ptr (&*mClothing, 0); + case ContainerStore::Type_Ingredient: return MWWorld::Ptr (&*mIngredient, 0); + case ContainerStore::Type_Light: return MWWorld::Ptr (&*mLight, 0); + case ContainerStore::Type_Lockpick: return MWWorld::Ptr (&*mLockpick, 0); + case ContainerStore::Type_Miscellaneous: return MWWorld::Ptr (&*mMiscellaneous, 0); + case ContainerStore::Type_Probe: return MWWorld::Ptr (&*mProbe, 0); + case ContainerStore::Type_Repair: return MWWorld::Ptr (&*mRepair, 0); + case ContainerStore::Type_Weapon: return MWWorld::Ptr (&*mWeapon, 0); + } + + throw std::runtime_error ("invalid pointer"); +} + +MWWorld::ContainerStoreIterator& MWWorld::ContainerStoreIterator::operator++() +{ + do + { + if (incIterator()) + nextType(); + } + while (mType!=-1 && !(**this).getRefData().getCount()); + + return *this; +} + +MWWorld::ContainerStoreIterator MWWorld::ContainerStoreIterator::operator++ (int) +{ + ContainerStoreIterator iter (*this); + ++*this; + return iter; +} + +bool MWWorld::ContainerStoreIterator::isEqual (const ContainerStoreIterator& iter) const +{ + assert (mContainer==iter.mContainer); + + if (mType!=iter.mType) + return false; + + switch (mType) + { + case ContainerStore::Type_Potion: return mPotion==iter.mPotion; + case ContainerStore::Type_Apparatus: return mApparatus==iter.mApparatus; + case ContainerStore::Type_Armor: return mArmor==iter.mArmor; + case ContainerStore::Type_Book: return mBook==iter.mBook; + case ContainerStore::Type_Clothing: return mClothing==iter.mClothing; + case ContainerStore::Type_Ingredient: return mIngredient==iter.mIngredient; + case ContainerStore::Type_Light: return mLight==iter.mLight; + case ContainerStore::Type_Lockpick: return mLockpick==iter.mLockpick; + case ContainerStore::Type_Miscellaneous: return mMiscellaneous==iter.mMiscellaneous; + case ContainerStore::Type_Probe: return mProbe==iter.mProbe; + case ContainerStore::Type_Repair: return mRepair==iter.mRepair; + case ContainerStore::Type_Weapon: return mWeapon==iter.mWeapon; + case -1: return true; + } + + return false; +} + +int MWWorld::ContainerStoreIterator::getType() const +{ + return mType; +} + +bool MWWorld::operator== (const ContainerStoreIterator& left, const ContainerStoreIterator& right) +{ + return left.isEqual (right); +} + +bool MWWorld::operator!= (const ContainerStoreIterator& left, const ContainerStoreIterator& right) +{ + return !(left==right); +} diff --git a/apps/openmw/mwworld/containerstore.hpp b/apps/openmw/mwworld/containerstore.hpp index 971a79c15..7263245f3 100644 --- a/apps/openmw/mwworld/containerstore.hpp +++ b/apps/openmw/mwworld/containerstore.hpp @@ -3,24 +3,134 @@ #include +#include "refdata.hpp" +#include "ptr.hpp" + namespace MWWorld { - template - struct ContainerStore + class ContainerStoreIterator; + + class ContainerStore { - ESMS::CellRefList potions; - ESMS::CellRefList appas; - ESMS::CellRefList armors; - ESMS::CellRefList books; - ESMS::CellRefList clothes; - ESMS::CellRefList ingreds; - ESMS::CellRefList lights; - ESMS::CellRefList lockpicks; - ESMS::CellRefList miscItems; - ESMS::CellRefList probes; - ESMS::CellRefList repairs; - ESMS::CellRefList weapons; + public: + + static const int Type_Potion = 0x0001; + static const int Type_Apparatus = 0x0002; + static const int Type_Armor = 0x0004; + static const int Type_Book = 0x0008; + static const int Type_Clothing = 0x0010; + static const int Type_Ingredient = 0x0020; + static const int Type_Light = 0x0040; + static const int Type_Lockpick = 0x0080; + static const int Type_Miscellaneous = 0x0100; + static const int Type_Probe = 0x0200; + static const int Type_Repair = 0x0400; + static const int Type_Weapon = 0x0800; + + static const int Type_Last = Type_Weapon; + + static const int Type_All = 0xffff; + + private: + + ESMS::CellRefList potions; + ESMS::CellRefList appas; + ESMS::CellRefList armors; + ESMS::CellRefList books; + ESMS::CellRefList clothes; + ESMS::CellRefList ingreds; + ESMS::CellRefList lights; + ESMS::CellRefList lockpicks; + ESMS::CellRefList miscItems; + ESMS::CellRefList probes; + ESMS::CellRefList repairs; + ESMS::CellRefList weapons; + + public: + + ContainerStoreIterator begin (int mask = Type_All); + + ContainerStoreIterator end(); + + void add (const Ptr& ptr); + ///< Add the item pointed to by \a ptr to this container. + /// + /// \note The item pointed to is not required to exist beyond this function call. + /// + /// \attention Do not add items to an existing stack by increasing the count instead of + /// calling this function! + + static int getType (const Ptr& ptr); + ///< This function throws an exception, if ptr does not point to an object, that can be + /// put into a container. + + friend class ContainerStoreIterator; }; + + /// \brief Iteration over a subset of objects in a ContainerStore + /// + /// \note The iterator will automatically skip over deleted objects. + class ContainerStoreIterator + { + int mType; + int mMask; + ContainerStore *mContainer; + mutable Ptr mPtr; + + ESMS::CellRefList::List::iterator mPotion; + ESMS::CellRefList::List::iterator mApparatus; + ESMS::CellRefList::List::iterator mArmor; + ESMS::CellRefList::List::iterator mBook; + ESMS::CellRefList::List::iterator mClothing; + ESMS::CellRefList::List::iterator mIngredient; + ESMS::CellRefList::List::iterator mLight; + ESMS::CellRefList::List::iterator mLockpick; + ESMS::CellRefList::List::iterator mMiscellaneous; + ESMS::CellRefList::List::iterator mProbe; + ESMS::CellRefList::List::iterator mRepair; + ESMS::CellRefList::List::iterator mWeapon; + + private: + + ContainerStoreIterator (ContainerStore *container); + ///< End-iterator + + ContainerStoreIterator (int mask, ContainerStore *container); + ///< Begin-iterator + + void incType(); + + void nextType(); + + bool resetIterator(); + ///< Reset iterator for selected type. + /// + /// \return Type not empty? + + bool incIterator(); + ///< Increment iterator for selected type. + /// + /// \return reached the end? + + public: + + Ptr *operator->() const; + + Ptr operator*() const; + + ContainerStoreIterator& operator++(); + + ContainerStoreIterator operator++ (int); + + bool isEqual (const ContainerStoreIterator& iter) const; + + int getType() const; + + friend class ContainerStore; + }; + + bool operator== (const ContainerStoreIterator& left, const ContainerStoreIterator& right); + bool operator!= (const ContainerStoreIterator& left, const ContainerStoreIterator& right); } #endif diff --git a/apps/openmw/mwworld/containerutil.cpp b/apps/openmw/mwworld/containerutil.cpp deleted file mode 100644 index 7c7e5e5e8..000000000 --- a/apps/openmw/mwworld/containerutil.cpp +++ /dev/null @@ -1,43 +0,0 @@ - -#include "containerutil.hpp" - -namespace -{ - template - void listItemsInContainerImp (const std::string& id, - ESMS::CellRefList& containerStore, - const ESMS::RecListT& store, std::vector& list) - { - if (const T *record = store.search (id)) - { - for (typename ESMS::CellRefList::List::iterator iter - (containerStore.list.begin()); - iter!=containerStore.list.end(); ++iter) - { - if (iter->base==record) - list.push_back (MWWorld::Ptr (&*iter, 0)); - } - } - } -} - -namespace MWWorld -{ - void listItemsInContainer (const std::string& id, - ContainerStore& containerStore, - const ESMS::ESMStore& store, std::vector& list) - { - listItemsInContainerImp (id, containerStore.potions, store.potions, list); - listItemsInContainerImp (id, containerStore.appas, store.appas, list); - listItemsInContainerImp (id, containerStore.armors, store.armors, list); - listItemsInContainerImp (id, containerStore.books, store.books, list); - listItemsInContainerImp (id, containerStore.clothes, store.clothes, list); - listItemsInContainerImp (id, containerStore.ingreds, store.ingreds, list); - listItemsInContainerImp (id, containerStore.lights, store.lights, list); - listItemsInContainerImp (id, containerStore.lockpicks, store.lockpicks, list); - listItemsInContainerImp (id, containerStore.miscItems, store.miscItems, list); - listItemsInContainerImp (id, containerStore.probes, store.probes, list); - listItemsInContainerImp (id, containerStore.repairs, store.repairs, list); - listItemsInContainerImp (id, containerStore.weapons, store.weapons, list); - } -} diff --git a/apps/openmw/mwworld/containerutil.hpp b/apps/openmw/mwworld/containerutil.hpp deleted file mode 100644 index 21e770404..000000000 --- a/apps/openmw/mwworld/containerutil.hpp +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef GAME_MWWORLD_CONTAINERUTIL_H -#define GAME_MWWORLD_CONTAINERUTIL_H - -#include -#include - -#include - -#include "containerstore.hpp" -#include "ptr.hpp" -#include "refdata.hpp" - -namespace MWWorld -{ - void listItemsInContainer (const std::string& id, ContainerStore& containerStore, - const ESMS::ESMStore& store, std::vector& list); - ///< append all references with the given id to list. -} - -#endif diff --git a/apps/openmw/mwworld/customdata.hpp b/apps/openmw/mwworld/customdata.hpp new file mode 100644 index 000000000..588991fe4 --- /dev/null +++ b/apps/openmw/mwworld/customdata.hpp @@ -0,0 +1,17 @@ +#ifndef GAME_MWWORLD_CUSTOMDATA_H +#define GAME_MWWORLD_CUSTOMDATA_H + +namespace MWWorld +{ + /// \brief Base class for the MW-class-specific part of RefData + class CustomData + { + public: + + virtual ~CustomData() {} + + virtual CustomData *clone() const = 0; + }; +} + +#endif diff --git a/apps/openmw/mwworld/manualref.hpp b/apps/openmw/mwworld/manualref.hpp index b4d3f7007..f8bc7d983 100644 --- a/apps/openmw/mwworld/manualref.hpp +++ b/apps/openmw/mwworld/manualref.hpp @@ -82,6 +82,7 @@ namespace MWWorld // initialise ESM::CellRef& cellRef = mPtr.getCellRef(); + cellRef.refID = name; cellRef.refnum = -1; cellRef.scale = 1; cellRef.factIndex = 0; diff --git a/apps/openmw/mwworld/physicssystem.cpp b/apps/openmw/mwworld/physicssystem.cpp index e74e201f5..b0da4524e 100644 --- a/apps/openmw/mwworld/physicssystem.cpp +++ b/apps/openmw/mwworld/physicssystem.cpp @@ -3,6 +3,7 @@ #include "physicssystem.hpp" #include "../mwworld/ptr.hpp" #include "../mwworld/world.hpp" // FIXME +#include #include "OgreRoot.h" #include "OgreRenderWindow.h" @@ -16,16 +17,24 @@ using namespace Ogre; namespace MWWorld { - PhysicsSystem::PhysicsSystem(OEngine::Render::OgreRenderer &_rend , OEngine::Physic::PhysicEngine* physEng) : - mRender(_rend), mEngine(physEng), mFreeFly (true) + PhysicsSystem::PhysicsSystem(OEngine::Render::OgreRenderer &_rend) : + mRender(_rend), mEngine(0), mFreeFly (true) { - + // Create physics. shapeLoader is deleted by the physic engine + NifBullet::ManualBulletShapeLoader* shapeLoader = new NifBullet::ManualBulletShapeLoader(); + mEngine = new OEngine::Physic::PhysicEngine(shapeLoader); } PhysicsSystem::~PhysicsSystem() { - + delete mEngine; + + } + OEngine::Physic::PhysicEngine* PhysicsSystem::getEngine() + { + return mEngine; } + std::pair PhysicsSystem::getFacedHandle (MWWorld::World& world) { std::string handle = ""; @@ -41,6 +50,17 @@ namespace MWWorld return mEngine->rayTest(from,to); } + + bool PhysicsSystem::castRay(const Vector3& from, const Vector3& to) + { + btVector3 _from, _to; + _from = btVector3(from.x, from.y, from.z); + _to = btVector3(to.x, to.y, to.z); + + std::pair result = mEngine->rayTest(_from, _to); + + return !(result.first == ""); + } std::vector< std::pair > PhysicsSystem::doPhysics (float duration, diff --git a/apps/openmw/mwworld/physicssystem.hpp b/apps/openmw/mwworld/physicssystem.hpp index a447d7bc1..78cbde083 100644 --- a/apps/openmw/mwworld/physicssystem.hpp +++ b/apps/openmw/mwworld/physicssystem.hpp @@ -12,7 +12,7 @@ namespace MWWorld class PhysicsSystem { public: - PhysicsSystem (OEngine::Render::OgreRenderer &_rend , OEngine::Physic::PhysicEngine* physEng); + PhysicsSystem (OEngine::Render::OgreRenderer &_rend); ~PhysicsSystem (); std::vector< std::pair > doPhysics (float duration, @@ -33,11 +33,17 @@ namespace MWWorld void scaleObject (const std::string& handle, float scale); bool toggleCollisionMode(); - std::pair getFacedHandle (MWWorld::World& world); + + std::pair getFacedHandle (MWWorld::World& world); + + // cast ray, return true if it hit something + bool castRay(const Ogre::Vector3& from, const Ogre::Vector3& to); void insertObjectPhysics(const MWWorld::Ptr& ptr, std::string model); - void insertActorPhysics(const MWWorld::Ptr&, std::string model); + void insertActorPhysics(const MWWorld::Ptr&, std::string model); + + OEngine::Physic::PhysicEngine* getEngine(); private: OEngine::Render::OgreRenderer &mRender; diff --git a/apps/openmw/mwworld/player.cpp b/apps/openmw/mwworld/player.cpp index 4eb41ebf5..5bfb82138 100644 --- a/apps/openmw/mwworld/player.cpp +++ b/apps/openmw/mwworld/player.cpp @@ -3,6 +3,8 @@ #include "../mwrender/player.hpp" +#include "../mwmechanics/movement.hpp" + #include "world.hpp" #include "class.hpp" diff --git a/apps/openmw/mwworld/ptr.hpp b/apps/openmw/mwworld/ptr.hpp index 8bf75aa3c..389c9349d 100644 --- a/apps/openmw/mwworld/ptr.hpp +++ b/apps/openmw/mwworld/ptr.hpp @@ -5,6 +5,8 @@ #include +#include + #include #include "refdata.hpp" diff --git a/apps/openmw/mwworld/refdata.cpp b/apps/openmw/mwworld/refdata.cpp new file mode 100644 index 000000000..528f49c33 --- /dev/null +++ b/apps/openmw/mwworld/refdata.cpp @@ -0,0 +1,144 @@ + +#include "refdata.hpp" + +#include + +#include "customdata.hpp" + +namespace MWWorld +{ + void RefData::copy (const RefData& refData) + { + mBaseNode = refData.mBaseNode; + mLocals = refData.mLocals; + mHasLocals = refData.mHasLocals; + mEnabled = refData.mEnabled; + mCount = refData.mCount; + mPosition = refData.mPosition; + + mCustomData = refData.mCustomData ? refData.mCustomData->clone() : 0; + } + + void RefData::cleanup() + { + mBaseNode = 0; + + delete mCustomData; + mCustomData = 0; + } + + RefData::RefData (const ESM::CellRef& cellRef) + : mBaseNode(0), mHasLocals (false), mEnabled (true), mCount (1), mPosition (cellRef.pos), + mCustomData (0) + {} + + RefData::RefData (const RefData& refData) + : mBaseNode(0), mCustomData (0) + { + try + { + copy (refData); + } + catch (...) + { + cleanup(); + throw; + } + } + + RefData& RefData::operator= (const RefData& refData) + { + try + { + cleanup(); + copy (refData); + } + catch (...) + { + cleanup(); + throw; + } + + return *this; + } + + RefData::~RefData() + { + try + { + cleanup(); + } + catch (...) + {} + } + + std::string RefData::getHandle() + { + return mBaseNode->getName(); + } + + Ogre::SceneNode* RefData::getBaseNode() + { + return mBaseNode; + } + + void RefData::setBaseNode(Ogre::SceneNode* base) + { + mBaseNode = base; + } + + int RefData::getCount() const + { + return mCount; + } + + void RefData::setLocals (const ESM::Script& script) + { + if (!mHasLocals) + { + mLocals.configure (script); + mHasLocals = true; + } + } + + void RefData::setCount (int count) + { + mCount = count; + } + + MWScript::Locals& RefData::getLocals() + { + return mLocals; + } + + bool RefData::isEnabled() const + { + return mEnabled; + } + + void RefData::enable() + { + mEnabled = true; + } + + void RefData::disable() + { + mEnabled = true; + } + + ESM::Position& RefData::getPosition() + { + return mPosition; + } + + void RefData::setCustomData (CustomData *data) + { + delete mCustomData; + mCustomData = data; + } + + CustomData *RefData::getCustomData() + { + return mCustomData; + } +} diff --git a/apps/openmw/mwworld/refdata.hpp b/apps/openmw/mwworld/refdata.hpp index 9a91a27b5..30d676f13 100644 --- a/apps/openmw/mwworld/refdata.hpp +++ b/apps/openmw/mwworld/refdata.hpp @@ -3,24 +3,22 @@ #include -#include - -#include "../mwscript/locals.hpp" +#include -#include "../mwmechanics/creaturestats.hpp" -#include "../mwmechanics/npcstats.hpp" -#include "../mwmechanics/movement.hpp" +#include -#include "containerstore.hpp" -#include +#include "../mwscript/locals.hpp" namespace ESM { class Script; + class CellRef; } namespace MWWorld { + class CustomData; + class RefData { Ogre::SceneNode* mBaseNode; @@ -33,102 +31,58 @@ namespace MWWorld bool mEnabled; int mCount; // 0: deleted - // we are using shared pointer here to avoid having to create custom copy-constructor, - // assignment operator and destructor. As a consequence though copying a RefData object - // manually will probably give unexcepted results. This is not a problem since RefData - // are never copied outside of container operations. - boost::shared_ptr mCreatureStats; - boost::shared_ptr mNpcStats; - boost::shared_ptr mMovement; + ESM::Position mPosition; - boost::shared_ptr > mContainerStore; + CustomData *mCustomData; - ESM::Position mPosition; + void copy (const RefData& refData); + void cleanup(); public: - /// @param cr Used to copy constant data such as position into this class where it can - /// be altered without effecting the original data. This makes it possible - /// to reset the position as the orignal data is still held in the CellRef - RefData(const ESMS::CellRef& cr) : mBaseNode(0), mHasLocals (false), mEnabled (true), - mCount (1), mPosition(cr.pos) {} - - - std::string getHandle() - { - return mBaseNode->getName(); - } - Ogre::SceneNode* getBaseNode(){ - return mBaseNode; - } - void setBaseNode(Ogre::SceneNode* base){ - mBaseNode = base; - } - - int getCount() const - { - return mCount; - } - - void setLocals (const ESM::Script& script) - { - if (!mHasLocals) - { - mLocals.configure (script); - mHasLocals = true; - } - } - - - void setCount (int count) - { - mCount = count; - } - - MWScript::Locals& getLocals() - { - return mLocals; - } - - bool isEnabled() const - { - return mEnabled; - } - - void enable() - { - mEnabled = true; - } - - void disable() - { - mEnabled = true; - } - - boost::shared_ptr& getCreatureStats() - { - return mCreatureStats; - } - - boost::shared_ptr& getNpcStats() - { - return mNpcStats; - } - - boost::shared_ptr& getMovement() - { - return mMovement; - } - - boost::shared_ptr >& getContainerStore() - { - return mContainerStore; - } - - ESM::Position& getPosition() - { - return mPosition; - } + + /// @param cellRef Used to copy constant data such as position into this class where it can + /// be altered without effecting the original data. This makes it possible + /// to reset the position as the orignal data is still held in the CellRef + RefData (const ESM::CellRef& cellRef); + + RefData (const RefData& refData); + + ~RefData(); + + RefData& operator= (const RefData& refData); + + /// Return OGRE handle (may be empty). + std::string getHandle(); + + /// Return OGRE base node (can be a null pointer). + Ogre::SceneNode* getBaseNode(); + + /// Set OGRE base node (can be a null pointer). + void setBaseNode (Ogre::SceneNode* base); + + int getCount() const; + + void setLocals (const ESM::Script& script); + + void setCount (int count); + + MWScript::Locals& getLocals(); + + bool isEnabled() const; + + void enable(); + + void disable(); + + ESM::Position& getPosition(); + + void setCustomData (CustomData *data); + ///< Set custom data (potentially replacing old custom data). The ownership of \æ data is + /// transferred to this. + + CustomData *getCustomData(); + ///< May return a 0-pointer. The ownership of the return data object is not transferred. }; } diff --git a/apps/openmw/mwworld/scene.cpp b/apps/openmw/mwworld/scene.cpp index c332ebbc5..47d5f1a2d 100644 --- a/apps/openmw/mwworld/scene.cpp +++ b/apps/openmw/mwworld/scene.cpp @@ -235,6 +235,9 @@ namespace MWWorld // adjust player mCurrentCell = cell; playerCellChange (cell, position); + + // adjust fog + mRendering.configureFog(*cell); // Sky system mWorld->adjustSky(); diff --git a/apps/openmw/mwworld/weather.cpp b/apps/openmw/mwworld/weather.cpp new file mode 100644 index 000000000..7cb9f3dfc --- /dev/null +++ b/apps/openmw/mwworld/weather.cpp @@ -0,0 +1,803 @@ +#include "weather.hpp" +#include "world.hpp" +#include "player.hpp" + +#include "../mwrender/renderingmanager.hpp" +#include "../mwsound/soundmanager.hpp" + +#include +#include +#include + +#include + +using namespace Ogre; +using namespace MWWorld; +using namespace MWSound; + +#define lerp(x, y) (x * (1-factor) + y * factor) + +const std::string WeatherGlobals::mThunderSoundID0 = "Thunder0"; +const std::string WeatherGlobals::mThunderSoundID1 = "Thunder1"; +const std::string WeatherGlobals::mThunderSoundID2 = "Thunder2"; +const std::string WeatherGlobals::mThunderSoundID3 = "Thunder3"; + +WeatherManager::WeatherManager(MWRender::RenderingManager* rendering, Environment* env) : + mHour(14), mCurrentWeather("clear"), mFirstUpdate(true), mWeatherUpdateTime(0), + mThunderFlash(0), mThunderChance(0), mThunderChanceNeeded(50), mThunderSoundDelay(0) +{ + mRendering = rendering; + mEnvironment = env; + + #define clr(r,g,b) ColourValue(r/255.f, g/255.f, b/255.f) + + /// \todo read these from Morrowind.ini + Weather clear; + clear.mCloudTexture = "tx_sky_clear.dds"; + clear.mCloudsMaximumPercent = 1.0; + clear.mTransitionDelta = 0.015; + clear.mSkySunriseColor = clr(118, 141, 164); + clear.mSkyDayColor = clr(95, 135, 203); + clear.mSkySunsetColor = clr(56, 89, 129); + clear.mSkyNightColor = clr(9, 10, 11); + clear.mFogSunriseColor = clr(255, 189, 157); + clear.mFogDayColor = clr(206, 227, 255); + clear.mFogSunsetColor = clr(255, 189, 157); + clear.mFogNightColor = clr(9, 10, 11); + clear.mAmbientSunriseColor = clr(47, 66, 96); + clear.mAmbientDayColor = clr(137, 140, 160); + clear.mAmbientSunsetColor = clr(68, 75, 96); + clear.mAmbientNightColor = clr(32, 35, 42); + clear.mSunSunriseColor = clr(242, 159, 99); + clear.mSunDayColor = clr(255, 252, 238); + clear.mSunSunsetColor = clr(255, 115, 79); + clear.mSunNightColor = clr(59, 97, 176); + clear.mSunDiscSunsetColor = clr(255, 189, 157); + clear.mLandFogDayDepth = 0.69; + clear.mLandFogNightDepth = 0.69; + clear.mWindSpeed = 0.1; + clear.mCloudSpeed = 1.25; + clear.mGlareView = 1.0; + mWeatherSettings["clear"] = clear; + + Weather cloudy; + cloudy.mCloudTexture = "tx_sky_cloudy.dds"; + cloudy.mCloudsMaximumPercent = 1.0; + cloudy.mTransitionDelta = 0.015; + cloudy.mSkySunriseColor = clr(126, 158, 173); + cloudy.mSkyDayColor = clr(117, 160, 215); + cloudy.mSkySunsetColor = clr(111, 114, 159); + cloudy.mSkyNightColor = clr(9, 10, 11); + cloudy.mFogSunriseColor = clr(255, 207, 149); + cloudy.mFogDayColor = clr(245, 235, 224); + cloudy.mFogSunsetColor = clr(255, 155, 106); + cloudy.mFogNightColor = clr(9, 10, 11); + cloudy.mAmbientSunriseColor = clr(66, 74, 87); + cloudy.mAmbientDayColor = clr(137, 145, 160); + cloudy.mAmbientSunsetColor = clr(71, 80, 92); + cloudy.mAmbientNightColor = clr(32, 39, 54); + cloudy.mSunSunriseColor = clr(241, 177, 99); + cloudy.mSunDayColor = clr(255, 236, 221); + cloudy.mSunSunsetColor = clr(255, 89, 00); + cloudy.mSunNightColor = clr(77, 91, 124); + cloudy.mSunDiscSunsetColor = clr(255, 202, 179); + cloudy.mLandFogDayDepth = 0.72; + cloudy.mLandFogNightDepth = 0.72; + cloudy.mWindSpeed = 0.2; + cloudy.mCloudSpeed = 2; + cloudy.mGlareView = 1.0; + mWeatherSettings["cloudy"] = cloudy; + + Weather foggy; + foggy.mCloudTexture = "tx_sky_foggy.dds"; + foggy.mCloudsMaximumPercent = 1.0; + foggy.mTransitionDelta = 0.015; + foggy.mSkySunriseColor = clr(197, 190, 180); + foggy.mSkyDayColor = clr(184, 211, 228); + foggy.mSkySunsetColor = clr(142, 159, 176); + foggy.mSkyNightColor = clr(18, 23, 28); + foggy.mFogSunriseColor = clr(173, 164, 148); + foggy.mFogDayColor = clr(150, 187, 209); + foggy.mFogSunsetColor = clr(113, 135, 157); + foggy.mFogNightColor = clr(19, 24, 29); + foggy.mAmbientSunriseColor = clr(48, 43, 37); + foggy.mAmbientDayColor = clr(92, 109, 120); + foggy.mAmbientSunsetColor = clr(28, 33, 39); + foggy.mAmbientNightColor = clr(28, 33, 39); + foggy.mSunSunriseColor = clr(177, 162, 137); + foggy.mSunDayColor = clr(111, 131, 151); + foggy.mSunSunsetColor = clr(125, 157, 189); + foggy.mSunNightColor = clr(81, 100, 119); + foggy.mSunDiscSunsetColor = clr(223, 223, 223); + foggy.mLandFogDayDepth = 1.0; + foggy.mLandFogNightDepth = 1.9; + foggy.mWindSpeed = 0; + foggy.mCloudSpeed = 1.25; + foggy.mGlareView = 0.25; + mWeatherSettings["foggy"] = foggy; + + Weather thunderstorm; + thunderstorm.mCloudTexture = "tx_sky_thunder.dds"; + thunderstorm.mCloudsMaximumPercent = 0.66; + thunderstorm.mTransitionDelta = 0.03; + thunderstorm.mSkySunriseColor = clr(35, 36, 39); + thunderstorm.mSkyDayColor = clr(97, 104, 115); + thunderstorm.mSkySunsetColor = clr(35, 36, 39); + thunderstorm.mSkyNightColor = clr(19, 20, 22); + thunderstorm.mFogSunriseColor = clr(70, 74, 85); + thunderstorm.mFogDayColor = clr(97, 104, 115); + thunderstorm.mFogSunsetColor = clr(70, 74, 85); + thunderstorm.mFogNightColor = clr(19, 20, 22); + thunderstorm.mAmbientSunriseColor = clr(54, 54, 54); + thunderstorm.mAmbientDayColor = clr(90, 90, 90); + thunderstorm.mAmbientSunsetColor = clr(54, 54, 54); + thunderstorm.mAmbientNightColor = clr(49, 51, 54); + thunderstorm.mSunSunriseColor = clr(91, 99, 122); + thunderstorm.mSunDayColor = clr(138, 144, 155); + thunderstorm.mSunSunsetColor = clr(96, 101, 117); + thunderstorm.mSunNightColor = clr(55, 76, 110); + thunderstorm.mSunDiscSunsetColor = clr(128, 128, 128); + thunderstorm.mLandFogDayDepth = 1; + thunderstorm.mLandFogNightDepth = 1.15; + thunderstorm.mWindSpeed = 0.5; + thunderstorm.mCloudSpeed = 3; + thunderstorm.mGlareView = 0; + thunderstorm.mRainLoopSoundID = "rain heavy"; + mWeatherSettings["thunderstorm"] = thunderstorm; + + Weather rain; + rain.mCloudTexture = "tx_sky_rainy.dds"; + rain.mCloudsMaximumPercent = 0.66; + rain.mTransitionDelta = 0.015; + rain.mSkySunriseColor = clr(71, 74, 75); + rain.mSkyDayColor = clr(116, 120, 122); + rain.mSkySunsetColor = clr(73, 73, 73); + rain.mSkyNightColor = clr(24, 25, 26); + rain.mFogSunriseColor = clr(71, 74, 75); + rain.mFogDayColor = clr(116, 120, 122); + rain.mFogSunsetColor = clr(73, 73, 73); + rain.mFogNightColor = clr(24, 25, 26); + rain.mAmbientSunriseColor = clr(97, 90, 88); + rain.mAmbientDayColor = clr(105, 110, 113); + rain.mAmbientSunsetColor = clr(88, 97, 97); + rain.mAmbientNightColor = clr(50, 55, 67); + rain.mSunSunriseColor = clr(131, 122, 120); + rain.mSunDayColor = clr(149, 157, 170); + rain.mSunSunsetColor = clr(120, 126, 131); + rain.mSunNightColor = clr(50, 62, 101); + rain.mSunDiscSunsetColor = clr(128, 128, 128); + rain.mLandFogDayDepth = 0.8; + rain.mLandFogNightDepth = 0.8; + rain.mWindSpeed = 0.3; + rain.mCloudSpeed = 2; + rain.mGlareView = 0; + rain.mRainLoopSoundID = "rain"; + mWeatherSettings["rain"] = rain; + + Weather overcast; + overcast.mCloudTexture = "tx_sky_overcast.dds"; + overcast.mCloudsMaximumPercent = 1.0; + overcast.mTransitionDelta = 0.015; + overcast.mSkySunriseColor = clr(91, 99, 106); + overcast.mSkyDayColor = clr(143, 146, 149); + overcast.mSkySunsetColor = clr(108, 115, 121); + overcast.mSkyNightColor = clr(19, 22, 25); + overcast.mFogSunriseColor = clr(91, 99, 106); + overcast.mFogDayColor = clr(143, 146, 149); + overcast.mFogSunsetColor = clr(108, 115, 121); + overcast.mFogNightColor = clr(19, 22, 25); + overcast.mAmbientSunriseColor = clr(84, 88, 92); + overcast.mAmbientDayColor = clr(93, 96, 105); + overcast.mAmbientSunsetColor = clr(83, 77, 75); + overcast.mAmbientNightColor = clr(57, 60, 66); + overcast.mSunSunriseColor = clr(87, 125, 163); + overcast.mSunDayColor = clr(163, 169, 183); + overcast.mSunSunsetColor = clr(85, 103, 157); + overcast.mSunNightColor = clr(32, 54, 100); + overcast.mSunDiscSunsetColor = clr(128, 128, 128); + overcast.mLandFogDayDepth = 0.7; + overcast.mLandFogNightDepth = 0.7; + overcast.mWindSpeed = 0.2; + overcast.mCloudSpeed = 1.5; + overcast.mGlareView = 0; + mWeatherSettings["overcast"] = overcast; + + Weather ashstorm; + ashstorm.mCloudTexture = "tx_sky_ashstorm.dds"; + ashstorm.mCloudsMaximumPercent = 1.0; + ashstorm.mTransitionDelta = 0.035; + ashstorm.mSkySunriseColor = clr(91, 56, 51); + ashstorm.mSkyDayColor = clr(124, 73, 58); + ashstorm.mSkySunsetColor = clr(106, 55, 40); + ashstorm.mSkyNightColor = clr(20, 21, 22); + ashstorm.mFogSunriseColor = clr(91, 56, 51); + ashstorm.mFogDayColor = clr(124, 73, 58); + ashstorm.mFogSunsetColor = clr(106, 55, 40); + ashstorm.mFogNightColor = clr(20, 21, 22); + ashstorm.mAmbientSunriseColor = clr(52, 42, 37); + ashstorm.mAmbientDayColor = clr(75, 49, 41); + ashstorm.mAmbientSunsetColor = clr(48, 39, 35); + ashstorm.mAmbientNightColor = clr(36, 42, 49); + ashstorm.mSunSunriseColor = clr(184, 91, 71); + ashstorm.mSunDayColor = clr(228, 139, 114); + ashstorm.mSunSunsetColor = clr(185, 86, 57); + ashstorm.mSunNightColor = clr(54, 66, 74); + ashstorm.mSunDiscSunsetColor = clr(128, 128, 128); + ashstorm.mLandFogDayDepth = 1.1; + ashstorm.mLandFogNightDepth = 1.2; + ashstorm.mWindSpeed = 0.8; + ashstorm.mCloudSpeed = 7; + ashstorm.mGlareView = 0; + ashstorm.mAmbientLoopSoundID = "ashstorm"; + mWeatherSettings["ashstorm"] = ashstorm; + + Weather blight; + blight.mCloudTexture = "tx_sky_blight.dds"; + blight.mCloudsMaximumPercent = 1.0; + blight.mTransitionDelta = 0.04; + blight.mSkySunriseColor = clr(90, 35, 35); + blight.mSkyDayColor = clr(90, 35, 35); + blight.mSkySunsetColor = clr(92, 33, 33); + blight.mSkyNightColor = clr(44, 14, 14); + blight.mFogSunriseColor = clr(90, 35, 35); + blight.mFogDayColor = clr(128, 19, 19); + blight.mFogSunsetColor = clr(92, 33, 33); + blight.mFogNightColor = clr(44, 14, 14); + blight.mAmbientSunriseColor = clr(61, 40, 40); + blight.mAmbientDayColor = clr(79, 54, 54); + blight.mAmbientSunsetColor = clr(61, 40, 40); + blight.mAmbientNightColor = clr(56, 58, 62); + blight.mSunSunriseColor = clr(180, 78, 78); + blight.mSunDayColor = clr(224, 84, 84); + blight.mSunSunsetColor = clr(180, 78, 78); + blight.mSunNightColor = clr(61, 91, 143); + blight.mSunDiscSunsetColor = clr(128, 128, 128); + blight.mLandFogDayDepth = 1.1; + blight.mLandFogNightDepth = 1.2; + blight.mWindSpeed = 0.9; + blight.mCloudSpeed = 9; + blight.mGlareView = 0; + blight.mAmbientLoopSoundID = "blight"; + mWeatherSettings["blight"] = blight; + + Weather snow; + snow.mCloudTexture = "tx_bm_sky_snow.dds"; + snow.mCloudsMaximumPercent = 1.0; + snow.mTransitionDelta = 0.014; + snow.mSkySunriseColor = clr(196, 91, 91); + snow.mSkyDayColor = clr(153, 158, 166); + snow.mSkySunsetColor = clr(96, 115, 134); + snow.mSkyNightColor = clr(31, 35, 39); + snow.mFogSunriseColor = clr(106, 91, 91); + snow.mFogDayColor = clr(153, 158, 166); + snow.mFogSunsetColor = clr(96, 115, 134); + snow.mFogNightColor = clr(31, 35, 39); + snow.mAmbientSunriseColor = clr(92, 84, 84); + snow.mAmbientDayColor = clr(93, 96, 105); + snow.mAmbientSunsetColor = clr(70, 79, 87); + snow.mAmbientNightColor = clr(49, 58, 68); + snow.mSunSunriseColor = clr(141, 109, 109); + snow.mSunDayColor = clr(163, 169, 183); + snow.mSunSunsetColor = clr(101, 121, 141); + snow.mSunNightColor = clr(55, 66, 77); + snow.mSunDiscSunsetColor = clr(128, 128, 128); + snow.mLandFogDayDepth = 1.0; + snow.mLandFogNightDepth = 1.2; + snow.mWindSpeed = 0; + snow.mCloudSpeed = 1.5; + snow.mGlareView = 0; + mWeatherSettings["snow"] = snow; + + Weather blizzard; + blizzard.mCloudTexture = "tx_bm_sky_blizzard.dds"; + blizzard.mCloudsMaximumPercent = 1.0; + blizzard.mTransitionDelta = 0.030; + blizzard.mSkySunriseColor = clr(91, 99, 106); + blizzard.mSkyDayColor = clr(121, 133, 145); + blizzard.mSkySunsetColor = clr(108, 115, 121); + blizzard.mSkyNightColor = clr(27, 29, 31); + blizzard.mFogSunriseColor = clr(91, 99, 106); + blizzard.mFogDayColor = clr(121, 133, 145); + blizzard.mFogSunsetColor = clr(108, 115, 121); + blizzard.mFogNightColor = clr(21, 24, 28); + blizzard.mAmbientSunriseColor = clr(84, 88, 92); + blizzard.mAmbientDayColor = clr(93, 96, 105); + blizzard.mAmbientSunsetColor = clr(83, 77, 75); + blizzard.mAmbientNightColor = clr(53, 62, 70); + blizzard.mSunSunriseColor = clr(114, 128, 146); + blizzard.mSunDayColor = clr(163, 169, 183); + blizzard.mSunSunsetColor = clr(106, 114, 136); + blizzard.mSunNightColor = clr(57, 66, 74); + blizzard.mSunDiscSunsetColor = clr(128, 128, 128); + blizzard.mLandFogDayDepth = 2.8; + blizzard.mLandFogNightDepth = 3.0; + blizzard.mWindSpeed = 0.9; + blizzard.mCloudSpeed = 7.5; + blizzard.mGlareView = 0; + blizzard.mAmbientLoopSoundID = "BM Blizzard"; + mWeatherSettings["blizzard"] = blizzard; +} + +void WeatherManager::setWeather(const String& weather, bool instant) +{ + if (instant || mFirstUpdate) + { + mNextWeather = ""; + mCurrentWeather = weather; + mFirstUpdate = false; + } + else + { + if (mNextWeather != "") + { + // transition more than 50% finished? + if (mRemainingTransitionTime/(mWeatherSettings[mCurrentWeather].mTransitionDelta*24.f*60) <= 0.5) + mCurrentWeather = mNextWeather; + } + + mNextWeather = weather; + mRemainingTransitionTime = mWeatherSettings[mCurrentWeather].mTransitionDelta*24.f*60; + } +} + +WeatherResult WeatherManager::getResult(const String& weather) +{ + const Weather& current = mWeatherSettings[weather]; + WeatherResult result; + + result.mCloudTexture = current.mCloudTexture; + result.mCloudBlendFactor = 0; + result.mCloudOpacity = current.mCloudsMaximumPercent; + result.mWindSpeed = current.mWindSpeed; + result.mCloudSpeed = current.mCloudSpeed; + result.mGlareView = current.mGlareView; + result.mAmbientLoopSoundID = current.mAmbientLoopSoundID; + result.mSunColor = current.mSunDiscSunsetColor; + + const float fade_duration = current.mTransitionDelta * 24.f; + + result.mNight = (mHour < 6.f+fade_duration || mHour > 20.f-fade_duration); + + result.mFogDepth = result.mNight ? current.mLandFogNightDepth : current.mLandFogDayDepth; + + // night + if (mHour <= (WeatherGlobals::mSunriseTime-WeatherGlobals::mSunriseDuration) + || mHour >= (WeatherGlobals::mSunsetTime+WeatherGlobals::mSunsetDuration)) + { + result.mFogColor = current.mFogNightColor; + result.mAmbientColor = current.mAmbientNightColor; + result.mSunColor = current.mSunNightColor; + result.mSkyColor = current.mSkyNightColor; + result.mNightFade = 1.f; + } + + // sunrise + else if (mHour >= (WeatherGlobals::mSunriseTime-WeatherGlobals::mSunriseDuration) && mHour <= WeatherGlobals::mSunriseTime) + { + if (mHour <= (WeatherGlobals::mSunriseTime-WeatherGlobals::mSunriseDuration+fade_duration)) + { + // fade in + float advance = (WeatherGlobals::mSunriseTime-WeatherGlobals::mSunriseDuration+fade_duration)-mHour; + float factor = (advance / fade_duration); + result.mFogColor = lerp(current.mFogSunriseColor, current.mFogNightColor); + result.mAmbientColor = lerp(current.mAmbientSunriseColor, current.mAmbientNightColor); + result.mSunColor = lerp(current.mSunSunriseColor, current.mSunNightColor); + result.mSkyColor = lerp(current.mSkySunriseColor, current.mSkyNightColor); + result.mNightFade = factor; + } + else if (mHour >= (WeatherGlobals::mSunriseTime-fade_duration)) + { + // fade out + float advance = mHour-(WeatherGlobals::mSunriseTime-fade_duration); + float factor = advance / fade_duration; + result.mFogColor = lerp(current.mFogSunriseColor, current.mFogDayColor); + result.mAmbientColor = lerp(current.mAmbientSunriseColor, current.mAmbientDayColor); + result.mSunColor = lerp(current.mSunSunriseColor, current.mSunDayColor); + result.mSkyColor = lerp(current.mSkySunriseColor, current.mSkyDayColor); + } + else + { + result.mFogColor = current.mFogSunriseColor; + result.mAmbientColor = current.mAmbientSunriseColor; + result.mSunColor = current.mSunSunriseColor; + result.mSkyColor = current.mSkySunriseColor; + } + } + + // day + else if (mHour >= (WeatherGlobals::mSunriseTime) && mHour <= (WeatherGlobals::mSunsetTime)) + { + result.mFogColor = current.mFogDayColor; + result.mAmbientColor = current.mAmbientDayColor; + result.mSunColor = current.mSunDayColor; + result.mSkyColor = current.mSkyDayColor; + } + + // sunset + else if (mHour >= (WeatherGlobals::mSunsetTime) && mHour <= (WeatherGlobals::mSunsetTime+WeatherGlobals::mSunsetDuration)) + { + if (mHour <= (WeatherGlobals::mSunsetTime+fade_duration)) + { + // fade in + float advance = (WeatherGlobals::mSunsetTime+fade_duration)-mHour; + float factor = (advance / fade_duration); + result.mFogColor = lerp(current.mFogSunsetColor, current.mFogDayColor); + result.mAmbientColor = lerp(current.mAmbientSunsetColor, current.mAmbientDayColor); + result.mSunColor = lerp(current.mSunSunsetColor, current.mSunDayColor); + result.mSkyColor = lerp(current.mSkySunsetColor, current.mSkyDayColor); + } + else if (mHour >= (WeatherGlobals::mSunsetTime+WeatherGlobals::mSunsetDuration-fade_duration)) + { + // fade out + float advance = mHour-(WeatherGlobals::mSunsetTime+WeatherGlobals::mSunsetDuration-fade_duration); + float factor = advance / fade_duration; + result.mFogColor = lerp(current.mFogSunsetColor, current.mFogNightColor); + result.mAmbientColor = lerp(current.mAmbientSunsetColor, current.mAmbientNightColor); + result.mSunColor = lerp(current.mSunSunsetColor, current.mSunNightColor); + result.mSkyColor = lerp(current.mSkySunsetColor, current.mSkyNightColor); + result.mNightFade = factor; + } + else + { + result.mFogColor = current.mFogSunsetColor; + result.mAmbientColor = current.mAmbientSunsetColor; + result.mSunColor = current.mSunSunsetColor; + result.mSkyColor = current.mSkySunsetColor; + } + } + + return result; +} + +WeatherResult WeatherManager::transition(float factor) +{ + const WeatherResult& current = getResult(mCurrentWeather); + const WeatherResult& other = getResult(mNextWeather); + WeatherResult result; + + result.mCloudTexture = current.mCloudTexture; + result.mNextCloudTexture = other.mCloudTexture; + result.mCloudBlendFactor = factor; + + result.mCloudOpacity = lerp(current.mCloudOpacity, other.mCloudOpacity); + result.mFogColor = lerp(current.mFogColor, other.mFogColor); + result.mSunColor = lerp(current.mSunColor, other.mSunColor); + result.mSkyColor = lerp(current.mSkyColor, other.mSkyColor); + + result.mAmbientColor = lerp(current.mAmbientColor, other.mAmbientColor); + result.mSunDiscColor = lerp(current.mSunDiscColor, other.mSunDiscColor); + result.mFogDepth = lerp(current.mFogDepth, other.mFogDepth); + result.mWindSpeed = lerp(current.mWindSpeed, other.mWindSpeed); + result.mCloudSpeed = lerp(current.mCloudSpeed, other.mCloudSpeed); + result.mCloudOpacity = lerp(current.mCloudOpacity, other.mCloudOpacity); + result.mGlareView = lerp(current.mGlareView, other.mGlareView); + + result.mNight = current.mNight; + + // sound change behaviour: + // if 'other' has a new sound, switch to it after 1/2 of the transition length + if (other.mAmbientLoopSoundID != "") + result.mAmbientLoopSoundID = factor>0.5 ? other.mAmbientLoopSoundID : current.mAmbientLoopSoundID; + // if 'current' has a sound and 'other' does not have a sound, turn off the sound immediately + else if (current.mAmbientLoopSoundID != "") + result.mAmbientLoopSoundID = ""; + + return result; +} + +void WeatherManager::update(float duration) +{ + mWeatherUpdateTime -= duration; + if (mEnvironment->mWorld->isCellExterior() || mEnvironment->mWorld->isCellQuasiExterior()) + { + std::string regionstr = mEnvironment->mWorld->getPlayer().getPlayer().getCell()->cell->region; + boost::algorithm::to_lower(regionstr); + + if (mWeatherUpdateTime <= 0 || regionstr != mCurrentRegion) + { + mCurrentRegion = regionstr; + mWeatherUpdateTime = WeatherGlobals::mWeatherUpdateTime*60.f; + + std::string weather; + + if (mRegionOverrides.find(regionstr) != mRegionOverrides.end()) + weather = mRegionOverrides[regionstr]; + else + { + // get weather probabilities for the current region + const ESM::Region *region = mEnvironment->mWorld->getStore().regions.find (regionstr); + + float clear = region->data.clear/255.f; + float cloudy = region->data.cloudy/255.f; + float foggy = region->data.foggy/255.f; + float overcast = region->data.overcast/255.f; + float rain = region->data.rain/255.f; + float thunder = region->data.thunder/255.f; + float ash = region->data.ash/255.f; + float blight = region->data.blight/255.f; + float snow = region->data.a/255.f; + float blizzard = region->data.b/255.f; + + // re-scale to 100 percent + const float total = clear+cloudy+foggy+overcast+rain+thunder+ash+blight+snow+blizzard; + + srand(time(NULL)); + float random = ((rand()%100)/100.f) * total; + + if (random >= snow+blight+ash+thunder+rain+overcast+foggy+cloudy+clear) + weather = "blizzard"; + else if (random >= blight+ash+thunder+rain+overcast+foggy+cloudy+clear) + weather = "snow"; + else if (random >= ash+thunder+rain+overcast+foggy+cloudy+clear) + weather = "blight"; + else if (random >= thunder+rain+overcast+foggy+cloudy+clear) + weather = "ashstorm"; + else if (random >= rain+overcast+foggy+cloudy+clear) + weather = "thunderstorm"; + else if (random >= overcast+foggy+cloudy+clear) + weather = "rain"; + else if (random >= foggy+cloudy+clear) + weather = "overcast"; + else if (random >= cloudy+clear) + weather = "foggy"; + else if (random >= clear) + weather = "cloudy"; + else + weather = "clear"; + } + + setWeather(weather, false); + /* + std::cout << "roll result: " << random << std::endl; + + std::cout << regionstr << " weather probabilities: " << clear << " " << cloudy << " " << foggy << " " + << overcast << " " << rain << " " << thunder << " " << ash << " " << blight << " " << snow << " " + << blizzard << std::endl; + + std::cout << "New weather : " << weather << std::endl; + */ + } + + WeatherResult result; + + if (mNextWeather != "") + { + mRemainingTransitionTime -= duration; + if (mRemainingTransitionTime < 0) + { + mCurrentWeather = mNextWeather; + mNextWeather = ""; + } + } + + if (mNextWeather != "") + result = transition(1-(mRemainingTransitionTime/(mWeatherSettings[mCurrentWeather].mTransitionDelta*24.f*60))); + else + result = getResult(mCurrentWeather); + + mRendering->configureFog(result.mFogDepth, result.mFogColor); + + // disable sun during night + if (mHour >= WeatherGlobals::mSunsetTime+WeatherGlobals::mSunsetDuration + || mHour <= WeatherGlobals::mSunriseTime-WeatherGlobals::mSunriseDuration) + mRendering->getSkyManager()->sunDisable(); + else + { + // during day, calculate sun angle + float height = 1-std::abs(((mHour-13)/7.f)); + int facing = mHour > 13.f ? 1 : -1; + Vector3 final( + (1-height)*facing, + (1-height)*facing, + height); + mRendering->setSunDirection(final); + + mRendering->getSkyManager()->sunEnable(); + } + + // moon calculations + float night; + if (mHour >= 14) + night = mHour-14; + else if (mHour <= 10) + night = mHour+10; + else + night = 0; + + night /= 20.f; + + if (night != 0) + { + float moonHeight = 1-std::abs((night-0.5)*2); + int facing = (mHour > 0.f && mHour<12.f) ? 1 : -1; + Vector3 masser( + (1-moonHeight)*facing, + (1-moonHeight)*facing, + moonHeight); + + Vector3 secunda( + (1-moonHeight)*facing*0.8, + (1-moonHeight)*facing*1.25, + moonHeight); + + mRendering->getSkyManager()->setMasserDirection(masser); + mRendering->getSkyManager()->setSecundaDirection(secunda); + mRendering->getSkyManager()->masserEnable(); + mRendering->getSkyManager()->secundaEnable(); + + float hour_fade; + if (mHour >= 7.f && mHour <= 14.f) + hour_fade = 1-(mHour-7)/3.f; + else if (mHour >= 14 && mHour <= 15.f) + hour_fade = mHour-14; + else + hour_fade = 1; + + float secunda_angle_fade; + float masser_angle_fade; + float angle = moonHeight*90.f; + + if (angle >= 30 && angle <= 50) + secunda_angle_fade = (angle-30)/20.f; + else if (angle <30) + secunda_angle_fade = 0.f; + else + secunda_angle_fade = 1.f; + + if (angle >= 40 && angle <= 50) + masser_angle_fade = (angle-40)/10.f; + else if (angle <40) + masser_angle_fade = 0.f; + else + masser_angle_fade = 1.f; + + masser_angle_fade *= hour_fade; + secunda_angle_fade *= hour_fade; + + mRendering->getSkyManager()->setMasserFade(masser_angle_fade); + mRendering->getSkyManager()->setSecundaFade(secunda_angle_fade); + } + else + { + mRendering->getSkyManager()->masserDisable(); + mRendering->getSkyManager()->secundaDisable(); + } + + if (mCurrentWeather == "thunderstorm" && mNextWeather == "") + { + if (mThunderFlash > 0) + { + // play the sound after a delay + mThunderSoundDelay -= duration; + if (mThunderSoundDelay <= 0) + { + // pick a random sound + int sound = rand() % 4; + std::string soundname; + if (sound == 0) soundname = WeatherGlobals::mThunderSoundID0; + else if (sound == 1) soundname = WeatherGlobals::mThunderSoundID1; + else if (sound == 2) soundname = WeatherGlobals::mThunderSoundID2; + else if (sound == 3) soundname = WeatherGlobals::mThunderSoundID3; + mEnvironment->mSoundManager->playSound(soundname, 1.0, 1.0); + mThunderSoundDelay = 1000; + } + + mThunderFlash -= duration; + if (mThunderFlash > 0) + mRendering->getSkyManager()->setThunder( mThunderFlash / WeatherGlobals::mThunderThreshold ); + else + { + srand(time(NULL)); + mThunderChanceNeeded = rand() % 100; + mThunderChance = 0; + mRendering->getSkyManager()->setThunder( 0.f ); + } + } + else + { + // no thunder active + mThunderChance += duration*4; // chance increases by 4 percent every second + if (mThunderChance >= mThunderChanceNeeded) + { + mThunderFlash = WeatherGlobals::mThunderThreshold; + + mRendering->getSkyManager()->setThunder( mThunderFlash / WeatherGlobals::mThunderThreshold ); + + mThunderSoundDelay = WeatherGlobals::mThunderSoundDelay; + } + } + } + else + mRendering->getSkyManager()->setThunder(0.f); + + mRendering->setAmbientColour(result.mAmbientColor); + mRendering->sunEnable(); + mRendering->setSunColour(result.mSunColor); + + mRendering->getSkyManager()->setWeather(result); + } + else + { + mRendering->sunDisable(); + mRendering->skyDisable(); + mRendering->getSkyManager()->setThunder(0.f); + } +} + +void WeatherManager::setHour(const float hour) +{ + // accelerate a bit for testing + /* + mHour += 0.005; + + if (mHour >= 24.f) mHour = 0.f; + + std::cout << "hour " << mHour << std::endl; + */ + + mHour = hour; +} + +void WeatherManager::setDate(const int day, const int month) +{ + mDay = day; + mMonth = month; +} + +unsigned int WeatherManager::getWeatherID() const +{ + // Source: http://www.uesp.net/wiki/Tes3Mod:GetCurrentWeather + + if (mCurrentWeather == "clear") + return 0; + else if (mCurrentWeather == "cloudy") + return 1; + else if (mCurrentWeather == "foggy") + return 2; + else if (mCurrentWeather == "overcast") + return 3; + else if (mCurrentWeather == "rain") + return 4; + else if (mCurrentWeather == "thunder") + return 5; + else if (mCurrentWeather == "ashstorm") + return 6; + else if (mCurrentWeather == "blight") + return 7; + else if (mCurrentWeather == "snow") + return 8; + else if (mCurrentWeather == "blizzard") + return 9; + + else + return 0; +} + +void WeatherManager::changeWeather(const std::string& region, const unsigned int id) +{ + std::string weather; + if (id==0) + weather = "clear"; + else if (id==1) + weather = "cloudy"; + else if (id==2) + weather = "foggy"; + else if (id==3) + weather = "overcast"; + else if (id==4) + weather = "rain"; + else if (id==5) + weather = "thunder"; + else if (id==6) + weather = "ashstorm"; + else if (id==7) + weather = "blight"; + else if (id==8) + weather = "snow"; + else if (id==9) + weather = "blizzard"; + else + weather = "clear"; + + mRegionOverrides[region] = weather; +} diff --git a/apps/openmw/mwworld/weather.hpp b/apps/openmw/mwworld/weather.hpp new file mode 100644 index 000000000..7a719252b --- /dev/null +++ b/apps/openmw/mwworld/weather.hpp @@ -0,0 +1,272 @@ +#ifndef GAME_MWWORLD_WEATHER_H +#define GAME_MWWORLD_WEATHER_H + +#include +#include + +namespace MWRender +{ + class RenderingManager; +} + +namespace MWWorld +{ + class Environment; + + /// Global weather manager properties (according to INI) + struct WeatherGlobals + { + /* + [Weather] + EnvReduceColor=255,255,255,255 + LerpCloseColor=037,046,048,255 + BumpFadeColor=230,239,255,255 + AlphaReduce=0.35 + Minimum Time Between Environmental Sounds=1.0 + Maximum Time Between Environmental Sounds=5.0 + Sun Glare Fader Max=0.5 + Sun Glare Fader Angle Max=30.0 + Sun Glare Fader Color=222,095,039 + Timescale Clouds=0 + Precip Gravity=575 + Hours Between Weather Changes=20 + Rain Ripples=1 + Rain Ripple Radius=1024 + Rain Ripples Per Drop=1 + Rain Ripple Scale=0.3 + Rain Ripple Speed=1.0 + Fog Depth Change Speed=3 + Sunrise Time=6 + Sunset Time=18 + Sunrise Duration=2 + Sunset Duration=2 + Sky Pre-Sunrise Time=.5 + Sky Post-Sunrise Time=1 + Sky Pre-Sunset Time=1.5 + Sky Post-Sunset Time=.5 + Ambient Pre-Sunrise Time=.5 + Ambient Post-Sunrise Time=2 + Ambient Pre-Sunset Time=1 + Ambient Post-Sunset Time=1.25 + Fog Pre-Sunrise Time=.5 + Fog Post-Sunrise Time=1 + Fog Pre-Sunset Time=2 + Fog Post-Sunset Time=1 + Sun Pre-Sunrise Time=0 + Sun Post-Sunrise Time=0 + Sun Pre-Sunset Time=1 + Sun Post-Sunset Time=1.25 + Stars Post-Sunset Start=1 + Stars Pre-Sunrise Finish=2 + Stars Fading Duration=2 + Snow Ripples=0 + Snow Ripple Radius=1024 + Snow Ripples Per Flake=1 + Snow Ripple Scale=0.3 + Snow Ripple Speed=1.0 + Snow Gravity Scale=0.1 + Snow High Kill=700 + Snow Low Kill=150 + + + [Moons] + Masser Size=94 + Masser Fade In Start=14 + Masser Fade In Finish=15 + Masser Fade Out Start=7 + Masser Fade Out Finish=10 + Masser Axis Offset=35 + Masser Speed=.5 + Masser Daily Increment=1 + Masser Fade Start Angle=50 + Masser Fade End Angle=40 + Masser Moon Shadow Early Fade Angle=0.5 + Secunda Size=40 + Secunda Fade In Start=14 + Secunda Fade In Finish=15 + Secunda Fade Out Start=7 + Secunda Fade Out Finish=10 + Secunda Axis Offset=50 + Secunda Speed=.6 + Secunda Daily Increment=1.2 + Secunda Fade Start Angle=50 + Secunda Fade End Angle=30 + Secunda Moon Shadow Early Fade Angle=0.5 + Script Color=255,20,20 + */ + + static const float mSunriseTime = 8; + static const float mSunsetTime = 18; + static const float mSunriseDuration = 2; + static const float mSunsetDuration = 2; + + static const float mWeatherUpdateTime = 20.f; + + // morrowind sets these per-weather, but since they are only used by 'thunderstorm' + // weather setting anyway, we can just as well set them globally + static const float mThunderFrequency = .4; + static const float mThunderThreshold = 0.6; + static const float mThunderSoundDelay = 0.25; + static const std::string mThunderSoundID0; + static const std::string mThunderSoundID1; + static const std::string mThunderSoundID2; + static const std::string mThunderSoundID3; + }; + + /// Defines the actual weather that results from weather setting (see below), time of day and weather transition + struct WeatherResult + { + Ogre::String mCloudTexture; + Ogre::String mNextCloudTexture; + float mCloudBlendFactor; + + Ogre::ColourValue mFogColor; + + Ogre::ColourValue mAmbientColor; + + Ogre::ColourValue mSkyColor; + + Ogre::ColourValue mSunColor; + + Ogre::ColourValue mSunDiscColor; + + float mFogDepth; + + float mWindSpeed; + + float mCloudSpeed; + + float mCloudOpacity; + + float mGlareView; + + bool mNight; // use night skybox + float mNightFade; // fading factor for night skybox + + Ogre::String mAmbientLoopSoundID; + }; + + + /// Defines a single weather setting (according to INI) + struct Weather + { + Ogre::String mCloudTexture; + + // Sky (atmosphere) colors + Ogre::ColourValue mSkySunriseColor, + mSkyDayColor, + mSkySunsetColor, + mSkyNightColor; + + // Fog colors + Ogre::ColourValue mFogSunriseColor, + mFogDayColor, + mFogSunsetColor, + mFogNightColor; + + // Ambient lighting colors + Ogre::ColourValue mAmbientSunriseColor, + mAmbientDayColor, + mAmbientSunsetColor, + mAmbientNightColor; + + // Sun (directional) lighting colors + Ogre::ColourValue mSunSunriseColor, + mSunDayColor, + mSunSunsetColor, + mSunNightColor; + + // Fog depth/density + float mLandFogDayDepth, + mLandFogNightDepth; + + // Color modulation for the sun itself during sunset (not completely sure) + Ogre::ColourValue mSunDiscSunsetColor; + + // Duration of weather transition (in days) + float mTransitionDelta; + + // No idea what this one is used for? + float mWindSpeed; + + // Cloud animation speed multiplier + float mCloudSpeed; + + // Multiplier for clouds transparency + float mCloudsMaximumPercent; + + // Value between 0 and 1, defines the strength of the sun glare effect + float mGlareView; + + // Sound effect + // This is used for Blight, Ashstorm and Blizzard (Bloodmoon) + Ogre::String mAmbientLoopSoundID; + + // Rain sound effect + Ogre::String mRainLoopSoundID; + + /// \todo disease chance + }; + + /// + /// Interface for weather settings + /// + class WeatherManager + { + public: + WeatherManager(MWRender::RenderingManager*, MWWorld::Environment*); + + /** + * Change the weather in the specified region + * @param region that should be changed + * @param ID of the weather setting to shift to + */ + void changeWeather(const std::string& region, const unsigned int id); + + /** + * Per-frame update + * @param duration + */ + void update(float duration); + + void setHour(const float hour); + + void setDate(const int day, const int month); + + unsigned int getWeatherID() const; + + private: + float mHour; + int mDay, mMonth; + + MWRender::RenderingManager* mRendering; + MWWorld::Environment* mEnvironment; + + std::map mWeatherSettings; + + std::map mRegionOverrides; + + Ogre::String mCurrentWeather; + Ogre::String mNextWeather; + + std::string mCurrentRegion; + + bool mFirstUpdate; + + float mWeatherUpdateTime; + + float mRemainingTransitionTime; + + float mThunderFlash; + float mThunderChance; + float mThunderChanceNeeded; + float mThunderSoundDelay; + + WeatherResult transition(const float factor); + WeatherResult getResult(const Ogre::String& weather); + + void setWeather(const Ogre::String& weather, bool instant=false); + }; +} + +#endif // GAME_MWWORLD_WEATHER_H diff --git a/apps/openmw/mwworld/world.cpp b/apps/openmw/mwworld/world.cpp index c9e177566..1a69f4d7b 100644 --- a/apps/openmw/mwworld/world.cpp +++ b/apps/openmw/mwworld/world.cpp @@ -13,15 +13,20 @@ #include "../mwsound/soundmanager.hpp" + #include "ptr.hpp" #include "environment.hpp" #include "class.hpp" #include "player.hpp" +#include "weather.hpp" #include "refdata.hpp" #include "globals.hpp" #include "cellfunctors.hpp" +#include +using namespace Ogre; + namespace { template @@ -135,24 +140,31 @@ namespace MWWorld void World::adjustSky() { - if (mSky) + if (mSky && (isCellExterior() || isCellQuasiExterior())) { - toggleSky(); - // TODO set weather - toggleSky(); + mRendering->skySetHour (mGlobalVariables->getFloat ("gamehour")); + mRendering->skySetDate (mGlobalVariables->getInt ("day"), + mGlobalVariables->getInt ("month")); + + mRendering->getSkyManager()->enable(); } + else + mRendering->getSkyManager()->disable(); } - World::World (OEngine::Render::OgreRenderer& renderer, OEngine::Physic::PhysicEngine* physEng, + World::World (OEngine::Render::OgreRenderer& renderer, const Files::Collections& fileCollections, const std::string& master, const boost::filesystem::path& resDir, bool newGame, Environment& environment, const std::string& encoding) - : mRendering (renderer,resDir, physEng, environment),mPlayer (0), mLocalScripts (mStore), mGlobalVariables (0), - mSky (false), mEnvironment (environment), mNextDynamicRecord (0), mCells (mStore, mEsm, *this) + : mPlayer (0), mLocalScripts (mStore), mGlobalVariables (0), + mSky (true), mEnvironment (environment), mNextDynamicRecord (0), mCells (mStore, mEsm, *this) { - mPhysEngine = physEng; - - mPhysics = new PhysicsSystem(renderer, physEng); + mPhysics = new PhysicsSystem(renderer); + mPhysEngine = mPhysics->getEngine(); + + mRendering = new MWRender::RenderingManager(renderer, resDir, mPhysEngine, environment); + + mWeatherManager = new MWWorld::WeatherManager(mRendering, &environment); boost::filesystem::path masterPath (fileCollections.getCollection (".esm").getPath (master)); @@ -163,7 +175,7 @@ namespace MWWorld mEsm.open (masterPath.string()); mStore.load (mEsm); - MWRender::Player* play = &(mRendering.getPlayer()); + MWRender::Player* play = &(mRendering->getPlayer()); mPlayer = new MWWorld::Player (play, mStore.npcs.find ("player"), *this); mPhysics->addActor (mPlayer->getPlayer().getRefData().getHandle(), "", Ogre::Vector3 (0, 0, 0)); @@ -176,18 +188,17 @@ namespace MWWorld mGlobalVariables->setInt ("chargenstate", 1); } - mPhysEngine = physEng; - - mWorldScene = new Scene(environment, this, mRendering, mPhysics); + mWorldScene = new Scene(environment, this, *mRendering, mPhysics); } World::~World() { + delete mWeatherManager; delete mWorldScene; delete mGlobalVariables; - + delete mRendering; delete mPhysics; delete mPlayer; @@ -369,7 +380,9 @@ namespace MWWorld mGlobalVariables->setFloat ("gamehour", hour); - mRendering.skySetHour (hour); + mRendering->skySetHour (hour); + + mWeatherManager->setHour (hour); if (days>0) setDay (days + mGlobalVariables->getInt ("day")); @@ -404,7 +417,11 @@ namespace MWWorld mGlobalVariables->setInt ("day", day); mGlobalVariables->setInt ("month", month); - mRendering.skySetDate (day, month); + mRendering->skySetDate (day, month); + + mWeatherManager->setDate (day, month); + + } void World::setMonth (int month) @@ -425,7 +442,7 @@ namespace MWWorld if (years>0) mGlobalVariables->setInt ("year", years+mGlobalVariables->getInt ("year")); - mRendering.skySetDate (mGlobalVariables->getInt ("day"), month); + mRendering->skySetDate (mGlobalVariables->getInt ("day"), month); } bool World::toggleSky() @@ -433,34 +450,30 @@ namespace MWWorld if (mSky) { mSky = false; - mRendering.skyDisable(); + mRendering->skyDisable(); return false; } else { mSky = true; - // TODO check for extorior or interior with sky. - mRendering.skySetHour (mGlobalVariables->getFloat ("gamehour")); - mRendering.skySetDate (mGlobalVariables->getInt ("day"), - mGlobalVariables->getInt ("month")); - mRendering.skyEnable(); + mRendering->skyEnable(); return true; } } int World::getMasserPhase() const { - return mRendering.skyGetMasserPhase(); + return mRendering->skyGetMasserPhase(); } int World::getSecundaPhase() const { - return mRendering.skyGetSecundaPhase(); + return mRendering->skyGetSecundaPhase(); } void World::setMoonColour (bool red) { - mRendering.skySetMoonColour (red); + mRendering->skySetMoonColour (red); } float World::getTimeScaleFactor() const @@ -506,7 +519,7 @@ namespace MWWorld mEnvironment.mSoundManager->stopSound3D (ptr); mPhysics->removeObject (ptr.getRefData().getHandle()); - mRendering.removeObject(ptr); + mRendering->removeObject(ptr); mLocalScripts.remove (ptr); } @@ -543,7 +556,7 @@ namespace MWWorld /// \todo cell change for non-player ref - mRendering.moveObject (ptr, Ogre::Vector3 (x, y, z)); + mRendering->moveObject (ptr, Ogre::Vector3 (x, y, z)); } void World::moveObject (Ptr ptr, float x, float y, float z) @@ -617,7 +630,7 @@ namespace MWWorld bool World::toggleRenderMode (RenderMode mode) { - return mRendering.toggleRenderMode (mode); + return mRendering->toggleRenderMode (mode); } std::pair World::createRecord (const ESM::Potion& record) @@ -678,16 +691,67 @@ namespace MWWorld void World::playAnimationGroup (const MWWorld::Ptr& ptr, const std::string& groupName, int mode, int number) { - mRendering.playAnimationGroup (ptr, groupName, mode, number); + mRendering->playAnimationGroup (ptr, groupName, mode, number); } void World::skipAnimation (const MWWorld::Ptr& ptr) { - mRendering.skipAnimation (ptr); + mRendering->skipAnimation (ptr); } void World::update (float duration) { mWorldScene->update (duration); + + mWeatherManager->update (duration); + + // cast a ray from player to sun to detect if the sun is visible + // this is temporary until we find a better place to put this code + // currently its here because we need to access the physics system + float* p = mPlayer->getPlayer().getRefData().getPosition().pos; + Vector3 sun = mRendering->getSkyManager()->getRealSunPos(); + sun = Vector3(sun.x, -sun.z, sun.y); + mRendering->getSkyManager()->setGlare(!mPhysics->castRay(Ogre::Vector3(p[0], p[1], p[2]), sun)); + } + + bool World::isCellExterior() const + { + Ptr::CellStore *currentCell = mWorldScene->getCurrentCell(); + if (currentCell) + { + if (!(currentCell->cell->data.flags & ESM::Cell::Interior)) + return true; + else + return false; + } + return false; + } + + bool World::isCellQuasiExterior() const + { + Ptr::CellStore *currentCell = mWorldScene->getCurrentCell(); + if (currentCell) + { + if (!(currentCell->cell->data.flags & ESM::Cell::QuasiEx)) + return false; + else + return true; + } + return false; + } + + int World::getCurrentWeather() const + { + return mWeatherManager->getWeatherID(); + } + + void World::changeWeather(const std::string& region, const unsigned int id) + { + mWeatherManager->changeWeather(region, id); + } + + OEngine::Render::Fader* World::getFader() + { + return mRendering->getFader(); } } diff --git a/apps/openmw/mwworld/world.hpp b/apps/openmw/mwworld/world.hpp index 59cddb1c1..71cca3545 100644 --- a/apps/openmw/mwworld/world.hpp +++ b/apps/openmw/mwworld/world.hpp @@ -20,6 +20,7 @@ #include "localscripts.hpp" #include +#include namespace Ogre { @@ -49,6 +50,7 @@ namespace MWRender namespace MWWorld { + class WeatherManager; class Environment; class Player; @@ -60,12 +62,15 @@ namespace MWWorld enum RenderMode { - Render_CollisionDebug + Render_CollisionDebug, + Render_Wireframe }; private: - MWRender::RenderingManager mRendering; + MWRender::RenderingManager* mRendering; + + MWWorld::WeatherManager* mWeatherManager; MWWorld::Scene *mWorldScene; MWWorld::Player *mPlayer; @@ -95,17 +100,19 @@ namespace MWWorld public: - World (OEngine::Render::OgreRenderer& renderer, OEngine::Physic::PhysicEngine* physEng, + World (OEngine::Render::OgreRenderer& renderer, const Files::Collections& fileCollections, const std::string& master, const boost::filesystem::path& resDir, bool newGame, Environment& environment, const std::string& encoding); ~World(); + + OEngine::Render::Fader* getFader(); Ptr::CellStore *getExterior (int x, int y); Ptr::CellStore *getInterior (const std::string& name); - + void adjustSky(); MWWorld::Player& getPlayer(); @@ -118,6 +125,9 @@ namespace MWWorld bool hasCellChanged() const; ///< Has the player moved to a different cell, since the last frame? + + bool isCellExterior() const; + bool isCellQuasiExterior() const; Globals::Data& getGlobalVariable (const std::string& name); @@ -153,6 +163,10 @@ namespace MWWorld bool toggleSky(); ///< \return Resulting mode + + void changeWeather(const std::string& region, const unsigned int id); + + int getCurrentWeather() const; int getMasserPhase() const; diff --git a/cmake/FindOGRE.cmake b/cmake/FindOGRE.cmake index 3311ee220..917a8653e 100644 --- a/cmake/FindOGRE.cmake +++ b/cmake/FindOGRE.cmake @@ -1,115 +1,542 @@ -# Find OGRE includes and library +#------------------------------------------------------------------- +# This file is part of the CMake build system for OGRE +# (Object-oriented Graphics Rendering Engine) +# For the latest info, see http://www.ogre3d.org/ # -# This module defines -# OGRE_INCLUDE_DIR -# OGRE_LIBRARIES, the libraries to link against to use OGRE. -# OGRE_LIB_DIR, the location of the libraries -# OGRE_FOUND, If false, do not try to use OGRE +# The contents of this file are placed in the public domain. Feel +# free to make use of it in any way you like. +#------------------------------------------------------------------- + +# - Try to find OGRE +# If you have multiple versions of Ogre installed, use the CMake or +# the environment variable OGRE_HOME to point to the path where the +# desired Ogre version can be found. +# By default this script will look for a dynamic Ogre build. If you +# need to link against static Ogre libraries, set the CMake variable +# OGRE_STATIC to TRUE. +# +# Once done, this will define +# +# OGRE_FOUND - system has OGRE +# OGRE_INCLUDE_DIRS - the OGRE include directories +# OGRE_LIBRARIES - link these to use the OGRE core +# OGRE_BINARY_REL - location of the main Ogre binary (win32 non-static only, release) +# OGRE_BINARY_DBG - location of the main Ogre binaries (win32 non-static only, debug) +# +# Additionally this script searches for the following optional +# parts of the Ogre package: +# Plugin_BSPSceneManager, Plugin_CgProgramManager, +# Plugin_OctreeSceneManager, Plugin_OctreeZone, +# Plugin_ParticleFX, Plugin_PCZSceneManager, +# RenderSystem_GL, RenderSystem_Direct3D9, +# Paging, Terrain # -# Copyright © 2007, Matt Williams +# For each of these components, the following variables are defined: # -# Redistribution and use is allowed according to the terms of the BSD license. -# For details see the accompanying COPYING-CMAKE-SCRIPTS file. -CMAKE_POLICY(PUSH) - -IF (OGRE_LIBRARIES AND OGRE_INCLUDE_DIR AND OGRE_LIB_DIR AND OGRE_PLUGIN_DIR) - SET(OGRE_FIND_QUIETLY TRUE) # Already in cache, be silent -ENDIF (OGRE_LIBRARIES AND OGRE_INCLUDE_DIR AND OGRE_LIB_DIR AND OGRE_PLUGIN_DIR) - -IF (WIN32) #Windows - MESSAGE(STATUS "Looking for OGRE") - SET(OGRESDK $ENV{OGRE_HOME}) - SET(OGRESOURCE $ENV{OGRE_SRC}) - IF (OGRESDK) - MESSAGE(STATUS "Using OGRE SDK") - STRING(REGEX REPLACE "[\\]" "/" OGRESDK "${OGRESDK}") - SET(OGRE_INCLUDE_DIR ${OGRESDK}/include) - SET(OGRE_LIB_DIR ${OGRESDK}/lib) - SET(OGRE_LIBRARIES debug OgreMain_d optimized OgreMain) - ELSEIF (OGRESOURCE) - MESSAGE(STATUS "Using OGRE built from source") - SET(OGRE_INCLUDE_DIR $ENV{OGRE_SRC}/OgreMain/include) - SET(OGRE_LIB_DIR $ENV{OGRE_SRC}/lib) - SET(OGRE_LIBRARIES debug OgreMain_d optimized OgreMain) - ELSE (OGRESDK) - MESSAGE(STATUS "Using OGRE paths from CMake") - SET(OGRE_LIBRARIES debug OgreMain_d optimized OgreMain) - ENDIF (OGRESDK) -ENDIF (WIN32) - -IF (UNIX AND NOT APPLE) - CMAKE_MINIMUM_REQUIRED(VERSION 2.4.7 FATAL_ERROR) - FIND_PACKAGE(PkgConfig REQUIRED) - # Don't mark REQUIRED, but use PKG_CHECK_MODULES below (otherwise PkgConfig - # complains even if OGRE_* are set by hand). - PKG_SEARCH_MODULE(OGRE OGRE) - SET(OGRE_INCLUDE_DIR ${OGRE_INCLUDE_DIRS}) - SET(OGRE_LIB_DIR ${OGRE_LIBDIR}) - SET(OGRE_LIBRARIES ${OGRE_LIBRARIES} CACHE STRING "") - PKG_CHECK_MODULES(OGRE OGRE) -ENDIF (UNIX AND NOT APPLE) - -# on OS X we need Ogre SDK because framework doesn't include all libs, just Ogre Main lib -IF (APPLE) - IF (OGRESDK) - MESSAGE(STATUS "Using Ogre SDK") - SET(OGRE_LIB_DIR ${OGRESDK}/lib) - ELSE (OGRESDK) - MESSAGE(FATAL_ERROR "Path to Ogre SDK not specified. Specify OGRESDK.") - ENDIF (OGRESDK) - - - FIND_PATH(OGRE_INCLUDE_DIR Ogre.h - PATHS - /Library/Frameworks - /opt/local - ) - FIND_LIBRARY(OGRE_LIBRARIES - NAMES Ogre - PATHS - /Library/Frameworks - /opt/local - ) -ENDIF (APPLE) - -#Do some preparation -SEPARATE_ARGUMENTS(OGRE_INCLUDE_DIR) -SEPARATE_ARGUMENTS(OGRE_LIBRARIES) - -SET(OGRE_INCLUDE_DIR ${OGRE_INCLUDE_DIR} CACHE PATH "") -SET(OGRE_LIBRARIES ${OGRE_LIBRARIES} CACHE STRING "") -SET(OGRE_LIB_DIR ${OGRE_LIB_DIR} CACHE PATH "") - -if(OGRE_LIB_DIR) - CMAKE_POLICY(SET CMP0009 NEW) - IF (WIN32) - FILE(GLOB_RECURSE OGRE_PLUGINS "${OGRE_LIB_DIR}/Plugin_*.lib") - ENDIF (WIN32) - IF (NOT APPLE AND NOT WIN32) - FILE(GLOB_RECURSE OGRE_PLUGINS "${OGRE_LIB_DIR}/Plugin_*.so") - ENDIF (NOT APPLE AND NOT WIN32) - IF (APPLE) - FILE(GLOB_RECURSE OGRE_PLUGINS "${OGRE_LIB_DIR}/Plugin_*.dylib") - ENDIF (APPLE) - FOREACH (OGRE_PLUGINS_FILE ${OGRE_PLUGINS}) - STRING(REGEX REPLACE "/[^/]*$" "" OGRE_PLUGIN_DIR ${OGRE_PLUGINS_FILE}) - ENDFOREACH(OGRE_PLUGINS_FILE) + +# OGRE_${COMPONENT}_FOUND - ${COMPONENT} is available +# OGRE_${COMPONENT}_INCLUDE_DIRS - additional include directories for ${COMPONENT} +# OGRE_${COMPONENT}_LIBRARIES - link these to use ${COMPONENT} +# OGRE_${COMPONENT}_BINARY_REL - location of the component binary (win32 non-static only, release) +# OGRE_${COMPONENT}_BINARY_DBG - location of the component binary (win32 non-static only, debug) +# +# Finally, the following variables are defined: +# +# OGRE_PLUGIN_DIR_REL - The directory where the release versions of +# the OGRE plugins are located +# OGRE_PLUGIN_DIR_DBG - The directory where the debug versions of +# the OGRE plugins are located +# OGRE_MEDIA_DIR - The directory where the OGRE sample media is +# located, if available + +include(FindPkgMacros) +include(PreprocessorUtils) +findpkg_begin(OGRE) + + +# Get path, convert backslashes as ${ENV_${var}} +getenv_path(OGRE_HOME) +getenv_path(OGRE_SDK) +getenv_path(OGRE_SOURCE) +getenv_path(OGRE_BUILD) +getenv_path(OGRE_DEPENDENCIES_DIR) +getenv_path(PROGRAMFILES) + +# Determine whether to search for a dynamic or static build +if (OGRE_STATIC) + set(OGRE_LIB_SUFFIX "Static") +else () + set(OGRE_LIB_SUFFIX "") +endif () + + +set(OGRE_LIBRARY_NAMES "OgreMain${OGRE_LIB_SUFFIX}") +get_debug_names(OGRE_LIBRARY_NAMES) + +# construct search paths from environmental hints and +# OS specific guesses +if (WIN32) + set(OGRE_PREFIX_GUESSES + ${ENV_PROGRAMFILES}/OGRE + C:/OgreSDK + ) +elseif (UNIX) + set(OGRE_PREFIX_GUESSES + /opt/ogre + /opt/OGRE + /usr/lib${LIB_SUFFIX}/ogre + /usr/lib${LIB_SUFFIX}/OGRE + /usr/local/lib${LIB_SUFFIX}/ogre + /usr/local/lib${LIB_SUFFIX}/OGRE + $ENV{HOME}/ogre + $ENV{HOME}/OGRE + ) +endif () +set(OGRE_PREFIX_PATH + ${OGRE_HOME} ${OGRE_SDK} ${ENV_OGRE_HOME} ${ENV_OGRE_SDK} + ${OGRE_PREFIX_GUESSES} +) +create_search_paths(OGRE) +# If both OGRE_BUILD and OGRE_SOURCE are set, prepare to find Ogre in a build dir +set(OGRE_PREFIX_SOURCE ${OGRE_SOURCE} ${ENV_OGRE_SOURCE}) +set(OGRE_PREFIX_BUILD ${OGRE_BUILD} ${ENV_OGRE_BUILD}) +set(OGRE_PREFIX_DEPENDENCIES_DIR ${OGRE_DEPENDENCIES_DIR} ${ENV_OGRE_DEPENDENCIES_DIR}) +if (OGRE_PREFIX_SOURCE AND OGRE_PREFIX_BUILD) + foreach(dir ${OGRE_PREFIX_SOURCE}) + set(OGRE_INC_SEARCH_PATH ${dir}/OgreMain/include ${dir}/Dependencies/include ${dir}/iPhoneDependencies/include ${OGRE_INC_SEARCH_PATH}) + set(OGRE_LIB_SEARCH_PATH ${dir}/lib ${dir}/Dependencies/lib ${dir}/iPhoneDependencies/lib ${OGRE_LIB_SEARCH_PATH}) + set(OGRE_BIN_SEARCH_PATH ${dir}/Samples/Common/bin ${OGRE_BIN_SEARCH_PATH}) + endforeach(dir) + foreach(dir ${OGRE_PREFIX_BUILD}) + set(OGRE_INC_SEARCH_PATH ${dir}/include ${OGRE_INC_SEARCH_PATH}) + set(OGRE_LIB_SEARCH_PATH ${dir}/lib ${OGRE_LIB_SEARCH_PATH}) + set(OGRE_BIN_SEARCH_PATH ${dir}/bin ${OGRE_BIN_SEARCH_PATH}) + set(OGRE_BIN_SEARCH_PATH ${dir}/Samples/Common/bin ${OGRE_BIN_SEARCH_PATH}) + endforeach(dir) + + if (OGRE_PREFIX_DEPENDENCIES_DIR) + set(OGRE_INC_SEARCH_PATH ${OGRE_PREFIX_DEPENDENCIES_DIR}/include ${OGRE_INC_SEARCH_PATH}) + set(OGRE_LIB_SEARCH_PATH ${OGRE_PREFIX_DEPENDENCIES_DIR}/lib ${OGRE_LIB_SEARCH_PATH}) + set(OGRE_BIN_SEARCH_PATH ${OGRE_PREFIX_DEPENDENCIES_DIR}/bin ${OGRE_BIN_SEARCH_PATH}) + endif() +else() + set(OGRE_PREFIX_SOURCE "NOTFOUND") + set(OGRE_PREFIX_BUILD "NOTFOUND") +endif () + +# redo search if any of the environmental hints changed +set(OGRE_COMPONENTS Paging Terrain + Plugin_BSPSceneManager Plugin_CgProgramManager Plugin_OctreeSceneManager + Plugin_OctreeZone Plugin_PCZSceneManager Plugin_ParticleFX + RenderSystem_Direct3D11 RenderSystem_Direct3D9 RenderSystem_GL RenderSystem_GLES RenderSystem_GLES2) +set(OGRE_RESET_VARS + OGRE_CONFIG_INCLUDE_DIR OGRE_INCLUDE_DIR + OGRE_LIBRARY_FWK OGRE_LIBRARY_REL OGRE_LIBRARY_DBG + OGRE_PLUGIN_DIR_DBG OGRE_PLUGIN_DIR_REL OGRE_MEDIA_DIR) +foreach (comp ${OGRE_COMPONENTS}) + set(OGRE_RESET_VARS ${OGRE_RESET_VARS} + OGRE_${comp}_INCLUDE_DIR OGRE_${comp}_LIBRARY_FWK + OGRE_${comp}_LIBRARY_DBG OGRE_${comp}_LIBRARY_REL + ) +endforeach (comp) +set(OGRE_PREFIX_WATCH ${OGRE_PREFIX_PATH} ${OGRE_PREFIX_SOURCE} ${OGRE_PREFIX_BUILD}) +clear_if_changed(OGRE_PREFIX_WATCH ${OGRE_RESET_VARS}) + +# try to locate Ogre via pkg-config +use_pkgconfig(OGRE_PKGC "OGRE${OGRE_LIB_SUFFIX}") + +if(NOT OGRE_BUILD_PLATFORM_APPLE_IOS) + # try to find framework on OSX + findpkg_framework(OGRE) +else() + set(OGRE_LIBRARY_FWK "") +endif() + +# locate Ogre include files +find_path(OGRE_CONFIG_INCLUDE_DIR NAMES OgreBuildSettings.h HINTS ${OGRE_INC_SEARCH_PATH} ${OGRE_FRAMEWORK_INCLUDES} ${OGRE_PKGC_INCLUDE_DIRS} PATH_SUFFIXES "OGRE") +find_path(OGRE_INCLUDE_DIR NAMES OgreRoot.h HINTS ${OGRE_CONFIG_INCLUDE_DIR} ${OGRE_INC_SEARCH_PATH} ${OGRE_FRAMEWORK_INCLUDES} ${OGRE_PKGC_INCLUDE_DIRS} PATH_SUFFIXES "OGRE") +set(OGRE_INCOMPATIBLE FALSE) + +if (OGRE_INCLUDE_DIR) + if (NOT OGRE_CONFIG_INCLUDE_DIR) + set(OGRE_CONFIG_INCLUDE_DIR ${OGRE_INCLUDE_DIR}) + endif () + # determine Ogre version + file(READ ${OGRE_INCLUDE_DIR}/OgrePrerequisites.h OGRE_TEMP_VERSION_CONTENT) + get_preprocessor_entry(OGRE_TEMP_VERSION_CONTENT OGRE_VERSION_MAJOR OGRE_VERSION_MAJOR) + get_preprocessor_entry(OGRE_TEMP_VERSION_CONTENT OGRE_VERSION_MINOR OGRE_VERSION_MINOR) + get_preprocessor_entry(OGRE_TEMP_VERSION_CONTENT OGRE_VERSION_PATCH OGRE_VERSION_PATCH) + get_preprocessor_entry(OGRE_TEMP_VERSION_CONTENT OGRE_VERSION_NAME OGRE_VERSION_NAME) + set(OGRE_VERSION "${OGRE_VERSION_MAJOR}.${OGRE_VERSION_MINOR}.${OGRE_VERSION_PATCH}") + pkg_message(OGRE "Found Ogre ${OGRE_VERSION_NAME} (${OGRE_VERSION})") + + # determine configuration settings + set(OGRE_CONFIG_HEADERS + ${OGRE_CONFIG_INCLUDE_DIR}/OgreBuildSettings.h + ${OGRE_CONFIG_INCLUDE_DIR}/OgreConfig.h + ) + foreach(CFG_FILE ${OGRE_CONFIG_HEADERS}) + if (EXISTS ${CFG_FILE}) + set(OGRE_CONFIG_HEADER ${CFG_FILE}) + break() + endif() + endforeach() + if (OGRE_CONFIG_HEADER) + file(READ ${OGRE_CONFIG_HEADER} OGRE_TEMP_CONFIG_CONTENT) + has_preprocessor_entry(OGRE_TEMP_CONFIG_CONTENT OGRE_STATIC_LIB OGRE_CONFIG_STATIC) + get_preprocessor_entry(OGRE_TEMP_CONFIG_CONTENT OGRE_THREAD_SUPPORT OGRE_CONFIG_THREADS) + get_preprocessor_entry(OGRE_TEMP_CONFIG_CONTENT OGRE_THREAD_PROVIDER OGRE_CONFIG_THREAD_PROVIDER) + get_preprocessor_entry(OGRE_TEMP_CONFIG_CONTENT OGRE_NO_FREEIMAGE OGRE_CONFIG_FREEIMAGE) + if (OGRE_CONFIG_STATIC AND OGRE_STATIC) + elseif (OGRE_CONFIG_STATIC OR OGRE_STATIC) + pkg_message(OGRE "Build type (static, dynamic) does not match the requested one.") + set(OGRE_INCOMPATIBLE TRUE) + endif () + else () + pkg_message(OGRE "Could not determine Ogre build configuration.") + set(OGRE_INCOMPATIBLE TRUE) + endif () +else () + set(OGRE_INCOMPATIBLE FALSE) +endif () + +find_library(OGRE_LIBRARY_REL NAMES ${OGRE_LIBRARY_NAMES} HINTS ${OGRE_LIB_SEARCH_PATH} ${OGRE_PKGC_LIBRARY_DIRS} ${OGRE_FRAMEWORK_SEARCH_PATH} PATH_SUFFIXES "" "release" "relwithdebinfo" "minsizerel") +find_library(OGRE_LIBRARY_DBG NAMES ${OGRE_LIBRARY_NAMES_DBG} HINTS ${OGRE_LIB_SEARCH_PATH} ${OGRE_PKGC_LIBRARY_DIRS} ${OGRE_FRAMEWORK_SEARCH_PATH} PATH_SUFFIXES "" "debug") +make_library_set(OGRE_LIBRARY) + +if(APPLE) + set(OGRE_LIBRARY_DBG ${OGRE_LIB_SEARCH_PATH}) endif() +if (OGRE_INCOMPATIBLE) + set(OGRE_LIBRARY "NOTFOUND") +endif () + +set(OGRE_INCLUDE_DIR ${OGRE_CONFIG_INCLUDE_DIR} ${OGRE_INCLUDE_DIR}) +list(REMOVE_DUPLICATES OGRE_INCLUDE_DIR) +findpkg_finish(OGRE) +add_parent_dir(OGRE_INCLUDE_DIRS OGRE_INCLUDE_DIR) +if (OGRE_SOURCE) + # If working from source rather than SDK, add samples include + set(OGRE_INCLUDE_DIRS ${OGRE_INCLUDE_DIRS} "${OGRE_SOURCE}/Samples/Common/include") +endif() + +mark_as_advanced(OGRE_CONFIG_INCLUDE_DIR OGRE_MEDIA_DIR OGRE_PLUGIN_DIR_REL OGRE_PLUGIN_DIR_DBG) + +if (NOT OGRE_FOUND) + return() +endif () + + +# look for required Ogre dependencies in case of static build and/or threading +if (OGRE_STATIC) + set(OGRE_DEPS_FOUND TRUE) + find_package(Cg QUIET) + find_package(DirectX QUIET) + find_package(FreeImage QUIET) + find_package(Freetype QUIET) + find_package(OpenGL QUIET) + find_package(OpenGLES QUIET) + find_package(OpenGLES2 QUIET) + find_package(ZLIB QUIET) + find_package(ZZip QUIET) + if (UNIX AND NOT APPLE) + find_package(X11 QUIET) + find_library(XAW_LIBRARY NAMES Xaw Xaw7 PATHS ${DEP_LIB_SEARCH_DIR} ${X11_LIB_SEARCH_PATH}) + if (NOT XAW_LIBRARY OR NOT X11_Xt_FOUND) + set(X11_FOUND FALSE) + endif () + endif () + if (APPLE AND NOT OGRE_BUILD_PLATFORM_APPLE_IOS) + find_package(Cocoa QUIET) + find_package(Carbon QUIET) + find_package(CoreVideo QUIET) + if (NOT Cocoa_FOUND OR NOT Carbon_FOUND OR NOT CoreVideo_FOUND) + set(OGRE_DEPS_FOUND FALSE) + endif () + endif () + if (APPLE AND OGRE_BUILD_PLATFORM_APPLE_IOS) + find_package(iPhoneSDK QUIET) + if (NOT iPhoneSDK_FOUND) + set(OGRE_DEPS_FOUND FALSE) + endif () + endif () + + set(OGRE_LIBRARIES ${OGRE_LIBRARIES} ${ZZip_LIBRARIES} ${ZLIB_LIBRARIES} ${FreeImage_LIBRARIES} ${FREETYPE_LIBRARIES} ) + + if (APPLE AND NOT OGRE_BUILD_PLATFORM_APPLE_IOS) + set(OGRE_LIBRARIES ${OGRE_LIBRARIES} ${X11_LIBRARIES} ${X11_Xt_LIBRARIES} ${XAW_LIBRARY} ${X11_Xrandr_LIB} ${Carbon_LIBRARIES} ${Cocoa_LIBRARIES}) + endif() + + if (NOT ZLIB_FOUND OR NOT ZZip_FOUND) + set(OGRE_DEPS_FOUND FALSE) + endif () + if (NOT FreeImage_FOUND AND NOT OGRE_CONFIG_FREEIMAGE) + set(OGRE_DEPS_FOUND FALSE) + endif () + if (NOT FREETYPE_FOUND) + set(OGRE_DEPS_FOUND FALSE) + endif () + if (UNIX AND NOT APPLE) + if (NOT X11_FOUND) + set(OGRE_DEPS_FOUND FALSE) + endif () + endif () + + if (OGRE_CONFIG_THREADS) + if (OGRE_CONFIG_THREAD_PROVIDER EQUAL 1) + find_package(Boost COMPONENTS thread QUIET) + if (NOT Boost_THREAD_FOUND) + set(OGRE_DEPS_FOUND FALSE) + else () + set(OGRE_LIBRARIES ${OGRE_LIBRARIES} ${Boost_LIBRARIES}) + set(OGRE_INCLUDE_DIRS ${OGRE_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS}) + endif () + elseif (OGRE_CONFIG_THREAD_PROVIDER EQUAL 2) + find_package(POCO QUIET) + if (NOT POCO_FOUND) + set(OGRE_DEPS_FOUND FALSE) + else () + set(OGRE_LIBRARIES ${OGRE_LIBRARIES} ${POCO_LIBRARIES}) + set(OGRE_INCLUDE_DIRS ${OGRE_INCLUDE_DIRS} ${POCO_INCLUDE_DIRS}) + endif () + elseif (OGRE_CONFIG_THREAD_PROVIDER EQUAL 3) + find_package(TBB QUIET) + if (NOT TBB_FOUND) + set(OGRE_DEPS_FOUND FALSE) + else () + set(OGRE_LIBRARIES ${OGRE_LIBRARIES} ${TBB_LIBRARIES}) + set(OGRE_INCLUDE_DIRS ${OGRE_INCLUDE_DIRS} ${TBB_INCLUDE_DIRS}) + endif () + endif () + endif () + + if (NOT OGRE_DEPS_FOUND) + pkg_message(OGRE "Could not find all required dependencies for the Ogre package.") + set(OGRE_FOUND FALSE) + endif () +endif () + +if (NOT OGRE_FOUND) + return() +endif () + + +get_filename_component(OGRE_LIBRARY_DIR_REL "${OGRE_LIBRARY_REL}" PATH) +get_filename_component(OGRE_LIBRARY_DIR_DBG "${OGRE_LIBRARY_DBG}" PATH) +set(OGRE_LIBRARY_DIRS ${OGRE_LIBRARY_DIR_REL} ${OGRE_LIBRARY_DIR_DBG}) + +# find binaries +if (NOT OGRE_STATIC) + if (WIN32) + find_file(OGRE_BINARY_REL NAMES "OgreMain.dll" HINTS ${OGRE_BIN_SEARCH_PATH} + PATH_SUFFIXES "" release relwithdebinfo minsizerel) + find_file(OGRE_BINARY_DBG NAMES "OgreMain_d.dll" HINTS ${OGRE_BIN_SEARCH_PATH} + PATH_SUFFIXES "" debug ) + endif() + mark_as_advanced(OGRE_BINARY_REL OGRE_BINARY_DBG) +endif() + + +######################################################### +# Find Ogre components +######################################################### + +set(OGRE_COMPONENT_SEARCH_PATH_REL + ${OGRE_LIBRARY_DIR_REL}/.. + ${OGRE_LIBRARY_DIR_REL}/../.. + ${OGRE_BIN_SEARCH_PATH} +) +set(OGRE_COMPONENT_SEARCH_PATH_DBG + ${OGRE_LIBRARY_DIR_DBG}/.. + ${OGRE_LIBRARY_DIR_DBG}/../.. + ${OGRE_BIN_SEARCH_PATH} +) + +macro(ogre_find_component COMPONENT HEADER) + findpkg_begin(OGRE_${COMPONENT}) + find_path(OGRE_${COMPONENT}_INCLUDE_DIR NAMES ${HEADER} HINTS ${OGRE_INCLUDE_DIRS} ${OGRE_PREFIX_SOURCE} PATH_SUFFIXES ${COMPONENT} OGRE/${COMPONENT} Components/${COMPONENT}/include) + set(OGRE_${COMPONENT}_LIBRARY_NAMES "Ogre${COMPONENT}${OGRE_LIB_SUFFIX}") + get_debug_names(OGRE_${COMPONENT}_LIBRARY_NAMES) + find_library(OGRE_${COMPONENT}_LIBRARY_REL NAMES ${OGRE_${COMPONENT}_LIBRARY_NAMES} HINTS ${OGRE_LIBRARY_DIR_REL} PATH_SUFFIXES "" "release" "relwithdebinfo" "minsizerel") + find_library(OGRE_${COMPONENT}_LIBRARY_DBG NAMES ${OGRE_${COMPONENT}_LIBRARY_NAMES_DBG} HINTS ${OGRE_LIBRARY_DIR_DBG} PATH_SUFFIXES "" "debug") + make_library_set(OGRE_${COMPONENT}_LIBRARY) + findpkg_finish(OGRE_${COMPONENT}) + if (OGRE_${COMPONENT}_FOUND) + # find binaries + if (NOT OGRE_STATIC) + if (WIN32) + find_file(OGRE_${COMPONENT}_BINARY_REL NAMES "Ogre${COMPONENT}.dll" HINTS ${OGRE_COMPONENT_SEARCH_PATH_REL} PATH_SUFFIXES "" bin bin/release bin/relwithdebinfo bin/minsizerel release) + find_file(OGRE_${COMPONENT}_BINARY_DBG NAMES "Ogre${COMPONENT}_d.dll" HINTS ${OGRE_COMPONENT_SEARCH_PATH_DBG} PATH_SUFFIXES "" bin bin/debug debug) + endif() + mark_as_advanced(OGRE_${COMPONENT}_BINARY_REL OGRE_${COMPONENT}_BINARY_DBG) + endif() + endif() +endmacro() + +# look for Paging component +ogre_find_component(Paging OgrePaging.h) +# look for Terrain component +ogre_find_component(Terrain OgreTerrain.h) +# look for Property component +ogre_find_component(Property OgreProperty.h) +# look for RTShaderSystem component +ogre_find_component(RTShaderSystem OgreRTShaderSystem.h) + + +######################################################### +# Find Ogre plugins +######################################################### + +macro(ogre_find_plugin PLUGIN HEADER) + # On Unix, the plugins might have no prefix + if (CMAKE_FIND_LIBRARY_PREFIXES) + set(TMP_CMAKE_LIB_PREFIX ${CMAKE_FIND_LIBRARY_PREFIXES}) + set(CMAKE_FIND_LIBRARY_PREFIXES ${CMAKE_FIND_LIBRARY_PREFIXES} "") + endif() + + # strip RenderSystem_ or Plugin_ prefix from plugin name + string(REPLACE "RenderSystem_" "" PLUGIN_TEMP ${PLUGIN}) + string(REPLACE "Plugin_" "" PLUGIN_NAME ${PLUGIN_TEMP}) + + # header files for plugins are not usually needed, but find them anyway if they are present + set(OGRE_PLUGIN_PATH_SUFFIXES + PlugIns PlugIns/${PLUGIN_NAME} Plugins Plugins/${PLUGIN_NAME} ${PLUGIN} + RenderSystems RenderSystems/${PLUGIN_NAME} ${ARGN}) + find_path(OGRE_${PLUGIN}_INCLUDE_DIR NAMES ${HEADER} + HINTS ${OGRE_INCLUDE_DIRS} ${OGRE_PREFIX_SOURCE} + PATH_SUFFIXES ${OGRE_PLUGIN_PATH_SUFFIXES}) + # find link libraries for plugins + set(OGRE_${PLUGIN}_LIBRARY_NAMES "${PLUGIN}${OGRE_LIB_SUFFIX}") + get_debug_names(OGRE_${PLUGIN}_LIBRARY_NAMES) + set(OGRE_${PLUGIN}_LIBRARY_FWK ${OGRE_LIBRARY_FWK}) + find_library(OGRE_${PLUGIN}_LIBRARY_REL NAMES ${OGRE_${PLUGIN}_LIBRARY_NAMES} + HINTS ${OGRE_LIBRARY_DIRS} PATH_SUFFIXES "" OGRE opt release release/opt relwithdebinfo relwithdebinfo/opt minsizerel minsizerel/opt) + find_library(OGRE_${PLUGIN}_LIBRARY_DBG NAMES ${OGRE_${PLUGIN}_LIBRARY_NAMES_DBG} + HINTS ${OGRE_LIBRARY_DIRS} PATH_SUFFIXES "" OGRE opt debug debug/opt) + make_library_set(OGRE_${PLUGIN}_LIBRARY) + + if (OGRE_${PLUGIN}_LIBRARY OR OGRE_${PLUGIN}_INCLUDE_DIR) + set(OGRE_${PLUGIN}_FOUND TRUE) + if (OGRE_${PLUGIN}_INCLUDE_DIR) + set(OGRE_${PLUGIN}_INCLUDE_DIRS ${OGRE_${PLUGIN}_INCLUDE_DIR}) + endif() + set(OGRE_${PLUGIN}_LIBRARIES ${OGRE_${PLUGIN}_LIBRARY}) + endif () + + mark_as_advanced(OGRE_${PLUGIN}_INCLUDE_DIR OGRE_${PLUGIN}_LIBRARY_REL OGRE_${PLUGIN}_LIBRARY_DBG OGRE_${PLUGIN}_LIBRARY_FWK) + + # look for plugin dirs + if (OGRE_${PLUGIN}_FOUND) + if (NOT OGRE_PLUGIN_DIR_REL OR NOT OGRE_PLUGIN_DIR_DBG) + if (WIN32) + set(OGRE_PLUGIN_SEARCH_PATH_REL + ${OGRE_LIBRARY_DIR_REL}/.. + ${OGRE_LIBRARY_DIR_REL}/../.. + ${OGRE_BIN_SEARCH_PATH} + ) + set(OGRE_PLUGIN_SEARCH_PATH_DBG + ${OGRE_LIBRARY_DIR_DBG}/.. + ${OGRE_LIBRARY_DIR_DBG}/../.. + ${OGRE_BIN_SEARCH_PATH} + ) + find_path(OGRE_PLUGIN_DIR_REL NAMES "${PLUGIN}.dll" HINTS ${OGRE_PLUGIN_SEARCH_PATH_REL} + PATH_SUFFIXES "" bin bin/release bin/relwithdebinfo bin/minsizerel release) + find_path(OGRE_PLUGIN_DIR_DBG NAMES "${PLUGIN}_d.dll" HINTS ${OGRE_PLUGIN_SEARCH_PATH_DBG} + PATH_SUFFIXES "" bin bin/debug debug) + elseif (UNIX) + get_filename_component(OGRE_PLUGIN_DIR_TMP ${OGRE_${PLUGIN}_LIBRARY_REL} PATH) + set(OGRE_PLUGIN_DIR_REL ${OGRE_PLUGIN_DIR_TMP} CACHE STRING "Ogre plugin dir (release)" FORCE) + get_filename_component(OGRE_PLUGIN_DIR_TMP ${OGRE_${PLUGIN}_LIBRARY_DBG} PATH) + set(OGRE_PLUGIN_DIR_DBG ${OGRE_PLUGIN_DIR_TMP} CACHE STRING "Ogre plugin dir (debug)" FORCE) + endif () + endif () + + # find binaries + if (NOT OGRE_STATIC) + if (WIN32) + find_file(OGRE_${PLUGIN}_REL NAMES "${PLUGIN}.dll" HINTS ${OGRE_PLUGIN_DIR_REL}) + find_file(OGRE_${PLUGIN}_DBG NAMES "${PLUGIN}_d.dll" HINTS ${OGRE_PLUGIN_DIR_DBG}) + endif() + mark_as_advanced(OGRE_${PLUGIN}_REL OGRE_${PLUGIN}_DBG) + endif() + + endif () + + if (TMP_CMAKE_LIB_PREFIX) + set(CMAKE_FIND_LIBRARY_PREFIXES ${TMP_CMAKE_LIB_PREFIX}) + endif () +endmacro(ogre_find_plugin) + +ogre_find_plugin(Plugin_PCZSceneManager OgrePCZSceneManager.h PCZ PlugIns/PCZSceneManager/include) +ogre_find_plugin(Plugin_OctreeZone OgreOctreeZone.h PCZ PlugIns/OctreeZone/include) +ogre_find_plugin(Plugin_BSPSceneManager OgreBspSceneManager.h PlugIns/BSPSceneManager/include) +ogre_find_plugin(Plugin_CgProgramManager OgreCgProgram.h PlugIns/CgProgramManager/include) +ogre_find_plugin(Plugin_OctreeSceneManager OgreOctreeSceneManager.h PlugIns/OctreeSceneManager/include) +ogre_find_plugin(Plugin_ParticleFX OgreParticleFXPrerequisites.h PlugIns/ParticleFX/include) +ogre_find_plugin(RenderSystem_GL OgreGLRenderSystem.h RenderSystems/GL/include) +ogre_find_plugin(RenderSystem_GLES OgreGLESRenderSystem.h RenderSystems/GLES/include) +ogre_find_plugin(RenderSystem_GLES2 OgreGLES2RenderSystem.h RenderSystems/GLES2/include) +ogre_find_plugin(RenderSystem_Direct3D9 OgreD3D9RenderSystem.h RenderSystems/Direct3D9/include) +ogre_find_plugin(RenderSystem_Direct3D11 OgreD3D11RenderSystem.h RenderSystems/Direct3D11/include) + +if (OGRE_STATIC) + # check if dependencies for plugins are met + if (NOT DirectX_FOUND) + set(OGRE_RenderSystem_Direct3D9_FOUND FALSE) + endif () + if (NOT DirectX_D3D11_FOUND) + set(OGRE_RenderSystem_Direct3D11_FOUND FALSE) + endif () + if (NOT OPENGL_FOUND) + set(OGRE_RenderSystem_GL_FOUND FALSE) + endif () + if (NOT OPENGLES_FOUND) + set(OGRE_RenderSystem_GLES_FOUND FALSE) + endif () + if (NOT OPENGLES2_FOUND) + set(OGRE_RenderSystem_GLES2_FOUND FALSE) + endif () + if (NOT Cg_FOUND) + set(OGRE_Plugin_CgProgramManager_FOUND FALSE) + endif () + + set(OGRE_RenderSystem_Direct3D9_LIBRARIES ${OGRE_RenderSystem_Direct3D9_LIBRARIES} + ${DirectX_LIBRARIES} + ) + + set(OGRE_RenderSystem_Direct3D11_LIBRARIES ${OGRE_RenderSystem_Direct3D11_LIBRARIES} + ${DirectX_D3D11_LIBRARIES} + ) + set(OGRE_RenderSystem_GL_LIBRARIES ${OGRE_RenderSystem_GL_LIBRARIES} + ${OPENGL_LIBRARIES} + ) + set(OGRE_RenderSystem_GLES_LIBRARIES ${OGRE_RenderSystem_GLES_LIBRARIES} + ${OPENGLES_LIBRARIES} + ) + set(OGRE_RenderSystem_GLES2_LIBRARIES ${OGRE_RenderSystem_GLES2_LIBRARIES} + ${OPENGLES2_LIBRARIES} + ) + set(OGRE_Plugin_CgProgramManager_LIBRARIES ${OGRE_Plugin_CgProgramManager_LIBRARIES} + ${Cg_LIBRARIES} + ) +endif () + +# look for the media directory +set(OGRE_MEDIA_SEARCH_PATH + ${OGRE_SOURCE} + ${OGRE_LIBRARY_DIR_REL}/.. + ${OGRE_LIBRARY_DIR_DBG}/.. + ${OGRE_LIBRARY_DIR_REL}/../.. + ${OGRE_LIBRARY_DIR_DBG}/../.. + ${OGRE_PREFIX_SOURCE} +) +set(OGRE_MEDIA_SEARCH_SUFFIX + Samples/Media + Media + media + share/OGRE/media +) -IF (OGRE_INCLUDE_DIR AND OGRE_LIBRARIES) - SET(OGRE_FOUND TRUE) -ENDIF (OGRE_INCLUDE_DIR AND OGRE_LIBRARIES) - -IF (OGRE_FOUND) - IF (NOT OGRE_FIND_QUIETLY) - MESSAGE(STATUS " libraries : ${OGRE_LIBRARIES} from ${OGRE_LIB_DIR}") - MESSAGE(STATUS " includes : ${OGRE_INCLUDE_DIR}") - MESSAGE(STATUS " plugins : ${OGRE_PLUGIN_DIR}") - ENDIF (NOT OGRE_FIND_QUIETLY) -ELSE (OGRE_FOUND) - IF (OGRE_FIND_REQUIRED) - MESSAGE(FATAL_ERROR "Could not find OGRE") - ENDIF (OGRE_FIND_REQUIRED) -ENDIF (OGRE_FOUND) - -CMAKE_POLICY(POP) +clear_if_changed(OGRE_PREFIX_WATCH OGRE_MEDIA_DIR) +find_path(OGRE_MEDIA_DIR NAMES packs/cubemapsJS.zip HINTS ${OGRE_MEDIA_SEARCH_PATH} + PATHS ${OGRE_PREFIX_PATH} PATH_SUFFIXES ${OGRE_MEDIA_SEARCH_SUFFIX}) diff --git a/cmake/FindPkgMacros.cmake b/cmake/FindPkgMacros.cmake index da3303ac5..473b27b2a 100644 --- a/cmake/FindPkgMacros.cmake +++ b/cmake/FindPkgMacros.cmake @@ -50,6 +50,11 @@ endmacro(create_search_paths) # clear cache variables if a certain variable changed macro(clear_if_changed TESTVAR) # test against internal check variable + # HACK: Apparently, adding a variable to the cache cleans up the list + # a bit. We need to also remove any empty strings from the list, but + # at the same time ensure that we are actually dealing with a list. + list(APPEND ${TESTVAR} "") + list(REMOVE_ITEM ${TESTVAR} "") if (NOT "${${TESTVAR}}" STREQUAL "${${TESTVAR}_INT_CHECK}") message(STATUS "${TESTVAR} changed.") foreach(var ${ARGN}) @@ -129,9 +134,18 @@ MACRO(findpkg_framework fwk) /System/Library/Frameworks /Network/Library/Frameworks /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/System/Library/Frameworks/ - ${CMAKE_CURRENT_SOURCE_DIR}/../lib/Release - ${CMAKE_CURRENT_SOURCE_DIR}/../lib/Debug + ${CMAKE_CURRENT_SOURCE_DIR}/lib/Release + ${CMAKE_CURRENT_SOURCE_DIR}/lib/Debug ) + # These could be arrays of paths, add each individually to the search paths + foreach(i ${OGRE_PREFIX_PATH}) + set(${fwk}_FRAMEWORK_PATH ${${fwk}_FRAMEWORK_PATH} ${i}/lib/Release ${i}/lib/Debug) + endforeach(i) + + foreach(i ${OGRE_PREFIX_BUILD}) + set(${fwk}_FRAMEWORK_PATH ${${fwk}_FRAMEWORK_PATH} ${i}/lib/Release ${i}/lib/Debug) + endforeach(i) + FOREACH(dir ${${fwk}_FRAMEWORK_PATH}) SET(fwkpath ${dir}/${fwk}.framework) IF(EXISTS ${fwkpath}) diff --git a/cmake/PreprocessorUtils.cmake b/cmake/PreprocessorUtils.cmake new file mode 100644 index 000000000..38462a98d --- /dev/null +++ b/cmake/PreprocessorUtils.cmake @@ -0,0 +1,60 @@ +#------------------------------------------------------------------- +# This file is part of the CMake build system for OGRE +# (Object-oriented Graphics Rendering Engine) +# For the latest info, see http://www.ogre3d.org/ +# +# The contents of this file are placed in the public domain. Feel +# free to make use of it in any way you like. +#------------------------------------------------------------------- + +macro(get_preprocessor_entry CONTENTS KEYWORD VARIABLE) + string(REGEX MATCH + "# *define +${KEYWORD} +((\"([^\n]*)\")|([^ \n]*))" + PREPROC_TEMP_VAR + ${${CONTENTS}} + ) + if (CMAKE_MATCH_3) + set(${VARIABLE} ${CMAKE_MATCH_3}) + else () + set(${VARIABLE} ${CMAKE_MATCH_4}) + endif () +endmacro() + +macro(has_preprocessor_entry CONTENTS KEYWORD VARIABLE) + string(REGEX MATCH + "\n *# *define +(${KEYWORD})" + PREPROC_TEMP_VAR + ${${CONTENTS}} + ) + if (CMAKE_MATCH_1) + set(${VARIABLE} TRUE) + else () + set(${VARIABLE} FALSE) + endif () +endmacro() + +macro(replace_preprocessor_entry VARIABLE KEYWORD NEW_VALUE) + string(REGEX REPLACE + "(// *)?# *define +${KEYWORD} +[^ \n]*" + "#define ${KEYWORD} ${NEW_VALUE}" + ${VARIABLE}_TEMP + ${${VARIABLE}} + ) + set(${VARIABLE} ${${VARIABLE}_TEMP}) +endmacro() + +macro(set_preprocessor_entry VARIABLE KEYWORD ENABLE) + if (${ENABLE}) + set(TMP_REPLACE_STR "#define ${KEYWORD}") + else () + set(TMP_REPLACE_STR "// #define ${KEYWORD}") + endif () + string(REGEX REPLACE + "(// *)?# *define +${KEYWORD} *\n" + ${TMP_REPLACE_STR} + ${VARIABLE}_TEMP + ${${VARIABLE}} + ) + set(${VARIABLE} ${${VARIABLE}_TEMP}) +endmacro() + diff --git a/components/esm/esm_reader.hpp b/components/esm/esm_reader.hpp index e5b230748..0420f37cd 100644 --- a/components/esm/esm_reader.hpp +++ b/components/esm/esm_reader.hpp @@ -153,7 +153,7 @@ public: *************************************************************************/ int getVer() { return mCtx.header.version; } - float getFVer() { return *((float*)&mCtx.header.version); } + float getFVer() { if(mCtx.header.version == VER_12) return 1.2; else return 1.3; } int getSpecial() { return mSpf; } const std::string getAuthor() { return mCtx.header.author.toString(); } const std::string getDesc() { return mCtx.header.desc.toString(); } diff --git a/components/esm_store/cell_store.hpp b/components/esm_store/cell_store.hpp index d064312f1..c4bcf84d8 100644 --- a/components/esm_store/cell_store.hpp +++ b/components/esm_store/cell_store.hpp @@ -12,7 +12,6 @@ #include "store.hpp" #include "components/esm/records.hpp" -#include "components/esm/loadcell.hpp" #include #include @@ -36,7 +35,7 @@ namespace ESMS { LiveCellRef(const CellRef& cref, const X* b = NULL) : base(b), ref(cref), mData(ref) {} - + LiveCellRef(const X* b = NULL) : base(b), mData(ref) {} @@ -187,7 +186,7 @@ namespace ESMS ++iter) if (!functor (iter->ref, iter->mData)) return false; - + return true; } diff --git a/extern/caelum/CMakeLists.txt b/extern/caelum/CMakeLists.txt deleted file mode 100755 index b747fefc8..000000000 --- a/extern/caelum/CMakeLists.txt +++ /dev/null @@ -1,66 +0,0 @@ -project(Caelum) - -IF(MSVC) - add_definitions("-D_SCL_SECURE_NO_WARNINGS /wd4305 /wd4244" ) -ENDIF(MSVC) - -ADD_DEFINITIONS(-DCAELUM_STATIC) -INCLUDE_DIRECTORIES( - ${CMAKE_HOME_DIRECTORY}/extern/caelum/include - ${OGRE_INCLUDE_DIR}/Ogre - ) - -file(GLOB_RECURSE CAELUM_SRC src/*) -file(GLOB_RECURSE CAELUM_HDR include/*) - -set(SOURCES ${CAELUM_SRC} ${CAELUM_HDR}) -add_library(caelum STATIC ${SOURCES}) - -# -# Resources -# -SET(CAELUM_RES_DEST "${OpenMW_BINARY_DIR}") - -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/resources/AtmosphereDepth.png "${CAELUM_RES_DEST}/resources/caelum/AtmosphereDepth.png" COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/resources/CaelumGroundFog.cg "${CAELUM_RES_DEST}/resources/caelum/CaelumGroundFog.cg" COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/resources/CaelumLayeredClouds.cg "${CAELUM_RES_DEST}/resources/caelum/CaelumLayeredClouds.cg" COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/resources/CaelumPhaseMoon.cg "${CAELUM_RES_DEST}/resources/caelum/CaelumPhaseMoon.cg" COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/resources/CaelumPointStarfield.cg "${CAELUM_RES_DEST}/resources/caelum/CaelumPointStarfield.cg" COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/resources/CaelumSkyDome.cg "${CAELUM_RES_DEST}/resources/caelum/CaelumSkyDome.cg" COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/resources/CloudCoverLookup.png "${CAELUM_RES_DEST}/resources/caelum/CloudCoverLookup.png" COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/resources/DepthComposer.cg "${CAELUM_RES_DEST}/resources/caelum/DepthComposer.cg" COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/resources/DepthComposer.compositor "${CAELUM_RES_DEST}/resources/caelum/DepthComposer.compositor" COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/resources/DepthComposer.material "${CAELUM_RES_DEST}/resources/caelum/DepthComposer.material" COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/resources/DepthRender.program "${CAELUM_RES_DEST}/resources/caelum/DepthRender.program" COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/resources/EarthClearSky2.png "${CAELUM_RES_DEST}/resources/caelum/EarthClearSky2.png" COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/resources/GroundFog.material "${CAELUM_RES_DEST}/resources/caelum/GroundFog.material" COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/resources/GroundFog.program "${CAELUM_RES_DEST}/resources/caelum/GroundFog.program" COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/resources/Haze.program "${CAELUM_RES_DEST}/resources/caelum/Haze.program" COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/resources/LayeredClouds.material "${CAELUM_RES_DEST}/resources/caelum/LayeredClouds.material" COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/resources/MinimalCompositorVP.cg "${CAELUM_RES_DEST}/resources/caelum/MinimalCompositorVP.cg" COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/resources/MinimalCompositorVP.program "${CAELUM_RES_DEST}/resources/caelum/MinimalCompositorVP.program" COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/resources/moon.material "${CAELUM_RES_DEST}/resources/caelum/moon.material" COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/resources/moon_disc.dds "${CAELUM_RES_DEST}/resources/caelum/moon_disc.dds" COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/resources/noise1.dds "${CAELUM_RES_DEST}/resources/caelum/noise1.dds" COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/resources/noise2.dds "${CAELUM_RES_DEST}/resources/caelum/noise2.dds" COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/resources/noise3.dds "${CAELUM_RES_DEST}/resources/caelum/noise3.dds" COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/resources/noise4.dds "${CAELUM_RES_DEST}/resources/caelum/noise4.dds" COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/resources/PointStarfield.material "${CAELUM_RES_DEST}/resources/caelum/PointStarfield.material" COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/resources/Precipitation.cg "${CAELUM_RES_DEST}/resources/caelum/Precipitation.cg" COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/resources/Precipitation.compositor "${CAELUM_RES_DEST}/resources/caelum/Precipitation.compositor" COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/resources/Precipitation.material "${CAELUM_RES_DEST}/resources/caelum/Precipitation.material" COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/resources/precipitation_drizzle.png "${CAELUM_RES_DEST}/resources/caelum/precipitation_drizzle.png" COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/resources/precipitation_hail.png "${CAELUM_RES_DEST}/resources/caelum/precipitation_hail.png" COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/resources/precipitation_icecrystals.png "${CAELUM_RES_DEST}/resources/caelum/precipitation_icecrystals.png" COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/resources/precipitation_icepellets.png "${CAELUM_RES_DEST}/resources/caelum/precipitation_icepellets.png" COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/resources/precipitation_rain.png "${CAELUM_RES_DEST}/resources/caelum/precipitation_rain.png" COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/resources/precipitation_smallhail.png "${CAELUM_RES_DEST}/resources/caelum/precipitation_smallhail.png" COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/resources/precipitation_snow.png "${CAELUM_RES_DEST}/resources/caelum/precipitation_snow.png" COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/resources/precipitation_snowgrains.png "${CAELUM_RES_DEST}/resources/caelum/precipitation_snowgrains.png" COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/resources/SkyDome.material "${CAELUM_RES_DEST}/resources/caelum/SkyDome.material" COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/resources/sphere.mesh "${CAELUM_RES_DEST}/resources/caelum/sphere.mesh" COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/resources/Starfield.jpg "${CAELUM_RES_DEST}/resources/caelum/Starfield.jpg" COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/resources/Starfield.material "${CAELUM_RES_DEST}/resources/caelum/Starfield.material" COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/resources/Sun.material "${CAELUM_RES_DEST}/resources/caelum/Sun.material" COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/resources/SunGradient.png "${CAELUM_RES_DEST}/resources/caelum/SunGradient.png" COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/resources/sun_disc.png "${CAELUM_RES_DEST}/resources/caelum/sun_disc.png" COPYONLY) diff --git a/extern/caelum/include/Astronomy.h b/extern/caelum/include/Astronomy.h deleted file mode 100644 index ed7d972cb..000000000 --- a/extern/caelum/include/Astronomy.h +++ /dev/null @@ -1,228 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2008 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -#ifndef CAELUM__ASTRONOMY_H -#define CAELUM__ASTRONOMY_H - -#include "CaelumPrerequisites.h" - -namespace Caelum -{ - /** Static class with astronomy routines. - * This class contains various astronomical routines useful in Caelum. - * - * Most of the formulas are from http://stjarnhimlen.se/comp/ppcomp.html - * That site contains much more than was implemented here; it has code - * for determining the positions of all the planets. Only the sun and - * moon are actually useful for caelum. - * - * The formulas are isolated here in pure procedural code for easier - * testing (Tests are done as assertions in the demo). - * - * Precision is vital here, so this class uses Caelum::LongReal(double) - * instead of Ogre::Real(float) for precission. All angles are in degrees - * unless otherwise mentioned. Ogre::Degree and Ogre::Radian use - * Ogre::Real and should be avoided here. - */ - class CAELUM_EXPORT Astronomy - { - private: - Astronomy() {} - - static const LongReal PI; - - /** Normalize an angle to the 0, 360 range. - * @param x The angle to normalize - */ - static LongReal normalizeDegrees (LongReal x); - - /// Convert radians to degrees. - static LongReal radToDeg (LongReal x); - - /// Convert degrees to radians. - static LongReal degToRad (LongReal x); - - static LongReal sinDeg (LongReal x); - static LongReal cosDeg (LongReal x); - static LongReal atan2Deg (LongReal y, LongReal x); - - public: - /// January 1, 2000, noon - static const LongReal J2000; - - /** Convert from ecliptic to ecuatorial spherical coordinates, in radians. - * @param lon Ecliptic longitude - * @param lat Ecliptic latitude - * @param rasc Right ascension - * @param decl Declination - * @warning: This function works in radians. - */ - static void convertEclipticToEquatorialRad ( - LongReal lon, LongReal lat, - LongReal& rasc, LongReal& decl); - - static void convertRectangularToSpherical ( - LongReal x, LongReal y, LongReal z, - LongReal &rasc, LongReal &decl, LongReal &dist); - - static void convertSphericalToRectangular ( - LongReal rasc, LongReal decl, LongReal dist, - LongReal &x, LongReal &y, LongReal &z); - - /** Convert from equatorial to horizontal coordinates. - * This function converts from angles relative to the earth's equator - * to angle relative to the horizon at a given point. - * @param jday Astronomical time as julian day. - * @param longitude Observer's longitude in degrees east. - * @param latitude Observer's latitude in degrees north. - * @param rasc Object's right ascension. - * @param decl Object's declination. - * @param azimuth Object's azimuth (clockwise degrees from true north). - * @param altitude Object's altitude (degrees above the horizon). - */ - static void convertEquatorialToHorizontal ( - LongReal jday, - LongReal longitude, LongReal latitude, - LongReal rasc, LongReal decl, - LongReal &azimuth, LongReal &altitude); - - /** Get the sun's position in the sky in, relative to the horizon. - * @param jday Astronomical time as julian day. - * @param longitude Observer longitude - * @param latitude Observer latitude - * @param azimuth Astronomical azimuth, measured clockwise from North = 0. - * @param altitude Astronomical altitude, elevation above the horizon. - */ - static void getHorizontalSunPosition ( - LongReal jday, - LongReal longitude, LongReal latitude, - LongReal &azimuth, LongReal &altitude); - - static void getHorizontalSunPosition ( - LongReal jday, - Ogre::Degree longitude, Ogre::Degree latitude, - Ogre::Degree &azimuth, Ogre::Degree &altitude); - - /// Gets the moon position at a specific time in ecliptic coordinates - /// @param lon: Ecliptic longitude, in radians. - /// @param lat: Ecliptic latitude, in radians. - static void getEclipticMoonPositionRad ( - LongReal jday, - LongReal &lon, - LongReal &lat); - - static void getHorizontalMoonPosition ( - LongReal jday, - LongReal longitude, LongReal latitude, - LongReal &azimuth, LongReal &altitude); - static void getHorizontalMoonPosition ( - LongReal jday, - Ogre::Degree longitude, Ogre::Degree latitude, - Ogre::Degree &azimuth, Ogre::Degree &altitude); - - /** Get astronomical julian day from normal gregorian calendar. - * From wikipedia: the integer number of days that have elapsed - * since the initial epoch defined as - * noon Universal Time (UT) Monday, January 1, 4713 BC - * @note this is the time at noon, not midnight. - */ - static int getJulianDayFromGregorianDate ( - int year, int month, int day); - - /** Get astronomical julian day from normal gregorian calendar. - * Calculate julian day from a day in the normal gregorian calendar. - * Time should be given as UTC. - * @see http://en.wikipedia.org/wiki/Julian_day - */ - static LongReal getJulianDayFromGregorianDateTime ( - int year, int month, int day, - int hour, int minute, LongReal second); - - /** Get astronomical julian day from normal gregorian calendar. - * @see above (I don't know the proper doxygen syntax). - */ - static LongReal getJulianDayFromGregorianDateTime ( - int year, int month, int day, - LongReal secondsFromMidnight); - - /// Get gregorian date from integer julian day. - static void getGregorianDateFromJulianDay ( - int julianDay, int &year, int &month, int &day); - - /// Get gregorian date time from floating point julian day. - static void getGregorianDateTimeFromJulianDay ( - LongReal julianDay, int &year, int &month, int &day, - int &hour, int &minute, LongReal &second); - - /// Get gregorian date from floating point julian day. - static void getGregorianDateFromJulianDay ( - LongReal julianDay, int &year, int &month, int &day); - - /** Enter high-precission floating-point mode. - * - * By default Direct3D decreases the precission of ALL floating - * point calculations, enough to stop Caelum's astronomy routines - * from working correctly. - * - * To trigger this behaviour in a standard ogre demo select the - * Direct3D render system and set "Floating-point mode" to - * "Fastest". Otherwise it's not a problem. - * - * It can be fixed by changing the precission only inside caelum's - * astronomy routines using the _controlfp function. This only works - * for MSVC on WIN32; This is a no-op on other compilers. - * - * @note: Must be paired with restoreFloatingPointMode. - * @return Value to pass to restoreFloatingModeMode. - */ - static int enterHighPrecissionFloatingPointMode (); - - /** Restore old floating point precission. - * @see enterHighPrecissionFloatingPointMode. - */ - static void restoreFloatingPointMode (int oldMode); - }; - - /** Dummy class to increase floting point precission in a block - * This class will raise precission in the ctor and restore it - * in the destructor. During it's lifetime floating-point - * precission will be increased. - * - * To use this class just create a instance on the stack at the start of a block. - * - * @see Astronomy::enterHighPrecissionFloatingPointMode - */ - class CAELUM_EXPORT ScopedHighPrecissionFloatSwitch - { - private: - int mOldFpMode; - - public: - inline ScopedHighPrecissionFloatSwitch() { - mOldFpMode = Astronomy::enterHighPrecissionFloatingPointMode (); - } - - inline ~ScopedHighPrecissionFloatSwitch() { - Astronomy::restoreFloatingPointMode (mOldFpMode); - } - }; -} - -#endif // CAELUM__ASTRONOMY_H diff --git a/extern/caelum/include/Caelum.h b/extern/caelum/include/Caelum.h deleted file mode 100644 index 56eabeb87..000000000 --- a/extern/caelum/include/Caelum.h +++ /dev/null @@ -1,44 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2006-2008 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -#ifndef CAELUM_H -#define CAELUM_H - -#include "CaelumPrerequisites.h" -#include "CaelumScriptTranslator.h" -#include "TypeDescriptor.h" -#include "CaelumPlugin.h" -#include "CaelumExceptions.h" -#include "CaelumSystem.h" -#include "CameraBoundElement.h" -#include "SkyDome.h" -#include "Sun.h" -#include "Moon.h" -#include "UniversalClock.h" -#include "Astronomy.h" -#include "CloudSystem.h" -#include "PrecipitationController.h" -#include "FlatCloudLayer.h" -#include "ImageStarfield.h" -#include "PointStarfield.h" -#include "GroundFog.h" -#include "DepthComposer.h" - -#endif // CAELUM_H diff --git a/extern/caelum/include/CaelumExceptions.h b/extern/caelum/include/CaelumExceptions.h deleted file mode 100644 index 7e00297d1..000000000 --- a/extern/caelum/include/CaelumExceptions.h +++ /dev/null @@ -1,54 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2006-2008 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -#ifndef CAELUM__CAELUM_EXCEPTIONS_H -#define CAELUM__CAELUM_EXCEPTIONS_H - -#include "CaelumPrerequisites.h" - -namespace Caelum -{ - /** Exception class for unsupported features. - * This is frequently thrown if a certain required material does not load; - * most likely because the hardware does not support the required shaders. - */ - class CAELUM_EXPORT UnsupportedException : public Ogre::Exception - { - public: - /// Constructor. - UnsupportedException - ( - int number, - const Ogre::String &description, - const Ogre::String &source, - const char *file, - long line - ): - Ogre::Exception (number, description, source, "UnsupportedException", file, line) - { - } - }; - -#define CAELUM_THROW_UNSUPPORTED_EXCEPTION(desc, src) \ - throw UnsupportedException(-1, (desc), (src), __FILE__, __LINE__); - -} - -#endif // CAELUM__CAELUM_EXCEPTIONS_H diff --git a/extern/caelum/include/CaelumPlugin.h b/extern/caelum/include/CaelumPlugin.h deleted file mode 100644 index 454286657..000000000 --- a/extern/caelum/include/CaelumPlugin.h +++ /dev/null @@ -1,97 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2008 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -#ifndef CAELUM__CAELUM_PLUGIN_H -#define CAELUM__CAELUM_PLUGIN_H - -#include "CaelumPrerequisites.h" -#include "CaelumScriptTranslator.h" -#include "TypeDescriptor.h" -#include "OgrePlugin.h" - -namespace Caelum -{ - /** Implement an Ogre::Plugin for Caelum. - * - * Ogre plugins are usually loaded from config files and they register - * various stuff in ogre managers. But you can also just link to the - * library normally and call install functions manually. - */ - class CAELUM_EXPORT CaelumPlugin: public Ogre::Singleton, public Ogre::Plugin - { - public: - /// Get reference to singleton instance; or crash if N/A. - static CaelumPlugin& getSingleton(void); - /// Get pointer to singleton instance; or pointer if N/A. - static CaelumPlugin* getSingletonPtr(void); - - CaelumPlugin(); - ~CaelumPlugin(); - - virtual void install (); - virtual void initialise (); - virtual void shutdown (); - virtual void uninstall (); - - static const Ogre::String CAELUM_PLUGIN_NAME; - virtual const String& getName () const; - - // Determine if the plugin was installed (if install was called). - inline bool isInstalled () const { return mIsInstalled; } - - private: - bool mIsInstalled; - -#if CAELUM_TYPE_DESCRIPTORS - public: - /// Get default type descriptor data for caelum components. - CaelumDefaultTypeDescriptorData* getTypeDescriptorData () { return &mTypeDescriptorData; } - - private: - CaelumDefaultTypeDescriptorData mTypeDescriptorData; -#endif - -#if CAELUM_SCRIPT_SUPPORT - public: - /** Load CaelumSystem and it's components from a script file. - * @param sys Target CaelumSystem. - * This is cleared using CaelumSystem::clear before loading. - * If scripting data is not found then this is not modified. - * @param objectName Name of caelum_sky_system from *.os file. - * @param scriptFileGroup The group to search in (unused in Ogre 1.6) - */ - void loadCaelumSystemFromScript ( - CaelumSystem* sys, - const Ogre::String& objectName, - const Ogre::String& scriptFileGroup = Ogre::ResourceGroupManager::AUTODETECT_RESOURCE_GROUP_NAME - ); - - /// @see PropScriptResourceManager - PropScriptResourceManager* getPropScriptResourceManager () { return &mPropScriptResourceManager; } - CaelumScriptTranslatorManager* getScriptTranslatorManager () { return &mScriptTranslatorManager; } - - private: - PropScriptResourceManager mPropScriptResourceManager; - CaelumScriptTranslatorManager mScriptTranslatorManager; -#endif - }; -} - -#endif // CAELUM__CAELUM_PLUGIN_H diff --git a/extern/caelum/include/CaelumPrecompiled.h b/extern/caelum/include/CaelumPrecompiled.h deleted file mode 100644 index e93bd8404..000000000 --- a/extern/caelum/include/CaelumPrecompiled.h +++ /dev/null @@ -1,25 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2006-2007 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -#ifdef __APPLE__ -#include "Ogre/Ogre.h" -#else -#include "Ogre.h" -#endif diff --git a/extern/caelum/include/CaelumPrerequisites.h b/extern/caelum/include/CaelumPrerequisites.h deleted file mode 100644 index 093b3ab5a..000000000 --- a/extern/caelum/include/CaelumPrerequisites.h +++ /dev/null @@ -1,180 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2006-2008 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -#ifndef CAELUM__CAELUM_PREREQUISITES_H -#define CAELUM__CAELUM_PREREQUISITES_H - -// Include external headers -#ifdef __APPLE__ -#include "Ogre/Ogre.h" -#else -#include "Ogre.h" -#endif - -#include - -// Define the dll export qualifier if compiling for Windows -#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32 - #ifdef CAELUM_STATIC - // Don't use dll export qualifier when built as a static lib - #define CAELUM_EXPORT - #elif CAELUM_LIB - #define CAELUM_EXPORT __declspec (dllexport) - #else - #ifdef __MINGW32__ - #define CAELUM_EXPORT - #else - #define CAELUM_EXPORT __declspec (dllimport) - #endif - #endif -#elif OGRE_PLATFORM == OGRE_PLATFORM_APPLE - #define CAELUM_EXPORT __attribute__ ((visibility("default"))) -#else - #define CAELUM_EXPORT -#endif - -// Define the version code -#define CAELUM_VERSION_MAIN 0 -#define CAELUM_VERSION_SEC 5 -#define CAELUM_VERSION_TER 0 -#define CAELUM_VERSION = (CAELUM_VERSION_MAIN << 16) | (CAELUM_VERSION_SEC << 8) | CAELUM_VERSION_TER - -// By default only compile type descriptors for scripting. -#ifndef CAELUM_TYPE_DESCRIPTORS - #if (OGRE_VERSION >= 0x00010600) && OGRE_USE_NEW_COMPILERS - #define CAELUM_TYPE_DESCRIPTORS 1 - #else - #define CAELUM_TYPE_DESCRIPTORS 0 - #endif -#endif - -// Scripting support requires Ogre 1.6 -// Can be also configured on compiler command line -#ifndef CAELUM_SCRIPT_SUPPORT - #if (OGRE_VERSION >= 0x00010600) && OGRE_USE_NEW_COMPILERS - #define CAELUM_SCRIPT_SUPPORT 1 - #else - #define CAELUM_SCRIPT_SUPPORT 0 - #endif -#else - #if !(OGRE_VERSION > 0x00010600) - #error "Caelum script support requires Ogre 1.6." - #endif - #if !(OGRE_USE_NEW_COMPILERS) - #error "Caelum script support requires Ogre 1.6 with OGRE_USE_NEW_COMPILERS." - #endif - #if !(CAELUM_TYPE_DESCRIPTORS) - #error "Caelum script support also requires type descriptors." - #endif -#endif - -/// @file - -/** @mainpage - * - * %Caelum is an Ogre add-on for atmospheric rendering. It is composed of a - * number of small mostly self-contained components and a big - * Caelum::CaelumSystem class which ties them all together in an easy-to-use - * way. - * - * More information is available on the wiki page: - * http://www.ogre3d.org/wiki/index.php/Caelum - * - * You can discuss and report issues in the forum: - * http://www.ogre3d.org/addonforums/viewforum.php?f=21 - */ - -/** Caelum namespace - * - * All of %Caelum is inside this namespace (except for macros). - * - * @note: This was caelum with a lowercase 'c' in version 0.3 - */ -namespace Caelum -{ - // Caelum needs a lot of precission for astronomical calculations. - // Very few calculations use it, and the precission IS required. - typedef double LongReal; - - // Use some ogre types. - using Ogre::uint8; - using Ogre::uint16; - using Ogre::ushort; - using Ogre::uint32; - using Ogre::uint; - - using Ogre::Real; - using Ogre::String; - - /// Resource group name for caelum resources. - static const String RESOURCE_GROUP_NAME = "Caelum"; - - // Render group for caelum stuff - // It's best to have them all together - enum CaelumRenderQueueGroupId - { - CAELUM_RENDER_QUEUE_STARFIELD = Ogre::RENDER_QUEUE_SKIES_EARLY + 0, - CAELUM_RENDER_QUEUE_MOON_BACKGROUND = Ogre::RENDER_QUEUE_SKIES_EARLY + 1, - CAELUM_RENDER_QUEUE_SKYDOME = Ogre::RENDER_QUEUE_SKIES_EARLY + 2, - CAELUM_RENDER_QUEUE_MOON = Ogre::RENDER_QUEUE_SKIES_EARLY + 3, - CAELUM_RENDER_QUEUE_SUN = Ogre::RENDER_QUEUE_SKIES_EARLY + 4, - CAELUM_RENDER_QUEUE_CLOUDS = Ogre::RENDER_QUEUE_SKIES_EARLY + 5, - CAELUM_RENDER_QUEUE_GROUND_FOG = Ogre::RENDER_QUEUE_SKIES_EARLY + 6, - }; - - // Forward declarations - class UniversalClock; - class SkyDome; - class BaseSkyLight; - class Moon; - class SphereSun; - class SpriteSun; - class ImageStarfield; - class PointStarfield; - class CloudSystem; - class CaelumSystem; - class FlatCloudLayer; - class PrecipitationController; - class PrecipitationInstance; - class GroundFog; - class DepthComposer; - class DepthComposerInstance; - class DepthRenderer; -} - -namespace Ogre -{ -#if OGRE_VERSION <= 0x010602 - // Write an Ogre::Degree to a stream. - // - // Ogre::Any requires that the wrapped type can be written to a stream; - // otherwise it will fail on instantation. This function was placed here - // so it's available everywhere. This can't be placed in namespace Caelum. - // - // Ogre 1.6.3 and up already include this operator; so it's ifdefed out. - // - // This function is never actually used; the output does not matter. - inline std::ostream& operator << (std::ostream& out, Ogre::Degree deg) { - return out << deg.valueDegrees(); - } -#endif -} - -#endif // CAELUM__CAELUM_PREREQUISITES_H diff --git a/extern/caelum/include/CaelumScriptTranslator.h b/extern/caelum/include/CaelumScriptTranslator.h deleted file mode 100644 index d12508726..000000000 --- a/extern/caelum/include/CaelumScriptTranslator.h +++ /dev/null @@ -1,216 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2008 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -#ifndef CAELUM__CAELUM_SCRIPT_TRANSLATOR_H -#define CAELUM__CAELUM_SCRIPT_TRANSLATOR_H - -#if CAELUM_SCRIPT_SUPPORT - -#include "CaelumPrerequisites.h" -#include "OgreScriptTranslator.h" -#include "TypeDescriptor.h" - -namespace Caelum -{ - /** Dummy resources created for property script blocks. - * - * When parsing material scripts the singleton rendersystem is available - * and materials are created using it. But Caelum's scriptable components - * require at least an active scene scene manager; and you can't require - * something like that when initializing resources. - * - * So instead a dummy resource like this is created which only remembers - * the location of the script block in the resources. Actually loading the - * properties will always reparse the script. - * - * The original file name is available from Ogre::Resource::getOrigin - * - * These resources are managed by the PropScriptResourceManager. Resource - * operations like loading and unloading are meaningless. - */ - class CAELUM_EXPORT PropScriptResource: public Ogre::Resource { - protected: - virtual void loadImpl () { } - virtual void unloadImpl () { } - virtual size_t calculateSize () const { return 0; } - - public: - PropScriptResource ( - Ogre::ResourceManager* creator, const Ogre::String& name, Ogre::ResourceHandle handle, - const Ogre::String& group, bool isManual, Ogre::ManualResourceLoader* loader); - ~PropScriptResource(); - }; - - /** Resource manager for PropScriptResource. - */ - class CAELUM_EXPORT PropScriptResourceManager: public Ogre::ResourceManager - { - public: - PropScriptResourceManager(); - - virtual PropScriptResource* createImpl( - const String& name, Ogre::ResourceHandle handle, const String& group, - bool isManual, Ogre::ManualResourceLoader* loader, const Ogre::NameValuePairList* createParams); - }; - - /** An Ogre::ScriptTranslator based on a TypeDescriptor. - * This class implements an Ogre::ScriptTranslator based on data from a TypeDescriptor. - * - * The target object is never created; it must be passed in the context member of the - * root node. Some other ScriptTranslator must cooperate and set the context member; - * this is similar to how Ogre::PassTranslator depends on Ogre::MaterialTranslator - * setting the context. - * - * Ogre::AbstractNode::context is an Ogre::Any which boxes objects in a way which - * stores the static (compile-time) type at assignment. You must cast the - * object into a void* before setting it as the context. - * - * Most of the actual translation functionality is in static functions; a class can - * translate based on TypeDescriptor data without deriving from this class. - */ - class CAELUM_EXPORT TypeDescriptorScriptTranslator: public Ogre::ScriptTranslator - { - public: - /** Get the value of a property or report the appropriate error. - * @return Success value. - */ - static bool getPropValueOrAddError (Ogre::ScriptCompiler* compiler, Ogre::PropertyAbstractNode* prop, int& value); - static bool getPropValueOrAddError (Ogre::ScriptCompiler* compiler, Ogre::PropertyAbstractNode* prop, float& value); - static bool getPropValueOrAddError (Ogre::ScriptCompiler* compiler, Ogre::PropertyAbstractNode* prop, double& value); - static bool getPropValueOrAddError (Ogre::ScriptCompiler* compiler, Ogre::PropertyAbstractNode* prop, bool& value); - static bool getPropValueOrAddError (Ogre::ScriptCompiler* compiler, Ogre::PropertyAbstractNode* prop, Ogre::Degree& value); - static bool getPropValueOrAddError (Ogre::ScriptCompiler* compiler, Ogre::PropertyAbstractNode* prop, Ogre::ColourValue& value); - static bool getPropValueOrAddError (Ogre::ScriptCompiler* compiler, Ogre::PropertyAbstractNode* prop, Ogre::String& value); - static bool getPropValueOrAddError (Ogre::ScriptCompiler* compiler, Ogre::PropertyAbstractNode* prop, Ogre::Vector3& value); - static bool getPropValueOrAddError (Ogre::ScriptCompiler* compiler, Ogre::PropertyAbstractNode* prop, Ogre::Vector2& value); - - /** Translate a property using a TypeDescriptor; or report error to compiler. - */ - static void translateProperty ( - Ogre::ScriptCompiler* compiler, - Ogre::PropertyAbstractNode* prop, - void* targetObject, - const TypeDescriptor* typeDescriptor); - - public: - explicit TypeDescriptorScriptTranslator (TypeDescriptor* type = 0); - - virtual void translate (Ogre::ScriptCompiler* compiler, const Ogre::AbstractNodePtr& node); - - inline const TypeDescriptor* getTypeDescriptor () const { return mTypeDescriptor; } - inline TypeDescriptor* getTypeDescriptor () { return mTypeDescriptor; } - - private: - TypeDescriptor* mTypeDescriptor; - }; - - /** Script translator for CaelumSystem - */ - struct CAELUM_EXPORT CaelumSystemScriptTranslator: public Ogre::ScriptTranslator - { - public: - CaelumSystemScriptTranslator(); - - virtual void translate (Ogre::ScriptCompiler* compiler, const Ogre::AbstractNodePtr& node); - - void setTranslationTarget (CaelumSystem* target, const Ogre::String& name); - void clearTranslationTarget (); - - inline bool hasTranslationTarget () const { return mTranslationTarget != 0; } - inline bool foundTranslationTarget () const { return mTranslationTargetFound; } - inline CaelumSystem* getTranslationTarget () const { return mTranslationTarget; } - inline const Ogre::String& getTranslationTargetName () const { return mTranslationTargetName; } - - inline void setResourceManager (PropScriptResourceManager* value) { mResourceManager = value; } - inline PropScriptResourceManager* getResourceManager () const { return mResourceManager; } - - private: - PropScriptResourceManager* mResourceManager; - CaelumSystem* mTranslationTarget; - Ogre::String mTranslationTargetName; - bool mTranslationTargetFound; - - public: - /** Type descriptor for CaelumSystem itself. - * This is use for simple top-level properties. - * Components (sun, moon etc) are handled with custom code. - */ - inline const TypeDescriptor* getTypeDescriptor () const { return mTypeDescriptor; } - inline void setTypeDescriptor (const TypeDescriptor* value) { mTypeDescriptor = value; } - - private: - const TypeDescriptor* mTypeDescriptor; - }; - - /** Script translator for CloudSystem - * Caelum::CloudSystem requires a special translator because it's made up of separate layers. - * - * Layers of different types are not supported; only instances of FlatCloudLayer. - * CloudSystem doesn't have any top-level properties. - * - * Overriding works just like for ogre texture units; and you can use name-based overriding. - * Names are not preserved after script translation; they're only used inside Ogre's script - * compilation steps. - */ - struct CAELUM_EXPORT CloudSystemScriptTranslator: public Ogre::ScriptTranslator - { - public: - virtual void translate (Ogre::ScriptCompiler* compiler, const Ogre::AbstractNodePtr& node); - }; - - /** ScriptTranslatorManager for caelum's scriptable objects. - * This class contains Ogre::ScriptTranslators for Caelum components. - */ - class CAELUM_EXPORT CaelumScriptTranslatorManager: public Ogre::ScriptTranslatorManager - { - public: - explicit CaelumScriptTranslatorManager (CaelumDefaultTypeDescriptorData* typeData); - - virtual size_t getNumTranslators () const; - - /// @copydoc Ogre::ScriptTranslatorManager::getTranslator. - virtual Ogre::ScriptTranslator* getTranslator (const Ogre::AbstractNodePtr& node); - - void _setPropScriptResourceManager (PropScriptResourceManager* mgr); - - inline CaelumSystemScriptTranslator* getCaelumSystemTranslator () { return &mCaelumSystemTranslator; } - - private: - CaelumSystemScriptTranslator mCaelumSystemTranslator; - CloudSystemScriptTranslator mCloudSystemTranslator; - TypeDescriptorScriptTranslator mFlatCloudLayerTranslator; - TypeDescriptorScriptTranslator mSunTranslator; - TypeDescriptorScriptTranslator mMoonTranslator; - TypeDescriptorScriptTranslator mPointStarfieldTranslator; - TypeDescriptorScriptTranslator mGroundFogTranslator; - TypeDescriptorScriptTranslator mDepthComposerTranslator; - TypeDescriptorScriptTranslator mPrecipitationTranslator; - TypeDescriptorScriptTranslator mSkyDomeTranslator; - - /// Maps class name to script translator. - /// Does not own memory; just holds pointers to members. - typedef std::map ScriptTranslatorMap; - ScriptTranslatorMap mTranslatorMap; - }; -} - -#endif // CAELUM_SCRIPT_SUPPORT - -#endif // CAELUM__CAELUM_SCRIPT_TRANSLATOR_H diff --git a/extern/caelum/include/CaelumSystem.h b/extern/caelum/include/CaelumSystem.h deleted file mode 100644 index 3c670d03a..000000000 --- a/extern/caelum/include/CaelumSystem.h +++ /dev/null @@ -1,672 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2006-2008 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -#ifndef CAELUM__CAELUM_SYSTEM_H -#define CAELUM__CAELUM_SYSTEM_H - -#include "CaelumPrerequisites.h" -#include "UniversalClock.h" -#include "ImageStarfield.h" -#include "PointStarfield.h" -#include "SkyLight.h" -#include "Sun.h" -#include "Moon.h" -#include "CloudSystem.h" -#include "SkyDome.h" -#include "DepthComposer.h" -#include "PrecipitationController.h" -#include "GroundFog.h" -#include "PrivatePtr.h" - -namespace Caelum -{ - /** This is the "root class" of caelum. - * - * This class is created once for one SceneManager and will render the sky - * for that scene. CaelumSystem will be visible in all viewports on the - * scene and must be notified when those viewports are created and - * destroyed. - * - * @par Components - * - * %Caelum is built from several classes for different sky elements (the sun, - * clouds, etc). Those classes know very little about each other and are - * connected through this class. This class is responsible for tracking and - * updating sub-components. - * - * This class "owns" all of the subcomponents, using std::auto_ptr members. - * When you call functions like setXxx(new Xxx()) this class takes - * ownership of the object's lifetime and will try to update it as - * appropriate. All components are optional; disable one component should - * never cause a crash. When something is broken disabling components one - * by one is a very good way to find the source of the problem. - * - * The constructor can create a bunch of components with default settings - * for you; based on the CaelumSystem::CaelumComponent flags passed. - * - * @par Updating - * - * This class is responsible for updating subcomponents. There are two - * update functions which must be get called to keep CaelumSystem - * functioning properly. One is per-frame and the other is per-camera. - * - * CaelumSystem::updateSubcomponents must be called once per frame to - * advance world time and tie components together. That function will - * set certain properties on the subcomponents making up CaelumSystem - * If you want to force some properties beyond what CaelumSystem does by - * default you can do that AFTER the call to updateSubcompoments. For - * example you can override the moon's phase by calling Moon::setPhase. - * - * CaelumSystem::notifyCameraChanged must be called for each camera - * before rendering with that camera. All viewport tweaks and camera - * movement must be done BEFORE calling this function. This method will - * recenter Caelum's domes on the camera. Also, some subcomponents - * can actually depend on field-of-view and viewport resolution (like - * PointStarfield). - * - * You can register CaelumSystem as an Ogre::FrameListener and - * updateSubcomponents will be automatically called inside Ogre's - * rendering loop (inside frameStarted). If you want more control you - * should call updateSubcomponents in your own main loop. That way you - * can avoid potential issues with the ordering of multiple FrameListeners. - * - * You can register CaelumSystem as an Ogre::RenderTargetListener and - * notifyCameraChanged will be automatically called inside - * preViewportUpdate. That behaviour can be disabled with - * setAutoNotifyCameraChanged(false). It is recommended that you - * call notifyCameraChanged manually before updating viewports. - * - * RenderTargetListener::preViewportUpdate does not work as expected - * when compositors are involved (those inside Caelum or external). - * Compositors plug into preRenderTargetUpdate and render the scene to a - * texture BEFORE preViewportUpdate; this means that notifyCameraChanged - * will execute before the final compositor pass but after actual scene - * rendering. - * - * If notifyCameraChanged is not called correctly the most likely result - * is "flickering" when moving the camera. If you move the camera AFTER - * notifyCameraChanged then the domes will not be positioned correctly - * and will appear to lag slightly after the camera. Since updates are - * always done every frame keeping the camera still will make problems - * disappear. - * - * If you notice z-buffer issues while the camera is still update order - * is probably not the cause. - */ - class CAELUM_EXPORT CaelumSystem: - public Ogre::FrameListener, - public Ogre::RenderTargetListener - { - private: - /// Root of the Ogre engine. - Ogre::Root *mOgreRoot; - - /// Scene manager. - Ogre::SceneManager *mSceneMgr; - - /// Caelum scene node for camera-bound elements (most). - PrivateSceneNodePtr mCaelumCameraNode; - - /// Caelum scene node for ground-bound elements (only clouds currently). - PrivateSceneNodePtr mCaelumGroundNode; - - /// Cleanup requested flag. - bool mCleanup; - - /// Automatically move the camera node. - bool mAutoMoveCameraNode; - - /// Automatically call this->notifyCameraChanged. - bool mAutoNotifyCameraChanged; - - /// Automatically attach compositors to viewports - bool mAutoAttachViewportsToComponents; - - /// Automatically set the viewport colour to black. - bool mAutoViewportBackground; - - /// Flag to indicate if Caelum manages standard Ogre::Scene fog. - bool mManageSceneFog; - - Real mGlobalFogDensityMultiplier; - Ogre::ColourValue mGlobalFogColourMultiplier; - - Real mSceneFogDensityMultiplier; - Ogre::ColourValue mSceneFogColourMultiplier; - - Real mGroundFogDensityMultiplier; - Ogre::ColourValue mGroundFogColourMultiplier; - - /// Flag for managing scene ambient light. - bool mManageAmbientLight; - - /// Minimum ambient light; only useful if mManageAmbientLight - Ogre::ColourValue mMinimumAmbientLight; - - /// If only one light source should enabled at a time. - bool mEnsureSingleLightSource; - - /// Ensure only one of the light sources casts shadows. - bool mEnsureSingleShadowSource; - - /// The sky gradients image (for lookups). - std::auto_ptr mSkyGradientsImage; - - /// The sun gradients image (for lookups). - std::auto_ptr mSunColoursImage; - - /// Observer Latitude (on the earth). - Ogre::Degree mObserverLatitude; - /// Observer Longitude (on the earth). - Ogre::Degree mObserverLongitude; - - static const Ogre::Vector3 makeDirection ( - Ogre::Degree azimuth, Ogre::Degree altitude); - - // References to sub-components - std::auto_ptr mUniversalClock; - std::auto_ptr mSkyDome; - std::auto_ptr mSun; - std::auto_ptr mMoon; - std::auto_ptr mImageStarfield; - std::auto_ptr mPointStarfield; - std::auto_ptr mGroundFog; - std::auto_ptr mCloudSystem; - std::auto_ptr mPrecipitationController; - std::auto_ptr mDepthComposer; - - public: - typedef std::set AttachedViewportSet; - - private: - AttachedViewportSet mAttachedViewports; - - public: - /** Flags enumeration for caelum components. - * This is an enumeration for the components to create by default in - * Caelum's constructor. You can still pass 0 and create everything - * by hand. - * - * CaelumSystem's constructor used to take a number of bools but now - * there are too many components and this is nicer. - * - * CAELUM_COMPONENT_ members are for individual components. - * CAELUM_COMPONENTS_ are standard bitmasks. - * CAELUM_COMPONENTS_DEFAULT picks elements that don't require - * modifications to external materials (right now it excludes ground fog). - */ - enum CaelumComponent - { - CAELUM_COMPONENT_SKY_DOME = 1 << 1, - CAELUM_COMPONENT_MOON = 1 << 3, - CAELUM_COMPONENT_SUN = 1 << 4, - CAELUM_COMPONENT_IMAGE_STARFIELD = 1 << 5, - CAELUM_COMPONENT_POINT_STARFIELD = 1 << 6, - CAELUM_COMPONENT_CLOUDS = 1 << 7, - CAELUM_COMPONENT_PRECIPITATION = 1 << 8, - CAELUM_COMPONENT_SCREEN_SPACE_FOG = 1 << 9, - - // This has nasty dependencies on materials. - CAELUM_COMPONENT_GROUND_FOG = 1 << (16 + 0), - - // Groups - CAELUM_COMPONENTS_NONE = 0, - CAELUM_COMPONENTS_DEFAULT = 0 - | CAELUM_COMPONENT_SKY_DOME - | CAELUM_COMPONENT_MOON - | CAELUM_COMPONENT_SUN - | CAELUM_COMPONENT_POINT_STARFIELD - | CAELUM_COMPONENT_CLOUDS, - CAELUM_COMPONENTS_ALL = 0 - | CAELUM_COMPONENTS_DEFAULT - | CAELUM_COMPONENT_PRECIPITATION - | CAELUM_COMPONENT_SCREEN_SPACE_FOG - | CAELUM_COMPONENT_GROUND_FOG, - }; - - static const String DEFAULT_SKY_GRADIENTS_IMAGE; - static const String DEFAULT_SUN_COLOURS_IMAGE; - - /** Constructor. - * Registers itself in the Ogre engine and initialises the system. - * - * @param root The Ogre root. - * @param scene The Ogre scene manager. - * @param componentsToCreate Default components for @see autoConfigure. - */ - CaelumSystem ( - Ogre::Root *root, - Ogre::SceneManager *sceneMgr, - CaelumComponent componentsToCreate); - - /** Revert everything to defaults. - * - * This function will delete all subcomponents and revert everything - * to default values (the values which are also set on construction). - */ - void clear (); - - /** Create some default component with resonable default settings. - * This results in a slightly cloudy morning sky. - * This will always call clear() before creating components. - * autoConfigure (0); is equivalent to clear(); - */ - void autoConfigure ( - CaelumComponent componentsToCreate); - - /** Destructor. - */ - ~CaelumSystem (); - - /** Shuts down the system and detaches itself from the Ogre engine. - * - * shutdown(true) is equivalent to deleting CaelumSystem yourself. - * shutdown(false) delays destruction to the next time caelum is called as - * a frame listener. This makes it safe to shutdown Caelum from inside - * another frame listener. - * - * @param cleanup If this is true then detach and destroy the CaelumSystem instantly. - */ - void shutdown (bool cleanup); - - /** Update the whole system manually. - * You have to call this yourself if you don't register CaelumSystem - * as an ogre frame listener. Otherwise it's called automatically. - * - * @param timeSinceLastFrame: Time passed since last frame. - */ - void updateSubcomponents (Real timeSinceLastFrame); - - /** Notify subcomponents of camera changes. - * This function must be called after camera changes but before - * rendering with that camera. If multiple cameras are used it must - * be called for each camera before the camera is rendered with. - * - * This function will move caelum's camera node to the camera - * position, but only if getAutoMoveCameraNode. - * It will also call CameraBoundElement::notifyCameraChanged - */ - void notifyCameraChanged(Ogre::Camera* cam); - - /** Get the scene manager for this caelum system. - * This is set in the constructor. CaelumSystem can't exist without a valid scene manager. - */ - inline Ogre::SceneManager* getSceneMgr() const { return mSceneMgr; } - - /// Gets root scene node for camera-bound elements - inline Ogre::SceneNode* getCaelumCameraNode(void) const { return mCaelumCameraNode.get(); } - - /// Gets root scene node for ground-bound elements. - inline Ogre::SceneNode* getCaelumGroundNode(void) const { return mCaelumGroundNode.get(); } - - /** If true; listen to preViewportUpdate and automatically notifyCameraChanged(); - * - * This is on by default; but does not work with compositors. - * - * You must attach CaelumSystem as a RenderTargetListener manually for - * this to work; as in version 0.3. - */ - inline void setAutoNotifyCameraChanged(bool value) { mAutoNotifyCameraChanged = value; } - /// @see setAutoNotifyCameraChanged - inline bool getAutoNotifyCameraChanged() const { return mAutoNotifyCameraChanged; } - - /** If true; automatically attach viewports to subcomponents. - * - * Some subcomponents use compositors and those compositors need to - * be attached to individual viewports. By default CaelumSystem will - * try take to take care of that automatically. - * - * This property allows you to disable that behaviour. If set to false - * you must call functions like - * PrecipitationController::createViewportInstance manually. - * - * @see attachViewport detachViewport - */ - inline void setAutoAttachViewportsToComponents(bool value) { mAutoAttachViewportsToComponents = value; } - /// @see setAutoAttachViewportsToComponents. - inline bool getAutoAttachViewportsToComponents() const { return mAutoAttachViewportsToComponents; } - - /** If true (default); automatically move the camera node in notifyCameraChanged. - * If disable you get full control of the camera node; and in theory - * you can attach it to the scene graph however you please. - */ - inline void setAutoMoveCameraNode(bool value) { mAutoMoveCameraNode = value; } - /// @see setAutoMoveCameraNode - inline bool getAutoMoveCameraNode() { return mAutoMoveCameraNode; } - - /** If true; automatically set the viewport color to black. - * Caelum's domes relies on the viewport background being black. - * There's generally no reason to disable this and it's on by default. - */ - inline void setAutoViewportBackground(bool value) { mAutoViewportBackground = value; } - /// @see setAutoViewportBackground - inline bool getAutoViewportBackground() const { return mAutoViewportBackground; } - - /// Get the observer's longitude. East is positive, west is negative. - inline const Ogre::Degree getObserverLongitude () const { return mObserverLongitude; } - - /// Set the observer's longitude. East is positive, west is negative. - inline void setObserverLongitude (Ogre::Degree value) { mObserverLongitude = value; } - - /// Get the observer's latitude. North is positive, south is negative. - inline const Ogre::Degree getObserverLatitude () const { return mObserverLatitude; } - - /// Set the observer's latitude. North is positive, south is negative. - inline void setObserverLatitude (Ogre::Degree value) { mObserverLatitude = value; } - - inline LongReal getJulianDay () const { return mUniversalClock->getJulianDay (); } - inline void setJulianDay (LongReal value) { mUniversalClock->setJulianDay (value); } - inline Real getTimeScale () const { return mUniversalClock->getTimeScale (); } - inline void setTimeScale (Real value) { mUniversalClock->setTimeScale (value); } - - public: - /** Attach CaelumSystem to a viewport. - * You should call this for every new viewport looking at the scene - * where CaelumSystem is created. - * - * If the viewport is already attached then nothing happens. - * - * If getAutoAttachViewportsToComponents() this will add Caelum's compositors. - */ - void attachViewport (Ogre::Viewport* rt); - - /** Reverse of @see attachViewport. - * You need to call this when you destroy a viewport. - * - * If the viewport is not already attached nothing happens. - */ - void detachViewport (Ogre::Viewport* rt); - - /** Check if one particular viewport is attached. - */ - bool isViewportAttached (Ogre::Viewport* vp) const; - - /** Detach from all viewports. - */ - void detachAllViewports (); - - /// Get a reference to the set of attached viewports. - const AttachedViewportSet& _getAttachedViewportSet () { return mAttachedViewports; } - - protected: - // Do the work behind attach/detach viewport. - void attachViewportImpl (Ogre::Viewport* rt); - void detachViewportImpl (Ogre::Viewport* rt); - - public: - /// Gets the universal clock. - inline UniversalClock *getUniversalClock () const { return mUniversalClock.get(); } - - /// Get the current sky dome, or null if disabled. - inline SkyDome* getSkyDome () const { return mSkyDome.get (); } - /// Set the skydome, or null to disable. - void setSkyDome (SkyDome *obj); - - /// Gets the current sun, or null if disabled. - inline BaseSkyLight* getSun () const { return mSun.get (); } - /// Set the sun, or null to disable. - void setSun (BaseSkyLight* obj); - - /// Gets the current moon, or null if disabled. - inline Moon* getMoon () const { return mMoon.get (); } - /// Set the moon, or null to disable. - void setMoon (Moon* obj); - - /// Gets the current image starfield, or null if disabled. - inline ImageStarfield* getImageStarfield () const { return mImageStarfield.get (); } - /// Set image starfield, or null to disable. - void setImageStarfield (ImageStarfield* obj); - - /// Gets the current point starfield, or null if disabled. - inline PointStarfield* getPointStarfield () const { return mPointStarfield.get (); } - /// Set image starfield, or null to disable. - void setPointStarfield (PointStarfield* obj); - - /// Get ground fog; if enabled. - inline GroundFog* getGroundFog () { return mGroundFog.get (); } - /// Sets ground fog system, or null to disable. - void setGroundFog (GroundFog *obj); - - /// Get cloud system; or null if disabled. - inline CloudSystem* getCloudSystem () { return mCloudSystem.get (); } - /// Set cloud system; or null to disable. - void setCloudSystem (CloudSystem *obj); - - /// Get precipitation controller; or null if disabled. - inline PrecipitationController* getPrecipitationController () { return mPrecipitationController.get (); } - /// Set precipitation controller; or null to disable. - void setPrecipitationController (PrecipitationController *obj); - - /// Get depth composer; or null if disabled. - inline DepthComposer* getDepthComposer () { return mDepthComposer.get (); } - /// Set depth composer; or null to disable. - void setDepthComposer (DepthComposer *obj); - - /** Enables/disables Caelum managing standard Ogre::Scene fog. - This makes CaelumSystem control standard Ogre::Scene fogging. It - will use EXP2 fog with density from SkyColourModel. - - Fog density multipliers are used; final scene fog density is: - SceneMultiplier * GlobalMultiplier * SkyColourModel.GetFogDensity - - When this is set to false it also disables all scene fog (but you - control it afterwards). - - @param value New value - */ - void setManageSceneFog (bool value); - - /** Tells if Caelum is managing the fog or not. - @return The value set in setManageSceneFog. - */ - bool getManageSceneFog () const; - - /** Multiplier for scene fog density (default 1). - This is an additional multiplier for Ogre::Scene fog density. - This has no effect if getManageSceneFog is false. - - Final scene fog density is: - SceneMultiplier * GlobalMultiplier * SkyColourModel.GetFogDensity - */ - void setSceneFogDensityMultiplier (Real value); - - /** Get the value set by setSceneFogDensityMultiplier. - */ - Real getSceneFogDensityMultiplier () const; - - /** Set an additional multiplier for fog colour as it comes from SkyColourModel. - * This is 0.7 by default; to be compatible with previous versions. - */ - inline void setSceneFogColourMultiplier (const Ogre::ColourValue& value) { mSceneFogColourMultiplier = value; } - - /// See setSceneFogColourMultiplier. - inline const Ogre::ColourValue getSceneFogColourMultiplier () const { return mSceneFogColourMultiplier; } - - /** Multiplier for ground fog density (default 1). - * This is an additional multiplier for Caelum::GroundFog DepthComposer ground fog density. - * - * Final ground fog density is: - * GroundFogMultipler * GlobalMultiplier * SkyColourModel.GetFogDensity - */ - void setGroundFogDensityMultiplier (Real value); - - /** Get the value set by setGroundFogDensityMultiplier. - */ - Real getGroundFogDensityMultiplier () const; - - /** Set an additional multiplier for ground fog colour as it comes from SkyColourModel. - * This is OgreColour::White by default; which has no effect. - */ - inline void setGroundFogColourMultiplier (const Ogre::ColourValue& value) { mGroundFogColourMultiplier = value; } - - /// See setGroundFogColourMultiplier. - inline const Ogre::ColourValue getGroundFogColourMultiplier () const { return mGroundFogColourMultiplier; } - - /** Multiplier for global fog density (default 1). - * This is an additional multiplier for fog density as received from - * SkyColourModel. There are other multipliers you can tweak for - * individual kinds of fog; but this is what you should change from - * whatever "game logic" you might have. - */ - void setGlobalFogDensityMultiplier (Real value); - - /** Get the value set by setSceneFogDensityMultiplier. - */ - Real getGlobalFogDensityMultiplier () const; - - /** Set an additional multiplier for fog colour. - * This will also affect stuff like clouds or precipitation. Careful! - * This is OgreColour::White by default; which has no effect. - */ - inline void setGlobalFogColourMultiplier (const Ogre::ColourValue& value) { mGlobalFogColourMultiplier = value; } - - /// See setGlobalFogColourMultiplier. - inline const Ogre::ColourValue getGlobalFogColourMultiplier () const { return mGlobalFogColourMultiplier; } - - /** Set this to true to have CaelumSystem manage the scene's ambient light. - * The colour and AmbientMultiplier of the sun and moon are used. - * This is false by default. - */ - inline void setManageAmbientLight (bool value) { mManageAmbientLight = value; } - - /// Check if CaelumSystem is managing ambient lighting. - inline bool getManageAmbientLight () const { return mManageAmbientLight; } - - /** Set the minimum value for scene ambient lighting, - * This is only used if getManageAmbientLight() is true. - * By default this value is Ogre::ColourValue::Black, so it has no effect. - */ - inline void setMinimumAmbientLight (const Ogre::ColourValue &value) { mMinimumAmbientLight = value; } - - /// @see setMinimumAmbientLight - inline const Ogre::ColourValue getMinimumAmbientLight () const { return mMinimumAmbientLight; } - - /** Ensure only one of caelum's light sources is active at a time (the brightest). - * This uses SkyLight::setForceDisable to disable low-intensity lightsources. - * Their contribution to ambient lighting is not affected. - * This implies a single shadow caster. - * This is disabled by default; and you can tweak light disabling by yourself. - */ - inline void setEnsureSingleLightSource (bool value) { mEnsureSingleLightSource = value; } - - /// See setEnsureSingleLightSource - inline bool getEnsureSingleLightSource () const { return mEnsureSingleLightSource; } - - /** Ensure only one of caelum's light sources casts shadows (the brightest). - * Disabled by default. - */ - inline void setEnsureSingleShadowSource (bool value) { mEnsureSingleShadowSource = value; } - - /// See setEnsureSingleShadowSource - inline bool getEnsureSingleShadowSource () const { return mEnsureSingleShadowSource; } - - /** Gets the fog colour for a certain daytime. - @param time The current time. - @param sunDir The sun direction. - @return The fog colour. - */ - Ogre::ColourValue getFogColour (Real time, const Ogre::Vector3 &sunDir); - - /** Gets the fog density for a certain daytime. - @param time The current time. - @param sunDir The sun direction. - @return The fog density. - */ - Real getFogDensity (Real time, const Ogre::Vector3 &sunDir); - - /** Get the colour of the sun sphere. - * This colour is used to draw the sun sphere in the sky. - * @return The colour of the sun. - */ - Ogre::ColourValue getSunSphereColour (Real time, const Ogre::Vector3 &sunDir); - - /** Gets the colour of sun light. - * This color is used to illuminate the scene. - * @return The colour of the sun's light - */ - Ogre::ColourValue getSunLightColour (Real time, const Ogre::Vector3 &sunDir); - - /// Gets the colour of moon's body. - Ogre::ColourValue getMoonBodyColour (const Ogre::Vector3 &moonDir); - - /// Gets the colour of moon's light. - Ogre::ColourValue getMoonLightColour (const Ogre::Vector3 &moonDir); - - /// Set the sun gradients image. - void setSkyGradientsImage (const Ogre::String &filename = DEFAULT_SKY_GRADIENTS_IMAGE); - - /// Set the sun colours image. - /// Sun colour is taken from this image. - void setSunColoursImage (const Ogre::String &filename = DEFAULT_SUN_COLOURS_IMAGE); - - /** Get the sun's direction at a certain time. - * @param jday astronomical julian day. - * @see UniversalClock for julian day calculations. - */ - const Ogre::Vector3 getSunDirection (LongReal jday); - - /** Get the moon's direction at a certain time. - * @param jday astronomical julian day. - */ - const Ogre::Vector3 getMoonDirection (LongReal jday); - - /** Fake function to get the phase of the moon - * @param jday Julian day - * @return the phase of the moon; ranging from 0(full moon) to 2(new moon). - * The calculations performed by this function are completely fake. - * It's a triangle wave with a period of 28.5 days. - */ - const Ogre::Real getMoonPhase (LongReal jday); - - private: - /** Handle FrameListener::frameStarted to call updateSubcomponents every frame. - * If you don't register CaelumSystem as a an ogre frame listener you have to - * call updateSubcomponents yourself. - */ - virtual bool frameStarted (const Ogre::FrameEvent &e); - - /** Event trigger called just before rendering a viewport in a render target Caelum is attached to. - Useful to make objects follow every camera that renders a viewport in a certain render target. - */ - virtual void preViewportUpdate (const Ogre::RenderTargetViewportEvent &e); - - /** Free all subcomponents, but not CaelumSystem itself. Can be called multiple times. - * @param everything To destroy things that can't be rebuilt. - */ - void destroySubcomponents (bool everything); - - public: - /** Call setQueryFlags for all subcomponents now. - * - * This is not persistent; you can adjust the query masks of - * individual objects afterwards. This also means you should call - * this only after you created all other objects. - * - * Has no effect on compositor-based stuff (precipitation will still show up). - */ - void forceSubcomponentQueryFlags (uint mask); - - /** Same as @see forceSubcomponentQueryMask; but for visibility - */ - void forceSubcomponentVisibilityFlags (uint mask); - }; -} - -#endif // CAELUM__CAELUM_SYSTEM_H diff --git a/extern/caelum/include/CameraBoundElement.h b/extern/caelum/include/CameraBoundElement.h deleted file mode 100644 index baef58f2f..000000000 --- a/extern/caelum/include/CameraBoundElement.h +++ /dev/null @@ -1,112 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2006-2008 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -#ifndef CAELUM__CAMERA_BOUND_ELEMENT_H -#define CAELUM__CAMERA_BOUND_ELEMENT_H - -#include "CaelumPrerequisites.h" - -namespace Caelum -{ - /** A camera-bound element. - * - * This should be used as a base class for domes which follow the camera. - * It is only meant to be used inside Caelum. - * - * By default this class work in autoradius mode; where it automatically - * resizes itself for camera near/far clipping radius. It will correctly - * handle infinite far clip planes. - * - * This is meant to be used with depth_check and depth_write off. - * Trying to place an object "as far as possible" causes precision - * troubles; and was removed in version 0.4. - * - * If far clip distance is finite the radius will be (near + far) / 2. - * If far clip distance is infinite (0) the radius will be 10 * near/ - */ - class CAELUM_EXPORT CameraBoundElement - { - private: - /// Defines if the element has an automatic "far" radius or not. - bool mAutoRadius; - - public: - /** Constructor. Sets auto radius to true. - */ - CameraBoundElement(); - - /// Virtual Destructor. - virtual ~CameraBoundElement (); - - /** Notify new camera conditions. - * This method notifies that a new camera is about to be used, so - * this element can follow it or perform other operations. - * The default implementation calls setRadius if in autoRadius mode. - * @param cam The new camera. - */ - virtual void notifyCameraChanged (Ogre::Camera *cam) = 0; - - /** Forces the "far" size of the element to a specific radius. - * - * If greater than zero this disables AutoRadius mode and forces a - * fixed radius. If this is negative or zero the radius is set - * automatically in notifyCameraChanged. - * - * AutoRadius is turned on by default. - * - * @param radius The positive radius of the element, or a - * negative/zero value for AutoRadius mode. - */ - void forceFarRadius (Ogre::Real radius); - - /** Checks if this element is in auto-radius mode. - * While in autoradius mode the element is automatically resized fit - * between the near and far radius. - */ - bool getAutoRadius () const; - - /** Re-enable auto-radius; if disabled. - * Auto-radius is on by default; but can be disabled. This function - * can turn it back on. - */ - void setAutoRadius (); - - /** Camera distances multiplier for the far clipping distance. - * This threshold will be multiplied with the far clipping distance, - * if the camera doesn't use an infinite far clipping plane. - */ - static const Ogre::Real CAMERA_FAR_DISTANCE_MULTIPLIER; - - /** Camera distances multiplier for the near clipping distance. - * This threshold will be multiplied with the near clipping distance, - * if the camera does use an infinite far clipping plane. - */ - static const Ogre::Real CAMERA_NEAR_DISTANCE_MULTIPLIER; - - protected: - /** Abstract method to set the radius for this elements - * Derived classes should override this and resize their domes. - * The actual radius for the dome is controlled in the base class. - */ - virtual void setFarRadius (Ogre::Real radius); - }; -} - -#endif // CAELUM__CAMERA_BOUND_ELEMENT_H diff --git a/extern/caelum/include/CloudSystem.h b/extern/caelum/include/CloudSystem.h deleted file mode 100644 index ed8994352..000000000 --- a/extern/caelum/include/CloudSystem.h +++ /dev/null @@ -1,89 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2008 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -#ifndef CAELUM__CLOUD_SYSTEM_H -#define CAELUM__CLOUD_SYSTEM_H - -#include "CaelumPrerequisites.h" - -namespace Caelum -{ - /** A cloud system is implemented by a number of cloud layers. - * Different cloud layers could implement different kinds of clouds (cirrus, stratus). - */ - class CAELUM_EXPORT CloudSystem - { - public: - CloudSystem ( - Ogre::SceneManager *sceneMgr, - Ogre::SceneNode *cloudRoot); - - ~CloudSystem(); - - typedef std::vector LayerVector; - - private: - Ogre::SceneManager *mSceneMgr; - Ogre::SceneNode *mCloudRoot; - LayerVector mLayers; - - public: - /** Direct access to the layer vector. - */ - LayerVector& getLayerVector() { return mLayers; } - - /// Clears all cloud layers. - void clearLayers(); - - /// Create a new cloud layer with default settings at height 0. - /// @return pointer to the new layer. - FlatCloudLayer* createLayer(); - - /// Create a new cloud layer with default settings at a certain height. - /// @return pointer to the new layer. - FlatCloudLayer* createLayerAtHeight(Ogre::Real height); - - /// Add new layer. Takes ownership of the layer. - void addLayer(FlatCloudLayer* layer); - - /// Get a pointer to a certain layer. - inline FlatCloudLayer* getLayer(int index) { return mLayers[index]; } - - /// Get the total number of layers. - inline int getLayerCount() { return static_cast (mLayers.size ()); } - - /** Update function called every frame from high above. - */ - void update ( - Ogre::Real timePassed, - const Ogre::Vector3 &sunDirection, - const Ogre::ColourValue &sunLightColour, - const Ogre::ColourValue &fogColour, - const Ogre::ColourValue &sunSphereColour); - - /// Similar to @see CaelumSystem::forceSubcomponentQueryFlags. - virtual void forceLayerQueryFlags (uint flags); - - /// Similar to @see CaelumSystem::forceSubcomponentVisibilityFlags. - virtual void forceLayerVisibilityFlags (uint flags); - }; -} - -#endif // CAELUM__CLOUD_SYSTEM_H diff --git a/extern/caelum/include/DepthComposer.h b/extern/caelum/include/DepthComposer.h deleted file mode 100644 index b71a1e976..000000000 --- a/extern/caelum/include/DepthComposer.h +++ /dev/null @@ -1,280 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2008 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -#ifndef CAELUM__DEPTH_COMPOSER_H -#define CAELUM__DEPTH_COMPOSER_H - -#include "CaelumPrerequisites.h" -#include "FastGpuParamRef.h" - -namespace Caelum -{ - /** Compositor-based precipitation controller. - * This class will add and control precipitation controllers to viewports. - * - * Compositors clone the composing materials. This controller will - * register itself as a compositor listener and change the material in notifyMaterialSetup. - */ - class CAELUM_EXPORT DepthComposer - { - private: - Ogre::SceneManager *mSceneMgr; - - void onCompositorMaterialChanged (); - const String& getCompositorName (); - - protected: - inline Ogre::SceneManager* getSceneManager() const { return mSceneMgr; } - - friend class DepthComposerInstance; - - public: - DepthComposer(Ogre::SceneManager *sceneMgr); - virtual ~DepthComposer(); - - void update (); - - public: - typedef std::map ViewportInstanceMap; - ViewportInstanceMap mViewportInstanceMap; - - public: - DepthComposerInstance* createViewportInstance(Ogre::Viewport* viewport); - void destroyViewportInstance(Ogre::Viewport* viewport); - DepthComposerInstance* getViewportInstance(Ogre::Viewport* viewport); - void destroyAllViewportInstances(); - - private: - bool mDebugDepthRender; - - public: - /// Enables drawing the depth buffer - void setDebugDepthRender (bool value); - bool getDebugDepthRender () const { return mDebugDepthRender; } - - private: - bool mSkyDomeHazeEnabled; - Ogre::Vector3 mSunDirection; - Ogre::ColourValue mHazeColour; - - public: - /// Enables skydome haze. - void setSkyDomeHazeEnabled (bool value); - bool getSkyDomeHazeEnabled () const { return mSkyDomeHazeEnabled; } - - void setSunDirection (const Ogre::Vector3& value) { mSunDirection = value; } - const Ogre::Vector3 getSunDirection () const { return mSunDirection; } - - void setHazeColour (const Ogre::ColourValue& value) { mHazeColour = value; } - const Ogre::ColourValue getHazeColour () const { return mHazeColour; } - - private: - bool mGroundFogEnabled; - Real mGroundFogDensity; - Real mGroundFogBaseLevel; - Real mGroundFogVerticalDecay; - Ogre::ColourValue mGroundFogColour; - - public: - /// Enables exponential ground fog. - void setGroundFogEnabled (bool value); - bool getGroundFogEnabled () const { return mGroundFogEnabled; } - - /// Sets ground fog density - void setGroundFogDensity (Real value) { mGroundFogDensity = value; } - - /// Get ground fog density - Real getGroundFogDensity () const { return mGroundFogDensity; } - - /// Sets ground fog level - /// At ground level fogginess is equal to GroundFogDensity - void setGroundFogBaseLevel (Real value) { mGroundFogBaseLevel = value; } - - /// Get ground fog density - Real getGroundFogBaseLevel () const { return mGroundFogBaseLevel; } - - /// Sets ground fog vertical decay - void setGroundFogVerticalDecay (Real value) { mGroundFogVerticalDecay = value; } - - /// Get ground fog density - Real getGroundFogVerticalDecay () const { return mGroundFogVerticalDecay; } - - /// Sets ground fog colour - void setGroundFogColour (const Ogre::ColourValue& value) { mGroundFogColour = value; } - - /// Get ground fog colour - const Ogre::ColourValue getGroundFogColour () const { return mGroundFogColour; } - }; - - /** Per-viewport instance of @see DepthComposer - * This will create and control one ogre::CompositorInstance. - */ - class CAELUM_EXPORT DepthComposerInstance: private Ogre::CompositorInstance::Listener - { - private: - DepthComposer* mParent; - Ogre::Viewport* mViewport; - Ogre::CompositorInstance* mCompInst; - std::auto_ptr mDepthRenderer; - - virtual void notifyMaterialSetup(uint pass_id, Ogre::MaterialPtr &mat); - virtual void notifyMaterialRender(uint pass_id, Ogre::MaterialPtr &mat); - - struct Params { - void setup(Ogre::GpuProgramParametersSharedPtr params); - - Ogre::GpuProgramParametersSharedPtr fpParams; - FastGpuParamRef invViewProjMatrix; - FastGpuParamRef worldCameraPos; - FastGpuParamRef groundFogDensity; - FastGpuParamRef groundFogVerticalDecay; - FastGpuParamRef groundFogBaseLevel; - FastGpuParamRef groundFogColour; - FastGpuParamRef sunDirection; - FastGpuParamRef hazeColour; - } mParams; - - protected: - /// Called from DepthComposer::update - void _update (); - - void addCompositor (); - void removeCompositor (); - bool isCompositorEnabled () { return mCompInst != 0; } - - friend class DepthComposer; - - public: - /// Get parent DepthComposer; with all the interesting parameters. - DepthComposer* getParent() const { return mParent; } - - /// Get the viewport this instance is attached to. - Ogre::Viewport* getViewport() const { return mViewport; } - - /// Get compositor instance; attached to the viewport. - Ogre::CompositorInstance* getCompositorInstance() const { return mCompInst; } - - /** Get the underlying depth renderer. - * Allow the user to tweak the depth renderer. - */ - Caelum::DepthRenderer* getDepthRenderer () const { return mDepthRenderer.get(); } - - DepthComposerInstance(DepthComposer* parent, Ogre::Viewport* view); - virtual ~DepthComposerInstance(); - }; - - /** Render the depth buffer to a texture. - * - * This class tries to be as generic and flexible as possible; but it - * is currently only used by the depth composer. - */ - class CAELUM_EXPORT DepthRenderer: private Ogre::RenderQueue::RenderableListener - { - private: - Ogre::Viewport* mMasterViewport; - Ogre::Viewport* mDepthRenderViewport; - Ogre::TexturePtr mDepthRenderTexture; - bool mDepthRenderingNow; - Ogre::MaterialPtr mDepthRenderMaterial; - - // Override materials during all rendering. -#if OGRE_VERSION < 0x00010600 - virtual bool renderableQueued( - Ogre::Renderable* rend, - Ogre::uint8 groupId, - Ogre::ushort priority, - Ogre::Technique** ppTech); -#else - virtual bool renderableQueued( - Ogre::Renderable* rend, - Ogre::uint8 groupId, - Ogre::ushort priority, - Ogre::Technique** ppTech, - Ogre::RenderQueue* pQueue); -#endif // OGRE_VERSION - inline Ogre::Material* getDepthRenderMaterial() const { return mDepthRenderMaterial.get(); } - - int mMinRenderGroupId; - int mMaxRenderGroupId; - int mViewportVisibilityMask; - - public: - DepthRenderer (Ogre::Viewport* viewport); - ~DepthRenderer (); - - inline Ogre::Viewport* getMasterViewport() { return mMasterViewport; } - inline Ogre::Texture* getDepthRenderTexture () { return mDepthRenderTexture.get(); } - inline Ogre::Viewport* getDepthRenderViewport () { return mDepthRenderViewport; } - inline Ogre::RenderTexture* getDepthRenderTarget () { - return mDepthRenderTexture->getBuffer()->getRenderTarget (); - } - - /// Render the depth buffer now! - void update (); - - /** Render only the render groups in a certain range. - * Call this to only render objects in certain render queue groups. - * The range is inclusive. - * This is a very primitive sort of filter. - */ - void setRenderGroupRangeFilter (int minGroup, int maxGroup); - - /// @see setRenderGroupRangeFilter - int getRenderGroupRangeFilterMin () { return mMinRenderGroupId; } - int getRenderGroupRangeFilterMax () { return mMaxRenderGroupId; } - - /** Disable the effects of @see setRenderGroupRangeFilter - */ - void disableRenderGroupRangeFilter (); - - /** Query mask for the depth rendering viewport. - * Enforces on every update (); - */ - void setViewportVisibilityMask (uint value) { mViewportVisibilityMask = value; } - uint getViewportVisibilityMask () { return mViewportVisibilityMask; } - void disableViewportVisibilityMask () { mViewportVisibilityMask = ~0; } - - public: - /** If true then use a user-supplied material scheme which outputs depth. - * - * The depth output of most materials is obvious and can be guessed most of the time. - * When that fails you can provide a custom material scheme for certain materials which - * renders the depth buffer. - * - * This is enabled by default for a scheme called CaelumDepth. - */ - inline void setUseCustomDepthScheme (bool value) { mUseCustomDepthScheme = value; } - inline bool getUseCustomDepthScheme () { return mUseCustomDepthScheme; } - - /** Set the name of the custom depth scheme (default is CaelumDepth). - */ - inline void setCustomDepthSchemeName (const Ogre::String& value) { mCustomDepthSchemeName = value; } - inline const Ogre::String& getCustomDepthSchemeName () { return mCustomDepthSchemeName; } - - /// Default name of the custom scheme. - static const String DEFAULT_CUSTOM_DEPTH_SCHEME_NAME; - - private: - bool mUseCustomDepthScheme; - Ogre::String mCustomDepthSchemeName; - }; -} - -#endif // CAELUM__DEPTH_COMPOSER_H diff --git a/extern/caelum/include/FastGpuParamRef.h b/extern/caelum/include/FastGpuParamRef.h deleted file mode 100644 index 269d9fca7..000000000 --- a/extern/caelum/include/FastGpuParamRef.h +++ /dev/null @@ -1,143 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2009 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -#ifndef CAELUM__FAST_GPU_PARAM_REF_H -#define CAELUM__FAST_GPU_PARAM_REF_H - -#include "CaelumPrerequisites.h" - -namespace Caelum -{ - /** @file */ - - /** Controls if FastGpuParamRef checks pointer match when setting. - * This setting trades safety for performance. By default it's equal to OGRE_DEBUG_MODE. - */ - #define CAELUM_DEBUG_PARAM_REF OGRE_DEBUG_MODE - - /** An optimized reference to a gpu shared parameter. - * - * Profiling shows that GpuProgramParameters::_findNamedConstantDefinition is not free. - * - * This class avoids hash lookups when updating. It's uses no additional - * memory than if you were to implement the same thing manually. - * - * You must also keep the matching Ogre::GpuProgramParametersSharedPtr - * and send it whenever you call FastGpuParamRef::set. This is required - * to save memory in release mode. Debug mode checks the pointer you - * pass to set is the same as the pointer you called bind on; but uses more memory. - * - * Also; please note that fetching gpu params from a material every frame is not free either. - */ - class CAELUM_EXPORT FastGpuParamRef - { - public: - /// Default constructor. Starts as unbound - FastGpuParamRef(): mPhysicalIndex(InvalidPhysicalIndex) - { - // mParams needs no initialization; SharedPtrs start as 0. - } - - /// Create and bind. - FastGpuParamRef(Ogre::GpuProgramParametersSharedPtr paramsPtr, const Ogre::String& name); - - /** Bind to a certain parameter. - * - * @param paramsPtr params to bind to. Can't be null; you must unbind explicitly. - * @param name The name of the parameter to bind. - * @param throwIfNotFound Argument to GpuProgramParameters::_findNamedConstantDefinition. - * - * If throwIfNotFound is false (the default) missing parameters are - * ignored and the param ref will remand unbound. Calling set will - * then have no effect. - */ - void bind( - Ogre::GpuProgramParametersSharedPtr paramsPtr, - const Ogre::String& name, - bool throwIfNotFound = false); - - /** Unbind ParamRef. - * - * If CAELUM_DEBUG_PARAM_REF is 1 this will also release the hold - * on GpuProgramParametersSharedPtr. - */ - void unbind(); - - /// Return if this param ref is bound to an actual param. - inline bool isBound() const { return mPhysicalIndex != InvalidPhysicalIndex; } - - /// Return the physical index. Only valid if this->isBound(). - inline size_t getPhysicalIndex () const { return mPhysicalIndex; } - - protected: - /** Set the value. No effect if !this->isBound() - * - * @param params Parameter pointer. Can't be null - * @param arg Argument to set. - * - * Will check params pointer matches the bound pointer if #CAELUM_DEBUG_PARAM_REF. - * Otherwise a mismatched params pointer can result in memory corruption. - */ - template - inline void doSet(const Ogre::GpuProgramParametersSharedPtr& params, ArgumentT arg) const { - #if CAELUM_DEBUG_PARAM_REF - assert(params.getPointer() == mParams.getPointer()); - #endif - assert(!params.isNull()); - if (mPhysicalIndex != InvalidPhysicalIndex) { - params->_writeRawConstant(mPhysicalIndex, arg); - } - } - - template - inline void doSet(const Ogre::GpuProgramParametersSharedPtr& params, ArgumentT arg, size_t count) const { - #if CAELUM_DEBUG_PARAM_REF - assert(params.getPointer() == mParams.getPointer()); - #endif - assert(!params.isNull()); - if (mPhysicalIndex != InvalidPhysicalIndex) { - params->_writeRawConstant(mPhysicalIndex, arg, count); - } - } - - public: - /// @copydoc FastGpuParamRef::doSet - inline void set(const Ogre::GpuProgramParametersSharedPtr& params, int val) const { doSet(params, val); } - /// @copydoc FastGpuParamRef::doSet - inline void set(const Ogre::GpuProgramParametersSharedPtr& params, Ogre::Real val) const { doSet(params, val); } - /// @copydoc FastGpuParamRef::doSet - inline void set(const Ogre::GpuProgramParametersSharedPtr& params, const Ogre::Vector3& val) const { doSet(params, val); } - /// @copydoc FastGpuParamRef::doSet - inline void set(const Ogre::GpuProgramParametersSharedPtr& params, const Ogre::Vector4& val) const { doSet(params, val); } - /// @copydoc FastGpuParamRef::doSet - inline void set(const Ogre::GpuProgramParametersSharedPtr& params, const Ogre::ColourValue& val) const { doSet(params, val); } - /// @copydoc FastGpuParamRef::doSet - inline void set(const Ogre::GpuProgramParametersSharedPtr& params, const Ogre::Matrix4& val) const { doSet(params, &val, 1); } - - private: - #if CAELUM_DEBUG_PARAM_REF - Ogre::GpuProgramParametersSharedPtr mParams; - #endif - static const size_t InvalidPhysicalIndex = 0xFFFFFFFF; - size_t mPhysicalIndex; - }; -} - -#endif /* CAELUM__FAST_GPU_PARAM_REF_H */ diff --git a/extern/caelum/include/FlatCloudLayer.h b/extern/caelum/include/FlatCloudLayer.h deleted file mode 100644 index bdd7bcb3c..000000000 --- a/extern/caelum/include/FlatCloudLayer.h +++ /dev/null @@ -1,366 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2008 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -#ifndef CAELUM__FLAT_CLOUD_LAYER_H -#define CAELUM__FLAT_CLOUD_LAYER_H - -#include "CaelumPrerequisites.h" -#include "InternalUtilities.h" -#include "PrivatePtr.h" -#include "FastGpuParamRef.h" - -namespace Caelum -{ - /** A flat cloud layer; drawn as a simple plane. - * Supports movement and variable cloud cover. - * - * There are significant incompatible difference between this and the - * LayeredClouds from version 0.3. This implementation of clouds is - * positioned in world space while the old implementation was a curved - * plane moving with the camera. It is not possible to perfectly simulate - * the older implementation. - * - * @note This is tighly integrated with LayeredCloud.cg and LayeredClouds.material. - */ - class CAELUM_EXPORT FlatCloudLayer - { - public: - FlatCloudLayer( - Ogre::SceneManager *sceneMgr, - Ogre::SceneNode *cloudRoot); - - ~FlatCloudLayer(); - - /** Update function called each frame from above. - * This can be reproduced with calls to other public functions. - */ - void update ( - Ogre::Real timePassed, - const Ogre::Vector3 &sunDirection, - const Ogre::ColourValue &sunLightColour, - const Ogre::ColourValue &fogColour, - const Ogre::ColourValue &sunSphereColour); - - /// Advance cloud animation (the time part of FlatCloudLayer::update). - void advanceAnimation (Ogre::Real timePassed); - - /** Reset most tweak settings to their default values - */ - void reset (); - - private: - Ogre::Vector2 mCloudSpeed; - Ogre::Vector2 mCloudMassOffset; - Ogre::Vector2 mCloudDetailOffset; - - // Set texture offsets. - // Animated every frame. - void setCloudMassOffset(const Ogre::Vector2 &cloudMassOffset); - void setCloudDetailOffset(const Ogre::Vector2 &cloudDetailOffset); - - public: - /** Sets cloud movement speed. - * @param cloudSpeed Cloud movement speed. - */ - void setCloudSpeed (const Ogre::Vector2 &cloudSpeed); - - /** Gets cloud movement speed. - * @param cloudSpeed Cloud movement speed. - */ - const Ogre::Vector2 getCloudSpeed () const { return mCloudSpeed; } - - private: - Ogre::Vector3 mSunDirection; - Ogre::ColourValue mSunLightColour; - Ogre::ColourValue mSunSphereColour; - Ogre::ColourValue mFogColour; - - public: - void setSunDirection(const Ogre::Vector3 &sunDirection); - void setSunLightColour(const Ogre::ColourValue &sunLightColour); - void setSunSphereColour(const Ogre::ColourValue &sunSphereColour); - void setFogColour(const Ogre::ColourValue &fogColour); - const Ogre::Vector3 getSunDirection () const; - const Ogre::ColourValue getSunLightColour () const; - const Ogre::ColourValue getSunSphereColour () const; - const Ogre::ColourValue getFogColour () const; - - private: - /// Pointer to scene manager. - Ogre::SceneManager *mSceneMgr; - - // Note: objects are destroyed in reverse order of declaration. - // This means that objects must be ordered by dependency. - - /// Cloned cloud material. - PrivateMaterialPtr mMaterial; - - struct Params - { - void setup(Ogre::GpuProgramParametersSharedPtr fpParams, Ogre::GpuProgramParametersSharedPtr vpParams); - - Ogre::GpuProgramParametersSharedPtr vpParams; - Ogre::GpuProgramParametersSharedPtr fpParams; - - FastGpuParamRef cloudCoverageThreshold; - FastGpuParamRef cloudMassOffset; - FastGpuParamRef cloudDetailOffset; - FastGpuParamRef cloudMassBlend; - FastGpuParamRef vpSunDirection; - FastGpuParamRef fpSunDirection; - FastGpuParamRef sunLightColour; - FastGpuParamRef sunSphereColour; - FastGpuParamRef fogColour; - FastGpuParamRef layerHeight; - FastGpuParamRef cloudUVFactor; - FastGpuParamRef heightRedFactor; - FastGpuParamRef nearFadeDist; - FastGpuParamRef farFadeDist; - FastGpuParamRef fadeDistMeasurementVector; - } mParams; - - private: - PrivateMeshPtr mMesh; - PrivateSceneNodePtr mNode; - PrivateEntityPtr mEntity; - - // Mesh parameters. - bool mMeshDirty; - Real mMeshWidth, mMeshHeight; - int mMeshWidthSegments, mMeshHeightSegments; - - public: - /** Regenerate the plane mesh and recreate entity. - * This automatically happens in update. - */ - void _ensureGeometry(); - - /** Regenerate the plane mesh and recreate entity. - * This automatically happens when mesh parameters are changed. - */ - void _invalidateGeometry(); - - /** Reset all mesh parameters. - */ - void setMeshParameters ( - Real meshWidth, Real meshHeight, - int meshWidthSegments, int meshHeightSegments); - - /// @see setMeshParameters - inline void setMeshWidth (Real value) { mMeshWidth = value; _invalidateGeometry (); } - inline void setMeshHeight (Real value) { mMeshHeight = value; _invalidateGeometry (); } - inline void setMeshWidthSegments (int value) { mMeshWidthSegments = value; _invalidateGeometry (); } - inline void setMeshHeightSegments (int value) { mMeshHeightSegments = value; _invalidateGeometry (); } - inline Real getMeshWidth () const { return mMeshWidth; } - inline Real getMeshHeight () const { return mMeshHeight; } - inline int getMeshWidthSegments () const { return mMeshWidthSegments; } - inline int getMeshHeightSegments () const { return mMeshHeightSegments; } - - private: - /// Lookup used for cloud coverage, @see setCloudCoverLookup. - std::auto_ptr mCloudCoverLookup; - - /// Filename of mCloudCoverLookup - Ogre::String mCloudCoverLookupFileName; - - /// Value passed to setCloudCover (before lookup). - Ogre::Real mCloudCover; - - public: - /** Sets cloud cover, between 0 (completely clear) and 1 (completely covered) - * @param cloudCover Cloud cover between 0 and 1 - */ - void setCloudCover (const Ogre::Real cloudCover); - - /** Gets the current cloud cover. - * @return Cloud cover, between 0 and 1 - */ - inline Ogre::Real getCloudCover () const { return mCloudCover; } - - /** Set the image used to lookup the cloud coverage threshold. - * This image is used to calculate the cloud coverage threshold - * based on the desired cloud cover. - * - * The cloud coverage threshold is substracted from cloud intensity - * at any point; to generate fewer or more clouds. That threshold is - * not linear, a lookup is required to ensure that setCloudCover(0.1) - * will actually have 10% the clouds at setCloudCover(1). - * - * The lookup is the inverse of the sum on the histogram, and was - * calculated with a small hacky tool. - */ - void setCloudCoverLookup (const Ogre::String& fileName); - - /** Get the filename of the cloud cover lookup image. - * This returns the value set by setCloudCoverLookup or an empty - * string if disabled. - */ - const Ogre::String getCloudCoverLookupFileName () const; - - /** Disable any cloud cover lookup. - * @see setCloudCoverLookup. - */ - void disableCloudCoverLookup (); - - private: - Ogre::Real mCloudCoverVisibilityThreshold; - - protected: - /** Enforce setCloudCoverVisibilityThreshold. - */ - void _updateVisibilityThreshold (); - - public: - /// Get cloud cover visiblity threshold. - /// Beneath this cloud coverage nothing is drawn anymore. - Ogre::Real getCloudCoverVisibilityThreshold () const { return mCloudCoverVisibilityThreshold; } - - /** Set cloud cover visiblity threshold. - * - * Beneath this cloud coverage nothing is drawn anymore. - * Default value is very very low (0.001). All this does is save you from - * destroying/recreating layers when they're too thin to bother drawing. - */ - void setCloudCoverVisibilityThreshold (const Ogre::Real value); - - private: - /// Height of this cloud layer; equal to node's y position. - Ogre::Real mHeight; - - public: - /** Set the height of the cloud layer. - * @param height In world units above the cloud root node. - */ - void setHeight(Ogre::Real height); - - /** Get the height of the cloud layer. - * @return height In world units above the cloud root node. - */ - Ogre::Real getHeight() const; - - private: - /// Current cloud blend position; from 0 to mNoiseTextureNames.size() - Ogre::Real mCloudBlendPos; - - /// Current index in the set of textures. - /// Cached to avoid setting textures every frame. - int mCurrentTextureIndex; - - /// Time required to blend two cloud shapes. - Ogre::Real mCloudBlendTime; - - /// Names of noise textures. - std::vector mNoiseTextureNames; - - public: - /** Sets the time it takes to blend two cloud shaped together, in seconds. - * This will also reset the animation at the current time. - * @param value Cloud shape blend time in seconds - */ - void setCloudBlendTime (const Ogre::Real value); - - /** Gets the time it takes to blend two cloud shaped together, in seconds. - * @return Cloud shape blend time in seconds - */ - Ogre::Real getCloudBlendTime () const; - - /** Set the current blending position; between noise textures. - * Integer values are used for single textures. Float values blend between two textures. - * Values outside [0, textureCount) are wrapped around. - * @param value New cloud blending position - */ - void setCloudBlendPos (const Ogre::Real value); - - /// @see setCloudBlendPos - Ogre::Real getCloudBlendPos () const; - - private: - Ogre::Real mCloudUVFactor; - - public: - /** Cloud texture coordinates are multiplied with this. - * Higher values result in more spread-out clouds. - * Very low value result in ugly texture repeats. - */ - void setCloudUVFactor (const Ogre::Real value); - /// @see setCloudUVFactor - inline Ogre::Real getCloudUVFactor () const { return mCloudUVFactor; } - - private: - Ogre::Real mHeightRedFactor; - - public: - /** High-altitude clouds are tinted red in the evening. - * Higher values attenuate the effect. - */ - void setHeightRedFactor (const Ogre::Real value); - /// @see setCloudUVFactor - Ogre::Real getHeightRedFactor () const { return mHeightRedFactor; } - - private: - Ogre::Real mNearFadeDist; - Ogre::Real mFarFadeDist; - Ogre::Vector3 mFadeDistMeasurementVector; - - public: - /** Cloud fade distances. - * - * These are measured horizontally in meters (height is not used). - * - * The effect is a fade based on alpha blending which occurs between - * nearValue and farValue. After farValue nothing is visibile from - * this layer. - * - * Default values are 10000 and 140000 - */ - void setFadeDistances (Ogre::Real nearValue, Ogre::Real farValue); - - /// Set only near fade distance (see setFadeDistances). - void setNearFadeDist (const Ogre::Real value); - /// Get near fade distance (see setFadeDistances). - Ogre::Real getNearFadeDist () const { return mNearFadeDist; } - - /// Set only far fade distance (see setFadeDistances). - void setFarFadeDist (const Ogre::Real value); - /// Get fade distance (see setFadeDistances). - Ogre::Real getFarFadeDist () const { return mFarFadeDist; } - - /** Set on which components is the fade distance measured. - * - * Default is Vector3(0, 1, 1) which measures fade distance - * horizontally in caelum's default assumed coordinate system. - * - * If you're in a Z-up system you probably want to set this to (1, 1, 0). - * - * Fade distance is always measured relative to the camera. - */ - void setFadeDistMeasurementVector (const Ogre::Vector3& value); - /// Get the value set by setFadeDistMeasurementVector. - const Ogre::Vector3 getFadeDistMeasurementVector () const { return mFadeDistMeasurementVector; } - - public: - void setQueryFlags (uint flags) { mEntity->setQueryFlags (flags); } - uint getQueryFlags () const { return mEntity->getQueryFlags (); } - void setVisibilityFlags (uint flags) { mEntity->setVisibilityFlags (flags); } - uint getVisibilityFlags () const { return mEntity->getVisibilityFlags (); } - }; -} - -#endif // CAELUM__FLAT_CLOUD_LAYER_H diff --git a/extern/caelum/include/GroundFog.h b/extern/caelum/include/GroundFog.h deleted file mode 100644 index 6e244f5aa..000000000 --- a/extern/caelum/include/GroundFog.h +++ /dev/null @@ -1,202 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2006-2007 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -#ifndef GROUNDFOG_H -#define GROUNDFOG_H - -#include "CaelumPrerequisites.h" -#include "CameraBoundElement.h" -#include "PrivatePtr.h" -#include "FastGpuParamRef.h" - -namespace Caelum -{ - /** Exponential ground fog system implementation. - * - * This class controls CaelumGroundFog passes in a potentially large number - * of materials, changing shader program parameters. This class keeps a list - * of passes to control; which can be build based on pass name. - * - * This simulates a field of fog where "absorption" at a certain point is - * exp(-verticalDecay * (h - fogLevel)). This absorption is multiplicative, - * the total fog alpha is e^(-density * absorption_on_view_path). - * - * You can set verticalDecay to 0 and get standard GL_EXP fog. Don't actually - * do that though because you'll get a division by 0. - * - * @note: This is deprecated starting from Caelum 0.4. The DepthComposer class - * provides similar functionality with less intrusion on your materials. - */ - class CAELUM_EXPORT GroundFog: public CameraBoundElement - { - public: - static const Ogre::String DEFAULT_PASS_NAME; - - /** Constructor. - */ - GroundFog (Ogre::SceneManager *scene, - Ogre::SceneNode *caelumRootNode, - const Ogre::String &domeMaterialName = "CaelumGroundFogDome", - const Ogre::String &domeEntityName = "CaelumGroundFogDome"); - - /** Virtual destructor. - */ - virtual ~GroundFog (); - - /** Typedef for easier manipulation of a set of Passes. - */ - typedef std::set PassSet; - - /** Get the set of currently controlled passes. - * This is provided if you really want to change the set by hand. - * You should call forceUpdate after modifying this set. - */ - PassSet& getPasses(); - - /** Get the set of currently controlled passes. - * This is a const overload which doesn't let you modify the - * underlying collection. - */ - const PassSet& getPasses () const; - - /** Find caelum fog passes to control by name. - * By default this looks for passes called "CaleumGroundFog". - * @note This calls forceUpdate() - */ - void findFogPassesByName (const Ogre::String& passName = DEFAULT_PASS_NAME); - - /// Sets the fog density multiplier - void setDensity (Ogre::Real density); - - /// Get the fog density multiplier - Ogre::Real getDensity () const; - - /// Sets fog colour - void setColour (const Ogre::ColourValue &colour); - - /// Gets fog colour - const Ogre::ColourValue getColour () const; - - /// Sets the vertical fog decay constant. - void setVerticalDecay (Ogre::Real verticalDecay); - - /// Get the vertical fog decay constant. - Ogre::Real getVerticalDecay () const; - - /** Sets the ground level. - * At ground level 'fogginess' is equal to 1. - */ - void setGroundLevel (Ogre::Real GroundLevela); - - /** Get the ground level. - */ - Ogre::Real getGroundLevel () const; - - /** Forces an update of all the passes. You have to use this if you modify - * the set of passes by hand, otherwise avoid it. - */ - void forceUpdate (); - - private: - /// Cached Density - Ogre::Real mDensity; - - /// Cached VerticalDecay - Ogre::Real mVerticalDecay; - - /// Cached GroundLevel - Ogre::Real mGroundLevel; - - /// Fog colour - Ogre::ColourValue mFogColour; - - private: - /// The scene to control fog in. - Ogre::SceneManager* mScene; - - /// Sky dome material - PrivateMaterialPtr mDomeMaterial; - - /// Sky dome node - PrivateSceneNodePtr mDomeNode; - - /// Sky dome entity - PrivateEntityPtr mDomeEntity; - - // Called whenever something changes to update the sky dome. - void updateSkyFogging(); - - protected: - /// Handle far radius. - virtual void setFarRadius (Ogre::Real radius); - - public: - /// Handle camera change. - virtual void notifyCameraChanged (Ogre::Camera *cam); - - void setQueryFlags (uint flags) { mDomeEntity->setQueryFlags (flags); } - uint getQueryFlags () const { return mDomeEntity->getQueryFlags (); } - void setVisibilityFlags (uint flags) { mDomeEntity->setVisibilityFlags (flags); } - uint getVisibilityFlags () const { return mDomeEntity->getVisibilityFlags (); } - - private: - /// The passes to control. - PassSet mPasses; - - /// Params references. - struct FogParamsBase - { - void setup(Ogre::GpuProgramParametersSharedPtr fpParams); - - Ogre::GpuProgramParametersSharedPtr fpParams; - - FastGpuParamRef fogDensity; - FastGpuParamRef fogColour; - FastGpuParamRef fogVerticalDecay; - FastGpuParamRef fogGroundLevel; - - }; - - struct DomeFogParams: public FogParamsBase { - void setup(Ogre::GpuProgramParametersSharedPtr fpParams); - FastGpuParamRef cameraHeight; - } mDomeParams; - - struct PassFogParams: public FogParamsBase { - PassFogParams(Ogre::GpuProgramParametersSharedPtr fpParams) { setup(fpParams); } - - static inline bool lessThanByParams(const PassFogParams& a, const PassFogParams& b) { - return a.fpParams.get() <= b.fpParams.get(); - } - - static inline bool equalByParams(const PassFogParams& a, const PassFogParams& b) { - return a.fpParams.get() == b.fpParams.get(); - } - }; - - typedef std::vector PassFogParamsVector; - PassFogParamsVector mPassFogParams; - - /// Update mPassFogParams based on mPasses - void updatePassFogParams(); - }; -} - -#endif //GROUNDFOG_H diff --git a/extern/caelum/include/ImageStarfield.h b/extern/caelum/include/ImageStarfield.h deleted file mode 100644 index 7dcec0c58..000000000 --- a/extern/caelum/include/ImageStarfield.h +++ /dev/null @@ -1,102 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2006-2008 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -#ifndef CAELUM__IMAGE_STARFIELD_H -#define CAELUM__IMAGE_STARFIELD_H - -#include "CaelumPrerequisites.h" -#include "CameraBoundElement.h" -#include "PrivatePtr.h" - -namespace Caelum -{ - /** Image-based starfield class. - * This class implements a starfield based on mapping a single large - * texture on a sphere. @see PointStarfield for a better solution. - */ - class CAELUM_EXPORT ImageStarfield : public CameraBoundElement - { - protected: - /// Reference to the dome node. - PrivateSceneNodePtr mNode; - - /// Reference to the (cloned) starfield material. - PrivateMaterialPtr mStarfieldMaterial; - - /// Reference to the dome entity. - PrivateEntityPtr mEntity; - - /// Name of the spheric dome resource. - static const Ogre::String STARFIELD_DOME_NAME; - - /// Name of the starfield material. - static const Ogre::String STARFIELD_MATERIAL_NAME; - - /** Inclination of the starfield. - */ - Ogre::Degree mInclination; - - public: - static const String DEFAULT_TEXTURE_NAME; - - /** Constructor. - @param sceneMgr The scene manager this dome will belong to. - */ - ImageStarfield ( - Ogre::SceneManager *sceneMgr, - Ogre::SceneNode *caelumRootNode, - const Ogre::String &textureName = DEFAULT_TEXTURE_NAME); - - /** Destructor. - */ - virtual ~ImageStarfield (); - - /** Sets the starfield inclination. This inclination is the angle between the starfield rotation axis and the horizon plane. - @param inc The starfield inclination in degrees. It`s equal to observer latitude taken with opposite sign. - */ - void setInclination (Ogre::Degree inc); - - /** Updates the starfield position/orientation. - @param time Local time in [0, 1] range. - */ - void update (const float time); - - /** Updates the starfield material. - @param mapName The new starfield texture map name. - */ - void setTexture (const Ogre::String &mapName); - - public: - /// Handle camera change. - virtual void notifyCameraChanged (Ogre::Camera *cam); - - protected: - /// Handle far radius. - virtual void setFarRadius (Ogre::Real radius); - - public: - void setQueryFlags (uint flags) { mEntity->setQueryFlags (flags); } - uint getQueryFlags () const { return mEntity->getQueryFlags (); } - void setVisibilityFlags (uint flags) { mEntity->setVisibilityFlags (flags); } - uint getVisibilityFlags () const { return mEntity->getVisibilityFlags (); } - }; -} - -#endif // CAELUM__IMAGE_STARFIELD_H diff --git a/extern/caelum/include/InternalUtilities.h b/extern/caelum/include/InternalUtilities.h deleted file mode 100644 index 5c20b3abc..000000000 --- a/extern/caelum/include/InternalUtilities.h +++ /dev/null @@ -1,118 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2006-2007 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -#ifndef CAELUM_HEADER__PRIVATE_UTILITIES_H -#define CAELUM_HEADER__PRIVATE_UTILITIES_H - -#include "CaelumPrerequisites.h" -#include "PrivatePtr.h" - -namespace Caelum -{ - /** Private caelum utilities - * - * This class constains various tiny utilities for caelum to use. - */ - class CAELUM_EXPORT InternalUtilities - { - public: - /** Gets the interpolated colour between two pixels from an image. - Interpolate a texture pixel by hand. (fx, fy) are in texture coordinates, - ranging [0-1] across the entire texture. - Smooth blending is only done on the x coordinate. - Wrapping is only supported on X as well. - - @param fx Horizontal coordinate. - @param fy Vertical coordiate. - @param img The lookup image. - @param wrapX To wrap the x coordinate. - @return The interpolated colour. - */ - static Ogre::ColourValue getInterpolatedColour ( - float fx, - float fy, - Ogre::Image *img, - bool wrapX = true); - - /** Quickly format a pointer as a string; in hex - */ - static const Ogre::String pointerToString(void* pointer); - - /** Creates a private clone of a material from a script. - * - * When a class wants to modify a material at runtime it must not - * modify the original material loaded from scripts. Instead it - * should create a clone and use that. - * - * This method throws a Caelum::UnsupportedException on failure. - * - * @param originalName Name of the original material. - * @param cloneName Name of the result clone. - * - * @return A pointer to an unique material. - */ - static Ogre::MaterialPtr checkLoadMaterialClone ( - const Ogre::String& originalName, - const Ogre::String& cloneName); - - /** Fetch a compositor by name and check it can be loaded properly - * - * This method throws a Caelum::UnsupportedException on failure. - * - * @param name Name of the compositor to check. - * - * @return A pointer to the compositor (can be ignored) - */ - static Ogre::CompositorPtr checkCompositorSupported (const Ogre::String& name); - - public: - /** Enumeration of types of sky domes. - */ - enum DomeType { - DT_SKY_DOME, - DT_IMAGE_STARFIELD, - }; - - /** Creates a longitude-latitude sky dome. - * @note Does nothing if the sphere already exists. - * @param name The name of the mesh to be created. - * @param segments The number of sphere segments. - * @param domeType The type of dome to create. - */ - static void generateSphericDome (const Ogre::String &name, int segments, DomeType domeType); - - private: - /** Fills the vertex and index buffers for a sky gradients type dome. - * @param pVertex Pointer to the vertex buffer. - * @param pIndices Pointer to the index buffer. - * @param segments Subdivision detail. - */ - static void fillGradientsDomeBuffers (float *pVertex, unsigned short *pIndices, int segments); - - /** Fills the vertex and index buffers for a stardield type dome. - * @param pVertex Pointer to the vertex buffer. - * @param pIndices Pointer to the index buffer. - * @param segments Subdivision detail. - */ - static void fillStarfieldDomeBuffers (float *pVertex, unsigned short *pIndices, int segments); - }; -} - -#endif // CAELUM_HEADER__PRIVATE_UTILITIES_H diff --git a/extern/caelum/include/Moon.h b/extern/caelum/include/Moon.h deleted file mode 100644 index 0f0c27586..000000000 --- a/extern/caelum/include/Moon.h +++ /dev/null @@ -1,108 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2008 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -#ifndef CAELUM__MOON_H -#define CAELUM__MOON_H - -#include "CaelumPrerequisites.h" -#include "SkyLight.h" -#include "FastGpuParamRef.h" -#include "PrivatePtr.h" - -namespace Caelum -{ - /** Class representing the moon. - * Drawn as two billboards; one after the stars and one after the skydome. - * Drawing it before the skydome will make it invisible in daylight; and that's bad. - */ - class CAELUM_EXPORT Moon: - public BaseSkyLight - { - public: - /// Name of the moon material. - static const Ogre::String MOON_MATERIAL_NAME; - - /// Name of the moon background material. - static const Ogre::String MOON_BACKGROUND_MATERIAL_NAME; - - private: - /// Material for MoonBB - PrivateMaterialPtr mMoonMaterial; - - /// The moon sprite. - PrivateBillboardSetPtr mMoonBB; - - /// Material for mBackBB - PrivateMaterialPtr mBackMaterial; - - /// The moon's background; used to block the stars. - PrivateBillboardSetPtr mBackBB; - - /// The moon sprite visible angle - Ogre::Degree mAngularSize; - - struct Params { - void setup(Ogre::GpuProgramParametersSharedPtr fpParams); - - Ogre::GpuProgramParametersSharedPtr fpParams; - FastGpuParamRef phase; - } mParams; - - public: - /** Constructor. - */ - Moon ( - Ogre::SceneManager *sceneMgr, - Ogre::SceneNode *caelumRootNode, - const Ogre::String& moonTextureName = "moon_disc.dds", - Ogre::Degree angularSize = Ogre::Degree(3.77f)); - - virtual ~Moon (); - - /** Updates the moon material. - @param textureName The new moon texture name. - */ - void setMoonTexture (const Ogre::String &textureName); - - /** Updates the moon size. - @param moon TextureAngularSize The new moon texture angular size. - */ - void setMoonTextureAngularSize(const Ogre::Degree& moonTextureAngularSize); - - /** Sets the moon sphere colour. - @param colour The colour used to draw the moon - */ - void setBodyColour (const Ogre::ColourValue &colour); - - /// Set the moon's phase - void setPhase (Ogre::Real phase); - - public: - /// Handle camera change. - virtual void notifyCameraChanged (Ogre::Camera *cam); - - virtual void setQueryFlags (uint flags); - virtual uint getQueryFlags () const; - virtual void setVisibilityFlags (uint flags); - virtual uint getVisibilityFlags () const; - }; -} - -#endif // CAELUM__MOON_H diff --git a/extern/caelum/include/PointStarfield.h b/extern/caelum/include/PointStarfield.h deleted file mode 100644 index c7bf5156a..000000000 --- a/extern/caelum/include/PointStarfield.h +++ /dev/null @@ -1,212 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2008 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -#ifndef CAELUM__POINT_STARFIELD_H -#define CAELUM__POINT_STARFIELD_H - -#include "CaelumPrerequisites.h" -#include "CameraBoundElement.h" -#include "PrivatePtr.h" -#include "FastGpuParamRef.h" - -namespace Caelum -{ - /** POD for bright star catalogue entries. - * Only J2000 position and magnitude included. - */ - struct BrightStarCatalogueEntry { - signed char rasc_hour; - signed char rasc_min; - float rasc_sec; - signed char decl_deg; - signed char decl_min; - float decl_sec; - float magn; - }; - - /// There are exactly 9110 stars in our version of the BSC. - const int BrightStarCatalogueSize = 9110; - - /// Hardcoded bright star catalogue (BrightStarCatalogue.cpp) - extern const BrightStarCatalogueEntry BrightStarCatalogue[BrightStarCatalogueSize]; - - /** Point starfield class. - * An Ogre::ManualObject is used for drawing because billboards are too slow. - * - * Stars are sized in pixels; this seems to work a lot better than relative sizes. - * Stars could be made even smaller but it would require hinting (nudging pixel - * coordinates to match actual screen pixels). Points are hard. - * - * Loading a bright-star catalogue is supported but star positions are - * likely only correct relative to each other. External rotation is probably wrong. - */ - class CAELUM_EXPORT PointStarfield: - public CameraBoundElement - { - public: - /** Constructor. - * By default this loads some reasonable defaults and the - * bright star catalogue. - */ - PointStarfield ( - Ogre::SceneManager *sceneMgr, - Ogre::SceneNode *caelumRootNode, - bool initWithCatalogue = true); - - /// Destructor. - virtual ~PointStarfield (); - - /// Struct representing one star inside PointStarfield. - struct Star { - Ogre::Degree RightAscension; - Ogre::Degree Declination; - Ogre::Real Magnitude; - }; - - /// A vector of Star - typedef std::vector StarVector; - - /** Get a reference to the vector of stars. - * You can freely modify this; but you need to updateStars when you're done. - */ - inline StarVector& getStarVector () { return mStars; } - - /** You must call this if you change the star vector by hand. - */ - void notifyStarVectorChanged (); - - /// Clear any and all stars. - void clearAllStars (); - - /** Add a bunch of random stars. - */ - void addRandomStars (int count); - - /** Add one star from the bright star catalogue. - */ - void addStar (const BrightStarCatalogueEntry &entry); - - /** Add stars from the bright star catalogue. - * @param count Number of stars to add (in order of brightness). - */ - void addBrightStarCatalogue (int count = BrightStarCatalogueSize); - - private: - /// Cloned material - PrivateMaterialPtr mMaterial; - - /// Node for the starfield - PrivateSceneNodePtr mNode; - - /// Manual object for drawing. - PrivateManualObjectPtr mManualObj; - - /// Star data. - std::vector mStars; - - Ogre::Real mMinPixelSize, mMaxPixelSize, mMag0PixelSize; - Ogre::Real mMagnitudeScale; - - Ogre::Degree mObserverLatitude, mObserverLongitude; - - bool mValidGeometry; - void invalidateGeometry(); - void ensureGeometry(); - - public: - /** Update function; called from CaelumSystem::updateSubcomponents - @param time Time of the day. - */ - void _update (float time); - - /** Magnitude power scale. - * Star magnitudes are logarithming; one magnitude difference - * means a star is 2.512 times brighter. - * This property allows tweaking that value. - */ - inline void setMagnitudeScale (Ogre::Real value) { mMagnitudeScale = value; } - inline Ogre::Real getMagnitudeScale () const { return mMagnitudeScale; } - - inline void setMag0PixelSize (Ogre::Real value) { mMag0PixelSize = value; } - inline Ogre::Real getMag0PixelSize () const { return mMag0PixelSize; } - - inline void setMinPixelSize (Ogre::Real value) { mMinPixelSize = value; } - inline Ogre::Real getMinPixelSize () const { return mMinPixelSize; } - - inline void setMaxPixelSize (Ogre::Real value) { mMaxPixelSize = value; } - inline Ogre::Real getMaxPixelSize () const { return mMaxPixelSize; } - - void setObserverLatitude (Ogre::Degree value); - inline Ogre::Degree getObserverLatitude () const { return mObserverLatitude; } - - void setObserverLongitude (Ogre::Degree value); - inline Ogre::Degree getObserverLongitude () const { return mObserverLongitude; } - - private: - Ogre::Degree mObserverPositionRebuildDelta; - - public: - /** Moving the observer position around causes a starfield rebuild. - * Default value (DEFAULT_OBSERVER_POSITION_REBUILD_DELTA) is 0.1 - * degrees which is equivalent to around 170 meters on the earth. - * - * This only matters if you compute the observer position every - * frame. Caelum doesn't contain code for that. - */ - inline Ogre::Degree getObserverPositionRebuildDelta () const { - return mObserverPositionRebuildDelta; - } - inline void setObserverPositionRebuildDelta (Ogre::Degree value) { - mObserverPositionRebuildDelta = value; - } - - static const Ogre::Degree DEFAULT_OBSERVER_POSITION_REBUILD_DELTA; - - /// Material used to draw all the points. - static const Ogre::String STARFIELD_MATERIAL_NAME; - - /// Handle camera change. - virtual void notifyCameraChanged (Ogre::Camera *cam); - - protected: - /// Handle far radius. - virtual void setFarRadius (Ogre::Real radius); - - public: - void setQueryFlags (uint flags) { mManualObj->setQueryFlags (flags); } - uint getQueryFlags () const { return mManualObj->getQueryFlags (); } - void setVisibilityFlags (uint flags) { mManualObj->setVisibilityFlags (flags); } - uint getVisibilityFlags () const { return mManualObj->getVisibilityFlags (); } - - private: - struct Params { - void setup(Ogre::GpuProgramParametersSharedPtr vpParams); - - Ogre::GpuProgramParametersSharedPtr vpParams; - FastGpuParamRef mag_scale; - FastGpuParamRef mag0_size; - FastGpuParamRef min_size; - FastGpuParamRef max_size; - FastGpuParamRef aspect_ratio; - } mParams; - }; -} - -#endif // CAELUM__POINT_STARFIELD_H diff --git a/extern/caelum/include/PrecipitationController.h b/extern/caelum/include/PrecipitationController.h deleted file mode 100644 index 00b699b8a..000000000 --- a/extern/caelum/include/PrecipitationController.h +++ /dev/null @@ -1,283 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2008 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -#ifndef CAELUM__PRECIPITATION_CONTROLLER_H -#define CAELUM__PRECIPITATION_CONTROLLER_H - -#include "CaelumPrerequisites.h" -#include "FastGpuParamRef.h" - -namespace Caelum -{ - /** Preset parameters for a certain type of precipitation. - */ - struct PrecipitationPresetParams - { - Ogre::ColourValue Colour; - Ogre::Real Speed; - Ogre::String Name; - }; - - /** An enumeration of the available precipitation presets. - * @see PrecipitationController::getPrecipitationPreset - */ - enum PrecipitationType - { - PRECTYPE_DRIZZLE = 0, - PRECTYPE_RAIN = 1, - PRECTYPE_SNOW = 2, - PRECTYPE_SNOWGRAINS = 3, - PRECTYPE_ICECRYSTALS = 4, - PRECTYPE_ICEPELLETS = 5, - PRECTYPE_HAIL = 6, - PRECTYPE_SMALLHAIL = 7, - - PRECTYPE_CUSTOM = 8, - }; - - /** Compositor-based precipitation controller. - * This class will add and control precipitation controllers to viewports. - * - * Compositors clone the composing materials. This controller will - * register itself as a compositor listener and change the material in notifyMaterialSetup. - */ - class CAELUM_EXPORT PrecipitationController - { - private: - friend class PrecipitationInstance; - - Ogre::SceneManager *mSceneMgr; - Ogre::Vector3 mWindSpeed; - Ogre::Real mIntensity; - Ogre::Real mSpeed; - Ogre::ColourValue mColour; - PrecipitationType mPresetType; - Ogre::String mTextureName; - Ogre::Vector3 mCameraSpeedScale; - Ogre::Vector3 mFallingDirection; - - Ogre::Real mAutoDisableThreshold; - bool mHardDisableCompositor; - - Ogre::ColourValue mSceneColour; - Real mInternalTime; - - // Only meant for the instance ctl in auto-camera-speed mode. - Real mSecondsSinceLastFrame; - inline Real getSecondsSinceLastFrame() { return mSecondsSinceLastFrame; } - - public: - /// Name of the compositor resource. - static const String COMPOSITOR_NAME; - - /// Name of the compositor material. - static const String MATERIAL_NAME; - - /// Check if a preset type is valid. - static bool isPresetType (PrecipitationType value); - - /// Get preset parameters for a certain type of precipitation. - static const PrecipitationPresetParams& getPresetParams (PrecipitationType value); - - /// Set all parameters at once. - void setParams (const PrecipitationPresetParams& params); - - /// Quickly set a certain preset type of precipitation. - void setPresetType (PrecipitationType value); - - /** Get the preset type. - * Will return PRECIPITATION_CUSTOM if you modify parameters manually - * after setPresetType. - */ - PrecipitationType getPresetType () const; - - // Texture name, part of a preset - void setTextureName(const Ogre::String& textureName); - const Ogre::String getTextureName() const; - - /// Precipitation color. Part of a preset - void setColour(const Ogre::ColourValue& color); - const Ogre::ColourValue getColour() const; - - /// Precipitation speed (affects direction). Part of a preset - void setSpeed(Real value); - Real getSpeed() const; - - /// Precipitation intensity. - void setIntensity(Real value); - Real getIntensity() const; - - /// Wind speed and direction - void setWindSpeed(const Ogre::Vector3 &value); - const Ogre::Vector3 getWindSpeed() const; - - /** The basic direction for falling precipitation. - * - * This property define the notion of a "falling down" direction. - * By default this is Vector3::NEGATIVE_UNIT_Y. You need to change - * this for a Z-up system. - */ - void setFallingDirection(const Ogre::Vector3 &value) { mFallingDirection = value; } - const Ogre::Vector3 getFallingDirection() const { return mFallingDirection; } - - /// Set manual camera speed for all viewports. - void setManualCameraSpeed(const Ogre::Vector3 &value); - - /// Set auto camera speed everywhere.o - void setAutoCameraSpeed(); - - /** Automatically disable compositors when intensity is low. - * A negative value always enable the compositor. - * @note: Ogre::CompositorInstance allocates/frees resources when - * enabling or disabling. That is expensive. - */ - inline void setAutoDisableThreshold (Real value) { mAutoDisableThreshold = value; } - inline Real getAutoDisableThreshold () const { return mAutoDisableThreshold; } - - /** Automatically scale camera speed. - * - * This is multiplied per-component with camera speed; manual or - * automatic. It's most useful for automatic camera speed to control - * how much of an effect moving the camera has on rain drop directions. - * - * The components should probably be equal. - * - * Default in Ogre::Vector3::UNIT_SCALE - */ - inline void setCameraSpeedScale (const Ogre::Vector3& value) { - mCameraSpeedScale = value; - } - inline const Ogre::Vector3 getCameraSpeedScale () const { - return mCameraSpeedScale; - } - - /** Set an equal camera speed scale in all dimensions. - */ - inline void setCameraSpeedScale (Ogre::Real value) { - setCameraSpeedScale(Ogre::Vector3::UNIT_SCALE * value); - } - - /** Update the the precipitation controller. - * @param secondsSinceLastFrame Number of secods since the last frame. - */ - void update(Real secondsSinceLastFrame, Ogre::ColourValue colour); - - PrecipitationController( - Ogre::SceneManager *sceneMgr); - ~PrecipitationController(); - - public: - typedef std::map ViewportInstanceMap; - ViewportInstanceMap mViewportInstanceMap; - - public: - /// Add precipitation to a certain viewport. - PrecipitationInstance* createViewportInstance(Ogre::Viewport* viewport); - - /// Remove precipitation from a certain viewport. - void destroyViewportInstance(Ogre::Viewport* viewport); - - /// Get per-viewport instance, or null if not created yet. - PrecipitationInstance* getViewportInstance(Ogre::Viewport* viewport); - - /// Remove from all attached viewports; clean up. - void destroyAllViewportInstances(); - }; - - /** Per-viewport instance of precipitation. - * This will create and control an ogre::CompositorInstance. - */ - class PrecipitationInstance: private Ogre::CompositorInstance::Listener - { - private: - friend class PrecipitationController; - - PrecipitationController* mParent; - Ogre::Viewport* mViewport; - Ogre::CompositorInstance* mCompInst; - Ogre::Camera* mLastCamera; - Ogre::Vector3 mLastCameraPosition; - Ogre::Vector3 mCameraSpeed; - bool mAutoCameraSpeed; - - virtual void notifyMaterialSetup(uint pass_id, Ogre::MaterialPtr &mat); - virtual void notifyMaterialRender(uint pass_id, Ogre::MaterialPtr &mat); - - /// Called to enforce parameters on a composing material - /// Called from notifyMaterialRender. - void _updateMaterialParams( - const Ogre::MaterialPtr& mat, - const Ogre::Camera* cam, - const Ogre::Vector3& camSpeed); - - // Add remove the compositors. Do nothing if already added/removed - void createCompositor (); - void destroyCompositor (); - - // Check if the compositor should be enabled - bool shouldBeEnabled () const; - - /// Called from the parent's update. - void _update(); - - public: - inline Ogre::Viewport* getViewport() const { return mViewport; } - inline PrecipitationController* getParent() const { return mParent; } - inline Ogre::CompositorInstance* getCompositorInstance() const { return mCompInst; } - - /// Check if camera speed is automatically calculated (default true). - bool getAutoCameraSpeed(); - - /** Set camera speed to automatic calculation. - * - * @warning: This runs into difficult precission issues. It is - * better to use setManualCameraSpeed. - */ - void setAutoCameraSpeed(); - - /// Set manual camera speed; disables automatic calculation. - void setManualCameraSpeed(const Ogre::Vector3& value); - - /// Get current camera speed. Doesn't include CameraSpeedScale. - const Ogre::Vector3 getCameraSpeed(); - - PrecipitationInstance(PrecipitationController* parent, Ogre::Viewport* view); - virtual ~PrecipitationInstance(); - - private: - struct Params { - void setup(Ogre::GpuProgramParametersSharedPtr fpParams); - - Ogre::GpuProgramParametersSharedPtr fpParams; - FastGpuParamRef precColor; - FastGpuParamRef intensity; - FastGpuParamRef dropSpeed; - FastGpuParamRef corner1; - FastGpuParamRef corner2; - FastGpuParamRef corner3; - FastGpuParamRef corner4; - FastGpuParamRef deltaX; - FastGpuParamRef deltaY; - } mParams; - - }; -} - -#endif //CAELUM__PRECIPITATION_CONTROLLER_H diff --git a/extern/caelum/include/PrivatePtr.h b/extern/caelum/include/PrivatePtr.h deleted file mode 100644 index 3bb08a364..000000000 --- a/extern/caelum/include/PrivatePtr.h +++ /dev/null @@ -1,264 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2008 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -#ifndef CAELUM__PRIVATE_PTR_H -#define CAELUM__PRIVATE_PTR_H - -#include "CaelumPrerequisites.h" - -namespace Caelum -{ - /** Default traits for Caelum::PrivatePtr. - * - * This default traits class make PrivatePtr work like std::auto_ptr. - * Other Traits classes can derive from this and only customize some of - * the functions. - * - * @see PrivatePtr - */ - template - struct DefaultPrivatePtrTraits - { - /// The type of the inner member to hold in PrivatePtr - typedef PointedT* InnerPointerType; - - /// Return an InnerPointerType repressenting a null value. - static inline const InnerPointerType getNullValue() { - return 0; - } - - /// Convert InnerPointerType to a naked PointedT. - static inline PointedT* getPointer (const InnerPointerType& inner) { - return inner; - } - - /// Destroy the inner value (and set null). - static void destroy (InnerPointerType& inner) - { - delete inner; - inner = 0; - } - }; - - /** Template for smart pointers with strict unique ownership. - * A lot of objects in Ogre are created and destroyed through other - * "Manager" objects. Even though the memory for such objects is never - * actually leaked better lifetime control is frequently useful. - * - * PrivatePtr is very similar in behaviour to std::auto_ptr but tries - * to mimic Ogre::SharedPtr method names. Only one PrivatePtr must exist to - * a certain object at any one time. Assignment and copy construction will - * in fact pass away ownership and set the original PrivatePtr to null. - * - * This very limited functionality makes PrivatePtr very efficient; it should - * have no overhead compared to doing the same thing manually. - * - * PrivatePtr supports customization through a static traits class which - * can customize what happens when the PrivatePtr is destroyed. This makes - * it possible to use PrivatePtr classes for fine control over the lifetime - * of objects which are otherwise managed by an external class. - * - * @see DefaultPrivatePtrTraits - */ - template > - class PrivatePtr - { - private: - /// Brings InnerPointerType as a type in this scope. - typedef typename TraitsT::InnerPointerType InnerPointerType; - - /// Inner data member. - InnerPointerType mInner; - - public: - /** Change the inner value. - * This will destroy the old value and gain ownership of the new value. - */ - void reset (const InnerPointerType& newInner = TraitsT::getNullValue()) { - if (mInner == newInner) { - return; - } - TraitsT::destroy (mInner); - mInner = newInner; - } - - InnerPointerType release () { - InnerPointerType result = mInner; - mInner = TraitsT::getNullValue(); - return result; - } - - /** Constructor; always initialize to 0. - */ - PrivatePtr () { mInner = TraitsT::getNullValue (); } - - /** Initializing constructur - */ - PrivatePtr (const InnerPointerType& inner) { mInner = inner; } - - /** Non-virtual destructor (don't derive from this). - */ - ~PrivatePtr () { setNull(); } - - /** Copy constructor; clears right-hand-side. - */ - PrivatePtr (PrivatePtr& rhs) - { - if (&rhs != this) { - this->reset (rhs.mInner); - rhs.mInner = TraitsT::getNullValue (); - } - } - - /** Assignment - */ - const PrivatePtr& operator= (PrivatePtr& rhs) - { - if (&rhs != this) { - this->reset (rhs.mInner); - rhs.mInner = TraitsT::getNullValue (); - } - return *this; - } - - /// Check if this is null. - bool isNull () const { return mInner == TraitsT::getNullValue (); } - - /// Set to null and destroy contents (if any). - void setNull () { - TraitsT::destroy (mInner); - assert(this->isNull()); - } - - PointedT* getPointer () const { return TraitsT::getPointer (mInner); } - PointedT* get () const { return getPointer (); } - PointedT* operator-> () const { return getPointer (); } - PointedT& operator* () const{ return *getPointer (); } - }; - - /** PrivatePtr traits for a movable object. - * This kind of pointer will remove the movable from the scene and destroy it. - */ - template - struct MovableObjectPrivatePtrTraits: public DefaultPrivatePtrTraits - { - typedef MovableT* InnerPointerType; - - static void destroy (InnerPointerType& inner) - { - if (inner != 0) { - //Ogre::LogManager::getSingletonPtr ()->logMessage ( - // "PrivatePtr: Destroying movable object " + inner->getName ()); - inner->_getManager ()->destroyMovableObject (inner); - inner = 0; - } - } - }; - - typedef PrivatePtr > PrivateMovableObjectPtr; - typedef PrivatePtr > PrivateBillboardChainPtr; - typedef PrivatePtr > PrivateBillboardSetPtr; - typedef PrivatePtr > PrivateEntityPtr; - typedef PrivatePtr > PrivateLightPtr; - typedef PrivatePtr > PrivateManualObjectPtr; - typedef PrivatePtr > PrivateParticleSystemPtr; - - /** PrivatePtr traits for a scene node. - * Scene nodes are created and destroyed through the scene manager. - * @see PrivatePrivateSceneNodePtr - */ - struct SceneNodePrivatePtrTraits: public DefaultPrivatePtrTraits - { - static void destroy (InnerPointerType& inner) - { - if (inner) { - //Ogre::LogManager::getSingletonPtr ()->logMessage ( - // "PrivatePtr: Destroying scene node " + inner->getName ()); - inner->getCreator ()->destroySceneNode (inner->getName ()); - inner = 0; - } - } - }; - - typedef PrivatePtr PrivateSceneNodePtr; - - /** PrivatePtr traits for uniquely-owned resources. - * - * All ogre resources are tracked by a resource managed by name and can - * be globally referenced from multiple places. This traits class allows - * you to hold a pointer to a resource which you create and completely - * control. - * - * The best example of this is a cloned material. It is frequently useful - * to create a clone of an existing material and tweak settings for one - * particular usage. After the clone is no longer useful the material must - * be explicitly removed from the MaterialManager. Otherwise an unloaded - * resource handle is leaked. - * - * When the PrivatePtr gets out of scope the resource is removed from the - * manager. In debug mode this will also check that there are no other - * references to the destroyed resource. - */ - template - struct PrivateResourcePtrTraits - { - typedef InnerT InnerPointerType; - - static const InnerT getNullValue () { - return InnerT(); - } - - static PointedT* getPointer (const InnerPointerType& inner) { - return inner.getPointer (); - } - - static void destroy (InnerPointerType& inner) { - if (!inner.isNull ()) { - //Ogre::LogManager::getSingletonPtr ()->logMessage ( - // "PrivateResourcePtrTraits: Destroying owned resource" - // " name=" + inner->getName () + - // " handle=" + Ogre::StringConverter::toString (inner->getHandle ()) ); - ManagerT::getSingletonPtr ()->remove (inner->getHandle ()); - assert (inner.unique () && "Resource pointer not unique after destruction"); - inner.setNull(); - } - } - }; - - typedef PrivatePtr < - Ogre::Material, - PrivateResourcePtrTraits < - Ogre::Material, - Ogre::MaterialPtr, - Ogre::MaterialManager - > - > PrivateMaterialPtr; - - typedef PrivatePtr < - Ogre::Mesh, - PrivateResourcePtrTraits < - Ogre::Mesh, - Ogre::MeshPtr, - Ogre::MeshManager - > - > PrivateMeshPtr; -} - -#endif // CAELUM__PRIVATE_PTR_H diff --git a/extern/caelum/include/SkyDome.h b/extern/caelum/include/SkyDome.h deleted file mode 100644 index 884a3e277..000000000 --- a/extern/caelum/include/SkyDome.h +++ /dev/null @@ -1,119 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2006-2007 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -#ifndef CAELUM__SKYDOME_H -#define CAELUM__SKYDOME_H - -#include "CaelumPrerequisites.h" -#include "CameraBoundElement.h" -#include "FastGpuParamRef.h" -#include "PrivatePtr.h" - -namespace Caelum -{ - /** A sky dome element. - */ - class CAELUM_EXPORT SkyDome : public CameraBoundElement - { - private: - /** Name of the spheric dome resource. - */ - static const Ogre::String SPHERIC_DOME_NAME; - - /** Name of the dome material. - */ - static const Ogre::String SKY_DOME_MATERIAL_NAME; - - /// Control scene node. - PrivateSceneNodePtr mNode; - - /// Sky dome material. - PrivateMaterialPtr mMaterial; - - /// Sky dome entity. - PrivateEntityPtr mEntity; - - private: - /// True if selected technique has shaders. - bool mShadersEnabled; - - /// If haze is enabled. - bool mHazeEnabled; - - public: - /** Constructor - * This will setup some nice defaults. - * @param sceneMgr The scene manager where this sky dome will be created. - */ - SkyDome (Ogre::SceneManager *sceneMgr, Ogre::SceneNode *caelumRootNode); - - /** Destructor - */ - virtual ~SkyDome (); - - /** Sets the sun direction. - @param dir The sun light direction. - */ - void setSunDirection (const Ogre::Vector3& dir); - - /// Explicit haze colour. - void setHazeColour (const Ogre::ColourValue& hazeColour); - - /// Set the sky color gradients image. - void setSkyGradientsImage (const Ogre::String& gradients); - - /// Set the atmosphere depthh gradient image. - void setAtmosphereDepthImage (const Ogre::String& gradients); - - /** Enable or disable skydome haze. This makes the sky darker. - * By default haze is disabled. - */ - void setHazeEnabled (bool value); - - /// If skydome haze is enabled. - bool getHazeEnabled () const; - - void setQueryFlags (uint flags) { mEntity->setQueryFlags (flags); } - uint getQueryFlags () const { return mEntity->getQueryFlags (); } - void setVisibilityFlags (uint flags) { mEntity->setVisibilityFlags (flags); } - uint getVisibilityFlags () const { return mEntity->getVisibilityFlags (); } - - public: - /// Handle camera change. - virtual void notifyCameraChanged (Ogre::Camera *cam); - - protected: - /// Handle far radius. - virtual void setFarRadius (Ogre::Real radius); - - private: - struct Params { - void setup(Ogre::GpuProgramParametersSharedPtr vpParams, Ogre::GpuProgramParametersSharedPtr fpParams); - - Ogre::GpuProgramParametersSharedPtr vpParams; - Ogre::GpuProgramParametersSharedPtr fpParams; - FastGpuParamRef sunDirection; - FastGpuParamRef offset; - FastGpuParamRef hazeColour; - } mParams; - }; -} - -#endif //CAELUM__SKYDOME_H diff --git a/extern/caelum/include/SkyLight.h b/extern/caelum/include/SkyLight.h deleted file mode 100644 index 95eeea1cc..000000000 --- a/extern/caelum/include/SkyLight.h +++ /dev/null @@ -1,175 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2008 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -#ifndef CAELUM__SKYLIGHT_H -#define CAELUM__SKYLIGHT_H - -#include "CameraBoundElement.h" - -namespace Caelum -{ - /** Base class for sky lights (sun and moon). - * Contains a directional light which can be automatically disabled when too dim. - */ - class CAELUM_EXPORT BaseSkyLight : public CameraBoundElement - { - protected: - /// The main directional light. - Ogre::Light *mMainLight; - - /// The sun scene node. - Ogre::SceneNode *mNode; - - /// Base distance of the light. - float mRadius; - - /// The latest normalised sun direction. - Ogre::Vector3 mDirection; - - /// Body sphere colour, as set by setBodyColour - Ogre::ColourValue mBodyColour; - - /// Sun light colour, as set by setLightColour - Ogre::ColourValue mLightColour; - - /// Colour multiplier for light diffuse colour. - Ogre::ColourValue mDiffuseMultiplier; - - /// Colour multiplier for light specular colour. - Ogre::ColourValue mSpecularMultiplier; - - /** Colour multiplier for ambient light colour. - * No effect, this value is only stored here. - */ - Ogre::ColourValue mAmbientMultiplier; - - /// If the light is automatically disabled beneath mAutoDisableThreshold - bool mAutoDisableLight; - - /// Threshold beneath which the light is automatically disabled. - Ogre::Real mAutoDisableThreshold; - - /// If the light is always disabled. Separate from the mAutoDisable mechanism. - bool mForceDisableLight; - - public: - /** Constructor. - @param sceneMgr The scene manager where the lights will be created. - @param caelumRootNode Root node to attach to. Should be bound to the camera. - */ - BaseSkyLight ( - Ogre::SceneManager *sceneMgr, - Ogre::SceneNode *caelumRootNode); - - /// Destructor. - virtual ~BaseSkyLight () = 0; - - /** Updates skylight parameters. - * @param direction Light direction. - * @param lightColour Color for the light source - * @param bodyColour Color to draw the body of the light (whatever that is). - */ - virtual void update ( - const Ogre::Vector3& direction, - const Ogre::ColourValue &lightColour, - const Ogre::ColourValue &bodyColour); - - /// Retrieves the latest light direction. - const Ogre::Vector3 getLightDirection () const; - - /// Set the sun direction. - virtual void setLightDirection (const Ogre::Vector3 &dir); - - /// Get current body colour, as set in setBodyColour. - const Ogre::ColourValue getBodyColour () const; - - /// Sets the colour to draw the light's body with. - virtual void setBodyColour (const Ogre::ColourValue &colour); - - /// Get current light colour, as set in setLightColour. - const Ogre::ColourValue getLightColour () const; - - /// Sets the skylight colour. - virtual void setLightColour (const Ogre::ColourValue &colour); - - /// Set diffuse multiplier for light colour - void setDiffuseMultiplier (const Ogre::ColourValue &diffuse); - - /// Set diffuse multiplier for light colour - const Ogre::ColourValue getDiffuseMultiplier () const; - - /// Set specular multiplier for light colour - void setSpecularMultiplier (const Ogre::ColourValue &specular); - - /// Set specular multiplier for light colour - const Ogre::ColourValue getSpecularMultiplier () const; - - /// Set ambient multiplier for light colour - /// This value is only stored here; the SceneManager is not touched - /// However, CaelumSystem does use this value. - void setAmbientMultiplier (const Ogre::ColourValue &ambient); - - /// Set ambient multiplier for light colour - const Ogre::ColourValue getAmbientMultiplier () const; - - /// Direct access to the Ogre::Light. - Ogre::Light* getMainLight() const; - - /// Check if the light is automatically disabled. - inline bool getAutoDisable() const { return mAutoDisableLight; } - - /** Turn on and off auto-disabling of the light when too dim. - * This is off by default. If you set it to true you probably also want to - * set the autoDisableThreshold. - * The "intensity" of the light for the threshold is calculated as the plain sum of r, g and b. - */ - inline void setAutoDisable(bool value) { mAutoDisableLight = value; } - - /// Get the auto-disable threshold. - inline Ogre::Real getAutoDisableThreshold() const { return mAutoDisableThreshold; } - - /// Set the auto-disable threshold. - inline void setAutoDisableThreshold(Ogre::Real value) { mAutoDisableThreshold = value; } - - static const Ogre::Real DEFAULT_AUTO_DISABLE_THRESHOLD; - - /// Disable the light by force; without taking intensity into account. - inline void setForceDisable(bool value) { mForceDisableLight = value; } - inline bool getForceDisable() const { return mForceDisableLight; } - - virtual void setQueryFlags (uint flags) = 0; - virtual uint getQueryFlags () const = 0; - virtual void setVisibilityFlags (uint flags) = 0; - virtual uint getVisibilityFlags () const = 0; - - protected: - /// Handle far radius. - virtual void setFarRadius (Ogre::Real radius); - - /// Temporary change main light color - void setMainLightColour(const Ogre::ColourValue &colour); - - /// If the light should be enabled for a certain value. - /// This functions takes AutoDisable and such into account. - bool shouldEnableLight(const Ogre::ColourValue &colour); - }; -} - -#endif // CAELUM__SKYLIGHT_H diff --git a/extern/caelum/include/Sun.h b/extern/caelum/include/Sun.h deleted file mode 100644 index 67c3b4121..000000000 --- a/extern/caelum/include/Sun.h +++ /dev/null @@ -1,142 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2006-2007 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -#ifndef CAELUM__SUN_H -#define CAELUM__SUN_H - -#include "CaelumPrerequisites.h" -#include "CameraBoundElement.h" -#include "SkyLight.h" -#include "PrivatePtr.h" - -namespace Caelum -{ - class BaseSkyLight; - class SphereSun; - class SpriteSun; - - typedef SpriteSun Sun; - - /** Class representing the sun as sphere with emissive color on it. - * @deprecated - */ - class CAELUM_EXPORT SphereSun : public BaseSkyLight - { - public: - /// Name of the sun material. - static const Ogre::String SUN_MATERIAL_NAME; - - private: - /// Reference to the sun material. - PrivateMaterialPtr mSunMaterial; - - /// The sun entity. - PrivateEntityPtr mSunEntity; - - public: - /** Constructor. - @param sceneMgr The scene manager where the lights will be created. - */ - SphereSun ( - Ogre::SceneManager *sceneMgr, - Ogre::SceneNode *caelumRootNode, - const Ogre::String &meshName = "sphere.mesh"); - - /** Destructor. - @note If a sun position model is in use, it will be deleted. - */ - virtual ~SphereSun (); - - /** Sets the sun sphere colour. - @param colour The colour used to draw the sun - */ - void setBodyColour (const Ogre::ColourValue &colour); - - public: - /// Handle camera change. - virtual void notifyCameraChanged (Ogre::Camera *cam); - - virtual void setQueryFlags (uint flags) { mSunEntity->setQueryFlags (flags); } - virtual uint getQueryFlags () const { return mSunEntity->getQueryFlags (); } - virtual void setVisibilityFlags (uint flags) { mSunEntity->setVisibilityFlags (flags); } - virtual uint getVisibilityFlags () const { return mSunEntity->getVisibilityFlags (); } - }; - - /** Class representing the sun as billboard with texture on it. - */ - class CAELUM_EXPORT SpriteSun : public BaseSkyLight - { - public: - /// Name of the sun material. - static const Ogre::String SUN_MATERIAL_NAME; - - protected: - /// The sun material. - PrivateMaterialPtr mSunMaterial; - - /// The sun sprite / billboard - PrivateBillboardSetPtr mSunBillboardSet; - - /// The sun sprite visible angle - Ogre::Degree mSunTextureAngularSize; - - public: - /** Constructor. - @param sceneMgr The scene manager where the lights will be created. - @param sunTextureAngularSize 0.53f is real angular size of Sun and Moon, 3.77f is compatible with SphereSun - */ - SpriteSun ( - Ogre::SceneManager *sceneMgr, - Ogre::SceneNode *caelumRootNode, - const Ogre::String& sunTextureName = "sun_disc.png", - const Ogre::Degree& sunTextureAngularSize = Ogre::Degree(3.77f)); - - /** Destructor. - @note If a sun position model is in use, it will be deleted. - */ - virtual ~SpriteSun (); - - /** Updates the sun material. - @param textureName The new sun texture name. - */ - void setSunTexture (const Ogre::String &textureName); - - /** Updates the sun size. - @param sunTextureAngularSize The new sun texture angular size. - */ - void setSunTextureAngularSize(const Ogre::Degree& sunTextureAngularSize); - - /** Sets the sun sphere colour. - @param colour The colour used to draw the sun - */ - void setBodyColour (const Ogre::ColourValue &colour); - - public: - /// Handle camera change. - virtual void notifyCameraChanged (Ogre::Camera *cam); - - virtual void setQueryFlags (uint flags) { mSunBillboardSet->setQueryFlags (flags); } - virtual uint getQueryFlags () const { return mSunBillboardSet->getQueryFlags (); } - virtual void setVisibilityFlags (uint flags) { mSunBillboardSet->setVisibilityFlags (flags); } - virtual uint getVisibilityFlags () const { return mSunBillboardSet->getVisibilityFlags (); } - }; -} - -#endif // CAELUM__SUN_H diff --git a/extern/caelum/include/TypeDescriptor.h b/extern/caelum/include/TypeDescriptor.h deleted file mode 100644 index ba642e33d..000000000 --- a/extern/caelum/include/TypeDescriptor.h +++ /dev/null @@ -1,271 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2008 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -#ifndef CAELUM__TYPE_DESCRIPTOR_H -#define CAELUM__TYPE_DESCRIPTOR_H - -#include "CaelumPrerequisites.h" - -#if CAELUM_TYPE_DESCRIPTORS - -#include - -namespace Caelum -{ - class ValuePropertyDescriptor; - - /** Abstract interface for a type descriptor. - * A type descriptor contains informations about the properties of - * another object. It provides access to a map of strings to - * ValuePropertyDescriptor. All methods are const. - * - * This is not a full reflection mechanism; it doesn't care about - * methods and parameters. It's just a way to access object properties - * in a uniform way. - * - * The list of properties supported by a type descriptor is fixed. - * - * The type descriptor is responsible for the lifetime of - * ValuePropertyDescriptor objects; never the user. - */ - class CAELUM_EXPORT TypeDescriptor - { - public: - virtual ~TypeDescriptor() {}; - - typedef std::map PropertyMap; - - /** Get a property descriptor; or null if not available. - * @param name Name of the property to request. - * @return A pointer to a property descriptor; or null if not available. - */ - virtual const ValuePropertyDescriptor* getPropertyDescriptor (const Ogre::String& name) const = 0; - - /** Get a map of all supported properties. - * Returns a complete list of all supported properties; by value. - */ - virtual const std::vector getPropertyNames () const = 0; - - /** Get a map of all supported properties. - * Returns a complete list of all supported properties; by value. - */ - virtual const PropertyMap getFullPropertyMap () const = 0; - }; - - /** Basic property descriptor interface. - * - * A property descriptor provides a uniform way to change the value of a - * simple property. The values are safely wrapped inside an Ogre::Any. - * - * This only works for simple properties which are copied by value. This - * includes floats strings and vectors but not things like Entity pointers. - * - * All public methods are const because the descriptor itself is not - * modified by these methods. - */ - class CAELUM_EXPORT ValuePropertyDescriptor - { - public: - virtual ~ValuePropertyDescriptor() {}; - - /** If the value of the property can be read (true means write-only). - * - * This is false for write-only properties. - * Write-only properties are generally a bad idea but they are supported. - * Scripting (with .os files) doesn't actually require reading existing values. - */ - virtual bool canGetValue () const = 0; - - /// If the value of the property can be set (false means read-only). - virtual bool canSetValue () const = 0; - - /** Get the value of the property packed in an Ogre::Any. - * - * @param target Object to fetch the property from. If target is - * not of the correct type behaviour is undefined. - */ - virtual const Ogre::Any getValue (const void* target) const = 0; - - /** Set the value of the property packed in an Ogre::Any. - * @param target Object set the property on. If target is not of - * the correct type then behaviour is undefined. - * @param value New value of the property. - */ - virtual void setValue (void* target, const Ogre::Any& value) const = 0; - - /// Get std::type_info for the type of the value. - virtual const std::type_info& getValueTypeId () const = 0; - - /** Check if this class also implements TypedValuePropertyDescriptor. - * - * If this property returns true then you can static_cast this object to - * a TypedValuePropertyDescriptor; for the appropiate ValueT. - * The appropriate ValueT can be obtained with getValueTypeId. - */ - virtual bool implementsTypedValuePropertyDescriptor () const { - return false; - } - }; - - /** Variant of ValuePropertyDescriptor which allows faster typed get/set methods. - */ - template - class CAELUM_EXPORT TypedValuePropertyDescriptor: public ValuePropertyDescriptor - { - public: - /// Get the property's value. - virtual const ValueT getValueTyped (const void* target) const = 0; - /// Set the property's value. - virtual void setValueTyped (void* target, const ValueT& value) const = 0; - - private: - virtual const Ogre::Any getValue (const void* target) const { - return Ogre::Any(this->getValueTyped (target)); - } - - virtual void setValue (void* target, const Ogre::Any& value) const { - this->setValueTyped (target, Ogre::any_cast(value)); - } - - virtual const std::type_info& getValueTypeId () const { - return typeid(ValueT); - } - - virtual bool implementsTypedValuePropertyDescriptor () const { - return true; - } - }; - - /** ValuePropertyDescriptor implementation based on function pointers to get/set methods. - */ - template - class AccesorPropertyDescriptor: public TypedValuePropertyDescriptor - { - public: - typedef void(TargetT::*SetFunc)(InParamT); - typedef OutParamT(TargetT::*GetFunc)(void) const; - - private: - GetFunc mGetFunc; - SetFunc mSetFunc; - - public: - AccesorPropertyDescriptor (GetFunc getFunc, SetFunc setFunc) - { - mGetFunc = getFunc; - mSetFunc = setFunc; - } - - virtual bool canGetValue () const { - return mGetFunc != 0; - } - - virtual bool canSetValue () const { - return mSetFunc != 0; - } - - virtual const ParamT getValueTyped(const void* target) const - { - const TargetT* typedTarget = reinterpret_cast(target); - return (typedTarget->*mGetFunc)(); - } - - virtual void setValueTyped(void* target, const ParamT& value) const - { - TargetT* typedTarget = reinterpret_cast(target); - (typedTarget->*mSetFunc)(value); - } - }; - - /** Default implementation of a TypeDescriptor. - * This is a standard implementation of a type descriptor. - * - * It allows direct access to an internal PropertyMap. The user must - * manually fill the map with property descriptors; probably in an init - * method of sorts. - */ - class DefaultTypeDescriptor: public TypeDescriptor - { - public: - DefaultTypeDescriptor (); - virtual ~DefaultTypeDescriptor (); - - /** Direct access to the internal property map. - * Get the property map used to implement this type descriptor. - * Once initialisation is complete the property map should no longer - * be modified. - */ - inline PropertyMap& getPropertyMap () { return mPropertyMap; } - - /// Add a property. Type descriptor takes ownership. - void add (const Ogre::String& name, const ValuePropertyDescriptor* descriptor); - - /// Clear the property map; delete all property descriptors. - void clear (); - - /// @copydoc TypeDescriptor::getPropertyDescriptor - virtual const ValuePropertyDescriptor* getPropertyDescriptor (const Ogre::String& name) const; - - /// @copydoc TypeDescriptor::getPropertyNames - virtual const std::vector getPropertyNames () const; - - /// @copydoc TypeDescriptor::getFullPropertyMap - virtual const PropertyMap getFullPropertyMap () const; - - private: - void deleteAllPropertyDescriptors (); - - PropertyMap mPropertyMap; - }; - - /** Standard type descriptors for caelum components. - * - * This class hold pointers to several type descriptors for classes - * inside Caelum. All the pointers are initialize in the contructor and - * properly destroyed in the destructor. - * - * The CaelumPlugin singleton contains a const instance of this class. You - * should fetch that instead of creating a new object; using - * CaelumPlugin::getTypeDescriptorData(). - */ - class CAELUM_EXPORT CaelumDefaultTypeDescriptorData - { - private: - void load(); - void unload(); - - public: - CaelumDefaultTypeDescriptorData(); - ~CaelumDefaultTypeDescriptorData(); - - DefaultTypeDescriptor* CaelumSystemTypeDescriptor; - DefaultTypeDescriptor* PointStarfieldTypeDescriptor; - DefaultTypeDescriptor* BaseSkyLightTypeDescriptor; - DefaultTypeDescriptor* GroundFogTypeDescriptor; - DefaultTypeDescriptor* PrecipitationTypeDescriptor; - DefaultTypeDescriptor* DepthComposerTypeDescriptor; - DefaultTypeDescriptor* FlatCloudLayerTypeDescriptor; - DefaultTypeDescriptor* SkyDomeTypeDescriptor; - }; -} - -#endif // CAELUM_TYPE_DESCRIPTORS - -#endif // CAELUM__TYPE_DESCRIPTOR_H diff --git a/extern/caelum/include/UniversalClock.h b/extern/caelum/include/UniversalClock.h deleted file mode 100644 index 870df3172..000000000 --- a/extern/caelum/include/UniversalClock.h +++ /dev/null @@ -1,111 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2006-2008 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -#ifndef UNIVERSALCLOCK_H -#define UNIVERSALCLOCK_H - -#include "CaelumPrerequisites.h" - -namespace Caelum { - - /** The system's time model. - * This class is responsible of keeping track of current astronomical time - * and syncronising with ogre time. - * - * It maintains a snapshot point: At mCurrentTime == 0 julian day was mJulianDayBase. - * At any time the julian day can be calculated from mCurrentTime and mJulianDayBase. - * This increases precission; mCurrentTime is tracked in seconds while mJulianDayBase - * uses days. It would be silly to track the current time in days. - */ - class CAELUM_EXPORT UniversalClock - { - private: - /// Astronomical julian day at mCurrentTime = 0; - LongReal mJulianDayBase; - - /// Seconds since mJulianDayBase. - LongReal mCurrentTime; - - /// Seconds since mJulianDayBase at last update. - LongReal mLastUpdateTime; - - /// Time scale. - Ogre::Real mTimeScale; - - public: - /** Number of seconds per day; exactly 60*60*24. - */ - static const LongReal SECONDS_PER_DAY; - - /** Constructor. - */ - UniversalClock (); - - /** Sets the time scale. - * @param scale The new time scale. If negative, time will move backwards; 2.0 means double speed... - */ - void setTimeScale (const Ogre::Real scale); - - /** Gets the time scale. - * @return The current time scale. Defaults to 1. - */ - Ogre::Real getTimeScale () const; - - /** Updates the clock. - * @param time The time to be added to the clock. It will beaffected by the time scale. - */ - void update (const Ogre::Real time); - - /** Set the current time as a julian day. - * Set the current time as a julian day, which you build using one - * of the static getJulianDayFromXXX functions. - * Defaults to J2000 (noon january 1st) - */ - void setJulianDay(LongReal value); - - /** Set the current time as a gregorian date. - * This is here as an easy to use function. - */ - void setGregorianDateTime( - int year, int month, int day, - int hour, int minute, double second); - - /** Get current julian day. - */ - LongReal getJulianDay() const; - - /** Get the difference in julian day between this and the last update. - * This is most likely very small and unprecise. - */ - LongReal getJulianDayDifference() const; - - /** Get the current julian second (getJulianDay * SECONDS_PER_DAY) - * This is most likely very very large and unprecise. - */ - LongReal getJulianSecond() const; - - /** Get the difference in seconds between this and the last update. - * This is what you want for per-frame updates. - */ - LongReal getJulianSecondDifference() const; - }; -} - -#endif //UNIVERSALCLOCK_H diff --git a/extern/caelum/resources/AtmosphereDepth.png b/extern/caelum/resources/AtmosphereDepth.png deleted file mode 100755 index afc6ff8c9..000000000 Binary files a/extern/caelum/resources/AtmosphereDepth.png and /dev/null differ diff --git a/extern/caelum/resources/CaelumGroundFog.cg b/extern/caelum/resources/CaelumGroundFog.cg deleted file mode 100755 index 3f10bf3aa..000000000 --- a/extern/caelum/resources/CaelumGroundFog.cg +++ /dev/null @@ -1,141 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2006-2007 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -// Returns (exp(x) - 1) / x; avoiding division by 0. -// lim when x -> 0 is 1. -float expdiv(float x) { - if (abs(x) < 0.0001) { - return 1; - } else { - return (exp(x) - 1) / x; - } -} - -// Return fogging through a layer of fog which drops exponentially by height. -// -// Standard exp fog with constant density would return (1 - exp(-density * dist)). -// This function assumes a variable density vd = exp(-verticalDecay * h - baseLevel) -// Full computation is exp(density * dist / (h2 - h1) * int(h1, h2, exp(-verticalDecay * (h2 - h1)))). -// -// This will gracefully degrade to standard exp fog in verticalDecay is 0; without throwing NaNs. -float ExpGroundFog ( - float dist, float h1, float h2, - float density, float verticalDecay, float baseLevel) -{ - float deltaH = (h2 - h1); - return 1 - exp (-density * dist * exp(verticalDecay * (baseLevel - h1)) * expdiv(-verticalDecay * deltaH)); -} - -// Just like ExpGroundFog with h2 = positive infinity -// When h2 == negative infinity the value is always +1. -float ExpGroundFogInf ( - float invSinView, float h1, - float density, float verticalDecay, float baseLevel) -{ - return 1 - exp (-density * invSinView * exp(verticalDecay * (baseLevel - h1)) * (1 / verticalDecay)); -} - -// Entry point for GroundFog vertex program. -void GroundFog_vp -( - float4 position : POSITION, - - out float4 oPosition : POSITION, - out float4 worldPos : TEXCOORD0, - - uniform float4x4 worldViewProj, - uniform float4x4 world -) { - oPosition = mul(worldViewProj, position); - worldPos = mul(world, position); -} - -// Entry point for GroundFog fragment program. -void GroundFog_fp -( - in float3 worldPos : TEXCOORD0, - - uniform float3 camPos, - uniform float4 fogColour, - uniform float fogDensity, - uniform float fogVerticalDecay, - uniform float fogGroundLevel, - - out float4 oCol : COLOR -) { - float h1 = camPos.y; - float h2 = worldPos.y; - float dist = length(camPos - worldPos); - float fog = ExpGroundFog( - dist, h1, h2, - fogDensity, fogVerticalDecay, fogGroundLevel); - - oCol.rgb = fogColour.rgb; - oCol.a = fog; -} - -// Entry point for GroundFogDome vertex program. -void GroundFogDome_vp -( - in float4 position : POSITION, - out float4 oPosition : POSITION, - out float3 relPosition : TEXCOORD0, - uniform float4x4 worldViewProj -) { - oPosition = mul(worldViewProj, position); - relPosition = normalize(position.xyz); -} - -// Entry point for the GroundFogDome fragment program. -void GroundFogDome_fp -( - in float3 relPosition : TEXCOORD0, - - uniform float cameraHeight, - uniform float4 fogColour, - uniform float fogDensity, - uniform float fogVerticalDecay, - uniform float fogGroundLevel, - - out float4 oCol : COLOR -) { - // Fog magic. - float invSinView = 1 / (relPosition.y); - float h1 = cameraHeight; - float aFog; - - if (fogVerticalDecay < 1e-7) { - // A value of zero of fogVerticalDecay would result in maximum (1) aFog everywhere. - // Output 0 zero instead to disable. - aFog = 0; - } else { - if (invSinView < 0) { - // Gazing into the abyss - aFog = 1; - } else { - aFog = saturate (ExpGroundFogInf ( - invSinView, h1, - fogDensity, fogVerticalDecay, fogGroundLevel)); - } - } - - oCol.a = aFog; - oCol.rgb = fogColour.rgb; -} \ No newline at end of file diff --git a/extern/caelum/resources/CaelumLayeredClouds.cg b/extern/caelum/resources/CaelumLayeredClouds.cg deleted file mode 100755 index a5cbce510..000000000 --- a/extern/caelum/resources/CaelumLayeredClouds.cg +++ /dev/null @@ -1,217 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2006-2007 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -// Global cloud textures -sampler cloud_shape1 : register(s0); -sampler cloud_shape2 : register(s1); -sampler cloud_detail : register(s2); - -// Get cloud layer intensity at a certain point. -float LayeredClouds_intensity -( - in float2 pos, - float cloudMassInvScale, - float cloudDetailInvScale, - float2 cloudMassOffset, - float2 cloudDetailOffset, - float cloudMassBlend, - float cloudDetailBlend, - float cloudCoverageThreshold -) -{ - // Calculate the base alpha - float2 finalMassOffset = cloudMassOffset + pos; - float aCloud = lerp(tex2D(cloud_shape1, finalMassOffset * cloudMassInvScale).r, - tex2D(cloud_shape2, finalMassOffset * cloudMassInvScale).r, - cloudMassBlend); - float aDetail = tex2D(cloud_detail, (cloudDetailOffset + pos) * cloudDetailInvScale).r; - aCloud = (aCloud + aDetail * cloudDetailBlend) / (1 + cloudDetailBlend); - return max(0, aCloud - cloudCoverageThreshold); -} - -// Entry point for Cloud vertex program. -void LayeredClouds_vp -( - in float4 position : POSITION, - in float2 uv : TEXCOORD0, - - uniform float4x4 worldViewProj, - uniform float4x4 worldMatrix, - uniform float3 sunDirection, - - out float4 oPosition : POSITION, - out float2 oUv : TEXCOORD0, - out float3 relPosition : TEXCOORD1, - out float sunGlow : TEXCOORD2, - out float4 worldPosition : TEXCOORD3 -) { - - oPosition = mul(worldViewProj, position); - worldPosition = mul(worldMatrix, position); - oUv = uv; - - // This is the relative position, or view direction. - relPosition = normalize (position.xyz); - - // Calculate the angle between the direction of the sun and the current - // view direction. This we call "glow" and ranges from 1 next to the sun - // to -1 in the opposite direction. - sunGlow = dot (relPosition, normalize (-sunDirection)); -} - -float4 OldCloudColor -( - float2 uv, - float3 relPosition, - float sunGlow, - - uniform float cloudMassInvScale, - uniform float cloudDetailInvScale, - uniform float2 cloudMassOffset, - uniform float2 cloudDetailOffset, - uniform float cloudMassBlend, - uniform float cloudDetailBlend, - - uniform float cloudCoverageThreshold, - - uniform float4 sunColour, - uniform float4 fogColour, - uniform float cloudSharpness, - uniform float cloudThickness - -) { - // Initialize output. - float4 oCol = float4(1, 1, 1, 0); - - // Get cloud intensity. - float intensity = LayeredClouds_intensity - ( - uv, - cloudMassInvScale, - cloudDetailInvScale, - cloudMassOffset, - cloudDetailOffset, - cloudMassBlend, - cloudDetailBlend, - cloudCoverageThreshold - ); - - // Opacity is exponential. - float aCloud = saturate(exp(cloudSharpness * intensity) - 1); - - float shine = pow(saturate(sunGlow), 8) / 4; - sunColour.rgb *= 1.5; - float3 cloudColour = fogColour.rgb * (1 - intensity / 3); - float thickness = saturate(0.8 - exp(-cloudThickness * (intensity + 0.2 - shine))); - - oCol.rgb = lerp(sunColour.rgb, cloudColour.rgb, thickness); - oCol.a = aCloud; - - return oCol; -} - -//Converts a color from RGB to YUV color space -//the rgb color is in [0,1] [0,1] [0,1] range -//the yuv color is in [0,1] [-0.436,0.436] [-0.615,0.615] range -float3 YUVfromRGB(float3 col) -{ - return float3(dot(col, float3(0.299,0.587,0.114)), - dot(col, float3(-0.14713,-0.28886,0.436)), - dot(col, float3(0.615,-0.51499,-0.10001))); -} - -float3 RGBfromYUV(float3 col) -{ - return float3(dot(col,float3(1,0,1.13983)), - dot(col,float3(1,-0.39465,-0.58060)), - dot(col,float3(1,2.03211,0))); -} - -// Creates a color that has the intensity of col1 and the chrominance of col2 -float3 MagicColorMix(float3 col1, float3 col2) -{ - return saturate(RGBfromYUV(float3(YUVfromRGB(col1).x, YUVfromRGB(col2).yz))); -} - -// Entry point for Cloud fragment program. -void LayeredClouds_fp -( - in float2 uv : TEXCOORD0, - in float3 relPosition : TEXCOORD1, - in float sunGlow : TEXCOORD2, - in float4 worldPosition : TEXCOORD3, - - uniform float cloudMassInvScale, - uniform float cloudDetailInvScale, - uniform float2 cloudMassOffset, - uniform float2 cloudDetailOffset, - uniform float cloudMassBlend, - uniform float cloudDetailBlend, - - uniform float cloudCoverageThreshold, - - uniform float4 sunLightColour, - uniform float4 sunSphereColour, - uniform float4 fogColour, - uniform float4 sunDirection, - uniform float cloudSharpness, - uniform float cloudThickness, - uniform float3 camera_position, - - uniform float3 fadeDistMeasurementVector, - uniform float layerHeight, - uniform float cloudUVFactor, - uniform float heightRedFactor, - - uniform float nearFadeDist, - uniform float farFadeDist, - - out float4 oCol : COLOR -) { - uv *= cloudUVFactor; - - oCol = OldCloudColor( - uv, relPosition, sunGlow, - cloudMassInvScale, cloudDetailInvScale, - cloudMassOffset, cloudDetailOffset, - cloudMassBlend, cloudDetailBlend, - cloudCoverageThreshold, - sunLightColour, - fogColour, - cloudSharpness, - cloudThickness); - oCol.r += layerHeight / heightRedFactor; - - //float dist = distance(worldPosition.xyz, camera_position.xyz); - float dist = length((worldPosition - camera_position) * fadeDistMeasurementVector); - float aMod = 1; - if (dist > nearFadeDist) { - aMod = saturate(lerp(0, 1, (farFadeDist - dist) / (farFadeDist - nearFadeDist))); - } - float alfa = oCol.a * aMod; - - float3 cloudDir = normalize( - float3(worldPosition.x, layerHeight, worldPosition.y) - camera_position); - float angleDiff = saturate(dot(cloudDir, normalize(sunDirection.xyz))); - - float3 lCol = lerp(oCol.rgb, MagicColorMix(oCol.rgb, sunSphereColour.rgb), angleDiff); - oCol.rgb = lerp(lCol, oCol.rgb, alfa); - oCol.a = alfa; -} diff --git a/extern/caelum/resources/CaelumPhaseMoon.cg b/extern/caelum/resources/CaelumPhaseMoon.cg deleted file mode 100755 index d7f72f35a..000000000 --- a/extern/caelum/resources/CaelumPhaseMoon.cg +++ /dev/null @@ -1,61 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2006-2007 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -// Get how much of a certain point on the moon is seen (or not) because of the phase. -// uv is the rect position on moon; as seen from the earth. -// phase ranges from 0 to 2 -float MoonPhaseFactor(float2 uv, float phase) -{ - float alpha = 1.0; - - float srefx = uv.x - 0.5; - float refx = abs(uv.x - 0.5); - float refy = abs(uv.y - 0.5); - float refxfory = sqrt(0.25 - refy * refy); - float xmin = -refxfory; - float xmax = refxfory; - float xmin1 = (xmax - xmin) * (phase / 2) + xmin; - float xmin2 = (xmax - xmin) * phase + xmin; - if (srefx < xmin1) { - alpha = 0; - } else if (srefx < xmin2 && xmin1 != xmin2) { - alpha = (srefx - xmin1) / (xmin2 - xmin1); - } - - return alpha; -} - -void PhaseMoonFP -( - in float2 uv: TEXCOORD0, - uniform float phase, - uniform sampler2D moonDisc: register(s0), - out float4 outcol : COLOR -) -{ - outcol = tex2D(moonDisc, uv); - float alpha = MoonPhaseFactor(uv, phase); - - // Get luminance from the texture. - float lum = dot(outcol.rgb, float3(0.3333, 0.3333, 0.3333)); - //float lum = dot(outcol.rgb, float3(0.3, 0.59, 0.11)); - outcol.a = min(outcol.a, lum * alpha); - outcol.rgb /= lum; -} diff --git a/extern/caelum/resources/CaelumPointStarfield.cg b/extern/caelum/resources/CaelumPointStarfield.cg deleted file mode 100755 index 0155d40fc..000000000 --- a/extern/caelum/resources/CaelumPointStarfield.cg +++ /dev/null @@ -1,77 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2008 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -void StarPointVP -( - in float4 in_position : POSITION, - in float3 in_texcoord : TEXCOORD0, - - uniform float4x4 worldviewproj_matrix, - - // These params are in clipspace; not pixels - uniform float mag_scale, - uniform float mag0_size, - uniform float min_size, - uniform float max_size, - uniform float render_target_flipping, - - // width/height - uniform float aspect_ratio, - - out float2 out_texcoord : TEXCOORD0, - out float4 out_position : POSITION, - out float4 out_color : COLOR -) -{ - float4 in_color = float4(1, 1, 1, 1); - out_position = mul(worldviewproj_matrix, in_position); - out_texcoord = in_texcoord.xy; - - float magnitude = in_texcoord.z; - float size = exp(mag_scale * magnitude) * mag0_size; - - // Fade below minSize. - float fade = saturate(size / min_size); - out_color = float4(in_color.rgb, fade * fade); - - // Clamp size to range. - size = clamp(size, min_size, max_size); - - // Splat the billboard on the screen. - out_position.xy += - out_position.w * - in_texcoord.xy * - float2(size, size * aspect_ratio * render_target_flipping); -} - -void StarPointFP -( - in float4 in_color : COLOR, - in float2 in_texcoord : TEXCOORD0, - - out float4 out_color : COLOR -) -{ - out_color = in_color; - float sqlen = dot(in_texcoord, in_texcoord); - - // A gaussian bell of sorts. - out_color.a *= 1.5 * exp(-(sqlen * 8)); -} diff --git a/extern/caelum/resources/CaelumSkyDome.cg b/extern/caelum/resources/CaelumSkyDome.cg deleted file mode 100755 index 7ac81bde8..000000000 --- a/extern/caelum/resources/CaelumSkyDome.cg +++ /dev/null @@ -1,193 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2006-2007 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -float bias (float b, float x) -{ - return pow (x, log (b) / log (0.5)); -} - -float4 sunlightInscatter -( - float4 sunColour, - float absorption, - float incidenceAngleCos, - float sunlightScatteringFactor -) -{ - float scatteredSunlight = bias (sunlightScatteringFactor * 0.5, incidenceAngleCos); - - sunColour = sunColour * (1 - absorption) * float4 (0.9, 0.5, 0.09, 1); - - return sunColour * scatteredSunlight; -} - -float fogExp (float z, float density) { - return 1 - clamp (pow (2.71828, -z * density), 0, 1); -} - -void SkyDomeVP -( - in float4 position : POSITION, - in float4 normal : NORMAL, - in float2 uv : TEXCOORD0, - - uniform float lightAbsorption, - uniform float4x4 worldViewProj, - uniform float3 sunDirection, - - out float4 oPosition : POSITION, - out float4 oCol : COLOR, - out float2 oUv : TEXCOORD0, - out float incidenceAngleCos : TEXCOORD1, - out float y : TEXCOORD2, - out float3 oNormal : TEXCOORD3 -) -{ - sunDirection = normalize (sunDirection); - normal = normalize (normal); - float cosine = dot (-sunDirection, normal); - incidenceAngleCos = -cosine; - - y = -sunDirection.y; - - oPosition = mul (worldViewProj, position); - oCol = float4 (1, 1, 1, 1); - oUv = uv; - oNormal = -normal.xyz; -} - -void SkyDomeFP -( - float4 col : COLOR, - float2 uv : TEXCOORD0, - float incidenceAngleCos : TEXCOORD1, - float y : TEXCOORD2, - float3 normal : TEXCOORD3, - - uniform sampler gradientsMap : register(s0), - uniform sampler1D atmRelativeDepth : register(s1), - uniform float4 hazeColour, - uniform float offset, - - out float4 oCol : COLOR -) -{ - float4 sunColour = float4 (3, 3, 3, 1); - -#ifdef HAZE - float fogDensity = 15; - // Haze amount calculation - float invHazeHeight = 100; - float haze = fogExp (pow (clamp (1 - normal.y, 0, 1), invHazeHeight), fogDensity); -#endif // HAZE - - // Pass the colour - oCol = tex2D (gradientsMap, uv + float2 (offset, 0)) * col; - - // Sunlight inscatter - if (incidenceAngleCos > 0) - { - float sunlightScatteringFactor = 0.05; - float sunlightScatteringLossFactor = 0.1; - float atmLightAbsorptionFactor = 0.1; - - oCol.rgb += sunlightInscatter ( - sunColour, - clamp (atmLightAbsorptionFactor * (1 - tex1D (atmRelativeDepth, y).r), 0, 1), - clamp (incidenceAngleCos, 0, 1), - sunlightScatteringFactor).rgb * (1 - sunlightScatteringLossFactor); - } - -#ifdef HAZE - // Haze pass - hazeColour.a = 1; - oCol = oCol * (1 - haze) + hazeColour * haze; -#endif // HAZE -} - -void HazeVP -( - in float4 position : POSITION, - in float4 normal : NORMAL, - - uniform float4x4 worldViewProj, - uniform float4 camPos, - uniform float3 sunDirection, - - out float4 oPosition : POSITION, - out float haze : TEXCOORD0, - out float2 sunlight : TEXCOORD1 -) -{ - sunDirection = normalize (sunDirection); - oPosition = mul(worldViewProj, position); - haze = length (camPos - position); - sunlight.x = dot (-sunDirection, normalize (position - camPos)); - sunlight.y = -sunDirection.y; -} - -void HazeFP -( - in float haze : TEXCOORD0, - in float2 sunlight : TEXCOORD1, - - uniform sampler1D atmRelativeDepth : register(s0), - uniform sampler2D gradientsMap : register (s1), - uniform float4 fogColour, - - out float4 oCol : COLOR -) -{ - float incidenceAngleCos = sunlight.x; - float y = sunlight.y; - - float4 sunColour = float4 (3, 2.5, 1, 1); - - // Factor determining the amount of light lost due to absorption - float atmLightAbsorptionFactor = 0.1; - float fogDensity = 15; - - haze = fogExp (haze * 0.005, atmLightAbsorptionFactor); - - // Haze amount calculation - float invHazeHeight = 100; - float hazeAbsorption = fogExp (pow (1 - y, invHazeHeight), fogDensity); - - float4 hazeColour; - hazeColour = fogColour; - if (incidenceAngleCos > 0) { - // Factor determining the amount of scattering for the sun light - float sunlightScatteringFactor = 0.1; - // Factor determining the amount of sun light intensity lost due to scattering - float sunlightScatteringLossFactor = 0.3; - - float4 sunlightInscatterColour = sunlightInscatter ( - sunColour, - clamp ((1 - tex1D (atmRelativeDepth, y).r) * hazeAbsorption, 0, 1), - clamp (incidenceAngleCos, 0, 1), - sunlightScatteringFactor) * (1 - sunlightScatteringLossFactor); - hazeColour.rgb = - hazeColour.rgb * (1 - sunlightInscatterColour.a) + - sunlightInscatterColour.rgb * sunlightInscatterColour.a * haze; - } - - oCol = hazeColour; - oCol.a = haze; -} diff --git a/extern/caelum/resources/CloudCoverLookup.png b/extern/caelum/resources/CloudCoverLookup.png deleted file mode 100755 index 9bc45755f..000000000 Binary files a/extern/caelum/resources/CloudCoverLookup.png and /dev/null differ diff --git a/extern/caelum/resources/DepthComposer.cg b/extern/caelum/resources/DepthComposer.cg deleted file mode 100755 index 6a88308eb..000000000 --- a/extern/caelum/resources/DepthComposer.cg +++ /dev/null @@ -1,253 +0,0 @@ -// -// This file is part of Caelum. -// See http://www.ogre3d.org/wiki/index.php/Caelum -// -// Copyright (c) 2008 Caelum team. See Contributors.txt for details. -// -// Caelum is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Caelum is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with Caelum. If not, see . -// - -#ifdef EXP_GROUND_FOG - -// Returns (exp(x) - 1) / x; avoiding division by 0. -// lim when x -> 0 is 1. -float expdiv(float x) { - if (abs(x) < 0.0001) { - return 1; - } else { - return (exp(x) - 1) / x; - } -} - -// Return fogging through a layer of fog which drops exponentially by height. -// -// Standard exp fog with constant density would return (1 - exp(-density * dist)). -// This function assumes a variable density vd = exp(-verticalDecay * h - baseLevel) -// Full computation is exp(density * dist / (h2 - h1) * int(h1, h2, exp(-verticalDecay * (h2 - h1)))). -// -// This will gracefully degrade to standard exp fog in verticalDecay is 0; without throwing NaNs. -float ExpGroundFog ( - float dist, float h1, float h2, - float density, float verticalDecay, float baseLevel) -{ - float deltaH = (h2 - h1); - return 1 - exp (-density * dist * exp(verticalDecay * (baseLevel - h1)) * expdiv(-verticalDecay * deltaH)); -} - -#endif // EXP_GROUND_FOG - -#ifdef SKY_DOME_HAZE - -float bias (float b, float x) -{ - return pow (x, log (b) / log (0.5)); -} - -float4 sunlightInscatter -( - float4 sunColour, - float absorption, - float incidenceAngleCos, - float sunlightScatteringFactor -) -{ - float scatteredSunlight = bias (sunlightScatteringFactor * 0.5, incidenceAngleCos); - - sunColour = sunColour * (1 - absorption) * float4 (0.9, 0.5, 0.09, 1); - - return sunColour * scatteredSunlight; -} - -float fogExp (float z, float density) { - return 1 - clamp (pow (2.71828, -z * density), 0, 1); -} - -uniform sampler1D atmRelativeDepth : register(HAZE_DEPTH_TEXTURE); - -float4 CalcHaze -( - float3 worldPos, - float3 worldCamPos, - float3 hazeColour, - float3 sunDirection -) -{ - float haze = length (worldCamPos - worldPos); - float incidenceAngleCos = dot (-sunDirection, normalize (worldPos - worldCamPos)); - float y = -sunDirection.y; - - float4 sunColour = float4 (3, 2.5, 1, 1); - - // Factor determining the amount of light lost due to absorption - float atmLightAbsorptionFactor = 0.1; - float fogDensity = 15; - - haze = fogExp (haze * 0.005, atmLightAbsorptionFactor); - - // Haze amount calculation - float invHazeHeight = 100; - float hazeAbsorption = fogExp (pow (1 - y, invHazeHeight), fogDensity); - - if (incidenceAngleCos > 0) { - // Factor determining the amount of scattering for the sun light - float sunlightScatteringFactor = 0.1; - // Factor determining the amount of sun light intensity lost due to scattering - float sunlightScatteringLossFactor = 0.3; - - float4 sunlightInscatterColour = sunlightInscatter ( - sunColour, - clamp ((1 - tex1D (atmRelativeDepth, y).r) * hazeAbsorption, 0, 1), - clamp (incidenceAngleCos, 0, 1), - sunlightScatteringFactor) * (1 - sunlightScatteringLossFactor); - hazeColour = - hazeColour * (1 - sunlightInscatterColour.a) + - sunlightInscatterColour.rgb * sunlightInscatterColour.a * haze; - } - - return float4(hazeColour.rgb, haze); -} - -#endif // SKY_DOME_HAZE - -void MainFP -( - in float2 screenPos : TEXCOORD0, - - uniform float4x4 invViewProjMatrix, - uniform float4 worldCameraPos, - -#if EXP_GROUND_FOG - uniform float groundFogDensity, - uniform float groundFogVerticalDecay, - uniform float groundFogBaseLevel, - uniform float4 groundFogColour, -#endif // EXP_GROUND_FOG - -#if SKY_DOME_HAZE - uniform float3 hazeColour, - uniform float3 sunDirection, -#endif // SKY_DOME_HAZE - - sampler screenTexture: register(s0), - sampler depthTexture: register(s1), - - out float4 outColor : COLOR -) -{ - float4 inColor = tex2D(screenTexture, screenPos); - float inDepth = tex2D(depthTexture, screenPos).r; - - // Build normalized device coords; after the perspective divide. - //float4 devicePos = float4(1 - screenPos.x * 2, screenPos.y * 2 - 1, inDepth, 1); - //float4 devicePos = float4(screenPos.x * 2 - 1, 1 - screenPos.y * 2, 2 * inDepth - 1, 1); - float4 devicePos = float4(screenPos.x * 2 - 1, 1 - screenPos.y * 2, inDepth, 1); - - // Go back from device to world coordinates. - float4 worldPos = mul(invViewProjMatrix, devicePos); - - // Now undo the perspective divide and go back to "normal" space. - worldPos /= worldPos.w; - - float4 color = inColor; - -#if DEBUG_DEPTH_RENDER - //color = abs(float4(inDepth, inDepth, inDepth, 1)); - color = worldPos * float4(0.001, 0.01, 0.001, 1); -#endif // DEBUG_DEPTH_RENDER - -#if EXP_GROUND_FOG - // Ye olde ground fog. - float h1 = worldCameraPos.y; - float h2 = worldPos.y; - float dist = length(worldCameraPos - worldPos); - float fogFactor = ExpGroundFog( - dist, h1, h2, - groundFogDensity, groundFogVerticalDecay, groundFogBaseLevel); - color = lerp(color, groundFogColour, fogFactor); -#endif // EXP_GROUND_FOG - -#if SKY_DOME_HAZE - float4 hazeValue = CalcHaze ( - worldPos.xyz, - worldCameraPos.xyz, - hazeColour, - sunDirection); - color.rgb = lerp(color.rgb, hazeValue.rgb, hazeValue.a); -#endif // SKY_DOME_HAZE - - outColor = color; -} - -void DepthRenderVP -( - float4 inPos : POSITION, - - uniform float4x4 wvpMatrix, - - out float4 magic : TEXCOORD0, - out float4 outPos : POSITION -) -{ - // Standard transform. - outPos = mul(wvpMatrix, inPos); - - // Depth buffer is z/w. - // Let the GPU lerp the components of outPos. - magic = outPos; -} - -void DepthRenderFP -( - in float4 magic : TEXCOORD0, - out float4 output : COLOR -) -{ - output = float4(magic.z / magic.w); - //output = float4(magic.xy / magic.w, 1, 1); -} - -void DepthRenderAlphaRejectionVP -( - float4 inPos : POSITION, - float4 inTexcoord : TEXCOORD0, - - uniform float4x4 wvpMatrix, - - out float4 outTexcoord : TEXCOORD0, - out float4 magic : TEXCOORD1, - out float4 outPos : POSITION -) -{ - // Standard transform. - outPos = mul(wvpMatrix, inPos); - - // Depth buffer is z/w. - // Let the GPU lerp the components of outPos. - magic = outPos; - - outTexcoord = inTexcoord; -} - -void DepthRenderAlphaRejectionFP -( - in float4 texcoord : TEXCOORD0, - in float4 magic : TEXCOORD1, - sampler mainTex: register(s0), - out float4 output : COLOR -) -{ - float4 texvalue = tex2D(mainTex, texcoord.xy); -// texvalue.a = sin(100 * texcoord.x) + sin(100 * texcoord.y); - output = float4(float3(magic.z / magic.w), texvalue.a); -} diff --git a/extern/caelum/resources/DepthComposer.compositor b/extern/caelum/resources/DepthComposer.compositor deleted file mode 100755 index 466469804..000000000 --- a/extern/caelum/resources/DepthComposer.compositor +++ /dev/null @@ -1,139 +0,0 @@ -// -// This file is part of Caelum. -// See http://www.ogre3d.org/wiki/index.php/Caelum -// -// Copyright (c) 2008 Caelum team. See Contributors.txt for details. -// -// Caelum is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Caelum is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with Caelum. If not, see . -// - -compositor Caelum/DepthComposer_DebugDepthRender -{ - technique - { - texture rt0 target_width target_height PF_A8R8G8B8 - - target rt0 - { - input previous - } - - target_output - { - input none - - pass render_quad - { - material Caelum/DepthComposer_DebugDepthRender - input 0 rt0 - } - } - } -} - -compositor Caelum/DepthComposer_Dummy -{ - technique - { - texture rt0 target_width target_height PF_A8R8G8B8 - - target rt0 - { - input previous - } - - target_output - { - input none - - pass render_quad - { - material Caelum/DepthComposer_Dummy - input 0 rt0 - } - } - } -} - -compositor Caelum/DepthComposer_ExpGroundFog -{ - technique - { - texture rt0 target_width target_height PF_A8R8G8B8 - - target rt0 - { - input previous - } - - target_output - { - input none - - pass render_quad - { - material Caelum/DepthComposer_ExpGroundFog - input 0 rt0 - } - } - } -} - -compositor Caelum/DepthComposer_SkyDomeHaze -{ - technique - { - texture rt0 target_width target_height PF_A8R8G8B8 - - target rt0 - { - input previous - } - - target_output - { - input none - - pass render_quad - { - material Caelum/DepthComposer_SkyDomeHaze - input 0 rt0 - } - } - } -} - -compositor Caelum/DepthComposer_SkyDomeHaze_ExpGroundFog -{ - technique - { - texture rt0 target_width target_height PF_A8R8G8B8 - - target rt0 - { - input previous - } - - target_output - { - input none - - pass render_quad - { - material Caelum/DepthComposer_SkyDomeHaze_ExpGroundFog - input 0 rt0 - } - } - } -} diff --git a/extern/caelum/resources/DepthComposer.material b/extern/caelum/resources/DepthComposer.material deleted file mode 100755 index 510b7c97e..000000000 --- a/extern/caelum/resources/DepthComposer.material +++ /dev/null @@ -1,302 +0,0 @@ -// -// This file is part of Caelum. -// See http://www.ogre3d.org/wiki/index.php/Caelum -// -// Copyright (c) 2008 Caelum team. See Contributors.txt for details. -// -// Caelum is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Caelum is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with Caelum. If not, see . -// - -fragment_program Caelum/DepthComposerFP_Dummy cg -{ - source DepthComposer.cg - entry_point MainFP - profiles ps_3_0 arbfp1 - - default_params - { - } -} - -fragment_program Caelum/DepthComposerFP_DebugDepthRender cg -{ - source DepthComposer.cg - entry_point MainFP - profiles ps_3_0 arbfp1 - compile_arguments -DDEBUG_DEPTH_RENDER=1 - - default_params - { - param_named invViewProjMatrix float4x4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - } -} - -fragment_program Caelum/DepthComposerFP_ExpGroundFog cg -{ - source DepthComposer.cg - entry_point MainFP - profiles ps_3_0 arbfp1 - compile_arguments -DEXP_GROUND_FOG=1 - - default_params - { - param_named invViewProjMatrix float4x4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - - param_named worldCameraPos float4 0 0 0 0 - - param_named groundFogDensity float 0.1 - param_named groundFogVerticalDecay float 0.2 - param_named groundFogBaseLevel float 5 - param_named groundFogColour float4 1 0 1 1 - } -} - -fragment_program Caelum/DepthComposerFP_SkyDomeHaze cg -{ - source DepthComposer.cg - entry_point MainFP - profiles ps_3_0 arbfp1 - compile_arguments -DSKY_DOME_HAZE=1 -DHAZE_DEPTH_TEXTURE=s2 - - default_params - { - param_named invViewProjMatrix float4x4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - - param_named worldCameraPos float4 0 0 0 0 - - param_named sunDirection float3 0 1 0 - param_named hazeColour float3 0.1 0.2 0.6 - } -} - -fragment_program Caelum/DepthComposerFP_SkyDomeHaze_ExpGroundFog cg -{ - source DepthComposer.cg - entry_point MainFP - profiles ps_3_0 arbfp1 - compile_arguments -DEXP_GROUND_FOG=1 -DSKY_DOME_HAZE=1 -DHAZE_DEPTH_TEXTURE=s2 - - default_params - { - param_named invViewProjMatrix float4x4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - - param_named worldCameraPos float4 0 0 0 0 - - param_named sunDirection float3 0 1 0 - param_named hazeColour float3 0.1 0.2 0.6 - - param_named groundFogDensity float 0.1 - param_named groundFogVerticalDecay float 0.2 - param_named groundFogBaseLevel float 5 - param_named groundFogColour float4 1 0 1 1 - } -} - -material Caelum/DepthRender -{ - technique Default - { - pass Main - { - // This is required! - depth_write on - depth_check on - - vertex_program_ref Caelum/DepthRenderVP - { - } - - fragment_program_ref Caelum/DepthRenderFP - { - } - } - } -} - -// Material for rendering depth of an alpha-rejection material. -// -// Unlike the regular Caelum/DepthRender this also outputs alpha from a texture. -// The shaders (VP/FP) can be trivially used in more complex materials. -material Caelum/DepthRenderAlphaRejection -{ - technique Default - { - pass Main - { - depth_write on - depth_check on - - vertex_program_ref Caelum/DepthRenderAlphaRejectionVP - { - } - - fragment_program_ref Caelum/DepthRenderAlphaRejectionFP - { - } - - alpha_rejection greater 128 - texture_unit Main - { - } - } - } -} - -material Caelum/DepthComposer_Dummy -{ - technique Default - { - pass Main - { - vertex_program_ref Caelum/MinimalCompositorVP - { - } - - fragment_program_ref Caelum/DepthComposerFP_Dummy - { - } - - texture_unit Screen - { - filtering none - } - - texture_unit Depth - { - filtering none - } - } - } -} - -material Caelum/DepthComposer_DebugDepthRender -{ - technique Default - { - pass Main - { - vertex_program_ref Caelum/MinimalCompositorVP - { - } - - fragment_program_ref Caelum/DepthComposerFP_DebugDepthRender - { - } - - texture_unit Screen - { - filtering none - } - - texture_unit Depth - { - filtering none - } - } - } -} - -material Caelum/DepthComposer_ExpGroundFog -{ - technique Default - { - pass Main - { - vertex_program_ref Caelum/MinimalCompositorVP - { - } - - fragment_program_ref Caelum/DepthComposerFP_ExpGroundFog - { - } - - texture_unit Screen - { - filtering none - } - - texture_unit Depth - { - filtering none - } - } - } -} - -material Caelum/DepthComposer_SkyDomeHaze -{ - technique Default - { - pass Main - { - vertex_program_ref Caelum/MinimalCompositorVP - { - } - - fragment_program_ref Caelum/DepthComposerFP_SkyDomeHaze - { - } - - texture_unit Screen - { - filtering none - } - - texture_unit Depth - { - filtering none - } - - texture_unit AtmosphereDepth - { - texture AtmosphereDepth.png 1d - tex_address_mode clamp - } - } - } -} - -material Caelum/DepthComposer_SkyDomeHaze_ExpGroundFog -{ - technique Default - { - pass Main - { - vertex_program_ref Caelum/MinimalCompositorVP - { - } - - fragment_program_ref Caelum/DepthComposerFP_SkyDomeHaze_ExpGroundFog - { - } - - texture_unit Screen - { - filtering none - } - - texture_unit Depth - { - filtering none - } - - texture_unit AtmosphereDepth - { - texture AtmosphereDepth.png 1d - filtering bilinear - tex_address_mode clamp - } - } - } -} diff --git a/extern/caelum/resources/DepthRender.program b/extern/caelum/resources/DepthRender.program deleted file mode 100755 index fcce454df..000000000 --- a/extern/caelum/resources/DepthRender.program +++ /dev/null @@ -1,57 +0,0 @@ -// -// This file is part of Caelum. -// See http://www.ogre3d.org/wiki/index.php/Caelum -// -// Copyright (c) 2008 Caelum team. See Contributors.txt for details. -// -// Caelum is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Caelum is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with Caelum. If not, see . -// - -vertex_program Caelum/DepthRenderVP cg -{ - source DepthComposer.cg - entry_point DepthRenderVP - profiles vs_2_0 arbvp1 - - default_params - { - param_named_auto wvpMatrix worldviewproj_matrix - } -} - -fragment_program Caelum/DepthRenderFP cg -{ - source DepthComposer.cg - entry_point DepthRenderFP - profiles ps_3_0 fp40 arbfp1 -} - -vertex_program Caelum/DepthRenderAlphaRejectionVP cg -{ - source DepthComposer.cg - entry_point DepthRenderAlphaRejectionVP - profiles vs_2_0 arbvp1 - - default_params - { - param_named_auto wvpMatrix worldviewproj_matrix - } -} - -fragment_program Caelum/DepthRenderAlphaRejectionFP cg -{ - source DepthComposer.cg - entry_point DepthRenderAlphaRejectionFP - profiles ps_3_0 fp40 arbfp1 -} diff --git a/extern/caelum/resources/EarthClearSky2.png b/extern/caelum/resources/EarthClearSky2.png deleted file mode 100755 index f6d67bd1a..000000000 Binary files a/extern/caelum/resources/EarthClearSky2.png and /dev/null differ diff --git a/extern/caelum/resources/GroundFog.material b/extern/caelum/resources/GroundFog.material deleted file mode 100755 index 02848eac3..000000000 --- a/extern/caelum/resources/GroundFog.material +++ /dev/null @@ -1,71 +0,0 @@ -// -//This file is part of Caelum. -//See http://www.ogre3d.org/wiki/index.php/Caelum -// -//Copyright (c) 2006-2007 Caelum team. See Contributors.txt for details. -// -//Caelum is free software: you can redistribute it and/or modify -//it under the terms of the GNU Lesser General Public License as published -//by the Free Software Foundation, either version 3 of the License, or -//(at your option) any later version. -// -//Caelum is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -//GNU Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public License -//along with Caelum. If not, see . -// - -// Sample base material for using CaelumGroundFog. -material CaelumGroundFogBase -{ - technique Default - { - pass Main - { - fog_override true none - } - - // Fog pass - pass CaelumGroundFog - { - vertex_program_ref CaelumGroundFogVP - { - } - - fragment_program_ref CaelumGroundFogFP - { - } - - scene_blend alpha_blend - } - } -} - -material CaelumGroundFogDome -{ - receive_shadows off - - technique - { - pass - { - lighting off - depth_check off - depth_write off - fog_override true - scene_blend alpha_blend - cull_hardware none - - vertex_program_ref CaelumGroundFogDomeVP - { - } - - fragment_program_ref CaelumGroundFogDomeFP - { - } - } - } -} \ No newline at end of file diff --git a/extern/caelum/resources/GroundFog.program b/extern/caelum/resources/GroundFog.program deleted file mode 100755 index 82afd7dc0..000000000 --- a/extern/caelum/resources/GroundFog.program +++ /dev/null @@ -1,83 +0,0 @@ -// -//This file is part of Caelum. -//See http://www.ogre3d.org/wiki/index.php/Caelum -// -//Copyright (c) 2006-2007 Caelum team. See Contributors.txt for details. -// -//Caelum is free software: you can redistribute it and/or modify -//it under the terms of the GNU Lesser General Public License as published -//by the Free Software Foundation, either version 3 of the License, or -//(at your option) any later version. -// -//Caelum is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -//GNU Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public License -//along with Caelum. If not, see . -// - -vertex_program CaelumGroundFogVP cg -{ - source CaelumGroundFog.cg - entry_point GroundFog_vp - profiles vs_2_x arbvp1 vp30 - - default_params - { - param_named_auto worldViewProj worldviewproj_matrix - param_named_auto world world_matrix - } -} - -fragment_program CaelumGroundFogFP cg -{ - source CaelumGroundFog.cg - entry_point GroundFog_fp - profiles ps_2_x arbfp1 fp30 - - default_params - { - param_named_auto camPos camera_position - - // _auto seems wrong here, since the fog formulas are different than - // for standard exp fog. - param_named fogDensity float 0 - param_named fogVerticalDecay float 0 - param_named fogGroundLevel float 0 - param_named fogColour float4 0 0 0 0 - } -} - -vertex_program CaelumGroundFogDomeVP cg -{ - source CaelumGroundFog.cg - entry_point GroundFogDome_vp - profiles vs_2_0 arbvp1 - - default_params - { - param_named_auto worldViewProj worldviewproj_matrix - } -} - -fragment_program CaelumGroundFogDomeFP cg -{ - source CaelumGroundFog.cg - entry_point GroundFogDome_fp - profiles ps_2_0 arbfp1 - - default_params - { - // Fog parameters. - param_named fogColour float4 0 0 0 0 - param_named fogDensity float 0 - param_named fogVerticalDecay float 0 - param_named fogGroundLevel float 0 - - // Send camera height. We can't send camera_position because - // the entity is always moved with the camera. Joy. - param_named cameraHeight float 0 - } -} \ No newline at end of file diff --git a/extern/caelum/resources/Haze.program b/extern/caelum/resources/Haze.program deleted file mode 100755 index 6ddbfd87a..000000000 --- a/extern/caelum/resources/Haze.program +++ /dev/null @@ -1,44 +0,0 @@ -// -//This file is part of Caelum. -//See http://www.ogre3d.org/wiki/index.php/Caelum -// -//Copyright (c) 2006-2007 Caelum team. See Contributors.txt for details. -// -//Caelum is free software: you can redistribute it and/or modify -//it under the terms of the GNU Lesser General Public License as published -//by the Free Software Foundation, either version 3 of the License, or -//(at your option) any later version. -// -//Caelum is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -//GNU Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public License -//along with Caelum. If not, see . -// - -vertex_program CaelumHazeVP cg -{ - source CaelumSkyDome.cg - entry_point HazeVP - profiles vs_2_0 arbvp1 vp30 - - default_params - { - param_named_auto worldViewProj worldviewproj_matrix - param_named_auto camPos camera_position - } -} - -fragment_program CaelumHazeFP cg -{ - source CaelumSkyDome.cg - entry_point HazeFP - profiles ps_2_0 arbfp1 fp30 - - default_params - { - param_named_auto fogColour fog_colour - } -} diff --git a/extern/caelum/resources/LayeredClouds.material b/extern/caelum/resources/LayeredClouds.material deleted file mode 100755 index e0fff0be3..000000000 --- a/extern/caelum/resources/LayeredClouds.material +++ /dev/null @@ -1,132 +0,0 @@ -// -//This file is part of Caelum. -//See http://www.ogre3d.org/wiki/index.php/Caelum -// -//Copyright (c) 2006-2007 Caelum team. See Contributors.txt for details. -// -//Caelum is free software: you can redistribute it and/or modify -//it under the terms of the GNU Lesser General Public License as published -//by the Free Software Foundation, either version 3 of the License, or -//(at your option) any later version. -// -//Caelum is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -//GNU Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public License -//along with Caelum. If not, see . -// - -vertex_program CaelumLayeredCloudsVP cg -{ - source CaelumLayeredClouds.cg - entry_point LayeredClouds_vp - profiles vs_3_0 vp40 arbvp1 - - default_params - { - param_named_auto worldViewProj worldviewproj_matrix - param_named_auto worldMatrix world_matrix - param_named sunDirection float3 -1 -1 0 - } -} - -fragment_program CaelumLayeredCloudsFP cg -{ - source CaelumLayeredClouds.cg - entry_point LayeredClouds_fp - profiles ps_3_0 fp40 arbfp1 - - default_params - { - // Caelum sky properties - param_named sunLightColour float4 1 1 1 1 - param_named sunSphereColour float4 1 1 1 1 - param_named sunDirection float4 1 1 1 1 - - // Fog colour; used as the base cloud colour. - param_named fogColour float4 0 0 0 0 - - - // The inverse of the cloud forms scale - param_named cloudMassInvScale float 1.2 - // The inverse of the cloud details scale - param_named cloudDetailInvScale float 4.8 - - // Cloud mass offset - param_named cloudMassOffset float2 0 0 - // Cloud details offset - param_named cloudDetailOffset float2 0.5 0.5 - - // Blending factor between Cloud1 and Cloud2 - param_named cloudMassBlend float 0.9 - // Cloud detail weight. - param_named cloudDetailBlend float 0.5 - - - // Cloud coverage, between 0 and 1 - param_named cloudCoverageThreshold float 0.9 - - // Cloud sharpness. Lower values result in softer clouds. - param_named cloudSharpness float 4 - - // Cloud thickness. Bigger values results in darker clouds. - param_named cloudThickness float 3 - - param_named_auto camera_position camera_position - param_named layerHeight float 0 - - param_named cloudUVFactor float -1 - param_named heightRedFactor float -1 - - param_named nearFadeDist float -1 - param_named farFadeDist float -1 - - param_named fadeDistMeasurementVector float3 0 1 1 - } -} - -material CaelumLayeredClouds -{ - technique - { - pass - { - lighting off - depth_check on - depth_write off - scene_blend alpha_blend - fog_override true - cull_hardware none - - vertex_program_ref CaelumLayeredCloudsVP - { - } - - fragment_program_ref CaelumLayeredCloudsFP - { - } - - texture_unit Cloud1 - { - texture noise1.dds - filtering trilinear - tex_coord_set 0 - } - - texture_unit Cloud2 - { - texture noise2.dds - filtering trilinear - tex_coord_set 1 - } - - texture_unit Detail - { - texture noise4.dds - tex_coord_set 2 - } - } - } -} diff --git a/extern/caelum/resources/MinimalCompositorVP.cg b/extern/caelum/resources/MinimalCompositorVP.cg deleted file mode 100755 index dc0721c37..000000000 --- a/extern/caelum/resources/MinimalCompositorVP.cg +++ /dev/null @@ -1,39 +0,0 @@ -// -// This file is part of Caelum. -// See http://www.ogre3d.org/wiki/index.php/Caelum -// -// Copyright (c) 2008 Caelum team. See Contributors.txt for details. -// -// Caelum is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Caelum is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with Caelum. If not, see . -// - -// Fixed function does not always work. -// This is a the minimal compositor VP required. -void MinimalCompositorVP -( - in float4 in_pos : POSITION, - - uniform float4x4 worldviewproj_matrix, - - out float2 out_uv0 : TEXCOORD0, - out float4 out_pos : POSITION -) -{ - // Use standard transform. - out_pos = mul(worldviewproj_matrix, in_pos); - - // Convert to image-space - in_pos.xy = sign(in_pos.xy); - out_uv0 = (float2(in_pos.x, -in_pos.y) + 1.0f) * 0.5f; -} diff --git a/extern/caelum/resources/MinimalCompositorVP.program b/extern/caelum/resources/MinimalCompositorVP.program deleted file mode 100755 index b17e7ac43..000000000 --- a/extern/caelum/resources/MinimalCompositorVP.program +++ /dev/null @@ -1,31 +0,0 @@ -// -// This file is part of Caelum. -// See http://www.ogre3d.org/wiki/index.php/Caelum -// -// Copyright (c) 2008 Caelum team. See Contributors.txt for details. -// -// Caelum is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Caelum is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with Caelum. If not, see . -// - -vertex_program Caelum/MinimalCompositorVP cg -{ - source MinimalCompositorVP.cg - entry_point MinimalCompositorVP - profiles vs_1_1 arbvp1 - - default_params - { - param_named_auto worldviewproj_matrix worldviewproj_matrix - } -} diff --git a/extern/caelum/resources/PointStarfield.material b/extern/caelum/resources/PointStarfield.material deleted file mode 100755 index 62d39292b..000000000 --- a/extern/caelum/resources/PointStarfield.material +++ /dev/null @@ -1,80 +0,0 @@ -// -//This file is part of Caelum. -//See http://www.ogre3d.org/wiki/index.php/Caelum -// -//Copyright (c) 2008 Caelum team. See Contributors.txt for details. -// -//Caelum is free software: you can redistribute it and/or modify -//it under the terms of the GNU Lesser General Public License as published -//by the Free Software Foundation, either version 3 of the License, or -//(at your option) any later version. -// -//Caelum is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -//GNU Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public License -//along with Caelum. If not, see . -// - -vertex_program Caelum/StarPointVP cg -{ - source CaelumPointStarfield.cg - entry_point StarPointVP - profiles vs_2_0 arbvp1 vp30 - - default_params - { - param_named_auto worldviewproj_matrix worldviewproj_matrix - param_named_auto render_target_flipping render_target_flipping - - // Default parameters only here to quiet ogre. - param_named mag_scale float -1 - param_named mag0_size float -1 - param_named min_size float -1 - param_named max_size float -1 - param_named aspect_ratio float -1 - } -} - -fragment_program Caelum/StarPointFP cg -{ - source CaelumPointStarfield.cg - entry_point StarPointFP - profiles ps_2_0 arbfp1 fp30 - - default_params - { - } -} - -material Caelum/StarPoint -{ - receive_shadows off - - technique - { - pass - { - depth_check off - depth_write off - - vertex_program_ref Caelum/StarPointVP - { - } - - fragment_program_ref Caelum/StarPointFP - { - } - - scene_blend alpha_blend - - // Works with default culling: - cull_hardware clockwise - - // Override Direct3D shader fog. - fog_override true none - } - } -} diff --git a/extern/caelum/resources/Precipitation.cg b/extern/caelum/resources/Precipitation.cg deleted file mode 100755 index 1add739af..000000000 --- a/extern/caelum/resources/Precipitation.cg +++ /dev/null @@ -1,102 +0,0 @@ -// -// This file is part of Caelum. -// See http://www.ogre3d.org/wiki/index.php/Caelum -// -// Copyright (c) 2008 Caelum team. See Contributors.txt for details. -// -// Caelum is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Caelum is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with Caelum. If not, see . -// - -sampler scene: register(s0); -sampler samplerPrec: register(s1); - -uniform float intensity; -uniform float4 ambient_light_colour; - -// - - corner -uniform float4 corner1; -// + - corner -uniform float4 corner2; -// - + corner -uniform float4 corner3; -// + + corner -uniform float4 corner4; - -// The x and y coordinal deviations for all 3 layers of precipitation -uniform float4 deltaX; -uniform float4 deltaY; - -uniform float4 precColor; - -// Cartesian to cylindrical coordinates -float2 CylindricalCoordinates(float4 dir) { - float R = 0.5; - float2 res; - //cubical root is used to counteract top/bottom circle effect - dir *= R / pow(length(dir.xz), 0.33); - res.y = -dir.y; - res.x = -atan2(dir.z, dir.x); - return res; -} - -// Returns alpha value of a precipitation -// view_direction is the direction vector resulting from the eye direction,wind direction and possibly other factors -float Precipitation - ( - float2 cCoords, - float intensity, - float2 delta - ) { - cCoords -= delta; - float4 raincol = tex2D(samplerPrec, cCoords); - return (raincol.g. -// - -compositor Caelum/PrecipitationCompositor -{ - technique - { - texture rt0 target_width target_height PF_A8R8G8B8 - - target rt0 - { - input previous - } - - target_output - { - input none - - pass render_quad - { - // Renders a fullscreen quad with a material - material Caelum/PrecipitationMaterial - input 0 rt0 - } - } - } -} diff --git a/extern/caelum/resources/Precipitation.material b/extern/caelum/resources/Precipitation.material deleted file mode 100755 index 227f3c8fb..000000000 --- a/extern/caelum/resources/Precipitation.material +++ /dev/null @@ -1,69 +0,0 @@ -// -// This file is part of Caelum. -// See http://www.ogre3d.org/wiki/index.php/Caelum -// -// Copyright (c) 2008 Caelum team. See Contributors.txt for details. -// -// Caelum is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Caelum is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with Caelum. If not, see . -// - -fragment_program Caelum/PrecipitationFP cg -{ - source Precipitation.cg - entry_point MainFP - profiles ps_3_0 fp40 arbfp1 - - default_params - { - } -} - -vertex_program Caelum/PrecipitationVP cg -{ - source Precipitation.cg - entry_point MainVP - profiles vs_3_0 vp40 arbvp1 - - default_params - { - param_named_auto worldviewproj_matrix worldviewproj_matrix - } -} - -material Caelum/PrecipitationMaterial -{ - technique Default - { - pass Main - { - vertex_program_ref Caelum/PrecipitationVP - { - } - - fragment_program_ref Caelum/PrecipitationFP - { - } - - texture_unit Scene - { - } - - texture_unit Precipitation - { - texture precipitation_drizzle.png - filtering trilinear - } - } - } -} diff --git a/extern/caelum/resources/SkyDome.material b/extern/caelum/resources/SkyDome.material deleted file mode 100755 index 23bb96d38..000000000 --- a/extern/caelum/resources/SkyDome.material +++ /dev/null @@ -1,119 +0,0 @@ -// -//This file is part of Caelum. -//See http://www.ogre3d.org/wiki/index.php/Caelum -// -//Copyright (c) 2006-2007 Caelum team. See Contributors.txt for details. -// -//Caelum is free software: you can redistribute it and/or modify -//it under the terms of the GNU Lesser General Public License as published -//by the Free Software Foundation, either version 3 of the License, or -//(at your option) any later version. -// -//Caelum is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -//GNU Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public License -//along with Caelum. If not, see . -// - -fragment_program CaelumSkyDomeFP cg -{ - source CaelumSkyDome.cg - entry_point SkyDomeFP - compile_arguments -DHAZE - profiles ps_2_0 arbfp1 - - default_params - { - // Caelum sky properties - param_named offset float 0 - param_named hazeColour float4 0 0 0 0 - } -} - -fragment_program CaelumSkyDomeFP_NoHaze cg -{ - source CaelumSkyDome.cg - entry_point SkyDomeFP - profiles ps_2_0 arbfp1 - - default_params - { - // Caelum sky properties - param_named offset float 0 - } -} - -vertex_program CaelumSkyDomeVP cg -{ - source CaelumSkyDome.cg - entry_point SkyDomeVP - profiles vs_2_0 arbvp1 - - default_params - { - param_named_auto worldViewProj worldviewproj_matrix - param_named sunDirection float3 1 0 0 - } -} - -material CaelumSkyDomeMaterial -{ - receive_shadows off - - technique - { - pass - { - lighting off - depth_check off - depth_write off - scene_blend alpha_blend - fog_override true none - - vertex_program_ref CaelumSkyDomeVP - { - } - - fragment_program_ref CaelumSkyDomeFP - { - } - - texture_unit - { - texture EarthClearSky2.png 0 - tex_address_mode clamp - tex_coord_set 0 - } - - texture_unit - { - texture AtmosphereDepth.png 1d - tex_address_mode clamp - tex_coord_set 1 - } - } - } - - technique - { - pass - { - lighting off - depth_check off - depth_write off - scene_blend alpha_blend - fog_override true - - texture_unit - { - texture EarthClearSky2.png 0 - tex_address_mode clamp - tex_coord_set 0 - } - } - } -} - diff --git a/extern/caelum/resources/Starfield.jpg b/extern/caelum/resources/Starfield.jpg deleted file mode 100755 index 597072a74..000000000 Binary files a/extern/caelum/resources/Starfield.jpg and /dev/null differ diff --git a/extern/caelum/resources/Starfield.material b/extern/caelum/resources/Starfield.material deleted file mode 100755 index 71cb43ce9..000000000 --- a/extern/caelum/resources/Starfield.material +++ /dev/null @@ -1,42 +0,0 @@ -// -//This file is part of Caelum. -//See http://www.ogre3d.org/wiki/index.php/Caelum -// -//Copyright (c) 2006-2007 Caelum team. See Contributors.txt for details. -// -//Caelum is free software: you can redistribute it and/or modify -//it under the terms of the GNU Lesser General Public License as published -//by the Free Software Foundation, either version 3 of the License, or -//(at your option) any later version. -// -//Caelum is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -//GNU Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public License -//along with Caelum. If not, see . -// - -material CaelumStarfieldMaterial -{ - receive_shadows off - - technique - { - pass - { - depth_check off - depth_write off - lighting off - fog_override true - - texture_unit - { - texture Starfield.jpg 0 - tex_address_mode wrap - } - } - } -} - diff --git a/extern/caelum/resources/Sun.material b/extern/caelum/resources/Sun.material deleted file mode 100755 index 124e8ece3..000000000 --- a/extern/caelum/resources/Sun.material +++ /dev/null @@ -1,58 +0,0 @@ -// -//This file is part of Caelum. -//See http://www.ogre3d.org/wiki/index.php/Caelum -// -//Copyright (c) 2008 Caelum team. See Contributors.txt for details. -// -//Caelum is free software: you can redistribute it and/or modify -//it under the terms of the GNU Lesser General Public License as published -//by the Free Software Foundation, either version 3 of the License, or -//(at your option) any later version. -// -//Caelum is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -//GNU Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public License -//along with Caelum. If not, see . -// - -material CaelumSphereSun -{ - technique Defaulto - { - pass Main - { - depth_check off - depth_write off - fog_override true none - ambient 0 0 0 - diffuse 0 0 0 - } - } -} - -material CaelumSpriteSun -{ - receive_shadows off - technique Default - { - pass Main - { - lighting off - depth_check off - depth_write off - fog_override true none - ambient 0 0 0 - diffuse 0 0 0 - scene_blend src_colour one_minus_src_colour - alpha_rejection greater_equal 128 - emissive vertexcolour - texture_unit Texture0 - { - texture sun_disc.png 2d 0 - } - } - } -} \ No newline at end of file diff --git a/extern/caelum/resources/SunGradient.png b/extern/caelum/resources/SunGradient.png deleted file mode 100755 index 7cda1fe81..000000000 Binary files a/extern/caelum/resources/SunGradient.png and /dev/null differ diff --git a/extern/caelum/resources/moon.material b/extern/caelum/resources/moon.material deleted file mode 100755 index 6de4958eb..000000000 --- a/extern/caelum/resources/moon.material +++ /dev/null @@ -1,107 +0,0 @@ -// -//This file is part of Caelum. -//See http://www.ogre3d.org/wiki/index.php/Caelum -// -//Copyright (c) 2008 Caelum team. See Contributors.txt for details. -// -//Caelum is free software: you can redistribute it and/or modify -//it under the terms of the GNU Lesser General Public License as published -//by the Free Software Foundation, either version 3 of the License, or -//(at your option) any later version. -// -//Caelum is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -//GNU Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public License -//along with Caelum. If not, see . -// - -fragment_program Caelum/PhaseMoonFP cg -{ - source CaelumPhaseMoon.cg - entry_point PhaseMoonFP - profiles ps_2_0 arbfp1 fp30 - - default_params - { - param_named phase float 0.3 - } -} - -material Caelum/FullMoon -{ - receive_shadows off - technique Default - { - pass Main - { - lighting off - depth_check off - depth_write off - fog_override true none - ambient 0 0 0 - diffuse 0 0 0 - scene_blend alpha_blend - emissive vertexcolour - - texture_unit Texture0 - { - texture moon_disc.dds 2d - } - } - } -} - -material Caelum/PhaseMoon -{ - receive_shadows off - technique Default - { - pass Main - { - lighting off - depth_check off - depth_write off - fog_override true none - ambient 0 0 0 - diffuse 0 0 0 - scene_blend alpha_blend - - texture_unit MoonDisc - { - texture moon_disc.dds - } - - fragment_program_ref Caelum/PhaseMoonFP - { - } - } - } -} - -material Caelum/MoonBackground -{ - receive_shadows off - technique Default - { - pass Main - { - // Used fixed function lighting to return black. - lighting off - - depth_check off - depth_write off - fog_override true none - scene_blend alpha_blend - - texture_unit MoonDisc - { - texture moon_disc.dds - colour_op_ex source1 src_manual src_diffuse 0 0 0 0 - } - } - } -} - diff --git a/extern/caelum/resources/moon_disc.dds b/extern/caelum/resources/moon_disc.dds deleted file mode 100755 index b0f8d4540..000000000 Binary files a/extern/caelum/resources/moon_disc.dds and /dev/null differ diff --git a/extern/caelum/resources/noise1.dds b/extern/caelum/resources/noise1.dds deleted file mode 100755 index 5b2dee849..000000000 Binary files a/extern/caelum/resources/noise1.dds and /dev/null differ diff --git a/extern/caelum/resources/noise2.dds b/extern/caelum/resources/noise2.dds deleted file mode 100755 index 918cc5879..000000000 Binary files a/extern/caelum/resources/noise2.dds and /dev/null differ diff --git a/extern/caelum/resources/noise3.dds b/extern/caelum/resources/noise3.dds deleted file mode 100755 index bc4b3dce5..000000000 Binary files a/extern/caelum/resources/noise3.dds and /dev/null differ diff --git a/extern/caelum/resources/noise4.dds b/extern/caelum/resources/noise4.dds deleted file mode 100755 index a0fb7fd81..000000000 Binary files a/extern/caelum/resources/noise4.dds and /dev/null differ diff --git a/extern/caelum/resources/precipitation_drizzle.png b/extern/caelum/resources/precipitation_drizzle.png deleted file mode 100755 index 943f8ed60..000000000 Binary files a/extern/caelum/resources/precipitation_drizzle.png and /dev/null differ diff --git a/extern/caelum/resources/precipitation_hail.png b/extern/caelum/resources/precipitation_hail.png deleted file mode 100755 index 839a57c68..000000000 Binary files a/extern/caelum/resources/precipitation_hail.png and /dev/null differ diff --git a/extern/caelum/resources/precipitation_icecrystals.png b/extern/caelum/resources/precipitation_icecrystals.png deleted file mode 100755 index a67cf98e1..000000000 Binary files a/extern/caelum/resources/precipitation_icecrystals.png and /dev/null differ diff --git a/extern/caelum/resources/precipitation_icepellets.png b/extern/caelum/resources/precipitation_icepellets.png deleted file mode 100755 index d0c8d977f..000000000 Binary files a/extern/caelum/resources/precipitation_icepellets.png and /dev/null differ diff --git a/extern/caelum/resources/precipitation_rain.png b/extern/caelum/resources/precipitation_rain.png deleted file mode 100755 index 561b28523..000000000 Binary files a/extern/caelum/resources/precipitation_rain.png and /dev/null differ diff --git a/extern/caelum/resources/precipitation_smallhail.png b/extern/caelum/resources/precipitation_smallhail.png deleted file mode 100755 index 7197ae038..000000000 Binary files a/extern/caelum/resources/precipitation_smallhail.png and /dev/null differ diff --git a/extern/caelum/resources/precipitation_snow.png b/extern/caelum/resources/precipitation_snow.png deleted file mode 100755 index 4106d6298..000000000 Binary files a/extern/caelum/resources/precipitation_snow.png and /dev/null differ diff --git a/extern/caelum/resources/precipitation_snowgrains.png b/extern/caelum/resources/precipitation_snowgrains.png deleted file mode 100755 index 18518661e..000000000 Binary files a/extern/caelum/resources/precipitation_snowgrains.png and /dev/null differ diff --git a/extern/caelum/resources/sphere.mesh b/extern/caelum/resources/sphere.mesh deleted file mode 100755 index 286317e0a..000000000 Binary files a/extern/caelum/resources/sphere.mesh and /dev/null differ diff --git a/extern/caelum/resources/sun_disc.png b/extern/caelum/resources/sun_disc.png deleted file mode 100755 index 858537cae..000000000 Binary files a/extern/caelum/resources/sun_disc.png and /dev/null differ diff --git a/extern/caelum/src/Astronomy.cpp b/extern/caelum/src/Astronomy.cpp deleted file mode 100644 index 315b756fb..000000000 --- a/extern/caelum/src/Astronomy.cpp +++ /dev/null @@ -1,349 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2008 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -#include "CaelumPrecompiled.h" -#include "Astronomy.h" - -namespace Caelum -{ - const LongReal Astronomy::PI = 3.1415926535897932384626433832795029L; - - const LongReal Astronomy::J2000 = 2451545.0; - - LongReal Astronomy::radToDeg (LongReal value) - { - return value * 180 / PI; - } - - LongReal Astronomy::degToRad (LongReal value) - { - return value * PI / 180; - } - - LongReal Astronomy::sinDeg (LongReal x) { - return std::sin (degToRad (x)); - } - - LongReal Astronomy::cosDeg (LongReal x) { - return std::cos (degToRad (x)); - } - - LongReal Astronomy::atan2Deg (LongReal y, LongReal x) { - return radToDeg(std::atan2 (y, x)); - } - - LongReal Astronomy::normalizeDegrees (LongReal value) - { - value = fmod (value, 360); - if (value < LongReal (0)) { - value += LongReal (360); - } - return value; - } - - void Astronomy::convertEclipticToEquatorialRad ( - LongReal lon, LongReal lat, - LongReal &rasc, LongReal &decl) - { - double ecl = Astronomy::degToRad(23.439281); - - double x = cos(lon) * cos(lat); - double y = cos(ecl) * sin(lon) * cos(lat) - sin(ecl) * sin(lat); - double z = sin(ecl) * sin(lon) * cos(lat) + cos(ecl) * sin(lat); - - double r = sqrt(x * x + y * y); - rasc = atan2(y, x); - decl = atan2(z, r); - } - - void Astronomy::convertRectangularToSpherical ( - LongReal x, LongReal y, LongReal z, - LongReal &rasc, LongReal &decl, LongReal &dist) - { - dist = sqrt (x * x + y * y + z * z); - rasc = atan2Deg (y, x); - decl = atan2Deg (z, sqrt (x * x + y * y)); - } - - void Astronomy::convertSphericalToRectangular ( - LongReal rasc, LongReal decl, LongReal dist, - LongReal &x, LongReal &y, LongReal &z) - { - x = dist * cosDeg (rasc) * cosDeg (decl); - y = dist * sinDeg (rasc) * cosDeg (decl); - z = dist * sinDeg (decl); - } - - void Astronomy::convertEquatorialToHorizontal ( - LongReal jday, - LongReal longitude, LongReal latitude, - LongReal rasc, LongReal decl, - LongReal &azimuth, LongReal &altitude) - { - LongReal d = jday - 2451543.5; - LongReal w = LongReal (282.9404 + 4.70935E-5 * d); - LongReal M = LongReal (356.0470 + 0.9856002585 * d); - // Sun's mean longitude - LongReal L = w + M; - // Universal time of day in degrees. - LongReal UT = LongReal(fmod(d, 1) * 360); - LongReal hourAngle = longitude + L + LongReal (180) + UT - rasc; - - LongReal x = cosDeg (hourAngle) * cosDeg (decl); - LongReal y = sinDeg (hourAngle) * cosDeg (decl); - LongReal z = sinDeg (decl); - - LongReal xhor = x * sinDeg (latitude) - z * cosDeg (latitude); - LongReal yhor = y; - LongReal zhor = x * cosDeg (latitude) + z * sinDeg (latitude); - - azimuth = atan2Deg (yhor, xhor) + LongReal (180); - altitude = atan2Deg (zhor, sqrt (xhor * xhor + yhor * yhor)); - } - - void Astronomy::getHorizontalSunPosition ( - LongReal jday, - LongReal longitude, LongReal latitude, - LongReal &azimuth, LongReal &altitude) - { - // 2451544.5 == Astronomy::getJulianDayFromGregorianDateTime(2000, 1, 1, 0, 0, 0)); - // 2451543.5 == Astronomy::getJulianDayFromGregorianDateTime(1999, 12, 31, 0, 0, 0)); - LongReal d = jday - 2451543.5; - - // Sun's Orbital elements: - // argument of perihelion - LongReal w = LongReal (282.9404 + 4.70935E-5 * d); - // eccentricity (0=circle, 0-1=ellipse, 1=parabola) - LongReal e = 0.016709 - 1.151E-9 * d; - // mean anomaly (0 at perihelion; increases uniformly with time) - LongReal M = LongReal(356.0470 + 0.9856002585 * d); - // Obliquity of the ecliptic. - //LongReal oblecl = LongReal (23.4393 - 3.563E-7 * d); - - // Eccentric anomaly - LongReal E = M + radToDeg(e * sinDeg (M) * (1 + e * cosDeg (M))); - - // Sun's Distance(R) and true longitude(L) - LongReal xv = cosDeg (E) - e; - LongReal yv = sinDeg (E) * sqrt (1 - e * e); - //LongReal r = sqrt (xv * xv + yv * yv); - LongReal lon = atan2Deg (yv, xv) + w; - LongReal lat = 0; - - LongReal lambda = degToRad(lon); - LongReal beta = degToRad(lat); - LongReal rasc, decl; - convertEclipticToEquatorialRad (lambda, beta, rasc, decl); - rasc = radToDeg(rasc); - decl = radToDeg(decl); - - // Horizontal spherical. - Astronomy::convertEquatorialToHorizontal ( - jday, longitude, latitude, rasc, decl, azimuth, altitude); - } - - void Astronomy::getHorizontalSunPosition ( - LongReal jday, - Ogre::Degree longitude, Ogre::Degree latitude, - Ogre::Degree &azimuth, Ogre::Degree &altitude) - { - LongReal az, al; - getHorizontalSunPosition(jday, longitude.valueDegrees (), latitude.valueDegrees (), az, al); - azimuth = Ogre::Degree(az); - altitude = Ogre::Degree(al); - } - - void Astronomy::getEclipticMoonPositionRad ( - LongReal jday, - LongReal &lon, LongReal &lat) - { - // Julian centuries since January 1, 2000 - double T = (jday - 2451545.0L) / 36525.0L; - double lprim = 3.8104L + 8399.7091L * T; - double mprim = 2.3554L + 8328.6911L * T; - double m = 6.2300L + 648.3019L * T; - double d = 5.1985L + 7771.3772L * T; - double f = 1.6280L + 8433.4663L * T; - lon = lprim - + 0.1098L * sin(mprim) - + 0.0222L * sin(2.0L * d - mprim) - + 0.0115L * sin(2.0L * d) - + 0.0037L * sin(2.0L * mprim) - - 0.0032L * sin(m) - - 0.0020L * sin(2.0L * f) - + 0.0010L * sin(2.0L * d - 2.0L * mprim) - + 0.0010L * sin(2.0L * d - m - mprim) - + 0.0009L * sin(2.0L * d + mprim) - + 0.0008L * sin(2.0L * d - m) - + 0.0007L * sin(mprim - m) - - 0.0006L * sin(d) - - 0.0005L * sin(m + mprim); - lat = - + 0.0895L * sin(f) - + 0.0049L * sin(mprim + f) - + 0.0048L * sin(mprim - f) - + 0.0030L * sin(2.0L * d - f) - + 0.0010L * sin(2.0L * d + f - mprim) - + 0.0008 * sin(2.0L * d - f - mprim) - + 0.0006L * sin(2.0L * d + f); - } - - void Astronomy::getHorizontalMoonPosition ( - LongReal jday, - LongReal longitude, LongReal latitude, - LongReal &azimuth, LongReal &altitude) - { - // Ecliptic spherical - LongReal lonecl, latecl; - Astronomy::getEclipticMoonPositionRad (jday, lonecl, latecl); - - // Equatorial spherical - LongReal rasc, decl; - Astronomy::convertEclipticToEquatorialRad (lonecl, latecl, rasc, decl); - - // Radians to degrees (all angles are in radians up to this point) - rasc = radToDeg(rasc); - decl = radToDeg(decl); - - // Equatorial to horizontal - Astronomy::convertEquatorialToHorizontal ( - jday, longitude, latitude, rasc, decl, azimuth, altitude); - } - - void Astronomy::getHorizontalMoonPosition ( - LongReal jday, - Ogre::Degree longitude, Ogre::Degree latitude, - Ogre::Degree &azimuth, Ogre::Degree &altitude) - { - LongReal az, al; - getHorizontalMoonPosition(jday, longitude.valueDegrees (), latitude.valueDegrees (), az, al); - azimuth = Ogre::Degree(az); - altitude = Ogre::Degree(al); - } - - int Astronomy::getJulianDayFromGregorianDate( - int year, int month, int day) - { - // Formulas from http://en.wikipedia.org/wiki/Julian_day - // These are all integer divisions, but I'm not sure it works - // correctly for negative values. - int a = (14 - month) / 12; - int y = year + 4800 - a; - int m = month + 12 * a - 3; - return day + (153 * m + 2) / 5 + 365 * y + y / 4 - y / 100 + y / 400 - 32045; - } - - LongReal Astronomy::getJulianDayFromGregorianDateTime( - int year, int month, int day, - int hour, int minute, LongReal second) - { - ScopedHighPrecissionFloatSwitch precissionSwitch; - - int jdn = getJulianDayFromGregorianDate (year, month, day); - // These are NOT integer divisions. - LongReal jd = jdn + (hour - 12) / 24.0 + minute / 1440.0 + second / 86400.0; - - return jd; - } - - LongReal Astronomy::getJulianDayFromGregorianDateTime( - int year, int month, int day, - LongReal secondsFromMidnight) - { - int jdn = getJulianDayFromGregorianDate(year, month, day); - LongReal jd = jdn + secondsFromMidnight / 86400.0 - 0.5; - return jd; - } - - void Astronomy::getGregorianDateFromJulianDay( - int julianDay, int &year, int &month, int &day) - { - // From http://en.wikipedia.org/wiki/Julian_day - int J = julianDay; - int j = J + 32044; - int g = j / 146097; - int dg = j % 146097; - int c = (dg / 36524 + 1) * 3 / 4; - int dc = dg - c * 36524; - int b = dc / 1461; - int db = dc % 1461; - int a = (db / 365 + 1) * 3 / 4; - int da = db - a * 365; - int y = g * 400 + c * 100 + b * 4 + a; - int m = (da * 5 + 308) / 153 - 2; - int d = da - (m + 4) * 153 / 5 + 122; - year = y - 4800 + (m + 2) / 12; - month = (m + 2) % 12 + 1; - day = d + 1; - } - - void Astronomy::getGregorianDateTimeFromJulianDay( - LongReal julianDay, int &year, int &month, int &day, - int &hour, int &minute, LongReal &second) - { - // Integer julian days are at noon. - // static_cast(floor(julianDay + 0.5)); - getGregorianDateFromJulianDay(ijd, year, month, day); - - LongReal s = (julianDay + 0.5 - ijd) * 86400.0; - hour = static_cast(floor(s / 3600)); - s -= hour * 3600; - minute = static_cast(floor(s / 60)); - s -= minute * 60; - second = s; - } - - void Astronomy::getGregorianDateFromJulianDay( - LongReal julianDay, int &year, int &month, int &day) - { - int hour; - int minute; - LongReal second; - getGregorianDateTimeFromJulianDay(julianDay, year, month, day, hour, minute, second); - } - -#if (OGRE_PLATFORM == OGRE_PLATFORM_WIN32) && (OGRE_COMPILER == OGRE_COMPILER_MSVC) && (OGRE_ARCH_TYPE != OGRE_ARCHITECTURE_64) - int Astronomy::enterHighPrecissionFloatingPointMode () - { - int oldMode = ::_controlfp (0, 0); - ::_controlfp (_PC_64, _MCW_PC); - return oldMode; - } - - void Astronomy::restoreFloatingPointMode (int oldMode) - { - ::_controlfp (oldMode, _MCW_PC); - } -#else - int Astronomy::enterHighPrecissionFloatingPointMode () - { - // Meaningless - return 0xC0FFEE; - } - - void Astronomy::restoreFloatingPointMode (int oldMode) - { - // Useless check. - assert(oldMode == 0xC0FFEE); - } -#endif -} diff --git a/extern/caelum/src/BrightStarCatalogue.cpp b/extern/caelum/src/BrightStarCatalogue.cpp deleted file mode 100644 index 1a549084d..000000000 --- a/extern/caelum/src/BrightStarCatalogue.cpp +++ /dev/null @@ -1,9140 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2008 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -#include "CaelumPrecompiled.h" -#include "PointStarfield.h" - -// Data from http://heasarc.gsfc.nasa.gov/W3Browse/star-catalog/bsc5p.html -// Converted using the following MSVS regexps: -// ^\|0*{:d+} 0*{:d+} 0*{[0-9.]+}\|{[+\-]}0*{:d+} 0*{:d+} 0*{[0-9.]+}\|{.*}\|$ -// { \(2,1), \(2,2), \(5,3), \4\(2,5), \(2,6), \(4,7),\(5, 8) }, -const Caelum::BrightStarCatalogueEntry Caelum::BrightStarCatalogue[BrightStarCatalogueSize] = { - { 21, 8, 46.20, -88, 57, 23.0, 5.47 }, - { 22, 45, 28.61, -88, 49, 5.9, 6.57 }, - { 15, 28, 19.10, -88, 7, 59.2, 6.48 }, - { 18, 54, 46.90, -87, 36, 20.9, 5.28 }, - { 17, 15, 59.30, -87, 33, 59.0, 6.57 }, - { 23, 28, 3.70, -87, 28, 55.9, 5.49 }, - { 6, 46, 58.70, -87, 1, 30.0, 6.47 }, - { 17, 0, 58.49, -86, 21, 51.8, 6.04 }, - { 12, 25, 37.49, -86, 9, 2.2, 6.33 }, - { 22, 31, 37.39, -85, 58, 1.9, 5.77 }, - { 13, 40, 55.49, -85, 47, 10.0, 5.58 }, - { 8, 56, 41.09, -85, 39, 47.2, 5.42 }, - { 12, 2, 20.11, -85, 37, 54.1, 6.05 }, - { 3, 42, 32.11, -85, 15, 43.9, 6.41 }, - { 18, 1, 34.10, -85, 12, 52.9, 6.45 }, - { 12, 54, 58.61, -85, 7, 23.9, 5.46 }, - { 0, 13, 19.39, -84, 59, 39.1, 5.77 }, - { 21, 32, 4.20, -84, 48, 36.0, 6.45 }, - { 15, 11, 8.30, -84, 47, 15.0, 5.91 }, - { 5, 30, 13.90, -84, 47, 6.0, 6.20 }, - { 1, 37, 28.01, -84, 46, 10.9, 5.69 }, - { 10, 59, 13.80, -84, 35, 38.0, 6.19 }, - { 15, 43, 16.80, -84, 27, 55.1, 5.57 }, - { 14, 26, 54.89, -83, 40, 4.1, 4.32 }, - { 18, 51, 57.89, -83, 18, 59.0, 7.16 }, - { 20, 24, 54.41, -83, 18, 38.2, 6.17 }, - { 16, 45, 53.59, -83, 14, 20.0, 6.57 }, - { 15, 1, 50.81, -83, 13, 40.1, 5.65 }, - { 11, 41, 1.20, -83, 6, .0, 6.33 }, - { 15, 4, 46.70, -83, 2, 17.9, 5.65 }, - { 1, 37, 55.61, -82, 58, 30.0, 5.87 }, - { 4, 22, 50.90, -82, 53, 57.1, 6.76 }, - { 14, 24, 23.30, -82, 50, 55.0, 6.42 }, - { 21, 50, 54.31, -82, 43, 9.1, 5.29 }, - { 21, 33, 54.41, -82, 40, 59.2, 6.38 }, - { 13, 55, 38.71, -82, 39, 58.0, 5.95 }, - { 4, 58, 50.90, -82, 28, 14.2, 5.85 }, - { 0, 10, 2.09, -82, 13, 26.0, 5.28 }, - { 10, 0, 43.70, -82, 12, 52.9, 5.52 }, - { 23, 57, 32.71, -82, 10, 12.0, 5.73 }, - { 23, 52, 6.41, -82, 1, 8.0, 5.11 }, - { 10, 31, 51.00, -81, 55, 16.0, 7.07 }, - { 18, 42, 14.09, -81, 48, 28.1, 6.27 }, - { 4, 20, 57.89, -81, 34, 48.0, 5.79 }, - { 10, 4, 7.61, -81, 33, 56.9, 6.60 }, - { 10, 59, 12.91, -81, 33, 22.0, 6.71 }, - { 5, 12, 25.70, -81, 32, 30.1, 6.51 }, - { 18, 5, 26.69, -81, 29, 11.0, 6.35 }, - { 22, 46, 3.31, -81, 22, 54.1, 4.15 }, - { 19, 56, 1.51, -81, 20, 58.9, 6.39 }, - { 20, 38, 18.60, -81, 17, 20.0, 5.91 }, - { 14, 18, 13.80, -81, 0, 28.1, 4.91 }, - { 20, 33, 17.50, -80, 57, 54.0, 5.77 }, - { 9, 33, 53.21, -80, 56, 29.0, 5.11 }, - { 8, 24, 19.80, -80, 54, 51.1, 5.69 }, - { 23, 12, 12.00, -80, 54, 46.1, 6.41 }, - { 17, 31, 27.29, -80, 51, 33.1, 5.88 }, - { 6, 40, 2.71, -80, 48, 49.0, 5.64 }, - { 9, 24, 9.10, -80, 47, 12.8, 5.36 }, - { 10, 45, 46.80, -80, 32, 25.1, 4.45 }, - { 10, 45, 15.70, -80, 28, 10.9, 5.47 }, - { 5, 37, 9.79, -80, 28, 9.1, 5.65 }, - { 22, 20, 1.51, -80, 26, 22.9, 5.10 }, - { 18, 29, 19.49, -80, 13, 58.1, 5.95 }, - { 4, 17, 59.09, -80, 12, 50.0, 5.69 }, - { 1, 47, 46.51, -80, 10, 36.1, 6.06 }, - { 22, 50, 22.90, -80, 7, 27.1, 5.35 }, - { 14, 22, 22.70, -80, 6, 32.0, 5.06 }, - { 21, 33, 20.59, -80, 2, 21.1, 6.47 }, - { 10, 41, 51.29, -79, 46, 59.9, 5.97 }, - { 11, 18, 34.30, -79, 40, 7.0, 6.35 }, - { 10, 52, 27.50, -79, 33, 33.8, 6.33 }, - { 8, 45, 55.20, -79, 30, 15.8, 5.79 }, - { 23, 8, 23.71, -79, 28, 50.9, 6.12 }, - { 23, 19, 8.11, -79, 28, 22.1, 6.33 }, - { 21, 38, 56.21, -79, 26, 33.0, 6.18 }, - { 6, 56, 34.39, -79, 25, 13.1, 5.45 }, - { 5, 50, 16.70, -79, 21, 41.0, 5.47 }, - { 12, 18, 20.69, -79, 18, 43.9, 4.26 }, - { 11, 42, 55.39, -79, 18, 23.0, 6.39 }, - { 1, 41, 21.31, -79, 8, 53.9, 6.33 }, - { 2, 31, 40.51, -79, 6, 33.8, 5.28 }, - { 7, 25, 37.99, -79, 5, 39.1, 5.53 }, - { 8, 43, 12.41, -79, 4, 10.9, 6.05 }, - { 14, 47, 51.60, -79, 2, 40.9, 3.83 }, - { 3, 7, 31.99, -78, 59, 21.8, 5.57 }, - { 8, 41, 19.51, -78, 57, 47.9, 5.47 }, - { 16, 33, 27.00, -78, 53, 49.9, 3.89 }, - { 5, 35, 36.31, -78, 49, 14.9, 6.05 }, - { 23, 44, 40.70, -78, 47, 29.0, 5.75 }, - { 0, 16, 49.01, -78, 46, 50.2, 6.77 }, - { 22, 35, 26.40, -78, 46, 18.1, 6.15 }, - { 16, 20, 20.81, -78, 41, 44.9, 4.68 }, - { 16, 20, 26.81, -78, 40, 1.9, 5.27 }, - { 10, 35, 28.10, -78, 36, 28.1, 4.11 }, - { 14, 0, 32.81, -78, 35, 24.0, 6.09 }, - { 12, 13, 55.70, -78, 34, 25.0, 6.35 }, - { 1, 33, 39.19, -78, 30, 16.9, 6.11 }, - { 13, 14, 17.21, -78, 26, 49.9, 5.85 }, - { 3, 29, 58.80, -78, 21, 6.8, 5.70 }, - { 1, 55, 50.50, -78, 20, 53.9, 6.16 }, - { 3, 36, 30.00, -78, 19, 23.2, 6.29 }, - { 5, 0, 13.20, -78, 18, 1.1, 6.29 }, - { 11, 59, 37.30, -78, 13, 18.8, 4.91 }, - { 15, 39, 18.29, -77, 55, 5.2, 6.18 }, - { 18, 47, 49.39, -77, 52, 1.9, 6.39 }, - { 14, 16, 54.89, -77, 39, 50.0, 6.47 }, - { 22, 1, 52.10, -77, 39, 45.0, 6.41 }, - { 4, 38, 21.70, -77, 39, 22.0, 6.05 }, - { 7, 36, 4.20, -77, 38, 3.1, 6.18 }, - { 11, 21, 57.10, -77, 36, 29.9, 6.43 }, - { 13, 33, 14.81, -77, 34, 5.9, 6.48 }, - { 16, 43, 4.61, -77, 31, 3.0, 4.24 }, - { 22, 17, 50.50, -77, 30, 42.1, 5.51 }, - { 8, 20, 38.50, -77, 29, 3.8, 4.35 }, - { 0, 21, 28.61, -77, 25, 36.8, 5.97 }, - { 21, 41, 28.49, -77, 23, 24.0, 3.76 }, - { 3, 15, 57.60, -77, 23, 17.9, 5.52 }, - { 23, 33, 19.49, -77, 23, 7.1, 5.81 }, - { 0, 25, 45.10, -77, 15, 15.1, 2.80 }, - { 15, 0, 11.81, -77, 9, 37.1, 5.93 }, - { 0, 1, 35.71, -77, 3, 56.9, 4.78 }, - { 22, 49, 40.90, -77, 3, 2.2, 6.73 }, - { 21, 4, 43.01, -77, 1, 26.0, 5.15 }, - { 8, 18, 31.61, -76, 55, 10.9, 4.07 }, - { 23, 38, 24.10, -76, 52, 12.0, 6.00 }, - { 14, 5, 19.80, -76, 47, 48.1, 5.50 }, - { 9, 46, 20.59, -76, 46, 34.0, 5.45 }, - { 14, 29, 36.79, -76, 43, 45.1, 6.07 }, - { 9, 12, 12.31, -76, 39, 47.2, 6.14 }, - { 14, 57, 52.90, -76, 39, 46.1, 5.34 }, - { 12, 4, 46.51, -76, 31, 9.1, 5.04 }, - { 5, 31, 52.90, -76, 20, 28.0, 5.19 }, - { 10, 35, 24.79, -76, 18, 33.1, 6.30 }, - { 21, 8, 47.90, -76, 12, 45.0, 6.58 }, - { 20, 42, 2.90, -76, 10, 50.2, 6.00 }, - { 17, 57, 41.81, -76, 10, 39.0, 6.07 }, - { 22, 3, 3.79, -76, 7, 7.0, 5.95 }, - { 22, 11, 55.30, -76, 6, 58.0, 6.15 }, - { 15, 41, 54.60, -76, 4, 54.8, 5.95 }, - { 0, 15, 55.20, -75, 54, 41.0, 6.49 }, - { 11, 37, 15.60, -75, 53, 48.1, 5.65 }, - { 18, 11, 15.70, -75, 53, 29.0, 5.86 }, - { 22, 10, 42.50, -75, 52, 50.2, 6.55 }, - { 13, 39, 11.90, -75, 41, 2.0, 6.34 }, - { 12, 39, 14.50, -75, 22, 9.8, 6.49 }, - { 12, 7, 49.80, -75, 22, .8, 5.18 }, - { 20, 41, 43.70, -75, 21, 2.2, 6.55 }, - { 21, 18, 16.10, -75, 20, 48.1, 6.63 }, - { 11, 19, 36.29, -75, 8, 33.0, 6.27 }, - { 10, 57, 15.70, -75, 5, 58.9, 6.13 }, - { 2, 50, 28.51, -75, 4, .8, 4.75 }, - { 18, 23, 36.10, -75, 2, 39.1, 5.47 }, - { 14, 59, 55.99, -75, 1, 57.0, 6.20 }, - { 22, 25, 51.00, -75, 0, 56.2, 6.04 }, - { 4, 55, 11.21, -74, 56, 12.8, 5.47 }, - { 0, 48, 35.40, -74, 55, 23.9, 5.07 }, - { 9, 17, 25.39, -74, 53, 39.8, 5.29 }, - { 13, 25, 7.10, -74, 53, 16.1, 5.05 }, - { 14, 8, 27.10, -74, 51, 1.1, 6.02 }, - { 6, 10, 14.40, -74, 45, 11.2, 5.09 }, - { 9, 17, 27.41, -74, 44, 4.9, 5.86 }, - { 13, 27, 18.29, -74, 41, 30.8, 6.63 }, - { 17, 16, 35.59, -74, 31, 59.2, 6.25 }, - { 10, 39, 16.61, -74, 29, 37.0, 6.07 }, - { 7, 35, 21.79, -74, 16, 32.2, 7.26 }, - { 7, 35, 21.70, -74, 16, 32.2, 7.16 }, - { 3, 47, 14.30, -74, 14, 20.0, 3.24 }, - { 12, 3, 44.30, -74, 12, 50.0, 6.44 }, - { 10, 24, 23.71, -74, 1, 54.1, 4.00 }, - { 10, 24, 44.30, -73, 58, 18.1, 6.19 }, - { 18, 32, 55.30, -73, 57, 56.2, 5.89 }, - { 5, 34, 44.69, -73, 44, 29.0, 5.78 }, - { 18, 12, 34.49, -73, 40, 18.1, 5.85 }, - { 2, 22, 52.30, -73, 38, 44.9, 5.01 }, - { 23, 8, 35.69, -73, 35, 11.0, 6.15 }, - { 15, 40, 21.19, -73, 26, 48.1, 5.65 }, - { 8, 22, 4.39, -73, 24, .0, 5.29 }, - { 15, 31, 30.79, -73, 23, 21.8, 5.49 }, - { 8, 32, 42.19, -73, 21, 24.1, 6.12 }, - { 7, 59, 16.10, -73, 14, 40.9, 6.34 }, - { 0, 10, 38.59, -73, 13, 27.8, 6.64 }, - { 10, 31, 1.99, -73, 13, 18.1, 4.93 }, - { 14, 53, 13.70, -73, 11, 24.0, 5.60 }, - { 21, 9, 22.30, -73, 10, 23.2, 5.68 }, - { 0, 38, 40.80, -73, 8, 13.9, 6.85 }, - { 6, 43, 36.79, -73, 7, 5.2, 6.37 }, - { 9, 31, 36.29, -73, 4, 50.9, 5.47 }, - { 5, 6, 9.29, -73, 2, 16.1, 6.27 }, - { 12, 32, 10.01, -73, 0, 6.1, 5.88 }, - { 18, 49, 43.49, -72, 59, 40.9, 6.06 }, - { 20, 0, 35.50, -72, 54, 38.2, 3.96 }, - { 0, 4, 30.70, -72, 53, 52.1, 7.31 }, - { 15, 12, 33.79, -72, 46, 13.1, 6.01 }, - { 5, 47, 48.10, -72, 42, 7.9, 6.53 }, - { 12, 16, 23.50, -72, 36, 52.9, 6.22 }, - { 7, 41, 49.20, -72, 36, 22.0, 3.95 }, - { 9, 5, 8.81, -72, 36, 10.1, 4.48 }, - { 8, 49, 50.30, -72, 33, 2.9, 6.11 }, - { 21, 11, 20.69, -72, 32, 39.1, 6.20 }, - { 19, 49, 25.30, -72, 30, 11.9, 5.41 }, - { 11, 28, 18.19, -72, 28, 27.8, 6.09 }, - { 10, 44, 26.50, -72, 26, 38.0, 6.27 }, - { 4, 53, 5.50, -72, 24, 27.0, 6.28 }, - { 16, 5, 55.80, -72, 24, 2.9, 5.70 }, - { 11, 24, 11.09, -72, 15, 24.1, 5.59 }, - { 22, 24, 36.79, -72, 15, 20.2, 5.29 }, - { 17, 44, 19.70, -72, 13, 14.9, 6.49 }, - { 12, 56, 31.51, -72, 11, 7.1, 5.93 }, - { 13, 22, 52.61, -72, 8, 48.1, 6.05 }, - { 12, 32, 28.01, -72, 7, 59.2, 3.87 }, - { 0, 24, 5.80, -72, 4, 52.0, }, - { 13, 19, 18.91, -72, 2, 8.2, 6.04 }, - { 11, 20, 3.91, -71, 59, 39.8, 6.41 }, - { 10, 30, 20.11, -71, 59, 35.2, 4.74 }, - { 12, 49, 44.90, -71, 59, 11.0, 5.55 }, - { 15, 7, 8.71, -71, 54, 19.1, 6.52 }, - { 3, 2, 15.41, -71, 54, 9.0, 5.53 }, - { 21, 25, 18.10, -71, 47, 57.8, 6.09 }, - { 6, 40, 57.79, -71, 46, 32.2, 6.51 }, - { 6, 15, 5.90, -71, 42, 10.1, 6.64 }, - { 9, 27, 6.41, -71, 36, 7.9, 5.47 }, - { 13, 2, 16.20, -71, 32, 56.0, 3.62 }, - { 8, 19, 49.01, -71, 30, 54.0, 5.37 }, - { 8, 20, .70, -71, 30, 19.1, 5.65 }, - { 12, 2, 28.61, -71, 29, 20.0, 6.42 }, - { 13, 3, 5.21, -71, 28, 34.0, 6.03 }, - { 0, 4, 41.30, -71, 26, 12.8, 5.59 }, - { 11, 11, 29.50, -71, 26, 11.0, 6.35 }, - { 18, 43, 2.11, -71, 25, 41.2, 4.01 }, - { 9, 56, 9.70, -71, 23, 21.8, 6.35 }, - { 5, 2, 43.01, -71, 18, 51.8, 5.31 }, - { 0, 33, 23.30, -71, 15, 58.0, 6.13 }, - { 21, 45, 28.80, -71, 0, 32.0, 6.01 }, - { 16, 34, 19.30, -70, 59, 17.2, 5.50 }, - { 6, 51, 27.00, -70, 57, 47.9, 5.40 }, - { 4, 43, 3.91, -70, 55, 52.0, 5.54 }, - { 11, 6, 49.90, -70, 52, 41.2, 5.57 }, - { 10, 44, 19.39, -70, 51, 36.0, 6.26 }, - { 10, 44, 32.09, -70, 51, 18.0, 6.46 }, - { 13, 40, .60, -70, 47, 17.9, 6.59 }, - { 18, 14, 24.10, -70, 45, 5.0, 6.73 }, - { 17, 12, 19.80, -70, 43, 16.0, 6.22 }, - { 10, 53, 42.00, -70, 43, 13.1, 5.99 }, - { 13, 25, 50.11, -70, 37, 39.0, 5.67 }, - { 9, 5, 38.30, -70, 32, 20.0, 4.71 }, - { 7, 8, 44.90, -70, 29, 56.0, 3.78 }, - { 7, 8, 42.19, -70, 29, 49.9, 5.69 }, - { 23, 44, 25.39, -70, 29, 25.1, 6.07 }, - { 13, 38, 45.70, -70, 26, 42.0, 6.10 }, - { 6, 44, 56.09, -70, 26, 2.0, 6.11 }, - { 22, 25, 10.51, -70, 25, 54.1, 5.78 }, - { 8, 39, 5.21, -70, 23, 12.8, 5.20 }, - { 22, 49, 17.40, -70, 20, 52.1, 6.34 }, - { 14, 10, 30.91, -70, 18, 20.2, 6.05 }, - { 15, 40, 11.50, -70, 13, 40.1, 6.44 }, - { 11, 49, 56.59, -70, 13, 32.9, 4.97 }, - { 12, 12, 46.80, -70, 9, 6.8, 6.17 }, - { 21, 13, 20.50, -70, 7, 35.0, 5.02 }, - { 17, 22, 5.90, -70, 7, 23.9, 5.41 }, - { 8, 27, 16.90, -70, 5, 35.9, 5.53 }, - { 16, 28, 28.10, -70, 5, 3.8, 4.91 }, - { 15, 14, 19.10, -70, 4, 45.8, 5.81 }, - { 22, 54, 39.41, -70, 4, 25.0, 6.05 }, - { 17, 20, 12.79, -70, 2, 44.2, 6.53 }, - { 10, 13, 44.21, -70, 2, 17.2, 3.32 }, - { 6, 22, 38.21, -69, 59, 3.1, 5.56 }, - { 13, 11, 51.60, -69, 56, 30.8, 5.91 }, - { 7, 44, 13.01, -69, 49, 17.0, 6.18 }, - { 21, 24, 16.70, -69, 44, 3.1, 6.41 }, - { 14, 11, 1.90, -69, 43, 10.9, 6.06 }, - { 9, 13, 12.00, -69, 43, 1.9, 1.68 }, - { 6, 25, 28.61, -69, 41, 25.1, 5.38 }, - { 13, 15, 25.70, -69, 40, 46.9, 6.37 }, - { 21, 50, 47.11, -69, 37, 45.8, 5.53 }, - { 13, 28, 46.39, -69, 37, 41.2, 6.20 }, - { 0, 20, 39.00, -69, 37, 30.0, 5.51 }, - { 3, 24, 2.50, -69, 37, 28.9, 6.15 }, - { 20, 35, 51.70, -69, 36, 40.0, 6.11 }, - { 0, 55, .31, -69, 31, 36.8, 5.45 }, - { 21, 28, 44.90, -69, 30, 19.1, 5.34 }, - { 0, 52, 24.29, -69, 30, 15.8, 6.22 }, - { 12, 42, 5.11, -69, 24, 27.0, 6.33 }, - { 13, 51, 47.40, -69, 24, 5.0, 5.75 }, - { 3, 25, 36.19, -69, 20, 11.0, 5.96 }, - { 16, 59, 33.79, -69, 16, 5.9, 5.79 }, - { 3, 7, 49.20, -69, 15, 56.2, 6.15 }, - { 12, 2, 37.70, -69, 11, 31.9, 5.89 }, - { 19, 16, 28.49, -69, 11, 26.2, 6.27 }, - { 19, 58, 41.30, -69, 9, 50.0, 5.75 }, - { 12, 37, 10.99, -69, 8, 8.2, 2.69 }, - { 9, 56, 59.69, -69, 6, 6.8, 6.20 }, - { 16, 48, 39.89, -69, 1, 40.1, 1.92 }, - { 1, 15, 46.10, -68, 52, 34.0, 4.86 }, - { 6, 8, 44.21, -68, 50, 35.9, 5.06 }, - { 7, 6, 14.09, -68, 50, 13.9, 6.47 }, - { 12, 45, 1.70, -68, 49, 52.0, 6.16 }, - { 23, 4, 52.20, -68, 49, 13.1, 5.52 }, - { 20, 49, 18.10, -68, 46, 35.0, 5.41 }, - { 19, 58, 52.99, -68, 45, 43.9, 6.39 }, - { 19, 3, 29.69, -68, 45, 19.1, 5.88 }, - { 9, 17, 17.21, -68, 41, 21.8, 5.39 }, - { 9, 1, 8.50, -68, 41, 2.0, 5.88 }, - { 10, 9, 30.50, -68, 40, 59.9, 5.81 }, - { 15, 18, 54.60, -68, 40, 45.8, 2.89 }, - { 2, 21, 44.90, -68, 39, 33.8, 4.09 }, - { 12, 6, 19.80, -68, 39, 2.9, 6.23 }, - { 5, 27, .00, -68, 37, 22.1, 6.03 }, - { 8, 7, 55.80, -68, 37, 1.9, 4.35 }, - { 15, 55, 29.59, -68, 36, 11.2, 5.09 }, - { 19, 31, 10.90, -68, 26, 2.0, 5.96 }, - { 19, 9, 52.70, -68, 25, 28.9, 5.33 }, - { 23, 47, 23.30, -68, 23, 39.1, 6.89 }, - { 19, 24, 5.40, -68, 22, 16.0, 6.34 }, - { 12, 4, 38.71, -68, 19, 45.1, 5.35 }, - { 15, 26, 14.69, -68, 18, 33.1, 5.89 }, - { 12, 22, 11.90, -68, 18, 27.0, 5.74 }, - { 16, 41, 23.30, -68, 17, 46.0, 5.91 }, - { 2, 39, 35.40, -68, 16, .8, 4.11 }, - { 18, 18, .91, -68, 13, 45.1, 6.33 }, - { 8, 43, 54.31, -68, 12, 42.1, 6.32 }, - { 21, 1, 28.10, -68, 12, 34.9, 6.37 }, - { 14, 25, 6.29, -68, 11, 43.1, 5.61 }, - { 12, 46, 16.90, -68, 6, 29.2, 3.05 }, - { 12, 17, 34.10, -67, 57, 38.9, 4.11 }, - { 7, 16, 49.80, -67, 57, 25.9, 3.98 }, - { 16, 17, 5.50, -67, 56, 29.0, 5.75 }, - { 14, 37, 46.30, -67, 55, 55.9, 6.04 }, - { 6, 59, 50.50, -67, 54, 58.0, 5.17 }, - { 13, 15, 14.90, -67, 53, 39.8, 4.80 }, - { 2, 14, 14.69, -67, 50, 30.1, 5.55 }, - { 11, 17, 19.01, -67, 49, 25.0, 6.06 }, - { 17, 21, 59.40, -67, 46, 14.2, 4.78 }, - { 2, 15, 28.51, -67, 44, 47.0, 5.69 }, - { 14, 31, 16.51, -67, 43, 1.9, 5.83 }, - { 16, 52, 17.40, -67, 40, 54.8, 6.32 }, - { 13, 54, 48.91, -67, 39, 9.0, 5.71 }, - { 1, 54, 56.09, -67, 38, 49.9, 4.69 }, - { 12, 23, 13.80, -67, 37, 54.1, 6.36 }, - { 11, 37, 48.41, -67, 37, 13.1, 5.96 }, - { 2, 45, 32.59, -67, 37, .1, 4.84 }, - { 12, 22, 7.30, -67, 31, 18.8, 5.15 }, - { 22, 28, 37.70, -67, 29, 21.1, 5.55 }, - { 15, 20, 40.70, -67, 28, 53.0, 6.28 }, - { 23, 18, 19.99, -67, 28, 16.0, 6.13 }, - { 16, 43, 22.10, -67, 25, 57.0, 6.03 }, - { 20, 5, 32.81, -67, 19, 14.9, 6.07 }, - { 18, 56, 57.00, -67, 14, 1.0, 4.44 }, - { 17, 13, 17.50, -67, 11, 48.1, 5.89 }, - { 12, 38, 52.51, -67, 11, 35.2, 6.25 }, - { 5, 13, 45.41, -67, 11, 7.1, 4.83 }, - { 16, 46, 40.01, -67, 6, 34.9, 5.13 }, - { 15, 9, 29.90, -67, 5, 3.1, 5.76 }, - { 9, 17, 51.70, -67, 3, 2.9, 6.11 }, - { 10, 30, 8.71, -66, 59, 6.0, 6.19 }, - { 11, 32, 19.90, -66, 57, 43.9, 5.90 }, - { 20, 0, 22.99, -66, 56, 57.8, 5.76 }, - { 20, 1, 52.39, -66, 56, 39.1, 5.31 }, - { 3, 17, 58.99, -66, 55, 36.8, 6.05 }, - { 10, 22, 58.10, -66, 54, 6.1, 4.99 }, - { 5, 49, 53.59, -66, 54, 4.0, 5.11 }, - { 23, 10, 11.69, -66, 51, 27.0, 6.47 }, - { 11, 48, 14.30, -66, 48, 52.9, 4.72 }, - { 19, 49, 53.30, -66, 48, 46.1, 6.45 }, - { 8, 50, 34.80, -66, 47, 35.2, 5.35 }, - { 13, 17, 13.01, -66, 47, 1.0, 4.87 }, - { 20, 41, 57.10, -66, 45, 38.9, 5.15 }, - { 11, 45, 36.41, -66, 43, 43.0, 3.64 }, - { 9, 31, 32.90, -66, 43, 9.8, 6.27 }, - { 2, 43, 26.59, -66, 42, 51.8, 6.26 }, - { 9, 28, 30.60, -66, 42, 6.8, 5.91 }, - { 19, 39, 52.10, -66, 41, 8.2, 6.39 }, - { 4, 53, 30.50, -66, 40, 32.2, 6.41 }, - { 19, 17, 12.00, -66, 39, 41.0, 5.53 }, - { 19, 0, 3.50, -66, 39, 11.9, 6.01 }, - { 14, 48, 44.40, -66, 35, 38.0, 5.91 }, - { 14, 16, 38.59, -66, 35, 16.1, 5.75 }, - { 23, 27, 7.20, -66, 34, 52.0, 6.45 }, - { 5, 36, 54.70, -66, 33, 37.1, 6.31 }, - { 12, 39, 55.61, -66, 30, 42.1, 6.26 }, - { 2, 25, 26.30, -66, 29, 40.9, 6.41 }, - { 3, 30, 51.60, -66, 29, 22.9, 5.83 }, - { 1, 17, 3.60, -66, 23, 53.2, 6.24 }, - { 9, 2, 26.81, -66, 23, 46.0, 4.00 }, - { 10, 13, 30.60, -66, 22, 23.2, 5.16 }, - { 20, 8, 20.50, -66, 21, 16.9, 6.45 }, - { 15, 36, 43.20, -66, 19, .8, 4.11 }, - { 14, 0, 52.20, -66, 16, 7.0, 5.97 }, - { 13, 12, 48.91, -66, 13, 36.8, 5.90 }, - { 20, 44, 57.50, -66, 12, 11.2, 3.42 }, - { 7, 49, 40.99, -66, 11, 44.9, 5.79 }, - { 20, 8, 43.61, -66, 10, 54.8, 3.56 }, - { 14, 25, 39.50, -66, 10, 23.9, 6.36 }, - { 8, 25, 44.21, -66, 8, 12.8, 3.77 }, - { 7, 44, 43.90, -66, 4, 18.8, 6.38 }, - { 1, 59, 41.09, -66, 3, 59.0, 6.10 }, - { 6, 6, 9.41, -66, 2, 22.9, 5.71 }, - { 14, 54, 42.41, -65, 59, 29.0, 6.09 }, - { 19, 41, 37.49, -65, 51, 15.1, 6.09 }, - { 12, 20, 28.01, -65, 50, 34.1, 6.21 }, - { 8, 44, 30.00, -65, 49, 32.2, 6.05 }, - { 14, 27, 7.10, -65, 49, 18.1, 5.85 }, - { 10, 8, 42.60, -65, 48, 55.1, 5.28 }, - { 13, 58, 31.20, -65, 48, 2.2, 6.20 }, - { 12, 25, 17.30, -65, 46, 14.2, 6.30 }, - { 3, 34, 24.70, -65, 45, 51.8, 6.75 }, - { 5, 44, 46.39, -65, 44, 8.2, 4.35 }, - { 12, 6, 23.11, -65, 42, 33.1, 6.06 }, - { 10, 27, 25.30, -65, 42, 16.9, 6.01 }, - { 12, 17, 6.00, -65, 41, 34.1, 6.06 }, - { 13, 33, 35.69, -65, 37, 57.0, 6.37 }, - { 8, 18, 18.91, -65, 36, 47.9, 5.07 }, - { 15, 36, 17.40, -65, 36, 47.9, 6.51 }, - { 19, 51, 1.30, -65, 36, 18.0, 6.05 }, - { 6, 11, 15.00, -65, 35, 21.8, 5.01 }, - { 23, 59, 55.01, -65, 34, 37.9, 4.50 }, - { 6, 30, 3.00, -65, 34, 5.9, 6.29 }, - { 12, 5, 53.21, -65, 32, 49.9, 6.33 }, - { 16, 35, 44.81, -65, 29, 43.1, 5.52 }, - { 17, 53, 18.41, -65, 29, 21.1, 6.49 }, - { 0, 42, 28.39, -65, 28, 5.2, 5.39 }, - { 1, 2, 42.91, -65, 27, 22.0, 6.21 }, - { 15, 47, 53.71, -65, 26, 33.0, 6.39 }, - { 15, 47, 53.59, -65, 26, 33.0, 6.18 }, - { 1, 57, 53.59, -65, 25, 28.9, 6.37 }, - { 11, 39, 29.40, -65, 23, 52.1, 5.17 }, - { 16, 51, 53.90, -65, 22, 32.2, 6.13 }, - { 21, 26, 26.59, -65, 21, 58.0, 4.22 }, - { 13, 8, 7.01, -65, 18, 23.0, 5.51 }, - { 15, 7, 56.81, -65, 16, 32.2, 6.17 }, - { 11, 51, 51.19, -65, 12, 22.0, 4.90 }, - { 15, 52, 56.71, -65, 9, 9.0, 6.54 }, - { 13, 16, 44.81, -65, 8, 17.9, 6.07 }, - { 0, 36, 37.39, -65, 7, 28.9, 6.42 }, - { 10, 40, 11.30, -65, 6, 2.2, 5.52 }, - { 18, 48, 37.80, -65, 4, 40.1, 5.73 }, - { 9, 47, 6.70, -65, 4, 21.0, 6.26 }, - { 9, 47, 6.10, -65, 4, 18.8, 3.01 }, - { 15, 58, 58.10, -65, 2, 16.1, 5.75 }, - { 14, 42, 30.41, -64, 58, 31.1, 3.19 }, - { 22, 27, 19.99, -64, 57, 59.0, 4.48 }, - { 11, 23, 21.79, -64, 57, 18.0, 5.11 }, - { 9, 36, 5.11, -64, 57, 2.2, 6.56 }, - { 9, 26, 44.21, -64, 55, 46.9, 6.05 }, - { 0, 20, 4.30, -64, 52, 28.9, 4.23 }, - { 18, 45, 26.90, -64, 52, 17.0, 4.79 }, - { 11, 6, 24.19, -64, 50, 22.9, 6.41 }, - { 21, 38, 2.90, -64, 49, 27.1, 6.20 }, - { 3, 44, 12.00, -64, 48, 24.8, 3.85 }, - { 17, 45, 43.99, -64, 43, 26.0, 3.62 }, - { 21, 50, .10, -64, 42, 45.0, 5.62 }, - { 23, 35, 12.70, -64, 41, 21.8, 7.40 }, - { 21, 18, .31, -64, 40, 54.1, 6.31 }, - { 10, 19, 4.80, -64, 40, 35.0, 5.67 }, - { 13, 29, 7.61, -64, 40, 32.9, 6.11 }, - { 18, 42, 22.51, -64, 38, 35.2, 6.37 }, - { 12, 6, 52.90, -64, 36, 49.0, 4.15 }, - { 8, 25, 51.60, -64, 36, 2.9, 5.97 }, - { 11, 19, 16.51, -64, 34, 57.0, 5.99 }, - { 13, 40, 10.90, -64, 34, 36.8, 5.79 }, - { 18, 43, 37.20, -64, 33, 4.0, 5.78 }, - { 18, 7, 48.31, -64, 33, .0, 6.41 }, - { 13, 24, .50, -64, 32, 8.9, 4.53 }, - { 15, 27, 33.10, -64, 31, 53.0, 5.71 }, - { 10, 46, 16.51, -64, 30, 54.0, 5.34 }, - { 7, 28, 51.31, -64, 30, 36.0, 6.39 }, - { 9, 6, 7.61, -64, 29, 58.9, 6.37 }, - { 9, 57, 15.19, -64, 29, 21.8, 6.58 }, - { 13, 25, 13.90, -64, 29, 7.1, 5.31 }, - { 5, 54, 11.90, -64, 28, 55.9, 6.63 }, - { 10, 42, 13.99, -64, 27, 59.0, 4.82 }, - { 2, 54, 20.90, -64, 26, 8.2, 6.56 }, - { 12, 14, 16.80, -64, 24, 31.0, 6.22 }, - { 23, 44, 12.00, -64, 24, 15.8, 5.72 }, - { 10, 42, 57.41, -64, 23, 39.8, 2.76 }, - { 10, 46, 51.19, -64, 22, 59.9, 4.85 }, - { 1, 25, 5.30, -64, 22, 9.8, 5.93 }, - { 12, 28, 18.91, -64, 20, 29.0, 6.04 }, - { 11, 58, 47.69, -64, 20, 21.1, 5.61 }, - { 2, 28, 4.39, -64, 17, 58.9, 6.37 }, - { 23, 57, 35.21, -64, 17, 53.9, 5.00 }, - { 2, 39, 31.70, -64, 16, 54.8, 6.55 }, - { 10, 46, 29.69, -64, 15, 47.9, 5.23 }, - { 10, 43, 51.19, -64, 14, 56.0, 5.77 }, - { 5, 32, 59.59, -64, 13, 39.0, 5.34 }, - { 4, 7, 21.60, -64, 13, 21.0, 6.38 }, - { 10, 28, 52.61, -64, 10, 19.9, 5.29 }, - { 11, 12, 45.19, -64, 10, 10.9, 5.23 }, - { 8, 21, 7.70, -64, 6, 22.0, 6.12 }, - { 2, 58, 47.81, -64, 4, 17.0, 4.99 }, - { 16, 27, 57.31, -64, 3, 29.2, 5.27 }, - { 5, 51, 22.99, -64, 2, 1.0, 6.36 }, - { 15, 4, 48.19, -64, 1, 54.1, 5.17 }, - { 12, 18, 26.09, -64, 0, 11.2, 4.04 }, - { 11, 25, 43.20, -63, 58, 22.1, 5.17 }, - { 10, 44, 6.89, -63, 57, 40.0, 4.82 }, - { 21, 8, 32.90, -63, 55, 44.0, 5.76 }, - { 5, 30, 15.91, -63, 55, 40.1, 6.19 }, - { 18, 19, 40.20, -63, 53, 12.8, 6.18 }, - { 6, 24, 55.61, -63, 49, 40.1, 6.27 }, - { 14, 52, 34.99, -63, 48, 36.0, 5.87 }, - { 8, 8, 24.50, -63, 48, 4.0, 6.28 }, - { 12, 27, 24.60, -63, 47, 21.1, 6.00 }, - { 11, 49, 41.09, -63, 47, 17.9, 4.32 }, - { 16, 1, 10.70, -63, 46, 36.1, 6.41 }, - { 2, 45, 27.50, -63, 42, 15.8, 5.74 }, - { 18, 14, 16.20, -63, 41, 21.8, 6.47 }, - { 13, 57, 38.90, -63, 41, 12.1, 4.71 }, - { 16, 15, 26.30, -63, 41, 8.2, 3.85 }, - { 6, 23, 1.30, -63, 40, 59.2, 6.27 }, - { 18, 8, 34.80, -63, 40, 5.9, 4.35 }, - { 15, 9, 25.49, -63, 38, 34.1, 6.28 }, - { 15, 17, 38.90, -63, 36, 38.2, 4.86 }, - { 8, 0, 19.99, -63, 34, 3.0, 4.82 }, - { 12, 31, 55.80, -63, 30, 22.0, 5.95 }, - { 3, 56, 4.01, -63, 27, 49.0, 6.14 }, - { 15, 55, 8.50, -63, 25, 50.2, 2.85 }, - { 6, 24, 26.30, -63, 25, 44.0, 6.46 }, - { 20, 14, 26.90, -63, 24, 56.9, 6.09 }, - { 5, 7, 34.01, -63, 23, 58.9, 5.20 }, - { 4, 21, 53.30, -63, 23, 11.0, 5.24 }, - { 12, 3, 1.51, -63, 18, 46.1, 4.33 }, - { 13, 11, 53.11, -63, 18, 10.1, 6.33 }, - { 7, 57, 12.50, -63, 17, 48.8, 6.14 }, - { 11, 54, 59.81, -63, 16, 44.0, 5.91 }, - { 16, 55, 24.70, -63, 16, 10.9, 6.02 }, - { 4, 17, 40.20, -63, 15, 20.2, 5.87 }, - { 20, 19, 3.00, -63, 13, 52.0, 6.27 }, - { 4, 44, 57.89, -63, 13, 46.9, 6.46 }, - { 14, 8, 14.30, -63, 12, 29.2, 6.40 }, - { 7, 12, 1.99, -63, 11, 24.0, 6.02 }, - { 22, 52, 9.91, -63, 11, 19.0, 6.12 }, - { 12, 4, 19.20, -63, 9, 56.2, 4.72 }, - { 16, 25, 22.01, -63, 7, 28.9, 6.15 }, - { 12, 26, 30.91, -63, 7, 21.0, 4.86 }, - { 23, 29, 1.01, -63, 6, 38.9, 5.68 }, - { 12, 26, 36.50, -63, 5, 57.8, 1.73 }, - { 12, 26, 35.90, -63, 5, 57.1, 1.33 }, - { 5, 54, 6.10, -63, 5, 24.0, 4.65 }, - { 12, 42, 50.30, -63, 3, 31.0, 5.31 }, - { 18, 15, 40.90, -63, 3, 20.2, 5.60 }, - { 17, 28, 7.70, -63, 2, 11.0, 6.24 }, - { 0, 32, 43.80, -63, 1, 52.0, 5.09 }, - { 18, 25, 31.51, -63, 1, 17.0, 6.14 }, - { 11, 35, 46.80, -63, 1, 10.9, 3.13 }, - { 0, 31, 33.60, -62, 57, 56.9, 4.54 }, - { 0, 31, 32.71, -62, 57, 29.2, 4.37 }, - { 23, 57, 19.90, -62, 57, 23.0, 5.97 }, - { 12, 12, 22.01, -62, 57, 2.9, 5.92 }, - { 3, 29, 22.70, -62, 56, 15.0, 4.72 }, - { 8, 15, 15.91, -62, 54, 56.9, 5.16 }, - { 2, 52, 19.20, -62, 54, 34.9, 6.03 }, - { 20, 39, 51.41, -62, 54, 28.1, 6.22 }, - { 11, 43, 52.90, -62, 52, 41.9, 6.10 }, - { 14, 45, 17.30, -62, 52, 32.9, 5.36 }, - { 0, 53, 37.90, -62, 52, 17.0, 5.70 }, - { 17, 24, 1.10, -62, 51, 51.1, 5.70 }, - { 8, 37, 18.79, -62, 51, 13.0, 5.47 }, - { 23, 49, 44.69, -62, 50, 21.8, 6.59 }, - { 8, 4, 42.89, -62, 50, 10.0, 6.30 }, - { 4, 33, 34.01, -62, 49, 25.0, 5.79 }, - { 2, 49, 1.49, -62, 48, 24.1, 5.26 }, - { 18, 56, 54.70, -62, 48, 4.0, 6.48 }, - { 9, 32, 14.59, -62, 47, 20.0, 6.10 }, - { 14, 56, 43.99, -62, 46, 50.9, 5.11 }, - { 9, 50, 55.70, -62, 44, 43.1, 5.57 }, - { 23, 14, 6.60, -62, 42, .0, 6.12 }, - { 11, 50, 27.19, -62, 38, 57.8, 5.70 }, - { 15, 53, 22.80, -62, 36, 24.8, 6.19 }, - { 13, 47, 10.70, -62, 35, 24.0, 6.51 }, - { 2, 33, 33.60, -62, 35, 12.8, 6.77 }, - { 3, 17, 46.20, -62, 34, 31.1, 5.54 }, - { 16, 2, 52.39, -62, 32, 30.1, 6.25 }, - { 4, 27, 45.91, -62, 31, 14.9, 5.75 }, - { 9, 45, 14.81, -62, 30, 28.1, 3.69 }, - { 3, 18, 12.89, -62, 30, 23.0, 5.24 }, - { 0, 44, 32.30, -62, 29, 52.1, 6.07 }, - { 5, 33, 37.49, -62, 29, 22.9, 3.76 }, - { 11, 43, 31.20, -62, 29, 21.8, 5.03 }, - { 4, 14, 25.51, -62, 28, 26.0, 3.35 }, - { 11, 57, 40.10, -62, 26, 56.0, 5.57 }, - { 20, 51, 38.30, -62, 25, 45.1, 6.28 }, - { 20, 51, 38.81, -62, 25, 45.1, 6.59 }, - { 11, 6, 32.40, -62, 25, 27.1, 4.61 }, - { 9, 20, 56.81, -62, 24, 16.9, 4.81 }, - { 9, 11, 16.61, -62, 19, 1.9, 3.97 }, - { 5, 29, 17.40, -62, 18, 51.8, 6.59 }, - { 18, 31, 22.39, -62, 16, 41.9, 4.64 }, - { 9, 28, 46.99, -62, 16, 23.2, 5.92 }, - { 4, 14, 48.70, -62, 11, 30.8, 5.45 }, - { 18, 52, 13.01, -62, 11, 15.0, 4.22 }, - { 4, 0, 53.81, -62, 9, 33.8, 4.51 }, - { 10, 2, 49.39, -62, 9, 23.0, 6.42 }, - { 6, 7, 3.41, -62, 9, 16.9, 5.05 }, - { 11, 40, 53.59, -62, 5, 24.0, 4.94 }, - { 4, 36, 45.60, -62, 4, 39.0, 5.40 }, - { 18, 10, 26.11, -62, 0, 7.9, 5.49 }, - { 23, 16, 57.70, -62, 0, 4.0, 5.66 }, - { 22, 33, .10, -61, 58, 55.9, 4.81 }, - { 9, 25, 27.10, -61, 57, 1.1, 5.77 }, - { 11, 8, 34.01, -61, 56, 49.9, 5.13 }, - { 6, 48, 11.40, -61, 56, 29.0, 3.27 }, - { 21, 55, 11.50, -61, 53, 11.0, 5.90 }, - { 10, 3, 34.30, -61, 53, 2.0, 6.14 }, - { 6, 31, 10.61, -61, 52, 46.9, 6.15 }, - { 12, 35, 28.99, -61, 50, 30.8, 6.22 }, - { 10, 54, 29.59, -61, 49, 36.1, 5.93 }, - { 11, 38, 7.30, -61, 49, 35.0, 5.15 }, - { 12, 28, 25.49, -61, 47, 43.1, 6.22 }, - { 1, 7, 18.70, -61, 46, 31.1, 5.37 }, - { 15, 13, 1.01, -61, 44, 38.0, 6.32 }, - { 13, 37, 12.19, -61, 41, 30.8, 5.63 }, - { 10, 32, 1.39, -61, 41, 7.1, 3.32 }, - { 22, 48, 21.41, -61, 41, 3.1, 6.37 }, - { 17, 10, 6.29, -61, 40, 32.2, 6.39 }, - { 10, 13, 21.19, -61, 39, 32.0, 6.41 }, - { 9, 24, 5.69, -61, 38, 56.0, 5.99 }, - { 16, 30, 49.39, -61, 38, 1.0, 5.20 }, - { 1, 58, 46.20, -61, 34, 10.9, 2.86 }, - { 10, 9, 21.89, -61, 32, 57.1, 5.60 }, - { 6, 38, .60, -61, 31, 59.2, 6.18 }, - { 20, 37, 35.30, -61, 31, 48.0, 4.88 }, - { 18, 23, 13.61, -61, 29, 38.0, 4.36 }, - { 14, 0, 17.30, -61, 28, 53.0, 6.49 }, - { 15, 10, 44.59, -61, 25, 21.0, 6.30 }, - { 3, 58, 44.69, -61, 24, 1.1, 4.56 }, - { 10, 30, 39.19, -61, 21, 22.0, 6.43 }, - { 10, 17, 4.99, -61, 19, 55.9, 3.40 }, - { 9, 39, 21.00, -61, 19, 41.2, 4.52 }, - { 10, 59, 13.99, -61, 19, 13.1, 6.16 }, - { 8, 9, .70, -61, 18, 9.0, 4.76 }, - { 11, 37, .60, -61, 16, 59.9, 5.15 }, - { 11, 31, 15.00, -61, 16, 41.9, 6.38 }, - { 12, 11, 4.90, -61, 16, 39.0, 6.08 }, - { 14, 19, 51.50, -61, 16, 23.2, 5.23 }, - { 4, 25, 5.30, -61, 14, 17.9, 5.94 }, - { 11, 46, 30.79, -61, 10, 41.9, 4.11 }, - { 5, 34, 57.60, -61, 10, 32.9, 6.32 }, - { 19, 54, 40.39, -61, 10, 14.9, 6.24 }, - { 11, 26, 35.30, -61, 6, 55.1, 5.30 }, - { 18, 45, 11.50, -61, 5, 42.0, 6.04 }, - { 4, 1, 18.19, -61, 4, 44.0, 4.97 }, - { 19, 50, 21.70, -61, 3, 41.0, 6.21 }, - { 11, 36, 22.30, -61, 3, 7.9, 5.83 }, - { 3, 32, 51.60, -61, 1, .8, 6.41 }, - { 16, 38, 52.70, -60, 59, 25.1, 6.18 }, - { 13, 22, 37.90, -60, 59, 17.9, 4.53 }, - { 10, 34, 12.91, -60, 59, 16.1, 6.23 }, - { 12, 45, 37.90, -60, 58, 52.0, 4.69 }, - { 13, 22, 35.69, -60, 58, 19.9, 6.18 }, - { 12, 4, 57.10, -60, 58, 9.1, 5.96 }, - { 9, 0, 45.70, -60, 57, 50.0, 5.79 }, - { 15, 16, 56.71, -60, 57, 27.0, 5.09 }, - { 4, 16, 21.10, -60, 56, 55.0, 6.37 }, - { 15, 16, 36.41, -60, 54, 14.0, 5.73 }, - { 1, 55, 46.39, -60, 51, 41.0, 6.06 }, - { 12, 8, 24.60, -60, 50, 49.9, 6.22 }, - { 14, 39, 36.10, -60, 50, 8.2, 1.33 }, - { 14, 39, 35.90, -60, 50, 7.1,-0.01 }, - { 7, 58, 50.50, -60, 49, 27.8, 5.81 }, - { 1, 41, 48.00, -60, 47, 21.8, 5.71 }, - { 15, 54, 52.61, -60, 44, 35.9, 6.15 }, - { 0, 58, 22.39, -60, 41, 47.0, 6.23 }, - { 17, 31, 5.90, -60, 41, 2.0, 3.62 }, - { 17, 24, 18.70, -60, 40, 25.0, 5.77 }, - { 15, 23, 10.39, -60, 39, 24.8, 5.67 }, - { 8, 55, 2.81, -60, 38, 40.9, 3.84 }, - { 10, 46, 16.80, -60, 36, 11.9, 6.25 }, - { 7, 59, 37.61, -60, 35, 12.8, 5.17 }, - { 20, 35, 34.80, -60, 34, 54.1, 4.76 }, - { 10, 43, 32.09, -60, 34, .1, 4.57 }, - { 20, 40, 2.59, -60, 32, 56.0, 5.12 }, - { 7, 56, 18.60, -60, 31, 35.0, 5.74 }, - { 10, 55, 17.21, -60, 31, .8, 5.92 }, - { 22, 44, 16.51, -60, 29, 57.8, 6.30 }, - { 15, 18, 48.91, -60, 29, 47.0, 5.46 }, - { 15, 56, 6.00, -60, 28, 58.1, 5.76 }, - { 16, 40, 50.50, -60, 26, 46.0, 6.18 }, - { 10, 2, .00, -60, 25, 14.9, 5.94 }, - { 12, 21, 21.60, -60, 24, 4.0, 3.59 }, - { 12, 50, 12.00, -60, 24, 2.9, 6.75 }, - { 12, 53, 49.10, -60, 22, 36.8, 5.90 }, - { 14, 3, 49.39, -60, 22, 23.2, 0.61 }, - { 8, 53, 48.70, -60, 21, 15.1, 5.78 }, - { 12, 51, 17.81, -60, 19, 46.9, 5.72 }, - { 12, 53, 21.79, -60, 19, 43.0, 5.76 }, - { 11, 12, 36.00, -60, 19, 3.0, 4.60 }, - { 8, 39, 13.20, -60, 19, 1.9, 6.36 }, - { 2, 24, 53.90, -60, 18, 42.8, 5.35 }, - { 7, 57, 46.90, -60, 18, 11.9, 5.60 }, - { 9, 23, 27.41, -60, 18, 9.0, 6.30 }, - { 15, 43, 55.10, -60, 17, 13.9, 6.48 }, - { 7, 49, 12.89, -60, 17, 1.0, 5.78 }, - { 6, 24, 13.70, -60, 16, 52.0, 5.80 }, - { 0, 42, 41.81, -60, 15, 45.0, 5.98 }, - { 22, 18, 30.10, -60, 15, 34.9, 2.86 }, - { 6, 50, 1.10, -60, 14, 57.1, 6.11 }, - { 7, 59, 40.20, -60, 12, 27.0, 6.33 }, - { 18, 58, 36.41, -60, 12, 2.2, 5.14 }, - { 10, 2, 59.90, -60, 10, 43.0, 6.19 }, - { 15, 55, 32.30, -60, 10, 40.1, 5.77 }, - { 17, 51, 35.50, -60, 9, 51.8, 5.78 }, - { 14, 55, 34.61, -60, 6, 51.1, 5.20 }, - { 6, 2, 9.19, -60, 5, 48.8, 6.45 }, - { 23, 22, 56.90, -60, 3, 20.9, 6.09 }, - { 7, 49, 54.79, -60, 3, 4.0, 6.72 }, - { 14, 35, 17.21, -60, 0, 56.9, 6.40 }, - { 13, 12, 17.40, -59, 55, 14.9, 4.60 }, - { 10, 48, 5.40, -59, 55, 9.1, 6.00 }, - { 10, 13, 1.30, -59, 55, 5.2, 6.10 }, - { 14, 16, 34.20, -59, 54, 50.0, 6.39 }, - { 15, 39, 56.50, -59, 54, 29.9, 5.95 }, - { 10, 16, 3.10, -59, 54, 11.9, 6.22 }, - { 22, 51, 44.90, -59, 52, 53.0, 6.46 }, - { 13, 7, 24.19, -59, 51, 38.2, 5.99 }, - { 17, 35, 34.90, -59, 50, 46.0, 6.28 }, - { 13, 12, 55.99, -59, 49, .1, 6.16 }, - { 13, 20, 34.90, -59, 46, 23.9, 6.18 }, - { 8, 40, 37.01, -59, 45, 40.0, 4.33 }, - { 3, 3, 36.79, -59, 44, 16.1, 5.11 }, - { 4, 44, 21.10, -59, 43, 58.1, 5.27 }, - { 10, 57, 48.41, -59, 43, 54.8, 6.11 }, - { 14, 6, 25.10, -59, 42, 56.2, 6.42 }, - { 17, 19, 12.41, -59, 41, 39.8, 5.91 }, - { 12, 47, 43.20, -59, 41, 19.0, 1.25 }, - { 12, 41, 56.59, -59, 41, 8.9, 4.93 }, - { 10, 45, 3.60, -59, 41, 3.1, 6.21 }, - { 10, 41, 17.59, -59, 40, 36.8, 6.42 }, - { 22, 5, 50.90, -59, 38, 10.0, 5.62 }, - { 11, 13, 30.79, -59, 37, 9.8, 5.74 }, - { 10, 36, 20.30, -59, 33, 52.9, 5.08 }, - { 11, 31, 48.79, -59, 30, 56.9, 5.15 }, - { 8, 22, 30.79, -59, 30, 34.9, 1.86 }, - { 0, 40, 26.40, -59, 27, 15.8, 5.89 }, - { 11, 31, 46.10, -59, 26, 31.9, 5.13 }, - { 9, 51, 12.10, -59, 25, 32.9, 5.79 }, - { 12, 31, 40.30, -59, 25, 26.0, 5.48 }, - { 9, 12, 55.61, -59, 24, 51.8, 5.54 }, - { 20, 1, 44.69, -59, 22, 34.0, 5.13 }, - { 6, 52, 45.41, -59, 20, 28.0, 6.41 }, - { 10, 49, 24.10, -59, 19, 25.0, 5.91 }, - { 15, 23, 22.70, -59, 19, 14.9, 4.51 }, - { 4, 16, 28.90, -59, 18, 6.8, 4.44 }, - { 14, 8, 56.30, -59, 16, 36.1, 6.34 }, - { 9, 17, 5.40, -59, 16, 31.1, 2.25 }, - { 9, 34, 26.71, -59, 13, 45.8, 4.08 }, - { 8, 56, 58.39, -59, 13, 45.8, 4.92 }, - { 10, 42, 40.61, -59, 12, 56.9, 5.38 }, - { 6, 16, 18.50, -59, 12, 49.0, 6.43 }, - { 14, 28, 43.49, -59, 11, 52.1, 6.45 }, - { 19, 50, 44.81, -59, 11, 35.2, 5.42 }, - { 10, 38, 45.10, -59, 10, 59.2, 4.66 }, - { 7, 3, 15.60, -59, 10, 41.2, 5.50 }, - { 8, 17, 55.80, -59, 10, .8, 6.42 }, - { 12, 54, 39.19, -59, 8, 48.1, 4.62 }, - { 7, 56, 50.71, -59, 7, 35.0, 6.25 }, - { 13, 14, 14.81, -59, 6, 11.9, 4.92 }, - { 8, 59, 24.10, -59, 5, 1.0, 5.16 }, - { 16, 49, 47.09, -59, 2, 29.0, 3.76 }, - { 18, 9, 57.60, -59, 2, 24.0, 6.38 }, - { 21, 58, 30.10, -59, 0, 43.9, 6.12 }, - { 12, 27, 28.70, -58, 59, 30.8, 5.50 }, - { 11, 8, 35.40, -58, 58, 30.0, 3.91 }, - { 9, 10, 58.01, -58, 58, .8, 3.44 }, - { 17, 1, 47.40, -58, 57, 29.9, 6.11 }, - { 4, 40, 18.29, -58, 56, 37.0, 6.53 }, - { 7, 1, 5.09, -58, 56, 24.0, 6.02 }, - { 5, 26, 19.30, -58, 54, 45.0, 5.14 }, - { 12, 43, 28.20, -58, 54, 11.2, 6.40 }, - { 19, 57, 6.19, -58, 54, 5.0, 5.26 }, - { 5, 35, 2.40, -58, 52, 16.0, 6.75 }, - { 10, 53, 29.59, -58, 51, 11.9, 3.78 }, - { 10, 11, 35.21, -58, 49, 41.2, 6.40 }, - { 10, 38, 59.40, -58, 49, .8, 5.92 }, - { 15, 17, 30.79, -58, 48, 4.0, 4.07 }, - { 9, 45, 55.39, -58, 47, 39.1, 6.22 }, - { 13, 42, 1.10, -58, 47, 13.9, 5.38 }, - { 6, 31, 58.39, -58, 45, 15.1, 5.70 }, - { 12, 15, 8.71, -58, 44, 56.0, 2.80 }, - { 10, 27, 52.70, -58, 44, 21.8, 3.82 }, - { 10, 37, 26.81, -58, 43, 59.9, 5.45 }, - { 8, 45, 5.30, -58, 43, 30.0, 6.21 }, - { 18, 33, 29.50, -58, 42, 33.1, 6.44 }, - { 13, 14, 12.10, -58, 41, 2.0, 5.89 }, - { 11, 6, 29.30, -58, 40, 31.1, 6.02 }, - { 10, 32, 47.59, -58, 40, .8, 6.00 }, - { 7, 42, 10.20, -58, 37, 50.9, 6.43 }, - { 14, 41, 55.70, -58, 36, 58.0, 6.22 }, - { 16, 28, 15.19, -58, 35, 58.9, 5.69 }, - { 10, 24, 59.40, -58, 34, 35.0, 5.95 }, - { 4, 54, 52.99, -58, 32, 49.9, 6.12 }, - { 6, 23, 46.90, -58, 32, 38.0, 6.48 }, - { 16, 46, 21.19, -58, 30, 13.0, 5.74 }, - { 14, 44, 55.49, -58, 28, 40.1, 6.11 }, - { 23, 27, 15.00, -58, 28, 34.0, 5.63 }, - { 14, 22, 37.01, -58, 27, 33.8, 4.92 }, - { 11, 10, 54.70, -58, 27, 19.1, 6.88 }, - { 20, 54, 48.60, -58, 27, 15.1, 3.65 }, - { 12, 54, 22.01, -58, 25, 50.2, 6.58 }, - { 13, 38, 7.61, -58, 24, 54.0, 6.42 }, - { 9, 15, 17.50, -58, 23, 19.0, 6.02 }, - { 9, 30, 23.40, -58, 21, 42.1, 5.88 }, - { 16, 47, 19.51, -58, 20, 29.0, 5.58 }, - { 1, 36, 44.81, -58, 16, 14.9, 6.18 }, - { 8, 54, 54.00, -58, 14, 24.0, 6.38 }, - { 23, 17, 25.80, -58, 14, 8.9, 3.99 }, - { 7, 42, 53.30, -58, 13, 48.0, 6.21 }, - { 8, 35, 15.41, -58, 13, 30.0, 5.26 }, - { 10, 33, 25.30, -58, 11, 25.1, 6.14 }, - { 1, 35, 15.19, -58, 8, 21.8, 6.01 }, - { 10, 11, 46.51, -58, 3, 38.2, 5.72 }, - { 17, 22, 55.01, -58, 0, 37.1, 5.88 }, - { 8, 35, 19.61, -58, 0, 33.1, 4.86 }, - { 6, 27, 4.01, -58, 0, 7.9, 5.82 }, - { 9, 40, 42.50, -57, 59, 1.0, 5.32 }, - { 19, 38, 25.90, -57, 58, 59.9, 6.18 }, - { 8, 21, 12.00, -57, 58, 23.2, 5.97 }, - { 10, 23, 50.90, -57, 57, 14.0, 6.35 }, - { 16, 9, 18.60, -57, 56, 3.8, 5.57 }, - { 19, 56, 57.70, -57, 55, 32.2, 6.53 }, - { 16, 15, 49.70, -57, 54, 43.9, 5.63 }, - { 16, 54, .50, -57, 54, 33.8, 5.94 }, - { 16, 18, 51.89, -57, 53, 58.9, 6.49 }, - { 21, 56, 13.99, -57, 53, 57.8, 6.19 }, - { 22, 35, 52.90, -57, 53, 1.0, 6.23 }, - { 9, 4, 48.00, -57, 51, 9.0, 6.44 }, - { 22, 24, 56.40, -57, 47, 49.9, 5.32 }, - { 16, 3, 31.90, -57, 46, 31.1, 4.63 }, - { 16, 29, 45.00, -57, 45, 20.9, 6.06 }, - { 17, 4, 24.70, -57, 42, 43.9, 5.73 }, - { 11, 47, 19.10, -57, 41, 47.0, 5.41 }, - { 1, 10, 7.39, -57, 41, 39.8, 6.41 }, - { 12, 22, 49.30, -57, 40, 34.0, 5.39 }, - { 10, 27, 24.41, -57, 38, 20.0, 4.66 }, - { 8, 51, 36.60, -57, 38, 1.0, 5.59 }, - { 13, 38, 49.10, -57, 37, 23.2, 6.01 }, - { 9, 15, 34.99, -57, 34, 41.2, 6.32 }, - { 10, 35, 35.30, -57, 33, 28.1, 4.45 }, - { 17, 44, 55.80, -57, 32, 43.1, 6.01 }, - { 8, 40, 43.61, -57, 32, 43.1, 6.34 }, - { 9, 16, 12.19, -57, 32, 29.0, 4.34 }, - { 20, 11, 7.20, -57, 31, 26.0, 6.37 }, - { 18, 29, 56.69, -57, 31, 23.2, 5.76 }, - { 22, 20, 36.19, -57, 30, 36.0, 6.34 }, - { 12, 1, 28.99, -57, 30, 13.0, 6.16 }, - { 5, 5, 30.60, -57, 28, 22.1, 4.72 }, - { 10, 47, 38.71, -57, 28, 4.1, 6.36 }, - { 0, 43, 21.19, -57, 27, 47.2, 4.36 }, - { 22, 40, 48.89, -57, 25, 19.9, 5.97 }, - { 11, 54, 11.50, -57, 24, 36.0, 6.06 }, - { 10, 1, 58.01, -57, 20, 58.9, 6.20 }, - { 3, 12, 33.19, -57, 19, 18.1, 5.74 }, - { 7, 54, 53.21, -57, 18, 11.2, 5.63 }, - { 9, 41, 2.21, -57, 15, 34.9, 5.80 }, - { 10, 38, 2.50, -57, 15, 23.0, 5.91 }, - { 10, 52, 30.91, -57, 14, 26.2, 5.25 }, - { 1, 37, 42.89, -57, 14, 12.1, 0.46 }, - { 9, 45, 40.49, -57, 11, 8.2, 6.46 }, - { 12, 54, 35.59, -57, 10, 40.1, 4.03 }, - { 12, 54, 36.79, -57, 10, 5.9, 5.17 }, - { 5, 52, 20.30, -57, 9, 22.0, 5.94 }, - { 12, 31, 9.89, -57, 6, 47.9, 1.63 }, - { 3, 58, 42.89, -57, 6, 9.0, 6.05 }, - { 14, 14, 57.00, -57, 5, 8.9, 5.07 }, - { 12, 31, 16.70, -57, 4, 52.0, 6.42 }, - { 4, 24, 12.19, -57, 4, 17.0, 6.29 }, - { 9, 31, 13.30, -57, 2, 3.8, 3.13 }, - { 1, 2, 1.80, -57, 0, 9.0, 6.11 }, - { 11, 52, 10.10, -56, 59, 16.1, 5.57 }, - { 10, 0, 34.39, -56, 56, 48.1, 6.52 }, - { 17, 31, 22.99, -56, 55, 14.2, 5.95 }, - { 17, 14, 13.20, -56, 53, 17.9, 6.09 }, - { 14, 32, 32.90, -56, 53, 16.1, 6.93 }, - { 18, 45, 23.71, -56, 52, 54.1, 6.22 }, - { 6, 29, 28.51, -56, 51, 10.1, 5.22 }, - { 23, 25, 19.39, -56, 50, 57.1, 5.59 }, - { 12, 55, 57.00, -56, 50, 10.0, 5.32 }, - { 22, 3, 21.60, -56, 47, 10.0, 4.69 }, - { 11, 23, 8.11, -56, 46, 45.8, 5.79 }, - { 8, 46, 42.50, -56, 46, 10.9, 4.49 }, - { 13, 42, 56.09, -56, 46, 5.2, 6.00 }, - { 10, 46, 57.50, -56, 45, 25.9, 5.23 }, - { 7, 4, 18.29, -56, 44, 58.9, 5.17 }, - { 20, 25, 38.90, -56, 44, 6.0, 1.94 }, - { 7, 45, 35.59, -56, 43, 21.0, 6.12 }, - { 14, 49, 6.89, -56, 40, 4.1, 6.23 }, - { 8, 53, 3.79, -56, 38, 57.8, 6.03 }, - { 17, 23, 6.89, -56, 31, 31.1, 5.80 }, - { 12, 29, 53.90, -56, 31, 28.9, 5.80 }, - { 0, 41, 46.39, -56, 30, 6.1, 5.70 }, - { 12, 46, 22.70, -56, 29, 20.0, 4.65 }, - { 7, 48, 19.20, -56, 28, 16.0, 6.33 }, - { 14, 40, 32.81, -56, 26, 26.9, 6.30 }, - { 9, 48, 40.01, -56, 24, 42.8, 6.06 }, - { 7, 49, 6.70, -56, 24, 38.2, 5.59 }, - { 12, 28, 33.41, -56, 24, 28.1, 6.15 }, - { 6, 58, 36.19, -56, 23, 40.9, 6.45 }, - { 14, 20, 19.51, -56, 23, 12.1, 4.33 }, - { 17, 25, 23.59, -56, 22, 39.0, 3.34 }, - { 12, 21, 57.50, -56, 22, 28.9, 5.92 }, - { 6, 22, 55.80, -56, 22, 12.0, 5.61 }, - { 19, 48, 1.20, -56, 21, 45.0, 5.35 }, - { 11, 58, 15.19, -56, 19, 1.9, 5.44 }, - { 14, 3, 26.21, -56, 12, 49.0, 5.92 }, - { 1, 39, 47.40, -56, 11, 53.2, 5.87 }, - { 1, 39, 47.81, -56, 11, 40.9, 5.76 }, - { 16, 7, 24.00, -56, 11, 29.0, 6.16 }, - { 12, 43, 9.10, -56, 10, 34.0, 6.00 }, - { 5, 49, 49.70, -56, 10, .1, 4.51 }, - { 5, 22, 22.10, -56, 8, 3.8, 6.11 }, - { 10, 18, 37.61, -56, 6, 36.0, 5.81 }, - { 8, 9, 33.60, -56, 5, 8.2, 5.66 }, - { 10, 20, 54.79, -56, 2, 35.2, 4.50 }, - { 18, 17, 7.49, -56, 1, 23.9, 5.33 }, - { 16, 58, 37.20, -55, 59, 25.1, 3.13 }, - { 12, 42, 49.61, -55, 56, 49.9, 6.08 }, - { 2, 19, 54.29, -55, 56, 40.9, 5.81 }, - { 7, 36, 1.70, -55, 53, 15.0, 6.39 }, - { 22, 0, 24.10, -55, 52, 58.1, 6.01 }, - { 9, 6, 34.01, -55, 48, 11.9, 6.11 }, - { 13, 20, 48.29, -55, 48, 2.2, 6.02 }, - { 8, 42, 20.90, -55, 46, 27.1, 6.29 }, - { 21, 40, 33.60, -55, 44, 15.0, 6.33 }, - { 6, 58, 39.60, -55, 43, 45.8, 6.27 }, - { 19, 8, 52.10, -55, 43, 13.1, 6.49 }, - { 10, 39, 18.41, -55, 36, 11.9, 4.28 }, - { 14, 45, 10.90, -55, 36, 6.8, 6.10 }, - { 9, 14, 18.00, -55, 34, 10.9, 5.27 }, - { 16, 13, 22.61, -55, 32, 26.9, 5.81 }, - { 6, 47, 18.70, -55, 32, 24.0, 5.61 }, - { 17, 25, 18.00, -55, 31, 48.0, 2.85 }, - { 9, 21, 49.99, -55, 30, 54.0, 5.63 }, - { 8, 1, 31.49, -55, 27, 18.0, 6.28 }, - { 19, 29, 52.61, -55, 26, 29.0, 6.13 }, - { 17, 48, 38.11, -55, 24, 6.1, 6.11 }, - { 9, 53, .00, -55, 22, 23.9, 6.48 }, - { 15, 11, 16.01, -55, 20, 46.0, 5.54 }, - { 1, 8, 23.11, -55, 14, 44.9, 3.92 }, - { 9, 41, 47.81, -55, 12, 51.1, 6.00 }, - { 8, 29, 36.31, -55, 11, 28.0, 6.36 }, - { 9, 19, 32.59, -55, 11, 12.1, 6.28 }, - { 17, 28, 38.71, -55, 10, 10.9, 5.94 }, - { 12, 18, 59.69, -55, 8, 35.2, 5.00 }, - { 16, 20, 25.20, -55, 8, 24.0, 5.77 }, - { 19, 30, 34.49, -55, 6, 36.0, 6.30 }, - { 15, 51, 6.79, -55, 3, 20.9, 5.73 }, - { 20, 20, 32.30, -55, 3, 2.9, 6.27 }, - { 4, 33, 59.81, -55, 2, 42.0, 3.27 }, - { 10, 19, 36.79, -55, 1, 45.8, 4.57 }, - { 20, 7, 35.09, -55, 0, 59.0, 6.26 }, - { 8, 27, 27.41, -55, 0, 42.1, 6.53 }, - { 9, 22, 6.79, -55, 0, 38.9, 2.50 }, - { 14, 33, 32.40, -54, 59, 53.9, 5.87 }, - { 21, 57, 55.10, -54, 59, 33.0, 4.40 }, - { 19, 52, 39.00, -54, 58, 36.1, 6.50 }, - { 10, 15, 16.61, -54, 58, 27.1, 6.16 }, - { 19, 52, 37.61, -54, 58, 16.0, 5.74 }, - { 6, 10, 17.90, -54, 58, 7.0, 4.81 }, - { 8, 55, 11.90, -54, 57, 56.2, 5.71 }, - { 12, 53, 3.91, -54, 57, 9.0, 5.93 }, - { 5, 33, 44.40, -54, 54, 7.9, 6.43 }, - { 10, 26, 49.01, -54, 52, 39.0, 5.58 }, - { 0, 35, 33.41, -54, 49, 18.8, 6.06 }, - { 21, 5, 14.21, -54, 43, 37.9, 5.16 }, - { 8, 44, 42.19, -54, 42, 29.9, 1.96 }, - { 13, 56, 33.00, -54, 42, 15.8, 6.00 }, - { 6, 46, 41.50, -54, 41, 40.9, 6.46 }, - { 14, 5, 46.51, -54, 40, 9.8, 6.17 }, - { 21, 26, 15.41, -54, 39, 38.2, 6.12 }, - { 16, 13, 28.70, -54, 37, 50.2, 4.94 }, - { 14, 13, 39.89, -54, 37, 32.9, 6.11 }, - { 17, 0, 6.19, -54, 35, 48.8, 5.65 }, - { 16, 1, 6.41, -54, 34, 40.1, 6.13 }, - { 9, 56, 51.79, -54, 34, 4.1, 3.54 }, - { 13, 41, 44.69, -54, 33, 36.0, 5.01 }, - { 2, 40, 39.60, -54, 33, .0, 5.21 }, - { 8, 1, 22.90, -54, 30, 54.0, 6.10 }, - { 17, 38, 5.59, -54, 30, 1.1, 5.25 }, - { 9, 17, 42.31, -54, 29, 43.1, 6.33 }, - { 11, 21, .41, -54, 29, 28.0, 3.89 }, - { 19, 22, 51.10, -54, 25, 25.0, 5.05 }, - { 19, 40, 18.31, -54, 25, 3.0, 6.26 }, - { 5, 5, .60, -54, 24, 27.0, 6.27 }, - { 7, 30, 30.91, -54, 23, 57.8, 5.96 }, - { 8, 31, 29.59, -54, 23, 39.1, 6.34 }, - { 0, 37, 18.10, -54, 23, 39.1, 6.41 }, - { 7, 52, 29.69, -54, 22, 1.9, 5.70 }, - { 5, 47, 13.01, -54, 21, 38.9, 6.18 }, - { 19, 27, 48.10, -54, 19, 31.1, 5.69 }, - { 3, 44, 33.79, -54, 16, 26.0, 6.30 }, - { 11, 34, 45.70, -54, 15, 51.1, 4.62 }, - { 8, 0, 49.90, -54, 9, 5.0, 5.87 }, - { 13, 56, 19.80, -54, 7, 54.8, 6.14 }, - { 6, 52, 46.90, -54, 5, 24.0, 6.57 }, - { 15, 59, 54.00, -54, 1, 16.0, 6.10 }, - { 0, 9, 2.40, -54, 0, 6.8, 6.33 }, - { 11, 40, 42.60, -53, 58, 7.0, 5.96 }, - { 23, 4, 39.60, -53, 57, 54.0, 5.37 }, - { 9, 43, 42.19, -53, 53, 30.1, 5.56 }, - { 12, 52, 24.60, -53, 49, 45.8, 6.24 }, - { 16, 16, 43.10, -53, 48, 40.0, 5.44 }, - { 23, 23, 54.31, -53, 48, 29.9, 6.15 }, - { 1, 42, 29.30, -53, 44, 26.2, 5.52 }, - { 10, 31, 21.79, -53, 42, 56.2, 4.89 }, - { 0, 45, .00, -53, 42, 54.0, 6.15 }, - { 21, 29, .31, -53, 42, 20.9, 6.39 }, - { 16, 13, 16.80, -53, 40, 18.1, 5.83 }, - { 9, 37, 12.31, -53, 40, 7.0, 5.45 }, - { 14, 13, 16.39, -53, 39, 56.9, 5.56 }, - { 22, 18, 15.60, -53, 37, 40.1, 5.37 }, - { 6, 49, 51.31, -53, 37, 19.9, 4.40 }, - { 17, 50, 28.20, -53, 36, 43.9, 5.92 }, - { 9, 3, 5.21, -53, 32, 58.9, 6.40 }, - { 1, 46, 6.31, -53, 31, 18.8, 5.04 }, - { 14, 15, 21.19, -53, 30, 34.9, 6.39 }, - { 22, 45, 37.90, -53, 30, 1.1, 4.85 }, - { 13, 39, 53.21, -53, 27, 59.0, 2.30 }, - { 4, 50, 55.20, -53, 27, 41.0, 5.61 }, - { 13, 7, 38.30, -53, 27, 34.9, 5.71 }, - { 4, 50, 56.30, -53, 27, 34.9, 6.42 }, - { 21, 19, 52.01, -53, 26, 58.9, 4.39 }, - { 8, 39, 23.81, -53, 26, 22.9, 5.48 }, - { 14, 9, 54.79, -53, 26, 21.1, 4.75 }, - { 1, 38, 48.19, -53, 26, 20.0, 6.84 }, - { 5, 57, 14.40, -53, 25, 34.0, 6.45 }, - { 19, 18, 9.41, -53, 23, 12.1, 6.38 }, - { 9, 26, 18.10, -53, 22, 45.1, 5.11 }, - { 13, 53, 43.10, -53, 22, 25.0, 5.89 }, - { 10, 1, 40.49, -53, 21, 51.8, 6.20 }, - { 17, 35, 19.99, -53, 21, 10.1, 6.10 }, - { 7, 39, .41, -53, 16, 23.9, 6.06 }, - { 21, 15, 45.91, -53, 15, 47.2, 5.75 }, - { 17, 3, 8.81, -53, 14, 12.8, 5.29 }, - { 11, 13, 39.31, -53, 13, 54.1, 5.76 }, - { 8, 32, 4.80, -53, 12, 43.9, 5.69 }, - { 15, 50, 6.89, -53, 12, 33.8, 5.77 }, - { 19, 32, 53.81, -53, 11, 8.9, 5.75 }, - { 14, 23, 48.41, -53, 10, 36.1, 6.00 }, - { 16, 59, 35.11, -53, 9, 38.2, 4.06 }, - { 11, 26, 47.30, -53, 9, 36.0, 5.81 }, - { 16, 44, 39.79, -53, 9, 9.0, 5.96 }, - { 17, 51, 10.99, -53, 7, 50.2, 6.09 }, - { 8, 42, 25.49, -53, 6, 50.0, 4.86 }, - { 8, 5, 4.01, -53, 6, 29.2, 5.53 }, - { 8, 42, 18.91, -53, 6, .0, 5.52 }, - { 8, 38, 44.90, -53, 5, 26.2, 6.47 }, - { 8, 27, 36.50, -53, 5, 19.0, 5.09 }, - { 16, 17, 20.90, -53, 5, 12.1, 6.33 }, - { 8, 39, 57.60, -53, 3, 18.0, 5.19 }, - { 8, 40, 17.40, -53, 0, 55.1, 5.61 }, - { 7, 56, 46.70, -52, 58, 55.9, 3.47 }, - { 6, 34, 58.61, -52, 58, 32.2, 4.39 }, - { 9, 36, 46.30, -52, 56, 39.1, 6.19 }, - { 18, 58, 27.70, -52, 56, 19.0, 4.87 }, - { 8, 40, 17.59, -52, 55, 18.8, 3.62 }, - { 18, 34, 31.20, -52, 53, 30.8, 6.22 }, - { 19, 48, 55.10, -52, 53, 17.2, 6.25 }, - { 20, 7, 23.21, -52, 52, 50.9, 4.94 }, - { 4, 18, 40.01, -52, 51, 36.0, 6.09 }, - { 8, 48, .19, -52, 51, 2.2, 6.30 }, - { 13, 52, 4.80, -52, 48, 42.1, 5.25 }, - { 14, 56, 17.30, -52, 48, 34.9, 5.38 }, - { 8, 26, 25.20, -52, 48, 27.0, 6.05 }, - { 6, 24, 48.19, -52, 48, 23.0, 6.51 }, - { 12, 50, 57.91, -52, 47, 15.0, 5.73 }, - { 5, 50, 28.61, -52, 46, 4.1, 6.35 }, - { 23, 0, 52.80, -52, 45, 15.1, 4.12 }, - { 13, 20, 37.80, -52, 44, 53.2, 5.48 }, - { 23, 58, 55.80, -52, 44, 44.9, 5.13 }, - { 21, 33, 17.71, -52, 44, 15.0, 6.41 }, - { 6, 17, 51.70, -52, 43, 59.2, 6.41 }, - { 8, 56, 19.39, -52, 43, 25.0, 4.69 }, - { 23, 26, 36.60, -52, 43, 18.1, 5.52 }, - { 6, 23, 57.10, -52, 41, 44.9,-0.72 }, - { 22, 39, 8.40, -52, 41, 31.9, 6.65 }, - { 3, 54, 34.01, -52, 41, 26.2, 6.46 }, - { 14, 33, 29.90, -52, 40, 48.0, 5.87 }, - { 7, 29, 59.59, -52, 39, 4.0, 5.87 }, - { 9, 57, 10.90, -52, 38, 20.0, 6.12 }, - { 5, 54, 50.21, -52, 38, 7.1, 5.29 }, - { 7, 55, .50, -52, 34, 59.2, 6.38 }, - { 2, 44, 10.70, -52, 34, 14.2, 6.15 }, - { 13, 10, 58.39, -52, 34, .8, 6.06 }, - { 2, 37, 24.41, -52, 32, 35.2, 5.31 }, - { 7, 35, 39.70, -52, 32, 2.0, 4.94 }, - { 7, 15, 21.00, -52, 29, 58.9, 5.97 }, - { 20, 14, 19.01, -52, 26, 44.2, 5.65 }, - { 15, 48, 50.30, -52, 26, 17.2, 6.07 }, - { 6, 45, 53.69, -52, 24, 36.0, 5.80 }, - { 14, 47, 1.30, -52, 23, 1.0, 5.21 }, - { 0, 34, 27.79, -52, 22, 23.2, 5.57 }, - { 15, 38, 49.51, -52, 22, 22.1, 5.44 }, - { 12, 11, 39.10, -52, 22, 7.0, 3.96 }, - { 21, 39, 59.69, -52, 21, 33.1, 6.21 }, - { 19, 6, 19.90, -52, 20, 26.9, 5.16 }, - { 6, 33, 26.09, -52, 19, 44.0, 6.19 }, - { 5, 24, 46.20, -52, 18, 59.0, 6.27 }, - { 7, 20, 21.41, -52, 18, 42.1, 6.05 }, - { 7, 20, 21.70, -52, 18, 34.9, 6.60 }, - { 17, 27, 57.60, -52, 17, 49.9, 5.75 }, - { 16, 56, 28.70, -52, 17, 2.0, 5.94 }, - { 14, 47, 12.31, -52, 12, 20.2, 6.07 }, - { 6, 45, 26.09, -52, 12, 4.0, 6.57 }, - { 9, 1, 44.59, -52, 11, 17.9, 5.23 }, - { 10, 6, 7.10, -52, 11, 17.2, 6.52 }, - { 13, 22, 16.20, -52, 10, 59.2, 5.83 }, - { 5, 15, 38.90, -52, 10, 54.8, 6.49 }, - { 6, 23, 37.70, -52, 10, 52.0, 5.98 }, - { 10, 12, 22.99, -52, 9, 47.9, 6.16 }, - { 13, 55, 12.19, -52, 9, 40.0, 5.71 }, - { 8, 52, 40.80, -52, 7, 45.1, 6.39 }, - { 8, 22, 55.20, -52, 7, 26.0, 5.85 }, - { 13, 5, 30.79, -52, 6, 54.0, 6.43 }, - { 5, 50, 53.21, -52, 6, 32.0, 5.17 }, - { 18, 52, 39.60, -52, 6, 27.0, 5.17 }, - { 15, 12, 17.09, -52, 5, 57.1, 3.41 }, - { 7, 20, 38.69, -52, 5, 10.0, 5.39 }, - { 5, 13, 53.30, -52, 1, 52.0, 6.05 }, - { 7, 7, 13.30, -51, 58, 4.1, 5.96 }, - { 17, 26, 56.30, -51, 56, 57.1, 6.19 }, - { 18, 53, 12.10, -51, 55, 52.0, 6.31 }, - { 20, 44, 2.30, -51, 55, 16.0, 4.51 }, - { 23, 24, 13.10, -51, 53, 29.0, 5.75 }, - { 17, 44, 8.71, -51, 50, 3.1, 5.15 }, - { 6, 31, 18.29, -51, 49, 34.0, 5.60 }, - { 11, 0, 8.59, -51, 49, 4.1, 6.15 }, - { 10, 8, 56.30, -51, 48, 40.0, 4.86 }, - { 1, 57, .10, -51, 45, 58.0, 6.10 }, - { 10, 13, 28.01, -51, 45, 22.0, 5.78 }, - { 9, 23, 59.50, -51, 44, 13.9, 6.08 }, - { 8, 25, 31.01, -51, 43, 41.2, 5.17 }, - { 11, 59, 10.90, -51, 41, 48.1, 6.05 }, - { 4, 39, 4.30, -51, 40, 22.1, 6.44 }, - { 1, 55, 57.50, -51, 36, 32.0, 3.70 }, - { 20, 51, 30.10, -51, 36, 29.9, 5.05 }, - { 15, 28, 27.19, -51, 35, 51.0, 6.10 }, - { 4, 0, 15.70, -51, 33, 52.9, 6.51 }, - { 9, 18, 42.19, -51, 33, 38.2, 5.87 }, - { 9, 30, 5.21, -51, 31, 1.9, 5.45 }, - { 2, 16, 30.60, -51, 30, 43.9, 3.56 }, - { 14, 9, 34.99, -51, 30, 16.9, 6.00 }, - { 4, 16, 1.61, -51, 29, 12.1, 4.25 }, - { 7, 34, 39.50, -51, 28, 28.9, 6.28 }, - { 12, 26, 31.61, -51, 27, 2.9, 4.82 }, - { 7, 58, 21.41, -51, 26, 55.0, 6.44 }, - { 14, 57, 1.39, -51, 26, 48.8, 6.64 }, - { 13, 46, 39.31, -51, 25, 58.1, 4.65 }, - { 7, 0, 51.50, -51, 24, 9.0, 5.14 }, - { 12, 11, 31.39, -51, 21, 33.8, 6.23 }, - { 9, 56, 21.89, -51, 20, 10.0, 6.37 }, - { 22, 48, 33.31, -51, 19, .8, 3.49 }, - { 13, 18, 34.61, -51, 17, 10.0, 6.19 }, - { 6, 46, 52.80, -51, 15, 56.9, 5.40 }, - { 21, 0, 21.50, -51, 15, 55.1, 5.76 }, - { 9, 34, 8.81, -51, 15, 19.1, 5.01 }, - { 10, 13, 22.80, -51, 13, 59.9, 5.28 }, - { 9, 43, 27.50, -51, 13, 41.9, 6.15 }, - { 6, 0, 49.20, -51, 12, 59.0, 5.67 }, - { 11, 6, 5.81, -51, 12, 45.0, 6.30 }, - { 9, 7, 14.69, -51, 12, 42.8, 6.73 }, - { 10, 16, 40.20, -51, 12, 18.0, 6.30 }, - { 12, 57, 4.39, -51, 11, 55.0, 5.16 }, - { 13, 29, 25.20, -51, 9, 55.1, 5.06 }, - { 9, 53, 50.21, -51, 8, 48.8, 5.93 }, - { 17, 1, 46.10, -51, 7, 50.9, 6.45 }, - { 2, 33, 54.60, -51, 5, 37.0, 6.24 }, - { 2, 22, 54.60, -51, 5, 31.9, 5.92 }, - { 18, 17, .91, -51, 4, 5.9, 6.06 }, - { 5, 47, 17.11, -51, 3, 59.0, 3.85 }, - { 9, 18, 5.81, -51, 3, 4.0, 5.26 }, - { 19, 3, 57.41, -51, 1, 7.0, 5.93 }, - { 7, 26, 21.89, -51, 1, 5.9, 5.10 }, - { 13, 44, 15.91, -51, 0, 47.2, 6.47 }, - { 0, 50, 41.21, -50, 59, 12.8, 5.22 }, - { 8, 35, 52.10, -50, 58, 12.0, 5.80 }, - { 11, 6, 27.41, -50, 57, 24.1, 6.32 }, - { 23, 1, 7.49, -50, 57, .0, 5.68 }, - { 2, 54, 6.50, -50, 52, 17.0, 6.21 }, - { 2, 10, 25.61, -50, 49, 27.8, 6.12 }, - { 1, 46, 5.81, -50, 48, 59.0, 5.49 }, - { 2, 42, 33.50, -50, 48, 1.1, 5.41 }, - { 13, 42, 54.60, -50, 47, 26.2, 6.41 }, - { 14, 23, 20.30, -50, 46, 19.9, 6.02 }, - { 10, 57, 7.90, -50, 45, 54.0, 5.91 }, - { 12, 8, 4.80, -50, 45, 47.9, 6.37 }, - { 20, 54, 34.99, -50, 43, 40.1, 6.24 }, - { 12, 8, 21.50, -50, 43, 21.0, 2.60 }, - { 13, 13, 23.50, -50, 42, .0, 5.89 }, - { 23, 7, 14.69, -50, 41, 11.0, 5.83 }, - { 16, 56, 8.90, -50, 40, 30.0, 6.33 }, - { 12, 8, 5.21, -50, 39, 41.0, 4.47 }, - { 16, 58, 18.00, -50, 38, 28.0, 5.55 }, - { 17, 26, .00, -50, 38, 1.0, 5.23 }, - { 17, 27, 12.41, -50, 37, 49.1, 5.92 }, - { 15, 52, 51.50, -50, 36, 55.1, 6.60 }, - { 6, 49, 56.21, -50, 36, 52.9, 2.93 }, - { 6, 54, 2.30, -50, 36, 42.1, 6.26 }, - { 5, 19, 22.10, -50, 36, 22.0, 5.45 }, - { 8, 4, 42.41, -50, 35, 26.2, 5.95 }, - { 0, 28, 43.10, -50, 31, 58.1, 6.26 }, - { 17, 42, 3.89, -50, 30, 38.2, 6.24 }, - { 7, 50, 23.90, -50, 30, 34.9, 5.91 }, - { 19, 12, 46.10, -50, 29, 11.0, 6.13 }, - { 4, 42, 46.39, -50, 28, 53.0, 5.31 }, - { 14, 32, 36.89, -50, 27, 24.8, 4.42 }, - { 8, 15, 23.30, -50, 26, 57.8, 6.44 }, - { 3, 32, 34.80, -50, 22, 43.0, 5.68 }, - { 13, 59, 17.30, -50, 22, 12.0, 5.91 }, - { 5, 54, 10.70, -50, 21, 42.8, 6.52 }, - { 7, 5, 16.49, -50, 21, 37.1, 6.46 }, - { 6, 18, 46.80, -50, 21, 33.1, 7.04 }, - { 0, 1, 19.99, -50, 20, 13.9, 5.53 }, - { 13, 47, 38.40, -50, 19, 16.0, 5.45 }, - { 23, 20, 49.99, -50, 18, 24.1, 6.05 }, - { 13, 47, 27.60, -50, 14, 57.8, 5.91 }, - { 9, 54, 51.29, -50, 14, 38.0, 5.72 }, - { 6, 29, 49.10, -50, 14, 21.1, 5.27 }, - { 12, 28, 2.40, -50, 13, 50.2, 3.91 }, - { 23, 47, 16.01, -50, 13, 36.1, 5.18 }, - { 1, 50, 54.50, -50, 12, 22.0, 5.94 }, - { 8, 13, 34.10, -50, 11, 46.0, 5.51 }, - { 23, 27, 9.10, -50, 9, 25.9, 6.20 }, - { 16, 19, 50.40, -50, 9, 20.2, 4.02 }, - { 18, 46, 59.09, -50, 5, 39.8, 6.54 }, - { 18, 6, 37.90, -50, 5, 30.1, 3.66 }, - { 16, 17, .91, -50, 4, 5.9, 4.99 }, - { 17, 19, 30.31, -50, 3, 47.9, 6.27 }, - { 17, 37, 27.19, -50, 3, 36.0, 5.93 }, - { 16, 50, 35.90, -50, 2, 44.2, 6.47 }, - { 1, 41, 41.09, -50, 2, 20.0, 6.64 }, - { 20, 21, 40.99, -49, 59, 57.8, 6.27 }, - { 7, 43, 6.89, -49, 59, 34.1, 6.57 }, - { 7, 59, 12.29, -49, 58, 36.1, 6.32 }, - { 7, 59, 13.39, -49, 58, 25.0, 6.34 }, - { 13, 39, 59.69, -49, 57, 1.1, 6.00 }, - { 8, 34, 43.61, -49, 56, 39.1, 5.01 }, - { 21, 21, 16.39, -49, 56, 16.1, 6.38 }, - { 12, 33, 59.21, -49, 54, 33.8, 6.38 }, - { 13, 6, 54.60, -49, 54, 22.0, 4.27 }, - { 2, 53, 52.90, -49, 53, 25.1, 4.00 }, - { 18, 54, 32.30, -49, 52, 43.0, 6.60 }, - { 17, 31, 50.50, -49, 52, 34.0, 2.95 }, - { 13, 23, 52.30, -49, 49, 23.2, 6.48 }, - { 8, 43, 40.30, -49, 49, 22.1, 5.16 }, - { 11, 12, 56.90, -49, 44, 11.0, 6.11 }, - { 1, 32, 36.31, -49, 43, 40.1, 6.28 }, - { 22, 46, 28.30, -49, 41, 8.9, 6.48 }, - { 16, 41, 40.20, -49, 39, 6.1, 5.65 }, - { 5, 54, 41.09, -49, 37, 36.8, 6.10 }, - { 23, 13, 15.00, -49, 37, 8.0, 6.80 }, - { 7, 53, 3.70, -49, 36, 47.2, 4.63 }, - { 23, 7, 9.50, -49, 36, 24.1, 6.33 }, - { 7, 3, 53.69, -49, 35, 2.0, 4.93 }, - { 5, 4, 58.01, -49, 34, 40.1, 5.03 }, - { 16, 22, 28.01, -49, 34, 19.9, 5.33 }, - { 6, 9, 23.30, -49, 33, 46.1, 6.49 }, - { 13, 3, 33.19, -49, 31, 37.9, 4.85 }, - { 14, 30, 20.90, -49, 31, 9.1, 5.37 }, - { 21, 45, 19.01, -49, 29, 55.0, 6.45 }, - { 15, 42, 37.20, -49, 29, 21.8, 6.04 }, - { 14, 37, 53.21, -49, 25, 32.9, 4.05 }, - { 9, 9, 45.10, -49, 25, 28.9, 6.48 }, - { 10, 46, 46.20, -49, 25, 12.0, 2.69 }, - { 17, 40, 23.59, -49, 24, 56.2, 4.77 }, - { 10, 28, 1.90, -49, 24, 20.2, 6.10 }, - { 11, 5, 4.20, -49, 23, 33.0, 6.13 }, - { 13, 27, 20.81, -49, 22, 50.9, 6.28 }, - { 9, 36, 49.61, -49, 21, 19.1, 4.35 }, - { 20, 0, 25.30, -49, 21, 4.0, 6.17 }, - { 7, 58, 14.40, -49, 14, 42.0, 4.41 }, - { 16, 3, 12.91, -49, 13, 46.9, 4.65 }, - { 5, 2, 48.60, -49, 9, 5.0, 5.38 }, - { 13, 27, 6.29, -49, 8, 38.0, 6.31 }, - { 11, 34, 56.81, -49, 8, 12.1, 5.50 }, - { 11, 12, 33.10, -49, 6, 4.0, 5.36 }, - { 15, 7, 25.90, -49, 5, 17.9, 5.77 }, - { 0, 6, 19.01, -49, 4, 30.0, 5.70 }, - { 1, 31, 15.10, -49, 4, 22.1, 3.95 }, - { 18, 28, 49.90, -49, 4, 14.9, 4.13 }, - { 11, 45, 12.60, -49, 4, 10.9, 6.26 }, - { 14, 39, 24.70, -49, 3, 20.2, 6.39 }, - { 9, 33, 44.50, -49, 0, 18.0, 5.12 }, - { 8, 0, 14.90, -48, 58, 53.0, 6.02 }, - { 22, 46, 7.99, -48, 58, 44.0, 6.62 }, - { 12, 41, 31.01, -48, 57, 34.9, 2.17 }, - { 13, 14, 43.10, -48, 57, 24.1, 5.89 }, - { 12, 53, 6.89, -48, 56, 35.9, 4.33 }, - { 7, 10, 47.50, -48, 55, 55.9, 5.14 }, - { 8, 41, 5.30, -48, 55, 21.0, 5.90 }, - { 12, 26, 48.19, -48, 54, 47.9, 6.26 }, - { 15, 49, 57.50, -48, 54, 42.8, 5.84 }, - { 17, 11, 38.90, -48, 52, 27.1, 5.84 }, - { 8, 0, 28.90, -48, 52, 17.0, 6.12 }, - { 14, 58, 8.81, -48, 51, 47.2, 6.35 }, - { 7, 36, 43.90, -48, 49, 49.1, 5.72 }, - { 12, 42, 35.40, -48, 48, 47.2, 4.66 }, - { 0, 1, 4.51, -48, 48, 36.0, 5.71 }, - { 0, 31, 25.01, -48, 48, 13.0, 4.77 }, - { 16, 41, 20.30, -48, 45, 47.2, 5.65 }, - { 9, 36, 25.30, -48, 45, 5.0, 6.17 }, - { 15, 11, 57.60, -48, 44, 37.0, 5.69 }, - { 6, 20, 6.10, -48, 44, 28.0, 6.60 }, - { 15, 11, 56.09, -48, 44, 16.1, 3.87 }, - { 3, 10, 27.41, -48, 44, 3.1, 6.12 }, - { 6, 56, 16.01, -48, 43, 16.0, 4.95 }, - { 12, 8, 14.69, -48, 41, 34.1, 5.34 }, - { 8, 9, 9.60, -48, 41, 3.8, 5.70 }, - { 17, 0, 27.10, -48, 38, 52.1, 6.00 }, - { 7, 38, 18.19, -48, 36, 4.0, 5.68 }, - { 22, 53, 37.90, -48, 35, 53.2, 6.04 }, - { 8, 57, 55.80, -48, 34, 23.9, 5.87 }, - { 13, 23, 2.59, -48, 33, 46.1, 6.38 }, - { 12, 37, 42.19, -48, 32, 28.0, 3.86 }, - { 8, 22, 31.61, -48, 29, 25.1, 4.82 }, - { 13, 6, 16.70, -48, 27, 49.0, 4.71 }, - { 8, 11, 11.09, -48, 27, 42.8, 5.82 }, - { 12, 50, 19.61, -48, 27, 34.9, 6.24 }, - { 6, 4, 46.90, -48, 27, 31.0, 6.58 }, - { 9, 57, 42.50, -48, 24, 51.8, 6.05 }, - { 18, 53, 2.50, -48, 21, 36.0, 6.19 }, - { 8, 52, 38.59, -48, 21, 33.1, 5.91 }, - { 14, 22, 38.71, -48, 19, 13.1, 6.09 }, - { 15, 21, 48.19, -48, 19, 4.1, 5.65 }, - { 19, 6, 55.61, -48, 17, 57.1, 5.97 }, - { 6, 51, 32.81, -48, 17, 33.0, 6.42 }, - { 13, 34, 28.90, -48, 16, 19.9, 6.33 }, - { 7, 14, 38.21, -48, 16, 18.1, 4.76 }, - { 10, 37, 18.10, -48, 13, 32.9, 3.84 }, - { 6, 38, 37.61, -48, 13, 13.1, 4.93 }, - { 15, 12, 31.30, -48, 13, 7.0, 6.33 }, - { 0, 30, 26.09, -48, 12, 54.0, 5.69 }, - { 6, 25, 43.61, -48, 10, 37.9, 5.76 }, - { 15, 57, 3.79, -48, 9, 43.9, 6.31 }, - { 18, 26, 53.90, -48, 7, .8, 5.46 }, - { 22, 9, 58.01, -48, 6, 25.9, 6.43 }, - { 7, 53, 18.19, -48, 6, 11.2, 4.24 }, - { 19, 35, 13.01, -48, 5, 57.1, 4.90 }, - { 8, 42, 16.01, -48, 5, 57.1, 5.51 }, - { 18, 41, 30.60, -48, 5, 42.0, 6.49 }, - { 12, 52, 5.30, -48, 5, 39.1, 6.33 }, - { 15, 15, 53.81, -48, 4, 27.1, 5.95 }, - { 3, 44, 50.59, -48, 3, 41.0, 6.49 }, - { 0, 35, 41.11, -48, 0, 2.9, 5.51 }, - { 22, 56, 47.81, -47, 58, 9.1, 5.70 }, - { 13, 22, 52.70, -47, 56, 35.2, 6.16 }, - { 8, 9, 43.20, -47, 56, 15.0, 5.23 }, - { 8, 29, 4.70, -47, 55, 45.1, 5.33 }, - { 15, 22, 8.30, -47, 55, 40.1, 5.00 }, - { 18, 39, 14.30, -47, 54, 34.9, 5.86 }, - { 7, 57, 19.99, -47, 53, 25.1, 6.22 }, - { 14, 56, 31.99, -47, 52, 45.1, 5.64 }, - { 15, 18, 31.99, -47, 52, 30.0, 4.27 }, - { 8, 31, 10.80, -47, 52, .1, 6.39 }, - { 1, 50, 20.21, -47, 48, 59.0, 6.14 }, - { 3, 21, 33.29, -47, 46, 36.8, 6.39 }, - { 3, 17, 26.59, -47, 45, 6.1, 5.85 }, - { 11, 37, 33.91, -47, 44, 49.9, 5.44 }, - { 15, 40, 58.30, -47, 44, 8.2, 6.23 }, - { 20, 18, 55.99, -47, 42, 38.9, 6.31 }, - { 2, 26, 59.11, -47, 42, 14.0, 4.25 }, - { 10, 20, 16.70, -47, 41, 57.1, 5.65 }, - { 11, 4, 31.20, -47, 40, 45.1, 5.67 }, - { 6, 40, 49.30, -47, 40, 28.9, 6.65 }, - { 11, 35, 55.61, -47, 38, 30.1, 5.25 }, - { 20, 19, 17.90, -47, 34, 49.1, 6.13 }, - { 19, 50, 13.80, -47, 33, 25.9, 5.94 }, - { 16, 27, 11.09, -47, 33, 18.0, 4.47 }, - { 0, 45, 45.60, -47, 33, 6.1, 5.80 }, - { 8, 53, 50.69, -47, 31, 14.9, 5.33 }, - { 18, 11, 4.49, -47, 30, 47.2, 6.07 }, - { 17, 23, 16.10, -47, 28, 5.9, 5.25 }, - { 14, 46, 29.09, -47, 26, 28.0, 5.74 }, - { 14, 41, 55.80, -47, 23, 17.9, 2.30 }, - { 1, 57, 10.01, -47, 23, 6.0, 4.83 }, - { 3, 30, 37.01, -47, 22, 31.1, 5.99 }, - { 11, 35, 13.20, -47, 22, 21.0, 5.71 }, - { 16, 15, 15.31, -47, 22, 19.9, 5.14 }, - { 10, 6, 11.30, -47, 22, 12.0, 5.08 }, - { 3, 45, 15.79, -47, 21, 34.9, 5.73 }, - { 8, 9, 29.30, -47, 20, 44.9, 4.27 }, - { 9, 13, 34.51, -47, 20, 19.0, 5.92 }, - { 8, 9, 31.99, -47, 20, 12.1, 1.78 }, - { 8, 41, 13.10, -47, 19, .8, 4.77 }, - { 5, 36, 2.71, -47, 18, 50.0, 6.11 }, - { 21, 48, 15.79, -47, 18, 13.0, 5.58 }, - { 20, 37, 34.01, -47, 17, 29.0, 3.11 }, - { 13, 55, 32.40, -47, 17, 17.9, 2.55 }, - { 8, 58, 52.30, -47, 14, 4.9, 5.18 }, - { 18, 29, 55.80, -47, 13, 13.1, 5.70 }, - { 22, 42, 36.89, -47, 12, 38.2, 5.98 }, - { 17, 3, 41.71, -47, 9, 36.0, 6.06 }, - { 13, 53, 56.90, -47, 7, 41.2, 6.10 }, - { 9, 4, 9.31, -47, 5, 52.1, 3.75 }, - { 7, 48, 20.30, -47, 4, 40.1, 4.71 }, - { 5, 30, 9.50, -47, 4, 40.1, 5.46 }, - { 11, 56, 43.90, -47, 4, 21.0, 6.26 }, - { 15, 51, 31.51, -47, 3, 38.2, 6.01 }, - { 15, 5, 7.20, -47, 3, 4.0, 4.82 }, - { 15, 5, 7.20, -47, 3, 4.0, 4.72 }, - { 10, 32, 56.90, -47, 0, 11.9, 5.02 }, - { 8, 13, 36.19, -46, 59, 30.8, 5.13 }, - { 8, 5, 20.40, -46, 58, 44.0, 6.19 }, - { 3, 2, 55.90, -46, 58, 30.0, 5.82 }, - { 8, 33, 30.41, -46, 58, 16.0, 6.24 }, - { 22, 8, 13.99, -46, 57, 40.0, 1.74 }, - { 4, 27, 6.00, -46, 56, 51.0, 6.10 }, - { 22, 46, 43.70, -46, 56, 21.8, 6.56 }, - { 9, 50, 42.00, -46, 56, 3.8, 5.73 }, - { 17, 41, 16.30, -46, 55, 18.8, 5.79 }, - { 13, 51, 47.21, -46, 53, 57.1, 5.77 }, - { 3, 53, 33.29, -46, 53, 37.0, 5.93 }, - { 22, 42, 40.10, -46, 53, 4.9, 2.10 }, - { 13, 20, 57.70, -46, 52, 50.2, 5.77 }, - { 7, 49, 12.89, -46, 51, 28.1, 5.84 }, - { 7, 14, 45.91, -46, 50, 58.9, 5.72 }, - { 7, 16, 15.50, -46, 46, 27.8, 5.66 }, - { 7, 12, 33.60, -46, 45, 33.8, 4.49 }, - { 1, 29, 30.41, -46, 45, 23.0, 6.31 }, - { 15, 29, 24.31, -46, 43, 58.1, 5.24 }, - { 1, 6, 4.99, -46, 43, 7.0, 3.31 }, - { 0, 48, 56.69, -46, 41, 52.1, 6.27 }, - { 8, 40, 37.61, -46, 38, 56.0, 3.84 }, - { 8, 12, .00, -46, 38, 39.1, 5.76 }, - { 23, 39, 28.01, -46, 38, 16.1, 6.09 }, - { 10, 3, 20.50, -46, 38, 10.0, 6.12 }, - { 17, 19, 3.19, -46, 38, 2.0, 5.48 }, - { 21, 24, 20.81, -46, 36, 54.0, 6.31 }, - { 6, 49, 54.60, -46, 36, 52.9, 5.14 }, - { 7, 47, 31.49, -46, 36, 31.0, 5.23 }, - { 5, 46, 27.41, -46, 35, 49.9, 5.31 }, - { 18, 52, 27.10, -46, 35, 43.1, 5.54 }, - { 13, 56, 19.51, -46, 35, 33.0, 5.83 }, - { 18, 52, 59.59, -46, 35, 8.9, 6.19 }, - { 14, 39, 10.99, -46, 35, 3.1, 6.07 }, - { 9, 11, 33.19, -46, 35, 2.0, 5.79 }, - { 9, 51, 40.80, -46, 32, 52.1, 4.58 }, - { 22, 45, 40.70, -46, 32, 51.0, 5.51 }, - { 8, 50, 33.50, -46, 31, 45.1, 5.10 }, - { 2, 42, 8.50, -46, 31, 27.8, 6.10 }, - { 4, 29, 19.99, -46, 30, 55.1, 6.16 }, - { 17, 35, 39.60, -46, 30, 20.2, 4.59 }, - { 13, 37, 23.71, -46, 25, 41.9, 5.90 }, - { 1, 2, 49.20, -46, 23, 51.0, 5.36 }, - { 7, 49, 14.30, -46, 22, 23.9, 4.11 }, - { 8, 29, 45.60, -46, 19, 54.8, 5.99 }, - { 1, 53, 38.81, -46, 18, 9.0, 4.41 }, - { 2, 45, 16.49, -46, 17, 13.9, 6.85 }, - { 8, 12, 30.91, -46, 15, 51.1, 6.03 }, - { 14, 36, 19.01, -46, 14, 43.1, 5.55 }, - { 16, 29, 42.31, -46, 14, 35.9, 5.35 }, - { 20, 49, 28.99, -46, 13, 36.8, 4.89 }, - { 9, 51, 19.80, -46, 11, 38.0, 5.62 }, - { 8, 47, 18.91, -46, 9, 20.2, 5.75 }, - { 12, 41, 22.99, -46, 8, 44.2, 5.84 }, - { 14, 27, 12.19, -46, 8, 3.8, 5.83 }, - { 14, 37, 20.11, -46, 8, 2.0, 5.41 }, - { 0, 41, 19.61, -46, 5, 6.0, 4.59 }, - { 16, 43, 3.41, -46, 4, 14.2, 6.23 }, - { 14, 19, 24.19, -46, 3, 28.1, 3.55 }, - { 9, 22, 24.00, -46, 2, 51.0, 5.75 }, - { 8, 46, 1.70, -46, 2, 30.1, 3.91 }, - { 17, 31, 49.10, -46, 2, 11.0, 6.03 }, - { 18, 26, 58.39, -45, 58, 5.9, 3.51 }, - { 18, 11, 13.80, -45, 57, 15.8, 4.53 }, - { 22, 22, 43.90, -45, 56, 52.1, 6.62 }, - { 22, 23, 7.99, -45, 55, 43.0, 5.62 }, - { 5, 31, 36.10, -45, 55, 31.1, 5.86 }, - { 18, 31, 45.41, -45, 54, 54.0, 4.96 }, - { 8, 46, 30.60, -45, 54, 46.1, 5.46 }, - { 11, 16, 27.70, -45, 52, 48.0, 6.31 }, - { 4, 8, 33.91, -45, 51, 52.9, 6.59 }, - { 17, 26, 51.50, -45, 50, 37.0, 5.29 }, - { 8, 14, 23.90, -45, 50, 3.8, 5.83 }, - { 5, 43, 41.09, -45, 49, 59.2, 6.39 }, - { 18, 49, 27.41, -45, 48, 37.1, 5.81 }, - { 6, 58, 41.81, -45, 46, 5.2, 6.22 }, - { 18, 8, 30.10, -45, 46, 1.9, 6.15 }, - { 18, 32, 1.99, -45, 45, 25.9, 5.07 }, - { 0, 9, 24.70, -45, 44, 51.0, 3.88 }, - { 9, 49, 57.10, -45, 43, 58.1, 5.08 }, - { 12, 14, 2.59, -45, 43, 26.0, 5.31 }, - { 11, 45, 43.90, -45, 41, 24.0, 5.29 }, - { 14, 1, 43.39, -45, 36, 13.0, 4.34 }, - { 17, 51, 44.50, -45, 36, 2.2, 6.11 }, - { 7, 57, 51.79, -45, 34, 40.1, 5.17 }, - { 1, 31, 39.10, -45, 34, 32.2, 6.17 }, - { 9, 15, 14.59, -45, 33, 20.2, 6.25 }, - { 1, 15, 11.09, -45, 31, 53.0, 4.96 }, - { 17, 5, 5.30, -45, 30, 6.1, 6.28 }, - { 23, 37, 51.00, -45, 29, 33.0, 4.74 }, - { 19, 16, 21.70, -45, 27, 59.0, 5.40 }, - { 8, 0, 19.61, -45, 27, 24.8, 6.61 }, - { 17, 0, 32.30, -45, 27, 6.1, 6.65 }, - { 6, 49, 57.79, -45, 27, .0, 6.55 }, - { 12, 11, 2.90, -45, 25, 22.1, 6.61 }, - { 8, 41, 56.90, -45, 24, 38.9, 5.23 }, - { 15, 50, 16.30, -45, 24, 6.1, 6.12 }, - { 14, 26, 10.80, -45, 22, 45.8, 4.35 }, - { 16, 24, 54.19, -45, 20, 57.1, 6.33 }, - { 14, 30, 8.59, -45, 19, 18.1, 5.50 }, - { 8, 49, 47.69, -45, 18, 29.2, 4.93 }, - { 9, 54, 17.59, -45, 17, 2.0, 5.71 }, - { 6, 10, 39.91, -45, 16, 54.8, 6.31 }, - { 15, 8, 50.59, -45, 16, 46.9, 4.05 }, - { 15, 11, 31.90, -45, 16, 45.8, 7.39 }, - { 19, 39, 42.00, -45, 16, 41.2, 6.25 }, - { 15, 11, 34.90, -45, 16, 39.0, 6.44 }, - { 19, 33, 21.60, -45, 16, 18.8, 5.61 }, - { 8, 6, 40.39, -45, 15, 59.0, 5.05 }, - { 23, 10, 21.60, -45, 14, 48.1, 3.90 }, - { 16, 35, 7.90, -45, 14, 40.9, 6.46 }, - { 14, 26, 8.21, -45, 13, 17.0, 4.56 }, - { 7, 59, 1.80, -45, 12, 58.0, 5.99 }, - { 19, 14, 39.70, -45, 11, 35.9, 5.92 }, - { 8, 40, 35.30, -45, 11, 29.0, 5.71 }, - { 14, 20, 42.50, -45, 11, 13.9, 4.77 }, - { 7, 13, 13.39, -45, 10, 59.2, 4.89 }, - { 11, 51, 8.71, -45, 10, 25.0, 4.46 }, - { 7, 42, 57.19, -45, 10, 23.9, 5.06 }, - { 16, 6, 29.40, -45, 10, 23.9, 4.72 }, - { 20, 0, 48.31, -45, 6, 47.2, 5.81 }, - { 6, 7, 1.90, -45, 5, 29.0, 6.51 }, - { 23, 44, 1.39, -45, 4, 59.9, 6.09 }, - { 6, 4, 40.20, -45, 4, 44.0, 5.93 }, - { 10, 31, 56.59, -45, 4, 9.8, 6.09 }, - { 10, 31, 57.50, -45, 4, .1, 5.74 }, - { 8, 55, 19.30, -45, 2, 30.1, 6.26 }, - { 6, 4, 28.39, -45, 2, 12.1, 6.35 }, - { 21, 20, 9.50, -45, 1, 19.9, 6.00 }, - { 14, 15, 38.81, -45, 0, 2.9, 6.31 }, - { 15, 35, 53.21, -44, 57, 31.0, 4.54 }, - { 4, 30, 50.09, -44, 57, 14.0, 5.07 }, - { 9, 16, 4.20, -44, 53, 55.0, 6.04 }, - { 5, 49, 34.10, -44, 52, 31.1, 6.38 }, - { 9, 11, 4.39, -44, 52, 5.2, 5.00 }, - { 21, 33, 23.50, -44, 50, 55.0, 5.57 }, - { 23, 31, 27.00, -44, 50, 37.0, 6.02 }, - { 13, 58, 40.80, -44, 48, 13.0, 3.87 }, - { 19, 23, 13.20, -44, 47, 58.9, 4.29 }, - { 0, 39, 52.01, -44, 47, 48.1, 6.01 }, - { 9, 46, 30.41, -44, 45, 18.0, 5.55 }, - { 7, 49, 28.20, -44, 45, 6.8, 6.32 }, - { 8, 30, 39.19, -44, 44, 13.9, 6.30 }, - { 8, 29, 27.60, -44, 43, 30.0, 4.99 }, - { 2, 1, 42.41, -44, 42, 49.0, 5.14 }, - { 15, 22, 40.90, -44, 41, 21.8, 3.37 }, - { 12, 34, 42.31, -44, 40, 23.9, 5.77 }, - { 15, 41, 11.30, -44, 39, 40.0, 4.64 }, - { 11, 22, 23.11, -44, 38, 44.9, 6.12 }, - { 7, 13, 32.40, -44, 38, 22.9, 5.10 }, - { 7, 41, 21.79, -44, 37, 55.9, 6.41 }, - { 10, 32, 33.60, -44, 37, 8.0, 5.91 }, - { 7, 50, 42.41, -44, 34, 46.9, 6.45 }, - { 17, 10, 42.29, -44, 33, 27.0, 5.08 }, - { 1, 24, 41.90, -44, 31, 41.9, 6.26 }, - { 20, 33, 55.10, -44, 30, 58.0, 5.11 }, - { 15, 12, 49.51, -44, 30, 2.2, 4.82 }, - { 23, 29, .79, -44, 29, 52.1, 6.43 }, - { 23, 16, 39.70, -44, 29, 21.1, 5.92 }, - { 19, 22, 38.30, -44, 27, 32.0, 4.01 }, - { 22, 15, 35.09, -44, 27, 6.8, 6.10 }, - { 3, 12, 25.80, -44, 25, 10.9, 5.93 }, - { 15, 36, 12.10, -44, 23, 48.8, 5.43 }, - { 11, 13, 14.69, -44, 22, 19.9, 5.80 }, - { 4, 12, 31.61, -44, 22, 5.9, 6.71 }, - { 6, 8, 34.61, -44, 21, 22.0, 6.27 }, - { 17, 56, 47.40, -44, 20, 31.9, 4.86 }, - { 12, 8, 53.81, -44, 19, 34.0, 5.75 }, - { 0, 0, 19.20, -44, 17, 26.2, 6.29 }, - { 4, 19, 16.61, -44, 16, 5.2, 5.34 }, - { 9, 16, 23.11, -44, 15, 56.9, 5.12 }, - { 22, 42, 43.10, -44, 14, 52.1, 6.07 }, - { 5, 24, 55.61, -44, 13, 32.9, 6.08 }, - { 17, 19, 24.50, -44, 13, 23.2, 6.65 }, - { 18, 15, 52.70, -44, 12, 24.1, 5.46 }, - { 17, 24, 13.01, -44, 9, 45.0, 5.12 }, - { 4, 25, 19.10, -44, 9, 38.9, 6.39 }, - { 8, 29, 7.61, -44, 9, 38.2, 5.79 }, - { 12, 54, 58.49, -44, 9, 6.8, 5.89 }, - { 9, 14, 8.21, -44, 8, 44.9, 5.85 }, - { 13, 37, 6.00, -44, 8, 35.9, 5.98 }, - { 17, 18, 48.00, -44, 7, 46.9, 5.76 }, - { 8, 9, 35.90, -44, 7, 22.1, 5.21 }, - { 18, 24, 18.19, -44, 6, 37.1, 5.25 }, - { 7, 57, 18.41, -44, 6, 34.9, 5.09 }, - { 17, 5, 48.60, -44, 6, 18.0, 6.19 }, - { 16, 34, 4.99, -44, 2, 43.1, 4.94 }, - { 5, 58, 37.61, -44, 2, 3.8, 5.81 }, - { 20, 48, 29.21, -43, 59, 19.0, 5.11 }, - { 7, 18, 4.20, -43, 59, 12.1, 5.85 }, - { 4, 48, 33.79, -43, 58, 48.0, 6.72 }, - { 13, 17, 13.90, -43, 58, 45.8, 5.84 }, - { 6, 52, 47.11, -43, 58, 32.9, 6.46 }, - { 16, 22, 28.90, -43, 54, 43.9, 5.88 }, - { 18, 29, 12.89, -43, 50, 44.9, 6.36 }, - { 7, 55, 46.49, -43, 50, 42.0, 6.02 }, - { 2, 10, 4.90, -43, 48, 56.2, 6.32 }, - { 10, 59, 59.40, -43, 48, 25.9, 5.81 }, - { 7, 45, 18.10, -43, 45, 7.9, 6.03 }, - { 22, 29, 45.50, -43, 44, 57.8, 4.11 }, - { 11, 14, 54.00, -43, 44, 3.1, 6.21 }, - { 19, 24, 21.41, -43, 43, 23.2, 6.17 }, - { 0, 51, 52.10, -43, 42, 33.1, 6.90 }, - { 0, 26, 12.19, -43, 40, 48.0, 3.94 }, - { 18, 48, 50.50, -43, 40, 48.0, 5.49 }, - { 10, 35, 10.49, -43, 39, 52.9, 6.08 }, - { 9, 12, 30.60, -43, 36, 49.0, 5.57 }, - { 7, 3, 58.80, -43, 36, 42.1, 6.79 }, - { 7, 3, 57.29, -43, 36, 29.2, 5.54 }, - { 14, 51, 38.40, -43, 34, 32.2, 4.32 }, - { 14, 47, 32.09, -43, 33, 27.0, 6.30 }, - { 23, 6, 52.80, -43, 31, 14.2, 4.28 }, - { 2, 9, 9.29, -43, 31, .1, 5.85 }, - { 18, 31, 56.21, -43, 30, 28.1, 5.72 }, - { 7, 56, 57.89, -43, 30, 1.1, 5.35 }, - { 22, 29, 16.20, -43, 29, 44.2, 3.97 }, - { 15, 16, 10.49, -43, 29, 4.9, 6.04 }, - { 14, 8, 51.89, -43, 28, 16.0, 6.17 }, - { 19, 29, 23.90, -43, 26, 44.9, 5.71 }, - { 18, 49, 34.99, -43, 26, 2.0, 5.61 }, - { 9, 7, 59.81, -43, 25, 57.0, 2.21 }, - { 18, 6, 49.80, -43, 25, 28.9, 5.77 }, - { 18, 6, 49.80, -43, 25, 28.9, 5.77 }, - { 7, 2, 15.60, -43, 24, 15.1, 6.43 }, - { 16, 38, 26.21, -43, 23, 55.0, 5.83 }, - { 0, 50, 3.70, -43, 23, 40.9, 6.48 }, - { 13, 11, 23.21, -43, 22, 8.0, 5.25 }, - { 1, 28, 21.89, -43, 19, 5.9, 3.41 }, - { 7, 29, 13.80, -43, 18, 5.0, 3.25 }, - { 17, 12, 9.19, -43, 14, 21.1, 3.33 }, - { 0, 18, 42.60, -43, 14, 7.1, 6.33 }, - { 9, 14, 24.50, -43, 13, 39.0, 5.25 }, - { 2, 22, 11.81, -43, 12, .0, 6.31 }, - { 6, 37, 45.70, -43, 11, 46.0, 3.17 }, - { 9, 38, 1.51, -43, 11, 28.0, 5.50 }, - { 18, 39, 34.99, -43, 11, 10.0, 5.37 }, - { 9, 0, 22.20, -43, 10, 23.9, 6.07 }, - { 14, 59, 27.10, -43, 9, 36.0, 6.10 }, - { 13, 13, 57.50, -43, 8, 20.0, 6.16 }, - { 14, 58, 31.90, -43, 8, 2.0, 2.68 }, - { 23, 23, 45.41, -43, 7, 27.8, 6.10 }, - { 10, 15, 31.51, -43, 6, 45.0, 5.60 }, - { 11, 41, 19.80, -43, 5, 44.9, 5.55 }, - { 7, 51, 20.50, -43, 5, 44.2, 6.32 }, - { 14, 6, 10.90, -43, 5, 30.8, 6.20 }, - { 7, 33, 13.30, -43, 5, 11.0, 6.52 }, - { 3, 19, 55.70, -43, 4, 10.9, 4.27 }, - { 14, 20, 9.70, -43, 3, 32.0, 5.56 }, - { 16, 53, 42.50, -43, 3, 2.9, 5.96 }, - { 20, 0, 26.50, -43, 2, 35.9, 6.14 }, - { 21, 2, 12.60, -43, 0, 6.8, 6.64 }, - { 17, 37, 19.20, -42, 59, 52.1, 1.87 }, - { 8, 37, 38.71, -42, 59, 21.1, 4.14 }, - { 8, 11, 25.90, -42, 59, 13.9, 4.75 }, - { 8, 3, 29.50, -42, 56, 55.0, 6.29 }, - { 21, 34, 16.99, -42, 55, 30.0, 6.32 }, - { 5, 53, 22.90, -42, 55, 17.0, 6.55 }, - { 4, 7, 25.10, -42, 55, .8, 6.59 }, - { 12, 55, 19.39, -42, 54, 56.9, 5.47 }, - { 16, 15, 24.00, -42, 53, 58.9, 6.14 }, - { 2, 39, 48.00, -42, 53, 30.1, 4.75 }, - { 7, 51, 40.30, -42, 53, 17.9, 6.04 }, - { 17, 38, 8.50, -42, 52, 50.2, 6.10 }, - { 15, 8, 39.10, -42, 52, 4.1, 5.85 }, - { 23, 9, 57.29, -42, 51, 38.2, 5.81 }, - { 16, 36, 22.51, -42, 51, 32.0, 5.47 }, - { 5, 59, 8.81, -42, 48, 55.1, 3.96 }, - { 20, 12, 23.90, -42, 46, 50.2, 6.22 }, - { 8, 24, 57.19, -42, 46, 9.8, 5.98 }, - { 10, 38, 50.30, -42, 45, 13.0, 6.11 }, - { 10, 26, 9.50, -42, 44, 20.0, 6.13 }, - { 17, 44, 42.00, -42, 43, 44.0, 5.87 }, - { 18, 56, 16.90, -42, 42, 38.2, 5.36 }, - { 13, 12, 50.90, -42, 41, 58.9, 6.22 }, - { 0, 44, 57.10, -42, 40, 36.1, 5.94 }, - { 11, 28, 35.11, -42, 40, 27.1, 5.08 }, - { 16, 19, 17.69, -42, 40, 26.0, 5.45 }, - { 11, 24, 22.10, -42, 40, 9.1, 6.12 }, - { 8, 44, 24.00, -42, 38, 57.1, 4.07 }, - { 8, 9, 47.71, -42, 38, 26.2, 6.26 }, - { 11, 7, 16.61, -42, 38, 19.0, 5.15 }, - { 3, 29, 55.01, -42, 38, 3.1, 5.78 }, - { 23, 35, 4.61, -42, 36, 54.0, 4.71 }, - { 15, 38, 3.19, -42, 34, 3.0, 4.33 }, - { 21, 27, 1.61, -42, 32, 52.1, 5.51 }, - { 12, 25, 8.50, -42, 30, 51.8, 6.11 }, - { 8, 51, 27.91, -42, 30, 15.8, 6.55 }, - { 6, 52, 39.70, -42, 30, 15.8, 6.52 }, - { 1, 54, 22.01, -42, 29, 48.8, 5.11 }, - { 16, 54, 26.90, -42, 28, 44.0, 5.88 }, - { 13, 49, 37.01, -42, 28, 26.0, 3.04 }, - { 10, 25, 17.21, -42, 28, 5.2, 6.18 }, - { 8, 48, 8.81, -42, 27, 50.0, 6.43 }, - { 12, 3, 39.60, -42, 26, 3.1, 5.15 }, - { 20, 23, 53.21, -42, 25, 22.1, 5.64 }, - { 7, 56, 57.89, -42, 24, 22.0, 6.09 }, - { 6, 54, 26.71, -42, 21, 56.2, 6.32 }, - { 16, 53, 59.69, -42, 21, 43.9, 4.73 }, - { 16, 54, 34.99, -42, 21, 41.0, 3.62 }, - { 7, 4, 2.81, -42, 20, 13.9, 5.20 }, - { 14, 26, 13.39, -42, 19, 9.1, 6.32 }, - { 18, 33, 30.19, -42, 18, 45.0, 4.64 }, - { 0, 26, 16.99, -42, 18, 22.0, 2.39 }, - { 6, 6, 40.99, -42, 17, 55.0, 6.12 }, - { 4, 14, .10, -42, 17, 39.8, 3.86 }, - { 18, 18, 40.01, -42, 17, 17.9, 6.30 }, - { 9, 13, 18.60, -42, 16, 25.0, 6.29 }, - { 10, 55, 1.01, -42, 15, 4.0, 6.11 }, - { 13, 11, 8.81, -42, 13, 59.2, 5.79 }, - { 11, 0, 9.31, -42, 13, 32.9, 4.39 }, - { 9, 21, 50.90, -42, 11, 42.0, 5.58 }, - { 14, 35, 30.41, -42, 9, 28.1, 2.31 }, - { 6, 7, 52.90, -42, 9, 14.0, 5.50 }, - { 8, 25, 51.89, -42, 9, 11.9, 5.47 }, - { 10, 14, 44.21, -42, 7, 18.8, 3.85 }, - { 14, 59, 9.70, -42, 6, 15.1, 3.13 }, - { 13, 58, 16.30, -42, 6, 2.9, 3.83 }, - { 14, 34, 7.99, -42, 5, 58.9, 6.60 }, - { 19, 3, 6.89, -42, 5, 43.1, 4.75 }, - { 8, 50, 21.00, -42, 5, 24.0, 6.00 }, - { 13, 43, 40.01, -42, 4, 3.0, 5.98 }, - { 20, 22, 27.50, -42, 2, 58.9, 5.59 }, - { 1, 59, 38.81, -42, 1, 50.2, 5.57 }, - { 19, 22, 9.60, -42, 0, 58.0, 6.34 }, - { 17, 52, 52.70, -41, 59, 48.1, 6.20 }, - { 16, 53, 58.80, -41, 59, 40.9, 6.32 }, - { 4, 10, 50.59, -41, 59, 37.0, 4.93 }, - { 4, 28, 9.41, -41, 57, 36.0, 6.44 }, - { 10, 23, 40.39, -41, 57, 11.9, 6.27 }, - { 18, 31, 3.00, -41, 54, 49.0, 6.04 }, - { 12, 15, 30.50, -41, 54, 47.2, 6.26 }, - { 19, 2, 8.71, -41, 54, 36.0, 6.23 }, - { 19, 9, 57.79, -41, 53, 33.0, 5.88 }, - { 19, 55, 15.70, -41, 52, 5.9, 4.13 }, - { 9, 1, 20.81, -41, 51, 51.8, 5.55 }, - { 4, 40, 33.70, -41, 51, 50.0, 4.45 }, - { 16, 52, 19.10, -41, 51, 15.8, 6.49 }, - { 16, 54, 11.81, -41, 51, 1.1, 6.45 }, - { 2, 19, 24.70, -41, 50, 53.9, 6.37 }, - { 14, 14, 42.60, -41, 50, 15.0, 5.61 }, - { 16, 54, 19.61, -41, 49, 12.0, 6.59 }, - { 15, 44, 22.61, -41, 49, 9.8, 5.94 }, - { 16, 31, 41.71, -41, 49, .8, 5.33 }, - { 16, 54, 1.80, -41, 48, 23.0, 5.45 }, - { 1, 47, 16.80, -41, 45, 36.0, 6.18 }, - { 5, 3, 54.00, -41, 44, 42.0, 6.31 }, - { 15, 59, 30.31, -41, 44, 39.8, 4.99 }, - { 8, 47, 40.49, -41, 44, 13.9, 6.36 }, - { 12, 29, 57.91, -41, 44, 10.0, 6.02 }, - { 17, 57, 47.71, -41, 42, 58.0, 4.88 }, - { 10, 10, 37.90, -41, 42, 54.0, 5.98 }, - { 13, 49, 30.31, -41, 41, 16.1, 3.41 }, - { 10, 18, 28.20, -41, 40, 5.9, 5.96 }, - { 10, 22, 19.61, -41, 39, .0, 4.83 }, - { 3, 26, 11.71, -41, 38, 12.8, 6.32 }, - { 22, 16, 26.59, -41, 37, 39.0, 5.10 }, - { 13, 6, 35.11, -41, 35, 19.0, 5.59 }, - { 6, 36, 51.31, -41, 33, 24.8, 6.34 }, - { 14, 35, 31.51, -41, 31, 1.9, 5.87 }, - { 13, 26, 56.09, -41, 29, 53.2, 5.69 }, - { 1, 24, 40.80, -41, 29, 33.0, 5.42 }, - { 15, 16, 4.01, -41, 29, 28.0, 5.16 }, - { 1, 7, 47.90, -41, 29, 12.8, 5.21 }, - { 23, 3, 59.50, -41, 28, 41.9, 5.79 }, - { 7, 14, 57.10, -41, 25, 32.9, 5.94 }, - { 14, 3, 27.50, -41, 25, 23.9, 6.11 }, - { 22, 43, 30.00, -41, 24, 51.8, 4.85 }, - { 13, 42, 55.01, -41, 24, 4.0, 5.98 }, - { 21, 6, 25.51, -41, 23, 10.0, 5.53 }, - { 12, 24, 44.69, -41, 23, 3.1, 6.25 }, - { 22, 14, 38.59, -41, 22, 54.1, 6.23 }, - { 3, 30, 13.61, -41, 22, 12.0, 6.12 }, - { 18, 11, 5.59, -41, 21, 33.1, 5.86 }, - { 22, 15, 36.89, -41, 20, 48.1, 4.79 }, - { 18, 13, 12.60, -41, 20, 10.0, 5.47 }, - { 4, 50, 16.20, -41, 19, 14.9, 6.07 }, - { 8, 2, 44.81, -41, 18, 36.0, 5.52 }, - { 9, 0, 5.40, -41, 15, 14.0, 4.45 }, - { 12, 8, 54.50, -41, 13, 53.0, 5.48 }, - { 16, 51, 33.70, -41, 13, 50.2, 5.22 }, - { 13, 4, 48.10, -41, 11, 48.1, 6.26 }, - { 23, 16, 49.80, -41, 11, 39.8, 6.47 }, - { 14, 6, 2.81, -41, 10, 46.9, 4.36 }, - { 21, 32, 5.90, -41, 10, 45.1, 5.29 }, - { 17, 33, 7.39, -41, 10, 25.0, 5.84 }, - { 15, 35, 8.50, -41, 10, .8, 2.78 }, - { 2, 14, 31.99, -41, 10, .1, 5.91 }, - { 16, 54, 58.39, -41, 9, 4.0, 5.77 }, - { 8, 46, 23.81, -41, 7, 32.2, 6.21 }, - { 16, 11, 17.69, -41, 7, 10.9, 5.86 }, - { 16, 43, 45.50, -41, 7, 8.0, 6.20 }, - { 16, 43, 53.90, -41, 6, 47.2, 6.12 }, - { 23, 14, 58.61, -41, 6, 20.2, 5.77 }, - { 6, 28, 42.29, -41, 4, 27.8, 6.32 }, - { 15, 5, 19.10, -41, 4, 1.9, 5.15 }, - { 4, 43, 44.21, -41, 3, 52.9, 6.25 }, - { 15, 18, 9.41, -41, 3, 38.9, 6.28 }, - { 12, 35, 45.50, -41, 1, 18.8, 5.13 }, - { 21, 24, 24.79, -41, 0, 24.1, 5.77 }, - { 11, 58, 20.30, -40, 56, 49.9, 6.79 }, - { 5, 27, 5.30, -40, 56, 37.0, 5.87 }, - { 0, 30, 27.79, -40, 56, 21.8, 6.19 }, - { 7, 43, 41.90, -40, 56, 2.0, 5.17 }, - { 6, 30, 59.81, -40, 54, 59.0, 6.20 }, - { 7, 7, 7.10, -40, 53, 35.9, 5.79 }, - { 15, 4, 42.91, -40, 51, 41.0, 6.41 }, - { 14, 30, 56.50, -40, 50, 42.0, 6.39 }, - { 2, 24, 33.79, -40, 50, 26.2, 6.18 }, - { 16, 44, 42.60, -40, 50, 22.9, 5.71 }, - { 9, 56, 5.40, -40, 49, 28.9, 6.41 }, - { 23, 18, 9.91, -40, 49, 27.8, 5.53 }, - { 16, 56, 36.00, -40, 49, 25.0, 6.15 }, - { 20, 1, 26.40, -40, 48, 51.1, 6.29 }, - { 21, 20, 45.60, -40, 48, 34.9, 4.82 }, - { 20, 25, 47.90, -40, 47, 47.0, 6.09 }, - { 15, 18, 56.40, -40, 47, 17.9, 5.59 }, - { 17, 51, 32.81, -40, 46, 21.0, 5.96 }, - { 15, 21, 35.30, -40, 44, 58.9, 6.20 }, - { 7, 56, 24.29, -40, 44, 11.0, 6.78 }, - { 5, 38, 43.61, -40, 42, 27.0, 5.82 }, - { 3, 44, 6.19, -40, 39, 37.1, 6.45 }, - { 15, 59, 58.01, -40, 39, 10.1, 6.49 }, - { 5, 47, 58.10, -40, 39, 9.0, 6.61 }, - { 7, 48, 8.50, -40, 39, 7.9, 6.14 }, - { 9, 32, 19.30, -40, 38, 57.8, 5.35 }, - { 15, 21, 22.30, -40, 38, 51.0, 3.22 }, - { 19, 23, 53.21, -40, 36, 58.0, 3.97 }, - { 23, 10, 9.79, -40, 35, 30.1, 5.83 }, - { 22, 36, 58.80, -40, 35, 28.0, 5.86 }, - { 11, 33, 37.30, -40, 35, 12.8, 5.39 }, - { 15, 8, 12.10, -40, 35, 2.0, 5.79 }, - { 22, 36, 29.30, -40, 34, 58.1, 6.28 }, - { 7, 52, 13.01, -40, 34, 32.9, 3.73 }, - { 2, 43, 20.30, -40, 31, 39.0, 6.36 }, - { 21, 15, 14.69, -40, 30, 23.0, 6.21 }, - { 9, 26, 28.49, -40, 30, 6.8, 6.20 }, - { 11, 46, 31.10, -40, 30, 2.2, 4.91 }, - { 7, 12, 15.79, -40, 29, 56.0, 5.31 }, - { 19, 8, 20.90, -40, 29, 48.1, 4.59 }, - { 9, 30, 42.00, -40, 28, .1, 3.60 }, - { 8, 53, 50.69, -40, 26, 51.0, 6.47 }, - { 11, 32, 48.10, -40, 26, 11.0, 5.64 }, - { 16, 0, 53.71, -40, 26, 7.1, 6.21 }, - { 18, 47, 44.59, -40, 24, 22.0, 5.24 }, - { 4, 13, 35.71, -40, 21, 28.1, 6.37 }, - { 3, 54, 23.21, -40, 21, 25.9, 5.71 }, - { 6, 10, 10.30, -40, 21, 13.0, 5.58 }, - { 6, 41, 14.09, -40, 20, 58.9, 6.12 }, - { 8, 14, 2.90, -40, 20, 53.2, 4.44 }, - { 10, 13, 45.91, -40, 20, 44.9, 5.90 }, - { 8, 49, 39.19, -40, 19, 14.2, 5.48 }, - { 10, 13, 56.59, -40, 18, 38.2, 6.35 }, - { 17, 56, 55.80, -40, 18, 20.2, 6.43 }, - { 2, 58, 15.70, -40, 18, 16.9, 3.24 }, - { 2, 58, 16.30, -40, 18, 15.8, 4.35 }, - { 23, 54, 38.59, -40, 18, .0, 6.03 }, - { 6, 24, 44.50, -40, 17, 3.1, 6.31 }, - { 3, 37, 5.71, -40, 16, 28.9, 4.58 }, - { 21, 12, 13.61, -40, 16, 9.8, 5.83 }, - { 8, 40, 19.30, -40, 15, 51.1, 5.20 }, - { 14, 1, 19.01, -40, 13, 19.9, 6.13 }, - { 14, 36, 44.21, -40, 12, 42.1, 5.74 }, - { 15, 47, 25.39, -40, 11, 39.1, 6.42 }, - { 23, 46, 1.20, -40, 10, 57.0, 6.31 }, - { 12, 53, 26.21, -40, 10, 44.0, 4.27 }, - { 12, 43, 26.30, -40, 10, 40.1, 6.44 }, - { 13, 27, 14.69, -40, 9, 47.2, 6.40 }, - { 8, 37, 19.90, -40, 8, 51.0, 6.55 }, - { 17, 47, 35.09, -40, 7, 36.8, 3.03 }, - { 17, 50, 11.21, -40, 5, 26.2, 4.81 }, - { 15, 34, 1.61, -40, 3, 58.0, 5.82 }, - { 7, 46, 33.41, -40, 3, 34.9, 6.57 }, - { 7, 33, 13.51, -40, 3, 32.0, 6.26 }, - { 13, 39, 48.60, -40, 3, 6.8, 5.60 }, - { 19, 34, 8.50, -40, 2, 4.9, 5.89 }, - { 8, 3, 35.09, -40, 0, 11.9, 2.25 }, - { 7, 38, 24.19, -39, 59, 29.0, 6.59 }, - { 12, 39, 52.51, -39, 59, 15.0, 4.64 }, - { 10, 4, 23.40, -39, 58, 32.9, 6.43 }, - { 8, 35, 12.60, -39, 58, 12.0, 6.47 }, - { 5, 54, 52.51, -39, 57, 29.2, 5.57 }, - { 2, 50, 47.90, -39, 55, 54.1, 6.36 }, - { 0, 28, 26.40, -39, 54, 54.0, 5.43 }, - { 14, 58, 36.79, -39, 54, 24.1, 6.15 }, - { 7, 33, 58.51, -39, 54, 20.9, 6.76 }, - { 13, 50, 19.39, -39, 54, 4.0, 6.44 }, - { 18, 33, .91, -39, 53, 31.9, 6.22 }, - { 19, 51, 50.59, -39, 52, 27.8, 5.33 }, - { 14, 26, 49.90, -39, 52, 26.0, 6.35 }, - { 12, 36, 1.20, -39, 52, 12.0, 5.80 }, - { 15, 56, 6.50, -39, 51, 51.1, 6.03 }, - { 2, 40, 40.01, -39, 51, 20.2, 4.11 }, - { 19, 9, 39.70, -39, 49, 41.2, 6.46 }, - { 18, 57, 34.70, -39, 49, 23.9, 6.31 }, - { 20, 53, 40.20, -39, 48, 36.0, 5.35 }, - { 9, 22, 36.70, -39, 46, 28.9, 6.54 }, - { 17, 14, 27.70, -39, 46, .8, 6.60 }, - { 13, 26, 7.80, -39, 45, 19.1, 5.09 }, - { 13, 39, 40.80, -39, 44, 53.2, 6.27 }, - { 5, 1, 34.51, -39, 43, 5.2, 6.03 }, - { 15, 24, 44.90, -39, 42, 37.1, 5.37 }, - { 18, 32, 21.41, -39, 42, 14.0, 5.16 }, - { 11, 55, 54.70, -39, 41, 21.1, 6.13 }, - { 18, 44, 57.19, -39, 41, 11.0, 5.43 }, - { 12, 51, 56.81, -39, 40, 50.9, 5.98 }, - { 5, 23, 24.00, -39, 40, 43.0, 5.71 }, - { 7, 8, 51.10, -39, 39, 20.9, 4.83 }, - { 4, 54, 54.79, -39, 37, 43.0, 6.10 }, - { 8, 21, 24.19, -39, 37, 14.9, 6.16 }, - { 8, 11, 21.50, -39, 37, 7.0, 4.45 }, - { 9, 38, 40.70, -39, 36, 51.1, 6.70 }, - { 14, 36, 24.19, -39, 35, 49.9, 6.13 }, - { 9, 44, 15.79, -39, 34, 16.0, 6.82 }, - { 10, 35, 12.91, -39, 33, 46.1, 5.38 }, - { 20, 42, 52.99, -39, 33, 31.0, 6.29 }, - { 22, 6, 6.89, -39, 32, 35.9, 4.46 }, - { 6, 46, 3.29, -39, 32, 24.0, 6.62 }, - { 18, 59, 11.11, -39, 32, 4.9, 6.49 }, - { 14, 23, 2.21, -39, 30, 43.9, 4.42 }, - { 17, 12, 16.20, -39, 30, 24.8, 5.67 }, - { 19, 39, 55.70, -39, 25, 59.9, 6.61 }, - { 16, 20, 32.59, -39, 25, 50.9, 6.12 }, - { 9, 24, 16.30, -39, 25, 32.9, 6.06 }, - { 21, 13, 3.10, -39, 25, 31.1, 5.26 }, - { 14, 56, 35.81, -39, 24, 58.0, 6.36 }, - { 13, 31, 2.69, -39, 24, 27.0, 3.88 }, - { 5, 43, 30.19, -39, 24, 24.8, 6.25 }, - { 9, 2, 6.41, -39, 24, 9.0, 6.27 }, - { 9, 16, 57.19, -39, 24, 5.0, 5.33 }, - { 16, 46, 47.81, -39, 22, 37.9, 5.48 }, - { 4, 45, 55.39, -39, 21, 24.1, 6.05 }, - { 15, 34, 20.90, -39, 20, 57.8, 6.36 }, - { 19, 10, 1.70, -39, 20, 26.9, 4.11 }, - { 7, 47, 5.81, -39, 19, 53.0, 6.31 }, - { 12, 23, 36.89, -39, 18, 11.2, 6.40 }, - { 7, 59, 28.39, -39, 17, 49.9, 5.24 }, - { 6, 16, 35.59, -39, 15, 51.8, 6.00 }, - { 9, 11, 40.99, -39, 15, 32.0, 6.00 }, - { 7, 18, 33.60, -39, 12, 37.1, 5.25 }, - { 20, 46, 20.09, -39, 11, 57.1, 5.50 }, - { 6, 43, 23.30, -39, 11, 35.9, 6.30 }, - { 16, 24, 1.30, -39, 11, 35.2, 5.40 }, - { 15, 38, 32.69, -39, 9, 38.9, 6.57 }, - { 22, 51, 2.21, -39, 9, 24.8, 5.42 }, - { 8, 49, 52.39, -39, 8, 30.1, 6.39 }, - { 17, 57, 57.79, -39, 8, 12.8, 6.29 }, - { 22, 28, 39.19, -39, 7, 54.8, 5.47 }, - { 9, 33, 7.80, -39, 7, 44.0, 6.43 }, - { 15, 38, 42.31, -39, 7, 41.2, 6.04 }, - { 16, 8, 34.20, -39, 6, 19.1, 7.05 }, - { 16, 8, 34.39, -39, 5, 35.2, 6.65 }, - { 8, 31, 24.60, -39, 3, 51.1, 6.31 }, - { 8, 26, 18.19, -39, 3, 37.1, 7.25 }, - { 8, 26, 17.59, -39, 3, 33.8, 6.53 }, - { 12, 28, 22.51, -39, 2, 29.0, 5.44 }, - { 17, 42, 29.30, -39, 1, 48.0, 2.41 }, - { 19, 11, 1.80, -39, 0, 18.0, 6.36 }, - { 18, 28, 27.10, -38, 59, 44.2, 5.64 }, - { 12, 13, 25.30, -38, 55, 45.1, 5.76 }, - { 1, 1, 18.31, -38, 55, .1, 5.59 }, - { 12, 23, 44.90, -38, 54, 40.0, 5.79 }, - { 23, 6, 53.59, -38, 53, 31.9, 5.61 }, - { 14, 31, 10.80, -38, 52, 10.9, 5.97 }, - { 7, 43, 7.01, -38, 51, 51.1, 6.89 }, - { 7, 52, 38.69, -38, 51, 47.2, 4.49 }, - { 18, 29, 16.80, -38, 51, 4.0, 6.63 }, - { 8, 33, 38.30, -38, 50, 56.0, 5.96 }, - { 17, 12, 16.51, -38, 49, 19.9, 6.30 }, - { 7, 29, 5.71, -38, 48, 43.9, 5.43 }, - { 14, 38, 19.61, -38, 47, 39.1, 6.02 }, - { 15, 10, 7.49, -38, 47, 33.0, 5.98 }, - { 7, 38, 32.59, -38, 46, 52.0, 6.19 }, - { 15, 25, 20.21, -38, 44, 1.0, 4.60 }, - { 18, 33, 23.11, -38, 43, 34.0, 5.65 }, - { 8, 52, 48.00, -38, 43, 27.1, 5.82 }, - { 18, 33, 23.30, -38, 43, 13.1, 6.32 }, - { 18, 22, 18.60, -38, 39, 24.8, 5.10 }, - { 17, 36, 32.81, -38, 38, 7.1, 4.29 }, - { 21, 2, 58.01, -38, 37, 54.1, 5.30 }, - { 6, 33, 10.30, -38, 37, 31.1, 6.44 }, - { 15, 32, 4.39, -38, 37, 23.2, 6.25 }, - { 9, 13, 25.90, -38, 36, 59.0, 6.31 }, - { 16, 3, 24.19, -38, 36, 9.0, 4.89 }, - { 1, 53, 23.21, -38, 35, 40.9, 6.10 }, - { 17, 15, 35.90, -38, 35, 38.0, 5.96 }, - { 9, 15, 36.70, -38, 34, 12.0, 4.94 }, - { 21, 44, 29.50, -38, 33, 9.0, 6.30 }, - { 7, 41, 15.79, -38, 32, 1.0, 5.42 }, - { 21, 2, 27.19, -38, 31, 50.2, 5.94 }, - { 7, 41, 58.01, -38, 31, 44.0, 6.54 }, - { 5, 52, 47.71, -38, 31, 32.9, 6.70 }, - { 17, 29, 25.70, -38, 31, .1, 6.39 }, - { 5, 32, 51.31, -38, 30, 47.2, 5.48 }, - { 7, 47, 25.01, -38, 30, 40.0, 5.08 }, - { 0, 42, 42.91, -38, 27, 47.9, 6.06 }, - { 2, 53, 34.39, -38, 26, 12.8, 5.92 }, - { 0, 44, 12.10, -38, 25, 18.1, 5.90 }, - { 9, 29, 16.30, -38, 24, 14.0, 6.19 }, - { 1, 49, 48.79, -38, 24, 14.0, 6.37 }, - { 13, 32, 5.30, -38, 23, 57.1, 6.16 }, - { 6, 42, 16.39, -38, 23, 55.0, 6.29 }, - { 16, 0, 7.30, -38, 23, 48.8, 3.41 }, - { 21, 59, 17.90, -38, 23, 43.1, 5.50 }, - { 2, 42, 6.60, -38, 23, 2.0, 6.01 }, - { 7, 6, 2.30, -38, 22, 58.1, 6.11 }, - { 8, 33, 19.90, -38, 22, 16.0, 6.49 }, - { 18, 43, 46.90, -38, 19, 25.0, 5.13 }, - { 7, 16, 31.80, -38, 19, 8.0, 5.80 }, - { 7, 39, 27.41, -38, 18, 29.9, 4.84 }, - { 14, 47, 5.11, -38, 17, 26.9, 5.94 }, - { 8, 23, 17.21, -38, 17, 8.9, 6.32 }, - { 7, 39, 47.81, -38, 15, 38.9, 5.76 }, - { 19, 3, 17.71, -38, 15, 11.9, 5.74 }, - { 22, 47, 47.11, -38, 13, 18.8, 6.71 }, - { 15, 21, 30.10, -38, 13, 9.1, 6.48 }, - { 7, 43, 42.89, -38, 12, 6.8, 6.40 }, - { 2, 57, 32.69, -38, 11, 28.0, 6.41 }, - { 15, 25, 6.60, -38, 10, 9.8, 7.03 }, - { 6, 39, 56.90, -38, 9, 32.0, 6.58 }, - { 16, 43, 47.59, -38, 9, 24.1, 6.05 }, - { 17, 3, 50.81, -38, 9, 7.9, 5.91 }, - { 6, 37, 1.90, -38, 8, 48.1, 6.04 }, - { 7, 39, 43.80, -38, 8, 21.8, 5.73 }, - { 1, 41, 27.31, -38, 7, 59.2, 6.17 }, - { 17, 47, 7.30, -38, 6, 42.1, 6.43 }, - { 20, 34, 55.51, -38, 5, 22.9, 6.44 }, - { 17, 37, 26.81, -38, 3, 56.2, 6.26 }, - { 19, 57, 41.30, -38, 3, 29.9, 6.55 }, - { 15, 1, 13.01, -38, 3, 29.9, 5.89 }, - { 16, 51, 52.20, -38, 2, 51.0, 3.08 }, - { 16, 52, 20.11, -38, 1, 3.0, 3.57 }, - { 11, 17, 11.81, -38, 0, 51.8, 6.27 }, - { 7, 37, 45.19, -38, 0, 38.2, 6.38 }, - { 10, 23, 29.30, -38, 0, 36.0, 5.33 }, - { 2, 38, 24.79, -37, 59, 26.2, 6.49 }, - { 7, 45, 15.31, -37, 58, 7.0, 3.61 }, - { 7, 44, 34.20, -37, 56, 35.2, 5.88 }, - { 20, 3, 33.50, -37, 56, 26.9, 4.77 }, - { 7, 46, 10.39, -37, 56, 2.0, 5.88 }, - { 6, 47, 21.41, -37, 55, 46.9, 5.26 }, - { 8, 12, 51.50, -37, 55, 27.8, 6.43 }, - { 15, 47, 28.99, -37, 54, 59.0, 6.01 }, - { 20, 51, .70, -37, 54, 47.9, 5.52 }, - { 19, 9, 28.30, -37, 54, 15.8, 4.11 }, - { 6, 27, 7.49, -37, 53, 44.2, 6.48 }, - { 7, 45, 4.61, -37, 53, 16.1, 6.54 }, - { 14, 20, 33.41, -37, 53, 7.1, 4.05 }, - { 14, 59, 13.90, -37, 52, 53.0, 6.47 }, - { 12, 10, 33.79, -37, 52, 13.1, 6.06 }, - { 16, 4, 36.70, -37, 51, 47.2, 5.90 }, - { 1, 12, 45.41, -37, 51, 23.0, 5.92 }, - { 21, 26, 22.90, -37, 49, 45.8, 5.63 }, - { 23, 32, 58.30, -37, 49, 5.9, 4.37 }, - { 7, 28, 22.80, -37, 48, 37.1, 6.58 }, - { 19, 6, 52.51, -37, 48, 37.1, 6.16 }, - { 17, 22, 39.41, -37, 48, 18.0, 6.41 }, - { 14, 52, 51.10, -37, 48, 11.9, 5.03 }, - { 13, 12, 3.19, -37, 48, 11.2, 4.85 }, - { 14, 41, 57.60, -37, 47, 37.0, 4.00 }, - { 6, 46, 12.10, -37, 46, 32.2, 6.21 }, - { 9, 23, 44.81, -37, 45, 25.9, 6.48 }, - { 11, 54, 25.80, -37, 44, 56.0, 6.46 }, - { 11, 25, 33.10, -37, 44, 52.1, 5.89 }, - { 21, 57, 2.21, -37, 44, 48.8, 6.18 }, - { 6, 17, 1.20, -37, 44, 15.0, 5.53 }, - { 20, 0, 15.91, -37, 42, 7.9, 5.95 }, - { 6, 32, 21.31, -37, 41, 48.1, 5.24 }, - { 8, 8, 37.61, -37, 40, 53.0, 6.37 }, - { 5, 52, 33.19, -37, 37, 52.0, 5.63 }, - { 3, 48, 35.40, -37, 37, 19.9, 5.40 }, - { 16, 58, 52.39, -37, 37, 16.0, 6.09 }, - { 3, 48, 35.90, -37, 37, 14.2, 4.73 }, - { 8, 34, 29.30, -37, 36, 41.0, 6.30 }, - { 9, 14, 57.19, -37, 36, 9.0, 5.86 }, - { 19, 12, 9.79, -37, 34, 58.1, 6.57 }, - { 9, 20, 29.59, -37, 34, 53.0, 6.05 }, - { 7, 39, 58.01, -37, 34, 45.8, 6.00 }, - { 2, 23, 6.50, -37, 34, 35.0, 6.53 }, - { 16, 24, 31.70, -37, 33, 56.9, 5.42 }, - { 19, 43, 37.61, -37, 32, 20.0, 6.16 }, - { 16, 50, 59.81, -37, 30, 51.8, 6.11 }, - { 15, 58, 30.70, -37, 30, 11.2, 6.31 }, - { 18, 20, 55.30, -37, 29, 15.0, 6.45 }, - { 17, 35, 43.01, -37, 26, 24.0, 6.48 }, - { 15, 42, 38.30, -37, 25, 30.0, 5.24 }, - { 9, 15, 45.10, -37, 24, 47.9, 4.62 }, - { 20, 26, 52.99, -37, 24, 11.2, 6.25 }, - { 5, 11, 35.90, -37, 23, 43.1, 6.57 }, - { 8, 18, 12.60, -37, 22, 27.1, 6.70 }, - { 21, 53, 55.70, -37, 21, 54.0, 3.01 }, - { 18, 56, 40.51, -37, 20, 35.9, 5.38 }, - { 7, 30, 42.41, -37, 20, 22.9, 6.65 }, - { 5, 23, 39.00, -37, 20, 12.1, 6.82 }, - { 10, 8, 1.70, -37, 20, 1.0, 6.36 }, - { 3, 42, 50.11, -37, 18, 49.0, 4.59 }, - { 17, 30, 45.79, -37, 17, 44.9, 2.69 }, - { 8, 11, 1.61, -37, 17, 31.9, 6.44 }, - { 7, 24, 47.30, -37, 17, 26.9, 6.84 }, - { 7, 24, 47.21, -37, 17, 24.0, 6.97 }, - { 8, 1, 37.39, -37, 17, 1.0, 5.95 }, - { 21, 56, 22.80, -37, 15, 13.0, 5.46 }, - { 6, 17, 9.50, -37, 15, 11.2, 5.87 }, - { 6, 7, 31.61, -37, 15, 11.2, 5.02 }, - { 11, 36, 40.80, -37, 14, 16.1, 6.31 }, - { 5, 28, 15.31, -37, 13, 50.2, 5.57 }, - { 17, 6, 20.30, -37, 13, 39.0, 5.98 }, - { 17, 22, 54.91, -37, 13, 14.2, 5.93 }, - { 16, 39, 5.21, -37, 13, 3.0, 5.91 }, - { 11, 43, 27.19, -37, 11, 25.1, 5.98 }, - { 9, 49, 28.10, -37, 11, 11.0, 5.97 }, - { 16, 28, 14.69, -37, 10, 45.8, 5.79 }, - { 1, 47, 47.81, -37, 9, 34.9, 6.32 }, - { 8, 44, 51.89, -37, 8, 49.9, 5.76 }, - { 4, 42, 3.50, -37, 8, 39.8, 5.05 }, - { 10, 56, 43.10, -37, 8, 16.1, 4.60 }, - { 5, 55, 29.90, -37, 7, 14.9, 4.97 }, - { 18, 58, 43.39, -37, 6, 27.0, 4.87 }, - { 17, 33, 36.50, -37, 6, 14.0, 1.63 }, - { 7, 17, 8.59, -37, 5, 51.0, 2.70 }, - { 15, 19, 31.61, -37, 5, 48.1, 6.20 }, - { 19, 6, 25.10, -37, 3, 47.9, 4.93 }, - { 19, 6, 25.10, -37, 3, 47.9, 4.99 }, - { 19, 1, 4.30, -37, 3, 42.8, 6.40 }, - { 19, 1, 3.19, -37, 3, 38.9, 6.69 }, - { 8, 2, 6.19, -37, 3, 2.2, 6.34 }, - { 17, 49, 51.50, -37, 2, 35.9, 3.21 }, - { 14, 19, 23.90, -37, 0, 13.0, 5.94 }, - { 6, 37, 13.80, -36, 59, 26.2, 5.71 }, - { 17, 42, 51.00, -36, 56, 44.9, 5.54 }, - { 6, 31, 34.99, -36, 56, 24.0, 6.34 }, - { 1, 32, 55.99, -36, 51, 55.1, 5.51 }, - { 15, 23, 9.41, -36, 51, 31.0, 4.54 }, - { 17, 58, 55.61, -36, 51, 29.9, 5.74 }, - { 1, 42, 3.00, -36, 49, 57.0, 5.72 }, - { 10, 18, 37.80, -36, 48, 16.9, 6.30 }, - { 16, 6, 35.50, -36, 48, 7.9, 4.23 }, - { 6, 35, 24.10, -36, 46, 48.0, 5.59 }, - { 17, 28, 56.11, -36, 46, 41.9, 6.02 }, - { 15, 27, 18.19, -36, 46, 4.1, 5.45 }, - { 18, 17, 37.61, -36, 45, 42.1, 3.11 }, - { 16, 7, 16.39, -36, 45, 20.2, 5.73 }, - { 7, 18, 38.21, -36, 44, 34.1, 5.11 }, - { 7, 18, 18.41, -36, 44, 3.1, 4.66 }, - { 8, 30, 29.59, -36, 43, 16.0, 6.69 }, - { 18, 44, 7.70, -36, 43, 7.0, 6.32 }, - { 13, 20, 35.81, -36, 42, 43.9, 2.75 }, - { 6, 24, 1.01, -36, 42, 28.1, 5.62 }, - { 18, 9, 22.39, -36, 40, 21.0, 6.58 }, - { 18, 22, 53.11, -36, 40, 9.8, 5.34 }, - { 8, 18, 33.29, -36, 39, 33.8, 4.45 }, - { 14, 48, 38.11, -36, 38, 4.9, 6.04 }, - { 8, 39, 22.10, -36, 36, 24.8, 6.13 }, - { 7, 16, 49.51, -36, 35, 34.1, 5.03 }, - { 8, 52, 38.59, -36, 32, 44.2, 6.42 }, - { 7, 12, 25.70, -36, 32, 39.8, 5.96 }, - { 11, 17, 43.01, -36, 32, 3.8, 6.68 }, - { 1, 38, 27.41, -36, 31, 41.9, 5.94 }, - { 10, 15, 20.90, -36, 31, 5.2, 6.19 }, - { 7, 38, 43.90, -36, 29, 48.8, 5.80 }, - { 8, 21, 21.00, -36, 29, 3.8, 5.20 }, - { 17, 55, 7.90, -36, 28, 32.9, 6.06 }, - { 20, 16, 23.71, -36, 27, 15.8, 6.39 }, - { 13, 51, 36.60, -36, 25, 59.9, 6.35 }, - { 2, 32, 14.81, -36, 25, 39.0, 6.30 }, - { 3, 50, 37.61, -36, 25, 31.1, 6.86 }, - { 21, 13, 18.89, -36, 25, 26.0, 5.96 }, - { 23, 2, 34.01, -36, 25, 14.9, 6.47 }, - { 22, 55, 14.90, -36, 23, 19.0, 6.40 }, - { 10, 5, 15.19, -36, 23, 2.0, 6.27 }, - { 18, 1, 48.31, -36, 22, 40.1, 6.30 }, - { 13, 15, 9.70, -36, 22, 16.0, 6.19 }, - { 14, 6, 40.99, -36, 22, 12.0, 2.06 }, - { 7, 53, 3.50, -36, 21, 50.0, 5.43 }, - { 12, 43, 58.70, -36, 20, 57.1, 6.39 }, - { 8, 13, 58.80, -36, 20, 28.0, 6.11 }, - { 7, 33, 51.00, -36, 20, 17.9, 5.54 }, - { 8, 13, 58.39, -36, 19, 21.0, 5.08 }, - { 9, 49, 51.29, -36, 16, 7.0, 6.37 }, - { 15, 6, 13.90, -36, 15, 51.1, 6.27 }, - { 15, 21, 48.41, -36, 15, 41.0, 3.56 }, - { 13, 46, 56.40, -36, 15, 6.8, 5.15 }, - { 18, 23, 28.90, -36, 14, 17.9, 5.55 }, - { 6, 33, 49.51, -36, 13, 55.9, 5.42 }, - { 6, 51, 42.29, -36, 13, 49.1, 5.96 }, - { 21, 15, 46.80, -36, 12, 38.9, 6.12 }, - { 3, 49, 27.31, -36, 12, 1.1, 4.17 }, - { 15, 57, 21.29, -36, 11, 6.0, 5.80 }, - { 19, 9, 36.41, -36, 9, 52.9, 6.56 }, - { 11, 23, 12.70, -36, 9, 52.9, 5.00 }, - { 7, 31, 25.80, -36, 9, 10.1, 6.68 }, - { 14, 41, 1.39, -36, 8, 6.0, 5.67 }, - { 20, 59, 59.69, -36, 7, 46.9, 6.11 }, - { 20, 46, 18.60, -36, 7, 13.1, 6.49 }, - { 3, 47, 49.61, -36, 6, 20.9, 6.21 }, - { 20, 11, 11.90, -36, 6, 4.0, 5.32 }, - { 9, 37, 28.30, -36, 5, 44.9, 5.98 }, - { 12, 17, 47.30, -36, 5, 38.0, 6.15 }, - { 15, 13, 7.39, -36, 5, 29.0, 6.10 }, - { 6, 35, 54.00, -36, 5, 20.0, 6.35 }, - { 11, 25, 29.40, -36, 3, 47.2, 5.22 }, - { 7, 44, 9.60, -36, 3, 46.1, 5.80 }, - { 7, 43, 12.00, -36, 3, 1.1, 5.60 }, - { 18, 6, 23.71, -36, 1, 10.9, 5.95 }, - { 18, 25, 21.70, -35, 59, 30.1, 6.15 }, - { 5, 14, 28.80, -35, 58, 37.9, 5.76 }, - { 7, 32, 22.30, -35, 57, 41.0, 6.30 }, - { 9, 29, 14.69, -35, 57, 5.0, 4.51 }, - { 3, 13, 1.49, -35, 56, 38.0, 6.27 }, - { 8, 42, 57.00, -35, 56, 35.9, 6.42 }, - { 17, 0, 36.89, -35, 56, 3.1, 5.97 }, - { 3, 25, 55.80, -35, 55, 14.9, 6.39 }, - { 17, 22, 37.99, -35, 54, 36.0, 6.47 }, - { 11, 47, 7.01, -35, 54, 24.8, 6.17 }, - { 8, 15, 58.90, -35, 54, 10.1, 6.16 }, - { 18, 4, 50.40, -35, 54, 5.0, 6.00 }, - { 8, 13, 29.59, -35, 53, 58.9, 4.78 }, - { 9, 58, 52.30, -35, 53, 28.0, 5.23 }, - { 7, 31, 42.79, -35, 53, 16.1, 6.61 }, - { 7, 54, 10.99, -35, 52, 39.0, 5.49 }, - { 13, 6, 54.31, -35, 51, 42.8, 6.54 }, - { 10, 9, 31.80, -35, 51, 24.1, 6.13 }, - { 3, 28, 11.50, -35, 51, 11.9, 6.50 }, - { 2, 50, 14.81, -35, 50, 37.0, 5.92 }, - { 7, 23, 58.30, -35, 50, 16.1, 6.31 }, - { 5, 13, 46.49, -35, 49, 32.2, 6.98 }, - { 9, 35, 11.81, -35, 49, 26.0, 6.49 }, - { 11, 4, 54.19, -35, 48, 16.9, 5.43 }, - { 5, 50, 57.60, -35, 46, 5.9, 3.12 }, - { 17, 16, 21.50, -35, 44, 57.8, 6.12 }, - { 10, 40, 51.60, -35, 44, 30.1, 6.37 }, - { 5, 8, 14.81, -35, 43, 5.9, 6.52 }, - { 9, 31, 32.90, -35, 42, 54.0, 5.87 }, - { 5, 4, 26.09, -35, 42, 19.1, 6.34 }, - { 13, 48, 55.10, -35, 42, 14.0, 6.53 }, - { 12, 5, 56.71, -35, 41, 38.0, 6.23 }, - { 3, 27, 33.41, -35, 40, 53.0, 5.71 }, - { 2, 50, 40.39, -35, 40, 34.0, 5.47 }, - { 5, 47, 18.60, -35, 40, 28.9, 6.32 }, - { 20, 20, 51.89, -35, 40, 25.0, 6.46 }, - { 13, 53, 32.81, -35, 39, 51.1, 5.54 }, - { 1, 6, 26.50, -35, 39, 38.9, 6.61 }, - { 4, 30, 40.30, -35, 39, 13.0, 5.96 }, - { 18, 44, 19.39, -35, 38, 30.8, 4.87 }, - { 17, 52, 57.89, -35, 37, 27.1, 6.03 }, - { 20, 28, 46.70, -35, 35, 44.9, 6.10 }, - { 2, 47, 33.70, -35, 33, 2.9, 6.51 }, - { 4, 23, 7.70, -35, 32, 42.0, 6.39 }, - { 23, 28, .70, -35, 32, 39.8, 6.32 }, - { 22, 58, 34.99, -35, 31, 23.2, 6.13 }, - { 6, 5, 27.10, -35, 30, 49.0, 5.80 }, - { 6, 57, 17.59, -35, 30, 27.0, 6.23 }, - { 9, 42, 41.40, -35, 30, 6.1, 6.41 }, - { 8, 14, 13.20, -35, 29, 26.2, 5.78 }, - { 5, 4, 24.41, -35, 28, 59.9, 4.55 }, - { 5, 31, 12.70, -35, 28, 14.2, 3.87 }, - { 8, 9, 10.20, -35, 27, 18.0, 6.20 }, - { 8, 18, 17.40, -35, 27, 6.1, 5.58 }, - { 17, 6, 28.39, -35, 27, 4.0, 6.13 }, - { 19, 19, 40.01, -35, 25, 17.0, 5.59 }, - { 12, 23, 35.40, -35, 24, 46.1, 5.32 }, - { 6, 56, 45.70, -35, 20, 30.1, 6.29 }, - { 11, 27, 58.49, -35, 19, 43.0, 6.45 }, - { 13, 53, 52.20, -35, 18, 51.8, 6.19 }, - { 8, 40, 6.19, -35, 18, 29.9, 3.97 }, - { 5, 57, 32.21, -35, 16, 59.9, 4.36 }, - { 7, 37, 44.81, -35, 16, 37.9, 6.60 }, - { 19, 59, 44.21, -35, 16, 35.0, 4.37 }, - { 4, 10, 45.79, -35, 16, 26.0, 6.44 }, - { 6, 31, 13.01, -35, 15, 33.1, 5.84 }, - { 16, 36, 22.51, -35, 15, 20.2, 4.16 }, - { 7, 49, 14.69, -35, 14, 35.9, 5.93 }, - { 20, 16, 26.50, -35, 11, 52.1, 6.53 }, - { 14, 44, 59.21, -35, 11, 30.8, 4.92 }, - { 12, 25, 21.79, -35, 11, 11.0, 5.73 }, - { 14, 43, 39.41, -35, 10, 25.0, 4.05 }, - { 6, 16, 33.10, -35, 8, 26.2, 4.37 }, - { 5, 33, 7.39, -35, 8, 22.9, 5.78 }, - { 0, 11, 43.99, -35, 7, 59.2, 5.25 }, - { 8, 27, 59.30, -35, 6, 50.0, 5.75 }, - { 11, 53, 26.81, -35, 4, .1, 6.17 }, - { 6, 25, 29.90, -35, 3, 50.0, 6.25 }, - { 17, 52, 55.90, -35, 1, 7.0, 6.45 }, - { 9, 27, 38.40, -35, 0, 28.1, 6.65 }, - { 17, 18, 57.19, -34, 59, 22.9, 5.91 }, - { 19, 21, 29.90, -34, 59, 2.0, 6.48 }, - { 7, 37, 22.10, -34, 58, 7.0, 4.53 }, - { 5, 15, 46.99, -34, 55, 36.1, 6.66 }, - { 4, 51, 28.20, -34, 54, 23.0, 5.86 }, - { 0, 14, 58.20, -34, 54, 15.8, 6.17 }, - { 17, 53, 23.30, -34, 53, 43.1, 5.60 }, - { 5, 17, 29.09, -34, 53, 43.1, 4.83 }, - { 7, 54, 39.91, -34, 50, 48.8, 6.15 }, - { 17, 53, 58.10, -34, 49, 54.1, 6.42 }, - { 17, 52, 13.61, -34, 47, 57.1, 5.90 }, - { 14, 22, 19.70, -34, 47, 12.8, 5.56 }, - { 17, 53, 45.50, -34, 47, 8.9, 6.38 }, - { 7, 5, 31.99, -34, 46, 40.1, 6.14 }, - { 4, 24, 56.40, -34, 45, 28.1, 6.55 }, - { 17, 53, 54.91, -34, 45, 9.0, 5.96 }, - { 23, 3, 29.81, -34, 44, 57.8, 5.11 }, - { 18, 49, 17.21, -34, 44, 55.0, 6.62 }, - { 11, 40, 12.79, -34, 44, 40.9, 4.70 }, - { 11, 17, 39.19, -34, 44, 13.9, 6.45 }, - { 3, 53, 38.90, -34, 43, 55.9, 5.11 }, - { 17, 53, 19.61, -34, 43, 50.2, 6.17 }, - { 15, 42, 40.99, -34, 42, 38.2, 4.75 }, - { 7, 52, 15.70, -34, 42, 19.1, 5.01 }, - { 12, 10, 2.50, -34, 42, 18.0, 6.17 }, - { 16, 31, 22.90, -34, 42, 15.8, 4.23 }, - { 5, 20, 20.59, -34, 41, 56.0, 6.34 }, - { 19, 59, 51.29, -34, 41, 52.1, 5.30 }, - { 17, 25, 2.71, -34, 41, 47.0, 6.16 }, - { 15, 46, 44.21, -34, 40, 57.0, 5.61 }, - { 5, 42, 15.10, -34, 40, 4.1, 5.29 }, - { 2, 33, 7.01, -34, 39, .0, 5.90 }, - { 8, 32, 58.61, -34, 38, 2.0, 6.36 }, - { 8, 46, 49.20, -34, 37, 22.1, 6.37 }, - { 8, 19, 29.40, -34, 35, 25.1, 6.43 }, - { 2, 36, 58.61, -34, 34, 41.9, 5.79 }, - { 13, 36, 50.50, -34, 28, 4.1, 6.50 }, - { 17, 54, 27.19, -34, 27, 59.0, 5.96 }, - { 13, 49, 26.71, -34, 27, 2.9, 4.19 }, - { 17, 52, 19.70, -34, 25, .1, 5.84 }, - { 15, 39, 46.01, -34, 24, 42.8, 4.67 }, - { 6, 19, 40.99, -34, 23, 48.1, 5.78 }, - { 18, 24, 10.30, -34, 23, 4.9, 1.85 }, - { 6, 50, 52.39, -34, 22, 1.9, 4.99 }, - { 15, 1, 58.10, -34, 21, 32.0, 6.22 }, - { 5, 21, 16.90, -34, 20, 43.1, 6.09 }, - { 6, 7, 3.70, -34, 18, 42.8, 5.83 }, - { 16, 50, 9.79, -34, 17, 35.9, 2.29 }, - { 17, 32, 24.50, -34, 16, 46.9, 6.17 }, - { 7, 45, 34.99, -34, 10, 23.2, 5.37 }, - { 22, 47, 19.10, -34, 9, 40.0, 6.28 }, - { 6, 20, 36.31, -34, 8, 38.0, 5.53 }, - { 7, 26, 42.29, -34, 8, 26.9, 5.90 }, - { 12, 13, 13.01, -34, 7, 32.2, 6.50 }, - { 17, 4, 49.39, -34, 7, 22.1, 4.87 }, - { 17, 52, 49.20, -34, 6, 51.1, 6.06 }, - { 6, 58, 25.10, -34, 6, 42.1, 5.06 }, - { 18, 17, 36.10, -34, 6, 25.9, 6.16 }, - { 9, 19, 47.90, -34, 6, 11.9, 6.39 }, - { 5, 39, 38.90, -34, 4, 27.1, 2.64 }, - { 10, 49, 57.00, -34, 3, 29.2, 5.61 }, - { 22, 8, 25.99, -34, 2, 38.0, 4.99 }, - { 4, 24, 2.21, -34, 1, .8, 3.96 }, - { 22, 9, 55.70, -34, 0, 52.9, 5.37 }, - { 4, 45, 49.61, -34, 0, 18.0, 6.86 }, - { 12, 50, 41.21, -33, 59, 57.8, 4.91 }, - { 15, 56, 53.50, -33, 57, 59.0, 5.12 }, - { 15, 56, 54.19, -33, 57, 51.1, 5.62 }, - { 0, 39, 57.91, -33, 57, 42.1, 6.69 }, - { 18, 25, 54.60, -33, 56, 43.1, 6.30 }, - { 21, 32, 14.59, -33, 56, 40.9, 5.97 }, - { 6, 1, 16.39, -33, 54, 42.1, 5.55 }, - { 11, 52, 54.60, -33, 54, 29.2, 4.28 }, - { 4, 19, 3.00, -33, 54, 18.0, 6.37 }, - { 14, 55, 44.69, -33, 51, 20.9, 5.32 }, - { 2, 28, 1.70, -33, 48, 40.0, 5.14 }, - { 5, 53, 6.89, -33, 48, 5.0, 4.87 }, - { 18, 10, 55.20, -33, 47, 58.9, 6.16 }, - { 4, 17, 53.69, -33, 47, 53.9, 3.56 }, - { 12, 13, 36.70, -33, 47, 34.1, 6.33 }, - { 20, 49, 58.10, -33, 46, 46.9, 4.90 }, - { 1, 28, 43.30, -33, 45, 49.0, 6.58 }, - { 8, 37, 29.69, -33, 44, 44.9, 6.48 }, - { 10, 59, 13.90, -33, 44, 13.9, 5.71 }, - { 7, 19, 13.70, -33, 43, 37.9, 6.30 }, - { 23, 19, 43.20, -33, 42, 29.2, 6.37 }, - { 20, 0, 20.30, -33, 42, 14.0, 5.66 }, - { 17, 31, 47.40, -33, 42, 10.1, 6.44 }, - { 21, 39, 6.10, -33, 40, 45.1, 6.28 }, - { 15, 50, 57.50, -33, 37, 37.9, 3.95 }, - { 13, 41, 45.70, -33, 35, 48.8, 6.05 }, - { 11, 36, 34.99, -33, 34, 12.0, 5.74 }, - { 8, 13, 41.09, -33, 34, 9.1, 6.37 }, - { 8, 5, 44.90, -33, 34, 9.1, 6.14 }, - { 17, 15, 19.30, -33, 32, 53.9, 5.53 }, - { 16, 9, 52.61, -33, 32, 44.9, 5.54 }, - { 0, 8, 3.50, -33, 31, 45.8, 5.68 }, - { 19, 16, 32.81, -33, 31, 18.1, 6.25 }, - { 16, 55, 57.79, -33, 30, 25.9, 6.37 }, - { 13, 0, 32.59, -33, 30, 19.1, 6.02 }, - { 7, 0, 49.80, -33, 27, 55.1, 6.40 }, - { 7, 34, 12.79, -33, 27, 47.9, 6.11 }, - { 6, 22, 6.79, -33, 26, 11.0, 3.85 }, - { 20, 40, 19.80, -33, 25, 54.8, 5.47 }, - { 9, 56, 35.50, -33, 25, 7.0, 5.84 }, - { 5, 41, 27.00, -33, 24, 2.2, 6.34 }, - { 12, 46, 46.01, -33, 18, 56.2, 5.86 }, - { 11, 57, 3.70, -33, 18, 55.1, 6.21 }, - { 13, 34, 43.61, -33, 18, 38.9, 6.44 }, - { 14, 54, 37.99, -33, 18, 2.2, 5.82 }, - { 7, 49, 35.40, -33, 17, 20.0, 5.60 }, - { 16, 57, 11.09, -33, 15, 33.8, 5.48 }, - { 14, 16, 18.29, -33, 14, 29.0, 6.55 }, - { 14, 18, 23.81, -33, 13, 14.2, 6.54 }, - { 16, 4, 17.81, -33, 12, 51.8, 6.10 }, - { 16, 23, 56.71, -33, 11, 57.8, 6.47 }, - { 13, 23, 8.71, -33, 11, 24.0, 6.22 }, - { 8, 43, 35.50, -33, 11, 11.0, 3.68 }, - { 20, 51, 58.80, -33, 10, 37.9, 6.04 }, - { 16, 41, 45.50, -33, 8, 47.0, 5.87 }, - { 22, 8, 42.70, -33, 7, 32.2, 6.37 }, - { 15, 36, 11.40, -33, 5, 34.1, 6.24 }, - { 22, 38, 51.50, -33, 4, 53.0, 5.66 }, - { 5, 35, 15.41, -33, 4, 48.0, 5.78 }, - { 1, 58, 26.69, -33, 4, .1, 6.35 }, - { 8, 21, 22.99, -33, 3, 15.8, 4.83 }, - { 17, 43, 6.89, -33, 3, 4.0, 6.40 }, - { 21, 36, 48.89, -33, 2, 53.2, 6.11 }, - { 19, 55, 5.09, -33, 2, 47.0, 6.46 }, - { 13, 45, 41.21, -33, 2, 38.0, 4.23 }, - { 10, 13, 24.79, -33, 1, 54.8, 6.38 }, - { 21, 44, 56.81, -33, 1, 32.9, 4.34 }, - { 18, 33, 57.79, -33, 1, .1, 5.28 }, - { 16, 14, 22.30, -33, 0, 41.0, 5.92 }, - { 0, 27, 55.70, -33, 0, 25.9, 4.81 }, - { 20, 5, 32.11, -33, 0, .0, 6.53 }, - { 13, 51, 50.11, -32, 59, 40.9, 6.06 }, - { 13, 51, 49.61, -32, 59, 39.8, 4.56 }, - { 18, 31, 4.80, -32, 59, 21.1, 5.34 }, - { 22, 8, 22.99, -32, 59, 19.0, 4.50 }, - { 11, 37, 1.20, -32, 59, 17.2, 6.29 }, - { 15, 31, 50.30, -32, 52, 52.0, 6.46 }, - { 22, 52, 31.61, -32, 52, 32.2, 4.46 }, - { 11, 34, 29.50, -32, 49, 53.0, 5.98 }, - { 12, 26, 51.70, -32, 49, 48.0, 5.55 }, - { 22, 49, 59.09, -32, 48, 19.1, 6.33 }, - { 8, 49, 51.50, -32, 46, 50.2, 5.21 }, - { 18, 9, 59.90, -32, 43, 10.9, 6.43 }, - { 6, 34, 35.30, -32, 42, 59.0, 5.62 }, - { 10, 42, 43.20, -32, 42, 56.9, 5.64 }, - { 3, 23, 44.59, -32, 42, 25.9, 6.50 }, - { 8, 4, 16.20, -32, 40, 30.0, 5.31 }, - { 17, 17, 3.70, -32, 39, 46.1, 5.55 }, - { 16, 9, 31.70, -32, 38, 58.9, 6.19 }, - { 15, 2, 59.30, -32, 38, 35.9, 5.44 }, - { 14, 56, 30.91, -32, 38, 12.1, 6.06 }, - { 5, 39, 49.80, -32, 37, 45.1, 5.45 }, - { 8, 34, 31.70, -32, 35, 55.0, 6.43 }, - { 11, 7, 8.40, -32, 35, 13.9, 6.59 }, - { 17, 34, 42.50, -32, 34, 54.1, 5.70 }, - { 6, 28, 10.10, -32, 34, 48.0, 4.48 }, - { 17, 18, 20.40, -32, 33, 11.9, 6.36 }, - { 22, 10, 8.81, -32, 32, 53.9, 4.92 }, - { 1, 26, 58.10, -32, 32, 35.2, 5.79 }, - { 22, 55, 56.90, -32, 32, 22.9, 4.21 }, - { 12, 32, 4.51, -32, 32, 1.0, 6.46 }, - { 23, 18, 49.39, -32, 31, 54.8, 4.41 }, - { 2, 44, 20.50, -32, 31, 30.0, 6.22 }, - { 8, 52, 26.09, -32, 30, 33.1, 6.50 }, - { 6, 49, 50.50, -32, 30, 31.0, 3.96 }, - { 2, 59, 38.30, -32, 30, 25.9, 6.31 }, - { 11, 41, 43.99, -32, 29, 58.9, 5.22 }, - { 8, 3, 4.10, -32, 27, 50.0, 5.82 }, - { 17, 12, 58.70, -32, 26, 19.0, 6.01 }, - { 11, 12, 14.81, -32, 26, 2.0, 6.38 }, - { 2, 49, 5.40, -32, 24, 20.9, 4.46 }, - { 6, 28, 39.19, -32, 22, 16.0, 5.74 }, - { 11, 9, 53.40, -32, 22, 3.0, 5.81 }, - { 22, 31, 30.31, -32, 20, 46.0, 4.29 }, - { 21, 6, 24.70, -32, 20, 30.1, 5.18 }, - { 6, 37, 47.59, -32, 20, 22.9, 5.27 }, - { 1, 42, 8.59, -32, 19, 36.8, 5.25 }, - { 5, 45, 59.90, -32, 18, 23.0, 5.17 }, - { 21, 1, 17.50, -32, 15, 28.1, 4.67 }, - { 7, 23, 31.90, -32, 12, 7.9, 5.39 }, - { 9, 37, 9.89, -32, 10, 43.0, 5.63 }, - { 21, 17, 56.30, -32, 10, 21.0, 4.71 }, - { 6, 4, 20.30, -32, 10, 21.0, 5.65 }, - { 8, 30, 28.61, -32, 9, 33.8, 5.65 }, - { 17, 1, 52.70, -32, 8, 37.0, 5.03 }, - { 8, 14, 10.99, -32, 8, 26.9, 6.06 }, - { 0, 29, 48.91, -32, 7, .1, 6.57 }, - { 16, 43, 38.71, -32, 6, 22.0, 6.46 }, - { 19, 30, 14.69, -32, 5, 31.9, 6.60 }, - { 23, 40, 38.21, -32, 4, 23.2, 5.31 }, - { 20, 4, 19.61, -32, 3, 23.0, 4.99 }, - { 20, 50, 47.11, -32, 3, 15.8, 6.36 }, - { 6, 32, 39.00, -32, 1, 50.2, 5.69 }, - { 16, 3, 34.30, -32, 0, 2.2, 6.01 }, - { 5, 56, 49.01, -31, 58, 34.0, 6.44 }, - { 11, 3, 16.10, -31, 57, 38.9, 6.46 }, - { 3, 42, 14.90, -31, 56, 17.9, 5.00 }, - { 13, 53, 12.50, -31, 55, 40.1, 4.73 }, - { 7, 23, .60, -31, 55, 26.0, 5.43 }, - { 23, 55, 16.61, -31, 55, 18.1, 6.10 }, - { 19, 46, 1.20, -31, 54, 31.0, 5.52 }, - { 1, 34, 50.71, -31, 53, 31.9, 6.12 }, - { 9, 30, 45.41, -31, 53, 29.0, 7.00 }, - { 16, 1, 19.51, -31, 53, 21.8, 6.33 }, - { 9, 30, 46.10, -31, 53, 21.8, 6.18 }, - { 23, 55, 16.61, -31, 53, 3.1, 6.83 }, - { 3, 34, 33.50, -31, 52, 28.9, 6.40 }, - { 9, 31, 32.21, -31, 52, 18.8, 5.93 }, - { 23, 37, 5.40, -31, 52, 14.9, 6.52 }, - { 11, 33, .10, -31, 51, 28.1, 3.54 }, - { 7, 28, 51.31, -31, 50, 53.9, 6.38 }, - { 7, 28, 51.50, -31, 50, 48.8, 7.13 }, - { 11, 0, 40.80, -31, 50, 21.8, 6.07 }, - { 19, 20, 26.21, -31, 49, 4.1, 6.58 }, - { 7, 24, 43.80, -31, 48, 32.0, 5.35 }, - { 6, 45, 22.80, -31, 47, 37.0, 5.92 }, - { 6, 23, 14.40, -31, 47, 24.0, 6.34 }, - { 6, 55, 54.79, -31, 47, 24.0, 6.36 }, - { 15, 56, 13.90, -31, 47, 8.9, 6.29 }, - { 5, 2, 22.80, -31, 46, 17.0, 5.94 }, - { 9, 20, 44.21, -31, 45, 38.2, 6.82 }, - { 7, 25, 43.01, -31, 44, 19.0, 6.31 }, - { 6, 50, 23.30, -31, 42, 22.0, 5.70 }, - { 17, 49, 10.51, -31, 42, 11.9, 4.83 }, - { 10, 48, 14.21, -31, 41, 17.9, 5.88 }, - { 14, 3, 1.70, -31, 41, 2.0, 6.18 }, - { 8, 27, 16.39, -31, 40, 23.2, 6.33 }, - { 22, 36, 35.40, -31, 39, 50.0, 5.82 }, - { 7, 40, 52.70, -31, 39, 38.9, 6.56 }, - { 22, 55, 51.41, -31, 37, 59.2, 6.10 }, - { 13, 52, .91, -31, 37, 9.8, 6.12 }, - { 20, 41, 23.71, -31, 35, 53.9, 5.76 }, - { 22, 56, 24.00, -31, 33, 56.2, 6.48 }, - { 1, 2, 26.40, -31, 33, 6.8, 5.50 }, - { 15, 14, 37.30, -31, 31, 9.1, 4.91 }, - { 13, 16, 53.11, -31, 30, 22.0, 5.10 }, - { 8, 32, 51.50, -31, 30, 2.9, 6.38 }, - { 7, 29, 4.90, -31, 27, 23.0, 5.77 }, - { 0, 16, 8.90, -31, 26, 47.0, 5.67 }, - { 5, 56, 20.90, -31, 22, 57.0, 5.50 }, - { 13, 55, 44.50, -31, 17, 6.0, 6.51 }, - { 21, 29, 3.79, -31, 14, 19.0, 6.50 }, - { 15, 40, 15.41, -31, 12, 49.0, 6.34 }, - { 15, 18, 41.30, -31, 12, 33.8, 6.18 }, - { 2, 28, 35.40, -31, 6, 9.0, 6.11 }, - { 11, 32, 54.10, -31, 5, 13.9, 5.04 }, - { 7, 13, 47.11, -31, 5, 2.0, 6.60 }, - { 15, 55, 30.41, -31, 5, 1.0, 6.21 }, - { 3, 33, 56.81, -31, 4, 49.1, 6.20 }, - { 1, 49, 19.49, -31, 4, 22.1, 6.34 }, - { 6, 44, 28.39, -31, 4, 14.2, 5.20 }, - { 10, 27, 9.10, -31, 4, 4.1, 4.25 }, - { 19, 4, 25.10, -31, 2, 48.8, 5.50 }, - { 18, 58, 21.29, -31, 2, 10.0, 6.12 }, - { 0, 23, 12.60, -31, 2, 10.0, 6.55 }, - { 6, 58, 43.80, -30, 59, 52.1, 6.42 }, - { 7, 30, 42.50, -30, 57, 43.9, 4.65 }, - { 6, 45, 31.30, -30, 56, 56.0, 5.80 }, - { 1, 23, 31.01, -30, 56, 44.2, 5.84 }, - { 14, 41, 51.10, -30, 55, 59.9, 6.37 }, - { 8, 15, 52.51, -30, 55, 32.9, 6.21 }, - { 15, 6, 33.29, -30, 55, 8.0, 5.96 }, - { 7, 55, 13.70, -30, 55, 3.0, 6.44 }, - { 16, 19, 32.69, -30, 54, 24.1, 5.49 }, - { 21, 47, 44.21, -30, 53, 53.9, 5.01 }, - { 7, 16, 57.19, -30, 53, 48.1, 6.32 }, - { 11, 51, 41.59, -30, 50, 6.0, 5.85 }, - { 3, 16, 11.30, -30, 49, 39.0, 6.65 }, - { 7, 12, 4.10, -30, 49, 18.1, 6.10 }, - { 2, 51, 55.30, -30, 48, 51.8, 6.40 }, - { 1, 12, 23.40, -30, 48, 7.9, 6.52 }, - { 4, 43, 9.29, -30, 45, 56.2, 5.68 }, - { 18, 25, 1.51, -30, 45, 24.1, 5.60 }, - { 18, 52, 41.69, -30, 44, 3.1, 6.63 }, - { 18, 10, 5.69, -30, 43, 43.0, 5.53 }, - { 2, 12, 54.50, -30, 43, 26.0, 5.28 }, - { 20, 53, 25.01, -30, 43, 7.0, 6.35 }, - { 4, 36, 50.90, -30, 43, .1, 6.30 }, - { 14, 33, 9.60, -30, 42, 51.1, 6.09 }, - { 7, 15, 21.00, -30, 41, 11.0, 5.36 }, - { 22, 40, 22.30, -30, 39, 32.0, 5.87 }, - { 7, 6, .60, -30, 39, 20.2, 6.34 }, - { 2, 40, 2.50, -30, 38, 2.0, 6.52 }, - { 10, 29, 35.40, -30, 36, 25.9, 5.56 }, - { 21, 55, 55.61, -30, 36, 23.0, 6.41 }, - { 16, 54, 36.00, -30, 35, 13.9, 6.35 }, - { 6, 45, 2.40, -30, 35, 10.0, 6.54 }, - { 10, 2, 49.30, -30, 34, 39.0, 6.54 }, - { 14, 52, 33.10, -30, 34, 36.8, 6.29 }, - { 4, 35, 33.00, -30, 33, 43.9, 3.82 }, - { 17, 51, 12.50, -30, 33, 25.9, 6.66 }, - { 19, 58, 56.40, -30, 32, 17.2, 6.28 }, - { 5, 42, 11.59, -30, 32, 8.2, 6.19 }, - { 4, 0, 40.70, -30, 29, 26.9, 5.93 }, - { 20, 34, 47.40, -30, 28, 25.0, 6.40 }, - { 6, 39, 42.70, -30, 28, 13.1, 5.71 }, - { 18, 5, 48.50, -30, 25, 27.1, 2.99 }, - { 12, 39, 3.50, -30, 25, 19.9, 5.89 }, - { 17, 8, 47.50, -30, 24, 13.0, 5.97 }, - { 9, 9, 56.40, -30, 21, 55.1, 5.59 }, - { 7, 13, 57.19, -30, 20, 24.0, 6.33 }, - { 7, 57, 40.10, -30, 20, 4.9, 4.79 }, - { 8, 9, 6.70, -30, 19, 21.0, 6.65 }, - { 11, 47, 15.70, -30, 17, 12.8, 6.48 }, - { 7, 56, 22.80, -30, 17, 7.1, 6.33 }, - { 1, 31, 43.30, -30, 16, 59.9, 5.82 }, - { 17, 59, 5.50, -30, 15, 11.9, 7.04 }, - { 17, 59, 5.21, -30, 15, 11.2, 5.16 }, - { 7, 23, 54.29, -30, 13, .8, 6.60 }, - { 17, 15, 51.50, -30, 12, 38.2, 6.21 }, - { 9, 45, 21.79, -30, 12, 10.1, 6.45 }, - { 2, 38, 18.70, -30, 11, 39.1, 5.83 }, - { 11, 7, 54.41, -30, 10, 28.9, 6.54 }, - { 3, 47, 55.99, -30, 10, 4.1, 5.54 }, - { 10, 23, 13.10, -30, 9, 43.9, 6.27 }, - { 15, 17, 49.90, -30, 8, 56.0, 4.34 }, - { 21, 6, 1.20, -30, 7, 30.0, 5.68 }, - { 5, 29, 6.70, -30, 7, .1, 6.75 }, - { 6, 20, 18.79, -30, 3, 47.9, 3.02 }, - { 2, 36, 9.29, -30, 2, 40.9, 5.75 }, - { 4, 47, 49.61, -30, 1, 13.1, 6.37 }, - { 20, 15, 50.59, -30, 0, 19.1, 6.30 }, - { 8, 17, 58.30, -30, 0, 11.9, 6.45 }, - { 2, 1, 14.71, -30, 0, 6.1, 5.35 }, - { 11, 8, 15.79, -29, 58, 22.1, 6.49 }, - { 22, 4, 23.90, -29, 55, .1, 6.47 }, - { 8, 12, 46.01, -29, 54, 38.9, 6.52 }, - { 1, 36, 8.40, -29, 54, 27.0, 5.69 }, - { 22, 3, 17.21, -29, 54, 15.1, 7.10 }, - { 3, 47, 20.11, -29, 54, 6.8, 6.55 }, - { 15, 52, 12.79, -29, 53, 12.1, 6.40 }, - { 19, 2, 36.70, -29, 52, 49.1, 2.60 }, - { 17, 27, 21.29, -29, 52, .8, 4.29 }, - { 2, 57, 13.10, -29, 51, 19.1, 6.29 }, - { 5, 33, 52.10, -29, 50, 56.0, 6.53 }, - { 18, 20, 59.69, -29, 49, 41.2, 2.70 }, - { 18, 27, 49.49, -29, 48, 59.0, 5.92 }, - { 3, 13, 37.99, -29, 48, 15.1, 6.16 }, - { 6, 15, 57.19, -29, 47, 17.9, 6.67 }, - { 15, 38, 39.41, -29, 46, 40.1, 3.66 }, - { 4, 33, 30.60, -29, 46, .1, 4.51 }, - { 6, 6, 5.50, -29, 45, 31.0, 5.81 }, - { 19, 26, 56.50, -29, 44, 35.9, 5.67 }, - { 17, 27, 37.49, -29, 43, 27.8, 6.00 }, - { 0, 2, 19.90, -29, 43, 13.1, 5.01 }, - { 16, 24, 39.70, -29, 42, 16.9, 5.84 }, - { 16, 24, 39.60, -29, 42, 11.9, 6.63 }, - { 18, 35, 59.69, -29, 41, 57.1, 6.37 }, - { 21, 34, 52.99, -29, 41, 46.0, 6.41 }, - { 2, 2, 28.10, -29, 39, 54.0, 6.42 }, - { 10, 29, 28.99, -29, 39, 49.0, 5.58 }, - { 22, 57, 39.10, -29, 37, 19.9, 1.16 }, - { 18, 5, 1.30, -29, 34, 48.0, 4.69 }, - { 13, 32, 34.51, -29, 33, 55.1, 6.45 }, - { 8, 39, 42.50, -29, 33, 40.0, 4.89 }, - { 13, 38, 42.00, -29, 33, 38.9, 5.83 }, - { 0, 33, 41.11, -29, 33, 29.9, 5.55 }, - { 22, 51, 20.90, -29, 32, 10.0, 5.97 }, - { 1, 3, 17.59, -29, 31, 32.9, 6.29 }, - { 23, 10, 46.61, -29, 31, 30.0, 6.51 }, - { 19, 11, 18.89, -29, 30, 7.9, 6.30 }, - { 14, 28, 10.39, -29, 29, 30.1, 4.97 }, - { 23, 59, 27.89, -29, 29, 6.0, 5.62 }, - { 8, 50, 2.21, -29, 27, 47.2, 5.87 }, - { 22, 59, 35.81, -29, 27, 43.9, 5.51 }, - { 5, 51, 59.50, -29, 26, 55.0, 6.45 }, - { 16, 11, 1.99, -29, 24, 59.0, 5.13 }, - { 6, 13, 33.29, -29, 23, 46.0, 6.54 }, - { 18, 52, 37.01, -29, 22, 45.8, 6.13 }, - { 22, 42, 22.10, -29, 21, 38.9, 6.17 }, - { 0, 58, 36.41, -29, 21, 27.0, 4.31 }, - { 3, 46, 27.41, -29, 20, 17.2, 5.90 }, - { 19, 25, 4.10, -29, 18, 33.1, 5.93 }, - { 7, 24, 5.71, -29, 18, 11.2, 2.45 }, - { 2, 4, 29.40, -29, 17, 48.8, 4.69 }, - { 14, 15, 1.30, -29, 16, 54.8, 6.08 }, - { 0, 4, 20.30, -29, 16, 7.0, 6.40 }, - { 11, 32, 16.10, -29, 15, 47.9, 5.81 }, - { 11, 32, 16.30, -29, 15, 40.0, 5.64 }, - { 8, 26, 50.81, -29, 12, 55.1, 6.73 }, - { 15, 56, 53.11, -29, 12, 51.1, 3.88 }, - { 20, 20, 28.10, -29, 11, 49.9, 6.30 }, - { 11, 41, 8.40, -29, 11, 47.0, 6.44 }, - { 14, 57, 13.61, -29, 9, 28.1, 6.29 }, - { 7, 27, 59.21, -29, 9, 20.9, 5.54 }, - { 5, 54, 14.09, -29, 8, 52.1, 6.36 }, - { 16, 2, 39.41, -29, 8, 8.9, 6.03 }, - { 20, 30, 56.81, -29, 6, 45.0, 6.39 }, - { 13, 50, 6.50, -29, 4, 53.0, 6.18 }, - { 10, 18, 7.61, -28, 59, 30.8, 5.34 }, - { 3, 12, 4.30, -28, 59, 12.8, 3.87 }, - { 0, 21, 31.20, -28, 58, 54.1, 5.18 }, - { 6, 58, 37.49, -28, 58, 19.9, 1.50 }, - { 7, 43, 48.50, -28, 57, 16.9, 3.96 }, - { 2, 59, 6.60, -28, 54, 24.8, 6.14 }, - { 18, 11, 58.20, -28, 54, 5.0, 6.51 }, - { 23, 1, 19.39, -28, 51, 13.0, 5.55 }, - { 9, 23, 12.31, -28, 50, 2.0, 4.69 }, - { 23, 8, 21.00, -28, 49, 23.9, 5.60 }, - { 8, 59, 15.70, -28, 48, 22.0, 6.25 }, - { 3, 18, 2.81, -28, 47, 48.8, 5.91 }, - { 19, 49, 11.59, -28, 47, 20.0, 6.05 }, - { 9, 26, 44.81, -28, 47, 15.0, 6.10 }, - { 6, 24, 43.90, -28, 46, 48.0, 6.39 }, - { 21, 18, 54.41, -28, 45, 56.2, 6.40 }, - { 17, 58, 39.10, -28, 45, 33.1, 6.01 }, - { 22, 38, 44.69, -28, 44, 52.1, 6.47 }, - { 11, 6, 38.71, -28, 43, 40.1, 6.77 }, - { 5, 36, 10.30, -28, 42, 28.1, 6.26 }, - { 13, 32, 35.90, -28, 41, 34.1, 5.69 }, - { 5, 37, 44.59, -28, 41, 21.8, 5.31 }, - { 20, 25, 26.81, -28, 39, 47.9, 5.85 }, - { 18, 17, 24.00, -28, 39, 9.0, 6.19 }, - { 5, 47, 4.70, -28, 38, 21.1, 6.22 }, - { 19, 7, 30.91, -28, 38, 12.8, 6.04 }, - { 9, 32, 18.50, -28, 37, 41.2, 6.46 }, - { 8, 50, 21.60, -28, 37, 5.2, 6.17 }, - { 16, 18, 17.90, -28, 36, 50.0, 4.78 }, - { 10, 12, 2.90, -28, 36, 23.0, 6.28 }, - { 13, 54, 16.61, -28, 34, 10.9, 6.04 }, - { 6, 53, 33.91, -28, 32, 22.9, 6.04 }, - { 16, 45, .19, -28, 30, 34.9, 6.02 }, - { 7, 0, 42.60, -28, 29, 21.8, 6.27 }, - { 11, 55, 40.10, -28, 28, 36.8, 5.93 }, - { 18, 8, 4.99, -28, 27, 25.9, 4.57 }, - { 22, 0, 50.21, -28, 27, 13.0, 5.42 }, - { 18, 22, .19, -28, 25, 48.0, 6.16 }, - { 16, 12, 15.91, -28, 25, 3.0, 5.67 }, - { 7, 43, 32.40, -28, 24, 40.0, 4.59 }, - { 7, 35, 22.80, -28, 22, 9.8, 4.64 }, - { 22, 39, 43.99, -28, 19, 31.1, 6.31 }, - { 12, 44, .50, -28, 19, 26.0, 5.48 }, - { 22, 10, .10, -28, 17, 33.0, 6.44 }, - { 18, 17, 23.71, -28, 17, 21.1, 6.40 }, - { 10, 31, 48.60, -28, 14, 15.0, 6.05 }, - { 2, 33, 50.71, -28, 13, 57.0, 4.90 }, - { 16, 35, 52.99, -28, 12, 58.0, 2.82 }, - { 15, 38, 15.70, -28, 12, 24.1, 6.32 }, - { 17, 23, 21.60, -28, 8, 35.2, 5.35 }, - { 15, 37, 1.51, -28, 8, 6.0, 3.58 }, - { 23, 48, 55.61, -28, 7, 49.1, 4.57 }, - { 13, 31, 33.29, -28, 6, 46.1, 6.47 }, - { 3, 1, 37.70, -28, 5, 30.1, 5.89 }, - { 23, 9, 44.59, -28, 5, 19.0, 5.87 }, - { 4, 46, 25.80, -28, 5, 15.0, 6.19 }, - { 11, 8, 43.90, -28, 4, 50.2, 5.44 }, - { 17, 56, 41.90, -28, 3, 55.1, 5.80 }, - { 15, 46, 12.79, -28, 3, 42.1, 6.51 }, - { 15, 2, 6.41, -28, 3, 38.2, 5.85 }, - { 15, 34, 37.30, -28, 2, 48.8, 5.15 }, - { 0, 9, 21.00, -27, 59, 16.1, 5.42 }, - { 14, 50, 17.30, -27, 57, 37.1, 4.41 }, - { 7, 40, 43.39, -27, 56, 44.9, 6.76 }, - { 3, 38, 47.69, -27, 56, 35.2, 6.01 }, - { 2, 49, 54.19, -27, 56, 30.1, 5.39 }, - { 7, 1, 43.10, -27, 56, 4.9, 3.47 }, - { 16, 12, 18.19, -27, 55, 35.0, 4.59 }, - { 20, 54, 6.79, -27, 55, 32.2, 6.41 }, - { 17, 43, 17.81, -27, 53, 3.1, 6.36 }, - { 7, 16, 34.99, -27, 52, 52.0, 4.64 }, - { 5, 37, 16.49, -27, 52, 17.0, 6.16 }, - { 19, 24, 30.10, -27, 51, 56.2, 6.04 }, - { 7, 23, 29.09, -27, 50, 3.1, 5.38 }, - { 3, 7, 50.90, -27, 49, 52.0, 6.19 }, - { 17, 47, 33.60, -27, 49, 50.9, 4.54 }, - { 0, 11, 34.39, -27, 47, 58.9, 5.41 }, - { 0, 55, 55.49, -27, 46, 32.2, 6.10 }, - { 6, 30, 46.30, -27, 46, 9.8, 5.93 }, - { 9, 44, 12.10, -27, 46, 9.8, 4.79 }, - { 22, 14, 18.79, -27, 46, .8, 5.43 }, - { 17, 12, 25.01, -27, 45, 42.8, 6.14 }, - { 14, 23, 5.81, -27, 45, 14.0, 4.77 }, - { 12, 25, 18.41, -27, 44, 57.1, 6.09 }, - { 21, 3, 10.20, -27, 43, 54.8, 6.25 }, - { 8, 50, 31.90, -27, 42, 36.0, 4.01 }, - { 20, 2, 39.50, -27, 42, 34.9, 4.58 }, - { 8, 55, 31.51, -27, 40, 54.8, 4.89 }, - { 19, 6, 56.40, -27, 40, 14.2, 3.32 }, - { 14, 58, 39.19, -27, 39, 25.9, 5.65 }, - { 4, 5, 37.39, -27, 39, 6.1, 5.59 }, - { 21, 13, 17.30, -27, 37, 9.8, 5.42 }, - { 12, 48, 26.40, -27, 35, 51.0, 5.66 }, - { 6, 57, 42.41, -27, 32, 15.0, 6.23 }, - { 7, 10, 19.39, -27, 29, 29.0, 5.46 }, - { 9, 56, 54.00, -27, 28, 30.0, 6.32 }, - { 7, 12, 24.10, -27, 28, 27.1, 6.59 }, - { 16, 44, 17.30, -27, 27, 22.0, 6.58 }, - { 14, 2, 22.80, -27, 25, 48.0, 5.48 }, - { 10, 37, 13.70, -27, 24, 45.0, 4.89 }, - { 5, 19, 23.69, -27, 22, 8.0, 5.99 }, - { 7, 13, 36.31, -27, 21, 23.0, 6.12 }, - { 1, 46, 1.01, -27, 20, 57.1, 6.39 }, - { 6, 44, 51.89, -27, 20, 29.0, 6.45 }, - { 15, 54, 30.00, -27, 20, 19.0, 6.14 }, - { 6, 50, 6.00, -27, 20, 2.0, 7.04 }, - { 8, 29, 27.60, -27, 19, 57.0, 6.70 }, - { 9, 52, 58.01, -27, 19, 55.9, 6.30 }, - { 3, 26, 22.51, -27, 19, 3.0, 5.93 }, - { 11, 5, 19.90, -27, 17, 37.0, 4.94 }, - { 11, 5, 57.60, -27, 17, 16.1, 5.71 }, - { 11, 50, 37.10, -27, 16, 40.1, 6.48 }, - { 14, 12, 46.01, -27, 15, 40.0, 5.08 }, - { 20, 45, 13.20, -27, 14, 49.9, 6.50 }, - { 19, 56, 56.81, -27, 10, 12.0, 4.52 }, - { 6, 58, 7.61, -27, 9, 52.9, 6.37 }, - { 6, 10, 34.61, -27, 9, 15.1, 5.72 }, - { 12, 37, 42.19, -27, 8, 20.0, 5.45 }, - { 22, 29, 46.01, -27, 6, 25.9, 5.95 }, - { 22, 40, 39.41, -27, 2, 37.0, 4.17 }, - { 18, 18, 3.19, -27, 2, 33.0, 4.65 }, - { 23, 54, 21.41, -27, 2, 31.9, 6.35 }, - { 7, 14, 51.10, -27, 2, 17.2, 5.58 }, - { 20, 15, 17.40, -27, 1, 58.1, 5.73 }, - { 10, 13, 19.39, -27, 1, 44.0, 6.25 }, - { 7, 34, 34.90, -27, 0, 42.8, 5.77 }, - { 18, 45, 39.41, -26, 59, 26.9, 3.17 }, - { 23, 21, 15.50, -26, 59, 12.1, 5.64 }, - { 19, 29, 52.20, -26, 59, 8.2, 5.52 }, - { 17, 48, 27.79, -26, 58, 30.0, 6.35 }, - { 7, 20, 55.01, -26, 57, 49.0, 6.01 }, - { 6, 53, .10, -26, 57, 27.0, 6.40 }, - { 5, 15, 24.29, -26, 56, 35.9, 5.07 }, - { 20, 51, 49.30, -26, 55, 9.1, 4.11 }, - { 21, 1, 45.31, -26, 52, 52.0, 6.05 }, - { 7, 39, 26.90, -26, 51, 47.2, 6.50 }, - { 14, 25, 47.69, -26, 51, 9.0, 6.48 }, - { 8, 35, 28.80, -26, 50, 37.0, 5.96 }, - { 11, 2, 24.41, -26, 49, 53.0, 6.23 }, - { 22, 4, 36.79, -26, 49, 21.0, 5.96 }, - { 7, 38, 49.80, -26, 48, 13.0, 4.62 }, - { 7, 38, 49.30, -26, 48, 6.1, 4.50 }, - { 7, 17, 47.90, -26, 47, 51.0, 6.46 }, - { 7, 14, 48.70, -26, 46, 22.1, 3.85 }, - { 9, 8, 43.49, -26, 46, 4.1, 6.15 }, - { 18, 28, 6.19, -26, 45, 25.9, 6.27 }, - { 11, 48, 45.10, -26, 44, 58.9, 5.11 }, - { 11, 32, 23.30, -26, 44, 48.1, 6.16 }, - { 12, 51, 57.91, -26, 44, 17.2, 6.15 }, - { 5, 23, 12.00, -26, 42, 20.9, 6.49 }, - { 6, 9, 47.21, -26, 42, 2.9, 6.27 }, - { 14, 6, 22.30, -26, 40, 57.0, 3.27 }, - { 10, 36, 4.61, -26, 40, 30.0, 6.29 }, - { 9, 1, 11.40, -26, 39, 50.0, 6.20 }, - { 7, 7, .10, -26, 39, 28.1, 6.62 }, - { 18, 52, 28.49, -26, 39, 1.1, 6.29 }, - { 14, 47, 57.50, -26, 38, 47.0, 5.77 }, - { 20, 40, 36.00, -26, 38, 42.0, 6.51 }, - { 18, 27, 43.80, -26, 38, 4.9, 6.31 }, - { 23, 57, 8.30, -26, 37, 25.0, 6.26 }, - { 14, 13, 13.20, -26, 36, 43.9, 6.24 }, - { 3, 20, 45.19, -26, 36, 23.0, 6.39 }, - { 17, 15, 21.00, -26, 36, 10.1, 5.11 }, - { 17, 15, 20.81, -26, 36, 5.0, 5.07 }, - { 9, 29, 54.50, -26, 35, 22.9, 5.48 }, - { 7, 18, 51.19, -26, 35, 8.9, 5.28 }, - { 18, 28, 57.41, -26, 34, 54.1, 6.50 }, - { 13, 11, 39.19, -26, 33, 6.1, 6.50 }, - { 9, 56, 46.51, -26, 33, 1.1, 6.28 }, - { 16, 31, 22.80, -26, 32, 16.1, 6.10 }, - { 17, 6, 53.21, -26, 30, 47.2, 6.29 }, - { 13, 36, 48.41, -26, 29, 42.0, 5.78 }, - { 10, 30, 51.41, -26, 29, 2.0, 6.51 }, - { 6, 11, 13.51, -26, 28, 55.9, 6.09 }, - { 12, 56, 30.10, -26, 27, 37.1, 6.62 }, - { 16, 29, 24.41, -26, 25, 54.8, 0.96 }, - { 7, 8, 23.50, -26, 23, 35.9, 1.84 }, - { 21, 19, 45.79, -26, 21, 11.2, 6.56 }, - { 7, 14, 15.19, -26, 21, 9.0, 4.66 }, - { 7, 42, 48.10, -26, 21, 4.0, 5.64 }, - { 8, 22, 49.90, -26, 20, 53.2, 5.90 }, - { 15, 10, 18.60, -26, 19, 58.1, 5.76 }, - { 22, 12, 57.50, -26, 19, 40.1, 6.17 }, - { 16, 8, 7.61, -26, 19, 36.1, 5.38 }, - { 19, 55, 50.40, -26, 17, 57.8, 4.70 }, - { 18, 55, 15.91, -26, 17, 48.1, 2.02 }, - { 20, 56, 47.30, -26, 17, 47.0, 5.70 }, - { 0, 13, 44.21, -26, 17, 4.9, 6.31 }, - { 6, 3, 15.50, -26, 17, 3.8, 5.04 }, - { 15, 37, 28.49, -26, 16, 48.0, 6.19 }, - { 5, 2, 9.79, -26, 16, 30.0, 5.02 }, - { 17, 31, 44.40, -26, 16, 10.9, 6.05 }, - { 15, 55, 30.10, -26, 15, 56.9, 5.62 }, - { 8, 37, 52.20, -26, 15, 18.0, 5.27 }, - { 23, 44, 28.90, -26, 14, 47.0, 6.17 }, - { 1, 30, 22.90, -26, 12, 28.1, 5.93 }, - { 19, 58, 57.19, -26, 11, 44.2, 4.83 }, - { 15, 13, 53.30, -26, 11, 37.0, 5.84 }, - { 21, 36, 10.99, -26, 10, 17.0, 5.73 }, - { 5, 5, 16.20, -26, 9, 9.0, 5.73 }, - { 8, 27, 53.50, -26, 7, 57.0, 6.62 }, - { 7, 34, 28.80, -26, 7, .1, 6.65 }, - { 13, 45, 36.89, -26, 6, 58.0, 5.81 }, - { 15, 58, 51.10, -26, 6, 51.1, 2.89 }, - { 3, 15, .19, -26, 6, 1.1, 6.25 }, - { 14, 47, 44.81, -26, 5, 15.0, 5.24 }, - { 22, 30, 53.71, -26, 4, 25.0, 6.43 }, - { 0, 13, 42.10, -26, 1, 18.8, 5.94 }, - { 20, 41, 24.10, -26, 0, .0, 6.28 }, - { 9, 21, 29.59, -25, 57, 56.2, 4.72 }, - { 2, 18, 58.51, -25, 56, 44.2, 6.34 }, - { 17, 26, 55.20, -25, 56, 35.9, 6.44 }, - { 7, 12, 12.19, -25, 56, 33.0, 5.92 }, - { 7, 48, 5.21, -25, 56, 13.9, 4.50 }, - { 9, 54, 12.31, -25, 55, 57.0, 4.88 }, - { 22, 47, 56.21, -25, 54, 42.8, 6.30 }, - { 5, 10, 44.50, -25, 54, 33.8, 6.41 }, - { 11, 58, 54.41, -25, 54, 32.0, 6.43 }, - { 19, 13, 13.70, -25, 54, 24.1, 5.80 }, - { 22, 16, 37.39, -25, 53, 53.9, 6.15 }, - { 7, 21, 4.30, -25, 53, 29.0, 5.87 }, - { 16, 3, 20.59, -25, 51, 55.1, 5.00 }, - { 9, 8, 2.90, -25, 51, 29.9, 4.58 }, - { 6, 27, 11.21, -25, 51, 24.1, 6.07 }, - { 2, 24, 20.11, -25, 50, 51.0, 6.44 }, - { 14, 19, .79, -25, 48, 56.2, 5.87 }, - { 15, 5, 47.69, -25, 47, 22.9, 6.67 }, - { 20, 49, 17.59, -25, 46, 53.0, 5.86 }, - { 6, 50, 36.89, -25, 46, 41.2, 6.33 }, - { 15, 50, 58.70, -25, 45, 5.0, 4.64 }, - { 4, 21, 31.30, -25, 43, 41.9, 6.01 }, - { 4, 55, 30.19, -25, 43, 40.1, 6.72 }, - { 11, 54, 42.50, -25, 42, 50.0, 5.30 }, - { 23, 0, 24.60, -25, 37, 36.1, 6.29 }, - { 14, 47, 22.51, -25, 37, 27.8, 5.63 }, - { 3, 31, 53.90, -25, 36, 51.1, 6.38 }, - { 18, 18, 41.69, -25, 36, 16.9, 6.51 }, - { 16, 21, 11.30, -25, 35, 34.1, 2.89 }, - { 3, 22, 16.30, -25, 35, 16.1, 6.35 }, - { 6, 23, 55.90, -25, 34, 40.1, 5.63 }, - { 0, 27, 14.71, -25, 32, 49.9, 5.98 }, - { 16, 46, 51.29, -25, 31, 43.0, 6.71 }, - { 9, 3, 8.81, -25, 30, 15.8, 6.74 }, - { 7, 43, 39.10, -25, 30, 14.0, 6.55 }, - { 13, 44, 45.70, -25, 30, 2.9, 6.21 }, - { 16, 14, 53.59, -25, 28, 36.8, 6.05 }, - { 18, 8, 54.10, -25, 28, 21.0, 6.61 }, - { 14, 46, .10, -25, 26, 35.2, 4.94 }, - { 18, 27, 58.20, -25, 25, 18.1, 2.81 }, - { 6, 1, 13.10, -25, 25, 4.1, 6.05 }, - { 6, 58, 35.90, -25, 24, 50.0, 5.59 }, - { 8, 45, 49.30, -25, 23, 15.0, 6.10 }, - { 7, 38, 18.00, -25, 21, 52.9, 4.70 }, - { 23, 49, 49.61, -25, 19, 53.0, 6.42 }, - { 15, 53, 36.70, -25, 19, 37.9, 4.59 }, - { 10, 3, 41.40, -25, 19, .1, 6.70 }, - { 15, 13, 28.70, -25, 18, 33.1, 6.45 }, - { 9, 37, .19, -25, 17, 48.1, 5.70 }, - { 15, 4, 4.20, -25, 16, 54.8, 3.29 }, - { 2, 59, 36.10, -25, 16, 27.1, 5.71 }, - { 20, 46, 5.69, -25, 16, 14.9, 4.14 }, - { 19, 15, 32.40, -25, 15, 24.1, 4.85 }, - { 18, 29, 22.01, -25, 15, 23.0, 6.59 }, - { 17, 12, 13.61, -25, 15, 16.9, 6.54 }, - { 15, 54, 39.50, -25, 14, 37.0, 5.87 }, - { 7, 9, 42.89, -25, 13, 52.0, 5.69 }, - { 7, 25, 25.30, -25, 13, 4.1, 5.78 }, - { 7, 1, 5.90, -25, 12, 55.1, 5.63 }, - { 2, 30, 13.80, -25, 11, 11.0, 6.51 }, - { 18, 19, 58.00, -25, 11, 3.0, }, - { 22, 13, 44.40, -25, 10, 50.9, 5.58 }, - { 23, 0, 5.81, -25, 9, 51.1, 5.65 }, - { 16, 30, 12.41, -25, 6, 54.0, 4.79 }, - { 20, 37, 52.10, -25, 6, 32.0, 6.36 }, - { 21, 41, 46.10, -25, 6, 6.8, 6.49 }, - { 16, 59, 57.60, -25, 5, 30.8, 5.86 }, - { 1, 45, 38.81, -25, 3, 9.0, 5.31 }, - { 1, 38, 49.99, -25, 1, 18.8, 6.70 }, - { 18, 44, 49.61, -25, 0, 40.0, 5.83 }, - { 14, 0, .10, -25, 0, 37.1, 5.77 }, - { 21, 7, 7.70, -25, 0, 20.9, 4.50 }, - { 17, 22, .60, -24, 59, 57.8, 3.27 }, - { 14, 43, 13.61, -24, 59, 51.0, 5.73 }, - { 17, 0, 9.50, -24, 59, 21.1, 5.75 }, - { 13, 58, 31.10, -24, 58, 19.9, 5.15 }, - { 7, 6, 52.30, -24, 57, 38.2, 6.08 }, - { 7, 18, 42.41, -24, 57, 15.1, 4.40 }, - { 20, 32, 52.39, -24, 56, 38.0, 6.36 }, - { 19, 0, 24.79, -24, 56, 31.9, 6.36 }, - { 18, 21, 31.39, -24, 54, 54.0, 6.25 }, - { 7, 49, 1.70, -24, 54, 43.9, 5.33 }, - { 4, 23, 5.71, -24, 53, 31.9, 5.83 }, - { 17, 54, 54.00, -24, 53, 13.9, 6.20 }, - { 19, 36, 42.41, -24, 53, 1.0, 4.60 }, - { 18, 58, 20.50, -24, 52, 36.1, 6.62 }, - { 7, 49, 17.71, -24, 51, 34.9, 3.34 }, - { 12, 47, 53.71, -24, 51, 6.1, 6.44 }, - { 19, 2, 27.70, -24, 50, 48.8, 5.65 }, - { 12, 23, 21.60, -24, 50, 26.2, 5.68 }, - { 15, 58, 34.80, -24, 49, 53.0, 5.43 }, - { 14, 24, 48.60, -24, 48, 23.0, 5.32 }, - { 0, 53, 12.41, -24, 46, 36.8, 6.46 }, - { 5, 21, 46.20, -24, 46, 23.2, 5.06 }, - { 0, 37, 20.71, -24, 46, 1.9, 5.57 }, - { 22, 23, 30.91, -24, 45, 45.0, 5.53 }, - { 23, 56, 29.90, -24, 44, 13.9, 6.31 }, - { 12, 8, 24.79, -24, 43, 44.0, 4.02 }, - { 16, 3, 54.70, -24, 43, 35.0, 6.21 }, - { 11, 39, .41, -24, 43, 16.0, 6.42 }, - { 19, 36, 1.70, -24, 43, 9.1, 5.65 }, - { 7, 33, 9.70, -24, 42, 38.9, 5.85 }, - { 9, 36, 33.70, -24, 42, 10.1, 6.53 }, - { 7, 44, 34.01, -24, 40, 26.0, 5.62 }, - { 19, 8, 14.59, -24, 39, 24.8, 6.30 }, - { 14, 54, 20.11, -24, 38, 31.9, 5.30 }, - { 6, 57, 33.91, -24, 37, 50.2, 5.46 }, - { 3, 53, 42.60, -24, 36, 45.0, 4.65 }, - { 8, 33, 4.80, -24, 36, 23.0, 6.19 }, - { 21, 32, 33.31, -24, 35, 26.2, 6.43 }, - { 2, 49, 51.00, -24, 33, 37.1, 6.14 }, - { 7, 18, 40.30, -24, 33, 32.0, 4.98 }, - { 6, 53, 55.30, -24, 32, 21.1, 6.21 }, - { 15, 53, 53.81, -24, 31, 59.2, 5.39 }, - { 7, 51, .00, -24, 31, 41.9, 6.45 }, - { 19, 25, 16.51, -24, 30, 31.0, 5.03 }, - { 15, 33, 9.10, -24, 29, 21.8, 7.00 }, - { 4, 40, 6.79, -24, 28, 57.0, 5.58 }, - { 16, 41, 36.19, -24, 28, 5.2, 6.09 }, - { 11, 29, 38.59, -24, 27, 47.9, 5.76 }, - { 16, 7, 51.89, -24, 27, 42.8, 6.33 }, - { 16, 13, 45.70, -24, 25, 18.8, 6.41 }, - { 13, 51, 20.40, -24, 23, 26.9, 6.45 }, - { 5, 3, 53.30, -24, 23, 16.1, 5.61 }, - { 14, 12, 24.50, -24, 21, 51.1, 6.34 }, - { 18, 3, 52.39, -24, 21, 38.2, 5.97 }, - { 2, 9, 34.80, -24, 20, 44.9, 6.48 }, - { 8, 7, 32.59, -24, 18, 15.1, 2.81 }, - { 17, 18, .70, -24, 17, 12.8, 5.20 }, - { 10, 4, 21.00, -24, 17, 8.2, 5.70 }, - { 17, 18, .50, -24, 17, 3.1, 6.80 }, - { 18, 2, 51.10, -24, 16, 55.9, 5.34 }, - { 14, 49, 18.70, -24, 15, 6.1, 5.68 }, - { 17, 25, 6.19, -24, 14, 37.0, 6.19 }, - { 23, 53, 20.81, -24, 13, 45.1, 6.24 }, - { 18, 34, 32.81, -24, 13, 21.0, 6.51 }, - { 6, 5, 45.70, -24, 11, 44.2, 6.95 }, - { 6, 54, 7.90, -24, 11, 2.0, 3.87 }, - { 19, 15, 33.19, -24, 10, 45.1, 6.25 }, - { 17, 26, 22.20, -24, 10, 31.1, 4.17 }, - { 16, 20, 38.21, -24, 10, 9.8, 4.55 }, - { 23, 41, 7.01, -24, 9, 37.1, 6.60 }, - { 0, 3, 7.70, -24, 8, 43.1, 6.44 }, - { 0, 49, 13.90, -24, 8, 11.0, 5.90 }, - { 3, 19, 34.80, -24, 7, 23.2, 5.61 }, - { 4, 26, 57.00, -24, 4, 53.0, 6.11 }, - { 6, 49, 43.99, -24, 4, 32.9, 6.33 }, - { 8, 25, 3.70, -24, 2, 46.0, 5.28 }, - { 7, 8, 49.30, -24, 2, 39.1, 6.65 }, - { 18, 33, 53.50, -24, 1, 57.0, 5.49 }, - { 3, 59, 55.51, -24, 0, 59.0, 4.66 }, - { 15, 13, 17.50, -24, 0, 29.9, 6.47 }, - { 0, 52, 40.61, -24, 0, 20.9, 5.46 }, - { 1, 7, 13.10, -23, 59, 47.0, 6.37 }, - { 1, 6, 7.70, -23, 59, 33.0, 6.14 }, - { 22, 35, 36.50, -23, 59, 28.0, 5.97 }, - { 15, 53, 55.80, -23, 58, 41.2, 5.42 }, - { 17, 31, 25.01, -23, 57, 46.1, 4.81 }, - { 19, 25, 29.69, -23, 57, 43.9, 5.43 }, - { 9, 59, 6.10, -23, 57, 1.1, 6.21 }, - { 19, 54, 17.71, -23, 56, 28.0, 6.18 }, - { 6, 54, 13.01, -23, 55, 41.9, 6.91 }, - { 9, 42, 14.40, -23, 54, 56.2, 4.94 }, - { 3, 47, 39.60, -23, 52, 28.9, 5.24 }, - { 6, 13, 45.10, -23, 51, 42.8, 6.39 }, - { 2, 57, 23.71, -23, 51, 42.8, 5.45 }, - { 7, 7, 22.61, -23, 50, 25.1, 5.71 }, - { 18, 41, 51.60, -23, 49, 59.9, 6.23 }, - { 7, 3, 1.49, -23, 49, 59.9, 3.02 }, - { 8, 55, 55.90, -23, 49, 5.9, 6.39 }, - { 15, 40, 16.90, -23, 49, 5.2, 4.96 }, - { 2, 22, 32.59, -23, 48, 59.0, 5.20 }, - { 17, 59, 47.59, -23, 48, 58.0, 4.76 }, - { 0, 40, 32.90, -23, 48, 15.8, 6.14 }, - { 0, 30, 22.70, -23, 47, 16.1, 5.19 }, - { 20, 53, 1.20, -23, 46, 59.2, 6.33 }, - { 7, 37, 16.80, -23, 46, 30.0, 6.37 }, - { 20, 40, 11.69, -23, 46, 26.0, 6.37 }, - { 10, 34, .91, -23, 44, 43.1, 5.08 }, - { 23, 6, 40.90, -23, 44, 35.2, 4.47 }, - { 7, 15, 47.50, -23, 44, 26.2, 6.32 }, - { 3, 10, 35.40, -23, 44, 17.9, 6.38 }, - { 7, 26, 40.70, -23, 42, 43.9, 6.56 }, - { 10, 21, 28.70, -23, 42, 38.9, 6.50 }, - { 18, 11, 43.39, -23, 42, 4.0, 4.98 }, - { 12, 30, 17.50, -23, 41, 48.1, 5.63 }, - { 6, 39, 36.31, -23, 41, 44.2, 6.05 }, - { 16, 8, 43.70, -23, 41, 8.2, 5.88 }, - { 22, 26, 10.70, -23, 40, 57.0, 6.29 }, - { 3, 21, 24.00, -23, 38, 7.1, 5.52 }, - { 3, 2, 23.50, -23, 37, 27.8, 4.09 }, - { 16, 6, 6.29, -23, 36, 23.0, 5.92 }, - { 2, 58, 5.71, -23, 36, 22.0, 5.84 }, - { 12, 11, 3.91, -23, 36, 9.0, 5.46 }, - { 9, 41, 16.99, -23, 35, 30.1, 4.77 }, - { 18, 38, 30.70, -23, 30, 18.0, 5.81 }, - { 7, 34, 19.10, -23, 28, 28.9, 5.87 }, - { 7, 34, 18.60, -23, 28, 25.0, 5.83 }, - { 6, 45, 23.30, -23, 27, 42.8, 6.05 }, - { 21, 35, 15.91, -23, 27, 15.1, 6.40 }, - { 13, 41, 30.91, -23, 26, 58.9, 6.59 }, - { 16, 25, 35.21, -23, 26, 49.9, 5.02 }, - { 16, 25, 35.11, -23, 26, 46.0, 5.92 }, - { 19, 40, 7.10, -23, 25, 43.0, 5.97 }, - { 19, 39, 49.39, -23, 25, 40.1, 6.34 }, - { 6, 31, 51.31, -23, 25, 5.9, 4.33 }, - { 12, 34, 23.21, -23, 23, 48.1, 2.65 }, - { 0, 49, 33.41, -23, 21, 42.1, 6.28 }, - { 12, 15, 46.99, -23, 21, 13.0, 6.54 }, - { 9, 29, 49.90, -23, 20, 43.1, 6.24 }, - { 7, 16, 36.79, -23, 18, 56.2, 4.79 }, - { 7, 59, 5.71, -23, 18, 38.2, 5.11 }, - { 13, 29, 42.79, -23, 16, 53.0, 4.97 }, - { 21, 42, .79, -23, 15, 46.1, 5.24 }, - { 3, 46, 50.90, -23, 14, 58.9, 4.23 }, - { 5, 56, 34.51, -23, 12, 56.2, 6.36 }, - { 9, 10, 22.99, -23, 10, 36.1, 6.53 }, - { 10, 34, 57.70, -23, 10, 34.0, 6.10 }, - { 18, 56, .60, -23, 10, 25.0, 5.93 }, - { 13, 18, 55.30, -23, 10, 18.1, 3.00 }, - { 8, 24, 55.10, -23, 9, 13.0, 5.68 }, - { 14, 46, 6.79, -23, 9, 11.2, 5.81 }, - { 15, 39, 21.29, -23, 9, 1.1, 6.34 }, - { 16, 56, 48.00, -23, 9, .0, 5.58 }, - { 15, 37, 48.10, -23, 8, 30.1, 5.78 }, - { 22, 16, 59.81, -23, 8, 24.0, 6.17 }, - { 13, 9, 3.29, -23, 7, 5.2, 4.95 }, - { 6, 6, 31.99, -23, 6, 38.2, 5.47 }, - { 0, 6, 50.11, -23, 6, 27.0, 6.18 }, - { 7, 26, 59.40, -23, 5, 10.0, 5.61 }, - { 8, 28, 35.90, -23, 4, 18.1, 6.51 }, - { 7, 29, 51.41, -23, 1, 27.8, 4.85 }, - { 13, 57, 27.70, -23, 1, 22.1, 6.14 }, - { 5, 49, 53.50, -22, 58, 18.1, 5.87 }, - { 4, 18, 37.39, -22, 58, 13.1, 6.07 }, - { 6, 35, 3.41, -22, 57, 52.9, 4.54 }, - { 6, 55, 46.80, -22, 56, 29.0, 5.30 }, - { 5, 51, 28.61, -22, 55, 34.0, 6.17 }, - { 8, 20, 27.41, -22, 55, 28.9, 6.13 }, - { 7, 24, 17.21, -22, 54, 46.1, 6.19 }, - { 7, 13, 48.29, -22, 54, 23.0, 6.36 }, - { 7, 56, 51.50, -22, 52, 48.0, 4.20 }, - { 9, 33, 26.21, -22, 51, 50.0, 5.91 }, - { 7, 27, 42.89, -22, 51, 34.9, 5.95 }, - { 7, 20, 53.21, -22, 51, 6.1, 6.61 }, - { 0, 36, 6.91, -22, 50, 33.0, 6.06 }, - { 5, 56, 14.30, -22, 50, 25.1, 5.96 }, - { 11, 11, 39.50, -22, 49, 32.9, 4.48 }, - { 5, 2, 44.90, -22, 47, 42.0, 5.75 }, - { 23, 1, 22.99, -22, 47, 26.9, 6.28 }, - { 18, 1, 54.41, -22, 46, 50.2, 5.77 }, - { 6, 9, 47.90, -22, 46, 27.1, 5.71 }, - { 12, 57, 33.19, -22, 45, 14.0, 6.31 }, - { 21, 24, 7.90, -22, 44, 48.8, 6.38 }, - { 18, 54, 10.20, -22, 44, 42.0, 4.83 }, - { 20, 1, 23.90, -22, 44, 13.9, 6.01 }, - { 18, 3, 1.70, -22, 43, 5.9, 6.74 }, - { 6, 17, 3.50, -22, 42, 54.0, 6.07 }, - { 19, 1, 37.80, -22, 41, 44.2, 6.24 }, - { 2, 29, 55.39, -22, 40, 58.1, 6.77 }, - { 7, 13, 23.90, -22, 40, 23.9, 6.01 }, - { 18, 55, 7.10, -22, 40, 17.0, 4.99 }, - { 21, 23, .50, -22, 40, 8.0, 5.60 }, - { 8, 39, 7.99, -22, 39, 42.8, 5.05 }, - { 16, 0, 19.99, -22, 37, 18.1, 2.32 }, - { 12, 10, 7.49, -22, 37, 10.9, 3.00 }, - { 6, 36, 40.90, -22, 36, 54.0, 6.35 }, - { 20, 3, 44.30, -22, 35, 44.2, 6.45 }, - { 2, 30, 32.81, -22, 32, 44.2, 6.10 }, - { 18, 58, 24.60, -22, 31, 45.8, 6.14 }, - { 10, 21, 36.00, -22, 31, 41.9, 6.51 }, - { 1, 56, 40.20, -22, 31, 36.8, 4.85 }, - { 0, 46, 11.81, -22, 31, 18.8, 5.50 }, - { 7, 47, 12.50, -22, 31, 10.9, 5.90 }, - { 3, 18, 22.10, -22, 30, 41.0, 4.88 }, - { 0, 7, 46.80, -22, 30, 32.0, 5.94 }, - { 9, 54, 31.70, -22, 29, 17.9, 6.24 }, - { 2, 47, 11.21, -22, 29, 8.2, 6.47 }, - { 17, 47, 45.60, -22, 28, 41.2, 6.18 }, - { 23, 9, 54.79, -22, 27, 27.0, 4.69 }, - { 6, 42, 45.79, -22, 26, 57.1, 6.13 }, - { 5, 44, 27.79, -22, 26, 53.9, 3.60 }, - { 6, 8, 57.89, -22, 25, 39.0, 5.50 }, - { 14, 3, 53.11, -22, 25, 18.1, 6.30 }, - { 5, 44, 26.50, -22, 25, 18.1, 6.15 }, - { 21, 26, 40.01, -22, 24, 41.0, 3.74 }, - { 19, 20, 38.11, -22, 24, 9.0, 5.58 }, - { 15, 16, 22.99, -22, 23, 57.8, 5.50 }, - { 18, 46, 20.59, -22, 23, 31.9, 5.37 }, - { 20, 29, 31.30, -22, 23, 30.1, 6.16 }, - { 2, 53, 35.30, -22, 22, 35.0, 5.95 }, - { 5, 42, 13.90, -22, 22, 25.0, 5.87 }, - { 5, 5, 27.70, -22, 22, 16.0, 3.19 }, - { 9, 27, 18.41, -22, 20, 38.0, 4.69 }, - { 7, 41, 23.59, -22, 20, 13.9, 6.18 }, - { 7, 34, 3.19, -22, 17, 46.0, 4.45 }, - { 12, 20, 33.70, -22, 12, 56.9, 5.21 }, - { 6, 57, 14.81, -22, 12, 11.9, 6.61 }, - { 12, 20, 10.70, -22, 10, 32.2, 5.97 }, - { 18, 50, 50.50, -22, 9, 43.9, 6.61 }, - { 7, 36, 7.80, -22, 9, 38.2, 6.34 }, - { 7, 0, 19.30, -22, 7, 9.8, 6.53 }, - { 17, 35, 18.50, -22, 2, 38.0, 6.57 }, - { 7, 4, 47.11, -22, 1, 55.9, 6.09 }, - { 15, 6, 27.10, -22, 1, 54.8, 6.17 }, - { 0, 44, 44.40, -22, 0, 22.0, 5.24 }, - { 7, 25, 19.90, -21, 58, 58.1, 6.05 }, - { 12, 0, 42.50, -21, 50, 13.9, 6.28 }, - { 6, 6, 57.60, -21, 48, 46.1, 5.78 }, - { 20, 18, 1.39, -21, 48, 36.0, 5.87 }, - { 21, 28, 43.39, -21, 48, 25.9, 4.51 }, - { 19, 26, 19.20, -21, 46, 36.1, 5.59 }, - { 3, 19, 31.01, -21, 45, 28.1, 3.69 }, - { 11, 12, 34.61, -21, 44, 57.1, 6.40 }, - { 19, 4, 40.99, -21, 44, 30.1, 3.77 }, - { 0, 48, 1.10, -21, 43, 21.0, 5.57 }, - { 18, 14, 15.91, -21, 42, 47.2, 5.44 }, - { 17, 43, 25.80, -21, 40, 59.9, 4.87 }, - { 19, 12, 28.01, -21, 39, 29.2, 6.41 }, - { 2, 46, 45.19, -21, 38, 22.9, 6.49 }, - { 3, 33, 47.30, -21, 37, 58.1, 4.27 }, - { 1, 29, 36.10, -21, 37, 45.8, 5.12 }, - { 6, 59, 39.29, -21, 36, 11.9, 6.26 }, - { 22, 21, 35.59, -21, 35, 53.9, 5.13 }, - { 17, 6, 11.81, -21, 33, 52.9, 6.30 }, - { 20, 46, 10.01, -21, 30, 51.1, 5.93 }, - { 17, 30, 41.70, -21, 29, 14.0, }, - { 16, 32, 8.21, -21, 27, 59.0, 4.45 }, - { 18, 7, 11.40, -21, 26, 38.0, 6.28 }, - { 17, 24, 42.00, -21, 26, 30.1, 5.85 }, - { 14, 57, 28.01, -21, 24, 56.2, 5.74 }, - { 18, 37, 54.41, -21, 23, 52.1, 5.94 }, - { 5, 27, 36.50, -21, 22, 32.2, 6.07 }, - { 23, 31, 42.10, -21, 22, 9.8, 6.29 }, - { 18, 54, .10, -21, 21, 34.9, 5.69 }, - { 14, 47, 13.70, -21, 19, 28.9, 6.06 }, - { 8, 16, 54.19, -21, 19, 13.1, 6.60 }, - { 19, 30, 54.00, -21, 18, 43.9, 6.13 }, - { 16, 16, 58.80, -21, 18, 14.0, 6.61 }, - { 4, 45, 4.20, -21, 17, 1.0, 5.72 }, - { 1, 38, 51.79, -21, 16, 31.1, 5.58 }, - { 5, 20, 26.90, -21, 14, 21.8, 4.71 }, - { 22, 11, 2.40, -21, 13, 57.0, 6.09 }, - { 21, 27, 14.81, -21, 11, 46.0, 5.78 }, - { 21, 8, 33.60, -21, 11, 37.0, 5.30 }, - { 21, 58, 43.80, -21, 10, 58.1, 6.12 }, - { 14, 46, 10.90, -21, 10, 34.0, 6.40 }, - { 7, 51, 42.89, -21, 10, 26.0, 5.63 }, - { 23, 9, 26.81, -21, 10, 21.0, 3.66 }, - { 8, 44, 55.20, -21, 10, 4.1, 6.11 }, - { 9, 33, 12.50, -21, 6, 56.9, 5.01 }, - { 17, 21, .19, -21, 6, 46.1, 4.39 }, - { 16, 14, 28.80, -21, 6, 27.0, 6.41 }, - { 18, 57, 43.80, -21, 6, 24.1, 3.51 }, - { 2, 0, .29, -21, 4, 40.1, 4.00 }, - { 22, 14, 18.00, -21, 4, 27.1, 5.32 }, - { 18, 13, 45.79, -21, 3, 32.0, 3.86 }, - { 18, 38, 53.40, -21, 3, 6.8, 5.86 }, - { 8, 49, 44.90, -21, 2, 55.0, 6.47 }, - { 8, 25, 19.10, -21, 2, 44.9, 6.01 }, - { 19, 9, 45.79, -21, 1, 25.0, 2.89 }, - { 15, 38, 16.30, -21, 0, 58.0, 5.84 }, - { 6, 47, 1.49, -21, 0, 56.2, 6.08 }, - { 2, 51, 2.30, -21, 0, 15.1, 4.75 }, - { 18, 45, 18.70, -21, 0, 5.0, 6.36 }, - { 2, 13, .89, -21, 0, 1.1, 5.86 }, - { 15, 57, 40.39, -20, 58, 59.2, 5.85 }, - { 8, 28, 53.30, -20, 57, 1.1, 6.67 }, - { 6, 18, 58.99, -20, 55, 34.0, 5.81 }, - { 6, 33, 26.59, -20, 55, 26.0, 6.40 }, - { 23, 33, 16.61, -20, 54, 51.8, 4.71 }, - { 3, 48, 35.81, -20, 54, 11.2, 5.81 }, - { 7, 11, 41.59, -20, 52, 59.2, 5.84 }, - { 5, 51, 19.30, -20, 52, 45.1, 3.81 }, - { 23, 2, 44.30, -20, 52, 14.2, 5.97 }, - { 16, 7, 24.31, -20, 52, 7.0, 4.32 }, - { 5, 31, 7.61, -20, 51, 49.0, 5.55 }, - { 21, 24, 9.60, -20, 51, 6.8, 5.41 }, - { 12, 14, 59.59, -20, 50, 39.1, 5.83 }, - { 8, 27, 33.29, -20, 50, 38.0, 6.56 }, - { 18, 35, 21.29, -20, 50, 26.9, 6.48 }, - { 1, 59, 46.10, -20, 49, 27.8, 5.41 }, - { 11, 31, 47.59, -20, 46, 36.1, 6.24 }, - { 5, 28, 14.69, -20, 45, 33.8, 2.84 }, - { 9, 29, 12.60, -20, 44, 55.0, 5.66 }, - { 15, 30, 36.29, -20, 43, 41.9, 6.22 }, - { 18, 15, 12.89, -20, 43, 41.9, 5.38 }, - { 4, 18, 15.91, -20, 42, 56.2, 6.00 }, - { 22, 34, 41.59, -20, 42, 29.9, 5.20 }, - { 10, 16, 45.60, -20, 40, 14.2, 6.57 }, - { 16, 6, 48.41, -20, 40, 9.1, 3.96 }, - { 10, 55, 11.59, -20, 39, 54.0, 6.44 }, - { 18, 57, 20.50, -20, 39, 23.0, 5.08 }, - { 21, 15, 37.90, -20, 39, 6.1, 5.24 }, - { 23, 26, 2.81, -20, 38, 30.8, 4.39 }, - { 4, 20, 39.00, -20, 38, 22.9, 5.38 }, - { 13, 3, 46.10, -20, 34, 59.2, 5.58 }, - { 21, 9, 33.00, -20, 33, 23.0, 6.25 }, - { 8, 7, 18.00, -20, 33, 16.9, 5.38 }, - { 18, 25, 21.00, -20, 32, 30.1, 4.81 }, - { 12, 35, 58.61, -20, 31, 37.9, 6.20 }, - { 4, 5, 46.70, -20, 30, 43.9, 6.34 }, - { 17, 4, 45.31, -20, 29, 40.9, 6.30 }, - { 14, 34, 50.69, -20, 26, 21.1, 6.50 }, - { 16, 53, 25.20, -20, 24, 56.2, 5.88 }, - { 16, 40, 34.51, -20, 24, 31.0, 6.26 }, - { 6, 55, 2.71, -20, 24, 16.9, 5.74 }, - { 18, 15, 12.89, -20, 23, 17.2, 5.95 }, - { 4, 4, 40.99, -20, 22, 54.1, 6.13 }, - { 8, 8, 43.51, -20, 21, 47.2, 6.36 }, - { 4, 11, 36.19, -20, 21, 22.0, 5.79 }, - { 18, 0, .10, -20, 20, 21.1, 6.21 }, - { 0, 28, 21.10, -20, 20, 6.0, 6.43 }, - { 18, 49, 40.10, -20, 19, 28.9, 5.24 }, - { 11, 42, 3.50, -20, 17, 38.0, 6.22 }, - { 6, 15, 8.40, -20, 16, 19.9, 5.91 }, - { 6, 53, 32.90, -20, 13, 27.1, 4.83 }, - { 16, 19, 7.70, -20, 13, 4.1, 6.29 }, - { 0, 16, 42.50, -20, 12, 38.2, 6.47 }, - { 7, 49, 45.19, -20, 12, 24.8, 6.56 }, - { 15, 53, 20.11, -20, 10, 1.9, 5.03 }, - { 15, 31, 43.39, -20, 9, 52.9, 6.22 }, - { 7, 0, 8.11, -20, 9, 32.0, 6.31 }, - { 4, 3, 36.79, -20, 9, 29.9, 7.01 }, - { 4, 3, 24.70, -20, 8, 39.1, 6.46 }, - { 10, 53, 29.50, -20, 8, 20.0, 5.24 }, - { 6, 55, 37.39, -20, 8, 11.0, 4.68 }, - { 5, 44, 28.39, -20, 7, 35.0, 6.34 }, - { 23, 22, 58.20, -20, 6, 2.2, 3.97 }, - { 21, 34, 51.00, -20, 5, 3.8, 5.69 }, - { 8, 21, 21.19, -20, 4, 45.1, 5.58 }, - { 0, 21, 46.30, -20, 3, 28.1, 5.12 }, - { 5, 1, 25.61, -20, 3, 6.8, 4.91 }, - { 0, 2, 57.60, -20, 2, 46.0, 6.25 }, - { 2, 26, 35.21, -20, 2, 34.1, 5.88 }, - { 16, 24, 6.19, -20, 2, 15.0, 4.50 }, - { 2, 33, 40.20, -20, 0, 6.8, 6.21 }, - { 14, 25, 29.81, -19, 58, 10.9, 6.61 }, - { 6, 18, 13.70, -19, 58, .8, 5.52 }, - { 13, 15, 58.80, -19, 56, 35.2, 5.22 }, - { 13, 14, 10.90, -19, 55, 50.9, 5.33 }, - { 16, 41, 53.71, -19, 55, 27.8, 5.57 }, - { 4, 35, .50, -19, 55, 14.2, 6.13 }, - { 13, 50, 34.51, -19, 53, 49.9, 6.53 }, - { 10, 22, 12.91, -19, 52, .8, 6.13 }, - { 21, 4, 24.31, -19, 51, 18.0, 4.84 }, - { 18, 11, 14.81, -19, 50, 31.9, 6.36 }, - { 16, 5, 26.21, -19, 48, 20.2, 2.62 }, - { 19, 9, 48.10, -19, 48, 13.0, 6.13 }, - { 16, 5, 26.50, -19, 48, 6.8, 4.92 }, - { 12, 33, 22.39, -19, 47, 30.8, 6.26 }, - { 15, 12, 13.30, -19, 47, 30.1, 4.54 }, - { 6, 23, 47.59, -19, 47, 7.1, 6.60 }, - { 19, 46, 21.70, -19, 45, 40.0, 4.86 }, - { 12, 41, 49.20, -19, 45, 31.0, 6.03 }, - { 9, 11, 58.70, -19, 44, 52.1, 5.73 }, - { 8, 38, 40.30, -19, 44, 12.8, 6.33 }, - { 8, 4, 41.50, -19, 43, 41.2, 6.13 }, - { 7, 36, 40.99, -19, 42, 7.9, 5.74 }, - { 5, 25, 59.81, -19, 41, 44.2, 5.89 }, - { 15, 41, 56.81, -19, 40, 44.0, 4.74 }, - { 4, 40, 26.50, -19, 40, 18.1, 4.32 }, - { 15, 32, 36.70, -19, 40, 14.2, 5.52 }, - { 7, 40, 13.61, -19, 39, 38.9, 5.93 }, - { 12, 0, 51.19, -19, 39, 32.0, 5.26 }, - { 15, 13, 19.20, -19, 38, 51.0, 6.08 }, - { 5, 53, 57.41, -19, 38, 17.9, 6.69 }, - { 21, 43, 13.49, -19, 37, 14.9, 6.22 }, - { 22, 47, 33.10, -19, 36, 47.9, 5.26 }, - { 18, 46, 1.20, -19, 36, 23.0, 6.42 }, - { 3, 41, 22.39, -19, 35, 4.9, 6.59 }, - { 9, 35, 33.70, -19, 35, 1.0, 6.31 }, - { 8, 31, 30.91, -19, 34, 39.0, 5.42 }, - { 16, 57, 4.01, -19, 32, 24.0, 6.27 }, - { 7, 50, 5.71, -19, 31, 25.0, 6.12 }, - { 13, 21, 29.90, -19, 29, 20.0, 6.21 }, - { 21, 37, 4.80, -19, 27, 58.0, 4.68 }, - { 16, 11, 59.69, -19, 27, 38.2, 4.01 }, - { 4, 28, 39.00, -19, 27, 29.9, 5.96 }, - { 16, 11, 58.61, -19, 26, 58.9, 6.30 }, - { 7, 33, 19.51, -19, 24, 45.0, 5.66 }, - { 9, 32, 20.40, -19, 24, 1.1, 5.74 }, - { 15, 55, .31, -19, 22, 59.2, 5.94 }, - { 17, 20, 34.20, -19, 19, 58.1, 6.52 }, - { 15, 38, 54.50, -19, 18, 6.8, 5.38 }, - { 19, 8, 16.70, -19, 17, 24.0, 5.54 }, - { 18, 42, 55.20, -19, 17, 2.0, 6.35 }, - { 7, 19, 1.99, -19, 16, 49.1, 6.09 }, - { 6, 36, 40.99, -19, 15, 20.9, 3.95 }, - { 19, 3, 3.79, -19, 14, 43.1, 6.05 }, - { 8, 9, 1.61, -19, 14, 42.0, 4.40 }, - { 19, 21, 37.10, -19, 14, 3.1, 6.26 }, - { 8, 59, 39.89, -19, 12, 29.2, 6.18 }, - { 6, 7, 41.59, -19, 9, 56.9, 5.31 }, - { 10, 12, 37.80, -19, 9, 13.0, 6.44 }, - { 21, 29, 59.59, -19, 8, 52.1, 6.57 }, - { 18, 49, 35.50, -19, 8, 31.9, 6.75 }, - { 18, 31, 53.30, -19, 7, 30.0, 6.68 }, - { 20, 19, 23.59, -19, 7, 7.0, 5.28 }, - { 19, 3, 7.01, -19, 6, 11.9, 6.37 }, - { 1, 22, 30.50, -19, 4, 53.0, 6.35 }, - { 0, 17, 32.59, -19, 3, 4.0, 6.45 }, - { 19, 52, 12.00, -19, 2, 42.0, 5.92 }, - { 20, 59, 36.10, -19, 2, 7.1, 6.25 }, - { 6, 53, 18.79, -19, 1, 58.1, 5.64 }, - { 7, 22, 13.51, -19, 1, .1, 4.96 }, - { 7, 24, 50.71, -19, 0, 43.9, 6.24 }, - { 9, 54, 52.20, -19, 0, 33.8, 4.94 }, - { 19, 17, 38.11, -18, 57, 11.2, 4.96 }, - { 6, 53, 21.70, -18, 55, 59.9, 6.14 }, - { 0, 14, 38.40, -18, 55, 58.1, 4.44 }, - { 23, 51, 21.29, -18, 54, 32.0, 5.18 }, - { 17, 1, 51.19, -18, 53, 8.2, 6.26 }, - { 21, 42, 39.50, -18, 51, 59.0, 4.73 }, - { 18, 21, 23.11, -18, 51, 36.0, 5.75 }, - { 19, 36, 26.11, -18, 51, 10.1, 6.11 }, - { 22, 43, 35.30, -18, 49, 49.1, 4.69 }, - { 13, 13, 26.81, -18, 49, 36.1, 6.28 }, - { 17, 55, 55.01, -18, 48, 7.9, 6.52 }, - { 11, 23, 21.89, -18, 46, 48.0, 5.09 }, - { 19, 7, 8.50, -18, 44, 16.1, 6.29 }, - { 18, 30, 11.90, -18, 43, 44.0, 5.66 }, - { 13, 32, 2.81, -18, 43, 44.0, 6.01 }, - { 14, 18, 38.30, -18, 42, 58.0, 5.90 }, - { 23, 24, 7.80, -18, 41, 15.0, 6.19 }, - { 7, 10, 9.29, -18, 41, 7.1, 6.23 }, - { 7, 39, 7.10, -18, 40, 45.1, 6.72 }, - { 23, 46, .91, -18, 40, 41.2, 5.29 }, - { 4, 44, 7.99, -18, 40, .1, 5.53 }, - { 18, 15, 30.79, -18, 39, 41.0, 6.07 }, - { 6, 36, 22.80, -18, 39, 36.0, 5.70 }, - { 21, 51, 41.81, -18, 37, 23.2, 6.16 }, - { 18, 18, 43.30, -18, 37, 9.8, 6.84 }, - { 18, 48, 45.31, -18, 36, 5.0, 6.47 }, - { 20, 29, 52.51, -18, 35, 12.1, 6.74 }, - { 14, 17, 3.79, -18, 35, 7.1, 6.22 }, - { 20, 29, 53.90, -18, 34, 59.9, 5.94 }, - { 2, 45, 6.19, -18, 34, 21.0, 4.47 }, - { 10, 35, 38.90, -18, 34, 9.1, 6.49 }, - { 18, 59, 26.81, -18, 34, .8, 6.37 }, - { 3, 18, 41.21, -18, 33, 34.9, 5.71 }, - { 5, 43, 21.60, -18, 33, 27.0, 5.73 }, - { 16, 14, 39.10, -18, 32, 7.1, 6.32 }, - { 5, 19, 17.50, -18, 31, 12.0, 6.36 }, - { 22, 8, 58.99, -18, 31, 10.9, 5.81 }, - { 5, 19, 18.29, -18, 30, 34.9, 6.54 }, - { 11, 12, 30.41, -18, 30, .0, 6.13 }, - { 6, 15, 17.50, -18, 28, 36.1, 5.99 }, - { 18, 17, 28.49, -18, 27, 47.9, 6.54 }, - { 16, 27, 1.39, -18, 27, 23.0, 4.42 }, - { 17, 24, 37.10, -18, 26, 44.9, 6.21 }, - { 3, 53, 13.01, -18, 26, 3.8, 6.22 }, - { 18, 31, 26.30, -18, 24, 10.1, 5.14 }, - { 7, 59, 52.01, -18, 23, 57.1, 4.61 }, - { 2, 22, 57.79, -18, 21, 15.8, 6.22 }, - { 11, 44, 45.79, -18, 21, 2.9, 4.73 }, - { 16, 9, 55.20, -18, 20, 26.9, 6.47 }, - { 9, 9, 4.30, -18, 19, 43.0, 5.73 }, - { 13, 18, 24.31, -18, 18, 41.0, 4.74 }, - { 19, 21, 50.90, -18, 18, 29.9, 5.87 }, - { 10, 59, 46.51, -18, 17, 56.0, 4.08 }, - { 23, 44, 12.10, -18, 16, 36.8, 5.24 }, - { 12, 38, 44.59, -18, 15, 1.1, 6.00 }, - { 8, 55, 12.41, -18, 14, 29.0, 5.75 }, - { 6, 37, 53.40, -18, 14, 15.0, 4.43 }, - { 19, 37, 3.31, -18, 13, 52.0, 5.64 }, - { 20, 27, 19.20, -18, 12, 42.1, 5.25 }, - { 14, 15, 24.10, -18, 12, 2.9, 5.43 }, - { 15, 20, 53.71, -18, 9, 31.0, 6.17 }, - { 20, 40, 3.00, -18, 8, 19.0, 5.10 }, - { 13, 49, 52.30, -18, 8, 3.1, 4.97 }, - { 5, 18, 50.40, -18, 7, 48.0, 5.96 }, - { 6, 9, 20.30, -18, 7, 34.0, 6.35 }, - { 10, 4, 2.90, -18, 6, 6.1, 5.86 }, - { 23, 19, 24.10, -18, 4, 31.1, 5.93 }, - { 0, 47, 43.30, -18, 3, 41.0, 5.70 }, - { 20, 49, 20.50, -18, 2, 8.9, 6.21 }, - { 23, 41, 34.49, -18, 1, 37.9, 5.34 }, - { 0, 43, 35.40, -17, 59, 12.1, 2.04 }, - { 21, 17, 57.29, -17, 59, 7.1, 5.43 }, - { 10, 21, 7.80, -17, 59, 6.0, 6.51 }, - { 6, 22, 42.00, -17, 57, 20.9, 1.98 }, - { 0, 12, 10.01, -17, 56, 17.9, 5.25 }, - { 20, 54, 47.90, -17, 55, 23.2, 5.78 }, - { 22, 2, 11.90, -17, 54, 13.0, 6.28 }, - { 7, 27, 7.99, -17, 51, 51.8, 5.63 }, - { 13, 47, 25.39, -17, 51, 36.0, 5.43 }, - { 5, 39, 16.30, -17, 50, 57.8, 6.38 }, - { 19, 21, 40.39, -17, 50, 49.9, 3.93 }, - { 5, 32, 43.80, -17, 49, 19.9, 2.58 }, - { 23, 41, 45.79, -17, 48, 59.0, 4.82 }, - { 20, 28, 51.60, -17, 48, 49.0, 4.78 }, - { 18, 27, 56.50, -17, 48, .0, 6.20 }, - { 2, 8, 45.70, -17, 46, 45.8, 6.10 }, - { 15, 14, 33.70, -17, 46, 7.0, 6.17 }, - { 6, 12, 46.30, -17, 45, 47.2, 6.52 }, - { 17, 19, 53.30, -17, 45, 23.0, 6.02 }, - { 16, 41, 34.39, -17, 44, 31.9, 4.96 }, - { 13, 23, 1.10, -17, 44, 7.1, 5.37 }, - { 11, 24, 52.90, -17, 41, 2.0, 4.08 }, - { 2, 22, 4.99, -17, 39, 43.9, 5.87 }, - { 17, 8, 14.90, -17, 36, 33.1, 5.99 }, - { 8, 21, 54.60, -17, 35, 11.0, 5.75 }, - { 0, 8, 33.41, -17, 34, 39.0, 6.06 }, - { 12, 15, 48.41, -17, 32, 30.8, 2.59 }, - { 5, 42, 14.30, -17, 31, 49.1, 6.15 }, - { 3, 36, 17.40, -17, 28, .8, 5.23 }, - { 6, 28, 37.30, -17, 27, 58.0, 5.77 }, - { 21, 18, 15.70, -17, 27, 43.9, 7.05 }, - { 21, 7, 44.59, -17, 27, 19.1, 6.17 }, - { 8, 25, 39.41, -17, 26, 21.8, 6.44 }, - { 0, 7, 18.19, -17, 23, 11.0, 6.19 }, - { 18, 17, 11.59, -17, 22, 26.0, 5.75 }, - { 21, 15, 6.60, -17, 20, 42.0, 6.04 }, - { 0, 3, 44.40, -17, 20, 10.0, 4.55 }, - { 10, 46, 52.01, -17, 17, 48.1, 5.42 }, - { 21, 5, 56.81, -17, 13, 58.1, 4.07 }, - { 7, 49, 41.21, -17, 13, 41.9, 5.18 }, - { 18, 1, 23.11, -17, 9, 24.8, 6.28 }, - { 18, 7, 48.41, -17, 9, 15.1, 5.52 }, - { 11, 56, .91, -17, 9, 2.9, 5.18 }, - { 5, 16, 48.10, -17, 8, 30.1, 6.56 }, - { 10, 7, 9.50, -17, 8, 30.1, 5.60 }, - { 6, 50, 21.89, -17, 5, 2.0, 5.79 }, - { 23, 5, 12.79, -17, 4, 45.1, 6.14 }, - { 6, 56, 8.21, -17, 3, 15.1, 4.37 }, - { 5, 24, 28.39, -16, 58, 34.0, 5.65 }, - { 22, 2, 26.59, -16, 57, 51.1, 6.37 }, - { 4, 47, 36.31, -16, 56, 3.8, 5.51 }, - { 1, 52, 52.10, -16, 55, 45.1, 5.80 }, - { 10, 38, 34.99, -16, 52, 36.1, 4.91 }, - { 6, 38, 35.40, -16, 52, 25.0, 6.03 }, - { 15, 32, 55.20, -16, 51, 10.1, 5.50 }, - { 21, 50, 13.10, -16, 50, 40.9, 6.38 }, - { 10, 26, 5.40, -16, 50, 11.0, 3.81 }, - { 21, 22, 14.81, -16, 50, 3.8, 4.28 }, - { 6, 17, 41.71, -16, 48, 56.9, 5.14 }, - { 16, 56, 1.80, -16, 48, 22.0, 6.37 }, - { 22, 26, 34.39, -16, 44, 33.0, 6.35 }, - { 22, 26, 34.20, -16, 44, 29.0, 6.57 }, - { 4, 55, 6.79, -16, 44, 26.2, 5.70 }, - { 15, 53, 49.51, -16, 43, 45.8, 4.15 }, - { 5, 41, 41.50, -16, 43, 32.2, 6.21 }, - { 15, 28, 15.41, -16, 42, 59.0, 5.64 }, - { 6, 45, 8.90, -16, 42, 58.0,-1.46 }, - { 8, 56, 34.10, -16, 42, 33.8, 5.96 }, - { 12, 17, 3.29, -16, 41, 37.0, 6.05 }, - { 21, 40, 5.50, -16, 39, 43.9, 3.68 }, - { 12, 27, 49.39, -16, 37, 54.8, 6.35 }, - { 11, 39, 50.40, -16, 37, 13.1, 6.19 }, - { 6, 16, 7.70, -16, 37, 4.1, 5.92 }, - { 16, 31, 8.30, -16, 36, 46.1, 4.28 }, - { 15, 30, 40.39, -16, 36, 33.8, 5.82 }, - { 4, 4, 8.71, -16, 35, 20.0, 6.39 }, - { 9, 51, 59.59, -16, 32, 4.9, 6.08 }, - { 16, 0, 19.61, -16, 31, 59.9, 5.47 }, - { 0, 4, 19.70, -16, 31, 44.0, 5.78 }, - { 20, 35, 32.21, -16, 31, 32.9, 6.19 }, - { 0, 40, 28.61, -16, 31, .8, 6.49 }, - { 12, 29, 51.89, -16, 30, 56.2, 2.95 }, - { 6, 4, 59.09, -16, 29, 3.8, 4.93 }, - { 0, 45, 41.69, -16, 25, 27.1, 6.47 }, - { 4, 55, 18.60, -16, 25, 4.1, 5.72 }, - { 7, 19, 28.10, -16, 23, 42.0, 5.70 }, - { 4, 9, 17.81, -16, 23, 8.9, 5.37 }, - { 18, 55, 31.01, -16, 22, 36.1, 5.79 }, - { 4, 59, 1.30, -16, 22, 32.9, 5.66 }, - { 10, 59, 30.91, -16, 21, 14.0, 5.89 }, - { 10, 36, 16.70, -16, 20, 39.8, 6.03 }, - { 14, 5, 13.99, -16, 20, 8.9, 6.56 }, - { 4, 48, 32.50, -16, 19, 45.8, 5.77 }, - { 17, 18, 19.20, -16, 18, 42.8, 6.43 }, - { 14, 10, 50.50, -16, 18, 6.8, 4.91 }, - { 19, 40, 43.39, -16, 17, 35.9, 6.20 }, - { 8, 17, 23.11, -16, 17, 6.0, 6.16 }, - { 11, 33, 14.59, -16, 16, 50.2, 6.05 }, - { 22, 54, 45.50, -16, 16, 18.8, 5.56 }, - { 15, 6, 37.61, -16, 15, 24.8, 5.20 }, - { 8, 9, 28.51, -16, 14, 56.0, 5.68 }, - { 5, 47, 7.61, -16, 14, 16.1, 6.17 }, - { 7, 9, 33.19, -16, 14, 4.9, 6.03 }, - { 19, 6, 52.30, -16, 13, 44.0, 6.03 }, - { 4, 50, 11.59, -16, 13, 1.9, 5.03 }, - { 5, 12, 55.90, -16, 12, 20.2, 3.31 }, - { 7, 24, 40.10, -16, 12, 4.0, 5.33 }, - { 13, 12, 3.50, -16, 11, 55.0, 5.04 }, - { 12, 32, 4.20, -16, 11, 46.0, 4.31 }, - { 10, 49, 37.49, -16, 11, 37.0, 3.11 }, - { 13, 44, 29.81, -16, 10, 45.1, 5.60 }, - { 8, 58, 43.90, -16, 7, 58.1, 5.86 }, - { 21, 47, 2.40, -16, 7, 37.9, 2.87 }, - { 20, 40, 32.50, -16, 7, 27.1, 5.80 }, - { 19, 42, 31.10, -16, 7, 26.0, 5.06 }, - { 14, 50, 52.70, -16, 2, 30.1, 2.75 }, - { 20, 57, 40.61, -16, 1, 54.1, 5.87 }, - { 3, 11, 16.80, -16, 1, 31.1, 6.26 }, - { 7, 47, 45.19, -16, 0, 51.8, 6.43 }, - { 14, 50, 41.21, -15, 59, 49.9, 5.15 }, - { 7, 47, 38.50, -15, 59, 26.9, 6.34 }, - { 13, 27, 27.19, -15, 58, 25.0, 4.76 }, - { 19, 21, 43.61, -15, 57, 18.0, 4.61 }, - { 8, 41, 43.30, -15, 56, 35.9, 4.88 }, - { 1, 44, 4.10, -15, 56, 15.0, 3.50 }, - { 11, 50, 19.51, -15, 51, 50.0, 6.13 }, - { 23, 49, 31.61, -15, 51, 40.0, 6.24 }, - { 23, 58, 21.19, -15, 50, 51.0, 6.26 }, - { 9, 19, 33.19, -15, 50, 3.8, 5.78 }, - { 18, 20, 8.81, -15, 49, 54.1, 5.39 }, - { 22, 54, 39.00, -15, 49, 14.9, 3.27 }, - { 17, 56, 19.01, -15, 48, 45.0, 5.89 }, - { 11, 0, 57.19, -15, 47, 34.1, 6.34 }, - { 8, 13, 19.99, -15, 47, 17.9, 4.99 }, - { 13, 45, 35.11, -15, 46, 3.0, 6.19 }, - { 20, 28, 43.61, -15, 44, 30.1, 6.41 }, - { 17, 10, 22.70, -15, 43, 28.9, 2.43 }, - { 1, 34, 37.80, -15, 40, 34.0, 5.63 }, - { 15, 44, 4.39, -15, 40, 22.1, 5.41 }, - { 16, 49, 27.79, -15, 40, 3.0, 6.10 }, - { 1, 24, 39.79, -15, 39, 37.1, 6.14 }, - { 19, 5, 41.21, -15, 39, 37.1, 5.97 }, - { 7, 3, 45.50, -15, 37, 59.9, 4.12 }, - { 9, 20, 55.49, -15, 37, 4.1, 6.33 }, - { 10, 8, 35.50, -15, 36, 42.1, 6.27 }, - { 18, 54, 43.10, -15, 36, 11.2, 5.10 }, - { 7, 16, 14.50, -15, 35, 8.9, 5.46 }, - { 9, 30, 22.61, -15, 34, 37.9, 5.85 }, - { 17, 37, 36.19, -15, 34, 16.0, 5.94 }, - { 15, 21, 1.39, -15, 32, 53.9, 6.30 }, - { 19, 19, .10, -15, 32, 11.0, 6.06 }, - { 19, 57, 57.00, -15, 29, 29.0, 5.02 }, - { 19, 43, 33.50, -15, 28, 12.0, 5.49 }, - { 0, 11, 15.91, -15, 28, 5.2, 4.89 }, - { 14, 45, 57.79, -15, 27, 34.9, 6.33 }, - { 23, 42, 27.89, -15, 26, 52.1, 5.28 }, - { 10, 53, 32.90, -15, 26, 44.2, 6.38 }, - { 1, 35, 58.99, -15, 24, 1.1, 5.42 }, - { 17, 37, 35.21, -15, 23, 55.0, 3.54 }, - { 13, 32, 51.70, -15, 21, 47.2, 5.55 }, - { 2, 26, .31, -15, 20, 28.0, 5.83 }, - { 12, 55, 53.30, -15, 19, 36.8, 6.17 }, - { 2, 2, 58.61, -15, 18, 20.9, 5.86 }, - { 23, 43, 49.49, -15, 17, 3.8, 6.36 }, - { 19, 1, 33.50, -15, 16, 57.0, 6.32 }, - { 7, 40, 23.21, -15, 15, 49.0, 4.94 }, - { 10, 47, 37.99, -15, 15, 42.8, 6.67 }, - { 23, 34, 49.39, -15, 14, 44.9, 5.96 }, - { 2, 32, 5.21, -15, 14, 40.9, 4.75 }, - { 3, 40, 11.40, -15, 13, 36.1, 6.33 }, - { 21, 15, 44.90, -15, 10, 17.0, 5.28 }, - { 6, 48, 57.79, -15, 8, 40.9, 5.39 }, - { 6, 23, 46.01, -15, 4, 18.1, 6.24 }, - { 20, 31, 4.30, -15, 3, 23.0, 6.12 }, - { 19, 26, 11.11, -15, 3, 11.2, 5.72 }, - { 15, 43, 24.89, -15, 2, 35.9, 6.31 }, - { 23, 22, 39.19, -15, 2, 21.1, 5.20 }, - { 8, 32, 33.29, -15, 1, 45.8, 6.38 }, - { 9, 15, 24.89, -15, 1, 28.9, 6.35 }, - { 6, 18, 48.79, -15, 1, 28.9, 6.06 }, - { 7, 29, 21.89, -14, 59, 57.1, 6.05 }, - { 0, 36, 3.00, -14, 58, 25.0, 6.45 }, - { 14, 4, 27.00, -14, 58, 18.1, 6.28 }, - { 20, 39, 16.39, -14, 57, 16.9, 5.22 }, - { 6, 6, 9.29, -14, 56, 7.1, 4.67 }, - { 8, 25, 55.61, -14, 55, 46.9, 5.98 }, - { 16, 48, 27.00, -14, 54, 33.8, 6.03 }, - { 16, 19, .41, -14, 52, 21.0, 5.94 }, - { 16, 58, 41.59, -14, 52, 10.9, 6.59 }, - { 18, 32, 43.30, -14, 51, 56.2, 5.50 }, - { 0, 29, 51.89, -14, 51, 51.1, 6.14 }, - { 18, 33, 39.00, -14, 51, 13.0, 5.76 }, - { 16, 15, 51.50, -14, 50, 57.1, 6.09 }, - { 9, 51, 28.70, -14, 50, 48.1, 4.12 }, - { 7, 52, 18.91, -14, 50, 47.0, 5.69 }, - { 15, 56, 33.41, -14, 49, 45.1, 6.13 }, - { 5, 46, 57.29, -14, 49, 18.8, 3.55 }, - { 4, 59, 36.50, -14, 48, 20.9, 7.71 }, - { 6, 45, 59.30, -14, 47, 46.0, 5.32 }, - { 15, 35, 31.61, -14, 47, 21.8, 3.91 }, - { 20, 20, 46.61, -14, 47, 6.0, 6.10 }, - { 20, 21, .70, -14, 46, 53.0, 3.08 }, - { 11, 19, 20.50, -14, 46, 43.0, 3.56 }, - { 21, 44, 1.01, -14, 44, 57.8, 5.99 }, - { 17, 47, 36.79, -14, 43, 32.9, 5.94 }, - { 7, 45, 29.09, -14, 41, 26.9, 6.07 }, - { 7, 45, 28.70, -14, 41, 10.0, 6.89 }, - { 0, 2, 7.30, -14, 40, 34.0, 7.10 }, - { 18, 32, 20.81, -14, 38, 39.1, 6.37 }, - { 5, 13, 59.90, -14, 36, 24.1, 6.21 }, - { 19, 53, 6.41, -14, 36, 11.2, 6.48 }, - { 1, 25, 37.20, -14, 35, 56.0, 4.90 }, - { 22, 30, 17.40, -14, 35, 8.9, 6.37 }, - { 6, 9, 34.30, -14, 35, 3.1, 5.56 }, - { 17, 15, 20.30, -14, 35, 2.0, 5.99 }, - { 18, 29, 46.80, -14, 34, 54.1, 5.96 }, - { 9, 17, 7.49, -14, 34, 25.0, 5.84 }, - { 18, 29, 11.90, -14, 33, 56.9, 4.70 }, - { 18, 41, 42.50, -14, 33, 51.1, 6.42 }, - { 7, 45, 56.90, -14, 33, 50.0, 5.04 }, - { 19, 26, 24.60, -14, 33, 4.0, 6.70 }, - { 16, 29, 46.90, -14, 33, 2.9, 5.68 }, - { 2, 41, 34.01, -14, 32, 57.8, 5.98 }, - { 23, 42, 43.30, -14, 32, 42.0, 4.49 }, - { 7, 33, 47.90, -14, 31, 26.0, 4.97 }, - { 23, 9, 49.61, -14, 30, 38.2, 6.42 }, - { 6, 2, 33.79, -14, 29, 49.9, 6.20 }, - { 7, 36, 3.91, -14, 29, 34.1, 5.70 }, - { 5, 49, 36.50, -14, 29, 1.0, 5.49 }, - { 20, 58, 41.90, -14, 28, 58.1, 6.01 }, - { 21, 11, 41.30, -14, 28, 19.9, 6.48 }, - { 11, 39, 51.10, -14, 28, 7.0, 6.21 }, - { 7, 37, 38.90, -14, 26, 28.0, 6.53 }, - { 6, 46, 51.10, -14, 25, 32.9, 5.29 }, - { 23, 50, 33.31, -14, 24, 6.8, 5.72 }, - { 21, 43, 4.39, -14, 23, 58.9, 5.88 }, - { 15, 56, 14.40, -14, 23, 57.8, 6.37 }, - { 5, 3, 52.01, -14, 22, 9.8, 6.41 }, - { 7, 20, 58.20, -14, 21, 36.0, 5.45 }, - { 4, 39, 19.70, -14, 21, 33.1, 5.45 }, - { 7, 33, 22.10, -14, 20, 17.9, 6.21 }, - { 9, 40, 18.41, -14, 19, 55.9, 5.06 }, - { 4, 38, 10.80, -14, 18, 14.0, 3.87 }, - { 19, 37, 34.39, -14, 18, 6.1, 5.47 }, - { 15, 58, 11.40, -14, 16, 45.8, 4.88 }, - { 23, 52, 30.00, -14, 15, 4.0, 5.87 }, - { 4, 57, 44.81, -14, 13, 53.0, 6.15 }, - { 23, 39, 47.11, -14, 13, 18.1, 5.00 }, - { 22, 12, 25.80, -14, 11, 38.0, 6.03 }, - { 5, 56, 24.29, -14, 10, 4.1, 3.71 }, - { 14, 49, 19.10, -14, 8, 56.0, 5.31 }, - { 6, 39, 16.70, -14, 8, 44.9, 4.82 }, - { 15, 51, 38.40, -14, 8, 1.0, 6.19 }, - { 11, 0, 11.59, -14, 4, 59.9, 5.88 }, - { 16, 7, 3.41, -14, 4, 14.9, 6.32 }, - { 22, 47, 42.79, -14, 3, 23.0, 5.66 }, - { 21, 41, 32.90, -14, 2, 51.0, 5.18 }, - { 6, 56, 6.60, -14, 2, 37.0, 5.00 }, - { 18, 38, 4.61, -14, 0, 16.9, 6.47 }, - { 10, 42, 31.30, -13, 58, 30.0, 6.24 }, - { 18, 9, 43.39, -13, 56, 3.8, 6.39 }, - { 5, 23, 30.19, -13, 55, 37.9, 5.25 }, - { 7, 51, 46.30, -13, 53, 53.2, 5.17 }, - { 19, 25, 21.60, -13, 53, 48.8, 5.69 }, - { 22, 6, 26.21, -13, 52, 10.9, 4.27 }, - { 12, 32, 36.00, -13, 51, 33.1, 5.74 }, - { 2, 44, 7.39, -13, 51, 31.0, 4.25 }, - { 8, 10, 39.79, -13, 47, 57.1, 5.54 }, - { 4, 49, 42.19, -13, 46, 10.9, 6.26 }, - { 10, 54, 17.81, -13, 45, 29.2, 5.66 }, - { 5, 21, 51.00, -13, 45, 22.0, 6.56 }, - { 7, 25, 8.30, -13, 45, 6.8, 5.78 }, - { 20, 34, 11.69, -13, 43, 16.0, 6.13 }, - { 6, 15, 44.90, -13, 43, 5.9, 5.01 }, - { 19, 48, 3.00, -13, 42, 11.9, 6.11 }, - { 4, 31, 25.90, -13, 38, 42.0, 6.21 }, - { 20, 1, 58.61, -13, 38, 12.8, 5.71 }, - { 22, 49, 35.50, -13, 35, 33.0, 4.01 }, - { 4, 30, 9.70, -13, 35, 31.9, 6.24 }, - { 10, 30, 59.81, -13, 35, 17.9, 5.58 }, - { 12, 20, 55.70, -13, 33, 56.2, 5.14 }, - { 0, 49, 25.61, -13, 33, 41.0, 5.59 }, - { 21, 53, 17.81, -13, 33, 6.1, 5.08 }, - { 8, 46, 22.51, -13, 32, 52.1, 4.32 }, - { 22, 24, 27.10, -13, 31, 45.8, 5.76 }, - { 5, 17, 40.20, -13, 31, 10.9, 5.50 }, - { 9, 32, 55.80, -13, 31, .8, 5.94 }, - { 17, 43, 48.60, -13, 30, 31.0, 6.39 }, - { 3, 58, 1.80, -13, 30, 31.0, 2.95 }, - { 23, 19, 6.70, -13, 27, 32.0, 5.08 }, - { 11, 3, 36.50, -13, 26, 3.8, 6.34 }, - { 12, 30, 4.80, -13, 23, 35.2, 6.35 }, - { 10, 37, 33.19, -13, 23, 3.8, 4.82 }, - { 14, 19, 6.60, -13, 22, 16.0, 4.52 }, - { 7, 49, 28.61, -13, 21, 11.9, 6.23 }, - { 6, 36, 46.70, -13, 19, 14.9, 5.97 }, - { 22, 19, .79, -13, 18, 18.0, 5.95 }, - { 21, 17, 13.49, -13, 16, 44.0, 6.40 }, - { 8, 52, 30.70, -13, 14, 1.0, 6.13 }, - { 13, 34, 40.49, -13, 12, 51.8, 5.91 }, - { 11, 38, 40.10, -13, 12, 6.8, 5.48 }, - { 5, 19, 34.51, -13, 10, 36.1, 4.29 }, - { 6, 30, 34.70, -13, 8, 53.2, 6.16 }, - { 5, 6, 36.70, -13, 7, 18.8, 6.05 }, - { 22, 59, 35.69, -13, 4, 14.9, 6.07 }, - { 10, 5, 7.49, -13, 3, 52.9, 4.60 }, - { 23, 37, 39.60, -13, 3, 37.1, 5.65 }, - { 1, 26, 51.60, -13, 3, 24.1, 5.66 }, - { 8, 22, 46.80, -13, 3, 16.9, 6.11 }, - { 4, 29, 6.89, -13, 2, 53.9, 5.60 }, - { 12, 41, 16.20, -13, 0, 54.0, 5.98 }, - { 12, 41, 16.01, -13, 0, 49.0, 6.08 }, - { 6, 37, 40.90, -12, 59, 6.0, 6.12 }, - { 6, 24, 20.50, -12, 57, 45.0, 6.12 }, - { 5, 13, 13.90, -12, 56, 29.0, 4.36 }, - { 8, 11, 16.30, -12, 55, 36.8, 4.72 }, - { 22, 30, 1.51, -12, 54, 54.0, 6.40 }, - { 6, 0, 17.71, -12, 53, 58.9, 6.22 }, - { 16, 59, 30.20, -12, 53, 27.0, }, - { 0, 45, 28.70, -12, 52, 50.9, 6.15 }, - { 21, 24, 11.50, -12, 52, 41.2, 5.49 }, - { 17, 41, 24.91, -12, 52, 31.1, 4.26 }, - { 17, 20, 49.70, -12, 50, 48.8, 4.33 }, - { 18, 59, 23.81, -12, 50, 26.2, 5.53 }, - { 14, 47, 54.89, -12, 50, 22.9, 6.35 }, - { 22, 16, 48.10, -12, 49, 53.0, 5.34 }, - { 12, 33, 34.30, -12, 49, 49.1, 5.58 }, - { 7, 51, 40.90, -12, 49, 9.8, 6.36 }, - { 10, 10, 5.90, -12, 48, 58.0, 5.31 }, - { 4, 4, 22.70, -12, 47, 33.0, 5.61 }, - { 2, 52, 32.11, -12, 46, 9.8, 6.04 }, - { 20, 20, 39.79, -12, 45, 33.1, 4.76 }, - { 16, 7, 36.41, -12, 44, 44.2, 5.78 }, - { 21, 49, 41.11, -12, 43, 23.2, 6.31 }, - { 13, 26, 43.20, -12, 42, 28.1, 5.25 }, - { 7, 46, 44.90, -12, 40, 31.1, 6.39 }, - { 3, 29, 36.00, -12, 40, 28.9, 5.59 }, - { 20, 5, 26.40, -12, 39, 55.1, 6.55 }, - { 8, 18, 23.90, -12, 37, 54.8, 5.98 }, - { 20, 12, 25.90, -12, 37, 3.0, 5.85 }, - { 0, 10, 42.79, -12, 34, 48.0, 5.85 }, - { 3, 59, 30.10, -12, 34, 27.1, 5.60 }, - { 20, 50, 41.81, -12, 32, 42.0, 5.88 }, - { 20, 18, 3.31, -12, 32, 40.9, 3.57 }, - { 4, 59, 55.80, -12, 32, 15.0, 4.79 }, - { 8, 26, 41.90, -12, 32, 3.8, 5.54 }, - { 10, 19, 16.80, -12, 31, 41.2, 6.00 }, - { 17, 27, 2.11, -12, 30, 45.0, 6.21 }, - { 20, 17, 38.90, -12, 30, 29.9, 4.24 }, - { 5, 7, 25.01, -12, 29, 26.2, 5.97 }, - { 8, 40, 1.51, -12, 28, 31.1, 4.98 }, - { 2, 47, 55.99, -12, 27, 38.2, 6.90 }, - { 10, 38, 50.40, -12, 26, 37.0, 6.04 }, - { 13, 45, 56.30, -12, 25, 36.1, 5.51 }, - { 7, 6, 35.90, -12, 23, 38.0, 6.48 }, - { 20, 11, 57.89, -12, 23, 33.0, 6.34 }, - { 6, 31, 22.99, -12, 23, 30.1, 5.15 }, - { 15, 23, 52.20, -12, 22, 9.8, 5.72 }, - { 9, 9, 11.50, -12, 21, 28.1, 5.77 }, - { 11, 27, 9.50, -12, 21, 24.1, 5.94 }, - { 10, 10, 35.30, -12, 21, 15.1, 3.61 }, - { 20, 16, 22.80, -12, 20, 12.8, 6.32 }, - { 5, 19, 59.09, -12, 18, 56.2, 5.30 }, - { 14, 36, 59.81, -12, 18, 19.1, 6.20 }, - { 2, 25, 57.00, -12, 17, 26.2, 4.89 }, - { 19, 13, 15.50, -12, 16, 57.0, 5.51 }, - { 19, 35, 33.60, -12, 15, 10.1, 6.27 }, - { 10, 36, 32.40, -12, 13, 49.1, 5.70 }, - { 0, 22, 51.79, -12, 12, 33.8, 6.39 }, - { 7, 47, 56.71, -12, 11, 35.2, 5.48 }, - { 11, 51, 21.89, -12, 11, 16.1, 6.35 }, - { 4, 38, 53.59, -12, 7, 23.2, 5.01 }, - { 3, 46, 8.50, -12, 6, 6.1, 4.42 }, - { 3, 55, 16.30, -12, 5, 57.1, 6.00 }, - { 10, 9, 56.50, -12, 5, 44.9, 6.24 }, - { 6, 54, 11.40, -12, 2, 19.0, 4.07 }, - { 18, 23, 12.19, -12, 0, 52.9, 5.73 }, - { 0, 43, 50.21, -12, 0, 42.1, 6.02 }, - { 9, 19, 46.39, -11, 58, 30.0, 4.79 }, - { 8, 42, 9.79, -11, 57, 58.0, 6.45 }, - { 23, 47, 15.91, -11, 54, 38.9, 5.73 }, - { 5, 27, 4.80, -11, 54, 2.9, 6.35 }, - { 14, 54, 22.90, -11, 53, 53.9, 5.80 }, - { 2, 39, 33.79, -11, 52, 19.9, 4.84 }, - { 5, 12, 17.90, -11, 52, 9.1, 4.45 }, - { 5, 11, 22.80, -11, 50, 57.1, 5.68 }, - { 16, 13, 50.90, -11, 50, 15.0, 5.22 }, - { 3, 41, 13.80, -11, 48, 11.2, 6.49 }, - { 16, 54, 40.30, -11, 47, 33.0, 6.57 }, - { 5, 37, 8.81, -11, 46, 32.2, 6.11 }, - { 5, 54, 43.61, -11, 46, 26.0, 5.66 }, - { 6, 21, 24.70, -11, 46, 23.9, 5.64 }, - { 10, 37, 11.59, -11, 44, 55.0, 6.52 }, - { 14, 23, 25.61, -11, 42, 51.1, 6.21 }, - { 23, 17, 40.01, -11, 42, 47.2, 6.34 }, - { 23, 41, 8.90, -11, 40, 50.2, 5.89 }, - { 14, 24, 40.90, -11, 40, 10.9, 6.49 }, - { 12, 54, 18.70, -11, 38, 55.0, 6.00 }, - { 22, 53, 28.70, -11, 37, .1, 5.80 }, - { 12, 25, 11.71, -11, 36, 37.1, 5.95 }, - { 20, 5, 5.40, -11, 35, 57.8, 6.34 }, - { 20, 53, 5.59, -11, 34, 25.0, 6.38 }, - { 21, 28, 13.90, -11, 34, 5.9, 6.61 }, - { 22, 10, 37.49, -11, 33, 54.0, 5.46 }, - { 7, 27, 51.70, -11, 33, 24.8, 5.79 }, - { 6, 24, 10.30, -11, 31, 49.1, 5.22 }, - { 23, 28, 5.21, -11, 26, 58.9, 6.37 }, - { 14, 56, 46.10, -11, 24, 34.9, 5.46 }, - { 0, 58, 43.90, -11, 22, 48.0, 5.61 }, - { 16, 4, 22.10, -11, 22, 23.2, 5.07 }, - { 16, 4, 22.10, -11, 22, 23.2, 4.77 }, - { 21, 9, 35.69, -11, 22, 18.1, 4.51 }, - { 21, 46, 32.11, -11, 21, 56.9, 5.58 }, - { 8, 8, 56.90, -11, 20, 22.9, 6.32 }, - { 1, 41, 44.71, -11, 19, 28.9, 5.75 }, - { 9, 19, 33.70, -11, 18, 51.1, 6.62 }, - { 11, 3, 14.90, -11, 18, 13.0, 5.50 }, - { 7, 6, 40.70, -11, 17, 39.1, 5.39 }, - { 3, 28, 1.01, -11, 17, 12.1, 5.73 }, - { 0, 56, 1.51, -11, 16, .1, 5.31 }, - { 7, 13, 7.20, -11, 15, 5.0, 5.78 }, - { 17, 34, 46.39, -11, 14, 30.8, 5.55 }, - { 1, 20, 27.79, -11, 14, 20.0, 6.15 }, - { 10, 16, 9.10, -11, 12, 11.9, 6.08 }, - { 3, 35, 57.70, -11, 11, 37.0, 5.57 }, - { 6, 6, 51.89, -11, 10, 25.0, 6.66 }, - { 6, 32, 46.90, -11, 9, 59.0, 6.24 }, - { 13, 25, 11.59, -11, 9, 41.0, 0.98 }, - { 14, 58, 13.39, -11, 9, 18.0, 6.60 }, - { 14, 58, 53.59, -11, 8, 39.1, 5.87 }, - { 7, 50, 55.20, -11, 7, 43.0, 6.16 }, - { 11, 5, 34.01, -11, 5, 20.0, 6.09 }, - { 8, 46, 6.89, -11, 0, 23.0, 6.25 }, - { 18, 35, 2.40, -10, 58, 37.9, 5.14 }, - { 16, 57, 26.09, -10, 57, 47.9, 6.19 }, - { 17, 38, 9.50, -10, 55, 35.0, 5.75 }, - { 22, 31, 41.30, -10, 54, 20.2, 6.38 }, - { 1, 27, 46.61, -10, 54, 6.1, 6.13 }, - { 17, 53, 3.60, -10, 53, 58.9, 6.18 }, - { 10, 8, 45.70, -10, 53, 4.9, 6.53 }, - { 19, 49, 2.21, -10, 52, 14.9, 6.04 }, - { 11, 24, 36.60, -10, 51, 33.8, 4.83 }, - { 18, 31, 25.70, -10, 47, 44.9, 5.72 }, - { 4, 33, 22.01, -10, 47, 8.9, 6.06 }, - { 16, 49, 49.99, -10, 46, 59.2, 4.65 }, - { 2, 22, 1.39, -10, 46, 40.1, 5.46 }, - { 9, 40, 20.11, -10, 46, 9.1, 6.37 }, - { 19, 50, 46.80, -10, 45, 49.0, 5.39 }, - { 13, 7, 53.81, -10, 44, 25.1, 5.19 }, - { 6, 17, 35.21, -10, 43, 31.1, 6.75 }, - { 17, 20, 52.70, -10, 41, 46.0, 6.46 }, - { 23, 14, 40.20, -10, 41, 19.0, 6.12 }, - { 1, 49, 35.09, -10, 41, 11.0, 4.67 }, - { 22, 30, 38.81, -10, 40, 41.2, 4.82 }, - { 7, 5, 49.70, -10, 39, 40.0, 6.49 }, - { 0, 50, 7.61, -10, 38, 39.8, 5.19 }, - { 0, 44, 11.40, -10, 36, 33.8, 4.76 }, - { 21, 14, 16.70, -10, 36, 19.1, 6.77 }, - { 6, 1, 50.40, -10, 35, 53.2, 4.95 }, - { 7, 15, 43.10, -10, 35, 2.0, 5.95 }, - { 10, 36, 17.40, -10, 34, 59.9, 6.57 }, - { 21, 39, 28.10, -10, 34, 36.8, 6.08 }, - { 9, 39, 47.40, -10, 34, 13.1, 6.31 }, - { 16, 37, 9.50, -10, 34, 1.9, 2.56 }, - { 19, 35, 7.30, -10, 33, 37.1, 5.12 }, - { 22, 48, 30.19, -10, 33, 20.2, 6.19 }, - { 9, 31, 38.90, -10, 33, 7.9, 6.14 }, - { 5, 47, 26.71, -10, 31, 59.2, 6.03 }, - { 17, 9, 48.00, -10, 31, 23.9, 5.56 }, - { 0, 4, 30.10, -10, 30, 33.8, 4.94 }, - { 3, 43, 33.79, -10, 29, 8.2, 5.60 }, - { 12, 0, 44.50, -10, 26, 46.0, 5.55 }, - { 3, 39, 25.39, -10, 26, 13.9, 6.19 }, - { 5, 40, 46.01, -10, 24, 33.8, 6.52 }, - { 9, 31, 55.80, -10, 22, 14.2, 6.13 }, - { 7, 9, 20.30, -10, 20, 49.9, 6.21 }, - { 12, 51, 22.90, -10, 20, 17.9, 6.41 }, - { 1, 51, 27.60, -10, 20, 6.0, 3.73 }, - { 14, 9, .60, -10, 20, 3.8, 6.47 }, - { 13, 9, 45.31, -10, 19, 45.8, 5.94 }, - { 5, 25, 1.61, -10, 19, 45.1, 5.61 }, - { 7, 29, 22.10, -10, 19, 36.1, 5.75 }, - { 15, 24, 11.90, -10, 19, 19.9, 4.94 }, - { 7, 14, 28.20, -10, 19, .1, 6.03 }, - { 11, 48, 23.50, -10, 18, 47.9, 6.26 }, - { 12, 15, 10.61, -10, 18, 45.0, 6.11 }, - { 21, 53, 36.00, -10, 18, 42.1, 6.59 }, - { 14, 12, 53.81, -10, 16, 25.0, 4.19 }, - { 4, 59, 50.40, -10, 15, 47.9, 5.38 }, - { 4, 14, 23.71, -10, 15, 23.0, 4.87 }, - { 6, 5, 27.00, -10, 14, 34.1, 5.87 }, - { 18, 23, 2.21, -10, 13, 7.0, 6.33 }, - { 1, 8, 35.40, -10, 10, 55.9, 3.45 }, - { 8, 19, 15.10, -10, 9, 56.9, 6.32 }, - { 13, 32, 58.10, -10, 9, 54.0, 5.21 }, - { 18, 46, 43.30, -10, 7, 30.0, 5.71 }, - { 7, 3, 57.29, -10, 7, 27.1, 6.45 }, - { 6, 46, 39.00, -10, 6, 25.9, 5.66 }, - { 6, 30, 11.30, -10, 4, 53.0, 5.93 }, - { 15, 34, 10.70, -10, 3, 51.8, 4.62 }, - { 16, 12, .00, -10, 3, 51.1, 4.94 }, - { 20, 8, 31.30, -10, 3, 46.1, 6.18 }, - { 2, 11, 22.20, -10, 3, 7.9, 6.01 }, - { 1, 5, 36.79, - 9, 58, 45.1, 6.12 }, - { 23, 50, 14.69, - 9, 58, 27.1, 5.94 }, - { 3, 1, 56.09, - 9, 57, 41.0, 5.83 }, - { 19, 59, 47.40, - 9, 57, 29.9, 5.88 }, - { 7, 14, 15.50, - 9, 56, 51.0, 5.90 }, - { 6, 23, 36.00, - 9, 52, 27.8, 6.19 }, - { 3, 34, 37.39, - 9, 52, 7.0, 6.25 }, - { 20, 32, 23.71, - 9, 51, 11.9, 5.65 }, - { 10, 49, 43.49, - 9, 51, 10.1, 5.86 }, - { 1, 6, 5.09, - 9, 50, 21.8, 5.58 }, - { 9, 22, 50.90, - 9, 50, 20.0, 6.53 }, - { 11, 36, 40.90, - 9, 48, 7.9, 4.70 }, - { 1, 7, 46.20, - 9, 47, 8.2, 5.82 }, - { 2, 58, 47.40, - 9, 46, 35.0, 6.14 }, - { 18, 50, 58.49, - 9, 46, 27.1, 5.83 }, - { 17, 59, 1.61, - 9, 46, 25.0, 3.34 }, - { 3, 43, 14.90, - 9, 45, 47.9, 3.54 }, - { 18, 17, 24.19, - 9, 45, 31.0, 6.31 }, - { 3, 56, 37.90, - 9, 45, 2.9, 6.19 }, - { 21, 25, 13.10, - 9, 44, 55.0, 5.70 }, - { 8, 28, 50.90, - 9, 44, 53.9, 6.00 }, - { 4, 35, 13.99, - 9, 44, 12.1, 6.37 }, - { 13, 47, 13.49, - 9, 42, 33.1, 6.05 }, - { 5, 39, 30.79, - 9, 42, 24.1, 6.50 }, - { 20, 56, 54.00, - 9, 41, 51.0, 5.51 }, - { 5, 47, 45.41, - 9, 40, 10.9, 2.06 }, - { 20, 23, .79, - 9, 39, 16.9, 6.30 }, - { 23, 18, 57.70, - 9, 36, 38.9, 4.98 }, - { 18, 53, 1.90, - 9, 34, 34.0, 6.34 }, - { 10, 3, 40.99, - 9, 34, 26.0, 6.12 }, - { 0, 14, 54.50, - 9, 34, 10.9, 5.75 }, - { 5, 59, 4.30, - 9, 33, 29.9, 5.03 }, - { 9, 20, 28.99, - 9, 33, 20.9, 4.80 }, - { 16, 39, 39.10, - 9, 33, 15.8, 6.35 }, - { 7, 41, 14.81, - 9, 33, 4.0, 3.93 }, - { 12, 54, 21.19, - 9, 32, 20.0, 4.79 }, - { 13, 9, 14.40, - 9, 32, 17.9, 6.32 }, - { 20, 47, 40.61, - 9, 29, 44.9, 3.77 }, - { 2, 15, 28.30, - 9, 27, 56.2, 6.55 }, - { 3, 32, 55.80, - 9, 27, 29.9, 3.73 }, - { 2, 40, 12.31, - 9, 27, 11.2, 5.78 }, - { 12, 33, 46.80, - 9, 27, 6.8, 5.48 }, - { 2, 52, 50.50, - 9, 26, 28.0, 6.32 }, - { 9, 37, 51.50, - 9, 25, 27.8, 6.40 }, - { 1, 37, 37.70, - 9, 24, 14.0, 6.24 }, - { 6, 18, 50.59, - 9, 23, 25.1, 5.36 }, - { 15, 17, .41, - 9, 22, 59.2, 2.61 }, - { 5, 59, 1.01, - 9, 22, 55.9, 6.12 }, - { 21, 10, 46.90, - 9, 21, 14.0, 6.27 }, - { 21, 22, 56.30, - 9, 19, 9.8, 5.99 }, - { 14, 6, 42.79, - 9, 18, 47.9, 5.46 }, - { 21, 46, 16.30, - 9, 16, 32.9, 6.00 }, - { 23, 29, .60, - 9, 15, 58.0, 6.18 }, - { 8, 6, 27.50, - 9, 14, 42.0, 6.23 }, - { 9, 27, 14.59, - 9, 13, 25.0, 6.54 }, - { 7, 0, 39.29, - 9, 12, 11.2, 6.49 }, - { 7, 50, 10.61, - 9, 10, 59.9, 5.61 }, - { 15, 34, 26.59, - 9, 10, 59.9, 5.17 }, - { 23, 17, 54.19, - 9, 10, 57.0, 4.39 }, - { 6, 41, 56.40, - 9, 10, 1.9, 5.19 }, - { 3, 16, 35.71, - 9, 9, 15.8, 6.14 }, - { 23, 15, 53.50, - 9, 5, 16.1, 4.21 }, - { 21, 45, .31, - 9, 4, 57.0, 5.09 }, - { 10, 19, 59.40, - 9, 3, 32.0, 6.32 }, - { 18, 42, 16.39, - 9, 3, 9.0, 4.72 }, - { 8, 41, 1.61, - 9, 3, 6.8, 6.63 }, - { 5, 52, 7.61, - 9, 2, 29.0, 5.97 }, - { 22, 16, 52.61, - 9, 2, 24.0, 5.79 }, - { 6, 15, 25.99, - 9, 2, 7.1, 6.10 }, - { 1, 33, 3.50, - 9, 0, 52.9, 6.59 }, - { 6, 47, 37.10, - 8, 59, 53.9, 5.07 }, - { 23, 52, 50.50, - 8, 59, 48.1, 5.75 }, - { 13, 8, 32.50, - 8, 59, 3.8, 5.55 }, - { 20, 52, 39.19, - 8, 58, 59.9, 4.73 }, - { 7, 22, 1.99, - 8, 58, 45.1, 6.43 }, - { 4, 34, 11.71, - 8, 58, 13.1, 5.26 }, - { 18, 23, 39.50, - 8, 56, 3.1, 4.68 }, - { 1, 10, 12.00, - 8, 54, 22.0, 6.40 }, - { 2, 56, 25.70, - 8, 53, 53.2, 3.89 }, - { 10, 50, 18.10, - 8, 53, 52.1, 5.79 }, - { 7, 32, 5.81, - 8, 52, 50.9, 5.90 }, - { 7, 21, 16.90, - 8, 52, 41.9, 6.55 }, - { 4, 5, 56.50, - 8, 51, 22.0, 6.26 }, - { 20, 11, 10.10, - 8, 50, 31.9, 6.49 }, - { 0, 8, 17.40, - 8, 49, 26.0, 5.99 }, - { 0, 19, 25.70, - 8, 49, 26.0, 3.56 }, - { 4, 10, 47.69, - 8, 49, 10.9, 5.70 }, - { 3, 15, 49.99, - 8, 49, 10.9, 4.80 }, - { 8, 28, 19.70, - 8, 48, 58.0, 6.43 }, - { 4, 43, 35.09, - 8, 47, 46.0, 6.70 }, - { 15, 38, 40.01, - 8, 47, 39.8, 6.50 }, - { 4, 43, 34.61, - 8, 47, 37.0, 6.82 }, - { 15, 38, 40.10, - 8, 47, 28.0, 6.48 }, - { 9, 9, 35.50, - 8, 47, 16.1, 5.46 }, - { 5, 9, 8.81, - 8, 45, 15.1, 4.27 }, - { 9, 16, 41.30, - 8, 44, 40.9, 5.47 }, - { 0, 54, 17.59, - 8, 44, 26.9, 6.16 }, - { 13, 41, 36.79, - 8, 42, 11.2, 5.01 }, - { 5, 8, 20.21, - 8, 39, 54.0, 5.78 }, - { 9, 27, 35.21, - 8, 39, 31.0, 1.98 }, - { 9, 8, 42.19, - 8, 35, 21.8, 5.60 }, - { 6, 19, 7.90, - 8, 35, 11.0, 6.22 }, - { 19, 54, 8.21, - 8, 34, 27.1, 5.79 }, - { 16, 12, 7.30, - 8, 32, 51.0, 5.43 }, - { 2, 0, 26.90, - 8, 31, 25.0, 5.51 }, - { 15, 0, 58.39, - 8, 31, 8.0, 4.92 }, - { 9, 33, 2.09, - 8, 30, 19.1, 6.12 }, - { 4, 44, 5.30, - 8, 30, 13.0, 5.90 }, - { 10, 10, 55.80, - 8, 25, 5.9, 5.65 }, - { 5, 23, 18.50, - 8, 24, 56.9, 5.90 }, - { 16, 0, 47.59, - 8, 24, 41.0, 5.55 }, - { 10, 10, 7.49, - 8, 24, 29.9, 5.91 }, - { 7, 0, 23.69, - 8, 24, 24.8, 5.96 }, - { 16, 27, 48.10, - 8, 22, 18.1, 4.63 }, - { 16, 15, 37.30, - 8, 22, 9.8, 5.50 }, - { 18, 6, 7.39, - 8, 19, 26.0, 5.85 }, - { 22, 43, 3.50, - 8, 18, 42.1, 6.45 }, - { 7, 36, 16.61, - 8, 18, 41.0, 6.27 }, - { 18, 43, 31.30, - 8, 16, 31.1, 4.90 }, - { 18, 35, 12.41, - 8, 14, 39.1, 3.85 }, - { 19, 54, 38.11, - 8, 14, 13.9, 6.49 }, - { 4, 34, 11.59, - 8, 13, 53.0, 5.11 }, - { 19, 54, 37.61, - 8, 13, 37.9, 5.71 }, - { 17, 28, 2.30, - 8, 12, 29.9, 6.37 }, - { 5, 14, 32.30, - 8, 12, 6.1, 0.12 }, - { 19, 22, 20.69, - 8, 12, 4.0, 6.31 }, - { 7, 40, 35.50, - 8, 11, 8.9, 6.01 }, - { 1, 24, 1.39, - 8, 10, 59.9, 3.60 }, - { 18, 3, 4.90, - 8, 10, 50.2, 5.24 }, - { 18, 3, 4.99, - 8, 10, 49.1, 5.94 }, - { 6, 57, .10, - 8, 10, 44.0, 6.34 }, - { 6, 31, 50.09, - 8, 9, 29.2, 5.43 }, - { 5, 13, 33.29, - 8, 8, 52.1, 6.37 }, - { 16, 28, 48.91, - 8, 7, 44.0, 6.48 }, - { 17, 37, 50.69, - 8, 7, 8.0, 4.62 }, - { 9, 52, 30.41, - 8, 6, 18.0, 5.05 }, - { 10, 17, 37.80, - 8, 4, 8.0, 5.24 }, - { 13, 54, 58.20, - 8, 3, 32.0, 6.19 }, - { 0, 18, 41.81, - 8, 3, 10.1, 6.46 }, - { 6, 50, 42.29, - 8, 2, 28.0, 6.29 }, - { 1, 24, 2.50, - 8, 0, 27.0, 6.21 }, - { 12, 39, 14.81, - 7, 59, 44.2, 4.66 }, - { 8, 35, 28.20, - 7, 58, 55.9, 5.72 }, - { 8, 55, 29.59, - 7, 58, 16.0, 6.67 }, - { 8, 55, 29.50, - 7, 58, 13.1, 6.91 }, - { 19, 12, 40.70, - 7, 56, 21.8, 5.34 }, - { 1, 14, 24.00, - 7, 55, 23.2, 5.13 }, - { 18, 50, 19.99, - 7, 54, 27.0, 6.80 }, - { 22, 38, 22.20, - 7, 53, 52.1, 6.23 }, - { 6, 25, 58.80, - 7, 53, 39.1, 6.40 }, - { 2, 34, 42.70, - 7, 51, 33.8, 5.75 }, - { 21, 37, 45.10, - 7, 51, 15.1, 4.69 }, - { 2, 36, .00, - 7, 49, 54.1, 5.53 }, - { 11, 32, 47.50, - 7, 49, 39.0, 5.95 }, - { 6, 19, 42.79, - 7, 49, 23.2, 5.27 }, - { 22, 20, 11.90, - 7, 49, 16.0, 5.37 }, - { 5, 23, 56.81, - 7, 48, 29.2, 4.14 }, - { 3, 23, 17.81, - 7, 47, 39.1, 6.20 }, - { 18, 40, .50, - 7, 47, 26.2, 5.84 }, - { 22, 16, 49.99, - 7, 46, 59.9, 4.16 }, - { 0, 14, 27.60, - 7, 46, 50.2, 5.12 }, - { 8, 11, 33.00, - 7, 46, 21.0, 5.36 }, - { 23, 16, 50.90, - 7, 43, 36.1, 5.06 }, - { 23, 5, 9.79, - 7, 41, 37.0, 5.43 }, - { 3, 2, 42.31, - 7, 41, 7.1, 5.32 }, - { 12, 2, 51.60, - 7, 41, 1.0, 6.22 }, - { 3, 1, 10.01, - 7, 39, 46.1, 5.75 }, - { 4, 15, 16.30, - 7, 39, 10.1, 4.43 }, - { 10, 30, 58.70, - 7, 38, 15.0, 6.20 }, - { 3, 4, 16.39, - 7, 36, 2.9, 5.26 }, - { 16, 27, 43.49, - 7, 35, 53.2, 5.23 }, - { 4, 20, 42.79, - 7, 35, 33.0, 5.85 }, - { 22, 52, 36.89, - 7, 34, 46.9, 3.74 }, - { 7, 29, 25.70, - 7, 33, 4.0, 5.86 }, - { 8, 22, 54.00, - 7, 32, 35.9, 5.96 }, - { 14, 18, .60, - 7, 32, 33.0, 6.47 }, - { 5, 51, 22.01, - 7, 31, 5.2, 5.35 }, - { 16, 30, 29.90, - 7, 30, 54.0, 6.50 }, - { 6, 26, 44.90, - 7, 30, 41.0, 6.27 }, - { 20, 4, 1.20, - 7, 28, 10.9, 6.72 }, - { 23, 35, 32.11, - 7, 27, 51.8, 6.39 }, - { 19, 35, 29.81, - 7, 27, 37.1, 6.34 }, - { 5, 30, 20.71, - 7, 26, 4.9, 6.33 }, - { 19, 23, 4.61, - 7, 24, 1.1, 6.32 }, - { 3, 38, 29.21, - 7, 23, 30.1, 5.85 }, - { 0, 55, 42.41, - 7, 20, 49.9, 5.85 }, - { 10, 11, 17.81, - 7, 19, .1, 6.25 }, - { 5, 31, 55.80, - 7, 18, 5.0, 4.62 }, - { 8, 43, 40.39, - 7, 14, 1.0, 4.62 }, - { 5, 38, 53.11, - 7, 12, 47.2, 4.80 }, - { 22, 54, 34.10, - 7, 12, 16.9, 6.19 }, - { 13, 33, .70, - 7, 11, 42.0, 6.68 }, - { 22, 23, 32.11, - 7, 11, 39.8, 5.93 }, - { 9, 33, 20.11, - 7, 11, 24.0, 6.24 }, - { 8, 51, 34.51, - 7, 10, 37.9, 5.54 }, - { 5, 1, 26.30, - 7, 10, 26.0, 4.81 }, - { 11, 16, 58.20, - 7, 8, 4.9, 6.14 }, - { 9, 12, 25.99, - 7, 6, 34.9, 6.11 }, - { 17, 43, 46.99, - 7, 4, 45.8, 6.30 }, - { 18, 24, 42.10, - 7, 4, 31.1, 6.31 }, - { 18, 42, 36.10, - 7, 4, 23.9, 6.15 }, - { 23, 1, 23.59, - 7, 3, 40.0, 6.21 }, - { 10, 25, 44.30, - 7, 3, 34.9, 5.57 }, - { 19, 29, 21.50, - 7, 2, 38.0, 6.61 }, - { 6, 28, 49.51, - 7, 2, 3.8, 5.40 }, - { 6, 28, 49.51, - 7, 2, 3.8, 5.60 }, - { 6, 28, 49.01, - 7, 1, 58.1, 4.60 }, - { 19, 36, 53.50, - 7, 1, 39.0, 4.95 }, - { 1, 33, 42.89, - 7, 1, 31.1, 5.76 }, - { 22, 43, 14.30, - 6, 57, 46.1, 6.41 }, - { 4, 10, 22.51, - 6, 55, 26.0, 5.44 }, - { 1, 24, 20.59, - 6, 54, 52.9, 5.91 }, - { 14, 28, 41.71, - 6, 54, 2.2, 5.42 }, - { 20, 53, 58.39, - 6, 53, 22.9, 6.44 }, - { 5, 17, 36.41, - 6, 50, 39.8, 3.60 }, - { 4, 34, 14.21, - 6, 50, 16.1, 6.09 }, - { 4, 11, 51.91, - 6, 50, 15.0, 4.04 }, - { 18, 43, 51.41, - 6, 49, 7.0, 6.31 }, - { 3, 29, 39.10, - 6, 48, 18.0, 5.99 }, - { 5, 42, 53.81, - 6, 47, 46.0, 6.02 }, - { 7, 46, 2.21, - 6, 46, 21.0, 5.49 }, - { 6, 11, 1.30, - 6, 45, 15.1, 6.15 }, - { 4, 33, 54.79, - 6, 44, 20.0, 5.72 }, - { 19, 55, 19.61, - 6, 44, 3.1, 6.51 }, - { 6, 4, 13.51, - 6, 42, 33.1, 5.21 }, - { 5, 31, 20.90, - 6, 42, 29.9, 6.22 }, - { 7, 17, 31.70, - 6, 40, 48.0, 6.29 }, - { 11, 43, 55.10, - 6, 40, 37.9, 6.07 }, - { 8, 38, 20.30, - 6, 39, 45.0, 6.51 }, - { 14, 16, 21.50, - 6, 37, 18.8, 6.44 }, - { 23, 2, 32.59, - 6, 34, 27.1, 6.15 }, - { 5, 38, 37.80, - 6, 34, 26.0, 5.96 }, - { 8, 48, 4.90, - 6, 33, 31.0, 6.09 }, - { 22, 31, 18.41, - 6, 33, 18.0, 6.14 }, - { 6, 11, 51.79, - 6, 33, 1.1, 5.05 }, - { 16, 38, 1.61, - 6, 32, 17.2, 6.09 }, - { 22, 3, 16.39, - 6, 31, 21.0, 5.54 }, - { 3, 2, 9.29, - 6, 29, 40.9, 6.19 }, - { 4, 17, 19.20, - 6, 28, 18.8, 5.94 }, - { 13, 30, 25.70, - 6, 28, 13.1, 6.09 }, - { 2, 16, 58.99, - 6, 25, 19.9, 5.51 }, - { 8, 27, 17.21, - 6, 24, 34.9, 6.59 }, - { 23, 48, 32.50, - 6, 22, 50.2, 6.07 }, - { 20, 20, 26.11, - 6, 21, 42.1, 6.63 }, - { 9, 16, 41.71, - 6, 21, 11.2, 5.24 }, - { 8, 2, 25.99, - 6, 20, 13.9, 6.33 }, - { 12, 47, 33.41, - 6, 18, 6.8, 6.26 }, - { 16, 5, 44.50, - 6, 17, 30.1, 6.53 }, - { 23, 31, 1.10, - 6, 17, 17.9, 6.39 }, - { 6, 14, 51.31, - 6, 16, 28.9, 3.98 }, - { 13, 31, 57.91, - 6, 15, 20.9, 4.69 }, - { 4, 20, 38.69, - 6, 14, 44.2, 6.27 }, - { 17, 16, 42.79, - 6, 14, 42.0, 6.09 }, - { 9, 51, 21.60, - 6, 10, 54.1, 6.42 }, - { 8, 22, 30.19, - 6, 10, 45.1, 6.15 }, - { 16, 54, 35.69, - 6, 9, 14.0, 5.25 }, - { 17, 52, 38.81, - 6, 8, 37.0, 6.21 }, - { 16, 5, 59.81, - 6, 8, 21.8, 6.41 }, - { 15, 46, 45.41, - 6, 7, 13.1, 6.24 }, - { 14, 27, 24.41, - 6, 7, 13.1, 6.17 }, - { 3, 6, 33.50, - 6, 5, 19.0, 5.27 }, - { 9, 27, 46.80, - 6, 4, 16.0, 5.38 }, - { 5, 36, 35.71, - 6, 3, 54.0, 5.72 }, - { 5, 12, 48.19, - 6, 3, 25.9, 5.91 }, - { 23, 14, 19.39, - 6, 2, 56.0, 4.22 }, - { 0, 1, 57.60, - 6, 0, 51.1, 4.41 }, - { 5, 35, .91, - 6, 0, 33.1, 5.67 }, - { 5, 35, 2.71, - 6, 0, 6.8, 4.78 }, - { 14, 16, .91, - 6, 0, 2.2, 4.08 }, - { 7, 22, 25.39, - 5, 58, 58.1, 5.82 }, - { 14, 14, 21.29, - 5, 56, 51.0, 6.36 }, - { 5, 37, 27.41, - 5, 56, 17.9, 6.05 }, - { 17, 29, 47.40, - 5, 55, 10.9, 6.37 }, - { 3, 16, .89, - 5, 55, 7.0, 6.17 }, - { 21, 47, 38.11, - 5, 55, 1.9, 6.17 }, - { 17, 19, 59.50, - 5, 55, 1.9, 6.32 }, - { 9, 34, 32.69, - 5, 54, 54.0, 5.56 }, - { 18, 49, 40.99, - 5, 54, 46.1, 5.99 }, - { 18, 33, 22.90, - 5, 54, 41.0, 6.36 }, - { 5, 35, 25.99, - 5, 54, 36.0, 2.77 }, - { 23, 20, 40.90, - 5, 54, 29.2, 6.17 }, - { 6, 32, 23.11, - 5, 52, 8.0, 5.60 }, - { 6, 54, 8.50, - 5, 51, 9.0, 6.41 }, - { 18, 57, 3.70, - 5, 50, 46.0, 4.83 }, - { 12, 36, 47.40, - 5, 49, 54.8, 5.87 }, - { 15, 21, 7.61, - 5, 49, 28.9, 5.54 }, - { 21, 4, 4.61, - 5, 49, 23.9, 7.31 }, - { 21, 4, 4.70, - 5, 49, 23.2, 5.89 }, - { 7, 25, 51.00, - 5, 46, 30.0, 5.97 }, - { 5, 0, 49.01, - 5, 45, 11.9, 6.22 }, - { 17, 33, 29.90, - 5, 44, 40.9, 5.62 }, - { 19, 1, 40.80, - 5, 44, 20.0, 4.02 }, - { 1, 45, 59.30, - 5, 43, 59.9, 5.34 }, - { 18, 30, 14.30, - 5, 43, 27.1, 6.28 }, - { 7, 1, 56.40, - 5, 43, 19.9, 5.20 }, - { 6, 9, 36.19, - 5, 42, 40.0, 6.17 }, - { 0, 5, 20.11, - 5, 42, 27.0, 4.61 }, - { 18, 47, 28.99, - 5, 42, 18.0, 5.20 }, - { 15, 34, 20.81, - 5, 41, 42.0, 6.51 }, - { 19, 4, 24.19, - 5, 41, 6.0, 6.90 }, - { 4, 48, 36.31, - 5, 40, 26.0, 5.78 }, - { 14, 43, 3.60, - 5, 39, 29.9, 3.88 }, - { 5, 36, 15.00, - 5, 38, 53.2, 6.54 }, - { 20, 51, 25.70, - 5, 37, 35.0, 5.99 }, - { 3, 39, 1.10, - 5, 37, 34.0, 5.96 }, - { 21, 31, 33.50, - 5, 34, 16.0, 2.91 }, - { 13, 9, 57.00, - 5, 32, 20.0, 4.38 }, - { 5, 26, 2.40, - 5, 31, 5.9, 6.23 }, - { 20, 52, 8.71, - 5, 30, 24.8, 5.55 }, - { 15, 14, 50.69, - 5, 30, 10.1, 6.28 }, - { 13, 43, 54.31, - 5, 29, 56.0, 6.51 }, - { 3, 58, 52.30, - 5, 28, 12.0, 5.83 }, - { 4, 52, 53.69, - 5, 27, 10.1, 4.39 }, - { 8, 54, 17.90, - 5, 26, 3.8, 6.00 }, - { 7, 52, 47.90, - 5, 25, 41.2, 5.76 }, - { 21, 58, 13.30, - 5, 25, 28.9, 6.33 }, - { 5, 35, 22.90, - 5, 24, 58.0, 5.08 }, - { 19, 20, 32.90, - 5, 24, 56.9, 5.01 }, - { 13, 35, 31.30, - 5, 23, 46.0, 5.73 }, - { 5, 35, 16.49, - 5, 23, 22.9, 5.13 }, - { 5, 35, 17.30, - 5, 23, 16.1, 6.70 }, - { 22, 17, 6.50, - 5, 23, 13.9, 5.75 }, - { 5, 35, 15.91, - 5, 23, 13.9, 6.73 }, - { 5, 35, 16.10, - 5, 23, 7.1, 7.96 }, - { 14, 4, 14.59, - 5, 22, 53.0, 6.39 }, - { 7, 0, 18.00, - 5, 22, .8, 6.30 }, - { 5, 20, 26.40, - 5, 22, .1, 6.39 }, - { 3, 52, 41.59, - 5, 21, 41.0, 5.48 }, - { 18, 2, 46.30, - 5, 21, 31.0, 6.76 }, - { 11, 51, 2.21, - 5, 19, 59.9, 5.64 }, - { 8, 20, 17.11, - 5, 19, 45.1, 6.13 }, - { 7, 4, 5.21, - 5, 19, 25.0, 5.62 }, - { 6, 52, 22.90, - 5, 18, 58.0, 6.30 }, - { 0, 10, 18.79, - 5, 14, 55.0, 5.84 }, - { 7, 30, 51.10, - 5, 13, 35.0, 6.24 }, - { 6, 36, 35.30, - 5, 12, 40.0, 5.52 }, - { 3, 40, 38.30, - 5, 12, 38.2, 5.53 }, - { 4, 56, 24.19, - 5, 10, 17.0, 5.51 }, - { 13, 24, 33.19, - 5, 9, 50.0, 5.75 }, - { 23, 19, 24.00, - 5, 7, 27.8, 5.55 }, - { 9, 25, 24.00, - 5, 7, 3.0, 5.59 }, - { 10, 19, 32.21, - 5, 6, 20.9, 6.37 }, - { 17, 26, 37.90, - 5, 5, 12.1, 4.54 }, - { 5, 7, 51.00, - 5, 5, 11.0, 2.79 }, - { 3, 30, 37.10, - 5, 4, 31.1, 4.73 }, - { 12, 31, 38.71, - 5, 3, 9.0, 6.19 }, - { 20, 47, 44.21, - 5, 1, 40.1, 4.42 }, - { 14, 58, 52.80, - 4, 59, 21.1, 6.09 }, - { 22, 55, 10.99, - 4, 59, 16.1, 5.72 }, - { 8, 37, 27.10, - 4, 56, 1.0, 6.19 }, - { 13, 23, 18.91, - 4, 55, 27.8, 5.89 }, - { 6, 15, 29.69, - 4, 54, 55.1, 5.99 }, - { 19, 25, 1.61, - 4, 53, 3.1, 6.52 }, - { 19, 6, 14.90, - 4, 52, 57.0, 3.44 }, - { 5, 35, 39.50, - 4, 51, 20.9, 5.26 }, - { 5, 35, 23.21, - 4, 50, 17.9, 4.59 }, - { 22, 24, 6.89, - 4, 50, 12.8, 5.78 }, - { 1, 3, 2.59, - 4, 50, 12.1, 5.43 }, - { 17, 59, 36.70, - 4, 49, 17.0, 5.87 }, - { 5, 37, 53.40, - 4, 48, 49.0, 6.19 }, - { 22, 57, 17.21, - 4, 48, 36.0, 6.31 }, - { 23, 3, 57.29, - 4, 47, 43.1, 6.68 }, - { 5, 55, 35.40, - 4, 47, 17.9, 6.28 }, - { 1, 43, 54.79, - 4, 45, 56.2, 6.19 }, - { 6, 27, 57.60, - 4, 45, 43.9, 5.06 }, - { 18, 6, 15.19, - 4, 45, 5.0, 5.77 }, - { 18, 47, 10.51, - 4, 44, 52.1, 4.22 }, - { 21, 0, 33.79, - 4, 43, 49.1, 6.21 }, - { 22, 12, 43.80, - 4, 43, 14.9, 6.39 }, - { 8, 24, 36.41, - 4, 43, .8, 6.01 }, - { 23, 1, 31.70, - 4, 42, 41.0, 5.94 }, - { 16, 18, 19.30, - 4, 41, 33.0, 3.24 }, - { 6, 23, 22.70, - 4, 41, 13.9, 6.67 }, - { 6, 11, 43.70, - 4, 39, 56.2, 6.18 }, - { 5, 6, 45.70, - 4, 39, 18.0, 5.12 }, - { 19, 37, 47.30, - 4, 38, 51.0, 5.46 }, - { 0, 45, 24.10, - 4, 37, 45.1, 6.15 }, - { 5, 55, 30.31, - 4, 36, 59.0, 5.87 }, - { 12, 27, 51.60, - 4, 36, 55.1, 6.22 }, - { 6, 26, 34.51, - 4, 35, 49.9, 6.15 }, - { 6, 14, 36.70, - 4, 34, 5.9, 5.83 }, - { 21, 21, 4.30, - 4, 33, 36.0, 5.87 }, - { 7, 26, 3.50, - 4, 32, 15.0, 6.76 }, - { 23, 29, 32.11, - 4, 31, 58.1, 6.25 }, - { 21, 18, 11.11, - 4, 31, 9.8, 5.82 }, - { 5, 35, 21.79, - 4, 29, 35.9, 6.56 }, - { 5, 8, 43.61, - 4, 27, 22.0, 5.12 }, - { 5, 35, 22.51, - 4, 25, 31.1, 6.24 }, - { 21, 58, 55.01, - 4, 22, 23.2, 6.22 }, - { 5, 35, 31.10, - 4, 21, 52.9, 6.38 }, - { 0, 40, 42.41, - 4, 21, 6.8, 5.91 }, - { 14, 57, 10.99, - 4, 20, 47.0, 4.49 }, - { 2, 19, 40.80, - 4, 20, 44.2, 6.50 }, - { 21, 54, 10.39, - 4, 16, 34.0, 5.71 }, - { 5, 46, 2.81, - 4, 16, 5.9, 6.34 }, - { 22, 10, 33.79, - 4, 16, 1.9, 6.01 }, - { 9, 29, 32.40, - 4, 14, 49.9, 6.26 }, - { 9, 51, 13.99, - 4, 14, 35.9, 6.01 }, - { 7, 2, 54.79, - 4, 14, 21.1, 4.99 }, - { 7, 10, 13.70, - 4, 14, 13.9, 4.92 }, - { 22, 37, 45.41, - 4, 13, 41.2, 5.03 }, - { 12, 53, 38.11, - 4, 13, 26.0, 6.44 }, - { 17, 1, 3.60, - 4, 13, 21.0, 4.82 }, - { 16, 12, 56.50, - 4, 13, 14.9, 6.25 }, - { 5, 2, 45.50, - 4, 12, 34.9, 5.85 }, - { 6, 6, 38.69, - 4, 11, 38.0, 5.38 }, - { 7, 37, 16.70, - 4, 6, 40.0, 5.13 }, - { 2, 3, 40.51, - 4, 6, 13.0, 5.62 }, - { 5, 48, 34.90, - 4, 5, 40.9, 5.97 }, - { 23, 31, 31.51, - 4, 5, 13.9, 6.49 }, - { 17, 56, 47.71, - 4, 4, 54.8, 5.47 }, - { 20, 6, 12.19, - 4, 4, 41.9, 6.47 }, - { 10, 23, 26.50, - 4, 4, 27.1, 5.97 }, - { 5, 54, 34.70, - 4, 3, 50.0, 6.57 }, - { 19, 4, 57.60, - 4, 1, 53.0, 5.42 }, - { 10, 49, 17.30, - 4, 1, 27.1, 6.61 }, - { 18, 13, 10.01, - 4, 0, 42.1, 6.59 }, - { 8, 26, 27.19, - 3, 59, 15.0, 5.59 }, - { 21, 35, 17.59, - 3, 58, 59.2, 5.77 }, - { 0, 30, 2.40, - 3, 57, 25.9, 5.72 }, - { 12, 18, 9.10, - 3, 57, 15.8, 6.99 }, - { 16, 16, 55.30, - 3, 57, 11.9, 6.18 }, - { 12, 18, 9.60, - 3, 56, 55.0, 6.54 }, - { 8, 25, 39.60, - 3, 54, 23.0, 3.90 }, - { 7, 14, 10.99, - 3, 54, 5.0, 5.75 }, - { 22, 10, 21.10, - 3, 53, 39.1, 6.27 }, - { 6, 25, 47.11, - 3, 53, 21.1, 6.35 }, - { 17, 8, 54.50, - 3, 52, 58.1, 6.36 }, - { 15, 48, 56.81, - 3, 49, 7.0, 5.53 }, - { 12, 59, 39.50, - 3, 48, 42.8, 5.79 }, - { 3, 11, 18.79, - 3, 48, 42.1, 6.05 }, - { 8, 24, 34.99, - 3, 45, 4.0, 5.61 }, - { 4, 23, 40.80, - 3, 44, 44.2, 5.17 }, - { 10, 28, 43.99, - 3, 44, 33.0, 6.05 }, - { 6, 13, 54.29, - 3, 44, 29.0, 5.83 }, - { 2, 56, 37.39, - 3, 42, 43.9, 5.17 }, - { 19, 2, 54.50, - 3, 41, 56.0, 5.42 }, - { 16, 14, 20.69, - 3, 41, 39.8, 2.74 }, - { 1, 42, 43.49, - 3, 41, 25.1, 4.99 }, - { 18, 0, 28.99, - 3, 41, 25.1, 4.62 }, - { 7, 59, 44.09, - 3, 40, 46.9, 4.93 }, - { 13, 3, 54.41, - 3, 39, 47.9, 6.59 }, - { 11, 16, 39.70, - 3, 39, 6.1, 4.47 }, - { 18, 15, 58.01, - 3, 37, 3.0, 6.36 }, - { 4, 36, 1.61, - 3, 36, 42.8, 6.33 }, - { 0, 35, 14.90, - 3, 35, 34.1, 5.20 }, - { 18, 24, 3.50, - 3, 34, 59.9, 6.38 }, - { 5, 39, 31.20, - 3, 33, 52.9, 6.00 }, - { 20, 56, 18.31, - 3, 33, 41.0, 6.57 }, - { 21, 25, 16.99, - 3, 33, 24.1, 5.49 }, - { 23, 58, 40.39, - 3, 33, 22.0, 4.86 }, - { 22, 40, 48.00, - 3, 33, 15.1, 6.31 }, - { 12, 53, 11.21, - 3, 33, 11.2, 6.11 }, - { 13, 59, 49.30, - 3, 32, 58.9, 6.40 }, - { 23, 15, 34.30, - 3, 29, 47.0, 5.55 }, - { 16, 9, 50.50, - 3, 28, .8, 5.37 }, - { 5, 29, 23.59, - 3, 26, 47.0, 5.79 }, - { 8, 49, 21.70, - 3, 26, 35.2, 5.31 }, - { 15, 49, 37.20, - 3, 25, 49.1, 3.53 }, - { 21, 24, 51.70, - 3, 23, 53.9, 6.36 }, - { 2, 37, 41.81, - 3, 23, 46.0, 5.65 }, - { 3, 39, 38.30, - 3, 23, 35.2, 6.23 }, - { 13, 0, 35.90, - 3, 22, 7.0, 5.99 }, - { 20, 28, 24.91, - 3, 21, 28.1, 6.13 }, - { 4, 36, 19.10, - 3, 21, 9.0, 3.93 }, - { 18, 51, 22.10, - 3, 19, 4.1, 6.10 }, - { 5, 28, 56.71, - 3, 18, 27.0, 6.39 }, - { 21, 54, 35.90, - 3, 18, 4.0, 6.20 }, - { 4, 45, 30.10, - 3, 15, 16.9, 4.02 }, - { 5, 35, 35.81, - 3, 15, 10.1, 6.40 }, - { 1, 20, 34.49, - 3, 14, 48.8, 6.23 }, - { 2, 41, 48.29, - 3, 12, 47.9, 6.05 }, - { 4, 32, 37.39, - 3, 12, 33.1, 5.81 }, - { 14, 16, 30.10, - 3, 11, 47.0, 6.15 }, - { 18, 38, 23.71, - 3, 11, 37.0, 6.49 }, - { 23, 52, 55.61, - 3, 9, 20.2, 5.93 }, - { 12, 5, 59.81, - 3, 7, 54.1, 6.37 }, - { 19, 53, 18.70, - 3, 6, 51.8, 5.65 }, - { 10, 51, 5.40, - 3, 5, 33.0, 5.95 }, - { 15, 51, 15.60, - 3, 5, 26.2, 5.11 }, - { 6, 0, 3.41, - 3, 4, 27.1, 4.53 }, - { 5, 4, 54.50, - 3, 2, 22.9, 6.05 }, - { 15, 2, 44.90, - 3, 1, 53.0, 6.61 }, - { 0, 1, 49.39, - 3, 1, 39.0, 5.10 }, - { 18, 16, 53.11, - 3, 0, 25.9, 6.00 }, - { 11, 30, 18.91, - 3, 0, 13.0, 4.77 }, - { 8, 8, 35.59, - 2, 59, 2.0, 4.34 }, - { 7, 22, 18.50, - 2, 58, 44.0, 6.23 }, - { 2, 19, 20.71, - 2, 58, 39.0, 3.04 }, - { 3, 54, 17.50, - 2, 57, 16.9, 4.79 }, - { 4, 46, 24.10, - 2, 57, 15.8, 6.33 }, - { 3, 54, 17.40, - 2, 57, 10.1, 6.14 }, - { 6, 19, 59.59, - 2, 56, 39.8, 4.90 }, - { 22, 31, 18.41, - 2, 54, 40.0, 6.16 }, - { 18, 21, 18.60, - 2, 53, 56.0, 3.26 }, - { 5, 41, 40.30, - 2, 53, 46.0, 6.42 }, - { 20, 29, 39.00, - 2, 53, 8.2, 4.91 }, - { 19, 45, 52.20, - 2, 52, 59.9, 6.48 }, - { 8, 0, 44.09, - 2, 52, 54.1, 6.51 }, - { 3, 0, 51.00, - 2, 52, 43.0, 6.11 }, - { 1, 24, 48.70, - 2, 50, 55.0, 6.15 }, - { 5, 40, 37.30, - 2, 49, 30.0, 6.22 }, - { 6, 54, 58.80, - 2, 48, 13.0, 6.04 }, - { 20, 25, 42.50, - 2, 48, 1.1, 6.11 }, - { 19, 30, 39.79, - 2, 47, 20.0, 5.03 }, - { 2, 58, 42.00, - 2, 46, 57.0, 5.23 }, - { 2, 24, 58.39, - 2, 46, 48.0, 6.33 }, - { 9, 29, 8.90, - 2, 46, 8.0, 4.60 }, - { 23, 47, 56.50, - 2, 45, 42.1, 5.49 }, - { 15, 1, 19.80, - 2, 45, 18.0, 5.52 }, - { 10, 29, 28.70, - 2, 44, 21.1, 5.21 }, - { 16, 50, 22.30, - 2, 39, 14.0, 6.32 }, - { 8, 45, 20.81, - 2, 36, 2.9, 6.41 }, - { 5, 38, 44.81, - 2, 36, .0, 3.81 }, - { 5, 38, 47.11, - 2, 35, 39.1, 6.65 }, - { 20, 36, 43.61, - 2, 33, .0, 4.89 }, - { 0, 7, 44.11, - 2, 32, 56.0, 6.43 }, - { 6, 38, 20.50, - 2, 32, 37.0, 6.14 }, - { 8, 28, 29.21, - 2, 31, 1.9, 6.39 }, - { 6, 12, 44.40, - 2, 30, 15.8, 6.62 }, - { 1, 16, 36.31, - 2, 30, 1.1, 5.41 }, - { 5, 11, 19.20, - 2, 29, 26.9, 5.90 }, - { 20, 47, 3.60, - 2, 29, 12.1, 6.27 }, - { 11, 1, 49.70, - 2, 29, 4.9, 4.74 }, - { 4, 37, 36.10, - 2, 28, 23.9, 5.23 }, - { 2, 59, 41.21, - 2, 27, 54.0, 5.56 }, - { 19, 51, 11.11, - 2, 27, 38.9, 6.13 }, - { 0, 8, 12.10, - 2, 26, 52.1, 6.07 }, - { 11, 38, 24.10, - 2, 26, 10.0, 6.22 }, - { 15, 20, 47.09, - 2, 24, 47.9, 6.35 }, - { 20, 39, 13.20, - 2, 24, 46.1, 6.22 }, - { 5, 24, 28.61, - 2, 23, 48.8, 3.36 }, - { 22, 58, 15.50, - 2, 23, 43.1, 6.16 }, - { 2, 12, 47.50, - 2, 23, 37.0, 5.54 }, - { 17, 22, 51.29, - 2, 23, 17.9, 6.29 }, - { 16, 36, 21.50, - 2, 19, 28.9, 5.75 }, - { 14, 51, 1.01, - 2, 17, 57.1, 4.94 }, - { 6, 49, 16.39, - 2, 16, 18.8, 5.74 }, - { 14, 19, 32.50, - 2, 15, 56.2, 5.14 }, - { 10, 53, 24.89, - 2, 15, 19.1, 6.12 }, - { 5, 10, 58.01, - 2, 15, 14.0, 6.25 }, - { 1, 11, 43.49, - 2, 15, 4.0, 5.94 }, - { 14, 28, 12.10, - 2, 13, 41.2, 4.81 }, - { 0, 24, 29.71, - 2, 13, 9.1, 6.07 }, - { 4, 58, 10.80, - 2, 12, 45.0, 6.35 }, - { 9, 29, 24.50, - 2, 12, 19.1, 6.14 }, - { 22, 3, 18.89, - 2, 9, 19.1, 4.69 }, - { 17, 40, 11.81, - 2, 9, 9.0, 6.19 }, - { 8, 34, 1.61, - 2, 9, 6.1, 5.81 }, - { 10, 53, 43.70, - 2, 7, 45.1, 5.45 }, - { 16, 22, 38.90, - 2, 4, 46.9, 6.23 }, - { 5, 0, 39.79, - 2, 3, 56.2, 6.32 }, - { 8, 46, 2.50, - 2, 2, 56.0, 5.70 }, - { 18, 29, 40.99, - 1, 59, 7.1, 5.39 }, - { 10, 48, 40.61, - 1, 57, 32.0, 5.93 }, - { 5, 40, 45.60, - 1, 56, 34.1, 4.21 }, - { 5, 40, 45.50, - 1, 56, 34.1, 2.05 }, - { 7, 29, 18.70, - 1, 54, 19.1, 5.59 }, - { 8, 47, 15.00, - 1, 53, 49.9, 5.29 }, - { 2, 11, 35.81, - 1, 49, 31.1, 5.93 }, - { 15, 46, 5.59, - 1, 48, 15.8, 5.40 }, - { 18, 56, 22.70, - 1, 48, .0, 6.22 }, - { 12, 1, 1.80, - 1, 46, 5.2, 6.31 }, - { 6, 54, 42.10, - 1, 45, 23.0, 6.21 }, - { 10, 41, 24.19, - 1, 44, 30.1, 6.26 }, - { 5, 33, 7.20, - 1, 43, 5.9, 6.46 }, - { 11, 27, 53.71, - 1, 42, .0, 6.25 }, - { 17, 6, 52.90, - 1, 39, 23.0, 6.38 }, - { 17, 25, 57.89, - 1, 39, 6.1, 6.44 }, - { 5, 43, 9.29, - 1, 36, 47.2, 6.31 }, - { 16, 54, 10.61, - 1, 36, 43.9, 6.25 }, - { 21, 16, 39.60, - 1, 36, 28.1, 6.48 }, - { 8, 21, 20.21, - 1, 36, 7.9, 6.50 }, - { 22, 16, 33.60, - 1, 35, 47.0, 6.15 }, - { 5, 32, 41.30, - 1, 35, 30.8, 5.35 }, - { 18, 24, 57.00, - 1, 34, 45.8, 6.15 }, - { 12, 43, 38.11, - 1, 34, 36.8, 5.93 }, - { 22, 34, 2.90, - 1, 34, 27.1, 5.89 }, - { 4, 1, 31.99, - 1, 32, 58.9, 5.28 }, - { 19, 5, 18.60, - 1, 30, 46.1, 6.53 }, - { 6, 26, 39.60, - 1, 30, 25.9, 5.87 }, - { 13, 54, 42.10, - 1, 30, 11.2, 5.15 }, - { 5, 34, 4.01, - 1, 28, 14.2, 5.93 }, - { 9, 26, 22.30, - 1, 27, 50.0, 6.01 }, - { 12, 41, 39.60, - 1, 26, 57.8, 3.68 }, - { 12, 41, 39.60, - 1, 26, 57.8, 3.65 }, - { 5, 59, 37.70, - 1, 26, 39.8, 6.63 }, - { 14, 45, 11.71, - 1, 25, 4.1, 6.07 }, - { 5, 19, 35.21, - 1, 24, 43.9, 6.34 }, - { 22, 58, 23.71, - 1, 24, 37.1, 6.37 }, - { 5, 15, 18.41, - 1, 24, 33.1, 6.15 }, - { 8, 1, 13.30, - 1, 23, 33.0, 4.68 }, - { 13, 16, 25.49, - 1, 23, 26.2, 6.68 }, - { 22, 21, 39.41, - 1, 23, 13.9, 3.84 }, - { 20, 55, 8.11, - 1, 22, 23.9, 6.55 }, - { 13, 29, 14.90, - 1, 21, 51.8, 6.43 }, - { 7, 1, 52.90, - 1, 20, 44.2, 6.17 }, - { 6, 48, 19.01, - 1, 19, 9.1, 5.75 }, - { 19, 36, 43.30, - 1, 17, 11.0, 4.36 }, - { 9, 29, 2.21, - 1, 15, 24.8, 6.27 }, - { 23, 34, 9.00, - 1, 14, 51.0, 5.87 }, - { 17, 51, 59.50, - 1, 14, 12.1, 6.35 }, - { 6, 33, 37.90, - 1, 13, 13.1, 5.10 }, - { 5, 36, 12.79, - 1, 12, 6.8, 1.70 }, - { 3, 12, 46.39, - 1, 11, 46.0, 5.06 }, - { 13, 26, 11.40, - 1, 11, 33.0, 5.97 }, - { 15, 32, 57.91, - 1, 11, 11.0, 5.51 }, - { 9, 31, 58.90, - 1, 11, 6.0, 4.57 }, - { 3, 44, 30.50, - 1, 9, 47.2, 5.25 }, - { 5, 33, 31.39, - 1, 9, 22.0, 5.34 }, - { 4, 13, 38.21, - 1, 8, 58.9, 6.44 }, - { 0, 53, .50, - 1, 8, 39.1, 4.77 }, - { 9, 39, 51.41, - 1, 8, 34.1, 3.91 }, - { 5, 40, 50.59, - 1, 7, 44.0, 4.95 }, - { 6, 54, 24.60, - 1, 7, 36.8, 5.45 }, - { 3, 39, 59.50, - 1, 7, 14.2, 6.12 }, - { 18, 38, 19.10, - 1, 6, 47.9, 6.66 }, - { 20, 38, 20.30, - 1, 6, 19.1, 4.32 }, - { 5, 29, 43.99, - 1, 5, 31.9, 4.71 }, - { 23, 31, 57.60, - 1, 5, 8.9, 6.38 }, - { 17, 8, 13.61, - 1, 4, 45.8, 6.06 }, - { 20, 19, 43.30, - 1, 4, 43.0, 6.06 }, - { 4, 57, 17.21, - 1, 4, 1.9, 6.23 }, - { 17, 30, 23.81, - 1, 3, 45.0, 5.31 }, - { 4, 39, 47.21, - 1, 3, 10.1, 6.10 }, - { 5, 34, 3.91, - 1, 2, 8.2, 6.22 }, - { 2, 32, 9.41, - 1, 2, 6.0, 5.35 }, - { 15, 23, 43.70, - 1, 1, 21.0, 6.12 }, - { 20, 13, 13.90, - 1, 0, 33.8, 5.47 }, - { 18, 31, 57.00, - 1, 0, 11.2, 5.94 }, - { 16, 41, 11.50, - 1, 0, 2.2, 6.24 }, - { 5, 58, 11.71, - 0, 59, 39.1, 6.22 }, - { 1, 14, 49.20, - 0, 58, 26.0, 5.70 }, - { 18, 46, 28.49, - 0, 57, 42.1, 5.90 }, - { 6, 25, 16.39, - 0, 56, 46.0, 5.87 }, - { 3, 18, 22.39, - 0, 55, 49.1, 5.38 }, - { 21, 2, 59.59, - 0, 55, 28.9, 6.50 }, - { 8, 20, 13.10, - 0, 54, 33.8, 6.18 }, - { 22, 4, 47.40, - 0, 54, 24.1, 5.30 }, - { 19, 20, 35.69, - 0, 53, 31.9, 5.49 }, - { 17, 5, 32.30, - 0, 53, 30.8, 5.64 }, - { 5, 24, 28.90, - 0, 53, 29.0, 5.08 }, - { 2, 22, 12.41, - 0, 53, 6.0, 5.42 }, - { 5, 23, 51.41, - 0, 52, 1.9, 6.11 }, - { 14, 48, 54.10, - 0, 50, 52.1, 6.14 }, - { 14, 13, 40.80, - 0, 50, 44.2, 5.91 }, - { 11, 36, 56.90, - 0, 49, 26.0, 4.30 }, - { 20, 11, 18.31, - 0, 49, 17.0, 3.23 }, - { 12, 18, 40.30, - 0, 47, 13.9, 5.90 }, - { 11, 3, 14.59, - 0, 45, 9.0, 6.14 }, - { 20, 4, 23.21, - 0, 42, 33.8, 5.68 }, - { 2, 41, 13.90, - 0, 41, 44.9, 5.71 }, - { 20, 8, 1.80, - 0, 40, 41.9, 5.99 }, - { 13, 17, 29.90, - 0, 40, 36.1, 6.37 }, - { 12, 19, 54.41, - 0, 40, .8, 3.89 }, - { 10, 30, 17.50, - 0, 38, 12.8, 5.09 }, - { 19, 40, 43.30, - 0, 37, 16.0, 5.67 }, - { 13, 34, 41.59, - 0, 35, 44.9, 3.37 }, - { 8, 5, 49.61, - 0, 34, 25.0, 6.41 }, - { 5, 10, 3.19, - 0, 33, 55.1, 6.10 }, - { 15, 36, 33.70, - 0, 33, 42.1, 6.51 }, - { 5, 25, 31.20, - 0, 32, 39.1, 6.57 }, - { 6, 50, 49.90, - 0, 32, 26.9, 5.77 }, - { 6, 15, 34.30, - 0, 30, 43.9, 5.65 }, - { 1, 19, 48.31, - 0, 30, 32.0, 5.87 }, - { 0, 35, 32.81, - 0, 30, 20.2, 5.93 }, - { 0, 5, 3.79, - 0, 30, 11.2, 6.29 }, - { 7, 11, 51.89, - 0, 29, 34.1, 4.15 }, - { 9, 1, 58.01, - 0, 28, 58.1, 5.67 }, - { 15, 18, 26.21, - 0, 27, 41.0, 5.89 }, - { 1, 22, 34.80, - 0, 26, 58.9, 6.49 }, - { 18, 6, 7.39, - 0, 26, 48.1, 6.34 }, - { 17, 16, 36.70, - 0, 26, 43.1, 4.73 }, - { 19, 9, 51.60, - 0, 25, 41.2, 6.34 }, - { 5, 21, 31.80, - 0, 24, 59.0, 5.68 }, - { 1, 26, 27.31, - 0, 23, 55.0, 6.41 }, - { 21, 37, 33.79, - 0, 23, 25.1, 6.25 }, - { 5, 21, 45.70, - 0, 22, 57.0, 4.73 }, - { 10, 7, 56.30, - 0, 22, 18.1, 4.49 }, - { 2, 3, 48.19, - 0, 20, 25.1, 5.93 }, - { 22, 5, 46.99, - 0, 19, 10.9, 2.96 }, - { 11, 49, 1.20, - 0, 19, 7.0, 6.15 }, - { 18, 37, 36.00, - 0, 18, 33.8, 5.75 }, - { 7, 11, 23.59, - 0, 18, 6.8, 5.45 }, - { 5, 32, .41, - 0, 17, 57.1, 2.23 }, - { 3, 44, 56.50, - 0, 17, 48.1, 5.55 }, - { 5, 32, .50, - 0, 17, 3.8, 6.85 }, - { 6, 27, 15.60, - 0, 16, 34.0, 5.55 }, - { 4, 2, 36.70, - 0, 16, 8.0, 5.38 }, - { 14, 51, .10, - 0, 15, 25.9, 6.18 }, - { 19, 22, 21.50, - 0, 15, 9.0, 5.83 }, - { 22, 18, 4.30, - 0, 14, 16.1, 6.39 }, - { 10, 52, 36.10, - 0, 12, 5.0, 6.31 }, - { 14, 57, 33.29, - 0, 10, 3.0, 5.53 }, - { 7, 15, 19.30, - 0, 9, 41.0, 6.41 }, - { 5, 23, 42.29, - 0, 9, 34.9, 5.70 }, - { 15, 1, 48.91, - 0, 8, 26.2, 5.71 }, - { 22, 35, 21.41, - 0, 7, 3.0, 4.02 }, - { 4, 21, 27.10, - 0, 5, 53.2, 5.86 }, - { 11, 13, 45.60, - 0, 4, 10.9, 5.42 }, - { 0, 26, 37.39, - 0, 2, 58.9, 6.19 }, - { 4, 31, 52.70, - 0, 2, 38.0, 4.91 }, - { 22, 28, 49.70, - 0, 1, 13.1, 4.59 }, - { 22, 28, 50.09, - 0, 1, 12.0, 4.42 }, - { 11, 3, 36.60, - 0, 0, 2.9, 5.95 }, - { 2, 6, 29.30, + 0, 2, 6.0, 6.28 }, - { 17, 57, 4.30, + 0, 3, 59.0, 5.97 }, - { 9, 52, 12.00, + 0, 4, 32.2, 6.35 }, - { 21, 14, 37.01, + 0, 5, 31.9, 6.38 }, - { 20, 37, 18.31, + 0, 5, 48.8, 6.22 }, - { 23, 54, 46.61, + 0, 6, 33.1, 5.61 }, - { 2, 3, 11.69, + 0, 7, 41.9, 5.43 }, - { 11, 23, 18.00, + 0, 7, 54.1, 6.05 }, - { 7, 22, 3.50, + 0, 10, 37.9, 5.99 }, - { 23, 0, 37.90, + 0, 11, 8.9, 6.21 }, - { 7, 43, 5.40, + 0, 11, 21.8, 6.19 }, - { 18, 27, 12.50, + 0, 11, 46.0, 5.21 }, - { 3, 48, 38.90, + 0, 13, 40.1, 5.91 }, - { 19, 29, 18.00, + 0, 14, 46.0, 6.25 }, - { 2, 30, 45.19, + 0, 15, 19.1, 6.00 }, - { 19, 54, 44.81, + 0, 16, 25.0, 5.61 }, - { 23, 23, 31.90, + 0, 17, 29.0, 6.31 }, - { 6, 27, 13.80, + 0, 17, 57.1, 5.20 }, - { 2, 39, 28.99, + 0, 19, 43.0, 4.07 }, - { 17, 28, 49.70, + 0, 19, 50.2, 5.44 }, - { 5, 41, 5.59, + 0, 20, 16.1, 5.93 }, - { 19, 26, 31.10, + 0, 20, 19.0, 4.66 }, - { 19, 18, 50.90, + 0, 20, 21.1, 6.41 }, - { 17, 12, 54.41, + 0, 21, 6.8, 6.65 }, - { 15, 15, 49.10, + 0, 22, 19.9, 5.63 }, - { 14, 19, 40.90, + 0, 23, 3.1, 6.19 }, - { 2, 21, 56.59, + 0, 23, 44.9, 5.28 }, - { 3, 36, 52.39, + 0, 24, 6.1, 4.28 }, - { 20, 57, 10.61, + 0, 27, 49.0, 6.05 }, - { 4, 54, 50.71, + 0, 28, 3.0, 5.99 }, - { 20, 39, 24.91, + 0, 29, 11.0, 5.16 }, - { 6, 41, 5.40, + 0, 29, 43.1, 5.79 }, - { 5, 11, 41.40, + 0, 30, 52.9, 6.67 }, - { 5, 25, 46.99, + 0, 31, 14.9, 6.16 }, - { 11, 59, 3.41, + 0, 31, 50.2, 6.17 }, - { 21, 25, 51.50, + 0, 32, 3.8, 6.46 }, - { 11, 53, 50.30, + 0, 33, 6.8, 6.30 }, - { 5, 58, 49.61, + 0, 33, 11.2, 5.22 }, - { 5, 13, 47.21, + 0, 33, 37.1, 6.32 }, - { 3, 36, 47.30, + 0, 35, 16.1, 5.71 }, - { 22, 1, 4.99, + 0, 36, 18.0, 5.58 }, - { 18, 0, 15.50, + 0, 37, 45.8, 6.37 }, - { 19, 7, 9.10, + 0, 38, 30.1, 6.56 }, - { 16, 28, 34.01, + 0, 39, 54.0, 5.39 }, - { 17, 56, 18.41, + 0, 40, 13.1, 5.82 }, - { 17, 5, 16.90, + 0, 42, 9.0, 6.01 }, - { 15, 21, 1.99, + 0, 42, 55.1, 5.35 }, - { 14, 45, 30.19, + 0, 43, 1.9, 5.69 }, - { 5, 1, 50.30, + 0, 43, 19.9, 5.92 }, - { 10, 55, 42.41, + 0, 44, 12.8, 5.91 }, - { 14, 29, 50.50, + 0, 49, 44.0, 5.94 }, - { 18, 49, 37.10, + 0, 50, 8.9, 6.25 }, - { 6, 26, 58.70, + 0, 50, 26.9, 6.71 }, - { 20, 12, 35.21, + 0, 52, 3.0, 6.27 }, - { 6, 35, 15.79, + 0, 53, 24.0, 5.80 }, - { 15, 45, 39.70, + 0, 53, 29.0, 6.33 }, - { 22, 59, 27.41, + 0, 57, 46.1, 5.43 }, - { 5, 54, 44.09, + 0, 58, 5.9, 6.00 }, - { 4, 37, 13.70, + 0, 59, 53.9, 5.31 }, - { 6, 49, 3.70, + 1, 0, 6.8, 6.15 }, - { 19, 52, 28.39, + 1, 0, 20.2, 3.90 }, - { 18, 17, 4.80, + 1, 0, 20.9, 6.63 }, - { 16, 45, 29.69, + 1, 1, 13.1, 6.03 }, - { 10, 52, 13.70, + 1, 1, 31.1, 6.38 }, - { 16, 22, 4.39, + 1, 1, 45.1, 4.82 }, - { 5, 11, 45.31, + 1, 2, 12.8, 5.89 }, - { 13, 56, 27.91, + 1, 3, 2.2, 5.91 }, - { 22, 54, 59.50, + 1, 3, 52.9, 6.11 }, - { 20, 24, 37.49, + 1, 4, 7.0, 6.15 }, - { 23, 49, 27.50, + 1, 4, 34.0, 5.77 }, - { 6, 16, 21.19, + 1, 4, 49.1, 6.63 }, - { 19, 18, 32.50, + 1, 5, 7.1, 5.10 }, - { 21, 26, 28.10, + 1, 6, 11.9, 6.13 }, - { 23, 27, 14.81, + 1, 7, 21.0, 6.25 }, - { 7, 57, 16.20, + 1, 7, 36.8, 6.35 }, - { 5, 46, 34.99, + 1, 10, 5.2, 5.95 }, - { 6, 15, 54.00, + 1, 10, 9.1, 6.37 }, - { 5, 5, 23.69, + 1, 10, 39.0, 6.17 }, - { 16, 41, 42.50, + 1, 10, 52.0, 5.74 }, - { 17, 16, 31.70, + 1, 12, 38.2, 5.88 }, - { 16, 51, 24.89, + 1, 12, 58.0, 5.51 }, - { 5, 57, 54.19, + 1, 13, 27.8, 6.22 }, - { 14, 23, 15.31, + 1, 14, 30.1, 6.27 }, - { 23, 26, 55.99, + 1, 15, 20.2, 4.94 }, - { 21, 42, 10.10, + 1, 17, 7.1, 5.67 }, - { 5, 28, 1.61, + 1, 17, 53.9, 6.41 }, - { 17, 52, 35.40, + 1, 18, 18.0, 5.95 }, - { 18, 1, 45.19, + 1, 18, 19.1, 4.45 }, - { 23, 5, 17.59, + 1, 18, 24.8, 6.39 }, - { 14, 11, 31.20, + 1, 21, 43.9, 6.43 }, - { 1, 3, 49.01, + 1, 22, .1, 6.04 }, - { 22, 25, 16.61, + 1, 22, 39.0, 4.66 }, - { 19, 59, 22.70, + 1, 22, 40.1, 6.17 }, - { 4, 28, 32.11, + 1, 22, 50.9, 5.55 }, - { 5, 33, 57.60, + 1, 24, 28.1, 6.59 }, - { 11, 24, 2.30, + 1, 24, 28.1, 5.39 }, - { 9, 6, 59.90, + 1, 27, 46.1, 6.17 }, - { 5, 42, 28.61, + 1, 28, 28.9, 4.91 }, - { 7, 4, 20.21, + 1, 29, 17.9, 6.57 }, - { 6, 25, 18.41, + 1, 30, 4.0, 6.66 }, - { 21, 3, 3.00, + 1, 31, 54.8, 6.25 }, - { 8, 58, 8.21, + 1, 32, 30.1, 6.59 }, - { 14, 1, 38.81, + 1, 32, 39.8, 4.26 }, - { 4, 53, 55.80, + 1, 34, 9.8, 6.61 }, - { 5, 2, .00, + 1, 36, 32.0, 6.24 }, - { 6, 38, 38.11, + 1, 36, 49.0, 6.21 }, - { 11, 18, 55.01, + 1, 39, 2.2, 5.91 }, - { 15, 35, 4.61, + 1, 40, 8.0, 6.56 }, - { 0, 17, 47.71, + 1, 41, 20.0, 6.17 }, - { 6, 2, 17.11, + 1, 41, 39.8, 6.59 }, - { 4, 58, 32.90, + 1, 42, 51.1, 4.47 }, - { 1, 22, 37.01, + 1, 43, 35.0, 6.20 }, - { 2, 18, 1.39, + 1, 45, 28.1, 5.58 }, - { 11, 50, 41.71, + 1, 45, 52.9, 3.61 }, - { 15, 19, 18.79, + 1, 45, 55.1, 5.06 }, - { 7, 51, 42.00, + 1, 46, .8, 5.14 }, - { 23, 42, 2.81, + 1, 46, 48.0, 4.50 }, - { 9, 46, 23.59, + 1, 47, 8.2, 5.65 }, - { 5, 29, 54.79, + 1, 47, 21.1, 5.78 }, - { 19, 3, 32.21, + 1, 49, 8.0, 5.83 }, - { 5, 58, 24.41, + 1, 50, 12.8, 5.90 }, - { 15, 28, 38.21, + 1, 50, 31.9, 5.17 }, - { 5, 24, 44.81, + 1, 50, 47.0, 4.95 }, - { 1, 55, 53.81, + 1, 50, 58.9, 6.01 }, - { 12, 38, 22.39, + 1, 51, 16.9, 5.71 }, - { 5, 52, 26.40, + 1, 51, 18.0, 4.78 }, - { 4, 28, 3.60, + 1, 51, 31.0, 6.15 }, - { 3, 4, 38.09, + 1, 51, 49.0, 6.05 }, - { 9, 32, 41.40, + 1, 51, 51.1, 6.11 }, - { 14, 46, 14.90, + 1, 53, 34.1, 3.72 }, - { 12, 9, 41.30, + 1, 53, 52.1, 5.95 }, - { 6, 28, 16.80, + 1, 54, 43.9, 6.48 }, - { 7, 32, 5.90, + 1, 54, 51.8, 5.25 }, - { 18, 4, 37.30, + 1, 55, 9.1, 6.14 }, - { 0, 25, 24.19, + 1, 56, 22.9, 5.77 }, - { 5, 16, 41.09, + 1, 56, 49.9, 6.42 }, - { 19, 29, 1.01, + 1, 57, 1.1, 5.80 }, - { 11, 6, 54.19, + 1, 57, 20.2, 5.52 }, - { 2, 28, .00, + 1, 57, 38.9, 6.45 }, - { 17, 49, 18.89, + 1, 57, 40.0, 6.47 }, - { 5, 13, 31.61, + 1, 58, 5.2, 6.09 }, - { 16, 30, 54.79, + 1, 59, 2.0, 3.82 }, - { 11, 17, 17.40, + 2, 0, 38.2, 5.18 }, - { 5, 50, 30.00, + 2, 1, 27.8, 5.98 }, - { 17, 39, 8.50, + 2, 1, 41.2, 6.26 }, - { 19, 17, 48.19, + 2, 1, 54.1, 6.19 }, - { 18, 44, 49.90, + 2, 3, 36.0, 5.02 }, - { 16, 47, 9.79, + 2, 3, 51.8, 6.10 }, - { 4, 27, .70, + 2, 4, 45.8, 6.23 }, - { 13, 21, 41.59, + 2, 5, 13.9, 5.69 }, - { 23, 53, 4.80, + 2, 5, 26.2, 6.28 }, - { 15, 2, 54.00, + 2, 5, 29.0, 4.40 }, - { 8, 25, 35.50, + 2, 6, 7.9, 5.73 }, - { 23, 36, 23.30, + 2, 6, 7.9, 5.68 }, - { 23, 8, 40.90, + 2, 7, 40.1, 5.40 }, - { 17, 16, 14.21, + 2, 11, 10.0, 6.17 }, - { 15, 50, 17.50, + 2, 11, 47.0, 5.23 }, - { 23, 48, 49.30, + 2, 12, 51.1, 6.46 }, - { 7, 58, 20.59, + 2, 13, 28.9, 5.29 }, - { 21, 39, 33.31, + 2, 14, 37.0, 5.10 }, - { 2, 31, 30.10, + 2, 16, 1.9, 5.25 }, - { 6, 21, 25.80, + 2, 16, 7.0, 6.31 }, - { 21, 4, 45.41, + 2, 16, 10.9, 6.33 }, - { 6, 25, 46.61, + 2, 16, 19.9, 6.51 }, - { 10, 21, 1.99, + 2, 17, 22.9, 6.66 }, - { 19, 13, 42.70, + 2, 17, 37.0, 5.15 }, - { 14, 4, 37.49, + 2, 17, 51.0, 6.28 }, - { 9, 14, 21.89, + 2, 18, 51.1, 3.88 }, - { 8, 2, 15.91, + 2, 20, 3.8, 4.39 }, - { 16, 26, 50.11, + 2, 20, 51.0, 6.07 }, - { 5, 24, 36.19, + 2, 21, 10.1, 6.32 }, - { 10, 24, 13.10, + 2, 22, 5.2, 6.32 }, - { 18, 16, 5.59, + 2, 22, 40.1, 6.01 }, - { 7, 44, 7.39, + 2, 24, 18.0, 6.47 }, - { 14, 12, 15.79, + 2, 24, 33.8, 5.01 }, - { 6, 47, 51.60, + 2, 24, 43.9, 4.47 }, - { 4, 54, 15.10, + 2, 26, 26.2, 3.72 }, - { 1, 10, 33.60, + 2, 26, 44.2, 5.95 }, - { 9, 52, 12.19, + 2, 27, 15.1, 6.02 }, - { 18, 56, 25.61, + 2, 28, 16.0, 6.15 }, - { 10, 45, 9.41, + 2, 29, 17.2, 6.28 }, - { 6, 8, 57.89, + 2, 29, 57.8, 5.73 }, - { 18, 5, 27.29, + 2, 29, 57.8, 4.03 }, - { 4, 53, 22.80, + 2, 30, 29.2, 5.33 }, - { 15, 44, 1.80, + 2, 30, 54.0, 5.88 }, - { 18, 57, 16.61, + 2, 32, 7.1, 5.57 }, - { 17, 44, 35.40, + 2, 34, 44.0, 6.56 }, - { 17, 44, 34.01, + 2, 34, 45.8, 6.17 }, - { 5, 19, 11.21, + 2, 35, 44.9, 5.34 }, - { 6, 29, 14.90, + 2, 38, 46.0, 6.16 }, - { 21, 47, 13.99, + 2, 41, 10.0, 5.64 }, - { 6, 37, 40.30, + 2, 42, 15.1, 6.17 }, - { 17, 47, 53.59, + 2, 42, 25.9, 3.75 }, - { 17, 31, 21.29, + 2, 43, 27.8, 5.59 }, - { 7, 34, 46.01, + 2, 43, 30.0, 6.55 }, - { 7, 19, 22.39, + 2, 44, 26.2, 5.89 }, - { 8, 35, 24.89, + 2, 44, 37.0, 6.33 }, - { 2, 2, 2.81, + 2, 45, 49.0, 5.23 }, - { 2, 2, 2.81, + 2, 45, 49.0, 4.33 }, - { 4, 4, 9.89, + 2, 49, 36.8, 5.36 }, - { 11, 27, 56.21, + 2, 51, 22.0, 4.95 }, - { 5, 13, 17.50, + 2, 51, 40.0, 4.46 }, - { 19, 30, 10.51, + 2, 54, 15.1, 6.09 }, - { 6, 27, 20.40, + 2, 54, 29.2, 5.55 }, - { 19, 35, 25.20, + 2, 54, 47.9, 6.38 }, - { 19, 28, 20.81, + 2, 55, 49.1, 5.85 }, - { 23, 51, 57.89, + 2, 55, 49.1, 5.55 }, - { 18, 0, 38.71, + 2, 55, 54.1, 3.97 }, - { 20, 28, 16.80, + 2, 56, 12.8, 6.21 }, - { 13, 20, 41.59, + 2, 56, 30.1, 6.26 }, - { 21, 4, 41.69, + 2, 56, 30.8, 6.42 }, - { 21, 9, 58.30, + 2, 56, 35.9, 6.45 }, - { 23, 0, 42.89, + 3, 0, 42.1, 5.83 }, - { 11, 26, 45.31, + 3, 0, 47.2, 6.50 }, - { 6, 43, 6.50, + 3, 1, 59.9, 6.19 }, - { 6, 51, 39.29, + 3, 2, 30.1, 6.38 }, - { 12, 51, 36.89, + 3, 3, 24.1, 6.02 }, - { 3, 39, 51.10, + 3, 3, 24.8, 5.57 }, - { 11, 34, 22.01, + 3, 3, 36.0, 5.77 }, - { 5, 26, 50.21, + 3, 5, 44.2, 4.59 }, - { 2, 0, 9.19, + 3, 5, 49.9, 5.88 }, - { 7, 14, 19.99, + 3, 6, 41.0, 5.35 }, - { 19, 25, 29.90, + 3, 6, 52.9, 3.36 }, - { 18, 9, 54.00, + 3, 7, 10.9, 5.69 }, - { 0, 37, 30.50, + 3, 8, 7.1, 6.39 }, - { 1, 53, 33.31, + 3, 11, 15.0, 4.62 }, - { 10, 4, 8.40, + 3, 12, 4.0, 6.45 }, - { 5, 54, 15.70, + 3, 13, 31.1, 6.31 }, - { 2, 43, 18.00, + 3, 14, 8.9, 3.47 }, - { 7, 52, 7.20, + 3, 16, 37.9, 6.31 }, - { 7, 50, 47.40, + 3, 16, 37.9, 6.18 }, - { 23, 17, 9.91, + 3, 16, 55.9, 3.69 }, - { 12, 38, 4.39, + 3, 16, 57.0, 6.33 }, - { 7, 33, 11.59, + 3, 17, 25.1, 5.59 }, - { 5, 31, 14.50, + 3, 17, 31.9, 5.46 }, - { 20, 47, 47.81, + 3, 18, 24.1, 6.40 }, - { 12, 20, 21.00, + 3, 18, 45.0, 4.96 }, - { 18, 10, 40.30, + 3, 19, 27.1, 5.51 }, - { 19, 4, 10.70, + 3, 19, 50.2, 6.73 }, - { 14, 14, 52.99, + 3, 20, 10.0, 6.45 }, - { 8, 38, 45.41, + 3, 20, 29.0, 4.44 }, - { 3, 19, 21.70, + 3, 22, 13.1, 4.83 }, - { 7, 34, 15.79, + 3, 22, 17.0, 5.81 }, - { 18, 20, 52.10, + 3, 22, 37.9, 4.86 }, - { 19, 38, 49.01, + 3, 22, 54.1, 6.35 }, - { 9, 59, 43.10, + 3, 23, 4.9, 6.70 }, - { 0, 51, 18.31, + 3, 23, 6.0, 6.37 }, - { 12, 55, 36.19, + 3, 23, 51.0, 3.38 }, - { 8, 43, 13.49, + 3, 23, 55.0, 4.30 }, - { 2, 38, 36.91, + 3, 26, 35.2, 6.21 }, - { 19, 30, 33.10, + 3, 26, 39.8, 6.05 }, - { 16, 8, 58.90, + 3, 27, 15.8, 5.91 }, - { 23, 46, 23.50, + 3, 29, 12.1, 5.04 }, - { 1, 26, 53.50, + 3, 32, 7.1, 6.58 }, - { 13, 43, 3.70, + 3, 32, 17.2, 5.36 }, - { 5, 22, 49.99, + 3, 32, 39.8, 5.00 }, - { 12, 47, 51.41, + 3, 34, 22.1, 6.41 }, - { 4, 48, 44.59, + 3, 35, 17.9, 6.03 }, - { 6, 58, 57.00, + 3, 36, 7.9, 5.97 }, - { 1, 17, 48.00, + 3, 36, 51.8, 5.16 }, - { 5, 0, 32.59, + 3, 36, 55.1, 7.03 }, - { 5, 0, 33.91, + 3, 36, 58.0, 6.66 }, - { 11, 0, 33.60, + 3, 37, 3.0, 4.84 }, - { 7, 41, 35.21, + 3, 37, 28.9, 5.94 }, - { 11, 59, 56.90, + 3, 39, 19.1, 5.37 }, - { 13, 34, 7.90, + 3, 39, 32.0, 4.94 }, - { 18, 32, 7.01, + 3, 39, 34.9, 6.43 }, - { 3, 21, 6.79, + 3, 40, 32.2, 5.69 }, - { 1, 48, 25.99, + 3, 41, 8.2, 5.91 }, - { 13, 18, 51.10, + 3, 41, 16.1, 6.62 }, - { 18, 27, 50.30, + 3, 44, 55.0, 6.07 }, - { 6, 23, 18.50, + 3, 45, 51.8, 6.40 }, - { 5, 34, 16.70, + 3, 46, .8, 5.36 }, - { 17, 48, 20.21, + 3, 48, 15.1, 6.22 }, - { 22, 57, 32.81, + 3, 48, 37.1, 6.28 }, - { 23, 3, 52.61, + 3, 49, 12.0, 4.53 }, - { 11, 25, 49.99, + 3, 51, 36.0, 6.37 }, - { 9, 12, 12.91, + 3, 52, 1.9, 6.14 }, - { 6, 43, 38.69, + 3, 55, 55.9, 5.90 }, - { 8, 19, 49.90, + 3, 56, 52.1, 6.05 }, - { 18, 9, 33.79, + 3, 59, 35.9, 5.73 }, - { 5, 45, 1.90, + 4, 0, 29.2, 6.09 }, - { 5, 21, 19.30, + 4, 0, 42.8, 6.57 }, - { 18, 30, 5.09, + 4, 3, 55.1, 6.69 }, - { 3, 2, 16.80, + 4, 5, 22.9, 2.53 }, - { 5, 39, 11.09, + 4, 7, 17.0, 4.57 }, - { 17, 26, 30.91, + 4, 8, 25.1, 4.34 }, - { 6, 4, 58.39, + 4, 9, 31.0, 5.63 }, - { 18, 56, 14.59, + 4, 12, 6.8, 4.98 }, - { 18, 56, 13.20, + 4, 12, 13.0, 4.62 }, - { 5, 30, 19.80, + 4, 12, 15.1, 6.21 }, - { 16, 40, 35.11, + 4, 12, 25.9, 6.93 }, - { 16, 40, 38.71, + 4, 13, 10.9, 5.77 }, - { 8, 56, 36.89, + 4, 14, 12.1, 6.14 }, - { 18, 48, 2.71, + 4, 14, 29.0, 6.21 }, - { 6, 15, 46.99, + 4, 17, 1.0, 6.64 }, - { 20, 59, 4.39, + 4, 17, 37.0, 5.23 }, - { 7, 48, 58.90, + 4, 19, 58.1, 6.53 }, - { 8, 43, 59.69, + 4, 20, 4.9, 6.37 }, - { 9, 50, 30.10, + 4, 20, 37.0, 6.24 }, - { 3, 2, 22.51, + 4, 21, 10.1, 5.61 }, - { 18, 0, 15.79, + 4, 22, 7.0, 4.64 }, - { 22, 26, 37.39, + 4, 23, 37.0, 5.75 }, - { 19, 53, 22.61, + 4, 24, 2.2, 6.53 }, - { 5, 50, 13.10, + 4, 25, 23.9, 5.97 }, - { 16, 0, 51.10, + 4, 25, 39.0, 5.83 }, - { 22, 29, 58.01, + 4, 25, 54.1, 5.48 }, - { 15, 50, 49.01, + 4, 28, 40.1, 3.71 }, - { 7, 56, 23.90, + 4, 29, 8.9, 6.17 }, - { 6, 36, .00, + 4, 29, 51.0, 6.55 }, - { 2, 57, 4.61, + 4, 30, 4.0, 6.11 }, - { 20, 55, 40.70, + 4, 31, 58.1, 6.05 }, - { 17, 43, 28.39, + 4, 34, 1.9, 2.77 }, - { 14, 59, 23.11, + 4, 34, 4.1, 5.93 }, - { 6, 23, 46.10, + 4, 35, 34.1, 4.44 }, - { 6, 23, 46.49, + 4, 35, 44.2, 6.72 }, - { 10, 12, 48.29, + 4, 36, 52.9, 5.77 }, - { 9, 38, 27.31, + 4, 38, 57.1, 4.68 }, - { 22, 27, 51.50, + 4, 41, 44.2, 4.79 }, - { 6, 38, 49.51, + 4, 42, 2.2, 6.57 }, - { 2, 45, 20.90, + 4, 42, 42.1, 6.03 }, - { 10, 43, 20.90, + 4, 44, 52.1, 5.79 }, - { 8, 33, 43.49, + 4, 45, 24.1, 5.87 }, - { 14, 30, 45.41, + 4, 46, 19.9, 6.02 }, - { 7, 1, 41.40, + 4, 49, 5.2, 6.63 }, - { 19, 16, 31.01, + 4, 50, 4.9, 5.59 }, - { 6, 32, 19.20, + 4, 51, 20.9, 5.84 }, - { 8, 1, 13.80, + 4, 52, 46.9, 5.65 }, - { 3, 23, 39.10, + 4, 52, 54.8, 6.38 }, - { 14, 3, 55.80, + 4, 54, 2.9, 6.24 }, - { 1, 5, 49.20, + 4, 54, 29.9, 6.35 }, - { 1, 5, 51.41, + 4, 54, 33.8, 7.25 }, - { 7, 7, 6.41, + 4, 54, 37.1, 6.11 }, - { 15, 15, 11.40, + 4, 56, 21.8, 5.33 }, - { 6, 37, 52.70, + 4, 57, 25.9, 6.15 }, - { 16, 3, 45.70, + 4, 59, 12.1, 6.08 }, - { 16, 13, 15.41, + 5, 1, 16.0, 5.48 }, - { 22, 5, 40.80, + 5, 3, 31.0, 4.84 }, - { 18, 25, 8.81, + 5, 5, 4.9, 6.74 }, - { 9, 5, 58.39, + 5, 5, 31.9, 4.97 }, - { 6, 17, 16.10, + 5, 6, 1.1, 5.71 }, - { 13, 22, 9.70, + 5, 9, 16.9, 5.87 }, - { 5, 14, 44.09, + 5, 9, 22.0, 5.50 }, - { 7, 39, 18.10, + 5, 13, 30.0, 0.38 }, - { 7, 40, 7.01, + 5, 13, 50.9, 6.02 }, - { 16, 47, 46.39, + 5, 14, 48.1, 5.24 }, - { 21, 15, 49.39, + 5, 14, 52.1, 3.92 }, - { 18, 39, 36.89, + 5, 15, 51.1, 6.38 }, - { 0, 48, 22.99, + 5, 16, 50.2, 5.75 }, - { 12, 22, 31.99, + 5, 18, 20.2, 6.40 }, - { 5, 23, 31.10, + 5, 19, 21.0, 6.35 }, - { 3, 1, 52.30, + 5, 20, 10.0, 6.25 }, - { 8, 52, 24.19, + 5, 20, 24.0, 6.33 }, - { 20, 23, 10.70, + 5, 20, 35.2, 5.31 }, - { 23, 20, 20.59, + 5, 22, 53.0, 5.05 }, - { 19, 39, 11.59, + 5, 23, 52.1, 5.17 }, - { 4, 55, 58.39, + 5, 23, 57.1, 6.50 }, - { 4, 32, 4.80, + 5, 24, 36.0, 6.39 }, - { 6, 4, 58.20, + 5, 25, 12.0, 5.67 }, - { 4, 3, 44.59, + 5, 26, 8.2, 5.33 }, - { 18, 21, 28.49, + 5, 26, 8.9, 6.13 }, - { 15, 45, 23.50, + 5, 26, 48.8, 5.58 }, - { 9, 11, 55.61, + 5, 28, 5.9, 6.35 }, - { 13, 17, 36.29, + 5, 28, 10.9, 4.80 }, - { 7, 12, 7.39, + 5, 28, 28.9, 6.16 }, - { 1, 41, 25.90, + 5, 29, 15.0, 4.44 }, - { 15, 4, 6.41, + 5, 29, 33.0, 6.50 }, - { 13, 50, 24.70, + 5, 29, 49.9, 6.01 }, - { 15, 7, 40.30, + 5, 29, 53.2, 6.16 }, - { 18, 45, 28.39, + 5, 29, 58.9, 5.83 }, - { 21, 4, 34.70, + 5, 30, 10.1, 5.61 }, - { 19, 13, 44.09, + 5, 30, 56.9, 6.49 }, - { 16, 32, 35.69, + 5, 31, 16.0, 5.63 }, - { 4, 11, 20.30, + 5, 31, 23.2, 5.72 }, - { 20, 49, 59.09, + 5, 32, 40.9, 6.21 }, - { 7, 1, 55.01, + 5, 33, 27.0, 6.59 }, - { 4, 34, 8.30, + 5, 34, 7.0, 5.68 }, - { 2, 35, 52.51, + 5, 35, 35.9, 4.86 }, - { 4, 51, 12.41, + 5, 36, 18.0, 3.69 }, - { 10, 6, 47.40, + 5, 36, 41.0, 6.21 }, - { 23, 39, 57.00, + 5, 37, 35.0, 4.13 }, - { 9, 1, 31.39, + 5, 38, 26.9, 6.07 }, - { 1, 8, 22.20, + 5, 38, 58.9, 5.52 }, - { 7, 11, 51.31, + 5, 39, 16.9, 6.09 }, - { 1, 4, 52.61, + 5, 39, 23.0, 6.00 }, - { 21, 42, 15.50, + 5, 40, 48.0, 5.30 }, - { 8, 45, 1.30, + 5, 40, 50.2, 6.13 }, - { 10, 23, 14.59, + 5, 41, 39.1, 6.54 }, - { 8, 37, 39.41, + 5, 42, 13.0, 4.16 }, - { 21, 38, 31.90, + 5, 46, 18.1, 5.67 }, - { 22, 20, 27.60, + 5, 47, 21.8, 5.37 }, - { 12, 10, 3.41, + 5, 48, 24.8, 5.72 }, - { 14, 24, 11.30, + 5, 49, 12.0, 5.10 }, - { 8, 48, 25.99, + 5, 50, 16.1, 4.36 }, - { 7, 36, 34.70, + 5, 51, 42.1, 5.91 }, - { 16, 14, 13.49, + 5, 54, 6.8, 6.31 }, - { 8, 55, 23.59, + 5, 56, 44.2, 3.11 }, - { 5, 30, 47.11, + 5, 56, 53.2, 4.20 }, - { 12, 47, 2.30, + 5, 57, 2.9, 6.34 }, - { 9, 53, 42.91, + 5, 57, 29.9, 5.95 }, - { 21, 5, 26.69, + 5, 57, 29.9, 5.94 }, - { 4, 3, 9.41, + 5, 59, 21.1, 3.91 }, - { 20, 47, 48.31, + 6, 0, 29.9, 5.58 }, - { 13, 29, 57.60, + 6, 0, 47.9, 6.51 }, - { 11, 21, 8.21, + 6, 1, 45.8, 4.05 }, - { 3, 57, 1.70, + 6, 2, 24.0, 6.09 }, - { 3, 45, 40.39, + 6, 3, .0, 5.35 }, - { 6, 15, 40.10, + 6, 3, 58.0, 6.07 }, - { 19, 8, 59.90, + 6, 4, 23.9, 5.22 }, - { 17, 18, 52.80, + 6, 5, 7.1, 6.51 }, - { 17, 53, 14.21, + 6, 6, 5.0, 5.77 }, - { 11, 0, 44.81, + 6, 6, 5.0, 4.99 }, - { 2, 40, 15.70, + 6, 6, 42.8, 6.25 }, - { 4, 20, 41.21, + 6, 7, 50.9, 5.77 }, - { 6, 37, 24.10, + 6, 8, 7.1, 6.06 }, - { 1, 30, 11.09, + 6, 8, 38.0, 4.84 }, - { 10, 56, 1.51, + 6, 11, 7.1, 5.81 }, - { 4, 15, 29.21, + 6, 11, 12.1, 6.31 }, - { 3, 30, 45.41, + 6, 11, 19.0, 5.94 }, - { 18, 27, 58.80, + 6, 11, 39.1, 5.73 }, - { 22, 10, 12.00, + 6, 11, 52.1, 3.53 }, - { 4, 15, 25.80, + 6, 11, 58.9, 6.93 }, - { 18, 58, 23.81, + 6, 14, 25.1, 6.21 }, - { 18, 0, 52.90, + 6, 16, 5.9, 6.34 }, - { 17, 41, 32.30, + 6, 18, 46.1, 5.95 }, - { 6, 41, 59.30, + 6, 20, 42.0, 6.37 }, - { 5, 25, 7.90, + 6, 20, 58.9, 1.64 }, - { 13, 46, 57.10, + 6, 21, 2.2, 6.33 }, - { 6, 40, 31.80, + 6, 22, 18.1, 6.51 }, - { 10, 46, 5.69, + 6, 22, 23.2, 6.37 }, - { 16, 9, 11.21, + 6, 22, 44.0, 5.97 }, - { 23, 27, 58.10, + 6, 22, 44.0, 4.28 }, - { 19, 55, 18.79, + 6, 24, 24.1, 3.71 }, - { 3, 34, 49.20, + 6, 25, 4.1, 6.49 }, - { 8, 46, 46.61, + 6, 25, 8.0, 3.38 }, - { 15, 44, 16.10, + 6, 25, 32.2, 2.65 }, - { 5, 48, .19, + 6, 27, 15.1, 5.27 }, - { 0, 59, 49.70, + 6, 28, 59.2, 6.11 }, - { 17, 56, 55.99, + 6, 29, 16.1, 6.29 }, - { 11, 45, 51.60, + 6, 31, 45.8, 4.03 }, - { 3, 52, .19, + 6, 32, 4.9, 5.67 }, - { 10, 23, .41, + 6, 32, 33.0, 6.07 }, - { 17, 0, 29.40, + 6, 35, 1.0, 6.59 }, - { 12, 0, 52.39, + 6, 36, 51.1, 4.66 }, - { 18, 55, 27.50, + 6, 36, 55.1, 5.57 }, - { 23, 4, 1.01, + 6, 37, .1, 6.41 }, - { 21, 37, 43.70, + 6, 37, 5.9, 6.18 }, - { 8, 35, 51.00, + 6, 37, 12.0, 5.99 }, - { 8, 35, 51.29, + 6, 37, 21.0, 7.25 }, - { 3, 12, 26.40, + 6, 39, 38.9, 5.56 }, - { 18, 36, 39.10, + 6, 40, 18.8, 5.45 }, - { 7, 17, 17.81, + 6, 40, 50.2, 6.65 }, - { 9, 46, 10.01, + 6, 42, 31.0, 5.79 }, - { 22, 0, 7.90, + 6, 43, 3.0, 6.00 }, - { 0, 47, 23.59, + 6, 44, 26.9, 5.99 }, - { 3, 46, 9.50, + 6, 48, 11.2, 5.91 }, - { 12, 41, 57.10, + 6, 48, 24.1, 5.59 }, - { 21, 22, 53.59, + 6, 48, 40.0, 5.16 }, - { 9, 37, 12.70, + 6, 50, 8.9, 5.00 }, - { 23, 59, 18.70, + 6, 51, 47.9, 4.01 }, - { 21, 53, 57.79, + 6, 51, 51.8, 6.15 }, - { 5, 26, 38.81, + 6, 52, 9.1, 6.42 }, - { 2, 36, 4.90, + 6, 53, 12.8, 5.82 }, - { 7, 28, 2.11, + 6, 56, 30.8, 5.25 }, - { 16, 24, 10.80, + 6, 56, 53.2, 5.85 }, - { 10, 34, 48.00, + 6, 57, 13.0, 5.08 }, - { 0, 32, 23.81, + 6, 57, 20.2, 5.67 }, - { 4, 49, 50.40, + 6, 57, 41.0, 3.19 }, - { 12, 38, 30.00, + 6, 59, 17.9, 7.08 }, - { 21, 8, 28.20, + 6, 59, 21.8, 6.15 }, - { 1, 14, 42.41, + 6, 59, 43.1, 6.03 }, - { 6, 16, 58.39, + 7, 3, 11.2, 6.57 }, - { 23, 55, 7.80, + 7, 4, 16.0, 6.21 }, - { 6, 25, 13.10, + 7, 5, 8.9, 5.98 }, - { 19, 54, 40.30, + 7, 8, 25.1, 6.15 }, - { 7, 19, 47.59, + 7, 8, 34.1, 5.91 }, - { 13, 30, .10, + 7, 10, 44.0, 6.17 }, - { 7, 58, 5.81, + 7, 12, 49.0, 6.41 }, - { 16, 50, 19.39, + 7, 14, 52.1, 5.49 }, - { 23, 41, 56.69, + 7, 15, 2.2, 5.89 }, - { 18, 19, 9.50, + 7, 15, 34.9, 5.39 }, - { 20, 4, 8.30, + 7, 16, 41.2, 5.52 }, - { 9, 2, 44.81, + 7, 17, 53.2, 5.85 }, - { 0, 48, 17.40, + 7, 18, .0, 5.93 }, - { 6, 59, 20.09, + 7, 19, .8, 6.35 }, - { 6, 32, 54.19, + 7, 19, 59.2, 4.50 }, - { 11, 5, 1.01, + 7, 20, 10.0, 4.63 }, - { 22, 58, 42.60, + 7, 20, 22.9, 6.33 }, - { 15, 46, 26.59, + 7, 21, 11.2, 4.43 }, - { 21, 21, 4.80, + 7, 21, 15.8, 5.82 }, - { 18, 39, 51.60, + 7, 21, 29.9, 6.28 }, - { 19, 34, 5.40, + 7, 22, 44.0, 4.45 }, - { 5, 55, 10.30, + 7, 24, 24.8, 0.50 }, - { 7, 7, 49.51, + 7, 28, 16.0, 5.75 }, - { 2, 35, 4.10, + 7, 28, 17.0, 6.18 }, - { 21, 0, 3.89, + 7, 30, 59.0, 5.99 }, - { 5, 38, 1.10, + 7, 32, 29.0, 5.88 }, - { 14, 3, 36.79, + 7, 32, 47.0, 6.26 }, - { 8, 25, 54.79, + 7, 33, 51.8, 5.13 }, - { 6, 34, 46.39, + 7, 34, 21.0, 6.45 }, - { 1, 13, 43.90, + 7, 34, 31.1, 5.24 }, - { 1, 13, 45.29, + 7, 34, 41.9, 6.30 }, - { 0, 48, 40.99, + 7, 35, 6.0, 4.43 }, - { 17, 26, 19.01, + 7, 35, 44.2, 6.06 }, - { 12, 31, 21.41, + 7, 36, 15.1, 6.05 }, - { 19, 45, 39.91, + 7, 36, 47.9, 5.91 }, - { 6, 58, 39.00, + 7, 37, 18.8, 6.27 }, - { 12, 45, 37.10, + 7, 40, 23.9, 5.22 }, - { 2, 38, .79, + 7, 41, 43.1, 6.39 }, - { 4, 13, 33.10, + 7, 42, 58.0, 5.29 }, - { 2, 36, 35.11, + 7, 43, 46.9, 5.81 }, - { 4, 54, 47.81, + 7, 46, 45.1, 5.33 }, - { 20, 49, 48.31, + 7, 51, 51.1, 6.33 }, - { 4, 39, 6.19, + 7, 52, 14.9, 5.39 }, - { 1, 2, 56.59, + 7, 53, 24.0, 4.28 }, - { 17, 11, 45.19, + 7, 53, 40.9, 6.33 }, - { 19, 50, 17.50, + 7, 54, 9.0, 6.51 }, - { 1, 28, 22.90, + 7, 57, 41.0, 6.20 }, - { 7, 15, 39.41, + 7, 58, 40.1, 5.82 }, - { 8, 39, 24.60, + 8, 1, 1.9, 6.45 }, - { 18, 25, 38.81, + 8, 1, 54.8, 5.65 }, - { 6, 47, 19.80, + 8, 2, 13.9, 4.77 }, - { 10, 0, 12.79, + 8, 2, 39.1, 4.70 }, - { 11, 14, 1.80, + 8, 3, 38.2, 5.79 }, - { 14, 24, 18.29, + 8, 5, 6.0, 6.19 }, - { 16, 5, 37.80, + 8, 5, 46.0, 6.29 }, - { 11, 38, 27.60, + 8, 8, 3.1, 5.36 }, - { 14, 41, 38.81, + 8, 9, 42.1, 4.86 }, - { 22, 20, 55.80, + 8, 11, 12.1, 6.17 }, - { 9, 28, 29.21, + 8, 11, 17.9, 5.71 }, - { 0, 20, 35.90, + 8, 11, 25.1, 5.37 }, - { 21, 28, 24.79, + 8, 11, 44.2, 6.40 }, - { 4, 3, 56.59, + 8, 11, 49.9, 5.46 }, - { 19, 6, 22.20, + 8, 13, 48.0, 6.09 }, - { 0, 16, 34.10, + 8, 14, 24.0, 6.11 }, - { 14, 24, .91, + 8, 14, 37.0, 5.95 }, - { 11, 47, 54.89, + 8, 14, 44.9, 5.32 }, - { 2, 6, 12.31, + 8, 14, 51.0, 6.31 }, - { 22, 1, 9.19, + 8, 15, 25.9, 5.65 }, - { 11, 45, 17.09, + 8, 15, 29.9, 4.85 }, - { 18, 33, 23.30, + 8, 16, 5.9, 6.42 }, - { 7, 27, 9.00, + 8, 17, 21.8, 2.90 }, - { 9, 58, 7.61, + 8, 18, 51.1, 6.04 }, - { 6, 55, 34.61, + 8, 19, 28.9, 6.29 }, - { 19, 2, 21.60, + 8, 22, 27.1, 6.30 }, - { 6, 52, 49.39, + 8, 22, 49.1, 5.77 }, - { 2, 56, 13.80, + 8, 22, 54.1, 5.97 }, - { 13, 42, 12.70, + 8, 23, 17.9, 6.16 }, - { 5, 21, 43.61, + 8, 25, 43.0, 5.80 }, - { 20, 28, 7.49, + 8, 26, 15.0, 6.25 }, - { 11, 55, 3.10, + 8, 26, 38.0, 5.58 }, - { 14, 23, 22.61, + 8, 26, 42.0, 6.86 }, - { 14, 23, 22.70, + 8, 26, 48.1, 5.12 }, - { 17, 1, 59.09, + 8, 27, 2.2, 6.33 }, - { 8, 34, 13.30, + 8, 27, 6.8, 6.03 }, - { 2, 28, 9.50, + 8, 27, 36.0, 4.28 }, - { 19, 54, 14.90, + 8, 27, 41.0, 4.71 }, - { 3, 8, 38.71, + 8, 28, 14.9, 6.28 }, - { 0, 2, 29.69, + 8, 29, 8.2, 5.63 }, - { 5, 7, 52.90, + 8, 29, 53.9, 5.34 }, - { 16, 8, 28.01, + 8, 32, 3.1, 5.73 }, - { 22, 15, 59.81, + 8, 32, 57.8, 6.21 }, - { 20, 0, 58.90, + 8, 33, 29.2, 5.91 }, - { 2, 11, 21.10, + 8, 34, 10.9, 5.63 }, - { 15, 30, 55.39, + 8, 34, 45.1, 6.57 }, - { 15, 54, 40.30, + 8, 34, 49.1, 6.29 }, - { 16, 45, 49.90, + 8, 34, 57.0, 5.15 }, - { 6, 46, 32.40, + 8, 35, 13.9, 5.93 }, - { 4, 26, 21.10, + 8, 35, 25.1, 6.06 }, - { 12, 27, 42.10, + 8, 36, 37.1, 6.37 }, - { 7, 57, 15.91, + 8, 38, 29.0, 6.05 }, - { 10, 35, 2.21, + 8, 39, 1.1, 5.67 }, - { 6, 8, 47.21, + 8, 40, 12.0, 6.55 }, - { 23, 9, 31.51, + 8, 40, 37.9, 5.12 }, - { 23, 11, 44.21, + 8, 43, 12.0, 5.16 }, - { 12, 5, 12.50, + 8, 43, 59.2, 4.12 }, - { 18, 7, 18.41, + 8, 44, 2.0, 4.64 }, - { 10, 25, 15.19, + 8, 47, 4.9, 5.61 }, - { 22, 55, 13.70, + 8, 48, 56.9, 4.90 }, - { 0, 14, 58.80, + 8, 49, 14.9, 5.79 }, - { 18, 38, 21.00, + 8, 50, 2.0, 6.40 }, - { 2, 13, .00, + 8, 50, 48.1, 4.37 }, - { 17, 23, 57.60, + 8, 51, 10.1, 5.77 }, - { 7, 55, 31.39, + 8, 51, 46.1, 5.86 }, - { 8, 17, 31.70, + 8, 51, 58.0, 6.29 }, - { 19, 50, 46.99, + 8, 52, 5.9, 0.77 }, - { 11, 38, 9.79, + 8, 53, 3.1, 6.17 }, - { 6, 24, 2.30, + 8, 53, 4.9, 6.26 }, - { 4, 13, 31.30, + 8, 53, 26.2, 6.51 }, - { 4, 15, 32.11, + 8, 53, 31.9, 4.29 }, - { 14, 1, 20.40, + 8, 53, 40.9, 5.99 }, - { 4, 50, 36.70, + 8, 54, 1.1, 4.36 }, - { 2, 59, 42.89, + 8, 54, 27.0, 4.70 }, - { 8, 1, 50.71, + 8, 54, 50.0, 6.22 }, - { 7, 28, 9.79, + 8, 55, 32.2, 4.32 }, - { 9, 56, 25.99, + 8, 55, 59.2, 5.85 }, - { 5, 37, 19.30, + 8, 57, 6.8, 6.12 }, - { 0, 2, 24.19, + 8, 57, 24.8, 6.32 }, - { 3, 24, 48.79, + 9, 1, 44.0, 3.60 }, - { 6, 30, 5.50, + 9, 1, 45.1, 6.57 }, - { 6, 18, 40.49, + 9, 2, 49.9, 6.24 }, - { 9, 28, 27.50, + 9, 3, 24.1, 5.41 }, - { 18, 36, 27.79, + 9, 7, 21.0, 5.39 }, - { 22, 29, 7.99, + 9, 7, 44.0, 5.58 }, - { 7, 3, 17.90, + 9, 8, 17.9, 5.97 }, - { 1, 45, 23.59, + 9, 9, 28.1, 4.26 }, - { 8, 16, 30.91, + 9, 11, 8.2, 3.52 }, - { 7, 5, 39.10, + 9, 11, 8.9, 5.78 }, - { 4, 20, 49.01, + 9, 13, 32.2, 6.53 }, - { 4, 13, 56.40, + 9, 15, 49.0, 4.84 }, - { 7, 25, 38.90, + 9, 16, 34.0, 4.99 }, - { 5, 36, 54.29, + 9, 17, 26.2, 4.09 }, - { 10, 32, 48.70, + 9, 18, 24.1, 3.85 }, - { 23, 51, 21.19, + 9, 18, 47.9, 5.79 }, - { 22, 58, 35.09, + 9, 21, 24.8, 6.43 }, - { 3, 32, 36.00, + 9, 22, 25.0, 5.77 }, - { 16, 57, 40.10, + 9, 22, 30.0, 3.20 }, - { 8, 57, 42.00, + 9, 23, 16.1, 6.19 }, - { 20, 7, 50.30, + 9, 23, 58.9, 6.43 }, - { 23, 7, .31, + 9, 24, 33.8, 4.52 }, - { 4, 33, 48.10, + 9, 24, 47.2, 6.01 }, - { 13, 16, 46.51, + 9, 25, 27.1, 5.22 }, - { 4, 23, 51.89, + 9, 27, 38.9, 5.12 }, - { 5, 7, 38.30, + 9, 28, 18.8, 6.17 }, - { 4, 18, 24.50, + 9, 29, 12.1, 6.54 }, - { 5, 34, 49.20, + 9, 29, 21.8, 4.41 }, - { 5, 56, 28.01, + 9, 30, 34.9, 5.99 }, - { 5, 46, 52.10, + 9, 31, 19.9, 5.79 }, - { 12, 46, 22.51, + 9, 32, 24.0, 5.67 }, - { 18, 7, 21.00, + 9, 33, 50.0, 3.73 }, - { 2, 29, 35.30, + 9, 33, 56.9, 6.07 }, - { 8, 38, 5.21, + 9, 34, 28.9, 6.53 }, - { 17, 34, 36.70, + 9, 35, 12.1, 5.81 }, - { 19, 18, 52.70, + 9, 37, 5.2, 6.32 }, - { 19, 51, 17.71, + 9, 37, 49.1, 6.25 }, - { 6, 2, 22.99, + 9, 38, 51.0, 4.12 }, - { 8, 37, 5.81, + 9, 39, 20.2, 5.88 }, - { 23, 39, 55.10, + 9, 40, 37.9, 5.97 }, - { 14, 2, 31.80, + 9, 41, 11.0, 6.20 }, - { 16, 11, 29.69, + 9, 42, 45.0, 6.53 }, - { 9, 31, 57.60, + 9, 42, 56.9, 5.07 }, - { 3, 27, 10.20, + 9, 43, 58.1, 3.74 }, - { 17, 6, 9.70, + 9, 43, 59.9, 6.37 }, - { 10, 27, 39.00, + 9, 45, 45.0, 6.04 }, - { 8, 31, 54.60, + 9, 48, 51.8, 6.83 }, - { 8, 11, 16.61, + 9, 49, 16.0, 6.07 }, - { 23, 10, 1.51, + 9, 49, 18.8, 5.39 }, - { 5, 9, 19.61, + 9, 49, 45.8, 5.43 }, - { 22, 52, 24.10, + 9, 50, 8.2, 5.16 }, - { 5, 50, 2.59, + 9, 52, 16.0, 5.80 }, - { 21, 44, 11.21, + 9, 52, 30.0, 2.39 }, - { 16, 7, 37.49, + 9, 53, 30.1, 5.63 }, - { 9, 41, 9.00, + 9, 53, 31.9, 3.52 }, - { 6, 40, 58.70, + 9, 53, 44.2, 4.66 }, - { 19, 22, 48.41, + 9, 54, 47.2, 6.35 }, - { 5, 35, 8.30, + 9, 56, 3.1, 3.54 }, - { 5, 35, 8.50, + 9, 56, 6.0, 5.61 }, - { 6, 17, 6.60, + 9, 56, 33.0, 5.39 }, - { 6, 56, 25.80, + 9, 57, 23.0, 5.92 }, - { 4, 51, 43.39, + 9, 58, 30.0, 6.11 }, - { 6, 35, 17.59, + 9, 59, 17.9, 5.88 }, - { 10, 7, 54.31, + 9, 59, 51.0, 4.37 }, - { 4, 1, 46.10, + 9, 59, 52.1, 5.67 }, - { 21, 14, 28.90, +10, 0, 24.8, 4.49 }, - { 15, 36, 29.59, +10, 0, 36.0, 5.26 }, - { 4, 14, 36.29, +10, 0, 40.0, 5.22 }, - { 13, 9, 12.41, +10, 1, 19.9, 5.78 }, - { 21, 10, 31.20, +10, 2, 56.0, 6.07 }, - { 20, 25, 43.99, +10, 3, 23.0, 6.33 }, - { 20, 33, 53.59, +10, 3, 34.9, 6.56 }, - { 8, 32, 39.89, +10, 3, 58.0, 6.46 }, - { 8, 44, 45.00, +10, 4, 54.1, 5.66 }, - { 20, 39, 7.80, +10, 5, 10.0, 5.05 }, - { 14, 14, 50.81, +10, 6, 2.2, 5.29 }, - { 2, 44, 56.50, +10, 6, 51.1, 4.27 }, - { 4, 19, 37.49, +10, 7, 17.0, 6.31 }, - { 21, 10, 20.50, +10, 7, 54.1, 4.69 }, - { 18, 59, 17.50, +10, 8, 26.9, 6.75 }, - { 4, 54, 53.81, +10, 9, 2.9, 4.65 }, - { 4, 35, 39.29, +10, 9, 38.9, 4.25 }, - { 16, 54, .50, +10, 9, 55.1, 4.38 }, - { 21, 24, 24.60, +10, 10, 27.1, 6.35 }, - { 0, 28, 20.09, +10, 11, 22.9, 6.04 }, - { 13, 35, 33.29, +10, 12, 16.9, 6.49 }, - { 4, 13, 34.80, +10, 12, 43.9, 6.23 }, - { 12, 41, 53.11, +10, 14, 8.2, 4.88 }, - { 5, 35, 13.39, +10, 14, 24.0, 5.60 }, - { 12, 13, 25.90, +10, 15, 43.9, 5.85 }, - { 4, 30, 2.40, +10, 15, 45.0, 6.48 }, - { 12, 33, 2.90, +10, 17, 44.2, 6.26 }, - { 6, 28, 18.79, +10, 18, 14.0, 6.15 }, - { 3, 59, 40.70, +10, 19, 50.9, 6.37 }, - { 23, 43, 22.39, +10, 19, 53.0, 5.06 }, - { 19, 52, 15.60, +10, 21, 5.0, 6.54 }, - { 19, 51, 1.61, +10, 24, 56.2, 5.11 }, - { 12, 41, 34.39, +10, 25, 35.0, 6.19 }, - { 17, 6, 13.10, +10, 27, 15.1, 6.37 }, - { 22, 49, 32.30, +10, 28, 44.0, 6.54 }, - { 4, 29, 42.89, +10, 31, 18.1, 6.79 }, - { 11, 23, 55.49, +10, 31, 45.1, 3.94 }, - { 15, 34, 48.10, +10, 32, 15.0, 3.80 }, - { 15, 34, 48.10, +10, 32, 21.1, 3.80 }, - { 10, 49, 15.41, +10, 32, 43.1, 5.34 }, - { 7, 34, 5.09, +10, 34, 5.9, 6.28 }, - { 17, 12, 27.79, +10, 35, 7.1, 5.33 }, - { 5, 54, 13.39, +10, 35, 12.8, 6.12 }, - { 7, 26, 27.89, +10, 36, 29.9, 6.37 }, - { 2, 24, 49.01, +10, 36, 38.2, 5.47 }, - { 19, 46, 15.60, +10, 36, 47.9, 2.72 }, - { 6, 13, 12.60, +10, 37, 39.0, 6.45 }, - { 8, 23, 55.20, +10, 37, 54.8, 6.08 }, - { 9, 7, 44.81, +10, 40, 5.2, 5.24 }, - { 19, 48, 30.41, +10, 41, 39.1, 6.44 }, - { 20, 8, 38.30, +10, 43, 32.9, 6.31 }, - { 2, 42, 28.90, +10, 44, 30.1, 6.30 }, - { 13, 39, 34.61, +10, 44, 46.0, 5.57 }, - { 7, 46, 16.20, +10, 46, 5.9, 5.30 }, - { 14, 3, 32.30, +10, 47, 12.1, 6.30 }, - { 13, 29, 13.01, +10, 49, 5.9, 5.65 }, - { 21, 42, 33.00, +10, 49, 28.9, 6.09 }, - { 22, 41, 27.70, +10, 49, 53.0, 3.40 }, - { 20, 58, 25.90, +10, 50, 21.1, 5.48 }, - { 6, 37, 36.89, +10, 51, 11.2, 6.38 }, - { 17, 18, 37.01, +10, 51, 51.8, 5.03 }, - { 3, 0, 44.11, +10, 52, 13.1, 5.95 }, - { 18, 34, 47.50, +10, 53, 30.1, 6.40 }, - { 20, 30, 18.00, +10, 53, 44.9, 6.08 }, - { 11, 35, 43.39, +10, 54, 40.0, 6.56 }, - { 22, 43, 42.70, +10, 56, 21.1, 6.51 }, - { 23, 52, 37.10, +10, 56, 51.0, 5.30 }, - { 7, 3, 37.99, +10, 57, 6.1, 5.13 }, - { 13, 2, 10.61, +10, 57, 33.1, 2.83 }, - { 22, 2, 1.39, +10, 58, 26.0, 6.37 }, - { 18, 50, 45.60, +10, 58, 35.0, 6.55 }, - { 0, 20, 54.50, +10, 58, 36.8, 6.56 }, - { 6, 53, 22.51, +10, 59, 47.0, 6.24 }, - { 6, 41, 17.21, +11, 0, 11.9, 6.11 }, - { 7, 26, 41.30, +11, 0, 33.1, 6.41 }, - { 6, 29, .00, +11, 1, 9.8, 6.59 }, - { 11, 34, 10.01, +11, 1, 25.0, 6.55 }, - { 5, 37, 4.39, +11, 2, 6.0, 5.94 }, - { 1, 50, 52.01, +11, 2, 35.9, 5.94 }, - { 17, 57, 26.90, +11, 2, 39.1, 6.36 }, - { 23, 13, 26.50, +11, 3, 54.0, 5.82 }, - { 19, 6, 58.61, +11, 4, 17.0, 5.09 }, - { 17, 54, 14.21, +11, 7, 50.2, 6.38 }, - { 3, 48, 16.30, +11, 8, 35.9, 5.07 }, - { 0, 10, 2.30, +11, 8, 44.2, 5.51 }, - { 4, 44, 25.80, +11, 8, 46.0, 5.40 }, - { 19, 36, 7.99, +11, 9, .0, 6.68 }, - { 21, 18, 52.01, +11, 12, 11.9, 5.96 }, - { 0, 18, 17.21, +11, 12, 20.9, 6.05 }, - { 4, 27, 28.80, +11, 12, 45.0, 5.88 }, - { 20, 39, 51.79, +11, 14, 58.9, 6.42 }, - { 6, 31, 9.50, +11, 15, 2.9, 6.14 }, - { 20, 31, 13.01, +11, 15, 38.2, 7.11 }, - { 15, 35, 53.40, +11, 15, 56.2, 6.07 }, - { 19, 36, 52.51, +11, 16, 23.9, 5.98 }, - { 9, 31, 56.71, +11, 17, 58.9, 4.97 }, - { 20, 33, 12.79, +11, 18, 11.9, 4.03 }, - { 13, 14, 31.30, +11, 19, 54.1, 5.67 }, - { 3, 30, 24.50, +11, 20, 11.0, 5.14 }, - { 5, 16, 4.10, +11, 20, 29.0, 5.56 }, - { 20, 37, 49.10, +11, 22, 40.1, 5.43 }, - { 22, 3, 19.01, +11, 23, 11.0, 5.80 }, - { 16, 26, 11.50, +11, 24, 27.0, 6.11 }, - { 18, 37, 12.60, +11, 25, 18.1, 6.42 }, - { 19, 56, 14.30, +11, 25, 26.0, 5.28 }, - { 4, 54, 46.90, +11, 25, 34.0, 5.19 }, - { 9, 47, 33.50, +11, 25, 44.0, 6.02 }, - { 11, 24, 58.90, +11, 25, 49.1, 5.80 }, - { 16, 32, 36.29, +11, 29, 17.2, 4.84 }, - { 9, 17, 51.41, +11, 30, 4.0, 6.41 }, - { 5, 56, 49.51, +11, 31, 16.0, 5.87 }, - { 19, 19, 52.99, +11, 32, 6.0, 6.02 }, - { 6, 31, 48.29, +11, 32, 39.8, 5.23 }, - { 13, 12, 32.90, +11, 33, 22.0, 5.77 }, - { 9, 9, 46.39, +11, 33, 51.8, 6.48 }, - { 9, 47, 25.90, +11, 34, 5.9, 6.45 }, - { 19, 17, 49.01, +11, 35, 43.1, 5.28 }, - { 22, 10, 37.39, +11, 37, 27.8, 5.78 }, - { 8, 55, 55.61, +11, 37, 34.0, 5.41 }, - { 19, 52, 3.50, +11, 37, 44.0, 6.13 }, - { 14, 41, 43.49, +11, 39, 38.2, 5.56 }, - { 7, 24, 58.20, +11, 40, 10.9, 5.30 }, - { 6, 32, 23.30, +11, 40, 25.0, 6.03 }, - { 6, 3, 24.70, +11, 40, 50.9, 6.08 }, - { 22, 36, 36.41, +11, 41, 48.8, 6.40 }, - { 4, 46, 1.70, +11, 42, 20.2, 5.37 }, - { 10, 59, 41.09, +11, 42, 20.9, 6.55 }, - { 8, 16, 33.91, +11, 43, 35.0, 7.13 }, - { 22, 59, 11.81, +11, 43, 44.0, 5.75 }, - { 6, 20, 52.30, +11, 45, 23.0, 6.54 }, - { 5, 54, 32.21, +11, 45, 45.0, 6.59 }, - { 6, 31, 39.19, +11, 47, 31.9, 6.65 }, - { 9, 46, 23.30, +11, 48, 36.0, 5.63 }, - { 8, 50, 26.10, +11, 48, 45.0, }, - { 19, 48, 42.10, +11, 48, 56.9, 5.72 }, - { 19, 42, 34.01, +11, 49, 36.1, 5.27 }, - { 22, 56, 51.50, +11, 50, 53.9, 6.51 }, - { 8, 58, 29.21, +11, 51, 28.1, 4.25 }, - { 3, 10, 38.90, +11, 52, 21.0, 5.98 }, - { 6, 57, 25.70, +11, 54, 27.0, 6.27 }, - { 17, 30, 22.39, +11, 55, 30.0, 6.39 }, - { 17, 32, 15.00, +11, 55, 49.1, 6.42 }, - { 19, 24, 58.20, +11, 56, 39.8, 5.16 }, - { 17, 50, 43.49, +11, 56, 48.1, 6.17 }, - { 12, 47, 13.61, +11, 57, 29.2, 6.07 }, - { 10, 8, 22.30, +11, 58, 1.9, 1.35 }, - { 0, 47, 1.51, +11, 58, 26.0, 5.50 }, - { 11, 18, 21.00, +11, 59, 4.9, 6.66 }, - { 18, 5, 43.30, +12, 0, 14.0, 7.04 }, - { 7, 29, 47.81, +12, 0, 24.1, 4.54 }, - { 18, 22, 35.30, +12, 1, 44.0, 5.89 }, - { 15, 40, 10.39, +12, 3, 11.2, 6.25 }, - { 21, 56, 56.40, +12, 4, 35.0, 5.54 }, - { 8, 46, 55.99, +12, 6, 36.0, 5.87 }, - { 7, 14, 32.59, +12, 6, 56.9, 5.62 }, - { 21, 31, 9.60, +12, 8, 15.0, 6.08 }, - { 1, 37, 5.90, +12, 8, 30.1, 5.57 }, - { 13, 52, 18.41, +12, 9, 55.1, 6.04 }, - { 22, 46, 41.59, +12, 10, 22.1, 4.19 }, - { 19, 42, 12.79, +12, 11, 35.9, 6.34 }, - { 4, 40, 3.41, +12, 11, 52.1, 5.46 }, - { 22, 21, 31.10, +12, 12, 19.1, 5.01 }, - { 6, 16, 26.59, +12, 16, 19.9, 5.04 }, - { 11, 50, 55.30, +12, 16, 44.0, 6.35 }, - { 1, 59, 25.90, +12, 17, 40.9, 6.09 }, - { 23, 23, 4.61, +12, 18, 50.0, 5.08 }, - { 19, 19, 39.31, +12, 22, 28.9, 5.53 }, - { 16, 40, 51.41, +12, 23, 42.0, 6.08 }, - { 12, 53, 49.70, +12, 25, 7.0, 6.25 }, - { 13, 24, 30.50, +12, 25, 54.8, 6.44 }, - { 9, 58, 13.39, +12, 26, 40.9, 5.26 }, - { 2, 44, 57.60, +12, 26, 44.9, 5.18 }, - { 2, 36, 37.90, +12, 26, 51.0, 5.68 }, - { 17, 10, 45.79, +12, 28, 1.9, 6.57 }, - { 4, 0, 40.80, +12, 29, 25.1, 3.47 }, - { 4, 38, 9.50, +12, 30, 38.9, 4.27 }, - { 20, 49, 37.80, +12, 32, 43.1, 5.98 }, - { 6, 15, 45.00, +12, 33, 4.0, 5.33 }, - { 17, 34, 56.11, +12, 33, 36.0, 2.08 }, - { 15, 22, 23.21, +12, 34, 3.0, 6.28 }, - { 20, 55, 38.59, +12, 34, 7.0, 5.58 }, - { 6, 22, 36.50, +12, 34, 12.0, 6.00 }, - { 22, 37, 4.70, +12, 34, 37.9, 6.30 }, - { 7, 3, 51.60, +12, 35, 39.8, 5.98 }, - { 3, 24, 10.10, +12, 37, 45.8, 6.04 }, - { 5, 49, 32.90, +12, 39, 4.0, 4.91 }, - { 8, 26, 43.90, +12, 39, 15.8, 5.50 }, - { 8, 43, 12.31, +12, 40, 50.9, 5.64 }, - { 6, 45, 54.19, +12, 41, 37.0, 6.46 }, - { 3, 27, 18.70, +12, 44, 6.0, 6.28 }, - { 17, 5, 22.70, +12, 44, 26.9, 4.91 }, - { 4, 13, 49.90, +12, 45, 11.9, 6.25 }, - { 23, 29, 9.31, +12, 45, 38.2, 4.55 }, - { 5, 58, 53.21, +12, 48, 31.0, 5.70 }, - { 11, 15, 57.79, +12, 50, 40.9, 6.67 }, - { 15, 41, 47.40, +12, 50, 51.0, 5.33 }, - { 7, 44, 13.99, +12, 51, 33.8, 6.43 }, - { 6, 45, 17.40, +12, 53, 44.2, 3.36 }, - { 3, 30, 52.39, +12, 56, 12.1, 4.11 }, - { 1, 6, 33.60, +12, 57, 22.0, 6.12 }, - { 14, 14, 5.21, +12, 57, 33.8, 5.54 }, - { 6, 39, 47.59, +12, 58, 59.2, 5.97 }, - { 14, 19, 16.30, +13, 0, 15.1, 5.41 }, - { 19, 26, 24.10, +13, 1, 26.0, 5.74 }, - { 20, 33, 57.00, +13, 1, 37.9, 5.38 }, - { 3, 51, 15.79, +13, 2, 44.9, 6.30 }, - { 4, 28, 50.21, +13, 2, 51.0, 5.03 }, - { 3, 11, 21.91, +13, 2, 52.1, 6.12 }, - { 8, 14, 21.00, +13, 2, 53.9, 6.38 }, - { 9, 51, 1.99, +13, 3, 58.0, 6.46 }, - { 18, 7, 48.41, +13, 4, 16.0, 6.63 }, - { 8, 5, 4.51, +13, 7, 5.2, 5.12 }, - { 22, 1, 5.40, +13, 7, 10.9, 5.60 }, - { 6, 54, 38.69, +13, 10, 40.1, 4.65 }, - { 3, 6, 23.71, +13, 11, 13.9, 5.62 }, - { 15, 53, 12.10, +13, 11, 48.1, 6.10 }, - { 0, 35, 54.70, +13, 12, 24.1, 6.41 }, - { 20, 19, 29.21, +13, 13, .8, 6.21 }, - { 6, 43, 59.30, +13, 13, 40.1, 4.49 }, - { 15, 8, 53.40, +13, 14, 6.0, 6.10 }, - { 7, 59, 35.09, +13, 14, 31.9, 6.02 }, - { 8, 33, 45.10, +13, 15, 25.9, 6.28 }, - { 16, 49, 34.61, +13, 15, 41.0, 5.91 }, - { 19, 44, 34.10, +13, 18, 10.1, 6.26 }, - { 11, 15, 51.89, +13, 18, 27.0, 5.32 }, - { 20, 38, 43.90, +13, 18, 54.0, 5.72 }, - { 17, 38, 57.79, +13, 19, 45.1, 6.12 }, - { 10, 11, 38.21, +13, 21, 18.0, 6.44 }, - { 7, 49, 1.99, +13, 22, 14.9, 6.04 }, - { 0, 34, 55.30, +13, 22, 16.0, 6.40 }, - { 0, 5, 42.00, +13, 23, 46.0, 5.51 }, - { 4, 9, 1.61, +13, 23, 53.9, 5.95 }, - { 6, 50, 25.49, +13, 24, 47.9, 5.65 }, - { 2, 2, 35.21, +13, 28, 36.1, 5.94 }, - { 7, 41, 51.79, +13, 28, 50.2, 5.77 }, - { 0, 22, 25.49, +13, 28, 57.0, 6.23 }, - { 4, 56, 22.30, +13, 30, 51.8, 4.07 }, - { 14, 40, 42.41, +13, 32, 3.1, 5.91 }, - { 20, 20, .19, +13, 32, 53.2, 5.95 }, - { 12, 48, 14.30, +13, 33, 11.2, 6.56 }, - { 17, 3, 58.01, +13, 34, 3.0, 6.08 }, - { 16, 48, 8.90, +13, 35, 26.2, 6.35 }, - { 17, 3, 39.31, +13, 36, 19.1, 5.93 }, - { 16, 55, 16.01, +13, 37, 10.9, 6.34 }, - { 18, 59, 5.69, +13, 37, 21.0, 5.23 }, - { 6, 11, 27.89, +13, 38, 19.0, 6.04 }, - { 8, 8, 42.41, +13, 38, 26.9, 6.27 }, - { 15, 43, 10.61, +13, 40, 4.1, 6.48 }, - { 13, 17, 15.60, +13, 40, 32.2, 5.33 }, - { 5, 28, 34.80, +13, 40, 44.0, 6.35 }, - { 16, 37, 48.00, +13, 41, 12.8, 6.31 }, - { 0, 57, 54.50, +13, 41, 44.9, 6.32 }, - { 20, 55, 36.70, +13, 43, 17.0, 5.17 }, - { 4, 30, 37.30, +13, 43, 27.8, 5.40 }, - { 10, 16, 40.70, +13, 43, 41.9, 5.41 }, - { 14, 41, 8.90, +13, 43, 41.9, 4.83 }, - { 14, 41, 8.90, +13, 43, 41.9, 4.43 }, - { 7, 40, 47.30, +13, 46, 14.9, 6.24 }, - { 18, 18, 2.90, +13, 46, 36.8, 6.30 }, - { 13, 28, 25.80, +13, 46, 44.0, 4.98 }, - { 15, 48, 13.30, +13, 47, 19.0, 6.00 }, - { 19, 41, 5.50, +13, 48, 56.2, 6.01 }, - { 6, 15, 8.50, +13, 51, 4.0, 5.91 }, - { 19, 5, 24.60, +13, 51, 47.9, 2.99 }, - { 4, 20, 52.80, +13, 51, 51.1, 6.17 }, - { 16, 57, 31.99, +13, 53, 3.1, 6.37 }, - { 5, 47, 42.89, +13, 53, 58.9, 5.29 }, - { 18, 58, 46.90, +13, 54, 24.1, 5.89 }, - { 5, 56, 3.50, +13, 55, 31.1, 6.60 }, - { 18, 52, 1.90, +13, 57, 56.2, 6.14 }, - { 8, 12, 22.10, +14, 0, 14.0, 6.54 }, - { 9, 43, 43.90, +14, 1, 18.1, 5.35 }, - { 16, 25, 25.01, +14, 1, 59.9, 4.57 }, - { 4, 19, 57.70, +14, 2, 7.1, 5.59 }, - { 13, 55, 49.99, +14, 3, 23.0, 6.16 }, - { 6, 17, 33.29, +14, 3, 29.9, 6.59 }, - { 4, 22, 3.50, +14, 4, 37.9, 5.72 }, - { 17, 3, 7.80, +14, 5, 30.8, 4.98 }, - { 15, 47, 17.30, +14, 6, 55.1, 5.71 }, - { 12, 48, 54.19, +14, 7, 21.0, 5.70 }, - { 10, 32, 11.81, +14, 8, 13.9, 5.46 }, - { 6, 33, 36.10, +14, 9, 19.1, 5.53 }, - { 5, 52, 22.30, +14, 10, 18.1, 5.59 }, - { 10, 46, 25.30, +14, 11, 40.9, 5.48 }, - { 7, 42, 3.19, +14, 12, 29.9, 5.56 }, - { 6, 11, 56.40, +14, 12, 32.0, 4.48 }, - { 8, 28, 37.30, +14, 12, 38.9, 5.95 }, - { 4, 52, 31.99, +14, 15, 2.2, 4.74 }, - { 19, 27, 33.89, +14, 16, 57.0, 6.32 }, - { 11, 48, 38.71, +14, 17, 3.1, 5.88 }, - { 18, 8, 33.70, +14, 17, 4.9, 6.37 }, - { 17, 43, 22.01, +14, 17, 42.0, 6.24 }, - { 13, 38, 7.90, +14, 18, 6.1, 6.52 }, - { 5, 33, 54.29, +14, 18, 20.2, 5.64 }, - { 5, 50, 28.90, +14, 18, 20.2, 5.52 }, - { 11, 31, 44.90, +14, 21, 51.8, 6.20 }, - { 9, 35, 52.90, +14, 22, 46.9, 6.36 }, - { 6, 18, 5.59, +14, 22, 58.1, 6.16 }, - { 17, 14, 39.19, +14, 23, 24.0, 5.39 }, - { 17, 14, 38.90, +14, 23, 25.1, 3.48 }, - { 19, 36, 15.79, +14, 23, 30.1, 6.38 }, - { 11, 11, 43.70, +14, 24, 1.1, 6.30 }, - { 17, 44, 17.30, +14, 24, 37.1, 6.19 }, - { 15, 57, 14.59, +14, 24, 51.8, 5.54 }, - { 14, 56, 13.20, +14, 26, 47.0, 5.77 }, - { 5, 47, 13.20, +14, 29, 17.9, 5.72 }, - { 17, 3, 10.39, +14, 30, 40.0, 6.52 }, - { 22, 41, 57.41, +14, 30, 59.0, 5.90 }, - { 4, 58, 59.40, +14, 32, 34.1, 6.09 }, - { 19, 16, 26.81, +14, 32, 40.9, 5.63 }, - { 22, 40, 52.70, +14, 32, 57.8, 5.71 }, - { 20, 22, 52.30, +14, 33, 5.0, 6.17 }, - { 20, 20, 20.50, +14, 34, 9.1, 6.13 }, - { 11, 49, 3.60, +14, 34, 18.8, 2.14 }, - { 20, 41, 16.20, +14, 34, 59.2, 5.99 }, - { 20, 37, 33.00, +14, 35, 43.1, 3.63 }, - { 19, 29, 22.10, +14, 35, 44.9, 5.56 }, - { 8, 10, 58.80, +14, 37, 45.8, 6.23 }, - { 22, 10, 22.20, +14, 37, 48.0, 6.33 }, - { 13, 58, 39.89, +14, 38, 57.8, 6.00 }, - { 6, 20, 4.20, +14, 39, 4.0, 5.69 }, - { 1, 35, 46.39, +14, 39, 41.0, 6.22 }, - { 20, 35, 18.50, +14, 40, 27.1, 4.68 }, - { 4, 26, 36.41, +14, 42, 49.0, 4.69 }, - { 6, 25, 28.10, +14, 43, 18.8, 6.24 }, - { 21, 3, 1.80, +14, 43, 48.0, 6.31 }, - { 4, 28, 23.40, +14, 44, 26.9, 5.90 }, - { 6, 7, 34.30, +14, 46, 5.9, 4.42 }, - { 21, 44, 31.30, +14, 46, 18.8, 5.94 }, - { 17, 33, 42.79, +14, 50, 30.1, 6.48 }, - { 4, 33, 50.90, +14, 50, 39.8, 4.65 }, - { 12, 16, .19, +14, 53, 56.0, 5.10 }, - { 19, 23, 8.21, +14, 55, 16.0, 6.64 }, - { 9, 15, 13.80, +14, 56, 29.0, 5.34 }, - { 1, 5, 5.40, +14, 56, 46.0, 5.68 }, - { 17, 1, 33.00, +14, 56, 57.8, 6.31 }, - { 18, 25, 55.39, +14, 58, .1, 6.37 }, - { 16, 52, 4.90, +14, 58, 27.1, 6.52 }, - { 10, 21, 50.30, +14, 58, 32.2, 6.12 }, - { 9, 12, 17.59, +14, 59, 46.0, 6.51 }, - { 2, 32, 54.10, +15, 2, 4.9, 6.04 }, - { 4, 55, 50.30, +15, 2, 24.0, 5.81 }, - { 18, 59, 37.39, +15, 4, 5.9, 4.02 }, - { 20, 43, 27.50, +15, 4, 27.8, 4.43 }, - { 2, 51, 29.59, +15, 4, 54.8, 5.49 }, - { 19, 15, 20.09, +15, 5, 1.0, 5.57 }, - { 18, 0, 57.19, +15, 5, 35.9, 6.26 }, - { 4, 20, 36.31, +15, 5, 43.1, 5.26 }, - { 7, 28, 47.30, +15, 6, 33.8, 6.22 }, - { 14, 46, 6.00, +15, 7, 54.8, 5.63 }, - { 15, 50, 41.71, +15, 8, 1.0, 5.20 }, - { 7, 20, 6.89, +15, 8, 34.1, 6.45 }, - { 12, 17, 44.30, +15, 8, 39.1, 6.34 }, - { 4, 7, 42.00, +15, 9, 46.1, 6.01 }, - { 17, 41, 10.99, +15, 10, 41.2, 6.34 }, - { 0, 13, 14.21, +15, 11, 1.0, 2.83 }, - { 20, 14, 16.61, +15, 11, 51.0, 4.95 }, - { 23, 4, 45.70, +15, 12, 19.1, 2.49 }, - { 0, 36, 47.30, +15, 13, 54.1, 5.89 }, - { 5, 27, 13.80, +15, 15, 28.1, 6.16 }, - { 14, 17, 28.39, +15, 15, 47.9, 5.80 }, - { 2, 13, 3.29, +15, 16, 46.9, 5.71 }, - { 2, 44, 32.90, +15, 18, 42.1, 5.77 }, - { 8, 36, 7.70, +15, 18, 49.0, 6.32 }, - { 8, 57, 14.90, +15, 19, 22.1, 5.20 }, - { 17, 51, 58.49, +15, 19, 32.9, 6.46 }, - { 7, 2, 17.40, +15, 20, 10.0, 5.74 }, - { 1, 31, 28.99, +15, 20, 44.9, 3.62 }, - { 8, 51, 1.51, +15, 21, 2.2, 6.38 }, - { 5, 30, 26.09, +15, 21, 37.1, 5.94 }, - { 9, 21, 15.41, +15, 22, 16.0, 6.53 }, - { 4, 15, 46.30, +15, 24, 2.2, 6.32 }, - { 5, 4, 34.10, +15, 24, 15.1, 4.68 }, - { 11, 29, 41.90, +15, 24, 47.9, 5.74 }, - { 15, 46, 11.30, +15, 25, 18.8, 3.67 }, - { 15, 25, 47.40, +15, 25, 41.2, 5.17 }, - { 11, 14, 14.40, +15, 25, 45.8, 3.34 }, - { 3, 37, 47.81, +15, 25, 50.9, 6.39 }, - { 0, 46, 33.00, +15, 28, 32.2, 5.38 }, - { 16, 36, 43.01, +15, 29, 53.2, 6.30 }, - { 20, 5, 26.50, +15, 30, 1.1, 6.34 }, - { 7, 24, 27.70, +15, 31, 1.9, 6.41 }, - { 8, 57, 35.21, +15, 34, 53.0, 5.67 }, - { 5, 9, 42.00, +15, 35, 49.9, 4.82 }, - { 17, 24, 33.79, +15, 36, 22.0, 6.35 }, - { 4, 26, 20.81, +15, 37, 5.9, 4.49 }, - { 4, 19, 47.59, +15, 37, 39.0, 3.65 }, - { 4, 30, 8.59, +15, 38, 17.2, 5.58 }, - { 11, 55, 40.49, +15, 38, 48.1, 5.53 }, - { 21, 7, 33.60, +15, 39, 31.0, 6.34 }, - { 15, 56, 27.19, +15, 39, 42.1, 3.85 }, - { 1, 10, 11.50, +15, 40, 27.1, 6.06 }, - { 4, 30, 38.90, +15, 41, 30.8, 5.48 }, - { 14, 53, 23.30, +15, 42, 15.8, 6.40 }, - { 16, 45, 22.51, +15, 44, 43.1, 5.56 }, - { 10, 5, 40.90, +15, 45, 27.0, 6.37 }, - { 7, 56, 59.40, +15, 47, 25.1, 5.78 }, - { 13, 49, 28.61, +15, 47, 52.1, 4.07 }, - { 4, 39, 9.19, +15, 47, 58.9, 5.07 }, - { 5, 46, 45.50, +15, 49, 21.0, 6.00 }, - { 7, 33, 36.50, +15, 49, 36.1, 5.25 }, - { 20, 39, 4.99, +15, 50, 17.2, 5.97 }, - { 4, 31, 51.79, +15, 51, 6.1, 6.02 }, - { 3, 4, 40.70, +15, 51, 22.0, 6.49 }, - { 22, 32, 46.90, +15, 51, 47.9, 6.32 }, - { 4, 28, 39.70, +15, 52, 14.9, 3.40 }, - { 5, 27, 45.60, +15, 52, 27.1, 5.50 }, - { 6, 31, 37.39, +15, 54, 11.9, 6.40 }, - { 4, 49, 44.09, +15, 54, 15.1, 6.08 }, - { 20, 39, 38.30, +15, 54, 42.8, 3.77 }, - { 4, 39, 16.49, +15, 55, 5.2, 4.69 }, - { 7, 8, 22.01, +15, 55, 50.9, 5.44 }, - { 4, 25, 37.30, +15, 56, 26.9, 6.46 }, - { 17, 41, 58.70, +15, 57, 6.8, 5.52 }, - { 4, 28, 34.51, +15, 57, 43.9, 3.84 }, - { 21, 13, 28.80, +15, 58, 57.0, 6.27 }, - { 15, 40, 59.21, +16, 1, 28.9, 6.01 }, - { 20, 3, 30.00, +16, 1, 53.0, 5.67 }, - { 4, 38, 9.41, +16, 1, 59.9, 5.79 }, - { 22, 11, 51.29, +16, 2, 26.2, 5.95 }, - { 5, 11, 41.59, +16, 2, 44.2, 5.18 }, - { 15, 32, 9.70, +16, 3, 22.0, 6.22 }, - { 6, 24, 52.90, +16, 3, 24.8, 6.33 }, - { 15, 53, 34.90, +16, 4, 30.0, 6.09 }, - { 7, 0, 15.79, +16, 4, 44.0, 5.68 }, - { 15, 36, 29.30, +16, 7, 8.0, 5.93 }, - { 12, 52, 27.60, +16, 7, 21.0, 6.30 }, - { 20, 46, 39.50, +16, 7, 27.1, 4.27 }, - { 20, 46, 38.71, +16, 7, 27.8, 5.14 }, - { 6, 12, 3.29, +16, 7, 50.2, 4.95 }, - { 1, 14, 7.61, +16, 8, 1.0, 5.98 }, - { 6, 15, 25.10, +16, 8, 35.2, 5.30 }, - { 7, 13, 22.30, +16, 9, 32.0, 5.00 }, - { 4, 30, 33.70, +16, 11, 38.0, 4.78 }, - { 18, 37, 9.00, +16, 11, 53.9, 6.29 }, - { 6, 49, 49.80, +16, 12, 10.1, 5.85 }, - { 6, 28, 28.01, +16, 14, 17.9, 6.23 }, - { 11, 49, 14.90, +16, 14, 34.1, 6.04 }, - { 17, 24, 31.51, +16, 18, 4.0, 5.71 }, - { 14, 19, 45.19, +16, 18, 24.8, 4.86 }, - { 17, 33, 39.41, +16, 19, 3.0, 5.69 }, - { 4, 28, 26.40, +16, 21, 34.9, 4.97 }, - { 14, 57, 11.71, +16, 23, 17.9, 5.71 }, - { 6, 41, 21.79, +16, 23, 51.0, 6.28 }, - { 6, 37, 42.70, +16, 23, 57.1, 1.93 }, - { 1, 39, 40.80, +16, 24, 20.9, 5.97 }, - { 14, 40, 43.90, +16, 25, 4.1, 5.88 }, - { 14, 40, 43.61, +16, 25, 5.9, 4.94 }, - { 9, 37, 2.59, +16, 26, 16.1, 5.69 }, - { 0, 28, 12.70, +16, 26, 42.0, 6.06 }, - { 8, 1, 30.31, +16, 27, 19.1, 5.99 }, - { 11, 25, 36.41, +16, 27, 23.0, 5.57 }, - { 19, 37, 17.40, +16, 27, 46.1, 5.66 }, - { 18, 10, 8.71, +16, 28, 36.1, 6.09 }, - { 2, 53, 11.71, +16, 28, 59.9, 6.31 }, - { 17, 34, 27.19, +16, 30, 14.0, 6.40 }, - { 4, 35, 55.20, +16, 30, 33.1, 0.85 }, - { 8, 12, 59.81, +16, 30, 51.1, 6.01 }, - { 7, 58, 31.49, +16, 31, 7.0, 5.99 }, - { 5, 41, 17.71, +16, 32, 2.0, 4.86 }, - { 3, 39, 25.70, +16, 32, 12.1, 6.16 }, - { 7, 18, 5.59, +16, 32, 25.1, 3.58 }, - { 23, 5, 6.29, +16, 33, 47.2, 6.44 }, - { 19, 39, 25.39, +16, 34, 17.0, 6.38 }, - { 12, 46, 38.71, +16, 34, 39.0, 5.12 }, - { 9, 25, 32.50, +16, 35, 8.2, 6.29 }, - { 19, 56, 1.30, +16, 38, 4.9, 5.36 }, - { 20, 8, 6.50, +16, 39, 51.1, 6.42 }, - { 16, 11, 28.70, +16, 39, 56.2, 6.08 }, - { 7, 2, 33.50, +16, 40, 27.1, 5.82 }, - { 18, 23, 2.90, +16, 41, 17.2, 6.22 }, - { 5, 23, 37.70, +16, 41, 57.8, 6.08 }, - { 5, 26, 5.71, +16, 42, 1.1, 6.25 }, - { 17, 21, 33.41, +16, 43, 50.9, 6.35 }, - { 18, 0, 3.41, +16, 45, 2.9, 4.67 }, - { 10, 7, 19.99, +16, 45, 46.1, 3.52 }, - { 4, 23, 25.01, +16, 46, 37.9, 5.64 }, - { 19, 57, 45.41, +16, 47, 21.1, 5.53 }, - { 11, 34, 42.50, +16, 47, 48.8, 5.95 }, - { 12, 10, 31.61, +16, 48, 33.1, 6.39 }, - { 20, 59, 50.81, +16, 49, 27.1, 6.66 }, - { 23, 37, 39.79, +16, 49, 32.2, 6.26 }, - { 22, 53, 2.30, +16, 50, 28.0, 5.64 }, - { 19, 12, 34.39, +16, 50, 47.0, 6.73 }, - { 13, 9, 47.81, +16, 50, 55.0, 5.91 }, - { 19, 8, 40.20, +16, 51, 5.0, 6.48 }, - { 19, 7, 57.29, +16, 51, 11.9, 6.07 }, - { 17, 25, 54.41, +16, 55, 3.0, 5.98 }, - { 18, 31, 4.39, +16, 55, 43.0, 5.77 }, - { 19, 24, 22.10, +16, 56, 16.1, 6.25 }, - { 6, 31, 10.10, +16, 56, 19.0, 6.20 }, - { 0, 48, 58.70, +16, 56, 26.2, 5.07 }, - { 22, 54, 35.69, +16, 56, 30.1, 6.12 }, - { 1, 48, 10.90, +16, 57, 20.2, 5.84 }, - { 14, 45, 14.50, +16, 57, 51.8, 4.60 }, - { 18, 35, 53.21, +16, 58, 32.2, 6.21 }, - { 5, 37, 3.79, +17, 2, 25.1, 5.54 }, - { 8, 25, 49.90, +17, 2, 46.0, 6.14 }, - { 16, 8, 4.51, +17, 2, 48.8, 5.00 }, - { 16, 8, 4.90, +17, 3, 15.8, 6.25 }, - { 16, 35, 26.30, +17, 3, 25.9, 6.41 }, - { 5, 32, 14.21, +17, 3, 29.2, 5.46 }, - { 20, 4, 6.19, +17, 4, 12.0, 5.80 }, - { 12, 52, 12.31, +17, 4, 26.0, 6.32 }, - { 7, 31, 48.41, +17, 5, 10.0, 5.42 }, - { 12, 36, 58.30, +17, 5, 21.8, 5.68 }, - { 13, 1, 9.60, +17, 7, 23.2, 5.96 }, - { 15, 33, 52.80, +17, 8, 16.1, 6.45 }, - { 8, 57, 8.21, +17, 8, 38.0, 6.17 }, - { 4, 57, 22.30, +17, 9, 13.0, 5.48 }, - { 6, 16, 23.81, +17, 10, 53.0, 6.39 }, - { 21, 47, 4.70, +17, 11, 39.1, 6.21 }, - { 16, 8, 46.61, +17, 12, 20.9, 6.14 }, - { 2, 9, 23.09, +17, 13, 27.8, 6.43 }, - { 8, 55, 22.90, +17, 13, 53.0, 6.64 }, - { 5, 28, 1.61, +17, 14, 20.0, 5.77 }, - { 15, 44, 42.10, +17, 15, 51.1, 6.14 }, - { 4, 12, 31.39, +17, 16, 39.0, 6.09 }, - { 21, 50, 8.71, +17, 17, 8.2, 5.29 }, - { 4, 0, 36.91, +17, 17, 48.1, 6.32 }, - { 8, 0, 47.30, +17, 18, 31.0, 5.55 }, - { 20, 26, 23.21, +17, 18, 56.2, 6.22 }, - { 17, 18, 4.99, +17, 19, 5.2, 6.00 }, - { 6, 19, 1.80, +17, 19, 30.0, 6.32 }, - { 3, 53, 10.01, +17, 19, 36.8, 5.97 }, - { 4, 7, 59.40, +17, 20, 22.9, 5.89 }, - { 21, 44, 30.70, +17, 21, .0, 4.34 }, - { 18, 58, 14.69, +17, 21, 38.9, 5.38 }, - { 5, 24, 25.39, +17, 22, 59.9, 4.99 }, - { 15, 52, 56.21, +17, 24, 13.0, 6.36 }, - { 12, 58, 55.39, +17, 24, 33.8, 4.78 }, - { 1, 46, 35.30, +17, 24, 47.2, 6.55 }, - { 1, 35, 54.79, +17, 26, 1.0, 5.80 }, - { 4, 24, 5.81, +17, 26, 38.0, 4.80 }, - { 13, 47, 15.70, +17, 27, 24.1, 4.50 }, - { 2, 49, 17.50, +17, 27, 51.1, 5.22 }, - { 19, 41, 2.90, +17, 28, 34.0, 4.37 }, - { 20, 0, 3.31, +17, 31, .1, 5.37 }, - { 20, 41, 58.20, +17, 31, 17.0, 6.22 }, - { 13, 9, 59.30, +17, 31, 45.8, 5.22 }, - { 13, 9, 59.30, +17, 31, 45.8, 5.22 }, - { 4, 22, 56.09, +17, 32, 33.0, 3.76 }, - { 23, 10, 42.60, +17, 35, 39.8, 5.71 }, - { 6, 42, 24.29, +17, 38, 43.1, 5.21 }, - { 8, 12, 12.70, +17, 38, 52.1, 6.02 }, - { 8, 12, 12.70, +17, 38, 52.1, 5.63 }, - { 8, 12, 13.30, +17, 38, 52.1, 6.20 }, - { 15, 35, 33.19, +17, 39, 20.2, 6.12 }, - { 7, 39, 28.61, +17, 40, 28.9, 5.05 }, - { 8, 14, 11.09, +17, 40, 32.9, 6.47 }, - { 17, 47, 7.99, +17, 41, 49.9, 5.72 }, - { 2, 30, 54.41, +17, 42, 14.0, 6.23 }, - { 5, 47, 26.21, +17, 43, 45.1, 5.49 }, - { 10, 16, 16.10, +17, 44, 25.1, 6.55 }, - { 7, 2, 25.49, +17, 45, 20.2, 5.94 }, - { 6, 21, 25.90, +17, 45, 49.0, 6.35 }, - { 2, 44, 19.10, +17, 45, 50.0, 6.46 }, - { 12, 20, 43.01, +17, 47, 34.1, 4.74 }, - { 20, 20, 21.41, +17, 47, 35.2, 5.80 }, - { 1, 57, 21.10, +17, 49, 3.0, 5.10 }, - { 16, 1, 14.30, +17, 49, 5.9, 5.12 }, - { 18, 22, 49.01, +17, 49, 36.1, 5.25 }, - { 3, 34, 8.30, +17, 49, 58.1, 6.17 }, - { 3, 7, 25.70, +17, 52, 48.0, 6.11 }, - { 0, 28, 2.90, +17, 53, 35.2, 5.06 }, - { 21, 28, 59.90, +17, 54, 20.9, 6.44 }, - { 6, 14, 28.61, +17, 54, 23.0, 5.88 }, - { 4, 25, 29.40, +17, 55, 41.2, 4.29 }, - { 13, 53, 12.91, +17, 55, 58.1, 5.70 }, - { 5, 27, 10.10, +17, 57, 43.9, 5.42 }, - { 18, 56, 3.89, +17, 59, 42.0, 6.63 }, - { 22, 7, 30.00, +18, 0, 2.2, 6.35 }, - { 19, 40, 5.81, +18, 0, 50.0, 4.37 }, - { 4, 33, 32.90, +18, 1, .1, 6.25 }, - { 2, 56, 26.09, +18, 1, 23.2, 5.63 }, - { 20, 50, 37.01, +18, 3, 5.0, 6.52 }, - { 17, 20, 18.89, +18, 3, 25.9, 5.00 }, - { 20, 45, 28.20, +18, 5, 25.1, 6.38 }, - { 8, 31, 35.71, +18, 5, 39.8, 5.35 }, - { 18, 56, 6.19, +18, 6, 19.1, 5.69 }, - { 6, 11, 1.80, +18, 7, 45.8, 6.33 }, - { 18, 18, 7.70, +18, 7, 53.0, 5.99 }, - { 8, 59, 10.80, +18, 8, 4.9, 6.38 }, - { 15, 48, 44.40, +18, 8, 30.1, 4.09 }, - { 8, 44, 41.09, +18, 9, 15.1, 3.94 }, - { 18, 47, 1.30, +18, 10, 53.0, 4.36 }, - { 6, 47, 23.50, +18, 11, 35.9, 6.20 }, - { 4, 0, 48.79, +18, 11, 38.0, 5.89 }, - { 18, 35, 12.60, +18, 12, 11.9, 5.78 }, - { 0, 9, 2.40, +18, 12, 42.8, 5.53 }, - { 2, 3, 42.60, +18, 15, 11.9, 6.21 }, - { 13, 39, 2.30, +18, 15, 55.1, 6.48 }, - { 20, 37, 54.60, +18, 16, 9.1, 6.25 }, - { 2, 48, 32.11, +18, 17, 1.0, 5.82 }, - { 14, 38, 13.99, +18, 17, 53.9, 5.91 }, - { 2, 55, 48.50, +18, 19, 54.1, 5.91 }, - { 8, 23, 21.79, +18, 19, 55.9, 5.95 }, - { 1, 29, 52.90, +18, 21, 20.2, 6.02 }, - { 13, 0, 38.81, +18, 22, 23.2, 6.20 }, - { 12, 35, 7.80, +18, 22, 36.8, 5.02 }, - { 12, 35, 6.29, +18, 22, 37.9, 6.56 }, - { 13, 54, 41.09, +18, 23, 52.1, 2.68 }, - { 23, 37, 56.81, +18, 24, 2.2, 5.53 }, - { 11, 30, 28.99, +18, 24, 34.9, 5.52 }, - { 16, 55, 22.20, +18, 25, 59.9, 5.35 }, - { 15, 7, 20.40, +18, 26, 30.1, 6.02 }, - { 22, 25, 40.70, +18, 26, 39.8, 6.26 }, - { 1, 34, 49.10, +18, 27, 38.2, 5.89 }, - { 15, 41, 54.70, +18, 27, 50.0, 5.81 }, - { 20, 3, 16.39, +18, 30, 2.2, 5.96 }, - { 7, 46, 7.39, +18, 30, 36.0, 4.88 }, - { 23, 6, 18.19, +18, 31, 3.0, 6.13 }, - { 19, 47, 23.30, +18, 32, 3.1, 3.82 }, - { 5, 33, 31.61, +18, 32, 25.1, 5.69 }, - { 5, 32, 12.79, +18, 35, 39.8, 4.38 }, - { 15, 55, 39.79, +18, 37, 14.2, 6.26 }, - { 5, 7, 27.00, +18, 38, 42.0, 5.00 }, - { 19, 52, 21.79, +18, 40, 18.8, 6.23 }, - { 6, 13, 33.41, +18, 40, 49.1, 6.58 }, - { 18, 46, 41.40, +18, 42, 20.9, 6.17 }, - { 13, 13, 12.41, +18, 43, 36.8, 6.11 }, - { 4, 46, 16.80, +18, 44, 6.0, 6.01 }, - { 4, 20, 25.10, +18, 44, 33.0, 6.12 }, - { 13, 12, 35.90, +18, 45, 6.1, 6.53 }, - { 3, 27, 3.19, +18, 45, 23.0, 6.57 }, - { 3, 8, 21.19, +18, 47, 42.0, 6.27 }, - { 16, 15, 28.70, +18, 48, 29.9, 5.69 }, - { 8, 50, 45.10, +18, 49, 55.9, 6.16 }, - { 4, 51, 22.51, +18, 50, 22.9, 5.10 }, - { 8, 4, 45.19, +18, 50, 31.9, 6.15 }, - { 9, 44, 30.00, +18, 51, 49.0, 6.50 }, - { 14, 45, 20.69, +18, 53, 4.9, 6.13 }, - { 10, 46, 24.50, +18, 53, 29.0, 5.49 }, - { 16, 25, 47.69, +18, 53, 33.0, 6.70 }, - { 14, 16, 4.20, +18, 54, 42.8, 5.98 }, - { 15, 12, 4.30, +18, 58, 32.9, 5.89 }, - { 4, 24, 57.10, +19, 2, 30.1, 5.98 }, - { 13, 16, 14.30, +19, 3, 6.1, 6.45 }, - { 14, 51, 23.30, +19, 6, 4.0, 4.55 }, - { 23, 52, 29.30, +19, 7, 13.1, 5.08 }, - { 22, 50, 39.10, +19, 8, 26.9, 6.40 }, - { 19, 48, 58.70, +19, 8, 31.9, 5.00 }, - { 14, 53, 23.71, +19, 9, 10.1, 6.01 }, - { 16, 21, 55.20, +19, 9, 11.2, 3.75 }, - { 6, 14, 50.90, +19, 9, 23.0, 5.20 }, - { 1, 26, 15.29, +19, 10, 19.9, 5.38 }, - { 4, 28, 37.01, +19, 10, 49.1, 3.53 }, - { 14, 15, 39.70, +19, 10, 57.0,-0.04 }, - { 0, 54, 35.21, +19, 11, 17.9, 5.74 }, - { 14, 26, 27.41, +19, 13, 36.8, 5.39 }, - { 1, 26, 41.69, +19, 14, 25.1, 5.50 }, - { 17, 48, 47.90, +19, 15, 19.1, 6.12 }, - { 17, 33, 22.80, +19, 15, 24.1, 5.64 }, - { 15, 12, 43.49, +19, 17, 8.9, 6.68 }, - { 1, 53, 31.80, +19, 17, 37.0, 4.75 }, - { 1, 53, 31.80, +19, 17, 44.9, 4.83 }, - { 19, 1, 5.50, +19, 18, 34.9, 6.39 }, - { 21, 37, 45.41, +19, 19, 7.0, 5.45 }, - { 7, 51, 56.71, +19, 19, 31.1, 5.99 }, - { 18, 48, 53.40, +19, 19, 43.0, 5.88 }, - { 21, 0, 27.70, +19, 19, 45.8, 5.65 }, - { 10, 27, .50, +19, 21, 51.8, 6.15 }, - { 22, 45, 28.20, +19, 22, .1, 6.25 }, - { 21, 26, 26.69, +19, 22, 32.2, 6.07 }, - { 10, 19, 44.09, +19, 28, 14.9, 4.79 }, - { 22, 7, 28.61, +19, 28, 32.2, 5.75 }, - { 15, 25, 53.30, +19, 28, 50.9, 6.27 }, - { 4, 54, 58.30, +19, 29, 7.1, 6.37 }, - { 19, 58, 45.41, +19, 29, 31.9, 3.47 }, - { 2, 10, 37.61, +19, 30, 1.1, 5.70 }, - { 18, 0, 27.70, +19, 30, 20.9, 6.50 }, - { 22, 38, 52.61, +19, 31, 19.9, 5.82 }, - { 8, 40, 27.00, +19, 32, 42.0, 6.30 }, - { 0, 47, 13.61, +19, 34, 44.0, 6.13 }, - { 8, 35, 19.39, +19, 35, 24.0, 6.58 }, - { 17, 4, 41.30, +19, 35, 57.1, 6.17 }, - { 4, 9, 10.01, +19, 36, 33.1, 5.50 }, - { 19, 18, 48.50, +19, 36, 38.2, 6.58 }, - { 18, 3, 14.69, +19, 36, 47.2, 6.50 }, - { 22, 10, 19.01, +19, 37, .8, 6.18 }, - { 1, 9, 49.20, +19, 39, 31.0, 5.55 }, - { 19, 2, 52.61, +19, 39, 40.0, 6.09 }, - { 3, 43, 47.21, +19, 39, 54.0, 6.14 }, - { 21, 53, 37.39, +19, 40, 5.9, 5.68 }, - { 8, 40, 22.10, +19, 40, 12.0, 6.44 }, - { 15, 41, 33.10, +19, 40, 13.1, 4.52 }, - { 22, 39, 46.99, +19, 40, 52.0, 6.21 }, - { 17, 3, 52.70, +19, 41, 26.2, 6.35 }, - { 6, 3, 27.29, +19, 41, 26.2, 5.14 }, - { 3, 42, 18.91, +19, 42, 1.1, 5.69 }, - { 21, 54, 17.40, +19, 43, 5.9, 6.39 }, - { 3, 11, 37.80, +19, 43, 36.1, 4.35 }, - { 5, 54, 56.71, +19, 44, 58.9, 5.92 }, - { 10, 44, 14.50, +19, 45, 31.0, 6.27 }, - { 19, 34, 34.90, +19, 46, 23.9, 5.00 }, - { 13, 16, 32.30, +19, 47, 7.1, 6.45 }, - { 6, 12, 1.30, +19, 47, 26.2, 5.75 }, - { 18, 58, 45.10, +19, 47, 39.1, 6.50 }, - { 19, 25, 28.61, +19, 47, 55.0, 5.16 }, - { 21, 22, 5.21, +19, 48, 15.8, 4.08 }, - { 5, 5, 32.11, +19, 48, 23.0, 6.44 }, - { 5, 20, 56.59, +19, 48, 51.1, 6.18 }, - { 8, 0, 48.00, +19, 48, 58.0, 6.25 }, - { 21, 51, 34.20, +19, 49, 36.1, 5.77 }, - { 10, 19, 58.61, +19, 50, 26.2, 3.80 }, - { 10, 19, 58.30, +19, 50, 30.1, 2.61 }, - { 2, 30, 38.40, +19, 51, 19.1, 6.15 }, - { 20, 26, 1.20, +19, 51, 54.0, 6.41 }, - { 5, 52, 23.40, +19, 52, 5.2, 6.06 }, - { 4, 35, 42.70, +19, 52, 54.1, 6.36 }, - { 7, 55, 39.91, +19, 53, 2.0, 5.35 }, - { 19, 26, 28.70, +19, 53, 29.0, 5.81 }, - { 2, 18, 7.49, +19, 54, 4.0, 5.62 }, - { 23, 6, 31.90, +19, 54, 38.9, 6.30 }, - { 20, 40, 45.19, +19, 56, 7.1, 6.45 }, - { 13, 40, 40.49, +19, 57, 20.2, 5.75 }, - { 20, 5, 9.50, +19, 59, 28.0, 5.10 }, - { 8, 40, 6.41, +20, 0, 28.1, 6.39 }, - { 2, 42, 22.01, +20, 0, 42.1, 5.69 }, - { 18, 8, 52.90, +20, 2, 43.1, 5.10 }, - { 17, 26, 49.10, +20, 4, 50.9, 5.54 }, - { 1, 44, 55.80, +20, 4, 59.2, 6.27 }, - { 20, 29, 21.10, +20, 5, 16.1, 6.55 }, - { 19, 26, 13.20, +20, 5, 52.1, 5.63 }, - { 14, 16, 32.81, +20, 7, 17.0, 6.25 }, - { 5, 19, 14.69, +20, 8, 4.9, 6.08 }, - { 6, 3, 55.20, +20, 8, 17.9, 4.63 }, - { 5, 55, 49.30, +20, 10, 30.0, 5.40 }, - { 11, 2, 19.80, +20, 10, 46.9, 4.42 }, - { 19, 15, 2.59, +20, 12, 11.9, 6.00 }, - { 0, 14, 36.19, +20, 12, 24.1, 4.80 }, - { 6, 28, 57.79, +20, 12, 43.9, 4.15 }, - { 11, 47, 59.09, +20, 13, 8.0, 4.53 }, - { 22, 32, 35.50, +20, 13, 48.0, 6.42 }, - { 7, 26, 56.30, +20, 15, 25.9, 5.93 }, - { 19, 23, 46.90, +20, 15, 51.8, 6.40 }, - { 21, 39, 1.10, +20, 15, 55.1, 5.85 }, - { 1, 42, 29.81, +20, 16, 7.0, 5.24 }, - { 19, 25, 22.39, +20, 16, 17.0, 6.31 }, - { 5, 54, 22.90, +20, 16, 34.0, 4.41 }, - { 19, 29, 20.90, +20, 16, 46.9, 6.33 }, - { 0, 32, 35.50, +20, 17, 39.8, 5.38 }, - { 5, 53, 19.10, +20, 17, 57.1, 6.71 }, - { 15, 54, 34.61, +20, 18, 38.9, 5.44 }, - { 7, 45, 9.29, +20, 18, 59.0, 6.33 }, - { 19, 36, 37.70, +20, 19, 58.1, 7.14 }, - { 5, 7, 48.41, +20, 25, 5.9, 5.30 }, - { 8, 32, 42.50, +20, 26, 28.0, 5.33 }, - { 11, 35, 3.79, +20, 26, 29.0, 6.45 }, - { 7, 21, 56.81, +20, 26, 37.0, 5.10 }, - { 21, 49, 26.90, +20, 27, 45.0, 6.29 }, - { 18, 34, 19.61, +20, 27, 59.0, 6.57 }, - { 1, 23, 24.91, +20, 28, 8.0, 5.97 }, - { 5, 33, 38.81, +20, 28, 27.1, 6.18 }, - { 19, 40, 28.30, +20, 28, 36.1, 6.50 }, - { 16, 30, 33.60, +20, 28, 45.1, 5.25 }, - { 6, 27, 56.59, +20, 29, 46.0, 6.22 }, - { 11, 14, 6.50, +20, 31, 25.0, 2.56 }, - { 12, 12, 9.31, +20, 32, 30.8, 5.57 }, - { 18, 45, 39.70, +20, 32, 47.0, 4.19 }, - { 17, 48, 24.79, +20, 33, 56.2, 5.69 }, - { 7, 4, 6.50, +20, 34, 13.1, 3.79 }, - { 15, 18, 24.50, +20, 34, 22.1, 5.70 }, - { 4, 17, 15.60, +20, 34, 43.0, 4.94 }, - { 20, 30, 58.10, +20, 36, 20.9, 6.18 }, - { 2, 58, 5.21, +20, 40, 7.0, 5.80 }, - { 4, 38, 15.79, +20, 41, 4.9, 5.92 }, - { 5, 45, 39.41, +20, 41, 42.0, 6.95 }, - { 1, 7, 57.19, +20, 44, 21.1, 5.55 }, - { 3, 22, 45.19, +20, 44, 30.8, 5.09 }, - { 8, 20, 21.00, +20, 44, 52.1, 5.83 }, - { 22, 57, 27.89, +20, 46, 8.0, 5.49 }, - { 19, 38, 17.50, +20, 46, 58.1, 6.48 }, - { 3, 24, 26.09, +20, 48, 13.0, 6.08 }, - { 1, 54, 38.40, +20, 48, 29.2, 2.64 }, - { 18, 8, 45.50, +20, 48, 51.8, 4.36 }, - { 18, 30, 41.59, +20, 48, 55.1, 6.50 }, - { 4, 22, 22.80, +20, 49, 17.0, 5.91 }, - { 23, 22, 40.51, +20, 49, 43.0, 6.29 }, - { 19, 1, 22.61, +20, 50, 1.0, 6.69 }, - { 18, 2, 23.11, +20, 50, 1.0, 5.28 }, - { 23, 33, 55.51, +20, 50, 26.9, 6.06 }, - { 22, 23, 39.60, +20, 50, 53.9, 6.04 }, - { 5, 48, 22.39, +20, 52, 9.8, 6.07 }, - { 12, 29, 43.20, +20, 53, 46.0, 5.69 }, - { 20, 9, 56.59, +20, 54, 55.1, 6.48 }, - { 3, 39, .10, +20, 54, 56.9, 6.50 }, - { 0, 47, 54.79, +20, 55, 31.1, 6.54 }, - { 3, 44, 28.10, +20, 55, 43.0, 6.10 }, - { 16, 54, 55.20, +20, 57, 31.0, 5.41 }, - { 15, 51, 15.91, +20, 58, 40.1, 4.76 }, - { 22, 10, 30.19, +20, 58, 41.2, 6.46 }, - { 4, 23, 32.40, +20, 58, 55.9, 5.99 }, - { 20, 34, 10.01, +20, 59, 7.1, 6.48 }, - { 17, 35, 59.59, +20, 59, 46.0, 6.10 }, - { 19, 57, .19, +20, 59, 53.2, 6.48 }, - { 1, 11, 27.19, +21, 2, 4.9, 4.66 }, - { 3, 14, 54.10, +21, 2, 39.8, 4.89 }, - { 1, 59, 35.71, +21, 3, 29.9, 5.87 }, - { 12, 39, 7.30, +21, 3, 45.0, 5.46 }, - { 14, 41, 54.19, +21, 7, 25.0, 6.38 }, - { 16, 20, 4.30, +21, 7, 57.0, 6.05 }, - { 23, 7, 28.70, +21, 8, 3.1, 5.99 }, - { 20, 11, 3.50, +21, 8, 4.9, 6.22 }, - { 4, 19, 26.09, +21, 8, 31.9, 5.35 }, - { 5, 37, 38.69, +21, 8, 33.0, 3.00 }, - { 3, 21, 13.61, +21, 8, 48.8, 5.28 }, - { 13, 6, 21.19, +21, 9, 11.9, 5.99 }, - { 10, 14, 29.69, +21, 10, 4.1, 6.02 }, - { 9, 49, 50.11, +21, 10, 45.8, 6.09 }, - { 20, 38, 31.30, +21, 12, 4.0, 4.82 }, - { 2, 12, 48.10, +21, 12, 38.9, 5.27 }, - { 19, 15, 17.40, +21, 13, 55.9, 5.64 }, - { 21, 56, 24.00, +21, 14, 22.9, 6.40 }, - { 12, 53, 17.81, +21, 14, 42.0, 4.90 }, - { 7, 10, 6.70, +21, 14, 48.8, 6.43 }, - { 0, 39, 21.79, +21, 15, 2.2, 5.87 }, - { 13, 49, 42.79, +21, 15, 51.1, 4.91 }, - { 19, 3, 42.50, +21, 16, 4.1, 6.52 }, - { 21, 52, 18.19, +21, 16, 23.2, 6.89 }, - { 5, 4, 21.60, +21, 16, 41.2, 6.19 }, - { 9, 13, 37.30, +21, 16, 59.9, 6.48 }, - { 2, 59, 12.70, +21, 20, 25.1, 4.63 }, - { 2, 59, 12.70, +21, 20, 25.1, 4.63 }, - { 11, 40, 47.09, +21, 21, 10.1, 5.26 }, - { 19, 16, 13.01, +21, 23, 25.1, 4.77 }, - { 0, 58, 18.89, +21, 24, 15.8, 6.37 }, - { 20, 25, 40.51, +21, 24, 34.9, 5.66 }, - { 18, 52, 16.39, +21, 25, 31.1, 5.48 }, - { 0, 39, 55.61, +21, 26, 17.9, 5.36 }, - { 7, 27, 44.40, +21, 26, 42.0, 5.22 }, - { 12, 4, 16.61, +21, 27, 33.1, 5.87 }, - { 1, 5, 41.69, +21, 27, 55.1, 5.56 }, - { 8, 43, 17.09, +21, 28, 7.0, 4.66 }, - { 1, 5, 40.90, +21, 28, 23.9, 5.34 }, - { 16, 30, 13.20, +21, 29, 22.9, 2.77 }, - { 7, 26, 50.21, +21, 32, 8.9, 6.54 }, - { 19, 12, 36.70, +21, 33, 15.8, 5.93 }, - { 14, 57, 3.60, +21, 33, 19.1, 6.49 }, - { 4, 18, 23.21, +21, 34, 45.1, 5.65 }, - { 8, 7, 45.79, +21, 34, 54.1, 5.30 }, - { 5, 3, 5.71, +21, 35, 24.0, 4.64 }, - { 18, 1, 29.90, +21, 35, 43.1, 5.18 }, - { 18, 1, 30.41, +21, 35, 44.2, 4.96 }, - { 20, 16, 19.70, +21, 35, 55.0, 6.13 }, - { 4, 28, .79, +21, 37, 12.0, 5.72 }, - { 18, 5, 30.19, +21, 38, 48.8, 6.15 }, - { 23, 52, 23.40, +21, 40, 14.9, 6.11 }, - { 13, 58, 38.90, +21, 41, 46.0, 5.76 }, - { 19, 8, 3.60, +21, 41, 56.0, 6.23 }, - { 22, 7, 50.30, +21, 42, 10.1, 5.78 }, - { 5, 7, 55.49, +21, 42, 16.9, 5.89 }, - { 6, 51, 33.00, +21, 45, 40.0, 5.27 }, - { 5, 39, 27.00, +21, 45, 46.1, 6.34 }, - { 18, 23, 41.90, +21, 46, 10.9, 3.84 }, - { 4, 19, 36.70, +21, 46, 25.0, 5.38 }, - { 20, 39, 10.61, +21, 49, 1.9, 6.08 }, - { 16, 7, 22.20, +21, 49, 21.0, 6.14 }, - { 6, 11, 51.41, +21, 52, 7.0, 6.56 }, - { 14, 14, 40.99, +21, 52, 23.9, 6.39 }, - { 20, 11, 21.10, +21, 52, 32.2, 6.26 }, - { 18, 13, 16.51, +21, 52, 49.1, 6.12 }, - { 12, 35, 8.11, +21, 52, 53.0, 5.85 }, - { 5, 27, 38.11, +21, 56, 12.8, 4.88 }, - { 10, 2, 48.91, +21, 56, 57.1, 5.66 }, - { 2, 38, 49.01, +21, 57, 41.0, 5.43 }, - { 18, 20, 17.90, +21, 57, 41.0, 4.95 }, - { 14, 40, 21.89, +21, 58, 32.2, 6.10 }, - { 7, 20, 7.39, +21, 58, 55.9, 3.53 }, - { 18, 45, 35.69, +21, 59, 6.0, 6.51 }, - { 9, 10, 20.90, +21, 59, 47.0, 6.01 }, - { 4, 5, 20.21, +22, 0, 32.0, 5.90 }, - { 21, 20, 13.99, +22, 1, 35.0, 6.29 }, - { 6, 39, 5.30, +22, 1, 50.9, 6.04 }, - { 3, 51, 36.60, +22, 1, 54.1, 6.83 }, - { 9, 9, 21.50, +22, 2, 44.2, 5.14 }, - { 15, 0, 52.39, +22, 2, 44.2, 6.38 }, - { 4, 4, 41.71, +22, 4, 54.8, 4.36 }, - { 17, 6, 18.10, +22, 5, 3.1, 5.56 }, - { 5, 19, 16.61, +22, 5, 47.0, 4.94 }, - { 21, 28, 59.90, +22, 10, 45.8, 5.93 }, - { 6, 9, 32.40, +22, 11, 24.0, 5.93 }, - { 16, 31, 13.39, +22, 11, 43.1, 5.76 }, - { 4, 25, 25.01, +22, 11, 58.9, 5.28 }, - { 11, 42, 5.21, +22, 12, 38.9, 6.59 }, - { 18, 6, 1.90, +22, 13, 8.0, 5.06 }, - { 3, 49, 55.01, +22, 14, 39.8, 6.07 }, - { 14, 32, 32.50, +22, 15, 36.0, 5.92 }, - { 19, 1, 49.49, +22, 15, 50.0, 6.40 }, - { 1, 50, 8.50, +22, 16, 31.1, 5.86 }, - { 0, 14, 56.11, +22, 17, 3.1, 6.24 }, - { 5, 15, 27.70, +22, 17, 4.9, 6.27 }, - { 4, 25, 22.10, +22, 17, 38.0, 4.22 }, - { 17, 50, 48.41, +22, 18, 59.0, 5.98 }, - { 20, 58, 16.39, +22, 19, 32.9, 5.31 }, - { 10, 56, 16.90, +22, 21, 6.1, 6.14 }, - { 7, 43, 22.20, +22, 23, 57.8, 6.21 }, - { 6, 1, 41.59, +22, 24, 2.9, 6.37 }, - { 4, 12, 51.19, +22, 24, 49.0, 6.12 }, - { 19, 41, 14.90, +22, 27, 10.1, 6.36 }, - { 21, 10, 31.99, +22, 27, 16.9, 6.68 }, - { 5, 30, 43.39, +22, 27, 45.0, 6.29 }, - { 17, 55, 50.81, +22, 27, 51.1, 5.58 }, - { 3, 56, 52.10, +22, 28, 41.2, 5.63 }, - { 13, 41, 2.30, +22, 29, 44.9, 5.62 }, - { 23, 33, 28.10, +22, 29, 56.0, 5.32 }, - { 6, 14, 52.61, +22, 30, 24.1, 3.28 }, - { 6, 22, 57.60, +22, 30, 49.0, 2.88 }, - { 19, 36, 8.30, +22, 35, 8.9, 6.32 }, - { 19, 51, 4.10, +22, 36, 36.0, 4.95 }, - { 13, 6, 22.61, +22, 36, 58.0, 5.60 }, - { 12, 34, 51.10, +22, 37, 45.1, 4.81 }, - { 17, 0, 58.10, +22, 37, 55.9, 5.65 }, - { 8, 6, 18.41, +22, 38, 8.2, 5.99 }, - { 7, 5, 18.41, +22, 38, 13.9, 6.02 }, - { 18, 54, 44.90, +22, 38, 42.0, 4.59 }, - { 23, 56, 41.50, +22, 38, 53.2, 6.15 }, - { 2, 6, 33.91, +22, 38, 53.9, 5.03 }, - { 12, 39, 2.09, +22, 39, 33.8, 6.38 }, - { 5, 42, 3.91, +22, 39, 37.1, 6.36 }, - { 13, 43, 45.19, +22, 42, 1.1, 6.13 }, - { 7, 7, 21.41, +22, 42, 13.0, 7.68 }, - { 21, 34, 34.01, +22, 45, 16.9, 6.47 }, - { 3, 28, 26.59, +22, 48, 15.1, 6.03 }, - { 16, 2, 17.69, +22, 48, 15.8, 4.83 }, - { 4, 26, 18.50, +22, 48, 49.0, 4.28 }, - { 18, 59, 58.10, +22, 48, 52.9, 6.29 }, - { 12, 50, 17.40, +22, 51, 47.9, 6.43 }, - { 7, 32, 50.59, +22, 53, 16.1, 6.54 }, - { 6, 12, 19.10, +22, 54, 29.9, 6.39 }, - { 18, 2, 30.10, +22, 55, 23.2, 6.21 }, - { 7, 23, 28.20, +22, 56, 43.1, 6.02 }, - { 21, 46, 4.39, +22, 56, 56.0, 5.29 }, - { 4, 42, 14.69, +22, 57, 24.8, 4.28 }, - { 17, 24, 6.60, +22, 57, 37.1, 5.74 }, - { 9, 31, 43.20, +22, 58, 5.2, 4.31 }, - { 9, 7, 26.90, +22, 58, 52.0, 6.40 }, - { 15, 13, 31.90, +22, 58, 59.9, 6.30 }, - { 4, 27, 17.50, +22, 59, 47.0, 5.53 }, - { 7, 40, 58.51, +23, 1, 7.0, 5.89 }, - { 19, 17, 43.61, +23, 1, 32.2, 5.43 }, - { 12, 19, 19.10, +23, 2, 4.9, 6.27 }, - { 23, 29, 5.59, +23, 2, 52.1, 6.35 }, - { 17, 17, 35.90, +23, 5, 26.9, 6.45 }, - { 11, 15, 12.19, +23, 5, 44.2, 4.63 }, - { 19, 59, 10.51, +23, 6, 5.0, 5.67 }, - { 10, 17, 14.59, +23, 6, 22.0, 5.82 }, - { 6, 9, 43.99, +23, 6, 47.9, 5.75 }, - { 8, 13, 41.71, +23, 8, 16.1, 6.56 }, - { 7, 48, 33.60, +23, 8, 28.0, 6.18 }, - { 2, 18, 58.01, +23, 10, 4.1, 6.46 }, - { 3, 57, 3.79, +23, 10, 32.2, 6.06 }, - { 10, 43, 25.01, +23, 11, 17.9, 5.08 }, - { 5, 43, 19.51, +23, 12, 15.1, 6.21 }, - { 20, 4, 58.61, +23, 12, 37.1, 6.45 }, - { 14, 36, 6.89, +23, 15, 1.1, 6.38 }, - { 6, 4, 7.20, +23, 15, 47.9, 4.16 }, - { 18, 22, 8.71, +23, 17, 7.1, 5.41 }, - { 18, 18, 7.70, +23, 17, 48.1, 6.63 }, - { 11, 7, 39.70, +23, 19, 25.0, 6.46 }, - { 5, 41, 54.60, +23, 19, 35.0, 6.59 }, - { 6, 25, 32.90, +23, 19, 36.8, 6.06 }, - { 4, 36, 29.21, +23, 20, 26.9, 6.02 }, - { 21, 32, 27.10, +23, 23, 39.8, 6.70 }, - { 23, 25, 22.80, +23, 24, 15.1, 4.40 }, - { 10, 16, 41.40, +23, 25, 1.9, 3.44 }, - { 0, 57, 12.41, +23, 25, 3.0, 4.42 }, - { 3, 48, 20.90, +23, 25, 16.0, 5.45 }, - { 9, 33, 59.09, +23, 27, 14.0, 6.25 }, - { 2, 7, 10.39, +23, 27, 45.0, 2.00 }, - { 2, 29, 13.61, +23, 28, 8.0, 6.19 }, - { 16, 11, 37.99, +23, 29, 40.9, 5.70 }, - { 10, 16, 32.30, +23, 30, 11.2, 5.97 }, - { 20, 15, 30.19, +23, 30, 31.0, 5.15 }, - { 1, 25, 35.71, +23, 30, 42.1, 6.18 }, - { 18, 48, 16.39, +23, 30, 51.1, 6.15 }, - { 22, 46, 31.90, +23, 33, 56.2, 3.95 }, - { 1, 55, 51.00, +23, 34, 37.9, 5.74 }, - { 8, 1, .70, +23, 34, 59.2, 6.34 }, - { 18, 44, 40.20, +23, 35, 22.9, 6.31 }, - { 1, 57, 55.70, +23, 35, 46.0, 4.79 }, - { 6, 52, .00, +23, 36, 6.1, 5.65 }, - { 18, 35, 30.41, +23, 36, 20.2, 5.61 }, - { 20, 6, 53.40, +23, 36, 51.8, 5.07 }, - { 18, 32, 46.20, +23, 37, .8, 5.84 }, - { 4, 45, 42.50, +23, 37, 41.2, 6.35 }, - { 0, 54, 58.01, +23, 37, 41.9, 5.47 }, - { 21, 29, 56.90, +23, 38, 20.0, 4.57 }, - { 20, 38, 35.09, +23, 40, 50.2, 5.91 }, - { 3, 49, 43.51, +23, 42, 42.1, 6.17 }, - { 19, 40, 39.70, +23, 43, 3.0, 6.64 }, - { 23, 20, 38.21, +23, 44, 25.1, 4.60 }, - { 6, 16, 58.70, +23, 44, 26.9, 6.25 }, - { 17, 15, 41.59, +23, 44, 34.1, 5.96 }, - { 2, 17, 10.39, +23, 46, 4.1, 6.55 }, - { 9, 45, 51.10, +23, 46, 27.1, 2.98 }, - { 13, 25, 6.70, +23, 51, 15.8, 5.78 }, - { 21, 21, 4.39, +23, 51, 20.9, 5.57 }, - { 18, 29, 35.69, +23, 51, 58.0, 5.90 }, - { 14, 50, 15.79, +23, 54, 42.8, 5.85 }, - { 12, 25, 15.10, +23, 55, 34.0, 6.03 }, - { 18, 4, 40.20, +23, 56, 33.0, 6.34 }, - { 12, 16, 20.50, +23, 56, 43.1, 4.95 }, - { 3, 46, 19.61, +23, 56, 53.9, 4.18 }, - { 4, 57, 48.70, +23, 56, 55.0, 5.79 }, - { 6, 16, 19.01, +23, 58, 12.0, 6.08 }, - { 17, 57, 14.30, +23, 59, 44.9, 6.30 }, - { 0, 37, 7.20, +24, 0, 51.1, 6.47 }, - { 8, 20, 32.11, +24, 1, 19.9, 5.98 }, - { 5, 35, 27.10, +24, 2, 21.8, 5.38 }, - { 3, 49, 9.70, +24, 3, 11.9, 3.63 }, - { 19, 53, 27.70, +24, 4, 46.9, 4.58 }, - { 8, 31, 30.50, +24, 4, 52.0, 5.75 }, - { 8, 33, .10, +24, 5, 4.9, 6.36 }, - { 4, 43, 13.80, +24, 5, 20.0, 6.13 }, - { 23, 14, 36.50, +24, 6, 11.2, 6.36 }, - { 3, 47, 29.11, +24, 6, 18.0, 2.87 }, - { 4, 4, 21.70, +24, 6, 20.9, 5.47 }, - { 12, 29, 26.90, +24, 6, 32.0, 5.48 }, - { 3, 44, 52.51, +24, 6, 47.9, 3.70 }, - { 20, 38, 31.90, +24, 6, 58.0, 5.04 }, - { 7, 12, 26.40, +24, 7, 41.9, 5.85 }, - { 3, 49, 11.21, +24, 8, 12.1, 5.09 }, - { 8, 28, 36.79, +24, 8, 40.9, 6.10 }, - { 2, 12, 37.49, +24, 10, 4.1, 5.96 }, - { 7, 2, 24.79, +24, 12, 55.1, 5.18 }, - { 7, 39, 11.90, +24, 13, 21.0, 6.17 }, - { 17, 11, 3.19, +24, 14, 16.1, 6.19 }, - { 20, 13, 40.61, +24, 14, 20.0, 6.56 }, - { 5, 56, 56.09, +24, 14, 58.9, 6.02 }, - { 19, 6, 38.40, +24, 15, 2.9, 5.77 }, - { 13, 12, 8.40, +24, 15, 29.2, 6.33 }, - { 5, 8, 6.60, +24, 15, 55.1, 5.50 }, - { 0, 47, 20.30, +24, 16, 1.9, 4.06 }, - { 21, 23, 58.80, +24, 16, 27.1, 5.71 }, - { 12, 33, 34.20, +24, 16, 59.2, 6.29 }, - { 3, 44, 48.19, +24, 17, 21.8, 5.46 }, - { 4, 23, 59.81, +24, 18, 4.0, 6.36 }, - { 17, 37, 31.10, +24, 18, 36.0, 5.77 }, - { 19, 54, 31.10, +24, 19, 9.8, 5.52 }, - { 17, 43, 21.60, +24, 19, 40.1, 5.71 }, - { 13, 32, 48.10, +24, 20, 47.0, 6.11 }, - { 7, 38, 14.50, +24, 21, 37.1, 6.27 }, - { 14, 48, 23.30, +24, 22, .1, 6.14 }, - { 3, 45, 49.61, +24, 22, 4.1, 3.87 }, - { 16, 57, 42.31, +24, 22, 53.0, 6.32 }, - { 9, 51, 52.99, +24, 23, 43.1, 5.32 }, - { 7, 44, 26.81, +24, 23, 53.2, 3.57 }, - { 6, 11, 32.30, +24, 25, 13.1, 5.80 }, - { 20, 22, 3.41, +24, 26, 46.0, 5.54 }, - { 18, 19, 10.70, +24, 26, 46.0, 5.27 }, - { 21, 35, 27.00, +24, 27, 7.9, 6.11 }, - { 9, 2, 44.30, +24, 27, 10.1, 5.45 }, - { 3, 57, 26.40, +24, 27, 42.8, 6.16 }, - { 3, 34, 26.59, +24, 27, 51.8, 5.92 }, - { 3, 45, 12.50, +24, 28, 1.9, 4.30 }, - { 17, 20, 54.19, +24, 29, 57.8, 5.12 }, - { 17, 41, 5.50, +24, 30, 47.9, 6.36 }, - { 3, 46, 2.90, +24, 31, 41.2, 6.43 }, - { 21, 24, 23.11, +24, 31, 44.0, 6.32 }, - { 8, 26, 39.79, +24, 32, 3.1, 7.02 }, - { 8, 26, 40.10, +24, 32, 7.1, 7.81 }, - { 3, 45, 54.41, +24, 33, 16.9, 5.76 }, - { 0, 55, 14.69, +24, 33, 24.8, 6.20 }, - { 23, 35, 55.90, +24, 33, 40.0, 6.45 }, - { 17, 42, 28.39, +24, 33, 51.1, 5.52 }, - { 12, 31, .60, +24, 34, 1.9, 5.46 }, - { 5, 49, 1.01, +24, 34, 3.0, 4.86 }, - { 1, 13, 44.90, +24, 35, 1.0, 4.65 }, - { 6, 37, 27.19, +24, 35, 26.9, 6.44 }, - { 4, 56, 15.60, +24, 35, 31.9, 6.37 }, - { 6, 39, 31.39, +24, 36, .0, 6.38 }, - { 22, 50, .19, +24, 36, 6.1, 3.48 }, - { 13, 36, 59.09, +24, 36, 47.9, 5.74 }, - { 0, 41, 36.00, +24, 37, 45.1, 6.04 }, - { 2, 37, .50, +24, 38, 51.0, 6.50 }, - { 2, 36, 57.70, +24, 38, 53.9, 7.09 }, - { 16, 51, 45.31, +24, 39, 23.0, 5.04 }, - { 11, 8, 49.10, +24, 39, 29.9, 5.68 }, - { 19, 28, 42.29, +24, 39, 54.0, 4.44 }, - { 20, 16, 47.11, +24, 40, 16.0, 5.32 }, - { 7, 14, 26.59, +24, 42, 38.9, 6.89 }, - { 10, 19, .70, +24, 42, 42.1, 6.40 }, - { 3, 24, 18.50, +24, 43, 27.1, 5.50 }, - { 10, 55, 37.30, +24, 44, 56.0, 6.30 }, - { 10, 55, 36.79, +24, 44, 58.9, 4.50 }, - { 19, 28, 57.00, +24, 46, 7.0, 5.81 }, - { 23, 15, 57.89, +24, 46, 16.0, 6.60 }, - { 12, 22, 10.80, +24, 46, 26.0, 6.19 }, - { 20, 1, 44.69, +24, 48, 1.1, 5.88 }, - { 17, 15, 1.90, +24, 50, 21.1, 3.14 }, - { 3, 45, 9.70, +24, 50, 21.1, 5.64 }, - { 12, 48, 46.99, +24, 50, 25.1, 6.31 }, - { 16, 41, .60, +24, 51, 31.0, 6.06 }, - { 15, 7, 18.10, +24, 52, 9.1, 4.93 }, - { 7, 14, 41.90, +24, 53, 6.0, 5.82 }, - { 19, 25, 25.80, +24, 54, 46.1, 6.19 }, - { 20, 2, 1.39, +24, 56, 17.2, 5.22 }, - { 22, 12, 7.99, +24, 57, .0, 5.92 }, - { 15, 21, 6.89, +24, 57, 28.1, 6.39 }, - { 19, 52, 1.61, +24, 59, 31.9, 5.57 }, - { 15, 2, 6.50, +25, 0, 29.2, 4.81 }, - { 19, 1, 34.90, +25, 1, 32.9, 6.72 }, - { 2, 15, 42.79, +25, 2, 35.2, 5.58 }, - { 18, 49, 14.40, +25, 2, 47.0, 6.59 }, - { 4, 58, 9.41, +25, 3, 1.1, 5.81 }, - { 7, 23, 28.51, +25, 3, 2.2, 5.03 }, - { 8, 1, 43.80, +25, 5, 22.9, 6.31 }, - { 14, 10, 23.90, +25, 5, 30.1, 4.83 }, - { 15, 27, 38.90, +25, 6, 6.1, 6.02 }, - { 15, 8, 35.50, +25, 6, 31.0, 5.81 }, - { 6, 43, 55.90, +25, 7, 52.0, 2.98 }, - { 19, 46, 39.50, +25, 8, 2.0, 6.62 }, - { 23, 57, 45.50, +25, 8, 29.0, 4.66 }, - { 5, 29, 16.49, +25, 9, 2.2, 5.47 }, - { 23, 27, 40.39, +25, 10, 1.9, 5.98 }, - { 9, 23, 31.80, +25, 10, 59.2, 6.41 }, - { 2, 48, 45.89, +25, 11, 17.2, 5.86 }, - { 4, 39, 23.11, +25, 13, 5.9, 6.22 }, - { 11, 44, 13.20, +25, 13, 5.9, 6.02 }, - { 2, 30, 32.40, +25, 14, 6.0, 5.92 }, - { 3, 5, 26.71, +25, 15, 19.1, 7.00 }, - { 3, 5, 26.71, +25, 15, 19.1, 6.80 }, - { 20, 44, 52.51, +25, 16, 14.2, 4.91 }, - { 21, 24, 7.39, +25, 18, 43.9, 6.15 }, - { 3, 40, 46.30, +25, 19, 45.8, 6.11 }, - { 14, 23, 6.79, +25, 20, 17.2, 6.22 }, - { 22, 7, .70, +25, 20, 42.0, 3.76 }, - { 16, 57, 31.01, +25, 21, 10.1, 6.28 }, - { 10, 16, 41.90, +25, 22, 17.0, 5.84 }, - { 6, 55, 18.60, +25, 22, 32.2, 5.73 }, - { 19, 47, 48.60, +25, 23, 2.0, 5.95 }, - { 8, 0, 55.90, +25, 23, 34.1, 5.83 }, - { 1, 10, 19.39, +25, 27, 28.1, 5.80 }, - { 0, 8, 52.20, +25, 27, 46.1, 6.23 }, - { 23, 7, 6.79, +25, 28, 5.9, 4.76 }, - { 10, 54, 42.19, +25, 29, 26.9, 6.20 }, - { 21, 38, 45.00, +25, 29, 56.0, 6.16 }, - { 10, 56, 34.39, +25, 30, .0, 6.35 }, - { 17, 2, 18.70, +25, 30, 20.2, 5.75 }, - { 8, 10, 27.19, +25, 30, 25.9, 5.73 }, - { 17, 20, 9.79, +25, 32, 15.0, 5.38 }, - { 22, 8, 17.21, +25, 32, 37.0, 6.11 }, - { 21, 46, 24.00, +25, 33, 47.9, 6.28 }, - { 3, 50, 18.91, +25, 34, 45.8, 5.26 }, - { 12, 24, 26.71, +25, 34, 58.1, 6.42 }, - { 20, 15, 15.91, +25, 35, 30.8, 4.78 }, - { 17, 48, 49.20, +25, 37, 22.1, 5.12 }, - { 4, 22, 34.90, +25, 37, 45.1, 5.37 }, - { 2, 43, 51.19, +25, 38, 17.2, 6.35 }, - { 21, 44, 38.71, +25, 38, 42.0, 4.13 }, - { 3, 20, 25.61, +25, 39, 46.1, 6.12 }, - { 13, 46, 43.30, +25, 42, 7.9, 5.95 }, - { 2, 6, 49.20, +25, 42, 16.9, 6.15 }, - { 16, 55, 2.09, +25, 43, 50.2, 6.08 }, - { 1, 41, 18.41, +25, 44, 44.9, 6.17 }, - { 19, 43, 42.89, +25, 46, 18.8, 5.49 }, - { 2, 15, 46.01, +25, 46, 59.2, 5.79 }, - { 7, 44, 6.89, +25, 47, 3.1, 5.31 }, - { 20, 31, 58.20, +25, 48, 15.8, 6.34 }, - { 12, 22, 30.31, +25, 50, 46.0, 4.81 }, - { 12, 11, 51.19, +25, 52, 13.1, 5.66 }, - { 20, 36, 8.30, +25, 52, 57.0, 6.41 }, - { 5, 39, 44.21, +25, 53, 48.8, 5.18 }, - { 12, 28, 44.59, +25, 53, 57.1, 6.65 }, - { 9, 41, 38.50, +25, 54, 46.1, 6.24 }, - { 12, 28, 54.70, +25, 54, 46.1, 5.29 }, - { 6, 59, 27.89, +25, 54, 51.1, 6.40 }, - { 15, 59, 30.19, +25, 55, 13.1, 2.00 }, - { 21, 53, 3.79, +25, 55, 30.0, 5.08 }, - { 2, 3, 39.29, +25, 56, 8.2, 5.63 }, - { 2, 11, 12.00, +25, 56, 12.8, 6.02 }, - { 5, 36, 30.19, +25, 56, 21.8, 6.49 }, - { 2, 9, 25.30, +25, 56, 22.9, 4.98 }, - { 5, 57, 59.69, +25, 57, 14.0, 4.82 }, - { 23, 55, 22.99, +25, 57, 18.0, 6.54 }, - { 12, 20, 17.69, +26, 0, 6.8, 6.15 }, - { 9, 52, 45.79, +26, 0, 24.8, 3.88 }, - { 12, 19, 2.09, +26, 0, 28.1, 6.48 }, - { 17, 55, 25.20, +26, 3, .0, 5.46 }, - { 15, 49, 35.69, +26, 4, 5.9, 4.63 }, - { 6, 58, 47.40, +26, 4, 52.0, 6.10 }, - { 18, 7, 49.49, +26, 5, 51.0, 5.90 }, - { 12, 24, 18.50, +26, 5, 55.0, 5.18 }, - { 18, 7, 49.49, +26, 6, 5.0, 5.86 }, - { 17, 30, 44.30, +26, 6, 38.2, 4.41 }, - { 21, 24, 34.01, +26, 10, 27.8, 5.68 }, - { 9, 24, 39.31, +26, 10, 55.9, 4.46 }, - { 12, 28, 38.11, +26, 13, 36.1, 6.54 }, - { 18, 59, 45.50, +26, 13, 50.2, 5.27 }, - { 19, 22, 50.90, +26, 15, 45.0, 5.18 }, - { 19, 1, 17.40, +26, 17, 29.0, 5.69 }, - { 15, 42, 44.59, +26, 17, 44.2, 3.84 }, - { 15, 8, 23.81, +26, 18, 4.0, 5.67 }, - { 10, 43, 1.80, +26, 19, 32.2, 5.51 }, - { 18, 26, 40.90, +26, 26, 57.8, 6.53 }, - { 20, 37, 4.70, +26, 27, 42.8, 5.59 }, - { 3, 1, 54.10, +26, 27, 43.9, 5.90 }, - { 20, 12, .70, +26, 28, 44.0, 5.92 }, - { 4, 10, 49.90, +26, 28, 50.9, 5.41 }, - { 14, 43, 25.39, +26, 31, 40.1, 4.81 }, - { 23, 21, 58.20, +26, 36, 32.0, 6.62 }, - { 19, 31, 21.79, +26, 37, 1.9, 5.87 }, - { 5, 38, 57.41, +26, 37, 4.1, 6.37 }, - { 12, 20, 19.70, +26, 37, 9.8, 5.54 }, - { 9, 8, 47.30, +26, 37, 45.1, 5.98 }, - { 0, 4, 55.99, +26, 38, 56.0, 6.25 }, - { 18, 46, 4.49, +26, 39, 43.9, 4.83 }, - { 16, 12, 45.31, +26, 40, 14.9, 6.50 }, - { 22, 5, 11.40, +26, 40, 26.0, 5.78 }, - { 14, 32, 20.21, +26, 40, 37.9, 6.01 }, - { 15, 34, 41.30, +26, 42, 52.9, 2.23 }, - { 19, 11, 30.91, +26, 44, 8.9, 6.36 }, - { 22, 29, 10.20, +26, 45, 47.2, 5.79 }, - { 7, 53, 29.81, +26, 45, 56.9, 4.97 }, - { 20, 11, 48.00, +26, 48, 32.0, 5.49 }, - { 12, 26, 59.30, +26, 49, 32.2, 5.00 }, - { 23, 11, 49.20, +26, 50, 49.9, 6.17 }, - { 7, 11, 23.11, +26, 51, 24.1, 5.78 }, - { 15, 57, 35.30, +26, 52, 40.1, 4.15 }, - { 17, 26, .91, +26, 52, 44.0, 6.41 }, - { 7, 35, 55.30, +26, 53, 44.9, 4.06 }, - { 3, 10, 27.00, +26, 53, 47.0, 6.02 }, - { 20, 10, 33.50, +26, 54, 15.1, 5.52 }, - { 16, 41, 36.70, +26, 55, .8, 5.92 }, - { 0, 0, 23.90, +26, 55, 5.9, 6.46 }, - { 5, 37, 8.81, +26, 55, 27.1, 5.83 }, - { 21, 6, 23.50, +26, 55, 27.8, 6.12 }, - { 8, 26, 46.80, +26, 56, 3.8, 6.32 }, - { 22, 21, .10, +26, 56, 7.1, 6.47 }, - { 8, 26, 46.99, +26, 56, 7.1, 6.30 }, - { 4, 38, 29.59, +26, 56, 24.0, 6.47 }, - { 15, 4, 26.71, +26, 56, 51.0, 4.54 }, - { 6, 28, 56.59, +26, 58, 4.1, 6.47 }, - { 0, 13, 24.00, +26, 59, 13.9, 6.30 }, - { 2, 27, 7.01, +27, 0, 47.9, 6.18 }, - { 12, 20, 41.30, +27, 3, 16.9, 7.13 }, - { 2, 40, 41.09, +27, 3, 38.9, 5.30 }, - { 3, 19, 55.80, +27, 4, 16.0, 5.90 }, - { 14, 44, 59.21, +27, 4, 27.1, 2.70 }, - { 14, 44, 59.21, +27, 4, 30.0, 5.12 }, - { 0, 2, 10.20, +27, 4, 54.8, 5.75 }, - { 20, 52, 7.70, +27, 5, 48.8, 4.59 }, - { 19, 43, 55.90, +27, 8, 8.2, 6.28 }, - { 10, 13, 49.80, +27, 8, 8.9, 6.04 }, - { 17, 1, 9.60, +27, 11, 47.0, 6.55 }, - { 0, 55, 58.49, +27, 12, 33.8, 6.09 }, - { 8, 20, 3.91, +27, 13, 4.1, 5.14 }, - { 7, 12, 49.01, +27, 13, 28.9, 6.43 }, - { 0, 36, 19.99, +27, 15, 16.9, 6.50 }, - { 3, 12, 14.21, +27, 15, 24.8, 5.79 }, - { 2, 49, 58.99, +27, 15, 38.2, 3.63 }, - { 1, 19, 28.01, +27, 15, 51.1, 4.76 }, - { 12, 26, 24.10, +27, 16, 5.9, 4.95 }, - { 12, 10, 46.10, +27, 16, 53.0, 6.01 }, - { 0, 15, 10.61, +27, 16, 59.2, 6.35 }, - { 19, 47, 37.90, +27, 18, 40.0, }, - { 4, 20, 21.31, +27, 21, 2.9, 4.95 }, - { 14, 1, 10.49, +27, 23, 12.1, 6.23 }, - { 18, 24, 58.49, +27, 23, 43.1, 6.27 }, - { 10, 18, 10.30, +27, 24, 55.1, 6.52 }, - { 16, 15, 47.40, +27, 25, 19.9, 6.14 }, - { 19, 15, 57.00, +27, 27, 20.2, 6.54 }, - { 13, 56, 34.20, +27, 29, 30.8, 5.01 }, - { 8, 5, 37.01, +27, 31, 46.9, 6.21 }, - { 12, 51, 41.90, +27, 32, 26.2, 4.94 }, - { 12, 49, 17.40, +27, 33, 7.9, 5.78 }, - { 13, 7, 53.59, +27, 33, 20.9, 6.19 }, - { 3, 31, 20.81, +27, 34, 18.8, 5.96 }, - { 6, 1, .41, +27, 34, 19.9, 6.05 }, - { 0, 32, 34.51, +27, 34, 50.2, 6.67 }, - { 4, 6, 36.41, +27, 36, .0, 5.20 }, - { 3, 22, 11.90, +27, 36, 27.0, 5.52 }, - { 21, 27, 40.10, +27, 36, 31.0, 5.41 }, - { 5, 53, 19.61, +27, 36, 43.9, 4.58 }, - { 13, 7, 10.70, +27, 37, 28.9, 4.80 }, - { 7, 24, 33.41, +27, 38, 17.2, 5.76 }, - { 5, 35, 55.49, +27, 39, 43.9, 6.27 }, - { 5, 4, 37.90, +27, 41, 46.0, 6.60 }, - { 2, 43, 27.10, +27, 42, 25.9, 4.66 }, - { 0, 49, 53.21, +27, 42, 37.1, 7.10 }, - { 0, 49, 52.80, +27, 42, 38.9, 7.00 }, - { 17, 46, 27.50, +27, 43, 14.2, 3.42 }, - { 20, 1, 6.10, +27, 45, 13.0, 4.64 }, - { 9, 58, 26.09, +27, 45, 32.0, 6.30 }, - { 11, 36, 17.90, +27, 46, 52.0, 5.80 }, - { 8, 3, 31.10, +27, 47, 39.1, 4.94 }, - { 7, 25, 43.61, +27, 47, 53.2, 3.79 }, - { 22, 16, 29.69, +27, 48, 15.1, 6.37 }, - { 1, 57, 43.80, +27, 48, 15.8, 5.82 }, - { 20, 15, 46.10, +27, 48, 51.1, 4.52 }, - { 3, 10, 8.81, +27, 49, 12.0, 6.42 }, - { 13, 11, 52.39, +27, 52, 41.2, 4.26 }, - { 8, 26, 27.70, +27, 53, 37.0, 5.57 }, - { 4, 52, 47.11, +27, 53, 51.0, 5.97 }, - { 7, 15, 57.10, +27, 53, 51.0, 5.71 }, - { 9, 4, 9.89, +27, 53, 53.9, 6.38 }, - { 9, 1, 48.91, +27, 54, 10.1, 6.07 }, - { 18, 54, 13.20, +27, 54, 33.8, 5.62 }, - { 7, 29, 48.70, +27, 54, 58.0, 5.01 }, - { 19, 15, 59.40, +27, 55, 36.8, 6.16 }, - { 8, 55, 39.70, +27, 55, 39.0, 5.22 }, - { 5, 20, 59.30, +27, 57, 25.9, 6.33 }, - { 19, 30, 43.30, +27, 57, 34.9, 3.08 }, - { 19, 30, 45.31, +27, 57, 55.1, 5.11 }, - { 5, 50, 58.10, +27, 58, 4.1, 5.56 }, - { 10, 49, 53.71, +27, 58, 26.0, 6.04 }, - { 6, 35, 12.10, +28, 1, 19.9, 5.27 }, - { 7, 45, 18.91, +28, 1, 34.0, 1.14 }, - { 5, 9, 45.10, +28, 1, 50.2, 6.01 }, - { 20, 54, 33.60, +28, 3, 27.0, 5.01 }, - { 13, 40, 39.10, +28, 3, 55.1, 6.23 }, - { 23, 3, 46.51, +28, 4, 58.1, 2.42 }, - { 19, 24, 22.39, +28, 5, 16.1, 6.53 }, - { 7, 29, 20.40, +28, 7, 5.2, 5.05 }, - { 15, 48, 34.39, +28, 9, 24.1, 5.85 }, - { 12, 19, 29.59, +28, 9, 24.8, 6.33 }, - { 7, 7, 25.01, +28, 10, 37.9, 6.48 }, - { 17, 36, 7.90, +28, 11, 4.9, 6.38 }, - { 6, 41, 21.00, +28, 11, 47.0, 6.42 }, - { 21, 35, 19.01, +28, 11, 49.9, 6.31 }, - { 23, 15, 46.30, +28, 14, 52.1, 6.49 }, - { 20, 51, 28.20, +28, 15, 2.2, 5.77 }, - { 8, 52, 28.61, +28, 15, 33.1, 6.23 }, - { 6, 39, 33.10, +28, 15, 47.2, 6.03 }, - { 12, 26, 56.30, +28, 16, 5.9, 4.36 }, - { 3, 3, 30.31, +28, 16, 10.9, 6.36 }, - { 0, 32, 49.10, +28, 16, 49.1, 6.30 }, - { 14, 28, 31.51, +28, 17, 21.1, 7.62 }, - { 14, 28, 33.29, +28, 17, 26.9, 7.12 }, - { 22, 21, 19.30, +28, 19, 50.2, 4.81 }, - { 8, 52, 35.81, +28, 19, 50.9, 5.95 }, - { 9, 33, 18.29, +28, 22, 5.2, 6.53 }, - { 23, 31, 43.10, +28, 24, 13.0, 6.41 }, - { 17, 31, 49.61, +28, 24, 27.0, 5.62 }, - { 19, 49, 54.60, +28, 26, 26.2, 6.38 }, - { 20, 54, 22.39, +28, 31, 18.8, 6.56 }, - { 1, 14, 4.99, +28, 31, 46.9, 6.43 }, - { 12, 12, 1.20, +28, 32, 10.0, 6.49 }, - { 5, 26, 17.50, +28, 36, 27.0, 1.65 }, - { 22, 13, 38.59, +28, 36, 29.9, 5.89 }, - { 4, 41, 19.80, +28, 36, 54.0, 5.78 }, - { 14, 49, 58.39, +28, 36, 56.9, 5.80 }, - { 19, 6, 37.70, +28, 37, 43.0, 5.55 }, - { 2, 18, 57.00, +28, 38, 33.0, 5.03 }, - { 13, 53, 10.30, +28, 38, 53.2, 5.90 }, - { 10, 16, 28.10, +28, 40, 57.0, 6.49 }, - { 20, 14, 14.50, +28, 41, 40.9, 5.18 }, - { 1, 21, 7.39, +28, 44, 17.2, 5.23 }, - { 21, 44, 8.59, +28, 44, 34.1, 4.73 }, - { 21, 44, 8.30, +28, 44, 35.2, 6.08 }, - { 17, 21, 31.20, +28, 45, 29.2, 6.35 }, - { 8, 46, 41.81, +28, 45, 36.0, 4.02 }, - { 18, 7, 32.59, +28, 45, 45.0, 3.83 }, - { 8, 46, 40.01, +28, 45, 55.1, 6.57 }, - { 18, 51, 35.90, +28, 47, 1.0, 6.18 }, - { 21, 52, 29.90, +28, 47, 35.9, 5.53 }, - { 17, 18, 48.50, +28, 49, 23.2, 5.65 }, - { 23, 49, 39.41, +28, 50, 33.0, 5.97 }, - { 18, 21, 1.01, +28, 52, 12.0, 5.12 }, - { 7, 43, 18.70, +28, 53, 1.0, 4.28 }, - { 5, 23, 22.90, +28, 56, 12.1, 6.46 }, - { 12, 17, 30.50, +28, 56, 13.9, 5.70 }, - { 5, 56, 33.79, +28, 56, 31.9, 6.32 }, - { 4, 34, 37.99, +28, 57, 40.0, 5.88 }, - { 22, 5, 34.70, +28, 57, 50.0, 5.70 }, - { 6, 44, 45.50, +28, 58, 14.9, 5.44 }, - { 6, 38, 22.99, +28, 59, 3.1, 5.79 }, - { 0, 57, 50.21, +28, 59, 31.9, 5.42 }, - { 4, 7, .50, +29, 0, 5.0, 5.23 }, - { 0, 6, 36.79, +29, 1, 17.0, 6.13 }, - { 13, 6, 10.20, +29, 1, 45.8, 6.54 }, - { 3, 20, 20.40, +29, 2, 53.9, 4.47 }, - { 3, 9, 36.70, +29, 4, 36.8, 5.72 }, - { 0, 8, 23.30, +29, 5, 26.2, 2.06 }, - { 15, 27, 49.70, +29, 6, 20.9, 3.68 }, - { 20, 17, 31.51, +29, 8, 53.2, 6.22 }, - { 16, 16, 44.81, +29, 9, 1.1, 5.78 }, - { 15, 14, 29.21, +29, 9, 51.1, 5.26 }, - { 5, 29, 40.61, +29, 11, 11.0, 6.24 }, - { 18, 14, 43.99, +29, 12, 25.9, 6.56 }, - { 5, 39, 18.41, +29, 12, 55.1, 5.96 }, - { 2, 47, 54.50, +29, 14, 49.9, 4.51 }, - { 17, 57, 45.91, +29, 14, 52.1, 3.70 }, - { 19, 44, 48.70, +29, 15, 52.9, 6.82 }, - { 22, 41, 45.41, +29, 18, 27.0, 4.79 }, - { 10, 16, 14.40, +29, 18, 38.2, 5.35 }, - { 0, 38, 33.31, +29, 18, 42.1, 4.37 }, - { 17, 50, 22.90, +29, 19, 19.9, 5.50 }, - { 19, 42, 49.10, +29, 19, 54.1, 6.49 }, - { 19, 37, 9.41, +29, 20, 1.0, 6.43 }, - { 7, 3, 30.41, +29, 20, 13.9, 5.93 }, - { 23, 43, 59.50, +29, 21, 42.1, 4.93 }, - { 10, 48, 57.19, +29, 24, 56.9, 6.15 }, - { 23, 13, 4.01, +29, 26, 30.1, 6.35 }, - { 19, 34, 50.90, +29, 27, 47.2, 5.38 }, - { 5, 41, 21.00, +29, 29, 15.0, 6.43 }, - { 6, 15, 22.70, +29, 29, 53.2, 4.35 }, - { 6, 6, 22.51, +29, 30, 45.0, 6.08 }, - { 6, 21, 12.10, +29, 32, 28.0, 6.43 }, - { 22, 31, 34.20, +29, 32, 34.1, 6.35 }, - { 5, 21, 12.70, +29, 34, 12.0, 5.76 }, - { 1, 53, 4.90, +29, 34, 44.0, 3.41 }, - { 10, 23, 41.81, +29, 36, 56.9, 6.39 }, - { 15, 20, 8.50, +29, 36, 58.0, 5.51 }, - { 19, 24, 7.61, +29, 37, 17.0, 4.97 }, - { 9, 59, 36.19, +29, 38, 43.1, 5.73 }, - { 20, 53, 7.39, +29, 38, 57.8, 6.34 }, - { 9, 8, .10, +29, 39, 15.1, 5.43 }, - { 8, 13, 8.90, +29, 39, 24.1, 5.64 }, - { 1, 4, 27.60, +29, 39, 31.0, 6.19 }, - { 18, 19, 52.10, +29, 39, 58.0, 5.99 }, - { 2, 28, 10.01, +29, 40, 9.8, 5.29 }, - { 6, 24, 52.61, +29, 42, 25.9, 6.71 }, - { 14, 34, 40.80, +29, 44, 42.0, 4.46 }, - { 0, 30, 7.30, +29, 45, 6.1, 5.23 }, - { 23, 14, 21.70, +29, 46, 18.1, 6.41 }, - { 20, 40, 36.19, +29, 48, 19.1, 6.08 }, - { 16, 50, 39.00, +29, 48, 24.1, 5.72 }, - { 18, 25, 58.80, +29, 49, 44.0, 5.83 }, - { 16, 1, 26.59, +29, 51, 4.0, 4.99 }, - { 18, 20, 57.10, +29, 51, 32.0, 5.63 }, - { 20, 3, 37.39, +29, 53, 48.1, 5.71 }, - { 21, 14, 10.30, +29, 54, 4.0, 6.17 }, - { 19, 5, 47.11, +29, 55, 18.1, 6.31 }, - { 2, 28, 48.50, +29, 55, 54.8, 5.89 }, - { 6, 44, 12.10, +29, 56, 42.0, }, - { 9, 43, 33.29, +29, 58, 27.8, 5.64 }, - { 15, 36, 53.40, +29, 59, 28.0, 6.52 }, - { 1, 41, 39.19, +30, 2, 49.9, 5.99 }, - { 21, 36, 13.90, +30, 3, 20.2, 6.36 }, - { 1, 12, 59.50, +30, 3, 51.1, 6.19 }, - { 1, 11, 39.60, +30, 5, 22.9, 4.51 }, - { 19, 39, 22.61, +30, 9, 11.9, 4.69 }, - { 21, 49, 50.69, +30, 10, 27.1, 5.04 }, - { 2, 20, 4.39, +30, 11, 17.9, 6.47 }, - { 17, 58, 30.19, +30, 11, 21.8, 4.41 }, - { 19, 55, 6.50, +30, 11, 43.1, 6.57 }, - { 21, 8, 38.90, +30, 12, 20.9, 5.59 }, - { 5, 27, 8.30, +30, 12, 31.0, 5.74 }, - { 22, 43, .10, +30, 13, 17.0, 2.94 }, - { 21, 12, 56.21, +30, 13, 36.8, 3.20 }, - { 8, 57, 58.70, +30, 14, 1.0, 6.29 }, - { 7, 11, 8.40, +30, 14, 43.1, 4.41 }, - { 12, 18, 31.61, +30, 14, 57.1, 6.23 }, - { 15, 23, 12.31, +30, 17, 16.1, 6.08 }, - { 15, 23, 12.31, +30, 17, 16.1, 5.58 }, - { 2, 12, 22.30, +30, 18, 11.2, 4.94 }, - { 21, 22, 41.90, +30, 18, 34.9, 6.05 }, - { 20, 38, 59.50, +30, 20, 3.8, 5.68 }, - { 4, 28, 51.89, +30, 21, 41.0, 6.40 }, - { 20, 29, 23.71, +30, 22, 7.0, 4.01 }, - { 14, 31, 49.80, +30, 22, 17.0, 3.58 }, - { 23, 20, 49.61, +30, 24, 54.0, 5.59 }, - { 14, 20, 8.71, +30, 25, 45.1, 6.44 }, - { 5, 31, 59.10, +30, 26, 45.0, }, - { 18, 9, 10.20, +30, 28, 9.8, 6.38 }, - { 5, 38, 38.11, +30, 29, 33.0, 5.40 }, - { 6, 28, 34.10, +30, 29, 35.2, 5.55 }, - { 5, 4, 14.50, +30, 29, 40.9, 6.14 }, - { 19, 15, 24.79, +30, 31, 35.0, 5.85 }, - { 22, 10, 51.60, +30, 33, 11.2, 6.32 }, - { 18, 32, 49.90, +30, 33, 15.1, 5.48 }, - { 3, 15, 20.50, +30, 33, 24.1, 5.52 }, - { 18, 7, 1.51, +30, 33, 42.8, 5.04 }, - { 8, 54, 14.69, +30, 34, 45.8, 5.39 }, - { 19, 43, 9.50, +30, 40, 43.0, 6.05 }, - { 10, 45, 51.89, +30, 40, 55.9, 5.24 }, - { 8, 45, 21.41, +30, 41, 52.1, 6.13 }, - { 20, 45, 39.70, +30, 43, 10.9, 4.22 }, - { 19, 4, 58.30, +30, 43, 59.9, 6.06 }, - { 13, 0, 16.51, +30, 47, 6.0, 4.90 }, - { 17, 36, 36.70, +30, 47, 7.1, 6.02 }, - { 18, 40, 1.99, +30, 50, 57.8, 6.36 }, - { 0, 39, 19.70, +30, 51, 38.9, 3.27 }, - { 16, 22, 5.81, +30, 53, 30.8, 4.85 }, - { 18, 33, 23.11, +30, 53, 33.0, 6.59 }, - { 17, 0, 17.40, +30, 55, 35.0, 3.92 }, - { 0, 20, 24.41, +30, 56, 8.9, 5.90 }, - { 7, 18, 4.10, +30, 57, 20.9, 6.24 }, - { 7, 35, 8.69, +30, 57, 40.0, 5.33 }, - { 9, 10, 38.71, +30, 57, 47.2, 5.95 }, - { 22, 41, 31.39, +30, 57, 56.9, 6.34 }, - { 19, 58, 37.99, +30, 59, 1.0, 5.49 }, - { 13, 40, 15.60, +31, 0, 42.8, 6.21 }, - { 19, 18, .79, +31, 1, 19.9, 6.68 }, - { 6, 1, 10.20, +31, 2, 4.9, 5.98 }, - { 3, 55, 22.99, +31, 2, 44.9, 6.10 }, - { 23, 0, 42.50, +31, 4, 59.2, 6.60 }, - { 5, 24, 38.50, +31, 8, 35.2, 5.94 }, - { 17, 30, 55.39, +31, 9, 29.9, 5.61 }, - { 9, 36, 42.91, +31, 9, 42.1, 5.56 }, - { 3, 52, 4.30, +31, 10, 5.9, 6.25 }, - { 21, 6, 30.31, +31, 11, 4.9, 5.82 }, - { 13, 48, 38.71, +31, 11, 25.1, 5.62 }, - { 17, 39, 57.50, +31, 12, 9.0, 6.03 }, - { 5, 24, 38.30, +31, 13, 26.0, 6.28 }, - { 20, 22, 37.39, +31, 15, 54.0, 6.09 }, - { 9, 41, 35.21, +31, 16, 41.2, 5.89 }, - { 19, 11, 46.01, +31, 16, 59.9, 5.98 }, - { 15, 30, 22.70, +31, 17, 10.0, 6.46 }, - { 17, 40, 41.21, +31, 17, 15.0, 6.28 }, - { 23, 33, 57.19, +31, 19, 31.1, 4.98 }, - { 5, 40, 35.90, +31, 21, 29.2, 6.04 }, - { 15, 32, 55.80, +31, 21, 33.1, 4.14 }, - { 18, 11, 54.19, +31, 24, 19.1, 4.97 }, - { 1, 11, 6.79, +31, 25, 28.9, 5.16 }, - { 4, 49, 12.79, +31, 26, 13.9, 5.58 }, - { 4, 26, 6.31, +31, 26, 20.0, 5.28 }, - { 10, 15, 6.29, +31, 28, 5.2, 6.46 }, - { 17, 45, 40.30, +31, 30, 16.9, 6.23 }, - { 0, 18, 38.30, +31, 31, 1.9, 5.87 }, - { 20, 37, 32.59, +31, 31, 18.8, 6.49 }, - { 2, 11, 25.01, +31, 31, 35.0, 6.23 }, - { 11, 18, 10.90, +31, 31, 45.1, 4.87 }, - { 11, 18, 10.99, +31, 31, 45.1, 4.41 }, - { 0, 15, 7.01, +31, 32, 8.9, 6.45 }, - { 20, 37, 31.80, +31, 34, 21.0, 6.32 }, - { 16, 41, 17.21, +31, 36, 11.2, 2.81 }, - { 10, 8, 15.91, +31, 36, 15.1, 6.24 }, - { 2, 36, 42.89, +31, 36, 27.0, 6.10 }, - { 18, 41, 41.30, +31, 37, 4.1, 6.41 }, - { 18, 49, 43.99, +31, 37, 45.1, 6.64 }, - { 10, 42, 11.30, +31, 41, 48.8, 6.02 }, - { 5, 54, 58.99, +31, 42, 6.1, 5.90 }, - { 16, 52, 58.10, +31, 42, 6.1, 5.32 }, - { 15, 48, 1.99, +31, 44, 8.9, 6.44 }, - { 19, 4, 57.89, +31, 44, 39.8, 5.56 }, - { 1, 17, 24.10, +31, 44, 40.9, 6.73 }, - { 11, 41, 34.30, +31, 44, 46.0, 5.73 }, - { 18, 47, 57.50, +31, 45, 24.8, 6.06 }, - { 23, 2, 33.10, +31, 46, 50.2, 6.57 }, - { 7, 29, 6.70, +31, 47, 3.8, 4.18 }, - { 15, 14, 6.10, +31, 47, 17.2, 5.99 }, - { 14, 29, 49.70, +31, 47, 28.0, 6.06 }, - { 2, 27, 27.70, +31, 48, 5.0, 5.54 }, - { 1, 2, 49.10, +31, 48, 15.8, 5.50 }, - { 23, 21, 54.91, +31, 48, 45.0, 5.32 }, - { 22, 27, 46.20, +31, 50, 25.1, 5.98 }, - { 3, 54, 7.90, +31, 53, 1.0, 2.85 }, - { 17, 2, 17.21, +31, 53, 4.9, 6.36 }, - { 7, 34, 36.00, +31, 53, 17.9, 1.98 }, - { 7, 34, 36.00, +31, 53, 19.0, 2.88 }, - { 5, 40, 42.10, +31, 55, 14.9, 6.11 }, - { 10, 1, .70, +31, 55, 25.0, 5.36 }, - { 18, 43, 51.60, +31, 55, 36.1, 5.70 }, - { 2, 57, 17.30, +31, 56, 3.1, 5.11 }, - { 8, 40, 18.29, +31, 56, 30.8, 6.10 }, - { 4, 20, 10.01, +31, 57, 11.9, 6.16 }, - { 10, 38, 43.20, +31, 58, 34.0, 4.71 }, - { 7, 39, 54.10, +32, 0, 34.9, 6.17 }, - { 1, 8, 1.30, +32, 0, 43.9, 6.25 }, - { 13, 56, 10.49, +32, 1, 57.0, 6.32 }, - { 5, 51, 25.70, +32, 7, 30.0, 6.25 }, - { 19, 0, .91, +32, 8, 44.2, 4.93 }, - { 3, 16, 35.11, +32, 11, 1.0, 6.06 }, - { 20, 23, 51.70, +32, 11, 24.0, 4.43 }, - { 1, 43, 49.99, +32, 11, 30.1, 6.34 }, - { 5, 32, 43.70, +32, 11, 30.8, 4.76 }, - { 3, 47, 48.91, +32, 11, 42.0, 6.25 }, - { 20, 4, 36.10, +32, 13, 7.0, 5.64 }, - { 21, 28, 8.30, +32, 13, 31.1, 5.80 }, - { 18, 5, 49.61, +32, 13, 50.2, 5.71 }, - { 9, 1, 24.10, +32, 15, 9.0, 5.82 }, - { 11, 58, 7.20, +32, 16, 26.0, 6.42 }, - { 3, 44, 19.10, +32, 17, 17.9, 3.83 }, - { 14, 11, 15.10, +32, 17, 44.2, 6.11 }, - { 14, 55, 58.70, +32, 18, 1.1, 6.12 }, - { 20, 41, 2.59, +32, 18, 25.9, 5.51 }, - { 5, 4, 36.89, +32, 19, 13.1, 6.62 }, - { 16, 22, 56.50, +32, 19, 59.2, 6.40 }, - { 9, 4, 55.20, +32, 22, 36.8, 6.46 }, - { 10, 31, 51.41, +32, 22, 45.8, 5.90 }, - { 23, 58, 49.20, +32, 22, 54.1, 6.52 }, - { 23, 24, 50.81, +32, 23, 6.0, 5.57 }, - { 7, 1, 17.21, +32, 24, 51.8, 6.59 }, - { 8, 59, 32.59, +32, 25, 7.0, 5.20 }, - { 19, 42, 44.59, +32, 25, 36.1, 5.94 }, - { 21, 20, 50.09, +32, 27, 10.1, 5.68 }, - { 6, 32, 27.19, +32, 27, 16.9, 5.87 }, - { 4, 30, 38.30, +32, 27, 29.2, 6.21 }, - { 17, 20, 39.60, +32, 28, 4.1, 5.39 }, - { 8, 52, 34.61, +32, 28, 27.1, 5.66 }, - { 19, 7, 25.61, +32, 30, 6.1, 5.23 }, - { 15, 19, 30.19, +32, 30, 55.1, 6.32 }, - { 15, 43, 59.30, +32, 30, 56.9, 5.56 }, - { 23, 23, 47.50, +32, 31, 53.0, 6.69 }, - { 14, 34, 11.71, +32, 32, 3.8, 6.33 }, - { 9, 8, 4.10, +32, 32, 26.2, 6.50 }, - { 18, 49, 52.90, +32, 33, 2.9, 5.25 }, - { 16, 50, 43.10, +32, 33, 13.0, 6.13 }, - { 6, 27, 35.50, +32, 33, 47.2, 6.43 }, - { 22, 30, 1.80, +32, 34, 21.0, 5.65 }, - { 4, 49, 19.01, +32, 35, 17.9, 5.86 }, - { 6, 49, 41.30, +32, 36, 24.1, 5.71 }, - { 21, 21, 22.01, +32, 36, 46.1, 6.04 }, - { 6, 2, 55.10, +32, 38, 8.9, 6.24 }, - { 5, 15, 24.41, +32, 41, 16.1, 5.02 }, - { 18, 58, 56.59, +32, 41, 21.8, 3.24 }, - { 1, 48, 41.59, +32, 41, 25.1, 5.79 }, - { 6, 12, 20.09, +32, 41, 35.9, 5.78 }, - { 17, 38, 49.70, +32, 44, 21.8, 6.37 }, - { 14, 45, 13.70, +32, 47, 17.9, 6.28 }, - { 5, 33, 27.50, +32, 48, 4.0, 6.48 }, - { 8, 38, 19.01, +32, 48, 6.8, 5.94 }, - { 18, 49, 45.91, +32, 48, 46.1, 5.91 }, - { 23, 7, 27.70, +32, 49, 32.9, 6.02 }, - { 20, 52, .31, +32, 50, 57.1, 6.44 }, - { 3, 15, 46.99, +32, 51, 23.0, 6.31 }, - { 4, 43, 48.29, +32, 51, 55.1, 6.45 }, - { 19, 46, 34.99, +32, 53, 19.0, 6.18 }, - { 2, 37, 6.41, +32, 53, 30.8, 6.25 }, - { 18, 57, 1.61, +32, 54, 5.0, 5.22 }, - { 9, 21, 27.19, +32, 54, 6.8, 6.16 }, - { 23, 36, 30.50, +32, 54, 15.1, 6.35 }, - { 8, 56, 56.59, +32, 54, 37.1, 5.45 }, - { 0, 20, 45.50, +32, 54, 41.0, 5.79 }, - { 19, 50, 33.89, +32, 54, 51.1, 4.23 }, - { 15, 21, 48.60, +32, 56, 2.0, 5.37 }, - { 22, 4, 34.39, +32, 56, 30.8, 6.38 }, - { 22, 0, 26.81, +33, 0, 22.0, 6.46 }, - { 6, 33, 42.70, +33, 1, 27.1, 6.42 }, - { 12, 16, 30.10, +33, 3, 41.0, 5.00 }, - { 3, 49, 32.59, +33, 5, 29.0, 5.11 }, - { 11, 18, 28.70, +33, 5, 39.1, 3.48 }, - { 17, 17, 19.49, +33, 6, .0, 4.82 }, - { 1, 16, 18.79, +33, 6, 52.9, 6.02 }, - { 4, 56, 59.59, +33, 9, 58.0, 2.69 }, - { 11, 59, 17.59, +33, 10, 3.0, 5.96 }, - { 22, 9, 13.61, +33, 10, 19.9, 5.58 }, - { 22, 9, 59.21, +33, 10, 41.9, 4.29 }, - { 0, 14, 2.30, +33, 12, 22.0, 6.25 }, - { 18, 0, 36.41, +33, 12, 50.0, 5.99 }, - { 19, 23, 34.01, +33, 13, 19.9, 6.37 }, - { 7, 51, 2.30, +33, 14, 1.0, 6.03 }, - { 12, 33, 38.90, +33, 14, 51.0, 5.42 }, - { 5, 26, 51.31, +33, 15, 46.1, 6.15 }, - { 2, 2, 58.01, +33, 17, 2.0, 5.50 }, - { 8, 50, 32.21, +33, 17, 7.1, 6.25 }, - { 16, 1, 2.69, +33, 18, 13.0, 5.41 }, - { 18, 1, 35.90, +33, 18, 41.0, 6.15 }, - { 15, 15, 30.19, +33, 18, 52.9, 3.47 }, - { 16, 11, 39.70, +33, 20, 33.0, 6.29 }, - { 2, 15, 56.21, +33, 21, 32.0, 5.28 }, - { 18, 50, 4.80, +33, 21, 46.1, 3.45 }, - { 5, 18, 10.70, +33, 22, 18.1, 4.54 }, - { 11, 51, 9.41, +33, 22, 30.0, 6.27 }, - { 12, 33, 47.40, +33, 23, 4.9, 6.24 }, - { 19, 19, 3.79, +33, 23, 20.0, 6.60 }, - { 7, 47, 30.31, +33, 24, 56.2, 5.14 }, - { 19, 48, 50.59, +33, 26, 13.9, 6.44 }, - { 20, 53, 53.90, +33, 26, 16.1, 5.47 }, - { 18, 11, 45.10, +33, 26, 48.8, 5.88 }, - { 11, 26, 25.49, +33, 27, 2.2, 6.32 }, - { 18, 36, 37.20, +33, 28, 8.0, 5.42 }, - { 23, 34, 38.21, +33, 29, 49.9, 5.63 }, - { 10, 55, 44.40, +33, 30, 24.8, 5.03 }, - { 19, 22, 33.41, +33, 31, 5.2, 6.06 }, - { 12, 54, 13.10, +33, 32, 3.8, 6.26 }, - { 3, 24, 29.69, +33, 32, 8.9, 5.61 }, - { 5, 37, 45.70, +33, 33, 33.1, 6.33 }, - { 17, 1, 36.41, +33, 34, 5.9, 5.25 }, - { 0, 31, 25.61, +33, 34, 54.1, 5.87 }, - { 4, 10, 58.99, +33, 35, 12.1, 5.72 }, - { 6, 5, 34.01, +33, 35, 57.1, 6.23 }, - { 3, 47, 52.61, +33, 36, .0, 6.57 }, - { 19, 1, 48.31, +33, 37, 17.0, 6.39 }, - { 11, 38, 32.21, +33, 37, 32.2, 6.27 }, - { 9, 30, 43.20, +33, 39, 20.2, 5.85 }, - { 6, 57, .50, +33, 40, 52.0, 5.89 }, - { 16, 22, 29.21, +33, 42, 13.0, 5.39 }, - { 10, 24, 8.59, +33, 43, 7.0, 5.50 }, - { 0, 36, 52.90, +33, 43, 9.8, 4.36 }, - { 23, 59, 29.21, +33, 43, 27.8, 6.58 }, - { 23, 59, 29.21, +33, 43, 27.8, 6.58 }, - { 19, 46, 25.61, +33, 43, 40.1, 4.99 }, - { 20, 15, 23.71, +33, 43, 45.8, 5.66 }, - { 5, 19, .00, +33, 44, 53.9, 5.41 }, - { 5, 18, 18.91, +33, 46, 1.9, 6.14 }, - { 10, 25, 54.89, +33, 47, 46.0, 4.74 }, - { 16, 22, 21.41, +33, 47, 57.1, 5.20 }, - { 19, 0, 55.20, +33, 48, 7.9, 6.01 }, - { 3, 28, 20.81, +33, 48, 27.0, 5.61 }, - { 7, 8, 13.30, +33, 49, 55.9, 6.28 }, - { 2, 30, 16.61, +33, 50, 2.0, 6.25 }, - { 2, 17, 18.91, +33, 50, 49.9, 4.01 }, - { 16, 14, 40.80, +33, 51, 29.9, 6.66 }, - { 16, 14, 40.80, +33, 51, 31.0, 5.64 }, - { 9, 8, 51.10, +33, 52, 55.9, 5.93 }, - { 10, 23, 6.29, +33, 54, 29.2, 5.90 }, - { 5, 52, 40.10, +33, 55, 3.0, 5.98 }, - { 0, 58, 14.21, +33, 57, 2.9, 5.98 }, - { 5, 20, .91, +33, 57, 29.2, 5.03 }, - { 4, 24, 37.39, +33, 57, 34.9, 5.76 }, - { 6, 52, 47.30, +33, 57, 40.0, 3.60 }, - { 3, 42, 22.51, +33, 57, 54.0, 4.97 }, - { 18, 54, 52.51, +33, 58, 7.0, 6.02 }, - { 20, 46, 12.70, +33, 58, 13.1, 2.46 }, - { 19, 39, 45.00, +33, 58, 45.1, 6.10 }, - { 5, 19, 23.59, +33, 59, 8.2, 6.49 }, - { 7, 42, 43.51, +34, 0, 1.1, 6.02 }, - { 7, 7, 22.30, +34, 0, 33.8, 5.91 }, - { 10, 54, 58.20, +34, 2, 4.9, 5.72 }, - { 11, 59, 57.19, +34, 2, 6.0, 6.50 }, - { 16, 43, 51.70, +34, 2, 20.0, 5.99 }, - { 13, 18, 27.79, +34, 5, 53.2, 5.82 }, - { 4, 24, 29.21, +34, 7, 50.2, 5.73 }, - { 19, 43, 51.41, +34, 9, 45.0, 6.05 }, - { 11, 41, 3.00, +34, 12, 6.1, 5.33 }, - { 10, 53, 18.70, +34, 12, 54.0, 3.83 }, - { 3, 18, 43.80, +34, 13, 22.1, 4.82 }, - { 2, 17, 3.19, +34, 13, 27.1, 4.87 }, - { 1, 23, 37.49, +34, 14, 44.9, 6.29 }, - { 2, 37, 2.50, +34, 15, 50.0, 5.30 }, - { 17, 32, 1.10, +34, 16, 14.9, 6.56 }, - { 5, 16, 18.19, +34, 18, 42.8, 5.96 }, - { 20, 27, 7.70, +34, 19, 44.0, 6.39 }, - { 15, 26, 17.40, +34, 20, 8.9, 5.46 }, - { 3, 51, 53.71, +34, 21, 33.1, 5.77 }, - { 20, 47, 10.80, +34, 22, 27.1, 4.92 }, - { 1, 27, 6.19, +34, 22, 39.0, 6.27 }, - { 5, 26, 48.91, +34, 23, 30.1, 5.94 }, - { 9, 21, 3.29, +34, 23, 33.0, 3.13 }, - { 19, 44, 38.21, +34, 24, 50.0, 6.57 }, - { 20, 7, 41.40, +34, 25, 23.2, 6.11 }, - { 13, 51, 47.50, +34, 26, 39.1, 4.74 }, - { 19, 31, 46.30, +34, 27, 11.2, 4.74 }, - { 18, 35, 13.49, +34, 27, 28.1, 6.10 }, - { 7, 6, 11.59, +34, 28, 26.0, 5.55 }, - { 5, 27, 38.90, +34, 28, 32.9, 5.07 }, - { 2, 32, 52.51, +34, 32, 33.0, 5.83 }, - { 15, 3, 36.50, +34, 33, 58.0, 6.59 }, - { 4, 20, 24.60, +34, 34, .1, 4.93 }, - { 1, 26, 8.69, +34, 34, 46.9, 6.31 }, - { 7, 39, 9.91, +34, 35, 3.1, 4.90 }, - { 19, 9, 4.39, +34, 36, 2.2, 6.74 }, - { 22, 12, 47.81, +34, 36, 16.9, 5.33 }, - { 9, 15, 14.30, +34, 38, 1.0, 5.97 }, - { 0, 4, 53.81, +34, 39, 34.9, 6.12 }, - { 13, 51, 9.19, +34, 39, 51.8, 5.87 }, - { 15, 38, 48.91, +34, 40, 30.0, 6.11 }, - { 2, 35, 46.80, +34, 41, 15.0, 5.35 }, - { 3, 16, 1.90, +34, 41, 19.0, 6.25 }, - { 17, 26, 46.20, +34, 41, 44.9, 5.94 }, - { 5, 33, 37.99, +34, 43, 32.9, 6.27 }, - { 18, 42, 8.11, +34, 44, 48.1, 6.47 }, - { 13, 51, 4.51, +34, 46, 21.0, 6.65 }, - { 17, 3, 53.50, +34, 47, 25.1, 6.04 }, - { 23, 19, 27.41, +34, 47, 35.9, 6.32 }, - { 1, 32, 7.61, +34, 48, .0, 6.39 }, - { 3, 58, 3.10, +34, 48, 51.8, 6.53 }, - { 5, 25, 13.01, +34, 51, 19.1, 6.55 }, - { 21, 17, 55.10, +34, 53, 48.8, 4.43 }, - { 11, 49, 41.71, +34, 55, 54.1, 5.70 }, - { 23, 32, 24.60, +34, 57, 9.0, 6.65 }, - { 20, 18, 39.10, +34, 58, 58.1, 5.17 }, - { 2, 9, 32.59, +34, 59, 13.9, 3.00 }, - { 10, 33, 30.91, +34, 59, 19.0, 5.58 }, - { 13, 42, 43.39, +34, 59, 20.0, 5.98 }, - { 8, 25, 4.90, +35, 0, 41.0, 6.06 }, - { 19, 45, 51.41, +35, 0, 46.1, 6.09 }, - { 7, 38, 32.81, +35, 2, 55.0, 5.56 }, - { 2, 51, 30.79, +35, 3, 34.9, 4.53 }, - { 3, 56, 28.70, +35, 4, 52.0, 5.49 }, - { 19, 56, 18.41, +35, 4, 59.9, 3.89 }, - { 9, 42, 42.70, +35, 5, 35.9, 6.14 }, - { 9, 31, 32.40, +35, 6, 11.2, 5.37 }, - { 13, 19, 4.20, +35, 7, 41.2, 6.02 }, - { 2, 59, 3.70, +35, 10, 59.2, 4.93 }, - { 19, 20, 33.10, +35, 11, 10.0, 6.31 }, - { 15, 3, 6.10, +35, 12, 20.9, 5.51 }, - { 16, 31, 2.81, +35, 13, 30.0, 6.25 }, - { 10, 7, 25.80, +35, 14, 40.9, 4.48 }, - { 1, 42, 3.50, +35, 14, 44.2, 5.64 }, - { 20, 33, 54.19, +35, 15, 2.9, 4.61 }, - { 19, 48, 43.90, +35, 18, 41.0, 6.53 }, - { 9, 18, 25.99, +35, 21, 51.1, 5.75 }, - { 6, 6, 8.50, +35, 23, 15.0, 6.12 }, - { 0, 37, 21.10, +35, 23, 57.8, 5.48 }, - { 7, 55, 40.80, +35, 24, 46.1, 6.23 }, - { 8, 1, 55.10, +35, 24, 47.2, 6.34 }, - { 17, 3, 30.19, +35, 24, 51.1, 6.69 }, - { 20, 42, 22.20, +35, 27, 22.0, 6.66 }, - { 5, 26, 54.29, +35, 27, 25.9, 6.15 }, - { 3, 32, 40.01, +35, 27, 42.1, 5.90 }, - { 14, 17, 59.81, +35, 30, 33.8, 4.81 }, - { 21, 42, 1.10, +35, 30, 37.1, 6.07 }, - { 8, 53, 55.70, +35, 32, 17.9, 6.14 }, - { 2, 47, 3.50, +35, 33, 18.0, 6.30 }, - { 22, 36, 7.90, +35, 34, 37.9, 6.10 }, - { 20, 43, 24.19, +35, 35, 16.1, 6.47 }, - { 1, 9, 43.90, +35, 37, 14.2, 2.06 }, - { 22, 36, 48.70, +35, 39, 9.0, 6.30 }, - { 15, 51, 13.90, +35, 39, 27.0, 4.82 }, - { 22, 29, 43.90, +35, 43, 32.2, 6.56 }, - { 6, 53, 3.41, +35, 47, 19.0, 6.01 }, - { 3, 58, 57.89, +35, 47, 28.0, 4.04 }, - { 13, 5, 44.50, +35, 47, 56.0, 5.25 }, - { 8, 58, 27.50, +35, 48, 9.0, 6.51 }, - { 9, 35, 39.60, +35, 48, 37.1, 5.41 }, - { 11, 12, 32.21, +35, 48, 49.0, 6.41 }, - { 21, 45, 44.50, +35, 51, 25.9, 6.40 }, - { 6, 41, 37.70, +35, 55, 54.8, 6.46 }, - { 17, 8, 1.99, +35, 56, 7.1, 5.39 }, - { 5, 6, .91, +35, 56, 11.0, 6.52 }, - { 12, 39, 16.90, +35, 57, 6.8, 6.45 }, - { 20, 6, 21.79, +35, 58, 21.0, 5.36 }, - { 2, 46, 58.30, +35, 59, 1.0, 6.25 }, - { 21, 1, 12.89, +36, 1, 34.0, 5.97 }, - { 12, 1, 39.50, +36, 2, 30.8, 5.59 }, - { 18, 19, 51.70, +36, 3, 51.8, 4.33 }, - { 19, 45, 39.60, +36, 5, 28.0, 6.43 }, - { 10, 59, 32.81, +36, 5, 35.2, 6.00 }, - { 19, 7, 18.10, +36, 6, 1.1, 5.28 }, - { 6, 44, 12.60, +36, 6, 34.9, 6.31 }, - { 2, 32, 6.19, +36, 8, 49.9, 5.15 }, - { 6, 15, 39.00, +36, 8, 55.0, 6.92 }, - { 4, 56, 19.90, +36, 10, 8.0, 6.07 }, - { 14, 28, 16.39, +36, 11, 48.8, 6.10 }, - { 19, 30, 46.90, +36, 13, 43.0, 6.25 }, - { 19, 56, 44.21, +36, 15, 2.9, 6.02 }, - { 17, 58, 42.29, +36, 17, 16.1, 6.00 }, - { 13, 37, 27.60, +36, 17, 42.0, 4.82 }, - { 21, 11, 3.89, +36, 17, 57.1, 6.54 }, - { 11, 9, 19.10, +36, 18, 33.8, 5.74 }, - { 19, 26, 9.10, +36, 19, 4.1, 5.15 }, - { 10, 36, 21.41, +36, 19, 36.8, 6.28 }, - { 22, 55, 44.50, +36, 21, 6.1, 5.74 }, - { 9, 34, 13.39, +36, 23, 51.0, 4.55 }, - { 18, 8, 2.21, +36, 24, 5.0, 5.48 }, - { 8, 34, 43.80, +36, 25, 9.8, 5.78 }, - { 16, 11, 48.00, +36, 25, 30.0, 5.63 }, - { 23, 49, 40.99, +36, 25, 31.1, 5.90 }, - { 19, 52, 16.30, +36, 25, 55.9, 6.10 }, - { 8, 33, 21.79, +36, 26, 11.0, 6.24 }, - { 19, 24, 6.10, +36, 27, 6.8, 6.36 }, - { 20, 29, 20.40, +36, 27, 16.9, 5.88 }, - { 15, 6, 35.11, +36, 27, 20.2, 6.35 }, - { 3, 44, 31.39, +36, 27, 36.0, 5.59 }, - { 18, 9, 58.99, +36, 27, 59.0, 5.58 }, - { 9, 33, 30.31, +36, 29, 12.8, 6.18 }, - { 20, 47, 24.50, +36, 29, 26.9, 4.53 }, - { 16, 8, 58.30, +36, 29, 26.9, 4.76 }, - { 18, 51, 36.50, +36, 32, 19.0, 6.09 }, - { 18, 43, 36.10, +36, 33, 24.1, 6.01 }, - { 21, 48, 8.30, +36, 34, 50.2, 6.47 }, - { 9, 24, 22.51, +36, 35, 12.8, 6.67 }, - { 20, 14, 4.99, +36, 36, 19.1, 6.45 }, - { 15, 31, 22.39, +36, 36, 59.0, 6.38 }, - { 14, 34, 38.50, +36, 37, 32.9, 6.03 }, - { 0, 8, 40.99, +36, 37, 36.1, 6.19 }, - { 16, 3, 19.39, +36, 37, 54.1, 5.83 }, - { 13, 49, 45.00, +36, 37, 58.1, 6.38 }, - { 21, 13, 26.30, +36, 38, 1.0, 6.05 }, - { 15, 39, 22.70, +36, 38, 8.9, 5.07 }, - { 15, 39, 22.20, +36, 38, 12.1, 6.00 }, - { 15, 58, 57.70, +36, 38, 38.0, 5.62 }, - { 21, 25, 46.99, +36, 40, 3.0, 5.94 }, - { 4, 52, 37.99, +36, 42, 11.2, 4.78 }, - { 10, 27, 52.99, +36, 42, 25.9, 4.21 }, - { 23, 40, 40.61, +36, 43, 14.9, 6.23 }, - { 11, 55, 14.09, +36, 45, 23.0, 6.49 }, - { 7, 22, 2.59, +36, 45, 38.2, 5.13 }, - { 0, 18, 19.70, +36, 47, 7.1, 4.52 }, - { 9, 18, 50.69, +36, 48, 9.0, 3.82 }, - { 15, 30, 27.91, +36, 48, 15.1, 6.37 }, - { 20, 14, 31.99, +36, 48, 23.0, 4.97 }, - { 17, 15, 2.81, +36, 48, 33.1, 3.16 }, - { 11, 33, 56.30, +36, 48, 56.2, 6.40 }, - { 20, 9, 25.61, +36, 50, 22.9, 4.93 }, - { 18, 54, 30.19, +36, 53, 56.0, 4.30 }, - { 0, 28, 56.59, +36, 54, .0, 6.26 }, - { 8, 44, 10.10, +36, 55, 5.2, 6.33 }, - { 20, 30, 59.21, +36, 56, 8.9, 6.19 }, - { 19, 35, 48.31, +36, 56, 39.8, 6.05 }, - { 17, 24, 27.10, +36, 57, 6.8, 6.28 }, - { 14, 33, 20.30, +36, 57, 33.8, 6.43 }, - { 18, 53, 43.61, +36, 58, 18.1, 5.58 }, - { 4, 1, 14.69, +36, 59, 24.0, 6.41 }, - { 19, 54, 48.31, +36, 59, 46.0, 5.76 }, - { 20, 18, 28.61, +37, 0, .0, 5.58 }, - { 13, 23, 54.00, +37, 2, 2.0, 6.07 }, - { 19, 59, 55.20, +37, 2, 34.1, 5.19 }, - { 20, 16, 28.20, +37, 3, 23.0, 6.48 }, - { 22, 55, 2.59, +37, 4, 36.8, 5.91 }, - { 20, 1, 15.31, +37, 5, 56.0, 6.20 }, - { 21, 27, 21.41, +37, 7, .1, 5.31 }, - { 1, 54, 57.50, +37, 7, 41.9, 6.26 }, - { 20, 19, 48.31, +37, 7, 57.0, 6.57 }, - { 17, 23, 40.99, +37, 8, 44.9, 4.52 }, - { 17, 23, 40.70, +37, 8, 48.1, 5.47 }, - { 6, 43, 13.80, +37, 8, 48.8, 6.19 }, - { 13, 34, 47.81, +37, 10, 57.0, 4.98 }, - { 5, 59, 43.30, +37, 12, 45.0, 2.62 }, - { 1, 34, 16.61, +37, 14, 13.9, 5.88 }, - { 17, 56, 15.19, +37, 15, 2.2, 3.86 }, - { 1, 56, 9.29, +37, 15, 6.1, 5.67 }, - { 8, 31, 19.90, +37, 15, 56.9, 6.18 }, - { 14, 50, 29.59, +37, 16, 18.8, 5.48 }, - { 1, 55, 54.41, +37, 16, 40.1, 5.89 }, - { 17, 17, 40.30, +37, 17, 30.1, 4.65 }, - { 17, 35, 42.41, +37, 18, 6.1, 6.10 }, - { 5, 10, 18.91, +37, 18, 6.8, 6.02 }, - { 5, 51, 2.40, +37, 18, 20.2, 4.74 }, - { 2, 35, 38.81, +37, 18, 43.9, 5.71 }, - { 2, 49, 27.10, +37, 19, 34.0, 6.45 }, - { 19, 19, 38.90, +37, 19, 50.2, 6.31 }, - { 15, 24, 30.91, +37, 20, 52.1, 6.50 }, - { 21, 23, 48.31, +37, 21, 5.0, 6.47 }, - { 19, 44, 16.61, +37, 21, 15.8, 4.89 }, - { 15, 24, 29.40, +37, 22, 37.9, 4.31 }, - { 5, 24, 39.19, +37, 23, 8.2, 4.99 }, - { 1, 18, 46.99, +37, 23, 10.0, 6.46 }, - { 16, 25, 24.19, +37, 23, 38.0, 5.54 }, - { 10, 11, 12.79, +37, 24, 6.8, 5.85 }, - { 21, 23, 22.99, +37, 24, 24.1, 6.58 }, - { 22, 48, 10.90, +37, 25, .1, 5.90 }, - { 0, 53, 28.20, +37, 25, 5.2, 6.06 }, - { 13, 9, 38.71, +37, 25, 23.2, 6.02 }, - { 22, 26, 45.70, +37, 26, 38.0, 6.46 }, - { 7, 8, 36.31, +37, 26, 42.0, 6.16 }, - { 19, 19, 1.20, +37, 26, 43.1, 6.22 }, - { 20, 23, 44.40, +37, 28, 35.0, 5.90 }, - { 4, 49, 54.60, +37, 29, 17.9, 4.88 }, - { 12, 50, 10.70, +37, 31, .8, 5.89 }, - { 7, 46, 39.29, +37, 31, 3.0, 5.18 }, - { 3, 41, 7.90, +37, 34, 48.0, 5.57 }, - { 22, 39, 34.30, +37, 35, 34.1, 6.03 }, - { 18, 44, 48.19, +37, 35, 39.8, 5.73 }, - { 9, 0, 30.79, +37, 36, 15.8, 6.44 }, - { 18, 44, 46.39, +37, 36, 18.0, 4.36 }, - { 23, 40, 2.81, +37, 39, 9.0, 6.53 }, - { 0, 12, 50.40, +37, 41, 35.9, 6.73 }, - { 1, 23, 40.61, +37, 42, 54.0, 5.58 }, - { 11, 52, 58.80, +37, 43, 7.0, 6.45 }, - { 1, 11, 10.30, +37, 43, 27.1, 5.81 }, - { 2, 38, 17.81, +37, 43, 36.1, 6.18 }, - { 4, 8, 15.31, +37, 43, 40.1, 6.09 }, - { 22, 15, 58.20, +37, 44, 56.0, 4.13 }, - { 22, 18, 56.21, +37, 46, 9.8, 6.17 }, - { 22, 42, 55.51, +37, 48, 10.1, 6.43 }, - { 14, 49, 6.70, +37, 48, 40.0, 6.16 }, - { 19, 50, 46.99, +37, 49, 35.0, 6.06 }, - { 2, 8, 29.30, +37, 51, 33.1, 4.82 }, - { 4, 59, 15.41, +37, 53, 25.1, 4.94 }, - { 10, 39, 7.61, +37, 54, 36.0, 5.85 }, - { 19, 27, 36.50, +37, 56, 28.0, 6.34 }, - { 15, 55, 47.59, +37, 56, 48.8, 5.45 }, - { 1, 48, 38.90, +37, 57, 10.1, 5.94 }, - { 6, 5, 2.59, +37, 57, 51.1, 6.34 }, - { 4, 13, 59.59, +37, 58, .8, 6.45 }, - { 0, 21, 7.30, +37, 58, 7.0, 5.18 }, - { 8, 32, 55.01, +38, 0, 59.0, 5.90 }, - { 23, 34, 46.70, +38, 1, 26.0, 6.18 }, - { 20, 17, 47.21, +38, 1, 59.2, 4.81 }, - { 4, 8, 36.60, +38, 2, 22.9, 5.51 }, - { 21, 14, 47.50, +38, 2, 44.2, 3.72 }, - { 6, 59, 2.81, +38, 3, 7.9, 6.00 }, - { 2, 38, 27.79, +38, 5, 21.8, 6.30 }, - { 19, 58, 34.39, +38, 6, 20.2, 6.32 }, - { 3, 0, 11.81, +38, 7, 54.1, 6.11 }, - { 19, 16, 22.10, +38, 8, 1.0, 4.36 }, - { 23, 20, 53.30, +38, 10, 55.9, 5.77 }, - { 11, 19, 7.90, +38, 11, 8.2, 4.78 }, - { 9, 20, 59.30, +38, 11, 17.9, 6.12 }, - { 21, 19, 22.20, +38, 14, 15.0, 5.83 }, - { 11, 4, 31.20, +38, 14, 29.0, 6.00 }, - { 15, 13, 35.59, +38, 15, 52.9, 6.20 }, - { 18, 58, 1.90, +38, 15, 58.0, 5.89 }, - { 4, 41, 50.30, +38, 16, 49.1, 5.99 }, - { 21, 43, 25.70, +38, 17, 2.0, 5.65 }, - { 14, 32, 4.70, +38, 18, 29.9, 3.03 }, - { 12, 56, .41, +38, 18, 52.9, 5.60 }, - { 12, 56, 1.70, +38, 19, 5.9, 2.90 }, - { 2, 50, 35.11, +38, 19, 7.0, 4.23 }, - { 20, 37, 23.59, +38, 19, 43.0, 6.20 }, - { 2, 53, 42.60, +38, 20, 15.0, 5.33 }, - { 7, 40, 14.59, +38, 20, 39.8, 5.73 }, - { 18, 40, 12.19, +38, 22, 1.9, 6.45 }, - { 15, 35, 49.30, +38, 22, 26.0, 6.42 }, - { 19, 36, 56.59, +38, 23, 2.0, 6.50 }, - { 14, 25, 29.21, +38, 23, 35.2, 6.27 }, - { 19, 47, 27.79, +38, 24, 27.0, 5.77 }, - { 6, 53, 13.39, +38, 26, 17.2, 6.30 }, - { 20, 27, 34.30, +38, 26, 25.1, 5.62 }, - { 6, 36, 32.90, +38, 26, 43.1, 5.29 }, - { 9, 6, 31.80, +38, 27, 7.9, 4.56 }, - { 18, 9, 37.49, +38, 27, 27.0, 6.40 }, - { 20, 5, 9.79, +38, 28, 41.9, 6.19 }, - { 6, 6, 35.09, +38, 28, 58.1, 5.36 }, - { 5, 13, 25.70, +38, 29, 3.8, 4.86 }, - { 19, 55, 51.70, +38, 29, 12.1, 4.94 }, - { 13, 10, 3.19, +38, 29, 56.0, 5.91 }, - { 0, 56, 45.19, +38, 29, 57.8, 3.87 }, - { 13, 46, 19.01, +38, 30, 14.0, 5.94 }, - { 6, 53, 57.00, +38, 30, 18.0, 6.48 }, - { 13, 9, 42.00, +38, 32, 2.0, 6.28 }, - { 21, 34, 46.61, +38, 32, 3.1, 4.90 }, - { 13, 46, 59.81, +38, 32, 34.1, 5.50 }, - { 0, 52, 53.40, +38, 32, 55.0, 6.69 }, - { 22, 23, 54.19, +38, 34, 25.0, 6.22 }, - { 0, 24, 1.99, +38, 34, 37.9, 7.39 }, - { 17, 24, 2.21, +38, 34, 58.1, 6.49 }, - { 2, 58, 2.30, +38, 36, 54.0, 6.04 }, - { 21, 22, 46.90, +38, 38, 3.1, 6.63 }, - { 21, 48, 29.40, +38, 38, 55.0, 6.12 }, - { 21, 3, 4.80, +38, 39, 27.0, 6.07 }, - { 23, 30, 39.70, +38, 39, 42.8, 6.05 }, - { 0, 17, 5.50, +38, 40, 54.1, 4.61 }, - { 23, 0, 54.70, +38, 42, 29.2, 6.54 }, - { 19, 49, 27.50, +38, 42, 36.0, 6.11 }, - { 19, 50, 34.01, +38, 43, 21.0, 5.12 }, - { 8, 11, 21.60, +38, 43, 53.0, 6.58 }, - { 2, 36, 57.19, +38, 43, 58.1, 5.90 }, - { 18, 23, 57.41, +38, 44, 21.1, 6.36 }, - { 21, 6, 55.30, +38, 44, 35.9, 6.03 }, - { 21, 6, 54.60, +38, 44, 44.9, 5.21 }, - { 19, 33, 36.41, +38, 45, 43.9, 6.61 }, - { 14, 18, 55.70, +38, 46, 3.0, 6.86 }, - { 18, 13, 4.80, +38, 46, 25.0, 6.04 }, - { 18, 36, 56.30, +38, 47, 1.0, 0.03 }, - { 13, 34, 21.79, +38, 47, 21.1, 6.37 }, - { 14, 19, 47.69, +38, 47, 38.0, 6.33 }, - { 17, 18, 23.30, +38, 48, 41.0, 5.94 }, - { 3, 59, 40.01, +38, 49, 14.2, 6.38 }, - { 3, 58, 29.11, +38, 50, 25.1, 6.30 }, - { 3, 5, 10.61, +38, 50, 25.1, 3.39 }, - { 6, 53, 1.49, +38, 52, 9.1, 6.12 }, - { 17, 45, 53.71, +38, 52, 53.0, 6.52 }, - { 17, 30, 40.30, +38, 52, 55.9, 6.43 }, - { 7, 31, 55.70, +38, 53, 47.0, 6.54 }, - { 20, 16, 3.41, +38, 53, 52.1, 6.27 }, - { 16, 42, 53.81, +38, 55, 19.9, 3.53 }, - { 10, 30, 6.41, +38, 55, 31.1, 5.77 }, - { 7, 22, 13.39, +38, 59, 46.0, 6.40 }, - { 15, 35, 15.00, +39, 0, 36.0, 5.11 }, - { 12, 25, 50.90, +39, 1, 7.0, 5.02 }, - { 2, 10, 52.80, +39, 2, 21.8, 5.63 }, - { 2, 10, 53.71, +39, 2, 35.2, 6.10 }, - { 22, 39, 15.70, +39, 3, 1.1, 4.88 }, - { 20, 41, .41, +39, 4, 55.9, 6.51 }, - { 19, 13, 45.50, +39, 8, 46.0, 4.39 }, - { 5, 51, 29.40, +39, 8, 55.0, 3.97 }, - { 5, 49, 10.49, +39, 10, 52.0, 4.52 }, - { 11, 0, 50.40, +39, 12, 43.9, 5.08 }, - { 18, 59, 12.29, +39, 13, 4.1, 6.41 }, - { 23, 31, 17.40, +39, 14, 11.0, 5.22 }, - { 14, 59, 36.89, +39, 15, 55.1, 5.64 }, - { 12, 44, 59.50, +39, 16, 44.0, 5.95 }, - { 3, 17, 45.79, +39, 16, 59.9, 5.96 }, - { 18, 43, 16.70, +39, 18, 1.1, 6.45 }, - { 22, 57, 40.70, +39, 18, 32.0, 6.18 }, - { 7, 11, 39.29, +39, 19, 14.2, 4.90 }, - { 17, 45, 58.49, +39, 19, 21.0, 6.68 }, - { 11, 29, 4.20, +39, 20, 12.8, 5.31 }, - { 6, 38, 39.50, +39, 23, 26.9, 5.69 }, - { 5, 0, 18.29, +39, 23, 40.9, 5.95 }, - { 21, 17, 25.01, +39, 23, 40.9, 4.23 }, - { 20, 20, 15.19, +39, 24, 11.9, 6.23 }, - { 0, 41, 7.20, +39, 27, 31.0, 5.33 }, - { 22, 44, 5.21, +39, 27, 56.2, 5.95 }, - { 18, 24, 13.80, +39, 30, 25.9, 5.12 }, - { 21, 51, 4.90, +39, 32, 12.1, 6.17 }, - { 13, 48, 57.19, +39, 32, 34.1, 7.40 }, - { 5, 52, 39.50, +39, 34, 27.8, 6.45 }, - { 15, 22, 37.39, +39, 34, 53.0, 5.50 }, - { 3, 11, 17.40, +39, 36, 42.1, 4.63 }, - { 18, 44, 22.90, +39, 36, 46.1, 5.37 }, - { 18, 44, 22.90, +39, 36, 47.2, 5.14 }, - { 9, 35, 3.79, +39, 37, 17.0, 4.81 }, - { 22, 35, 52.30, +39, 38, 3.1, 5.73 }, - { 5, 0, 23.21, +39, 39, 18.0, 6.58 }, - { 2, 58, 45.70, +39, 39, 46.1, 4.70 }, - { 2, 35, 27.89, +39, 39, 51.8, 6.36 }, - { 18, 38, 6.50, +39, 40, 5.2, 6.04 }, - { 18, 44, 20.40, +39, 40, 12.0, 5.06 }, - { 18, 44, 20.30, +39, 40, 16.0, 6.02 }, - { 15, 57, 29.90, +39, 41, 43.1, 6.31 }, - { 16, 19, 55.10, +39, 42, 31.0, 5.46 }, - { 9, 1, 40.61, +39, 42, 47.9, 6.36 }, - { 22, 13, 52.70, +39, 42, 54.0, 4.49 }, - { 14, 16, 24.19, +39, 44, 40.9, 6.38 }, - { 9, 42, .31, +39, 45, 28.1, 5.62 }, - { 22, 32, 26.40, +39, 46, 46.9, 5.88 }, - { 22, 27, 26.50, +39, 48, 34.9, 6.14 }, - { 5, 30, 45.10, +39, 49, 32.9, 6.37 }, - { 2, 19, 37.30, +39, 50, 6.0, 6.63 }, - { 2, 37, 20.81, +39, 53, 44.9, 6.54 }, - { 3, 33, 35.11, +39, 53, 57.8, 5.81 }, - { 6, 38, 49.20, +39, 54, 9.0, 5.20 }, - { 9, 35, 22.39, +39, 57, 47.9, 6.76 }, - { 17, 21, 43.61, +39, 58, 27.8, 5.51 }, - { 17, 52, 4.70, +39, 58, 55.9, 6.04 }, - { 1, 4, 36.41, +39, 59, 28.0, 6.72 }, - { 17, 53, 18.10, +40, 0, 29.2, 5.16 }, - { 4, 31, 24.00, +40, 0, 37.1, 6.26 }, - { 3, 57, 51.19, +40, 0, 37.1, 2.89 }, - { 7, 37, 17.81, +40, 1, 31.1, 6.38 }, - { 17, 51, 13.99, +40, 4, 21.0, 6.46 }, - { 18, 4, 43.20, +40, 5, 3.1, 6.52 }, - { 5, 19, 8.50, +40, 5, 57.1, 4.71 }, - { 13, 20, 19.01, +40, 9, 2.2, 5.60 }, - { 13, 13, 43.01, +40, 9, 10.1, 4.92 }, - { 22, 53, 11.30, +40, 10, 1.9, 6.34 }, - { 5, 36, 52.39, +40, 10, 55.9, 6.09 }, - { 2, 42, 14.90, +40, 11, 38.0, 4.91 }, - { 8, 56, 30.50, +40, 12, 6.1, 5.89 }, - { 22, 41, 28.61, +40, 13, 32.2, 5.25 }, - { 23, 34, 37.49, +40, 14, 11.0, 5.59 }, - { 9, 38, 21.70, +40, 14, 22.9, 5.25 }, - { 19, 41, 57.50, +40, 15, 14.0, 6.23 }, - { 20, 22, 13.70, +40, 15, 24.1, 2.20 }, - { 4, 46, 44.40, +40, 18, 46.1, 5.97 }, - { 1, 27, 46.99, +40, 20, 8.2, 6.60 }, - { 11, 57, 14.59, +40, 20, 37.0, 6.62 }, - { 21, 21, 1.39, +40, 20, 44.2, 6.40 }, - { 15, 37, 49.61, +40, 21, 11.9, 5.24 }, - { 20, 16, 55.30, +40, 21, 54.0, 5.24 }, - { 19, 57, 13.90, +40, 22, 5.2, 5.45 }, - { 22, 54, 7.01, +40, 22, 36.8, 5.81 }, - { 15, 1, 56.81, +40, 23, 26.2, 3.50 }, - { 21, 36, 57.00, +40, 24, 49.0, 5.01 }, - { 10, 33, 13.90, +40, 25, 32.2, 4.75 }, - { 19, 11, 23.11, +40, 25, 45.1, 6.18 }, - { 10, 59, 28.01, +40, 25, 49.1, 5.05 }, - { 14, 43, 44.40, +40, 27, 33.1, 5.73 }, - { 5, 18, 40.39, +40, 27, 54.0, 6.18 }, - { 3, 17, 11.40, +40, 28, 59.9, 6.45 }, - { 4, 14, 53.30, +40, 29, 1.0, 4.71 }, - { 5, 45, 49.51, +40, 30, 25.9, 6.58 }, - { 17, 7, 46.70, +40, 30, 58.0, 6.34 }, - { 13, 17, 32.50, +40, 34, 21.0, 4.73 }, - { 1, 40, 34.80, +40, 34, 36.8, 4.94 }, - { 20, 39, 33.31, +40, 34, 45.8, 6.06 }, - { 3, 5, 20.81, +40, 34, 57.0, 6.05 }, - { 19, 50, 37.30, +40, 35, 58.9, 5.69 }, - { 12, 16, 7.61, +40, 39, 37.1, 5.66 }, - { 10, 10, 58.90, +40, 39, 41.0, 6.32 }, - { 7, 24, 8.50, +40, 40, 19.9, 5.19 }, - { 18, 58, 46.61, +40, 40, 45.1, 6.22 }, - { 19, 0, 19.01, +40, 41, 3.1, 6.65 }, - { 1, 54, 53.81, +40, 42, 6.8, 6.24 }, - { 20, 54, 22.30, +40, 42, 11.2, 6.70 }, - { 19, 44, 49.01, +40, 43, .1, 6.34 }, - { 13, 28, 26.21, +40, 43, 46.9, 6.47 }, - { 0, 19, 41.59, +40, 43, 46.9, 6.33 }, - { 1, 53, 17.30, +40, 43, 46.9, 5.40 }, - { 20, 18, 7.01, +40, 43, 55.9, 5.84 }, - { 17, 9, 33.31, +40, 46, 37.9, 5.08 }, - { 4, 44, 12.89, +40, 47, 12.8, 6.08 }, - { 21, 41, 34.30, +40, 48, 19.1, 6.11 }, - { 15, 30, 55.80, +40, 49, 59.2, 5.02 }, - { 13, 15, 31.99, +40, 51, 19.1, 5.79 }, - { 12, 38, 46.30, +40, 52, 27.8, 6.37 }, - { 7, 18, 2.21, +40, 52, 59.9, 5.78 }, - { 15, 31, 46.99, +40, 53, 57.8, 5.02 }, - { 18, 39, 33.10, +40, 56, 6.0, 6.25 }, - { 18, 17, 6.79, +40, 56, 12.1, 6.11 }, - { 3, 8, 10.10, +40, 57, 20.2, 2.12 }, - { 14, 27, 27.31, +41, 1, 30.0, 6.63 }, - { 20, 22, 45.31, +41, 1, 34.0, 5.93 }, - { 5, 22, 50.30, +41, 1, 45.8, 5.54 }, - { 2, 59, 39.89, +41, 1, 59.2, 5.89 }, - { 0, 13, 30.79, +41, 2, 7.1, 5.72 }, - { 21, 18, 55.30, +41, 2, 26.9, 6.15 }, - { 6, 8, 22.99, +41, 3, 20.2, 6.36 }, - { 9, 57, 41.09, +41, 3, 20.2, 5.14 }, - { 6, 49, 19.01, +41, 3, 33.0, }, - { 5, 2, 28.70, +41, 4, 32.9, 3.75 }, - { 1, 35, 52.51, +41, 4, 35.0, 6.38 }, - { 21, 42, 22.90, +41, 4, 37.9, 5.69 }, - { 0, 49, 48.79, +41, 4, 44.0, 4.53 }, - { 5, 20, 14.81, +41, 5, 10.0, 5.52 }, - { 13, 46, 13.49, +41, 5, 19.0, 5.87 }, - { 11, 13, 40.20, +41, 5, 19.0, 6.33 }, - { 1, 27, 26.59, +41, 6, 2.2, 6.46 }, - { 23, 24, 34.99, +41, 6, 46.1, 6.72 }, - { 20, 22, 3.00, +41, 7, 53.0, 6.39 }, - { 18, 12, 42.60, +41, 8, 48.8, 6.36 }, - { 21, 49, 40.10, +41, 8, 56.0, 6.48 }, - { 21, 43, 6.41, +41, 9, 18.0, 5.49 }, - { 20, 57, 10.39, +41, 10, 1.9, 3.94 }, - { 18, 54, 14.30, +41, 13, 32.2, 7.30 }, - { 10, 22, 10.49, +41, 13, 45.8, 5.76 }, - { 5, 6, 30.91, +41, 14, 3.8, 3.17 }, - { 17, 33, 7.30, +41, 14, 37.0, 5.74 }, - { 3, 25, 9.41, +41, 15, 25.9, 6.51 }, - { 0, 42, 41.70, +41, 15, 50.0, }, - { 4, 36, 41.40, +41, 15, 52.9, 4.25 }, - { 1, 2, 54.29, +41, 20, 42.0, 5.98 }, - { 12, 33, 44.50, +41, 21, 27.0, 4.26 }, - { 18, 52, 7.10, +41, 22, 59.9, 6.28 }, - { 2, 22, 50.30, +41, 23, 47.0, 5.82 }, - { 1, 36, 47.81, +41, 24, 20.2, 4.09 }, - { 19, 6, 16.99, +41, 24, 50.0, 6.49 }, - { 18, 46, 13.01, +41, 26, 30.1, 6.07 }, - { 5, 3, 18.60, +41, 26, 30.1, 6.14 }, - { 5, 30, 48.60, +41, 27, 42.8, 6.00 }, - { 10, 22, 19.70, +41, 29, 57.8, 3.05 }, - { 14, 14, 23.50, +41, 31, 8.0, 6.24 }, - { 22, 41, 36.10, +41, 32, 57.8, 5.94 }, - { 10, 27, 28.01, +41, 36, 2.9, 6.02 }, - { 18, 54, 52.20, +41, 36, 10.1, 5.44 }, - { 22, 56, 23.59, +41, 36, 14.0, 5.59 }, - { 21, 3, 52.10, +41, 37, 41.2, 6.33 }, - { 13, 42, 28.80, +41, 40, 27.1, 6.30 }, - { 1, 57, 56.40, +41, 41, 39.8, 6.78 }, - { 20, 41, 56.50, +41, 43, .8, 5.67 }, - { 20, 33, 48.41, +41, 46, 19.9, 6.49 }, - { 19, 43, 45.00, +41, 46, 23.2, 5.84 }, - { 23, 18, 23.40, +41, 46, 25.0, 6.02 }, - { 6, 50, 45.91, +41, 46, 53.0, 5.02 }, - { 9, 0, 38.40, +41, 46, 58.1, 3.97 }, - { 14, 29, 36.79, +41, 47, 44.9, 6.35 }, - { 5, 21, 48.41, +41, 48, 15.8, 5.23 }, - { 4, 20, 14.40, +41, 48, 29.2, 5.92 }, - { 22, 44, 5.50, +41, 49, 9.1, 5.08 }, - { 6, 7, 26.90, +41, 51, 15.1, 6.12 }, - { 16, 28, 38.50, +41, 52, 54.1, 5.04 }, - { 16, 50, 36.10, +41, 53, 48.1, 6.29 }, - { 20, 58, 30.79, +41, 56, 25.1, 6.16 }, - { 18, 5, .79, +41, 56, 48.1, 6.34 }, - { 22, 50, 21.79, +41, 57, 13.0, 5.92 }, - { 8, 52, 10.01, +42, 0, 9.0, 5.99 }, - { 8, 24, 42.79, +42, 0, 18.0, 6.02 }, - { 10, 56, 14.50, +42, 0, 29.9, 6.03 }, - { 23, 19, 52.39, +42, 4, 41.2, 5.79 }, - { 22, 21, 50.90, +42, 4, 41.9, 6.41 }, - { 1, 10, 18.79, +42, 4, 53.0, 5.65 }, - { 0, 4, 36.70, +42, 5, 31.9, 6.01 }, - { 20, 14, 21.60, +42, 6, 13.0, 6.71 }, - { 13, 31, 15.79, +42, 6, 22.0, 6.08 }, - { 5, 33, 28.70, +42, 6, 32.0, 6.55 }, - { 4, 18, 8.21, +42, 8, 28.0, 6.22 }, - { 18, 15, 38.81, +42, 9, 33.8, 5.59 }, - { 15, 14, 10.30, +42, 10, 17.0, 6.13 }, - { 16, 47, 19.80, +42, 14, 20.0, 5.87 }, - { 21, 16, 29.59, +42, 15, 5.0, 6.43 }, - { 19, 57, 56.21, +42, 15, 38.9, 6.43 }, - { 23, 1, 55.30, +42, 19, 34.0, 3.62 }, - { 2, 3, 54.00, +42, 19, 46.9, 2.26 }, - { 2, 3, 54.70, +42, 19, 50.9, 4.84 }, - { 0, 1, 43.80, +42, 22, 1.9, 6.25 }, - { 16, 11, 47.59, +42, 22, 27.8, 5.87 }, - { 3, 12, 9.60, +42, 22, 34.0, 6.15 }, - { 20, 53, 26.40, +42, 24, 37.1, 6.66 }, - { 19, 34, 41.21, +42, 24, 46.1, 5.35 }, - { 4, 23, 35.90, +42, 25, 41.2, 6.23 }, - { 8, 9, 23.11, +42, 25, 50.2, 6.27 }, - { 16, 34, 6.19, +42, 26, 12.8, 4.20 }, - { 15, 52, 40.49, +42, 27, 6.1, 4.62 }, - { 6, 39, 19.90, +42, 29, 20.0, 4.79 }, - { 3, 14, 56.71, +42, 30, 14.0, 6.07 }, - { 16, 57, 50.21, +42, 30, 45.0, 6.34 }, - { 5, 47, 14.69, +42, 31, 36.1, 6.29 }, - { 12, 23, 46.99, +42, 32, 34.1, 6.06 }, - { 15, 55, 30.60, +42, 33, 58.0, 5.75 }, - { 3, 45, 11.59, +42, 34, 43.0, 3.77 }, - { 3, 38, .19, +42, 34, 59.2, 6.42 }, - { 4, 52, 47.81, +42, 35, 12.1, 5.71 }, - { 1, 41, 47.21, +42, 36, 49.0, 4.95 }, - { 7, 21, 3.10, +42, 39, 20.2, 6.35 }, - { 23, 57, 3.60, +42, 39, 29.9, 5.97 }, - { 21, 17, 23.21, +42, 40, 59.9, 6.19 }, - { 20, 17, 29.09, +42, 43, 18.8, 6.29 }, - { 23, 2, 36.29, +42, 45, 28.1, 5.10 }, - { 5, 18, 15.91, +42, 47, 31.9, 5.48 }, - { 19, 39, 26.50, +42, 49, 5.9, 5.40 }, - { 21, 41, 43.80, +42, 50, 28.0, }, - { 11, 0, 20.59, +42, 54, 41.0, 6.02 }, - { 6, 3, 18.00, +42, 54, 42.1, 6.10 }, - { 23, 27, 7.39, +42, 54, 42.8, 5.75 }, - { 10, 17, 5.81, +42, 54, 51.8, 3.45 }, - { 22, 14, 44.40, +42, 57, 14.0, 5.71 }, - { 6, 5, 3.41, +42, 58, 54.1, 5.87 }, - { 20, 22, 55.51, +42, 58, 59.9, 6.20 }, - { 7, 35, 55.99, +43, 1, 52.0, 6.30 }, - { 12, 2, 6.79, +43, 2, 44.2, 5.21 }, - { 21, 46, 16.61, +43, 3, 38.9, 6.54 }, - { 4, 33, 24.91, +43, 3, 50.0, 6.09 }, - { 19, 40, 41.21, +43, 4, 40.1, 6.16 }, - { 22, 30, 29.30, +43, 7, 23.9, 4.51 }, - { 15, 54, 37.90, +43, 8, 19.0, 5.37 }, - { 11, 30, 31.10, +43, 10, 23.9, 5.94 }, - { 5, 6, 49.61, +43, 10, 28.9, 6.20 }, - { 8, 22, 50.09, +43, 11, 17.2, 4.25 }, - { 10, 53, 58.70, +43, 11, 24.0, 4.71 }, - { 20, 32, 52.30, +43, 11, 30.1, 6.60 }, - { 11, 9, 38.50, +43, 12, 27.0, 5.89 }, - { 16, 45, 11.71, +43, 13, 1.9, 6.05 }, - { 9, 13, 48.19, +43, 13, 4.1, 5.32 }, - { 18, 36, 45.60, +43, 13, 18.8, 6.20 }, - { 8, 7, 9.91, +43, 15, 37.1, 6.26 }, - { 23, 38, 8.21, +43, 16, 5.2, 4.29 }, - { 21, 40, 11.11, +43, 16, 26.0, 5.11 }, - { 1, 40, 39.79, +43, 17, 52.1, 5.61 }, - { 22, 52, 1.99, +43, 18, 45.0, 4.94 }, - { 3, 21, 26.50, +43, 19, 45.8, 4.95 }, - { 4, 42, 54.29, +43, 21, 54.0, 5.29 }, - { 6, 2, 53.59, +43, 22, 43.0, 6.42 }, - { 20, 13, 42.79, +43, 22, 45.1, 6.14 }, - { 19, 23, 56.50, +43, 23, 17.2, 5.84 }, - { 16, 49, 40.49, +43, 25, 50.2, 6.13 }, - { 1, 26, 18.60, +43, 27, 28.1, 5.96 }, - { 20, 40, 3.10, +43, 27, 31.0, 5.95 }, - { 18, 7, 28.80, +43, 27, 42.1, 5.00 }, - { 17, 40, 37.61, +43, 28, 14.9, 6.59 }, - { 11, 22, 49.61, +43, 28, 58.1, 4.99 }, - { 0, 32, 26.81, +43, 29, 40.9, 6.70 }, - { 23, 10, 27.19, +43, 32, 39.1, 5.94 }, - { 6, 46, 44.30, +43, 34, 39.0, 5.25 }, - { 0, 16, 21.60, +43, 35, 40.9, 6.15 }, - { 11, 38, 20.59, +43, 37, 32.2, 5.59 }, - { 14, 38, 12.50, +43, 38, 30.8, 5.70 }, - { 8, 51, 56.81, +43, 43, 36.1, 5.15 }, - { 0, 18, 42.10, +43, 47, 28.0, 6.11 }, - { 17, 5, 4.99, +43, 48, 43.9, 6.43 }, - { 5, 1, 58.10, +43, 49, 23.9, 2.99 }, - { 14, 7, 55.80, +43, 51, 15.8, 5.27 }, - { 13, 22, 3.79, +43, 54, 11.2, 6.35 }, - { 3, 31, 11.80, +43, 54, 17.0, }, - { 6, 55, 14.69, +43, 54, 36.0, 6.13 }, - { 21, 4, 55.90, +43, 55, 40.1, 3.72 }, - { 1, 8, .89, +43, 56, 30.8, 5.03 }, - { 21, 18, 27.19, +43, 56, 44.9, 5.00 }, - { 18, 55, 20.09, +43, 56, 46.0, 4.04 }, - { 3, 49, 8.21, +43, 57, 47.2, 6.02 }, - { 7, 58, 16.61, +43, 58, 39.0, 6.34 }, - { 6, 39, 58.01, +44, 0, 50.0, 6.41 }, - { 3, 17, 47.40, +44, 1, 30.0, 5.47 }, - { 23, 2, 45.19, +44, 3, 32.0, 6.39 }, - { 20, 50, 4.90, +44, 3, 33.8, 5.04 }, - { 4, 54, 51.31, +44, 3, 38.9, 6.08 }, - { 17, 43, 5.59, +44, 5, 3.8, 6.34 }, - { 12, 44, 27.10, +44, 6, 11.2, 6.33 }, - { 23, 20, 43.99, +44, 6, 59.0, 6.13 }, - { 13, 35, 14.09, +44, 11, 48.8, 6.84 }, - { 2, 13, 13.30, +44, 13, 54.1, 4.83 }, - { 22, 40, 30.91, +44, 16, 35.0, 4.46 }, - { 2, 44, 5.21, +44, 17, 48.8, 5.43 }, - { 2, 17, 33.41, +44, 18, 24.8, 6.70 }, - { 23, 40, 24.50, +44, 20, 2.0, 4.14 }, - { 1, 39, 21.00, +44, 23, 10.0, 4.98 }, - { 20, 53, 14.81, +44, 23, 13.9, 4.78 }, - { 0, 28, 13.70, +44, 23, 39.8, 5.17 }, - { 14, 38, 50.21, +44, 24, 15.8, 5.39 }, - { 5, 20, 2.30, +44, 25, 32.2, 6.62 }, - { 23, 37, 31.99, +44, 25, 45.1, 5.80 }, - { 15, 20, 41.59, +44, 26, 3.1, 6.19 }, - { 2, 8, 33.60, +44, 27, 33.8, 6.42 }, - { 20, 58, 19.49, +44, 28, 18.1, 5.55 }, - { 0, 36, 46.61, +44, 29, 19.0, 5.13 }, - { 11, 9, 39.79, +44, 29, 55.0, 3.01 }, - { 6, 43, 4.99, +44, 31, 27.8, 5.02 }, - { 22, 46, 10.20, +44, 32, 46.0, 5.76 }, - { 23, 8, 12.29, +44, 33, 42.1, 6.56 }, - { 6, 0, 19.01, +44, 35, 30.8, 6.22 }, - { 15, 3, 6.60, +44, 38, 39.8, 6.65 }, - { 22, 2, 56.69, +44, 39, .0, 5.60 }, - { 19, 36, 37.90, +44, 41, 42.0, 5.17 }, - { 21, 37, 27.89, +44, 41, 48.1, 6.20 }, - { 1, 0, 3.41, +44, 42, 40.0, 6.84 }, - { 1, 0, 3.60, +44, 42, 47.9, 6.04 }, - { 22, 53, 40.10, +44, 44, 57.1, 5.81 }, - { 21, 2, 24.10, +44, 47, 28.0, 6.19 }, - { 6, 53, 7.61, +44, 50, 21.8, 6.26 }, - { 3, 32, 39.10, +44, 51, 20.2, 6.41 }, - { 3, 9, 29.81, +44, 51, 25.9, 3.80 }, - { 0, 46, 10.90, +44, 51, 41.0, 6.05 }, - { 1, 17, 5.09, +44, 54, 6.8, 6.34 }, - { 20, 56, 34.70, +44, 55, 30.0, 5.96 }, - { 16, 8, 46.20, +44, 56, 6.0, 4.26 }, - { 5, 59, 31.70, +44, 56, 51.0, 1.90 }, - { 3, 50, 4.49, +44, 58, 4.1, 5.66 }, - { 23, 42, 14.81, +44, 59, 30.8, 6.57 }, - { 0, 50, 18.31, +45, 0, 7.9, 6.15 }, - { 22, 6, 1.99, +45, 0, 51.8, 5.14 }, - { 23, 33, 42.70, +45, 3, 29.2, 6.24 }, - { 6, 57, 37.10, +45, 5, 39.1, 4.90 }, - { 11, 38, 44.90, +45, 6, 31.0, 6.44 }, - { 22, 5, 50.59, +45, 6, 43.9, 6.44 }, - { 19, 44, 58.49, +45, 7, 50.9, 2.87 }, - { 23, 19, 2.40, +45, 8, 13.9, 6.50 }, - { 23, 17, 16.61, +45, 9, 51.1, 6.43 }, - { 20, 53, 18.60, +45, 10, 54.8, 5.45 }, - { 22, 38, 17.50, +45, 10, 59.2, 6.40 }, - { 18, 15, 32.59, +45, 12, 33.8, 6.29 }, - { 10, 28, 36.50, +45, 12, 43.9, 6.35 }, - { 7, 21, 17.50, +45, 13, 41.2, 5.77 }, - { 0, 5, 9.89, +45, 13, 45.1, 6.70 }, - { 22, 6, 12.41, +45, 14, 55.0, 6.19 }, - { 0, 0, 43.70, +45, 15, 11.9, 6.38 }, - { 13, 5, 52.30, +45, 16, 7.0, 5.63 }, - { 15, 24, 5.11, +45, 16, 16.0, 6.01 }, - { 20, 41, 25.90, +45, 16, 49.1, 1.25 }, - { 8, 52, 11.59, +45, 18, 45.0, 5.99 }, - { 1, 43, 16.51, +45, 19, 19.9, 6.34 }, - { 1, 12, 34.01, +45, 20, 16.1, 6.11 }, - { 3, 16, 4.70, +45, 20, 44.9, 6.16 }, - { 17, 56, 48.41, +45, 21, 2.9, 6.02 }, - { 21, 36, 2.40, +45, 22, 28.9, 5.53 }, - { 23, 0, 34.39, +45, 22, 30.0, 6.50 }, - { 1, 38, 31.70, +45, 24, .0, 6.36 }, - { 1, 27, 39.41, +45, 24, 24.1, 4.83 }, - { 9, 57, 56.90, +45, 24, 51.8, 6.30 }, - { 12, 45, 7.80, +45, 26, 25.1, 4.99 }, - { 22, 13, 49.30, +45, 26, 26.9, 5.53 }, - { 17, 58, 52.30, +45, 28, 34.0, 6.48 }, - { 23, 17, 56.11, +45, 29, 20.0, 6.48 }, - { 17, 59, 56.21, +45, 30, 5.0, 5.67 }, - { 21, 9, 58.61, +45, 30, 9.0, 6.63 }, - { 19, 40, 50.21, +45, 31, 30.0, 5.06 }, - { 11, 0, 14.69, +45, 31, 34.0, 5.47 }, - { 1, 22, 20.40, +45, 31, 44.0, 4.88 }, - { 20, 16, .60, +45, 34, 45.8, 5.91 }, - { 20, 47, 20.81, +45, 34, 46.9, 6.40 }, - { 21, 33, 58.90, +45, 35, 30.8, 4.02 }, - { 16, 31, 47.30, +45, 35, 53.9, 5.65 }, - { 9, 28, 40.01, +45, 36, 5.0, 5.41 }, - { 8, 56, 49.99, +45, 37, 54.8, 5.74 }, - { 8, 27, 36.79, +45, 39, 11.2, 6.32 }, - { 20, 39, 23.11, +45, 40, .8, 6.58 }, - { 3, 45, 59.30, +45, 40, 54.8, 5.66 }, - { 22, 8, 40.99, +45, 44, 30.8, 6.11 }, - { 14, 2, 12.19, +45, 45, 13.0, 6.27 }, - { 21, 42, 8.40, +45, 45, 56.9, 6.17 }, - { 19, 59, 20.50, +45, 46, 19.9, 5.92 }, - { 20, 22, 5.40, +45, 47, 42.0, 5.58 }, - { 6, 55, 15.19, +45, 49, 35.0, 6.34 }, - { 8, 41, 1.10, +45, 50, 2.0, 5.37 }, - { 0, 57, 39.70, +45, 50, 22.9, 6.12 }, - { 21, 2, 48.50, +45, 50, 56.0, 6.48 }, - { 21, 33, 17.90, +45, 51, 15.1, 6.25 }, - { 20, 29, 59.90, +45, 55, 43.0, 6.41 }, - { 5, 59, 56.09, +45, 56, 12.8, 4.26 }, - { 19, 39, 34.39, +45, 57, 29.2, 6.20 }, - { 16, 49, 14.21, +45, 58, 59.9, 4.82 }, - { 5, 16, 41.40, +45, 59, 53.2, 0.08 }, - { 17, 39, 27.89, +46, 0, 23.0, 3.80 }, - { 9, 48, 35.40, +46, 1, 16.0, 5.09 }, - { 13, 26, 16.61, +46, 1, 41.2, 5.88 }, - { 16, 2, 47.90, +46, 2, 12.1, 4.76 }, - { 3, 32, 26.30, +46, 3, 24.8, 5.31 }, - { 23, 7, 18.10, +46, 4, 5.2, 6.66 }, - { 0, 10, 19.30, +46, 4, 19.9, 5.03 }, - { 14, 16, 22.99, +46, 5, 17.9, 4.18 }, - { 3, 44, 40.90, +46, 5, 58.9, 6.11 }, - { 20, 48, 56.30, +46, 6, 51.1, 4.84 }, - { 14, 49, 18.70, +46, 6, 58.0, 5.74 }, - { 1, 44, 26.50, +46, 8, 22.9, 6.35 }, - { 21, 1, 10.90, +46, 9, 20.9, 5.37 }, - { 12, 57, 7.70, +46, 10, 36.8, 6.12 }, - { 7, 36, 31.61, +46, 10, 49.1, 5.65 }, - { 23, 37, 58.61, +46, 11, 58.9, 6.58 }, - { 10, 43, 32.90, +46, 12, 14.0, 5.18 }, - { 1, 47, 48.00, +46, 13, 46.9, 6.32 }, - { 17, 20, 21.10, +46, 14, 26.9, 5.59 }, - { 6, 56, 32.30, +46, 16, 27.1, 5.87 }, - { 16, 19, 44.40, +46, 18, 47.9, 3.89 }, - { 18, 46, 58.99, +46, 18, 54.0, 6.52 }, - { 20, 18, 49.61, +46, 19, 22.1, 6.45 }, - { 6, 18, 16.90, +46, 21, 38.2, 6.38 }, - { 23, 7, 39.31, +46, 23, 13.9, 5.33 }, - { 23, 58, 46.51, +46, 24, 47.2, 6.54 }, - { 23, 46, 2.11, +46, 25, 13.1, 4.95 }, - { 6, 17, 34.70, +46, 25, 27.1, 6.52 }, - { 23, 37, 33.89, +46, 27, 29.2, 3.82 }, - { 11, 55, 11.21, +46, 28, 10.9, 7.03 }, - { 2, 19, 10.90, +46, 28, 21.0, 6.21 }, - { 11, 55, 5.69, +46, 28, 36.8, 6.54 }, - { 4, 21, 33.19, +46, 29, 56.0, 4.85 }, - { 20, 46, 38.50, +46, 31, 54.1, 6.30 }, - { 22, 21, 1.61, +46, 32, 12.1, 4.57 }, - { 21, 29, 27.00, +46, 32, 26.2, 5.24 }, - { 16, 36, 11.21, +46, 36, 47.9, 5.79 }, - { 17, 52, 1.01, +46, 38, 35.9, 6.38 }, - { 11, 30, 25.01, +46, 39, 27.0, 6.35 }, - { 20, 49, 54.70, +46, 39, 40.0, 6.33 }, - { 6, 30, 3.00, +46, 41, 8.2, 5.90 }, - { 20, 33, 54.91, +46, 41, 38.0, 5.78 }, - { 6, 56, 55.99, +46, 42, 18.0, 5.86 }, - { 21, 25, 19.61, +46, 42, 51.8, 5.60 }, - { 20, 13, 37.90, +46, 44, 29.0, 3.79 }, - { 22, 5, 16.39, +46, 44, 40.9, 6.13 }, - { 10, 18, 58.99, +46, 45, 38.9, 6.43 }, - { 15, 38, 16.20, +46, 47, 52.1, 5.75 }, - { 20, 13, 18.00, +46, 48, 56.9, 4.83 }, - { 9, 17, 31.20, +46, 49, 1.9, 5.97 }, - { 23, 47, 33.19, +46, 49, 57.0, 6.07 }, - { 11, 38, 33.50, +46, 50, 3.1, 6.10 }, - { 20, 19, 56.11, +46, 50, 15.0, 6.50 }, - { 2, 51, 41.71, +46, 50, 30.8, 5.88 }, - { 21, 3, 43.30, +46, 51, 42.8, 6.32 }, - { 8, 43, .19, +46, 54, 4.0, 6.22 }, - { 9, 34, 19.61, +46, 54, 7.9, 6.52 }, - { 19, 1, 26.40, +46, 56, 4.9, 5.01 }, - { 3, 29, 26.21, +46, 56, 16.1, 6.24 }, - { 5, 10, 42.89, +46, 57, 43.9, 5.68 }, - { 5, 20, 39.29, +46, 57, 50.0, 6.54 }, - { 19, 16, 51.41, +46, 59, 57.1, 6.00 }, - { 1, 30, 6.19, +47, 0, 25.9, 5.27 }, - { 0, 43, 28.10, +47, 1, 28.9, 4.94 }, - { 19, 51, 59.09, +47, 1, 39.0, 5.62 }, - { 9, 3, 37.49, +47, 9, 24.1, 3.60 }, - { 2, 56, 33.41, +47, 9, 50.0, 6.02 }, - { 22, 43, 4.49, +47, 10, 7.0, 6.39 }, - { 12, 54, 56.50, +47, 11, 48.1, 5.84 }, - { 15, 28, 44.50, +47, 12, 5.0, 6.15 }, - { 2, 59, 49.90, +47, 13, 14.9, 5.47 }, - { 7, 15, 50.09, +47, 14, 24.0, 5.58 }, - { 1, 9, 30.19, +47, 14, 30.8, 4.25 }, - { 15, 0, 38.71, +47, 16, 40.1, 6.37 }, - { 3, 7, 47.40, +47, 18, 29.9, 6.41 }, - { 2, 20, 41.40, +47, 18, 38.9, 6.11 }, - { 23, 55, 33.60, +47, 21, 20.9, 6.00 }, - { 1, 3, 1.51, +47, 22, 34.0, 6.45 }, - { 19, 51, 19.39, +47, 22, 37.9, 6.20 }, - { 2, 19, 16.80, +47, 22, 48.0, 5.30 }, - { 7, 54, 29.30, +47, 23, 10.0, 6.25 }, - { 6, 27, 51.10, +47, 24, 19.1, 6.56 }, - { 16, 53, 17.59, +47, 25, .8, 6.00 }, - { 20, 55, 49.80, +47, 25, 4.1, 5.67 }, - { 1, 18, 10.20, +47, 25, 10.9, 6.25 }, - { 2, 14, 2.59, +47, 29, 3.1, 6.06 }, - { 20, 59, 49.61, +47, 31, 16.0, 4.74 }, - { 7, 54, 42.70, +47, 33, 52.9, 5.45 }, - { 17, 47, 8.11, +47, 36, 43.9, 6.43 }, - { 21, 6, 36.10, +47, 38, 53.9, 4.55 }, - { 15, 3, 47.40, +47, 39, 15.8, 4.76 }, - { 21, 10, 31.01, +47, 41, 30.8, 6.46 }, - { 22, 29, 31.80, +47, 42, 24.8, 4.36 }, - { 4, 8, 39.70, +47, 42, 45.0, 4.04 }, - { 20, 15, 28.30, +47, 42, 51.8, 3.98 }, - { 5, 36, 15.91, +47, 42, 55.1, 6.11 }, - { 3, 12, 26.40, +47, 43, 32.9, 6.33 }, - { 20, 12, 3.79, +47, 44, 12.8, 6.92 }, - { 7, 5, 9.00, +47, 46, 30.0, 6.38 }, - { 11, 46, 3.00, +47, 46, 45.8, 3.71 }, - { 3, 42, 55.51, +47, 47, 15.0, 3.01 }, - { 19, 53, 1.20, +47, 48, 27.0, 6.29 }, - { 2, 15, 57.89, +47, 48, 41.0, 6.33 }, - { 20, 47, 49.30, +47, 49, 54.8, 5.57 }, - { 0, 44, 26.40, +47, 51, 51.1, 5.67 }, - { 3, 55, 58.20, +47, 52, 17.0, 5.37 }, - { 1, 49, 15.70, +47, 53, 48.8, 5.82 }, - { 6, 0, 58.61, +47, 54, 6.8, 5.73 }, - { 19, 47, 26.81, +47, 54, 28.1, 6.12 }, - { 11, 30, 52.90, +47, 55, 45.1, 6.42 }, - { 19, 52, 7.20, +47, 55, 54.8, 5.91 }, - { 0, 17, 9.10, +47, 56, 51.0, 5.89 }, - { 21, 15, 36.79, +47, 58, 25.0, 6.46 }, - { 3, 30, 34.49, +47, 59, 43.1, 4.36 }, - { 14, 17, 49.20, +48, 0, 6.1, 6.32 }, - { 3, 32, 8.59, +48, 1, 25.0, 5.47 }, - { 8, 59, 12.41, +48, 2, 30.1, 3.14 }, - { 1, 16, 24.50, +48, 4, 55.9, 6.61 }, - { 3, 30, 37.01, +48, 6, 13.0, 5.82 }, - { 7, 41, 12.41, +48, 7, 54.1, 5.56 }, - { 15, 5, 25.80, +48, 9, 4.0, 5.57 }, - { 0, 11, 59.09, +48, 9, 9.0, 6.16 }, - { 19, 34, 39.91, +48, 9, 52.9, 6.67 }, - { 3, 13, 24.00, +48, 10, 36.8, 5.90 }, - { 7, 28, 51.60, +48, 11, 2.0, 5.72 }, - { 17, 20, 33.60, +48, 11, 17.9, 6.43 }, - { 3, 36, 29.40, +48, 11, 34.1, 4.23 }, - { 20, 4, 28.80, +48, 13, 46.9, 6.16 }, - { 22, 5, 51.19, +48, 13, 54.1, 6.27 }, - { 17, 26, 44.21, +48, 15, 36.0, 5.85 }, - { 2, 43, 1.90, +48, 15, 56.2, 6.48 }, - { 0, 44, 43.49, +48, 17, 3.8, 4.54 }, - { 4, 41, 24.10, +48, 18, 2.9, 5.67 }, - { 23, 19, 41.59, +48, 22, 50.9, 6.32 }, - { 17, 50, 3.31, +48, 23, 39.1, 6.68 }, - { 10, 19, 26.81, +48, 23, 48.8, 6.00 }, - { 4, 14, 53.90, +48, 24, 33.8, 4.14 }, - { 9, 42, 43.10, +48, 25, 52.0, 6.39 }, - { 18, 3, 9.00, +48, 27, 51.8, 6.21 }, - { 12, 48, 41.81, +48, 28, .8, 6.27 }, - { 3, 44, 6.41, +48, 31, 25.0, 6.06 }, - { 9, 5, 24.10, +48, 31, 49.1, 5.95 }, - { 2, 53, 21.19, +48, 34, 9.8, 6.26 }, - { 17, 36, 37.61, +48, 35, 8.2, 5.37 }, - { 23, 19, 29.81, +48, 37, 31.1, 5.44 }, - { 1, 37, 59.59, +48, 37, 41.9, 3.57 }, - { 3, 53, 38.71, +48, 39, 2.2, 5.76 }, - { 21, 57, 2.21, +48, 40, 7.0, 6.42 }, - { 0, 55, 5.21, +48, 40, 43.0, 6.27 }, - { 22, 57, 4.49, +48, 41, 3.1, 5.43 }, - { 6, 11, 36.60, +48, 42, 40.0, 6.09 }, - { 6, 11, 36.50, +48, 42, 47.2, 6.82 }, - { 14, 49, 41.30, +48, 43, 14.2, 5.69 }, - { 1, 36, 27.19, +48, 43, 22.1, 5.92 }, - { 4, 51, 9.29, +48, 44, 26.9, 5.66 }, - { 18, 48, 16.10, +48, 46, 3.0, 6.12 }, - { 7, 37, 53.90, +48, 46, 25.0, 5.92 }, - { 10, 28, 3.79, +48, 47, 4.9, 6.44 }, - { 11, 31, 10.20, +48, 47, 21.1, 6.56 }, - { 6, 47, 39.60, +48, 47, 21.8, 5.22 }, - { 17, 4, 49.80, +48, 48, 15.1, 6.09 }, - { 21, 26, 51.60, +48, 50, 6.0, 5.31 }, - { 18, 54, 47.11, +48, 51, 34.9, 5.77 }, - { 0, 20, 5.21, +48, 51, 55.1, 6.52 }, - { 16, 38, 44.90, +48, 55, 41.9, 4.90 }, - { 20, 30, 3.50, +48, 57, 6.1, 4.95 }, - { 2, 19, 22.70, +48, 57, 19.1, 6.37 }, - { 6, 1, 43.10, +48, 57, 33.8, 5.96 }, - { 16, 30, 6.00, +48, 57, 38.9, 6.45 }, - { 12, 19, 48.70, +48, 59, 3.1, 5.29 }, - { 23, 17, 44.69, +49, 0, 55.1, 4.85 }, - { 13, 34, 27.31, +49, 0, 58.0, 4.70 }, - { 5, 57, 4.90, +49, 1, 45.8, 6.47 }, - { 16, 19, 11.21, +49, 2, 17.2, 5.91 }, - { 3, 28, 3.10, +49, 3, 46.1, 4.98 }, - { 3, 21, 52.61, +49, 4, 14.9, 5.93 }, - { 18, 47, 40.01, +49, 4, 30.0, 6.40 }, - { 3, 25, 57.41, +49, 7, 14.9, 6.09 }, - { 18, 21, 32.71, +49, 7, 18.1, 5.05 }, - { 23, 30, 7.39, +49, 7, 59.2, 6.17 }, - { 20, 56, 25.90, +49, 11, 44.9, 5.90 }, - { 1, 58, 33.60, +49, 12, 15.1, 5.69 }, - { 3, 31, 29.40, +49, 12, 34.9, 6.29 }, - { 7, 26, 42.79, +49, 12, 41.0, 4.64 }, - { 3, 23, 13.20, +49, 12, 47.9, 5.29 }, - { 20, 31, 18.79, +49, 13, 13.1, 5.44 }, - { 2, 44, 12.00, +49, 13, 41.9, 4.12 }, - { 19, 33, 41.59, +49, 15, 45.0, 5.96 }, - { 19, 37, 56.69, +49, 17, 3.8, 6.47 }, - { 6, 24, 53.90, +49, 17, 17.2, 4.91 }, - { 23, 7, 45.41, +49, 17, 44.9, 5.70 }, - { 21, 46, 47.59, +49, 18, 33.8, 4.23 }, - { 13, 47, 32.40, +49, 18, 47.9, 1.86 }, - { 21, 24, 55.51, +49, 19, 23.9, 6.58 }, - { 0, 39, 9.91, +49, 21, 15.8, 5.43 }, - { 22, 30, 6.50, +49, 21, 22.0, 6.40 }, - { 14, 34, 39.60, +49, 22, 5.9, 5.74 }, - { 20, 27, 2.30, +49, 22, 59.9, 5.69 }, - { 21, 22, .41, +49, 23, 20.0, 5.69 }, - { 3, 31, 49.10, +49, 24, 2.9, 6.39 }, - { 23, 12, 33.00, +49, 24, 23.0, 4.52 }, - { 9, 33, 7.20, +49, 26, 19.0, 6.76 }, - { 14, 8, 17.30, +49, 27, 29.2, 5.25 }, - { 7, 18, 31.90, +49, 27, 54.0, 5.05 }, - { 11, 16, 41.90, +49, 28, 35.0, 5.88 }, - { 22, 24, 31.01, +49, 28, 35.0, 4.57 }, - { 13, 36, 39.79, +49, 29, 12.1, 6.49 }, - { 3, 29, 22.10, +49, 30, 32.0, 4.67 }, - { 21, 19, 28.80, +49, 30, 37.1, 5.76 }, - { 23, 41, 26.90, +49, 30, 43.9, 6.26 }, - { 19, 18, 37.70, +49, 34, 10.9, 6.31 }, - { 21, 42, 38.90, +49, 36, 1.1, 6.09 }, - { 3, 9, 4.01, +49, 36, 47.9, 4.05 }, - { 14, 56, 22.99, +49, 37, 43.0, 5.63 }, - { 7, 29, 55.99, +49, 40, 21.0, 5.36 }, - { 13, 18, 14.50, +49, 40, 54.8, 5.15 }, - { 17, 16, 48.60, +49, 41, 28.0, 7.48 }, - { 18, 7, 6.29, +49, 42, 38.2, 6.32 }, - { 18, 21, 7.10, +49, 43, 32.2, 6.40 }, - { 22, 56, 25.99, +49, 44, 1.0, 4.95 }, - { 17, 11, 40.20, +49, 44, 48.1, 6.04 }, - { 22, 8, 16.51, +49, 47, 47.0, 6.42 }, - { 9, 55, 43.01, +49, 49, 12.0, 5.27 }, - { 5, 45, 54.00, +49, 49, 35.0, 5.47 }, - { 14, 28, 37.80, +49, 50, 40.9, 5.59 }, - { 3, 28, 52.39, +49, 50, 53.9, 5.58 }, - { 19, 12, 4.61, +49, 51, 15.1, 6.75 }, - { 19, 12, 4.99, +49, 51, 22.0, 6.57 }, - { 3, 24, 19.39, +49, 51, 40.0, 1.79 }, - { 15, 59, 4.39, +49, 52, 52.0, 6.05 }, - { 6, 2, 48.70, +49, 54, 20.2, 6.05 }, - { 19, 5, 9.91, +49, 55, 23.9, 6.43 }, - { 5, 59, 21.79, +49, 55, 27.8, 5.89 }, - { 4, 43, 21.60, +49, 58, 26.0, 5.87 }, - { 21, 32, 56.59, +49, 58, 40.1, 5.75 }, - { 0, 1, 19.30, +49, 58, 54.1, 6.22 }, - { 2, 24, 24.89, +50, 0, 24.1, 5.19 }, - { 16, 56, 6.41, +50, 2, 20.0, 6.56 }, - { 4, 19, 13.30, +50, 2, 56.0, 5.45 }, - { 23, 4, 10.99, +50, 3, 7.9, 4.65 }, - { 15, 8, 19.51, +50, 3, 18.0, 6.39 }, - { 19, 15, 19.30, +50, 4, 14.9, 6.27 }, - { 22, 35, 53.40, +50, 4, 16.0, 6.29 }, - { 3, 19, 7.61, +50, 5, 42.0, 5.03 }, - { 20, 1, 21.60, +50, 6, 16.9, 5.05 }, - { 2, 20, 58.20, +50, 9, 5.0, 5.59 }, - { 19, 36, 26.50, +50, 13, 16.0, 4.48 }, - { 3, 18, 37.80, +50, 13, 19.9, 5.15 }, - { 20, 7, 11.50, +50, 13, 45.1, 6.54 }, - { 20, 15, 43.39, +50, 13, 58.1, 6.31 }, - { 19, 35, 55.90, +50, 14, 19.0, 6.52 }, - { 19, 23, 23.81, +50, 16, 17.0, 6.51 }, - { 2, 25, 37.39, +50, 16, 43.0, 4.71 }, - { 22, 31, 17.50, +50, 16, 57.0, 3.77 }, - { 4, 18, 14.59, +50, 17, 44.2, 4.61 }, - { 19, 31, 19.30, +50, 18, 24.1, 5.53 }, - { 20, 42, 12.60, +50, 20, 24.0, 5.39 }, - { 4, 6, 34.99, +50, 21, 5.0, 4.29 }, - { 21, 3, 25.99, +50, 21, 6.8, 6.37 }, - { 22, 52, 52.30, +50, 24, 42.8, 6.46 }, - { 15, 38, 34.30, +50, 25, 23.9, 5.84 }, - { 7, 44, 4.20, +50, 26, 2.0, 5.27 }, - { 20, 58, 30.10, +50, 27, 43.9, 5.61 }, - { 23, 39, 8.30, +50, 28, 18.1, 5.30 }, - { 0, 42, 3.89, +50, 30, 45.0, 4.80 }, - { 19, 41, 52.01, +50, 31, 3.0, 6.20 }, - { 13, 40, 23.21, +50, 31, 9.8, 6.32 }, - { 19, 41, 48.89, +50, 31, 31.1, 5.96 }, - { 19, 0, 13.70, +50, 32, 1.0, 5.38 }, - { 2, 27, 51.79, +50, 34, 10.9, 6.12 }, - { 13, 28, 11.71, +50, 35, 13.9, 6.80 }, - { 23, 14, 14.30, +50, 37, 4.1, 6.31 }, - { 11, 37, 52.99, +50, 37, 5.9, 6.14 }, - { 22, 50, 10.20, +50, 40, 36.8, 6.21 }, - { 1, 43, 39.60, +50, 41, 19.0, 4.07 }, - { 3, 56, 36.50, +50, 41, 43.1, 5.28 }, - { 18, 53, 13.61, +50, 42, 29.9, 4.92 }, - { 13, 37, 43.01, +50, 42, 52.9, 6.48 }, - { 13, 28, 45.70, +50, 43, 5.9, 6.43 }, - { 20, 56, 25.51, +50, 43, 43.0, 5.81 }, - { 3, 48, 18.29, +50, 44, 12.1, 6.14 }, - { 17, 49, 4.30, +50, 46, 52.0, 5.02 }, - { 1, 52, 9.41, +50, 47, 34.1, 5.79 }, - { 18, 58, 59.59, +50, 48, 33.8, 6.30 }, - { 18, 6, 53.50, +50, 49, 22.1, 6.29 }, - { 22, 11, 9.91, +50, 49, 23.9, 5.40 }, - { 17, 8, 17.11, +50, 50, 31.9, 6.46 }, - { 19, 56, 45.10, +50, 54, 9.0, 6.43 }, - { 4, 20, 11.50, +50, 55, 14.9, 5.55 }, - { 3, 16, 12.19, +50, 56, 16.1, 5.03 }, - { 0, 48, 50.09, +50, 58, 5.9, 4.89 }, - { 14, 2, 59.69, +50, 58, 18.8, 6.15 }, - { 22, 20, 39.60, +50, 58, 50.9, 6.42 }, - { 1, 4, 46.80, +51, 0, 36.0, 6.54 }, - { 1, 2, 18.41, +51, 2, 6.0, 6.47 }, - { 2, 13, 36.29, +51, 3, 56.9, 5.31 }, - { 20, 56, 12.89, +51, 4, 30.0, 6.63 }, - { 6, 13, 45.31, +51, 10, 21.0, 6.04 }, - { 21, 42, 5.69, +51, 11, 22.9, 4.67 }, - { 19, 34, 19.80, +51, 14, 12.1, 5.73 }, - { 2, 56, 50.59, +51, 15, 38.9, 6.22 }, - { 9, 20, 43.80, +51, 15, 58.0, 6.13 }, - { 14, 17, 21.10, +51, 18, 25.9, 6.20 }, - { 18, 19, 56.11, +51, 20, 52.1, 6.30 }, - { 14, 16, 9.89, +51, 22, 1.9, 4.75 }, - { 14, 49, 32.30, +51, 22, 28.9, 6.51 }, - { 23, 58, 24.79, +51, 23, 19.0, 4.80 }, - { 16, 28, 43.39, +51, 24, 28.1, 6.29 }, - { 7, 13, 23.40, +51, 25, 44.0, 5.47 }, - { 0, 17, 43.01, +51, 25, 59.2, 6.14 }, - { 20, 12, 31.80, +51, 27, 49.0, 6.01 }, - { 1, 52, 50.81, +51, 28, 28.9, 6.26 }, - { 17, 56, 36.41, +51, 29, 20.0, 2.23 }, - { 11, 0, 25.61, +51, 30, 6.8, 6.43 }, - { 8, 8, 27.41, +51, 30, 24.1, 4.84 }, - { 0, 50, 57.41, +51, 30, 29.2, 6.39 }, - { 5, 50, 56.40, +51, 30, 52.9, 6.29 }, - { 12, 30, 2.90, +51, 32, 8.2, 6.21 }, - { 22, 37, 22.39, +51, 32, 43.1, 4.63 }, - { 12, 24, 1.51, +51, 33, 43.9, 4.80 }, - { 0, 51, 33.70, +51, 34, 16.0, 6.21 }, - { 6, 4, 29.09, +51, 34, 23.9, 6.45 }, - { 9, 24, 55.70, +51, 34, 26.0, 6.31 }, - { 5, 6, 40.61, +51, 35, 52.1, 5.00 }, - { 9, 8, 52.30, +51, 36, 16.9, 4.48 }, - { 23, 50, 22.30, +51, 37, 18.1, 6.44 }, - { 9, 32, 51.41, +51, 40, 37.9, 3.17 }, - { 21, 34, 27.50, +51, 41, 53.9, 6.15 }, - { 19, 29, 42.29, +51, 43, 46.9, 3.79 }, - { 14, 13, 27.70, +51, 47, 16.1, 6.69 }, - { 14, 13, 28.99, +51, 47, 25.1, 4.54 }, - { 5, 56, 14.40, +51, 48, 14.0, 6.49 }, - { 17, 41, 21.79, +51, 49, 5.2, 5.99 }, - { 20, 5, 6.70, +51, 50, 21.8, 6.14 }, - { 14, 25, 11.81, +51, 51, 2.9, 4.05 }, - { 20, 34, 50.40, +51, 51, 15.1, 6.11 }, - { 10, 59, 17.90, +51, 52, 55.9, 6.17 }, - { 7, 24, 57.19, +51, 53, 13.9, 5.80 }, - { 20, 48, 42.70, +51, 54, 38.2, 6.29 }, - { 1, 50, 57.10, +51, 55, 59.9, 5.90 }, - { 15, 20, 5.21, +51, 57, 31.0, 5.66 }, - { 0, 24, 15.60, +52, 1, 12.0, 5.57 }, - { 9, 34, 49.51, +52, 3, 5.0, 4.50 }, - { 19, 59, 15.41, +52, 3, 20.9, 6.15 }, - { 13, 43, 54.70, +52, 3, 51.8, 6.02 }, - { 15, 36, 4.10, +52, 4, 10.9, 6.74 }, - { 18, 32, 11.40, +52, 6, 56.2, 6.56 }, - { 7, 17, 33.70, +52, 7, 50.9, 5.92 }, - { 18, 39, 52.80, +52, 11, 46.0, 6.00 }, - { 3, 8, 3.91, +52, 12, 47.9, 6.31 }, - { 22, 23, 33.60, +52, 13, 45.1, 4.43 }, - { 19, 2, 7.01, +52, 15, 40.0, 6.31 }, - { 17, 30, 25.99, +52, 18, 5.0, 2.79 }, - { 20, 31, 21.10, +52, 18, 34.9, 6.18 }, - { 19, 27, 25.90, +52, 19, 14.2, 5.75 }, - { 3, 0, 52.20, +52, 21, 6.1, 5.28 }, - { 3, 0, 53.40, +52, 21, 7.9, 6.74 }, - { 18, 33, 56.69, +52, 21, 13.0, 5.36 }, - { 15, 42, 50.69, +52, 21, 38.9, 5.51 }, - { 10, 5, 10.49, +52, 22, 14.9, 6.14 }, - { 20, 47, 52.80, +52, 24, 25.9, 6.27 }, - { 17, 10, 30.60, +52, 24, 32.0, 6.29 }, - { 19, 8, 25.80, +52, 25, 32.2, 5.81 }, - { 19, 55, 37.80, +52, 26, 20.0, 4.92 }, - { 1, 4, 2.40, +52, 30, 7.9, 5.99 }, - { 10, 52, 31.90, +52, 30, 13.0, 6.44 }, - { 22, 44, 49.20, +52, 31, 1.9, 6.55 }, - { 14, 15, 16.90, +52, 32, 8.9, 6.58 }, - { 10, 52, 30.79, +52, 33, 55.1, 6.65 }, - { 21, 31, 27.50, +52, 37, 12.0, 6.16 }, - { 6, 11, 46.01, +52, 38, 49.9, 6.30 }, - { 22, 59, 10.30, +52, 39, 15.8, 6.29 }, - { 0, 53, 47.59, +52, 41, 21.1, 6.27 }, - { 8, 39, 17.59, +52, 42, 42.1, 5.91 }, - { 13, 27, 59.50, +52, 44, 44.9, 6.34 }, - { 7, 5, 39.79, +52, 45, 29.2, 6.12 }, - { 2, 54, 15.50, +52, 45, 45.0, 3.95 }, - { 11, 16, 4.01, +52, 46, 23.2, 6.50 }, - { 23, 7, 10.10, +52, 48, 59.0, 6.11 }, - { 0, 31, 41.21, +52, 50, 21.8, 5.60 }, - { 4, 53, 9.79, +52, 50, 26.9, 6.41 }, - { 4, 56, 7.10, +52, 52, 9.8, 5.75 }, - { 22, 1, 50.59, +52, 52, 55.9, 5.78 }, - { 21, 26, 45.00, +52, 53, 55.0, 6.03 }, - { 16, 36, 11.50, +52, 54, 1.1, 5.53 }, - { 16, 2, 5.50, +52, 54, 56.9, 5.93 }, - { 13, 39, 30.41, +52, 55, 17.0, 5.46 }, - { 16, 36, 14.09, +52, 55, 27.1, 6.53 }, - { 16, 36, 13.70, +52, 55, 27.8, 5.08 }, - { 8, 39, .00, +52, 55, 30.0, 6.42 }, - { 21, 30, 20.40, +52, 57, 29.2, 6.02 }, - { 18, 51, 34.99, +52, 58, 30.0, 5.51 }, - { 18, 46, 43.10, +52, 59, 17.2, 5.88 }, - { 19, 50, 37.70, +52, 59, 17.2, 5.03 }, - { 20, 46, 21.19, +52, 59, 43.1, 6.33 }, - { 2, 52, 52.01, +52, 59, 52.1, 6.36 }, - { 0, 25, 6.41, +53, 2, 48.8, 5.74 }, - { 12, 30, 50.11, +53, 4, 36.1, 6.21 }, - { 4, 39, 54.70, +53, 4, 46.9, 5.05 }, - { 8, 32, 33.50, +53, 6, 52.9, 6.24 }, - { 4, 59, 46.30, +53, 9, 20.2, 6.08 }, - { 20, 6, 13.80, +53, 9, 56.9, 5.85 }, - { 12, 17, 29.50, +53, 11, 28.0, 5.81 }, - { 23, 16, 42.29, +53, 12, 49.0, 5.54 }, - { 5, 14, 44.30, +53, 12, 50.0, 6.20 }, - { 8, 23, 48.50, +53, 13, 10.9, 5.51 }, - { 21, 3, 47.59, +53, 17, 10.0, 5.90 }, - { 6, 44, 11.59, +53, 17, 47.0, 6.27 }, - { 18, 23, 47.81, +53, 18, 2.9, 6.32 }, - { 22, 7, 25.51, +53, 18, 25.9, 6.14 }, - { 19, 17, 6.19, +53, 22, 7.0, 3.77 }, - { 19, 4, 55.20, +53, 23, 48.1, 5.38 }, - { 8, 38, 22.20, +53, 24, 5.0, 5.66 }, - { 17, 21, 45.41, +53, 25, 14.2, 5.67 }, - { 12, 14, 43.39, +53, 26, 4.9, 6.16 }, - { 6, 21, 46.10, +53, 27, 7.9, 5.36 }, - { 4, 39, 58.10, +53, 28, 23.2, 5.35 }, - { 5, 41, 20.30, +53, 28, 52.0, 6.23 }, - { 10, 33, 43.61, +53, 29, 51.0, 6.45 }, - { 1, 7, 9.50, +53, 29, 53.9, 6.38 }, - { 3, 4, 47.81, +53, 30, 23.0, 2.93 }, - { 2, 42, 59.69, +53, 31, 34.0, 5.84 }, - { 20, 24, 32.40, +53, 33, 6.8, 6.51 }, - { 21, 10, 15.60, +53, 33, 47.9, 5.73 }, - { 8, 20, 29.09, +53, 34, 27.8, 6.49 }, - { 5, 17, 17.81, +53, 35, 10.0, 6.50 }, - { 20, 20, 30.41, +53, 35, 46.0, 6.18 }, - { 4, 16, 43.10, +53, 36, 42.8, 5.19 }, - { 10, 39, 5.69, +53, 40, 5.9, 5.52 }, - { 11, 53, 49.80, +53, 41, 40.9, 2.44 }, - { 13, 53, 51.00, +53, 43, 43.0, 5.70 }, - { 4, 57, 17.21, +53, 45, 7.9, 4.47 }, - { 10, 20, 14.81, +53, 46, 45.1, 6.45 }, - { 17, 43, 59.30, +53, 48, 6.1, 5.75 }, - { 2, 10, 7.80, +53, 50, 35.2, 6.31 }, - { 22, 40, 18.41, +53, 50, 46.0, 5.93 }, - { 1, 40, 13.10, +53, 52, 5.9, 6.39 }, - { 18, 43, 28.99, +53, 52, 18.8, 6.11 }, - { 10, 4, 36.29, +53, 53, 30.1, 5.74 }, - { 0, 36, 58.30, +53, 53, 48.8, 3.66 }, - { 22, 42, 20.81, +53, 54, 32.0, 6.12 }, - { 4, 32, 1.80, +53, 54, 38.9, 5.77 }, - { 3, 25, 48.41, +53, 55, 18.1, 6.51 }, - { 15, 35, 16.30, +53, 55, 18.8, 5.97 }, - { 21, 17, 1.99, +53, 59, 51.0, 6.13 }, - { 4, 6, 36.60, +54, 0, 31.0, 6.31 }, - { 15, 26, 32.50, +54, 1, 12.0, 6.45 }, - { 9, 16, 11.30, +54, 1, 18.8, 4.83 }, - { 14, 38, 15.19, +54, 1, 23.9, 5.85 }, - { 22, 32, 18.79, +54, 2, 15.0, 6.35 }, - { 21, 37, 38.71, +54, 2, 31.9, 6.15 }, - { 9, 52, 6.41, +54, 3, 51.8, 4.59 }, - { 12, 56, 17.59, +54, 5, 57.8, 5.82 }, - { 7, 51, 5.71, +54, 7, 45.1, 6.02 }, - { 8, 18, 15.79, +54, 8, 37.0, 6.27 }, - { 0, 36, 8.30, +54, 10, 7.0, 5.08 }, - { 10, 20, 31.20, +54, 13, .8, 6.00 }, - { 9, 4, .41, +54, 17, 2.0, 5.75 }, - { 5, 59, 31.61, +54, 17, 4.9, 3.72 }, - { 18, 10, 31.61, +54, 17, 12.1, 5.95 }, - { 11, 30, 12.91, +54, 21, 42.1, 6.41 }, - { 9, 43, 7.01, +54, 21, 49.0, 6.47 }, - { 19, 19, 36.50, +54, 22, 34.0, 6.26 }, - { 5, 6, 22.01, +54, 24, 20.9, 7.24 }, - { 22, 48, 47.81, +54, 24, 54.0, 6.12 }, - { 5, 36, 35.21, +54, 25, 44.0, 5.73 }, - { 13, 46, 35.69, +54, 25, 58.1, 5.70 }, - { 17, 5, 19.80, +54, 28, 13.1, 5.83 }, - { 17, 5, 19.70, +54, 28, 13.1, 5.80 }, - { 2, 2, 18.10, +54, 29, 15.0, 5.04 }, - { 15, 37, 31.99, +54, 30, 32.0, 5.87 }, - { 0, 31, 46.39, +54, 31, 19.9, 4.73 }, - { 5, 59, 48.10, +54, 32, 49.9, 6.14 }, - { 15, 6, 16.70, +54, 33, 23.0, 5.25 }, - { 10, 53, 34.51, +54, 35, 6.0, 5.10 }, - { 15, 35, 57.10, +54, 37, 50.2, 5.74 }, - { 13, 40, 44.30, +54, 40, 54.1, 4.66 }, - { 15, 57, 47.40, +54, 44, 58.9, 4.95 }, - { 11, 35, 4.90, +54, 47, 7.1, 5.63 }, - { 4, 9, 22.39, +54, 49, 44.0, 6.18 }, - { 14, 18, 55.80, +54, 51, 51.1, 6.53 }, - { 21, 40, 43.30, +54, 52, 19.9, 6.20 }, - { 11, 12, 44.50, +54, 53, 39.1, 6.63 }, - { 0, 33, 10.39, +54, 53, 42.0, 5.93 }, - { 18, 44, 55.39, +54, 53, 48.1, 6.23 }, - { 1, 8, 16.39, +54, 55, 13.1, 5.17 }, - { 13, 23, 56.40, +54, 55, 18.1, 3.95 }, - { 13, 23, 55.49, +54, 55, 31.1, 2.27 }, - { 19, 38, 41.21, +54, 58, 26.0, 5.82 }, - { 3, 33, 39.00, +54, 58, 28.9, 5.98 }, - { 13, 25, 13.49, +54, 59, 17.2, 4.01 }, - { 2, 43, 2.81, +55, 6, 20.9, 5.77 }, - { 1, 51, 59.30, +55, 8, 51.0, 5.52 }, - { 1, 11, 6.19, +55, 8, 58.9, 4.33 }, - { 11, 41, 43.61, +55, 10, 21.0, 6.27 }, - { 17, 32, 16.01, +55, 10, 23.2, 4.87 }, - { 17, 32, 10.61, +55, 11, 3.1, 4.88 }, - { 15, 28, 56.81, +55, 11, 42.0, 6.43 }, - { 16, 24, 25.30, +55, 12, 18.0, 5.74 }, - { 7, 52, 36.60, +55, 12, 33.8, 6.38 }, - { 0, 45, 17.21, +55, 13, 18.1, 5.42 }, - { 23, 2, 43.80, +55, 14, 11.0, 6.50 }, - { 4, 55, 3.10, +55, 15, 33.1, 5.52 }, - { 7, 22, 52.10, +55, 16, 53.0, 5.45 }, - { 7, 22, 50.90, +55, 17, 3.8, 6.53 }, - { 0, 46, 15.10, +55, 18, 19.1, 6.52 }, - { 5, 59, 45.70, +55, 19, 14.9, 6.44 }, - { 13, 34, 7.30, +55, 20, 55.0, 5.60 }, - { 6, 34, 32.81, +55, 21, 11.2, 6.45 }, - { 2, 23, 51.79, +55, 21, 51.8, 6.28 }, - { 15, 47, 37.99, +55, 22, 36.1, 5.86 }, - { 20, 18, 24.79, +55, 23, 49.9, 5.76 }, - { 14, 32, 30.91, +55, 23, 52.1, 5.76 }, - { 21, 28, 52.70, +55, 25, 7.0, 6.12 }, - { 3, 30, .19, +55, 27, 6.8, 5.09 }, - { 19, 42, 4.10, +55, 27, 47.9, 6.48 }, - { 15, 46, 34.80, +55, 28, 28.9, 5.92 }, - { 2, 29, 25.01, +55, 32, 11.0, 6.51 }, - { 18, 42, 37.90, +55, 32, 21.8, 5.04 }, - { 1, 53, 48.50, +55, 35, 53.2, 6.45 }, - { 4, 48, 7.01, +55, 36, 9.0, 6.26 }, - { 11, 46, 55.61, +55, 37, 41.9, 5.27 }, - { 19, 0, 43.39, +55, 39, 29.9, 5.48 }, - { 16, 42, 58.39, +55, 41, 25.1, 6.16 }, - { 6, 48, 12.89, +55, 42, 15.8, 6.33 }, - { 6, 48, 12.29, +55, 42, 15.8, 6.28 }, - { 23, 57, 8.50, +55, 42, 20.9, 5.55 }, - { 5, 54, 50.81, +55, 42, 24.8, 4.99 }, - { 12, 27, 35.11, +55, 42, 46.1, 5.70 }, - { 19, 31, 13.61, +55, 43, 54.8, 6.37 }, - { 9, 29, 47.59, +55, 44, 44.2, 6.45 }, - { 23, 59, .50, +55, 45, 18.0, 4.88 }, - { 7, 36, 46.99, +55, 45, 19.1, 5.92 }, - { 21, 52, 1.01, +55, 47, 48.8, 5.71 }, - { 21, 17, 14.30, +55, 47, 53.2, 5.98 }, - { 23, 44, 48.31, +55, 47, 58.9, 6.51 }, - { 15, 52, 16.61, +55, 49, 36.1, 5.81 }, - { 16, 9, 25.99, +55, 49, 44.0, 6.49 }, - { 2, 22, 21.41, +55, 50, 44.2, 5.17 }, - { 11, 25, 57.10, +55, 51, 2.2, 5.75 }, - { 13, 45, 13.20, +55, 52, 45.8, 6.50 }, - { 2, 50, 41.81, +55, 53, 44.2, 3.76 }, - { 22, 49, 46.20, +55, 54, 10.1, 5.43 }, - { 3, 47, 32.21, +55, 55, 21.0, 6.10 }, - { 12, 54, 1.70, +55, 57, 34.9, 1.77 }, - { 17, 55, 23.71, +55, 58, 17.0, 6.10 }, - { 10, 30, 37.61, +55, 58, 50.2, 4.84 }, - { 20, 39, .19, +56, 0, 18.0, 6.48 }, - { 16, 38, .41, +56, 0, 56.2, 5.29 }, - { 20, 29, 27.10, +56, 4, 5.2, 5.91 }, - { 3, 5, 39.89, +56, 4, 7.0, 6.11 }, - { 22, 35, 51.79, +56, 4, 12.0, 6.38 }, - { 5, 46, 30.41, +56, 6, 56.2, 5.94 }, - { 6, 26, 25.80, +56, 17, 6.0, 5.64 }, - { 20, 5, 21.50, +56, 20, 29.0, 6.21 }, - { 22, 6, 13.49, +56, 20, 35.2, 6.39 }, - { 13, 0, 43.80, +56, 21, 59.0, 4.93 }, - { 11, 1, 50.50, +56, 22, 57.0, 2.37 }, - { 22, 26, 59.21, +56, 25, 59.9, 6.57 }, - { 8, 13, 50.21, +56, 27, 7.9, 5.85 }, - { 20, 44, 22.01, +56, 29, 17.2, 5.78 }, - { 7, 56, 26.81, +56, 30, 15.8, 6.72 }, - { 4, 21, 51.79, +56, 30, 24.1, 5.88 }, - { 0, 40, 30.50, +56, 32, 13.9, 2.23 }, - { 20, 13, 23.90, +56, 34, 4.1, 4.30 }, - { 5, 43, 1.61, +56, 34, 54.1, 6.05 }, - { 10, 51, 11.09, +56, 34, 55.9, 5.67 }, - { 18, 14, 41.11, +56, 35, 17.9, 6.37 }, - { 11, 55, 58.39, +56, 35, 55.0, 5.84 }, - { 2, 25, 16.01, +56, 36, 36.0, 6.25 }, - { 21, 54, 53.21, +56, 36, 41.0, 5.80 }, - { 22, 33, 40.61, +56, 37, 30.0, 5.71 }, - { 20, 26, 23.50, +56, 38, 20.0, 6.36 }, - { 21, 2, 9.10, +56, 40, 10.9, 5.83 }, - { 19, 56, 19.01, +56, 41, 12.8, 6.12 }, - { 16, 59, 21.50, +56, 41, 19.0, 6.03 }, - { 9, 21, 43.30, +56, 41, 57.1, 5.47 }, - { 3, 5, 32.40, +56, 42, 20.9, 4.76 }, - { 11, 29, 43.49, +56, 44, 15.0, 6.28 }, - { 9, 15, 49.90, +56, 44, 29.0, 5.27 }, - { 4, 48, .31, +56, 45, 25.9, 5.30 }, - { 12, 25, 3.19, +56, 46, 39.0, 5.81 }, - { 20, 31, 46.51, +56, 46, 48.0, 6.14 }, - { 16, 45, 17.81, +56, 46, 54.8, 4.85 }, - { 22, 38, 37.90, +56, 47, 44.9, 5.21 }, - { 9, 59, 51.70, +56, 48, 42.8, 5.48 }, - { 22, 11, 48.79, +56, 50, 21.8, 5.24 }, - { 6, 37, 38.50, +56, 51, 27.0, 5.85 }, - { 19, 11, 40.51, +56, 51, 33.1, 5.12 }, - { 17, 53, 31.70, +56, 52, 22.1, 3.75 }, - { 20, 56, 16.99, +56, 53, 15.0, 6.23 }, - { 5, 50, 34.01, +56, 55, 8.0, 6.54 }, - { 3, 38, 19.70, +56, 55, 58.1, 6.30 }, - { 1, 7, .19, +56, 56, 6.0, 6.43 }, - { 23, 0, 5.09, +56, 56, 43.1, 5.00 }, - { 12, 15, 25.61, +57, 1, 57.0, 3.31 }, - { 19, 43, 39.60, +57, 2, 33.0, 6.27 }, - { 22, 15, 1.99, +57, 2, 37.0, 4.19 }, - { 18, 32, 34.49, +57, 2, 44.2, 4.77 }, - { 12, 11, 44.90, +57, 3, 15.8, 6.43 }, - { 2, 16, 51.70, +57, 3, 19.1, 6.48 }, - { 14, 34, 15.91, +57, 3, 55.1, 6.48 }, - { 11, 21, 49.30, +57, 4, 30.0, 6.43 }, - { 7, 40, 49.51, +57, 4, 58.1, 6.06 }, - { 10, 35, 9.70, +57, 4, 58.1, 5.16 }, - { 2, 49, 30.79, +57, 5, 3.1, 6.25 }, - { 1, 44, 46.10, +57, 5, 21.1, 6.25 }, - { 23, 1, 30.70, +57, 6, 20.2, 6.20 }, - { 20, 43, 13.49, +57, 6, 51.1, 6.32 }, - { 3, 49, 19.61, +57, 7, 5.2, 6.46 }, - { 9, 46, 31.70, +57, 7, 41.2, 5.20 }, - { 3, 15, 48.00, +57, 8, 26.9, 5.79 }, - { 0, 10, 29.69, +57, 9, 56.2, 6.74 }, - { 23, 13, 16.99, +57, 10, 5.9, 5.56 }, - { 6, 46, 49.51, +57, 10, 9.1, 5.35 }, - { 10, 43, 43.30, +57, 11, 57.1, 5.80 }, - { 13, 40, 21.29, +57, 12, 27.0, 6.29 }, - { 22, 16, 26.50, +57, 13, 13.1, 5.88 }, - { 5, 32, 33.79, +57, 13, 16.0, 6.48 }, - { 23, 41, 54.50, +57, 15, 36.0, 6.24 }, - { 8, 2, 35.81, +57, 16, 25.0, 6.49 }, - { 22, 23, .19, +57, 17, 3.8, 6.16 }, - { 17, 40, 36.19, +57, 18, 37.1, 6.77 }, - { 10, 46, 22.51, +57, 21, 56.9, 6.34 }, - { 23, 55, 33.70, +57, 24, 43.9, 6.00 }, - { 9, 57, 13.61, +57, 25, 5.9, 5.93 }, - { 23, 47, 1.90, +57, 27, 5.0, 5.51 }, - { 4, 15, 1.80, +57, 27, 37.1, 6.08 }, - { 18, 53, 46.30, +57, 29, 12.8, 6.22 }, - { 21, 38, 57.60, +57, 29, 21.1, 5.62 }, - { 23, 54, 22.99, +57, 29, 57.8, 4.54 }, - { 2, 18, 4.49, +57, 31, .1, 5.98 }, - { 19, 53, 17.40, +57, 31, 25.0, 5.14 }, - { 1, 44, 17.90, +57, 32, 11.0, 6.21 }, - { 5, 23, 27.79, +57, 32, 39.8, 5.28 }, - { 17, 33, 31.70, +57, 33, 32.0, 6.17 }, - { 6, 57, 13.20, +57, 33, 47.9, 6.05 }, - { 20, 45, 21.10, +57, 34, 46.9, 4.51 }, - { 4, 27, .91, +57, 35, 7.1, 6.32 }, - { 19, 20, 16.10, +57, 38, 43.1, 5.91 }, - { 2, 11, 28.99, +57, 38, 44.9, 6.36 }, - { 21, 59, 22.99, +57, 39, 29.9, 6.59 }, - { 19, 13, 55.20, +57, 42, 18.0, 4.99 }, - { 8, 20, 26.09, +57, 44, 35.9, 5.89 }, - { 19, 21, 25.39, +57, 46, .8, 6.43 }, - { 18, 56, 45.00, +57, 48, 54.0, 5.66 }, - { 0, 49, 6.00, +57, 48, 56.9, 3.44 }, - { 4, 17, 8.21, +57, 51, 38.2, 5.71 }, - { 12, 20, 50.81, +57, 51, 50.0, 5.55 }, - { 3, 33, 41.21, +57, 52, 8.0, 6.37 }, - { 17, 30, 43.80, +57, 52, 35.0, 6.40 }, - { 2, 17, 59.90, +57, 53, 58.9, 5.75 }, - { 15, 39, 9.50, +57, 55, 27.8, 6.45 }, - { 16, 9, 2.90, +57, 56, 16.1, 6.33 }, - { 11, 40, 27.41, +57, 58, 14.2, 6.37 }, - { 3, 53, 43.30, +57, 58, 30.0, 5.80 }, - { 1, 38, 7.61, +57, 58, 39.0, 5.56 }, - { 0, 56, 12.91, +57, 59, 48.1, 6.21 }, - { 22, 2, 4.61, +58, 0, 2.2, 5.56 }, - { 19, 43, 14.59, +58, 0, 59.0, 6.22 }, - { 19, 25, 46.70, +58, 1, 37.9, 6.60 }, - { 5, 19, 27.79, +58, 7, 1.9, 6.13 }, - { 1, 23, 21.60, +58, 8, 35.2, 6.45 }, - { 6, 30, 47.21, +58, 9, 46.1, 5.88 }, - { 22, 10, 51.29, +58, 12, 4.0, 3.35 }, - { 18, 57, 28.39, +58, 13, 31.1, 6.46 }, - { 1, 20, 4.90, +58, 13, 54.1, 4.98 }, - { 8, 10, 3.79, +58, 14, 53.2, 5.93 }, - { 19, 55, 22.10, +58, 15, 1.1, 6.09 }, - { 1, 8, 33.31, +58, 15, 49.0, 5.79 }, - { 2, 51, 45.50, +58, 18, 52.9, 6.45 }, - { 1, 33, 25.80, +58, 19, 39.0, 5.70 }, - { 12, 29, 57.31, +58, 24, 20.9, 5.35 }, - { 22, 29, 10.30, +58, 24, 55.1, 3.75 }, - { 6, 26, 48.91, +58, 25, 1.9, 5.21 }, - { 6, 57, 16.49, +58, 25, 21.0, 4.35 }, - { 2, 8, 40.51, +58, 25, 25.0, 5.67 }, - { 0, 6, 16.01, +58, 26, 12.1, 5.96 }, - { 22, 47, 23.21, +58, 28, 58.1, 6.36 }, - { 13, 50, 27.70, +58, 32, 21.8, 6.46 }, - { 23, 30, 1.99, +58, 32, 56.0, 4.91 }, - { 2, 13, 41.50, +58, 33, 40.0, 6.44 }, - { 23, 3, 21.60, +58, 33, 52.9, 6.43 }, - { 16, 1, 53.30, +58, 33, 55.1, 4.01 }, - { 21, 17, 18.79, +58, 36, 42.1, 6.42 }, - { 21, 19, 15.79, +58, 37, 25.0, 5.66 }, - { 1, 42, 17.81, +58, 37, 40.1, 6.37 }, - { 17, 26, 4.90, +58, 39, 6.8, 6.51 }, - { 23, 47, 3.50, +58, 39, 6.8, 4.87 }, - { 7, 43, .41, +58, 42, 37.1, 4.99 }, - { 0, 42, 31.10, +58, 45, 11.9, 6.17 }, - { 3, 33, 32.11, +58, 45, 54.0, 6.40 }, - { 12, 30, 4.30, +58, 46, 3.0, 6.08 }, - { 21, 43, 30.41, +58, 46, 48.0, 4.08 }, - { 18, 23, 54.50, +58, 48, 2.2, 4.98 }, - { 22, 7, 9.60, +58, 50, 26.9, 6.32 }, - { 19, 55, 55.39, +58, 50, 46.0, 4.96 }, - { 3, 29, 54.89, +58, 52, 43.0, 4.54 }, - { 15, 55, 49.70, +58, 54, 42.1, 6.31 }, - { 6, 9, 59.09, +58, 56, 8.9, 5.36 }, - { 23, 49, 12.00, +58, 57, 47.2, 6.33 }, - { 5, 52, 17.40, +58, 57, 51.1, 6.14 }, - { 15, 24, 55.80, +58, 57, 58.0, 3.29 }, - { 5, 6, 8.50, +58, 58, 21.0, 5.08 }, - { 0, 55, .10, +58, 58, 22.1, 4.83 }, - { 6, 19, 37.39, +59, 0, 38.9, 4.48 }, - { 5, 6, 12.19, +59, 1, 16.0, 6.08 }, - { 9, 50, 59.40, +59, 2, 19.0, 3.80 }, - { 8, 1, 20.71, +59, 2, 51.0, 5.77 }, - { 8, 53, 5.90, +59, 3, 22.0, 6.25 }, - { 22, 11, 56.90, +59, 5, 4.9, 6.30 }, - { 0, 9, 10.70, +59, 8, 58.9, 2.27 }, - { 4, 4, 27.19, +59, 9, 20.2, 5.06 }, - { 0, 56, 39.79, +59, 10, 52.0, 4.63 }, - { 1, 33, 55.90, +59, 13, 54.8, 4.71 }, - { 21, 42, 45.41, +59, 16, 16.0, 6.08 }, - { 14, 51, 26.40, +59, 17, 38.0, 5.46 }, - { 10, 51, 23.71, +59, 19, 12.0, 5.58 }, - { 23, 9, 44.09, +59, 19, 59.2, 5.70 }, - { 14, 8, 46.01, +59, 20, 16.1, 6.46 }, - { 9, 6, 43.10, +59, 20, 39.8, 6.45 }, - { 3, 30, 11.30, +59, 21, 58.0, 6.13 }, - { 6, 22, 3.60, +59, 22, 19.9, 5.94 }, - { 18, 51, 12.10, +59, 23, 17.9, 4.66 }, - { 6, 5, 8.30, +59, 23, 35.2, 6.34 }, - { 5, 15, 11.30, +59, 24, 20.2, 6.15 }, - { 16, 3, 9.31, +59, 24, 38.9, 6.19 }, - { 22, 11, 30.70, +59, 24, 51.8, 5.04 }, - { 23, 6, 36.89, +59, 25, 10.9, 4.85 }, - { 20, 59, 25.39, +59, 26, 19.0, 5.51 }, - { 6, 46, 14.09, +59, 26, 30.1, 4.87 }, - { 6, 53, 5.09, +59, 26, 55.0, 5.33 }, - { 12, 36, 23.30, +59, 29, 12.8, 5.50 }, - { 4, 43, 18.10, +59, 31, 14.9, 6.50 }, - { 18, 27, 42.29, +59, 32, 57.1, 6.43 }, - { 0, 0, 30.89, +59, 33, 34.9, 6.19 }, - { 8, 17, 50.40, +59, 34, 16.0, 5.64 }, - { 0, 46, 42.41, +59, 34, 27.8, 6.39 }, - { 20, 25, 5.09, +59, 36, .0, 6.44 }, - { 4, 22, 57.89, +59, 36, 59.0, 6.19 }, - { 7, 15, 54.91, +59, 38, 15.0, 5.20 }, - { 19, 53, 35.40, +59, 42, 32.0, 6.06 }, - { 13, 2, 40.39, +59, 42, 58.0, 6.53 }, - { 23, 7, 10.39, +59, 43, 39.0, 6.40 }, - { 21, 27, 25.30, +59, 45, .0, 6.10 }, - { 16, 17, 15.31, +59, 45, 18.0, 5.40 }, - { 7, 6, 1.30, +59, 48, 6.8, 6.44 }, - { 22, 59, 9.00, +59, 48, 52.9, 6.43 }, - { 5, 54, 57.79, +59, 53, 17.9, 5.20 }, - { 7, 22, 17.21, +59, 54, 6.8, 6.35 }, - { 4, 9, 27.60, +59, 54, 29.2, 6.28 }, - { 8, 39, 10.20, +59, 56, 21.8, 6.48 }, - { 3, 29, 4.10, +59, 56, 25.1, 4.21 }, - { 13, 28, 27.10, +59, 56, 44.9, 5.40 }, - { 3, 42, 42.70, +59, 58, 9.8, 5.76 }, - { 0, 30, 19.90, +59, 58, 37.9, 5.94 }, - { 23, 48, 53.90, +59, 58, 44.0, 6.34 }, - { 10, 15, 7.70, +59, 59, 8.2, 6.25 }, - { 21, 11, 48.19, +59, 59, 11.0, 5.64 }, - { 6, 15, 40.61, +59, 59, 57.1, 5.35 }, - { 23, 57, 33.50, +60, 1, 25.0, 6.47 }, - { 3, 35, .79, +60, 2, 28.0, 6.46 }, - { 17, 25, 41.30, +60, 2, 53.9, 5.65 }, - { 22, 53, 3.79, +60, 6, 4.0, 6.01 }, - { 23, 22, 32.50, +60, 8, 1.0, 5.56 }, - { 19, 33, 10.10, +60, 9, 31.0, 6.29 }, - { 15, 1, 27.10, +60, 12, 15.8, 5.93 }, - { 14, 31, 42.79, +60, 13, 32.2, 6.27 }, - { 1, 25, 49.01, +60, 14, 7.1, 2.68 }, - { 3, 28, 23.59, +60, 15, 20.2, 6.49 }, - { 12, 48, 39.41, +60, 19, 12.0, 5.85 }, - { 8, 1, 42.41, +60, 19, 27.8, 6.01 }, - { 0, 36, 27.31, +60, 19, 34.0, 5.79 }, - { 0, 56, 47.09, +60, 21, 46.1, 5.55 }, - { 8, 15, 50.50, +60, 22, 50.2, 6.45 }, - { 18, 11, 7.10, +60, 24, 33.8, 6.49 }, - { 5, 3, 25.10, +60, 26, 31.9, 4.03 }, - { 23, 3, 23.71, +60, 26, 43.1, 6.74 }, - { 21, 30, 59.30, +60, 27, 33.8, 5.53 }, - { 20, 40, 17.90, +60, 30, 19.1, 6.01 }, - { 19, 40, 13.01, +60, 30, 25.9, 6.51 }, - { 1, 43, 19.70, +60, 33, 4.0, 5.78 }, - { 20, 42, 39.70, +60, 36, 5.0, 6.15 }, - { 8, 22, 44.09, +60, 37, 52.0, 6.41 }, - { 20, 13, 27.70, +60, 38, 26.2, 5.79 }, - { 17, 1, 16.70, +60, 38, 57.1, 6.13 }, - { 15, 27, 51.41, +60, 40, 13.1, 5.90 }, - { 17, 16, 29.40, +60, 40, 14.2, 6.32 }, - { 21, 47, 25.30, +60, 41, 34.1, 5.52 }, - { 0, 56, 42.50, +60, 43, .1, 2.47 }, - { 8, 30, 15.91, +60, 43, 5.2, 3.36 }, - { 4, 21, 47.59, +60, 44, 8.2, 5.39 }, - { 21, 20, 33.50, +60, 45, 24.8, 6.11 }, - { 22, 12, 1.90, +60, 45, 33.8, 5.35 }, - { 16, 32, 25.70, +60, 49, 23.9, 5.94 }, - { 1, 42, 3.00, +61, 2, 17.9, 6.71 }, - { 18, 44, 18.19, +61, 2, 53.2, 5.99 }, - { 1, 3, 37.01, +61, 4, 30.0, 5.92 }, - { 5, 1, 35.90, +61, 4, 41.2, 6.03 }, - { 11, 32, 20.81, +61, 4, 57.0, 5.48 }, - { 3, 57, 8.30, +61, 6, 32.0, 5.00 }, - { 9, 55, 3.41, +61, 6, 58.0, 6.27 }, - { 21, 45, 26.90, +61, 7, 14.9, 4.29 }, - { 0, 53, 4.10, +61, 7, 27.1, 4.82 }, - { 12, 43, 4.20, +61, 9, 20.2, 6.38 }, - { 5, 6, 29.69, +61, 10, 12.0, 6.04 }, - { 0, 1, 36.91, +61, 13, 23.2, 5.55 }, - { 14, 42, 3.19, +61, 15, 42.8, 6.25 }, - { 21, 49, 19.01, +61, 16, 22.1, 6.17 }, - { 0, 5, 6.19, +61, 18, 51.1, 5.80 }, - { 1, 42, 58.39, +61, 25, 18.1, 6.34 }, - { 9, 14, 20.59, +61, 25, 23.9, 5.13 }, - { 11, 58, 20.59, +61, 27, 52.9, 6.76 }, - { 5, 44, 8.59, +61, 28, 36.1, 6.15 }, - { 6, 37, 41.40, +61, 28, 52.0, 5.94 }, - { 13, 49, 45.50, +61, 29, 21.1, 5.96 }, - { 13, 57, 32.09, +61, 29, 34.1, 6.37 }, - { 16, 23, 59.50, +61, 30, 51.1, 2.74 }, - { 6, 17, 54.79, +61, 30, 55.1, 4.98 }, - { 2, 55, 56.90, +61, 31, 16.0, 5.59 }, - { 0, 16, 57.10, +61, 31, 59.9, 5.74 }, - { 21, 55, 20.69, +61, 32, 30.8, 6.13 }, - { 11, 56, 53.21, +61, 32, 57.1, 6.22 }, - { 1, 4, 19.61, +61, 34, 49.1, 5.84 }, - { 23, 42, 31.51, +61, 40, 45.8, 6.40 }, - { 16, 23, 46.99, +61, 41, 48.1, 5.67 }, - { 22, 51, 22.80, +61, 41, 48.8, 5.60 }, - { 1, 58, 33.31, +61, 41, 53.2, 6.02 }, - { 1, 13, 9.91, +61, 42, 20.9, 6.41 }, - { 11, 3, 43.70, +61, 45, 2.9, 1.79 }, - { 11, 29, 4.61, +61, 46, 41.9, 5.83 }, - { 0, 51, 16.39, +61, 48, 20.9, 6.07 }, - { 0, 24, 47.50, +61, 49, 52.0, 5.40 }, - { 20, 45, 17.40, +61, 50, 20.0, 3.43 }, - { 5, 13, 3.19, +61, 51, .0, 6.17 }, - { 4, 16, 53.59, +61, 51, 1.1, 5.70 }, - { 17, 34, 59.50, +61, 52, 30.0, 5.23 }, - { 8, 53, 22.61, +61, 57, 43.9, 5.73 }, - { 23, 16, 26.81, +61, 57, 47.2, 6.53 }, - { 23, 20, 14.30, +61, 58, 12.0, 6.45 }, - { 20, 5, 32.81, +61, 59, 44.2, 5.39 }, - { 13, 6, 22.70, +62, 2, 30.8, 6.14 }, - { 15, 22, 37.30, +62, 2, 49.9, 5.98 }, - { 20, 11, 34.90, +62, 4, 43.0, 5.75 }, - { 21, 37, 55.20, +62, 4, 54.8, 4.73 }, - { 15, 29, 21.19, +62, 5, 58.9, 6.38 }, - { 23, 20, 34.61, +62, 12, 47.2, 6.39 }, - { 23, 48, 50.21, +62, 12, 51.8, 5.43 }, - { 13, 9, 50.21, +62, 13, 45.1, 6.54 }, - { 20, 19, 36.70, +62, 15, 27.0, 5.72 }, - { 15, 27, 40.80, +62, 16, 32.2, 6.50 }, - { 22, 5, 8.90, +62, 16, 48.0, 5.11 }, - { 23, 24, 50.30, +62, 16, 58.1, 4.98 }, - { 0, 4, 13.61, +62, 17, 16.1, 5.88 }, - { 4, 7, 51.10, +62, 19, 48.0, 6.99 }, - { 18, 57, 17.40, +62, 23, 48.1, 6.45 }, - { 22, 23, .19, +62, 25, 12.0, 6.04 }, - { 21, 44, 53.30, +62, 27, 38.2, 5.95 }, - { 22, 0, 39.31, +62, 29, 17.2, 6.66 }, - { 8, 19, 17.30, +62, 30, 25.9, 5.71 }, - { 18, 37, 33.50, +62, 31, 36.1, 5.74 }, - { 19, 26, 26.50, +62, 33, 25.9, 6.38 }, - { 21, 18, 34.80, +62, 35, 8.2, 2.44 }, - { 15, 46, 40.01, +62, 35, 57.8, 5.19 }, - { 5, 20, 22.61, +62, 39, 13.0, 5.61 }, - { 5, 13, 31.30, +62, 41, 29.0, 6.50 }, - { 21, 58, 53.40, +62, 41, 53.9, 5.93 }, - { 12, 41, 33.91, +62, 42, 47.2, 6.07 }, - { 18, 40, 56.30, +62, 44, 58.9, 6.09 }, - { 1, 6, 22.80, +62, 45, 42.1, 6.54 }, - { 12, 47, 18.91, +62, 46, 50.9, 5.89 }, - { 22, 5, .50, +62, 47, 8.2, 5.27 }, - { 22, 18, 12.70, +62, 48, 15.8, 5.75 }, - { 5, 49, 4.90, +62, 48, 29.2, 6.13 }, - { 7, 46, 27.41, +62, 49, 50.2, 6.49 }, - { 17, 12, 32.59, +62, 52, 27.8, 5.56 }, - { 0, 33, .00, +62, 55, 54.1, 4.16 }, - { 12, 5, 39.70, +62, 55, 59.2, 6.13 }, - { 22, 48, 44.21, +62, 56, 17.9, 6.06 }, - { 20, 29, 34.90, +62, 59, 39.1, 4.22 }, - { 9, 31, 31.70, +63, 3, 42.8, 3.67 }, - { 5, 30, 10.20, +63, 4, 1.9, 5.42 }, - { 3, 57, 25.51, +63, 4, 19.9, 5.03 }, - { 16, 36, 55.01, +63, 4, 22.1, 6.16 }, - { 8, 2, 30.79, +63, 5, 25.1, 6.40 }, - { 22, 3, 52.90, +63, 7, 10.9, 5.29 }, - { 22, 13, 49.49, +63, 9, 45.0, 6.11 }, - { 14, 30, 46.10, +63, 11, 8.2, 6.09 }, - { 3, 42, 9.29, +63, 13, .1, 5.10 }, - { 13, 25, 59.90, +63, 15, 40.0, 6.50 }, - { 22, 12, 22.30, +63, 17, 29.0, 5.79 }, - { 21, 9, 28.90, +63, 17, 44.2, 6.54 }, - { 3, 49, 36.70, +63, 17, 49.9, 5.85 }, - { 15, 22, 38.40, +63, 20, 29.0, 5.79 }, - { 3, 46, 2.30, +63, 20, 42.0, 4.80 }, - { 11, 1, 5.81, +63, 25, 16.0, 6.39 }, - { 6, 6, 39.19, +63, 27, 13.0, 6.39 }, - { 4, 52, 5.21, +63, 30, 19.1, 5.44 }, - { 9, 10, 55.10, +63, 30, 49.0, 4.67 }, - { 19, 58, 28.70, +63, 32, 3.1, 5.96 }, - { 22, 38, 39.00, +63, 35, 3.8, 5.19 }, - { 13, 1, 46.80, +63, 36, 37.1, 6.00 }, - { 21, 56, 39.10, +63, 37, 32.2, 4.91 }, - { 23, 7, 47.71, +63, 37, 59.9, 6.26 }, - { 0, 3, 25.70, +63, 38, 30.8, 6.24 }, - { 9, 45, 55.39, +63, 39, 11.9, 6.34 }, - { 1, 54, 23.69, +63, 40, 12.0, 3.38 }, - { 12, 25, 6.41, +63, 48, 10.1, 6.32 }, - { 1, 47, 44.81, +63, 51, 7.9, 5.63 }, - { 20, 4, 44.59, +63, 53, 26.2, 6.26 }, - { 9, 25, 44.21, +63, 56, 26.9, 6.28 }, - { 20, 21, 11.40, +63, 58, 49.1, 5.69 }, - { 20, 49, 17.40, +64, 2, 31.9, 6.45 }, - { 3, 7, 19.01, +64, 3, 28.1, 5.89 }, - { 22, 28, 19.70, +64, 5, 8.2, 6.29 }, - { 0, 25, 17.90, +64, 8, 36.0, }, - { 5, 37, 15.10, +64, 9, 16.9, 6.15 }, - { 0, 6, 26.50, +64, 11, 46.0, 5.59 }, - { 1, 11, 25.61, +64, 12, 10.1, 5.55 }, - { 15, 30, 55.70, +64, 12, 31.0, 5.79 }, - { 23, 7, 57.19, +64, 13, 21.0, 6.21 }, - { 0, 50, 43.61, +64, 14, 51.0, 5.39 }, - { 10, 30, 26.59, +64, 15, 27.0, 6.12 }, - { 4, 36, 24.19, +64, 15, 42.1, 5.94 }, - { 8, 40, 12.79, +64, 19, 40.1, 4.60 }, - { 11, 22, 51.29, +64, 19, 50.2, 6.02 }, - { 2, 56, 24.79, +64, 19, 57.0, 6.24 }, - { 2, 20, 12.89, +64, 20, 13.9, 6.60 }, - { 11, 38, 49.20, +64, 20, 48.8, 6.46 }, - { 14, 4, 23.30, +64, 22, 32.9, 3.65 }, - { 2, 3, .29, +64, 23, 24.0, 5.58 }, - { 19, 19, 46.10, +64, 23, 26.9, 6.52 }, - { 18, 13, 53.81, +64, 23, 49.9, 5.03 }, - { 21, 13, 42.60, +64, 24, 14.0, 6.39 }, - { 23, 42, 20.81, +64, 30, 56.2, 6.56 }, - { 3, 24, 40.51, +64, 35, 10.0, 5.23 }, - { 16, 40, 55.10, +64, 35, 21.1, 4.83 }, - { 17, 2, 15.31, +64, 36, 2.2, 6.10 }, - { 8, 56, 37.49, +64, 36, 14.0, 5.58 }, - { 1, 59, 37.99, +64, 37, 17.0, 5.26 }, - { 22, 3, 47.40, +64, 37, 40.1, 4.29 }, - { 20, 2, 20.30, +64, 38, 3.8, 6.57 }, - { 1, 21, 5.21, +64, 39, 29.9, 6.34 }, - { 13, 27, 10.70, +64, 43, 9.8, 7.04 }, - { 13, 51, 25.90, +64, 43, 23.9, 4.65 }, - { 13, 27, 4.61, +64, 44, 8.2, 6.66 }, - { 20, 1, 28.49, +64, 49, 16.0, 5.27 }, - { 13, 41, 29.90, +64, 49, 21.0, 5.85 }, - { 9, 12, 2.60, +64, 51, 47.0, }, - { 21, 19, 22.20, +64, 52, 18.8, 5.18 }, - { 23, 48, 39.00, +64, 52, 35.0, 6.41 }, - { 2, 2, 52.70, +64, 54, 5.0, 6.00 }, - { 5, 9, 44.50, +64, 55, 9.8, 6.41 }, - { 9, 44, 36.70, +64, 59, 2.0, 6.17 }, - { 1, 11, 41.40, +65, 1, 8.0, 5.57 }, - { 8, 39, 11.71, +65, 1, 14.9, 5.64 }, - { 16, 56, 25.20, +65, 2, 21.1, 6.41 }, - { 2, 4, 40.10, +65, 6, 11.9, 6.52 }, - { 10, 18, 1.99, +65, 6, 29.9, 5.82 }, - { 10, 48, 49.99, +65, 7, 55.9, 6.39 }, - { 22, 27, 5.30, +65, 7, 55.9, 5.46 }, - { 16, 56, 1.70, +65, 8, 4.9, 4.89 }, - { 4, 20, 40.30, +65, 8, 26.2, 5.27 }, - { 8, 34, 36.19, +65, 8, 42.0, 5.47 }, - { 18, 56, 25.61, +65, 15, 29.2, 5.63 }, - { 21, 55, 31.10, +65, 19, 14.9, 5.86 }, - { 18, 31, 14.81, +65, 26, 10.0, 6.59 }, - { 12, 55, 28.49, +65, 26, 19.0, 5.24 }, - { 7, 46, 40.10, +65, 27, 20.9, 5.92 }, - { 18, 36, 13.30, +65, 29, 19.0, 6.06 }, - { 4, 6, 39.00, +65, 31, 14.9, 6.17 }, - { 3, 49, 31.20, +65, 31, 34.0, 4.47 }, - { 18, 25, 59.09, +65, 33, 49.0, 4.82 }, - { 10, 24, 7.90, +65, 33, 59.0, 4.97 }, - { 9, 50, 23.71, +65, 35, 35.9, 6.31 }, - { 10, 29, 54.31, +65, 37, 34.0, 6.32 }, - { 3, 19, 59.40, +65, 39, 7.9, 4.84 }, - { 3, 17, 31.61, +65, 39, 31.0, 6.36 }, - { 5, 42, 26.40, +65, 41, 52.1, 5.60 }, - { 19, 20, 40.10, +65, 42, 52.9, 4.59 }, - { 17, 8, 47.21, +65, 42, 52.9, 3.17 }, - { 10, 41, 56.59, +65, 42, 59.0, 5.12 }, - { 6, 12, 51.10, +65, 43, 5.9, 5.32 }, - { 2, 37, 36.10, +65, 44, 44.2, 5.78 }, - { 21, 51, 37.30, +65, 45, 10.1, 6.37 }, - { 15, 3, 57.79, +65, 55, 10.9, 6.13 }, - { 14, 57, 34.99, +65, 55, 57.0, 4.60 }, - { 19, 9, 45.79, +65, 58, 43.0, 6.25 }, - { 5, 57, 34.99, +66, 5, 46.0, 6.25 }, - { 1, 30, 52.30, +66, 5, 53.2, 6.14 }, - { 0, 2, 36.10, +66, 5, 56.0, 5.86 }, - { 0, 42, 3.41, +66, 8, 51.0, 5.83 }, - { 21, 57, 11.11, +66, 9, 22.0, 6.43 }, - { 22, 49, 40.80, +66, 12, 2.2, 3.52 }, - { 7, 27, 25.80, +66, 19, 54.1, 6.47 }, - { 4, 54, 3.00, +66, 20, 34.1, 4.29 }, - { 0, 58, 31.10, +66, 21, 7.9, 5.97 }, - { 0, 31, 25.30, +66, 31, 9.8, 6.18 }, - { 2, 14, 29.11, +66, 31, 27.8, 6.07 }, - { 12, 59, 55.10, +66, 35, 49.9, 5.32 }, - { 20, 43, 10.99, +66, 39, 27.0, 5.58 }, - { 5, 37, 16.20, +66, 41, 46.0, 6.26 }, - { 8, 48, 49.39, +66, 42, 29.2, 6.20 }, - { 0, 3, 51.91, +66, 42, 43.9, 6.29 }, - { 11, 42, 28.39, +66, 44, 42.0, 5.30 }, - { 0, 34, 24.91, +66, 45, 1.1, 6.48 }, - { 23, 46, 36.70, +66, 46, 55.9, 5.95 }, - { 12, 47, 34.39, +66, 47, 25.1, 5.43 }, - { 21, 27, 46.10, +66, 48, 33.1, 5.44 }, - { 5, 2, 50.40, +66, 49, 22.1, 6.19 }, - { 20, 17, 31.30, +66, 51, 14.0, 5.93 }, - { 9, 8, 23.59, +66, 52, 23.9, 5.14 }, - { 11, 20, 53.81, +67, 6, 2.2, 6.21 }, - { 9, 10, 23.21, +67, 8, 4.9, 4.80 }, - { 16, 12, 25.10, +67, 8, 39.1, 6.21 }, - { 0, 4, 42.00, +67, 10, .1, 5.67 }, - { 3, 46, .89, +67, 12, 6.1, 5.80 }, - { 23, 3, 32.90, +67, 12, 33.1, 5.24 }, - { 11, 9, 39.89, +67, 12, 37.1, 6.06 }, - { 9, 39, 27.91, +67, 16, 19.9, 5.94 }, - { 8, 29, 46.20, +67, 17, 51.0, 5.88 }, - { 17, 25, .19, +67, 18, 23.0, 6.43 }, - { 15, 14, 38.30, +67, 20, 48.1, 5.13 }, - { 2, 29, 4.01, +67, 24, 9.0, 4.52 }, - { 10, 45, 4.01, +67, 24, 41.0, 6.00 }, - { 6, 50, 57.10, +67, 34, 18.8, 5.14 }, - { 9, 2, 32.69, +67, 37, 46.9, 4.76 }, - { 19, 12, 33.31, +67, 39, 42.1, 3.07 }, - { 15, 10, 44.09, +67, 46, 53.0, 6.17 }, - { 23, 47, 54.79, +67, 48, 24.8, 5.04 }, - { 16, 6, 19.70, +67, 48, 37.1, 5.44 }, - { 2, 44, 49.70, +67, 49, 28.9, 5.95 }, - { 20, 2, 49.10, +67, 52, 25.0, 4.51 }, - { 20, 4, 53.30, +68, 1, 37.9, 6.28 }, - { 1, 42, 20.50, +68, 2, 35.2, 5.59 }, - { 23, 18, 37.49, +68, 6, 42.1, 4.75 }, - { 1, 25, 55.99, +68, 7, 48.0, 4.74 }, - { 17, 31, 57.89, +68, 8, 6.0, 5.05 }, - { 11, 12, 10.99, +68, 16, 18.8, 6.40 }, - { 13, 50, 59.21, +68, 18, 55.1, 6.40 }, - { 13, 16, 28.61, +68, 24, 29.2, 6.20 }, - { 19, 46, 44.69, +68, 26, 17.9, 6.34 }, - { 10, 41, 48.29, +68, 26, 35.9, 5.75 }, - { 7, 30, 52.70, +68, 27, 56.2, 5.64 }, - { 5, 52, 55.49, +68, 28, 17.0, 6.20 }, - { 8, 12, 48.79, +68, 28, 27.1, 5.32 }, - { 21, 9, 31.99, +68, 29, 25.1, 7.33 }, - { 4, 12, 51.60, +68, 30, 6.1, 6.32 }, - { 3, 51, 41.81, +68, 30, 27.0, 6.32 }, - { 16, 18, 9.41, +68, 33, 15.8, 6.41 }, - { 22, 49, .70, +68, 34, 13.1, 6.19 }, - { 14, 1, 50.59, +68, 40, 43.0, 6.34 }, - { 4, 6, 3.10, +68, 40, 48.0, 5.87 }, - { 1, 56, .00, +68, 41, 7.1, 4.99 }, - { 10, 21, 3.41, +68, 44, 51.0, 5.96 }, - { 18, 15, 16.99, +68, 45, 20.9, 5.95 }, - { 17, 36, 57.10, +68, 45, 29.2, 4.80 }, - { 16, 27, 58.99, +68, 46, 5.2, 5.00 }, - { 0, 56, 55.61, +68, 46, 34.0, 6.37 }, - { 1, 10, 39.29, +68, 46, 43.0, 5.29 }, - { 20, 20, 6.00, +68, 52, 49.1, 5.55 }, - { 6, 53, 42.19, +68, 53, 17.9, 5.12 }, - { 2, 51, 58.70, +68, 53, 19.0, 5.80 }, - { 15, 14, 51.89, +68, 56, 43.1, 6.51 }, - { 10, 43, 4.10, +69, 4, 34.0, 5.00 }, - { 16, 21, 48.70, +69, 6, 33.8, 5.25 }, - { 16, 59, 2.59, +69, 11, 11.0, 6.40 }, - { 12, 30, 6.70, +69, 12, 4.0, 4.95 }, - { 9, 42, 14.81, +69, 14, 15.0, 5.69 }, - { 15, 37, 39.10, +69, 16, 59.9, 5.62 }, - { 6, 18, 50.81, +69, 19, 10.9, 4.80 }, - { 8, 32, 53.40, +69, 19, 12.0, 6.31 }, - { 11, 36, 2.81, +69, 19, 22.1, 5.20 }, - { 0, 46, 39.00, +69, 19, 30.0, 6.33 }, - { 11, 31, 24.19, +69, 19, 52.0, 3.84 }, - { 19, 44, 18.50, +69, 20, 12.8, 5.92 }, - { 14, 12, 4.01, +69, 25, 57.0, 5.24 }, - { 18, 58, 52.61, +69, 31, 52.0, 6.52 }, - { 17, 36, 39.70, +69, 34, 14.9, 6.42 }, - { 2, 48, 55.51, +69, 38, 3.1, 6.18 }, - { 5, 9, 36.70, +69, 38, 21.8, 6.41 }, - { 19, 32, 21.60, +69, 39, 40.0, 4.68 }, - { 20, 44, 33.10, +69, 45, 6.8, 6.41 }, - { 12, 33, 28.99, +69, 47, 17.9, 3.87 }, - { 9, 34, 28.90, +69, 49, 49.1, 4.56 }, - { 10, 53, 30.70, +69, 51, 14.0, 5.93 }, - { 22, 33, 2.90, +69, 54, 49.0, 6.60 }, - { 12, 34, 43.99, +70, 1, 18.8, 4.94 }, - { 22, 10, 38.90, +70, 7, 58.1, 5.50 }, - { 21, 47, 1.01, +70, 9, 2.9, 6.29 }, - { 12, 15, 8.50, +70, 12, .0, 5.71 }, - { 1, 31, 13.80, +70, 15, 52.9, 5.81 }, - { 19, 48, 10.39, +70, 16, 4.1, 3.83 }, - { 23, 27, 16.61, +70, 21, 34.9, 5.60 }, - { 19, 58, 41.90, +70, 22, .8, 6.33 }, - { 22, 33, 16.99, +70, 22, 26.0, 6.34 }, - { 6, 28, 14.59, +70, 32, 8.2, 5.97 }, - { 21, 28, 39.60, +70, 33, 38.9, 3.23 }, - { 1, 42, 55.90, +70, 37, 21.0, 5.18 }, - { 7, 5, 51.79, +70, 43, 54.8, 6.50 }, - { 22, 26, .79, +70, 46, 14.9, 5.47 }, - { 18, 43, 10.20, +70, 47, 34.1, 6.44 }, - { 7, 1, 21.50, +70, 48, 29.2, 5.68 }, - { 3, 49, 13.80, +70, 52, 16.0, 5.44 }, - { 23, 15, 37.80, +70, 53, 17.2, 5.56 }, - { 2, 1, 57.41, +70, 54, 24.8, 4.54 }, - { 4, 50, 36.41, +70, 56, 30.1, 6.37 }, - { 1, 25, 46.51, +70, 58, 48.0, 6.49 }, - { 0, 33, 19.30, +70, 58, 54.1, 6.42 }, - { 1, 0, 31.01, +70, 58, 59.2, 6.39 }, - { 19, 31, .19, +70, 59, 21.8, 6.07 }, - { 10, 17, 50.59, +71, 3, 38.2, 6.66 }, - { 13, 37, 10.99, +71, 14, 31.9, 5.50 }, - { 18, 54, 23.90, +71, 17, 49.9, 4.82 }, - { 21, 41, 55.30, +71, 18, 41.0, 4.56 }, - { 3, 50, 21.50, +71, 19, 55.9, 4.63 }, - { 18, 20, 45.50, +71, 20, 16.1, 4.22 }, - { 21, 6, 23.30, +71, 25, 54.8, 5.87 }, - { 23, 34, 58.99, +71, 38, 31.9, 5.84 }, - { 9, 14, 3.19, +71, 39, 20.9, 6.55 }, - { 1, 16, 12.10, +71, 44, 38.0, 7.83 }, - { 6, 40, 32.21, +71, 44, 56.0, 5.92 }, - { 7, 13, 58.10, +71, 49, .1, 6.35 }, - { 3, 56, 30.19, +71, 49, 18.1, 6.34 }, - { 15, 17, 5.90, +71, 49, 26.0, 5.02 }, - { 15, 20, 43.70, +71, 50, 2.0, 3.05 }, - { 3, 30, 19.49, +71, 51, 50.0, 6.32 }, - { 12, 26, 24.19, +71, 55, 46.9, 6.24 }, - { 17, 55, 11.21, +72, 0, 18.0, 5.45 }, - { 22, 10, 15.31, +72, 6, 40.0, 6.37 }, - { 4, 13, 44.90, +72, 7, 35.0, 6.03 }, - { 17, 41, 56.30, +72, 8, 56.0, 4.58 }, - { 17, 41, 58.01, +72, 9, 24.8, 5.79 }, - { 9, 34, 53.59, +72, 12, 20.2, 5.72 }, - { 9, 42, 57.19, +72, 15, 9.0, 5.17 }, - { 21, 43, 4.01, +72, 19, 13.1, 5.17 }, - { 22, 9, 48.41, +72, 20, 28.0, 4.79 }, - { 13, 26, 8.11, +72, 23, 29.0, 5.79 }, - { 8, 20, 40.30, +72, 24, 25.9, 5.98 }, - { 2, 3, 26.09, +72, 25, 17.0, 3.98 }, - { 17, 37, 8.81, +72, 27, 20.9, 5.86 }, - { 4, 33, 30.70, +72, 31, 43.0, 5.94 }, - { 20, 30, .70, +72, 31, 54.1, 6.27 }, - { 12, 15, 41.40, +72, 33, 2.9, 6.29 }, - { 16, 31, 28.10, +72, 36, 42.8, 6.30 }, - { 0, 48, 9.10, +72, 40, 30.0, 5.87 }, - { 18, 21, 3.41, +72, 43, 58.1, 3.57 }, - { 13, 13, 31.99, +72, 47, 56.0, 6.59 }, - { 2, 38, 1.99, +72, 49, 5.9, 5.16 }, - { 9, 58, 22.80, +72, 52, 45.8, 5.83 }, - { 9, 15, 52.61, +72, 56, 46.0, 5.96 }, - { 13, 4, 49.70, +73, 1, 31.1, 6.31 }, - { 1, 38, 30.89, +73, 2, 24.0, 5.28 }, - { 10, 18, 1.10, +73, 4, 23.9, 6.40 }, - { 9, 37, 56.21, +73, 4, 50.2, 6.42 }, - { 16, 56, 16.80, +73, 7, 40.1, 6.30 }, - { 21, 59, 15.00, +73, 10, 48.0, 5.03 }, - { 5, 18, 13.30, +73, 16, 5.2, 5.74 }, - { 22, 12, 52.90, +73, 18, 25.9, 6.08 }, - { 3, 35, 12.41, +73, 20, 48.8, 6.57 }, - { 19, 15, 33.00, +73, 21, 20.2, 4.45 }, - { 16, 14, 33.50, +73, 23, 42.0, 5.98 }, - { 8, 39, 42.60, +73, 37, 46.9, 6.15 }, - { 22, 35, 46.10, +73, 38, 35.2, 5.08 }, - { 6, 37, 54.91, +73, 41, 44.2, 6.24 }, - { 5, 4, 13.01, +73, 45, 50.0, 6.66 }, - { 2, 3, 10.51, +73, 51, 2.2, 6.23 }, - { 8, 0, 11.71, +73, 55, 5.2, 5.41 }, - { 5, 12, 22.39, +73, 56, 48.1, 5.43 }, - { 23, 39, 21.10, +74, 0, 10.1, 5.98 }, - { 9, 19, 55.80, +74, 0, 59.0, 6.50 }, - { 2, 13, 21.19, +74, 1, 40.1, 6.29 }, - { 5, 4, 39.79, +74, 4, .8, 5.96 }, - { 18, 45, 46.70, +74, 5, 8.2, 5.27 }, - { 14, 50, 42.31, +74, 9, 20.2, 2.08 }, - { 23, 14, 37.30, +74, 13, 52.0, 5.84 }, - { 5, 2, 20.09, +74, 16, 9.1, 6.06 }, - { 1, 37, 22.51, +74, 18, 2.9, 6.58 }, - { 9, 36, 6.79, +74, 19, 4.1, 6.46 }, - { 3, 11, 56.30, +74, 23, 37.0, 4.87 }, - { 14, 6, 56.40, +74, 35, 37.0, 6.45 }, - { 12, 9, 47.30, +74, 39, 41.0, 6.35 }, - { 8, 36, 48.70, +74, 43, 25.0, 6.31 }, - { 0, 47, 46.10, +74, 50, 51.0, 5.41 }, - { 20, 31, 30.41, +74, 57, 16.9, 5.20 }, - { 0, 45, 39.00, +74, 59, 17.2, 5.66 }, - { 21, 57, 51.00, +74, 59, 48.1, 6.35 }, - { 5, 39, 43.70, +75, 2, 38.0, 6.17 }, - { 9, 27, 51.60, +75, 5, 53.9, 6.29 }, - { 12, 18, 49.90, +75, 9, 38.2, 5.38 }, - { 17, 54, 26.59, +75, 10, 14.9, 6.36 }, - { 16, 12, 32.21, +75, 12, 38.2, 6.39 }, - { 23, 39, 10.39, +75, 17, 34.1, 5.95 }, - { 17, 1, 40.20, +75, 17, 49.9, 6.21 }, - { 23, 17, 18.89, +75, 17, 57.1, 6.38 }, - { 22, 37, 13.01, +75, 22, 18.1, 5.79 }, - { 23, 7, 53.90, +75, 23, 15.0, 4.41 }, - { 18, 46, 22.20, +75, 26, 2.0, 5.35 }, - { 12, 58, 47.30, +75, 28, 21.0, 6.01 }, - { 23, 52, 25.10, +75, 32, 40.9, 6.39 }, - { 6, 5, 9.29, +75, 35, 8.9, 6.40 }, - { 14, 27, 31.51, +75, 41, 46.0, 4.25 }, - { 10, 35, 5.50, +75, 42, 47.2, 4.84 }, - { 3, 39, 24.79, +75, 44, 22.9, 6.27 }, - { 16, 17, 30.31, +75, 45, 19.1, 4.95 }, - { 8, 19, 32.21, +75, 45, 24.8, 5.54 }, - { 18, 53, 33.19, +75, 47, 15.0, 6.22 }, - { 16, 10, 49.51, +75, 52, 39.0, 5.48 }, - { 20, 54, 44.30, +75, 55, 32.2, 6.05 }, - { 4, 48, 50.30, +75, 56, 28.0, 6.06 }, - { 2, 5, 31.20, +76, 6, 54.0, 5.22 }, - { 22, 32, 16.20, +76, 13, 35.0, 5.68 }, - { 1, 21, 59.11, +76, 14, 20.0, 6.38 }, - { 5, 14, 35.59, +76, 28, 22.1, 6.37 }, - { 19, 59, 36.60, +76, 28, 53.0, 6.20 }, - { 22, 18, 20.40, +76, 29, 17.2, 6.66 }, - { 13, 34, 42.79, +76, 32, 48.1, 6.57 }, - { 19, 9, 9.79, +76, 33, 38.2, 5.13 }, - { 4, 46, .31, +76, 36, 40.0, 6.49 }, - { 16, 3, 31.30, +76, 47, 37.0, 5.56 }, - { 12, 5, 15.10, +76, 54, 20.9, 5.80 }, - { 0, 16, 13.99, +76, 57, 2.9, 6.35 }, - { 17, 49, 27.00, +76, 57, 46.1, 5.04 }, - { 7, 0, 4.01, +76, 58, 39.0, 4.55 }, - { 21, 15, 42.19, +77, 0, 43.9, 5.95 }, - { 0, 30, 55.01, +77, 1, 9.8, 6.21 }, - { 18, 57, 57.19, +77, 3, 2.9, 6.54 }, - { 2, 5, 7.39, +77, 16, 53.0, 5.38 }, - { 15, 31, 24.89, +77, 20, 57.8, 4.96 }, - { 16, 30, 38.81, +77, 26, 48.1, 6.34 }, - { 16, 43, 6.00, +77, 30, 51.1, 5.98 }, - { 18, 29, 44.90, +77, 32, 48.8, 5.64 }, - { 14, 8, 50.90, +77, 32, 51.0, 4.82 }, - { 1, 20, 19.49, +77, 34, 14.2, 6.31 }, - { 23, 51, 57.60, +77, 35, 57.8, 6.55 }, - { 12, 12, 11.90, +77, 36, 59.0, 5.14 }, - { 23, 39, 20.81, +77, 37, 57.0, 3.21 }, - { 20, 8, 53.30, +77, 42, 41.0, 4.39 }, - { 3, 20, 19.70, +77, 44, 4.9, 5.45 }, - { 10, 59, 56.81, +77, 46, 12.0, 6.20 }, - { 15, 44, 3.50, +77, 47, 39.8, 4.32 }, - { 2, 2, 57.19, +77, 54, 59.0, 6.04 }, - { 5, 29, 25.70, +77, 58, 39.0, 6.56 }, - { 6, 40, 28.80, +77, 59, 44.9, 5.73 }, - { 13, 42, 39.31, +78, 3, 51.8, 5.91 }, - { 21, 5, 29.30, +78, 7, 35.0, 5.91 }, - { 9, 45, 30.79, +78, 8, 4.9, 6.23 }, - { 22, 23, 41.30, +78, 14, 35.9, 6.76 }, - { 17, 50, 10.51, +78, 18, 24.1, 6.24 }, - { 13, 26, 56.71, +78, 38, 38.0, 5.77 }, - { 1, 23, 46.80, +78, 43, 32.9, 6.07 }, - { 22, 26, 42.50, +78, 47, 8.9, 5.83 }, - { 22, 29, 52.90, +78, 49, 27.1, 5.50 }, - { 16, 37, 52.90, +78, 55, 5.9, 6.32 }, - { 16, 25, 43.10, +78, 57, 50.0, 5.56 }, - { 9, 47, 18.00, +79, 8, 12.1, 6.17 }, - { 5, 22, 33.50, +79, 13, 52.0, 5.05 }, - { 3, 6, 7.80, +79, 25, 7.0, 5.49 }, - { 8, 4, 47.11, +79, 28, 46.9, 5.42 }, - { 6, 46, 14.09, +79, 33, 52.9, 5.45 }, - { 6, 40, 16.80, +79, 35, 57.8, 6.54 }, - { 19, 21, 40.20, +79, 36, 10.1, 6.05 }, - { 14, 33, 38.30, +79, 39, 37.1, 6.26 }, - { 1, 12, 16.70, +79, 40, 26.0, 5.64 }, - { 0, 9, 20.21, +79, 42, 52.9, 6.01 }, - { 1, 16, 30.70, +79, 54, 36.0, 6.26 }, - { 18, 45, 38.11, +79, 56, 33.0, 6.39 }, - { 18, 0, 3.41, +80, 0, 2.9, 6.04 }, - { 18, 0, 9.19, +80, 0, 15.1, 5.68 }, - { 1, 9, 12.31, +80, 0, 42.1, 6.29 }, - { 17, 19, 37.01, +80, 8, 11.0, 5.72 }, - { 7, 56, 17.30, +80, 15, 56.2, 6.56 }, - { 15, 29, 10.99, +80, 26, 55.0, 6.58 }, - { 13, 12, 25.39, +80, 28, 17.0, 6.25 }, - { 10, 36, 1.70, +80, 29, 39.8, 6.52 }, - { 21, 24, 49.70, +80, 31, 28.9, 5.97 }, - { 20, 47, 33.41, +80, 33, 7.9, 5.39 }, - { 12, 44, 25.99, +80, 37, 16.0, 6.40 }, - { 4, 10, 2.81, +80, 41, 55.0, 5.10 }, - { 4, 27, 2.81, +80, 49, 27.1, 5.43 }, - { 12, 0, 18.60, +80, 51, 11.2, 6.17 }, - { 7, 34, 39.70, +80, 53, 48.1, 6.41 }, - { 20, 29, 27.50, +81, 5, 29.0, 5.96 }, - { 11, 31, 50.40, +81, 7, 37.9, 6.15 }, - { 5, 0, 20.71, +81, 11, 38.0, 5.07 }, - { 21, 13, 21.50, +81, 13, 50.9, 6.15 }, - { 7, 25, 21.89, +81, 15, 27.0, 6.31 }, - { 2, 9, 25.30, +81, 17, 44.9, 6.05 }, - { 9, 37, 5.21, +81, 19, 35.0, 4.29 }, - { 20, 28, 14.59, +81, 25, 22.1, 5.46 }, - { 2, 47, 47.59, +81, 26, 53.9, 5.78 }, - { 3, 11, 42.79, +81, 28, 14.2, 5.95 }, - { 12, 11, .00, +81, 42, 36.0, 6.00 }, - { 16, 45, 58.10, +82, 2, 13.9, 4.23 }, - { 6, 44, 30.19, +82, 6, 55.1, 6.65 }, - { 7, 31, 4.39, +82, 24, 41.0, 4.96 }, - { 8, 24, 32.90, +82, 25, 50.9, 6.32 }, - { 0, 39, 47.30, +82, 29, 38.0, 6.40 }, - { 14, 50, 20.40, +82, 30, 42.8, 5.64 }, - { 20, 42, 35.21, +82, 31, 52.0, 5.75 }, - { 10, 31, 4.61, +82, 33, 31.0, 5.26 }, - { 13, 42, 23.11, +82, 45, 9.0, 5.98 }, - { 21, 58, 12.70, +82, 52, 10.9, 6.98 }, - { 22, 47, 28.99, +83, 9, 14.0, 4.74 }, - { 18, 24, 9.19, +83, 10, 31.1, 6.17 }, - { 23, 56, 27.70, +83, 11, 28.0, 6.59 }, - { 4, 30, .10, +83, 20, 26.2, 5.46 }, - { 12, 49, 13.61, +83, 24, 46.1, 5.28 }, - { 12, 49, 6.60, +83, 25, 5.2, 5.85 }, - { 19, 15, 7.80, +83, 27, 46.1, 6.53 }, - { 20, 29, 3.10, +83, 37, 32.2, 6.19 }, - { 0, 54, 53.09, +83, 42, 25.9, 5.62 }, - { 4, 28, 13.01, +83, 48, 28.1, 5.57 }, - { 10, 8, 34.30, +83, 55, 5.9, 6.37 }, - { 8, 16, 53.81, +84, 3, 28.1, 6.49 }, - { 9, 15, 21.19, +84, 10, 52.0, 6.33 }, - { 10, 29, 41.50, +84, 15, 7.9, 5.50 }, - { 22, 54, 24.79, +84, 20, 46.0, 4.71 }, - { 3, 32, 20.11, +84, 54, 40.0, 5.61 }, - { 6, 1, 20.21, +85, 10, 55.9, 6.11 }, - { 22, 51, 2.21, +85, 22, 25.0, 5.90 }, - { 12, 4, 28.10, +85, 35, 13.9, 6.27 }, - { 5, 43, 48.70, +85, 40, 5.2, 6.60 }, - { 5, 31, 48.00, +85, 56, 19.0, 6.51 }, - { 22, 13, 10.61, +86, 6, 29.2, 5.27 }, - { 1, 8, 44.71, +86, 15, 24.8, 4.25 }, - { 12, 16, 51.41, +86, 26, 10.0, 6.33 }, - { 17, 32, 12.89, +86, 35, 11.0, 4.36 }, - { 4, 10, 1.49, +86, 37, 34.0, 5.86 }, - { 17, 30, 48.00, +86, 58, 5.2, 5.79 }, - { 7, 40, 30.50, +87, 1, 12.0, 5.07 }, - { 1, 16, 13.49, +87, 8, 43.1, 6.25 }, - { 23, 27, .79, +87, 18, 27.0, 5.58 }, - { 12, 15, 20.30, +87, 42, .0, 6.28 }, - { 1, 33, 50.40, +89, 0, 56.2, 6.46 }, - { 17, 16, 56.81, +89, 2, 16.1, 6.38 }, - { 2, 31, 48.70, +89, 15, 51.1, 2.02 }, -}; - diff --git a/extern/caelum/src/CaelumDefaultTypeDescriptorData.cpp b/extern/caelum/src/CaelumDefaultTypeDescriptorData.cpp deleted file mode 100644 index d3d29e5e0..000000000 --- a/extern/caelum/src/CaelumDefaultTypeDescriptorData.cpp +++ /dev/null @@ -1,462 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2008 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -#include "CaelumPrecompiled.h" -#include "CaelumPrerequisites.h" - -#if CAELUM_TYPE_DESCRIPTORS - -#include "TypeDescriptor.h" -#include "CaelumSystem.h" -#include "FlatCloudLayer.h" - -using namespace Ogre; - -namespace Caelum -{ - CaelumDefaultTypeDescriptorData::CaelumDefaultTypeDescriptorData (): - CaelumSystemTypeDescriptor(0), - PointStarfieldTypeDescriptor(0), - BaseSkyLightTypeDescriptor(0), - GroundFogTypeDescriptor(0), - PrecipitationTypeDescriptor(0), - DepthComposerTypeDescriptor(0), - FlatCloudLayerTypeDescriptor(0), - SkyDomeTypeDescriptor(0) - { - try { - load (); - } catch (...) { - unload (); - throw; - } - } - - CaelumDefaultTypeDescriptorData::~CaelumDefaultTypeDescriptorData () - { - unload (); - } - - template - inline void delete_zero(T*& member) { - // Remember: delete 0 is a legal no-op. - delete member; - member = 0; - } - - void CaelumDefaultTypeDescriptorData::unload () - { - delete_zero(CaelumSystemTypeDescriptor); - delete_zero(PointStarfieldTypeDescriptor); - delete_zero(BaseSkyLightTypeDescriptor); - delete_zero(GroundFogTypeDescriptor); - delete_zero(PrecipitationTypeDescriptor); - delete_zero(DepthComposerTypeDescriptor); - delete_zero(FlatCloudLayerTypeDescriptor); - delete_zero(SkyDomeTypeDescriptor); - } - - void CaelumDefaultTypeDescriptorData::load () - { - if (!CaelumSystemTypeDescriptor) - { - std::auto_ptr td (new DefaultTypeDescriptor ()); - - // Timing settings. - td->add("time_scale", - new AccesorPropertyDescriptor( - &Caelum::CaelumSystem::getTimeScale, - &Caelum::CaelumSystem::setTimeScale)); - td->add("julian_day", - new AccesorPropertyDescriptor( - &Caelum::CaelumSystem::getJulianDay, - &Caelum::CaelumSystem::setJulianDay)); - - // Latitude/longitude - td->add("latitude", - new AccesorPropertyDescriptor( - &Caelum::CaelumSystem::getObserverLatitude, - &Caelum::CaelumSystem::setObserverLatitude)); - td->add("longitude", - new AccesorPropertyDescriptor( - &Caelum::CaelumSystem::getObserverLongitude, - &Caelum::CaelumSystem::setObserverLongitude)); - - // Fog settings. - td->add("global_fog_density_multiplier", - new AccesorPropertyDescriptor( - &Caelum::CaelumSystem::getGlobalFogDensityMultiplier, - &Caelum::CaelumSystem::setGlobalFogDensityMultiplier)); - td->add("global_fog_colour_multiplier", - new AccesorPropertyDescriptor( - &Caelum::CaelumSystem::getGlobalFogColourMultiplier, - &Caelum::CaelumSystem::setGlobalFogColourMultiplier)); - td->add("manage_scene_fog", - new AccesorPropertyDescriptor( - &Caelum::CaelumSystem::getManageSceneFog, - &Caelum::CaelumSystem::setManageSceneFog)); - td->add("scene_fog_density_multiplier", - new AccesorPropertyDescriptor( - &Caelum::CaelumSystem::getSceneFogDensityMultiplier, - &Caelum::CaelumSystem::setSceneFogDensityMultiplier)); - td->add("scene_fog_colour_multiplier", - new AccesorPropertyDescriptor( - &Caelum::CaelumSystem::getSceneFogColourMultiplier, - &Caelum::CaelumSystem::setSceneFogColourMultiplier)); - td->add("ground_fog_density_multiplier", - new AccesorPropertyDescriptor( - &Caelum::CaelumSystem::getGroundFogDensityMultiplier, - &Caelum::CaelumSystem::setGroundFogDensityMultiplier)); - td->add("ground_fog_colour_multiplier", - new AccesorPropertyDescriptor( - &Caelum::CaelumSystem::getGroundFogColourMultiplier, - &Caelum::CaelumSystem::setGroundFogColourMultiplier)); - - // Lighting settings. - td->add("manage_ambient_light", - new AccesorPropertyDescriptor( - &Caelum::CaelumSystem::getManageAmbientLight, - &Caelum::CaelumSystem::setManageAmbientLight)); - td->add("minimum_ambient_light", - new AccesorPropertyDescriptor( - &Caelum::CaelumSystem::getMinimumAmbientLight, - &Caelum::CaelumSystem::setMinimumAmbientLight)); - td->add("ensure_single_light_source", - new AccesorPropertyDescriptor( - &Caelum::CaelumSystem::getEnsureSingleLightSource, - &Caelum::CaelumSystem::setEnsureSingleLightSource)); - td->add("ensure_single_shadow_source", - new AccesorPropertyDescriptor( - &Caelum::CaelumSystem::getEnsureSingleShadowSource, - &Caelum::CaelumSystem::setEnsureSingleShadowSource)); - - CaelumSystemTypeDescriptor = td.release (); - } - - if (!PointStarfieldTypeDescriptor) - { - std::auto_ptr td (new DefaultTypeDescriptor ()); - td->add("magnitude_scale", - new AccesorPropertyDescriptor( - &Caelum::PointStarfield::getMagnitudeScale, - &Caelum::PointStarfield::setMagnitudeScale)); - td->add("mag0_pixel_size", - new AccesorPropertyDescriptor( - &Caelum::PointStarfield::getMag0PixelSize, - &Caelum::PointStarfield::setMag0PixelSize)); - td->add("min_pixel_size", - new AccesorPropertyDescriptor( - &Caelum::PointStarfield::getMinPixelSize, - &Caelum::PointStarfield::setMinPixelSize)); - td->add("max_pixel_size", - new AccesorPropertyDescriptor( - &Caelum::PointStarfield::getMaxPixelSize, - &Caelum::PointStarfield::setMaxPixelSize)); - td->add("latitude", - new AccesorPropertyDescriptor( - &Caelum::PointStarfield::getObserverLatitude, - &Caelum::PointStarfield::setObserverLatitude)); - td->add("longitude", - new AccesorPropertyDescriptor( - &Caelum::PointStarfield::getObserverLongitude, - &Caelum::PointStarfield::setObserverLongitude)); - td->add("observer_position_rebuild_delta", - new AccesorPropertyDescriptor( - &Caelum::PointStarfield::getObserverPositionRebuildDelta, - &Caelum::PointStarfield::setObserverPositionRebuildDelta)); - PointStarfieldTypeDescriptor = td.release (); - } - - if (!BaseSkyLightTypeDescriptor) - { - std::auto_ptr td (new DefaultTypeDescriptor ()); - td->add("ambient_multiplier", - new AccesorPropertyDescriptor( - &Caelum::BaseSkyLight::getAmbientMultiplier, - &Caelum::BaseSkyLight::setAmbientMultiplier)); - td->add("specular_multiplier", - new AccesorPropertyDescriptor( - &Caelum::BaseSkyLight::getSpecularMultiplier, - &Caelum::BaseSkyLight::setSpecularMultiplier)); - td->add("diffuse_multiplier", - new AccesorPropertyDescriptor( - &Caelum::BaseSkyLight::getDiffuseMultiplier, - &Caelum::BaseSkyLight::setDiffuseMultiplier)); - td->add("light_colour", - new AccesorPropertyDescriptor( - &Caelum::BaseSkyLight::getLightColour, - &Caelum::BaseSkyLight::setLightColour)); - td->add("body_colour", - new AccesorPropertyDescriptor( - &Caelum::BaseSkyLight::getBodyColour, - &Caelum::BaseSkyLight::setBodyColour)); - td->add("auto_disable_threshold", - new AccesorPropertyDescriptor( - &Caelum::BaseSkyLight::getAutoDisableThreshold, - &Caelum::BaseSkyLight::setAutoDisableThreshold)); - td->add("auto_disable", - new AccesorPropertyDescriptor( - &Caelum::BaseSkyLight::getAutoDisable, - &Caelum::BaseSkyLight::setAutoDisable)); - BaseSkyLightTypeDescriptor = td.release (); - } - - if (!GroundFogTypeDescriptor) - { - std::auto_ptr td (new DefaultTypeDescriptor ()); - td->add("density", - new AccesorPropertyDescriptor( - &Caelum::GroundFog::getDensity, - &Caelum::GroundFog::setDensity)); - td->add("vertical_decay", - new AccesorPropertyDescriptor( - &Caelum::GroundFog::getVerticalDecay, - &Caelum::GroundFog::setVerticalDecay)); - td->add("ground_level", - new AccesorPropertyDescriptor( - &Caelum::GroundFog::getGroundLevel, - &Caelum::GroundFog::setGroundLevel)); - td->add("colour", - new AccesorPropertyDescriptor( - &Caelum::GroundFog::getColour, - &Caelum::GroundFog::setColour)); - GroundFogTypeDescriptor = td.release (); - } - - if (!DepthComposerTypeDescriptor) - { - std::auto_ptr td (new DefaultTypeDescriptor ()); - td->add("debug_depth_render", - new AccesorPropertyDescriptor( - &Caelum::DepthComposer::getDebugDepthRender, - &Caelum::DepthComposer::setDebugDepthRender)); - - // Legacy haze - td->add("haze_enabled", - new AccesorPropertyDescriptor( - &Caelum::DepthComposer::getSkyDomeHazeEnabled, - &Caelum::DepthComposer::setSkyDomeHazeEnabled)); - td->add("haze_colour", - new AccesorPropertyDescriptor( - &Caelum::DepthComposer::getHazeColour, - &Caelum::DepthComposer::setHazeColour)); - td->add("haze_sun_direction", - new AccesorPropertyDescriptor( - &Caelum::DepthComposer::getSunDirection, - &Caelum::DepthComposer::setSunDirection)); - - // Ground fog - td->add("ground_fog_enabled", - new AccesorPropertyDescriptor( - &Caelum::DepthComposer::getGroundFogEnabled, - &Caelum::DepthComposer::setGroundFogEnabled)); - td->add("ground_fog_density", - new AccesorPropertyDescriptor( - &Caelum::DepthComposer::getGroundFogDensity, - &Caelum::DepthComposer::setGroundFogDensity)); - td->add("ground_fog_vertical_decay", - new AccesorPropertyDescriptor( - &Caelum::DepthComposer::getGroundFogVerticalDecay, - &Caelum::DepthComposer::setGroundFogVerticalDecay)); - td->add("ground_fog_base_level", - new AccesorPropertyDescriptor( - &Caelum::DepthComposer::getGroundFogBaseLevel, - &Caelum::DepthComposer::setGroundFogBaseLevel)); - td->add("ground_fog_colour", - new AccesorPropertyDescriptor( - &Caelum::DepthComposer::getGroundFogColour, - &Caelum::DepthComposer::setGroundFogColour)); - - DepthComposerTypeDescriptor = td.release (); - } - - if (!PrecipitationTypeDescriptor) - { - std::auto_ptr td (new DefaultTypeDescriptor ()); - - td->add("texture", - new AccesorPropertyDescriptor( - &Caelum::PrecipitationController::getTextureName, - &Caelum::PrecipitationController::setTextureName)); - td->add("precipitation_colour", - new AccesorPropertyDescriptor( - &Caelum::PrecipitationController::getColour, - &Caelum::PrecipitationController::setColour)); - td->add("falling_speed", - new AccesorPropertyDescriptor( - &Caelum::PrecipitationController::getSpeed, - &Caelum::PrecipitationController::setSpeed)); - td->add("wind_speed", - new AccesorPropertyDescriptor( - &Caelum::PrecipitationController::getWindSpeed, - &Caelum::PrecipitationController::setWindSpeed)); - td->add("camera_speed_scale", - new AccesorPropertyDescriptor( - &Caelum::PrecipitationController::getCameraSpeedScale, - &Caelum::PrecipitationController::setCameraSpeedScale)); - td->add("intensity", - new AccesorPropertyDescriptor( - &Caelum::PrecipitationController::getIntensity, - &Caelum::PrecipitationController::setIntensity)); - td->add("auto_disable_intensity", - new AccesorPropertyDescriptor( - &Caelum::PrecipitationController::getAutoDisableThreshold, - &Caelum::PrecipitationController::setAutoDisableThreshold)); - td->add("falling_direction", - new AccesorPropertyDescriptor( - &Caelum::PrecipitationController::getFallingDirection, - &Caelum::PrecipitationController::setFallingDirection)); - - PrecipitationTypeDescriptor = td.release (); - } - - if (!FlatCloudLayerTypeDescriptor) - { - std::auto_ptr td (new DefaultTypeDescriptor ()); - - // Height. - td->add("height", - new AccesorPropertyDescriptor( - &Caelum::FlatCloudLayer::getHeight, - &Caelum::FlatCloudLayer::setHeight)); - - // Coverage parameters. - td->add("coverage", - new AccesorPropertyDescriptor( - &Caelum::FlatCloudLayer::getCloudCover, - &Caelum::FlatCloudLayer::setCloudCover)); - td->add("cloud_cover_visibility_threshold", - new AccesorPropertyDescriptor( - &Caelum::FlatCloudLayer::getCloudCoverVisibilityThreshold, - &Caelum::FlatCloudLayer::setCloudCoverVisibilityThreshold)); - td->add("cloud_cover_lookup", - new AccesorPropertyDescriptor( - &Caelum::FlatCloudLayer::getCloudCoverLookupFileName, - &Caelum::FlatCloudLayer::setCloudCoverLookup)); - - // Overwritten by CaelumSystem; included for completeness. - td->add("sun_direction", - new AccesorPropertyDescriptor( - &Caelum::FlatCloudLayer::getSunDirection, - &Caelum::FlatCloudLayer::setSunDirection)); - td->add("sun_light_colour", - new AccesorPropertyDescriptor( - &Caelum::FlatCloudLayer::getSunLightColour, - &Caelum::FlatCloudLayer::setSunLightColour)); - td->add("sun_sphere_colour", - new AccesorPropertyDescriptor( - &Caelum::FlatCloudLayer::getSunSphereColour, - &Caelum::FlatCloudLayer::setSunSphereColour)); - td->add("fog_colour", - new AccesorPropertyDescriptor( - &Caelum::FlatCloudLayer::getFogColour, - &Caelum::FlatCloudLayer::setFogColour)); - - // Moving noise textures. - td->add("cloud_speed", - new AccesorPropertyDescriptor( - &Caelum::FlatCloudLayer::getCloudSpeed, - &Caelum::FlatCloudLayer::setCloudSpeed)); - - // Blending time between noise textures. - td->add("blend_time", - new AccesorPropertyDescriptor( - &Caelum::FlatCloudLayer::getCloudBlendTime, - &Caelum::FlatCloudLayer::setCloudBlendTime)); - - // Mesh properties - td->add("mesh_width", - new AccesorPropertyDescriptor( - &Caelum::FlatCloudLayer::getMeshWidth, - &Caelum::FlatCloudLayer::setMeshWidth)); - td->add("mesh_height", - new AccesorPropertyDescriptor( - &Caelum::FlatCloudLayer::getMeshHeight, - &Caelum::FlatCloudLayer::setMeshHeight)); - td->add("mesh_width_segments", - new AccesorPropertyDescriptor( - &Caelum::FlatCloudLayer::getMeshWidthSegments, - &Caelum::FlatCloudLayer::setMeshWidthSegments)); - td->add("mesh_height_segments", - new AccesorPropertyDescriptor( - &Caelum::FlatCloudLayer::getMeshHeightSegments, - &Caelum::FlatCloudLayer::setMeshHeightSegments)); - - // Misc hacks - td->add("cloud_uv_factor", - new AccesorPropertyDescriptor( - &Caelum::FlatCloudLayer::getCloudUVFactor, - &Caelum::FlatCloudLayer::setCloudUVFactor)); - td->add("height_red_factor", - new AccesorPropertyDescriptor( - &Caelum::FlatCloudLayer::getHeightRedFactor, - &Caelum::FlatCloudLayer::setHeightRedFactor)); - - // Fading - td->add("near_fade_dist", - new AccesorPropertyDescriptor( - &Caelum::FlatCloudLayer::getNearFadeDist, - &Caelum::FlatCloudLayer::setNearFadeDist)); - td->add("far_fade_dist", - new AccesorPropertyDescriptor( - &Caelum::FlatCloudLayer::getFarFadeDist, - &Caelum::FlatCloudLayer::setFarFadeDist)); - td->add("fade_dist_measurement_vector", - new AccesorPropertyDescriptor( - &Caelum::FlatCloudLayer::getFadeDistMeasurementVector, - &Caelum::FlatCloudLayer::setFadeDistMeasurementVector)); - - FlatCloudLayerTypeDescriptor = td.release (); - } - - if (!SkyDomeTypeDescriptor) - { - std::auto_ptr td (new DefaultTypeDescriptor ()); - - // SkyDome is slightly special because most properties are write-only. - - // Reset by CaelumSystem every frame anyway - td->add("sun_direction", - new AccesorPropertyDescriptor( - 0, &Caelum::SkyDome::setSunDirection)); - td->add("haze_colour", - new AccesorPropertyDescriptor( - 0, &Caelum::SkyDome::setHazeColour)); - - // Different files not supported anyway - td->add("sky_gradients_image", - new AccesorPropertyDescriptor( - 0, &Caelum::SkyDome::setSkyGradientsImage)); - td->add("atmosphere_depth_image", - new AccesorPropertyDescriptor( - 0, &Caelum::SkyDome::setAtmosphereDepthImage)); - - // This does actually make sense. - td->add("haze_enabled", - new AccesorPropertyDescriptor( - &Caelum::SkyDome::getHazeEnabled, - &Caelum::SkyDome::setHazeEnabled)); - - SkyDomeTypeDescriptor = td.release (); - } - } -} - -#endif // CAELUM_TYPE_DESCRIPTORS diff --git a/extern/caelum/src/CaelumPlugin.cpp b/extern/caelum/src/CaelumPlugin.cpp deleted file mode 100644 index 288ad9220..000000000 --- a/extern/caelum/src/CaelumPlugin.cpp +++ /dev/null @@ -1,162 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2008 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -#include "CaelumPrecompiled.h" -#include "CaelumPlugin.h" - -template<> Caelum::CaelumPlugin* Ogre::Singleton::ms_Singleton = 0; - -namespace Caelum -{ - CaelumPlugin* CaelumPlugin::getSingletonPtr () { - return ms_Singleton; - } - - CaelumPlugin& CaelumPlugin::getSingleton () { - assert (ms_Singleton); - return *ms_Singleton; - } - - extern "C" void CAELUM_EXPORT dllStartPlugin () { - assert (CaelumPlugin::getSingletonPtr () == 0); - CaelumPlugin* plugin = new CaelumPlugin(); - assert (CaelumPlugin::getSingletonPtr () == plugin); - Ogre::Root::getSingleton ().installPlugin (CaelumPlugin::getSingletonPtr ()); - } - - extern "C" void CAELUM_EXPORT dllStopPlugin () { - assert (CaelumPlugin::getSingletonPtr () != 0); - Ogre::Root::getSingleton ().uninstallPlugin (CaelumPlugin::getSingletonPtr ()); - delete CaelumPlugin::getSingletonPtr (); - assert (CaelumPlugin::getSingletonPtr () == 0); - } - -#if CAELUM_SCRIPT_SUPPORT - CaelumPlugin::CaelumPlugin(): mScriptTranslatorManager(&mTypeDescriptorData) -#else - CaelumPlugin::CaelumPlugin() -#endif - { - mIsInstalled = false; - } - - CaelumPlugin::~CaelumPlugin() { - } - - const Ogre::String CaelumPlugin::CAELUM_PLUGIN_NAME = "Caelum"; - - const Ogre::String& CaelumPlugin::getName () const { - return CAELUM_PLUGIN_NAME; - } - - void CaelumPlugin::install () - { - assert(!mIsInstalled && "Already installed"); - - Ogre::LogManager::getSingleton ().logMessage("Caelum plugin version " + - Ogre::StringConverter::toString (CAELUM_VERSION_MAIN) + "." + - Ogre::StringConverter::toString (CAELUM_VERSION_SEC) + "." + - Ogre::StringConverter::toString (CAELUM_VERSION_TER) + " " - "installed"); - -#if CAELUM_SCRIPT_SUPPORT - Ogre::ScriptCompilerManager::getSingleton ().addTranslatorManager ( - getScriptTranslatorManager ()); - Ogre::ResourceGroupManager::getSingleton()._registerResourceManager ( - getPropScriptResourceManager ()->getResourceType (), - getPropScriptResourceManager ()); - - getScriptTranslatorManager()->_setPropScriptResourceManager ( - &mPropScriptResourceManager); -#endif // CAELUM_SCRIPT_SUPPORT - - mIsInstalled = true; - } - - void CaelumPlugin::initialise () { - } - - void CaelumPlugin::shutdown () { - } - - void CaelumPlugin::uninstall () - { - assert(mIsInstalled && "Not installed"); - -#if CAELUM_SCRIPT_SUPPORT - getScriptTranslatorManager()->_setPropScriptResourceManager (0); - - Ogre::ResourceGroupManager::getSingleton ()._unregisterResourceManager ( - getPropScriptResourceManager ()->getResourceType ()); - Ogre::ScriptCompilerManager::getSingleton ().removeTranslatorManager ( - getScriptTranslatorManager ()); -#endif // CAELUM_SCRIPT_SUPPORT - - Ogre::LogManager::getSingleton ().logMessage("Caelum plugin uninstalled"); - - mIsInstalled = false; - } - -#if CAELUM_SCRIPT_SUPPORT - void CaelumPlugin::loadCaelumSystemFromScript ( - CaelumSystem* sys, - const Ogre::String& objectName, - const Ogre::String& groupName) - { - assert (sys); - assert (this->isInstalled () && "Must install CaelumPlugin before loading scripts"); - - // Fetch raw resource ptr. Attempt to support explicit resource groups currently in Ogre trunk. -#if OGRE_VERSION >= 0x00010700 - Ogre::ResourcePtr res = getPropScriptResourceManager ()->getByName (objectName, groupName); -#else - Ogre::ResourcePtr res = getPropScriptResourceManager ()->getByName (objectName); -#endif - - // Check a PropScriptResource was found. - PropScriptResource* propRes = static_cast (res.get ()); - if (!propRes) { - OGRE_EXCEPT (Ogre::Exception::ERR_ITEM_NOT_FOUND, - "Could not find caelum_sky_system " + objectName, - "CaelumPlugin::loadCaelumSystemFromScript"); - } - - // Fetch the resource stream. Look in the actual group of the resource! - const Ogre::String& scriptFileName = propRes->getOrigin(); - const Ogre::String& scriptFileGroup = propRes->getGroup(); - Ogre::DataStreamPtr streamPtr = Ogre::ResourceGroupManager::getSingleton ().openResource ( - scriptFileName, scriptFileGroup, false); - - // Feed it into the compiler. - this->getScriptTranslatorManager()->getCaelumSystemTranslator()->setTranslationTarget (sys, objectName); - Ogre::ScriptCompilerManager::getSingleton ().parseScript (streamPtr, Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); - bool found = this->getScriptTranslatorManager()->getCaelumSystemTranslator()->foundTranslationTarget (); - - // This shouldn't normally happen. - if (!found) { - OGRE_EXCEPT (Ogre::Exception::ERR_ITEM_NOT_FOUND, - "Could not find caelum_sky_system " + objectName + " in file " + scriptFileName + " on reparsing. " - "Perhaps information in PropScriptResourceManager is out of date?", - "CaelumPlugin::loadCaelumSystemFromScript"); - } - this->getScriptTranslatorManager()->getCaelumSystemTranslator()->clearTranslationTarget (); - } -#endif // CAELUM_SCRIPT_SUPPORT -} diff --git a/extern/caelum/src/CaelumPrecompiled.cpp b/extern/caelum/src/CaelumPrecompiled.cpp deleted file mode 100644 index 9875371a2..000000000 --- a/extern/caelum/src/CaelumPrecompiled.cpp +++ /dev/null @@ -1,21 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2006-2007 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -#include "CaelumPrecompiled.h" diff --git a/extern/caelum/src/CaelumScriptTranslator.cpp b/extern/caelum/src/CaelumScriptTranslator.cpp deleted file mode 100644 index f4aa743d3..000000000 --- a/extern/caelum/src/CaelumScriptTranslator.cpp +++ /dev/null @@ -1,643 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2006-2008 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -#include "CaelumPrecompiled.h" -#include "CaelumPrerequisites.h" - -#if CAELUM_SCRIPT_SUPPORT - -#include "CaelumScriptTranslator.h" -#include "CaelumSystem.h" -#include "CaelumExceptions.h" - -using namespace Ogre; - -namespace Caelum -{ - PropScriptResource::PropScriptResource - ( - Ogre::ResourceManager* creator, const Ogre::String& name, Ogre::ResourceHandle handle, - const Ogre::String& group, bool isManual, Ogre::ManualResourceLoader* loader - ): - Ogre::Resource (creator, name, handle, group, isManual, loader) - { - //Ogre::LogManager::getSingleton().logMessage( - // "PropScriptResource::PropScriptResource"); - } - - PropScriptResource::~PropScriptResource() { - //Ogre::LogManager::getSingleton().logMessage( - // "PropScriptResource::~PropScriptResource"); - } - - PropScriptResourceManager::PropScriptResourceManager() { - mLoadOrder = 1000; - mResourceType = "PropertyScript"; - } - - PropScriptResource* PropScriptResourceManager::createImpl( - const String& name, ResourceHandle handle, const String& group, - bool isManual, ManualResourceLoader* loader, const NameValuePairList* createParams) - { - //Ogre::LogManager::getSingleton().logMessage( - // "PropScriptResourceManager::createImpl"); - return new PropScriptResource (this, name, handle, group, isManual, loader); - } - - TypeDescriptorScriptTranslator::TypeDescriptorScriptTranslator (TypeDescriptor* typeDescriptor): - mTypeDescriptor(typeDescriptor) - { - } - - bool TypeDescriptorScriptTranslator::getPropValueOrAddError ( - ScriptCompiler* compiler, - PropertyAbstractNode* prop, - bool& value) - { - if (prop->values.empty ()) { - compiler->addError (ScriptCompiler::CE_STRINGEXPECTED, prop->file, prop->line); - return false; - } - if (prop->values.size () > 1) { - compiler->addError (ScriptCompiler::CE_FEWERPARAMETERSEXPECTED, prop->file, prop->line, - prop->name + " must have at most 1 argument"); - return false; - } - if (!Ogre::ScriptTranslator::getBoolean(prop->values.front(), &value)) { - compiler->addError (ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line, - prop->values.front()->getValue() + " is not a valid number"); - return false; - } - return true; - } - - bool TypeDescriptorScriptTranslator::getPropValueOrAddError ( - ScriptCompiler* compiler, - PropertyAbstractNode* prop, - ColourValue& value) - { - if (prop->values.empty ()) { - compiler->addError (ScriptCompiler::CE_STRINGEXPECTED, prop->file, prop->line); - return false; - } - if (prop->values.size () > 4) { - compiler->addError (ScriptCompiler::CE_FEWERPARAMETERSEXPECTED, prop->file, prop->line, - prop->name + " must have at most 4 arguments"); - return false; - } - if (prop->values.size () < 3) { - compiler->addError (ScriptCompiler::CE_FEWERPARAMETERSEXPECTED, prop->file, prop->line, - prop->name + " must have at least 3 arguments"); - } - if (!getColour(prop->values.begin(), prop->values.end(), &value)) { - compiler->addError (ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line, - prop->name + " requires a colour argument"); - } - return true; - } - - bool TypeDescriptorScriptTranslator::getPropValueOrAddError ( - ScriptCompiler* compiler, - PropertyAbstractNode* prop, - float& value) - { - if (prop->values.empty ()) { - compiler->addError (ScriptCompiler::CE_STRINGEXPECTED, prop->file, prop->line); - return false; - } - if (prop->values.size () > 1) { - compiler->addError (ScriptCompiler::CE_FEWERPARAMETERSEXPECTED, prop->file, prop->line, - prop->name + " must have at most 1 argument"); - return false; - } - if (!Ogre::ScriptTranslator::getFloat(prop->values.front(), &value)) { - compiler->addError (ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line, - prop->values.front()->getValue() + " is not a valid number"); - return false; - } - return true; - } - - bool TypeDescriptorScriptTranslator::getPropValueOrAddError ( - ScriptCompiler* compiler, - PropertyAbstractNode* prop, - int& value) - { - if (prop->values.empty ()) { - compiler->addError (ScriptCompiler::CE_STRINGEXPECTED, prop->file, prop->line); - return false; - } - if (prop->values.size () > 1) { - compiler->addError (ScriptCompiler::CE_FEWERPARAMETERSEXPECTED, prop->file, prop->line, - prop->name + " must have at most 1 argument"); - return false; - } - if (!Ogre::ScriptTranslator::getInt(prop->values.front(), &value)) { - compiler->addError (ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line, - prop->values.front()->getValue() + " is not a valid integer"); - return false; - } - return true; - } - - bool TypeDescriptorScriptTranslator::getPropValueOrAddError ( - ScriptCompiler* compiler, - PropertyAbstractNode* prop, - double& value) - { - if (prop->values.empty ()) { - compiler->addError (ScriptCompiler::CE_STRINGEXPECTED, prop->file, prop->line); - return false; - } - if (prop->values.size () > 1) { - compiler->addError (ScriptCompiler::CE_FEWERPARAMETERSEXPECTED, prop->file, prop->line, - prop->name + " must have at most 1 argument"); - return false; - } - // We do need a string stream here for the extra precision. - std::stringstream strStream (std::string(prop->values.front()->getValue())); - strStream >> value; - if (strStream.fail()) { - compiler->addError (ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line, - prop->values.front()->getValue() + " is not a valid number"); - return false; - } - return true; - } - - bool TypeDescriptorScriptTranslator::getPropValueOrAddError ( - ScriptCompiler* compiler, - PropertyAbstractNode* prop, - Ogre::Degree& value) - { - if (prop->values.size () == 0) { - compiler->addError (ScriptCompiler::CE_STRINGEXPECTED, prop->file, prop->line); - return false; - } - if (prop->values.size () > 3) { - compiler->addError (ScriptCompiler::CE_FEWERPARAMETERSEXPECTED, prop->file, prop->line, - prop->name + " must have at most 3 arguments"); - return false; - } - // Allow 3 components. - float degMinSec[3] = { 0, 0, 0 }; - int k = 0; - for (AbstractNodeList::const_iterator it = prop->values.begin(), endIt = prop->values.end(); it != endIt; ++it, ++k) { - if (!Ogre::ScriptTranslator::getFloat(*it, °MinSec[k])) { - compiler->addError (ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line, - (*it)->getValue () + " is not a valid number"); - return false; - } - } - value = Ogre::Degree(degMinSec[0] + degMinSec[1] / 60.0 + degMinSec[2] / 3600); - return true; - } - - bool TypeDescriptorScriptTranslator::getPropValueOrAddError ( - ScriptCompiler* compiler, - PropertyAbstractNode* prop, - Ogre::String& value) - { - if (prop->values.size () == 0) { - compiler->addError (ScriptCompiler::CE_STRINGEXPECTED, prop->file, prop->line); - return false; - } - if (prop->values.size () > 1) { - compiler->addError (ScriptCompiler::CE_FEWERPARAMETERSEXPECTED, prop->file, prop->line, - prop->name + " must have at most 1 arguments"); - return false; - } - if (!Ogre::ScriptTranslator::getString(prop->values.front(), &value)) { - compiler->addError (ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line, - prop->values.front()->getValue() + " is not a valid string"); - return false; - } - return true; - } - - bool TypeDescriptorScriptTranslator::getPropValueOrAddError ( - ScriptCompiler* compiler, - PropertyAbstractNode* prop, - Ogre::Vector3& value) - { - if (prop->values.size () == 0) { - compiler->addError (ScriptCompiler::CE_STRINGEXPECTED, prop->file, prop->line); - return false; - } - if (prop->values.size () > 3) { - compiler->addError (ScriptCompiler::CE_FEWERPARAMETERSEXPECTED, prop->file, prop->line, - prop->name + " must have at most 3 arguments"); - return false; - } - float floats[3]; - if (!Ogre::ScriptTranslator::getFloats(prop->values.begin(), prop->values.end(), floats, 3)) { - compiler->addError (ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line, - "incorrect vector parameters."); - return false; - } - value.x = floats[0]; - value.y = floats[1]; - value.z = floats[2]; - return true; - } - - bool TypeDescriptorScriptTranslator::getPropValueOrAddError ( - ScriptCompiler* compiler, - PropertyAbstractNode* prop, - Ogre::Vector2& value) - { - if (prop->values.size () == 0) { - compiler->addError (ScriptCompiler::CE_STRINGEXPECTED, prop->file, prop->line); - return false; - } - if (prop->values.size () > 2) { - compiler->addError (ScriptCompiler::CE_FEWERPARAMETERSEXPECTED, prop->file, prop->line, - prop->name + " must have at most 3 arguments"); - return false; - } - float floats[2]; - if (!Ogre::ScriptTranslator::getFloats(prop->values.begin(), prop->values.end(), floats, 2)) { - compiler->addError (ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line, - "incorrect vector parameters."); - return false; - } - value.x = floats[0]; - value.y = floats[1]; - return true; - } - - template - static bool tryHandlePropertyType ( - ScriptCompiler* compiler, PropertyAbstractNode* propNode, - void* targetObject, const ValuePropertyDescriptor* propDesc) - { - if (propDesc->getValueTypeId () == typeid(T)) { - T val; - if (TypeDescriptorScriptTranslator::getPropValueOrAddError (compiler, propNode, val)) { - propDesc->setValue (targetObject, Ogre::Any(val)); - } - return true; - } - return false; - } - - void TypeDescriptorScriptTranslator::translateProperty ( - ScriptCompiler* compiler, - PropertyAbstractNode* prop, - void* targetObject, - const TypeDescriptor* typeDescriptor) - { - const ValuePropertyDescriptor* propDesc = typeDescriptor->getPropertyDescriptor (prop->name); - if (!propDesc) { - compiler->addError (ScriptCompiler::CE_UNEXPECTEDTOKEN, prop->file, prop->line, - "property \"" + prop->name + "\" not recognized; missing from type descriptor."); - return; - } - if (!propDesc->canSetValue ()) { - compiler->addError (ScriptCompiler::CE_UNEXPECTEDTOKEN, prop->file, prop->line, - "property \"" + prop->name + "\" is read-only and can't be set from a script."); - return; - } - - //LogManager::getSingleton ().logMessage ("TypeDescriptorScriptTranslator::translateProperty" - // " name '" + prop->name + "'"); - - bool handled = false - || tryHandlePropertyType (compiler, prop, targetObject, propDesc) - || tryHandlePropertyType (compiler, prop, targetObject, propDesc) - || tryHandlePropertyType (compiler, prop, targetObject, propDesc) - || tryHandlePropertyType (compiler, prop, targetObject, propDesc) - || tryHandlePropertyType (compiler, prop, targetObject, propDesc) - || tryHandlePropertyType (compiler, prop, targetObject, propDesc) - || tryHandlePropertyType (compiler, prop, targetObject, propDesc) - || tryHandlePropertyType (compiler, prop, targetObject, propDesc) - || tryHandlePropertyType (compiler, prop, targetObject, propDesc); - - if (!handled) { - compiler->addError (ScriptCompiler::CE_UNEXPECTEDTOKEN, prop->file, prop->line, - "property \"" + prop->name + "\" is found in type descriptor but has " - "unsupported type. Mangled typeid is '" + propDesc->getValueTypeId().name() + "'"); - } - } - - void TypeDescriptorScriptTranslator::translate (ScriptCompiler* compiler, const AbstractNodePtr& node) - { - //LogManager::getSingleton ().logMessage ("TypeDescriptorScriptTranslator::translate begin"); - - // Check type descriptor was set. - assert (getTypeDescriptor () && "Type descriptor must be set before we can translate."); - - // Fetch target object. - ObjectAbstractNode *objNode = reinterpret_cast(node.get()); - assert (!objNode->context.isEmpty ()); - void* targetObject = any_cast (objNode->context); - assert (targetObject); - - for (AbstractNodeList::iterator i = objNode->children.begin(); i != objNode->children.end(); ++i) - { - if ((*i)->type == ANT_PROPERTY) - { - PropertyAbstractNode *prop = reinterpret_cast((*i).get()); - - translateProperty (compiler, prop, targetObject, getTypeDescriptor()); - } - else if((*i)->type == ANT_OBJECT) - { - compiler->addError (ScriptCompiler::CE_INVALIDPARAMETERS, (*i)->file, (*i)->line); - } - } - - //LogManager::getSingleton ().logMessage ("TypeDescriptorScriptTranslator::translate end"); - } - - CaelumSystemScriptTranslator::CaelumSystemScriptTranslator (): - mResourceManager(false), - mTranslationTarget(0), - mTranslationTargetFound(false), - mTypeDescriptor(0) - { - } - - void CaelumSystemScriptTranslator::setTranslationTarget (CaelumSystem* target, const Ogre::String& name) - { - assert (target != 0); - this->mTranslationTarget = target; - this->mTranslationTargetName = name; - this->mTranslationTargetFound = false; - } - - void CaelumSystemScriptTranslator::clearTranslationTarget () { - this->mTranslationTarget = 0; - this->mTranslationTargetName.clear(); - this->mTranslationTargetFound = false; - } - - void CaelumSystemScriptTranslator::translate (ScriptCompiler* compiler, const AbstractNodePtr& node) - { - //LogManager::getSingleton ().logMessage ("CaelumSystemScriptTranslator::translate begin"); - - ObjectAbstractNode *objNode = reinterpret_cast(node.get()); - - CaelumSystem* sys = 0; - - // Check for a translation target. - if (this->getTranslationTarget ()) { - sys = this->getTranslationTarget (); - - // Check for a name match. - if (this->getTranslationTargetName () != objNode->name) { - //LogManager::getSingleton ().logMessage ( - // "Caelum: Skipped " + objNode->cls + " name " + objNode->name + " while loading"); - return; - } - - // Clear the target; this ensure that properties which are not - // mentioned are set to their default values. - // We only do this after we found a target; this ensure that if - // the target is not found it's not modified either. - sys->clear(); - - //LogManager::getSingleton ().logMessage ( - // "Caelum: Found " + objNode->cls + " name " + objNode->name + "; filling properties."); - mTranslationTargetFound = true; - } else if (this->getResourceManager ()) { - // If we don't have a target but have a resource manager then create a resource. - //LogManager::getSingleton ().logMessage ( - // "Caelum: Saved " + objNode->cls + " name " + objNode->name + " as a resource"); - PropScriptResourceManager* mgr = this->getResourceManager (); - ResourcePtr resource = mgr->create (objNode->name, compiler->getResourceGroup()); - resource->_notifyOrigin (objNode->file); - return; - } - - objNode->context = sys; - - for (AbstractNodeList::iterator i = objNode->children.begin(); i != objNode->children.end(); ++i) - { - if ((*i)->type == ANT_PROPERTY) - { - PropertyAbstractNode *prop = reinterpret_cast((*i).get()); - - // Properties implemented through type descriptor. - TypeDescriptorScriptTranslator::translateProperty( - compiler, prop, - static_cast(sys), - getTypeDescriptor ()); - } - else if((*i)->type == ANT_OBJECT) - { - ObjectAbstractNode *childObjNode = reinterpret_cast((*i).get()); - - //LogManager::getSingleton ().logMessage ("CaelumSystemScriptTranslator::translate child object" - // " value '" + childObjNode->getValue () + "'" - // " name '" + childObjNode->name + "'" - // " cls '" + childObjNode->cls + "'" - // " base '" + childObjNode->base + "'"); - - // Only allow declarations with one class token; like "moon { }" -#if OGRE_VERSION < 0x010700 - if (childObjNode->name.empty () == false || childObjNode->base.empty () == false) { -#else - if (childObjNode->name.empty () == false || childObjNode->bases.size () != 0) { -#endif - compiler->addError ( - ScriptCompiler::CE_FEWERPARAMETERSEXPECTED, - childObjNode->file, childObjNode->line, - "caelum_sky_system components can't have names or bases"); - continue; - } - const String& className = childObjNode->cls; - - try { - if (className == "sun") { - sys->setSun (new Sun (sys->getSceneMgr (), sys->getCaelumCameraNode ())); - childObjNode->context = static_cast (sys->getSun ()); - } else if (className == "sky_dome") { - sys->setSkyDome (new SkyDome (sys->getSceneMgr (), sys->getCaelumCameraNode ())); - childObjNode->context = static_cast(sys->getSkyDome ()); - } else if (className == "moon") { - sys->setMoon (new Moon (sys->getSceneMgr (), sys->getCaelumCameraNode ())); - childObjNode->context = static_cast(sys->getMoon ()); - } else if (className == "ground_fog") { - sys->setGroundFog (new GroundFog (sys->getSceneMgr (), sys->getCaelumCameraNode ())); - childObjNode->context = static_cast(sys->getGroundFog ()); - } else if (className == "depth_composer") { - sys->setDepthComposer (new DepthComposer (sys->getSceneMgr ())); - childObjNode->context = static_cast(sys->getDepthComposer ()); - } else if (className == "point_starfield") { - sys->setPointStarfield (new PointStarfield (sys->getSceneMgr (), sys->getCaelumCameraNode())); - childObjNode->context = static_cast(sys->getPointStarfield ()); - } else if (className == "precipitation") { - sys->setPrecipitationController (new PrecipitationController (sys->getSceneMgr ())); - childObjNode->context = static_cast(sys->getPrecipitationController ()); - } else if (className == "cloud_system") { - sys->setCloudSystem (new CloudSystem (sys->getSceneMgr (), sys->getCaelumGroundNode ())); - childObjNode->context = static_cast(sys->getCloudSystem ()); - } else { - LogManager::getSingleton ().logMessage ("CaelumSystemScriptTranslator::translate " - "unknown child object class '" + className + "'"); - } - } catch (Caelum::UnsupportedException& ex) { - // Catch all unsupported exceptions and report them. - // This should usually happen because the proper shaders are not supported by hardware. - // - // Script parsing should still succeed. - compiler->addError ( - ScriptCompiler::CE_UNSUPPORTEDBYRENDERSYSTEM, - childObjNode->file, childObjNode->line, - "Failed to create component \"" + className + "\": " + ex.getFullDescription ()); - continue; - } - processNode (compiler, *i); - } - } - - //LogManager::getSingleton ().logMessage ("SkySystemScriptTranslator::translate END"); - } - - void CloudSystemScriptTranslator::translate (ScriptCompiler* compiler, const AbstractNodePtr& node) - { - //LogManager::getSingleton ().logMessage ("SkySystemScriptTranslator::translate begin"); - - ObjectAbstractNode *objNode = reinterpret_cast(node.get()); - assert (!objNode->context.isEmpty ()); - void* rawTargetObject = any_cast (objNode->context); - assert (rawTargetObject); - - CloudSystem* target = static_cast(rawTargetObject); - - for (AbstractNodeList::iterator i = objNode->children.begin(); i != objNode->children.end(); ++i) - { - if ((*i)->type == ANT_PROPERTY) - { - compiler->addError ( - ScriptCompiler::CE_INVALIDPARAMETERS, - objNode->file, objNode->line, - "cloud_system doesn't have any properties"); - } - else if((*i)->type == ANT_OBJECT) - { - ObjectAbstractNode *childObjNode = reinterpret_cast((*i).get()); - - /* - LogManager::getSingleton ().logMessage ("CloudSystemScriptTranslator::translate child object" - " value '" + childObjNode->getValue () + "'" - " name '" + childObjNode->name + "'" - " cls '" + childObjNode->cls + "'" - " base '" + childObjNode->base + "'"); - */ - - const Ogre::String& className = childObjNode->cls; - - if (className == "cloud_layer") { - // Don't allow names. -#if OGRE_VERSION < 0x010700 - if (childObjNode->base.empty () == false) { -#else - if (childObjNode->bases.size () != 0) { -#endif - compiler->addError ( - ScriptCompiler::CE_FEWERPARAMETERSEXPECTED, - childObjNode->file, childObjNode->line, - "cloud_layer can't have a base"); - continue; - } - // Height here is irrelevant. It's silly to have it as a FlatCloudLayer ctor parameter. - target->createLayerAtHeight (0); - FlatCloudLayer* layer = target->getLayer (target->getLayerCount () - 1); - - // Add the new layer as a context for the object node. - // This will eventually pass to the TypeDescriptorScriptTranslator for a cloud layer. - childObjNode->context = static_cast(layer); - } else { - LogManager::getSingleton ().logMessage ("CloudSystemScriptTranslator::translate " - "unknown child object class '" + className + "'"); - } - processNode (compiler, *i); - } - } - - //LogManager::getSingleton ().logMessage ("CloudSystemScriptTranslator::translate END"); - } - - CaelumScriptTranslatorManager::CaelumScriptTranslatorManager - ( - CaelumDefaultTypeDescriptorData* typeData - ): - mCaelumSystemTranslator(), - mCloudSystemTranslator(), - mFlatCloudLayerTranslator(typeData->FlatCloudLayerTypeDescriptor), - mSunTranslator(typeData->BaseSkyLightTypeDescriptor), - mMoonTranslator(typeData->BaseSkyLightTypeDescriptor), - mPointStarfieldTranslator(typeData->PointStarfieldTypeDescriptor), - mGroundFogTranslator(typeData->GroundFogTypeDescriptor), - mDepthComposerTranslator(typeData->DepthComposerTypeDescriptor), - mPrecipitationTranslator(typeData->PrecipitationTypeDescriptor), - mSkyDomeTranslator(typeData->SkyDomeTypeDescriptor) - { - mCaelumSystemTranslator.setTypeDescriptor(typeData->CaelumSystemTypeDescriptor); - - // Build translator map to member translators. - mTranslatorMap.insert (std::make_pair ("caelum_sky_system", &mCaelumSystemTranslator)); - mTranslatorMap.insert (std::make_pair ("cloud_system", &mCloudSystemTranslator)); - mTranslatorMap.insert (std::make_pair ("cloud_layer", &mFlatCloudLayerTranslator)); - mTranslatorMap.insert (std::make_pair ("sun", &mSunTranslator)); - mTranslatorMap.insert (std::make_pair ("moon", &mMoonTranslator)); - mTranslatorMap.insert (std::make_pair ("point_starfield", &mPointStarfieldTranslator)); - mTranslatorMap.insert (std::make_pair ("ground_fog", &mGroundFogTranslator)); - mTranslatorMap.insert (std::make_pair ("depth_composer", &mDepthComposerTranslator)); - mTranslatorMap.insert (std::make_pair ("precipitation", &mPrecipitationTranslator)); - mTranslatorMap.insert (std::make_pair ("sky_dome", &mSkyDomeTranslator)); - } - - size_t CaelumScriptTranslatorManager::getNumTranslators () const { - // Turns out this is never called. - assert(0 && "This method should be removed from Ogre::ScriptTranslatorManager"); - return mTranslatorMap.size (); - } - - void CaelumScriptTranslatorManager::_setPropScriptResourceManager (PropScriptResourceManager* mgr) - { - mCaelumSystemTranslator.setResourceManager (mgr); - } - - ScriptTranslator* CaelumScriptTranslatorManager::getTranslator (const AbstractNodePtr& node) - { - //LogManager::getSingleton ().logMessage ("CaelumScriptTranslatorManager::getTranslator"); - if (node->type == ANT_ATOM) { - //ObjectAbstractNode* atomNode = reinterpret_cast(node.get()); - //LogManager::getSingleton ().logMessage ("CaelumScriptTranslatorManager::getTranslator atom node " + atomNode->getValue ()); - } else if (node->type == ANT_OBJECT) { - ObjectAbstractNode* objNode = reinterpret_cast(node.get()); - //LogManager::getSingleton ().logMessage ("CaelumScriptTranslatorManager::getTranslator object node " + objNode->getValue ()); - - // Pass down the context. - ScriptTranslatorMap::const_iterator it = mTranslatorMap.find(objNode->cls); - if (it != mTranslatorMap.end()) { - return it->second; - } - } - - // Not found in this manager. - return 0; - } -} - -#endif // CAELUM_SCRIPT_SUPPORT diff --git a/extern/caelum/src/CaelumSystem.cpp b/extern/caelum/src/CaelumSystem.cpp deleted file mode 100644 index c0ca0ad62..000000000 --- a/extern/caelum/src/CaelumSystem.cpp +++ /dev/null @@ -1,760 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2006-2008 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -#include "CaelumPrecompiled.h" -#include "CaelumSystem.h" -#include "CaelumExceptions.h" -#include "InternalUtilities.h" -#include "Astronomy.h" -#include "CaelumPlugin.h" -#include "FlatCloudLayer.h" - -using namespace Ogre; - -namespace Caelum -{ - const String CaelumSystem::DEFAULT_SKY_GRADIENTS_IMAGE = "EarthClearSky2.png"; - const String CaelumSystem::DEFAULT_SUN_COLOURS_IMAGE = "SunGradient.png"; - - CaelumSystem::CaelumSystem - ( - Ogre::Root *root, - Ogre::SceneManager *sceneMgr, - CaelumComponent componentsToCreate/* = CAELUM_COMPONENTS_DEFAULT*/ - ): - mOgreRoot (root), - mSceneMgr (sceneMgr), - mCleanup (false) - { - LogManager::getSingleton().logMessage ("Caelum: Initialising Caelum system..."); - //LogManager::getSingleton().logMessage ("Caelum: CaelumSystem* at d" + - // StringConverter::toString (reinterpret_cast(this))); - - Ogre::String uniqueId = Ogre::StringConverter::toString ((size_t)this); - if (!CaelumPlugin::getSingletonPtr ()) { - LogManager::getSingleton().logMessage ("Caelum: Plugin not installed; installing now."); - new CaelumPlugin (); - CaelumPlugin::getSingletonPtr ()->install (); - CaelumPlugin::getSingletonPtr ()->initialise (); - } - - mCaelumCameraNode.reset(mSceneMgr->getRootSceneNode ()->createChildSceneNode ("Caelum/CameraNode/" + uniqueId)); - mCaelumGroundNode.reset(mSceneMgr->getRootSceneNode ()->createChildSceneNode ("Caelum/GroundNode/" + uniqueId)); - mUniversalClock.reset(new UniversalClock ()); - - // If the "Caelum" resource group does not exist; create it. - // This resource group is never released; which may be bad. - // What does ogre do for it's own runtime resources? - Ogre::StringVector groups = ResourceGroupManager::getSingleton ().getResourceGroups (); - if (std::find (groups.begin(), groups.end(), Caelum::RESOURCE_GROUP_NAME) == groups.end()) { - LogManager::getSingleton ().logMessage ( - "Caelum: Creating required internal resource group \'" + RESOURCE_GROUP_NAME + "\'"); - ResourceGroupManager::getSingleton ().createResourceGroup (Caelum::RESOURCE_GROUP_NAME); - } - - // Autoconfigure. Calls clear first to set defaults. - autoConfigure (componentsToCreate); - } - - void CaelumSystem::destroySubcomponents (bool destroyEverything) - { - // Destroy sub-components - setSkyDome (0); - setSun (0); - setImageStarfield (0); - setPointStarfield (0); - setCloudSystem (0); - setPrecipitationController (0); - setDepthComposer (0); - setGroundFog (0); - setMoon (0); - mSkyGradientsImage.reset (); - mSunColoursImage.reset (); - - // These things can't be rebuilt. - if (destroyEverything) { - LogManager::getSingleton ().logMessage("Caelum: Delete UniversalClock"); - mUniversalClock.reset (); - mCaelumCameraNode.reset (); - mCaelumGroundNode.reset (); - } - } - - CaelumSystem::~CaelumSystem () { - destroySubcomponents (true); - LogManager::getSingleton ().logMessage ("Caelum: CaelumSystem destroyed."); - } - - void CaelumSystem::clear() - { - // Destroy all subcomponents first. - destroySubcomponents (false); - - // Some "magical" behaviour. - mAutoMoveCameraNode = true; - mAutoNotifyCameraChanged = true; - mAutoAttachViewportsToComponents = true; - mAutoViewportBackground = true; - - // Default lookups. - setSkyGradientsImage(DEFAULT_SKY_GRADIENTS_IMAGE); - setSunColoursImage(DEFAULT_SUN_COLOURS_IMAGE); - - // Fog defaults. - setManageSceneFog (true); - mGlobalFogDensityMultiplier = 1; - mGlobalFogColourMultiplier = Ogre::ColourValue(1.0, 1.0, 1.0, 1.0); - mSceneFogDensityMultiplier = 1; - mSceneFogColourMultiplier = Ogre::ColourValue(0.7, 0.7, 0.7, 0.7); - mGroundFogDensityMultiplier = 1; - mGroundFogColourMultiplier = Ogre::ColourValue(1.0, 1.0, 1.0, 1.0); - - // Ambient lighting. - setManageAmbientLight (true); - setMinimumAmbientLight (Ogre::ColourValue (0.1, 0.1, 0.3)); - mEnsureSingleLightSource = false; - mEnsureSingleShadowSource = false; - - // Observer time & position. J2000 is midday. - mObserverLatitude = Ogre::Degree(45); - mObserverLongitude = Ogre::Degree(0); - mUniversalClock->setJulianDay (Astronomy::J2000); - } - - void CaelumSystem::autoConfigure - ( - CaelumComponent componentsToCreate/* = CAELUM_COMPONENTS_DEFAULT*/ - ) - { - // Clear everything; revert to default. - clear(); - - if (componentsToCreate == 0) { - // Nothing to do. Don't print junk if not creating anything. - return; - } - LogManager::getSingleton ().logMessage ("Caelum: Creating caelum sub-components."); - - // Init skydome - if (componentsToCreate & CAELUM_COMPONENT_SKY_DOME) { - try { - this->setSkyDome (new SkyDome (mSceneMgr, getCaelumCameraNode ())); - } catch (Caelum::UnsupportedException& ex) { - LogManager::getSingleton ().logMessage ( - "Caelum: Failed to initialize skydome: " + ex.getFullDescription()); - } - } - - // Init sun - if (componentsToCreate & CAELUM_COMPONENT_SUN) { - try { - this->setSun (new SpriteSun (mSceneMgr, getCaelumCameraNode ())); - this->getSun ()->setAmbientMultiplier (Ogre::ColourValue (0.5, 0.5, 0.5)); - this->getSun ()->setDiffuseMultiplier (Ogre::ColourValue (3, 3, 2.7)); - this->getSun ()->setSpecularMultiplier (Ogre::ColourValue (5, 5, 5)); - - this->getSun ()->setAutoDisable (true); - this->getSun ()->setAutoDisableThreshold (0.05); - } catch (Caelum::UnsupportedException& ex) { - LogManager::getSingleton ().logMessage ( - "Caelum: Failed to initialize sun: " + ex.getFullDescription()); - } - } - - // Init moon - if (componentsToCreate & CAELUM_COMPONENT_MOON) { - try { - this->setMoon (new Moon (mSceneMgr, getCaelumCameraNode ())); - this->getMoon ()->setAutoDisable (true); - this->getMoon ()->setAutoDisableThreshold (0.05); - } catch (Caelum::UnsupportedException& ex) { - LogManager::getSingleton ().logMessage ( - "Caelum: Failed to initialize moon: " + ex.getFullDescription()); - } - } - if (componentsToCreate & CAELUM_COMPONENT_IMAGE_STARFIELD) { - try { - this->setImageStarfield (new ImageStarfield (mSceneMgr, getCaelumCameraNode ())); - } catch (Caelum::UnsupportedException& ex) { - LogManager::getSingleton ().logMessage ( - "Caelum: Failed to initialize the old image starfield: " + ex.getFullDescription()); - } - } - if (componentsToCreate & CAELUM_COMPONENT_POINT_STARFIELD) { - try { - this->setPointStarfield (new PointStarfield (mSceneMgr, getCaelumCameraNode ())); - } catch (Caelum::UnsupportedException& ex) { - LogManager::getSingleton ().logMessage ( - "Caelum: Failed to initialize starfield: " + ex.getFullDescription()); - } - } - if (componentsToCreate & CAELUM_COMPONENT_GROUND_FOG) { - try { - this->setGroundFog (new GroundFog (mSceneMgr, getCaelumCameraNode ())); - } catch (Caelum::UnsupportedException& ex) { - LogManager::getSingleton ().logMessage ( - "Caelum: Failed to initialize ground fog: " + ex.getFullDescription()); - } - } - if (componentsToCreate & CAELUM_COMPONENT_CLOUDS) { - try { - this->setCloudSystem (new CloudSystem (mSceneMgr, getCaelumGroundNode ())); - getCloudSystem ()->createLayerAtHeight (3000); - getCloudSystem ()->getLayer (0)->setCloudCover (0.3); - } catch (Caelum::UnsupportedException& ex) { - LogManager::getSingleton ().logMessage ( - "Caelum: Failed to initialize clouds: " + ex.getFullDescription()); - } - } - if (componentsToCreate & CAELUM_COMPONENT_PRECIPITATION) { - try { - this->setPrecipitationController (new PrecipitationController (mSceneMgr)); - } catch (Caelum::UnsupportedException& ex) { - LogManager::getSingleton ().logMessage ( - "Caelum: Failed to initialize precipitation: " + ex.getFullDescription()); - } - } - if (componentsToCreate & CAELUM_COMPONENT_SCREEN_SPACE_FOG) { - try { - this->setDepthComposer (new DepthComposer (mSceneMgr)); - } catch (Caelum::UnsupportedException& ex) { - LogManager::getSingleton ().logMessage ( - "Caelum: Failed to initialize precipitation: " + ex.getFullDescription()); - } - } - - LogManager::getSingleton ().logMessage ("Caelum: DONE initializing"); - } - - void CaelumSystem::shutdown (const bool cleanup) { - LogManager::getSingleton ().logMessage ("Caelum: Shutting down Caelum system..."); - - destroySubcomponents (true); - - if (cleanup) { - mOgreRoot->removeFrameListener (this); - delete this; - } else { - // We'll delete later. Make sure we're registered as a frame listener, or we'd leak. - mOgreRoot->addFrameListener(this); - mCleanup = true; - } - } - - void CaelumSystem::attachViewportImpl (Ogre::Viewport* vp) - { - LogManager::getSingleton().getDefaultLog ()->logMessage ( - "CaelumSystem: Attached to" - " viewport " + StringConverter::toString ((long)vp) + - " render target " + vp->getTarget ()->getName ()); - if (getAutoAttachViewportsToComponents ()) { - if (getPrecipitationController ()) { - getPrecipitationController ()->createViewportInstance (vp); - } - if (getDepthComposer ()) { - getDepthComposer ()->createViewportInstance (vp); - } - } - } - - void CaelumSystem::detachViewportImpl (Ogre::Viewport* vp) - { - LogManager::getSingleton().getDefaultLog ()->logMessage ( - "CaelumSystem: Detached from " - " viewport " + StringConverter::toString ((long)vp) + - " render target " + vp->getTarget ()->getName ()); - if (getAutoAttachViewportsToComponents ()) { - if (getPrecipitationController ()) { - getPrecipitationController ()->destroyViewportInstance (vp); - } - if (getDepthComposer ()) { - getDepthComposer ()->destroyViewportInstance (vp); - } - } - } - - void CaelumSystem::attachViewport (Ogre::Viewport* vp) - { - bool found = !mAttachedViewports.insert (vp).second; - if (!found) { - attachViewportImpl (vp); - } - } - - void CaelumSystem::detachViewport (Ogre::Viewport* vp) - { - std::set::size_type erase_result = mAttachedViewports.erase(vp); - assert(erase_result == 0 || erase_result == 1); - bool found = erase_result == 1; - if (found) { - detachViewportImpl (vp); - } - } - - void CaelumSystem::detachAllViewports () - { - std::set::const_iterator it = mAttachedViewports.begin(), end = mAttachedViewports.end(); - for (; it != end; ++it) { - detachViewportImpl (*it); - } - mAttachedViewports.clear(); - } - - bool CaelumSystem::isViewportAttached (Ogre::Viewport* vp) const { - return mAttachedViewports.find (vp) != mAttachedViewports.end(); - } - - void CaelumSystem::setSkyDome (SkyDome *obj) { - mSkyDome.reset (obj); - } - - void CaelumSystem::setSun (BaseSkyLight* obj) { - mSun.reset (obj); - } - - void CaelumSystem::setMoon (Moon* obj) { - mMoon.reset (obj); - } - - void CaelumSystem::setImageStarfield (ImageStarfield* obj) { - mImageStarfield.reset (obj); - } - - void CaelumSystem::setPointStarfield (PointStarfield* obj) { - mPointStarfield.reset (obj); - } - - void CaelumSystem::setGroundFog (GroundFog* obj) { - mGroundFog.reset (obj); - } - - void CaelumSystem::setCloudSystem (CloudSystem* obj) { - mCloudSystem.reset (obj); - } - - void CaelumSystem::setPrecipitationController (PrecipitationController* newptr) { - PrecipitationController* oldptr = getPrecipitationController (); - if (oldptr == newptr) { - return; - } - // Detach old - if (getAutoAttachViewportsToComponents() && oldptr) { - std::for_each (mAttachedViewports.begin(), mAttachedViewports.end(), - std::bind1st (std::mem_fun (&PrecipitationController::destroyViewportInstance), oldptr)); - } - // Attach new. - if (getAutoAttachViewportsToComponents() && newptr) { - std::for_each (mAttachedViewports.begin(), mAttachedViewports.end(), - std::bind1st (std::mem_fun (&PrecipitationController::createViewportInstance), newptr)); - } - mPrecipitationController.reset(newptr); - } - - void CaelumSystem::setDepthComposer (DepthComposer* ptr) { - mDepthComposer.reset(ptr); - if (getAutoAttachViewportsToComponents() && getDepthComposer ()) { - std::for_each ( - mAttachedViewports.begin(), mAttachedViewports.end(), - std::bind1st ( - std::mem_fun (&DepthComposer::createViewportInstance), - getDepthComposer ())); - } - } - - void CaelumSystem::preViewportUpdate (const Ogre::RenderTargetViewportEvent &e) { - Ogre::Viewport *viewport = e.source; - Ogre::Camera *camera = viewport->getCamera (); - - if (getAutoViewportBackground ()) { - viewport->setBackgroundColour (Ogre::ColourValue::Black); - } - if (getAutoNotifyCameraChanged ()) { - this->notifyCameraChanged (camera); - } - } - - void CaelumSystem::notifyCameraChanged(Ogre::Camera* cam) - { - // Move camera node. - if (getAutoMoveCameraNode ()) { - mCaelumCameraNode->setPosition (cam->getDerivedPosition()); - mCaelumCameraNode->_update (true, true); - } - - if (getSkyDome ()) { - getSkyDome ()->notifyCameraChanged (cam); - } - - if (getSun ()) { - getSun ()->notifyCameraChanged (cam); - } - - if (getMoon ()) { - getMoon ()->notifyCameraChanged (cam); - } - - if (getImageStarfield ()) { - getImageStarfield ()->notifyCameraChanged (cam); - } - - if (getPointStarfield ()) { - getPointStarfield ()->notifyCameraChanged (cam); - } - - if (getGroundFog ()) { - getGroundFog ()->notifyCameraChanged (cam); - } - } - - bool CaelumSystem::frameStarted (const Ogre::FrameEvent &e) { - if (mCleanup) { - // Delayed destruction. - mOgreRoot->removeFrameListener (this); - delete this; - return true; - } - - updateSubcomponents(e.timeSinceLastFrame); - - return true; - } - - void CaelumSystem::updateSubcomponents (Real timeSinceLastFrame) - { - /* - LogManager::getSingleton().getDefaultLog()->logMessage( - "CaelumSystem::updateSubcomponents: " + - StringConverter::toString (timeSinceLastFrame, 10)); - */ - - mUniversalClock->update (timeSinceLastFrame); - - // Timing variables - LongReal julDay = mUniversalClock->getJulianDay (); - LongReal relDayTime = fmod(julDay, 1); - Real secondDiff = timeSinceLastFrame * mUniversalClock->getTimeScale (); - - // Get astronomical parameters. - Ogre::Vector3 sunDir = getSunDirection(julDay); - Ogre::Vector3 moonDir = getMoonDirection(julDay); - Real moonPhase = getMoonPhase(julDay); - - // Get parameters from sky colour model. - Real fogDensity = getFogDensity (relDayTime, sunDir); - Ogre::ColourValue fogColour = getFogColour (relDayTime, sunDir); - Ogre::ColourValue sunLightColour = getSunLightColour (relDayTime, sunDir); - Ogre::ColourValue sunSphereColour = getSunSphereColour (relDayTime, sunDir); - Ogre::ColourValue moonLightColour = getMoonLightColour (moonDir); - Ogre::ColourValue moonBodyColour = getMoonBodyColour (moonDir); - - fogDensity *= mGlobalFogDensityMultiplier; - fogColour = fogColour * mGlobalFogColourMultiplier; - - // Update image starfield - if (getImageStarfield ()) { - getImageStarfield ()->update (relDayTime); - getImageStarfield ()->setInclination (-getObserverLatitude ()); - } - - // Update point starfield - if (getPointStarfield ()) { - getPointStarfield ()->setObserverLatitude (getObserverLatitude ()); - getPointStarfield ()->setObserverLongitude (getObserverLongitude ()); - getPointStarfield ()->_update (relDayTime); - } - - // Update skydome. - if (getSkyDome ()) { - getSkyDome ()->setSunDirection (sunDir); - getSkyDome ()->setHazeColour (fogColour * mSceneFogColourMultiplier); - } - - // Update scene fog. - if (getManageSceneFog ()) { - mSceneMgr->setFog (Ogre::FOG_EXP2, - fogColour * mSceneFogColourMultiplier, - fogDensity * mSceneFogDensityMultiplier); - } - - // Update ground fog. - if (getGroundFog ()) { - getGroundFog ()->setColour (fogColour * mGroundFogColourMultiplier); - getGroundFog ()->setDensity (fogDensity * mGroundFogDensityMultiplier); - } - - // Update sun - if (getSun ()) { - mSun->update (sunDir, sunLightColour, sunSphereColour); - } - - // Update moon. - if (getMoon ()) { - mMoon->update ( - moonDir, - moonLightColour, - moonBodyColour); - mMoon->setPhase (moonPhase); - } - - // Update clouds - if (getCloudSystem ()) { - getCloudSystem ()->update ( - secondDiff, sunDir, sunLightColour, fogColour, sunSphereColour); - } - - // Update precipitation - if (getPrecipitationController ()) { - getPrecipitationController ()->update (secondDiff, fogColour); - } - - // Update screen space fog - if (getDepthComposer ()) { - getDepthComposer ()->update (); - getDepthComposer ()->setSunDirection (sunDir); - getDepthComposer ()->setHazeColour (fogColour); - getDepthComposer ()->setGroundFogColour (fogColour * mGroundFogColourMultiplier); - getDepthComposer ()->setGroundFogDensity (fogDensity * mGroundFogDensityMultiplier); - } - - // Update ambient lighting. - if (getManageAmbientLight ()) { - Ogre::ColourValue ambient = Ogre::ColourValue::Black; - if (getMoon ()) { - ambient += getMoon ()->getLightColour () * getMoon ()->getAmbientMultiplier (); - } - if (getSun ()) { - ambient += getSun ()->getLightColour () * getSun ()->getAmbientMultiplier (); - } - ambient.r = std::max(ambient.r, mMinimumAmbientLight.r); - ambient.g = std::max(ambient.g, mMinimumAmbientLight.g); - ambient.b = std::max(ambient.b, mMinimumAmbientLight.b); - ambient.a = std::max(ambient.a, mMinimumAmbientLight.a); - // Debug ambient factos (ick). - /* - LogManager::getSingleton().logMessage ( - "Sun is " + StringConverter::toString(sunLightColour) + "\n" - "Moon is " + StringConverter::toString(moonLightColour) + "\n" - "Ambient is " + StringConverter::toString(ambient) + "\n" - ); - */ - mSceneMgr->setAmbientLight (ambient); - } - - if (getSun() && getMoon ()) { - Ogre::Real moonBrightness = moonLightColour.r + moonLightColour.g + moonLightColour.b + moonLightColour.a; - Ogre::Real sunBrightness = sunLightColour.r + sunLightColour.g + sunLightColour.b + sunLightColour.a; - bool sunBrighterThanMoon = (sunBrightness > moonBrightness); - - if (getEnsureSingleLightSource ()) { - getMoon ()->setForceDisable (sunBrighterThanMoon); - getSun ()->setForceDisable (!sunBrighterThanMoon); - } - if (getEnsureSingleShadowSource ()) { - getMoon ()->getMainLight ()->setCastShadows (!sunBrighterThanMoon); - getSun ()->getMainLight ()->setCastShadows (sunBrighterThanMoon); - } - } - } - - void CaelumSystem::setManageSceneFog (bool value) { - mManageSceneFog = value; - // Prevent having some stale values around. - if (!value) { - mSceneMgr->setFog (Ogre::FOG_NONE); - } - } - - bool CaelumSystem::getManageSceneFog () const { - return mManageSceneFog; - } - - void CaelumSystem::setSceneFogDensityMultiplier (Real value) { - mSceneFogDensityMultiplier = value; - } - - Real CaelumSystem::getSceneFogDensityMultiplier () const { - return mSceneFogDensityMultiplier; - } - - void CaelumSystem::setGroundFogDensityMultiplier (Real value) { - mGroundFogDensityMultiplier = value; - } - - Real CaelumSystem::getGroundFogDensityMultiplier () const { - return mGroundFogDensityMultiplier; - } - - void CaelumSystem::setGlobalFogDensityMultiplier (Real value) { - mGlobalFogDensityMultiplier = value; - } - - Real CaelumSystem::getGlobalFogDensityMultiplier () const { - return mGlobalFogDensityMultiplier; - } - - void CaelumSystem::setSkyGradientsImage (const Ogre::String &filename) { - mSkyGradientsImage.reset(new Ogre::Image ()); - mSkyGradientsImage->load (filename, RESOURCE_GROUP_NAME); - } - - void CaelumSystem::setSunColoursImage (const Ogre::String &filename) { - mSunColoursImage.reset(new Ogre::Image ()); - mSunColoursImage->load (filename, RESOURCE_GROUP_NAME); - } - - Ogre::ColourValue CaelumSystem::getFogColour (Real time, const Ogre::Vector3 &sunDir) { - if (!mSkyGradientsImage.get()) { - return Ogre::ColourValue::Black; - } - - Real elevation = sunDir.dotProduct (Ogre::Vector3::UNIT_Y) * 0.5 + 0.5; - Ogre::ColourValue col = InternalUtilities::getInterpolatedColour (elevation, 1, mSkyGradientsImage.get(), false); - return col; - } - - Real CaelumSystem::getFogDensity (Real time, const Ogre::Vector3 &sunDir) - { - if (!mSkyGradientsImage.get()) { - return 0; - } - - Real elevation = sunDir.dotProduct (Ogre::Vector3::UNIT_Y) * 0.5 + 0.5; - Ogre::ColourValue col = InternalUtilities::getInterpolatedColour (elevation, 1, mSkyGradientsImage.get(), false); - return col.a; - } - - Ogre::ColourValue CaelumSystem::getSunSphereColour (Real time, const Ogre::Vector3 &sunDir) - { - if (!mSunColoursImage.get()) { - return Ogre::ColourValue::White; - } - - Real elevation = sunDir.dotProduct (Ogre::Vector3::UNIT_Y); - elevation = elevation * 2 + 0.4; - return InternalUtilities::getInterpolatedColour (elevation, 1, mSunColoursImage.get(), false); - } - - Ogre::ColourValue CaelumSystem::getSunLightColour (Real time, const Ogre::Vector3 &sunDir) - { - if (!mSkyGradientsImage.get()) { - exit(-1); - return Ogre::ColourValue::White; - } - Real elevation = sunDir.dotProduct (Ogre::Vector3::UNIT_Y) * 0.5 + 0.5; - - // Hack: return averaged sky colours. - // Don't use an alpha value for lights, this can cause nasty problems. - Ogre::ColourValue col = InternalUtilities::getInterpolatedColour (elevation, elevation, mSkyGradientsImage.get(), false); - Real val = (col.r + col.g + col.b) / 3; - col = Ogre::ColourValue(val, val, val, 1.0); - assert(Ogre::Math::RealEqual(col.a, 1)); - return col; - } - - Ogre::ColourValue CaelumSystem::getMoonBodyColour (const Ogre::Vector3 &moonDir) { - return Ogre::ColourValue::White; - } - - Ogre::ColourValue CaelumSystem::getMoonLightColour (const Ogre::Vector3 &moonDir) - { - if (!mSkyGradientsImage.get()) { - return Ogre::ColourValue::Blue; - } - // Scaled version of getSunLightColor - Real elevation = moonDir.dotProduct (Ogre::Vector3::UNIT_Y) * 0.5 + 0.5; - Ogre::ColourValue col = InternalUtilities::getInterpolatedColour (elevation, elevation, mSkyGradientsImage.get(), false); - Real val = (col.r + col.g + col.b) / 3; - col = Ogre::ColourValue(val / 2.5f, val / 2.5f, val / 2.5f, 1.0); - assert(Ogre::Math::RealEqual(col.a, 1)); - return col; - } - - const Ogre::Vector3 CaelumSystem::makeDirection ( - Ogre::Degree azimuth, Ogre::Degree altitude) - { - Ogre::Vector3 res; - res.z = -Ogre::Math::Cos (azimuth) * Ogre::Math::Cos (altitude); // North - res.x = Ogre::Math::Sin (azimuth) * Ogre::Math::Cos (altitude); // East - res.y = -Ogre::Math::Sin (altitude); // Zenith - return res; - } - - const Ogre::Vector3 CaelumSystem::getSunDirection (LongReal jday) - { - Ogre::Degree azimuth, altitude; - { - ScopedHighPrecissionFloatSwitch precissionSwitch; - - Astronomy::getHorizontalSunPosition(jday, - getObserverLongitude(), getObserverLatitude(), - azimuth, altitude); - } - Ogre::Vector3 res = makeDirection(azimuth, altitude); - - return res; - } - - const Ogre::Vector3 CaelumSystem::getMoonDirection (LongReal jday) - { - Ogre::Degree azimuth, altitude; - { - ScopedHighPrecissionFloatSwitch precissionSwitch; - - Astronomy::getHorizontalMoonPosition(jday, - getObserverLongitude (), getObserverLatitude (), - azimuth, altitude); - } - Ogre::Vector3 res = makeDirection(azimuth, altitude); - - return res; - } - - const Ogre::Real CaelumSystem::getMoonPhase (LongReal jday) - { - // Calculates julian days since January 22, 2008 13:36 (full moon) - // and divides by the time between lunations (synodic month) - LongReal T = (jday - 2454488.0665L) / 29.531026L; - - T = fabs(fmod(T, 1)); - return -fabs(-4 * T + 2) + 2; - } - - void CaelumSystem::forceSubcomponentQueryFlags (uint flags) - { - if (getSkyDome ()) getSkyDome ()->setQueryFlags (flags); - if (getSun ()) getSun ()->setQueryFlags (flags); - if (getMoon ()) getMoon ()->setQueryFlags (flags); - if (getImageStarfield ()) getImageStarfield ()->setQueryFlags (flags); - if (getPointStarfield ()) getPointStarfield ()->setQueryFlags (flags); - if (getGroundFog ()) getGroundFog ()->setQueryFlags (flags); - if (getCloudSystem ()) getCloudSystem ()->forceLayerQueryFlags (flags); - } - - void CaelumSystem::forceSubcomponentVisibilityFlags (uint flags) - { - if (getSkyDome ()) getSkyDome ()->setVisibilityFlags (flags); - if (getSun ()) getSun ()->setVisibilityFlags (flags); - if (getMoon ()) getMoon ()->setVisibilityFlags (flags); - if (getImageStarfield ()) getImageStarfield ()->setVisibilityFlags (flags); - if (getPointStarfield ()) getPointStarfield ()->setVisibilityFlags (flags); - if (getGroundFog ()) getGroundFog ()->setVisibilityFlags (flags); - if (getCloudSystem ()) getCloudSystem ()->forceLayerVisibilityFlags (flags); - } -} diff --git a/extern/caelum/src/CameraBoundElement.cpp b/extern/caelum/src/CameraBoundElement.cpp deleted file mode 100644 index 027520e6e..000000000 --- a/extern/caelum/src/CameraBoundElement.cpp +++ /dev/null @@ -1,66 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2006-2008 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -#include "CaelumPrecompiled.h" -#include "CameraBoundElement.h" - -namespace Caelum -{ - const Ogre::Real CameraBoundElement::CAMERA_NEAR_DISTANCE_MULTIPLIER = 10; - - CameraBoundElement::CameraBoundElement(): - mAutoRadius(true) - { - } - - CameraBoundElement::~CameraBoundElement() - { - } - - void CameraBoundElement::notifyCameraChanged (Ogre::Camera *cam) { - if (mAutoRadius) { - if (cam->getFarClipDistance () > 0) { - setFarRadius((cam->getFarClipDistance () + cam->getNearClipDistance ()) / 2); - } else { - setFarRadius(cam->getNearClipDistance () * CAMERA_NEAR_DISTANCE_MULTIPLIER); - } - } - } - - void CameraBoundElement::forceFarRadius (Ogre::Real radius) { - if (radius > 0) { - mAutoRadius = false; - setFarRadius(radius); - } else { - mAutoRadius = true; - } - } - - bool CameraBoundElement::getAutoRadius () const { - return mAutoRadius; - } - - void CameraBoundElement::setAutoRadius () { - forceFarRadius (-1); - } - - void CameraBoundElement::setFarRadius(Ogre::Real radius) { - } -} diff --git a/extern/caelum/src/CloudSystem.cpp b/extern/caelum/src/CloudSystem.cpp deleted file mode 100644 index bb7e12485..000000000 --- a/extern/caelum/src/CloudSystem.cpp +++ /dev/null @@ -1,95 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2008 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -#include "CaelumPrecompiled.h" -#include "CloudSystem.h" -#include "FlatCloudLayer.h" - -using namespace Ogre; - -namespace Caelum -{ - CloudSystem::CloudSystem( - Ogre::SceneManager *sceneMgr, - Ogre::SceneNode *cloudRoot) - { - mSceneMgr = sceneMgr; - mCloudRoot = cloudRoot; - } - - FlatCloudLayer* CloudSystem::createLayerAtHeight(Ogre::Real height) - { - FlatCloudLayer* layer = this->createLayer (); - layer->setHeight(height); - return layer; - } - - FlatCloudLayer* CloudSystem::createLayer() - { - std::auto_ptr layer(new FlatCloudLayer(mSceneMgr, mCloudRoot)); - mLayers.push_back(layer.get()); - return layer.release(); - } - - void CloudSystem::addLayer(FlatCloudLayer* layer) - { - assert(layer != NULL); - mLayers.push_back(layer); - } - - void CloudSystem::clearLayers() - { - for (unsigned i = 0; i < mLayers.size(); i++) - { - delete mLayers[i]; - mLayers[i] = 0; - } - } - - CloudSystem::~CloudSystem() - { - clearLayers (); - } - - void CloudSystem::update( - Ogre::Real timePassed, - const Ogre::Vector3 &sunDirection, - const Ogre::ColourValue &sunLightColour, - const Ogre::ColourValue &fogColour, - const Ogre::ColourValue &sunSphereColour) - { - for (uint i = 0; i < mLayers.size(); i++) { - assert(mLayers[i] != NULL); - mLayers[i]->update(timePassed, sunDirection, sunLightColour, fogColour, sunSphereColour); - } - } - - void CloudSystem::forceLayerQueryFlags (uint flags) { - for (uint i = 0; i < mLayers.size(); i++) { - mLayers[i]->setQueryFlags (flags); - } - } - - void CloudSystem::forceLayerVisibilityFlags (uint flags) { - for (uint i = 0; i < mLayers.size(); i++) { - mLayers[i]->setVisibilityFlags (flags); - } - } -} diff --git a/extern/caelum/src/DepthComposer.cpp b/extern/caelum/src/DepthComposer.cpp deleted file mode 100644 index df0572a28..000000000 --- a/extern/caelum/src/DepthComposer.cpp +++ /dev/null @@ -1,491 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2008 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -#include "CaelumPrecompiled.h" -#include "CaelumExceptions.h" -#include "DepthComposer.h" - -using namespace Ogre; - -namespace Caelum -{ - DepthComposer::DepthComposer - ( - Ogre::SceneManager *sceneMgr - ): - mSceneMgr (sceneMgr), - mDebugDepthRender (false), - mSkyDomeHazeEnabled (false), - mGroundFogEnabled (false), - mGroundFogDensity (0.1), - mGroundFogBaseLevel (5), - mGroundFogVerticalDecay (0.2), - mGroundFogColour (ColourValue::Black) - { - } - - DepthComposer::~DepthComposer() - { - destroyAllViewportInstances(); - } - - void DepthComposer::setDebugDepthRender (bool value) - { - if (mDebugDepthRender == value) { - return; - } - mDebugDepthRender = value; - onCompositorMaterialChanged (); - } - - void DepthComposer::setSkyDomeHazeEnabled (bool value) - { - if (mSkyDomeHazeEnabled == value) { - return; - } - mSkyDomeHazeEnabled = value; - onCompositorMaterialChanged (); - } - - void DepthComposer::setGroundFogEnabled (bool value) - { - if (mGroundFogEnabled == value) { - return; - } - mGroundFogEnabled = value; - onCompositorMaterialChanged (); - } - - const String& DepthComposer::getCompositorName () - { - // Constant Ogre::Strings for names. - static const Ogre::String CompositorName_DebugDepthRender = - "Caelum/DepthComposer_DebugDepthRender"; - static const Ogre::String CompositorName_Dummy = - "Caelum/DepthComposer_Dummy"; - static const Ogre::String CompositorName_ExpGroundFog = - "Caelum/DepthComposer_ExpGroundFog"; - static const Ogre::String CompositorName_SkyDomeHaze = - "Caelum/DepthComposer_SkyDomeHaze"; - static const Ogre::String CompositorName_SkyDomeHaze_ExpGroundFog = - "Caelum/DepthComposer_SkyDomeHaze_ExpGroundFog"; - - // Should probably build materials and compositors by hand. - if (mDebugDepthRender) { - return CompositorName_DebugDepthRender; - } else if (mSkyDomeHazeEnabled == false && mGroundFogEnabled == false) { - return CompositorName_Dummy; - } else if (mSkyDomeHazeEnabled == false && mGroundFogEnabled == true) { - return CompositorName_ExpGroundFog; - } else if (mSkyDomeHazeEnabled == true && mGroundFogEnabled == false) { - return CompositorName_SkyDomeHaze; - } else if (mSkyDomeHazeEnabled == true && mGroundFogEnabled == true) { - return CompositorName_SkyDomeHaze_ExpGroundFog; - } else { - assert (0); - return CompositorName_Dummy; - } - } - - void DepthComposer::onCompositorMaterialChanged () - { - ViewportInstanceMap::const_iterator it; - ViewportInstanceMap::const_iterator begin = mViewportInstanceMap.begin(); - ViewportInstanceMap::const_iterator end = mViewportInstanceMap.end(); - for (it = begin; it != end; ++it) { - it->second->removeCompositor (); - it->second->addCompositor (); - } - } - - void DepthComposer::update () - { - ViewportInstanceMap::const_iterator it; - ViewportInstanceMap::const_iterator begin = mViewportInstanceMap.begin(); - ViewportInstanceMap::const_iterator end = mViewportInstanceMap.end(); - for (it = begin; it != end; ++it) { - assert(it->first == it->second->getViewport()); - it->second->_update (); - } - } - - DepthComposerInstance::DepthComposerInstance - ( - DepthComposer* parent, - Ogre::Viewport* viewport - ): - mParent(parent), - mViewport(viewport), - mCompInst(0) - { - LogManager::getSingleton().logMessage ( - "Caelum::DepthComposer: Attaching screen-space fog instance" - " to viewport \'" + StringConverter::toString ((long)getViewport ()) + "\'" - " of render target \'" + getViewport()->getTarget ()->getName () + "\'"); - - addCompositor (); - mDepthRenderer.reset (new DepthRenderer (getViewport ())); - } - - DepthComposerInstance::~DepthComposerInstance() - { - removeCompositor (); - mDepthRenderer.reset (); - - LogManager::getSingleton().logMessage ( - "Caelum::DepthComposer: Detached screen-space fog instance" - " from viewport \'" + StringConverter::toString ((long)getViewport ()) + "\'" - " of render target \'" + getViewport()->getTarget ()->getName () + "\'"); - } - - void DepthComposerInstance::addCompositor () - { - CompositorManager* compMgr = CompositorManager::getSingletonPtr(); - - const String& compositorName = getParent ()->getCompositorName (); - mCompInst = compMgr->addCompositor(mViewport, compositorName); - if (!mCompInst) { - CAELUM_THROW_UNSUPPORTED_EXCEPTION ( - "Can't add \'" + compositorName + "\' compositor.", - "DepthComposer"); - } - assert(mCompInst); - mCompInst->setEnabled (true); - mCompInst->addListener (this); - } - - void DepthComposerInstance::removeCompositor () - { - CompositorManager* compMgr = CompositorManager::getSingletonPtr(); - compMgr->removeCompositor (mViewport, mCompInst->getCompositor ()->getName ()); - mCompInst = 0; - } - - void DepthComposerInstance::notifyMaterialSetup(uint pass_id, Ogre::MaterialPtr &mat) - { - //LogManager::getSingleton ().logMessage ( - // "Caelum::DepthComposer: Material setup"); - - Pass* pass = mat->getBestTechnique ()->getPass (0); - - TextureUnitState *depthTus = pass->getTextureUnitState(1); - if (depthTus->getTextureName () != mDepthRenderer->getDepthRenderTexture ()->getName()) { - depthTus->setTextureName (mDepthRenderer->getDepthRenderTexture ()->getName ()); - LogManager::getSingleton ().logMessage ( - "Caelum::DepthComposer: Assigned depth texture in compositor material"); - } - - mParams.setup(pass->getFragmentProgramParameters ()); - } - - void DepthComposerInstance::Params::setup(Ogre::GpuProgramParametersSharedPtr fpParams) - { - this->fpParams = fpParams; - invViewProjMatrix.bind(fpParams, "invViewProjMatrix"); - worldCameraPos.bind(fpParams, "worldCameraPos"); - groundFogDensity.bind(fpParams, "groundFogDensity"); - groundFogVerticalDecay.bind(fpParams, "groundFogVerticalDecay"); - groundFogBaseLevel.bind(fpParams, "groundFogBaseLevel"); - groundFogColour.bind(fpParams, "groundFogColour"); - sunDirection.bind(fpParams, "sunDirection"); - hazeColour.bind(fpParams, "hazeColour"); - } - - void DepthComposerInstance::notifyMaterialRender(uint pass_id, Ogre::MaterialPtr &mat) - { - Camera* camera = getViewport ()->getCamera (); - - assert(mParams.fpParams == mat->getBestTechnique ()->getPass (0)->getFragmentProgramParameters ()); - - // Auto param in a compositor does not use the external camera. - // This means that sending matrices as auto_param will not work as expected. - // Do it manually instead. - Matrix4 projMatrix = camera->getProjectionMatrixWithRSDepth(); - Matrix4 viewMatrix = camera->getViewMatrix(); - - mParams.invViewProjMatrix.set(mParams.fpParams, (projMatrix * viewMatrix).inverse()); - - mParams.worldCameraPos.set(mParams.fpParams, camera->getDerivedPosition ()); - - mParams.groundFogDensity.set(mParams.fpParams, getParent ()->getGroundFogDensity ()); - mParams.groundFogVerticalDecay.set(mParams.fpParams, getParent ()->getGroundFogVerticalDecay ()); - mParams.groundFogBaseLevel.set(mParams.fpParams, getParent ()->getGroundFogBaseLevel ()); - mParams.groundFogColour.set(mParams.fpParams, getParent ()->getGroundFogColour ()); - - mParams.sunDirection.set(mParams.fpParams, getParent ()->getSunDirection ()); - mParams.hazeColour.set(mParams.fpParams, getParent ()->getHazeColour ()); - } - - void DepthComposerInstance::_update () - { - mDepthRenderer->update (); - } - - DepthComposerInstance* DepthComposer::createViewportInstance(Ogre::Viewport* vp) - { - ViewportInstanceMap::const_iterator it = mViewportInstanceMap.find(vp); - if (it == mViewportInstanceMap.end()) { - std::auto_ptr inst(new DepthComposerInstance(this, vp)); - mViewportInstanceMap.insert(std::make_pair(vp, inst.get())); - // hold instance until successfully added to map. - return inst.release(); - } else { - return it->second; - } - } - - DepthComposerInstance* DepthComposer::getViewportInstance(Ogre::Viewport* vp) { - ViewportInstanceMap::iterator it = mViewportInstanceMap.find(vp); - if (it != mViewportInstanceMap.end()) { - return it->second; - } else { - return 0; - } - } - - void DepthComposer::destroyViewportInstance(Viewport* vp) - { - ViewportInstanceMap::iterator it = mViewportInstanceMap.find(vp); - if (it != mViewportInstanceMap.end()) { - DepthComposerInstance* inst = it->second; - delete inst; - mViewportInstanceMap.erase(it); - } - } - - void DepthComposer::destroyAllViewportInstances() { - ViewportInstanceMap::const_iterator it; - ViewportInstanceMap::const_iterator begin = mViewportInstanceMap.begin(); - ViewportInstanceMap::const_iterator end = mViewportInstanceMap.end(); - for (it = begin; it != end; ++it) { - assert(it->first == it->second->getViewport()); - delete it->second; - } - mViewportInstanceMap.clear(); - } - - const String DepthRenderer::DEFAULT_CUSTOM_DEPTH_SCHEME_NAME = "CaelumDepth"; - - DepthRenderer::DepthRenderer - ( - Viewport* masterViewport - ): - mMasterViewport (masterViewport), - mDepthRenderViewport (0), - mDepthRenderingNow (false), - mViewportVisibilityMask (~0), - mUseCustomDepthScheme (true), - mCustomDepthSchemeName (DEFAULT_CUSTOM_DEPTH_SCHEME_NAME) - { - disableRenderGroupRangeFilter (); - - Ogre::String uniqueId = Ogre::StringConverter::toString ((size_t)this); - - // Not cloned! - mDepthRenderMaterial = MaterialManager::getSingleton ().getByName ("Caelum/DepthRender"); - mDepthRenderMaterial->load(); - if (!mDepthRenderMaterial->getBestTechnique ()) { - CAELUM_THROW_UNSUPPORTED_EXCEPTION ( - "Can't load depth render material: " + - mDepthRenderMaterial->getUnsupportedTechniquesExplanation(), - "DepthComposer"); - } - - TextureManager* texMgr = TextureManager::getSingletonPtr(); - - int width = getMasterViewport ()->getActualWidth (); - int height = getMasterViewport ()->getActualHeight (); - LogManager::getSingleton ().logMessage ( - "Caelum::DepthRenderer: Creating depth render texture size " + - StringConverter::toString (width) + - "x" + - StringConverter::toString (height)); - - PixelFormat desiredFormat = PF_FLOAT32_R; - PixelFormat requestFormat = desiredFormat; - if (texMgr->isFormatSupported (TEX_TYPE_2D, desiredFormat, TU_RENDERTARGET)) { - LogManager::getSingleton ().logMessage ( - "Caelum::DepthRenderer: RenderSystem has native support for " + - PixelUtil::getFormatName (desiredFormat)); - } else if (texMgr->isEquivalentFormatSupported (TEX_TYPE_2D, desiredFormat, TU_RENDERTARGET)) { - PixelFormat equivFormat = texMgr->getNativeFormat (TEX_TYPE_2D, desiredFormat, TU_RENDERTARGET); - LogManager::getSingleton ().logMessage ( - "Caelum::DepthRenderer: RenderSystem supports " + - PixelUtil::getFormatName (equivFormat) + - " instead of " + - PixelUtil::getFormatName (desiredFormat)); - requestFormat = equivFormat; - } else { - CAELUM_THROW_UNSUPPORTED_EXCEPTION ( - PixelUtil::getFormatName(desiredFormat) + " or equivalent not supported", - "DepthRenderer"); - } - - if (texMgr->isHardwareFilteringSupported (TEX_TYPE_2D, requestFormat, TU_RENDERTARGET)) { - LogManager::getSingleton ().logMessage ( - "Caelum::DepthRenderer: RenderSystem supports hardware filtering for " + - PixelUtil::getFormatName (requestFormat)); - } else { - LogManager::getSingleton ().logMessage ( - "Caelum::DepthRenderer: RenderSystem does not support hardware filtering for " + - PixelUtil::getFormatName (requestFormat)); - } - - // Create depth texture. - // This depends on the size of the viewport. - mDepthRenderTexture = texMgr->createManual( - "Caelum/DepthComposer/" + uniqueId + "/DepthTexture", - Caelum::RESOURCE_GROUP_NAME, - TEX_TYPE_2D, - width, height, 1, - 0, - requestFormat, - TU_RENDERTARGET, - 0); - - assert(getDepthRenderTarget()); - - // Should be the same format - LogManager::getSingleton().logMessage ( - "Caelum::DepthRenderer: Created depth render texture" - " actual format " + PixelUtil::getFormatName (getDepthRenderTexture()->getFormat ()) + - " desired format " + PixelUtil::getFormatName (getDepthRenderTexture()->getDesiredFormat ())); - - // We do our updates by hand. - getDepthRenderTarget()->setAutoUpdated (false); - - // Viewport for the depth rtt. Don't set camera here; it can mess Camera::getViewport(); - mDepthRenderViewport = getDepthRenderTarget()->addViewport(0); - getDepthRenderViewport ()->setShadowsEnabled (false); - getDepthRenderViewport ()->setOverlaysEnabled (false); - getDepthRenderViewport ()->setClearEveryFrame (true); - - // Depth buffer values range from 0 to 1 in both OpenGL and Directx; unless depth ranges are used. - // Clear to the maximum value. - getDepthRenderViewport ()->setBackgroundColour (Ogre::ColourValue (1, 1, 1, 1)); - } - - DepthRenderer::~DepthRenderer() - { - TextureManager* texMgr = TextureManager::getSingletonPtr(); - - // Destroy render texture. - if (!mDepthRenderTexture.isNull ()) { - texMgr->remove (mDepthRenderTexture->getHandle ()); - mDepthRenderTexture.setNull (); - } - } - - void DepthRenderer::update () - { - Camera* camera = getMasterViewport ()->getCamera (); - Viewport* oldCameraViewport = camera->getViewport (); - SceneManager *sceneManager = camera->getSceneManager (); - - assert (oldCameraViewport == getMasterViewport ()); - assert (getDepthRenderViewport ()->getActualWidth () == getMasterViewport()->getActualWidth ()); - assert (getDepthRenderViewport ()->getActualHeight () == getMasterViewport()->getActualHeight ()); - - getDepthRenderViewport ()->setVisibilityMask (mViewportVisibilityMask); - getDepthRenderViewport ()->setCamera (camera); - if (this->getUseCustomDepthScheme ()) { - getDepthRenderViewport ()->setMaterialScheme (this->getCustomDepthSchemeName ()); - } - - // Restore old listener after we're done. - // Hopefully this will not break horribly. - RenderQueue::RenderableListener* oldListener = sceneManager->getRenderQueue ()->getRenderableListener(); - if (oldListener) { - //LogManager::getSingleton ().logMessage ( - // "Caelum: Found another render queue listener. This could be bad."); - } - sceneManager->getRenderQueue ()->setRenderableListener (this); - - mDepthRenderingNow = true; - //LogManager::getSingleton ().logMessage ("Caelum: Begin depth rendering"); - getDepthRenderTarget ()->update (); - //LogManager::getSingleton ().logMessage ("Caelum: End depth rendering"); - mDepthRenderingNow = false; - - sceneManager->getRenderQueue ()->setRenderableListener (oldListener); - oldListener = 0; - - // Restore the camera's viewport. Ogre compositors do the same thing. - camera->_notifyViewport (oldCameraViewport); - } - -#if OGRE_VERSION < 0x00010600 - bool DepthRenderer::renderableQueued( - Ogre::Renderable* rend, - Ogre::uint8 groupId, - Ogre::ushort priority, - Ogre::Technique** ppTech) -#else - bool DepthRenderer::renderableQueued( - Ogre::Renderable* rend, - Ogre::uint8 groupId, - Ogre::ushort priority, - Ogre::Technique** ppTech, - Ogre::RenderQueue* pQueue) -#endif // OGRE_VERSION - { - assert (mDepthRenderingNow); - - /* - LogManager::getSingleton ().logMessage ( - "Caelum: Renderable queued" - " group " + StringConverter::toString (groupId) + - " priority " + StringConverter::toString (priority)); - */ - if (groupId < mMinRenderGroupId || groupId > mMaxRenderGroupId) { - return false; - } - - if (this->getUseCustomDepthScheme () && (*ppTech)->getSchemeName () == this->getCustomDepthSchemeName ()) { - /* - LogManager::getSingleton().getDefaultLog()->logMessage ( - "Custom scheme with tech " + (*ppTech)->getName () + - " passCount " + StringConverter::toString ((*ppTech)->getNumPasses ()) + - " vp " + (*ppTech)->getPass (0)->getVertexProgramName () + - " fp " + (*ppTech)->getPass (0)->getFragmentProgramName ()); - */ - return true; - } - - // Get depth material - Material* depthMaterial = getDepthRenderMaterial (); - Technique* tech = depthMaterial->getBestTechnique (); - - // Replace ALL techniques. - *ppTech = tech; - return true; - } - - void DepthRenderer::setRenderGroupRangeFilter (int minGroup, int maxGroup) - { - mMinRenderGroupId = minGroup; - mMaxRenderGroupId = maxGroup; - } - - void DepthRenderer::disableRenderGroupRangeFilter() - { - setRenderGroupRangeFilter(Ogre::RENDER_QUEUE_BACKGROUND, Ogre::RENDER_QUEUE_MAX); - } -} diff --git a/extern/caelum/src/FastGpuParamRef.cpp b/extern/caelum/src/FastGpuParamRef.cpp deleted file mode 100644 index 156d7bd54..000000000 --- a/extern/caelum/src/FastGpuParamRef.cpp +++ /dev/null @@ -1,59 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2009 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -#include "CaelumPrecompiled.h" -#include "FastGpuParamRef.h" - -using namespace Ogre; - -namespace Caelum -{ - FastGpuParamRef::FastGpuParamRef(Ogre::GpuProgramParametersSharedPtr paramsPtr, const Ogre::String& name) - { - this->bind(paramsPtr, name); - } - - void FastGpuParamRef::bind( - Ogre::GpuProgramParametersSharedPtr params, - const Ogre::String& name, - bool throwIfNotFound/* = false*/) - { - assert(!params.isNull()); - #if CAELUM_DEBUG_PARAM_REF - mParams = params; - #endif - const GpuConstantDefinition* def = params->_findNamedConstantDefinition(name, throwIfNotFound); - if (def) { - mPhysicalIndex = def->physicalIndex; - assert(this->isBound()); - } else { - mPhysicalIndex = InvalidPhysicalIndex; - assert(!this->isBound()); - } - } - - void FastGpuParamRef::unbind() { - #if CAELUM_DEBUG_PARAM_REF - mParams.setNull(); - #endif - mPhysicalIndex = InvalidPhysicalIndex; - assert(!this->isBound()); - } -} diff --git a/extern/caelum/src/FlatCloudLayer.cpp b/extern/caelum/src/FlatCloudLayer.cpp deleted file mode 100644 index 8bca4d6da..000000000 --- a/extern/caelum/src/FlatCloudLayer.cpp +++ /dev/null @@ -1,384 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2008 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -#include "CaelumPrecompiled.h" -#include "FlatCloudLayer.h" -#include "CaelumExceptions.h" -#include "InternalUtilities.h" - -namespace Caelum -{ - FlatCloudLayer::FlatCloudLayer( - Ogre::SceneManager *sceneMgr, - Ogre::SceneNode *cloudRoot) - { - Ogre::String uniqueSuffix = InternalUtilities::pointerToString(this); - - // Clone material - mMaterial.reset(InternalUtilities::checkLoadMaterialClone ("CaelumLayeredClouds", "Caelum/FlatCloudLayer/Material" + uniqueSuffix)); - - mParams.setup( - mMaterial->getTechnique(0)->getPass(0)->getVertexProgramParameters(), - mMaterial->getTechnique(0)->getPass(0)->getFragmentProgramParameters()); - - // Create the scene node. - mSceneMgr = sceneMgr; - mNode.reset(cloudRoot->createChildSceneNode()); - mNode->setPosition(Ogre::Vector3(0, 0, 0)); - - // Noise texture names are fixed. - mNoiseTextureNames.clear(); - mNoiseTextureNames.push_back("noise1.dds"); - mNoiseTextureNames.push_back("noise2.dds"); - mNoiseTextureNames.push_back("noise3.dds"); - mNoiseTextureNames.push_back("noise4.dds"); - - // Invalid; will reset on first opportunity. - mCurrentTextureIndex = -1; - - // By default height is 0; the user is expected to change this. - setHeight(0); - - // Reset parameters. This is relied upon to initialize most fields. - this->reset(); - - // Ensure geometry; don't wait for first update. - this->_ensureGeometry(); - } - - FlatCloudLayer::~FlatCloudLayer() - { - mSceneMgr = 0; - - // Rely on PrivatePtr for everything interesting. - } - - void FlatCloudLayer::_invalidateGeometry () { - mMeshDirty = true; - } - - void FlatCloudLayer::_ensureGeometry () - { - if (!mMeshDirty) { - return; - } - - // Generate unique names based on pointer. - Ogre::String uniqueId = Ogre::StringConverter::toString((size_t)this); - Ogre::String planeMeshName = "Caelum/FlatCloudLayer/Plane/" + uniqueId; - Ogre::String entityName = "Caelum/FlatCloudLayer/Entity/" + uniqueId; - - // Cleanup first. Entity references mesh so it must be destroyed first. - mEntity.reset(); - mMesh.reset(); - - /* - Ogre::LogManager::getSingleton().logMessage( - "Creating cloud layer mesh " + - Ogre::StringConverter::toString(mMeshWidthSegments) + "x" + - Ogre::StringConverter::toString(mMeshHeightSegments) + " segments"); - */ - - // Recreate mesh. - Ogre::Plane meshPlane( - Ogre::Vector3(1, 1, 0), - Ogre::Vector3(1, 1, 1), - Ogre::Vector3(0, 1, 1)); - mMesh.reset(Ogre::MeshManager::getSingleton().createPlane( - planeMeshName, Caelum::RESOURCE_GROUP_NAME, meshPlane, - mMeshWidth, mMeshHeight, - mMeshWidthSegments, mMeshHeightSegments, - false, 1, - 1.0f, 1.0f, - Ogre::Vector3::UNIT_X)); - - // Recreate entity. - mEntity.reset(mSceneMgr->createEntity(entityName, mMesh->getName())); - mEntity->setMaterialName(mMaterial->getName()); - - // Reattach entity. - mNode->attachObject(mEntity.get()); - - // Mark done. - mMeshDirty = false; - } - - void FlatCloudLayer::setMeshParameters ( - Real meshWidth, Real meshHeight, - int meshWidthSegments, int meshHeightSegments) - { - bool invalidate = - (mMeshWidthSegments != meshWidthSegments) || - (mMeshHeightSegments != meshHeightSegments) || - (abs(mMeshWidth - meshWidth) > 0.001) || - (abs(mMeshHeight - meshHeight) > 0.001); - mMeshWidth = meshWidth; - mMeshHeight = meshHeight; - mMeshWidthSegments = meshWidthSegments; - mMeshHeightSegments = meshHeightSegments; - if (invalidate) { - _invalidateGeometry(); - } - } - - void FlatCloudLayer::reset() - { - _invalidateGeometry (); - setMeshParameters(10000000, 10000000, 10, 10); - - assert (mCloudCoverLookup.get() == 0); - setCloudCoverLookup ("CloudCoverLookup.png"); - setCloudCover (0.3); - setCloudCoverVisibilityThreshold (0.001); - - setCloudMassOffset (Ogre::Vector2(0, 0)); - setCloudDetailOffset (Ogre::Vector2(0, 0)); - setCloudBlendTime (3600 * 24); - setCloudBlendPos (0.5); - - setCloudSpeed (Ogre::Vector2(0.000005, -0.000009)); - - setCloudUVFactor (150); - setHeightRedFactor (100000); - - setFadeDistances (10000, 140000); - setFadeDistMeasurementVector (Ogre::Vector3(0, 1, 1)); - - setSunDirection (Ogre::Vector3::UNIT_Y); - setFogColour (Ogre::ColourValue::Black); - setSunLightColour (Ogre::ColourValue::White); - setSunSphereColour (Ogre::ColourValue::White); - } - - void FlatCloudLayer::update ( - Ogre::Real timePassed, - const Ogre::Vector3 &sunDirection, - const Ogre::ColourValue &sunLightColour, - const Ogre::ColourValue &fogColour, - const Ogre::ColourValue &sunSphereColour) - { - // Advance animation - advanceAnimation (timePassed); - - // Set parameters. - setSunDirection (sunDirection); - setSunLightColour (sunLightColour); - setSunSphereColour (sunSphereColour); - setFogColour (fogColour); - - this->_ensureGeometry(); - - this->_updateVisibilityThreshold(); - } - - void FlatCloudLayer::_updateVisibilityThreshold () - { - if (!mEntity.isNull()) { - mEntity->setVisible (getCloudCover () > this->getCloudCoverVisibilityThreshold ()); - } - } - - void FlatCloudLayer::advanceAnimation (Ogre::Real timePassed) - { - // Move clouds. - setCloudMassOffset(mCloudMassOffset + timePassed * mCloudSpeed); - setCloudDetailOffset(mCloudDetailOffset - timePassed * mCloudSpeed); - - // Animate cloud blending. - setCloudBlendPos (getCloudBlendPos () + timePassed / mCloudBlendTime); - } - - void FlatCloudLayer::Params::setup(Ogre::GpuProgramParametersSharedPtr vpParams, Ogre::GpuProgramParametersSharedPtr fpParams) - { - this->vpParams = vpParams; - this->fpParams = fpParams; - cloudCoverageThreshold.bind(fpParams, "cloudCoverageThreshold"); - cloudMassOffset.bind(fpParams, "cloudMassOffset"); - cloudDetailOffset.bind(fpParams, "cloudDetailOffset"); - cloudMassBlend.bind(fpParams, "cloudMassBlend"); - vpSunDirection.bind(vpParams, "sunDirection"); - fpSunDirection.bind(fpParams, "sunDirection"); - sunLightColour.bind(fpParams, "sunLightColour"); - sunSphereColour.bind(fpParams, "sunSphereColour"); - fogColour.bind(fpParams, "fogColour"); - layerHeight.bind(fpParams, "layerHeight"); - cloudUVFactor.bind(fpParams, "cloudUVFactor"); - heightRedFactor.bind(fpParams, "heightRedFactor"); - nearFadeDist.bind(fpParams, "nearFadeDist"); - farFadeDist.bind(fpParams, "farFadeDist"); - fadeDistMeasurementVector.bind(fpParams, "fadeDistMeasurementVector"); - } - - void FlatCloudLayer::setCloudCoverLookup (const Ogre::String& fileName) { - mCloudCoverLookup.reset(0); - mCloudCoverLookup.reset(new Ogre::Image()); - mCloudCoverLookup->load(fileName, RESOURCE_GROUP_NAME); - - mCloudCoverLookupFileName = fileName; - } - - void FlatCloudLayer::disableCloudCoverLookup () { - mCloudCoverLookup.reset (0); - mCloudCoverLookupFileName.clear (); - } - - const Ogre::String FlatCloudLayer::getCloudCoverLookupFileName () const { - return mCloudCoverLookupFileName; - } - - void FlatCloudLayer::setCloudCoverVisibilityThreshold(const Ogre::Real value) { - mCloudCoverVisibilityThreshold = value; - _updateVisibilityThreshold(); - } - - void FlatCloudLayer::setCloudCover(const Ogre::Real cloudCover) { - mCloudCover = cloudCover; - float cloudCoverageThreshold = 0; - if (mCloudCoverLookup.get() != 0) { - cloudCoverageThreshold = InternalUtilities::getInterpolatedColour(cloudCover, 1, mCloudCoverLookup.get(), false).r; - } else { - cloudCoverageThreshold = 1 - cloudCover; - } - mParams.cloudCoverageThreshold.set(mParams.fpParams, cloudCoverageThreshold); - _updateVisibilityThreshold(); - } - - void FlatCloudLayer::setCloudMassOffset(const Ogre::Vector2 &cloudMassOffset) { - mCloudMassOffset = cloudMassOffset; - mParams.cloudMassOffset.set(mParams.fpParams, Ogre::Vector3(cloudMassOffset.x,cloudMassOffset.y,0)); - } - - void FlatCloudLayer::setCloudDetailOffset(const Ogre::Vector2 &cloudDetailOffset) { - mCloudDetailOffset = cloudDetailOffset; - mParams.cloudDetailOffset.set(mParams.fpParams, Ogre::Vector3(cloudDetailOffset.x,cloudDetailOffset.y,0)); - } - - void FlatCloudLayer::setCloudBlendTime(const Ogre::Real value) { - mCloudBlendTime = value; - } - - Ogre::Real FlatCloudLayer::getCloudBlendTime () const { - return mCloudBlendTime; - } - - void FlatCloudLayer::setCloudBlendPos (const Ogre::Real value) - { - mCloudBlendPos = value; - int textureCount = static_cast(mNoiseTextureNames.size()); - - // Convert to int and bring to [0, textureCount) - int currentTextureIndex = static_cast(floor(mCloudBlendPos)); - currentTextureIndex = ((currentTextureIndex % textureCount) + textureCount) % textureCount; - assert(0 <= currentTextureIndex); - assert(currentTextureIndex < textureCount); - - // Check if we have to change textures. - if (currentTextureIndex != mCurrentTextureIndex) { - String texture1 = mNoiseTextureNames[currentTextureIndex]; - String texture2 = mNoiseTextureNames[(currentTextureIndex + 1) % textureCount]; - //Ogre::LogManager::getSingleton ().logMessage ( - // "Caelum: Switching cloud layer textures to " + texture1 + " and " + texture2); - Ogre::Pass* pass = mMaterial->getBestTechnique()->getPass(0); - pass->getTextureUnitState(0)->setTextureName(texture1); - pass->getTextureUnitState(1)->setTextureName(texture2); - mCurrentTextureIndex = currentTextureIndex; - } - - Ogre::Real cloudMassBlend = fmod(mCloudBlendPos, 1); - mParams.cloudMassBlend.set(mParams.fpParams, cloudMassBlend); - } - - Ogre::Real FlatCloudLayer::getCloudBlendPos () const { - return mCloudBlendPos; - } - - void FlatCloudLayer::setCloudSpeed (const Ogre::Vector2 &cloudSpeed) { - mCloudSpeed = cloudSpeed; - } - - void FlatCloudLayer::setSunDirection (const Ogre::Vector3 &sunDirection) { - mSunDirection = sunDirection; - mParams.vpSunDirection.set(mParams.vpParams, sunDirection); - mParams.fpSunDirection.set(mParams.fpParams, sunDirection); - } - - void FlatCloudLayer::setSunLightColour (const Ogre::ColourValue &sunLightColour) { - mParams.sunLightColour.set(mParams.fpParams, mSunLightColour = sunLightColour); - } - - void FlatCloudLayer::setSunSphereColour (const Ogre::ColourValue &sunSphereColour) { - mParams.sunSphereColour.set(mParams.fpParams, mSunSphereColour = sunSphereColour); - } - - void FlatCloudLayer::setFogColour (const Ogre::ColourValue &fogColour) { - mParams.fogColour.set(mParams.fpParams, mFogColour = fogColour); - } - - const Ogre::Vector3 FlatCloudLayer::getSunDirection () const { - return mSunDirection; - } - - const Ogre::ColourValue FlatCloudLayer::getSunLightColour () const { - return mSunLightColour; - } - - const Ogre::ColourValue FlatCloudLayer::getSunSphereColour () const { - return mSunSphereColour; - } - - const Ogre::ColourValue FlatCloudLayer::getFogColour () const { - return mFogColour; - } - - void FlatCloudLayer::setHeight(Ogre::Real height) { - mNode->setPosition(Ogre::Vector3(0, height, 0)); - mHeight = height; - mParams.layerHeight.set(mParams.fpParams, mHeight); - } - - Ogre::Real FlatCloudLayer::getHeight() const { - return mHeight; - } - - void FlatCloudLayer::setCloudUVFactor (const Ogre::Real value) { - mParams.cloudUVFactor.set(mParams.fpParams, mCloudUVFactor = value); - } - - void FlatCloudLayer::setHeightRedFactor (const Ogre::Real value) { - mParams.heightRedFactor.set(mParams.fpParams, mHeightRedFactor = value); - } - - void FlatCloudLayer::setFadeDistances (const Ogre::Real nearValue, const Ogre::Real farValue) { - setNearFadeDist (nearValue); - setFarFadeDist (farValue); - } - - void FlatCloudLayer::setNearFadeDist (const Ogre::Real value) { - mParams.nearFadeDist.set(mParams.fpParams, mNearFadeDist = value); - } - - void FlatCloudLayer::setFarFadeDist (const Ogre::Real value) { - mParams.farFadeDist.set(mParams.fpParams, mFarFadeDist = value); - } - - void FlatCloudLayer::setFadeDistMeasurementVector (const Ogre::Vector3& value) { - mParams.fadeDistMeasurementVector.set(mParams.fpParams, mFadeDistMeasurementVector = value); - } -} diff --git a/extern/caelum/src/GroundFog.cpp b/extern/caelum/src/GroundFog.cpp deleted file mode 100644 index 2c57081b8..000000000 --- a/extern/caelum/src/GroundFog.cpp +++ /dev/null @@ -1,216 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2006-2007 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -#include "CaelumPrecompiled.h" -#include "GroundFog.h" -#include "CaelumExceptions.h" -#include "InternalUtilities.h" - -namespace Caelum -{ - const Ogre::String GroundFog::DEFAULT_PASS_NAME = "CaelumGroundFog"; - - GroundFog::GroundFog( - Ogre::SceneManager *sceneMgr, - Ogre::SceneNode *caelumRootNode, - const Ogre::String &domeMaterialName, - const Ogre::String &domeEntityName): - mScene(sceneMgr) - { - Ogre::String uniqueSuffix = InternalUtilities::pointerToString (this); - - mDomeMaterial.reset(InternalUtilities::checkLoadMaterialClone (domeMaterialName, domeMaterialName + uniqueSuffix)); - mDomeParams.setup(mDomeMaterial->getTechnique(0)->getPass(0)->getFragmentProgramParameters()); - - // Create dome entity, using a prefab sphere. - // The prefab sphere has a radius of 50 units. - // If this changes in future version of ogre this might break. - mDomeEntity.reset (mScene->createEntity (domeEntityName, Ogre::SceneManager::PT_SPHERE)); - mDomeEntity->setMaterialName (mDomeMaterial->getName ()); - mDomeEntity->setCastShadows (false); - mDomeEntity->setRenderQueueGroup (CAELUM_RENDER_QUEUE_GROUND_FOG); - sceneMgr->getRenderQueue()->getQueueGroup(CAELUM_RENDER_QUEUE_GROUND_FOG)->setShadowsEnabled(false); - - // Create dome node - mDomeNode.reset (caelumRootNode->createChildSceneNode ()); - mDomeNode->attachObject (mDomeEntity.get()); - - // Initialize default fog parameters - mDensity = 0.1; - mVerticalDecay = 0.2; - mGroundLevel = 5; - mFogColour = Ogre::ColourValue::Black; - - forceUpdate(); - } - - GroundFog::~GroundFog() { - // Disable passes. - setDensity(0); - } - - GroundFog::PassSet& GroundFog::getPasses() { - return mPasses; - } - - const GroundFog::PassSet& GroundFog::getPasses() const { - return mPasses; - } - - void GroundFog::findFogPassesByName (const Ogre::String& passName) { - Ogre::MaterialManager *matManager = Ogre::MaterialManager::getSingletonPtr(); - Ogre::MaterialManager::ResourceMapIterator matIt = matManager->getResourceIterator(); - while (matIt.hasMoreElements()) { - Ogre::MaterialPtr mat = matIt.getNext(); - Ogre::Material::TechniqueIterator techIt = mat->getTechniqueIterator(); - while (techIt.hasMoreElements()) { - Ogre::Technique *tech = techIt.getNext(); - Ogre::Technique::PassIterator passIt = tech->getPassIterator(); - while (passIt.hasMoreElements()) { - Ogre::Pass *pass = passIt.getNext(); - if (pass->getName() == passName) { - mPasses.insert(pass); - } - } - } - } - forceUpdate(); - } - - void GroundFog::setDensity (Ogre::Real density) { - if (Ogre::Math::Abs(mDensity - density) > 0.000001) { - for (PassFogParamsVector::const_iterator it = mPassFogParams.begin(), end = mPassFogParams.end(); it != end; ++it) { - it->fogDensity.set(it->fpParams, density); - } - mDensity = density; - } - updateSkyFogging(); - } - - Ogre::Real GroundFog::getDensity () const { - return mDensity; - } - - void GroundFog::setColour (const Ogre::ColourValue &colour) { - bool different = - Ogre::Math::Abs(mFogColour.r - colour.r) > 0.001 || - Ogre::Math::Abs(mFogColour.g - colour.g) > 0.001 || - Ogre::Math::Abs(mFogColour.b - colour.b) > 0.001 || - Ogre::Math::Abs(mFogColour.a - colour.a) > 0.001; - if (different) { - for (PassFogParamsVector::const_iterator it = mPassFogParams.begin(), end = mPassFogParams.end(); it != end; ++it) { - it->fogColour.set(it->fpParams, colour); - } - mFogColour = colour; - } - updateSkyFogging(); - } - - const Ogre::ColourValue GroundFog::getColour () const { - return mFogColour; - } - - void GroundFog::setVerticalDecay (Ogre::Real verticalDecay) { - if (Ogre::Math::Abs(mVerticalDecay - verticalDecay) > 0.000001) { - for (PassFogParamsVector::const_iterator it = mPassFogParams.begin(), end = mPassFogParams.end(); it != end; ++it) { - it->fogVerticalDecay.set(it->fpParams, verticalDecay); - } - mVerticalDecay = verticalDecay; - } - updateSkyFogging(); - } - - Ogre::Real GroundFog::getVerticalDecay () const { - return mVerticalDecay; - } - - void GroundFog::setGroundLevel (Ogre::Real groundLevel) { - if (Ogre::Math::Abs(mGroundLevel - groundLevel) > 0.000001) { - for (PassFogParamsVector::const_iterator it = mPassFogParams.begin(), end = mPassFogParams.end(); it != end; ++it) { - it->fogGroundLevel.set(it->fpParams, groundLevel); - } - mGroundLevel = groundLevel; - } - updateSkyFogging(); - } - - Ogre::Real GroundFog::getGroundLevel () const { - return mGroundLevel; - } - - void GroundFog::updateSkyFogging() { - mDomeParams.fogDensity.set(mDomeParams.fpParams, mDensity); - mDomeParams.fogVerticalDecay.set(mDomeParams.fpParams, mVerticalDecay); - mDomeParams.fogGroundLevel.set(mDomeParams.fpParams, mGroundLevel); - mDomeParams.fogColour.set(mDomeParams.fpParams, mFogColour); - } - - void GroundFog::forceUpdate () - { - updatePassFogParams(); - for (PassFogParamsVector::const_iterator it = mPassFogParams.begin(), end = mPassFogParams.end(); it != end; ++it) { - const PassFogParams& params = *it; - params.fogDensity.set(params.fpParams, mDensity); - params.fogVerticalDecay.set(params.fpParams, mVerticalDecay); - params.fogGroundLevel.set(params.fpParams, mGroundLevel); - params.fogColour.set(params.fpParams, mFogColour); - } - updateSkyFogging(); - } - - void GroundFog::updatePassFogParams () - { - mPassFogParams.clear(); - for (PassSet::const_iterator it = mPasses.begin(), end = mPasses.end(); it != end; ++it) { - mPassFogParams.push_back(PassFogParams((*it)->getFragmentProgramParameters())); - } - std::sort(mPassFogParams.begin(), mPassFogParams.end(), PassFogParams::lessThanByParams); - std::unique(mPassFogParams.begin(), mPassFogParams.end(), PassFogParams::equalByParams); - } - - void GroundFog::FogParamsBase::setup(Ogre::GpuProgramParametersSharedPtr fpParams) { - this->fpParams = fpParams; - fogDensity.bind(fpParams, "fogDensity"); - fogVerticalDecay.bind(fpParams, "fogVerticalDecay"); - fogGroundLevel.bind(fpParams, "fogGroundLevel"); - fogColour.bind(fpParams, "fogColour"); - } - - void GroundFog::DomeFogParams::setup(Ogre::GpuProgramParametersSharedPtr fpParams) { - FogParamsBase::setup(fpParams); - cameraHeight.bind(fpParams, "cameraHeight"); - } - - void GroundFog::notifyCameraChanged (Ogre::Camera *cam) - { - CameraBoundElement::notifyCameraChanged (cam); - - // Send camera height to shader. - float cameraHeight = cam->getDerivedPosition().dotProduct(mDomeNode->_getDerivedOrientation() * Ogre::Vector3::UNIT_Y); - mDomeParams.cameraHeight.set(mDomeParams.fpParams, cameraHeight); - } - - void GroundFog::setFarRadius (Ogre::Real radius) - { - CameraBoundElement::setFarRadius(radius); - // Adjust for radius 50. - mDomeNode->setScale(Ogre::Vector3::UNIT_SCALE * radius / 50.0); - } -} diff --git a/extern/caelum/src/ImageStarfield.cpp b/extern/caelum/src/ImageStarfield.cpp deleted file mode 100644 index 502480bc3..000000000 --- a/extern/caelum/src/ImageStarfield.cpp +++ /dev/null @@ -1,87 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2006-2008 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -#include "CaelumPrecompiled.h" -#include "ImageStarfield.h" -#include "InternalUtilities.h" - -namespace Caelum -{ - const Ogre::String ImageStarfield::STARFIELD_DOME_NAME = "CaelumStarfieldDome"; - const Ogre::String ImageStarfield::STARFIELD_MATERIAL_NAME = "CaelumStarfieldMaterial"; - const Ogre::String ImageStarfield::DEFAULT_TEXTURE_NAME = "Starfield.jpg"; - - ImageStarfield::ImageStarfield - ( - Ogre::SceneManager *sceneMgr, - Ogre::SceneNode *caelumRootNode, - const Ogre::String &textureName/* = DEFAULT_TEXUTRE_NAME*/ - ) - { - mInclination = Ogre::Degree (0); - - String uniqueSuffix = "/" + InternalUtilities::pointerToString (this); - - mStarfieldMaterial.reset (InternalUtilities::checkLoadMaterialClone (STARFIELD_MATERIAL_NAME, STARFIELD_MATERIAL_NAME + uniqueSuffix)); - setTexture (textureName); - - sceneMgr->getRenderQueue ()->getQueueGroup (CAELUM_RENDER_QUEUE_STARFIELD)->setShadowsEnabled (false); - - InternalUtilities::generateSphericDome (STARFIELD_DOME_NAME, 32, InternalUtilities::DT_IMAGE_STARFIELD); - - mEntity.reset(sceneMgr->createEntity ("Caelum/StarfieldDome" + uniqueSuffix, STARFIELD_DOME_NAME)); - mEntity->setMaterialName (mStarfieldMaterial->getName()); - mEntity->setRenderQueueGroup (CAELUM_RENDER_QUEUE_STARFIELD); - mEntity->setCastShadows (false); - - mNode.reset (caelumRootNode->createChildSceneNode ()); - mNode->attachObject (mEntity.get ()); - } - - ImageStarfield::~ImageStarfield () - { - } - - void ImageStarfield::notifyCameraChanged (Ogre::Camera *cam) { - CameraBoundElement::notifyCameraChanged (cam); - } - - void ImageStarfield::setFarRadius (Ogre::Real radius) { - CameraBoundElement::setFarRadius(radius); - mNode->setScale (Ogre::Vector3::UNIT_SCALE * radius); - } - - void ImageStarfield::setInclination (Ogre::Degree inc) { - mInclination = inc; - } - - void ImageStarfield::update (const float time) { - Ogre::Quaternion orientation = Ogre::Quaternion::IDENTITY; - orientation = orientation * Ogre::Quaternion (Ogre::Radian (mInclination + Ogre::Degree (90)), Ogre::Vector3::UNIT_X); - orientation = orientation * Ogre::Quaternion (Ogre::Radian (-time * 2 * Ogre::Math::PI), Ogre::Vector3::UNIT_Y); - - mNode->setOrientation (orientation); - } - - void ImageStarfield::setTexture (const Ogre::String &mapName) { - // Update the starfield material - mStarfieldMaterial->getBestTechnique ()->getPass (0)->getTextureUnitState (0)->setTextureName (mapName); - } -} diff --git a/extern/caelum/src/InternalUtilities.cpp b/extern/caelum/src/InternalUtilities.cpp deleted file mode 100644 index f70b0f267..000000000 --- a/extern/caelum/src/InternalUtilities.cpp +++ /dev/null @@ -1,328 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2006-2007 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -#include "CaelumPrecompiled.h" -#include "CaelumExceptions.h" -#include "InternalUtilities.h" -#include "PrivatePtr.h" - -namespace Caelum -{ - Ogre::ColourValue InternalUtilities::getInterpolatedColour ( - float fx, float fy, Ogre::Image *img, bool wrapX) - { - // Don't -> all the time, and avoid unsigned warnings - int imgWidth = static_cast(img->getWidth ()); - int imgHeight = static_cast(img->getHeight ()); - - // Calculate pixel y coord. - int py = Ogre::Math::IFloor(Ogre::Math::Abs (fy) * (imgHeight - 1)); - // Snap to py image bounds. - py = std::max(0, std::min(py, imgHeight - 1)); - - // Get the two closest pixels on x. - // px1 and px2 are the closest integer pixels to px. - float px = fx * (img->getWidth () - 1); - int px1, px2; - px1 = Ogre::Math::IFloor(px); - px2 = Ogre::Math::ICeil(px); - - if (wrapX) { - // Wrap x coords. The funny addition ensures that it does - // "the right thing" for negative values. - px1 = (px1 % imgWidth + imgWidth) % imgWidth; - px2 = (px2 % imgWidth + imgWidth) % imgWidth; - } else { - px1 = std::max(0, std::min(px1, imgWidth - 1)); - px2 = std::max(0, std::min(px2, imgWidth - 1)); - } - - // Calculate the interpolated pixel - Ogre::ColourValue c1, c2, cf; - c1 = img->getColourAt (px1, py, 0); - c2 = img->getColourAt (px2, py, 0); - - // Blend the two pixels together. - // diff is the weight between pixel 1 and pixel 2. - float diff = px - px1; - cf = c1 * (1 - diff) + c2 * diff; - - return cf; - } - - const Ogre::String InternalUtilities::pointerToString (void* pointer) - { - std::stringstream stream; - stream.width(2 * sizeof(void *)); - stream.fill('0'); - stream.unsetf(std::ios::dec); - stream.setf(std::ios::hex); - stream.setf(std::ios::uppercase); - stream << reinterpret_cast(pointer); - return stream.str(); - } - - Ogre::MaterialPtr InternalUtilities::checkLoadMaterialClone ( - const Ogre::String& originalName, - const Ogre::String& cloneName) - { - Ogre::MaterialPtr scriptMaterial = Ogre::MaterialManager::getSingletonPtr()->getByName(originalName); - if (scriptMaterial.isNull()) { - CAELUM_THROW_UNSUPPORTED_EXCEPTION ( - "Can't find material \"" + originalName + "\"", - "Caelum"); - } - - // Create clone - Caelum::PrivateMaterialPtr clonedMaterial (scriptMaterial->clone (cloneName)); - - // Test clone loads and there is at least on supported technique - clonedMaterial->load (); - if (clonedMaterial->getBestTechnique () == 0) { - CAELUM_THROW_UNSUPPORTED_EXCEPTION ( - "Can't load material \"" + originalName + "\": " + clonedMaterial->getUnsupportedTechniquesExplanation(), - "Caelum"); - } - - return clonedMaterial.release(); - } - - Ogre::CompositorPtr InternalUtilities::checkCompositorSupported (const Ogre::String& name) - { - Ogre::CompositorPtr comp = Ogre::CompositorManager::getSingletonPtr()->getByName(name); - if (comp.isNull()) { - CAELUM_THROW_UNSUPPORTED_EXCEPTION ( - "Can't find compositor \"" + name + "\"", - "Caelum"); - } - - // Check the compositor is supported after loading. - comp->load (); - if (comp->getNumSupportedTechniques () == 0) { - CAELUM_THROW_UNSUPPORTED_EXCEPTION ( - "Can't load compositor \"" + name + "\"", - "Caelum"); - } - - return comp; - } - - void InternalUtilities::generateSphericDome (const Ogre::String &name, int segments, DomeType type) - { - // Return now if already exists - if (Ogre::MeshManager::getSingleton ().resourceExists (name)) { - return; - } - - Ogre::LogManager::getSingleton ().logMessage ( - "Caelum: Creating " + name + " sphere mesh resource..."); - - // Use the mesh manager to create the mesh - Ogre::MeshPtr msh = Ogre::MeshManager::getSingleton ().createManual (name, RESOURCE_GROUP_NAME); - // Create a submesh - Ogre::SubMesh *sub = msh->createSubMesh (); - - // Create the shared vertex data - Ogre::VertexData *vertexData = new Ogre::VertexData (); - msh->sharedVertexData = vertexData; - - // Define the vertices' format - Ogre::VertexDeclaration *vertexDecl = vertexData->vertexDeclaration; - size_t currOffset = 0; - // Position - vertexDecl->addElement (0, currOffset, Ogre::VET_FLOAT3, Ogre::VES_POSITION); - currOffset += Ogre::VertexElement::getTypeSize (Ogre::VET_FLOAT3); - // Normal - vertexDecl->addElement (0, currOffset, Ogre::VET_FLOAT3, Ogre::VES_NORMAL); - currOffset += Ogre::VertexElement::getTypeSize (Ogre::VET_FLOAT3); - // Texture coordinates - vertexDecl->addElement (0, currOffset, Ogre::VET_FLOAT2, Ogre::VES_TEXTURE_COORDINATES, 0); - currOffset += Ogre::VertexElement::getTypeSize (Ogre::VET_FLOAT2); - - // Allocate the vertex buffer - switch (type) { - case DT_SKY_DOME: - vertexData->vertexCount = segments * (segments - 1) + 2; - break; - case DT_IMAGE_STARFIELD: - vertexData->vertexCount = (segments + 1) * (segments + 1); - break; - }; - Ogre::HardwareVertexBufferSharedPtr vBuf = Ogre::HardwareBufferManager::getSingleton ().createVertexBuffer (vertexDecl->getVertexSize (0), vertexData->vertexCount, Ogre::HardwareBuffer::HBU_STATIC_WRITE_ONLY, false); - Ogre::VertexBufferBinding *binding = vertexData->vertexBufferBinding; - binding->setBinding (0, vBuf); - - float *pVertex = static_cast(vBuf->lock (Ogre::HardwareBuffer::HBL_DISCARD)); - - // Allocate the index buffer - switch (type) { - case DT_SKY_DOME: - sub->indexData->indexCount = 2 * segments * (segments - 1) * 3; - break; - case DT_IMAGE_STARFIELD: - sub->indexData->indexCount = 2 * (segments - 1) * segments * 3; - break; - }; - sub->indexData->indexBuffer = Ogre::HardwareBufferManager::getSingleton ().createIndexBuffer (Ogre::HardwareIndexBuffer::IT_16BIT, sub->indexData->indexCount, Ogre::HardwareBuffer::HBU_STATIC_WRITE_ONLY, false); - Ogre::HardwareIndexBufferSharedPtr iBuf = sub->indexData->indexBuffer; - unsigned short *pIndices = static_cast(iBuf->lock (Ogre::HardwareBuffer::HBL_DISCARD)); - - // Fill the buffers - switch (type) { - case DT_SKY_DOME: - fillGradientsDomeBuffers (pVertex, pIndices, segments); - break; - case DT_IMAGE_STARFIELD: - fillStarfieldDomeBuffers (pVertex, pIndices, segments); - break; - }; - - // Close the vertex buffer - vBuf->unlock (); - - // Close the index buffer - iBuf->unlock (); - - // Finishing it... - sub->useSharedVertices = true; - msh->_setBounds (Ogre::AxisAlignedBox (-1, -1, -1, 1, 1, 1), false); - msh->_setBoundingSphereRadius (1); - msh->load (); - - Ogre::LogManager::getSingleton ().logMessage ( - "Caelum: generateSphericDome DONE"); - } - - void InternalUtilities::fillGradientsDomeBuffers (float *pVertex, unsigned short *pIndices, int segments) - { - const float deltaLatitude = Ogre::Math::PI / (float )segments; - const float deltaLongitude = Ogre::Math::PI * 2.0 / (float )segments; - - // Generate the rings - for (int i = 1; i < segments; i++) { - float r0 = Ogre::Math::Sin (Ogre::Radian (i * deltaLatitude)); - float y0 = Ogre::Math::Cos (Ogre::Radian (i * deltaLatitude)); - - for (int j = 0; j < segments; j++) { - float x0 = r0 * Ogre::Math::Sin (Ogre::Radian (j * deltaLongitude)); - float z0 = r0 * Ogre::Math::Cos (Ogre::Radian (j * deltaLongitude)); - - *pVertex++ = x0; - *pVertex++ = y0; - *pVertex++ = z0; - - *pVertex++ = -x0; - *pVertex++ = -y0; - *pVertex++ = -z0; - - *pVertex++ = 0; - *pVertex++ = 1 - y0; - } - } - - // Generate the "north pole" - *pVertex++ = 0; // Position - *pVertex++ = 1; - *pVertex++ = 0; - *pVertex++ = 0; // Normal - *pVertex++ = -1; - *pVertex++ = 0; - *pVertex++ = 0; // UV - *pVertex++ = 0; - - // Generate the "south pole" - *pVertex++ = 0; // Position - *pVertex++ = -1; - *pVertex++ = 0; - *pVertex++ = 0; // Normal - *pVertex++ = 1; - *pVertex++ = 0; - *pVertex++ = 0; // UV - *pVertex++ = 2; - - // Generate the mid segments - for (int i = 0; i < segments - 2; i++) { - for (int j = 0; j < segments; j++) { - *pIndices++ = segments * i + j; - *pIndices++ = segments * i + (j + 1) % segments; - *pIndices++ = segments * (i + 1) + (j + 1) % segments; - *pIndices++ = segments * i + j; - *pIndices++ = segments * (i + 1) + (j + 1) % segments; - *pIndices++ = segments * (i + 1) + j; - } - } - - // Generate the upper cap - for (int i = 0; i < segments; i++) { - *pIndices++ = segments * (segments - 1); - *pIndices++ = (i + 1) % segments; - *pIndices++ = i; - } - - // Generate the lower cap - for (int i = 0; i < segments; i++) { - *pIndices++ = segments * (segments - 1) + 1; - *pIndices++ = segments * (segments - 2) + i; - *pIndices++ = segments * (segments - 2) + (i + 1) % segments; - } - } - - void InternalUtilities::fillStarfieldDomeBuffers (float *pVertex, unsigned short *pIndices, int segments) - { - const float deltaLatitude = Ogre::Math::PI / (float )segments; - const float deltaLongitude = Ogre::Math::PI * 2.0 / (float )segments; - - // Generate the rings - for (int i = 0; i <= segments; i++) { - float r0 = Ogre::Math::Sin (Ogre::Radian (i * deltaLatitude)); - float y0 = Ogre::Math::Cos (Ogre::Radian (i * deltaLatitude)); - - for (int j = 0; j <= segments; j++) { - float x0 = r0 * Ogre::Math::Sin (Ogre::Radian (j * deltaLongitude)); - float z0 = r0 * Ogre::Math::Cos (Ogre::Radian (j * deltaLongitude)); - - *pVertex++ = x0; - *pVertex++ = y0; - *pVertex++ = z0; - - *pVertex++ = -x0; - *pVertex++ = -y0; - *pVertex++ = -z0; - - *pVertex++ = (float )j / (float )segments; - *pVertex++ = 1 - (y0 * 0.5 + 0.5); - } - } - - // Generate the mid segments - int vRowSize = segments + 1; - for (int i = 1; i < segments; i++) { - for (int j = 0; j < segments; j++) { - int baseIdx = vRowSize * i + j; - *pIndices++ = baseIdx; - *pIndices++ = baseIdx + 1; - *pIndices++ = baseIdx + vRowSize + 1; - *pIndices++ = baseIdx + 1; - *pIndices++ = baseIdx; - *pIndices++ = baseIdx - vRowSize; - } - } - } -} diff --git a/extern/caelum/src/Moon.cpp b/extern/caelum/src/Moon.cpp deleted file mode 100644 index b69a821d5..000000000 --- a/extern/caelum/src/Moon.cpp +++ /dev/null @@ -1,140 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2008 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -#include "CaelumPrecompiled.h" -#include "CaelumExceptions.h" -#include "InternalUtilities.h" -#include "Moon.h" -#include - -namespace Caelum -{ - const Ogre::String Moon::MOON_MATERIAL_NAME = "Caelum/PhaseMoon"; - const Ogre::String Moon::MOON_BACKGROUND_MATERIAL_NAME = "Caelum/MoonBackground"; - - Moon::Moon ( - Ogre::SceneManager *sceneMgr, - Ogre::SceneNode *caelumRootNode, - const Ogre::String& moonTextureName, - Ogre::Degree angularSize - ): - BaseSkyLight(sceneMgr, caelumRootNode), - mAngularSize(angularSize) - { - Ogre::String uniqueSuffix = "/" + InternalUtilities::pointerToString(this); - - // Clone materials - mMoonMaterial.reset(InternalUtilities::checkLoadMaterialClone(MOON_MATERIAL_NAME, MOON_MATERIAL_NAME + uniqueSuffix)); - mBackMaterial.reset(InternalUtilities::checkLoadMaterialClone(MOON_BACKGROUND_MATERIAL_NAME, MOON_BACKGROUND_MATERIAL_NAME + uniqueSuffix)); - - assert (!mMoonMaterial.isNull ()); - assert (mMoonMaterial->getTechnique (0)); - assert (mMoonMaterial->getTechnique (0)->getPass (0)); - assert (mMoonMaterial->getTechnique (0)->getPass( 0)->hasFragmentProgram ()); - mParams.setup(mMoonMaterial->getBestTechnique ()->getPass (0)->getFragmentProgramParameters ()); - - setMoonTexture(moonTextureName); - - mMoonBB.reset(sceneMgr->createBillboardSet("Caelum/Moon/MoonBB" + uniqueSuffix, 1)); - mMoonBB->setMaterialName (mMoonMaterial->getName()); - mMoonBB->setCastShadows (false); - mMoonBB->setRenderQueueGroup (CAELUM_RENDER_QUEUE_MOON); - mMoonBB->setDefaultDimensions (1.0f, 1.0f); - mMoonBB->createBillboard (Ogre::Vector3::ZERO); - - mBackBB.reset(sceneMgr->createBillboardSet("Caelum/Moon/BackBB" + uniqueSuffix, 1)); - mBackBB->setMaterialName (mBackMaterial->getName()); - mBackBB->setCastShadows (false); - mBackBB->setRenderQueueGroup (CAELUM_RENDER_QUEUE_MOON_BACKGROUND); - mBackBB->setDefaultDimensions (1.0f, 1.0f); - mBackBB->createBillboard (Ogre::Vector3::ZERO); - - mNode->attachObject (mMoonBB.get()); - mNode->attachObject (mBackBB.get()); - } - - Moon::~Moon () { - } - - void Moon::setBodyColour (const Ogre::ColourValue &colour) { - BaseSkyLight::setBodyColour(colour); - - // Set moon material colour. - mMoonBB->getBillboard(0)->setColour(colour); - } - - void Moon::setMoonTexture (const Ogre::String &textureName) - { - // Update the moon material - assert(mMoonMaterial->getBestTechnique ()); - assert(mMoonMaterial->getBestTechnique ()->getPass (0)); - assert(mMoonMaterial->getBestTechnique ()->getPass (0)->getTextureUnitState (0)); - mMoonMaterial->getBestTechnique ()->getPass (0)->getTextureUnitState (0)->setTextureName (textureName); - mBackMaterial->getBestTechnique ()->getPass (0)->getTextureUnitState (0)->setTextureName (textureName); - } - - void Moon::setMoonTextureAngularSize(const Ogre::Degree& moonTextureAngularSize){ - mAngularSize = moonTextureAngularSize; - } - - void Moon::notifyCameraChanged (Ogre::Camera *cam) { - // This calls setFarRadius - BaseSkyLight::notifyCameraChanged(cam); - - // Set moon position. - Ogre::Real moonDistance = mRadius - mRadius * Ogre::Math::Tan(mAngularSize); - mNode->setPosition(-mDirection * moonDistance); - - // Set moon scaling in [1.0 ~ 1.2] range - float factor = 1.2f - mBodyColour.b * 0.2f; - float scale = factor * moonDistance * Ogre::Math::Tan(mAngularSize); - mNode->setScale (Ogre::Vector3::UNIT_SCALE * scale); - } - - void Moon::Params::setup(Ogre::GpuProgramParametersSharedPtr fpParams) - { - this->fpParams = fpParams; - this->phase.bind(fpParams, "phase"); - } - - void Moon::setPhase (Ogre::Real phase) { - mParams.phase.set(mParams.fpParams, phase); - } - - void Moon::setQueryFlags (uint flags) { - mMoonBB->setQueryFlags (flags); - mBackBB->setQueryFlags (flags); - } - - uint Moon::getQueryFlags () const { - assert (mMoonBB->getQueryFlags () == mBackBB->getQueryFlags ()); - return mMoonBB->getQueryFlags (); - } - - void Moon::setVisibilityFlags (uint flags) { - mMoonBB->setVisibilityFlags (flags); - mBackBB->setVisibilityFlags (flags); - } - - uint Moon::getVisibilityFlags () const { - assert (mMoonBB->getVisibilityFlags () == mBackBB->getVisibilityFlags ()); - return mMoonBB->getVisibilityFlags (); - } -} diff --git a/extern/caelum/src/PointStarfield.cpp b/extern/caelum/src/PointStarfield.cpp deleted file mode 100644 index 57aa8e95b..000000000 --- a/extern/caelum/src/PointStarfield.cpp +++ /dev/null @@ -1,292 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2008 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -#include "CaelumPrecompiled.h" -#include "PointStarfield.h" -#include "CaelumExceptions.h" -#include "Astronomy.h" -#include "InternalUtilities.h" - -using namespace Ogre; - -namespace Caelum -{ - const Ogre::String PointStarfield::STARFIELD_MATERIAL_NAME = "Caelum/StarPoint"; - const Ogre::Degree PointStarfield::DEFAULT_OBSERVER_POSITION_REBUILD_DELTA = Ogre::Degree(0.1); - - PointStarfield::PointStarfield ( - Ogre::SceneManager *sceneMgr, - Ogre::SceneNode *caelumRootNode, - bool initWithCatalogue) - { - mMag0PixelSize = 16; - mMinPixelSize = 4; - mMaxPixelSize = 6; - mMagnitudeScale = Math::Pow(100, 0.2); - mObserverLatitude = 45; - mObserverLongitude = 0; - mObserverPositionRebuildDelta = DEFAULT_OBSERVER_POSITION_REBUILD_DELTA; - - String uniqueSuffix = "/" + InternalUtilities::pointerToString(this); - - // Load material. - mMaterial.reset(InternalUtilities::checkLoadMaterialClone( - STARFIELD_MATERIAL_NAME, - STARFIELD_MATERIAL_NAME + uniqueSuffix)); - - mParams.setup(mMaterial->getTechnique(0)->getPass(0)->getVertexProgramParameters()); - - // We use a separate data source. - Ogre::String objName = "Caelum/PointStarfield" + uniqueSuffix; - mManualObj.reset (sceneMgr->createManualObject (objName)); - mManualObj->setDynamic(false); - mManualObj->setRenderQueueGroup (CAELUM_RENDER_QUEUE_STARFIELD); - sceneMgr->getRenderQueue()->getQueueGroup(CAELUM_RENDER_QUEUE_STARFIELD)->setShadowsEnabled (false); - mManualObj->setCastShadows(false); - - mNode.reset (caelumRootNode->createChildSceneNode ()); - mNode->attachObject (mManualObj.getPointer ()); - - if (initWithCatalogue) { - addBrightStarCatalogue (); - } - } - - PointStarfield::~PointStarfield () - { - } - - void PointStarfield::notifyStarVectorChanged () { - invalidateGeometry (); - } - - void PointStarfield::clearAllStars () { - mStars.clear(); - notifyStarVectorChanged (); - } - - Real randReal () { - return rand() / static_cast(RAND_MAX); - } - - Real randReal (Real min, Real max) { - Real f = randReal (); - return min * (1 - f) + max * f; - } - - void PointStarfield::addRandomStars (int count) - { - for (int i = 0; i < count; ++i) { - // Generate a vector inside a sphere - Ogre::Vector3 pos; - do { - pos.x = randReal(-1, 1); - pos.y = randReal(-1, 1); - pos.z = randReal(-1, 1); - } while (pos.squaredLength () >= 1); - - // Convert to rasc/decl angles. - LongReal rasc, decl, dist; - Astronomy::convertRectangularToSpherical( - pos.x, pos.y, pos.z, - rasc, decl, dist); - - Star s; - s.RightAscension = Ogre::Degree (rasc); - s.Declination = Ogre::Degree (decl); - // This distribution is wrong. - s.Magnitude = 6 * pos.squaredLength () + 1.5; - mStars.push_back(s); - } - notifyStarVectorChanged (); - } - - void PointStarfield::addStar (const BrightStarCatalogueEntry &entry) { - Star s; - s.RightAscension = Ogre::Degree(360 / 24.0f * ( - Math::Abs(entry.rasc_hour) + - entry.rasc_min / 60.0f + - entry.rasc_sec / 3600.0f)); - s.Declination = Ogre::Degree(Math::Sign(entry.decl_deg) * ( - Math::Abs(entry.decl_deg) + - entry.decl_min / 60.0f + - entry.decl_sec / 3600.0f)); - s.Magnitude = entry.magn; - mStars.push_back(s); - - notifyStarVectorChanged (); - } - - void PointStarfield::addBrightStarCatalogue (int count) { - assert(count >= 0); - if (count < BrightStarCatalogueSize) { - // Only sort if we don't add everything. - // It would be lovely if the catalogue was already sorted. - std::vector > vec; - vec.reserve(BrightStarCatalogueSize); - for (int i = 0; i < BrightStarCatalogueSize; ++i) { - vec.push_back(std::make_pair(BrightStarCatalogue[i].magn, i)); - } - sort(vec.begin(), vec.end()); - for (int i = 0; i < count; ++i) { - addStar(BrightStarCatalogue[vec[i].second]); - } - } else { - assert(count == BrightStarCatalogueSize); - for (int i = 0; i < BrightStarCatalogueSize; ++i) { - addStar(BrightStarCatalogue[i]); - } - } - notifyStarVectorChanged (); - } - - void PointStarfield::invalidateGeometry () { - mValidGeometry = false; - } - - void PointStarfield::ensureGeometry () - { - if (mValidGeometry) { - return; - } - - //Ogre::LogManager::getSingleton ().logMessage ("Caelum: Recomputing starfield geometry."); - - size_t starCount = mStars.size(); - - mManualObj->clear(); - mManualObj->estimateVertexCount(6 * starCount); - mManualObj->begin(mMaterial->getName (), Ogre::RenderOperation::OT_TRIANGLE_LIST); - for (uint i = 0; i < starCount; ++i) - { - const Star& star = mStars[i]; - - // Determine position at J2000 - LongReal azm, alt; - Astronomy::convertEquatorialToHorizontal( - Astronomy::J2000, - mObserverLatitude.valueDegrees(), - mObserverLongitude.valueDegrees(), - star.RightAscension.valueDegrees(), star.Declination.valueDegrees(), - azm, alt); - - Ogre::Vector3 pos; - pos.z = -Math::Cos (Ogre::Degree(azm)) * Math::Cos (Ogre::Degree(alt)); - pos.x = Math::Sin (Ogre::Degree(azm)) * Math::Cos (Ogre::Degree(alt)); - pos.y = -Math::Sin (Ogre::Degree(alt)); - - //mManualObj->colour (Ogre::ColourValue::White); - mManualObj->position (pos); - mManualObj->textureCoord (+1, -1, star.Magnitude); - mManualObj->position (pos); - mManualObj->textureCoord (+1, +1, star.Magnitude); - mManualObj->position (pos); - mManualObj->textureCoord (-1, -1, star.Magnitude); - - mManualObj->position (pos); - mManualObj->textureCoord (-1, -1, star.Magnitude); - mManualObj->position (pos); - mManualObj->textureCoord (+1, +1, star.Magnitude); - mManualObj->position (pos); - mManualObj->textureCoord (-1, +1, star.Magnitude); - } - mManualObj->end(); - - // Set infinite bounds on the starfield. - AxisAlignedBox box; - box.setInfinite (); - mManualObj->setBoundingBox (box); - - mValidGeometry = true; - } - - void PointStarfield::Params::setup(Ogre::GpuProgramParametersSharedPtr vpParams) - { - this->vpParams = vpParams; - this->mag_scale.bind(vpParams, "mag_scale"); - this->mag0_size.bind(vpParams, "mag0_size"); - this->min_size.bind(vpParams, "min_size"); - this->max_size.bind(vpParams, "max_size"); - this->aspect_ratio.bind(vpParams, "aspect_ratio"); - } - - void PointStarfield::notifyCameraChanged (Ogre::Camera *cam) { - CameraBoundElement::notifyCameraChanged (cam); - - // Shader params are changed for every camera. - Pass* pass = mMaterial->getBestTechnique ()->getPass (0); - GpuProgramParametersSharedPtr fpParams = pass->getFragmentProgramParameters (); - GpuProgramParametersSharedPtr vpParams = pass->getVertexProgramParameters (); - - int height = cam->getViewport ()-> getActualHeight (); - int width = cam->getViewport ()-> getActualWidth (); - Real pixFactor = 1.0f / width; - Real magScale = -Math::Log (mMagnitudeScale) / 2; - Real mag0Size = mMag0PixelSize * pixFactor; - Real minSize = mMinPixelSize * pixFactor; - Real maxSize = mMaxPixelSize * pixFactor; - Real aspectRatio = static_cast(width) / height; - - // These params are relative to the size of the screen. - mParams.mag_scale.set(mParams.vpParams, magScale); - mParams.mag0_size.set(mParams.vpParams, mag0Size); - mParams.min_size.set(mParams.vpParams, minSize); - mParams.max_size.set(mParams.vpParams, maxSize); - mParams.aspect_ratio.set(mParams.vpParams, aspectRatio); - } - - void PointStarfield::setFarRadius (Ogre::Real radius) { - CameraBoundElement::setFarRadius(radius); - mNode->setScale (Ogre::Vector3::UNIT_SCALE * radius); - } - - void PointStarfield::_update (const float time) { - // This is probably wrong. - Ogre::Quaternion orientation = Ogre::Quaternion::IDENTITY; - orientation = orientation * Ogre::Quaternion (Ogre::Radian (-mObserverLatitude + Ogre::Degree (90)), Ogre::Vector3::UNIT_X); - orientation = orientation * Ogre::Quaternion (Ogre::Radian (-time * 2 * Ogre::Math::PI), Ogre::Vector3::UNIT_Y); - mNode->setOrientation (orientation); - ensureGeometry (); - } - - void PointStarfield::setObserverLatitude (Ogre::Degree value) - { - if (!Math::RealEqual ( - mObserverLatitude.valueDegrees (), - value.valueDegrees (), - this->getObserverPositionRebuildDelta ().valueDegrees ())) - { - mObserverLatitude = value; - invalidateGeometry (); - } - } - - void PointStarfield::setObserverLongitude (Ogre::Degree value) - { - if (!Math::RealEqual ( - mObserverLongitude.valueDegrees (), - value.valueDegrees (), - this->getObserverPositionRebuildDelta ().valueDegrees ())) - { - mObserverLongitude = value; - invalidateGeometry (); - } - } -} diff --git a/extern/caelum/src/PrecipitationController.cpp b/extern/caelum/src/PrecipitationController.cpp deleted file mode 100644 index d0f9c47d6..000000000 --- a/extern/caelum/src/PrecipitationController.cpp +++ /dev/null @@ -1,392 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2008 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -#include "CaelumPrecompiled.h" -#include "PrecipitationController.h" -#include "InternalUtilities.h" - -using namespace Ogre; - -namespace Caelum -{ - const String PrecipitationController::COMPOSITOR_NAME = "Caelum/PrecipitationCompositor"; - const String PrecipitationController::MATERIAL_NAME = "Caelum/PrecipitationMaterial"; - - const PrecipitationPresetParams PrecipitationPresets[] = { - { Ogre::ColourValue(0.8, 0.8, 0.8, 1), 0.95, "precipitation_drizzle.png" }, - { Ogre::ColourValue(0.8, 0.8, 0.8, 1), 0.85, "precipitation_rain.png" }, - { Ogre::ColourValue(0.8, 0.8, 0.8, 1), 0.12, "precipitation_snow.png" }, - { Ogre::ColourValue(0.8, 0.8, 0.8, 1), 0.33, "precipitation_snowgrains.png" }, - { Ogre::ColourValue(0.8, 0.8, 0.8, 1), 0.70, "precipitation_icecrystals.png" }, - { Ogre::ColourValue(0.8, 0.8, 0.8, 1), 0.78, "precipitation_icepellets.png" }, - { Ogre::ColourValue(0.8, 0.8, 0.8, 1), 0.74, "precipitation_hail.png" }, - { Ogre::ColourValue(0.8, 0.8, 0.8, 1), 0.70, "precipitation_smallhail.png" } - }; - - PrecipitationController::PrecipitationController( - Ogre::SceneManager *sceneMgr) - { - Ogre::String uniqueId = Ogre::StringConverter::toString((size_t)this); - mSceneMgr = sceneMgr; - - setAutoDisableThreshold (0.001); - mCameraSpeedScale = Ogre::Vector3::UNIT_SCALE; - - setIntensity (0); - setWindSpeed (Ogre::Vector3(0, 0, 0)); - mInternalTime = 0; - mSecondsSinceLastFrame = 0; - mFallingDirection = Ogre::Vector3::NEGATIVE_UNIT_Y; - - setPresetType (PRECTYPE_RAIN); - - update (0, Ogre::ColourValue(0, 0, 0, 0)); - InternalUtilities::checkCompositorSupported(COMPOSITOR_NAME); - } - - PrecipitationController::~PrecipitationController () { - destroyAllViewportInstances (); - } - - void PrecipitationController::setTextureName (const Ogre::String& textureName) { - mPresetType = PRECTYPE_CUSTOM; - mTextureName = textureName; - } - - const Ogre::String PrecipitationController::getTextureName () const { - return mTextureName; - } - - void PrecipitationController::setSpeed (Real speed) { - mPresetType = PRECTYPE_CUSTOM; - mSpeed = speed; - } - - Real PrecipitationController::getSpeed () const { - return mSpeed; - } - - void PrecipitationController::setColour (const Ogre::ColourValue& color) { - mPresetType = PRECTYPE_CUSTOM; - mColour = color; - } - - const Ogre::ColourValue PrecipitationController::getColour () const { - return mColour; - } - - bool PrecipitationController::isPresetType (PrecipitationType type) { - return PRECTYPE_DRIZZLE <= type && type <= PRECTYPE_SMALLHAIL; - } - - const PrecipitationPresetParams& PrecipitationController::getPresetParams (PrecipitationType type) { - assert(isPresetType(type)); - return PrecipitationPresets[type]; - } - - void PrecipitationController::setParams (const PrecipitationPresetParams& params) { - setColour (params.Colour); - setSpeed (params.Speed); - setTextureName (params.Name); - } - - void PrecipitationController::setPresetType (PrecipitationType type) { - setParams (getPresetParams (type)); - mPresetType = type; - } - - PrecipitationType PrecipitationController::getPresetType () const { - return mPresetType; - } - - void PrecipitationController::setWindSpeed (const Ogre::Vector3& value) { - mWindSpeed = value; - } - - const Ogre::Vector3 PrecipitationController::getWindSpeed () const { - return mWindSpeed; - } - - void PrecipitationController::setIntensity (Real intensity) { - mIntensity = intensity; - } - - Real PrecipitationController::getIntensity () const { - return mIntensity; - } - - void PrecipitationController::update (Real secondsSinceLastFrame, Ogre::ColourValue colour) { - mSecondsSinceLastFrame = secondsSinceLastFrame; - mInternalTime += mSecondsSinceLastFrame; - mSceneColour = colour; - - ViewportInstanceMap::const_iterator it; - ViewportInstanceMap::const_iterator begin = mViewportInstanceMap.begin (); - ViewportInstanceMap::const_iterator end = mViewportInstanceMap.end (); - for (it = begin; it != end; ++it) { - it->second->_update (); - } - } - - void PrecipitationController::setManualCameraSpeed (const Ogre::Vector3& value) { - ViewportInstanceMap::const_iterator it; - ViewportInstanceMap::const_iterator begin = mViewportInstanceMap.begin(); - ViewportInstanceMap::const_iterator end = mViewportInstanceMap.end(); - for (it = begin; it != end; ++it) { - it->second->setManualCameraSpeed(value); - } - } - - void PrecipitationController::setAutoCameraSpeed() { - ViewportInstanceMap::const_iterator it; - ViewportInstanceMap::const_iterator begin = mViewportInstanceMap.begin(); - ViewportInstanceMap::const_iterator end = mViewportInstanceMap.end(); - for (it = begin; it != end; ++it) { - it->second->setAutoCameraSpeed(); - } - } - - PrecipitationInstance::PrecipitationInstance - ( - PrecipitationController* parent, - Ogre::Viewport* viewport - ): - mParent(parent), - mViewport(viewport), - mCompInst(0), - mLastCamera(0), - mLastCameraPosition(Vector3::ZERO), - mCameraSpeed(Vector3::ZERO), - mAutoCameraSpeed(true) - { - createCompositor (); - } - - PrecipitationInstance::~PrecipitationInstance () - { - destroyCompositor(); - } - - void PrecipitationInstance::createCompositor () - { - // Check if nothing to do. - if (mCompInst) { - return; - } - - Ogre::CompositorManager* compMgr = Ogre::CompositorManager::getSingletonPtr(); - - // Create the precipitation compositor. - mCompInst = compMgr->addCompositor(mViewport, PrecipitationController::COMPOSITOR_NAME); - assert(mCompInst); - mCompInst->setEnabled (false); - mCompInst->addListener (this); - } - - void PrecipitationInstance::destroyCompositor () - { - // Check if nothing to do. - if (mCompInst == 0) { - return; - } - - Ogre::CompositorManager* compMgr = Ogre::CompositorManager::getSingletonPtr(); - - // Remove the precipitation compositor. - mCompInst->removeListener (this); - compMgr->removeCompositor(mViewport, PrecipitationController::COMPOSITOR_NAME); - mCompInst = 0; - } - - void PrecipitationInstance::notifyMaterialSetup(uint pass_id, Ogre::MaterialPtr &mat) - { - mParams.setup(mat->getTechnique (0)->getPass (0)->getFragmentProgramParameters ()); - } - - void PrecipitationInstance::Params::setup(Ogre::GpuProgramParametersSharedPtr fpParams) - { - this->fpParams = fpParams; - this->precColor.bind(fpParams, "precColor"); - this->intensity.bind(fpParams, "intensity"); - this->dropSpeed.bind(fpParams, "dropSpeed"); - this->corner1.bind(fpParams, "corner1"); - this->corner2.bind(fpParams, "corner2"); - this->corner3.bind(fpParams, "corner3"); - this->corner4.bind(fpParams, "corner4"); - this->deltaX.bind(fpParams, "deltaX"); - this->deltaY.bind(fpParams, "deltaY"); - } - - void PrecipitationInstance::notifyMaterialRender(uint pass_id, Ogre::MaterialPtr &mat) - { - if (mAutoCameraSpeed) { - Ogre::Camera* cam = mViewport->getCamera(); - Ogre::Vector3 camPos = cam->getDerivedPosition(); - if (cam != mLastCamera) { - mCameraSpeed = Ogre::Vector3::ZERO; - } else { - Real timeDiff = mParent->getSecondsSinceLastFrame (); - Ogre::Vector3 posDiff = camPos - mLastCameraPosition; - - // Avoid division by 0 and keep old camera speed. - if (timeDiff > 1e-10) { - mCameraSpeed = posDiff / timeDiff; - } else { - // Keep old camera speed. - } - - /* - LogManager::getSingletonPtr ()->logMessage ( - "Caelum::PrecipitationInstance:" - " posDiff = " + StringConverter::toString(posDiff) + - " timeDiff = " + StringConverter::toString(mParent->getSecondsSinceLastFrame (), 10) + - " speed = " + StringConverter::toString(mCameraSpeed)); - */ - } - mLastCamera = cam; - mLastCameraPosition = camPos; - } - - this->_updateMaterialParams(mat, mViewport->getCamera(), mCameraSpeed); - } - - void PrecipitationInstance::_updateMaterialParams( - const Ogre::MaterialPtr& mat, - const Ogre::Camera* cam, - const Ogre::Vector3& camSpeed) - { - // 4523.893416f is divisible with all the sine periods in the shader - Real appTime = static_cast(fmod(mParent->mInternalTime, static_cast(4523.893416f))); - - ColourValue sceneColour = mParent->mSceneColour; - Real sceneLum = (sceneColour.r + sceneColour.g + sceneColour.b) / 3; - mParams.precColor.set(mParams.fpParams, ColourValue::White * sceneLum * mParent->mColour); - mParams.intensity.set(mParams.fpParams, mParent->mIntensity); - mParams.dropSpeed.set(mParams.fpParams, 0); - - Ogre::Vector3 corner1, corner2, corner3, corner4; - - corner1 = cam->getCameraToViewportRay(0, 0).getDirection(); - corner2 = cam->getCameraToViewportRay(1, 0).getDirection(); - corner3 = cam->getCameraToViewportRay(0, 1).getDirection(); - corner4 = cam->getCameraToViewportRay(1, 1).getDirection(); - - Ogre::Vector3 precDir = - mParent->mSpeed * mParent->mFallingDirection + - mParent->mWindSpeed - - camSpeed * mParent->mCameraSpeedScale; - Ogre::Quaternion quat = precDir.getRotationTo(Ogre::Vector3(0, -1, 0)); - - corner1 = quat * corner1; - corner2 = quat * corner2; - corner3 = quat * corner3; - corner4 = quat * corner4; - - mParams.corner1.set(mParams.fpParams, corner1); - mParams.corner2.set(mParams.fpParams, corner2); - mParams.corner3.set(mParams.fpParams, corner3); - mParams.corner4.set(mParams.fpParams, corner4); - - float fallSpeed = precDir.length(); - - mParams.deltaX.set(mParams.fpParams, - Ogre::Vector3(sin(appTime) + 4.33, - cos(appTime * 1.5) + 5.26, - cos(appTime * 2.5)) * fallSpeed / 10 + 88.001); - mParams.deltaY.set(mParams.fpParams, - Ogre::Vector3(0.6, 1.0, 1.4) * fallSpeed * appTime); - - if (mat->getTechnique(0)->getPass(0)->getTextureUnitState(1)->getTextureName() != mParent->mTextureName) { - mat->getTechnique(0)->getPass(0)->getTextureUnitState(1)->setTextureName(mParent->mTextureName); - } - } - - bool PrecipitationInstance::getAutoCameraSpeed () { - return mAutoCameraSpeed; - } - - void PrecipitationInstance::setAutoCameraSpeed () { - mAutoCameraSpeed = true; - mCameraSpeed = Ogre::Vector3::ZERO; - mLastCamera = 0; - } - - void PrecipitationInstance::setManualCameraSpeed (const Ogre::Vector3& value) { - mAutoCameraSpeed = false; - mCameraSpeed = value; - } - - const Ogre::Vector3 PrecipitationInstance::getCameraSpeed () { - return mCameraSpeed; - } - - bool PrecipitationInstance::shouldBeEnabled () const { - return mParent->getAutoDisableThreshold () < 0 || - mParent->getIntensity () > mParent->getAutoDisableThreshold (); - } - - void PrecipitationInstance::_update () - { - mCompInst->setEnabled (shouldBeEnabled ()); - } - - PrecipitationInstance* PrecipitationController::createViewportInstance (Ogre::Viewport* vp) - { - ViewportInstanceMap::const_iterator it = mViewportInstanceMap.find (vp); - if (it == mViewportInstanceMap.end()) { - std::auto_ptr inst (new PrecipitationInstance(this, vp)); - mViewportInstanceMap.insert (std::make_pair (vp, inst.get())); - // hold instance until successfully added to map. - return inst.release(); - } else { - return it->second; - } - } - - PrecipitationInstance* PrecipitationController::getViewportInstance(Ogre::Viewport* vp) { - ViewportInstanceMap::iterator it = mViewportInstanceMap.find (vp); - if (it != mViewportInstanceMap.end ()) { - return it->second; - } else { - return 0; - } - } - - void PrecipitationController::destroyViewportInstance (Viewport* vp) - { - ViewportInstanceMap::iterator it = mViewportInstanceMap.find (vp); - if (it != mViewportInstanceMap.end ()) { - PrecipitationInstance* inst = it->second; - delete inst; - mViewportInstanceMap.erase (it); - } - } - - void PrecipitationController::destroyAllViewportInstances () { - ViewportInstanceMap::const_iterator it; - ViewportInstanceMap::const_iterator begin = mViewportInstanceMap.begin(); - ViewportInstanceMap::const_iterator end = mViewportInstanceMap.end(); - for (it = begin; it != end; ++it) { - assert(it->first == it->second->getViewport ()); - delete it->second; - } - mViewportInstanceMap.clear (); - } -} diff --git a/extern/caelum/src/SkyDome.cpp b/extern/caelum/src/SkyDome.cpp deleted file mode 100644 index 864f8cce0..000000000 --- a/extern/caelum/src/SkyDome.cpp +++ /dev/null @@ -1,152 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2006-2007 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -#include "CaelumPrecompiled.h" -#include "SkyDome.h" -#include "CaelumExceptions.h" -#include "InternalUtilities.h" - -namespace Caelum -{ - const Ogre::String SkyDome::SPHERIC_DOME_NAME = "CaelumSphericDome"; - const Ogre::String SkyDome::SKY_DOME_MATERIAL_NAME = "CaelumSkyDomeMaterial"; - - SkyDome::SkyDome (Ogre::SceneManager *sceneMgr, Ogre::SceneNode *caelumRootNode) - { - String uniqueSuffix = "/" + InternalUtilities::pointerToString(this); - - // First clone material - mMaterial.reset(InternalUtilities::checkLoadMaterialClone(SKY_DOME_MATERIAL_NAME, SKY_DOME_MATERIAL_NAME + uniqueSuffix)); - - // Determine if the shader technique works. - mShadersEnabled = mMaterial->getBestTechnique()->getPass(0)->isProgrammable(); - - // Force setting haze, ensure mHazeEnabled != value. - mHazeEnabled = true; - setHazeEnabled(false); - - sceneMgr->getRenderQueue()->getQueueGroup(CAELUM_RENDER_QUEUE_SKYDOME)->setShadowsEnabled(false); - - // Generate dome entity. - InternalUtilities::generateSphericDome (SPHERIC_DOME_NAME, 32, InternalUtilities::DT_SKY_DOME); - mEntity.reset(sceneMgr->createEntity ("Caelum/SkyDome/Entity" + uniqueSuffix, SPHERIC_DOME_NAME)); - mEntity->setMaterialName (mMaterial->getName()); - mEntity->setRenderQueueGroup (CAELUM_RENDER_QUEUE_SKYDOME); - mEntity->setCastShadows (false); - - mNode.reset(caelumRootNode->createChildSceneNode ("Caelum/SkyDome/Node" + uniqueSuffix)); - mNode->attachObject (mEntity.get()); - } - - SkyDome::~SkyDome () { - } - - void SkyDome::notifyCameraChanged (Ogre::Camera *cam) { - CameraBoundElement::notifyCameraChanged (cam); - } - - void SkyDome::setFarRadius (Ogre::Real radius) { - CameraBoundElement::setFarRadius(radius); - mNode->setScale (Ogre::Vector3::UNIT_SCALE * radius); - } - - void SkyDome::setSunDirection (const Ogre::Vector3& sunDir) { - float elevation = sunDir.dotProduct (Ogre::Vector3::UNIT_Y); - elevation = elevation * 0.5 + 0.5; - Ogre::Pass* pass = mMaterial->getBestTechnique()->getPass(0); - if (mShadersEnabled) { - mParams.sunDirection.set(mParams.vpParams, sunDir); - mParams.offset.set(mParams.fpParams, elevation); - } else { - Ogre::TextureUnitState* gradientsTus = pass->getTextureUnitState(0); - gradientsTus->setTextureUScroll (elevation); - } - } - - void SkyDome::setHazeColour (const Ogre::ColourValue& hazeColour) { - if (mShadersEnabled && mHazeEnabled) { - mParams.hazeColour.set(mParams.fpParams, hazeColour); - } - } - - void SkyDome::setSkyGradientsImage (const Ogre::String& gradients) - { - Ogre::TextureUnitState* gradientsTus = - mMaterial->getTechnique (0)->getPass (0)->getTextureUnitState(0); - - gradientsTus->setTextureAddressingMode (Ogre::TextureUnitState::TAM_CLAMP); - - // Per 1.4 compatibility. Not tested with recent svn. - #if OGRE_VERSION < ((1 << 16) | (3 << 8)) - gradientsTus->setTextureName (gradients, Ogre::TEX_TYPE_2D, -1, true); - #else - gradientsTus->setTextureName (gradients, Ogre::TEX_TYPE_2D); - gradientsTus->setIsAlpha (true); - #endif - } - - void SkyDome::setAtmosphereDepthImage (const Ogre::String& atmosphereDepth) - { - if (!mShadersEnabled) { - return; - } - - Ogre::TextureUnitState* atmosphereTus = - mMaterial->getTechnique (0)->getPass (0)->getTextureUnitState(1); - - atmosphereTus->setTextureName (atmosphereDepth, Ogre::TEX_TYPE_1D); - atmosphereTus->setTextureAddressingMode (Ogre::TextureUnitState::TAM_CLAMP, Ogre::TextureUnitState::TAM_WRAP, Ogre::TextureUnitState::TAM_WRAP); - } - - bool SkyDome::getHazeEnabled () const { - return mHazeEnabled; - } - - void SkyDome::setHazeEnabled (bool value) - { - if (mHazeEnabled == value) { - return; - } - mHazeEnabled = value; - - if (!mShadersEnabled) { - return; - } - - Ogre::Pass *pass = mMaterial->getTechnique (0)->getPass (0); - if (value) { - pass->setFragmentProgram("CaelumSkyDomeFP"); - } else { - pass->setFragmentProgram("CaelumSkyDomeFP_NoHaze"); - } - mParams.setup( - pass->getVertexProgramParameters(), - pass->getFragmentProgramParameters()); - } - - void SkyDome::Params::setup(Ogre::GpuProgramParametersSharedPtr vpParams, Ogre::GpuProgramParametersSharedPtr fpParams) - { - this->fpParams = fpParams; - this->vpParams = vpParams; - sunDirection.bind(vpParams, "sunDirection"); - offset.bind(fpParams, "offset"); - hazeColour.bind(fpParams, "hazeColour"); - } -} diff --git a/extern/caelum/src/SkyLight.cpp b/extern/caelum/src/SkyLight.cpp deleted file mode 100644 index 68ace1070..000000000 --- a/extern/caelum/src/SkyLight.cpp +++ /dev/null @@ -1,160 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2008 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -#include "CaelumPrecompiled.h" -#include "SkyLight.h" - -namespace Caelum -{ - const Ogre::Real BaseSkyLight::DEFAULT_AUTO_DISABLE_THRESHOLD = 0.1; - - BaseSkyLight::BaseSkyLight (Ogre::SceneManager *sceneMgr, Ogre::SceneNode *caelumRootNode): - mDirection(Ogre::Vector3::ZERO), - mBodyColour(Ogre::ColourValue::White), - mLightColour(Ogre::ColourValue::White), - - mDiffuseMultiplier(Ogre::ColourValue(1, 1, 0.9)), - mSpecularMultiplier(Ogre::ColourValue(1, 1, 1)), - mAmbientMultiplier(Ogre::ColourValue(0.2, 0.2, 0.2)), - - mAutoDisableLight(false), - mAutoDisableThreshold(DEFAULT_AUTO_DISABLE_THRESHOLD), - mForceDisableLight(false) - { - Ogre::String lightName = "CaelumSkyLight" + Ogre::StringConverter::toString((size_t)this); - - mMainLight = sceneMgr->createLight (lightName); - mMainLight->setType (Ogre::Light::LT_DIRECTIONAL); - - sceneMgr->getRenderQueue()->getQueueGroup(CAELUM_RENDER_QUEUE_SUN)->setShadowsEnabled(false); - - mNode = caelumRootNode->createChildSceneNode (); - } - - BaseSkyLight::~BaseSkyLight () { - if (mNode) { - static_cast(mNode->getParent ())->removeAndDestroyChild (mNode->getName ()); - mNode = 0; - } - - if (mMainLight) { - mMainLight->_getManager ()->destroyLight (mMainLight); - mMainLight = 0; - } - } - - void BaseSkyLight::setFarRadius (Ogre::Real radius) { - CameraBoundElement::setFarRadius(radius); - mRadius = radius; - } - - void BaseSkyLight::update ( - const Ogre::Vector3& direction, - const Ogre::ColourValue &lightColour, - const Ogre::ColourValue &bodyColour) - { - setLightDirection(direction); - setLightColour(lightColour); - setBodyColour(bodyColour); - } - - const Ogre::Vector3 BaseSkyLight::getLightDirection () const { - return mDirection; - } - - void BaseSkyLight::setLightDirection (const Ogre::Vector3 &dir) { - mDirection = dir; - if (mMainLight != 0) { - mMainLight->setDirection (mNode->_getDerivedOrientation() * dir); - } - } - - void BaseSkyLight::setBodyColour (const Ogre::ColourValue &colour) { - // Store this last colour - mBodyColour = colour; - } - - const Ogre::ColourValue BaseSkyLight::getBodyColour () const { - return mBodyColour; - } - - void BaseSkyLight::setLightColour (const Ogre::ColourValue &colour) { - // Store this last colour - mLightColour = colour; - // Apply change - setMainLightColour(colour); - } - - void BaseSkyLight::setMainLightColour (const Ogre::ColourValue &colour) { - // Set light colours. - bool enable = shouldEnableLight (colour); - if (enable) { - mMainLight->setVisible(true); - mMainLight->setDiffuseColour (colour * mDiffuseMultiplier); - mMainLight->setSpecularColour (colour * mSpecularMultiplier); - } else { - mMainLight->setVisible(false); - } - } - - const Ogre::ColourValue BaseSkyLight::getLightColour () const { - return mLightColour; - } - - void BaseSkyLight::setDiffuseMultiplier (const Ogre::ColourValue &diffuse) { - mDiffuseMultiplier = diffuse; - } - - const Ogre::ColourValue BaseSkyLight::getDiffuseMultiplier () const { - return mDiffuseMultiplier; - } - - void BaseSkyLight::setSpecularMultiplier (const Ogre::ColourValue &specular) { - mSpecularMultiplier = specular; - } - - const Ogre::ColourValue BaseSkyLight::getSpecularMultiplier () const { - return mSpecularMultiplier; - } - - void BaseSkyLight::setAmbientMultiplier (const Ogre::ColourValue &ambient) { - mAmbientMultiplier = ambient; - } - - const Ogre::ColourValue BaseSkyLight::getAmbientMultiplier () const { - return mAmbientMultiplier; - } - - Ogre::Light* BaseSkyLight::getMainLight() const { - return mMainLight; - } - - bool BaseSkyLight::shouldEnableLight(const Ogre::ColourValue &colour) { - if (mForceDisableLight) { - return false; - } - if (mAutoDisableLight) { - Ogre::Real sum = colour.r + colour.g + colour.b; - return sum >= mAutoDisableThreshold; - } else { - return true; - } - } -} diff --git a/extern/caelum/src/Sun.cpp b/extern/caelum/src/Sun.cpp deleted file mode 100644 index 36c887c35..000000000 --- a/extern/caelum/src/Sun.cpp +++ /dev/null @@ -1,131 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2006-2007 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -#include "CaelumPrecompiled.h" -#include "Sun.h" -#include "InternalUtilities.h" - -namespace Caelum -{ - const Ogre::String SphereSun::SUN_MATERIAL_NAME = "CaelumSphereSun"; - - SphereSun::SphereSun - ( - Ogre::SceneManager *sceneMgr, - Ogre::SceneNode *caelumRootNode, - const Ogre::String &meshName - ): - BaseSkyLight(sceneMgr, caelumRootNode) - { - Ogre::String uniqueSuffix = "/" + InternalUtilities::pointerToString (this); - mSunMaterial.reset (InternalUtilities::checkLoadMaterialClone (SUN_MATERIAL_NAME, SUN_MATERIAL_NAME + uniqueSuffix)); - - mSunEntity.reset (sceneMgr->createEntity ("Caelum/SphereSun" + uniqueSuffix, meshName)); - mSunEntity->setMaterialName (mSunMaterial->getName ()); - mSunEntity->setCastShadows (false); - mSunEntity->setRenderQueueGroup (CAELUM_RENDER_QUEUE_SUN); - - mNode->attachObject (mSunEntity.get ()); - } - - SphereSun::~SphereSun () { } - - void SphereSun::setBodyColour (const Ogre::ColourValue &colour) { - BaseSkyLight::setBodyColour(colour); - - // Set sun material colour. - mSunMaterial->setSelfIllumination (colour); - } - - void SphereSun::notifyCameraChanged (Ogre::Camera *cam) { - // This calls setFarRadius - CameraBoundElement::notifyCameraChanged(cam); - - // Set sun position. - Ogre::Real sunDistance = mRadius - mRadius * Ogre::Math::Tan (Ogre::Degree (0.01)); - mNode->setPosition(-mDirection * sunDistance); - - // Set sun scaling in [1.6(6) ~ 2.0] range. - float factor = 2 - mBodyColour.b / 3; - float scale = factor * sunDistance * Ogre::Math::Tan (Ogre::Degree (0.01)); - mNode->setScale (Ogre::Vector3::UNIT_SCALE * scale); - } - - const Ogre::String SpriteSun::SUN_MATERIAL_NAME = "CaelumSpriteSun"; - - SpriteSun::SpriteSun ( - Ogre::SceneManager *sceneMgr, - Ogre::SceneNode *caelumRootNode, - const Ogre::String &sunTextureName, - const Ogre::Degree& sunTextureAngularSize - ): - BaseSkyLight(sceneMgr, caelumRootNode), - mSunTextureAngularSize(sunTextureAngularSize) - { - Ogre::String uniqueSuffix = "/" + InternalUtilities::pointerToString (this); - - mSunMaterial.reset (InternalUtilities::checkLoadMaterialClone (SUN_MATERIAL_NAME, SUN_MATERIAL_NAME + uniqueSuffix)); - setSunTexture (sunTextureName); - - mSunBillboardSet.reset (sceneMgr->createBillboardSet ("Caelum/SpriteSun" + uniqueSuffix, 2)); - mSunBillboardSet->setMaterialName (mSunMaterial->getName()); - mSunBillboardSet->setCastShadows (false); - mSunBillboardSet->setRenderQueueGroup (CAELUM_RENDER_QUEUE_SUN); - mSunBillboardSet->setDefaultDimensions (1.0f, 1.0f); - mSunBillboardSet->createBillboard (Ogre::Vector3::ZERO); - - mNode->attachObject (mSunBillboardSet.get ()); - } - - SpriteSun::~SpriteSun () { } - - void SpriteSun::setBodyColour (const Ogre::ColourValue &colour) { - BaseSkyLight::setBodyColour (colour); - - // Set sun material colour. - mSunBillboardSet->getBillboard (0)->setColour (colour); - } - - void SpriteSun::setSunTexture (const Ogre::String &textureName) { - // Update the sun material - assert(mSunMaterial->getBestTechnique ()); - assert(mSunMaterial->getBestTechnique ()->getPass (0)); - assert(mSunMaterial->getBestTechnique ()->getPass (0)->getTextureUnitState (0)); - mSunMaterial->getBestTechnique ()->getPass (0)->getTextureUnitState (0)->setTextureName (textureName); - } - - void SpriteSun::setSunTextureAngularSize(const Ogre::Degree& sunTextureAngularSize){ - mSunTextureAngularSize = sunTextureAngularSize; - } - - void SpriteSun::notifyCameraChanged (Ogre::Camera *cam) { - // This calls setFarRadius - BaseSkyLight::notifyCameraChanged(cam); - - // Set sun position. - Ogre::Real sunDistance = mRadius - mRadius * Ogre::Math::Tan(mSunTextureAngularSize); - mNode->setPosition (-mDirection * sunDistance); - - // Set sun scaling in [1.0 ~ 1.2] range - float factor = 1.2f - mBodyColour.b * 0.2f; - float scale = factor * sunDistance * Ogre::Math::Tan(mSunTextureAngularSize); - mNode->setScale (Ogre::Vector3::UNIT_SCALE * scale); - } -} diff --git a/extern/caelum/src/TypeDescriptor.cpp b/extern/caelum/src/TypeDescriptor.cpp deleted file mode 100644 index 5ca889c6d..000000000 --- a/extern/caelum/src/TypeDescriptor.cpp +++ /dev/null @@ -1,69 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2008 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -#include "CaelumPrecompiled.h" -#include "TypeDescriptor.h" - -#if CAELUM_TYPE_DESCRIPTORS - -using namespace Ogre; - -namespace Caelum -{ - DefaultTypeDescriptor::DefaultTypeDescriptor () - { - } - - DefaultTypeDescriptor::~DefaultTypeDescriptor () { - for (TypeDescriptor::PropertyMap::const_iterator it = mPropertyMap.begin(), end = mPropertyMap.end(); it != end; ++it) { - delete it->second; - } - } - - const ValuePropertyDescriptor* DefaultTypeDescriptor::getPropertyDescriptor (const Ogre::String& name) const - { - PropertyMap::const_iterator it = mPropertyMap.find(name); - if (it != mPropertyMap.end()) { - return it->second; - } else { - return 0; - } - } - - const std::vector DefaultTypeDescriptor::getPropertyNames () const - { - std::vector result; - for (TypeDescriptor::PropertyMap::const_iterator it = mPropertyMap.begin(), end = mPropertyMap.end(); it != end; ++it) { - result.push_back(it->first); - } - return result; - } - - const TypeDescriptor::PropertyMap DefaultTypeDescriptor::getFullPropertyMap () const { - return mPropertyMap; - } - - void DefaultTypeDescriptor::add (const Ogre::String& name, const ValuePropertyDescriptor* descriptor) - { - mPropertyMap.insert(make_pair(name, descriptor)); - } -} - -#endif diff --git a/extern/caelum/src/UniversalClock.cpp b/extern/caelum/src/UniversalClock.cpp deleted file mode 100644 index 5f00f4dd6..000000000 --- a/extern/caelum/src/UniversalClock.cpp +++ /dev/null @@ -1,84 +0,0 @@ -/* -This file is part of Caelum. -See http://www.ogre3d.org/wiki/index.php/Caelum - -Copyright (c) 2006-2008 Caelum team. See Contributors.txt for details. - -Caelum is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Caelum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Caelum. If not, see . -*/ - -#include "CaelumPrecompiled.h" -#include "UniversalClock.h" -#include "Astronomy.h" - -namespace Caelum -{ - const Caelum::LongReal UniversalClock::SECONDS_PER_DAY = 86400.0; - - UniversalClock::UniversalClock () { - setJulianDay (Astronomy::J2000); - setTimeScale (1.0); - } - - void UniversalClock::setJulianDay (Caelum::LongReal value) { - mJulianDayBase = value; - mCurrentTime = 0; - mLastUpdateTime = 0; - } - - void UniversalClock::setGregorianDateTime( - int year, int month, int day, - int hour, int minute, double second) - { - ScopedHighPrecissionFloatSwitch precissionSwitch; - setJulianDay(Astronomy::getJulianDayFromGregorianDateTime(year, month, day, hour, minute, second)); - } - - LongReal UniversalClock::getJulianDay () const - { - ScopedHighPrecissionFloatSwitch precissionSwitch; - Caelum::LongReal res = mJulianDayBase + mCurrentTime / SECONDS_PER_DAY; - return res; - } - - LongReal UniversalClock::getJulianDayDifference () const { - ScopedHighPrecissionFloatSwitch precissionSwitch; - return (mCurrentTime - mLastUpdateTime) / SECONDS_PER_DAY; - } - - LongReal UniversalClock::getJulianSecond () const { - ScopedHighPrecissionFloatSwitch precissionSwitch; - LongReal res = mJulianDayBase * SECONDS_PER_DAY + mCurrentTime; - return res; - } - - LongReal UniversalClock::getJulianSecondDifference () const { - ScopedHighPrecissionFloatSwitch precissionSwitch; - return mCurrentTime - mLastUpdateTime; - } - - void UniversalClock::setTimeScale (const Ogre::Real scale) { - mTimeScale = scale; - } - - Ogre::Real UniversalClock::getTimeScale () const { - return mTimeScale; - } - - void UniversalClock::update (const Ogre::Real time) { - mLastUpdateTime = mCurrentTime; - mCurrentTime += time * mTimeScale; - } -} - diff --git a/files/plugins.cfg.linux b/files/plugins.cfg.linux index b6e104351..f34621a0f 100644 --- a/files/plugins.cfg.linux +++ b/files/plugins.cfg.linux @@ -1,12 +1,12 @@ # Defines plugins to load # Define plugin folder -PluginFolder=${OGRE_PLUGIN_DIR} +PluginFolder=${OGRE_PLUGIN_DIR_REL} # Define plugins Plugin=RenderSystem_GL Plugin=Plugin_ParticleFX Plugin=Plugin_OctreeSceneManager -# Plugin=Plugin_CgProgramManager +Plugin=Plugin_CgProgramManager diff --git a/files/plugins.cfg.mac b/files/plugins.cfg.mac index baaca4479..0c16bddaf 100644 --- a/files/plugins.cfg.mac +++ b/files/plugins.cfg.mac @@ -7,6 +7,6 @@ PluginFolder= Plugin=RenderSystem_GL.dylib Plugin=Plugin_ParticleFX.dylib Plugin=Plugin_OctreeSceneManager.dylib -# Plugin=Plugin_CgProgramManager +Plugin=Plugin_CgProgramManager diff --git a/libs/mangle b/libs/mangle index f3c9694bf..14b2851e7 160000 --- a/libs/mangle +++ b/libs/mangle @@ -1 +1 @@ -Subproject commit f3c9694bf249a34eae05f0304e6bfc120014ce8c +Subproject commit 14b2851e72f610ae81dd296598867e6fb0babd2a diff --git a/libs/openengine b/libs/openengine index 4a188f282..21b845645 160000 --- a/libs/openengine +++ b/libs/openengine @@ -1 +1 @@ -Subproject commit 4a188f2820c037ca4ad8ef35492d3857ea8d7df8 +Subproject commit 21b8456453242e132c85f92047cf9bce535c1b22