diff --git a/.gitignore b/.gitignore index 8e8f6449c..b3bb8d82d 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,9 @@ Docs/mainpage.hpp CMakeFiles */CMakeFiles CMakeCache.txt +moc_*.cxx +cmake_install.cmake +*.[ao] Makefile makefile data diff --git a/CMakeLists.txt b/CMakeLists.txt index 723d10b34..6fb0ee34c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,11 +1,13 @@ project(OpenMW) -IF (APPLE) - set(APP_BUNDLE_DIR "${OpenMW_BINARY_DIR}/OpenMW.app") +if (APPLE) + set(APP_BUNDLE_NAME "${CMAKE_PROJECT_NAME}.app") + + set(APP_BUNDLE_DIR "${OpenMW_BINARY_DIR}/${APP_BUNDLE_NAME}") # using 10.6 sdk set(CMAKE_OSX_SYSROOT "/Developer/SDKs/MacOSX10.6.sdk") -ENDIF (APPLE) +endif (APPLE) # Macros @@ -16,8 +18,8 @@ include (OpenMWMacros) # Version set (OPENMW_VERSION_MAJOR 0) -set (OPENMW_VERSION_MINOR 11) -set (OPENMW_VERSION_RELEASE 1) +set (OPENMW_VERSION_MINOR 12) +set (OPENMW_VERSION_RELEASE 0) set (OPENMW_VERSION "${OPENMW_VERSION_MAJOR}.${OPENMW_VERSION_MINOR}.${OPENMW_VERSION_RELEASE}") @@ -94,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 @@ -188,9 +191,8 @@ find_package(OpenAL REQUIRED) find_package(Bullet REQUIRED) include_directories("." ${OGRE_INCLUDE_DIR} ${OGRE_INCLUDE_DIR}/Ogre ${OGRE_INCLUDE_DIR}/OGRE - ${OIS_INCLUDE_DIR} ${Boost_INCLUDE_DIR} + ${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} @@ -200,7 +202,14 @@ include_directories("." link_directories(${Boost_LIBRARY_DIRS} ${OGRE_LIB_DIR}) -add_subdirectory( extern/caelum ) +if(APPLE) + # List used Ogre plugins + SET(USED_OGRE_PLUGINS "RenderSystem_GL" + "Plugin_OctreeSceneManager" + "Plugin_CgProgramManager" + "Plugin_ParticleFX") +endif(APPLE) + add_subdirectory( extern/mygui_3.0.1 ) # Make sure that certain libraries are used as static libraries @@ -210,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) @@ -243,22 +249,17 @@ if (APPLE) "${OpenMW_BINARY_DIR}/plugins.cfg") configure_file(${OpenMW_SOURCE_DIR}/files/mac/Info.plist - "${APP_BUNDLE_DIR}/Contents/Info.plist" COPYONLY) + "${APP_BUNDLE_DIR}/Contents/Info.plist") configure_file(${OpenMW_SOURCE_DIR}/files/mac/openmw.icns "${APP_BUNDLE_DIR}/Contents/Resources/OpenMW.icns" COPYONLY) - # prepare plugins - configure_file(${OGRE_PLUGIN_DIR}/RenderSystem_GL.dylib - "${APP_BUNDLE_DIR}/Contents/Plugins/RenderSystem_GL.dylib" COPYONLY) - - configure_file(${OGRE_PLUGIN_DIR}/Plugin_OctreeSceneManager.dylib - "${APP_BUNDLE_DIR}/Contents/Plugins/Plugin_OctreeSceneManager.dylib" COPYONLY) - - configure_file(${OGRE_PLUGIN_DIR}/Plugin_ParticleFX.dylib - "${APP_BUNDLE_DIR}/Contents/Plugins/Plugin_ParticleFX.dylib" COPYONLY) - + foreach(plugin ${USED_OGRE_PLUGINS}) + configure_file("${OGRE_PLUGIN_DIR}/${plugin}.dylib" + "${APP_BUNDLE_DIR}/Contents/Plugins/${plugin}.dylib" + COPYONLY) + endforeach() endif (APPLE) @@ -268,36 +269,6 @@ if (CMAKE_COMPILER_IS_GNUCC) add_definitions (-Wall) endif (CMAKE_COMPILER_IS_GNUCC) -# Apple bundling -# TODO REWRITE! -if (APPLE) - set(MISC_FILES - ${APP_BUNDLE_DIR}/Contents/MacOS/openmw.cfg - ${APP_BUNDLE_DIR}/Contents/MacOS/plugins.cfg) - - set(OGRE_PLUGINS - ${APP_BUNDLE_DIR}/Contents/Plugins/*) - -install(FILES ${MISC_FILES} DESTINATION ../MacOS) -install(DIRECTORY "${APP_BUNDLE_DIR}/Contents/Plugins" DESTINATION ..) -install(DIRECTORY "${APP_BUNDLE_DIR}/Contents/Resources/resources" DESTINATION ../Resources) -set(CPACK_GENERATOR "Bundle") -set(CPACK_BUNDLE_PLIST "${CMAKE_SOURCE_DIR}/files/mac/Info.plist") -set(CPACK_BUNDLE_ICON "${CMAKE_SOURCE_DIR}/files/mac/openmw.icns") -set(CPACK_BUNDLE_NAME "OpenMW") -set(CPACK_PACKAGE_VERSION ${OPENMW_VERSION}) -set(CPACK_PACKAGE_VERSION_MAJOR ${OPENMW_VERSION_MAJOR}) -set(CPACK_PACKAGE_VERSION_MINOR ${OPENMW_VERSION_MINO}) -set(CPACK_PACKAGE_VERSION_PATCH ${OPENMW_VERSION_RELEASE}) - -include(CPack) - -set(CMAKE_EXE_LINKER_FLAGS "-arch i386") -set(CMAKE_CXX_FLAGS "-arch i386") - -endif (APPLE) - - if(DPKG_PROGRAM) SET(CMAKE_INSTALL_PREFIX "/usr") @@ -326,7 +297,7 @@ if(DPKG_PROGRAM) SET(CPACK_GENERATOR "DEB") SET(CPACK_PACKAGE_NAME "openmw") - SET(CPACK_DEBIAN_PACKAGE_HOMEPAGE "http://openmw.com") + SET(CPACK_DEBIAN_PACKAGE_HOMEPAGE "http://openmw.org") SET(CPACK_DEBIAN_PACKAGE_PRIORITY "optional") SET(CPACK_DEBIAN_PACKAGE_MAINTAINER "${PACKAGE_MAINTAINER}") SET(CPACK_DEBIAN_PACKAGE_DESCRIPTION "A reimplementation of The Elder Scrolls III: Morrowind @@ -351,6 +322,54 @@ if(DPKG_PROGRAM) include(CPack) endif(DPKG_PROGRAM) +if(WIN32) + FILE(GLOB files "${OpenMW_BINARY_DIR}/Release/*.*") + INSTALL(FILES ${files} DESTINATION ".") + INSTALL(FILES "${OpenMW_BINARY_DIR}/openmw.cfg.install" DESTINATION "." RENAME "openmw.cfg") + INSTALL(DIRECTORY "${OpenMW_BINARY_DIR}/resources" DESTINATION ".") + + SET(CPACK_GENERATOR "NSIS") + SET(CPACK_PACKAGE_NAME "OpenMW") + SET(CPACK_PACKAGE_VENDOR "OpenMW.org") + SET(CPACK_PACKAGE_VERSION ${OPENMW_VERSION}) + SET(CPACK_PACKAGE_VERSION_MAJOR ${OPENMW_VERSION_MAJOR}) + SET(CPACK_PACKAGE_VERSION_MINOR ${OPENMW_VERSION_MINO}) + SET(CPACK_PACKAGE_VERSION_PATCH ${OPENMW_VERSION_RELEASE}) + SET(CPACK_PACKAGE_EXECUTABLES "openmw;OpenMW;esmtool;Esmtool;omwlauncher;OpenMW Launcher") + SET(CPACK_PACKAGE_DESCRIPTION_FILE "${OpenMW_SOURCE_DIR}/readme.txt") + SET(CPACK_RESOURCE_FILE_LICENSE "${OpenMW_SOURCE_DIR}/GPL3.txt") + SET(CPACK_NSIS_EXECUTABLES_DIRECTORY ".") + SET(CPACK_NSIS_DISPLAY_NAME "OpenMW") + SET(CPACK_NSIS_HELP_LINK "http:\\\\\\\\www.openmw.org") + SET(CPACK_NSIS_URL_INFO_ABOUT "http:\\\\\\\\www.openmw.org") + SET(CPACK_NSIS_INSTALLED_ICON_NAME "omwlauncher.exe") + + SET(VCREDIST32 "${OpenMW_BINARY_DIR}/vcredist_x86.exe") + if(EXISTS ${VCREDIST32}) + INSTALL(FILES ${VCREDIST32} DESTINATION "redist") + SET(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "ExecWait '\\\"$INSTDIR\\\\redist\\\\vcredist_x86.exe\\\" /q'" ) + endif(EXISTS ${VCREDIST32}) + + SET(VCREDIST64 "${OpenMW_BINARY_DIR}/vcredist_x64.exe") + if(EXISTS ${VCREDIST64}) + INSTALL(FILES ${VCREDIST64} DESTINATION "redist") + SET(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "ExecWait '\\\"$INSTDIR\\\\redist\\\\vcredist_x64.exe\\\" /q'" ) + endif(EXISTS ${VCREDIST64}) + + SET(OALREDIST "${OpenMW_BINARY_DIR}/oalinst.exe") + if(EXISTS ${OALREDIST}) + INSTALL(FILES ${OALREDIST} DESTINATION "redist") + SET(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "${CPACK_NSIS_EXTRA_INSTALL_COMMANDS} + ExecWait '\\\"$INSTDIR\\\\redist\\\\oalinst.exe\\\" /s'" ) + endif(EXISTS ${OALREDIST}) + + if(CMAKE_CL_64) + SET(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES64") + endif() + + include(CPack) +endif(WIN32) + # Components add_subdirectory (components) @@ -405,3 +424,82 @@ if (WIN32) #set_target_properties(openmw PROPERTIES LINK_FLAGS_RELEASE "/SUBSYSTEM:WINDOWS") #set_target_properties(openmw PROPERTIES LINK_FLAGS_MINSIZEREL "/SUBSYSTEM:WINDOWS") endif() + +# Apple bundling +if (APPLE) + set(INSTALL_SUBDIR OpenMW) + + install(DIRECTORY "${APP_BUNDLE_DIR}" USE_SOURCE_PERMISSIONS DESTINATION "${INSTALL_SUBDIR}" COMPONENT Runtime) + install(DIRECTORY "${OpenMW_BINARY_DIR}/resources" DESTINATION "${INSTALL_SUBDIR}" COMPONENT Runtime) + install(FILES "${OpenMW_BINARY_DIR}/openmw.cfg.install" RENAME "openmw.cfg" DESTINATION "${INSTALL_SUBDIR}" COMPONENT Runtime) + + install(FILES "${OpenMW_BINARY_DIR}/plugins.cfg" DESTINATION "${INSTALL_SUBDIR}" COMPONENT Runtime) + install(FILES "${OpenMW_BINARY_DIR}/launcher.qss" DESTINATION "${INSTALL_SUBDIR}" COMPONENT Runtime) + set(CPACK_GENERATOR "DragNDrop") + set(CPACK_PACKAGE_VERSION ${OPENMW_VERSION}) + set(CPACK_PACKAGE_VERSION_MAJOR ${OPENMW_VERSION_MAJOR}) + set(CPACK_PACKAGE_VERSION_MINOR ${OPENMW_VERSION_MINO}) + set(CPACK_PACKAGE_VERSION_PATCH ${OPENMW_VERSION_RELEASE}) + + set(APPS "\${CMAKE_INSTALL_PREFIX}/${INSTALL_SUBDIR}/${APP_BUNDLE_NAME}") + set(PLUGINS "") + + # Scan Plugins dir for *.dylibs + set(PLUGIN_SEARCH_ROOT "${APP_BUNDLE_DIR}/Contents/Plugins") + file(GLOB_RECURSE ALL_PLUGINS "${PLUGIN_SEARCH_ROOT}/*.dylib") + + set(PLUGIN_INSTALL_BASE "\${CMAKE_INSTALL_PREFIX}/${INSTALL_SUBDIR}/${APP_BUNDLE_NAME}/Contents/Plugins") + foreach(PLUGIN ${ALL_PLUGINS}) + string(REPLACE "${PLUGIN_SEARCH_ROOT}/" "" PLUGIN_RELATIVE "${PLUGIN}") + set(PLUGINS ${PLUGINS} "${PLUGIN_INSTALL_BASE}/${PLUGIN_RELATIVE}") + endforeach() + + #For now, search unresolved dependencies only in default system paths, so if you put unresolveable (i.e. with @executable_path in id name) lib or framework somewhere else, it would fail + set(DIRS "") + + # Overriding item resolving during installation, it needed if + # some library already has be "fixed up", i.e. its id name contains @executable_path, + # but library is not embedded in bundle. For example, it's Ogre.framework from Ogre SDK. + # Current implementation of GetPrerequsities/BundleUtilities doesn't handle that case. + # + # Current limitations: + # 1. Handles only frameworks, not simple libs + INSTALL(CODE " + set(CMAKE_FIND_LIBRARY_PREFIXES ${CMAKE_FIND_LIBRARY_PREFIXES}) + set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) + set(CMAKE_SYSTEM_FRAMEWORK_PATH ${CMAKE_SYSTEM_FRAMEWORK_PATH}) + + set(OPENMW_RESOLVED_ITEMS \"\") + + function(gp_resolve_item_override context item exepath dirs resolved_item_var resolved_var) + if(item MATCHES \"@executable_path\" AND NOT \${\${resolved_var}}) + if (item MATCHES \"Frameworks\") # if it is a framework + # get last segment of path + get_filename_component(fname \"\${item}\" NAME_WE) + find_library(ri NAMES \${fname} PATHS \${exepath} \${dirs} /Library/Frameworks) + if (ri) + message(STATUS \"found \${ri} for \${item}\") + string(REGEX REPLACE \"^.*/Frameworks/.*\\\\.framework\" \"\" item_part \${item}) + set(ri \"\${ri}\${item_part}\") + set(\${resolved_item_var} \${ri} PARENT_SCOPE) + set(\${resolved_var} 1 PARENT_SCOPE) + set(OPENMW_RESOLVED_ITEMS \${_OPENMW_RESOLVED_ITEMS} \${ri}) + endif() + else() + # code path for standard (non-framework) libs (ogre & qt pugins) + endif() + endif() + endfunction(gp_resolve_item_override) + + cmake_policy(SET CMP0009 OLD) + set(BU_CHMOD_BUNDLE_ITEMS ON) + include(BundleUtilities) + fixup_bundle(\"${APPS}\" \"${PLUGINS}\" \"${DIRS}\") + " COMPONENT Runtime) + +include(CPack) + +set(CMAKE_EXE_LINKER_FLAGS "-arch i386") +set(CMAKE_CXX_FLAGS "-arch i386") + +endif (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/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 d6556d9e7..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/launcher/CMakeLists.txt b/apps/launcher/CMakeLists.txt index 2fc3189fc..319bbbc57 100644 --- a/apps/launcher/CMakeLists.txt +++ b/apps/launcher/CMakeLists.txt @@ -41,8 +41,10 @@ source_group(launcher FILES ${LAUNCHER} ${LAUNCHER_HEADER} ${LAUNCHER_HEADER_MOC find_package(Qt4 REQUIRED) set(QT_USE_QTGUI 1) -find_package(PNG REQUIRED) -include_directories(${PNG_INCLUDE_DIR}) +if (NOT APPLE) # this dependency can be completely removed, but now it only tested on OS X + find_package(PNG REQUIRED) + include_directories(${PNG_INCLUDE_DIR}) +endif() QT4_ADD_RESOURCES(RCC_SRCS resources.qrc) QT4_WRAP_CPP(MOC_SRCS ${LAUNCHER_HEADER_MOC}) @@ -71,9 +73,13 @@ endif() if (APPLE) configure_file(${CMAKE_SOURCE_DIR}/files/launcher.qss "${APP_BUNDLE_DIR}/../launcher.qss") - configure_file(${CMAKE_SOURCE_DIR}/files/launcher.qss + configure_file(${CMAKE_SOURCE_DIR}/files/launcher.cfg "${APP_BUNDLE_DIR}/../launcher.cfg") else() + configure_file(${CMAKE_SOURCE_DIR}/files/launcher.qss + "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/resources/launcher.qss") + + # Fallback in case getGlobalDataPath does not point to resources configure_file(${CMAKE_SOURCE_DIR}/files/launcher.qss "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/launcher.qss") diff --git a/apps/launcher/datafilespage.cpp b/apps/launcher/datafilespage.cpp index c8311846f..b88664f0c 100644 --- a/apps/launcher/datafilespage.cpp +++ b/apps/launcher/datafilespage.cpp @@ -3,7 +3,7 @@ #include #include #include -#include +#include #include "datafilespage.hpp" #include "lineedit.hpp" @@ -26,7 +26,9 @@ bool rowSmallerThan(const QModelIndex &index1, const QModelIndex &index2) return index1.row() <= index2.row(); } -DataFilesPage::DataFilesPage(QWidget *parent) : QWidget(parent) +DataFilesPage::DataFilesPage(Files::ConfigurationManager &cfg, QWidget *parent) + : QWidget(parent) + , mCfgMgr(cfg) { mDataFilesModel = new QStandardItemModel(); // Contains all plugins with masters mPluginsModel = new PluginsModel(); // Contains selectable plugins @@ -121,23 +123,88 @@ DataFilesPage::DataFilesPage(QWidget *parent) : QWidget(parent) setupConfig(); + setupDataFiles(); createActions(); } -void DataFilesPage::setupDataFiles(const QStringList &paths, bool strict) +void DataFilesPage::setupConfig() { - // Put the paths in a boost::filesystem vector to use with Files::Collections - Files::PathContainer dataDirs; + QString config = QString::fromStdString((mCfgMgr.getLocalPath() / "launcher.cfg").string()); + QFile file(config); + + if (!file.exists()) { + config = QString::fromStdString((mCfgMgr.getUserPath() / "launcher.cfg").string()); + } + + // Open our config file + mLauncherConfig = new QSettings(config, QSettings::IniFormat); + mLauncherConfig->sync(); + + + // Make sure we have no groups open + while (!mLauncherConfig->group().isEmpty()) { + mLauncherConfig->endGroup(); + } + + mLauncherConfig->beginGroup("Profiles"); + QStringList profiles = mLauncherConfig->childGroups(); - foreach (const QString ¤tPath, paths) { - dataDirs.push_back(boost::filesystem::path(currentPath.toStdString())); + if (profiles.isEmpty()) { + // Add a default profile + profiles.append("Default"); } + mProfilesComboBox->addItems(profiles); + + QString currentProfile = mLauncherConfig->value("CurrentProfile").toString(); + + if (currentProfile.isEmpty()) { + // No current profile selected + currentProfile = "Default"; + } + mProfilesComboBox->setCurrentIndex(mProfilesComboBox->findText(currentProfile)); + + mLauncherConfig->endGroup(); + + // Now we connect the combobox to do something if the profile changes + // This prevents strange behaviour while reading and appending the profiles + connect(mProfilesComboBox, SIGNAL(textChanged(const QString&, const QString&)), this, SLOT(profileChanged(const QString&, const QString&))); +} + + +void DataFilesPage::setupDataFiles() +{ + // We use the Configuration Manager to retrieve the configuration values + boost::program_options::variables_map variables; + boost::program_options::options_description desc; + + desc.add_options() + ("data", boost::program_options::value()->default_value(Files::PathContainer(), "data")->multitoken()) +// ("data-local", boost::program_options::value()->default_value("")) + ("fs-strict", boost::program_options::value()->implicit_value(true)->default_value(false)) + ("encoding", boost::program_options::value()->default_value("win1252")); + + mCfgMgr.readConfiguration(variables, desc); + + // Put the paths in a boost::filesystem vector to use with Files::Collections + Files::PathContainer dataDirs(variables["data"].as()); + +// std::string local(variables["data-local"].as()); +// if (!local.empty()) +// { +// dataDirs.push_back(Files::PathContainer::value_type(local)); +// } + + if (dataDirs.size()>1) + dataDirs.resize (1); + + mCfgMgr.processPaths(dataDirs); + // Create a file collection for the dataDirs - Files::Collections mFileCollections(dataDirs, strict); + Files::Collections fileCollections(dataDirs, !variables["fs-strict"].as()); // First we add all the master files - const Files::MultiDirCollection &esm = mFileCollections.getCollection(".esm"); + const Files::MultiDirCollection &esm = fileCollections.getCollection(".esm"); unsigned int i = 0; // Row number for (Files::MultiDirCollection::TIter iter(esm.begin()); iter!=esm.end(); ++iter) @@ -157,14 +224,14 @@ void DataFilesPage::setupDataFiles(const QStringList &paths, bool strict) } // Now on to the plugins - const Files::MultiDirCollection &esp = mFileCollections.getCollection(".esp"); + const Files::MultiDirCollection &esp = fileCollections.getCollection(".esp"); for (Files::MultiDirCollection::TIter iter(esp.begin()); iter!=esp.end(); ++iter) { ESMReader fileReader; QStringList availableMasters; // Will contain all found masters - fileReader.setEncoding("win1252"); // FIXME: This should be configurable! + fileReader.setEncoding(variables["encoding"].as()); fileReader.open(iter->second.string()); // First we fill the availableMasters and the mMastersWidget @@ -234,54 +301,6 @@ void DataFilesPage::setupDataFiles(const QStringList &paths, bool strict) readConfig(); } -void DataFilesPage::setupConfig() -{ - Cfg::ConfigurationManager cfg; - - QString config = (cfg.getRuntimeConfigPath() / "launcher.cfg").string().c_str(); - QFile file(config); - - if (!file.exists()) { - config = QString::fromStdString((cfg.getLocalConfigPath() / "launcher.cfg").string()); - } - - file.setFileName(config); // Just for displaying information - - // Open our config file - mLauncherConfig = new QSettings(config, QSettings::IniFormat); - mLauncherConfig->sync(); - - - // Make sure we have no groups open - while (!mLauncherConfig->group().isEmpty()) { - mLauncherConfig->endGroup(); - } - - mLauncherConfig->beginGroup("Profiles"); - QStringList profiles = mLauncherConfig->childGroups(); - - if (profiles.isEmpty()) { - // Add a default profile - profiles.append("Default"); - } - - mProfilesComboBox->addItems(profiles); - - QString currentProfile = mLauncherConfig->value("CurrentProfile").toString(); - - if (currentProfile.isEmpty()) { - // No current profile selected - currentProfile = "Default"; - } - mProfilesComboBox->setCurrentIndex(mProfilesComboBox->findText(currentProfile)); - - mLauncherConfig->endGroup(); - - // Now we connect the combobox to do something if the profile changes - // This prevents strange behaviour while reading and appending the profiles - connect(mProfilesComboBox, SIGNAL(textChanged(const QString&, const QString&)), this, SLOT(profileChanged(const QString&, const QString&))); -} - void DataFilesPage::createActions() { // Refresh the plugins @@ -968,8 +987,8 @@ void DataFilesPage::readConfig() void DataFilesPage::writeConfig(QString profile) { - // Don't overwrite the config if no plugins are found - if (mPluginsModel->rowCount() < 1) { + // Don't overwrite the config if no masters are found + if (mMastersWidget->rowCount() < 1) { return; } @@ -981,6 +1000,61 @@ void DataFilesPage::writeConfig(QString profile) return; } + // Prepare the OpenMW config + QString config = QString::fromStdString((mCfgMgr.getLocalPath() / "openmw.cfg").string()); + QFile file(config); + + if (!file.exists()) { + config = QString::fromStdString((mCfgMgr.getUserPath() / "openmw.cfg").string()); + } + + // Open the config as a QFile + file.setFileName(config); + + if (!file.open(QIODevice::ReadWrite | QIODevice::Text)) { + // File cannot be opened or created + QMessageBox msgBox; + msgBox.setWindowTitle("Error writing OpenMW configuration file"); + msgBox.setIcon(QMessageBox::Critical); + msgBox.setStandardButtons(QMessageBox::Ok); + msgBox.setText(tr("
Could not open or create %0

\ + Please make sure you have the right permissions and try again.
").arg(file.fileName())); + msgBox.exec(); + + qApp->exit(1); + return; + } + + QTextStream in(&file); + QByteArray buffer; + + // Remove all previous master/plugin entries from config + while (!in.atEnd()) { + QString line = in.readLine(); + if (!line.contains("master") && !line.contains("plugin")) { + buffer += line += "\n"; + } + } + + file.close(); + + // Now we write back the other config entries + if (!file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate)) { + QMessageBox msgBox; + msgBox.setWindowTitle("Error writing OpenMW configuration file"); + msgBox.setIcon(QMessageBox::Critical); + msgBox.setStandardButtons(QMessageBox::Ok); + msgBox.setText(tr("
Could not write to %0

\ + Please make sure you have the right permissions and try again.
").arg(file.fileName())); + msgBox.exec(); + + qApp->exit(1); + return; + } + + file.write(buffer); + QTextStream gameConfig(&file); + // Make sure we have no groups open while (!mLauncherConfig->group().isEmpty()) { mLauncherConfig->endGroup(); @@ -993,13 +1067,16 @@ void DataFilesPage::writeConfig(QString profile) mLauncherConfig->beginGroup(profile); mLauncherConfig->remove(""); // Clear the subgroup - // First write the masters to the config - const QStringList masterList = selectedMasters(); + // First write the masters to the configs + const QStringList masters = selectedMasters(); // We don't use foreach because we need i - for (int i = 0; i < masterList.size(); ++i) { - const QString master = masterList.at(i); - mLauncherConfig->setValue(QString("Master%0").arg(i), master); + for (int i = 0; i < masters.size(); ++i) { + const QString currentMaster = masters.at(i); + + mLauncherConfig->setValue(QString("Master%0").arg(i), currentMaster); + gameConfig << "master=" << currentMaster << endl; + } // Now write all checked plugins @@ -1007,10 +1084,13 @@ void DataFilesPage::writeConfig(QString profile) for (int i = 0; i < plugins.size(); ++i) { - mLauncherConfig->setValue(QString("Plugin%1").arg(i), plugins.at(i)); + const QString currentPlugin = plugins.at(i); + mLauncherConfig->setValue(QString("Plugin%1").arg(i), currentPlugin); + gameConfig << "plugin=" << currentPlugin << endl; } + file.close(); mLauncherConfig->endGroup(); mLauncherConfig->endGroup(); - + mLauncherConfig->sync(); } diff --git a/apps/launcher/datafilespage.hpp b/apps/launcher/datafilespage.hpp index 2d0a385a7..a454fa871 100644 --- a/apps/launcher/datafilespage.hpp +++ b/apps/launcher/datafilespage.hpp @@ -19,24 +19,19 @@ class PluginsModel; class PluginsView; class ComboBox; +namespace Files { struct ConfigurationManager; } + class DataFilesPage : public QWidget { Q_OBJECT public: - DataFilesPage(QWidget *parent = 0); + DataFilesPage(Files::ConfigurationManager& cfg, QWidget *parent = 0); ComboBox *mProfilesComboBox; - QSettings *mLauncherConfig; - const QStringList checkedPlugins(); - const QStringList selectedMasters(); - void setupConfig(); - void readConfig(); void writeConfig(QString profile = QString()); - void setupDataFiles(const QStringList &paths, bool strict); - public slots: void masterSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected); void setCheckState(QModelIndex index); @@ -81,11 +76,20 @@ private: QAction *mCheckAction; QAction *mUncheckAction; + Files::ConfigurationManager &mCfgMgr; + + QSettings *mLauncherConfig; + + const QStringList checkedPlugins(); + const QStringList selectedMasters(); + void addPlugins(const QModelIndex &index); void removePlugins(const QModelIndex &index); void uncheckPlugins(); void createActions(); - + void setupDataFiles(); + void setupConfig(); + void readConfig(); void scrollToSelection(); }; diff --git a/apps/launcher/graphicspage.cpp b/apps/launcher/graphicspage.cpp index 92fbf3350..aaa54dd7f 100644 --- a/apps/launcher/graphicspage.cpp +++ b/apps/launcher/graphicspage.cpp @@ -1,8 +1,11 @@ #include #include "graphicspage.hpp" +#include -GraphicsPage::GraphicsPage(QWidget *parent) : QWidget(parent) +GraphicsPage::GraphicsPage(Files::ConfigurationManager &cfg, QWidget *parent) + : QWidget(parent) + , mCfgMgr(cfg) { QGroupBox *rendererGroup = new QGroupBox(tr("Renderer"), this); @@ -147,21 +150,21 @@ void GraphicsPage::createPages() void GraphicsPage::setupConfig() { - QString ogreCfg = mCfg.getOgreConfigPath().string().c_str(); + QString ogreCfg = mCfgMgr.getOgreConfigPath().string().c_str(); QFile file(ogreCfg); mOgreConfig = new QSettings(ogreCfg, QSettings::IniFormat); } void GraphicsPage::setupOgre() { - QString pluginCfg = mCfg.getPluginsConfigPath().string().c_str(); + QString pluginCfg = mCfgMgr.getPluginsConfigPath().string().c_str(); QFile file(pluginCfg); // Create a log manager so we can surpress debug text to stdout/stderr Ogre::LogManager* logMgr = OGRE_NEW Ogre::LogManager; - logMgr->createLog((mCfg.getLogPath().string() + "/launcherOgre.log"), true, false, false); + logMgr->createLog((mCfgMgr.getLogPath().string() + "/launcherOgre.log"), true, false, false); - QString ogreCfg = QString::fromStdString(mCfg.getOgreConfigPath().string()); + QString ogreCfg = QString::fromStdString(mCfgMgr.getOgreConfigPath().string()); file.setFileName(ogreCfg); //we need to check that the path to the configuration file exists before we @@ -177,7 +180,7 @@ void GraphicsPage::setupOgre() Make sure you have write access to
%1

")).arg(configDir.path())); msgBox.exec(); - QApplication::exit(1); + qApp->exit(1); return; } @@ -200,7 +203,7 @@ void GraphicsPage::setupOgre() qCritical("Error creating Ogre::Root, the error reported was:\n %s", qPrintable(ogreError)); - QApplication::exit(1); + qApp->exit(1); return; } @@ -234,7 +237,7 @@ void GraphicsPage::setupOgre() Please make sure the plugins.cfg file exists and contains a valid rendering plugin.
")); msgBox.exec(); - QApplication::exit(1); + qApp->exit(1); return; } @@ -420,7 +423,7 @@ void GraphicsPage::writeConfig() qCritical("Error validating configuration"); - QApplication::exit(1); + qApp->exit(1); return; } @@ -446,7 +449,8 @@ void GraphicsPage::writeConfig() qCritical("Error saving Ogre configuration, the error reported was:\n %s", qPrintable(ogreError)); - QApplication::exit(1); + qApp->exit(1); + return; } } diff --git a/apps/launcher/graphicspage.hpp b/apps/launcher/graphicspage.hpp index 5d50cfc61..bdfd4f038 100644 --- a/apps/launcher/graphicspage.hpp +++ b/apps/launcher/graphicspage.hpp @@ -7,21 +7,20 @@ #include #include #include -#include class QComboBox; class QCheckBox; class QStackedWidget; class QSettings; +namespace Files { struct ConfigurationManager; } + class GraphicsPage : public QWidget { Q_OBJECT public: - GraphicsPage(QWidget *parent = 0); - - QSettings *mOgreConfig; + GraphicsPage(Files::ConfigurationManager &cfg, QWidget *parent = 0); void writeConfig(); @@ -29,7 +28,6 @@ public slots: void rendererChanged(const QString &renderer); private: - Cfg::ConfigurationManager mCfg; Ogre::Root *mOgre; Ogre::RenderSystem *mSelectedRenderSystem; Ogre::RenderSystem *mOpenGLRenderSystem; @@ -59,6 +57,10 @@ private: QCheckBox *mD3DVSyncCheckBox; QCheckBox *mD3DFullScreenCheckBox; + QSettings *mOgreConfig; + + Files::ConfigurationManager &mCfgMgr; + QString getConfigValue(const QString &key, Ogre::RenderSystem *renderer); QStringList getAvailableOptions(const QString &key, Ogre::RenderSystem *renderer); diff --git a/apps/launcher/main.cpp b/apps/launcher/main.cpp index 4e438a4db..bd29e2bca 100644 --- a/apps/launcher/main.cpp +++ b/apps/launcher/main.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include "maindialog.hpp" @@ -17,16 +18,18 @@ int main(int argc, char *argv[]) dir.cdUp(); dir.cdUp(); } - #endif - QDir::setCurrent(dir.absolutePath()); + // force Qt to load only LOCAL plugins, don't touch system Qt installation + QDir pluginsPath(QCoreApplication::applicationDirPath()); + pluginsPath.cdUp(); + pluginsPath.cd("Plugins"); - // Load the stylesheet - QFile file("./launcher.qss"); + QStringList libraryPaths; + libraryPaths << pluginsPath.path() << QCoreApplication::applicationDirPath(); + app.setLibraryPaths(libraryPaths); + #endif - file.open(QFile::ReadOnly); - QString styleSheet = QLatin1String(file.readAll()); - app.setStyleSheet(styleSheet); + QDir::setCurrent(dir.absolutePath()); MainDialog dialog; return dialog.exec(); diff --git a/apps/launcher/maindialog.cpp b/apps/launcher/maindialog.cpp index 4ec8b309c..49c0bd960 100644 --- a/apps/launcher/maindialog.cpp +++ b/apps/launcher/maindialog.cpp @@ -45,6 +45,20 @@ MainDialog::MainDialog() setWindowFlags(this->windowFlags() & ~Qt::WindowContextHelpButtonHint); setMinimumSize(QSize(575, 575)); + // Load the stylesheet + QString config = QString::fromStdString((mCfgMgr.getGlobalDataPath() / "resources/launcher.qss").string()); + QFile file(config); + + if (!file.exists()) { + file.setFileName(QString::fromStdString((mCfgMgr.getLocalPath() / "launcher.qss").string())); + } + + file.open(QFile::ReadOnly); + QString styleSheet = QLatin1String(file.readAll()); + qApp->setStyleSheet(styleSheet); + file.close(); + + connect(buttonBox, SIGNAL(rejected()), this, SLOT(close())); connect(buttonBox, SIGNAL(accepted()), this, SLOT(play())); @@ -85,116 +99,13 @@ void MainDialog::createIcons() } -QStringList MainDialog::readConfig(const QString &fileName) -{ - // We can't use QSettings directly because it - // does not support multiple keys with the same name - QFile file(fileName); - - if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { - QMessageBox msgBox; - msgBox.setWindowTitle("Error opening OpenMW configuration file"); - msgBox.setIcon(QMessageBox::Critical); - msgBox.setStandardButtons(QMessageBox::Ok); - msgBox.setText(tr("
Could not open %0

\ - Please make sure you have the right permissions and try again.
").arg(file.fileName())); - msgBox.exec(); - - QApplication::exit(); // File cannot be opened or created - } - - QTextStream in(&file); - QStringList dataDirs; - QString dataLocal; - - // Read the config line by line - while (!in.atEnd()) { - QString line = in.readLine(); - - if (line.startsWith("data=")) { - dataDirs.append(line.remove("data=")); - } - - // Read the data-local key, if more than one are found only the last is used - if (line.startsWith("data-local=")) { - dataLocal = line.remove("data-local="); - } - - // Read fs-strict key - if (line.startsWith("fs-strict=")) { - QString value = line.remove("fs-strict="); - - (value.toLower() == QLatin1String("true")) - ? mStrict = true - : mStrict = false; - - } - - } - - // Add the data-local= key to the end of the dataDirs for priority reasons - if (!dataLocal.isEmpty()) { - dataDirs.append(dataLocal); - } - - if (!dataDirs.isEmpty()) - { - // Reset the global datadirs to the newly read entries - // Else return the previous dataDirs because nothing was found in this file; - mDataDirs = dataDirs; - } - - file.close(); - - return mDataDirs; -} - void MainDialog::createPages() { mPlayPage = new PlayPage(this); - mGraphicsPage = new GraphicsPage(this); - mDataFilesPage = new DataFilesPage(this); - - // Retrieve all data entries from the configs - QStringList dataDirs; + mGraphicsPage = new GraphicsPage(mCfgMgr, this); + mDataFilesPage = new DataFilesPage(mCfgMgr, this); - // Global location - QFile file(QString::fromStdString((mCfg.getGlobalConfigPath()/"openmw.cfg").string())); - if (file.exists()) { - dataDirs = readConfig(file.fileName()); - } - - // User location - file.setFileName(QString::fromStdString((mCfg.getLocalConfigPath()/"openmw.cfg").string())); - if (file.exists()) { - dataDirs = readConfig(file.fileName()); - } - - // Local location - file.setFileName("./openmw.cfg"); - - if (file.exists()) { - dataDirs = readConfig(file.fileName()); - } - - file.close(); - - if (!dataDirs.isEmpty()) { - // Now pass the datadirs on to the DataFilesPage - mDataFilesPage->setupDataFiles(dataDirs, mStrict); - } else { - QMessageBox msgBox; - msgBox.setWindowTitle("Error reading OpenMW configuration file"); - msgBox.setIcon(QMessageBox::Critical); - msgBox.setStandardButtons(QMessageBox::Ok); - msgBox.setText(tr("
Could not read the location of the data files

\ - Please make sure OpenMW is correctly configured and try again.
")); - msgBox.exec(); - - QApplication::exit(); // No data or data-local entries in openmw.cfg - } - - // Set the combobox of the play page to imitate the comobox on the datafilespage + // Set the combobox of the play page to imitate the combobox on the datafilespage mPlayPage->mProfilesComboBox->setModel(mDataFilesPage->mProfilesComboBox->model()); mPlayPage->mProfilesComboBox->setCurrentIndex(mDataFilesPage->mProfilesComboBox->currentIndex()); @@ -246,14 +157,16 @@ void MainDialog::changePage(QListWidgetItem *current, QListWidgetItem *previous) void MainDialog::closeEvent(QCloseEvent *event) { // Now write all config files - writeConfig(); + mDataFilesPage->writeConfig(); + mGraphicsPage->writeConfig(); event->accept(); } void MainDialog::play() { // First do a write of all the configs, just to be sure - writeConfig(); + mDataFilesPage->writeConfig(); + mGraphicsPage->writeConfig(); #ifdef Q_WS_WIN QString game = "./openmw.exe"; @@ -313,75 +226,3 @@ void MainDialog::play() close(); } } - -void MainDialog::writeConfig() -{ - // Write the profiles - mDataFilesPage->writeConfig(); - mDataFilesPage->mLauncherConfig->sync(); - - // Write the graphics settings - mGraphicsPage->writeConfig(); - mGraphicsPage->mOgreConfig->sync(); - - QStringList dataFiles = mDataFilesPage->selectedMasters(); - dataFiles.append(mDataFilesPage->checkedPlugins()); - - // Open the config as a QFile - QFile file(QString::fromStdString((mCfg.getLocalConfigPath()/"openmw.cfg").string())); - - if (!file.open(QIODevice::ReadWrite | QIODevice::Text)) { - // File cannot be opened or created - QMessageBox msgBox; - msgBox.setWindowTitle("Error writing OpenMW configuration file"); - msgBox.setIcon(QMessageBox::Critical); - msgBox.setStandardButtons(QMessageBox::Ok); - msgBox.setText(tr("
Could not open or create %0

\ - Please make sure you have the right permissions and try again.
").arg(file.fileName())); - msgBox.exec(); - - QApplication::exit(1); - } - - QTextStream in(&file); - QByteArray buffer; - - // Remove all previous master/plugin entries from config - while (!in.atEnd()) { - QString line = in.readLine(); - if (!line.contains("master") && !line.contains("plugin")) { - buffer += line += "\n"; - } - } - - file.close(); - - // Now we write back the other config entries - if (!file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate)) { - QMessageBox msgBox; - msgBox.setWindowTitle("Error writing OpenMW configuration file"); - msgBox.setIcon(QMessageBox::Critical); - msgBox.setStandardButtons(QMessageBox::Ok); - msgBox.setText(tr("
Could not write to %0

\ - Please make sure you have the right permissions and try again.
").arg(file.fileName())); - msgBox.exec(); - - QApplication::exit(1); - } - - file.write(buffer); - - QTextStream out(&file); - - // Write the list of game files to the config - foreach (const QString ¤tFile, dataFiles) { - - if (currentFile.endsWith(QString(".esm"), Qt::CaseInsensitive)) { - out << "master=" << currentFile << endl; - } else if (currentFile.endsWith(QString(".esp"), Qt::CaseInsensitive)) { - out << "plugin=" << currentFile << endl; - } - } - - file.close(); -} diff --git a/apps/launcher/maindialog.hpp b/apps/launcher/maindialog.hpp index 047050902..d6d0e9974 100644 --- a/apps/launcher/maindialog.hpp +++ b/apps/launcher/maindialog.hpp @@ -3,7 +3,7 @@ #include -#include +#include class QListWidget; class QListWidgetItem; @@ -28,15 +28,11 @@ public slots: void play(); void profileChanged(int index); - private: void createIcons(); void createPages(); - void writeConfig(); void closeEvent(QCloseEvent *event); - QStringList readConfig(const QString &fileName); - QListWidget *mIconWidget; QStackedWidget *mPagesWidget; @@ -44,10 +40,7 @@ private: GraphicsPage *mGraphicsPage; DataFilesPage *mDataFilesPage; - QStringList mDataDirs; - bool mStrict; - - Cfg::ConfigurationManager mCfg; + Files::ConfigurationManager mCfgMgr; }; #endif diff --git a/apps/openmw/CMakeLists.txt b/apps/openmw/CMakeLists.txt index 359a7b4e7..39cd99cf6 100644 --- a/apps/openmw/CMakeLists.txt +++ b/apps/openmw/CMakeLists.txt @@ -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 customdata + 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 @@ -86,10 +85,6 @@ target_link_libraries(openmw if(APPLE) find_library(CARBON_FRAMEWORK Carbon) target_link_libraries(openmw ${CARBON_FRAMEWORK}) - install(TARGETS openmw - BUNDLE DESTINATION . - RUNTIME DESTINATION ../MacOS - COMPONENT Runtime) endif(APPLE) if(DPKG_PROGRAM) diff --git a/apps/openmw/engine.cpp b/apps/openmw/engine.cpp index c8dca2d3a..4765ceadc 100644 --- a/apps/openmw/engine.cpp +++ b/apps/openmw/engine.cpp @@ -18,7 +18,9 @@ #include #include #include -#include +#include +#include + #include #include @@ -171,7 +173,7 @@ bool OMW::Engine::frameRenderingQueued (const Ogre::FrameEvent& evt) return true; } -OMW::Engine::Engine(Cfg::ConfigurationManager& configurationManager) +OMW::Engine::Engine(Files::ConfigurationManager& configurationManager) : mOgre (0) , mFpsLevel(0) , mDebug (false) @@ -208,15 +210,16 @@ OMW::Engine::~Engine() void OMW::Engine::loadBSA() { const Files::MultiDirCollection& bsa = mFileCollections.getCollection (".bsa"); - - for (Files::MultiDirCollection::TIter iter (bsa.begin()); iter!=bsa.end(); ++iter) + std::string dataDirectory; + for (Files::MultiDirCollection::TIter iter(bsa.begin()); iter!=bsa.end(); ++iter) { - std::cout << "Adding " << iter->second.string() << std::endl; - Bsa::addBSA (iter->second.string()); - } + std::cout << "Adding " << iter->second.string() << std::endl; + Bsa::addBSA(iter->second.string()); - std::cout << "Data dir " << mDataDir.string() << std::endl; - Bsa::addDir(mDataDir.string(), mFSStrict); + dataDirectory = iter->second.parent_path().string(); + std::cout << "Data dir " << dataDirectory << std::endl; + Bsa::addDir(dataDirectory, mFSStrict); + } } // add resources directory @@ -237,9 +240,7 @@ void OMW::Engine::enableFSStrict(bool fsStrict) void OMW::Engine::setDataDirs (const Files::PathContainer& dataDirs) { - /// \todo remove mDataDir, once resources system can handle multiple directories - assert (!dataDirs.empty()); - mDataDir = dataDirs.back(); + mDataDirs = dataDirs; mFileCollections = Files::Collections (dataDirs, !mFSStrict); } @@ -315,7 +316,7 @@ void OMW::Engine::go() } mOgre->configure(!boost::filesystem::is_regular_file(mCfgMgr.getOgreConfigPath()), mCfgMgr.getOgreConfigPath().string(), - mCfgMgr.getLogPath().string() + std::string("/"), + mCfgMgr.getLogPath().string(), mCfgMgr.getPluginsConfigPath().string(), false); // This has to be added BEFORE MyGUI is initialized, as it needs @@ -341,7 +342,7 @@ void OMW::Engine::go() mEnvironment.mSoundManager = new MWSound::SoundManager(mOgre->getRoot(), mOgre->getCamera(), mEnvironment.mWorld->getStore(), - (mDataDir), + mDataDirs, mUseSound, mFSStrict, mEnvironment); // Create script system @@ -445,6 +446,28 @@ void OMW::Engine::activate() } } +void OMW::Engine::screenshot() +{ + // Count screenshots. + int shotCount = 0; + + const std::string screenshotPath = mCfgMgr.getUserPath().string(); + + // Find the first unused filename with a do-while + std::ostringstream stream; + do + { + // Reset the stream + stream.str(""); + stream.clear(); + + stream << screenshotPath << "screenshot" << std::setw(3) << std::setfill('0') << shotCount++ << ".png"; + + } while (boost::filesystem::exists(stream.str())); + + mOgre->screenshot(stream.str()); +} + void OMW::Engine::setCompileAll (bool all) { mCompileAll = all; diff --git a/apps/openmw/engine.hpp b/apps/openmw/engine.hpp index b224df7d1..5c5cdc018 100644 --- a/apps/openmw/engine.hpp +++ b/apps/openmw/engine.hpp @@ -9,7 +9,6 @@ #include #include -#include #include "mwworld/environment.hpp" #include "mwworld/ptr.hpp" @@ -52,13 +51,18 @@ namespace OEngine } } +namespace Files +{ + struct ConfigurationManager; +} + namespace OMW { /// \brief Main engine class, that brings together all the components of OpenMW class Engine : private Ogre::FrameListener { std::string mEncoding; - boost::filesystem::path mDataDir; + Files::PathContainer mDataDirs; boost::filesystem::path mResDir; OEngine::Render::OgreRenderer *mOgre; std::string mCellName; @@ -101,7 +105,7 @@ namespace OMW virtual bool frameRenderingQueued (const Ogre::FrameEvent& evt); public: - Engine(Cfg::ConfigurationManager& configurationManager); + Engine(Files::ConfigurationManager& configurationManager); virtual ~Engine(); /// Enable strict filesystem mode (do not fold case) @@ -149,6 +153,9 @@ namespace OMW /// Activate the focussed object. void activate(); + /// Write screenshot to file. + void screenshot(); + /// Compile all scripts (excludign dialogue scripts) at startup? void setCompileAll (bool all); @@ -158,7 +165,7 @@ namespace OMW void setAnimationVerbose(bool animverbose); private: - Cfg::ConfigurationManager& mCfgMgr; + Files::ConfigurationManager& mCfgMgr; }; } diff --git a/apps/openmw/main.cpp b/apps/openmw/main.cpp index 2d0c8e44b..cd1e0e26e 100644 --- a/apps/openmw/main.cpp +++ b/apps/openmw/main.cpp @@ -6,9 +6,9 @@ #include #include -#include +#include #include -#include +#include #include "engine.hpp" @@ -35,6 +35,23 @@ #include "config.hpp" +#include +/** + * Workaround for problems with whitespaces in paths in older versions of Boost library + */ +#if (BOOST_VERSION <= 104600) +namespace boost +{ + +template<> +inline boost::filesystem::path lexical_cast(const std::string& arg) +{ + return boost::filesystem::path(arg); +} + +} /* namespace boost */ +#endif /* (BOOST_VERSION <= 104600) */ + using namespace std; /** @@ -46,7 +63,7 @@ using namespace std; * \retval true - Everything goes OK * \retval false - Error */ -bool parseOptions (int argc, char** argv, OMW::Engine& engine, Cfg::ConfigurationManager& cfgMgr) +bool parseOptions (int argc, char** argv, OMW::Engine& engine, Files::ConfigurationManager& cfgMgr) { // Create a local alias for brevity namespace bpo = boost::program_options; @@ -164,14 +181,19 @@ bool parseOptions (int argc, char** argv, OMW::Engine& engine, Cfg::Configuratio std::string local(variables["data-local"].as()); if (!local.empty()) { - dataDirs.push_back(Files::PathContainer::value_type(local)); + std::cout << "Ignoring data-local (currently not supported)" << std::endl; +// dataDirs.push_back(Files::PathContainer::value_type(local)); } - if (dataDirs.empty()) + if (dataDirs.size()>1) { - dataDirs.push_back(cfgMgr.getLocalDataPath()); + dataDirs.resize (1); + std::cout << "Ignoring all but the first data path (multiple data paths currently not supported)" + << std::endl; } + cfgMgr.processPaths(dataDirs); + engine.setDataDirs(dataDirs); engine.setResourceDir(variables["resources"].as()); @@ -224,7 +246,7 @@ int main(int argc, char**argv) try { - Cfg::ConfigurationManager cfgMgr; + Files::ConfigurationManager cfgMgr; OMW::Engine engine(cfgMgr); if (parseOptions(argc, argv, engine, cfgMgr)) diff --git a/apps/openmw/mwclass/apparatus.cpp b/apps/openmw/mwclass/apparatus.cpp index cc30c6955..da7ff8696 100644 --- a/apps/openmw/mwclass/apparatus.cpp +++ b/apps/openmw/mwclass/apparatus.cpp @@ -10,8 +10,6 @@ #include "../mwrender/objects.hpp" -#include "containerutil.hpp" - namespace MWClass { void Apparatus::insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const @@ -59,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 9a5a9b955..86223cf60 100644 --- a/apps/openmw/mwclass/apparatus.hpp +++ b/apps/openmw/mwclass/apparatus.hpp @@ -22,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 9a0936027..3cdf63119 100644 --- a/apps/openmw/mwclass/armor.cpp +++ b/apps/openmw/mwclass/armor.cpp @@ -10,8 +10,6 @@ #include "../mwrender/objects.hpp" -#include "containerutil.hpp" - namespace MWClass { void Armor::insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const @@ -71,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 123713a38..060bc364e 100644 --- a/apps/openmw/mwclass/armor.hpp +++ b/apps/openmw/mwclass/armor.hpp @@ -28,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 8c5be4793..576e521ee 100644 --- a/apps/openmw/mwclass/book.cpp +++ b/apps/openmw/mwclass/book.cpp @@ -10,8 +10,6 @@ #include "../mwrender/objects.hpp" -#include "containerutil.hpp" - namespace MWClass { void Book::insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const @@ -61,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 6e38ea0d3..12dc27bb2 100644 --- a/apps/openmw/mwclass/book.hpp +++ b/apps/openmw/mwclass/book.hpp @@ -22,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 3826c6c40..88c43d82c 100644 --- a/apps/openmw/mwclass/clothing.cpp +++ b/apps/openmw/mwclass/clothing.cpp @@ -10,8 +10,6 @@ #include "../mwrender/objects.hpp" -#include "containerutil.hpp" - namespace MWClass { void Clothing::insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const @@ -59,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 353f7f606..606aba9e0 100644 --- a/apps/openmw/mwclass/clothing.hpp +++ b/apps/openmw/mwclass/clothing.hpp @@ -22,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 13a6241d4..c58606996 100644 --- a/apps/openmw/mwclass/container.cpp +++ b/apps/openmw/mwclass/container.cpp @@ -6,16 +6,20 @@ #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; + MWWorld::ContainerStore mContainerStore; virtual MWWorld::CustomData *clone() const; }; @@ -71,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 = @@ -79,7 +115,7 @@ namespace MWClass return ref->base->name; } - MWWorld::ContainerStore& Container::getContainerStore (const MWWorld::Ptr& ptr) + MWWorld::ContainerStore& Container::getContainerStore (const MWWorld::Ptr& ptr) const { ensureCustomData (ptr); diff --git a/apps/openmw/mwclass/container.hpp b/apps/openmw/mwclass/container.hpp index 78552ffe9..387714176 100644 --- a/apps/openmw/mwclass/container.hpp +++ b/apps/openmw/mwclass/container.hpp @@ -20,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 12a56e0ee..7270fd22b 100644 --- a/apps/openmw/mwclass/creature.cpp +++ b/apps/openmw/mwclass/creature.cpp @@ -17,7 +17,7 @@ namespace struct CustomData : public MWWorld::CustomData { MWMechanics::CreatureStats mCreatureStats; - MWWorld::ContainerStore mContainerStore; + MWWorld::ContainerStore mContainerStore; virtual MWWorld::CustomData *clone() const; }; @@ -118,7 +118,7 @@ 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 { ensureCustomData (ptr); diff --git a/apps/openmw/mwclass/creature.hpp b/apps/openmw/mwclass/creature.hpp index 9afeffea8..8eb45e838 100644 --- a/apps/openmw/mwclass/creature.hpp +++ b/apps/openmw/mwclass/creature.hpp @@ -39,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 d0b3b11a2..bd7af9597 100644 --- a/apps/openmw/mwclass/door.cpp +++ b/apps/openmw/mwclass/door.cpp @@ -14,6 +14,8 @@ #include "../mwrender/objects.hpp" +#include "../mwsound/soundmanager.hpp" + namespace MWClass { void Door::insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const @@ -61,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) { @@ -77,6 +92,7 @@ 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)); } @@ -91,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/ingredient.cpp b/apps/openmw/mwclass/ingredient.cpp index ac1076cc1..d00e4592d 100644 --- a/apps/openmw/mwclass/ingredient.cpp +++ b/apps/openmw/mwclass/ingredient.cpp @@ -10,8 +10,6 @@ #include "../mwrender/objects.hpp" -#include "containerutil.hpp" - namespace MWClass { void Ingredient::insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const @@ -57,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 6c7409665..92d2c4eef 100644 --- a/apps/openmw/mwclass/ingredient.hpp +++ b/apps/openmw/mwclass/ingredient.hpp @@ -22,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 2c50472ac..f9ec1c956 100644 --- a/apps/openmw/mwclass/light.cpp +++ b/apps/openmw/mwclass/light.cpp @@ -14,8 +14,6 @@ #include "../mwrender/objects.hpp" -#include "containerutil.hpp" - namespace MWClass { void Light::insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const @@ -26,18 +24,18 @@ namespace MWClass assert (ref->base != NULL); const std::string &model = ref->base->model; + MWRender::Objects& objects = renderingInterface.getObjects(); + objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); + if (!model.empty()) - { - MWRender::Objects& objects = renderingInterface.getObjects(); - objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertMesh(ptr, "meshes\\" + model); - const int color = ref->base->data.color; - const float r = ((color >> 0) & 0xFF) / 255.0f; - const float g = ((color >> 8) & 0xFF) / 255.0f; - const float b = ((color >> 16) & 0xFF) / 255.0f; - const float radius = float (ref->base->data.radius); - objects.insertLight (ptr, r, g, b, radius); - } + + const int color = ref->base->data.color; + const float r = ((color >> 0) & 0xFF) / 255.0f; + const float g = ((color >> 8) & 0xFF) / 255.0f; + const float b = ((color >> 16) & 0xFF) / 255.0f; + const float radius = float (ref->base->data.radius); + objects.insertLight (ptr, r, g, b, radius); } void Light::insertObject(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics, MWWorld::Environment& environment) const @@ -45,13 +43,12 @@ namespace MWClass ESMS::LiveCellRef *ref = ptr.get(); - - const std::string &model = ref->base->model; assert (ref->base != NULL); + const std::string &model = ref->base->model; + if(!model.empty()){ physics.insertObjectPhysics(ptr, "meshes\\" + model); } - } void Light::enable (const MWWorld::Ptr& ptr, MWWorld::Environment& environment) const @@ -89,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 7df82ae5d..c9940d0a5 100644 --- a/apps/openmw/mwclass/light.hpp +++ b/apps/openmw/mwclass/light.hpp @@ -27,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 67756f23c..98c05a1b3 100644 --- a/apps/openmw/mwclass/lockpick.cpp +++ b/apps/openmw/mwclass/lockpick.cpp @@ -10,8 +10,6 @@ #include "../mwrender/objects.hpp" -#include "containerutil.hpp" - namespace MWClass { void Lockpick::insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const @@ -60,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 074a07c93..9cbfa0d23 100644 --- a/apps/openmw/mwclass/lockpick.hpp +++ b/apps/openmw/mwclass/lockpick.hpp @@ -22,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 81e018d96..8dde84be9 100644 --- a/apps/openmw/mwclass/misc.cpp +++ b/apps/openmw/mwclass/misc.cpp @@ -10,8 +10,6 @@ #include "../mwrender/objects.hpp" -#include "containerutil.hpp" - namespace MWClass { void Miscellaneous::insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const @@ -59,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 cb1858315..de01a64f4 100644 --- a/apps/openmw/mwclass/misc.hpp +++ b/apps/openmw/mwclass/misc.hpp @@ -22,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 d94920041..cc7daa83e 100644 --- a/apps/openmw/mwclass/npc.cpp +++ b/apps/openmw/mwclass/npc.cpp @@ -29,7 +29,7 @@ namespace MWMechanics::NpcStats mNpcStats; MWMechanics::CreatureStats mCreatureStats; MWMechanics::Movement mMovement; - MWWorld::ContainerStore mContainerStore; + MWWorld::ContainerStore mContainerStore; virtual MWWorld::CustomData *clone() const; }; @@ -156,7 +156,7 @@ 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 { ensureCustomData (ptr); diff --git a/apps/openmw/mwclass/npc.hpp b/apps/openmw/mwclass/npc.hpp index bb9b131c9..bef417332 100644 --- a/apps/openmw/mwclass/npc.hpp +++ b/apps/openmw/mwclass/npc.hpp @@ -35,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 08047a2e8..c57c18fd1 100644 --- a/apps/openmw/mwclass/potion.cpp +++ b/apps/openmw/mwclass/potion.cpp @@ -10,8 +10,6 @@ #include "../mwrender/objects.hpp" -#include "containerutil.hpp" - namespace MWClass { void Potion::insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const @@ -59,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 e1a54db3c..fd78bba53 100644 --- a/apps/openmw/mwclass/potion.hpp +++ b/apps/openmw/mwclass/potion.hpp @@ -22,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 287dd0475..3f2bfed5b 100644 --- a/apps/openmw/mwclass/probe.hpp +++ b/apps/openmw/mwclass/probe.hpp @@ -22,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 79c18d426..f831b6b50 100644 --- a/apps/openmw/mwclass/repair.cpp +++ b/apps/openmw/mwclass/repair.cpp @@ -10,8 +10,6 @@ #include "../mwrender/objects.hpp" -#include "containerutil.hpp" - namespace MWClass { void Repair::insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const @@ -59,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 174197d9a..a5864ab35 100644 --- a/apps/openmw/mwclass/repair.hpp +++ b/apps/openmw/mwclass/repair.hpp @@ -22,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 fbd96182f..48750dd01 100644 --- a/apps/openmw/mwclass/static.cpp +++ b/apps/openmw/mwclass/static.cpp @@ -20,7 +20,7 @@ namespace MWClass if (!model.empty()) { MWRender::Objects& objects = renderingInterface.getObjects(); - objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); + objects.insertBegin(ptr, ptr.getRefData().isEnabled(), true); objects.insertMesh(ptr, "meshes\\" + model); } } @@ -30,13 +30,12 @@ namespace MWClass ESMS::LiveCellRef *ref = ptr.get(); - - const std::string &model = ref->base->model; assert (ref->base != NULL); + const std::string &model = ref->base->model; + if(!model.empty()){ physics.insertObjectPhysics(ptr, "meshes\\" + model); } - } std::string Static::getName (const MWWorld::Ptr& ptr) const diff --git a/apps/openmw/mwclass/weapon.cpp b/apps/openmw/mwclass/weapon.cpp index f136aaccd..90fd3e33b 100644 --- a/apps/openmw/mwclass/weapon.cpp +++ b/apps/openmw/mwclass/weapon.cpp @@ -10,8 +10,6 @@ #include "../mwrender/objects.hpp" -#include "containerutil.hpp" - namespace MWClass { void Weapon::insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const @@ -72,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 84c633ab3..b056249b9 100644 --- a/apps/openmw/mwclass/weapon.hpp +++ b/apps/openmw/mwclass/weapon.hpp @@ -28,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/journalwindow.cpp b/apps/openmw/mwgui/journalwindow.cpp index 457a07582..3f3c89f39 100644 --- a/apps/openmw/mwgui/journalwindow.cpp +++ b/apps/openmw/mwgui/journalwindow.cpp @@ -32,8 +32,8 @@ book formatText(std::string text,book mBook,int maxLine, int lineSize) mBook.pages.pop_back(); } - std::string::iterator wordBegin = text.begin(); - std::string::iterator wordEnd; + //std::string::iterator wordBegin = text.begin(); + //std::string::iterator wordEnd; std::string cText = text; diff --git a/apps/openmw/mwinput/inputmanager.cpp b/apps/openmw/mwinput/inputmanager.cpp index e0c819a71..88534ddda 100644 --- a/apps/openmw/mwinput/inputmanager.cpp +++ b/apps/openmw/mwinput/inputmanager.cpp @@ -83,27 +83,14 @@ namespace MWInput MWGui::WindowManager &windows; OMW::Engine& mEngine; - // Count screenshots. - int shotCount; - /* InputImpl Methods */ - // Write screenshot to file. void screenshot() { - - // Find the first unused filename with a do-while - char buf[50]; - do - { - snprintf(buf, 50, "screenshot%03d.png", shotCount++); - } while (boost::filesystem::exists(buf)); - - ogre.screenshot(buf); + mEngine.screenshot(); } - /* toggleInventory() is called when the user presses the button to toggle the inventory screen. */ void toggleInventory() { @@ -183,8 +170,7 @@ namespace MWInput poller(input), player(_player), windows(_windows), - mEngine (engine), - shotCount(0) + mEngine (engine) { using namespace OEngine::Input; using namespace OEngine::Render; diff --git a/apps/openmw/mwrender/actors.cpp b/apps/openmw/mwrender/actors.cpp index acc655404..d8ca78e3a 100644 --- a/apps/openmw/mwrender/actors.cpp +++ b/apps/openmw/mwrender/actors.cpp @@ -99,14 +99,15 @@ void Actors::removeCell(MWWorld::Ptr::CellStore* store){ mRend.getScene()->destroySceneNode(base); base = 0; } - for(std::map::iterator iter = mAllActors.begin(); iter != mAllActors.end(); iter++) - { - if(iter->first.getCell() == store){ - delete iter->second; - mAllActors.erase(iter); - } - } - + for(std::map::iterator iter = mAllActors.begin(); iter != mAllActors.end(); ) + { + if(iter->first.getCell() == store){ + delete iter->second; + mAllActors.erase(iter++); + } + else + ++iter; + } } void Actors::playAnimationGroup (const MWWorld::Ptr& ptr, const std::string& groupName, int mode, int number){ diff --git a/apps/openmw/mwrender/animation.cpp b/apps/openmw/mwrender/animation.cpp index 5a9731d2d..63855f3b8 100644 --- a/apps/openmw/mwrender/animation.cpp +++ b/apps/openmw/mwrender/animation.cpp @@ -101,7 +101,6 @@ namespace MWRender{ } void Animation::handleShapes(std::vector* allshapes, Ogre::Entity* creaturemodel, Ogre::SkeletonInstance *skel){ - bool useHandles = skel == creaturemodel->getSkeleton(); shapeNumber = 0; std::vector::iterator allshapesiter; @@ -112,6 +111,9 @@ namespace MWRender{ Nif::NiTriShapeCopy& copy = *allshapesiter; std::vector* allvertices = ©.vertices; + std::vector* allnormals = ©.normals; + + //std::set vertices; //std::set normals; @@ -121,8 +123,7 @@ namespace MWRender{ //std::cout << "Name " << copy.sname << "\n"; Ogre::HardwareVertexBufferSharedPtr vbuf = creaturemodel->getMesh()->getSubMesh(copy.sname)->vertexData->vertexBufferBinding->getBuffer(0); Ogre::Real* pReal = static_cast(vbuf->lock(Ogre::HardwareBuffer::HBL_NORMAL)); - //Ogre::HardwareVertexBufferSharedPtr vbufNormal = creaturemodel->getMesh()->getSubMesh(copy.sname)->vertexData->vertexBufferBinding->getBuffer(1); - // Ogre::Real* pRealNormal = static_cast(vbufNormal->lock(Ogre::HardwareBuffer::HBL_NORMAL)); + std::vector initialVertices = copy.morph.getInitialVertices(); //Each shape has multiple indices @@ -181,146 +182,76 @@ namespace MWRender{ std::vector inds = iter->second; int verIndex = iter->first; Ogre::Vector3 currentVertex = (*allvertices)[verIndex]; + Ogre::Vector3 currentNormal = (*allnormals)[verIndex]; Nif::NiSkinData::BoneInfoCopy* boneinfocopy = &(allshapesiter->boneinfo[inds[0].boneinfocopyindex]); Ogre::Bone *bonePtr = 0; - if(useHandles) - { - bonePtr = skel->getBone(boneinfocopy->bonehandle); - } - else - bonePtr = skel->getBone(boneinfocopy->bonename); - Ogre::Vector3 vecPos = bonePtr->_getDerivedPosition() + bonePtr->_getDerivedOrientation() * boneinfocopy->trafo.trans; - Ogre::Quaternion vecRot = bonePtr->_getDerivedOrientation() * boneinfocopy->trafo.rotation; - /*if(vecPosRot.find(boneinfocopy->bonehandle) == vecPosRot.end()){ + Ogre::Vector3 vecPos; + Ogre::Quaternion vecRot; + std::map::iterator result = vecRotPos.find(boneinfocopy); + + if(result == vecRotPos.end()){ + bonePtr = skel->getBone(boneinfocopy->bonename); + vecPos = bonePtr->_getDerivedPosition() + bonePtr->_getDerivedOrientation() * boneinfocopy->trafo.trans; vecRot = bonePtr->_getDerivedOrientation() * boneinfocopy->trafo.rotation; - if(useHandles){ + PosAndRot both; both.vecPos = vecPos; both.vecRot = vecRot; - vecPosRot[boneinfocopy->bonehandle] = both; - } + vecRotPos[boneinfocopy] = both; + } else{ - PosAndRot both = vecPosRot[boneinfocopy->bonehandle]; + PosAndRot both = result->second; vecPos = both.vecPos; vecRot = both.vecRot; - }*/ + } Ogre::Vector3 absVertPos = (vecPos + vecRot * currentVertex) * inds[0].weight; + for(std::size_t i = 1; i < inds.size(); i++){ boneinfocopy = &(allshapesiter->boneinfo[inds[i].boneinfocopyindex]); - if(useHandles) - bonePtr = skel->getBone(boneinfocopy->bonehandle); - else - bonePtr = skel->getBone(boneinfocopy->bonename); - vecPos = bonePtr->_getDerivedPosition() + bonePtr->_getDerivedOrientation() * boneinfocopy->trafo.trans; - vecRot = bonePtr->_getDerivedOrientation() * boneinfocopy->trafo.rotation; + result = vecRotPos.find(boneinfocopy); - /*if(vecPosRot.find(boneinfocopy->bonehandle) == vecPosRot.end()){ + + if(result == vecRotPos.end()){ + bonePtr = skel->getBone(boneinfocopy->bonename); vecPos = bonePtr->_getDerivedPosition() + bonePtr->_getDerivedOrientation() * boneinfocopy->trafo.trans; vecRot = bonePtr->_getDerivedOrientation() * boneinfocopy->trafo.rotation; - if(useHandles){ PosAndRot both; both.vecPos = vecPos; both.vecRot = vecRot; - vecPosRot[boneinfocopy->bonehandle] = both; - } + vecRotPos[boneinfocopy] = both; + } else{ - PosAndRot both = vecPosRot[boneinfocopy->bonehandle]; + PosAndRot both = result->second; vecPos = both.vecPos; vecRot = both.vecRot; - }*/ + } absVertPos += (vecPos + vecRot * currentVertex) * inds[i].weight; + } Ogre::Real* addr = (pReal + 3 * verIndex); *addr = absVertPos.x; *(addr+1) = absVertPos.y; *(addr+2) = absVertPos.z; + } -#if 0 - for (unsigned int i = 0; i < boneinfovector.size(); i++) - { - Nif::NiSkinData::BoneInfoCopy boneinfo = boneinfovector[i]; - if(skel->hasBone(boneinfo.bonename)){ - Ogre::Bone *bonePtr = skel->getBone(boneinfo.bonename); - Ogre::Vector3 vecPos = bonePtr->_getDerivedPosition() + bonePtr->_getDerivedOrientation() * boneinfo.trafo.trans; - Ogre::Quaternion vecRot = bonePtr->_getDerivedOrientation() * boneinfo.trafo.rotation; - - for (unsigned int j=0; j < boneinfo.weights.size(); j++) - { - unsigned int verIndex = boneinfo.weights[j].vertex; - if(vertices.find(verIndex) == vertices.end()) - { - Ogre::Vector3 absVertPos = vecPos + vecRot * allvertices[verIndex]; - absVertPos = absVertPos * boneinfo.weights[j].weight; - vertices.insert(verIndex); - Ogre::Real* addr = (pReal + 3 * verIndex); - *addr = absVertPos.x; - *(addr+1) = absVertPos.y; - *(addr+2) = absVertPos.z; - } - else - { - Ogre::Vector3 absVertPos = vecPos + vecRot * allvertices[verIndex]; - absVertPos = absVertPos * boneinfo.weights[j].weight; - Ogre::Vector3 old = Ogre::Vector3(pReal + 3 * verIndex); - absVertPos = absVertPos + old; - Ogre::Real* addr = (pReal + 3 * verIndex); - *addr = absVertPos.x; - *(addr+1) = absVertPos.y; - *(addr+2) = absVertPos.z; - - //std::cout << "Vertex" << verIndex << "Weight: " << boneinfo.weights[i].weight << "was seen twice\n"; - - } - - if(normals.find(verIndex) == normals.end()) - { - Ogre::Vector3 absNormalsPos = vecRot * allnormals[verIndex]; - absNormalsPos = absNormalsPos * boneinfo.weights[j].weight; - normals.insert(verIndex); - Ogre::Real* addr = (pRealNormal + 3 * verIndex); - *addr = absNormalsPos.x; - *(addr+1) = absNormalsPos.y; - *(addr+2) = absNormalsPos.z; - } - else - { - Ogre::Vector3 absNormalsPos = vecRot * allnormals[verIndex]; - absNormalsPos = absNormalsPos * boneinfo.weights[j].weight; - Ogre::Vector3 old = Ogre::Vector3(pRealNormal + 3 * verIndex); - absNormalsPos = absNormalsPos + old; - - Ogre::Real* addr = (pRealNormal + 3 * verIndex); - *addr = absNormalsPos.x; - *(addr+1) = absNormalsPos.y; - *(addr+2) = absNormalsPos.z; - - } -#endif - //} - //} - - - //} //Comment out - - ; } else { @@ -329,11 +260,13 @@ namespace MWRender{ Ogre::Vector3 shapetrans = copy.trafo.trans; float shapescale = copy.trafo.scale; std::vector boneSequence = copy.boneSequence; - std::vector::iterator boneSequenceIter = boneSequence.begin(); + Ogre::Vector3 transmult; Ogre::Quaternion rotmult; float scale; - if(skel->hasBone(*boneSequenceIter)){ + if(boneSequence.size() > 0){ + std::vector::iterator boneSequenceIter = boneSequence.begin(); + if(skel->hasBone(*boneSequenceIter)){ Ogre::Bone *bonePtr = skel->getBone(*boneSequenceIter); @@ -360,6 +293,7 @@ namespace MWRender{ //std::cout << "Position: " << transmult << "Rotation: " << rotmult << "\n"; } + } else { transmult = shapetrans; @@ -392,7 +326,7 @@ namespace MWRender{ } vbuf->unlock(); - //vbufNormal->unlock(); + } } @@ -465,22 +399,18 @@ namespace MWRender{ base->getAllAnimationStates()->_notifyDirty(); //base->_updateAnimation(); - base->_notifyMoved(); + //base->_notifyMoved(); - for(unsigned int i = 0; i < entityparts.size(); i++){ - Ogre::SkeletonInstance* skel = entityparts[i]->getSkeleton(); + for(unsigned int i = 0; i < entityparts.size(); i++){ + //Ogre::SkeletonInstance* skel = entityparts[i]->getSkeleton(); Ogre::Bone* b = skel->getRootBone(); b->setOrientation(Ogre::Real(.3),Ogre::Real(.3),Ogre::Real(.3), Ogre::Real(.3));//This is a trick - skel->_updateTransforms(); - // skel->_notifyManualBonesDirty(); - entityparts[i]->getAllAnimationStates()->_notifyDirty(); - //entityparts[i]->_updateAnimation(); - entityparts[i]->_notifyMoved(); } + std::vector::iterator iter; int slot = 0; if(transformations){ @@ -488,9 +418,7 @@ namespace MWRender{ if(time < iter->getStartTime() || time < startTime || time > iter->getStopTime()) { slot++; - //iter++; continue; - } float x; @@ -511,7 +439,6 @@ namespace MWRender{ timeIndex(time, ttime, tindexI[slot], tindexJ, x); - //std::cout << "X: " << x << " X2: " << x2 << "\n"; Ogre::Vector3 t; Ogre::Quaternion r; @@ -526,7 +453,6 @@ namespace MWRender{ bool bQuats = quats.size() > 0; if(bQuats){ r = Ogre::Quaternion::Slerp(x2, quats[rindexI[slot]], quats[rindexJ], true); - //bone->setOrientation(r); } skel = base->getSkeleton(); if(skel->hasBone(iter->getBonename())){ @@ -539,27 +465,10 @@ namespace MWRender{ skel->_updateTransforms(); - //skel->_notifyManualBonesDirty(); base->getAllAnimationStates()->_notifyDirty(); - //base->_updateAnimation(); - base->_notifyMoved(); + } - for(std::size_t i = 0; i < entityparts.size(); i++){ - skel = entityparts[i]->getSkeleton(); - if(skel->hasBone(iter->getBonename())){ - Ogre::Bone* bone = skel->getBone(iter->getBonename()); - if(bTrans) - bone->setPosition(t); - if(bQuats) - bone->setOrientation(r); - - skel->_updateTransforms(); - //skel->_notifyManualBonesDirty(); - entityparts[i]->getAllAnimationStates()->_notifyDirty(); - // entityparts[i]->_updateAnimation(); - entityparts[i]->_notifyMoved(); - } - } + slot++; } } diff --git a/apps/openmw/mwrender/animation.hpp b/apps/openmw/mwrender/animation.hpp index 15c25707c..bad7eca15 100644 --- a/apps/openmw/mwrender/animation.hpp +++ b/apps/openmw/mwrender/animation.hpp @@ -26,6 +26,7 @@ class Animation{ Ogre::SceneNode* insert; OEngine::Render::OgreRenderer &mRend; MWWorld::Environment& mEnvironment; + std::map vecRotPos; static std::map mUniqueIDs; diff --git a/apps/openmw/mwrender/creatureanimation.cpp b/apps/openmw/mwrender/creatureanimation.cpp index 3cb40f2f1..4de6453aa 100644 --- a/apps/openmw/mwrender/creatureanimation.cpp +++ b/apps/openmw/mwrender/creatureanimation.cpp @@ -38,6 +38,7 @@ CreatureAnimation::CreatureAnimation(const MWWorld::Ptr& ptr, MWWorld::Environme } void CreatureAnimation::runAnimation(float timepassed){ + vecRotPos.clear(); if(animate > 0){ //Add the amount of time passed to time diff --git a/apps/openmw/mwrender/npcanimation.cpp b/apps/openmw/mwrender/npcanimation.cpp index 863f7577b..4c9c0e466 100644 --- a/apps/openmw/mwrender/npcanimation.cpp +++ b/apps/openmw/mwrender/npcanimation.cpp @@ -43,6 +43,7 @@ NpcAnimation::NpcAnimation(const MWWorld::Ptr& ptr, MWWorld::Environment& _env,O char secondtolast = bodyRaceID.at(bodyRaceID.length() - 2); bool female = tolower(secondtolast) == 'f'; bool beast = bodyRaceID == "b_n_khajiit_m_" || bodyRaceID == "b_n_khajiit_f_" || bodyRaceID == "b_n_argonian_m_" || bodyRaceID == "b_n_argonian_f_"; + /*std::cout << "Race: " << ref->base->race ; if(female){ std::cout << " Sex: Female" << " Height: " << race->data.height.female << "\n"; @@ -67,6 +68,7 @@ NpcAnimation::NpcAnimation(const MWWorld::Ptr& ptr, MWWorld::Environment& _env,O //stay in the same place when we skipanim, or open a gui window + if((transformations = (NIFLoader::getSingletonPtr())->getAnim(smodel))){ for(unsigned int init = 0; init < transformations->size(); init++){ @@ -177,7 +179,6 @@ NpcAnimation::NpcAnimation(const MWWorld::Ptr& ptr, MWWorld::Environment& _env,O if(clavicler) insertBoundedPart("meshes\\" + clavicler->model , "Right Clavicle", base);*/ - if(neck) { insertBoundedPart("meshes\\" + neck->model, "Neck"); @@ -213,6 +214,7 @@ NpcAnimation::NpcAnimation(const MWWorld::Ptr& ptr, MWWorld::Environment& _env,O } Ogre::Entity* NpcAnimation::insertBoundedPart(const std::string &mesh, std::string bonename){ + NIFLoader::load(mesh); Entity* ent = mRend.getScene()->createEntity(mesh); @@ -225,15 +227,7 @@ void NpcAnimation::insertFreePart(const std::string &mesh, const std::string suf Ogre::Entity* ent = mRend.getScene()->createEntity(meshNumbered); - /*MaterialPtr material = ent->getSubEntity(0)->getMaterial(); - material->removeAllTechniques(); - - Ogre::Technique* tech = material->createTechnique(); - - Pass* pass2 = tech->createPass(); - pass2->setVertexProgram("Ogre/HardwareSkinningTwoWeights"); - pass2->setColourWriteEnabled(false); - //tech->setSchemeName("blahblah");*/ + insert->attachObject(ent); @@ -249,6 +243,7 @@ void NpcAnimation::insertFreePart(const std::string &mesh, const std::string suf void NpcAnimation::runAnimation(float timepassed){ + //1. Add the amount of time passed to time //2. Handle the animation transforms dependent on time @@ -267,22 +262,17 @@ void NpcAnimation::runAnimation(float timepassed){ } handleAnimationTransforms(); - Ogre::Vector3 current = insert->_getWorldAABB().getCenter(); std::vector*>::iterator shapepartsiter = shapeparts.begin(); std::vector::iterator entitypartsiter = entityparts.begin(); while(shapepartsiter != shapeparts.end()) { + vecRotPos.clear(); std::vector* shapes = *shapepartsiter; Ogre::Entity* theentity = *entitypartsiter; - /* - Pass* pass = theentity->getSubEntity(0)->getMaterial()->getBestTechnique()->getPass(0); - if (pass->hasVertexProgram() && pass->getVertexProgram()->isSkeletalAnimationIncluded()) - std::cout << "It's hardware\n"; - else - std::cout << "It's software\n";*/ - - handleShapes(shapes, theentity, theentity->getSkeleton()); + + + handleShapes(shapes, theentity, base->getSkeleton()); shapepartsiter++; entitypartsiter++; } diff --git a/apps/openmw/mwrender/objects.cpp b/apps/openmw/mwrender/objects.cpp index 1e3b4dda0..717064ada 100644 --- a/apps/openmw/mwrender/objects.cpp +++ b/apps/openmw/mwrender/objects.cpp @@ -1,11 +1,11 @@ #include "objects.hpp" + #include + #include -using namespace Ogre; using namespace MWRender; - bool Objects::lightConst = false; float Objects::lightConstValue = 0.0f; @@ -23,10 +23,24 @@ bool Objects::lightOutQuadInLin = false; int Objects::uniqueID = 0; -void Objects::setMwRoot(Ogre::SceneNode* root){ +void Objects::clearSceneNode (Ogre::SceneNode *node) +{ + /// \todo This should probably be moved into OpenEngine at some point. + for (int i=node->numAttachedObjects()-1; i>=0; --i) + { + Ogre::MovableObject *object = node->getAttachedObject (i); + node->detachObject (object); + mRenderer.getScene()->destroyMovableObject (object); + } +} + +void Objects::setMwRoot(Ogre::SceneNode* root) +{ mMwRoot = root; } -void Objects::insertBegin (const MWWorld::Ptr& ptr, bool enabled, bool static_){ + +void Objects::insertBegin (const MWWorld::Ptr& ptr, bool enabled, bool static_) +{ Ogre::SceneNode* root = mMwRoot; Ogre::SceneNode* cellnode; if(mCellSceneNodes.find(ptr.getCell()) == mCellSceneNodes.end()) @@ -49,90 +63,98 @@ void Objects::insertBegin (const MWWorld::Ptr& ptr, bool enabled, bool static_){ f = ptr.getCellRef().pos.rot; // Rotate around X axis - Quaternion xr(Radian(-f[0]), Vector3::UNIT_X); + Ogre::Quaternion xr(Ogre::Radian(-f[0]), Ogre::Vector3::UNIT_X); // Rotate around Y axis - Quaternion yr(Radian(-f[1]), Vector3::UNIT_Y); + Ogre::Quaternion yr(Ogre::Radian(-f[1]), Ogre::Vector3::UNIT_Y); // Rotate around Z axis - Quaternion zr(Radian(-f[2]), Vector3::UNIT_Z); + Ogre::Quaternion zr(Ogre::Radian(-f[2]), Ogre::Vector3::UNIT_Z); - // Rotates first around z, then y, then x + // Rotates first around z, then y, then x insert->setOrientation(xr*yr*zr); + if (!enabled) insert->setVisible (false); ptr.getRefData().setBaseNode(insert); - isStatic = static_; - - + mIsStatic = static_; } -void Objects::insertMesh (const MWWorld::Ptr& ptr, const std::string& mesh){ + +void Objects::insertMesh (const MWWorld::Ptr& ptr, const std::string& mesh) +{ Ogre::SceneNode* insert = ptr.getRefData().getBaseNode(); assert(insert); NifOgre::NIFLoader::load(mesh); - Entity *ent = mRend.getScene()->createEntity(mesh); + Ogre::Entity *ent = mRenderer.getScene()->createEntity(mesh); - if(!isStatic) + if(!mIsStatic) { insert->attachObject(ent); } else { Ogre::StaticGeometry* sg = 0; - if(mSG.find(ptr.getCell()) == mSG.end()) + if(mStaticGeometry.find(ptr.getCell()) == mStaticGeometry.end()) { uniqueID = uniqueID +1; - sg = mRend.getScene()->createStaticGeometry( "sg" + Ogre::StringConverter::toString(uniqueID)); + sg = mRenderer.getScene()->createStaticGeometry( "sg" + Ogre::StringConverter::toString(uniqueID)); //Create the scenenode and put it in the map - mSG[ptr.getCell()] = sg; + mStaticGeometry[ptr.getCell()] = sg; + + // This specifies the size of a single batch region. + // If it is set too high: + // - there will be problems choosing the correct lights + // - the culling will be more inefficient + // If it is set too low: + // - there will be too many batches. + sg->setRegionDimensions(Ogre::Vector3(2500,2500,2500)); } else { - sg = mSG[ptr.getCell()]; + sg = mStaticGeometry[ptr.getCell()]; } sg->addEntity(ent,insert->_getDerivedPosition(),insert->_getDerivedOrientation(),insert->_getDerivedScale()); - sg->setRegionDimensions(Ogre::Vector3(100000,10000,100000)); - - mRend.getScene()->destroyEntity(ent); + mRenderer.getScene()->destroyEntity(ent); } - - } -void Objects::insertLight (const MWWorld::Ptr& ptr, float r, float g, float b, float radius){ - Ogre::SceneNode* insert = mRend.getScene()->getSceneNode(ptr.getRefData().getHandle()); + +void Objects::insertLight (const MWWorld::Ptr& ptr, float r, float g, float b, float radius) +{ + Ogre::SceneNode* insert = mRenderer.getScene()->getSceneNode(ptr.getRefData().getHandle()); assert(insert); - Ogre::Light *light = mRend.getScene()->createLight(); + Ogre::Light *light = mRenderer.getScene()->createLight(); light->setDiffuseColour (r, g, b); float cval=0.0f, lval=0.0f, qval=0.0f; if(lightConst) cval = lightConstValue; - if(!lightOutQuadInLin) - { - if(lightLinear) - radius *= lightLinearRadiusMult; - if(lightQuadratic) - radius *= lightQuadraticRadiusMult; - - if(lightLinear) - lval = lightLinearValue / pow(radius, lightLinearMethod); - if(lightQuadratic) - qval = lightQuadraticValue / pow(radius, lightQuadraticMethod); - } - else - { - // FIXME: - // Do quadratic or linear, depending if we're in an exterior or interior - // cell, respectively. Ignore lightLinear and lightQuadratic. - } - - light->setAttenuation(10*radius, cval, lval, qval); - - insert->attachObject(light); + + if(!lightOutQuadInLin) + { + if(lightLinear) + radius *= lightLinearRadiusMult; + if(lightQuadratic) + radius *= lightQuadraticRadiusMult; + + if(lightLinear) + lval = lightLinearValue / pow(radius, lightLinearMethod); + if(lightQuadratic) + qval = lightQuadraticValue / pow(radius, lightQuadraticMethod); + } + else + { + // FIXME: + // Do quadratic or linear, depending if we're in an exterior or interior + // cell, respectively. Ignore lightLinear and lightQuadratic. + } + + light->setAttenuation(10*radius, cval, lval, qval); + + insert->attachObject(light); } bool Objects::deleteObject (const MWWorld::Ptr& ptr) @@ -145,8 +167,9 @@ bool Objects::deleteObject (const MWWorld::Ptr& ptr) mCellSceneNodes.begin()); iter!=mCellSceneNodes.end(); ++iter) if (iter->second==parent) { + clearSceneNode (base); base->removeAndDestroyAllChildren(); - mRend.getScene()->destroySceneNode (base); + mRenderer.getScene()->destroySceneNode (base); ptr.getRefData().setBaseNode (0); return true; } @@ -157,29 +180,35 @@ bool Objects::deleteObject (const MWWorld::Ptr& ptr) return true; } -void Objects::removeCell(MWWorld::Ptr::CellStore* store){ +void Objects::removeCell(MWWorld::Ptr::CellStore* store) +{ if(mCellSceneNodes.find(store) != mCellSceneNodes.end()) { Ogre::SceneNode* base = mCellSceneNodes[store]; + + for (int i=0; inumChildren(); ++i) + clearSceneNode (static_cast (base->getChild (i))); + base->removeAndDestroyAllChildren(); mCellSceneNodes.erase(store); - mRend.getScene()->destroySceneNode(base); + mRenderer.getScene()->destroySceneNode(base); base = 0; } - - if(mSG.find(store) != mSG.end()) + if(mStaticGeometry.find(store) != mStaticGeometry.end()) { - Ogre::StaticGeometry* sg = mSG[store]; - mSG.erase(store); - mRend.getScene()->destroyStaticGeometry (sg); + Ogre::StaticGeometry* sg = mStaticGeometry[store]; + mStaticGeometry.erase(store); + mRenderer.getScene()->destroyStaticGeometry (sg); sg = 0; } } -void Objects::buildStaticGeometry(ESMS::CellStore& cell){ - if(mSG.find(&cell) != mSG.end()) + +void Objects::buildStaticGeometry(ESMS::CellStore& cell) +{ + if(mStaticGeometry.find(&cell) != mStaticGeometry.end()) { - Ogre::StaticGeometry* sg = mSG[&cell]; + Ogre::StaticGeometry* sg = mStaticGeometry[&cell]; sg->build(); } } diff --git a/apps/openmw/mwrender/objects.hpp b/apps/openmw/mwrender/objects.hpp index 6cd465fdd..d58455b9f 100644 --- a/apps/openmw/mwrender/objects.hpp +++ b/apps/openmw/mwrender/objects.hpp @@ -1,20 +1,21 @@ #ifndef _GAME_RENDER_OBJECTS_H #define _GAME_RENDER_OBJECTS_H -#include "components/esm_store/cell_store.hpp" +#include + +#include #include "../mwworld/refdata.hpp" #include "../mwworld/ptr.hpp" -#include namespace MWRender{ class Objects{ - OEngine::Render::OgreRenderer &mRend; + OEngine::Render::OgreRenderer &mRenderer; std::map mCellSceneNodes; - std::map mSG; + std::map mStaticGeometry; Ogre::SceneNode* mMwRoot; - bool isStatic; + bool mIsStatic; static int uniqueID; static bool lightConst; static float lightConstValue; @@ -30,8 +31,12 @@ class Objects{ static float lightQuadraticRadiusMult; static bool lightOutQuadInLin; + + void clearSceneNode (Ogre::SceneNode *node); + ///< Remove all movable objects from \a node. + public: - Objects(OEngine::Render::OgreRenderer& _rend): mRend(_rend){} + Objects(OEngine::Render::OgreRenderer& renderer): mRenderer (renderer){} ~Objects(){} void insertBegin (const MWWorld::Ptr& ptr, bool enabled, bool static_); void insertMesh (const MWWorld::Ptr& ptr, const std::string& mesh); diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index 2a75c2445..7b58a80d7 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -20,10 +20,9 @@ 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 = MWRender::SkyManager::create(mRendering.getWindow(), mRendering.getCamera(), resDir); // Set default mipmap level (NB some APIs ignore this) TextureManager::getSingleton().setDefaultNumMipmaps(5); @@ -41,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()); @@ -50,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; @@ -62,6 +64,10 @@ RenderingManager::~RenderingManager () delete mSkyManager; } +MWRender::SkyManager* RenderingManager::getSkyManager() +{ + return mSkyManager; +} MWRender::Objects& RenderingManager::getObjects(){ return mObjects; @@ -74,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); @@ -122,31 +133,40 @@ 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 () { + if(mSkyManager) mSkyManager->enable(); } void RenderingManager::skyDisable () { - mSkyManager->disable(); + if(mSkyManager) + mSkyManager->disable(); } void RenderingManager::skySetHour (double hour) { - mSkyManager->setHour(hour); + if(mSkyManager) + mSkyManager->setHour(hour); } void RenderingManager::skySetDate (int day, int month) { - mSkyManager->setDate(day, month); + if(mSkyManager) + mSkyManager->setDate(day, month); } int RenderingManager::skyGetMasserPhase() const { + return mSkyManager->getMasserPhase(); } @@ -155,12 +175,28 @@ int RenderingManager::skyGetSecundaPhase() const return mSkyManager->getSecundaPhase(); } -void RenderingManager::skySetMoonColour (bool red) -{ - mSkyManager->setMoonColour(red); +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) @@ -168,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) @@ -244,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 1f033c8db..5fd3fe773 100644 --- a/apps/openmw/mwscript/docs/vmformat.txt +++ b/apps/openmw/mwscript/docs/vmformat.txt @@ -116,4 +116,10 @@ op 0x2000137: GetButtonPressed op 0x2000138: SkipAnim op 0x2000139: SkipAnim, expplicit reference op 0x200013a: AddTopic -opcodes 0x200013b-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/mwsound/soundmanager.cpp b/apps/openmw/mwsound/soundmanager.cpp index 7390e4c5c..76ef23bc2 100644 --- a/apps/openmw/mwsound/soundmanager.cpp +++ b/apps/openmw/mwsound/soundmanager.cpp @@ -4,8 +4,6 @@ #include #include -using namespace std; - #include #include @@ -15,6 +13,7 @@ using namespace std; #include #include + #include "../mwworld/environment.hpp" #include "../mwworld/world.hpp" #include "../mwworld/player.hpp" @@ -90,24 +89,28 @@ namespace MWSound // relative to the sound dir, and translates them into full paths // of existing files in the filesystem, if they exist. bool FSstrict; - FileFinder::FileFinder files; - FileFinder::FileFinderStrict strict; - FileFinder::FileFinder musicpath; - FileFinder::FileFinderStrict musicpathStrict; - - SoundImpl(Ogre::Root *root, Ogre::Camera *camera, - const ESMS::ESMStore &str, - const std::string &soundDir, const std::string &musicDir, bool fsstrict) + FileFinder::LessTreeFileFinder files; + FileFinder::StrictTreeFileFinder strict; + FileFinder::LessTreeFileFinder musicpath; + FileFinder::StrictTreeFileFinder musicpathStrict; + + SoundImpl(Ogre::Root *root, Ogre::Camera *camera, const ESMS::ESMStore &str, + const Files::PathContainer& soundDir, + const Files::PathContainer& musicDir, + bool fsstrict) : mgr(new OEManager(SoundFactoryPtr(new SOUND_FACTORY))) , updater(mgr) , cameraTracker(mgr) , store(str) - , files(soundDir), strict(soundDir) - ,musicpath(musicDir), musicpathStrict(musicDir) + , FSstrict(fsstrict) + , files(soundDir) + , strict(soundDir) + , musicpath(musicDir) + , musicpathStrict(musicDir) { - FSstrict = fsstrict; - cout << "Sound output: " << SOUND_OUT << endl; - cout << "Sound decoder: " << SOUND_IN << endl; + + std::cout << "Sound output: " << SOUND_OUT << std::endl; + std::cout << "Sound decoder: " << SOUND_IN << std::endl; // Attach the camera to the camera tracker cameraTracker.followCamera(camera); @@ -136,36 +139,49 @@ namespace MWSound bool hasFile(const std::string &str, bool music = false) { - if(FSstrict == false) + bool found = false; + if(!FSstrict) { if(music) { - if(musicpath.has(str)) return true; - + found = musicpath.has(str); // Not found? Try with .mp3 - return musicpath.has(toMp3(str)); + if (!found) + { + found = musicpath.has(toMp3(str)); + } } else { - if(files.has(str)) return true; - return files.has(toMp3(str)); + found = files.has(str); + if (!found) + { + found = files.has(toMp3(str)); + } } } else { if(music) { - if(musicpathStrict.has(str)) return true; - + found = musicpathStrict.has(str); // Not found? Try with .mp3 - return musicpathStrict.has(toMp3(str)); + if (!found) + { + found = musicpathStrict.has(toMp3(str)); + } } else { - if(strict.has(str)) return true; - return strict.has(toMp3(str)); + found = strict.has(str); + if (!found) + { + found = strict.has(toMp3(str)); + } } } + + return found; } // Convert a Morrowind sound path (eg. Fx\funny.wav) to full path @@ -258,13 +274,13 @@ namespace MWSound } catch(...) { - cout << "Error loading " << file << ", skipping.\n"; + std::cout << "Error loading " << file << ", skipping.\n"; } } // Clears all the sub-elements of a given iterator, and then // removes it from 'sounds'. - void clearAll(PtrMap::iterator it) + void clearAll(PtrMap::iterator& it) { IDMap::iterator sit = it->second.begin(); @@ -362,9 +378,9 @@ namespace MWSound } } } - }; + }; /* SoundImpl */ - void SoundManager::streamMusicFull (const std::string& filename) + void SoundManager::streamMusicFull(const std::string& filename) { if(!mData) return; @@ -381,20 +397,24 @@ namespace MWSound } SoundManager::SoundManager(Ogre::Root *root, Ogre::Camera *camera, - const ESMS::ESMStore &store, - boost::filesystem::path dataDir, - bool useSound, bool fsstrict, MWWorld::Environment& environment) - : mData(NULL), fsStrict (fsstrict), mEnvironment (environment) + const ESMS::ESMStore &store, const Files::PathContainer& dataDirs, + bool useSound, bool fsstrict, MWWorld::Environment& environment) + : mData(NULL) + , fsStrict(fsstrict) + , mEnvironment(environment) { - MP3Lookup(dataDir / "Music/Explore/"); - if(useSound) - mData = new SoundImpl(root, camera, store, (dataDir / "Sound").string(), (dataDir / "Music").string(), fsstrict); + for (Files::PathContainer::const_iterator it = dataDirs.begin(); it != dataDirs.end(); ++it) + { + MP3Lookup((*it) / "Music/Explore/"); + } + if(useSound) + { + mData = new SoundImpl(root, camera, store, dataDirs /* Sound */, dataDirs /* Music */, fsstrict); + } test.name = ""; total = 0; - - } SoundManager::~SoundManager() @@ -407,14 +427,12 @@ namespace MWSound { if(mData->hasFile(filename, true)) { - std::string fullpath = mData->convertPath(filename, true); - streamMusicFull(fullpath); + streamMusicFull(mData->convertPath(filename, true)); } } - - void SoundManager::MP3Lookup(boost::filesystem::path dir) -{ + void SoundManager::MP3Lookup(const boost::filesystem::path& dir) + { boost::filesystem::directory_iterator dir_iter(dir), dir_end; std::string mp3extension = ".mp3"; @@ -425,35 +443,30 @@ namespace MWSound files.push_back(*dir_iter); } } -} + } void SoundManager::startRandomTitle() -{ - std::vector::iterator fileIter; - - if(files.size() > 0) + { + if(!files.empty()) { - fileIter = files.begin(); - srand ( time(NULL) ); + Files::PathContainer::iterator fileIter = files.begin(); + srand( time(NULL) ); int r = rand() % files.size() + 1; //old random code - for(int i = 1; i < r; i++) - { - fileIter++; - } + std::advance(fileIter, r - 1); std::string music = fileIter->string(); + std::cout << "Playing " << music << "\n"; + try { - std::cout << "Playing " << music << "\n"; streamMusicFull(music); } - catch(std::exception &e) + catch (std::exception &e) { std::cout << " Music Error: " << e.what() << "\n"; } } -} - + } bool SoundManager::isMusicPlaying() { @@ -465,14 +478,12 @@ namespace MWSound return test; } - SoundManager::SoundImpl SoundManager::getMData() + SoundManager::SoundImpl SoundManager::getMData() { // bool test = mData->music->isPlaying(); return *mData; } - - void SoundManager::say (MWWorld::Ptr ptr, const std::string& filename) { // The range values are not tested @@ -480,7 +491,7 @@ namespace MWSound if(mData->hasFile(filename)) mData->add(mData->convertPath(filename), ptr, "_say_sound", 1, 1, 100, 20000, false); else - cout << "Sound file " << filename << " not found, skipping.\n"; + std::cout << "Sound file " << filename << " not found, skipping.\n"; } bool SoundManager::sayDone (MWWorld::Ptr ptr) const @@ -490,20 +501,20 @@ namespace MWSound } - void SoundManager::playSound (const std::string& soundId, float volume, float pitch) + void SoundManager::playSound(const std::string& soundId, float volume, float pitch) { if(!mData) return; // Play and forget float min, max; const std::string &file = mData->lookup(soundId, volume, min, max); - if(file != "") - { + if (file != "") + { SoundPtr snd = mData->mgr->load(file); snd->setVolume(volume); snd->setRange(min,max); snd->setPitch(pitch); snd->play(); - } + } } void SoundManager::playSound3D (MWWorld::Ptr ptr, const std::string& soundId, @@ -514,7 +525,7 @@ namespace MWSound // Look up the sound in the ESM data float min, max; const std::string &file = mData->lookup(soundId, volume, min, max); - if(file != "") + if (file != "") mData->add(file, ptr, soundId, volume, pitch, min, max, loop); } @@ -541,18 +552,19 @@ namespace MWSound void SoundManager::updateObject(MWWorld::Ptr ptr) { - if(!mData) return; - mData->updatePositions(ptr); + if (mData != NULL) + { + mData->updatePositions(ptr); + } } void SoundManager::update (float duration) { - std::string effect; - MWWorld::Ptr::CellStore *current = mEnvironment.mWorld->getPlayer().getPlayer().getCell(); //If the region has changed - if(!(current->cell->data.flags & current->cell->Interior) && timer.elapsed() >= 10){ + if(!(current->cell->data.flags & current->cell->Interior) && timer.elapsed() >= 10) + { timer.restart(); if (test.name != current->cell->region) { @@ -564,11 +576,12 @@ namespace MWSound { std::vector::iterator soundIter = test.soundList.begin(); //mEnvironment.mSoundManager - if(total == 0){ - while (!(soundIter == test.soundList.end())) + if(total == 0) + { + while (soundIter != test.soundList.end()) { - ESM::NAME32 go = soundIter->sound; int chance = (int) soundIter->chance; + //ESM::NAME32 go = soundIter->sound; //std::cout << "Sound: " << go.name <<" Chance:" << chance << "\n"; soundIter++; total += chance; @@ -578,7 +591,7 @@ namespace MWSound int r = rand() % total; //old random code int pos = 0; soundIter = test.soundList.begin(); - while (!(soundIter == test.soundList.end())) + while (soundIter != test.soundList.end()) { const ESM::NAME32 go = soundIter->sound; int chance = (int) soundIter->chance; @@ -586,13 +599,11 @@ namespace MWSound soundIter++; if( r - pos < chance) { - effect = go.name; //play sound std::cout << "Sound: " << go.name <<" Chance:" << chance << "\n"; - mEnvironment.mSoundManager->playSound(effect, 20.0, 1.0); + mEnvironment.mSoundManager->playSound(go.name, 20.0, 1.0); break; - } pos += chance; } diff --git a/apps/openmw/mwsound/soundmanager.hpp b/apps/openmw/mwsound/soundmanager.hpp index 7dff16c76..5c3f473f2 100644 --- a/apps/openmw/mwsound/soundmanager.hpp +++ b/apps/openmw/mwsound/soundmanager.hpp @@ -2,14 +2,15 @@ #define GAME_SOUND_SOUNDMANAGER_H #include -#include #include +#include + #include "../mwworld/ptr.hpp" #include +#include -#include namespace Ogre { @@ -37,7 +38,7 @@ namespace MWSound struct SoundImpl; SoundImpl *mData; - std::vector files; + Files::PathContainer files; bool fsStrict; MWWorld::Environment& mEnvironment; @@ -52,7 +53,7 @@ namespace MWSound public: SoundManager(Ogre::Root*, Ogre::Camera*, const ESMS::ESMStore &store, - boost::filesystem::path dataDir, bool useSound, bool fsstrict, + const Files::PathContainer& dataDir, bool useSound, bool fsstrict, MWWorld::Environment& environment); ~SoundManager(); @@ -61,7 +62,7 @@ namespace MWSound /// \param filename name of a sound file in "Music/" in the data directory. void startRandomTitle(); - void MP3Lookup(boost::filesystem::path dir); + void MP3Lookup(const boost::filesystem::path& dir); bool isMusicPlaying(); 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/cells.cpp b/apps/openmw/mwworld/cells.cpp index 143ce557b..079c888aa 100644 --- a/apps/openmw/mwworld/cells.cpp +++ b/apps/openmw/mwworld/cells.cpp @@ -63,9 +63,10 @@ MWWorld::Ptr::CellStore *MWWorld::Cells::getExterior (int x, int y) result = mExteriors.insert (std::make_pair ( std::make_pair (x, y), Ptr::CellStore (cell))).first; + } + if (result->second.mState!=Ptr::CellStore::State_Loaded) result->second.load (mStore, mReader); - } return &result->second; } @@ -79,9 +80,10 @@ MWWorld::Ptr::CellStore *MWWorld::Cells::getInterior (const std::string& name) const ESM::Cell *cell = mStore.cells.findInt (name); result = mInteriors.insert (std::make_pair (name, Ptr::CellStore (cell))).first; + } + if (result->second.mState!=Ptr::CellStore::State_Loaded) result->second.load (mStore, mReader); - } return &result->second; } 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/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 f32cf9703..bb2f9f8a9 100644 --- a/apps/openmw/mwworld/physicssystem.cpp +++ b/apps/openmw/mwworld/physicssystem.cpp @@ -50,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, @@ -109,7 +120,7 @@ namespace MWWorld void PhysicsSystem::addObject (const std::string& handle, const std::string& mesh, const Ogre::Quaternion& rotation, float scale, const Ogre::Vector3& position) { - OEngine::Physic::RigidBody* body = mEngine->createRigidBody(mesh,handle); + OEngine::Physic::RigidBody* body = mEngine->createRigidBody(mesh,handle,scale); mEngine->addRigidBody(body); btTransform tr; tr.setOrigin(btVector3(position.x,position.y,position.z)); diff --git a/apps/openmw/mwworld/physicssystem.hpp b/apps/openmw/mwworld/physicssystem.hpp index e534ee208..78cbde083 100644 --- a/apps/openmw/mwworld/physicssystem.hpp +++ b/apps/openmw/mwworld/physicssystem.hpp @@ -33,11 +33,15 @@ 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(); diff --git a/apps/openmw/mwworld/scene.cpp b/apps/openmw/mwworld/scene.cpp index 2f0d33c97..47d5f1a2d 100644 --- a/apps/openmw/mwworld/scene.cpp +++ b/apps/openmw/mwworld/scene.cpp @@ -60,12 +60,12 @@ namespace MWWorld std::cout << "Unloading cell\n"; ListHandles functor; - MWWorld::Ptr::CellStore* active = *iter; - active->forEach(functor); + + (*iter)->forEach(functor); { @@ -77,13 +77,15 @@ namespace MWWorld mPhysics->removeObject (node->getName()); } } - mRendering.removeCell(active); + mRendering.removeCell(*iter); //mPhysics->removeObject("Unnamed_43"); - mWorld->getLocalScripts().clearCell (active); - mEnvironment.mMechanicsManager->dropActors (active); - mEnvironment.mSoundManager->stopSound (active); - mActiveCells.erase(active); + mWorld->getLocalScripts().clearCell (*iter); + mEnvironment.mMechanicsManager->dropActors (*iter); + mEnvironment.mSoundManager->stopSound (*iter); + mActiveCells.erase(*iter); + + } void Scene::loadCell (Ptr::CellStore *cell) @@ -233,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 17c227953..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,12 +140,16 @@ 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, @@ -148,12 +157,14 @@ namespace MWWorld const std::string& master, const boost::filesystem::path& resDir, bool newGame, Environment& environment, const std::string& encoding) : mPlayer (0), mLocalScripts (mStore), mGlobalVariables (0), - mSky (false), mEnvironment (environment), mNextDynamicRecord (0), mCells (mStore, mEsm, *this) + mSky (true), mEnvironment (environment), mNextDynamicRecord (0), mCells (mStore, mEsm, *this) { 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)); @@ -181,8 +192,10 @@ namespace MWWorld } + World::~World() { + delete mWeatherManager; delete mWorldScene; delete mGlobalVariables; delete mRendering; @@ -368,6 +381,8 @@ namespace MWWorld mGlobalVariables->setFloat ("gamehour", hour); mRendering->skySetHour (hour); + + mWeatherManager->setHour (hour); if (days>0) setDay (days + mGlobalVariables->getInt ("day")); @@ -403,6 +418,10 @@ namespace MWWorld mGlobalVariables->setInt ("month", month); mRendering->skySetDate (day, month); + + mWeatherManager->setDate (day, month); + + } void World::setMonth (int month) @@ -437,10 +456,6 @@ namespace MWWorld 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(); return true; } @@ -610,7 +625,7 @@ namespace MWWorld bool World::toggleCollisionMode() { - return mPhysics->toggleCollisionMode(); + return mPhysics->toggleCollisionMode();; } bool World::toggleRenderMode (RenderMode mode) @@ -687,5 +702,56 @@ namespace MWWorld 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 893980456..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; + + MWWorld::WeatherManager* mWeatherManager; MWWorld::Scene *mWorldScene; MWWorld::Player *mPlayer; @@ -101,11 +106,13 @@ namespace MWWorld 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; @@ -224,6 +238,7 @@ namespace MWWorld /// references that are currently not in the rendered scene should be ignored. void update (float duration); + }; } diff --git a/cmake/FindOGRE.cmake b/cmake/FindOGRE.cmake index 01fb04ac1..917a8653e 100644 --- a/cmake/FindOGRE.cmake +++ b/cmake/FindOGRE.cmake @@ -18,7 +18,7 @@ # Once done, this will define # # OGRE_FOUND - system has OGRE -# OGRE_INCLUDE_DIRS - the OGRE include directories +# 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) @@ -33,9 +33,10 @@ # # For each of these components, the following variables are defined: # + # 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}_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) # @@ -112,7 +113,7 @@ if (OGRE_PREFIX_SOURCE AND OGRE_PREFIX_BUILD) 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}) @@ -124,12 +125,12 @@ else() endif () # redo search if any of the environmental hints changed -set(OGRE_COMPONENTS Paging Terrain +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 +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}) @@ -265,7 +266,7 @@ if (OGRE_STATIC) 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 () @@ -308,7 +309,7 @@ if (OGRE_STATIC) 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) @@ -340,7 +341,7 @@ endif() # Find Ogre components ######################################################### -set(OGRE_COMPONENT_SEARCH_PATH_REL +set(OGRE_COMPONENT_SEARCH_PATH_REL ${OGRE_LIBRARY_DIR_REL}/.. ${OGRE_LIBRARY_DIR_REL}/../.. ${OGRE_BIN_SEARCH_PATH} @@ -392,17 +393,17 @@ macro(ogre_find_plugin PLUGIN HEADER) 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} + 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} + 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}") @@ -428,7 +429,7 @@ macro(ogre_find_plugin PLUGIN HEADER) if (OGRE_${PLUGIN}_FOUND) if (NOT OGRE_PLUGIN_DIR_REL OR NOT OGRE_PLUGIN_DIR_DBG) if (WIN32) - set(OGRE_PLUGIN_SEARCH_PATH_REL + set(OGRE_PLUGIN_SEARCH_PATH_REL ${OGRE_LIBRARY_DIR_REL}/.. ${OGRE_LIBRARY_DIR_REL}/../.. ${OGRE_BIN_SEARCH_PATH} @@ -449,7 +450,7 @@ macro(ogre_find_plugin PLUGIN HEADER) 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) @@ -458,7 +459,7 @@ macro(ogre_find_plugin PLUGIN HEADER) endif() mark_as_advanced(OGRE_${PLUGIN}_REL OGRE_${PLUGIN}_DBG) endif() - + endif () if (TMP_CMAKE_LIB_PREFIX) @@ -498,7 +499,7 @@ if (OGRE_STATIC) if (NOT Cg_FOUND) set(OGRE_Plugin_CgProgramManager_FOUND FALSE) endif () - + set(OGRE_RenderSystem_Direct3D9_LIBRARIES ${OGRE_RenderSystem_Direct3D9_LIBRARIES} ${DirectX_LIBRARIES} ) @@ -539,4 +540,3 @@ set(OGRE_MEDIA_SEARCH_SUFFIX 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/components/CMakeLists.txt b/components/CMakeLists.txt index 7fcac6eb8..6bf7bacf4 100644 --- a/components/CMakeLists.txt +++ b/components/CMakeLists.txt @@ -6,10 +6,6 @@ add_component_dir (bsa bsa_archive bsa_file ) -add_component_dir (cfg - configurationmanager - ) - add_component_dir (nif controlled effect nif_types record controller extra node record_ptr data nif_file property ) @@ -47,7 +43,7 @@ add_component_dir (misc ) add_component_dir (files - linuxpath windowspath macospath path multidircollection collections fileops + linuxpath windowspath macospath fixedpath multidircollection collections fileops configurationmanager ) add_component_dir (compiler diff --git a/components/cfg/configurationmanager.cpp b/components/cfg/configurationmanager.cpp deleted file mode 100644 index 0998debee..000000000 --- a/components/cfg/configurationmanager.cpp +++ /dev/null @@ -1,157 +0,0 @@ -#include "configurationmanager.hpp" - -#include -#include -#include - -namespace Cfg -{ - -static const char* const openmwCfgFile = "openmw.cfg"; -static const char* const ogreCfgFile = "ogre.cfg"; -static const char* const pluginsCfgFile = "plugins.cfg"; - - -ConfigurationManager::ConfigurationManager() - : mPath("openmw") -{ - /** - * According to task #168 plugins.cfg file shall be located in global - * configuration path or in runtime configuration path. - */ - mPluginsCfgPath = mPath.getGlobalConfigPath() / pluginsCfgFile; - if (!boost::filesystem::is_regular_file(mPluginsCfgPath)) - { - mPluginsCfgPath = mPath.getRuntimeConfigPath() / pluginsCfgFile; - if (!boost::filesystem::is_regular_file(mPluginsCfgPath)) - { - std::cerr << "Failed to find " << pluginsCfgFile << " file!" << std::endl; - mPluginsCfgPath.clear(); - } - } - - /** - * According to task #168 ogre.cfg file shall be located only - * in user configuration path. - */ - mOgreCfgPath = mPath.getLocalConfigPath() / ogreCfgFile; - - mLogPath = mPath.getLocalConfigPath(); -} - -ConfigurationManager::~ConfigurationManager() -{ -} - -void ConfigurationManager::readConfiguration(boost::program_options::variables_map& variables, - boost::program_options::options_description& description) -{ - loadConfig(mPath.getLocalConfigPath(), variables, description); - boost::program_options::notify(variables); - loadConfig(mPath.getRuntimeConfigPath(), variables, description); - boost::program_options::notify(variables); - loadConfig(mPath.getGlobalConfigPath(), variables, description); - boost::program_options::notify(variables); -} - -void ConfigurationManager::loadConfig(const boost::filesystem::path& path, - boost::program_options::variables_map& variables, - boost::program_options::options_description& description) -{ - boost::filesystem::path cfgFile(path); - cfgFile /= std::string(openmwCfgFile); - if (boost::filesystem::is_regular_file(cfgFile)) - { - std::cout << "Loading config file: " << cfgFile.string() << "... "; - - std::ifstream configFileStream(cfgFile.string().c_str()); - if (configFileStream.is_open()) - { - boost::program_options::store(boost::program_options::parse_config_file( - configFileStream, description), variables); - - std::cout << "done." << std::endl; - } - else - { - std::cout << "failed." << std::endl; - } - } -} - -const boost::filesystem::path& ConfigurationManager::getGlobalConfigPath() const -{ - return mPath.getGlobalConfigPath(); -} - -void ConfigurationManager::setGlobalConfigPath(const boost::filesystem::path& newPath) -{ - mPath.setGlobalConfigPath(newPath); -} - -const boost::filesystem::path& ConfigurationManager::getLocalConfigPath() const -{ - return mPath.getLocalConfigPath(); -} - -void ConfigurationManager::setLocalConfigPath(const boost::filesystem::path& newPath) -{ - mPath.setLocalConfigPath(newPath); -} - -const boost::filesystem::path& ConfigurationManager::getRuntimeConfigPath() const -{ - return mPath.getRuntimeConfigPath(); -} - -void ConfigurationManager::setRuntimeConfigPath(const boost::filesystem::path& newPath) -{ - mPath.setRuntimeConfigPath(newPath); -} - -const boost::filesystem::path& ConfigurationManager::getGlobalDataPath() const -{ - return mPath.getGlobalDataPath(); -} - -void ConfigurationManager::setGlobalDataPath(const boost::filesystem::path& newPath) -{ - mPath.setGlobalDataPath(newPath); -} - -const boost::filesystem::path& ConfigurationManager::getLocalDataPath() const -{ - return mPath.getLocalDataPath(); -} - -void ConfigurationManager::setLocalDataPath(const boost::filesystem::path& newPath) -{ - mPath.setLocalDataPath(newPath); -} - -const boost::filesystem::path& ConfigurationManager::getRuntimeDataPath() const -{ - return mPath.getRuntimeDataPath(); -} - -void ConfigurationManager::setRuntimeDataPath(const boost::filesystem::path& newPath) -{ - mPath.setRuntimeDataPath(newPath); -} - -const boost::filesystem::path& ConfigurationManager::getOgreConfigPath() const -{ - return mOgreCfgPath; -} - -const boost::filesystem::path& ConfigurationManager::getPluginsConfigPath() const -{ - return mPluginsCfgPath; -} - -const boost::filesystem::path& ConfigurationManager::getLogPath() const -{ - return mLogPath; -} - -} /* namespace Cfg */ diff --git a/components/cfg/configurationmanager.hpp b/components/cfg/configurationmanager.hpp deleted file mode 100644 index 7f13d0914..000000000 --- a/components/cfg/configurationmanager.hpp +++ /dev/null @@ -1,62 +0,0 @@ -#ifndef COMPONENTS_CFG_CONFIGURATIONMANAGER_HPP -#define COMPONENTS_CFG_CONFIGURATIONMANAGER_HPP - -#include -#include - -#include - -/** - * \namespace Cfg - */ -namespace Cfg -{ - -/** - * \struct ConfigurationManager - */ -struct ConfigurationManager -{ - ConfigurationManager(); - virtual ~ConfigurationManager(); - - void readConfiguration(boost::program_options::variables_map& variables, - boost::program_options::options_description& description); - - const boost::filesystem::path& getGlobalConfigPath() const; - void setGlobalConfigPath(const boost::filesystem::path& newPath); - - const boost::filesystem::path& getLocalConfigPath() const; - void setLocalConfigPath(const boost::filesystem::path& newPath); - - const boost::filesystem::path& getRuntimeConfigPath() const; - void setRuntimeConfigPath(const boost::filesystem::path& newPath); - - const boost::filesystem::path& getGlobalDataPath() const; - void setGlobalDataPath(const boost::filesystem::path& newPath); - - const boost::filesystem::path& getLocalDataPath() const; - void setLocalDataPath(const boost::filesystem::path& newPath); - - const boost::filesystem::path& getRuntimeDataPath() const; - void setRuntimeDataPath(const boost::filesystem::path& newPath); - - const boost::filesystem::path& getOgreConfigPath() const; - const boost::filesystem::path& getPluginsConfigPath() const; - const boost::filesystem::path& getLogPath() const; - - private: - void loadConfig(const boost::filesystem::path& path, - boost::program_options::variables_map& variables, - boost::program_options::options_description& description); - - Files::Path<> mPath; - - boost::filesystem::path mOgreCfgPath; - boost::filesystem::path mPluginsCfgPath; - boost::filesystem::path mLogPath; -}; - -} /* namespace Cfg */ - -#endif /* COMPONENTS_CFG_CONFIGURATIONMANAGER_HPP */ 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/file_finder/file_finder.hpp b/components/file_finder/file_finder.hpp index 0e1e07226..8a15af73a 100644 --- a/components/file_finder/file_finder.hpp +++ b/components/file_finder/file_finder.hpp @@ -1,9 +1,11 @@ #ifndef FILE_FINDER_MAIN_H #define FILE_FINDER_MAIN_H +#include + #include "search.hpp" #include "filename_less.hpp" -#include +#include namespace FileFinder { @@ -11,7 +13,8 @@ namespace FileFinder template class FileFinderT { - std::map table; + typedef std::map TableContainer; + TableContainer table; struct Inserter : ReturnPath { @@ -35,12 +38,12 @@ public: // Remember the original path length, so we can cut it away from // the relative paths used as keys - std::string pstring = path.string(); + const std::string& pstring = path.string(); inserter.cut = pstring.size(); // If the path does not end in a slash, then boost will add one // later, which means one more character we have to remove. - char last = pstring[pstring.size()-1]; + char last = *pstring.rbegin(); if(last != '\\' && last != '/') inserter.cut++; @@ -56,12 +59,84 @@ public: // Find the full path from a relative path. const std::string &lookup(const std::string& file) const { - return table.find(file)->second; + static std::string empty; + typename TableContainer::const_iterator it = table.find(file); + return (it != table.end()) ? it->second : empty; } }; +template +< + class LESS +> +struct TreeFileFinder +{ + typedef TreeFileFinder finder_t; + + TreeFileFinder(const Files::PathContainer& paths, bool recurse = true) + { + struct : ReturnPath + { + finder_t *owner; + int cut; + + void add(const boost::filesystem::path &pth) + { + std::string file = pth.string(); + std::string key = file.substr(cut); + owner->mTable[key] = file; + } + } inserter; + + inserter.owner = this; + + for (Files::PathContainer::const_iterator it = paths.begin(); it != paths.end(); ++it) + { + + // Remember the original path length, so we can cut it away from + // the relative paths used as keys + const std::string& pstring = it->string(); + inserter.cut = pstring.size(); + + // If the path does not end in a slash, then boost will add one + // later, which means one more character we have to remove. + char last = *pstring.rbegin(); + if (last != '\\' && last != '/') + { + inserter.cut++; + } + + // Fill the map + find(*it, inserter, recurse); + } + } + + bool has(const std::string& file) const + { + return mTable.find(file) != mTable.end(); + } + + const std::string& lookup(const std::string& file) const + { + static std::string empty; + typename TableContainer::const_iterator it = mTable.find(file); + return (it != mTable.end()) ? it->second : empty; + } + + private: + typedef std::map TableContainer; + TableContainer mTable; + +// Inserter inserter; +}; + + // The default is to use path_less for equality checks typedef FileFinderT FileFinder; typedef FileFinderT FileFinderStrict; -} -#endif + +typedef TreeFileFinder LessTreeFileFinder; +typedef TreeFileFinder StrictTreeFileFinder; + +} /* namespace FileFinder */ +#endif /* FILE_FINDER_MAIN_H */ diff --git a/components/file_finder/search.cpp b/components/file_finder/search.cpp index b05b30e83..06deaf83a 100644 --- a/components/file_finder/search.cpp +++ b/components/file_finder/search.cpp @@ -2,27 +2,35 @@ #include -using namespace std; -using namespace boost::filesystem; - -void FileFinder::find(const path & dir_path, ReturnPath &ret, bool recurse) +void FileFinder::find(const boost::filesystem::path & dir_path, ReturnPath &ret, bool recurse) { - if ( !exists( dir_path ) ) - { - cout << "Path " << dir_path << " not found\n"; - return; - } - - directory_iterator end_itr; // default construction yields past-the-end - for ( directory_iterator itr(dir_path); - itr != end_itr; - ++itr ) + if (boost::filesystem::exists(dir_path)) { - if ( is_directory( *itr ) ) + if (!recurse) { - if(recurse) find(*itr, ret); + boost::filesystem::directory_iterator end_itr; // default construction yields past-the-end + for (boost::filesystem::directory_iterator itr(dir_path); itr != end_itr; ++itr) + { + if (!boost::filesystem::is_directory( *itr )) + { + ret.add(*itr); + } + } } - else - ret.add(*itr); + else + { + boost::filesystem::recursive_directory_iterator end_itr; // default construction yields past-the-end + for (boost::filesystem::recursive_directory_iterator itr(dir_path); itr != end_itr; ++itr) + { + if (!boost::filesystem::is_directory(*itr)) + { + ret.add(*itr); + } + } + } + } + else + { + std::cout << "Path " << dir_path << " not found" << std::endl; } } diff --git a/components/files/configurationmanager.cpp b/components/files/configurationmanager.cpp new file mode 100644 index 000000000..ef45b6543 --- /dev/null +++ b/components/files/configurationmanager.cpp @@ -0,0 +1,182 @@ +#include "configurationmanager.hpp" + +#include +#include +#include +#include + +#include +#include + +/** + * \namespace Files + */ +namespace Files +{ + +static const char* const openmwCfgFile = "openmw.cfg"; +static const char* const ogreCfgFile = "ogre.cfg"; +static const char* const pluginsCfgFile = "plugins.cfg"; + +const char* const mwToken = "?mw?"; +const char* const localToken = "?local?"; +const char* const userToken = "?user?"; +const char* const globalToken = "?global?"; + +ConfigurationManager::ConfigurationManager() + : mFixedPath("openmw") +{ + setupTokensMapping(); + + mPluginsCfgPath = mFixedPath.getGlobalPath() / pluginsCfgFile; + if (!boost::filesystem::is_regular_file(mPluginsCfgPath)) + { + mPluginsCfgPath = mFixedPath.getLocalPath() / pluginsCfgFile; + if (!boost::filesystem::is_regular_file(mPluginsCfgPath)) + { + std::cerr << "Failed to find " << pluginsCfgFile << " file!" << std::endl; + mPluginsCfgPath.clear(); + } + } + + mOgreCfgPath = mFixedPath.getUserPath() / ogreCfgFile; + mLogPath = mFixedPath.getUserPath(); +} + +ConfigurationManager::~ConfigurationManager() +{ +} + +void ConfigurationManager::setupTokensMapping() +{ + mTokensMapping.insert(std::make_pair(mwToken, &FixedPath<>::getInstallPath)); + mTokensMapping.insert(std::make_pair(localToken, &FixedPath<>::getLocalPath)); + mTokensMapping.insert(std::make_pair(userToken, &FixedPath<>::getUserPath)); + mTokensMapping.insert(std::make_pair(globalToken, &FixedPath<>::getGlobalDataPath)); +} + +void ConfigurationManager::readConfiguration(boost::program_options::variables_map& variables, + boost::program_options::options_description& description) +{ + loadConfig(mFixedPath.getUserPath(), variables, description); + boost::program_options::notify(variables); + + loadConfig(mFixedPath.getLocalPath(), variables, description); + boost::program_options::notify(variables); + loadConfig(mFixedPath.getGlobalPath(), variables, description); + boost::program_options::notify(variables); + +} + +void ConfigurationManager::processPaths(Files::PathContainer& dataDirs) +{ + std::string path; + for (Files::PathContainer::iterator it = dataDirs.begin(); it != dataDirs.end(); ++it) + { + path = it->string(); + boost::erase_all(path, "\""); + *it = boost::filesystem::path(path); + + // Check if path contains a token + if (!path.empty() && *path.begin() == '?') + { + std::string::size_type pos = path.find('?', 1); + if (pos != std::string::npos && pos != 0) + { + TokensMappingContainer::iterator tokenIt = mTokensMapping.find(path.substr(0, pos + 1)); + if (tokenIt != mTokensMapping.end()) + { + boost::filesystem::path tempPath(((mFixedPath).*(tokenIt->second))()); + if (pos < path.length() - 1) + { + // There is something after the token, so we should + // append it to the path + tempPath /= path.substr(pos + 1, path.length() - pos); + } + + *it = tempPath; + } + else + { + // Clean invalid / unknown token, it will be removed outside the loop + (*it).clear(); + } + } + } + + if (!boost::filesystem::is_directory(*it)) + { + (*it).clear(); + } + } + + dataDirs.erase(std::remove_if(dataDirs.begin(), dataDirs.end(), + boost::bind(&boost::filesystem::path::empty, _1)), dataDirs.end()); +} + +void ConfigurationManager::loadConfig(const boost::filesystem::path& path, + boost::program_options::variables_map& variables, + boost::program_options::options_description& description) +{ + boost::filesystem::path cfgFile(path); + cfgFile /= std::string(openmwCfgFile); + if (boost::filesystem::is_regular_file(cfgFile)) + { + std::cout << "Loading config file: " << cfgFile.string() << "... "; + + std::ifstream configFileStream(cfgFile.string().c_str()); + if (configFileStream.is_open()) + { + boost::program_options::store(boost::program_options::parse_config_file( + configFileStream, description, true), variables); + + std::cout << "done." << std::endl; + } + else + { + std::cout << "failed." << std::endl; + } + } +} + +const boost::filesystem::path& ConfigurationManager::getGlobalPath() const +{ + return mFixedPath.getGlobalPath(); +} + +const boost::filesystem::path& ConfigurationManager::getUserPath() const +{ + return mFixedPath.getUserPath(); +} + +const boost::filesystem::path& ConfigurationManager::getLocalPath() const +{ + return mFixedPath.getLocalPath(); +} + +const boost::filesystem::path& ConfigurationManager::getGlobalDataPath() const +{ + return mFixedPath.getGlobalDataPath(); +} + +const boost::filesystem::path& ConfigurationManager::getInstallPath() const +{ + return mFixedPath.getInstallPath(); +} + +const boost::filesystem::path& ConfigurationManager::getOgreConfigPath() const +{ + return mOgreCfgPath; +} + +const boost::filesystem::path& ConfigurationManager::getPluginsConfigPath() const +{ + return mPluginsCfgPath; +} + +const boost::filesystem::path& ConfigurationManager::getLogPath() const +{ + return mLogPath; +} + +} /* namespace Cfg */ diff --git a/components/files/configurationmanager.hpp b/components/files/configurationmanager.hpp new file mode 100644 index 000000000..7fb3793c6 --- /dev/null +++ b/components/files/configurationmanager.hpp @@ -0,0 +1,71 @@ +#ifndef COMPONENTS_FILES_CONFIGURATIONMANAGER_HPP +#define COMPONENTS_FILES_CONFIGURATIONMANAGER_HPP + +#ifdef _WIN32 +#include +#else +#include +#endif + +#include +#include + +#include +#include + +/** + * \namespace Files + */ +namespace Files +{ + +/** + * \struct ConfigurationManager + */ +struct ConfigurationManager +{ + ConfigurationManager(); + virtual ~ConfigurationManager(); + + void readConfiguration(boost::program_options::variables_map& variables, + boost::program_options::options_description& description); + void processPaths(Files::PathContainer& dataDirs); + + /**< Fixed paths */ + const boost::filesystem::path& getGlobalPath() const; + const boost::filesystem::path& getUserPath() const; + const boost::filesystem::path& getLocalPath() const; + + const boost::filesystem::path& getGlobalDataPath() const; + const boost::filesystem::path& getUserDataPath() const; + const boost::filesystem::path& getLocalDataPath() const; + const boost::filesystem::path& getInstallPath() const; + + const boost::filesystem::path& getOgreConfigPath() const; + const boost::filesystem::path& getPluginsConfigPath() const; + const boost::filesystem::path& getLogPath() const; + + private: + typedef Files::FixedPath<> FixedPathType; + + typedef const boost::filesystem::path& (FixedPathType::*path_type_f)() const; + typedef std::tr1::unordered_map TokensMappingContainer; + + void loadConfig(const boost::filesystem::path& path, + boost::program_options::variables_map& variables, + boost::program_options::options_description& description); + + void setupTokensMapping(); + + FixedPathType mFixedPath; + + boost::filesystem::path mOgreCfgPath; + boost::filesystem::path mPluginsCfgPath; + boost::filesystem::path mLogPath; + + TokensMappingContainer mTokensMapping; +}; + +} /* namespace Cfg */ + +#endif /* COMPONENTS_FILES_CONFIGURATIONMANAGER_HPP */ diff --git a/components/files/fixedpath.hpp b/components/files/fixedpath.hpp new file mode 100644 index 000000000..9e5c4f8f2 --- /dev/null +++ b/components/files/fixedpath.hpp @@ -0,0 +1,145 @@ +/** + * Open Morrowind - an opensource Elder Scrolls III: Morrowind + * engine implementation. + * + * Copyright (C) 2011 Open Morrowind Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** \file components/files/fixedpath.hpp */ + +#ifndef COMPONENTS_FILES_FIXEDPATH_HPP +#define COMPONENTS_FILES_FIXEDPATH_HPP + +#include +#include + +#if defined(__linux__) || defined(__FreeBSD__) + #include + namespace Files { typedef LinuxPath TargetPathType; } + +#elif defined(__WIN32) || defined(__WINDOWS__) || defined(_WIN32) + #include + namespace Files { typedef WindowsPath TargetPathType; } + +#elif defined(macintosh) || defined(Macintosh) || defined(__APPLE__) || defined(__MACH__) + #include + namespace Files { typedef MacOsPath TargetPathType; } + +#else + #error "Unknown platform!" +#endif + + +/** + * \namespace Files + */ +namespace Files +{ + +/** + * \struct Path + * + * \tparam P - Path strategy class type (depends on target system) + * + */ +template +< + class P = TargetPathType +> +struct FixedPath +{ + typedef P PathType; + + /** + * \brief Path constructor. + * + * \param [in] application_name - Name of the application + */ + FixedPath(const std::string& application_name) + : mPath() + , mUserPath(mPath.getUserPath()) + , mGlobalPath(mPath.getGlobalPath()) + , mLocalPath(mPath.getLocalPath()) + , mGlobalDataPath(mPath.getGlobalDataPath()) + , mInstallPath(mPath.getInstallPath()) + { + if (!application_name.empty()) + { + boost::filesystem::path suffix(application_name + std::string("/")); + + mUserPath /= suffix; + mGlobalPath /= suffix; + mGlobalDataPath /= suffix; + } + } + + /** + * \brief Return path pointing to the user local configuration directory. + * + * \return boost::filesystem::path + */ + const boost::filesystem::path& getUserPath() const + { + return mUserPath; + } + + /** + * \brief Return path pointing to the global (system) configuration directory. + * + * \return boost::filesystem::path + */ + const boost::filesystem::path& getGlobalPath() const + { + return mGlobalPath; + } + + /** + * \brief Return path pointing to the directory where application was started. + * + * \return boost::filesystem::path + */ + const boost::filesystem::path& getLocalPath() const + { + return mLocalPath; + } + + const boost::filesystem::path& getInstallPath() const + { + return mInstallPath; + } + + const boost::filesystem::path& getGlobalDataPath() const + { + return mGlobalDataPath; + } + + private: + PathType mPath; + + boost::filesystem::path mUserPath; /**< User path */ + boost::filesystem::path mGlobalPath; /**< Global path */ + boost::filesystem::path mLocalPath; /**< It is the same directory where application was run */ + + boost::filesystem::path mGlobalDataPath; /**< Global application data path */ + + boost::filesystem::path mInstallPath; + +}; + + +} /* namespace Files */ + +#endif /* COMPONENTS_FILES_FIXEDPATH_HPP */ diff --git a/components/files/linuxpath.cpp b/components/files/linuxpath.cpp index c485002fd..92e4dce33 100644 --- a/components/files/linuxpath.cpp +++ b/components/files/linuxpath.cpp @@ -22,12 +22,13 @@ #include "linuxpath.hpp" -#if defined(__linux__) +#if defined(__linux__) || defined(__FreeBSD__) #include #include #include #include +#include /** * \namespace Files @@ -35,126 +36,128 @@ namespace Files { -boost::filesystem::path LinuxPath::getLocalConfigPath() const +boost::filesystem::path LinuxPath::getUserPath() const { - boost::filesystem::path localConfigPath("."); + boost::filesystem::path userPath("."); boost::filesystem::path suffix("/"); - const char* theDir = getenv("OPENMW_CONFIG"); + const char* theDir = getenv("HOME"); if (theDir == NULL) { - theDir = getenv("XDG_CONFIG_HOME"); - if (theDir == NULL) + struct passwd* pwd = getpwuid(getuid()); + if (pwd != NULL) { - theDir = getenv("HOME"); - if (theDir == NULL) - { - struct passwd* pwd = getpwuid(getuid()); - if (pwd != NULL) - { - theDir = pwd->pw_dir; - } - } - if (theDir != NULL) - { - suffix = boost::filesystem::path("/.config/"); - } + theDir = pwd->pw_dir; } } - if (theDir != NULL) { - localConfigPath = boost::filesystem::path(theDir); + if (theDir != NULL) + { + suffix = boost::filesystem::path("/.config/"); + userPath = boost::filesystem::path(theDir); } - localConfigPath /= suffix; + userPath /= suffix; - return localConfigPath; + return userPath; } -boost::filesystem::path LinuxPath::getGlobalConfigPath() const +boost::filesystem::path LinuxPath::getGlobalPath() const { - boost::filesystem::path globalConfigPath("/etc/xdg/"); - - char* theDir = getenv("XDG_CONFIG_DIRS"); - if (theDir != NULL) - { - // We take only first path from list - char* ptr = strtok(theDir, ":"); - if (ptr != NULL) - { - globalConfigPath = boost::filesystem::path(ptr); - globalConfigPath /= boost::filesystem::path("/"); - } - } - - return globalConfigPath; + boost::filesystem::path globalPath("/etc/"); + return globalPath; } -boost::filesystem::path LinuxPath::getRuntimeConfigPath() const +boost::filesystem::path LinuxPath::getLocalPath() const { return boost::filesystem::path("./"); } -boost::filesystem::path LinuxPath::getLocalDataPath() const +boost::filesystem::path LinuxPath::getGlobalDataPath() const { - boost::filesystem::path localDataPath("."); - boost::filesystem::path suffix("/"); + boost::filesystem::path globalDataPath("/usr/share/games/"); + return globalDataPath; +} - const char* theDir = getenv("OPENMW_DATA"); - if (theDir == NULL) +boost::filesystem::path LinuxPath::getInstallPath() const +{ + boost::filesystem::path installPath; + + char *homePath = getenv("HOME"); + if (homePath == NULL) { - theDir = getenv("XDG_DATA_HOME"); - if (theDir == NULL) + struct passwd* pwd = getpwuid(getuid()); + if (pwd != NULL) { - theDir = getenv("HOME"); - if (theDir == NULL) - { - struct passwd* pwd = getpwuid(getuid()); - if (pwd != NULL) - { - theDir = pwd->pw_dir; - } - } - if (theDir != NULL) - { - suffix = boost::filesystem::path("/.local/share/"); - } + homePath = pwd->pw_dir; } } - if (theDir != NULL) { - localDataPath = boost::filesystem::path(theDir); - } + if (homePath != NULL) + { + boost::filesystem::path wineDefaultRegistry(homePath); + wineDefaultRegistry /= ".wine/system.reg"; - localDataPath /= suffix; - return localDataPath; -} + if (boost::filesystem::is_regular_file(wineDefaultRegistry)) + { + boost::filesystem::ifstream file(wineDefaultRegistry); + bool isRegEntry = false; + std::string line; + std::string mwpath; -boost::filesystem::path LinuxPath::getGlobalDataPath() const -{ - boost::filesystem::path globalDataPath("/usr/local/share/"); + while (std::getline(file, line)) + { + if (line[0] == '[') // we found an entry + { + if (isRegEntry) + { + break; + } - char* theDir = getenv("XDG_DATA_DIRS"); - if (theDir != NULL) - { - // We take only first path from list - char* ptr = strtok(theDir, ":"); - if (ptr != NULL) - { - globalDataPath = boost::filesystem::path(ptr); - globalDataPath /= boost::filesystem::path("/"); + isRegEntry = (line.find("Softworks\\\\Morrowind]") != std::string::npos); + } + else if (isRegEntry) + { + if (line[0] == '"') // empty line means new registry key + { + std::string key = line.substr(1, line.find('"', 1) - 1); + if (strcasecmp(key.c_str(), "Installed Path") == 0) + { + std::string::size_type valuePos = line.find('=') + 2; + mwpath = line.substr(valuePos, line.rfind('"') - valuePos); + + std::string::size_type pos = mwpath.find("\\"); + while (pos != std::string::npos) + { + mwpath.replace(pos, 2, "/"); + pos = mwpath.find("\\", pos + 1); + } + break; + } + } + } + } + + if (!mwpath.empty()) + { + // Change drive letter to lowercase, so we could use + // ~/.wine/dosdevices symlinks + mwpath[0] = tolower(mwpath[0]); + installPath /= homePath; + installPath /= ".wine/dosdevices/"; + installPath /= mwpath; + + if (!boost::filesystem::is_directory(installPath)) + { + installPath.clear(); + } + } } } - return globalDataPath; -} - -boost::filesystem::path LinuxPath::getRuntimeDataPath() const -{ - return boost::filesystem::path("./data/"); + return installPath; } - } /* namespace Files */ -#endif /* defined(__linux__) */ +#endif /* defined(__linux__) || defined(__FreeBSD__) */ diff --git a/components/files/linuxpath.hpp b/components/files/linuxpath.hpp index d6e717fc4..48fdbb2ff 100644 --- a/components/files/linuxpath.hpp +++ b/components/files/linuxpath.hpp @@ -23,7 +23,7 @@ #ifndef COMPONENTS_FILES_LINUXPATH_H #define COMPONENTS_FILES_LINUXPATH_H -#if defined(__linux__) +#if defined(__linux__) || defined(__FreeBSD__) #include @@ -39,18 +39,18 @@ namespace Files struct LinuxPath { /** - * \brief Return path to the local configuration directory. + * \brief Return path to the user directory. * * \return boost::filesystem::path */ - boost::filesystem::path getLocalConfigPath() const; + boost::filesystem::path getUserPath() const; /** - * \brief Return path to the global (system) configuration directory. + * \brief Return path to the global (system) directory where game files could be placed. * * \return boost::filesystem::path */ - boost::filesystem::path getGlobalConfigPath() const; + boost::filesystem::path getGlobalPath() const; /** * \brief Return path to the runtime configuration directory which is the @@ -58,33 +58,25 @@ struct LinuxPath * * \return boost::filesystem::path */ - boost::filesystem::path getRuntimeConfigPath() const; + boost::filesystem::path getLocalPath() const; /** - * \brief Return path to the local data directory. - * - * \return boost::filesystem::path - */ - boost::filesystem::path getLocalDataPath() const; - - /** - * \brief Return path to the global (system) data directory. + * \brief * * \return boost::filesystem::path */ boost::filesystem::path getGlobalDataPath() const; /** - * \brief Return runtime data path which is a location where - * an application was started with 'data' suffix. + * \brief Gets the path of the installed Morrowind version if there is one. * * \return boost::filesystem::path */ - boost::filesystem::path getRuntimeDataPath() const; + boost::filesystem::path getInstallPath() const; }; } /* namespace Files */ -#endif /* defined(__linux__) */ +#endif /* defined(__linux__) || defined(__FreeBSD__) */ #endif /* COMPONENTS_FILES_LINUXPATH_H */ diff --git a/components/files/macospath.cpp b/components/files/macospath.cpp index 46e775030..94dafe794 100644 --- a/components/files/macospath.cpp +++ b/components/files/macospath.cpp @@ -27,6 +27,11 @@ #include #include #include +#include + +/** + * FIXME: Someone with MacOS system should check this and correct if necessary + */ /** * \namespace Files @@ -34,9 +39,9 @@ namespace Files { -boost::filesystem::path MacOsPath::getLocalConfigPath() const +boost::filesystem::path MacOsPath::getUserPath() const { - boost::filesystem::path localConfigPath("."); + boost::filesystem::path userPath("."); boost::filesystem::path suffix("/"); const char* theDir = getenv("HOME"); @@ -50,66 +55,107 @@ boost::filesystem::path MacOsPath::getLocalConfigPath() const } if (theDir != NULL) { - localConfigPath = boost::filesystem::path(theDir) / "Library/Preferences/"; + userPath = boost::filesystem::path(theDir) / "Library/Preferences/"; } - localConfigPath /= suffix; + userPath /= suffix; - return localConfigPath; + return userPath; } -boost::filesystem::path MacOsPath::getGlobalConfigPath() const +boost::filesystem::path MacOsPath::getGlobalPath() const { - boost::filesystem::path globalConfigPath("/Library/Preferences/"); - return globalConfigPath; + boost::filesystem::path globalPath("/Library/Preferences/"); + return globalPath; } -boost::filesystem::path MacOsPath::getRuntimeConfigPath() const +boost::filesystem::path MacOsPath::getLocalPath() const { return boost::filesystem::path("./"); } -boost::filesystem::path MacOsPath::getLocalDataPath() const +boost::filesystem::path MacOsPath::getGlobalDataPath() const { - boost::filesystem::path localDataPath("."); - boost::filesystem::path suffix("/"); + boost::filesystem::path globalDataPath("/Library/Application Support/"); + return globalDataPath; +} - const char* theDir = getenv("OPENMW_DATA"); - if (theDir == NULL) +boost::filesystem::path MacOsPath::getInstallPath() const +{ + boost::filesystem::path installPath; + + char *homePath = getenv("HOME"); + if (homePath == NULL) { - theDir = getenv("HOME"); - if (theDir == NULL) - { - struct passwd* pwd = getpwuid(getuid()); - if (pwd != NULL) - { - theDir = pwd->pw_dir; - } - } - if (theDir != NULL) + struct passwd* pwd = getpwuid(getuid()); + if (pwd != NULL) { - suffix = boost::filesystem::path("/Library/Application Support/"); + homePath = pwd->pw_dir; } } - if (theDir != NULL) + if (homePath != NULL) { - localDataPath = boost::filesystem::path(theDir); - } + boost::filesystem::path wineDefaultRegistry(homePath); + wineDefaultRegistry /= ".wine/system.reg"; - localDataPath /= suffix; - return localDataPath; -} + if (boost::filesystem::is_regular_file(wineDefaultRegistry)) + { + boost::filesystem::ifstream file(wineDefaultRegistry); + bool isRegEntry = false; + std::string line; + std::string mwpath; -boost::filesystem::path MacOsPath::getGlobalDataPath() const -{ - boost::filesystem::path globalDataPath("/Library/Application Support/"); - return globalDataPath; -} + while (std::getline(file, line)) + { + if (line[0] == '[') // we found an entry + { + if (isRegEntry) + { + break; + } + + isRegEntry = (line.find("Softworks\\\\Morrowind]") != std::string::npos); + } + else if (isRegEntry) + { + if (line[0] == '"') // empty line means new registry key + { + std::string key = line.substr(1, line.find('"', 1) - 1); + if (strcasecmp(key.c_str(), "Installed Path") == 0) + { + std::string::size_type valuePos = line.find('=') + 2; + mwpath = line.substr(valuePos, line.rfind('"') - valuePos); + + std::string::size_type pos = mwpath.find("\\"); + while (pos != std::string::npos) + { + mwpath.replace(pos, 2, "/"); + pos = mwpath.find("\\", pos + 1); + } + break; + } + } + } + } -boost::filesystem::path MacOsPath::getRuntimeDataPath() const -{ - return boost::filesystem::path("./data/"); + if (!mwpath.empty()) + { + // Change drive letter to lowercase, so we could use ~/.wine/dosdevice symlinks + mwpath[0] = tolower(mwpath[0]); + installPath /= homePath; + installPath /= ".wine/dosdevices/"; + installPath /= mwpath; + + if (!boost::filesystem::is_directory(installPath)) + { + installPath.clear(); + } + } + } + } + + return installPath; } diff --git a/components/files/macospath.hpp b/components/files/macospath.hpp index 26f2c907f..0e9b3402e 100644 --- a/components/files/macospath.hpp +++ b/components/files/macospath.hpp @@ -39,48 +39,35 @@ namespace Files struct MacOsPath { /** - * \brief Return path to the local configuration directory. + * \brief Return path to the local directory. * * \return boost::filesystem::path */ - boost::filesystem::path getLocalConfigPath() const; + boost::filesystem::path getUserPath() const; /** - * \brief Return path to the global (system) configuration directory. + * \brief Return path to the global (system) directory. * * \return boost::filesystem::path */ - boost::filesystem::path getGlobalConfigPath() const; + boost::filesystem::path getGlobalPath() const; /** - * \brief Return path to the runtime configuration directory which is the + * \brief Return path to the runtime directory which is the * place where an application was started. * * \return boost::filesystem::path */ - boost::filesystem::path getRuntimeConfigPath() const; + boost::filesystem::path getLocalPath() const; /** - * \brief Return path to the local data directory. - * - * \return boost::filesystem::path - */ - boost::filesystem::path getLocalDataPath() const; - - /** - * \brief Return path to the global (system) data directory. + * \brief * * \return boost::filesystem::path */ boost::filesystem::path getGlobalDataPath() const; - /** - * \brief Return runtime data path which is a location where - * an application was started with 'data' suffix. - * - * \return boost::filesystem::path - */ - boost::filesystem::path getRuntimeDataPath() const; + boost::filesystem::path getInstallPath() const; }; } /* namespace Files */ diff --git a/components/files/multidircollection.hpp b/components/files/multidircollection.hpp index 391f8b6a4..e8abeb45d 100644 --- a/components/files/multidircollection.hpp +++ b/components/files/multidircollection.hpp @@ -68,7 +68,7 @@ namespace Files /// \param foldCase Ignore filename case boost::filesystem::path getPath (const std::string& file) const; - ///< Return full path (including filename) of \æ file. + ///< Return full path (including filename) of \a file. /// /// If the file does not exist, an exception is thrown. \a file must include /// the extension. diff --git a/components/files/path.hpp b/components/files/path.hpp deleted file mode 100644 index 23c702bbb..000000000 --- a/components/files/path.hpp +++ /dev/null @@ -1,232 +0,0 @@ -/** - * Open Morrowind - an opensource Elder Scrolls III: Morrowind - * engine implementation. - * - * Copyright (C) 2011 Open Morrowind Team - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -/** \file components/files/path.hpp */ - -#ifndef COMPONENTS_FILES_PATH_HPP -#define COMPONENTS_FILES_PATH_HPP - -#include -#include - -#if defined(__linux__) - #include - namespace Files { typedef LinuxPath TargetPathType; } - -#elif defined(__WIN32) || defined(__WINDOWS__) || defined (_WINDOWS) - #include - namespace Files { typedef WindowsPath TargetPathType; } - -#elif defined(macintosh) || defined(Macintosh) || defined(__APPLE__) || defined(__MACH__) - #include - namespace Files { typedef MacOsPath TargetPathType; } - -#else - #error "Unknown platform!" -#endif - - -/** - * \namespace Files - */ -namespace Files -{ - -/** - * \struct Path - * - * \tparam P - Path strategy class type (depends on target system) - * - */ -template -< - class P = TargetPathType -> -struct Path -{ - typedef P PathType; - - /** - * \brief Path constructor. - * - * \param [in] application_name - Name of the application - */ - Path(const std::string& application_name) - : mPath() - , mLocalConfigPath(mPath.getLocalConfigPath()) - , mGlobalConfigPath(mPath.getGlobalConfigPath()) - , mRuntimeConfigPath(mPath.getRuntimeConfigPath()) - , mLocalDataPath(mPath.getLocalDataPath()) - , mGlobalDataPath(mPath.getGlobalDataPath()) - , mRuntimeDataPath(mPath.getRuntimeDataPath()) - { - if (!application_name.empty()) - { - boost::filesystem::path suffix(application_name + std::string("/")); - - mLocalConfigPath /= suffix; - mGlobalConfigPath /= suffix; - - mLocalDataPath /= suffix; - mGlobalDataPath /= suffix; - } - } - - /** - * \brief Return path pointing to the user local configuration directory. - * - * \return boost::filesystem::path - */ - const boost::filesystem::path& getLocalConfigPath() const - { - return mLocalConfigPath; - } - - /** - * \brief Sets new local configuration path. - * - * \param [in] path - New path - */ - void setLocalConfigPath(const boost::filesystem::path& path) - { - mLocalConfigPath = path; - } - - /** - * \brief Return path pointing to the global (system) configuration directory. - * - * \return boost::filesystem::path - */ - const boost::filesystem::path& getGlobalConfigPath() const - { - return mGlobalConfigPath; - } - - /** - * \brief Sets new global configuration path. - * - * \param [in] path - New path - */ - void setGlobalConfigPath(const boost::filesystem::path& path) - { - mGlobalConfigPath = path; - } - - /** - * \brief Return path pointing to the directory where application was started. - * - * \return boost::filesystem::path - */ - const boost::filesystem::path& getRuntimeConfigPath() const - { - return mRuntimeConfigPath; - } - - /** - * \brief Sets new runtime configuration path. - * - * \param [in] path - New path - */ - void setRuntimeConfigPath(const boost::filesystem::path& path) - { - mRuntimeConfigPath = path; - } - - /** - * \brief Return path pointing to the user local data directory. - * - * \return boost::filesystem::path - */ - const boost::filesystem::path& getLocalDataPath() const - { - return mLocalDataPath; - } - - /** - * \brief Sets new local data path. - * - * \param [in] path - New path - */ - void setLocalDataPath(const boost::filesystem::path& path) - { - mLocalDataPath = path; - } - - /** - * \brief Return path pointing to the global (system) data directory. - * - * \return boost::filesystem::path - */ - const boost::filesystem::path& getGlobalDataPath() const - { - return mGlobalDataPath; - } - - /** - * \brief Sets new global (system) data directory. - * - * \param [in] path - New path - */ - void setGlobalDataPath(const boost::filesystem::path& path) - { - mGlobalDataPath = path; - } - - /** - * \brief Return path pointing to the directory where application was started. - * - * \return boost::filesystem::path - */ - const boost::filesystem::path& getRuntimeDataPath() const - { - return mRuntimeDataPath; - } - - /** - * \brief Sets new runtime data directory. - * - * \param [in] path - New path - */ - void setRuntimeDataPath(const boost::filesystem::path& path) - { - mRuntimeDataPath = path; - } - - private: - PathType mPath; - - boost::filesystem::path mLocalConfigPath; /**< User local path to the configuration files */ - boost::filesystem::path mGlobalConfigPath; /**< Global path to the configuration files */ - boost::filesystem::path mRuntimeConfigPath; /**< Runtime path to the configuration files. - By default it is the same directory where - application was run */ - - boost::filesystem::path mLocalDataPath; /**< User local application data path (user plugins / mods / etc.) */ - boost::filesystem::path mGlobalDataPath; /**< Global application data path */ - boost::filesystem::path mRuntimeDataPath; /**< Runtime path to the configuration files. - By default it is a 'data' directory in same - directory where application was run */ - -}; - - -} /* namespace Files */ - -#endif /* COMPONENTS_FILES_PATH_HPP */ diff --git a/components/files/windowspath.cpp b/components/files/windowspath.cpp index b971cbbbf..dfa8f20cc 100644 --- a/components/files/windowspath.cpp +++ b/components/files/windowspath.cpp @@ -10,12 +10,19 @@ #pragma comment(lib, "Shlwapi.lib") +/** + * FIXME: Someone with Windows system should check this and correct if necessary + */ + +/** + * \namespace Files + */ namespace Files { -boost::filesystem::path WindowsPath::getLocalConfigPath() const +boost::filesystem::path WindowsPath::getUserPath() const { - boost::filesystem::path localConfigPath("."); + boost::filesystem::path userPath("."); boost::filesystem::path suffix("/"); TCHAR path[MAX_PATH]; @@ -24,17 +31,17 @@ boost::filesystem::path WindowsPath::getLocalConfigPath() const if(SUCCEEDED(SHGetFolderPath(NULL, CSIDL_PERSONAL | CSIDL_FLAG_CREATE, NULL, 0, path))) { PathAppend(path, TEXT("My Games")); - localConfigPath = boost::filesystem::path(path); + userPath = boost::filesystem::path(path); } - localConfigPath /= suffix; + userPath /= suffix; - return localConfigPath; + return userPath; } -boost::filesystem::path WindowsPath::getGlobalConfigPath() const +boost::filesystem::path WindowsPath::getGlobalPath() const { - boost::filesystem::path globalConfigPath("."); + boost::filesystem::path globalPath("."); boost::filesystem::path suffix("/"); TCHAR path[MAX_PATH]; @@ -42,32 +49,54 @@ boost::filesystem::path WindowsPath::getGlobalConfigPath() const if(SUCCEEDED(SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES | CSIDL_FLAG_CREATE, NULL, 0, path))) { - globalConfigPath = boost::filesystem::path(path); + globalPath = boost::filesystem::path(path); } - globalConfigPath /= suffix; + globalPath /= suffix; - return globalConfigPath; + return globalPath; } -boost::filesystem::path WindowsPath::getRuntimeConfigPath() const +boost::filesystem::path WindowsPath::getLocalPath() const { return boost::filesystem::path("./"); } -boost::filesystem::path WindowsPath::getLocalDataPath() const -{ - return getLocalConfigPath(); -} - boost::filesystem::path WindowsPath::getGlobalDataPath() const { - return getGlobalConfigPath(); + return getGlobalPath(); } -boost::filesystem::path WindowsPath::getRuntimeDataPath() const +boost::filesystem::path WindowsPath::getInstallPath() const { - return boost::filesystem::path("./data/"); + boost::filesystem::path installPath(""); + + HKEY hKey; + + BOOL f64 = FALSE; + LPCTSTR regkey; + if ((IsWow64Process(GetCurrentProcess(), &f64) && f64) || sizeof(void*) == 8) + { + regkey = "SOFTWARE\\Wow6432Node\\Bethesda Softworks\\Morrowind"; + } + else + { + regkey = "SOFTWARE\\Bethesda Softworks\\Morrowind"; + } + + if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT(regkey), 0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS) + { + //Key existed, let's try to read the install dir + std::vector buf(512); + int len = 512; + + if (RegQueryValueEx(hKey, TEXT("Installed Path"), NULL, NULL, (LPBYTE)&buf[0], (LPDWORD)&len) == ERROR_SUCCESS) + { + installPath = &buf[0]; + } + } + + return installPath; } } /* namespace Files */ diff --git a/components/files/windowspath.hpp b/components/files/windowspath.hpp index 47dfc08d8..d4c716c50 100644 --- a/components/files/windowspath.hpp +++ b/components/files/windowspath.hpp @@ -39,48 +39,41 @@ namespace Files struct WindowsPath { /** - * \brief Returns "X:\Documents And Settings\\My Documents\My Games\" + * \brief Returns user path i.e.: + * "X:\Documents And Settings\\My Documents\My Games\" * * \return boost::filesystem::path */ - boost::filesystem::path getLocalConfigPath() const; + boost::filesystem::path getUserPath() const; /** * \brief Returns "X:\Program Files\" * * \return boost::filesystem::path */ - boost::filesystem::path getGlobalConfigPath() const; + boost::filesystem::path getGlobalPath() const; /** - * \brief Return runtime configuration path which is a location where + * \brief Return local path which is a location where * an application was started * * \return boost::filesystem::path */ - boost::filesystem::path getRuntimeConfigPath() const; + boost::filesystem::path getLocalPath() const; /** - * \brief Return same path like getLocalConfigPath - * - * \return boost::filesystem::path - */ - boost::filesystem::path getLocalDataPath() const; - - /** - * \brief Return same path like getGlobalConfigPath + * \brief Return same path like getGlobalPath * * \return boost::filesystem::path */ boost::filesystem::path getGlobalDataPath() const; /** - * \brief Return runtime data path which is a location where - * an application was started with 'data' suffix. + * \brief Gets the path of the installed Morrowind version if there is one. * * \return boost::filesystem::path */ - boost::filesystem::path getRuntimeDataPath() const; + boost::filesystem::path getInstallPath() const; }; } /* namespace Files */ diff --git a/components/nif/data.hpp b/components/nif/data.hpp index 9e28e1534..df9079758 100644 --- a/components/nif/data.hpp +++ b/components/nif/data.hpp @@ -473,7 +473,7 @@ void read(NIFFile *nif) int vertCount = nif->getInt(); nif->getByte(); int magic = nif->getInt(); - int type = nif->getInt(); + /*int type =*/ nif->getInt(); for(int i = 0; i < vertCount; i++){ float x = nif->getFloat(); @@ -485,7 +485,7 @@ void read(NIFFile *nif) for(int i=1; igetInt(); - type = nif->getInt(); + /*type =*/ nif->getInt(); std::vector current; std::vector currentTime; for(int i = 0; i < magic; i++){ diff --git a/components/nifogre/ogre_nif_loader.cpp b/components/nifogre/ogre_nif_loader.cpp index c62f59ea3..8b5540019 100644 --- a/components/nifogre/ogre_nif_loader.cpp +++ b/components/nifogre/ogre_nif_loader.cpp @@ -220,14 +220,15 @@ void NIFLoader::createMaterial(const String &name, //Hardware Skinning code, textures may be the wrong color if enabled - /*if(!mSkel.isNull()){ + + /* if(!mSkel.isNull()){ material->removeAllTechniques(); Ogre::Technique* tech = material->createTechnique(); //tech->setSchemeName("blahblah"); Pass* pass = tech->createPass(); - pass->setVertexProgram("Ogre/HardwareSkinningFourWeights"); - }*/ + pass->setVertexProgram("Ogre/BasicVertexPrograms/AmbientOneTexture");*/ + // This assigns the texture to this material. If the texture name is // a file name, and this file exists (in a resource directory), it @@ -358,7 +359,7 @@ void NIFLoader::createOgreSubMesh(NiTriShape *shape, const String &material, std HardwareVertexBufferSharedPtr vbuf = HardwareBufferManager::getSingleton().createVertexBuffer( VertexElement::getTypeSize(VET_FLOAT3), - numVerts, HardwareBuffer::HBU_STATIC_WRITE_ONLY, false); + numVerts, HardwareBuffer::HBU_DYNAMIC_WRITE_ONLY, false); if(flip) { @@ -424,6 +425,7 @@ void NIFLoader::createOgreSubMesh(NiTriShape *shape, const String &material, std bind->setBinding(nextBuf++, vbuf); } + // Vertex colors if (data->colors.length) { @@ -530,6 +532,8 @@ void NIFLoader::createOgreSubMesh(NiTriShape *shape, const String &material, std { sub->addBoneAssignment(*it); } + if(mSkel.isNull()) + needBoneAssignments.push_back(sub); } // Helper math functions. Reinventing linear algebra for the win! @@ -580,6 +584,7 @@ void NIFLoader::handleNiTriShape(NiTriShape *shape, int flags, BoundsFinder &bou { assert(shape != NULL); + bool saveTheShape = inTheSkeletonTree; // Interpret flags bool hidden = (flags & 0x01) != 0; // Not displayed bool collide = (flags & 0x02) != 0; // Use mesh for collision @@ -738,6 +743,7 @@ void NIFLoader::handleNiTriShape(NiTriShape *shape, int flags, BoundsFinder &bou std::list vertexBoneAssignments; Nif::NiTriShapeCopy copy = shape->clone(); + if(!shape->controller.empty()) { Nif::Controller* cont = shape->controller.getPtr(); @@ -747,6 +753,7 @@ void NIFLoader::handleNiTriShape(NiTriShape *shape, int flags, BoundsFinder &bou copy.morph = morph->data.get(); copy.morph.setStartTime(morph->timeStart); copy.morph.setStopTime(morph->timeStop); + saveTheShape = true; } } @@ -888,6 +895,7 @@ void NIFLoader::handleNiTriShape(NiTriShape *shape, int flags, BoundsFinder &bou boneIndex++; } + } else { @@ -924,10 +932,7 @@ void NIFLoader::handleNiTriShape(NiTriShape *shape, int flags, BoundsFinder &bou } if(!mSkel.isNull() ){ int boneIndex; - Ogre::Bone *parentBone = mSkel->getBone(boneSequence[boneSequence.size() - 1]); - if(parentBone) - boneIndex = parentBone->getHandle(); - else + boneIndex = mSkel->getNumBones() - 1; for(int i = 0; i < numVerts; i++){ VertexBoneAssignment vba; @@ -943,7 +948,8 @@ void NIFLoader::handleNiTriShape(NiTriShape *shape, int flags, BoundsFinder &bou { // Add this vertex set to the bounding box bounds.add(optr, numVerts); - shapes.push_back(copy); + if(saveTheShape) + shapes.push_back(copy); // Create the submesh createOgreSubMesh(shape, material, vertexBoneAssignments); @@ -1063,19 +1069,22 @@ void NIFLoader::handleNode(Nif::Node *node, int flags, //FIXME: "Bip01" isn't every time the root bone if (node->name == "Bip01" || node->name == "Root Bone") //root node, create a skeleton { + inTheSkeletonTree = true; mSkel = SkeletonManager::getSingleton().create(getSkeletonName(), resourceGroup, true); } + else if (!mSkel.isNull() && !parentBone) + inTheSkeletonTree = false; if (!mSkel.isNull()) //if there is a skeleton { std::string name = node->name.toString(); - boneSequence.push_back(name); // Quick-n-dirty workaround for the fact that several // bones may have the same name. if(!mSkel->hasBone(name)) { + boneSequence.push_back(name); bone = mSkel->createBone(name); if (parentBone) @@ -1140,8 +1149,11 @@ void NIFLoader::handleNode(Nif::Node *node, int flags, void NIFLoader::loadResource(Resource *resource) { + inTheSkeletonTree = false; allanim.clear(); shapes.clear(); + needBoneAssignments.clear(); + // needBoneAssignments.clear(); mBoundingBox.setNull(); mesh = 0; mSkel.setNull(); @@ -1150,8 +1162,12 @@ void NIFLoader::loadResource(Resource *resource) char suffix = name.at(name.length() - 2); bool addAnim = true; bool hasAnim = false; - bool baddin = false; + //bool baddin = false; bNiTri = true; + if(name == "meshes\\base_anim.nif" || name == "meshes\\base_animkna.nif") + { + bNiTri = false; + } if(suffix == '*') { @@ -1168,7 +1184,7 @@ void NIFLoader::loadResource(Resource *resource) } else if(suffix == '>') { - baddin = true; + //baddin = true; bNiTri = true; std::string sub = name.substr(name.length() - 6, 4); @@ -1268,7 +1284,7 @@ void NIFLoader::loadResource(Resource *resource) Nif::Node *o = dynamic_cast(f->target.getPtr()); Nif::NiKeyframeDataPtr data = f->data; - if (f->timeStart == 10000000000000000) + if (f->timeStart >= 10000000000000000.0f) continue; data->setBonename(o->name.toString()); data->setStartTime(f->timeStart); @@ -1299,15 +1315,24 @@ void NIFLoader::loadResource(Resource *resource) mesh->_setBounds(mBoundingBox, false); } - if (!mSkel.isNull()) + if (!mSkel.isNull() ) { + for(std::vector::iterator iter = needBoneAssignments.begin(); iter != needBoneAssignments.end(); iter++) + { + int boneIndex = mSkel->getNumBones() - 1; + VertexBoneAssignment vba; + vba.boneIndex = boneIndex; + vba.vertexIndex = 0; + vba.weight = 1; + + + (*iter)->addBoneAssignment(vba); + } mesh->_notifySkeleton(mSkel); } } -void NIFLoader::addInMesh(Ogre::Mesh* input){ - addin.push_back(input); -} + diff --git a/components/nifogre/ogre_nif_loader.hpp b/components/nifogre/ogre_nif_loader.hpp index 62239bb4c..794459e46 100644 --- a/components/nifogre/ogre_nif_loader.hpp +++ b/components/nifogre/ogre_nif_loader.hpp @@ -111,7 +111,6 @@ class NIFLoader : Ogre::ManualResourceLoader std::vector* getAnim(std::string name); std::vector* getShapes(std::string name); std::map* getTextIndices(std::string name); - void addInMesh(Ogre::Mesh* input); Ogre::Vector3 convertVector3(const Nif::Vector& vec); @@ -121,8 +120,9 @@ class NIFLoader : Ogre::ManualResourceLoader void setVerbosePath(std::string path); private: + NIFLoader() : resourceName(""), resourceGroup("General"), flip(false), mNormaliseNormals(false), - mFlipVertexWinding(false), mOutputAnimFiles(false) {} + mFlipVertexWinding(false), mOutputAnimFiles(false), inTheSkeletonTree(false) {} NIFLoader(NIFLoader& n) {} void calculateTransform(); @@ -184,13 +184,16 @@ class NIFLoader : Ogre::ManualResourceLoader std::string name; std::string triname; std::vector allanim; - std::map textmappings; - std::map,ciLessBoost> alltextmappings; - std::map,ciLessBoost> allanimmap; - std::map,ciLessBoost> allshapesmap; - std::vector addin; + + std::map textmappings; + std::map,ciLessBoost> alltextmappings; + std::map,ciLessBoost> allanimmap; + std::map,ciLessBoost> allshapesmap; std::vector mAnim; - std::vector mS; + std::vector mS; + std::vector needBoneAssignments; + bool inTheSkeletonTree; + }; 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 c7d9d4ca4..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 a308fcb7f..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/mac/Info.plist b/files/mac/Info.plist index 1872425e7..bc7efd075 100644 --- a/files/mac/Info.plist +++ b/files/mac/Info.plist @@ -19,7 +19,7 @@ CFBundleSignature ???? CFBundleVersion - 0.10 + ${OPENMW_VERSION} CSResourcesFileMapped LSRequiresCarbon diff --git a/files/openmw.cfg b/files/openmw.cfg index f5322ae8c..0af096e6a 100644 --- a/files/openmw.cfg +++ b/files/openmw.cfg @@ -1,3 +1,2 @@ -data=${MORROWIND_DATA_FILES} +data="?mw?Data Files" resources=${MORROWIND_RESOURCE_FILES} - diff --git a/files/plugins.cfg.linux b/files/plugins.cfg.linux index 3781f48e0..f34621a0f 100644 --- a/files/plugins.cfg.linux +++ b/files/plugins.cfg.linux @@ -7,6 +7,6 @@ PluginFolder=${OGRE_PLUGIN_DIR_REL} 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 6c7e5d00e..8f9871831 160000 --- a/libs/openengine +++ b/libs/openengine @@ -1 +1 @@ -Subproject commit 6c7e5d00e4f5bf954afe15f10e56f03520abfee4 +Subproject commit 8f98718315fe11af359740c4a025fd1ca52a9157 diff --git a/libs/platform/string.h b/libs/platform/string.h index d4302ae78..5368d757c 100644 --- a/libs/platform/string.h +++ b/libs/platform/string.h @@ -2,13 +2,33 @@ #ifndef _STRING_WRAPPER_H #define _STRING_WRAPPER_H +#ifdef __APPLE__ +#include +#endif + #include -#if defined(__APPLE__) || defined(__MINGW32__) +#if (defined(__APPLE__) && __MAC_OS_X_VERSION_MIN_REQUIRED < 1070) || defined(__MINGW32__) // need our own implementation of strnlen +#ifdef __MINGW32__ static size_t strnlen(const char *s, size_t n) { - const char *p = (const char *)memchr(s, 0, n); - return(p ? p-s : n); + const char *p = (const char *)memchr(s, 0, n); + return(p ? p-s : n); +} +#elif (defined(__APPLE__) && __MAC_OS_X_VERSION_MIN_REQUIRED < 1070) +static size_t mw_strnlen(const char *s, size_t n) +{ + if (strnlen != NULL) { + return strnlen(s, n); + } + else { + const char *p = (const char *)memchr(s, 0, n); + return(p ? p-s : n); + } } +#define strnlen mw_strnlen #endif + +#endif + #endif diff --git a/readme.txt b/readme.txt index cfddd9a1f..d9e6cbfa4 100644 --- a/readme.txt +++ b/readme.txt @@ -3,7 +3,7 @@ OpenMW: A reimplementation of The Elder Scrolls III: Morrowind OpenMW is an attempt at recreating the engine for the popular role-playing game Morrowind by Bethesda Softworks. You need to own and install the original game for OpenMW to work. -Version: 0.11.1 +Version: 0.12.0 License: GPL (see GPL3.txt for more information) Website: http://www.openmw.org @@ -14,7 +14,7 @@ THIS IS A WORK IN PROGRESS INSTALLATION Windows: -Just unpack to a location of your choice. Currently there is no installer. +Run the installer. Linux: Ubuntu (and most others) @@ -35,25 +35,87 @@ TODO add description here THE DATA PATH -After the installation OpenMW needs to be told where to find the Morrowind data directory. Create a text file named openmw.cfg (location depends on platform) and enter the following line: +The data path tells OpenMW where to find your Morrowind files. From 0.12.0 on OpenMW should be able to +pick up the location of these files on its own, if both Morrowind and OpenMW are installed properly +(installing Morrowind under WINE is considered a proper install). -data=path to your data directory +If that does not work for you, please check if you have any leftover openmw.cfg files from versions earlier than 0.12.0. These can interfere with the configuration process, so try to remove then. -(where you replace "path to your data directory" with the actual location of your data directory) +If you are running OpenMW without installing it, you still need to manually adjust the data path. Create a text file named openmw.cfg in the location of the binary and enter the following line: -On Windows a suitable location for the cfg file is alongside the binary. Currently the binary release comes with such a file pre-generated, but you still need to adjust the data setting. +data=path to your data directory -On Linux and Mac the default location will be ~/.config/openmw/openmw.cfg. +(where you replace "path to your data directory" with the actual location of your data directory) COMMAND LINE OPTIONS -TODO add description of command line options + +Syntax: openmw +Allowed options: + --help print help message + --version print version information and quit + --data arg (=data) set data directories (later directories have + higher priority) + --data-local arg set local data directory (highest priority) + --resources arg (=resources) set resources directory + --start arg (=Beshara) set initial cell + --master arg master file(s) + --plugin arg plugin file(s) + --fps [=arg(=1)] (=0) fps counter detail (0 = off, 1 = fps counter + , 2 = full detail) + --anim-verbose [=arg(=1)] (=0) output animation indices files + --debug [=arg(=1)] (=0) debug mode + --nosound [=arg(=1)] (=0) disable all sounds + --script-verbose [=arg(=1)] (=0) verbose script output + --new-game [=arg(=1)] (=0) activate char gen/new game mechanics + --script-all [=arg(=1)] (=0) compile all scripts (excluding dialogue scri + pts) at startup + --fs-strict [=arg(=1)] (=0) strict file system handling (no case folding + ) + --encoding arg (=win1252) Character encoding used in OpenMW game messa + ges: + + win1250 - Central and Eastern European such + as Polish, Czech, Slovak, Hungarian, Slovene + , Bosnian, Croatian, Serbian (Latin script), + Romanian and Albanian languages + + win1251 - Cyrillic alphabet such as Russian, + Bulgarian, Serbian Cyrillic and other langua + ges + + win1252 - Western European (Latin) alphabet, + used by default + --report-focus [=arg(=1)] (=0) write name of focussed object to cout CREDITS -Developers: -TODO add list of developers +Current Developers: +Alexander “Ace” Olofsson +athile +Cris “Mirceam” Mihalache +gugus / gus +Jacob “Yacoby” Essex +Jason “jhooks” Hooks +Lukasz “lgro” Gromanowski +Marc “Zini” Zinnschlag +Nikolay “corristo” Kasyanov +Pieter “pvdk” van der Kloet +Sebastian “swick” Wick + +Retired Developers: +Ardekantur +Armin Preiml +Diggory Hardy +Jan Borsodi +Jan-Peter “peppe” Nilsson +Josua Grawitter +Karl-Felix “k1ll” Glatzer +Nicolay Korslund +sergoz +Star-Demon +Yuri Krupenin OpenMW: Thanks to DokterDume for kindly providing us with the Moon and Star logo used as the application icon and project logo. @@ -64,6 +126,31 @@ Thanks to Kevin Ryan for kindly providing us with the icon used for the Data Fil CHANGELOG +0.12.0 + +Bug #154: FPS Drop +Bug #169: Local scripts continue running if associated object is deleted +Bug #174: OpenMW fails to start if the config directory doesn't exist +Bug #187: Missing lighting +Bug #188: Lights without a mesh are not rendered +Bug #191: Taking screenshot causes crash when running installed +Feature #28: Sort out the cell load problem +Feature #31: Allow the player to move away from pre-defined cells +Feature #35: Use alternate storage location for modified object position +Feature #45: NPC animations +Feature #46: Creature Animation +Feature #89: Basic Journal Window +Feature #110: Automatically pick up the path of existing MW-installations +Feature #183: More FPS display settings +Task #19: Refactor engine class +Task #109/Feature #162: Automate Packaging +Task #112: Catch exceptions thrown in input handling functions +Task #128/#168: Cleanup Configuration File Handling +Task #131: NPC Activation doesn't work properly +Task #144: MWRender cleanup +Task #155: cmake cleanup + + 0.11.1 Bug #2: Resources loading doesn't work outside of bsa files @@ -90,4 +177,4 @@ Task #14: Replace tabs with 4 spaces Task #18: Move components from global namespace into their own namespace Task #123: refactor header files in components/esm -TODO add old changelog (take pre 0.11.0 changelog from wiki) +TODO add old changelog (take pre 0.11.1 changelog from wiki)